@lmctl-ai/lmctl 0.1.169 → 0.1.170

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 +167 -167
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -1,20 +1,20 @@
1
- var xk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ee=(t,e)=>{for(var r in e)xk(t,r,{get:e[r],enumerable:!0})};import{existsSync as zs,readdirSync as VH,readFileSync as Ak}from"node:fs";import{homedir as Rk,platform as Vf}from"node:os";import{join as jt}from"node:path";function Ir(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:jt(Rk(),Lk)}function Zs(){return jt(Ir(),Yf)}function Vr(){return jt(Ir(),Ok)}function Dt(t){return jt(Vr(),t)}function kr(t){return jt(Dt(t),Yf)}function za(t){return jt(Dt(t),"projects")}function Qs(){return jt(Ir(),$k)}function Ze(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function ei(){let t=Qs();if(!zs(t))return null;try{let e=Ak(t,"utf8").trim();return e.length===0||!Ze(e)?null:e}catch{return null}}function Pt(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Ze(t)?t:ei()}function Z(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Pt();if(e!==null)return kr(e);let r=Zs();return zs(r)||!zs(Vr())?r:kr(zf)}function ti(t,e){return`workspace: ${process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?"(overridden by --db)":t??"default"} db: ${e}`}function jk(t,e=Vf()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Zf(t,e=process.stderr,r=Vf()){jk(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
- `)}function Za(){return jt(Ir(),Ck)}function Qf(){return jt(Ir(),Mk)}function Dk(){try{return zs(Za())}catch{return!1}}function em(t=process.stderr){Dk()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
1
+ var xk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ee=(t,e)=>{for(var r in e)xk(t,r,{get:e[r],enumerable:!0})};import{existsSync as zs,readdirSync as VH,readFileSync as Ak}from"node:fs";import{homedir as Rk,platform as Vf}from"node:os";import{join as jt}from"node:path";function Ir(){let t=process.env.LMCTL_HOME;return t!==void 0&&t.length>0?t:jt(Rk(),Lk)}function Zs(){return jt(Ir(),Yf)}function Vr(){return jt(Ir(),Ok)}function Dt(t){return jt(Vr(),t)}function kr(t){return jt(Dt(t),Yf)}function Za(t){return jt(Dt(t),"projects")}function Qs(){return jt(Ir(),$k)}function Ze(t){return!(t.length===0||t.length>64||!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(t)||t==="."||t==="..")}function ei(){let t=Qs();if(!zs(t))return null;try{let e=Ak(t,"utf8").trim();return e.length===0||!Ze(e)?null:e}catch{return null}}function Pt(){let t=process.env.LMCTL_WORKSPACE;return t!==void 0&&t.length>0&&Ze(t)?t:ei()}function Z(t){if(t!==void 0&&t.length>0)return t;if(process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0)return process.env.LMCTL_DB;let e=Pt();if(e!==null)return kr(e);let r=Zs();return zs(r)||!zs(Vr())?r:kr(zf)}function ti(t,e){return`workspace: ${process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?"(overridden by --db)":t??"default"} db: ${e}`}function jk(t,e=Vf()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Zf(t,e=process.stderr,r=Vf()){jk(t,r)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
2
+ `)}function Qa(){return jt(Ir(),Ck)}function Qf(){return jt(Ir(),Mk)}function Dk(){try{return zs(Qa())}catch{return!1}}function em(t=process.stderr){Dk()&&t.write(`note: legacy ~/.lmctl/profiles/ detected \u2014 run 'lmctl workspace migrate' to move it to ~/.lmctl/workspaces/
3
3
  `)}var Lk,Yf,Ok,$k,zf,Ck,Mk,Nr,Be=E(()=>{"use strict";Lk=".lmctl",Yf="state.db",Ok="workspaces",$k="active-workspace",zf="default",Ck="profiles",Mk="active-profile";Nr={default:zf}});function Wk(t){for(let e of Uk)if(t.startsWith(e))return!0;if(t.startsWith("172.")){let e=Number(t.split(".")[1]);if(Number.isFinite(e)&&e>=16&&e<=31)return!0}return!!t.startsWith("169.254.")}function Bk(t){let e=t.toLowerCase();return!!(e==="::1"||e==="::"||e.startsWith("fe80:")||e.startsWith("fe80::"))}function Jk(t){let e=t.split(".");if(e.length!==4)return!1;for(let r of e){if(r.length===0||r.length>3)return!1;let n=Number(r);if(!Number.isFinite(n)||n<0||n>255)return!1}return!0}function Bn(t){let e=t;for(let{re:r,replacement:n}of Fk)e=e.replace(r,n);return e=e.replace(qk,r=>!Jk(r)||Wk(r)?r:tm),e=e.replace(Hk,r=>Bk(r)?r:tm),e}function qn(t){return t.split(`
4
4
  `).map(e=>Bn(e)).join(`
5
- `)}function nm(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:it}:{key:t,value:Bn(e)}}function tr(t){if(typeof t=="string")return Bn(t);if(Array.isArray(t))return t.map(e=>tr(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?it:tr(n):e[r]=tr(n)}return e}return t}function sm(t,e){for(let{name:r,re:n}of Xk){let s=e.match(n);if(s!==null&&!s[0].includes(it))throw new xr(t,r)}}var it,Pk,tm,rm,Fk,Uk,qk,Hk,Xk,xr,ri=E(()=>{"use strict";it="[REDACTED]",Pk="[REDACTED_EMAIL]",tm="[REDACTED_IP]",rm="[USER]",Fk=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${it}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${it}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${it}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:it},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:it},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:it},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:it},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${it}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${rm}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${rm}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:Pk}],Uk=["127.","10.","192.168.","0.0.0.0"];qk=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,Hk=/\b(?:[0-9a-fA-F]{1,4}:){2,7}(?::[0-9a-fA-F]{1,4})+\b|\b(?:[0-9a-fA-F]{1,4}:){3,7}[0-9a-fA-F]{1,4}\b|::1\b|::\b(?=[\s,;"')]|$)/g;Xk=[{name:"sk-ant",re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/},{name:"sk-openai",re:/\bsk-[A-Za-z0-9_\-]{16,}/},{name:"github-pat",re:/\bgh[pousr]_[A-Za-z0-9]{30,}/},{name:"aws-akid",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"bearer",re:/\bBearer\s+[A-Za-z0-9_\-./+=]{8,}/},{name:"email",re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/},{name:"home-path",re:/\/home\/(?!\[USER\])[^/\s"'`]+/},{name:"users-path",re:/\/Users\/(?!\[USER\])[^/\s"'`]+/}],xr=class extends Error{bundlePath;patternName;constructor(e,r){super(`sanitization failed: ${r} pattern matched in ${e}`),this.bundlePath=e,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as Qa}from"node:child_process";import{readFileSync as Gk}from"node:fs";import{readFile as tl,stat as im}from"node:fs/promises";import{homedir as Kk}from"node:os";import{join as Vk}from"node:path";import{fileURLToPath as Yk}from"node:url";function Et(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(Gk(Yk(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function om(t){let e=new Set(t.include??ni),r={};return e.has("serve")&&(r.serve=await Zk(t)),e.has("db")&&(r.db=Qk(t)),e.has("runs")&&(r.runs=eI(t)),e.has("jobs")&&(r.jobs=tI(t)),e.has("attentions")&&(r.attentions=rI(t)),e.has("env")&&(r.env=await nI(t)),e.has("intents")&&(r.intents=await iI(t)),r}async function Zk(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,i="none";if(e!==void 0)try{let d=(await tl(e,"utf8")).trim(),u=Number.parseInt(d,10);Number.isInteger(u)&&u>0&&(s=u,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await tl(r,"utf8")).split(`
5
+ `)}function nm(t,e){let r=t.toUpperCase();return r.includes("TOKEN")||r.includes("SECRET")||r.includes("KEY")||r.includes("PASSWORD")||r.includes("PASSWD")||r.includes("CREDENTIAL")||r.includes("AUTH")?{key:t,value:it}:{key:t,value:Bn(e)}}function tr(t){if(typeof t=="string")return Bn(t);if(Array.isArray(t))return t.map(e=>tr(e));if(t!==null&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t)){let s=r.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?e[r]=typeof n=="string"?it:tr(n):e[r]=tr(n)}return e}return t}function sm(t,e){for(let{name:r,re:n}of Xk){let s=e.match(n);if(s!==null&&!s[0].includes(it))throw new xr(t,r)}}var it,Pk,tm,rm,Fk,Uk,qk,Hk,Xk,xr,ri=E(()=>{"use strict";it="[REDACTED]",Pk="[REDACTED_EMAIL]",tm="[REDACTED_IP]",rm="[USER]",Fk=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${it}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${it}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${it}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:it},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:it},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:it},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:it},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${it}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${rm}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${rm}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:Pk}],Uk=["127.","10.","192.168.","0.0.0.0"];qk=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,Hk=/\b(?:[0-9a-fA-F]{1,4}:){2,7}(?::[0-9a-fA-F]{1,4})+\b|\b(?:[0-9a-fA-F]{1,4}:){3,7}[0-9a-fA-F]{1,4}\b|::1\b|::\b(?=[\s,;"')]|$)/g;Xk=[{name:"sk-ant",re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/},{name:"sk-openai",re:/\bsk-[A-Za-z0-9_\-]{16,}/},{name:"github-pat",re:/\bgh[pousr]_[A-Za-z0-9]{30,}/},{name:"aws-akid",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"bearer",re:/\bBearer\s+[A-Za-z0-9_\-./+=]{8,}/},{name:"email",re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/},{name:"home-path",re:/\/home\/(?!\[USER\])[^/\s"'`]+/},{name:"users-path",re:/\/Users\/(?!\[USER\])[^/\s"'`]+/}],xr=class extends Error{bundlePath;patternName;constructor(e,r){super(`sanitization failed: ${r} pattern matched in ${e}`),this.bundlePath=e,this.patternName=r,this.name="SanitizationError"}}});import{spawnSync as el}from"node:child_process";import{readFileSync as Gk}from"node:fs";import{readFile as rl,stat as im}from"node:fs/promises";import{homedir as Kk}from"node:os";import{join as Vk}from"node:path";import{fileURLToPath as Yk}from"node:url";function Et(){try{let t=new URL("../../package.json",import.meta.url),e=JSON.parse(Gk(Yk(t),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}async function om(t){let e=new Set(t.include??ni),r={};return e.has("serve")&&(r.serve=await Zk(t)),e.has("db")&&(r.db=Qk(t)),e.has("runs")&&(r.runs=eI(t)),e.has("jobs")&&(r.jobs=tI(t)),e.has("attentions")&&(r.attentions=rI(t)),e.has("env")&&(r.env=await nI(t)),e.has("intents")&&(r.intents=await iI(t)),r}async function Zk(t){let e=t.pidFile??process.env.LMCTL_PID_FILE,r=t.serveLog??process.env.LMCTL_SERVE_LOG,n=t.logTailLines??1e3,s=null,i="none";if(e!==void 0)try{let d=(await rl(e,"utf8")).trim(),u=Number.parseInt(d,10);Number.isInteger(u)&&u>0&&(s=u,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,c=0;if(r===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await rl(r,"utf8")).split(`
6
6
  `),f=u.slice(Math.max(0,u.length-n));c=f.length,a=qn(f.join(`
7
7
  `))}catch(d){l=`serve log unreadable: ${d instanceof Error?d.message:String(d)}`}return{pid:s,pid_source:i,pid_alive:o,log_tail_lines:c,log_tail:a,log_note:l}}function Qk(t){let{dal:e}=t,r="unknown";try{r=e.query("PRAGMA integrity_check;").map(o=>o.integrity_check??JSON.stringify(o)).join(`
8
- `)}catch(i){r=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let i=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function eI(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),i=e.query(`SELECT ${el} FROM run ORDER BY id DESC LIMIT 50`),o=e.query(`SELECT ${el} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${el} FROM run
8
+ `)}catch(i){r=`integrity_check failed: ${i instanceof Error?i.message:String(i)}`}let n=0;try{n=e.query("PRAGMA user_version;")[0]?.user_version??0}catch{n=0}let s={};try{let i=e.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name");for(let{name:o}of i)try{let a=e.query(`SELECT COUNT(*) AS c FROM "${o.replace(/"/g,'""')}"`);s[o]=a[0]?.c??0}catch{s[o]=-1}}catch{}return{integrity_check:r,schema_version:n,table_counts:s}}function eI(t){let{dal:e}=t,r=(t.now??new Date).toISOString(),n=(t.staleThresholdMin??60)*6e4,s=new Date(Date.parse(r)-n).toISOString(),i=e.query(`SELECT ${tl} FROM run ORDER BY id DESC LIMIT 50`),o=e.query(`SELECT ${tl} FROM run WHERE paused_at IS NOT NULL AND terminal_state IS NULL ORDER BY paused_at DESC LIMIT 50`),a=e.query(`SELECT ${tl} FROM run
9
9
  WHERE terminal_state IS NULL
10
10
  AND started_at < ?
11
11
  ORDER BY started_at ASC LIMIT 50`,s);return{last_50:tr(i),stale:tr(a),paused:tr(o)}}function tI(t){let{dal:e}=t,r=e.query("SELECT status, COUNT(*) AS c FROM job GROUP BY status"),n={pending:0,running:0,done:0,failed:0,paused:0};for(let{status:o,c:a}of r)o==="queued"?n.pending+=a:o==="running"?n.running+=a:o==="done"||o==="succeeded"?n.done+=a:o==="failed"?n.failed+=a:o==="paused"&&(n.paused+=a);let s=e.query("SELECT id FROM job WHERE status IN ('queued', 'available') ORDER BY id DESC LIMIT 100"),i=e.query("SELECT id FROM job WHERE status = 'running' ORDER BY id DESC LIMIT 100");return{queue_state:n,pending_ids:s.map(o=>o.id),running_ids:i.map(o=>o.id)}}function rI(t){let{dal:e}=t,r=e.query(`SELECT id, kind, severity, project_id, run_id, external_object_id, requires_user, created_at
12
- FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:tr(r)}}async function nI(t){let e=Et(),r=process.version,n=Qa("uname",["-a"],{encoding:"utf8"}),s=qn((n.stdout??"").trim()),i=[],o=t.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await im(o);let d=Qa("du",["-sh",o],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await im(a);let d=Qa("du",["-sh",a],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":qn(i.join(`
13
- `)),c=[];for(let d of zk){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(nm(d,u))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function sI(){return process.env.LMCTL_INTENT_LOG??Vk(Kk(),".lmctl","recent-intents.log")}async function iI(t){let e=t.intentLog??sI(),r=t.intentLogTailLines??500;try{let s=(await tl(e,"utf8")).split(`
12
+ FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:tr(r)}}async function nI(t){let e=Et(),r=process.version,n=el("uname",["-a"],{encoding:"utf8"}),s=qn((n.stdout??"").trim()),i=[],o=t.dbPath??process.env.LMCTL_DB;if(o!==void 0)try{await im(o);let d=el("du",["-sh",o],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await im(a);let d=el("du",["-sh",a],{encoding:"utf8"});d.status===0&&i.push(d.stdout.trim())}catch{}let l=i.length===0?"(no paths configured)":qn(i.join(`
13
+ `)),c=[];for(let d of zk){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(nm(d,u))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function sI(){return process.env.LMCTL_INTENT_LOG??Vk(Kk(),".lmctl","recent-intents.log")}async function iI(t){let e=t.intentLog??sI(),r=t.intentLogTailLines??500;try{let s=(await rl(e,"utf8")).split(`
14
14
  `).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:i.length,tail:qn(i.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 ni,zk,el,Hn=E(()=>{"use strict";ri();ni=["serve","db","runs","jobs","attentions","env","intents"];zk=["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"];el=["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 cm,appendFileSync as oI,mkdirSync as aI,existsSync as c2,readdirSync as d2,unlinkSync as u2}from"node:fs";import{join as ii,dirname as lI}from"node:path";import{homedir as cI}from"node:os";function rl(){return ii(cI(),".lmctl")}function dm(){Yr=!0,process.env.LMCTL_DEBUG="1"}function um(){return{cliDebug:Yr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function fm(t){Yr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ce(){if(Yr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-lm>=dI&&(am=mI(),lm=t),am}function mm(){return Yr||process.env.LMCTL_DEBUG==="1"}function uI(){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 Ae(t,e){if(e?.verbose){if(!Yr)return}else if(!e?.always&&!ce())return;try{fI();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};oI(si,JSON.stringify(r)+`
16
- `)}catch{}}function fI(){if(!si){let e=uI().slice(0,13).replace("T","-");si=ii(rl(),`debug-${e}.log`)}aI(lI(si),{recursive:!0})}function Oe(...t){Ae({event:"legacy",msg:t.join(" ")})}function Tt(...t){Ae({event:"legacy",msg:t.join(" ")},{verbose:!0})}function M(t){Ae(t,{always:!0})}function mI(){return pI()||_I()}function pI(){try{let t=cm(ii(rl(),"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 _I(){try{let t=cm(ii(rl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Yr,am,lm,dI,si,ue=E(()=>{"use strict";Yr=!1,am=!1,lm=0,dI=5e3;si=null});import{existsSync as CI}from"node:fs";import{createRequire as MI}from"node:module";function jI(){return sl===null&&(sl=MI(import.meta.url)("node:sqlite").DatabaseSync),sl}function il(t){return t.length===1&&DI(t[0])?[t[0]]:t}function DI(t){if(!ll(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function ll(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var sl,ol,ym,al,wm=E(()=>{"use strict";sl=null;ol=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!CI(e))throw new Error("unable to open database file");this.name=e,this.handle=new(jI())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new al(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)}}},ym=ol,al=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...il(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...il(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...il(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&ll(e)?Object.values(e):ll(e)?{...e}:e}}});import{existsSync as PI,mkdirSync as FI,readFileSync as Tm}from"node:fs";import{homedir as UI}from"node:os";import{dirname as bm,join as WI,resolve as Sm}from"node:path";import{fileURLToPath as BI,pathToFileURL as qI}from"node:url";function cl(t){t.dbPath!==":memory:"&&FI(bm(t.dbPath),{recursive:!0});let e=new ym(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Im(e);return r===0&&(e.exec(Tm(km,"utf8")),e.pragma(`user_version = ${JI}`)),XI(e,r),e}function XI(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 ni,zk,tl,Hn=E(()=>{"use strict";ri();ni=["serve","db","runs","jobs","attentions","env","intents"];zk=["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"];tl=["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 cm,appendFileSync as oI,mkdirSync as aI,existsSync as c2,readdirSync as d2,unlinkSync as u2}from"node:fs";import{join as ii,dirname as lI}from"node:path";import{homedir as cI}from"node:os";function nl(){return ii(cI(),".lmctl")}function dm(){Yr=!0,process.env.LMCTL_DEBUG="1"}function um(){return{cliDebug:Yr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function fm(t){Yr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ce(){if(Yr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-lm>=dI&&(am=mI(),lm=t),am}function mm(){return Yr||process.env.LMCTL_DEBUG==="1"}function uI(){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 Ae(t,e){if(e?.verbose){if(!Yr)return}else if(!e?.always&&!ce())return;try{fI();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};oI(si,JSON.stringify(r)+`
16
+ `)}catch{}}function fI(){if(!si){let e=uI().slice(0,13).replace("T","-");si=ii(nl(),`debug-${e}.log`)}aI(lI(si),{recursive:!0})}function Oe(...t){Ae({event:"legacy",msg:t.join(" ")})}function Tt(...t){Ae({event:"legacy",msg:t.join(" ")},{verbose:!0})}function C(t){Ae(t,{always:!0})}function mI(){return pI()||_I()}function pI(){try{let t=cm(ii(nl(),"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 _I(){try{let t=cm(ii(nl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Yr,am,lm,dI,si,de=E(()=>{"use strict";Yr=!1,am=!1,lm=0,dI=5e3;si=null});import{existsSync as CI}from"node:fs";import{createRequire as MI}from"node:module";function jI(){return il===null&&(il=MI(import.meta.url)("node:sqlite").DatabaseSync),il}function ol(t){return t.length===1&&DI(t[0])?[t[0]]:t}function DI(t){if(!cl(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function cl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var il,al,ym,ll,wm=E(()=>{"use strict";il=null;al=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!CI(e))throw new Error("unable to open database file");this.name=e,this.handle=new(jI())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new ll(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)}}},ym=al,ll=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...ol(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...ol(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...ol(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&cl(e)?Object.values(e):cl(e)?{...e}:e}}});import{existsSync as PI,mkdirSync as FI,readFileSync as Tm}from"node:fs";import{homedir as UI}from"node:os";import{dirname as bm,join as WI,resolve as Sm}from"node:path";import{fileURLToPath as BI,pathToFileURL as qI}from"node:url";function dl(t){t.dbPath!==":memory:"&&FI(bm(t.dbPath),{recursive:!0});let e=new ym(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Im(e);return r===0&&(e.exec(Tm(km,"utf8")),e.pragma(`user_version = ${JI}`)),XI(e,r),e}function XI(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,
@@ -628,7 +628,7 @@ var xk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ee=(t,e)=>{f
628
628
  FROM team_chat_log;
629
629
  DROP TABLE team_chat_log;
630
630
  ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
631
- `)}finally{t.pragma("foreign_keys = ON")}}function Im(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function GI(){return process.env.LMCTL_DB??WI(UI(),".lmctl","state.db")}var vm,km,HI,JI,Nm=E(()=>{"use strict";wm();vm=bm(BI(import.meta.url)),km=Sm(vm,"schema.sql"),HI=Sm(vm,"migrations"),JI=52;if(process.argv[1]&&import.meta.url===qI(process.argv[1]).href){let t=cl({dbPath:process.argv[2]??GI()});try{process.stdout.write(`migrated user_version=${Im(t)}
631
+ `)}finally{t.pragma("foreign_keys = ON")}}function Im(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function GI(){return process.env.LMCTL_DB??WI(UI(),".lmctl","state.db")}var vm,km,HI,JI,Nm=E(()=>{"use strict";wm();vm=bm(BI(import.meta.url)),km=Sm(vm,"schema.sql"),HI=Sm(vm,"migrations"),JI=52;if(process.argv[1]&&import.meta.url===qI(process.argv[1]).href){let t=dl({dbPath:process.argv[2]??GI()});try{process.stdout.write(`migrated user_version=${Im(t)}
632
632
  `)}finally{t.close()}}});function xm(t){return{getAgentInflight:t.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:t.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:t.prepare(`
633
633
  INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
634
634
  VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
@@ -953,9 +953,9 @@ var xk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ee=(t,e)=>{f
953
953
  AND delivered_at IS NULL
954
954
  AND delivering_at IS NULL
955
955
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
956
- `),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function Xn(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength($m,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),i=n;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${$m}`}var $m,dl=E(()=>{"use strict";$m=`
957
- ...[truncated]`});function Vn(t,e){return JSON.stringify([t,e])}function Mm(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(r=>typeof r=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var Gn,Kn,jm=E(()=>{"use strict";Gn="terminal_lock",Kn="member"});import{readFileSync as Dm}from"node:fs";function ot(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function ul(t){if(!Number.isInteger(t)||(t??0)<=0)return null;let e=KI();if(e===null)return null;try{let r=Dm(`/proc/${t}/stat`,"utf-8"),n=r.lastIndexOf(")");if(n<0)return null;let i=r.slice(n+2).trim().split(/\s+/)[19];return i===void 0||!/^\d+$/.test(i)?null:`${e}:${i}`}catch{return null}}function KI(){try{let t=Dm("/proc/sys/kernel/random/boot_id","utf-8").trim();return/^[0-9a-f-]{36}$/i.test(t)?t:null}catch{return null}}function VI(t){return typeof t=="string"&&/^[0-9a-f-]{36}:\d+$/i.test(t)}function Pm(t,e){if(!ot(t))return"gone";if(!VI(e))return"unverified";let r=ul(t);return r===null?"unverified":r===e?"same":"different"}var Yn=E(()=>{"use strict"});function zr(t){return typeof t=="string"&&YI.has(t)}function Wm(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${oi[0]}`,` STANCE: ${oi[1]}`,` STANCE: ${oi[2]}`,` STANCE: ${Fm}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
958
- `)}var Fm,oi,YI,zn,Um,fl,ai,Zn=E(()=>{"use strict";Fm="other",oi=["not_enough_information","dont_know","other_work"],YI=new Set([Fm,...oi]),zn="@abort",Um="invalid_decision",fl="escalation_aborted",ai="workflow_escalation"});import{randomUUID as Bm}from"node:crypto";import{hostname as Qn}from"node:os";function qe(t){return t.provider_resolved??t.provider}function $(){return new Date().toISOString()}function ke(t){return new ml(cl({dbPath:t.path}))}function qm(t,e,r){let n=Hm(e);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Hm(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(t)}function Hm(t){let e=zI(t),r=e===null?null:ZI(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))li(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function zI(t){try{let e=JSON.parse(t);return li(e)?e:null}catch{return null}}function ZI(t,e){let r=t[e];return li(r)?r:null}function li(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function QI(t){try{let e=JSON.parse(t);return!li(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function e0(t,e){return t===null?!0:t.holder_host===Qn()?!ot(t.holder_pid):t.last_heartbeat<e}function t0(t,e){if(t.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let r=t.delivering_at<e;if(t.delivery_holder_host===Qn()&&r0(t.delivery_holder_pid)){let n=ot(t.delivery_holder_pid);return n?r?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:n}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:n}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:n}}return r?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function rr(t,e,r={}){let n=new Date().toISOString(),s=e.delivering_at===null?NaN:Date.parse(e.delivering_at),i=Date.parse(n);M({event:t,event_at:n,message_id:e.id,message_type:e.message_type,lane_key:JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias]),sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message_created_at:e.created_at,delivering_at:e.delivering_at,delivered_at:e.delivered_at,delivery_holder_pid:e.delivery_holder_pid,delivery_holder_host:e.delivery_holder_host,lease_age_ms:Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):null,...r})}function r0(t){return Number.isInteger(t)&&(t??0)>0}function n0(t){return{...Cm(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
956
+ `),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function Xn(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength($m,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),i=n;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${$m}`}var $m,ul=E(()=>{"use strict";$m=`
957
+ ...[truncated]`});function Vn(t,e){return JSON.stringify([t,e])}function Mm(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(r=>typeof r=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var Gn,Kn,jm=E(()=>{"use strict";Gn="terminal_lock",Kn="member"});import{readFileSync as Dm}from"node:fs";function ot(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function fl(t){if(!Number.isInteger(t)||(t??0)<=0)return null;let e=KI();if(e===null)return null;try{let r=Dm(`/proc/${t}/stat`,"utf-8"),n=r.lastIndexOf(")");if(n<0)return null;let i=r.slice(n+2).trim().split(/\s+/)[19];return i===void 0||!/^\d+$/.test(i)?null:`${e}:${i}`}catch{return null}}function KI(){try{let t=Dm("/proc/sys/kernel/random/boot_id","utf-8").trim();return/^[0-9a-f-]{36}$/i.test(t)?t:null}catch{return null}}function VI(t){return typeof t=="string"&&/^[0-9a-f-]{36}:\d+$/i.test(t)}function Pm(t,e){if(!ot(t))return"gone";if(!VI(e))return"unverified";let r=fl(t);return r===null?"unverified":r===e?"same":"different"}var Yn=E(()=>{"use strict"});function zr(t){return typeof t=="string"&&YI.has(t)}function Wm(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${oi[0]}`,` STANCE: ${oi[1]}`,` STANCE: ${oi[2]}`,` STANCE: ${Fm}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
958
+ `)}var Fm,oi,YI,zn,Um,ml,ai,Zn=E(()=>{"use strict";Fm="other",oi=["not_enough_information","dont_know","other_work"],YI=new Set([Fm,...oi]),zn="@abort",Um="invalid_decision",ml="escalation_aborted",ai="workflow_escalation"});import{randomUUID as Bm}from"node:crypto";import{hostname as Qn}from"node:os";function qe(t){return t.provider_resolved??t.provider}function $(){return new Date().toISOString()}function ke(t){return new pl(dl({dbPath:t.path}))}function qm(t,e,r){let n=Hm(e);if(n.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return n;let c=r(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Hm(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(t)}function Hm(t){let e=zI(t),r=e===null?null:ZI(e,"states");if(r===null)return[];let n=[];for(let s of Object.values(r))li(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&n.push(s.workflow_name);return n}function zI(t){try{let e=JSON.parse(t);return li(e)?e:null}catch{return null}}function ZI(t,e){let r=t[e];return li(r)?r:null}function li(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function QI(t){try{let e=JSON.parse(t);return!li(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function e0(t,e){return t===null?!0:t.holder_host===Qn()?!ot(t.holder_pid):t.last_heartbeat<e}function t0(t,e){if(t.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let r=t.delivering_at<e;if(t.delivery_holder_host===Qn()&&r0(t.delivery_holder_pid)){let n=ot(t.delivery_holder_pid);return n?r?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:n}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:n}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:n}}return r?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function rr(t,e,r={}){let n=new Date().toISOString(),s=e.delivering_at===null?NaN:Date.parse(e.delivering_at),i=Date.parse(n);C({event:t,event_at:n,message_id:e.id,message_type:e.message_type,lane_key:JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias]),sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message_created_at:e.created_at,delivering_at:e.delivering_at,delivered_at:e.delivered_at,delivery_holder_pid:e.delivery_holder_pid,delivery_holder_host:e.delivery_holder_host,lease_age_ms:Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):null,...r})}function r0(t){return Number.isInteger(t)&&(t??0)>0}function n0(t){return{...Cm(t),getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
959
959
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
960
960
  VALUES (?, ?, ?, ?, ?)
961
961
  ON CONFLICT(scope, key, kind) DO UPDATE SET
@@ -1355,54 +1355,54 @@ var xk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ee=(t,e)=>{f
1355
1355
  error_detail = ?,
1356
1356
  truncated = ?
1357
1357
  WHERE id = ?
1358
- `),...Lm(t),...xm(t)}}function s0(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var ml,Qe=E(()=>{"use strict";Nm();Am();Om();dl();jm();Yn();ue();Zn();ml=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=n0(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>s0("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ai)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==zn&&!a.includes(n))return{resumed:!1,reason:Um};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,i=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),o=i!==void 0?{acquired:!0,current:i}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let i of s)this.stmts.deleteMailboxMessage.run(i.id);return s})}close(){this.db.close()}query(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){qm(e.name,e.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,$()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,$());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 i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),i}upsertWorkflow(e){qm(e.name,e.definition,o=>this.getWorkflowByName(o));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,i=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,$());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.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,$())}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 i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,r,n??null,$());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,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,$()),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,$(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run($(),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 i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,$());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,$());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,$(),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"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,$());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",$());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"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,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,$());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=$(),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,$(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,$(),e)??null}closeIssue(e,r,n){let s=$(),i=this.stmts.closeIssue.get(r,n??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,$(),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"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,$(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=$();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,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,$(),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,$(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Bm(),s=$();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 i=$(),o=this.stmts.insertChatbotMessage.run(e,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,$())}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??$(),e.dedupe_key??null,e.concurrency_key??null,$());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=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=$(),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:$();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,$()),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,$()),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??$(),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,$());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=$(),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),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}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,$(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run($(),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.origin,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)}startTrackedInvocation(e){let r=e.started_at??$(),n=e.holder_host??Qn(),s=e.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Ft(e.command),r,e.holder_pid??null,n,s,Ft(e.meta),e.launch_source??e.kind,e.request_payload??null);return this.getTrackedInvocation(Number(i.lastInsertRowid))}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){let n=r.ended_at??$();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Ft(r.result_summary),Ft(r.error),r.team_chat_log_id??null,Ft(r.meta),n,e).changes!==1?null:this.getTrackedInvocation(e)}reclaimTrackedInvocationIfUnchanged(e,r,n){let s=n.ended_at??$();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Ft(n.result_summary),Ft(n.error),n.team_chat_log_id??null,Ft(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(e)}heartbeatTrackedInvocation(e,r=$()){return this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}updateTrackedInvocationRequestPayload(e,r){return this.stmts.updateTrackedInvocationRequestPayload.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(e,r,n=$()){return this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1?null:this.getTrackedInvocation(e)}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){let r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,Xn(e.payload),e.created_at??$(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null,e.message_type??"request",e.reply_mode??"pull",e.request_mailbox_id??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedRequestMailFromSender(e,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(e,r,n,s)}listEnqueuedResponseMailFromSender(e,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(e,r,n,s)}listRelayMailboxLanes(e){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(e)))}markMailDelivered(e,r,n){let s=[...new Set(e.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))];if(s.length===0)return 0;let i=Xn(r),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of s){let c=this.getMailboxMessage(l),d=this.stmts.markMailboxMessageDelivered.run(n,i,l);a+=d.changes,d.changes===1&&c!==null&&o.push(c)}this.db.exec("COMMIT");for(let l of o)rr("mailbox_delivery_delivered",l,{transition:l.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:n});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,r,n){let s=Xn(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,l.id,l.delivering_at,l.delivery_holder_pid,l.delivery_holder_host).changes!==1){o.push(l);continue}a+=1,i.push(l)}this.db.exec("COMMIT");for(let l of i)rr("mailbox_delivery_delivered",l,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas"});for(let l of o)rr("mailbox_delivery_finalize_skipped",l,{delivered_at:n,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(e,r,n){let s=Xn(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let c of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,c.id,c.delivering_at,c.delivery_holder_pid,c.delivery_holder_host).changes!==1){o.push(c);continue}if(a+=1,i.push(c),c.sender_teamfile===null||c.sender_alias===null)continue;let u=this.stmts.insertMailboxResponseIfAbsent.run(c.sender_teamfile,c.sender_alias,c.receiver_teamfile,c.receiver_alias,c.root_teamfile,s,n,null,null,null,null,c.reply_mode,c.id);l+=u.changes}this.db.exec("COMMIT");for(let c of i)rr("mailbox_delivery_delivered",c,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas-with-response"});for(let c of o)rr("mailbox_delivery_finalize_skipped",c,{delivered_at:n,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(e,r,n=process.pid,s=Qn()){let i=[...new Set(e.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,l).changes===1){let d=this.getMailboxMessage(l);d!==null&&o.push(d)}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)rr("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:r,delivery_holder_pid:n,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(e){let r=[...new Set(e.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(r.length===0)return 0;let n=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of r){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&n.push(o)}this.db.exec("COMMIT");for(let i of n)rr("mailbox_delivery_cleared",i,{transition:"delivering->pending",reason:"explicit non-CAS clear"});return s}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}reclaimMailboxDeliveryIfUnchanged(e){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1?null:this.getMailboxMessage(e.id)}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of r){let o=t0(i,e);if(!o.reclaim){s.push({row:i,decision:o,reclaimed:!1});continue}let a=this.reclaimMailboxDeliveryIfUnchanged(i),l=a!==null;s.push({row:i,decision:o,reclaimed:l}),l&&n.push(a)}this.db.exec("COMMIT");for(let i of s)rr(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:e,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return n}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}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)}clearObservedTerminalAgentInflight(e,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(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}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(Gn,Vn(e,r),Kn);return n===void 0?null:Mm(n.data)}setTerminalLock(e){this.stmts.upsertRuntimeState.run(Gn,Vn(e.teamfile,e.alias),Kn,JSON.stringify(e),e.last_heartbeat)}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Gn,Vn(e,r),Kn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Gn,Vn(e,r),Kn);return this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:QI(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,i=$()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o!==null&&!e0(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Bm(),holder_pid:process.pid,holder_host:Qn(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,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,$(),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,$())}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,$());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,$(),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??$(),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,$());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,$()).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,$()),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,$());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run($(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=$();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:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}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??$());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,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(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,$())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,$())}}});import{realpathSync as i0}from"node:fs";import{resolve as o0}from"node:path";function pl(t){let e=o0(t);try{return i0(e)}catch{return e}}var Jm=E(()=>{"use strict"});import{platform as Xm}from"node:os";function bt(t){let e=new es;for(let r of t)e.registerAdapter(r);return e}var es,_l=E(()=>{"use strict";Jm();es=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(e?.workspace){let o=pl(e.workspace);i=i.filter(a=>pl(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(e);if(i)return i}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(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=Xm()==="darwin"||Xm()==="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 Gm}from"node:fs";import{createInterface as Km}from"node:readline";import{stat as a0}from"node:fs/promises";import{homedir as l0}from"node:os";async function*He(t){let e=Gm(t,{encoding:"utf-8"}),r=Km({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 Me(t,e){let r=[],n=Gm(t,{encoding:"utf-8"}),s=Km({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Ne(t){let e=await a0(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function fe(t){return t.replace(/\\n/g,`
1359
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function J(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Se,nr=E(()=>{"use strict";Se=l0()});import{readdir as ci,stat as Vm,unlink as c0}from"node:fs/promises";import{join as Zr,basename as Ym}from"node:path";function d0(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function u0(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return fe(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 zm(t){let e=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of He(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&e++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let h=u+f+m;h&&(o=h),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var di,Zm=E(()=>{"use strict";nr();di=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Zr(Se,".claude"),this.projectsDir=Zr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await ci(this.projectsDir)}catch{return e}for(let n of r){let s=Zr(this.projectsDir,n);if(!(await Vm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ci(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ym(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Zr(s,a);try{let d=await this.extractSummary(c,l);d&&e.push(d)}catch{}}}return e}async extractSummary(e,r){let n=await Me(e,50),s=await Ne(e),i="",o,a,l,c,d,u;for(let m of n)if(!d0(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=J(p.trim(),80)),d=J(p.trim(),80)}}if(!i)return null;let f=await zm(e);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath: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=[],i="",o,a,l,c,d,u,f,m=e;for await(let h of He(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:u0(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;d||(d=J(_.trim(),80)),u=J(_.trim(),80),s.push({role:"user",timestamp:g,content:fe(_.trim())})}else if(Array.isArray(_)){for(let y of _)if(y.type==="tool_result"){let T=typeof y.content=="string"?fe(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:T,toolCallId:y.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let y of _)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:fe(y.text),model:h.message.model}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolCallId:y.id,model:h.message.model}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!i)return null;let p=await zm(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await c0(r),!0):!1}async resolveSessionFile(e){let r;try{r=await ci(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Zr(this.projectsDir,o);if(!(await Vm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ci(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=Ym(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Zr(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Me(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});function ui(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function m0(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 Qm(t,e){return!!t.tools[e]}function ep(t,e,r,n,s){let i=t.tools[e]??hl[e],o;if(i?.agent){let l=ui(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=f0[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ui).join(" ");o=`printf '%s\\n' ${ui(n)} | ${d}`}else o=c.map(ui).join(" ")}let a=m0(t,e,s);return a&&(o+=" "+a),o}var hl,f0,tp=E(()=>{"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:""}}}},f0={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 rp(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 np=E(()=>{"use strict"});var p0,ge,fi,St=E(()=>{"use strict";p0="ACK: waiting for explicit lmctl task.",ge=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${p0}`,fi=`send this exact lmctl seed instruction: "${ge}"`});function sr(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function h0(t,e){return e===void 0||e.length===0?t:{...t??process.env,[ts]:e}}function je(t,e,r,n="chat"){return{...h0(sr(t,e),r),[_0]:n}}var ts,_0,at=E(()=>{"use strict";ts="LMCTL_SELF_SESSIONID",_0="LMCTL_LAUNCH_SOURCE"});import{spawn as sp}from"node:child_process";import{mkdirSync as g0}from"node:fs";var gl,xe,Ut=E(()=>{"use strict";tp();np();St();at();gl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},xe=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===ge?r:n)}seed(e,r){return g0(e,{recursive:!0}),new Promise(n=>{let s;try{s=sp(this.binary,this.seedArgsFor(r),{cwd:e,env:sr(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1360
- `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:fi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Qm(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,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new gl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=ep(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=rp(r.env),c=sp(s,{shell:!0,cwd:r.cwd,env:je(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{d||(d=!0,clearTimeout(f),a(h))})})}}});function pi(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Bt(t,r,e)}var et,ye,Wt,mi,Bt,Qr=E(()=>{"use strict";et=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends et{},Wt=class extends et{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},mi=class extends et{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Bt=class extends et{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 w0(t){if(typeof wl.spawnSync=="function")try{wl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function ip(t){return t.exitCode!==null||t.signalCode!==null}function yl(t,e){return ip(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function tt(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??w0;if(ip(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(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await yl(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await yl(t,y0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var y0,_i=E(()=>{"use strict";y0=1e3});function op(t){ce()&&Ae({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function ir(t,e){let r=T0[t];if(r)return r[e]??r.yolo}function S0(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 lt(t,e,r="yolo"){if(b0.has(t)){op(`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"?ir(t,"plan"):E0[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 M({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ye(s)}if(!S0(e,n)){let s=n.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw M({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:i}),new ye(i)}op(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var E0,T0,b0,en=E(()=>{"use strict";Qr();ue();E0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},T0={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};b0=new Set(["codex","opencode"])});function ap(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(`
1358
+ `),...Lm(t),...xm(t)}}function s0(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var pl,Qe=E(()=>{"use strict";Nm();Am();Om();ul();jm();Yn();de();Zn();pl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=n0(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:r,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>s0("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,n,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ai)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==zn&&!a.includes(n))return{resumed:!1,reason:Um};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,i=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),o=i!==void 0?{acquired:!0,current:i}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=e.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let i of s)this.stmts.deleteMailboxMessage.run(i.id);return s})}close(){this.db.close()}query(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){qm(e.name,e.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,$()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,$());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 i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),i}upsertWorkflow(e){qm(e.name,e.definition,o=>this.getWorkflowByName(o));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,i=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,$());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.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,$())}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 i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,r,n??null,$());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,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,$()),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,$(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run($(),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 i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,$());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,$());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,$(),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"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,$());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",$());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"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,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,$());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=$(),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,$(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,$(),e)??null}closeIssue(e,r,n){let s=$(),i=this.stmts.closeIssue.get(r,n??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,$(),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"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,$(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=$();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,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,$(),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,$(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Bm(),s=$();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 i=$(),o=this.stmts.insertChatbotMessage.run(e,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,$())}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??$(),e.dedupe_key??null,e.concurrency_key??null,$());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=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=$(),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:$();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,$()),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,$()),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??$(),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,$());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=$(),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),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}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,$(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run($(),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.origin,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)}startTrackedInvocation(e){let r=e.started_at??$(),n=e.holder_host??Qn(),s=e.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Ft(e.command),r,e.holder_pid??null,n,s,Ft(e.meta),e.launch_source??e.kind,e.request_payload??null);return this.getTrackedInvocation(Number(i.lastInsertRowid))}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(e,r){let n=r.ended_at??$();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Ft(r.result_summary),Ft(r.error),r.team_chat_log_id??null,Ft(r.meta),n,e).changes!==1?null:this.getTrackedInvocation(e)}reclaimTrackedInvocationIfUnchanged(e,r,n){let s=n.ended_at??$();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Ft(n.result_summary),Ft(n.error),n.team_chat_log_id??null,Ft(n.meta),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(e)}heartbeatTrackedInvocation(e,r=$()){return this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}updateTrackedInvocationRequestPayload(e,r){return this.stmts.updateTrackedInvocationRequestPayload.run(r,e).changes!==1?null:this.getTrackedInvocation(e)}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(e,r,n=$()){return this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1?null:this.getTrackedInvocation(e)}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}enqueueMail(e){return this.sendMailboxMessage(e)}sendMailboxMessage(e){let r=this.stmts.insertMailboxMessage.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile??null,e.sender_alias??null,e.root_teamfile??null,Xn(e.payload),e.created_at??$(),e.remote_transport??null,e.remote_message_id??null,e.remote_thread_id??null,e.meta??null,e.message_type??"request",e.reply_mode??"pull",e.request_mailbox_id??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedRequestMailFromSender(e,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(e,r,n,s)}listEnqueuedResponseMailFromSender(e,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(e,r,n,s)}listRelayMailboxLanes(e){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(e)))}markMailDelivered(e,r,n){let s=[...new Set(e.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))];if(s.length===0)return 0;let i=Xn(r),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of s){let c=this.getMailboxMessage(l),d=this.stmts.markMailboxMessageDelivered.run(n,i,l);a+=d.changes,d.changes===1&&c!==null&&o.push(c)}this.db.exec("COMMIT");for(let l of o)rr("mailbox_delivery_delivered",l,{transition:l.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:n});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(e,r,n){let s=Xn(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let l of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,l.id,l.delivering_at,l.delivery_holder_pid,l.delivery_holder_host).changes!==1){o.push(l);continue}a+=1,i.push(l)}this.db.exec("COMMIT");for(let l of i)rr("mailbox_delivery_delivered",l,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas"});for(let l of o)rr("mailbox_delivery_finalize_skipped",l,{delivered_at:n,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(e,r,n){let s=Xn(r),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let c of e){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,c.id,c.delivering_at,c.delivery_holder_pid,c.delivery_holder_host).changes!==1){o.push(c);continue}if(a+=1,i.push(c),c.sender_teamfile===null||c.sender_alias===null)continue;let u=this.stmts.insertMailboxResponseIfAbsent.run(c.sender_teamfile,c.sender_alias,c.receiver_teamfile,c.receiver_alias,c.root_teamfile,s,n,null,null,null,null,c.reply_mode,c.id);l+=u.changes}this.db.exec("COMMIT");for(let c of i)rr("mailbox_delivery_delivered",c,{transition:"delivering->delivered",delivered_at:n,finalizer:"lease-cas-with-response"});for(let c of o)rr("mailbox_delivery_finalize_skipped",c,{delivered_at:n,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(e,r,n=process.pid,s=Qn()){let i=[...new Set(e.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,l).changes===1){let d=this.getMailboxMessage(l);d!==null&&o.push(d)}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)rr("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:r,delivery_holder_pid:n,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(e){let r=[...new Set(e.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(r.length===0)return 0;let n=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of r){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&n.push(o)}this.db.exec("COMMIT");for(let i of n)rr("mailbox_delivery_cleared",i,{transition:"delivering->pending",reason:"explicit non-CAS clear"});return s}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}reclaimMailboxDeliveryIfUnchanged(e){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(e.id,e.delivering_at,e.delivery_holder_pid,e.delivery_holder_host).changes!==1?null:this.getMailboxMessage(e.id)}reclaimStaleMailboxDeliveries(e){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of r){let o=t0(i,e);if(!o.reclaim){s.push({row:i,decision:o,reclaimed:!1});continue}let a=this.reclaimMailboxDeliveryIfUnchanged(i),l=a!==null;s.push({row:i,decision:o,reclaimed:l}),l&&n.push(a)}this.db.exec("COMMIT");for(let i of s)rr(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:e,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return n}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(e,r){return this.stmts.listDeliveredReceiptsForSender.all(e,r)}listOutboundPendingForSender(e,r){return this.stmts.listOutboundPendingForSender.all(e,r)}getMailboxMessage(e){return this.stmts.getMailboxMessage.get(e)??null}peekMailboxMessages(e,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(e.receiver_teamfile,e.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(e){return this.recvMailboxMessagesTxn(e.receiver_teamfile,e.receiver_alias)}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)}clearObservedTerminalAgentInflight(e,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(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}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(Gn,Vn(e,r),Kn);return n===void 0?null:Mm(n.data)}setTerminalLock(e){this.stmts.upsertRuntimeState.run(Gn,Vn(e.teamfile,e.alias),Kn,JSON.stringify(e),e.last_heartbeat)}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Gn,Vn(e,r),Kn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Gn,Vn(e,r),Kn);return this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:QI(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,i=$()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o!==null&&!e0(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Bm(),holder_pid:process.pid,holder_host:Qn(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,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,$(),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,$())}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,$());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,$(),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??$(),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,$());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,$()).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,$()),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,$());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run($(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=$();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:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}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??$());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,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(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,$())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,$())}}});import{realpathSync as i0}from"node:fs";import{resolve as o0}from"node:path";function _l(t){let e=o0(t);try{return i0(e)}catch{return e}}var Jm=E(()=>{"use strict"});import{platform as Xm}from"node:os";function bt(t){let e=new es;for(let r of t)e.registerAdapter(r);return e}var es,hl=E(()=>{"use strict";Jm();es=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(e?.workspace){let o=_l(e.workspace);i=i.filter(a=>_l(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(e);if(i)return i}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(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=Xm()==="darwin"||Xm()==="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 Gm}from"node:fs";import{createInterface as Km}from"node:readline";import{stat as a0}from"node:fs/promises";import{homedir as l0}from"node:os";async function*He(t){let e=Gm(t,{encoding:"utf-8"}),r=Km({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 Me(t,e){let r=[],n=Gm(t,{encoding:"utf-8"}),s=Km({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Ne(t){let e=await a0(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function fe(t){return t.replace(/\\n/g,`
1359
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function J(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Se,nr=E(()=>{"use strict";Se=l0()});import{readdir as ci,stat as Vm,unlink as c0}from"node:fs/promises";import{join as Zr,basename as Ym}from"node:path";function d0(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function u0(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return fe(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 zm(t){let e=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of He(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&e++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let h=u+f+m;h&&(o=h),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var di,Zm=E(()=>{"use strict";nr();di=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Zr(Se,".claude"),this.projectsDir=Zr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await ci(this.projectsDir)}catch{return e}for(let n of r){let s=Zr(this.projectsDir,n);if(!(await Vm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ci(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ym(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Zr(s,a);try{let d=await this.extractSummary(c,l);d&&e.push(d)}catch{}}}return e}async extractSummary(e,r){let n=await Me(e,50),s=await Ne(e),i="",o,a,l,c,d,u;for(let m of n)if(!d0(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=J(p.trim(),80)),d=J(p.trim(),80)}}if(!i)return null;let f=await zm(e);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath: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=[],i="",o,a,l,c,d,u,f,m=e;for await(let h of He(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:u0(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;d||(d=J(_.trim(),80)),u=J(_.trim(),80),s.push({role:"user",timestamp:g,content:fe(_.trim())})}else if(Array.isArray(_)){for(let y of _)if(y.type==="tool_result"){let T=typeof y.content=="string"?fe(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:T,toolCallId:y.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let y of _)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:fe(y.text),model:h.message.model}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolCallId:y.id,model:h.message.model}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!i)return null;let p=await zm(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await c0(r),!0):!1}async resolveSessionFile(e){let r;try{r=await ci(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Zr(this.projectsDir,o);if(!(await Vm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ci(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=Ym(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Zr(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Me(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});function ui(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function m0(t,e,r){if(!r)return"";let n=t.tools[e]??gl[e],s=n?.profiles?.[r]?.flags??gl[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 Qm(t,e){return!!t.tools[e]}function ep(t,e,r,n,s){let i=t.tools[e]??gl[e],o;if(i?.agent){let l=ui(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=f0[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ui).join(" ");o=`printf '%s\\n' ${ui(n)} | ${d}`}else o=c.map(ui).join(" ")}let a=m0(t,e,s);return a&&(o+=" "+a),o}var gl,f0,tp=E(()=>{"use strict";gl={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:""}}}},f0={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 rp(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 np=E(()=>{"use strict"});var p0,ge,fi,St=E(()=>{"use strict";p0="ACK: waiting for explicit lmctl task.",ge=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${p0}`,fi=`send this exact lmctl seed instruction: "${ge}"`});function sr(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function h0(t,e){return e===void 0||e.length===0?t:{...t??process.env,[ts]:e}}function je(t,e,r,n="chat"){return{...h0(sr(t,e),r),[_0]:n}}var ts,_0,at=E(()=>{"use strict";ts="LMCTL_SELF_SESSIONID",_0="LMCTL_LAUNCH_SOURCE"});import{spawn as sp}from"node:child_process";import{mkdirSync as g0}from"node:fs";var yl,xe,Ut=E(()=>{"use strict";tp();np();St();at();yl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},xe=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===ge?r:n)}seed(e,r){return g0(e,{recursive:!0}),new Promise(n=>{let s;try{s=sp(this.binary,this.seedArgsFor(r),{cwd:e,env:sr(void 0,e),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1360
+ `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:fi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&Qm(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,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new yl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=ep(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=rp(r.env),c=sp(s,{shell:!0,cwd:r.cwd,env:je(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{d||(d=!0,clearTimeout(f),a(h))})})}}});function pi(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new Bt(t,r,e)}var et,ye,Wt,mi,Bt,Qr=E(()=>{"use strict";et=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends et{},Wt=class extends et{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},mi=class extends et{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},Bt=class extends et{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as El from"node:child_process";function w0(t){if(typeof El.spawnSync=="function")try{El.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function ip(t){return t.exitCode!==null||t.signalCode!==null}function wl(t,e){return ip(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function tt(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??w0;if(ip(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(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await wl(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await wl(t,y0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var y0,_i=E(()=>{"use strict";y0=1e3});function op(t){ce()&&Ae({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function ir(t,e){let r=T0[t];if(r)return r[e]??r.yolo}function S0(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 lt(t,e,r="yolo"){if(b0.has(t)){op(`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"?ir(t,"plan"):E0[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 C({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ye(s)}if(!S0(e,n)){let s=n.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw C({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:i}),new ye(i)}op(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var E0,T0,b0,en=E(()=>{"use strict";Qr();de();E0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},T0={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};b0=new Set(["codex","opencode"])});function ap(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(`
1361
1361
 
1362
1362
  --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
1363
1363
 
1364
- `+t[r]);return e.join("")}function El(t={}){let e=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}t.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(r=i.session_id||r),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&t.onText?.(c.text)}o==="result"&&(n=!0,e.push(i))},sawResult(){return n},finalize(){if(!n)return null;let s=lp(e);return{result:ap(s.resultTexts),sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns}}}}function lp(t){let e=[],r=0,n=0,s="";for(let i of t){e.push(i.result||"");let o=i.duration_ms;typeof o=="number"&&Number.isFinite(o)&&(r+=o);let a=i.num_turns;typeof a=="number"&&Number.isFinite(a)&&(n=a);let l=i.session_id;typeof l=="string"&&l&&(s=l)}return{resultTexts:e,durationMs:r,numTurns:n,sessionId:s}}var Tl=E(()=>{"use strict"});import{spawn as v0}from"node:child_process";import{existsSync as k0}from"node:fs";function N0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} exited with code ${t.exitCode} before returning a final result event.
1364
+ `+t[r]);return e.join("")}function Tl(t={}){let e=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}t.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(r=i.session_id||r),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&t.onText?.(c.text)}o==="result"&&(n=!0,e.push(i))},sawResult(){return n},finalize(){if(!n)return null;let s=lp(e);return{result:ap(s.resultTexts),sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns}}}}function lp(t){let e=[],r=0,n=0,s="";for(let i of t){e.push(i.result||"");let o=i.duration_ms;typeof o=="number"&&Number.isFinite(o)&&(r+=o);let a=i.num_turns;typeof a=="number"&&Number.isFinite(a)&&(n=a);let l=i.session_id;typeof l=="string"&&l&&(s=l)}return{resultTexts:e,durationMs:r,numTurns:n,sessionId:s}}var bl=E(()=>{"use strict"});import{spawn as v0}from"node:child_process";import{existsSync as k0}from"node:fs";function N0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} exited with code ${t.exitCode} before returning a final result event.
1365
1365
  One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return e?`Original provider error:
1366
1366
  ${e}
1367
1367
 
1368
- ${r}`:r}function cp(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",i=e.binaryPath||I0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=ir(s,a)??x0[s]??["--dangerously-skip-permissions"];o.push(...l);try{lt(s,o,a)}catch(g){return n(g)}if(e.cwd&&!k0(e.cwd))return M({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=v0(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:je(e.env,e.cwd,e.sessionId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,M({event:"transport_abort",provider:s,phase:"pre_spawn"}),tt(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,M({event:"transport_abort",provider:s}),tt(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=El({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=u.sawResult();u.processLine(g),!_&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
1369
- `);f=_.pop()||"";for(let y of _)m(y)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{M({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new ye(`Failed to spawn ${i}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(d)return;f.trim()&&m(f);let _=u.finalize();_?(Tt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(M({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(N0({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
1370
- `),Tt(`stream-json: prompt sent (${t.length} chars)`)})}var I0,x0,dp=E(()=>{"use strict";Qr();_i();en();ue();at();Tl();Tl();I0={claude:"claude",qwen:"qwen"};x0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function hi(t={}){return[]}var bl=E(()=>{"use strict"});function Sl(t){return t==="plan"?"read-only":"danger-full-access"}function up(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function vl(){return{agentItems:new Map,resultText:""}}function gi(t,e,r,n){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function kl(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function fp(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 Il(){return{pendingCodexError:null}}function Nl(t,e){let r=fp(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function xl(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var Al=E(()=>{"use strict"});import{spawn as A0}from"node:child_process";import{createInterface as R0}from"node:readline";import{existsSync as L0,readFileSync as O0}from"node:fs";import{fileURLToPath as $0}from"node:url";function M0(){return up(C0)}function or(t,e){Tt(`[codex:${t}] ${JSON.stringify(e)}`)}function j0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1368
+ ${r}`:r}function cp(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",i=e.binaryPath||I0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=ir(s,a)??x0[s]??["--dangerously-skip-permissions"];o.push(...l);try{lt(s,o,a)}catch(g){return n(g)}if(e.cwd&&!k0(e.cwd))return C({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=v0(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:je(e.env,e.cwd,e.sessionId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,C({event:"transport_abort",provider:s,phase:"pre_spawn"}),tt(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,C({event:"transport_abort",provider:s}),tt(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=Tl({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=u.sawResult();u.processLine(g),!_&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
1369
+ `);f=_.pop()||"";for(let y of _)m(y)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{C({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new ye(`Failed to spawn ${i}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(d)return;f.trim()&&m(f);let _=u.finalize();_?(Tt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(C({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(N0({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
1370
+ `),Tt(`stream-json: prompt sent (${t.length} chars)`)})}var I0,x0,dp=E(()=>{"use strict";Qr();_i();en();de();at();bl();bl();I0={claude:"claude",qwen:"qwen"};x0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function hi(t={}){return[]}var Sl=E(()=>{"use strict"});function vl(t){return t==="plan"?"read-only":"danger-full-access"}function up(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function kl(){return{agentItems:new Map,resultText:""}}function gi(t,e,r,n){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function Il(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function fp(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 Nl(){return{pendingCodexError:null}}function xl(t,e){let r=fp(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function Al(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var Rl=E(()=>{"use strict"});import{spawn as A0}from"node:child_process";import{createInterface as R0}from"node:readline";import{existsSync as L0,readFileSync as O0}from"node:fs";import{fileURLToPath as $0}from"node:url";function M0(){return up(C0)}function or(t,e){Tt(`[codex:${t}] ${JSON.stringify(e)}`)}function j0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1371
1371
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
1372
1372
  ${e}
1373
1373
 
1374
- ${r}`:r}function mp(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?hi():[];i.push(...a),ce()&&Oe(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",c=Sl(l);try{lt("codex",i,l)}catch(U){return n(U)}if(e.cwd&&!L0(e.cwd))return M({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 d=A0(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:je(e.env,e.cwd,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,M({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),tt(d).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,M({event:"transport_abort",provider:"codex"}),tt(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=R0({input:d.stdout}),m=new Map,p=1,h=e.threadId||"",g="",_=!1,y=!1,T=Date.now(),b=vl(),I=Il();function x(U,j={}){return new Promise((A,ee)=>{let B=p++;m.set(B,{resolve:A,reject:ee});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:U,params:j});d.stdin?.write(k+`
1374
+ ${r}`:r}function mp(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?hi():[];i.push(...a),ce()&&Oe(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",c=vl(l);try{lt("codex",i,l)}catch(U){return n(U)}if(e.cwd&&!L0(e.cwd))return C({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 d=A0(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:je(e.env,e.cwd,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,C({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),tt(d).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,C({event:"transport_abort",provider:"codex"}),tt(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=R0({input:d.stdout}),m=new Map,p=1,h=e.threadId||"",g="",_=!1,y=!1,T=Date.now(),b=kl(),I=Nl();function x(U,j={}){return new Promise((A,ee)=>{let B=p++;m.set(B,{resolve:A,reject:ee});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:U,params:j});d.stdin?.write(k+`
1375
1375
  `)})}function H(U,j={}){let A=JSON.stringify({jsonrpc:"2.0",method:U,params:j});d.stdin?.write(A+`
1376
- `)}f.on("line",U=>{let j;try{j=JSON.parse(U)}catch{return}if(typeof j.id=="number"&&m.has(j.id)){let B=m.get(j.id);if(m.delete(j.id),j.error){let k=j.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(j.error);B.reject(pi(`codex app-server error: ${N}`,k))}else B.resolve(j);e.onEvent?.(j);return}let A=j.method;if(!A){e.onEvent?.(j);return}if(A==="thread/started"){let k=j.params?.thread;k?.id&&(h=k.id)}let ee=ce()?B=>{or("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=j.params,k=B?.turn;k?.id&&(g=k.id),gi(j,b,e.onDelta,ee),ce()&&or("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=j.params;B?.item?.type==="agentMessage"&&or(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=j.params;ce()&&or("agentMessage/delta",{params:B??null})}gi(j,b,e.onDelta,ee)}if(A==="turn/completed"){let B=j.params;if(ce())for(let[N,L]of b.agentItems.entries())L.buffer&&or("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});kl(b),ce()&&or("turn/completed",{params:B??null});let k=xl(j,I);k.shouldReject?(ce()&&or("turn/completed/terminal-reject",{message:k.turnError.message}),y=!0,_=!0,d.stdin?.end(),n(k.turnError)):(_=!0,d.stdin?.end())}if(A==="error"){let B=Nl(j,I);if(ce()){let k=j.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";or(B.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:B.willRetry,params:k??null})}}e.onEvent?.(j)});let pe="";d.stderr?.on("data",U=>{pe+=U.toString()}),d.on("error",U=>{M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:U.message}),n(new ye(`Failed to spawn codex app-server: ${U.message}`,{cause:U}))}),d.on("exit",U=>{if(!u&&!y){if(_){r({result:b.resultText,threadId:h,turnId:g,durationMs:Date.now()-T,exitCode:U});return}if(I.pendingCodexError){n(I.pendingCodexError);return}M({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:U,stderr_tail:pe.slice(0,500)}),n(new Error(j0({exitCode:U,stderr:pe})))}}),(async()=>{try{if(await x("initialize",M0()),H("initialized",{}),e.threadId)try{let U=x("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),j=new Promise((A,ee)=>setTimeout(()=>ee(new Error("resume timeout")),5e3));await Promise.race([U,j]),h=e.threadId}catch(U){process.stderr.write(`[codex] thread/resume failed, creating new thread
1377
- `),M({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:U instanceof Error?U.message:String(U)});let A=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;A?.id&&(h=A.id)}else{let j=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;j?.id&&(h=j.id)}await x("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(U){tt(d).catch(()=>{}),n(U instanceof Error?U:new Error(String(U)))}})()})}var C0,pp=E(()=>{"use strict";ue();ue();Qr();_i();en();bl();ue();at();Al();Al();C0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(O0($0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as gp,mkdirSync as D0,readFileSync as yp,writeFileSync as _p}from"node:fs";import{join as rs,resolve as P0}from"node:path";function wp(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 Rl(t,e,r={existsSync:gp,readFileSync:yp}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=P0(e,s.sessiondir??e);for(let o of F0(i)){let a=U0(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(wp(a.permission)||n.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function F0(t){return[rs(t,".opencode","opencode.jsonc"),rs(t,"opencode.jsonc"),rs(t,"opencode.json")]}function U0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(W0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function W0(t){let e="",r=!1,n="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(r){e+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
1376
+ `)}f.on("line",U=>{let j;try{j=JSON.parse(U)}catch{return}if(typeof j.id=="number"&&m.has(j.id)){let B=m.get(j.id);if(m.delete(j.id),j.error){let k=j.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(j.error);B.reject(pi(`codex app-server error: ${N}`,k))}else B.resolve(j);e.onEvent?.(j);return}let A=j.method;if(!A){e.onEvent?.(j);return}if(A==="thread/started"){let k=j.params?.thread;k?.id&&(h=k.id)}let ee=ce()?B=>{or("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=j.params,k=B?.turn;k?.id&&(g=k.id),gi(j,b,e.onDelta,ee),ce()&&or("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=j.params;B?.item?.type==="agentMessage"&&or(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=j.params;ce()&&or("agentMessage/delta",{params:B??null})}gi(j,b,e.onDelta,ee)}if(A==="turn/completed"){let B=j.params;if(ce())for(let[N,L]of b.agentItems.entries())L.buffer&&or("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});Il(b),ce()&&or("turn/completed",{params:B??null});let k=Al(j,I);k.shouldReject?(ce()&&or("turn/completed/terminal-reject",{message:k.turnError.message}),y=!0,_=!0,d.stdin?.end(),n(k.turnError)):(_=!0,d.stdin?.end())}if(A==="error"){let B=xl(j,I);if(ce()){let k=j.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";or(B.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:B.willRetry,params:k??null})}}e.onEvent?.(j)});let pe="";d.stderr?.on("data",U=>{pe+=U.toString()}),d.on("error",U=>{C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:U.message}),n(new ye(`Failed to spawn codex app-server: ${U.message}`,{cause:U}))}),d.on("exit",U=>{if(!u&&!y){if(_){r({result:b.resultText,threadId:h,turnId:g,durationMs:Date.now()-T,exitCode:U});return}if(I.pendingCodexError){n(I.pendingCodexError);return}C({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:U,stderr_tail:pe.slice(0,500)}),n(new Error(j0({exitCode:U,stderr:pe})))}}),(async()=>{try{if(await x("initialize",M0()),H("initialized",{}),e.threadId)try{let U=x("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),j=new Promise((A,ee)=>setTimeout(()=>ee(new Error("resume timeout")),5e3));await Promise.race([U,j]),h=e.threadId}catch(U){process.stderr.write(`[codex] thread/resume failed, creating new thread
1377
+ `),C({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:U instanceof Error?U.message:String(U)});let A=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;A?.id&&(h=A.id)}else{let j=(await x("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;j?.id&&(h=j.id)}await x("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(U){tt(d).catch(()=>{}),n(U instanceof Error?U:new Error(String(U)))}})()})}var C0,pp=E(()=>{"use strict";de();de();Qr();_i();en();Sl();de();at();Rl();Rl();C0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(O0($0(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as gp,mkdirSync as D0,readFileSync as yp,writeFileSync as _p}from"node:fs";import{join as rs,resolve as P0}from"node:path";function wp(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 Ll(t,e,r={existsSync:gp,readFileSync:yp}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=P0(e,s.sessiondir??e);for(let o of F0(i)){let a=U0(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(wp(a.permission)||n.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function F0(t){return[rs(t,".opencode","opencode.jsonc"),rs(t,"opencode.jsonc"),rs(t,"opencode.json")]}function U0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(W0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function W0(t){let e="",r=!1,n="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(r){e+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
1378
1378
  `;)i+=1;i<t.length&&(e+=t[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<t.length&&!(t[i]==="*"&&t[i+1]==="/");)i+=1;i+=1;continue}e+=o}return e.replace(/,\s*([}\]])/g,"$1")}function yi(t,e={}){let r=rs(t,".opencode"),n=rs(r,"opencode.json");if(!gp(n)){D0(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return _p(n,o+`
1379
- `,"utf-8"),!0}let s;try{s=JSON.parse(yp(n,"utf-8"))}catch{return console.log(hp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(hp.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),wp(s.permission)||M({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&_p(n,JSON.stringify(s,null,2)+`
1380
- `,"utf-8"),i}var hp,wi=E(()=>{"use strict";ue();hp={yellow:t=>t}});function bp(t){let e=[...t.matchAll(B0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Ep(t.slice(n).trimStart())}return Ep(G0(t.replace(q0,"")))}function G0(t){let e=H0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(J0)];if(n.length<2)return t;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function Ep(t){let e=[...t.matchAll(X0)];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 tn(t,e=""){let r=t.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:e}function Sp(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function Ll(t={}){let e="",r="",n="",s=!1,i=!1,o=()=>({result:t.tool==="gemini"?bp(r):r,sessionId:e,stopReason:n});return{setSessionId(a){e=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=Sp(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let d=c.content,u=typeof d?.text=="string"?d.text:"";return u&&i&&(r+=u,t.onDelta?.(u)),!0},finalize(){return s?o():null}}}var Tp,B0,q0,H0,J0,X0,Ol=E(()=>{"use strict";Tp="(?:png|jpe?g|webp|heic|pdf)",B0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Tp}\\s*`,"gi"),q0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Tp}\\s*`,"i"),H0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,J0=/^STANCE:\s+\S+\s*$/gim,X0=/\[Thought:\s*true\]\s*/gi});import{spawn as vp}from"node:child_process";import{existsSync as K0}from"node:fs";import{createInterface as V0}from"node:readline";function Y0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
1379
+ `,"utf-8"),!0}let s;try{s=JSON.parse(yp(n,"utf-8"))}catch{return console.log(hp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(hp.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),wp(s.permission)||C({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&_p(n,JSON.stringify(s,null,2)+`
1380
+ `,"utf-8"),i}var hp,wi=E(()=>{"use strict";de();hp={yellow:t=>t}});function bp(t){let e=[...t.matchAll(B0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Ep(t.slice(n).trimStart())}return Ep(G0(t.replace(q0,"")))}function G0(t){let e=H0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(J0)];if(n.length<2)return t;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function Ep(t){let e=[...t.matchAll(X0)];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 tn(t,e=""){let r=t.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:e}function Sp(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function Ol(t={}){let e="",r="",n="",s=!1,i=!1,o=()=>({result:t.tool==="gemini"?bp(r):r,sessionId:e,stopReason:n});return{setSessionId(a){e=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=Sp(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let d=c.content,u=typeof d?.text=="string"?d.text:"";return u&&i&&(r+=u,t.onDelta?.(u)),!0},finalize(){return s?o():null}}}var Tp,B0,q0,H0,J0,X0,$l=E(()=>{"use strict";Tp="(?:png|jpe?g|webp|heic|pdf)",B0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Tp}\\s*`,"gi"),q0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Tp}\\s*`,"i"),H0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,J0=/^STANCE:\s+\S+\s*$/gim,X0=/\[Thought:\s*true\]\s*/gi});import{spawn as vp}from"node:child_process";import{existsSync as K0}from"node:fs";import{createInterface as V0}from"node:readline";function Y0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
1381
1381
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
1382
1382
  ${e}
1383
1383
 
1384
1384
  ${r}`:r}function kp(t,e){let r=V0({input:t.stdout}),n=new Map,s=(o,a={})=>new Promise((l,c)=>{let d=z0++;n.set(d,{resolve:l,reject:c});let u=JSON.stringify({jsonrpc:"2.0",id:d,method:o,params:a});Ae({event:"acp_send",direction:"SEND",provider:e.provider,method:o,id:d,params:a}),t.stdin?.write(`${u}
1385
1385
  `)}),i=(o,a={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:o,params:a})}
1386
- `)};return r.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Ae({event:"acp_recv",direction:"RECV",provider:e.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),e.onEvent?.(a),typeof a.id=="number"&&n.has(a.id)){let c=n.get(a.id);if(n.delete(a.id),a.error){let d=a.error,u=typeof d?.message=="string"&&d.message.length>0?d.message:JSON.stringify(a.error);c.reject(pi(`ACP RPC error: ${u}`,d))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){M({event:"acp_unhandled_request",provider:e.provider,method:l,id:a.id,params:a.params});let c=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});Ae({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${c}
1387
- `);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new ye("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function Cl(t){let e;try{e=vp(t.binaryPath??$l.opencode.binary,$l.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:je(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=kp(e,{provider:"opencode"}),n=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(d,u=!0)=>{if(!i){if(i=!0,clearTimeout(c),e.removeListener("error",a),e.removeListener("exit",l),r.close(),!u){s(d);return}tt(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{o({status:"unavailable",reason:"spawn",error:d.message},!1)},l=(d,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let d=await r.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=tn(d);try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:t.model})}catch(f){o({status:"rejected",option:"model",value:t.model,error:f instanceof Error?f.message:String(f)});return}if(t.effort!==void 0)try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:t.effort})}catch(f){o({status:"rejected",option:"effort",value:t.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}function Ip(t,e){let r=$l[e.tool];return r?new Promise((n,s)=>{let i=e.binaryPath||r.binary;if(e.tool==="opencode")try{yi(e.cwd)}catch(y){M({event:"opencode_config_install_failed",cwd:e.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=e.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(e.tool==="gemini"){let y=ir("gemini","plan"),T=ir("gemini","yolo");a=a.filter(b=>!(T??[]).includes(b)),y&&a.push(...y)}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.
1388
- `),M({event:"acp_plan_mode_unsupported",provider:e.tool,requested_mode:"plan",effective_mode:"yolo"}));e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":o;try{lt(e.tool,a,l)}catch(y){return s(y)}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.
1389
- `),M({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!K0(e.cwd))return M({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=vp(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:je(e.env,e.cwd,e.sessionId)}),d=Date.now(),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,M({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),tt(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,M({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-d}),tt(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=e.sessionId||"",m=Ll({tool:e.tool,onDelta:e.onDelta});m.setSessionId(f);let p=kp(c,{provider:e.tool,onEvent:e.onEvent,onNotification:y=>m.processMessage(y)}),{sendRpc:h,sendNotification:g}=p,_="";c.stderr?.on("data",y=>{_+=y.toString()}),c.on("error",y=>{p.close(y),M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-d}),s(new ye(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),c.on("exit",y=>{if(p.close(new ye(`ACP process exited with code ${String(y)}`)),u)return;let T=m.finalize();T!==null?n({result:T.result,sessionId:T.sessionId,durationMs:Date.now()-d,stopReason:T.stopReason,exitCode:y}):(M({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:_.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(Y0({tool:e.tool,exitCode:y,stderr:_}))))}),(async()=>{try{if(await h("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),g("notifications/initialized"),e.sessionId)try{let b=await h("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});f=tn(b,e.sessionId),m.setSessionId(f)}catch(b){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${b instanceof Error?b.message:String(b)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1390
- `),M({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:b instanceof Error?b.message:String(b)});let I=await h("session/new",{cwd:e.cwd,mcpServers:[]});f=tn(I),m.setSessionId(f)}else{let b=await h("session/new",{cwd:e.cwd,mcpServers:[]});f=tn(b),m.setSessionId(f)}if(e.model&&e.tool==="opencode")try{await h("session/set_config_option",{sessionId:f,configId:"model",value:e.model}),Tt(`acp: set_config_option(model=${e.model}) ok`)}catch(b){let I=b instanceof Error?b.message:String(b);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${I}
1391
- `),M({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:I})}if(e.effort&&e.tool==="opencode")try{await h("session/set_config_option",{sessionId:f,configId:"effort",value:e.effort}),Tt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(b){let I=b instanceof Error?b.message:String(b);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${I}
1392
- `),M({event:"acp_config_option_failed",provider:e.tool,config_id:"effort",value:e.effort,error_message:I})}m.beginTurn(),Tt(`acp: prompt sent (${t.length} chars)`);let y=await h("session/prompt",{sessionId:f,prompt:[{type:"text",text:t}]}),T=m.completeTurn(y);Tt(`acp: result received (${T.result.length} chars, stopReason=${T.stopReason})`),c.stdin?.end()}catch(y){tt(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var $l,z0,Ml=E(()=>{"use strict";ue();Qr();_i();en();wi();ue();at();Ol();Ol();$l={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},z0=1});function _e(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Np(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=Z0){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 Q0(){let t=new Map;return(e,r)=>{eN(e,Np(t,r))}}function eN(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,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(_e(a,60));let d=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:d});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(_e(i,80)),e({kind:"other",summary:o.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 i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:_e(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=_e(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:_e(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:_e(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
1386
+ `)};return r.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Ae({event:"acp_recv",direction:"RECV",provider:e.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),e.onEvent?.(a),typeof a.id=="number"&&n.has(a.id)){let c=n.get(a.id);if(n.delete(a.id),a.error){let d=a.error,u=typeof d?.message=="string"&&d.message.length>0?d.message:JSON.stringify(a.error);c.reject(pi(`ACP RPC error: ${u}`,d))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){C({event:"acp_unhandled_request",provider:e.provider,method:l,id:a.id,params:a.params});let c=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});Ae({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${c}
1387
+ `);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new ye("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function Ml(t){let e;try{e=vp(t.binaryPath??Cl.opencode.binary,Cl.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:je(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=kp(e,{provider:"opencode"}),n=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(d,u=!0)=>{if(!i){if(i=!0,clearTimeout(c),e.removeListener("error",a),e.removeListener("exit",l),r.close(),!u){s(d);return}tt(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{o({status:"unavailable",reason:"spawn",error:d.message},!1)},l=(d,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let d=await r.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=tn(d);try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:t.model})}catch(f){o({status:"rejected",option:"model",value:t.model,error:f instanceof Error?f.message:String(f)});return}if(t.effort!==void 0)try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:t.effort})}catch(f){o({status:"rejected",option:"effort",value:t.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}function Ip(t,e){let r=Cl[e.tool];return r?new Promise((n,s)=>{let i=e.binaryPath||r.binary;if(e.tool==="opencode")try{yi(e.cwd)}catch(y){C({event:"opencode_config_install_failed",cwd:e.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=e.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(e.tool==="gemini"){let y=ir("gemini","plan"),T=ir("gemini","yolo");a=a.filter(b=>!(T??[]).includes(b)),y&&a.push(...y)}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.
1388
+ `),C({event:"acp_plan_mode_unsupported",provider:e.tool,requested_mode:"plan",effective_mode:"yolo"}));e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":o;try{lt(e.tool,a,l)}catch(y){return s(y)}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.
1389
+ `),C({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!K0(e.cwd))return C({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=vp(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:je(e.env,e.cwd,e.sessionId)}),d=Date.now(),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,C({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),tt(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,C({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-d}),tt(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=e.sessionId||"",m=Ol({tool:e.tool,onDelta:e.onDelta});m.setSessionId(f);let p=kp(c,{provider:e.tool,onEvent:e.onEvent,onNotification:y=>m.processMessage(y)}),{sendRpc:h,sendNotification:g}=p,_="";c.stderr?.on("data",y=>{_+=y.toString()}),c.on("error",y=>{p.close(y),C({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-d}),s(new ye(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),c.on("exit",y=>{if(p.close(new ye(`ACP process exited with code ${String(y)}`)),u)return;let T=m.finalize();T!==null?n({result:T.result,sessionId:T.sessionId,durationMs:Date.now()-d,stopReason:T.stopReason,exitCode:y}):(C({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:_.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(Y0({tool:e.tool,exitCode:y,stderr:_}))))}),(async()=>{try{if(await h("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),g("notifications/initialized"),e.sessionId)try{let b=await h("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});f=tn(b,e.sessionId),m.setSessionId(f)}catch(b){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${b instanceof Error?b.message:String(b)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1390
+ `),C({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:b instanceof Error?b.message:String(b)});let I=await h("session/new",{cwd:e.cwd,mcpServers:[]});f=tn(I),m.setSessionId(f)}else{let b=await h("session/new",{cwd:e.cwd,mcpServers:[]});f=tn(b),m.setSessionId(f)}if(e.model&&e.tool==="opencode")try{await h("session/set_config_option",{sessionId:f,configId:"model",value:e.model}),Tt(`acp: set_config_option(model=${e.model}) ok`)}catch(b){let I=b instanceof Error?b.message:String(b);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${I}
1391
+ `),C({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:I})}if(e.effort&&e.tool==="opencode")try{await h("session/set_config_option",{sessionId:f,configId:"effort",value:e.effort}),Tt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(b){let I=b instanceof Error?b.message:String(b);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${I}
1392
+ `),C({event:"acp_config_option_failed",provider:e.tool,config_id:"effort",value:e.effort,error_message:I})}m.beginTurn(),Tt(`acp: prompt sent (${t.length} chars)`);let y=await h("session/prompt",{sessionId:f,prompt:[{type:"text",text:t}]}),T=m.completeTurn(y);Tt(`acp: result received (${T.result.length} chars, stopReason=${T.stopReason})`),c.stdin?.end()}catch(y){tt(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var Cl,z0,jl=E(()=>{"use strict";de();Qr();_i();en();wi();de();at();$l();$l();Cl={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},z0=1});function _e(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Np(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=Z0){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 Q0(){let t=new Map;return(e,r)=>{eN(e,Np(t,r))}}function eN(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,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(_e(a,60));let d=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:d});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(_e(i,80)),e({kind:"other",summary:o.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 i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:_e(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=_e(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:_e(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:_e(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
1393
1393
  `).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let f=u.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(d=`${f.split(`
1394
1394
  `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function Ei(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?Q0():void 0,s=await cp(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?i=>n(i,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function tN(){let t=new Map;return(e,r)=>{rN(e,Np(t,r))}}function rN(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:_e(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:_e(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=_e(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:_e(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")e({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${_e(c,80)}`:"running\u2026";e({kind:"other",summary:d,id:a})}return}e({kind:"other",summary:i})}}async function rn(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&Ae({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?tN():void 0,s=await Ip(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?i=>n(i,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function nN(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,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${_e(o,120)}`}:{kind:"other",summary:`codex error: ${_e(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:_e(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:_e(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";e({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(o?{kind:"tool_use",tool:"WebSearch",summary:_e(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:_e(s)}:{kind:"text",summary:_e(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:_e(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
1395
1395
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${_e(o,60)}`:_e(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 i=s.split(`
1396
- `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${_e(o,60)}`:_e(s,80);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 xp(t,e){let r=await mp(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=>nN(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var Z0,Rr=E(()=>{"use strict";dp();pp();Ml();ue();Z0=256});function Dl(t){return new jl(t)}var jl,Pl=E(()=>{"use strict";Zm();Ut();Rr();St();jl=class extends xe{constructor(e){super({provider:new di(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Ei})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as sN,stat as Ap,unlink as iN}from"node:fs/promises";import{join as ns,basename as oN}from"node:path";function aN(t,e,r){return`${t}|${e.toISOString()}|${r}`}function ss(t,e,r){let n=aN(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Rp(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function lN(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 Ti(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 Ti(r)}).filter(r=>r.length>0).join(`
1396
+ `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${_e(o,60)}`:_e(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 xp(t,e){let r=await mp(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=>nN(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var Z0,Rr=E(()=>{"use strict";dp();pp();jl();de();Z0=256});function Pl(t){return new Dl(t)}var Dl,Fl=E(()=>{"use strict";Zm();Ut();Rr();St();Dl=class extends xe{constructor(e){super({provider:new di(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Ei})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as sN,stat as Ap,unlink as iN}from"node:fs/promises";import{join as ns,basename as oN}from"node:path";function aN(t,e,r){return`${t}|${e.toISOString()}|${r}`}function ss(t,e,r){let n=aN(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Rp(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function lN(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 Ti(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 Ti(r)}).filter(r=>r.length>0).join(`
1397
1397
  `);try{return JSON.stringify(t)}catch{return String(t)}}async function Lp(t){let e=0,r=0,n=0,s=0,i=0,o,a;for await(let l of He(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&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,i=c.reasoning_output_tokens??i;let d=lN(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var bi,Op=E(()=>{"use strict";nr();bi=class{name="codex";codexDirs;constructor(e={}){let r=[ns(Se,".codex"),ns(Se,".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:ns(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=ns(r,"sessions");try{await Ap(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 i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await sN(e)}catch{return r}for(let s of n){let i=ns(e,s),o=await Ap(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(e){let r=oN(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 Me(e,30),n=await Ne(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,d,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=J(h.trim(),80)),d=J(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=J(h.text.trim(),80)),d=J(h.text.trim(),80))}}if(!i)return null;let m=await Lp(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:Rp(u,f),firstUserMessage:c,lastUserMessage:d,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=[],i="",o,a,l,c,d,u=e,f,m=new Set;for await(let h of He(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(u=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Rp(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!i&&h.payload.cwd&&(i=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let y of _.content)if(y.type==="input_text"&&typeof y.text=="string"&&y.text){let T=y.text.trim();c||(c=J(T,80)),d=J(T,80),ss(s,m,{role:"user",timestamp:g,content:fe(T)})}continue}if(_.role==="assistant"&&_.content){for(let y of _.content)y.type==="output_text"&&typeof y.text=="string"&&y.text&&ss(s,m,{role:"assistant",timestamp:g,content:fe(y.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let y of _.content)(y.type==="input_text"||y.type==="output_text")&&typeof y.text=="string"&&y.text&&ss(s,m,{role:"system",timestamp:g,content:fe(y.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?fe(Ti(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:fe(Ti(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let y=_.summary.map(T=>Ti(T.text)).join(`
1398
- `);y.trim()&&ss(s,m,{role:"thinking",timestamp:g,content:fe(y)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&ss(s,m,{role:"thinking",timestamp:g,content:fe(_)})}}if(!i)return null;let p=await Lp(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,firstUserMessage:c,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await iN(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Me(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function Ul(t){return new Fl(t)}var Fl,Wl=E(()=>{"use strict";Op();Ut();Rr();St();Fl=class extends xe{constructor(e){super({provider:new bi(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:`${ge}
1398
+ `);y.trim()&&ss(s,m,{role:"thinking",timestamp:g,content:fe(y)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&ss(s,m,{role:"thinking",timestamp:g,content:fe(_)})}}if(!i)return null;let p=await Lp(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,firstUserMessage:c,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await iN(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Me(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function Wl(t){return new Ul(t)}var Ul,Bl=E(()=>{"use strict";Op();Ut();Rr();St();Ul=class extends xe{constructor(e){super({provider:new bi(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:`${ge}
1399
1399
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:xp})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function is(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 Si(t){let e=is(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(`
1400
1400
  `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let d=c;if(typeof d.id=="string"){let u=o.get(d.id);u?cN(u,d):(i.push(d),o.set(d.id,d))}else i.push(d)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:i}}function cN(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&$p(t.tokens)&&$p(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function $p(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Cp(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let i of r)s.push(JSON.stringify(i));return s.join(`
1401
1401
  `)+`
1402
- `}var Bl=E(()=>{"use strict"});import{createHash as dN}from"node:crypto";import{readdir as os,readFile as Mp,stat as vi,unlink as uN}from"node:fs/promises";import{join as Xe,basename as fN,dirname as mN}from"node:path";import{cwd as pN}from"node:process";function jp(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Dp(t){return t==="user"}function ql(t){return t==="gemini"||t==="assistant"}function Lr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function _N(t){return`${t.sessionId}\0${t.cwd}`}function hN(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function ki(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Pp(t){let e=0,r=0,n=0,s=0,i=0,o;for(let a of t){if(!ql(a.type)||!a.tokens)continue;let l=ki(a.tokens.input),c=ki(a.tokens.cached),d=Math.max(l-c,0),u=ki(a.tokens.output),f=ki(a.tokens.thoughts);e+=l,r+=c,n+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function gN(t){return dN("sha256").update(t).digest("hex")}function as(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=mN(r);if(n===r)break;r=n}}var Ii,Fp=E(()=>{"use strict";nr();Bl();ue();Ii=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Xe(Se,".gemini");this.geminiProjectsFile=Xe(r,"projects.json"),this.geminiTmpDir=Xe(r,"tmp");let n=e.claudeDir||Xe(Se,".claude");this.claudeProjectsDir=Xe(n,"projects");let s=[Xe(Se,".codex"),Xe(Se,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Xe(o,"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 i=_N(s),o=r.get(i);r.set(i,o?hN(o,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),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let g of o){let _=Lr(g.timestamp),y=g.type,T=fe(jp(g.content));if(Dp(y)){let I=T.trim();I&&(d||(d=J(I,80)),u=J(I,80)),i.push({role:"user",timestamp:_,content:I||T});continue}if(ql(y)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1403
- `).trim();x&&i.push({role:"thinking",timestamp:Lr(I.timestamp,_),content:fe(x)})}i.push({role:"assistant",timestamp:_,content:T,model:g.model});continue}let b=y?`[${y}] `:"";i.push({role:"system",timestamp:_,content:`${b}${T}`.trim()})}let m=Lr(n.startTime,s.createdAt),p=Lr(n.lastUpdated,s.modifiedAt),h=Pp(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:i}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Ne(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Dp(m.type)){u++;let p=jp(m.content).trim();p&&(l||(l=J(fe(p),80)),c=J(fe(p),80))}else ql(m.type)&&(u++,m.model&&(d=m.model));let f=Pp(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Lr(r.startTime,n.createdAt),modifiedAt:Lr(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,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 Mp(e,"utf-8");if(is(r)==="unknown")return M({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 Si(r)}catch{return null}}extractSessionIdFromFilename(e){let r=fN(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 os(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Xe(this.geminiTmpDir,n,"chats");if(!(await vi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await os(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Xe(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await uN(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),c=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!c)continue;let d=await Ne(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Lr(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(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;as(e,pN());for(let n of this.extraWorkspacePaths)as(e,n);for(let n of await this.collectGeminiProjectPaths())as(e,n);for(let n of await this.collectCodexCwds())as(e,n);for(let n of await this.collectClaudeCwds())as(e,n);let r=new Map;for(let n of e)r.set(gN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Mp(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 o=(await Me(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await os(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Xe(this.claudeProjectsDir,n);if(!(await vi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await os(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Xe(s,a),d=(await Me(l,1).catch(()=>[]))[0]?.cwd;d&&e.add(d)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await vi(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await os(e)}catch{return r}for(let i of s){let o=Xe(e,i),a=await vi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as yN,writeFileSync as wN,mkdirSync as EN}from"node:fs";import{join as TN,dirname as bN}from"node:path";import{randomUUID as SN}from"node:crypto";function Jl(t){return new Hl(t)}var Hl,Xl=E(()=>{"use strict";Fp();Ut();Rr();St();Bl();Hl=class extends xe{constructor(e){super({provider:new Ii(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",ge,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>rn(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(`
1402
+ `}var ql=E(()=>{"use strict"});import{createHash as dN}from"node:crypto";import{readdir as os,readFile as Mp,stat as vi,unlink as uN}from"node:fs/promises";import{join as Xe,basename as fN,dirname as mN}from"node:path";import{cwd as pN}from"node:process";function jp(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Dp(t){return t==="user"}function Hl(t){return t==="gemini"||t==="assistant"}function Lr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function _N(t){return`${t.sessionId}\0${t.cwd}`}function hN(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function ki(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Pp(t){let e=0,r=0,n=0,s=0,i=0,o;for(let a of t){if(!Hl(a.type)||!a.tokens)continue;let l=ki(a.tokens.input),c=ki(a.tokens.cached),d=Math.max(l-c,0),u=ki(a.tokens.output),f=ki(a.tokens.thoughts);e+=l,r+=c,n+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function gN(t){return dN("sha256").update(t).digest("hex")}function as(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=mN(r);if(n===r)break;r=n}}var Ii,Fp=E(()=>{"use strict";nr();ql();de();Ii=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Xe(Se,".gemini");this.geminiProjectsFile=Xe(r,"projects.json"),this.geminiTmpDir=Xe(r,"tmp");let n=e.claudeDir||Xe(Se,".claude");this.claudeProjectsDir=Xe(n,"projects");let s=[Xe(Se,".codex"),Xe(Se,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Xe(o,"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 i=_N(s),o=r.get(i);r.set(i,o?hN(o,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),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let g of o){let _=Lr(g.timestamp),y=g.type,T=fe(jp(g.content));if(Dp(y)){let I=T.trim();I&&(d||(d=J(I,80)),u=J(I,80)),i.push({role:"user",timestamp:_,content:I||T});continue}if(Hl(y)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1403
+ `).trim();x&&i.push({role:"thinking",timestamp:Lr(I.timestamp,_),content:fe(x)})}i.push({role:"assistant",timestamp:_,content:T,model:g.model});continue}let b=y?`[${y}] `:"";i.push({role:"system",timestamp:_,content:`${b}${T}`.trim()})}let m=Lr(n.startTime,s.createdAt),p=Lr(n.lastUpdated,s.modifiedAt),h=Pp(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:i}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Ne(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Dp(m.type)){u++;let p=jp(m.content).trim();p&&(l||(l=J(fe(p),80)),c=J(fe(p),80))}else Hl(m.type)&&(u++,m.model&&(d=m.model));let f=Pp(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Lr(r.startTime,n.createdAt),modifiedAt:Lr(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,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 Mp(e,"utf-8");if(is(r)==="unknown")return C({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 Si(r)}catch{return null}}extractSessionIdFromFilename(e){let r=fN(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 os(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Xe(this.geminiTmpDir,n,"chats");if(!(await vi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await os(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Xe(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await uN(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),c=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!c)continue;let d=await Ne(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Lr(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(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;as(e,pN());for(let n of this.extraWorkspacePaths)as(e,n);for(let n of await this.collectGeminiProjectPaths())as(e,n);for(let n of await this.collectCodexCwds())as(e,n);for(let n of await this.collectClaudeCwds())as(e,n);let r=new Map;for(let n of e)r.set(gN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Mp(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 o=(await Me(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await os(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Xe(this.claudeProjectsDir,n);if(!(await vi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await os(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Xe(s,a),d=(await Me(l,1).catch(()=>[]))[0]?.cwd;d&&e.add(d)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await vi(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await os(e)}catch{return r}for(let i of s){let o=Xe(e,i),a=await vi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as yN,writeFileSync as wN,mkdirSync as EN}from"node:fs";import{join as TN,dirname as bN}from"node:path";import{randomUUID as SN}from"node:crypto";function Xl(t){return new Jl(t)}var Jl,Gl=E(()=>{"use strict";Fp();Ut();Rr();St();ql();Jl=class extends xe{constructor(e){super({provider:new Ii(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",ge,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>rn(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(`
1404
1404
  `)}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:fi,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=yN(n,"utf-8"),i=is(s),o=Si(s),a=SN();o.sessionId=a,o.kind="main";let l=bN(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=TN(l,u);return EN(l,{recursive:!0}),wN(f,Cp(o,i),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Up,readFile as vN,rm as kN,stat as nn}from"node:fs/promises";import{basename as IN,join as ct}from"node:path";function NN(t){let e={};for(let r of t.split(`
1405
- `)){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 Or(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function xN(t){let e=0;for await(let r of He(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Ni,Wp=E(()=>{"use strict";nr();Ni=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||ct(Se,".copilot");this.sessionStateDir=ct(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Up(this.sessionStateDir)}catch{return e}for(let n of r){let s=ct(this.sessionStateDir,n);if((await nn(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&e.push(o)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=ct(r,"events.jsonl"),i=await nn(s).catch(()=>null),o=i?s:ct(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,h,g=n?.id||IN(r)||e;if(i)for await(let _ of He(s)){let y=Or(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(u=_.data.copilotVersion),_.data.startTime&&(h=Or(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){d=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let T=_.data.content||"",b=T.trim();b&&(m||(m=J(b,80)),p=J(b,80)),l.push({role:"user",timestamp:y,content:fe(b||T)});continue}if(_.type==="assistant.message"&&_.data){let T=(_.data.content||"").trim();if(T&&l.push({role:"assistant",timestamp:y,content:fe(T),model:d}),_.data.toolRequests)for(let b of _.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments?JSON.stringify(b.arguments,null,2):void 0,toolCallId:b.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let T=_.data.result?.content||"",b=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:fe(T),toolDetailedContent:b?fe(b):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:y,content:fe(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let T=_.data?.message||"";T.trim()&&l.push({role:"system",timestamp:y,content:fe(T)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=J(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Or(n?.created_at)??a.createdAt,modifiedAt:Or(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:o,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=ct(e,"events.jsonl"),i=await nn(s).catch(()=>null),o=i?s:ct(e,"workspace.yaml"),a=await Ne(i?s:e),l=i?await Me(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=Or(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context?.cwd&&(d=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(u||(u=_.data.newModel)),_.type==="user.message"&&_.data){let y=(_.data.content||"").trim();y&&(p||(p=J(y,80)),h=J(y,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=J(_,80))}let g=i?await xN(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??Or(n?.created_at)??a.createdAt,modifiedAt:Or(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:o}}async readWorkspaceYaml(e){let r=ct(e,"workspace.yaml");try{let n=await vN(r,"utf-8");return NN(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await kN(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Up(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=ct(this.sessionStateDir,e);if((await nn(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let i=ct(this.sessionStateDir,s);(await nn(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=ct(this.sessionStateDir,s);if(!(await nn(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function Kl(t){return new Gl(t)}var Gl,Vl=E(()=>{"use strict";Wp();Ut();Rr();ue();St();Gl=class extends xe{constructor(e){super({provider:new Ni(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ge,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>rn(r,{...n,acpTool:"copilot"})})}async seed(e,r){let n=await super.seed(e,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return Ae({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as Bp,readdirSync as AN,statSync as qp}from"node:fs";import{join as ar}from"node:path";import{createRequire as RN}from"node:module";function Hp(){return Yl===null&&(Yl=RN(import.meta.url)("node:sqlite").DatabaseSync),Yl}function LN(){let t=process.env.XDG_DATA_HOME||ar(Se,".local","share"),e=process.env.XDG_CONFIG_HOME||ar(Se,".config");return[ar(t,"opencode","opencode.db"),ar(e,"opencode","opencode.db")]}function ON(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||ar(Se,".local","share"),e=ar(t,"lmplayer"),r=ar(e,"opencode-local.db"),n=[r];try{let s=AN(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>ar(e,i)).filter(i=>i!==r).sort((i,o)=>{try{return qp(o).mtimeMs-qp(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function $N(t){return t==="lmplayer"?ON():LN()}var Yl,sn,zl=E(()=>{"use strict";nr();Yl=null;sn=class{name;startCommand;dbPaths;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=$N(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Bp(e))}openDb(e){return Bp(e)?new(Hp())(e,{open:!0,readOnly:!0}):null}async discoverSessions(){let e=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1405
+ `)){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 Or(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function xN(t){let e=0;for await(let r of He(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Ni,Wp=E(()=>{"use strict";nr();Ni=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||ct(Se,".copilot");this.sessionStateDir=ct(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Up(this.sessionStateDir)}catch{return e}for(let n of r){let s=ct(this.sessionStateDir,n);if((await nn(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&e.push(o)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=ct(r,"events.jsonl"),i=await nn(s).catch(()=>null),o=i?s:ct(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,h,g=n?.id||IN(r)||e;if(i)for await(let _ of He(s)){let y=Or(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(u=_.data.copilotVersion),_.data.startTime&&(h=Or(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){d=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let T=_.data.content||"",b=T.trim();b&&(m||(m=J(b,80)),p=J(b,80)),l.push({role:"user",timestamp:y,content:fe(b||T)});continue}if(_.type==="assistant.message"&&_.data){let T=(_.data.content||"").trim();if(T&&l.push({role:"assistant",timestamp:y,content:fe(T),model:d}),_.data.toolRequests)for(let b of _.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments?JSON.stringify(b.arguments,null,2):void 0,toolCallId:b.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let T=_.data.result?.content||"",b=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:fe(T),toolDetailedContent:b?fe(b):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:y,content:fe(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let T=_.data?.message||"";T.trim()&&l.push({role:"system",timestamp:y,content:fe(T)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=J(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Or(n?.created_at)??a.createdAt,modifiedAt:Or(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:o,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=ct(e,"events.jsonl"),i=await nn(s).catch(()=>null),o=i?s:ct(e,"workspace.yaml"),a=await Ne(i?s:e),l=i?await Me(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=Or(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context?.cwd&&(d=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(u||(u=_.data.newModel)),_.type==="user.message"&&_.data){let y=(_.data.content||"").trim();y&&(p||(p=J(y,80)),h=J(y,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=J(_,80))}let g=i?await xN(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??Or(n?.created_at)??a.createdAt,modifiedAt:Or(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:o}}async readWorkspaceYaml(e){let r=ct(e,"workspace.yaml");try{let n=await vN(r,"utf-8");return NN(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await kN(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Up(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=ct(this.sessionStateDir,e);if((await nn(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let i=ct(this.sessionStateDir,s);(await nn(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=ct(this.sessionStateDir,s);if(!(await nn(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function Vl(t){return new Kl(t)}var Kl,Yl=E(()=>{"use strict";Wp();Ut();Rr();de();St();Kl=class extends xe{constructor(e){super({provider:new Ni(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ge,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>rn(r,{...n,acpTool:"copilot"})})}async seed(e,r){let n=await super.seed(e,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return Ae({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as Bp,readdirSync as AN,statSync as qp}from"node:fs";import{join as ar}from"node:path";import{createRequire as RN}from"node:module";function Hp(){return zl===null&&(zl=RN(import.meta.url)("node:sqlite").DatabaseSync),zl}function LN(){let t=process.env.XDG_DATA_HOME||ar(Se,".local","share"),e=process.env.XDG_CONFIG_HOME||ar(Se,".config");return[ar(t,"opencode","opencode.db"),ar(e,"opencode","opencode.db")]}function ON(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||ar(Se,".local","share"),e=ar(t,"lmplayer"),r=ar(e,"opencode-local.db"),n=[r];try{let s=AN(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>ar(e,i)).filter(i=>i!==r).sort((i,o)=>{try{return qp(o).mtimeMs-qp(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function $N(t){return t==="lmplayer"?ON():LN()}var zl,sn,Zl=E(()=>{"use strict";nr();zl=null;sn=class{name;startCommand;dbPaths;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=$N(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Bp(e))}openDb(e){return Bp(e)?new(Hp())(e,{open:!0,readOnly:!0}):null}async discoverSessions(){let e=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1406
1406
  s.time_created, s.time_updated
1407
1407
  FROM session s
1408
1408
  ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",d=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
@@ -1415,12 +1415,12 @@ ${r}`:r}function kp(t,e){let r=V0({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1415
1415
  FROM session s
1416
1416
  WHERE s.id LIKE ?
1417
1417
  ORDER BY s.time_updated DESC
1418
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Ql(){return new Zl}var Zl,ec=E(()=>{"use strict";zl();Ut();Rr();St();Zl=class extends xe{constructor(){super({provider:new sn,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",ge],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>rn(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??ge),r}}});import{spawn as CN}from"node:child_process";import{mkdirSync as MN}from"node:fs";function rc(t){return new tc(t)}async function jN(t,e){let r=Date.now(),n=Jp({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});lt("lmplayer",n,e.permissionMode??"yolo");let s=await Xp(e.binary,n,{cwd:e.cwd,env:je(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function Jp(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...ir("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function Xp(t,e,r){return new Promise((n,s)=>{let i;try{i=CN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},h=g=>{let _=g.trim();if(!_)return;let y;try{y=JSON.parse(_)}catch{u.push(g),r.onText?.(g);return}if(!Ai(y))return;let T=xi(y,!1);c===void 0&&T!==void 0&&(c=T),d=xi(y,!0)??d;let b=Gp(y);b&&(u.push(b),r.onText?.(b))};i.stdout?.on("data",g=>{let _=g.toString("utf8");o+=_,l+=_;let y=l.indexOf(`
1418
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function ec(){return new Ql}var Ql,tc=E(()=>{"use strict";Zl();Ut();Rr();St();Ql=class extends xe{constructor(){super({provider:new sn,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",ge],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>rn(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??ge),r}}});import{spawn as CN}from"node:child_process";import{mkdirSync as MN}from"node:fs";function nc(t){return new rc(t)}async function jN(t,e){let r=Date.now(),n=Jp({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});lt("lmplayer",n,e.permissionMode??"yolo");let s=await Xp(e.binary,n,{cwd:e.cwd,env:je(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function Jp(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...ir("lmplayer",t.permissionMode)??[]),e.push(t.prompt),e}function Xp(t,e,r){return new Promise((n,s)=>{let i;try{i=CN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},h=g=>{let _=g.trim();if(!_)return;let y;try{y=JSON.parse(_)}catch{u.push(g),r.onText?.(g);return}if(!Ai(y))return;let T=xi(y,!1);c===void 0&&T!==void 0&&(c=T),d=xi(y,!0)??d;let b=Gp(y);b&&(u.push(b),r.onText?.(b))};i.stdout?.on("data",g=>{let _=g.toString("utf8");o+=_,l+=_;let y=l.indexOf(`
1419
1419
  `);for(;y>=0;){let T=l.slice(0,y);l=l.slice(y+1),h(T),y=l.indexOf(`
1420
- `)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{f||(f=!0,p(),l.length>0&&h(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{f||(f=!0,p(),s(g))})})}function Gp(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(Ai(r)){let n=Gp(r);if(n)return n}}}function xi(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(Ai(r)){let n=xi(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(Ai(s)){let i=xi(s,e);if(i!==void 0)return i}}}function Ai(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var tc,nc=E(()=>{"use strict";zl();Ut();St();en();at();tc=class extends xe{constructor(e){super({provider:new sn({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:jN})}seedArgsFor(e){return Jp({prompt:e?.prompt??ge,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){MN(e,{recursive:!0});let n=this.seedArgsFor(r);lt("lmplayer",n);try{let s=await Xp(this.binary,n,{cwd:e,env:sr(void 0,e),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${ge}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as Ri,readFile as DN,rm as PN}from"node:fs/promises";import{basename as Kp,join as lr}from"node:path";function Vp(t){return t.type==="user"||t.message?.role==="user"}function Yp(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function zp(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(`
1420
+ `)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{f||(f=!0,p(),l.length>0&&h(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{f||(f=!0,p(),s(g))})})}function Gp(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(Ai(r)){let n=Gp(r);if(n)return n}}}function xi(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(Ai(r)){let n=xi(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(Ai(s)){let i=xi(s,e);if(i!==void 0)return i}}}function Ai(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var rc,sc=E(()=>{"use strict";Zl();Ut();St();en();at();rc=class extends xe{constructor(e){super({provider:new sn({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:jN})}seedArgsFor(e){return Jp({prompt:e?.prompt??ge,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){MN(e,{recursive:!0});let n=this.seedArgsFor(r);lt("lmplayer",n);try{let s=await Xp(this.binary,n,{cwd:e,env:sr(void 0,e),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${ge}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as Ri,readFile as DN,rm as PN}from"node:fs/promises";import{basename as Kp,join as lr}from"node:path";function Vp(t){return t.type==="user"||t.message?.role==="user"}function Yp(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function zp(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(`
1421
1421
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
1422
- `):"":""}function Zp(t){return t.model||t.message?.model}var Li,Qp=E(()=>{"use strict";nr();Li=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||lr(Se,".qwen")}async discoverSessions(){let e=lr(this.baseDir,"projects"),r;try{r=await Ri(e)}catch{return[]}let n=[];for(let s of r){let i=lr(e,s,"chats"),o;try{o=await Ri(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=lr(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(e,r){let n=await Me(e,30);if(n.length===0)return null;let s=await Ne(e),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Vp(u)){let f=zp(u).trim();f&&(l||(l=J(f,80)),c=J(f,80)),d++}if(Yp(u)){let f=Zp(u);f&&(o=f),d++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Kp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Ne(e),s="(unknown)",i,o,a,l,c,d,u=[];for await(let f of He(e)){if(f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.model&&(i=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Vp(f)){let h=zp(f);h.trim()&&(c||(c=J(h.trim(),80)),d=J(h.trim(),80)),u.push({role:"user",timestamp:p,content:h})}else if(Yp(f)){let h=Zp(f);if(h&&(i=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&u.push({role:"thinking",timestamp:p,content:_})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:e,messages:u}}async resolveSessionPath(e){let r=lr(this.baseDir,"projects");try{let n=await Ri(r),s=[];for(let i of n){let o=lr(r,i,"chats",`${e}.jsonl`);try{return await DN(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=lr(r,i,"chats"),a;try{a=await Ri(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Kp(l,".jsonl").startsWith(e)&&s.push(lr(o,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 PN(r),!0}catch{return!1}}}});function ic(){return new sc}var sc,oc=E(()=>{"use strict";Qp();Ut();Rr();St();sc=class extends xe{constructor(){super({provider:new Li,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Ei})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as e_,readFile as FN,rm as t_,stat as r_}from"node:fs/promises";import{basename as ac,join as qt}from"node:path";async function UN(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 WN(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function n_(t){return t.type==="USER_INPUT"}function s_(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function BN(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function i_(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function o_(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 qN(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function HN(t){for await(let e of He(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=JN(s);if(i)return i}let n=XN(e.content);if(n)return n}return null}function JN(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 XN(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function a_(t){if(t.endsWith(".db"))return ac(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Oi,l_=E(()=>{"use strict";nr();Oi=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||qt(Se,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=qt(this.baseDir,"conversations"),r;try{r=await e_(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=ac(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return qt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return qt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await r_(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await UN([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,c,d=0;if(n){let u=await Me(n,80);for(let f of u){let m=o_(f.content);if(m&&(a=m),n_(f)){let p=i_(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),d++}else s_(f)&&d++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=a_(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of He(i)){let u=WN(d.created_at,s.modifiedAt),f=o_(d.content);if(f&&(a=f),n_(d)){let m=i_(d.content),p=m.trim();p&&(l||(l=J(p,80)),c=J(p,80)),o.push({role:"user",timestamp:u,content:m});continue}if(Array.isArray(d.tool_calls))for(let m of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:qN(m.args),toolName:m.name||"tool"});s_(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):BN(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await r_(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let i of await e_(n)){if(!i.endsWith(".db"))continue;ac(i,".db").startsWith(e)&&s.push(qt(n,i))}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=a_(r);return n?(await t_(this.conversationPath(n),{force:!0}),await t_(qt(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 HN(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await FN(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}}});import{spawn as GN}from"node:child_process";function cc(t){return new lc(t)}async function KN(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",YN(e.timeoutMs)];e.model&&n.push("--model",e.model),lt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await VN(e.binary,n,{cwd:e.cwd,env:je(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function VN(t,e,r){return new Promise((n,s)=>{let i;try{i=GN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function YN(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var lc,dc=E(()=>{"use strict";l_();Ut();St();at();en();lc=class extends xe{constructor(e){super({provider:new Oi(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",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:KN})}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 zN}from"node:crypto";import{existsSync as ZN,mkdirSync as QN,readFileSync as ex,renameSync as tx,writeFileSync as rx}from"node:fs";import{dirname as m_,join as c_,resolve as uc}from"node:path";function nx(t){return zN("sha256").update(t).digest("hex").slice(0,8)}function sx(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function ix(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 p_(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function $i(t){return Math.max(1,Math.ceil(t.length/4))}function an(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return uc(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?c_(m_(uc(r)),".lmctl-claude-mock","sessions.json"):c_(uc(t),".lmctl-claude-mock","sessions.json")}function d_(){return{schemaVersion:1,sessions:{}}}function ls(t){if(!ZN(t))return d_();try{let e=JSON.parse(ex(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=typeof e.script=="object"&&e.script!==null?e.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return d_()}}function __(t,e){QN(m_(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;rx(r,`${JSON.stringify(e,null,2)}
1423
- `,"utf8"),tx(r,t)}function ox(t){return{...t,timestamp:t.timestamp.toISOString()}}function ax(t){return{...t,timestamp:new Date(t.timestamp)}}function lx(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(ox)}}function h_(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(ax)}}function Ci(t,e=process.cwd()){let r=on.get(t);if(r!==void 0)return r;let s=ls(an(e)).sessions[t];if(s===void 0)return;let i=h_(s);return on.set(i.sessionId,i),i}function u_(t){on.set(t.sessionId,t);let e=an(t.cwd),r=ls(e);r.sessions[t.sessionId]=lx({...t,filePath:e}),__(e,r)}function cx(){let t=ls(an()),e=Object.values(t.sessions).map(h_);for(let r of e)on.set(r.sessionId,r);return e}function dx(t,e){let r=e.script;if(r===void 0)return;let n=r[t],s=r[p_(t)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function f_(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 pc(){return new mc}var on,fc,mc,_c=E(()=>{"use strict";on=new Map;fc=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let r of cx())e.set(r.sessionId,r);for(let r of on.values())e.set(r.sessionId,r);return[...e.values()].map(f_)}async loadSession(e){let r=Ci(e);return r===void 0?null:{...f_(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Ci(e)?.filePath??null}async deleteSession(e){let r=on.delete(e),n=an(),s=ls(n),i=s.sessions[e]!==void 0;return delete s.sessions[e],i&&__(n,s),r||i}},mc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new fc;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=sx(ix(e,r)),s=`mock-${n}-${nx(`${e}:${n}`)}`,i=new Date,o=an(e),a=Ci(s,e),l=r?.prompt??"ClaudeMock seed",c=$i(l),d={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=$i("ACK: ClaudeMock seeded"),u_(d),{success:!0,sessionId:s}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=Ci(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=ls(an(r.cwd)),a=dx(e,o)??`ClaudeMock ack: ${p_(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=$i(e),s.totalOutputTokens+=$i(a),u_(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function vt(t){let e=[Dl({claudeDir:t?.claudeDir}),Ul({codexDir:t?.codexDir,codeDir:t?.codeDir}),Jl({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Kl({copilotDir:t?.copilotDir}),Ql(),rc({lmplayerDbPath:t?.lmplayerDbPath}),ic(),cc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(pc()),e}var hc=E(()=>{"use strict";Pl();Wl();Xl();Vl();ec();nc();oc();dc();_c();Pl();Wl();Xl();Vl();ec();nc();oc();dc();_c()});var Ec={};Ee(Ec,{ProviderRegistry:()=>es,TransportConnectionError:()=>ye,TransportError:()=>et,TransportJsonError:()=>mi,TransportProcessError:()=>Wt,TransportRpcError:()=>Bt,_resetDefaultRegistryForTests:()=>ux,chat:()=>kt,countTokens:()=>wc,createAdapterRegistry:()=>bt,createAllAdapters:()=>vt,listSessions:()=>yc,seed:()=>gc});function ji(){return Mi===null&&(Mi=bt(vt())),Mi}function ux(){Mi=null}function y_(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function kt(t){let e=t.registry??ji(),r=y_(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 gc(t){let e=t.registry??ji(),r=y_(e,t.provider),n=await g_(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await g_(e,t.provider,t.cwd),a=fx(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function g_(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function fx(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 yc(t={}){return(t.registry??ji()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function wc(t){let r=await(t.registry??ji()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var Mi,It=E(()=>{"use strict";_l();hc();_l();hc();Qr();Mi=null});function mx(){return Tc===null&&(Tc=bt(vt())),Tc}async function Di(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,i;try{return await _x(t)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)ln.delete(r),e.setMemberState(r,"idle");else{let o=px(i,r);e.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function px(t,e){if(!(t instanceof ve))return ln.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=(ln.get(e)??0)+1;return r>=3?(ln.delete(e),"consecutive_timeouts"):(ln.set(e,r),null)}return ln.delete(e),null}async function _x(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=mx(),s;try{let d=await n.resolveSession(t.sessionid);if(!d)return Promise.reject(new ve("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,bc(t.sessionid,t.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new ve("other",null,`library: session resolution failed: ${w_(d)}`,bc(t.sessionid,t.sessiondir,"unresolved")))}let i=bc(t.sessionid,t.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await kt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(d.status==="stalled")throw new ve("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new ve("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):hx(d,i)}finally{a!==null&&clearTimeout(a)}}function bc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function w_(t){return t instanceof Error?t.message:String(t)}function hx(t,e){if(t instanceof ve)return t;if(t instanceof ye){let r=t.cause;return r?.code==="ENOENT_CWD"?new ve("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new ve("enoent",null,t.message,e):new ve("other",null,t.message,e)}return t instanceof Wt?new ve("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Bt?new ve("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof et?new ve("other",null,t.message,e):new ve("other",null,w_(t),e)}var ve,Tc,ln,Pi=E(()=>{"use strict";It();ve=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"}},Tc=null;ln=new Map});function E_(){return Sc===null&&(Sc=bt(vt())),Sc}function yx(t,e){if(!gx.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ie("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 Fi(t){let e=yx(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await wx({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function wx(t){let e=t.member.provider,r=t.member.sessiondir,n=vc("seed",r,e);try{let s=await gc({provider:e,cwd:r,registry:E_()});if(!s.success)throw Tx(s.error,n);if(!s.sessionId)throw new Ie("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ie?s:kc(s,n)}}async function T_(t){return Ex(t)}async function Ex(t){let e=E_(),r=vc("tokens",t.sessionid,"unresolved"),n;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Ie("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof Ie?i:kc(i,r)}let s=vc("tokens",t.sessionid,n);try{let i=await wc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Ie?i:kc(i,s)}}function vc(t,e,r){return["<library>",t,e,"--provider",r]}function Tx(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ie("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ie("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 Ie("nonzero_exit",Number(n[1]),r,e)}return new Ie("other",null,r,e)}function kc(t,e){return t instanceof Ie?t:t instanceof ye?t.cause?.code==="ENOENT"?new Ie("enoent",null,t.message,e):new Ie("other",null,t.message,e):t instanceof Wt?new Ie("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Bt?new Ie("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof et?new Ie("other",null,t.message,e):new Ie("other",null,t instanceof Error?t.message:String(t),e)}var Ie,Sc,gx,Ic=E(()=>{"use strict";It();Ie=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"}},Sc=null;gx=/^provider[123]$/});function Ui(t){return Buffer.from(t,"utf8").toString("base64url")}function ds(t){return Buffer.from(t,"base64url").toString("utf8")}async function b_(t,e=r=>T_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of bx(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){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:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function S_(t,e,r){let n=v_(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new cs(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Di({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:k_(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 Nc(t,e,r){let n=v_(t,e,r);if(n===null)throw new Error("session member not found");let s=await Fi({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:k_(t,e,r)}}function bx(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function v_(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 k_(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var cs,Wi=E(()=>{"use strict";Pi();Ic();cs=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function xc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??vx(e),s=r-n,i=e.query(`
1422
+ `):"":""}function Zp(t){return t.model||t.message?.model}var Li,Qp=E(()=>{"use strict";nr();Li=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||lr(Se,".qwen")}async discoverSessions(){let e=lr(this.baseDir,"projects"),r;try{r=await Ri(e)}catch{return[]}let n=[];for(let s of r){let i=lr(e,s,"chats"),o;try{o=await Ri(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=lr(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(e,r){let n=await Me(e,30);if(n.length===0)return null;let s=await Ne(e),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Vp(u)){let f=zp(u).trim();f&&(l||(l=J(f,80)),c=J(f,80)),d++}if(Yp(u)){let f=Zp(u);f&&(o=f),d++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Kp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Ne(e),s="(unknown)",i,o,a,l,c,d,u=[];for await(let f of He(e)){if(f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.model&&(i=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Vp(f)){let h=zp(f);h.trim()&&(c||(c=J(h.trim(),80)),d=J(h.trim(),80)),u.push({role:"user",timestamp:p,content:h})}else if(Yp(f)){let h=Zp(f);if(h&&(i=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&u.push({role:"thinking",timestamp:p,content:_})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:e,messages:u}}async resolveSessionPath(e){let r=lr(this.baseDir,"projects");try{let n=await Ri(r),s=[];for(let i of n){let o=lr(r,i,"chats",`${e}.jsonl`);try{return await DN(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=lr(r,i,"chats"),a;try{a=await Ri(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Kp(l,".jsonl").startsWith(e)&&s.push(lr(o,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 PN(r),!0}catch{return!1}}}});function oc(){return new ic}var ic,ac=E(()=>{"use strict";Qp();Ut();Rr();St();ic=class extends xe{constructor(){super({provider:new Li,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Ei})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as e_,readFile as FN,rm as t_,stat as r_}from"node:fs/promises";import{basename as lc,join as qt}from"node:path";async function UN(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 WN(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function n_(t){return t.type==="USER_INPUT"}function s_(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function BN(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function i_(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function o_(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 qN(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function HN(t){for await(let e of He(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=JN(s);if(i)return i}let n=XN(e.content);if(n)return n}return null}function JN(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 XN(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function a_(t){if(t.endsWith(".db"))return lc(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var Oi,l_=E(()=>{"use strict";nr();Oi=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||qt(Se,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=qt(this.baseDir,"conversations"),r;try{r=await e_(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=lc(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return qt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return qt(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await r_(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await UN([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,c,d=0;if(n){let u=await Me(n,80);for(let f of u){let m=o_(f.content);if(m&&(a=m),n_(f)){let p=i_(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),d++}else s_(f)&&d++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=a_(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of He(i)){let u=WN(d.created_at,s.modifiedAt),f=o_(d.content);if(f&&(a=f),n_(d)){let m=i_(d.content),p=m.trim();p&&(l||(l=J(p,80)),c=J(p,80)),o.push({role:"user",timestamp:u,content:m});continue}if(Array.isArray(d.tool_calls))for(let m of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:qN(m.args),toolName:m.name||"tool"});s_(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):BN(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await r_(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let i of await e_(n)){if(!i.endsWith(".db"))continue;lc(i,".db").startsWith(e)&&s.push(qt(n,i))}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=a_(r);return n?(await t_(this.conversationPath(n),{force:!0}),await t_(qt(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 HN(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await FN(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}}});import{spawn as GN}from"node:child_process";function dc(t){return new cc(t)}async function KN(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",YN(e.timeoutMs)];e.model&&n.push("--model",e.model),lt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await VN(e.binary,n,{cwd:e.cwd,env:je(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function VN(t,e,r){return new Promise((n,s)=>{let i;try{i=GN(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function YN(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var cc,uc=E(()=>{"use strict";l_();Ut();St();at();en();cc=class extends xe{constructor(e){super({provider:new Oi(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",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:KN})}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 zN}from"node:crypto";import{existsSync as ZN,mkdirSync as QN,readFileSync as ex,renameSync as tx,writeFileSync as rx}from"node:fs";import{dirname as m_,join as c_,resolve as fc}from"node:path";function nx(t){return zN("sha256").update(t).digest("hex").slice(0,8)}function sx(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function ix(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 p_(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function $i(t){return Math.max(1,Math.ceil(t.length/4))}function an(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return fc(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?c_(m_(fc(r)),".lmctl-claude-mock","sessions.json"):c_(fc(t),".lmctl-claude-mock","sessions.json")}function d_(){return{schemaVersion:1,sessions:{}}}function ls(t){if(!ZN(t))return d_();try{let e=JSON.parse(ex(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=typeof e.script=="object"&&e.script!==null?e.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return d_()}}function __(t,e){QN(m_(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;rx(r,`${JSON.stringify(e,null,2)}
1423
+ `,"utf8"),tx(r,t)}function ox(t){return{...t,timestamp:t.timestamp.toISOString()}}function ax(t){return{...t,timestamp:new Date(t.timestamp)}}function lx(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(ox)}}function h_(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(ax)}}function Ci(t,e=process.cwd()){let r=on.get(t);if(r!==void 0)return r;let s=ls(an(e)).sessions[t];if(s===void 0)return;let i=h_(s);return on.set(i.sessionId,i),i}function u_(t){on.set(t.sessionId,t);let e=an(t.cwd),r=ls(e);r.sessions[t.sessionId]=lx({...t,filePath:e}),__(e,r)}function cx(){let t=ls(an()),e=Object.values(t.sessions).map(h_);for(let r of e)on.set(r.sessionId,r);return e}function dx(t,e){let r=e.script;if(r===void 0)return;let n=r[t],s=r[p_(t)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function f_(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 _c(){return new pc}var on,mc,pc,hc=E(()=>{"use strict";on=new Map;mc=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let r of cx())e.set(r.sessionId,r);for(let r of on.values())e.set(r.sessionId,r);return[...e.values()].map(f_)}async loadSession(e){let r=Ci(e);return r===void 0?null:{...f_(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Ci(e)?.filePath??null}async deleteSession(e){let r=on.delete(e),n=an(),s=ls(n),i=s.sessions[e]!==void 0;return delete s.sessions[e],i&&__(n,s),r||i}},pc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new mc;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=sx(ix(e,r)),s=`mock-${n}-${nx(`${e}:${n}`)}`,i=new Date,o=an(e),a=Ci(s,e),l=r?.prompt??"ClaudeMock seed",c=$i(l),d={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=$i("ACK: ClaudeMock seeded"),u_(d),{success:!0,sessionId:s}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=Ci(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=ls(an(r.cwd)),a=dx(e,o)??`ClaudeMock ack: ${p_(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=$i(e),s.totalOutputTokens+=$i(a),u_(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function vt(t){let e=[Pl({claudeDir:t?.claudeDir}),Wl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Xl({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Vl({copilotDir:t?.copilotDir}),ec(),nc({lmplayerDbPath:t?.lmplayerDbPath}),oc(),dc({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(_c()),e}var gc=E(()=>{"use strict";Fl();Bl();Gl();Yl();tc();sc();ac();uc();hc();Fl();Bl();Gl();Yl();tc();sc();ac();uc();hc()});var Tc={};Ee(Tc,{ProviderRegistry:()=>es,TransportConnectionError:()=>ye,TransportError:()=>et,TransportJsonError:()=>mi,TransportProcessError:()=>Wt,TransportRpcError:()=>Bt,_resetDefaultRegistryForTests:()=>ux,chat:()=>kt,countTokens:()=>Ec,createAdapterRegistry:()=>bt,createAllAdapters:()=>vt,listSessions:()=>wc,seed:()=>yc});function ji(){return Mi===null&&(Mi=bt(vt())),Mi}function ux(){Mi=null}function y_(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function kt(t){let e=t.registry??ji(),r=y_(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 yc(t){let e=t.registry??ji(),r=y_(e,t.provider),n=await g_(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await g_(e,t.provider,t.cwd),a=fx(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function g_(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function fx(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 wc(t={}){return(t.registry??ji()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Ec(t){let r=await(t.registry??ji()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var Mi,It=E(()=>{"use strict";hl();gc();hl();gc();Qr();Mi=null});function mx(){return bc===null&&(bc=bt(vt())),bc}async function Di(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,i;try{return await _x(t)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)ln.delete(r),e.setMemberState(r,"idle");else{let o=px(i,r);e.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function px(t,e){if(!(t instanceof ve))return ln.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=(ln.get(e)??0)+1;return r>=3?(ln.delete(e),"consecutive_timeouts"):(ln.set(e,r),null)}return ln.delete(e),null}async function _x(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=mx(),s;try{let d=await n.resolveSession(t.sessionid);if(!d)return Promise.reject(new ve("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,Sc(t.sessionid,t.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new ve("other",null,`library: session resolution failed: ${w_(d)}`,Sc(t.sessionid,t.sessiondir,"unresolved")))}let i=Sc(t.sessionid,t.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await kt({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(d.status==="stalled")throw new ve("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new ve("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):hx(d,i)}finally{a!==null&&clearTimeout(a)}}function Sc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function w_(t){return t instanceof Error?t.message:String(t)}function hx(t,e){if(t instanceof ve)return t;if(t instanceof ye){let r=t.cause;return r?.code==="ENOENT_CWD"?new ve("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new ve("enoent",null,t.message,e):new ve("other",null,t.message,e)}return t instanceof Wt?new ve("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Bt?new ve("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof et?new ve("other",null,t.message,e):new ve("other",null,w_(t),e)}var ve,bc,ln,Pi=E(()=>{"use strict";It();ve=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"}},bc=null;ln=new Map});function E_(){return vc===null&&(vc=bt(vt())),vc}function yx(t,e){if(!gx.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new Ie("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 Fi(t){let e=yx(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await wx({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function wx(t){let e=t.member.provider,r=t.member.sessiondir,n=kc("seed",r,e);try{let s=await yc({provider:e,cwd:r,registry:E_()});if(!s.success)throw Tx(s.error,n);if(!s.sessionId)throw new Ie("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ie?s:Ic(s,n)}}async function T_(t){return Ex(t)}async function Ex(t){let e=E_(),r=kc("tokens",t.sessionid,"unresolved"),n;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Ie("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof Ie?i:Ic(i,r)}let s=kc("tokens",t.sessionid,n);try{let i=await Ec({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Ie?i:Ic(i,s)}}function kc(t,e,r){return["<library>",t,e,"--provider",r]}function Tx(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new Ie("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new Ie("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 Ie("nonzero_exit",Number(n[1]),r,e)}return new Ie("other",null,r,e)}function Ic(t,e){return t instanceof Ie?t:t instanceof ye?t.cause?.code==="ENOENT"?new Ie("enoent",null,t.message,e):new Ie("other",null,t.message,e):t instanceof Wt?new Ie("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof Bt?new Ie("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof et?new Ie("other",null,t.message,e):new Ie("other",null,t instanceof Error?t.message:String(t),e)}var Ie,vc,gx,Nc=E(()=>{"use strict";It();Ie=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"}},vc=null;gx=/^provider[123]$/});function Ui(t){return Buffer.from(t,"utf8").toString("base64url")}function ds(t){return Buffer.from(t,"base64url").toString("utf8")}async function b_(t,e=r=>T_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of bx(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){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:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function S_(t,e,r){let n=v_(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new cs(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Di({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:k_(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 xc(t,e,r){let n=v_(t,e,r);if(n===null)throw new Error("session member not found");let s=await Fi({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:k_(t,e,r)}}function bx(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function v_(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 k_(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var cs,Wi=E(()=>{"use strict";Pi();Nc();cs=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function Ac(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??vx(e),s=r-n,i=e.query(`
1424
1424
  SELECT
1425
1425
  isess.id AS interactive_session_id,
1426
1426
  isess.run_id,
@@ -1446,16 +1446,16 @@ ${r}`:r}function kp(t,e){let r=V0({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1446
1446
  JOIN step s ON s.id = isess.step_id
1447
1447
  WHERE isess.status = 'waiting_agent'
1448
1448
  AND r.terminal_state IS NULL
1449
- `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=Nx(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=kx(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:qe(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,Ix(e,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return o}function vx(t){return I_(t.getConfig(Bi),Sx)*1e3}function Ac(t,e){return I_(t.getConfig(qi),e)}function I_(t,e){if(t===null||t.trim().length===0)return e;let r=Number(t);return Number.isFinite(r)&&r>0?Math.floor(r):e}function kx(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function Ix(t,e,r,n){return t.query(`SELECT * FROM attention
1449
+ `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=Nx(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=kx(e,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:qe(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,Ix(e,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};e.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,t.enableKillHook===!0&&t.killHook!==void 0&&await t.killHook(p)}return o}function vx(t){return I_(t.getConfig(Bi),Sx)*1e3}function Rc(t,e){return I_(t.getConfig(qi),e)}function I_(t,e){if(t===null||t.trim().length===0)return e;let r=Number(t);return Number.isFinite(r)&&r>0?Math.floor(r):e}function kx(t,e,r){return t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,r)[0]??null}function Ix(t,e,r,n){return t.query(`SELECT * FROM attention
1450
1450
  WHERE kind = 'session_hung'
1451
1451
  AND run_id = ?
1452
- AND acknowledged_at IS NULL`,e).some(i=>{let o=N_(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function Nx(t,e,r){let n=N_(t);return n===null?null:xx(n,e,r)??Ax(n,e,r)}function xx(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(Rx),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=$r(s.members)?s.members:null,o=i!==null&&$r(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function Ax(t,e,r){if(!$r(t.states))return null;let n=t.states[e]??t.states[r];if(!$r(n))return null;let s=n;if(!$r(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function Rx(t){return $r(t)}function N_(t){if(t===null)return null;try{let e=JSON.parse(t);return $r(e)?e:null}catch{return null}}function $r(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Bi,qi,Sx,Rc=E(()=>{"use strict";Qe();Bi="monitor.session_hung.elapsed_threshold_seconds",qi="monitor.session_hung.check_interval_ms",Sx=600});function Ji(t){let e=t.query(`
1452
+ AND acknowledged_at IS NULL`,e).some(i=>{let o=N_(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function Nx(t,e,r){let n=N_(t);return n===null?null:xx(n,e,r)??Ax(n,e,r)}function xx(t,e,r){if(!Array.isArray(t.steps))return null;let n=t.steps.filter(Rx),s=n.find(a=>a.id===e)??n.find(a=>a.name===e)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=$r(s.members)?s.members:null,o=i!==null&&$r(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function Ax(t,e,r){if(!$r(t.states))return null;let n=t.states[e]??t.states[r];if(!$r(n))return null;let s=n;if(!$r(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function Rx(t){return $r(t)}function N_(t){if(t===null)return null;try{let e=JSON.parse(t);return $r(e)?e:null}catch{return null}}function $r(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Bi,qi,Sx,Lc=E(()=>{"use strict";Qe();Bi="monitor.session_hung.elapsed_threshold_seconds",qi="monitor.session_hung.check_interval_ms",Sx=600});function Ji(t){let e=t.query(`
1453
1453
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1454
- `),r={queued:Hi(e,"queued"),running:Hi(e,"running"),done:Hi(e,"done"),failed:Hi(e,"failed"),total:Oc(e)},n=t.query(`
1454
+ `),r={queued:Hi(e,"queued"),running:Hi(e,"running"),done:Hi(e,"done"),failed:Hi(e,"failed"),total:$c(e)},n=t.query(`
1455
1455
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
1456
1456
  `),s=t.query(`
1457
1457
  SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
1458
- `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:Oc(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:Oc(s)},projects:Lc(t,"project"),teams:Lc(t,"team"),workflows:Lc(t,"workflow")}}function Xi(t){return t.listProjects()}function R_(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function Gi(t){return t.query(`
1458
+ `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:$c(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:$c(s)},projects:Oc(t,"project"),teams:Oc(t,"team"),workflows:Oc(t,"workflow")}}function Xi(t){return t.listProjects()}function R_(t){return t.listTeams().map(e=>({...e,members:t.listTeamMembers(e.id)}))}function Gi(t){return t.query(`
1459
1459
  SELECT w.*
1460
1460
  FROM workflow w
1461
1461
  JOIN (
@@ -1464,7 +1464,7 @@ ${r}`:r}function kp(t,e){let r=V0({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1464
1464
  GROUP BY name
1465
1465
  ) latest ON latest.name = w.name AND latest.version = w.version
1466
1466
  ORDER BY w.name ASC
1467
- `)}function L_(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 O_(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 $_(t,e){return t.getSubmittedPr(e)}function Ki(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function cn(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function Cr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:Ki(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:Lx(t,r.id)}}function Lx(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:C_(t,r.id)}))}function $c(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:C_(t,n.id)}}function C_(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Mr(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 M_(t,e,r){let n=$c(t,e,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function j_(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 D_(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 dr(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 Vi(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(`${P_}
1467
+ `)}function L_(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 O_(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 $_(t,e){return t.getSubmittedPr(e)}function Ki(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function cn(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function Cr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:Ki(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:Lx(t,r.id)}}function Lx(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:C_(t,r.id)}))}function Cc(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:C_(t,n.id)}}function C_(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Mr(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 M_(t,e,r){let n=Cc(t,e,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function j_(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 D_(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 dr(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 Vi(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(`${P_}
1468
1468
  WHERE ${n}
1469
1469
  ORDER BY a.created_at DESC`,...r).map(F_)}function Nt(t,e){let n=t.query(`${P_}
1470
1470
  WHERE a.id = ?`,e)[0];return n===void 0?null:F_(n)}function F_(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 i=s;if(Array.isArray(i.node_path)&&i.node_path.every(o=>typeof o=="string")&&(n.node_path=i.node_path),i.expected_response!==null&&typeof i.expected_response=="object"){let o=i.expected_response;if(typeof o.kind=="string"){let a=Array.isArray(o.choices)&&o.choices.every(l=>typeof l=="string")?o.choices:null;n.expected_response={kind:o.kind,choices:a}}}if(Array.isArray(i.transcript_tail)&&i.transcript_tail.every(o=>typeof o=="string")&&(n.transcript_tail=i.transcript_tail),typeof i.paused_at=="string"&&(n.paused_at=i.paused_at),i.created_run_inputs!==null&&typeof i.created_run_inputs=="object"&&!Array.isArray(i.created_run_inputs)&&(n.created_run_inputs=i.created_run_inputs),typeof i.workflow_version_id=="number"?n.workflow_version_id=i.workflow_version_id:i.workflow_version_id===null&&(n.workflow_version_id=null),i.step!==null&&typeof i.step=="object"&&!Array.isArray(i.step)){let o=i.step;typeof o.id=="string"&&o.id.length>0&&(n.workflow_step={id:o.id,name:typeof o.name=="string"?o.name:null,type:typeof o.type=="string"?o.type:null})}return typeof i.tier=="string"&&(n.escalation_tier=i.tier),typeof i.token=="string"&&(n.escalation_token=i.token),typeof i.reason=="string"&&(n.escalation_reason=i.reason),Array.isArray(i.declared_outcomes)&&i.declared_outcomes.every(o=>typeof o=="string")&&(n.declared_outcomes=i.declared_outcomes),typeof i.agent_output=="string"&&(n.agent_output=i.agent_output),n}function U_(t){return t.query(`
@@ -1473,7 +1473,7 @@ ${r}`:r}function kp(t,e){let r=V0({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1473
1473
  JOIN workflow w ON w.id = r.workflow_id
1474
1474
  GROUP BY w.name, r.terminal_state
1475
1475
  ORDER BY w.name ASC, r.terminal_state ASC
1476
- `)}function Lc(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function Hi(t,e){return t.find(r=>r.status===e)?.count??0}function Oc(t){return t.reduce((e,r)=>e+r.count,0)}function Cc(t,e,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[e];n!==null&&s.push(n);let i=t.query(`SELECT s.state_name, s.outcome
1476
+ `)}function Oc(t,e){return t.query(`SELECT COUNT(*) AS count FROM ${e}`)[0]?.count??0}function Hi(t,e){return t.find(r=>r.status===e)?.count??0}function $c(t){return t.reduce((e,r)=>e+r.count,0)}function Mc(t,e,r){let n=r!==void 0?new Date(Date.now()-Math.trunc(r)*864e5).toISOString():null,s=[e];n!==null&&s.push(n);let i=t.query(`SELECT s.state_name, s.outcome
1477
1477
  FROM step s
1478
1478
  JOIN run r ON r.id = s.run_id
1479
1479
  JOIN job j ON j.id = r.job_id
@@ -1497,7 +1497,7 @@ ${r}`:r}function kp(t,e){let r=V0({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1497
1497
  WHERE j.project_id = ?
1498
1498
  ${n!==null?"AND r.started_at >= ?":""}
1499
1499
  GROUP BY s.run_id, s.state_name
1500
- HAVING COUNT(*) > 1`,...s),_=new Map;for(let T of g){let b=_.get(T.state_name)??{runs:0,total_attempts:0};b.runs++,b.total_attempts+=T.attempt_count,_.set(T.state_name,b)}let y=[..._.entries()].map(([T,b])=>({state_name:T,retried_runs:b.runs,avg_retries:b.runs>0?Number((b.total_attempts/b.runs).toFixed(2)):0}));return{request_changes_rate:d,step_duration_histogram:h,retry_counts:y}}function Mc(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1500
+ HAVING COUNT(*) > 1`,...s),_=new Map;for(let T of g){let b=_.get(T.state_name)??{runs:0,total_attempts:0};b.runs++,b.total_attempts+=T.attempt_count,_.set(T.state_name,b)}let y=[..._.entries()].map(([T,b])=>({state_name:T,retried_runs:b.runs,avg_retries:b.runs>0?Number((b.total_attempts/b.runs).toFixed(2)):0}));return{request_changes_rate:d,step_duration_histogram:h,retry_counts:y}}function jc(t,e={}){let r=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,n=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1501
1501
  FROM session_event se
1502
1502
  JOIN run r ON r.id = se.run_id
1503
1503
  JOIN job j ON j.id = r.job_id
@@ -1633,7 +1633,7 @@ ${r}`:r}function kp(t,e){let r=V0({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1633
1633
  `),1;if(!d.ok){let f=await d.text();return e.stderr.write(`error: HTTP ${d.status}: ${f}
1634
1634
  `),d.status===400?2:1}let u=await d.json();return r?e.stdout.write(`${JSON.stringify(u,null,2)}
1635
1635
  `):e.stdout.write(`ok: attention ${i} acknowledged; step ${u.step_id} resumed (session_status=${String(u.session_status)})
1636
- `),0}function B_(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function dA(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===Bi||t===qi){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function uA(t,e){let r=Jx(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:fA(t)}),Xx(t)),e!==void 0&&s.append("project",e),s}function fA(t){switch(Gx(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 mA(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 pA(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return us(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 V_(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 to(t,e,r){return t.length>0?ne(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function us(t,e,r,n,s,i=!1){let o;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return ne(c);let d=t[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${e}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${e}: ${d}`;o=d}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function q_(t,e,r,n,s){let i=!1;for(let o of t){if(o!==e)return ne(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function _A(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 hA(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return _A([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<n.length;u+=1){let f=n[u],m=n[++u];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return ne(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=jc(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(d)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function gA(t,e){let[r,...n]=t;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return ne(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept: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"?Y_(n,e):r==="claim"?z_(n,e):r==="claim-next"?Z_(n,e):r==="close"?Q_(n,e):r==="reopen"?eh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Y_(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"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=jc(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ne(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(i)}}function z_(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 i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=se(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return ne(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Z_(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 i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function Q_(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 i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=se(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(i)}}function eh(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 i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(i)}}function yA(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 i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return ne(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function wA(t,e){let r,n,s,i;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 d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;n=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return ne(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(o),runAfterSubmit:!0}}function jc(t){try{return JSON.parse(t)}catch{return t}}function EA(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 TA(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 bA(t,e){let[r,n,...s]=t;return r==="workflow"?SA([n,...s].filter(i=>i!==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 SA(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 i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:e}}if(r==="add"){let s=vA(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 vA(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 i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=jc(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(o)}return{project:e,body:s}}function kA(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<t.length;o+=1){let a=t[o];if(a==="--raw"){s=!0;continue}let l=t[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=se(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return ne(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function IA(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 NA(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 xA(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 AA(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 RA(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=Ui(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 LA(t,e){let[r,n,s,i]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=se(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=se(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return ne(c);let d=t[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept: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 o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=se(n,"run_id");if(typeof o=="string")return o;let a=se(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=se(n,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<t.length;c+=1){let d=t[c];if(d!=="--kind")return ne(d);let u=t[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept: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 o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/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 th(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 OA(t,e){let r=V_(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1636
+ `),0}function B_(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function dA(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===Bi||t===qi){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function uA(t,e){let r=Jx(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:fA(t)}),Xx(t)),e!==void 0&&s.append("project",e),s}function fA(t){switch(Gx(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 mA(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 pA(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return us(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 V_(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 to(t,e,r){return t.length>0?ne(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function us(t,e,r,n,s,i=!1){let o;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return ne(c);let d=t[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${e}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${e}: ${d}`;o=d}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function q_(t,e,r,n,s){let i=!1;for(let o of t){if(o!==e)return ne(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function _A(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 hA(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return _A([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<n.length;u+=1){let f=n[u],m=n[++u];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return ne(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=Dc(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(d)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:e}}return"usage: lmctl api job <id|enqueue|run>"}function gA(t,e){let[r,...n]=t;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return ne(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept: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"?Y_(n,e):r==="claim"?z_(n,e):r==="claim-next"?Z_(n,e):r==="close"?Q_(n,e):r==="reopen"?eh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Y_(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"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=Dc(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ne(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(i)}}function z_(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 i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=se(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return ne(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(i)}}function Z_(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 i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:e,body:JSON.stringify(s)}}function Q_(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 i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=se(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(i)}}function eh(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 i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(i)}}function yA(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 i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return ne(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function wA(t,e){let r,n,s,i;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 d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;n=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return ne(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(o),runAfterSubmit:!0}}function Dc(t){try{return JSON.parse(t)}catch{return t}}function EA(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 TA(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 bA(t,e){let[r,n,...s]=t;return r==="workflow"?SA([n,...s].filter(i=>i!==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 SA(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 i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:e}}if(r==="add"){let s=vA(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 vA(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 i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=Dc(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(o)}return{project:e,body:s}}function kA(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<t.length;o+=1){let a=t[o];if(a==="--raw"){s=!0;continue}let l=t[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=se(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return ne(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&e}}function IA(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 NA(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 xA(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 AA(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 RA(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=Ui(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 LA(t,e){let[r,n,s,i]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=se(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=se(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return ne(c);let d=t[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept: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 o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=se(n,"run_id");if(typeof o=="string")return o;let a=se(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=se(n,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<t.length;c+=1){let d=t[c];if(d!=="--kind")return ne(d);let u=t[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept: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 o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/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 th(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 OA(t,e){let r=V_(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1637
1637
  `),2;let n=r.args,s=r.format!=="text",[i,...o]=n;if(i===void 0)return e.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1638
1638
  `),2;let a=e.dal===void 0,l=e.dal??ke({path:Z()});try{if(i==="issues"){let[c,...d]=o;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1639
1639
  `),2):c==="create"?$A(l,d,e,s):c==="claim"?CA(l,d,e,s):c==="claim-next"?MA(l,d,e,s):c==="close"?jA(l,d,e,s):c==="reopen"?DA(l,d,e,s):c==="list"?WA(l,d,e,s):c==="show"?BA(l,d,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
@@ -1720,7 +1720,7 @@ ${r}`:r}function kp(t,e){let r=V0({input:t.stdout}),n=new Map,s=(o,a={})=>new Pr
1720
1720
  `),2;let d=t.resumeInteractive(l.step_id,a,s);if(!d.resumed)return r.stderr.write(`error: interactive respond failed: ${d.reason} (step_id=${l.step_id})
1721
1721
  `),2;let u=t.acknowledgeAttention(o),f={ok:!0,attention_id:o,step_id:l.step_id,session_status:d.session.status,acknowledged_at:u?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
1722
1722
  `):r.stdout.write(`ok: attention ${o} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1723
- `),0}function H_(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 Kx,Vx,J_,eo,eA,tA,rA,nA,UA,Dc=E(()=>{"use strict";Qe();Be();Wi();Rc();Ht();Kx="http://127.0.0.1:8787",Vx=`usage: lmctl api [--direct] <subcommand> ...
1723
+ `),0}function H_(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 Kx,Vx,J_,eo,eA,tA,rA,nA,UA,Pc=E(()=>{"use strict";Qe();Be();Wi();Lc();Ht();Kx="http://127.0.0.1:8787",Vx=`usage: lmctl api [--direct] <subcommand> ...
1724
1724
 
1725
1725
  Call the lmctl HTTP API using the configured daemon URL/token (see
1726
1726
  \`api config\`). Most subcommands require a running \`lmctl serve\`.
@@ -1859,27 +1859,27 @@ and \`lmctl api escalations\` (no args) print detailed usage.
1859
1859
 
1860
1860
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1861
1861
  and report the first step that would be started. Default output is the TTY
1862
- table; --json emits the structured WorkflowVerifyReport payload.`;UA=["open","assigned","closed","reopened"]});import sh from"jexl";function un(t){sh.compile(ih(t))}async function Dr(t,e){return sh.eval(ih(t),e)}function ih(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var ms=E(()=>{"use strict"});import{z as w}from"zod";function Hc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var eR,oh,Pc,Fc,Uc,Wc,Bc,qc,ah,tR,rR,nR,ps,sR,no,so,io,oo,ao,lh,iR,oR,aR,lR,lo,fn=E(()=>{"use strict";ms();eR=w.object({kind:w.enum(["success","neutral","failure"])}),oh=w.enum(["string","number","boolean","object","array"]),Pc=w.object({name:w.string().min(1),type:oh,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),Fc=w.object({name:w.string().min(1),type:oh,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),Uc=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),Wc="__failure__",Bc=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),qc=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(),ah=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),tR=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(),rR=w.union([w.string().min(1),tR]),nR=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),ps=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(rR).optional(),skills:w.array(nR).optional()}),sR=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),no=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:ps,pre_checks:w.array(sR).optional(),reviewers:w.array(ps.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"})}),so=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(ps.extend({topic:w.string().min(1)})).optional(),consolidator:ps,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()}),io=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:ps.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()}),oo=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)}),ao=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()}),lh=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{un(Hc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),iR=w.discriminatedUnion("type",[ah,no,so,io,oo,ao,lh]),oR=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:iR,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((t,e)=>{try{un(Hc(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}`})}}),aR=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{un(Hc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),lR=w.discriminatedUnion("type",[ah,no,so,io,oo,ao,lh,oR,aR]),lo=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),lR),terminals:w.record(w.string().min(1),eR),errors:qc,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(Pc).optional(),outputs:w.array(Fc).optional(),triggers:w.array(Uc).optional(),read_only:w.boolean().optional(),requires:Bc}).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 V}from"zod";var cR,co,dR,uR,fR,xt,mn=E(()=>{"use strict";fn();cR=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,co=V.string().regex(cR),dR=V.object({step_id:co,type:V.literal("main"),index:V.number().int().min(0)}),uR=V.record(co,V.record(V.string().min(1),V.array(V.array(dR)))),fR=V.object({id:co,name:V.string().min(1),type:V.string().min(1),typeVersion:V.number().int().positive().default(1),parameters:V.record(V.string(),V.unknown()).default({}),members:V.record(V.string(),V.unknown()).optional(),estimated_duration_ms:V.number().int().nonnegative().optional()}),xt=V.object({schema_version:V.literal("lmctl/v3"),definition_schema_version:V.literal(3),name:V.string().min(1),version:V.number().int().positive(),description:V.string().optional(),estimated_duration_ms:V.number().int().nonnegative().optional(),default_task_timeout_ms:V.number().int().positive().max(216e5).optional(),concurrency_key:V.string().min(1).optional(),concurrent_limit:V.number().int().positive().optional(),errors:qc,inputs:V.array(Pc).optional(),outputs:V.array(Fc).optional(),steps:V.array(fR).min(1),connections:uR.default({}),entry_step_id:co,triggers:V.array(Uc).optional(),read_only:V.boolean().optional(),requires:Bc}).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[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||e.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function uo(t){return Xc(t)}function Xc(t){if(Array.isArray(t))return t.map(Xc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Xc(e[n]);if(typeof r.type=="string"){let n=pR[r.type];n!==void 0&&(r.type=n)}return r}var Jc,mR,pR,Gc=E(()=>{"use strict";Jc="lmctl.builtin.",mR={Review:`${Jc}Review`,Research:`${Jc}Research`,Consolidate:`${Jc}Consolidate`},pR=Object.fromEntries(Object.entries(mR).map(([t,e])=>[e,t]))});import{readFileSync as _R}from"node:fs";function uh(t){return hR(t)}function hR(t){let e=uo(wR(t));if(yR(e),fh(e)===3)return gR(e);let r=lo.safeParse(e);if(!r.success)throw new Jt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=ER(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Jt(n);return r.data}function gR(t){let e=xt.safeParse(t);if(!e.success)throw new Jt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function yR(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=fh(t);if(!(e===null||ch.includes(e)))throw new Jt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${ch.join(", ")}`}]})}function fh(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 wR(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1863
- `)||e.startsWith("{")||e.startsWith("[")?dh(t,"$"):e.endsWith(".json")?dh(_R(e,"utf8"),e):t}function dh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Jt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function ER(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"}),TR(t,n,r);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function TR(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 ch,Jt,mh=E(()=>{"use strict";fn();mn();Gc();ch=[1,2,3],Jt=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 bR}from"node:crypto";function ph(t,e){let r=SR(e),n=bR("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function SR(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var _h=E(()=>{"use strict";mn()});function IR(t,e){let r=kR[t]??[],n={},s={};for(let[i,o]of Object.entries(e))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function wh(t){let e=[],r=(k,N)=>{throw new pn([{line:k,message:N}])},n=t.split(`
1864
- `),s=[];for(let k=0;k<n.length;k+=1){let L=AR(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,h=new Map,g=new Map,_=(k,N,L,W,D,C)=>{l.has(k)&&r(W,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(W,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:W,isTerminal:D,...C?{members:C}:{}}),d.push(k)},y=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let W=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(W===null)break;N.push({label:W[1],dst:W[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],W=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let D=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),C=fr(D[1],N,r);for(let z of Object.keys(C))gh.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...gh].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(W==="step"){let D=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),C=D[1],z=D[2],he=D[3],oe=hh[z];oe===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(hh).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:be,members:Mt}=IR(oe,fr(he,N,r));_(C,oe,be,N,!1,Object.keys(Mt).length>0?Mt:void 0);continue}if(W==="trigger"){let D=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),C=D[1],z=D[2],he=D[3],oe=yh[z];oe===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(yh).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:oe,parameters:fr(he,N,r)});continue}if(W==="mcp"||W==="skill"){let D=new RegExp(`^${W}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${W}\` decl (expected \`${W} <name> = {json} | ${W} <name> = "<file|url>"\`): ${L}`),C=D[1],z=D[2].trim(),he=W==="mcp"?h:g;he.has(C)&&r(N,`duplicate ${W} declaration: ${C}`);let oe;if(z.startsWith("{")){let be=fr(z,N,r);W==="mcp"?oe={...be,name:C}:((typeof be.content!="string"||be.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:C,content:be.content})}else{let be=Eh(z);(typeof be!="string"||be.length===0)&&r(N,`\`${W} ${C}\`: string form must be a non-empty file path or http(s) URL`),oe=be}he.set(C,oe);continue}if(W==="terminal"){let D=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);_(D[1],"lmctl/terminal",{name:D[2],kind:D[3]??"neutral"},N,!0);continue}if(W==="seq"){let C=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(z=>z.trim()).filter(z=>z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let z=0;z+2<C.length+1&&!(z+2>C.length-1);z+=2){let he=C[z],oe=C[z+1],be=C[z+2],Mt=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:he,port:Mt,dstDeclId:be,line:N})}continue}if(W==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],z=[],he,oe=k+1;for(;oe<s.length;oe+=1){let be=s[oe].text,Mt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Mt!==null){he!==void 0&&r(s[oe].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Wn=Mt[2];z.push({when:Mt[1].trim(),next:`@terminal:${Wn}`}),c.push({srcDeclId:C,port:Wn,dstDeclId:Mt[3],line:s[oe].n});continue}let Ya=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Ya!==null){he!==void 0&&r(s[oe].n,`\`choice ${C}\` has more than one \`default\``);let Wn=Ya[1];he=`@terminal:${Wn}`,c.push({srcDeclId:C,port:Wn,dstDeclId:Ya[2],line:s[oe].n});continue}break}z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(C,"lmctl/choice",{branches:z,...he!==void 0?{default_next:he}:{}},N,!1),k=oe-1;continue}if(W==="loop"){let D=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);_(D[1],"lmctl/loop",fr(D[2],N,r),N,!1);continue}if(W==="foreach"){let D=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),C=fr(D[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(D[1],"lmctl/foreach",C,N,!1);continue}if(W==="call"){let D=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),C=D[1],z=fr(D[2],N,r),he=z.workflow;(typeof he!="string"||he.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...be}=z;_(C,"lmctl/subflow",{workflow_name:he,...be},N,!1),u.push({declId:C,target:he,line:N});continue}if(W==="decide"){let D=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),C=D[1],z=fr(D[2],N,r),{branches:he,nextIdx:oe}=y(k);he.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:z});for(let be of he)c.push({srcDeclId:C,port:be.label,dstDeclId:be.dst,line:N});k=oe;continue}if(W==="entry"){let D=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=D[1];continue}r(N,`unknown statement \`${W}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let T=k=>{if(Array.isArray(k)){for(let L of k)T(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,W]of[["mcp",h],["skills",g]]){let D=N[L];Array.isArray(D)&&(N[L]=D.map(C=>typeof C=="string"&&W.has(C)?structuredClone(W.get(C)):C))}for(let L of Object.values(N))T(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&T(N.members)}let b=k=>ph(o,k),I=d.map(k=>{let N=l.get(k);return{id:b(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=b(k.srcDeclId);x[N]??={},x[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[N][k.port]=[[{step_id:b(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);NR.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let H=new Map;for(let k of c){let N=H.get(k.srcDeclId);N===void 0?H.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let W=H.get(k);W===void 0?H.set(k,[L]):W.push(L)}}let pe=new Set([f]),U=[f];for(;U.length>0;){let k=U.shift();for(let N of H.get(k)??[])pe.has(N)||(pe.add(N),U.push(N))}for(let k of d)pe.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let j=new Map;for(let k of c){let N=j.get(k.srcDeclId);N===void 0&&(N=new Set,j.set(k.srcDeclId,N)),N.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=j.get(k)??new Set;if(N.type==="lmctl/review"){let D=[...L].some(C=>!A.has(C));!L.has("approve")&&!D&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let W=xR[N.type];if(W!==void 0)for(let D of W)L.has(D)||r(N.line,`uncovered outcome: required outcome \`${D}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${D}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=vR[N.type];if(L===void 0)continue;let W={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},D=L.schema.safeParse(W);if(!D.success){let C=D.error.issues[0],z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let ee={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:b(f)},B=xt.safeParse(ee);if(!B.success)throw new pn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function AR(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 fr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(e,"structured args must be a JSON object"),i}let s={};for(let i of RR(n)){let o=i.indexOf("=");o===-1&&r(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=Eh(l)}return s}function RR(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Eh(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 vR,kR,hh,pn,NR,xR,gh,yh,Th=E(()=>{"use strict";mn();_h();fn();vR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:no},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:so},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:io},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:oo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:ao}},kR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};hh={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"},pn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1862
+ table; --json emits the structured WorkflowVerifyReport payload.`;UA=["open","assigned","closed","reopened"]});import sh from"jexl";function un(t){sh.compile(ih(t))}async function Dr(t,e){return sh.eval(ih(t),e)}function ih(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var ms=E(()=>{"use strict"});import{z as w}from"zod";function Jc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var eR,oh,Fc,Uc,Wc,Bc,qc,Hc,ah,tR,rR,nR,ps,sR,no,so,io,oo,ao,lh,iR,oR,aR,lR,lo,fn=E(()=>{"use strict";ms();eR=w.object({kind:w.enum(["success","neutral","failure"])}),oh=w.enum(["string","number","boolean","object","array"]),Fc=w.object({name:w.string().min(1),type:oh,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),Uc=w.object({name:w.string().min(1),type:oh,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),Wc=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),Bc="__failure__",qc=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),Hc=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(),ah=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),tR=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(),rR=w.union([w.string().min(1),tR]),nR=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),ps=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(rR).optional(),skills:w.array(nR).optional()}),sR=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),no=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:ps,pre_checks:w.array(sR).optional(),reviewers:w.array(ps.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"})}),so=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(ps.extend({topic:w.string().min(1)})).optional(),consolidator:ps,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()}),io=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:ps.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()}),oo=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)}),ao=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()}),lh=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{un(Jc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),iR=w.discriminatedUnion("type",[ah,no,so,io,oo,ao,lh]),oR=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:iR,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((t,e)=>{try{un(Jc(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}`})}}),aR=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{un(Jc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),lR=w.discriminatedUnion("type",[ah,no,so,io,oo,ao,lh,oR,aR]),lo=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),lR),terminals:w.record(w.string().min(1),eR),errors:Hc,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(Fc).optional(),outputs:w.array(Uc).optional(),triggers:w.array(Wc).optional(),read_only:w.boolean().optional(),requires:qc}).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 V}from"zod";var cR,co,dR,uR,fR,xt,mn=E(()=>{"use strict";fn();cR=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,co=V.string().regex(cR),dR=V.object({step_id:co,type:V.literal("main"),index:V.number().int().min(0)}),uR=V.record(co,V.record(V.string().min(1),V.array(V.array(dR)))),fR=V.object({id:co,name:V.string().min(1),type:V.string().min(1),typeVersion:V.number().int().positive().default(1),parameters:V.record(V.string(),V.unknown()).default({}),members:V.record(V.string(),V.unknown()).optional(),estimated_duration_ms:V.number().int().nonnegative().optional()}),xt=V.object({schema_version:V.literal("lmctl/v3"),definition_schema_version:V.literal(3),name:V.string().min(1),version:V.number().int().positive(),description:V.string().optional(),estimated_duration_ms:V.number().int().nonnegative().optional(),default_task_timeout_ms:V.number().int().positive().max(216e5).optional(),concurrency_key:V.string().min(1).optional(),concurrent_limit:V.number().int().positive().optional(),errors:Hc,inputs:V.array(Fc).optional(),outputs:V.array(Uc).optional(),steps:V.array(fR).min(1),connections:uR.default({}),entry_step_id:co,triggers:V.array(Wc).optional(),read_only:V.boolean().optional(),requires:qc}).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[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||e.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function uo(t){return Gc(t)}function Gc(t){if(Array.isArray(t))return t.map(Gc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Gc(e[n]);if(typeof r.type=="string"){let n=pR[r.type];n!==void 0&&(r.type=n)}return r}var Xc,mR,pR,Kc=E(()=>{"use strict";Xc="lmctl.builtin.",mR={Review:`${Xc}Review`,Research:`${Xc}Research`,Consolidate:`${Xc}Consolidate`},pR=Object.fromEntries(Object.entries(mR).map(([t,e])=>[e,t]))});import{readFileSync as _R}from"node:fs";function uh(t){return hR(t)}function hR(t){let e=uo(wR(t));if(yR(e),fh(e)===3)return gR(e);let r=lo.safeParse(e);if(!r.success)throw new Jt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=ER(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Jt(n);return r.data}function gR(t){let e=xt.safeParse(t);if(!e.success)throw new Jt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function yR(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=fh(t);if(!(e===null||ch.includes(e)))throw new Jt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${ch.join(", ")}`}]})}function fh(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 wR(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1863
+ `)||e.startsWith("{")||e.startsWith("[")?dh(t,"$"):e.endsWith(".json")?dh(_R(e,"utf8"),e):t}function dh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Jt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function ER(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"}),TR(t,n,r);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function TR(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 ch,Jt,mh=E(()=>{"use strict";fn();mn();Kc();ch=[1,2,3],Jt=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 bR}from"node:crypto";function ph(t,e){let r=SR(e),n=bR("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function SR(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var _h=E(()=>{"use strict";mn()});function IR(t,e){let r=kR[t]??[],n={},s={};for(let[i,o]of Object.entries(e))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function wh(t){let e=[],r=(k,N)=>{throw new pn([{line:k,message:N}])},n=t.split(`
1864
+ `),s=[];for(let k=0;k<n.length;k+=1){let L=AR(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,h=new Map,g=new Map,_=(k,N,L,W,D,M)=>{l.has(k)&&r(W,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(W,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:W,isTerminal:D,...M?{members:M}:{}}),d.push(k)},y=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let W=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(W===null)break;N.push({label:W[1],dst:W[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],W=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let D=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),M=fr(D[1],N,r);for(let z of Object.keys(M))gh.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...gh].join(", ")} (no grammar inflation; bounded)`);m=M;continue}if(W==="step"){let D=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),M=D[1],z=D[2],he=D[3],oe=hh[z];oe===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(hh).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:be,members:Mt}=IR(oe,fr(he,N,r));_(M,oe,be,N,!1,Object.keys(Mt).length>0?Mt:void 0);continue}if(W==="trigger"){let D=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),M=D[1],z=D[2],he=D[3],oe=yh[z];oe===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(yh).join(", ")})`),p.has(M)&&r(N,`duplicate trigger id: ${M}`),p.set(M,{id:M,type:oe,parameters:fr(he,N,r)});continue}if(W==="mcp"||W==="skill"){let D=new RegExp(`^${W}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${W}\` decl (expected \`${W} <name> = {json} | ${W} <name> = "<file|url>"\`): ${L}`),M=D[1],z=D[2].trim(),he=W==="mcp"?h:g;he.has(M)&&r(N,`duplicate ${W} declaration: ${M}`);let oe;if(z.startsWith("{")){let be=fr(z,N,r);W==="mcp"?oe={...be,name:M}:((typeof be.content!="string"||be.content.length===0)&&r(N,`\`skill ${M}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:M,content:be.content})}else{let be=Eh(z);(typeof be!="string"||be.length===0)&&r(N,`\`${W} ${M}\`: string form must be a non-empty file path or http(s) URL`),oe=be}he.set(M,oe);continue}if(W==="terminal"){let D=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);_(D[1],"lmctl/terminal",{name:D[2],kind:D[3]??"neutral"},N,!0);continue}if(W==="seq"){let M=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(z=>z.trim()).filter(z=>z.length>0);(M.length<3||M.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let z=0;z+2<M.length+1&&!(z+2>M.length-1);z+=2){let he=M[z],oe=M[z+1],be=M[z+2],Mt=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:he,port:Mt,dstDeclId:be,line:N})}continue}if(W==="choice"){let M=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],z=[],he,oe=k+1;for(;oe<s.length;oe+=1){let be=s[oe].text,Mt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Mt!==null){he!==void 0&&r(s[oe].n,`\`choice ${M}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Wn=Mt[2];z.push({when:Mt[1].trim(),next:`@terminal:${Wn}`}),c.push({srcDeclId:M,port:Wn,dstDeclId:Mt[3],line:s[oe].n});continue}let za=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(za!==null){he!==void 0&&r(s[oe].n,`\`choice ${M}\` has more than one \`default\``);let Wn=za[1];he=`@terminal:${Wn}`,c.push({srcDeclId:M,port:Wn,dstDeclId:za[2],line:s[oe].n});continue}break}z.length===0&&r(N,`\`choice ${M}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(M,"lmctl/choice",{branches:z,...he!==void 0?{default_next:he}:{}},N,!1),k=oe-1;continue}if(W==="loop"){let D=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);_(D[1],"lmctl/loop",fr(D[2],N,r),N,!1);continue}if(W==="foreach"){let D=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),M=fr(D[2],N,r);"mode"in M&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(D[1],"lmctl/foreach",M,N,!1);continue}if(W==="call"){let D=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),M=D[1],z=fr(D[2],N,r),he=z.workflow;(typeof he!="string"||he.length===0)&&r(N,`\`call ${M}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...be}=z;_(M,"lmctl/subflow",{workflow_name:he,...be},N,!1),u.push({declId:M,target:he,line:N});continue}if(W==="decide"){let D=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),M=D[1],z=fr(D[2],N,r),{branches:he,nextIdx:oe}=y(k);he.length===0&&r(N,`\`decide ${M}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(M,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:z});for(let be of he)c.push({srcDeclId:M,port:be.label,dstDeclId:be.dst,line:N});k=oe;continue}if(W==="entry"){let D=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=D[1];continue}r(N,`unknown statement \`${W}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let T=k=>{if(Array.isArray(k)){for(let L of k)T(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,W]of[["mcp",h],["skills",g]]){let D=N[L];Array.isArray(D)&&(N[L]=D.map(M=>typeof M=="string"&&W.has(M)?structuredClone(W.get(M)):M))}for(let L of Object.values(N))T(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&T(N.members)}let b=k=>ph(o,k),I=d.map(k=>{let N=l.get(k);return{id:b(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=b(k.srcDeclId);x[N]??={},x[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[N][k.port]=[[{step_id:b(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);NR.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let H=new Map;for(let k of c){let N=H.get(k.srcDeclId);N===void 0?H.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let W=H.get(k);W===void 0?H.set(k,[L]):W.push(L)}}let pe=new Set([f]),U=[f];for(;U.length>0;){let k=U.shift();for(let N of H.get(k)??[])pe.has(N)||(pe.add(N),U.push(N))}for(let k of d)pe.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let j=new Map;for(let k of c){let N=j.get(k.srcDeclId);N===void 0&&(N=new Set,j.set(k.srcDeclId,N)),N.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=j.get(k)??new Set;if(N.type==="lmctl/review"){let D=[...L].some(M=>!A.has(M));!L.has("approve")&&!D&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let W=xR[N.type];if(W!==void 0)for(let D of W)L.has(D)||r(N.line,`uncovered outcome: required outcome \`${D}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${D}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=vR[N.type];if(L===void 0)continue;let W={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},D=L.schema.safeParse(W);if(!D.success){let M=D.error.issues[0],z=M.path.length===0?"$":M.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${z}\`: ${M.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let ee={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:b(f)},B=xt.safeParse(ee);if(!B.success)throw new pn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function AR(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 fr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(e,"structured args must be a JSON object"),i}let s={};for(let i of RR(n)){let o=i.indexOf("=");o===-1&&r(e,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=Eh(l)}return s}function RR(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function Eh(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 vR,kR,hh,pn,NR,xR,gh,yh,Th=E(()=>{"use strict";mn();_h();fn();vR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:no},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:so},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:io},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:oo},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:ao}},kR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};hh={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"},pn=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1865
1865
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1866
1866
  `)}`),this.issues=e,this.name="DslCompileError"}},NR=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"]),xR={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},gh=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),yh={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as LR}from"node:fs";function OR(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function $R(t){for(let e of t.split(`
1867
- `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function dt(t){if(typeof t=="string"&&OR()&&$R(t)){let r;try{r=wh(t)}catch(s){throw s instanceof pn?new Xt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=xt.safeParse(r);if(!n.success)throw new Xt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=uo(MR(t));if(jR(e)&&e.definition_schema_version===3){let r=xt.safeParse(e);if(!r.success)throw new Xt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return CR(e)}function CR(t){let e=lo.safeParse(t);if(!e.success)throw new Xt(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,i]of Object.entries(r.states))if(n.has(i.type))throw new Xt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return uh(r)}catch(s){throw s instanceof Jt?new Kc(s):s}}function MR(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1868
- `)||e.startsWith("{")||e.startsWith("[")?bh(t):e.endsWith(".json")?bh(LR(e,"utf8")):t}function bh(t){return JSON.parse(t)}function jR(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Kc,Xt,_s=E(()=>{"use strict";fn();mh();Gc();mn();Th();Kc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Xt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function fo(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:DR(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:FR(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function DR(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=PR(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function PR(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 FR(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Vc=E(()=>{"use strict"});var Sh={};Ee(Sh,{enqueueFromAgentOutput:()=>WR,enqueueFromGitHubIssue:()=>Yc,enqueueManual:()=>UR,enqueueScheduled:()=>BR});function Yc(t,e){return po(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:mo(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function UR(t,e){return po(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:mo(e.payload),concurrency_key:e.concurrency_key})}function WR(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return po(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:mo(e.payload),concurrency_key:e.concurrency_key})}function BR(t,e){return po(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:mo(e.payload),concurrency_key:e.concurrency_key})}function mo(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function po(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 i=dt(s.definition),o={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=fo({workflow:i,job:o,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var zc=E(()=>{"use strict";_s();Vc()});async function kh(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return vh(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 i of e){if(!await qR(i.condition,r))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...HR(i.parameters_override)},l=vh(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function vh(t,e,r,n,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Yc(t,{project_id:e,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function qR(t,e){if(t===null||t.trim().length===0)return!0;try{return await Dr(t,e)===!0}catch{return!1}}function HR(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 Ih=E(()=>{"use strict";ms();zc()});import{spawnSync as JR}from"node:child_process";async function XR(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=JR(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 i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!KR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await kh({dal:t.dal,project:t.project,issue:VR(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function _o(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=GR(r.intake_config);try{let s=await XR({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});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:i})})}catch{}}}return e}function GR(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Zc(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 KR(t){return Array.isArray(t)&&t.every(e=>{if(!Zc(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:Zc(n)&&typeof n.name=="string"))})}function VR(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 Zc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Qc=E(()=>{"use strict";Ih()});function xh(t){return async e=>zR(t.app,e,t.log!==void 0?{log:t.log}:{})}async function zR(t,e,r={}){let n=ZR(e.path),s={"content-type":"application/json",...e.headers??{},[ho]:ed},i={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(i.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let o=new Request(n,i),a=Date.now();try{let l=await t.fetch(o),c=await QR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Nh(e.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Nh(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Nh(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function ZR(t){let e=t.startsWith("/")?t:`/${t}`;return`${YR}${e}`}async function QR(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((i,o)=>{o.toLowerCase()!==ho&&(n[o]=i)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var ho,ed,YR,td=E(()=>{"use strict";ho="x-mailbox-channel",ed="1",YR="http://mailbox.local"});import{createHash as Ah,createHmac as eL,timingSafeEqual as tL}from"node:crypto";function Rh(t={}){return async(e,r)=>{if(t.disabled===!0){await r();return}let n=Lh();if(n===null||oL(e.req.path)){await r();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(ho)===ed){await r();return}let s=e.req.query("token");if(s!==void 0&&go(s,n)){nd(e,n),await r();return}if(iL(e,n)){await r();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function Lh(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Oh(t){let e=Lh();return e!==null&&go(t,e)}function nd(t,e,r=new Date){t.header("Set-Cookie",`${rd}=${nL(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function $h(t){t.header("Set-Cookie",`${rd}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function nL(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+rL*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Ch(t,n)}`,"utf8").toString("base64url")}function sL(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 i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:go(s[2],Ch(e,`${s[0]}|${s[1]}`))}function go(t,e){return tL(Ah("sha256").update(t).digest(),Ah("sha256").update(e).digest())}function iL(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&go(r,e))return!0;let n=aL(t.req.header("cookie")??"")[rd];return n!==void 0&&sL(n,e)}function oL(t){return t==="/login"||t==="/logout"}function aL(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 Ch(t,e){return eL("sha256",t).update(e).digest("hex")}var rd,rL,Mh=E(()=>{"use strict";td();rd="lmctl_next_session",rL=30});import{existsSync as _n,mkdirSync as lL,readdirSync as cL,readFileSync as yo,unlinkSync as dL,writeFileSync as od}from"node:fs";import{join as Pr}from"node:path";function rt(t){if(!uL.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Dh(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(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return _L(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:jh,updated_at:jh}:null}function fL(t,e,r,n){let s=r!==null?`
1867
+ `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function dt(t){if(typeof t=="string"&&OR()&&$R(t)){let r;try{r=wh(t)}catch(s){throw s instanceof pn?new Xt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=xt.safeParse(r);if(!n.success)throw new Xt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=uo(MR(t));if(jR(e)&&e.definition_schema_version===3){let r=xt.safeParse(e);if(!r.success)throw new Xt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return CR(e)}function CR(t){let e=lo.safeParse(t);if(!e.success)throw new Xt(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,i]of Object.entries(r.states))if(n.has(i.type))throw new Xt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return uh(r)}catch(s){throw s instanceof Jt?new Vc(s):s}}function MR(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1868
+ `)||e.startsWith("{")||e.startsWith("[")?bh(t):e.endsWith(".json")?bh(LR(e,"utf8")):t}function bh(t){return JSON.parse(t)}function jR(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Vc,Xt,_s=E(()=>{"use strict";fn();mh();Kc();mn();Th();Vc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Xt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function fo(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:DR(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:FR(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function DR(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=PR(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function PR(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 FR(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Yc=E(()=>{"use strict"});var Sh={};Ee(Sh,{enqueueFromAgentOutput:()=>WR,enqueueFromGitHubIssue:()=>zc,enqueueManual:()=>UR,enqueueScheduled:()=>BR});function zc(t,e){return po(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:mo(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function UR(t,e){return po(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:mo(e.payload),concurrency_key:e.concurrency_key})}function WR(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return po(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:mo(e.payload),concurrency_key:e.concurrency_key})}function BR(t,e){return po(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:mo(e.payload),concurrency_key:e.concurrency_key})}function mo(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function po(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 i=dt(s.definition),o={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=fo({workflow:i,job:o,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var Zc=E(()=>{"use strict";_s();Yc()});async function kh(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return vh(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 i of e){if(!await qR(i.condition,r))continue;let o=`${t.issue.url}#workflow:${i.workflow_id}`,a={issue:t.issue,...HR(i.parameters_override)},l=vh(t.dal,t.project.id,t.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function vh(t,e,r,n,s,i,o){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[zc(t,{project_id:e,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function qR(t,e){if(t===null||t.trim().length===0)return!0;try{return await Dr(t,e)===!0}catch{return!1}}function HR(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 Ih=E(()=>{"use strict";ms();Zc()});import{spawnSync as JR}from"node:child_process";async function XR(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=JR(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 i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!KR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await kh({dal:t.dal,project:t.project,issue:VR(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function _o(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=GR(r.intake_config);try{let s=await XR({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});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:i})})}catch{}}}return e}function GR(t){if(t===null)return{};try{let e=JSON.parse(t);if(!Qc(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 KR(t){return Array.isArray(t)&&t.every(e=>{if(!Qc(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:Qc(n)&&typeof n.name=="string"))})}function VR(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 Qc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var ed=E(()=>{"use strict";Ih()});function xh(t){return async e=>zR(t.app,e,t.log!==void 0?{log:t.log}:{})}async function zR(t,e,r={}){let n=ZR(e.path),s={"content-type":"application/json",...e.headers??{},[ho]:td},i={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(i.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let o=new Request(n,i),a=Date.now();try{let l=await t.fetch(o),c=await QR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Nh(e.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${Nh(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function Nh(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function ZR(t){let e=t.startsWith("/")?t:`/${t}`;return`${YR}${e}`}async function QR(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((i,o)=>{o.toLowerCase()!==ho&&(n[o]=i)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var ho,td,YR,rd=E(()=>{"use strict";ho="x-mailbox-channel",td="1",YR="http://mailbox.local"});import{createHash as Ah,createHmac as eL,timingSafeEqual as tL}from"node:crypto";function Rh(t={}){return async(e,r)=>{if(t.disabled===!0){await r();return}let n=Lh();if(n===null||oL(e.req.path)){await r();return}if(e.req.path.startsWith("/mailbox/")&&e.req.header(ho)===td){await r();return}let s=e.req.query("token");if(s!==void 0&&go(s,n)){sd(e,n),await r();return}if(iL(e,n)){await r();return}return e.req.path.startsWith("/api/")||e.req.path.startsWith("/mailbox/")?e.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):e.redirect("/login",302)}}function Lh(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function Oh(t){let e=Lh();return e!==null&&go(t,e)}function sd(t,e,r=new Date){t.header("Set-Cookie",`${nd}=${nL(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function $h(t){t.header("Set-Cookie",`${nd}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function nL(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+rL*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Ch(t,n)}`,"utf8").toString("base64url")}function sL(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 i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:go(s[2],Ch(e,`${s[0]}|${s[1]}`))}function go(t,e){return tL(Ah("sha256").update(t).digest(),Ah("sha256").update(e).digest())}function iL(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&go(r,e))return!0;let n=aL(t.req.header("cookie")??"")[nd];return n!==void 0&&sL(n,e)}function oL(t){return t==="/login"||t==="/logout"}function aL(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 Ch(t,e){return eL("sha256",t).update(e).digest("hex")}var nd,rL,Mh=E(()=>{"use strict";rd();nd="lmctl_next_session",rL=30});import{existsSync as _n,mkdirSync as lL,readdirSync as cL,readFileSync as yo,unlinkSync as dL,writeFileSync as ad}from"node:fs";import{join as Pr}from"node:path";function rt(t){if(!uL.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function Dh(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(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return _L(a)?{name:t,type:a,description:o?.[1]?.trim()??null,body:s,created_at:jh,updated_at:jh}:null}function fL(t,e,r,n){let s=r!==null?`
1869
1869
  description: ${r}`:"";return`---
1870
1870
  name: ${t}${s}
1871
1871
  type: ${e}
1872
1872
  ---
1873
- ${n}`}function mL(t,e,r,n){let s=Pr(t,ad),i=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=_n(s)?yo(s,"utf8"):"",a=new RegExp(`^- \\[${Ph(e)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
1873
+ ${n}`}function mL(t,e,r,n){let s=Pr(t,ld),i=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=_n(s)?yo(s,"utf8"):"",a=new RegExp(`^- \\[${Ph(e)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
1874
1874
  `)?`${o}
1875
1875
  ${i}
1876
1876
  `:`${o}${i}
1877
- `,od(s,o,"utf8")}function pL(t,e){let r=Pr(t,ad);if(!_n(r))return;let n=yo(r,"utf8"),s=new RegExp(`^- \\[${Ph(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&od(r,n.replace(s,""),"utf8")}function Ph(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _L(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ut(t,e){return t.durable_memory_mode==="db"?new id(e,t.id):new sd(t.local_path)}var uL,ad,jh,sd,id,ld=E(()=>{"use strict";uL=/^[a-zA-Z0-9_-]+$/;ad="MEMORY.md",jh="1970-01-01T00:00:00.000Z",sd=class{dir;constructor(e){this.dir=Pr(e,"durable-memory")}read(e){rt(e);let r=Pr(this.dir,`${e}.md`);if(!_n(r))return null;let n=yo(r,"utf8");return Dh(e,n)}write(e){rt(e.name),lL(this.dir,{recursive:!0});let r=Pr(this.dir,`${e.name}.md`),n=!_n(r),s=fL(e.name,e.type,e.description??null,e.body);return od(r,s,"utf8"),mL(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:i})=>({name:r,type:n,description:s,updated_at:i}))}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){rt(e);let r=Pr(this.dir,`${e}.md`);return _n(r)?(dL(r),pL(this.dir,e),!0):!1}listFiles(){if(!_n(this.dir))return[];let e=cL(this.dir).filter(n=>n.endsWith(".md")&&n!==ad),r=[];for(let n of e){let s=n.slice(0,-3),i=yo(Pr(this.dir,n),"utf8"),o=Dh(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};id=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){rt(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){rt(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 rt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Uh(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ut(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=ut(o,r),l;try{l=a.read(i)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,d=typeof o.description=="string"?o.description:null;if(a===null||!Fh.has(a))return n.json({error:`invalid type: must be one of ${[...Fh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=ut(i,r),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ut(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Fh,Wh=E(()=>{"use strict";ld();Fh=new Set(["user","feedback","project","reference"])});function gL(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(hL[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function yL(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 Bh(t,e=new Date){let{time:r,date:n}=yL(e),s=[],i=[],o=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=gL(h.data),y=h.data.length,T=new Uint8Array(30+g.length),b=new DataView(T.buffer);b.setUint32(0,67324752,!0),b.setUint16(4,20,!0),b.setUint16(6,0,!0),b.setUint16(8,0,!0),b.setUint16(10,r,!0),b.setUint16(12,n,!0),b.setUint32(14,_,!0),b.setUint32(18,y,!0),b.setUint32(22,y,!0),b.setUint16(26,g.length,!0),b.setUint16(28,0,!0),T.set(g,30),s.push(T,h.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,_,!0),x.setUint32(20,y,!0),x.setUint32(24,y,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),I.set(g,46),i.push(I),o+=T.length+h.data.length}let l=o,c=0;for(let h of i)c+=h.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,t.length,!0),u.setUint16(10,t.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of i)m.set(h,p),p+=h.length;return m.set(d,p),m}var hL,qh=E(()=>{"use strict";hL=(()=>{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 To,mkdirSync as wL,readdirSync as EL,readFileSync as Xh,statSync as TL,unlinkSync as bL,writeFileSync as SL}from"node:fs";import{join as ys}from"node:path";function Gh(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ft(n);if(typeof s=="string")return R(n,s,400);let i=ae(s,"name"),o=ae(s,"local_path");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(o===null||o.length===0)return R(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return R(n,`project already exists: ${i}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let u=r.findTeamByName(c);if(u===null)return R(n,`team not found: ${c}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return R(n,"no teams exist; create a team first",400);l=u[0].id}let d=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(d,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return R(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return R(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return R(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return R(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?R(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ft(n);if(typeof s=="string")return R(n,s,400);let i=ae(s,"name");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return R(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"alias"),a=ae(i,"provider");if(o===null||o.length===0)return R(n,"missing or empty alias",400);if(a===null||a.length===0)return R(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return R(n,`member already exists: ${o}`,409);let l=ae(i,"model"),c=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=ae(i,"role_prompt");d!==null&&r.setMemberRolePrompt(c.id,d);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return R(n,"member not found",404);let o=await ft(n);if(typeof o=="string")return R(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return R(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return R(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return R(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?R(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r);return n.json(i.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"name"),a=ae(i,"body"),l=ae(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!wo.includes(l))return R(n,`invalid type: must be one of ${wo.join("|")}`,400);try{rt(o)}catch(u){return R(n,u.message,400)}let c=ut(s,r);try{if(c.read(o)!==null)return R(n,`chapter already exists: ${o}`,409)}catch(u){return R(n,u.message,400)}try{c.write({type:l,name:o,description:ae(i,"description"),body:a})}catch(u){return R(n,u.message,400)}let d=c.read(o);return d===null?R(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o===null?R(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter"),o=await ft(n);if(typeof o=="string")return R(n,o,400);let a=ut(s,r),l;try{l=a.read(i)}catch(m){return R(n,m.message,400)}if(l===null)return R(n,"chapter not found",404);let c=ae(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?ae(o,"description"):l.description,u=ae(o,"type")??l.type;if(!wo.includes(u))return R(n,`invalid type: must be one of ${wo.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return R(n,m.message,400)}let f=a.read(i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o?n.json({removed:!0}):R(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?R(n,"project not found",404):n.json(kL(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"name"),a=ae(i,"body"),l=ae(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!Eo.has(l))return R(n,`invalid type: must be one of ${[...Eo].join("|")}`,400);try{rt(o)}catch(f){return R(n,f.message,400)}let c=hs(s.local_path),d=ys(c,`${o}.md`);if(To(d))return R(n,`chapter already exists: ${o}`,409);wL(c,{recursive:!0}),Jh(d,o,l,ae(i,"description"),a);let u=gs(c,o);return u===null?R(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);try{rt(n.req.param("chapter"))}catch(o){return R(n,o.message,400)}let i=gs(hs(s.local_path),n.req.param("chapter"));return i===null?R(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{rt(i)}catch(m){return R(n,m.message,400)}let o=hs(s.local_path),a=gs(o,i);if(a===null)return R(n,"chapter not found",404);let l=await ft(n);if(typeof l=="string")return R(n,l,400);let c=ae(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,u=ae(l,"type")??a.type;if(!Eo.has(u))return R(n,`invalid type: must be one of ${[...Eo].join("|")}`,400);Jh(ys(o,`${i}.md`),i,u,d,c);let f=gs(o,i);return f===null?R(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 R(n,"project not found",404);let i=n.req.param("chapter");try{rt(i)}catch(a){return R(n,a.message,400)}let o=ys(hs(s.local_path),`${i}.md`);return To(o)?(bL(o),n.json({removed:!0})):R(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>R(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 ft(n);return typeof s=="string"?R(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Hh))),t.post("/api/chat/sessions",async n=>{let s=await vL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?ae(s,"title"):null,o=r.createChatbotSession(Hh,i);return n.json(o,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?R(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return R(n,"chat session not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"role"),a=ae(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(n,"role must be one of user|assistant|tool",400);if(a===null)return R(n,"missing content",400);let l=r.appendChatbotMessage(s,o,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return R(n,"invalid run id",400);if(r.getRun(s)===null)return R(n,"run not found",404);let o=Mr(r,s),a=[];for(let c of o){let d=NL(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=Xh(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=Bh(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function R(t,e,r){return t.json({error:e},r)}async function ft(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 vL(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 hs(t){return ys(t,"ai-test")}function gs(t,e){let r=ys(t,`${e}.md`);if(!To(r))return null;let n=Xh(r,"utf8"),s=IL(n),i=TL(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function kL(t){let e=hs(t);return To(e)?EL(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=gs(e,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Jh(t,e,r,n,s){let i=n!==null&&n.length>0?`
1877
+ `,ad(s,o,"utf8")}function pL(t,e){let r=Pr(t,ld);if(!_n(r))return;let n=yo(r,"utf8"),s=new RegExp(`^- \\[${Ph(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&ad(r,n.replace(s,""),"utf8")}function Ph(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _L(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ut(t,e){return t.durable_memory_mode==="db"?new od(e,t.id):new id(t.local_path)}var uL,ld,jh,id,od,cd=E(()=>{"use strict";uL=/^[a-zA-Z0-9_-]+$/;ld="MEMORY.md",jh="1970-01-01T00:00:00.000Z",id=class{dir;constructor(e){this.dir=Pr(e,"durable-memory")}read(e){rt(e);let r=Pr(this.dir,`${e}.md`);if(!_n(r))return null;let n=yo(r,"utf8");return Dh(e,n)}write(e){rt(e.name),lL(this.dir,{recursive:!0});let r=Pr(this.dir,`${e.name}.md`),n=!_n(r),s=fL(e.name,e.type,e.description??null,e.body);return ad(r,s,"utf8"),mL(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:i})=>({name:r,type:n,description:s,updated_at:i}))}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){rt(e);let r=Pr(this.dir,`${e}.md`);return _n(r)?(dL(r),pL(this.dir,e),!0):!1}listFiles(){if(!_n(this.dir))return[];let e=cL(this.dir).filter(n=>n.endsWith(".md")&&n!==ld),r=[];for(let n of e){let s=n.slice(0,-3),i=yo(Pr(this.dir,n),"utf8"),o=Dh(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};od=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){rt(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){rt(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 rt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Uh(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ut(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=ut(o,r),l;try{l=a.read(i)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,d=typeof o.description=="string"?o.description:null;if(a===null||!Fh.has(a))return n.json({error:`invalid type: must be one of ${[...Fh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=ut(i,r),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ut(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Fh,Wh=E(()=>{"use strict";cd();Fh=new Set(["user","feedback","project","reference"])});function gL(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(hL[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function yL(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 Bh(t,e=new Date){let{time:r,date:n}=yL(e),s=[],i=[],o=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=gL(h.data),y=h.data.length,T=new Uint8Array(30+g.length),b=new DataView(T.buffer);b.setUint32(0,67324752,!0),b.setUint16(4,20,!0),b.setUint16(6,0,!0),b.setUint16(8,0,!0),b.setUint16(10,r,!0),b.setUint16(12,n,!0),b.setUint32(14,_,!0),b.setUint32(18,y,!0),b.setUint32(22,y,!0),b.setUint16(26,g.length,!0),b.setUint16(28,0,!0),T.set(g,30),s.push(T,h.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,_,!0),x.setUint32(20,y,!0),x.setUint32(24,y,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),I.set(g,46),i.push(I),o+=T.length+h.data.length}let l=o,c=0;for(let h of i)c+=h.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,t.length,!0),u.setUint16(10,t.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of i)m.set(h,p),p+=h.length;return m.set(d,p),m}var hL,qh=E(()=>{"use strict";hL=(()=>{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 To,mkdirSync as wL,readdirSync as EL,readFileSync as Xh,statSync as TL,unlinkSync as bL,writeFileSync as SL}from"node:fs";import{join as ys}from"node:path";function Gh(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await ft(n);if(typeof s=="string")return R(n,s,400);let i=ae(s,"name"),o=ae(s,"local_path");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(o===null||o.length===0)return R(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return R(n,`project already exists: ${i}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let u=r.findTeamByName(c);if(u===null)return R(n,`team not found: ${c}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return R(n,"no teams exist; create a team first",400);l=u[0].id}let d=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(d,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return R(n,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return R(n,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return R(n,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return R(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?R(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await ft(n);if(typeof s=="string")return R(n,s,400);let i=ae(s,"name");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return R(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"alias"),a=ae(i,"provider");if(o===null||o.length===0)return R(n,"missing or empty alias",400);if(a===null||a.length===0)return R(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return R(n,`member already exists: ${o}`,409);let l=ae(i,"model"),c=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=ae(i,"role_prompt");d!==null&&r.setMemberRolePrompt(c.id,d);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return R(n,"member not found",404);let o=await ft(n);if(typeof o=="string")return R(n,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return R(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return R(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return R(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?R(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r);return n.json(i.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"name"),a=ae(i,"body"),l=ae(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!wo.includes(l))return R(n,`invalid type: must be one of ${wo.join("|")}`,400);try{rt(o)}catch(u){return R(n,u.message,400)}let c=ut(s,r);try{if(c.read(o)!==null)return R(n,`chapter already exists: ${o}`,409)}catch(u){return R(n,u.message,400)}try{c.write({type:l,name:o,description:ae(i,"description"),body:a})}catch(u){return R(n,u.message,400)}let d=c.read(o);return d===null?R(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o===null?R(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter"),o=await ft(n);if(typeof o=="string")return R(n,o,400);let a=ut(s,r),l;try{l=a.read(i)}catch(m){return R(n,m.message,400)}if(l===null)return R(n,"chapter not found",404);let c=ae(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?ae(o,"description"):l.description,u=ae(o,"type")??l.type;if(!wo.includes(u))return R(n,`invalid type: must be one of ${wo.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return R(n,m.message,400)}let f=a.read(i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o?n.json({removed:!0}):R(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?R(n,"project not found",404):n.json(kL(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"name"),a=ae(i,"body"),l=ae(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!Eo.has(l))return R(n,`invalid type: must be one of ${[...Eo].join("|")}`,400);try{rt(o)}catch(f){return R(n,f.message,400)}let c=hs(s.local_path),d=ys(c,`${o}.md`);if(To(d))return R(n,`chapter already exists: ${o}`,409);wL(c,{recursive:!0}),Jh(d,o,l,ae(i,"description"),a);let u=gs(c,o);return u===null?R(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);try{rt(n.req.param("chapter"))}catch(o){return R(n,o.message,400)}let i=gs(hs(s.local_path),n.req.param("chapter"));return i===null?R(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{rt(i)}catch(m){return R(n,m.message,400)}let o=hs(s.local_path),a=gs(o,i);if(a===null)return R(n,"chapter not found",404);let l=await ft(n);if(typeof l=="string")return R(n,l,400);let c=ae(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,u=ae(l,"type")??a.type;if(!Eo.has(u))return R(n,`invalid type: must be one of ${[...Eo].join("|")}`,400);Jh(ys(o,`${i}.md`),i,u,d,c);let f=gs(o,i);return f===null?R(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 R(n,"project not found",404);let i=n.req.param("chapter");try{rt(i)}catch(a){return R(n,a.message,400)}let o=ys(hs(s.local_path),`${i}.md`);return To(o)?(bL(o),n.json({removed:!0})):R(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>R(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 ft(n);return typeof s=="string"?R(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Hh))),t.post("/api/chat/sessions",async n=>{let s=await vL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?ae(s,"title"):null,o=r.createChatbotSession(Hh,i);return n.json(o,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?R(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return R(n,"chat session not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"role"),a=ae(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(n,"role must be one of user|assistant|tool",400);if(a===null)return R(n,"missing content",400);let l=r.appendChatbotMessage(s,o,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return R(n,"invalid run id",400);if(r.getRun(s)===null)return R(n,"run not found",404);let o=Mr(r,s),a=[];for(let c of o){let d=NL(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=Xh(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=Bh(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function R(t,e,r){return t.json({error:e},r)}async function ft(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 vL(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 hs(t){return ys(t,"ai-test")}function gs(t,e){let r=ys(t,`${e}.md`);if(!To(r))return null;let n=Xh(r,"utf8"),s=IL(n),i=TL(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function kL(t){let e=hs(t);return To(e)?EL(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=gs(e,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Jh(t,e,r,n,s){let i=n!==null&&n.length>0?`
1878
1878
  description: ${n}`:"",o=`---
1879
1879
  name: ${e}${i}
1880
1880
  type: ${r}
1881
1881
  ---
1882
- ${s}`;SL(t,o,"utf8")}function IL(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),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function NL(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?xL(t.path):AL(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function xL(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function AL(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var wo,Eo,Hh,Kh=E(()=>{"use strict";Ht();qh();ld();wo=["user","feedback","project","reference"],Eo=new Set(["smoke","integration","vision","scenario","regression"]),Hh="operator"});function Re(t,e){return`<!doctype html>
1882
+ ${s}`;SL(t,o,"utf8")}function IL(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),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function NL(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?xL(t.path):AL(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function xL(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function AL(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var wo,Eo,Hh,Kh=E(()=>{"use strict";Ht();qh();cd();wo=["user","feedback","project","reference"],Eo=new Set(["smoke","integration","vision","scenario","regression"]),Hh="operator"});function Re(t,e){return`<!doctype html>
1883
1883
  <html lang="en">
1884
1884
  <head>
1885
1885
  <meta charset="utf-8">
@@ -1940,23 +1940,23 @@ ${s}`;SL(t,o,"utf8")}function IL(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1940
1940
  </nav>
1941
1941
  <main>${e}</main>
1942
1942
  </body>
1943
- </html>`}function S(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function me(t,e){let r=t.map(s=>`<th>${S(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function de(t){return`<pre>${S(JSON.stringify(t,null,2))}</pre>`}var cd=E(()=>{"use strict"});import{createHash as RL}from"node:crypto";import{existsSync as ws,mkdirSync as Yh,readFileSync as Es,readdirSync as LL,renameSync as OL,statSync as $L,unlinkSync as CL,writeFileSync as bo}from"node:fs";import{homedir as ML}from"node:os";import{dirname as dd,isAbsolute as Vh,join as mt,relative as jL,resolve as hn}from"node:path";import{fileURLToPath as DL}from"node:url";function Zh(t){let e=hn(t);for(;;){let r=mt(e,ud);try{if($L(r).isDirectory())return r}catch{}let n=dd(e);if(n===e)return null;e=n}}function fd(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return hn(e);let r=Zh(t);return r!==null?r:mt(zh(),ud)}function Qh(){return hn(dd(DL(import.meta.url)),"..","..","workflows")}function PL(t){let e=mt(t,eg);try{let r=JSON.parse(Es(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 FL(t,e){Yh(t,{recursive:!0});let r=mt(t,eg),n=`${r}.tmp-${process.pid}`;bo(n,`${JSON.stringify(e,null,2)}
1944
- `,"utf8"),OL(n,r)}function UL(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function WL(t,e,r,n,s){let i=`${e}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=mt(t,a);try{return bo(l,n,{flag:"wx"}),a}catch(c){if(UL(c)!=="EEXIST")throw c;if(So(Es(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function BL(t,e){if(Vh(e)||dd(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=hn(t,"templates","workflows"),s=hn(t,"templates",e),i=jL(n,s);return i.length===0||i.startsWith("..")||Vh(i)||i.includes("/")||i.includes("\\")?null:s}function qL(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let i=BL(t,n);if(i===null){delete e.files[n];continue}if(!ws(i)){delete e.files[n];continue}try{if(So(Es(i))!==s)continue;CL(i),delete e.files[n]}catch{}}}function tg(t={}){let e=fd(t.cwd),r=mt(e,"templates","workflows"),n=Qh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=ws(n)?LL(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(i.length===0)return s;Yh(r,{recursive:!0});let o=PL(e),a=Et(),l=new Set(i.map(c=>`workflows/${c}`));for(let c of i){let d=`workflows/${c}`,u=Es(mt(n,c)),f=So(u),m=mt(r,c);if(!ws(m)){try{bo(m,u,{flag:"wx"}),s.copied.push(c)}catch{}o.files[d]=f;continue}let p=So(Es(m));if(p===f){o.files[d]=f;continue}let h=o.files[d];if(h!==void 0&&p===h)bo(m,u),o.files[d]=f,s.refreshed.push(c);else{let g=WL(r,c,a,u,f);s.preserved.push(c),s.shadowed.push(g)}}qL(e,o,l),FL(e,{version:a,files:o.files})}catch(i){if(t.swallow!==!0)throw i}return s}function md(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(hn(r));let n=Zh(t??process.cwd());return n!==null&&e.push(n),e.push(mt(zh(),ud)),e}function vo(t,e){let r=md(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let i of n){let o=mt(s,"templates","workflows",i);if(ws(o))return o}for(let s of n){let i=mt(Qh(),s);if(ws(i))return i}return null}var ud,zh,So,eg,pd=E(()=>{"use strict";Hn();ud=".lmctl",zh=()=>process.env.HOME??ML(),So=t=>RL("sha256").update(t).digest("hex");eg=".dist-manifest.json"});function rg(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
1943
+ </html>`}function S(t){return String(t??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function me(t,e){let r=t.map(s=>`<th>${S(s)}</th>`).join(""),n=e.length===0?`<tr><td colspan="${t.length}"><span class="muted">(empty)</span></td></tr>`:e.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function ue(t){return`<pre>${S(JSON.stringify(t,null,2))}</pre>`}var dd=E(()=>{"use strict"});import{createHash as RL}from"node:crypto";import{existsSync as ws,mkdirSync as Yh,readFileSync as Es,readdirSync as LL,renameSync as OL,statSync as $L,unlinkSync as CL,writeFileSync as bo}from"node:fs";import{homedir as ML}from"node:os";import{dirname as ud,isAbsolute as Vh,join as mt,relative as jL,resolve as hn}from"node:path";import{fileURLToPath as DL}from"node:url";function Zh(t){let e=hn(t);for(;;){let r=mt(e,fd);try{if($L(r).isDirectory())return r}catch{}let n=ud(e);if(n===e)return null;e=n}}function md(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return hn(e);let r=Zh(t);return r!==null?r:mt(zh(),fd)}function Qh(){return hn(ud(DL(import.meta.url)),"..","..","workflows")}function PL(t){let e=mt(t,eg);try{let r=JSON.parse(Es(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 FL(t,e){Yh(t,{recursive:!0});let r=mt(t,eg),n=`${r}.tmp-${process.pid}`;bo(n,`${JSON.stringify(e,null,2)}
1944
+ `,"utf8"),OL(n,r)}function UL(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string")return e}}function WL(t,e,r,n,s){let i=`${e}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=mt(t,a);try{return bo(l,n,{flag:"wx"}),a}catch(c){if(UL(c)!=="EEXIST")throw c;if(So(Es(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${e}`)}function BL(t,e){if(Vh(e)||ud(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=hn(t,"templates","workflows"),s=hn(t,"templates",e),i=jL(n,s);return i.length===0||i.startsWith("..")||Vh(i)||i.includes("/")||i.includes("\\")?null:s}function qL(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let i=BL(t,n);if(i===null){delete e.files[n];continue}if(!ws(i)){delete e.files[n];continue}try{if(So(Es(i))!==s)continue;CL(i),delete e.files[n]}catch{}}}function tg(t={}){let e=md(t.cwd),r=mt(e,"templates","workflows"),n=Qh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=ws(n)?LL(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(i.length===0)return s;Yh(r,{recursive:!0});let o=PL(e),a=Et(),l=new Set(i.map(c=>`workflows/${c}`));for(let c of i){let d=`workflows/${c}`,u=Es(mt(n,c)),f=So(u),m=mt(r,c);if(!ws(m)){try{bo(m,u,{flag:"wx"}),s.copied.push(c)}catch{}o.files[d]=f;continue}let p=So(Es(m));if(p===f){o.files[d]=f;continue}let h=o.files[d];if(h!==void 0&&p===h)bo(m,u),o.files[d]=f,s.refreshed.push(c);else{let g=WL(r,c,a,u,f);s.preserved.push(c),s.shadowed.push(g)}}qL(e,o,l),FL(e,{version:a,files:o.files})}catch(i){if(t.swallow!==!0)throw i}return s}function pd(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(hn(r));let n=Zh(t??process.cwd());return n!==null&&e.push(n),e.push(mt(zh(),fd)),e}function vo(t,e){let r=pd(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let i of n){let o=mt(s,"templates","workflows",i);if(ws(o))return o}for(let s of n){let i=mt(Qh(),s);if(ws(i))return i}return null}var fd,zh,So,eg,_d=E(()=>{"use strict";Hn();fd=".lmctl",zh=()=>process.env.HOME??ML(),So=t=>RL("sha256").update(t).digest("hex");eg=".dist-manifest.json"});function rg(t,e){if(e.query(`SELECT sa.id FROM step_artifact sa
1945
1945
  JOIN step s ON s.id = sa.step_id
1946
1946
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,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 i=s[0].id,o=e.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",t),a=e.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
1947
1947
  JOIN step s ON s.id = sa.step_id
1948
1948
  WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let A of a){let ee=l.get(A.step_id)??[];ee.push({kind:A.kind,id:A.id}),l.set(A.step_id,ee)}let c=o.map(A=>({id:A.id,state_name:A.state_name,outcome:A.outcome,duration_ms:A.started_at!==null&&A.ended_at!==null?Math.max(0,new Date(A.ended_at).getTime()-new Date(A.started_at).getTime()):null,artifacts:l.get(A.id)??[]})),d=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),u=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let A of u)try{let ee=JSON.parse(A.payload);typeof ee.elapsedMs=="number"&&ee.elapsedMs>0&&(f+=ee.elapsedMs)}catch{}let m=d.map(A=>({kind:A.kind,count:A.count,total_elapsed_ms:A.kind==="tool_result"?f:0})),p=c.filter(A=>A.outcome==="request_changes"),h=[...new Set(p.map(A=>A.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),T=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,b=T!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1949
1949
  WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,T,g,_):[],x=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1950
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],H=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",pe=e.getWorkflow(n.workflow_id),U=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,j={run_id:t,workflow_name:pe?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:U,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:b,token_totals:H};e.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(j)})}var ng=E(()=>{"use strict"});import{spawnSync as ig}from"node:child_process";function _d(t){return HL[t]??`no install hint; ensure '${t}' is on PATH`}function JL(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 sg(t){return ig("which",[t],{encoding:"utf8"}).status===0}function og(t){if(t===void 0)return null;for(let e of t.tools??[])if(!sg(e)){let r=_d(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!sg(e)){let s=_d(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=JL(e);if(r===null)continue;let n=ig(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:_d(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var HL,ag=E(()=>{"use strict";HL={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 XL,readdirSync as GL,readFileSync as KL}from"node:fs";import{join as lg}from"node:path";function VL(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(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1951
- `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function cg(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 dg(t,e){if(e.length===0)return null;let r=lg(t,"durable-memory");if(!XL(r))return null;let n;try{n=GL(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=KL(lg(r,i),"utf8");if(VL(o).some(l=>e.includes(l))){let l=cg(o,"name")??i.replace(".md",""),c=cg(o,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var ug=E(()=>{"use strict"});function yd(t){let e=t.trim().replace(YL,"").trim();for(let r=0;r<4;r+=1){let n=zL.exec(e);if(n===null)break;e=n[2].trim()}return e}function fg(t){let e=t.trim(),r=ZL.exec(e);if(r!==null)return r[2];let n=QL.exec(e);return n!==null?n[0]:null}function Ts(t,e){let r=t.split(`
1952
- `),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=yd(r[o]),l=hd.exec(a);if(l===null)continue;let c=l[1].trim();if(gd.test(c))continue;let d=fg(c);d!==null&&(n=d,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=yd(r[o]),l=hd.exec(a);if(l===null)break;let c=gd.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:n,evidence:i}}function mg(t){let e=t.split(`
1953
- `),r=null;for(let n=0;n<e.length;n+=1){let s=yd(e[n]),i=hd.exec(s);if(i===null)continue;let o=i[1].trim();if(gd.test(o))continue;let a=fg(o);if(a===null||!zr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var YL,zL,hd,gd,ZL,QL,wd=E(()=>{"use strict";Zn();YL=/^#{1,6}\s+/,zL=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,hd=/^STANCE:\s+(.+)$/,gd=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,ZL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,QL=/^[A-Za-z0-9_-]+/});function pg(t,e,r){return n=>{let s=r(),i=Date.now(),o=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let d=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var _g=E(()=>{"use strict"});import{readFileSync as eO}from"node:fs";import{dirname as tO,join as rO}from"node:path";import{fileURLToPath as nO}from"node:url";function oO(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function dO(t){let e=[],r=[];for(let n of t)sO.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function uO(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&iO.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let i of e)if(n===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function fO(t,e){if(t.length===0)return{matched:!1};let r=dO(t);for(let n of r){let s=uO(n,e);if(s.matched)return s}return{matched:!1}}function Ed(t){return fO(t,cO)}function mO(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 Td(t){return mO(t).split(" ").filter(e=>e.length>0)}var sO,iO,aO,lO,cO,hg=E(()=>{"use strict";sO=new Set(["&&","||",";","|",">",">>","<","<<"]),iO=/^[A-Za-z_][A-Za-z0-9_]*=/;aO=tO(nO(import.meta.url)),lO=JSON.parse(eO(rO(aO,"side_effect_classifier.json"),"utf-8")),cO=oO(lO)});function ko(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 gg(t,e){try{return await Dr(bd(t)??t,ko(e))===!0}catch{return!1}}async function Io(t,e){try{return await Dr(bd(t)??t,ko(e))}catch{return}}async function yg(t,e){if(typeof t!="string")return t;let r=bd(t);if(r===null)return t;try{return await Dr(r,ko(e))}catch{return}}async function wg(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let i of r){let o=i.index??0;n+=t.slice(s,o);let a=i[1]?.trim()??"";try{n+=pO(await Dr(a,ko(e)))}catch{n+=""}s=o+i[0].length}return n+=t.slice(s),n}function bd(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function pO(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var bs=E(()=>{"use strict";ms()});import{existsSync as Eg,readdirSync as Tg,readFileSync as _O,statSync as bg}from"node:fs";import{join as xo}from"node:path";function Sg(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function q(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function X(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 nt(t,e,r,n,s={}){let i=$(),o=q(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Ss}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=zr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:ai,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:o.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:hO(s.agent_output??n),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function hO(t){return t.length>8e3?`${t.slice(0,8e3)}
1954
- \u2026[truncated ${t.length-8e3} chars]`:t}function G(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function Y(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 vg(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 i=mr(t.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ke(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return r;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=mr(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=mr(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=gO(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return wg(n,e)}function gO(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 mr(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 vs(t){let{context:e,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=pg(e.dal,e.run_id,()=>i),c=Sd(e,r),d={violation:null},u=y=>{if(l(y),d.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let T=Td(y.summary),b=Ed(T);b.matched&&!c&&(d.violation={summary:y.summary,kind:b.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=y=>{u(y),yO(y,(T,b)=>{m+=T,p+=b})},g=await Di({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:qe(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),wO(e.project,e.dal,f);let _=d.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&vd(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function yO(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=No(s.input_tokens),a=No(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=r.usage;if(i!==void 0){let o=No(i.input_tokens),a=No(i.output_tokens);(o>0||a>0)&&e(o,a)}}function No(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Gt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,i=q(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 vs({context:t,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function gn(t,e,r,n,s,i,o,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 d=q(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Wm(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ke(r.prompt_template,t,e):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1950
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],H=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",pe=e.getWorkflow(n.workflow_id),U=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,j={run_id:t,workflow_name:pe?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:U,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:b,token_totals:H};e.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(j)})}var ng=E(()=>{"use strict"});import{spawnSync as ig}from"node:child_process";function hd(t){return HL[t]??`no install hint; ensure '${t}' is on PATH`}function JL(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 sg(t){return ig("which",[t],{encoding:"utf8"}).status===0}function og(t){if(t===void 0)return null;for(let e of t.tools??[])if(!sg(e)){let r=hd(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!sg(e)){let s=hd(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=JL(e);if(r===null)continue;let n=ig(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:hd(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var HL,ag=E(()=>{"use strict";HL={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 XL,readdirSync as GL,readFileSync as KL}from"node:fs";import{join as lg}from"node:path";function VL(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(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1951
+ `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function cg(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 dg(t,e){if(e.length===0)return null;let r=lg(t,"durable-memory");if(!XL(r))return null;let n;try{n=GL(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=KL(lg(r,i),"utf8");if(VL(o).some(l=>e.includes(l))){let l=cg(o,"name")??i.replace(".md",""),c=cg(o,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var ug=E(()=>{"use strict"});function wd(t){let e=t.trim().replace(YL,"").trim();for(let r=0;r<4;r+=1){let n=zL.exec(e);if(n===null)break;e=n[2].trim()}return e}function fg(t){let e=t.trim(),r=ZL.exec(e);if(r!==null)return r[2];let n=QL.exec(e);return n!==null?n[0]:null}function Ts(t,e){let r=t.split(`
1952
+ `),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=wd(r[o]),l=gd.exec(a);if(l===null)continue;let c=l[1].trim();if(yd.test(c))continue;let d=fg(c);d!==null&&(n=d,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=wd(r[o]),l=gd.exec(a);if(l===null)break;let c=yd.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:n,evidence:i}}function mg(t){let e=t.split(`
1953
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=wd(e[n]),i=gd.exec(s);if(i===null)continue;let o=i[1].trim();if(yd.test(o))continue;let a=fg(o);if(a===null||!zr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var YL,zL,gd,yd,ZL,QL,Ed=E(()=>{"use strict";Zn();YL=/^#{1,6}\s+/,zL=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,gd=/^STANCE:\s+(.+)$/,yd=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,ZL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,QL=/^[A-Za-z0-9_-]+/});function pg(t,e,r){return n=>{let s=r(),i=Date.now(),o=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let d=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var _g=E(()=>{"use strict"});import{readFileSync as eO}from"node:fs";import{dirname as tO,join as rO}from"node:path";import{fileURLToPath as nO}from"node:url";function oO(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function dO(t){let e=[],r=[];for(let n of t)sO.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function uO(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&iO.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let i of e)if(n===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function fO(t,e){if(t.length===0)return{matched:!1};let r=dO(t);for(let n of r){let s=uO(n,e);if(s.matched)return s}return{matched:!1}}function Td(t){return fO(t,cO)}function mO(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 bd(t){return mO(t).split(" ").filter(e=>e.length>0)}var sO,iO,aO,lO,cO,hg=E(()=>{"use strict";sO=new Set(["&&","||",";","|",">",">>","<","<<"]),iO=/^[A-Za-z_][A-Za-z0-9_]*=/;aO=tO(nO(import.meta.url)),lO=JSON.parse(eO(rO(aO,"side_effect_classifier.json"),"utf-8")),cO=oO(lO)});function ko(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 gg(t,e){try{return await Dr(Sd(t)??t,ko(e))===!0}catch{return!1}}async function Io(t,e){try{return await Dr(Sd(t)??t,ko(e))}catch{return}}async function yg(t,e){if(typeof t!="string")return t;let r=Sd(t);if(r===null)return t;try{return await Dr(r,ko(e))}catch{return}}async function wg(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let i of r){let o=i.index??0;n+=t.slice(s,o);let a=i[1]?.trim()??"";try{n+=pO(await Dr(a,ko(e)))}catch{n+=""}s=o+i[0].length}return n+=t.slice(s),n}function Sd(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function pO(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var bs=E(()=>{"use strict";ms()});import{existsSync as Eg,readdirSync as Tg,readFileSync as _O,statSync as bg}from"node:fs";import{join as xo}from"node:path";function Sg(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function q(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function X(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 nt(t,e,r,n,s={}){let i=$(),o=q(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${Ss}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=zr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:ai,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:o.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:hO(s.agent_output??n),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function hO(t){return t.length>8e3?`${t.slice(0,8e3)}
1954
+ \u2026[truncated ${t.length-8e3} chars]`:t}function G(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function Y(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 vg(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 i=mr(t.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ke(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return r;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=mr(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=mr(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=gO(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return wg(n,e)}function gO(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 mr(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 vs(t){let{context:e,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=pg(e.dal,e.run_id,()=>i),c=vd(e,r),d={violation:null},u=y=>{if(l(y),d.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let T=bd(y.summary),b=Td(T);b.matched&&!c&&(d.violation={summary:y.summary,kind:b.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=y=>{u(y),yO(y,(T,b)=>{m+=T,p+=b})},g=await Di({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:qe(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),wO(e.project,e.dal,f);let _=d.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&kd(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function yO(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=No(s.input_tokens),a=No(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=r.usage;if(i!==void 0){let o=No(i.input_tokens),a=No(i.output_tokens);(o>0||a>0)&&e(o,a)}}function No(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Gt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,i=q(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 vs({context:t,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function gn(t,e,r,n,s,i,o,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 d=q(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Wm(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ke(r.prompt_template,t,e):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1955
1955
 
1956
- `);try{let p=await vs({context:t,stateId:e,member:c,prompt:m,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id: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(d.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:d.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!i)return t.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=Ts(p.text,s);return t.dal.finishStep(d.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 ve?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(d.id,null,h),{outcome:null,text:"",status_detail:h}}}function yn(t,e){return(e?.length??0)>0?dg(t.project.local_path,e):null}function kg(t){return Ed(Td(t))}function Sd(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1956
+ `);try{let p=await vs({context:t,stateId:e,member:c,prompt:m,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id: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(d.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:d.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!i)return t.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=Ts(p.text,s);return t.dal.finishStep(d.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 ve?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(d.id,null,h),{outcome:null,text:"",status_detail:h}}}function yn(t,e){return(e?.length??0)>0?dg(t.project.local_path,e):null}function kg(t){return Td(bd(t))}function vd(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1957
1957
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1958
- ORDER BY started_at DESC, id DESC LIMIT 1`,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 vd(t,e){if(!Eg(t))return!1;let r=xo(t,"durable-memory");function n(s){let i;try{i=Tg(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=xo(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(bg(a).mtime>e)return!0}catch{}}return!1}return n(t)}function wO(t,e,r){let n=xo(t.local_path,"durable-memory");if(!Eg(n))return;let s;try{s=Tg(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=xo(n,i),a;try{a=bg(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=_O(o,"utf8")}catch{continue}let c=TO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
1959
- `),M({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function TO(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),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!EO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var Ss,EO,Je=E(()=>{"use strict";Qe();fn();Pi();ug();wd();Zn();_g();ue();hg();bs();Ss="__paused__:";EO=new Set(["user","feedback","project","reference"])});import{spawnSync as Ig}from"node:child_process";function bO(t,e){let r=t.stateId,n=t.displayName,s=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.project.local_path,o=Ig("git",["diff","--quiet"],{cwd:i}).status!==0,a=Ig("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),G(t,r,n,Wc),{kind:"terminal",terminal:Y(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),G(t,r,n,"clean"),X(t.workflow,e.next)}var Ng,xg=E(()=>{"use strict";Je();Ng={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=>bO(t,t.state)}});async function SO(t,e){let r=t.stateId,n=t.displayName,s=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let i of e.branches)if(await gg(i.when,t))return t.dal.finishStep(s.id,"matched",i.when),G(t,r,n,"matched"),X(t.workflow,i.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),G(t,r,n,"no_match"),e.default_next!==void 0?X(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":Y(t.workflow)}}var Ag,Rg=E(()=>{"use strict";Je();bs();Ag={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=>SO(t,t.state)}});async function vO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,i=e.researchers??[],o=yn(t,e.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await gn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
1958
+ 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 kd(t,e){if(!Eg(t))return!1;let r=xo(t,"durable-memory");function n(s){let i;try{i=Tg(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=xo(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(bg(a).mtime>e)return!0}catch{}}return!1}return n(t)}function wO(t,e,r){let n=xo(t.local_path,"durable-memory");if(!Eg(n))return;let s;try{s=Tg(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=xo(n,i),a;try{a=bg(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=_O(o,"utf8")}catch{continue}let c=TO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
1959
+ `),C({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function TO(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),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!EO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var Ss,EO,Je=E(()=>{"use strict";Qe();fn();Pi();ug();Ed();Zn();_g();de();hg();bs();Ss="__paused__:";EO=new Set(["user","feedback","project","reference"])});import{spawnSync as Ig}from"node:child_process";function bO(t,e){let r=t.stateId,n=t.displayName,s=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.project.local_path,o=Ig("git",["diff","--quiet"],{cwd:i}).status!==0,a=Ig("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),G(t,r,n,Bc),{kind:"terminal",terminal:Y(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),G(t,r,n,"clean"),X(t.workflow,e.next)}var Ng,xg=E(()=>{"use strict";Je();Ng={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=>bO(t,t.state)}});async function SO(t,e){let r=t.stateId,n=t.displayName,s=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let i of e.branches)if(await gg(i.when,t))return t.dal.finishStep(s.id,"matched",i.when),G(t,r,n,"matched"),X(t.workflow,i.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),G(t,r,n,"no_match"),e.default_next!==void 0?X(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":Y(t.workflow)}}var Ag,Rg=E(()=>{"use strict";Je();bs();Ag={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=>SO(t,t.state)}});async function vO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,i=e.researchers??[],o=yn(t,e.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await gn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
1960
1960
  ${m}`:null).filter(m=>m!==null).join(`
1961
1961
 
1962
1962
  `),c=`${n}:consolidator`,d=await gn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=q(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,d.outcome===null||d.outcome==="error"){t.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&G(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?X(t.workflow,m):{kind:"terminal",terminal:Y(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:d.text}),t.dal.finishStep(u.id,"ok","consolidated"),G(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Gt(t,n,m,e.write_back_durable_memory)}return X(t.workflow,e.outcomes.ok)}var Lg,Og=E(()=>{"use strict";Je();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=>vO(t,t.state)}});async function kO(t,e){let r=t.stateId,n=t.displayName,s=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.progress_step_id;t.progress_step_id=s.id;try{let o=await Io(e.items_from,t),a=AO(o);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?X(t.workflow,f):{kind:"terminal",terminal:Y(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await NO(t,e,s.id,a,l):await IO(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 d=c.some(f=>f.outcome===null||f.outcome==="__failure__"),u=d?"any_failed":"all_ok";if(t.dal.finishStep(s.id,u,JSON.stringify({iterations:c,count:a.length})),G(t,r,n,u),d){let f=e.outcomes.any_failed;return f!==void 0?X(t.workflow,f):{kind:"terminal",terminal:Y(t.workflow)}}return X(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=i}}async function IO(t,e,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await Cg(t,e,r,n[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return i}async function NO(t,e,r,n,s){let i=new Array(n.length),o=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;o<n.length&&s.routed===null;){let l=o;o+=1,i[l]=await Cg(t,e,r,n[l],l,s)}});return await Promise.all(a),i}async function Cg(t,e,r,n,s,i){let o=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=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let d=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":xO(t.outcomes[a]);return t.emit_progress?.({kind:d===null||d==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:d}}),{index:s,value:n,outcome:d}}function xO(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function AO(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 $g,Mg=E(()=>{"use strict";Je();bs();$g={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=>kO(t,t.state)}});async function RO(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,i=t.membersByAlias.get(e.agent.alias);if(i===void 0||i.sessionid===null){let f=q(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:Y(t.workflow)}}let o=yn(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 Gt(t,n,i,e.write_back_durable_memory),X(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}`),G(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?X(t.workflow,m):{kind:"terminal",terminal:Y(t.workflow)}}let f=a.last_operator_input??"";try{let m=await vs({context:t,stateId:n,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return 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:Y(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"),G(t,r,n,"done"),e.write_back_durable_memory&&await Gt(t,n,i,e.write_back_durable_memory),X(t.workflow,e.outcomes.done)):(jg({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof ve?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(t.workflow)}}}return{kind:"paused"}}let l=q(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"}),d=await Ke(e.agent.initial_prompt_template,t,n),u=o?`${o}
@@ -1968,19 +1968,19 @@ ${d}`:d;try{let f=await vs({context:t,stateId:n,member:i,prompt:u,stepId:l.id,ti
1968
1968
  AND s.state_name LIKE ?
1969
1969
  AND sa.content IS NOT NULL
1970
1970
  ORDER BY sa.id DESC
1971
- LIMIT 1`,t.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:Ao(i[0].content)}function Ao(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function o$(t,e){let r=Hg(zO.lexer(t,{gfm:!0})),n=new qO({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:JO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new pt("")]:r}]});return XO.toBuffer(n)}function Hg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new pt({heading:m$(r.depth),children:_r(pr(r))}));break;case"paragraph":e.push(new pt({children:_r(pr(r))}));break;case"text":e.push(new pt({children:pr(r).length===0?[new _t(r.text)]:_r(pr(r))}));break;case"blockquote":e.push(...Hg(pr(r)).map(n=>n instanceof pt?n:new pt({children:[new _t(r.text)]})));break;case"list":d$(r)&&e.push(...a$(r));break;case"table":u$(r)&&e.push(l$(r));break;case"code":f$(r)&&e.push(...c$(r));break;case"hr":e.push(new pt(""));break;case"html":r.text.trim().length>0&&e.push(new pt({children:[new _t(r.text)]}));break;default:break}return e}function _r(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new _t({text:n.text,...kd(e)}));break;case"strong":r.push(..._r(pr(n),{...e,bold:!0}));break;case"em":r.push(..._r(pr(n),{...e,italics:!0}));break;case"codespan":r.push(new _t({text:n.text,...kd({...e,code:!0})}));break;case"link":r.push(new HO({link:n.href,children:_r(pr(n),{...e})}));break;case"br":r.push(new _t({text:"",break:1}));break;case"image":r.push(new _t({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new _t({text:n.text,strike:!0}));break;default:r.push(new _t({text:n.raw,...kd(e)}));break}return r.length===0?[new _t("")]:r}function kd(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function a$(t){return t.items.map(e=>new pt({children:_r(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 l$(t){let e=[t.header,...t.rows].map(r=>new VO({children:r.map(n=>new KO({children:[new pt({children:_r(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new GO({width:{size:100,type:YO.PERCENTAGE},rows:e})}function c$(t){return t.text.split(`
1971
+ LIMIT 1`,t.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:Ao(i[0].content)}function Ao(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function o$(t,e){let r=Hg(zO.lexer(t,{gfm:!0})),n=new qO({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:JO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new pt("")]:r}]});return XO.toBuffer(n)}function Hg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new pt({heading:m$(r.depth),children:_r(pr(r))}));break;case"paragraph":e.push(new pt({children:_r(pr(r))}));break;case"text":e.push(new pt({children:pr(r).length===0?[new _t(r.text)]:_r(pr(r))}));break;case"blockquote":e.push(...Hg(pr(r)).map(n=>n instanceof pt?n:new pt({children:[new _t(r.text)]})));break;case"list":d$(r)&&e.push(...a$(r));break;case"table":u$(r)&&e.push(l$(r));break;case"code":f$(r)&&e.push(...c$(r));break;case"hr":e.push(new pt(""));break;case"html":r.text.trim().length>0&&e.push(new pt({children:[new _t(r.text)]}));break;default:break}return e}function _r(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new _t({text:n.text,...Id(e)}));break;case"strong":r.push(..._r(pr(n),{...e,bold:!0}));break;case"em":r.push(..._r(pr(n),{...e,italics:!0}));break;case"codespan":r.push(new _t({text:n.text,...Id({...e,code:!0})}));break;case"link":r.push(new HO({link:n.href,children:_r(pr(n),{...e})}));break;case"br":r.push(new _t({text:"",break:1}));break;case"image":r.push(new _t({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new _t({text:n.text,strike:!0}));break;default:r.push(new _t({text:n.raw,...Id(e)}));break}return r.length===0?[new _t("")]:r}function Id(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function a$(t){return t.items.map(e=>new pt({children:_r(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 l$(t){let e=[t.header,...t.rows].map(r=>new VO({children:r.map(n=>new KO({children:[new pt({children:_r(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new GO({width:{size:100,type:YO.PERCENTAGE},rows:e})}function c$(t){return t.text.split(`
1972
1972
  `).map(r=>new pt({children:[new _t({text:r.length===0?" ":r,font:"Courier New"})]}))}function pr(t){let e=t.tokens;return Array.isArray(e)?e:[]}function d$(t){return t.type==="list"&&Array.isArray(t.items)}function u$(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function f$(t){return t.type==="code"&&typeof t.text=="string"}function m$(t){switch(t){case 1:return wn.HEADING_1;case 2:return wn.HEADING_2;case 3:return wn.HEADING_3;case 4:return wn.HEADING_4;case 5:return wn.HEADING_5;default:return wn.HEADING_6}}var qg,Jg=E(()=>{"use strict";Je();qg={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=>ZO(t,t.state)}});import{createHash as p$}from"node:crypto";import{existsSync as _$,mkdirSync as h$,readFileSync as Xg,statSync as g$}from"node:fs";import{dirname as y$,isAbsolute as Gg,normalize as w$,resolve as Is}from"node:path";import{marked as E$}from"marked";import T$ from"write-excel-file/node";async function b$(t,e){let r=t.stateId,n=t.displayName,s=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let i=await S$(t,e),o=v$(e.input_format),a=await k$(t,e),l=await I$(t,e.title),c=o==="markdown"?M$(i):R$(i);await j$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let d=g$(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=p$("sha256").update(Xg(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),G(t,r,n,{output_path:a,path:a,bytes:d}),X(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),G(t,r,n,{error:o}),X(t.workflow,e.outcomes?.error??"@terminal:error")}}async function S$(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Ke(e.source,t,t.stateId)).trim(),n=x$(t.project.local_path,r);if(n!==null){if(!_$(n))throw new Error(`source file not found: ${n}`);return Xg(n,"utf8")}return r}function v$(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function k$(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ke(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=N$(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function I$(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Ke(e,t,t.stateId)).trim();return r.length===0?null:r}function N$(t,e){let r=Is(t);return w$(Gg(e)?Is(e):Is(r,e))}function x$(t,e){return A$(e)?Gg(e)?Is(e):Is(t,e):null}function A$(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function R$(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(!Ro(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>L$(r,n))}function L$(t,e){if(!Ro(t))throw new Error(`sheets[${e}] must be an object`);let r=O$(t.headers,`sheets[${e}].headers`),n=$$(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:C$(t.styles)}}function O$(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 $$(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,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${i}] must be string, number, boolean, or null`)})})}function C$(t){if(!Ro(t)||!Ro(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 M$(t){let e=E$.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(q$(s)){n=s.text;continue}H$(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),n=null)}return r}async function j$(t){h$(y$(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:U$(n.name,e),data:D$(n),columns:F$(n)}));await T$(r).toFile(t.outputPath)}function D$(t){let e=[];if(t.headers.length>0){let r=B$(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(P$));return e.length===0?[[{}]]:e}function P$(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 F$(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(o=>o[n-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));r.push({width:i})}return r}function U$(t,e){let r=W$(t),n=r,s=2;for(;e.has(n.toLowerCase());){let i=` ${s}`;n=`${r.slice(0,31-i.length)}${i}`,s+=1}return e.add(n.toLowerCase()),n}function W$(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function B$(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 q$(t){return t.type==="heading"&&typeof t.text=="string"}function H$(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Ro(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Kg,Vg=E(()=>{"use strict";Je();Kg={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=>b$(t,t.state)}});import{spawnSync as J$}from"node:child_process";async function G$(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(J$("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=q(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}`),G(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?X(t.workflow,h):{kind:"terminal",terminal:Y(t.workflow)}}let i=yn(t,e.durable_memory_tags),o=e.reviewers??[],a=null,l=o.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await gn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1973
1973
  ${a}`:null,c,l,s,e.writes_to_project_path===!0,i);if(l){let g=mg(p.text);if(g!==null){let _=q(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=q(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(o.length===0){if(e.outcomes_from_stance!==void 0){let y=Object.keys(e.outcomes_from_stance),T=Ts(p.text,y);if(T.outcome===null){let I=q(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(I.id,null,`unhandled_stance:${T.reason}`),{kind:"escalate",token:"",reason:`no_stance:${T.reason}`}}let b=q(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(b.id,T.outcome,"outcomes_from_stance"),G(t,r,n,T.outcome),X(t.workflow,e.outcomes_from_stance[T.outcome])}let g=Ts(p.text,X$);if(g.outcome!==null){let y=q(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(y.id,g.outcome,"default_failure_stance"),G(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=q(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),G(t,r,n,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await Gt(t,n,y,e.write_back_durable_memory)}return X(t.workflow,e.outcomes.approve)}let h=await Promise.all(o.map(g=>gn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1974
1974
  ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=q(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),G(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await Gt(t,n,_,e.write_back_durable_memory)}return X(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1975
1975
 
1976
- `),e.loop_feedback_artifact!==void 0){let g=q(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 d=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,"max_loops_exceeded",`loops=${e.max_loops}`),G(t,r,n,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?X(t.workflow,u):{kind:"terminal",terminal:Y(t.workflow)}}var X$,Yg,zg=E(()=>{"use strict";wd();Je();X$=["blocked","failed","aborted"],Yg={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=>G$(t,t.state)}});import{spawnSync as K$}from"node:child_process";async function V$(t,e){let r=t.stateId,n=t.displayName,s=await Ke(e.command,t,n),i=Sd(t,n),o=kg(s);if(o.matched&&!i){let h=q(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:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=K$("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(d.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Y(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&vd(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:d.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:d.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(d.id,m,`exit=${c.status}`),G(t,r,n,m),X(t.workflow,p))}var Zg,Qg=E(()=>{"use strict";Je();Zg={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=>V$(t,t.state)}});async function Y$(t,e){let r=t.stateId,n=t.displayName,s=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:Y(t.workflow)};let o=dt(i.definition),a=await z$(t,e),l=await t.runChildWorkflow(i,o,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Y(t.workflow)};G(t,r,n,Z$(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=e.outcomes[c]??e.outcomes.default;return d===void 0?{kind:"terminal",terminal:Y(t.workflow)}:X(t.workflow,d)}async function z$(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let i=await yg(s,t);r[n]=i===s?await Io(s,t):i}return r}function Z$(t,e,r){let n={};for(let s of r)n[s.name]=Q$(t,e,s);return n}function Q$(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 i=eC(s,r.source_field);if(i.found)return i.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function eC(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 ey,ty=E(()=>{"use strict";_s();Je();bs();ey={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=>Y$(t,t.state)}});function tC(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,i=q(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),G(t,r,n,s),{kind:"terminal",terminal:s}}var ry,ny=E(()=>{"use strict";Je();ry={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=>tC(t,t.state)}});async function rC(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 i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=nC(t.cursor),a=i.filter(sC).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function nC(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function sC(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 sy,iy=E(()=>{"use strict";sy={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=>rC(t)}});async function iC(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 oy,ay=E(()=>{"use strict";oy={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=>iC(t)}});function ly(t){t.register(Ng),t.register(Yg),t.register(Lg),t.register(Dg),t.register(Fg),t.register(qg),t.register(Kg),t.register(Zg),t.register(Ag),t.register($g),t.register(ey),t.register(ry),t.register(oy),t.register(sy)}var cy=E(()=>{"use strict";xg();Rg();Og();Mg();Pg();Ug();Jg();Vg();zg();Qg();ty();ny();iy();ay()});function dy(){return Lo===null&&(Lo=new Id,ly(Lo)),Lo}var oC,Id,Lo,uy=E(()=>{"use strict";cy();oC={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"},Id=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:oC[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Lo=null});async function py(t){wy(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=lC(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=Ns(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=n.requires,l=og(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Ns(n)){let m=Nd({dal:t.dal,workflow:$o(n),job:t.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:mr(t.job.payload)??{},team_id:t.team.id}),p=await hy(n,m,o.current_state??n.entry_step_id);return my(t.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=Nd({dal:t.dal,workflow:n,job:t.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:mr(t.job.payload)??{},team_id:t.team.id}),f=await _y(u,o.current_state??n.start_at);return my(t.dal,r.id,o.id,n.name,f),f}function my(t,e,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=t.getRun(r);if(d!==null){let u=t.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===i&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){o=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=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=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function Nd(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 i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await xd(e,r,n,s?.display_name??r)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(r,n,s)=>{wy(n);let i=Ns(n)?n.entry_step_id:n.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=Nd({dal:t.dal,workflow:Ns(n)?$o(n):n,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Ns(n)?hy(n,a,o.current_state??n.entry_step_id):_y(a,o.current_state??n.start_at)}};return e}async function _y(t,e){let r=e;if(r.startsWith(Ss))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 Kt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let i=t.workflow.states[r];if(i===void 0){let l=Oo(t,Y(t.workflow));if(l.kind==="paused")return De(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),De(t);if(l.kind==="terminal")return Kt(t,l.terminal);r=l.state;continue}let o,a=yy(t,r);if(a!==null){let l=q(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),G(t,r,r,a),a===zn)return Kt(t,fl);let c=i.outcomes?.[a];o=c!==void 0?X(t.workflow,c):nt(t,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await xd(t,r,i);if(o.kind==="paused")return De(t);if(o.kind==="escalate")return nt(t,{id:r,name:r,type:i.type},o.token,o.reason),De(t);if(o.kind==="terminal"){let l=Oo(t,o.terminal);if(l.kind==="paused")return De(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:i.type},l.token,l.reason),De(t);if(l.kind==="terminal")return Kt(t,l.terminal);r=l.state;continue}r=o.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=Oo(t,Y(t.workflow));return n.kind==="terminal"?Kt(t,n.terminal):Kt(t,Y(t.workflow))}async function hy(t,e,r){let n=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=n.get(i);if(a===void 0)return nt(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),De(e);let l=yy(e,a.id);if(l!==null){let m=q(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),G(e,a.id,a.name,l),l===zn)return Kt(e,fl);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 nt(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}),De(e);i=h;continue}let c=await aC(e,t,a);if(c.kind==="paused")return De(e);let d=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),De(e);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=$o(t,a);try{let p=Oo(e,u);if(p.kind==="paused")return De(e);if(p.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),De(e);if(p.kind==="terminal")return Kt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),De(e);i=h.id;continue}finally{e.workflow=m}}if(zr(u))return nt(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),De(e);let f=t.connections[a.id]?.[u]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),De(e);i=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Kt(e,"aborted")}async function aC(t,e,r){let n=gy(e,r),s=t.workflow;t.workflow=$o(e,r);try{return await xd(t,r.id,n,r.name)}finally{t.workflow=s}}function gy(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:e.type,...r}}}async function xd(t,e,r,n){let s=dy().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?uC(t,s):void 0,t.progress_step_id=null;try{return await s.execute(Sg(t,e,r,n??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function lC(t,e){try{let r=JSON.parse(t);if(dC(r)&&r.definition_schema_version===3)return xt.parse(r)}catch{return e}return e}function Ns(t){return t.definition_schema_version===3}function $o(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=gy(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:cC(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 cC(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function dC(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function uC(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 i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Kt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{rg(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function De(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function yy(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 i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function Oo(t,e){if(!fC(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&&mC(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function fC(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function mC(t,e,r){let n=pC(t),s=r.capture_evidence&&n!==null?_C(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 pC(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 _C(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 wy(t){if(!fy.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${fy.join(", ")}`)}var fy,Ey=E(()=>{"use strict";mn();ng();ag();Je();uy();Zn();fy=[1,2,3]});import{readFileSync as hC,readdirSync as gC}from"node:fs";import{basename as yC,join as wC,resolve as EC}from"node:path";function Sy(t={}){let e=EC(t.workflowsDir??"workflows"),r=gC(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=>TC(wC(e,n)))}}function TC(t){let e=yC(t);try{let r=hC(t,"utf8"),n=dt(r);return Iy(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:Ny(r)}}}function vy(t,e){try{let r=dt(e);return Iy(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:Ny(r)}}}function ky(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=t.rows.filter(i=>i.status==="PASS").length,n=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1976
+ `),e.loop_feedback_artifact!==void 0){let g=q(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 d=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,"max_loops_exceeded",`loops=${e.max_loops}`),G(t,r,n,"max_loops_exceeded");let u=e.outcomes.max_loops_exceeded;return u!==void 0?X(t.workflow,u):{kind:"terminal",terminal:Y(t.workflow)}}var X$,Yg,zg=E(()=>{"use strict";Ed();Je();X$=["blocked","failed","aborted"],Yg={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=>G$(t,t.state)}});import{spawnSync as K$}from"node:child_process";async function V$(t,e){let r=t.stateId,n=t.displayName,s=await Ke(e.command,t,n),i=vd(t,n),o=kg(s);if(o.matched&&!i){let h=q(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:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=K$("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(d.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Y(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&kd(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:d.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:d.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(d.id,m,`exit=${c.status}`),G(t,r,n,m),X(t.workflow,p))}var Zg,Qg=E(()=>{"use strict";Je();Zg={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=>V$(t,t.state)}});async function Y$(t,e){let r=t.stateId,n=t.displayName,s=q(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:Y(t.workflow)};let o=dt(i.definition),a=await z$(t,e),l=await t.runChildWorkflow(i,o,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Y(t.workflow)};G(t,r,n,Z$(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=e.outcomes[c]??e.outcomes.default;return d===void 0?{kind:"terminal",terminal:Y(t.workflow)}:X(t.workflow,d)}async function z$(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let i=await yg(s,t);r[n]=i===s?await Io(s,t):i}return r}function Z$(t,e,r){let n={};for(let s of r)n[s.name]=Q$(t,e,s);return n}function Q$(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 i=eC(s,r.source_field);if(i.found)return i.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function eC(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 ey,ty=E(()=>{"use strict";_s();Je();bs();ey={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=>Y$(t,t.state)}});function tC(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,i=q(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),G(t,r,n,s),{kind:"terminal",terminal:s}}var ry,ny=E(()=>{"use strict";Je();ry={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=>tC(t,t.state)}});async function rC(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 i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=nC(t.cursor),a=i.filter(sC).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function nC(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function sC(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 sy,iy=E(()=>{"use strict";sy={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=>rC(t)}});async function iC(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 oy,ay=E(()=>{"use strict";oy={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=>iC(t)}});function ly(t){t.register(Ng),t.register(Yg),t.register(Lg),t.register(Dg),t.register(Fg),t.register(qg),t.register(Kg),t.register(Zg),t.register(Ag),t.register($g),t.register(ey),t.register(ry),t.register(oy),t.register(sy)}var cy=E(()=>{"use strict";xg();Rg();Og();Mg();Pg();Ug();Jg();Vg();zg();Qg();ty();ny();iy();ay()});function dy(){return Lo===null&&(Lo=new Nd,ly(Lo)),Lo}var oC,Nd,Lo,uy=E(()=>{"use strict";cy();oC={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"},Nd=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:oC[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Lo=null});async function py(t){wy(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=lC(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=Ns(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=n.requires,l=og(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(Ns(n)){let m=xd({dal:t.dal,workflow:$o(n),job:t.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:mr(t.job.payload)??{},team_id:t.team.id}),p=await hy(n,m,o.current_state??n.entry_step_id);return my(t.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},u=xd({dal:t.dal,workflow:n,job:t.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:mr(t.job.payload)??{},team_id:t.team.id}),f=await _y(u,o.current_state??n.start_at);return my(t.dal,r.id,o.id,n.name,f),f}function my(t,e,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=t.getRun(r);if(d!==null){let u=t.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===i&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){o=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=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=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function xd(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 i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await Ad(e,r,n,s?.display_name??r)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(r,n,s)=>{wy(n);let i=Ns(n)?n.entry_step_id:n.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=xd({dal:t.dal,workflow:Ns(n)?$o(n):n,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return Ns(n)?hy(n,a,o.current_state??n.entry_step_id):_y(a,o.current_state??n.start_at)}};return e}async function _y(t,e){let r=e;if(r.startsWith(Ss))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 Kt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let i=t.workflow.states[r];if(i===void 0){let l=Oo(t,Y(t.workflow));if(l.kind==="paused")return De(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),De(t);if(l.kind==="terminal")return Kt(t,l.terminal);r=l.state;continue}let o,a=yy(t,r);if(a!==null){let l=q(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),G(t,r,r,a),a===zn)return Kt(t,ml);let c=i.outcomes?.[a];o=c!==void 0?X(t.workflow,c):nt(t,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await Ad(t,r,i);if(o.kind==="paused")return De(t);if(o.kind==="escalate")return nt(t,{id:r,name:r,type:i.type},o.token,o.reason),De(t);if(o.kind==="terminal"){let l=Oo(t,o.terminal);if(l.kind==="paused")return De(t);if(l.kind==="escalate")return nt(t,{id:r,name:r,type:i.type},l.token,l.reason),De(t);if(l.kind==="terminal")return Kt(t,l.terminal);r=l.state;continue}r=o.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=Oo(t,Y(t.workflow));return n.kind==="terminal"?Kt(t,n.terminal):Kt(t,Y(t.workflow))}async function hy(t,e,r){let n=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=n.get(i);if(a===void 0)return nt(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),De(e);let l=yy(e,a.id);if(l!==null){let m=q(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),G(e,a.id,a.name,l),l===zn)return Kt(e,ml);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 nt(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}),De(e);i=h;continue}let c=await aC(e,t,a);if(c.kind==="paused")return De(e);let d=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),De(e);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=$o(t,a);try{let p=Oo(e,u);if(p.kind==="paused")return De(e);if(p.kind==="escalate")return nt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),De(e);if(p.kind==="terminal")return Kt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),De(e);i=h.id;continue}finally{e.workflow=m}}if(zr(u))return nt(e,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),De(e);let f=t.connections[a.id]?.[u]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return nt(e,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),De(e);i=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Kt(e,"aborted")}async function aC(t,e,r){let n=gy(e,r),s=t.workflow;t.workflow=$o(e,r);try{return await Ad(t,r.id,n,r.name)}finally{t.workflow=s}}function gy(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:e.type,...r}}}async function Ad(t,e,r,n){let s=dy().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?uC(t,s):void 0,t.progress_step_id=null;try{return await s.execute(Sg(t,e,r,n??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function lC(t,e){try{let r=JSON.parse(t);if(dC(r)&&r.definition_schema_version===3)return xt.parse(r)}catch{return e}return e}function Ns(t){return t.definition_schema_version===3}function $o(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=gy(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:cC(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 cC(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function dC(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function uC(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 i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Kt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{rg(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function De(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function yy(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 i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function Oo(t,e){if(!fC(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&&mC(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function fC(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function mC(t,e,r){let n=pC(t),s=r.capture_evidence&&n!==null?_C(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 pC(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 _C(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 wy(t){if(!fy.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${fy.join(", ")}`)}var fy,Ey=E(()=>{"use strict";mn();ng();ag();Je();uy();Zn();fy=[1,2,3]});import{readFileSync as hC,readdirSync as gC}from"node:fs";import{basename as yC,join as wC,resolve as EC}from"node:path";function Sy(t={}){let e=EC(t.workflowsDir??"workflows"),r=gC(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=>TC(wC(e,n)))}}function TC(t){let e=yC(t);try{let r=hC(t,"utf8"),n=dt(r);return Iy(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:Ny(r)}}}function vy(t,e){try{let r=dt(e);return Iy(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:Ny(r)}}}function ky(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=t.rows.filter(i=>i.status==="PASS").length,n=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1977
1977
  `)}
1978
- `}function Iy(t,e){let r=SC(e),n=vC(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=bC(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 bC(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function SC(t){return Ad(t)?t.entry_step_id:t.start_at}function vC(t){return Ad(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Ad(t){return t.definition_schema_version===3}function Ny(t){return t instanceof Xt?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 xy(t){let e=new Set;if(Ad(t))for(let r of t.steps){let n=r.members??{};Ty(n,e)}else for(let r of Object.values(t.states))Ty(r,e);return[...e].sort()}function Ty(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=t[s],o=by(i);o!==null&&e.add(o)}for(let s of n){let i=t[s];if(Array.isArray(i))for(let o of i){let a=by(o);a!==null&&e.add(a)}}}function by(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Co=E(()=>{"use strict";_s()});function kC({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,Mo)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=IC(t,r,o);if(a<20)continue;let c=o??"initial",d=`${xs}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:Mo,source_ref:xs,payload:JSON.stringify({kind:xs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function IC(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1978
+ `}function Iy(t,e){let r=SC(e),n=vC(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=bC(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 bC(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function SC(t){return Rd(t)?t.entry_step_id:t.start_at}function vC(t){return Rd(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Rd(t){return t.definition_schema_version===3}function Ny(t){return t instanceof Xt?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 xy(t){let e=new Set;if(Rd(t))for(let r of t.steps){let n=r.members??{};Ty(n,e)}else for(let r of Object.values(t.states))Ty(r,e);return[...e].sort()}function Ty(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=t[s],o=by(i);o!==null&&e.add(o)}for(let s of n){let i=t[s];if(Array.isArray(i))for(let o of i){let a=by(o);a!==null&&e.add(a)}}}function by(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Co=E(()=>{"use strict";_s()});function kC({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,Mo)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=IC(t,r,o);if(a<20)continue;let c=o??"initial",d=`${xs}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:Mo,source_ref:xs,payload:JSON.stringify({kind:xs,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function IC(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1979
1979
  FROM run r
1980
1980
  JOIN job j ON j.id = r.job_id
1981
1981
  WHERE j.project_id = ?
1982
1982
  AND r.terminal_state IS NOT NULL
1983
- ${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function Ay(t){for(let e of NC)try{e(t)}catch{}}var Mo,xs,NC,Rd=E(()=>{"use strict";Mo="memory_policy",xs="memory_consolidation_request";NC=[kC]});var My={};Ee(My,{getOrInsertConsolidationWorkflow:()=>Ly,runJobById:()=>OC,runOnce:()=>Ur,startWorker:()=>$C});import{createHash as xC}from"node:crypto";import{readFileSync as AC}from"node:fs";import{pathToFileURL as RC}from"node:url";function Ly(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{tg({swallow:!0});let n=vo(e);if(n===null)return null;let s=AC(n,"utf8"),i=dt(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:RC(n).href,source_sha256:xC("sha256").update(s).digest("hex")})}catch{return null}}async function Ur(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??Ry,evaluator:n=>$y(t.dal,n)}),r===null?null:await Oy(t.dal,r,e)}catch(n){if(r!==null)return hr(t.dal,r,"worker_run_failed",Fr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:jo(Fr(n))})})}catch{}return null}finally{t.max_concurrent}}async function OC(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??Ry,evaluator:s=>$y(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Oy(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...hr(t.dal,r,"worker_run_failed",Fr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:jo(Fr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function Oy(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return hr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===Mo&&e.source_ref===xs,i=e.run_id===null?null:t.getRun(e.run_id),o;if(i!==null?o=t.getWorkflow(i.workflow_id):s?o=Ly(t):o=Cy(t,e,n),o===null)return hr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(i?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return hr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=dt(o.definition)}catch(u){return hr(t,e,"worker_workflow_invalid",Fr(u),r,n)}let d=CC(c,l);if(d.length>0)return hr(t,e,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await py({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:o});return t.setJobRun(e.id,u.run_id),u.paused===!0?{job_id:e.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return hr(t,e,"worker_run_failed",Fr(u),r,n,a)}}function $y(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=dt(n.definition)}catch{s=null}return fo({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 $C(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let i;do i=await Ur(t);while(!e&&i!==null)}catch(i){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:jo(Fr(i))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??LC))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function hr(t,e,r,n,s,i,o){let a=jo(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:i?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:o?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Fr(t){return t instanceof Error?t.message:String(t)}function jo(t){return t.length>4096?t.slice(0,4096):t}function CC(t,e){let r=xy(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Ry,LC,Do=E(()=>{"use strict";pd();Ey();_s();Co();Vc();Rd();Ry=6e5,LC=5e3});import{existsSync as MC,readFileSync as jC}from"node:fs";import{marked as DC}from"marked";function Fy(t,e){t.get("/layman",r=>r.html(Re("Layman Home",PC(e.dal)))),t.get("/api/layman",r=>r.json(qy(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Py(r);return n===null?r.notFound():r.html(Re(`Start ${En(n)}`,WC(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Py(r);return n===null?r.notFound():n==="newspaper"?jy(r,e.dal):BC(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Cr(e.dal,Po(r,"id"));return n===null?r.notFound():r.html(Re(`Run ${n.id}`,JC(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Cr(e.dal,Po(r,"id"));return n===null?r.notFound():r.json(rM(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>GC(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Re("Newspaper Subscriptions",eM(e.dal)))),t.post("/layman/newspaper",r=>jy(r,e.dal)),t.delete("/layman/newspaper/:id",r=>Dy(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>Dy(r,e.dal))}function PC(t){let e=qy(t);return`<section class="layman-home">
1983
+ ${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 Ay(t){for(let e of NC)try{e(t)}catch{}}var Mo,xs,NC,Ld=E(()=>{"use strict";Mo="memory_policy",xs="memory_consolidation_request";NC=[kC]});var My={};Ee(My,{getOrInsertConsolidationWorkflow:()=>Ly,runJobById:()=>OC,runOnce:()=>Ur,startWorker:()=>$C});import{createHash as xC}from"node:crypto";import{readFileSync as AC}from"node:fs";import{pathToFileURL as RC}from"node:url";function Ly(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{tg({swallow:!0});let n=vo(e);if(n===null)return null;let s=AC(n,"utf8"),i=dt(s);return t.insertWorkflow({name:e,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:RC(n).href,source_sha256:xC("sha256").update(s).digest("hex")})}catch{return null}}async function Ur(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??Ry,evaluator:n=>$y(t.dal,n)}),r===null?null:await Oy(t.dal,r,e)}catch(n){if(r!==null)return hr(t.dal,r,"worker_run_failed",Fr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:jo(Fr(n))})})}catch{}return null}finally{t.max_concurrent}}async function OC(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??Ry,evaluator:s=>$y(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await Oy(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...hr(t.dal,r,"worker_run_failed",Fr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:jo(Fr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function Oy(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return hr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===Mo&&e.source_ref===xs,i=e.run_id===null?null:t.getRun(e.run_id),o;if(i!==null?o=t.getWorkflow(i.workflow_id):s?o=Ly(t):o=Cy(t,e,n),o===null)return hr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(i?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return hr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=dt(o.definition)}catch(u){return hr(t,e,"worker_workflow_invalid",Fr(u),r,n)}let d=CC(c,l);if(d.length>0)return hr(t,e,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await py({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:o});return t.setJobRun(e.id,u.run_id),u.paused===!0?{job_id:e.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return hr(t,e,"worker_run_failed",Fr(u),r,n,a)}}function $y(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=dt(n.definition)}catch{s=null}return fo({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 $C(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let i;do i=await Ur(t);while(!e&&i!==null)}catch(i){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:jo(Fr(i))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??LC))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function hr(t,e,r,n,s,i,o){let a=jo(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:i?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:o?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Fr(t){return t instanceof Error?t.message:String(t)}function jo(t){return t.length>4096?t.slice(0,4096):t}function CC(t,e){let r=xy(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Ry,LC,Do=E(()=>{"use strict";_d();Ey();_s();Co();Yc();Ld();Ry=6e5,LC=5e3});import{existsSync as MC,readFileSync as jC}from"node:fs";import{marked as DC}from"marked";function Fy(t,e){t.get("/layman",r=>r.html(Re("Layman Home",PC(e.dal)))),t.get("/api/layman",r=>r.json(qy(e.dal))),t.get("/layman/start/:workflow",r=>{let n=Py(r);return n===null?r.notFound():r.html(Re(`Start ${En(n)}`,WC(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=Py(r);return n===null?r.notFound():n==="newspaper"?jy(r,e.dal):BC(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=Cr(e.dal,Po(r,"id"));return n===null?r.notFound():r.html(Re(`Run ${n.id}`,JC(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=Cr(e.dal,Po(r,"id"));return n===null?r.notFound():r.json(rM(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>GC(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Re("Newspaper Subscriptions",eM(e.dal)))),t.post("/layman/newspaper",r=>jy(r,e.dal)),t.delete("/layman/newspaper/:id",r=>Dy(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>Dy(r,e.dal))}function PC(t){let e=qy(t);return`<section class="layman-home">
1984
1984
  <h1>Welcome</h1>
1985
1985
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1986
1986
  <div class="grid">${Fo.map(FC).join("")}</div>
@@ -2017,23 +2017,23 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2017
2017
  <h2>${S(iM(e.state_name))}</h2>
2018
2018
  <p class="muted">The agent is waiting for your response.</p>
2019
2019
  <h3>Agent output</h3>
2020
- <div class="metric">${Md(e.last_agent_output??"")}</div>
2020
+ <div class="metric">${jd(e.last_agent_output??"")}</div>
2021
2021
  <form method="post" action="/layman/run/${S(t.id)}/respond">
2022
2022
  <input type="hidden" name="step_id" value="${S(e.step_id)}">
2023
2023
  <label>Your response<textarea name="input" rows="7"></textarea></label>
2024
2024
  <button type="submit" name="done" value="false">Send response</button>
2025
2025
  <button type="submit" name="done" value="true">Done with this stage</button>
2026
2026
  </form>
2027
- </section>`}async function GC(t,e){let r=Po(t,"id"),n=await t.req.parseBody(),s=Number(Ve(n.step_id)),i=Ve(n.input),o=Ve(n.done)==="true";if(!Number.isInteger(s))return t.html(Re("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,i,o);return a.resumed?(KC(e,a.run.id),await Ur({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Re("Interactive response",`<p class="error">Could not submit response: ${S(a.reason)}</p>`),400)}function KC(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!Od(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>Od(o)&&o.name===r.current_state&&typeof o.id=="string");Od(i)&&typeof i.id=="string"&&t.setRunCurrentState(r.id,i.id)}catch{return}}function VC(t,e,r){let n=oM(e.terminal_state);return`<section class="metric terminal-run">
2027
+ </section>`}async function GC(t,e){let r=Po(t,"id"),n=await t.req.parseBody(),s=Number(Ve(n.step_id)),i=Ve(n.input),o=Ve(n.done)==="true";if(!Number.isInteger(s))return t.html(Re("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,i,o);return a.resumed?(KC(e,a.run.id),await Ur({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html(Re("Interactive response",`<p class="error">Could not submit response: ${S(a.reason)}</p>`),400)}function KC(t,e){let r=t.getRun(e);if(r===null||r.current_state===null)return;let n=t.getWorkflow(r.workflow_id);if(n!==null)try{let s=JSON.parse(n.definition);if(!$d(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let i=s.steps.find(o=>$d(o)&&o.name===r.current_state&&typeof o.id=="string");$d(i)&&typeof i.id=="string"&&t.setRunCurrentState(r.id,i.id)}catch{return}}function VC(t,e,r){let n=oM(e.terminal_state);return`<section class="metric terminal-run">
2028
2028
  <h2>${n?"Complete":"Stopped"}</h2>
2029
2029
  <p>Status: <strong>${S(e.terminal_state)}</strong></p>
2030
2030
  ${n?YC(t,e,r):ZC(e)}
2031
2031
  <h2>Stage Log</h2>
2032
2032
  ${Wy(e)}
2033
- </section>`}function YC(t,e,r){if(r==="info-qa"){let n=Cd(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Md(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return zC(t,e);if(r==="newspaper"){let n=Cd(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Md(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function zC(t,e){let r=Mr(t,e.id),n=Ld(r,["render_docx"]),s=Ld(r,["render_xlsx"]),i=Cd(e,["review:coder[0]_transcript","chat_output_md"])??QC(Ld(r,["document_md","markdown"])),o=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${S(a)}">${S(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
2033
+ </section>`}function YC(t,e,r){if(r==="info-qa"){let n=Md(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${jd(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return zC(t,e);if(r==="newspaper"){let n=Md(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${jd(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function zC(t,e){let r=Mr(t,e.id),n=Od(r,["render_docx"]),s=Od(r,["render_xlsx"]),i=Md(e,["review:coder[0]_transcript","chat_output_md"])??QC(Od(r,["document_md","markdown"])),o=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${S(a)}">${S(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
2034
2034
  <pre>${S(lM(aM(i??"No preview available."),30))}</pre>
2035
2035
  <h3>Downloads</h3>
2036
- ${o.length>0?`<ul>${o}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function ZC(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 Cd(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(i=>i.kind===n&&i.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Ld(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function QC(t){if(t===null||!MC(t)||!t.endsWith(".md"))return null;try{return jC(t,"utf8")}catch{return null}}function eM(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
2036
+ ${o.length>0?`<ul>${o}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function ZC(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 Md(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(i=>i.kind===n&&i.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Od(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function QC(t){if(t===null||!MC(t)||!t.endsWith(".md"))return null;try{return jC(t,"utf8")}catch{return null}}function eM(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
2037
2037
  ${tM(Hy(t))}
2038
2038
  <h2>Add Subscription</h2>
2039
2039
  ${e.length===0?'<p class="error">Create a project before subscribing.</p>':By(e,"/layman/newspaper")}`}function By(t,e){return`<form method="post" action="${S(e)}">
@@ -2050,34 +2050,34 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2050
2050
  </form>`}async function jy(t,e){let r=await t.req.parseBody(),n=Xy(e,r);if(n===null)return t.html(Re("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Re("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let i=Ve(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(i.length===0)return t.html(Re("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let o={topics:i,output_dir:Ve(r.output_dir).trim()||"digests",schedule:sM(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(o),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function Dy(t,e){let r=Po(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function tM(t){return me(["id","project","topics","status","action"],t.map(e=>{let r=dM(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 qy(t){let e=Hy(t);return{workflows:Fo,recent_runs:nM(t),newspaper_subscriptions:e.length}}function rM(t,e){let r=Jy(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 nM(t){return t.query(`SELECT r.*, w.name AS workflow_name
2051
2051
  FROM run r
2052
2052
  JOIN workflow w ON w.id = r.workflow_id
2053
- WHERE w.name IN (${$d.map(()=>"?").join(",")})
2053
+ WHERE w.name IN (${Cd.map(()=>"?").join(",")})
2054
2054
  ORDER BY r.id DESC
2055
- LIMIT 10`,...$d)}function Hy(t){return t.query(`SELECT pw.*, p.name AS project_name
2055
+ LIMIT 10`,...Cd)}function Hy(t){return t.query(`SELECT pw.*, p.name AS project_name
2056
2056
  FROM project_workflow pw
2057
2057
  JOIN workflow w ON w.id = pw.workflow_id
2058
2058
  JOIN project p ON p.id = pw.project_id
2059
2059
  WHERE w.name = ?
2060
- ORDER BY pw.id DESC`,"newspaper")}function Jy(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Xy(t,e){let r=Number(Ve(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function sM(t){let e=Ve(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ve(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Py(t){let e=t.req.param("workflow");return $d.includes(e)?e:null}function En(t){return Fo.find(e=>e.name===t)?.title??t}function iM(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Md(t){return DC.parse(t,{async:!1})}function oM(t){return t==="done"||t==="pr_ready"||t==="merged"}function aM(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function lM(t,e){return t.split(`
2060
+ ORDER BY pw.id DESC`,"newspaper")}function Jy(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Xy(t,e){let r=Number(Ve(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function sM(t){let e=Ve(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ve(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Py(t){let e=t.req.param("workflow");return Cd.includes(e)?e:null}function En(t){return Fo.find(e=>e.name===t)?.title??t}function iM(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function jd(t){return DC.parse(t,{async:!1})}function oM(t){return t==="done"||t==="pr_ready"||t==="merged"}function aM(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function lM(t,e){return t.split(`
2061
2061
  `).slice(0,e).join(`
2062
- `)}function cM(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ve(t){return typeof t=="string"?t:""}function dM(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 Od(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Po(t,e){return Number(t.req.param(e))}var Fo,$d,Gy=E(()=>{"use strict";Do();Ht();cd();Fo=[{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."}],$d=Fo.map(t=>t.name)});function fM(t){return t.replace(/^\/+/,"")}function Ky(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Tn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=fM(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 Ky(t.userId)&&Ky(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${uM}/${t.identityId}/`}function pM(t){return String(Math.max(0,Math.floor(t))).padStart(mM,"0")}function jd(t,e,r){return`${t}${e}${pM(r)}.json`}function Uo(t,e){return`${t}${e}`}function Wo(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 i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var uM,mM,Bo=E(()=>{"use strict";uM="mailbox";mM=12});function Vt(t,e){let r=Math.floor(t),n="",s=r;for(let d=0;d<12;d++)n=qo[s&15]+n,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=qo[a&15]+o,a=a>>4;let l=qo[8|Math.floor(e()*4)&3],c="";for(let d=0;d<15;d++)c+=qo[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var qo,Ho=E(()=>{"use strict";qo="0123456789abcdef"});function Pd(t,e){return!Number.isFinite(t)||t<=0?e:t}function Fd(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 Qy(t){return t.conversation_id===Zy&&gM(t.payload)}function gM(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function yM(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Qy(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Vy,Yy,zy,_M,Zy,hM,Dd,Wr,Jo=E(()=>{"use strict";Bo();Ho();Vy=3e3,Yy=1e4,zy=12e3,_M=1e3,Zy="__lmctl_heartbeat__",hM={kind:"heartbeat"},Dd={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Wr=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=Tn({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=Pd(e.readIntervalMs??e.pollIntervalMs??Vy,Vy),this.heartbeatIdleMs=Pd(e.heartbeatIdleMs??Yy,Yy),this.backoffReadIntervalMs=Pd(e.backoffReadIntervalMs??e.pollIntervalMs??zy,zy)}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??Dd;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=Uo(this.basePrefix,e),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:_M,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Wo(o.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.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(),i={message_id:Vt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},o=(this.ownSeq??0)+1,a=jd(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??Dd;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=jd(this.basePrefix,this.peerStream,e),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(Fd(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Qy(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"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=yM(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??Dd;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(Zy,hM)}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 wM}from"@hono/node-server/conninfo";function ew(t,e){let r=e.bucket??EM,n=e.remoteAddressOf??(i=>bM(i)),s=i=>{let o=n(i);return SM(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Ud(i.req.query("key"));if(typeof a!="string")return i.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 i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Fd(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Wd(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Ud(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Wd(c)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Ud(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=TM(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Wd(u)},500)}})}function Ud(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 TM(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function bM(t){try{return wM(t).remote.address}catch{return}}function SM(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Wd(t){return t instanceof Error?t.message:String(t)}var EM,tw=E(()=>{"use strict";Jo();EM="local"});function rw(t,e){t.get("/mailbox/workspace",r=>IM(r,e)),t.get("/mailbox/projects",r=>NM(r,e)),t.get("/mailbox/projects/:id",r=>xM(r,e)),t.post("/mailbox/projects",r=>AM(r,e)),t.patch("/mailbox/projects/:id",r=>RM(r,e)),t.delete("/mailbox/projects/:id",r=>LM(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>OM(r,e)),t.get("/mailbox/prompts/:id",r=>$M(r,e))}function IM(t,e){e.dal.ensureWorkspace({id:Sn,name:Bd});let r=nw(e.dal),n={id:Sn,name:Bd,created_at:kM,projects:r};return t.json({workspace:n})}function NM(t,e){return t.json({projects:nw(e.dal)})}function xM(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(bn)){let s=qd(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Ko(s)})}let n=iw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:sw(n)})}async function AM(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:Sn,name:Bd});let s=e.dal.insertWebProject({workspace_id:Sn,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:Ko(s)},201)}async function RM(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(bn)){let i=qd(e.dal,r);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=e.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:Ko(o)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function LM(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(bn)){let n=qd(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 OM(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 i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=iw(e.dal,i);if(o===null)return t.json({error:"project_not_found",message:`project not found: ${i}`},404);if(e.dal.getWorkflowByName(o.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${vM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;e.enqueueProjectJob!==void 0?d=e.enqueueProjectJob({dal:e.dal,project_id:o.id,source_ref:l,payload:c}):d=await CM({dal:e.dal,project_id:o.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Go}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:u},201)}function $M(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=MM(e.dal,r);return t.json({result:n})}function nw(t){let e=t.listProjects().map(sw),r=t.listWebProjectsActive(Sn).map(Ko);return[...e,...r].sort(JM)}function sw(t){return{id:`${Go}${t.id}`,workspace_id:Sn,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 Ko(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:`${bn}${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 qd(t,e){if(!e.startsWith(bn))return null;let r=e.slice(bn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function iw(t,e){if(e.startsWith(Go)){let n=e.slice(Go.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 CM(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(zc(),Sh));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function MM(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),i=t.getProject(r.project_id),o=BM(t,i?.team_id??null),a=WM(s),l=qM(n,a,o.length>0),c=HM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:jM(t,i.workflow_name),u=d.totalEstimatedMs,f=ow(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,h=s===null?[]:DM(t,s.id),g=PM(s,a,h,d.perStep,o),_=FM(h,d.perStep),y=UM(g,_,u,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,...Xo(u,f),...y},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&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,...Xo(u,f),...y},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:o,...Xo(u,f),...y},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,...Xo(u,f),...y},errors_json:null,duration_ms:c}}function jM(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 i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function DM(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function PM(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(i),c=l?.name??i,d=ow(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function FM(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=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:o,status:l})}return r}function UM(t,e,r,n,s,i){let o={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(o.current_step=t),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function ow(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Xo(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function WM(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 BM(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 qM(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 HM(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 JM(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 Go,bn,vM,Sn,Bd,kM,aw=E(()=>{"use strict";Go="project:",bn="web_project:",vM="prompt:",Sn="default",Bd="Default workspace",kM=new Date(0).toISOString()});import{Buffer as lw}from"node:buffer";function cw(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 dw(t){return KM[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 XM,GM,Vo,KM,Hd=E(()=>{"use strict";XM=1e4,GM=256*1024,Vo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=cw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,XM),this.pushByteCap=cw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,GM),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+=lw.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=${lw.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
2062
+ `)}function cM(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ve(t){return typeof t=="string"?t:""}function dM(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 $d(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Po(t,e){return Number(t.req.param(e))}var Fo,Cd,Gy=E(()=>{"use strict";Do();Ht();dd();Fo=[{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."}],Cd=Fo.map(t=>t.name)});function fM(t){return t.replace(/^\/+/,"")}function Ky(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function Tn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=fM(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 Ky(t.userId)&&Ky(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${uM}/${t.identityId}/`}function pM(t){return String(Math.max(0,Math.floor(t))).padStart(mM,"0")}function Dd(t,e,r){return`${t}${e}${pM(r)}.json`}function Uo(t,e){return`${t}${e}`}function Wo(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 i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var uM,mM,Bo=E(()=>{"use strict";uM="mailbox";mM=12});function Vt(t,e){let r=Math.floor(t),n="",s=r;for(let d=0;d<12;d++)n=qo[s&15]+n,s=Math.floor(s/16);let i=Math.floor(e()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=qo[a&15]+o,a=a>>4;let l=qo[8|Math.floor(e()*4)&3],c="";for(let d=0;d<15;d++)c+=qo[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var qo,Ho=E(()=>{"use strict";qo="0123456789abcdef"});function Fd(t,e){return!Number.isFinite(t)||t<=0?e:t}function Ud(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 Qy(t){return t.conversation_id===Zy&&gM(t.payload)}function gM(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function yM(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Qy(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Vy,Yy,zy,_M,Zy,hM,Pd,Wr,Jo=E(()=>{"use strict";Bo();Ho();Vy=3e3,Yy=1e4,zy=12e3,_M=1e3,Zy="__lmctl_heartbeat__",hM={kind:"heartbeat"},Pd={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Wr=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=Tn({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=Fd(e.readIntervalMs??e.pollIntervalMs??Vy,Vy),this.heartbeatIdleMs=Fd(e.heartbeatIdleMs??Yy,Yy),this.backoffReadIntervalMs=Fd(e.backoffReadIntervalMs??e.pollIntervalMs??zy,zy)}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??Pd;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=Uo(this.basePrefix,e),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:_M,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Wo(o.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.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(),i={message_id:Vt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},o=(this.ownSeq??0)+1,a=Dd(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??Pd;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=Dd(this.basePrefix,this.peerStream,e),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(Ud(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Qy(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"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=yM(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??Pd;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(Zy,hM)}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 wM}from"@hono/node-server/conninfo";function ew(t,e){let r=e.bucket??EM,n=e.remoteAddressOf??(i=>bM(i)),s=i=>{let o=n(i);return SM(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Wd(i.req.query("key"));if(typeof a!="string")return i.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 i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Ud(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Bd(l)},500)}}),t.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Wd(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Bd(c)},500)}}),t.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Wd(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=TM(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Bd(u)},500)}})}function Wd(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 TM(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function bM(t){try{return wM(t).remote.address}catch{return}}function SM(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Bd(t){return t instanceof Error?t.message:String(t)}var EM,tw=E(()=>{"use strict";Jo();EM="local"});function rw(t,e){t.get("/mailbox/workspace",r=>IM(r,e)),t.get("/mailbox/projects",r=>NM(r,e)),t.get("/mailbox/projects/:id",r=>xM(r,e)),t.post("/mailbox/projects",r=>AM(r,e)),t.patch("/mailbox/projects/:id",r=>RM(r,e)),t.delete("/mailbox/projects/:id",r=>LM(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>OM(r,e)),t.get("/mailbox/prompts/:id",r=>$M(r,e))}function IM(t,e){e.dal.ensureWorkspace({id:Sn,name:qd});let r=nw(e.dal),n={id:Sn,name:qd,created_at:kM,projects:r};return t.json({workspace:n})}function NM(t,e){return t.json({projects:nw(e.dal)})}function xM(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(bn)){let s=Hd(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Ko(s)})}let n=iw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:sw(n)})}async function AM(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:Sn,name:qd});let s=e.dal.insertWebProject({workspace_id:Sn,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:Ko(s)},201)}async function RM(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(bn)){let i=Hd(e.dal,r);if(i===null||i.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=e.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:Ko(o)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function LM(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(bn)){let n=Hd(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 OM(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 i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let o=iw(e.dal,i);if(o===null)return t.json({error:"project_not_found",message:`project not found: ${i}`},404);if(e.dal.getWorkflowByName(o.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${vM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;e.enqueueProjectJob!==void 0?d=e.enqueueProjectJob({dal:e.dal,project_id:o.id,source_ref:l,payload:c}):d=await CM({dal:e.dal,project_id:o.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Go}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:u},201)}function $M(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=MM(e.dal,r);return t.json({result:n})}function nw(t){let e=t.listProjects().map(sw),r=t.listWebProjectsActive(Sn).map(Ko);return[...e,...r].sort(JM)}function sw(t){return{id:`${Go}${t.id}`,workspace_id:Sn,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 Ko(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:`${bn}${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 Hd(t,e){if(!e.startsWith(bn))return null;let r=e.slice(bn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function iw(t,e){if(e.startsWith(Go)){let n=e.slice(Go.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 CM(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(Zc(),Sh));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function MM(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),i=t.getProject(r.project_id),o=BM(t,i?.team_id??null),a=WM(s),l=qM(n,a,o.length>0),c=HM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:jM(t,i.workflow_name),u=d.totalEstimatedMs,f=ow(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,h=s===null?[]:DM(t,s.id),g=PM(s,a,h,d.perStep,o),_=FM(h,d.perStep),y=UM(g,_,u,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,...Xo(u,f),...y},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&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,...Xo(u,f),...y},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:o,...Xo(u,f),...y},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,...Xo(u,f),...y},errors_json:null,duration_ms:c}}function jM(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 i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function DM(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function PM(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let i=e!==null?e:t.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(i),c=l?.name??i,d=ow(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function FM(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=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:o,status:l})}return r}function UM(t,e,r,n,s,i){let o={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(o.current_step=t),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function ow(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Xo(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function WM(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 BM(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 qM(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 HM(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 JM(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 Go,bn,vM,Sn,qd,kM,aw=E(()=>{"use strict";Go="project:",bn="web_project:",vM="prompt:",Sn="default",qd="Default workspace",kM=new Date(0).toISOString()});import{Buffer as lw}from"node:buffer";function cw(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 dw(t){return KM[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 XM,GM,Vo,KM,Jd=E(()=>{"use strict";XM=1e4,GM=256*1024,Vo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=cw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,XM),this.pushByteCap=cw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,GM),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+=lw.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=${lw.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
2063
2063
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
2064
- `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${i instanceof Error?i.message:String(i)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};KM={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 mw(t,e){t.post("/mailbox/terminal/launch",r=>VM(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>YM(r,e)),t.get("/mailbox/terminal/sessions",r=>zM(r,e))}async function VM(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"||!fw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=uw(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=dw(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function YM(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||!fw.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 zM(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 fw,pw=E(()=>{"use strict";Hd();fw=/^[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 ZM}from"node:buffer";function tj(t){try{return ZM.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function _w(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 hw(t){return rj[t]}function gw(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let i=e[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<e.length&&e[o]!==" "&&e[o]!==" ";)o+=1;r.push(e.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var QM,ej,Yo,rj,Jd=E(()=>{"use strict";QM=2e3,ej=64*1024,Yo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=_w(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,QM),this.pushByteCap=_w(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,ej),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 i=await r.start(e,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(e.session_id),i}}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 i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}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=tj(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(i){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,i)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; 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")))})}};rj={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 ww(t,e){t.post("/mailbox/chat/launch",r=>nj(r,e)),t.post("/mailbox/chat/end/:session_id",r=>sj(r,e)),t.get("/mailbox/chat/sessions",r=>ij(r,e))}async function nj(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"||!yw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=gw(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=hw(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?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 sj(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||!yw.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 ij(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 yw,Ew=E(()=>{"use strict";Jd();yw=/^[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 oj}from"node:fs";function bw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Tw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=oj(e.path,{encoding:"utf8"});return Tw(r)}catch{return[]}}function Tw(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 Sw=E(()=>{"use strict"});function vw(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 o=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=o[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function zo(t,e){let r=t.query(`SELECT id, kind FROM attention
2064
+ `,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(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${i instanceof Error?i.message:String(i)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};KM={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 mw(t,e){t.post("/mailbox/terminal/launch",r=>VM(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>YM(r,e)),t.get("/mailbox/terminal/sessions",r=>zM(r,e))}async function VM(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"||!fw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=uw(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=dw(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function YM(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||!fw.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 zM(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 fw,pw=E(()=>{"use strict";Jd();fw=/^[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 ZM}from"node:buffer";function tj(t){try{return ZM.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function _w(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 hw(t){return rj[t]}function gw(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let i=e[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<e.length&&e[o]!==" "&&e[o]!==" ";)o+=1;r.push(e.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var QM,ej,Yo,rj,Xd=E(()=>{"use strict";QM=2e3,ej=64*1024,Yo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=_w(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,QM),this.pushByteCap=_w(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,ej),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 i=await r.start(e,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(e.session_id),i}}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 i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}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=tj(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(i){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,i)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; 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")))})}};rj={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 ww(t,e){t.post("/mailbox/chat/launch",r=>nj(r,e)),t.post("/mailbox/chat/end/:session_id",r=>sj(r,e)),t.get("/mailbox/chat/sessions",r=>ij(r,e))}async function nj(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"||!yw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return t.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=gw(n.command_line),o===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=hw(i);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?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 sj(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||!yw.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 ij(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 yw,Ew=E(()=>{"use strict";Xd();yw=/^[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 oj}from"node:fs";function bw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Tw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=oj(e.path,{encoding:"utf8"});return Tw(r)}catch{return[]}}function Tw(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 Sw=E(()=>{"use strict"});function vw(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 o=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=o[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function zo(t,e){let r=t.query(`SELECT id, kind FROM attention
2065
2065
  WHERE run_id = ?
2066
2066
  AND acknowledged_at IS NULL
2067
2067
  AND requires_user = 1
2068
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Zo=E(()=>{"use strict"});function Cw(t,e){t.all("/runtime/*",r=>aj(r.req.raw,e))}async function aj(t,e){try{return Response.json(await lj(t,e))}catch(r){if(r instanceof ie)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function lj(t,e){let r=new URL(t.url),n=_j(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Xd(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Qo(t,n.id,s[2]),cj(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Qo(t,n.id,s[2]);let i=Iw(e.dal,s[4]);return kw(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Xd(t),e.dal.listTeams().map(i=>pj(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=Nw(e.dal,xw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ie(400,"runtime lead chat body does not match route team");return Rw(t,n.id,o.context),Aw(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=Nw(e.dal,xw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ie(400,"runtime lead message body does not match route team");Rw(t,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime lead message requires draft.body");return Aw(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Qo(t,n.id,s[2]);let i=Iw(e.dal,s[4]),o=await t.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new ie(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime workflow message requires draft.body");return fj(e.dal,i,a),kw(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return As(t,n.id),e.dal.listWorkflows().map(i=>hj(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){As(t,n.id);let i=yj(e.dal,s[2]);return gj(i)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){As(t,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new ie(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return wj(e.dal,i,o).map(l=>Ow(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){As(t,n.id);let i=Lw(e.dal,s[2]);return Ow(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){As(t,n.id);let i=Lw(e.dal,s[2]),o=Tj(e.dal,i);return{runId:zd(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new ie(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function cj(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>Mw(t,e,r))}}function kw(t,e,r){let n=Mw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:dj(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:uj(t,r)}}function Mw(t,e,r){let n=jw(t,r.id),s=Kd(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 dj(t,e){let r=jw(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:Kd(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 uj(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 fj(t,e,r){let n=mj(t,e.id);if(n!==null){let s=zo(t,n.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new ie(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Nt(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new ie(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new ie(409,`interactive resume failed: ${o.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function jw(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 mj(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 Kd(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 Iw(t,e){let r=t.findProjectByName(e);if(r===null)throw new ie(404,`project not found: ${e}`);return r}function Nw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ie(404,`team not found: ${e}`);return r}function xw(t){return t.startsWith("team:")?t.slice(5):t}function pj(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function Aw(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??$w}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function _j(t){let e=t.workspaceName??Pt()??Nr.default;return{id:e,name:e}}function Xd(t){if(t.headers.get("x-lmctl-workspace-id")!==$w)throw new ie(400,"runtime request requires global-admin workspace identity")}function Qo(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ie(400,"runtime workspace identity does not match route")}function As(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e)throw new ie(400,"runtime workspace identity does not match server workspace")}function Rw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ie(400,"workspace manager context requires workspace identity");Qo(t,e,r.workspaceId);return}Xd(t)}function Vd(t){return`${vn}${Yd(t.name)}`}function Yd(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function zd(t){return`${Gd}${t.id}`}function hj(t){let e=ea(t.definition);return{id:Vd(t),name:t.name,...e.description===null?{}:{description:e.description}}}function gj(t){let e=ea(t.definition);return{id:Vd(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ea(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=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:e,stepIds:s,nameToId:i}}function yj(t,e){if(!e.startsWith(vn))throw new ie(404,`template not found: ${e}`);let r=e.slice(vn.length),n=t.listWorkflows().filter(s=>Yd(s.name)===r);if(n.length===0)throw new ie(404,`template not found: ${e}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new ie(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Lw(t,e){if(!e.startsWith(Gd))throw new ie(404,`run not found: ${e}`);let r=e.slice(Gd.length);if(!/^[1-9]\d*$/.test(r))throw new ie(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ie(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ie(404,`run not found: ${e}`);return s}function wj(t,e,r){if(r!==null){if(!r.startsWith(vn))return[];let s=r.slice(vn.length),i=t.listWorkflows().filter(a=>Yd(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}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 Ow(t,e){let r=t.getWorkflow(e.workflow_id),n=Kd(e),s=Ej(r,e);return{id:zd(e),templateId:r===null?`${vn}unknown`:Vd(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 Ej(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]:[ea(t.definition).nameToId.get(r)??r]}function Tj(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ea(r.definition),s=c=>n.nameToId.get(c)??c,i=zd(e),o=[];o.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=bj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:e.paused_at,type:"step.paused",stepId:d})}let l=t.listSessionEvents(e.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(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";o.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function bj(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 $w,vn,Gd,ie,Dw=E(()=>{"use strict";Be();Zo();Ht();$w="global-admin";vn="template:",Gd="run:";ie=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as Sj,writeFileSync as vj}from"node:fs";import{randomUUID as Pw}from"node:crypto";import{dirname as kj,resolve as ta,sep as Fw}from"node:path";async function Ww(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(!Rj(n))return t.text("missing image file",400);if(n.size>Ij)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=Lj(s);if(i===null||!(i in Uw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return t.text("upload MIME type does not match file content",415);let o=Nj(e,r.project);if(typeof o=="string")return t.text(o,404);let a=o===null?ta(Aj()):ta(o.local_path),l=ta(a,"uploads",Pw()),c=ta(l,`${Pw()}${Uw[i]}`);if(!xj(c,a))return t.text("invalid upload path",400);Sj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);vj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return t.json(u)}function Nj(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function xj(t,e){let r=e.endsWith(Fw)?e:`${e}${Fw}`;return t.startsWith(r)}function Aj(){return kj(Z())}function Rj(t){return typeof File<"u"&&t instanceof File}function Lj(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 Ij,Uw,Bw=E(()=>{"use strict";Be();Ij=10*1024*1024,Uw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ra}from"node:fs";import{basename as Oj,dirname as $j,extname as Cj,isAbsolute as Mj,join as jj,relative as Dj}from"node:path";import{fileURLToPath as Pj}from"node:url";import{Hono as Fj}from"hono";import{serveStatic as At}from"@hono/node-server/serve-static";function Vw(t){let e=new Fj,r=[],n=t.localWebui!==void 0?Qd(t.localWebui.webuiDir):Uj();if(t.localWebui!==void 0&&ew(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=Wj();t.localWebui!==void 0?e.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,i=>i.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,At({root:n})),e.use("/vendor/*",s,At({root:n})),e.use("/src/*",s,At({root:n})),e.get("/",s,At({root:n,path:"index.html"})),e.get("/admin",s,At({root:n,path:"index.html"})),e.get("/admin/*",s,At({root:n,path:"index.html"})),e.get("/terminal",s,At({root:n,path:"index.html"})),e.get("/terminal/*",s,At({root:n,path:"index.html"})),e.get("/chat",s,At({root:n,path:"index.html"})),e.get("/chat/*",s,At({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("*",Rh({disabled:t.authDisabled})),e.get("/login",s=>s.html(Re("Login",`
2068
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Zo=E(()=>{"use strict"});function Cw(t,e){t.all("/runtime/*",r=>aj(r.req.raw,e))}async function aj(t,e){try{return Response.json(await lj(t,e))}catch(r){if(r instanceof ie)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function lj(t,e){let r=new URL(t.url),n=_j(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Gd(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Qo(t,n.id,s[2]),cj(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Qo(t,n.id,s[2]);let i=Iw(e.dal,s[4]);return kw(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Gd(t),e.dal.listTeams().map(i=>pj(i));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=Nw(e.dal,xw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ie(400,"runtime lead chat body does not match route team");return Rw(t,n.id,o.context),Aw(i,o.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=Nw(e.dal,xw(s[2])),o=await t.json();if(o.teamId!==`team:${i.name}`)throw new ie(400,"runtime lead message body does not match route team");Rw(t,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime lead message requires draft.body");return Aw(i,o.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Qo(t,n.id,s[2]);let i=Iw(e.dal,s[4]),o=await t.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new ie(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime workflow message requires draft.body");return fj(e.dal,i,a),kw(e.dal,n,i)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return As(t,n.id),e.dal.listWorkflows().map(i=>hj(i));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){As(t,n.id);let i=yj(e.dal,s[2]);return gj(i)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){As(t,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new ie(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return wj(e.dal,i,o).map(l=>Ow(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){As(t,n.id);let i=Lw(e.dal,s[2]);return Ow(e.dal,i)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){As(t,n.id);let i=Lw(e.dal,s[2]),o=Tj(e.dal,i);return{runId:Zd(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new ie(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function cj(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>Mw(t,e,r))}}function kw(t,e,r){let n=Mw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:dj(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:uj(t,r)}}function Mw(t,e,r){let n=jw(t,r.id),s=Vd(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 dj(t,e){let r=jw(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:Vd(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 uj(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 fj(t,e,r){let n=mj(t,e.id);if(n!==null){let s=zo(t,n.id);if(s?.kind==="workflow_escalation"){let i=t.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new ie(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Nt(t,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new ie(409,"interactive resume failed: missing step");let o=t.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new ie(409,`interactive resume failed: ${o.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function jw(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 mj(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 Vd(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 Iw(t,e){let r=t.findProjectByName(e);if(r===null)throw new ie(404,`project not found: ${e}`);return r}function Nw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new ie(404,`team not found: ${e}`);return r}function xw(t){return t.startsWith("team:")?t.slice(5):t}function pj(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function Aw(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??$w}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function _j(t){let e=t.workspaceName??Pt()??Nr.default;return{id:e,name:e}}function Gd(t){if(t.headers.get("x-lmctl-workspace-id")!==$w)throw new ie(400,"runtime request requires global-admin workspace identity")}function Qo(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new ie(400,"runtime workspace identity does not match route")}function As(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new ie(400,"runtime request requires workspace identity");if(r!==e)throw new ie(400,"runtime workspace identity does not match server workspace")}function Rw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ie(400,"workspace manager context requires workspace identity");Qo(t,e,r.workspaceId);return}Gd(t)}function Yd(t){return`${vn}${zd(t.name)}`}function zd(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Zd(t){return`${Kd}${t.id}`}function hj(t){let e=ea(t.definition);return{id:Yd(t),name:t.name,...e.description===null?{}:{description:e.description}}}function gj(t){let e=ea(t.definition);return{id:Yd(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function ea(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=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:e,stepIds:s,nameToId:i}}function yj(t,e){if(!e.startsWith(vn))throw new ie(404,`template not found: ${e}`);let r=e.slice(vn.length),n=t.listWorkflows().filter(s=>zd(s.name)===r);if(n.length===0)throw new ie(404,`template not found: ${e}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new ie(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Lw(t,e){if(!e.startsWith(Kd))throw new ie(404,`run not found: ${e}`);let r=e.slice(Kd.length);if(!/^[1-9]\d*$/.test(r))throw new ie(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ie(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new ie(404,`run not found: ${e}`);return s}function wj(t,e,r){if(r!==null){if(!r.startsWith(vn))return[];let s=r.slice(vn.length),i=t.listWorkflows().filter(a=>zd(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}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 Ow(t,e){let r=t.getWorkflow(e.workflow_id),n=Vd(e),s=Ej(r,e);return{id:Zd(e),templateId:r===null?`${vn}unknown`:Yd(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 Ej(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]:[ea(t.definition).nameToId.get(r)??r]}function Tj(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:ea(r.definition),s=c=>n.nameToId.get(c)??c,i=Zd(e),o=[];o.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=bj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:e.paused_at,type:"step.paused",stepId:d})}let l=t.listSessionEvents(e.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(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";o.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function bj(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 $w,vn,Kd,ie,Dw=E(()=>{"use strict";Be();Zo();Ht();$w="global-admin";vn="template:",Kd="run:";ie=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as Sj,writeFileSync as vj}from"node:fs";import{randomUUID as Pw}from"node:crypto";import{dirname as kj,resolve as ta,sep as Fw}from"node:path";async function Ww(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(!Rj(n))return t.text("missing image file",400);if(n.size>Ij)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=Lj(s);if(i===null||!(i in Uw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return t.text("upload MIME type does not match file content",415);let o=Nj(e,r.project);if(typeof o=="string")return t.text(o,404);let a=o===null?ta(Aj()):ta(o.local_path),l=ta(a,"uploads",Pw()),c=ta(l,`${Pw()}${Uw[i]}`);if(!xj(c,a))return t.text("invalid upload path",400);Sj(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);vj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return t.json(u)}function Nj(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function xj(t,e){let r=e.endsWith(Fw)?e:`${e}${Fw}`;return t.startsWith(r)}function Aj(){return kj(Z())}function Rj(t){return typeof File<"u"&&t instanceof File}function Lj(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 Ij,Uw,Bw=E(()=>{"use strict";Be();Ij=10*1024*1024,Uw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ra}from"node:fs";import{basename as Oj,dirname as $j,extname as Cj,isAbsolute as Mj,join as jj,relative as Dj}from"node:path";import{fileURLToPath as Pj}from"node:url";import{Hono as Fj}from"hono";import{serveStatic as At}from"@hono/node-server/serve-static";function Vw(t){let e=new Fj,r=[],n=t.localWebui!==void 0?eu(t.localWebui.webuiDir):Uj();if(t.localWebui!==void 0&&ew(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=Wj();t.localWebui!==void 0?e.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,i=>i.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,At({root:n})),e.use("/vendor/*",s,At({root:n})),e.use("/src/*",s,At({root:n})),e.get("/",s,At({root:n,path:"index.html"})),e.get("/admin",s,At({root:n,path:"index.html"})),e.get("/admin/*",s,At({root:n,path:"index.html"})),e.get("/terminal",s,At({root:n,path:"index.html"})),e.get("/terminal/*",s,At({root:n,path:"index.html"})),e.get("/chat",s,At({root:n,path:"index.html"})),e.get("/chat/*",s,At({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("*",Rh({disabled:t.authDisabled})),e.get("/login",s=>s.html(Re("Login",`
2069
2069
  <h1>Login</h1>
2070
2070
  <form method="post" action="/login">
2071
2071
  <label>Token <input name="token" type="password"></label>
2072
2072
  <button type="submit">Login</button>
2073
2073
  </form>
2074
- `))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Oh(o)?(nd(s,o),s.redirect("/",302)):s.html(Re("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>($h(s),s.redirect("/login",302))),Fy(e,{dal:t.dal}),Cw(e,{dal:t.dal}),rw(e,{dal:t.dal}),mw(e,{terminalSessionManager:t.terminalSessionManager}),ww(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=ds(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let d=[],u=[];for(let f of a)try{await Nc(t.dal,i,f.alias),t.dal.setMemberState(f.id,"idle",null),d.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return P(s,{team:i,seeded:d,failed:u},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),Uh(e,{dal:t.dal}),Gh(e,{dal:t.dal}),e.get("/api/status",s=>P(s,Ji(t.dal),Kj)),e.get("/api/projects",s=>P(s,Xi(t.dal),Vj)),e.get("/api/teams",s=>P(s,R_(t.dal),Zj)),e.get("/api/workflows",s=>P(s,Gi(t.dal),Qj)),e.get("/api/workflows/verify",s=>{let i=Sy();return s.req.header("accept")?.includes("text/plain")?s.text(ky(i)):s.json(i)}),e.get("/api/jobs",s=>P(s,L_(t.dal,{status:s.req.query("status")}),eD)),e.post("/api/uploads",s=>Ww(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=Ki(t.dal,te(s,"id"));return i===null?s.notFound():P(s,i,de)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=t.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=t.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=t.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),u=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return P(s,u,de)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Do(),My)),o=Ki(t.dal,te(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():P(s,i,de)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():P(s,t.dal.listProjectWorkflows(i.id),Yj)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await kn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{un(d)}catch{return s.text("invalid condition",400)}let u=Hj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:f});return P(s,m,de)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(te(s,"id"));return i===null?s.notFound():P(s,i,de)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(te(s,"id"))?P(s,{removed:!0},de):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(te(s,"id"),!0);return i===null?s.notFound():P(s,i,de)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(te(s,"id"),!1);return i===null?s.notFound():P(s,i,de)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Hw(s.req.query("status"),Jj);if(typeof o=="string")return s.text(o,400);let a=Hw(s.req.query("severity"),zw);return typeof a=="string"?s.text(a,400):P(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),zj)}),e.post("/api/projects/:name/issues",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await kn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=Xj(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=Gj(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=t.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return P(s,u,de)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(te(s,"id"));return i===null?s.notFound():P(s,i,de)}),e.post("/api/issues/:id/claim",async s=>{let i=te(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await kn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):P(s,c,de)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await kn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):P(s,l,de)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(te(s,"id"));if(i===null)return s.notFound();let o=await kn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return P(s,t.dal.closeIssue(te(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(te(s,"id"));if(i===null)return s.notFound();let o=await kn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return P(s,t.dal.reopenIssue(te(s,"id"),a),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return P(s,{...i,owner:a,repo:l},de)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=te(s,"run_id"),o=s.req.query("kind"),a=Mr(t.dal,i,o);return P(s,a,de)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=te(s,"run_id"),o=s.req.param("kind"),a=Mr(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):P(s,l,de);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=Bj(l.path);if(qj(u)){let h=d(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=Oj(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return P(s,l,de)}return P(s,l,de)}),e.get("/api/runs",s=>P(s,cn(t.dal,{limit:Zd(s,"limit")??100}),tD)),e.get("/api/runs/:id",s=>{let i=Cr(t.dal,te(s,"id"));return i===null?s.notFound():P(s,i,rD)}),e.get("/api/runs/:id/where",s=>{let i=dn(t.dal,te(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Yi(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=zi(t.dal,te(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Zi(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(te(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(na(t.daemon),P(s,o,Jw)):P(s,o,Jw,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=te(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(na(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=>qw(s,t.dal,i=>P(s,i,sD))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=M_(t.dal,te(s,"id"),te(s,"step_id"));return i===null?s.notFound():Yw(s)?s.html(`<pre>${S(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>qw(s,t.dal,i=>{let o=bw(i);return P(s,o,a=>me(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>P(s,j_(t.dal,{type:s.req.query("type")}),iD)),e.get("/api/external-signals",s=>P(s,D_(t.dal,{unhandled:s.req.query("unhandled")==="true"}),oD)),e.get("/api/attentions",s=>P(s,dr(t.dal,{unacked:s.req.query("unacked")==="true"}),aD)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(te(s,"id"));return i===null?s.notFound():P(s,i,o=>`<p>acknowledged attention ${S(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=Vi(t.dal,l);return P(s,c,d=>`<h1>Escalations</h1>${me(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[S(u.attention_id),S(u.project),S(u.run_id),S(u.workflow_name),S(u.state_name),S((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Nt(t.dal,te(s,"id"));return i===null?s.notFound():P(s,i,de)}),e.post("/api/escalations/:id/respond",async s=>{let i=te(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=Nt(t.dal,i);if(c===null)return s.notFound();let d=dr(t.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);na(t.daemon);let p=dr(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=t.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(i);return na(t.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=O_(t.dal,{status:o,pr_url:i});return P(s,a,lD)}),e.get("/api/submitted-prs/:id",s=>{let i=te(s,"id"),o=$_(t.dal,i);return o===null?s.notFound():P(s,o,cD)}),e.get("/api/sessions",s=>P(s,t.dal.latestSessionSizes(),Xw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=ds(s.req.param("team_name"));return P(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),Xw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=ds(s.req.param("team_name"));try{let o=await S_(t.dal,i,s.req.param("alias"));return P(s,o,a=>Gw("compacted",a.row))}catch(o){if(o instanceof cs)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=ds(s.req.param("team_name")),o=await Nc(t.dal,i,s.req.param("alias"));return P(s,o,a=>Gw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>P(s,r,Kw)),e.post("/api/intake/scan",async s=>(r=await _o(t.dal),P(s,r,Kw))),e.get("/api/stats/run-throughput",s=>P(s,U_(t.dal),dD)),e.get("/api/daemon/state",s=>P(s,t.daemon?.state??null,uD)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return P(s,{disabled:!0},de);let i=await t.daemon.runCycle();return P(s,{state:t.daemon.state,result:i},de)}),e.get("/metrics/:project_id",s=>{let i=te(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=Cc(t.dal,i),l=Mc(t.dal,{project_id:i});return s.html(Re(`Metrics \u2014 ${o.name}`,fD(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=te(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Zd(s,"since_days");return s.json(Cc(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=te(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Zd(s,"since_days");return s.json(Mc(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(te(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function qw(t,e,r){let n=$c(e,te(t,"id"),te(t,"step_id"));return n===null?t.notFound():r(n)}function na(t){t!==void 0&&t.runCycle().catch(()=>{})}function P(t,e,r,n=200){return Yw(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 Yw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function Uj(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ra(`${t}/index.html`)?Qd(t):null;let e="src/serve/webui-dist";if(ra(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(ra(`${r}/index.html`))return r;let n=jj($j(Pj(import.meta.url)),"webui-dist");return ra(`${n}/index.html`)?Qd(n):null}function Qd(t){if(!Mj(t))return t;let e=Dj(process.cwd(),t);return e.length===0?".":e}function Wj(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function te(t,e){return Number(t.req.param(e))}function Zd(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 Bj(t){switch(Cj(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 qj(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function kn(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 Hj(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 Hw(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 Xj(t){if(t!=null)return typeof t=="string"&&zw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function Gj(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 Kj(t){return`<h1>Status</h1><div class="grid">
2074
+ `))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return Oh(o)?(sd(s,o),s.redirect("/",302)):s.html(Re("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>($h(s),s.redirect("/login",302))),Fy(e,{dal:t.dal}),Cw(e,{dal:t.dal}),rw(e,{dal:t.dal}),mw(e,{terminalSessionManager:t.terminalSessionManager}),ww(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=ds(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let d=[],u=[];for(let f of a)try{await xc(t.dal,i,f.alias),t.dal.setMemberState(f.id,"idle",null),d.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return P(s,{team:i,seeded:d,failed:u},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),Uh(e,{dal:t.dal}),Gh(e,{dal:t.dal}),e.get("/api/status",s=>P(s,Ji(t.dal),Kj)),e.get("/api/projects",s=>P(s,Xi(t.dal),Vj)),e.get("/api/teams",s=>P(s,R_(t.dal),Zj)),e.get("/api/workflows",s=>P(s,Gi(t.dal),Qj)),e.get("/api/workflows/verify",s=>{let i=Sy();return s.req.header("accept")?.includes("text/plain")?s.text(ky(i)):s.json(i)}),e.get("/api/jobs",s=>P(s,L_(t.dal,{status:s.req.query("status")}),eD)),e.post("/api/uploads",s=>Ww(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=Ki(t.dal,te(s,"id"));return i===null?s.notFound():P(s,i,ue)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=t.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=t.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=t.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),u=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return P(s,u,ue)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Do(),My)),o=Ki(t.dal,te(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():P(s,i,ue)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():P(s,t.dal.listProjectWorkflows(i.id),Yj)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await kn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{un(d)}catch{return s.text("invalid condition",400)}let u=Hj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:f});return P(s,m,ue)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(te(s,"id"));return i===null?s.notFound():P(s,i,ue)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(te(s,"id"))?P(s,{removed:!0},ue):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(te(s,"id"),!0);return i===null?s.notFound():P(s,i,ue)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(te(s,"id"),!1);return i===null?s.notFound():P(s,i,ue)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Hw(s.req.query("status"),Jj);if(typeof o=="string")return s.text(o,400);let a=Hw(s.req.query("severity"),zw);return typeof a=="string"?s.text(a,400):P(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),zj)}),e.post("/api/projects/:name/issues",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await kn(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=Xj(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=Gj(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=t.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return P(s,u,ue)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(te(s,"id"));return i===null?s.notFound():P(s,i,ue)}),e.post("/api/issues/:id/claim",async s=>{let i=te(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await kn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):P(s,c,ue)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await kn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):P(s,l,ue)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(te(s,"id"));if(i===null)return s.notFound();let o=await kn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return P(s,t.dal.closeIssue(te(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),ue)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(te(s,"id"));if(i===null)return s.notFound();let o=await kn(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return P(s,t.dal.reopenIssue(te(s,"id"),a),ue)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return P(s,{...i,owner:a,repo:l},ue)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=te(s,"run_id"),o=s.req.query("kind"),a=Mr(t.dal,i,o);return P(s,a,ue)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=te(s,"run_id"),o=s.req.param("kind"),a=Mr(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):P(s,l,ue);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=Bj(l.path);if(qj(u)){let h=d(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=Oj(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return P(s,l,ue)}return P(s,l,ue)}),e.get("/api/runs",s=>P(s,cn(t.dal,{limit:Qd(s,"limit")??100}),tD)),e.get("/api/runs/:id",s=>{let i=Cr(t.dal,te(s,"id"));return i===null?s.notFound():P(s,i,rD)}),e.get("/api/runs/:id/where",s=>{let i=dn(t.dal,te(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Yi(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=zi(t.dal,te(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Zi(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(te(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(na(t.daemon),P(s,o,Jw)):P(s,o,Jw,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=te(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(na(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=>qw(s,t.dal,i=>P(s,i,sD))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=M_(t.dal,te(s,"id"),te(s,"step_id"));return i===null?s.notFound():Yw(s)?s.html(`<pre>${S(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>qw(s,t.dal,i=>{let o=bw(i);return P(s,o,a=>me(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>P(s,j_(t.dal,{type:s.req.query("type")}),iD)),e.get("/api/external-signals",s=>P(s,D_(t.dal,{unhandled:s.req.query("unhandled")==="true"}),oD)),e.get("/api/attentions",s=>P(s,dr(t.dal,{unacked:s.req.query("unacked")==="true"}),aD)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(te(s,"id"));return i===null?s.notFound():P(s,i,o=>`<p>acknowledged attention ${S(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=Vi(t.dal,l);return P(s,c,d=>`<h1>Escalations</h1>${me(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[S(u.attention_id),S(u.project),S(u.run_id),S(u.workflow_name),S(u.state_name),S((u.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Nt(t.dal,te(s,"id"));return i===null?s.notFound():P(s,i,ue)}),e.post("/api/escalations/:id/respond",async s=>{let i=te(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=Nt(t.dal,i);if(c===null)return s.notFound();let d=dr(t.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);na(t.daemon);let p=dr(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let u=t.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(i);return na(t.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=O_(t.dal,{status:o,pr_url:i});return P(s,a,lD)}),e.get("/api/submitted-prs/:id",s=>{let i=te(s,"id"),o=$_(t.dal,i);return o===null?s.notFound():P(s,o,cD)}),e.get("/api/sessions",s=>P(s,t.dal.latestSessionSizes(),Xw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=ds(s.req.param("team_name"));return P(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),Xw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=ds(s.req.param("team_name"));try{let o=await S_(t.dal,i,s.req.param("alias"));return P(s,o,a=>Gw("compacted",a.row))}catch(o){if(o instanceof cs)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=ds(s.req.param("team_name")),o=await xc(t.dal,i,s.req.param("alias"));return P(s,o,a=>Gw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>P(s,r,Kw)),e.post("/api/intake/scan",async s=>(r=await _o(t.dal),P(s,r,Kw))),e.get("/api/stats/run-throughput",s=>P(s,U_(t.dal),dD)),e.get("/api/daemon/state",s=>P(s,t.daemon?.state??null,uD)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return P(s,{disabled:!0},ue);let i=await t.daemon.runCycle();return P(s,{state:t.daemon.state,result:i},ue)}),e.get("/metrics/:project_id",s=>{let i=te(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=Mc(t.dal,i),l=jc(t.dal,{project_id:i});return s.html(Re(`Metrics \u2014 ${o.name}`,fD(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=te(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Qd(s,"since_days");return s.json(Mc(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=te(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Qd(s,"since_days");return s.json(jc(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(te(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function qw(t,e,r){let n=Cc(e,te(t,"id"),te(t,"step_id"));return n===null?t.notFound():r(n)}function na(t){t!==void 0&&t.runCycle().catch(()=>{})}function P(t,e,r,n=200){return Yw(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 Yw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function Uj(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ra(`${t}/index.html`)?eu(t):null;let e="src/serve/webui-dist";if(ra(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(ra(`${r}/index.html`))return r;let n=jj($j(Pj(import.meta.url)),"webui-dist");return ra(`${n}/index.html`)?eu(n):null}function eu(t){if(!Mj(t))return t;let e=Dj(process.cwd(),t);return e.length===0?".":e}function Wj(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function te(t,e){return Number(t.req.param(e))}function Qd(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 Bj(t){switch(Cj(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 qj(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function kn(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 Hj(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 Hw(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 Xj(t){if(t!=null)return typeof t=="string"&&zw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function Gj(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 Kj(t){return`<h1>Status</h1><div class="grid">
2075
2075
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
2076
2076
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
2077
2077
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
2078
2078
  <div class="metric"><strong>${t.attentions.unacked}</strong><br>unacked attentions</div>
2079
2079
  </div><p class="muted">generated ${S(t.generated_at)}</p>`}function Vj(t){return`<h1>Projects</h1>${me(["id","name","workflow","team","path"],t.map(e=>[S(e.id),S(e.name),S(e.workflow_name),S(e.team_id),S(e.local_path)]))}`}function Yj(t){return`<h1>Project Workflows</h1>${me(["id","workflow","condition","priority","enabled"],t.map(e=>[S(e.id),S(e.workflow_id),S(e.condition),S(e.priority),S(e.enabled)]))}`}function zj(t){return`<h1>Issues</h1>${me(["id","status","severity","title","ai test"],t.map(e=>[S(e.id),S(e.status),S(e.severity),S(e.title),S(e.ai_test_path)]))}`}function Zj(t){return`<h1>Teams</h1>${me(["id","name","members"],t.map(e=>[S(e.id),S(e.name),S(e.members.map(r=>r.alias).join(", "))]))}`}function Qj(t){return`<h1>Workflows</h1>${me(["id","name","version"],t.map(e=>[S(e.id),`<a href="/workflows/${encodeURIComponent(e.name)}">${S(e.name)}</a>`,S(e.version)]))}`}function eD(t){return`<h1>Jobs</h1>${me(["id","status","source","source_ref","run"],t.map(e=>[S(e.id),S(e.status),S(e.source),S(e.source_ref),S(e.run_id)]))}`}function tD(t){return`<h1>Runs</h1>${me(["id","job","current","terminal","started"],t.map(e=>[`<a href="/runs/${e.id}">${S(e.id)}</a>`,S(e.job_id),S(e.current_state),S(e.terminal_state),S(e.started_at)]))}`}function rD(t){let e=nD(t);return`<h1>Run ${S(t.id)}</h1>
2080
- ${de({id:t.id,terminal_state:t.terminal_state,current_state:t.current_state,job_id:t.job_id})}
2080
+ ${ue({id:t.id,terminal_state:t.terminal_state,current_state:t.current_state,job_id:t.job_id})}
2081
2081
  ${e}
2082
2082
  <h2>Steps</h2>
2083
2083
  ${me(["id","state","outcome","detail"],t.steps.map(r=>[`<span hx-get="/api/runs/${t.id}/steps/${r.id}" hx-target="#step-${r.id}" hx-swap="innerHTML">${S(r.id)}</span><div id="step-${r.id}"></div>`,S(r.state_name),S(r.outcome),S(r.status_detail)]))}`}function nD(t){let e="__paused__:";if(typeof t.current_state!="string"||!t.current_state.startsWith(e)||t.workflow===null)return"";let r=t.current_state.slice(e.length),n;try{n=JSON.parse(t.workflow.definition)}catch{return`<section class="pause"><h2>Paused at ${S(r)}</h2><p>(workflow definition unparseable)</p></section>`}let s=n.states?.[r],i=s?.schema?.outcomes??[];if(i.length===0)return`<section class="pause"><h2>Paused at ${S(r)}</h2><p>(state has no declared outcomes)</p></section>`;let o=typeof s?.prompt=="string"?s.prompt:"",l=[...t.steps].reverse().find(f=>f.state_name===r)?.artifacts.find(f=>f.kind==="pause_context"),c="";if(l?.content!==null&&l?.content!==void 0)try{let f=JSON.parse(l.content);typeof f.prompt=="string"&&(c=f.prompt)}catch{}let d=c!==""?c:o,u=i.map((f,m)=>`<label class="pause-outcome"><input type="radio" name="outcome" value="${S(f)}"${m===0?" checked":""}/> <code>${S(f)}</code></label>`).join(" ");return`<section class="pause" id="pause-section" style="border:2px solid #d28e00;background:#fff8e6;padding:1em;margin:1em 0;">
@@ -2091,7 +2091,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2091
2091
  </fieldset>
2092
2092
  </form>
2093
2093
  <div id="pause-result" style="margin-top:0.6em;"></div>
2094
- </section>`}function sD(t){return`<section><h3>${S(t.state_name)}</h3>${de(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 Jw(t){return t.resumed?`<p>resumed run ${S(t.run.id)}</p>`:`<p>resume failed: ${S(t.reason)}</p>`}function iD(t){return`<h1>External Objects</h1>${me(["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 oD(t){return`<h1>External Signals</h1>${me(["id","object","kind","handled"],t.map(e=>[S(e.id),S(e.object_id),S(e.kind),S(e.handled_at)]))}`}function aD(t){let e=`<style>
2094
+ </section>`}function sD(t){return`<section><h3>${S(t.state_name)}</h3>${ue(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 Jw(t){return t.resumed?`<p>resumed run ${S(t.run.id)}</p>`:`<p>resume failed: ${S(t.reason)}</p>`}function iD(t){return`<h1>External Objects</h1>${me(["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 oD(t){return`<h1>External Signals</h1>${me(["id","object","kind","handled"],t.map(e=>[S(e.id),S(e.object_id),S(e.kind),S(e.handled_at)]))}`}function aD(t){let e=`<style>
2095
2095
  @keyframes attn-flicker { 0%,100%{background:#fff8e6;} 50%{background:#ffd766;} }
2096
2096
  tr.requires-user { animation: attn-flicker 1.4s ease-in-out infinite; font-weight:600; }
2097
2097
  tr.requires-user td:first-child::before { content:"\u2605 "; color:#d28e00; }
@@ -2105,7 +2105,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2105
2105
  <dt>submitted_at</dt><dd>${S(t.submitted_at)}</dd>
2106
2106
  <dt>last_scanned_at</dt><dd>${S(t.last_scanned_at??"\u2014")}</dd>
2107
2107
  <dt>last_known_state</dt><dd>${S(t.last_known_state??"\u2014")}</dd>
2108
- </dl>`}function Xw(t){return`<h1>Sessions</h1>${me(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=Ui(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 Gw(t,e){return e===null?`<span>${S(t)}</span>`:`<span>${S(t)} ${S(e.team_name)}/${S(e.alias)}</span>`}function dD(t){return`<h1>Run Throughput</h1>${me(["workflow","terminal","count"],t.map(e=>[S(e.workflow_name),S(e.terminal_state),S(e.count)]))}`}function Kw(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${me(["project","scanned","new jobs","error"],t.map(e=>[S(e.project_name),S(e.scanned),S(e.new_jobs),S(e.error)]))}`}function uD(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${de(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function fD(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)]),i=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)]),o=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>
2108
+ </dl>`}function Xw(t){return`<h1>Sessions</h1>${me(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=Ui(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 Gw(t,e){return e===null?`<span>${S(t)}</span>`:`<span>${S(t)} ${S(e.team_name)}/${S(e.alias)}</span>`}function dD(t){return`<h1>Run Throughput</h1>${me(["workflow","terminal","count"],t.map(e=>[S(e.workflow_name),S(e.terminal_state),S(e.count)]))}`}function Kw(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${me(["project","scanned","new jobs","error"],t.map(e=>[S(e.project_name),S(e.scanned),S(e.new_jobs),S(e.error)]))}`}function uD(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${ue(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function fD(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)]),i=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)]),o=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>
2109
2109
  <h2>Request-changes rate</h2>
2110
2110
  <p>Total: ${S(n.request_changes)} of ${S(n.total)} steps (${S(n.rate_pct)})</p>
2111
2111
  ${me(["state","total steps","request_changes","rate"],s)}
@@ -2114,20 +2114,20 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2114
2114
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
2115
2115
  ${me(["state","retried runs","avg attempts"],o)}
2116
2116
  <h2>Tool efficacy</h2>
2117
- ${me(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Jj,zw,Zw=E(()=>{"use strict";Qc();ms();Mh();Wh();Kh();Ht();cd();Gy();tw();aw();pw();Ew();Sw();Dw();Wi();Bw();Co();Jj=["open","assigned","closed","reopened"],zw=["low","medium","high","critical"]});function mD(t){return Math.floor(t/6e4)*6e4}function pD(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)_D(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function _D(t,e){let r=Date.now(),n=mD(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 i={};try{i=JSON.parse(e.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let i=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Qw(t,e=250){let r=setInterval(()=>{try{pD(t)}catch{}},e);return{stop(){clearInterval(r)}}}var eE=E(()=>{"use strict"});function gD({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
2117
+ ${me(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Jj,zw,Zw=E(()=>{"use strict";ed();ms();Mh();Wh();Kh();Ht();dd();Gy();tw();aw();pw();Ew();Sw();Dw();Wi();Bw();Co();Jj=["open","assigned","closed","reopened"],zw=["low","medium","high","critical"]});function mD(t){return Math.floor(t/6e4)*6e4}function pD(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)_D(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function _D(t,e){let r=Date.now(),n=mD(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 i={};try{i=JSON.parse(e.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let i=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Qw(t,e=250){let r=setInterval(()=>{try{pD(t)}catch{}},e);return{stop(){clearInterval(r)}}}var eE=E(()=>{"use strict"});function gD({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
2118
2118
  FROM run r
2119
2119
  JOIN job j ON j.id = r.job_id
2120
2120
  WHERE j.project_id = ?
2121
2121
  AND r.terminal_state IS NOT NULL
2122
2122
  ORDER BY r.id DESC
2123
- LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,hD).length>0))continue;let i=n[0].team_id,o=t.listTeamMembers(i),a=o.find(l=>l.alias.toLowerCase().includes("coder"))??o[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,tE)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:tE,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 rE(t){for(let e of yD)try{e(t)}catch{}}var hD,tE,yD,nE=E(()=>{"use strict";hD="request_changes",tE="reviewer_rejection_rate_high";yD=[gD]});import{hostname as eu}from"node:os";function gr(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},i=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),o=i===null||i.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...o?{stale_before:n}:{},force:e.force});if(a.acquired){let c=i===null?null:e.force===!0?"force":i.holder_pid===null&&i.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:i,reclaimReason:c}}if(!aE(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function sa(t){return t.status!=="running"?null:t.holder_host===eu()&&t.holder_pid!==null&&t.holder_pid>0?ot(t.holder_pid)?"live":"dead":"unknown"}function Yt(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&wD(n))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:n};let s=ED(t,e,r);if(s!==null)return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:s};let i=t.getAgentInflight(e,r);if(i===null)return{busy:!1};let o=new Date(Date.now()-lE()).toISOString();return aE(i,o)?{busy:!1}:{busy:!0,reason:"in-flight",inFlight:i}}function wD(t){if(t.holder_host===eu())return ot(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=TD():!1}function ED(t,e,r){let s=t.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
2123
+ 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,hD).length>0))continue;let i=n[0].team_id,o=t.listTeamMembers(i),a=o.find(l=>l.alias.toLowerCase().includes("coder"))??o[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,tE)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:tE,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 rE(t){for(let e of yD)try{e(t)}catch{}}var hD,tE,yD,nE=E(()=>{"use strict";hD="request_changes",tE="reviewer_rejection_rate_high";yD=[gD]});import{hostname as tu}from"node:os";function gr(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},i=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),o=i===null||i.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...o?{stale_before:n}:{},force:e.force});if(a.acquired){let c=i===null?null:e.force===!0?"force":i.holder_pid===null&&i.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:i,reclaimReason:c}}if(!aE(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function sa(t){return t.status!=="running"?null:t.holder_host===tu()&&t.holder_pid!==null&&t.holder_pid>0?ot(t.holder_pid)?"live":"dead":"unknown"}function Yt(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&wD(n))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:n};let s=ED(t,e,r);if(s!==null)return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:s};let i=t.getAgentInflight(e,r);if(i===null)return{busy:!1};let o=new Date(Date.now()-lE()).toISOString();return aE(i,o)?{busy:!1}:{busy:!0,reason:"in-flight",inFlight:i}}function wD(t){if(t.holder_host===tu())return ot(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=TD():!1}function ED(t,e,r){let s=t.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
2124
2124
  FROM tracked_invocation
2125
2125
  WHERE target_teamfile = ?
2126
2126
  AND target_alias = ?
2127
2127
  AND status = 'running'
2128
2128
  AND launch_source = 'terminal'
2129
2129
  ORDER BY started_at DESC, id DESC
2130
- LIMIT 1`,e,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===eu())?ot(s.holder_pid)?s:null:oE(s)?s:null}function oE(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=lE():!1}function aE(t,e){return t.holder_pid===null?t.started_at<e:!ot(t.holder_pid)}function lE(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return sE;let r=Number(e);return!Number.isFinite(r)||r<=0?sE:r}function TD(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return iE;let r=Number(e);return!Number.isFinite(r)||r<=0?iE:r}var sE,iE,Br=E(()=>{"use strict";Yn();sE=8*60*60*1e3,iE=12e4});async function O(t,e){if(t.dal!==void 0)return e(t.dal);let r=ke({path:Z()});try{return await e(r)}finally{r.close()}}function Q(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),i=[],o={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function F(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function K(t,e){return t.flags[e]===!0}function le(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
2130
+ LIMIT 1`,e,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===tu())?ot(s.holder_pid)?s:null:oE(s)?s:null}function oE(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=lE():!1}function aE(t,e){return t.holder_pid===null?t.started_at<e:!ot(t.holder_pid)}function lE(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return sE;let r=Number(e);return!Number.isFinite(r)||r<=0?sE:r}function TD(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return iE;let r=Number(e);return!Number.isFinite(r)||r<=0?iE:r}var sE,iE,Br=E(()=>{"use strict";Yn();sE=8*60*60*1e3,iE=12e4});async function O(t,e){if(t.dal!==void 0)return e(t.dal);let r=ke({path:Z()});try{return await e(r)}finally{r.close()}}function Q(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),i=[],o={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function F(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function K(t,e){return t.flags[e]===!0}function le(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
2131
2131
  `)}function v(t,e){return t.stderr.write(`error: ${e}
2132
2132
  `),1}function Pe(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
2133
2133
  `),2}var Le=E(()=>{"use strict";Qe();Be()});import{hostname as uE}from"node:os";async function oa(t){let e=t.finalize??"auto";await aa(t.io,t.env);let r=await O(t.io,m=>m.listEnqueuedRequestMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)),n=r.length===0?[]:await O(t.io,m=>m.claimMailForDelivery(r.map(p=>p.id),new Date().toISOString(),process.pid,uE())),s=bD(n,t.newMessage,{newMessageFrom:t.newMessageFrom??pE(t.sender)});if(s.length===0)throw new Error(`no queued mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let i=!1,o=ce(),a=0,l=0,c=0,d={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:s,permissionMode:t.permissionMode,env:t.env,onDelta:m=>{i=!0,o&&(a+=1,c=Buffer.byteLength(m,"utf8"),l+=c),t.onDelta?.(m)},onProgress:m=>t.onProgress?.(m)};t.receiver.model!==void 0&&(d.model=t.receiver.model),t.receiver.effort!==void 0&&(d.effort=t.receiver.effort),d.alias=t.receiver.alias,d.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(d.timeoutMs=t.idleTimeoutMs);let u;try{zt("mailbox_delivery_attempt_started",n,{batch_ids:n.map(m=>m.id),provider:t.receiver.provider,receiver_session_id:t.receiver.sessionId}),await t.onPromptBuilt?.(s),u=await kt(d)}catch(m){let p=m instanceof Error?m.message:String(m);if(zt("mailbox_delivery_attempt_failed",n,{error_message:p}),e==="auto"&&await dE(t.io,n,"provider-or-preflight-error",p),e==="caller")return{status:"error",receipt:p,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,error:p};throw m}if(o&&Oe(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:i,blockCount:a,streamedBytes:l,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:c,tailPreview:u.text.slice(-200)})),u.status==="stalled")return zt("mailbox_delivery_attempt_stalled",n,{stalled_after_ms:u.stalledAfterMs,duration_ms:u.durationMs}),e==="auto"&&await dE(t.io,n,"provider-stalled"),{status:"stalled",receipt:u.text,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let f=n.map(m=>m.id);return e==="auto"&&await ia(t.io,n,u.text),{status:"ok",receipt:u.text,prompt:s,queued:n,deliveredIds:f,wroteDelta:i,durationMs:u.durationMs}}async function fE(t){await aa(t.io,t.env);let e=await O(t.io,i=>i.listEnqueuedResponseMailFromSender(t.sender.teamfile,t.sender.alias,t.receiver.teamfile,t.receiver.alias)),r=e.length===0?[]:await O(t.io,i=>i.claimMailForDelivery(e.map(o=>o.id),new Date().toISOString(),process.pid,uE())),n=SD(r);if(n.length===0)throw new Error(`no queued response mail to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let s={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:n,permissionMode:t.permissionMode,env:t.env,alias:t.receiver.alias,isLead:t.receiver.isLead};t.receiver.model!==void 0&&(s.model=t.receiver.model),t.receiver.effort!==void 0&&(s.effort=t.receiver.effort),t.idleTimeoutMs!==void 0&&(s.timeoutMs=t.idleTimeoutMs),zt("mailbox_delivery_attempt_started",r,{batch_ids:r.map(i=>i.id),provider:t.receiver.provider,receiver_session_id:t.receiver.sessionId});try{let i=await kt(s);if(i.status==="stalled"){let a=`response delivery error: provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}
@@ -2140,27 +2140,27 @@ ${i.text}`;return zt("mailbox_delivery_attempt_stalled",r,{stalled_after_ms:i.st
2140
2140
 
2141
2141
  `)}function mE(t){return t.sender_teamfile===null||t.sender_alias===null?"operator":pE({teamfile:t.sender_teamfile,alias:t.sender_alias})}function pE(t){return`${t.teamfile}:${t.alias}`}async function ia(t,e,r){if(e.length!==0)try{await O(t,n=>{n.markRelayRequestDelivered(e,r,new Date().toISOString())})}catch(n){let s=n instanceof Error?n.message:String(n);zt("mailbox_delivery_finalize_failed",e,{error_message:s}),t.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${s}
2142
2142
  `)}}async function dE(t,e,r,n){if(e.length!==0)try{let s=await O(t,i=>e.map(o=>({row:o,cleared:i.reclaimMailboxDeliveryIfUnchanged(o)!==null})));for(let i of s)zt(i.cleared?"mailbox_delivery_cleared":"mailbox_delivery_clear_skipped",[i.row],{transition:i.cleared?"delivering->pending":"delivering->delivering",reason:r,...n===void 0?{}:{error_message:n}})}catch(s){let i=s instanceof Error?s.message:String(s);zt("mailbox_delivery_clear_failed",e,{reason:r,error_message:i,...n===void 0?{}:{causing_error:n}}),t.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${i}
2143
- `)}}async function aa(t,e=process.env){try{await O(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-tu(e)).toISOString())})}catch{}}function tu(t=process.env){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return cE;let r=Number(e);return!Number.isFinite(r)||r<=0?cE:r}function zt(t,e,r={}){let n=new Date().toISOString();for(let s of e)M({event:t,event_at:n,message_id:s.id,message_type:s.message_type,lane_key:JSON.stringify([s.sender_teamfile,s.sender_alias,s.receiver_teamfile,s.receiver_alias]),sender_teamfile:s.sender_teamfile,sender_alias:s.sender_alias,receiver_teamfile:s.receiver_teamfile,receiver_alias:s.receiver_alias,message_created_at:s.created_at,delivering_at:s.delivering_at,delivered_at:s.delivered_at,delivery_holder_pid:s.delivery_holder_pid,delivery_holder_host:s.delivery_holder_host,...r})}var cE,ru=E(()=>{"use strict";It();ue();Le();cE=60*60*1e3});import{basename as vD}from"node:path";function gE(t,e){let r=new Date(e.now.getTime()-yr()).toISOString(),n=EE(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=ND(e.sender,n),i=xD(e.sender,n);i!==null&&i.teamfile===e.root&&!hE(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(f=>hE(f,o)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,d=c!==null&&e.now.getTime()-c<kD;return{stop:l.length>=1&&d,chain:AD(a)}}function yE(t,e){let r=new Date(e.now.getTime()-yr()).toISOString(),n=EE(t,r),s=TE(e.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function yr(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return _E;let r=Number(e);return!Number.isFinite(r)||r<=0?_E:r}function wE(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function ID(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 EE(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(ID).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function ND(t,e,r={}){let n=new Map;for(let a of e)n.set(qr(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([qr(t)]);for(let a=0;a<64;a+=1){let l=n.get(qr(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let d=qr(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function TE(t,e){let r=qr(t),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let c=qr(l.sender),d=qr(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function xD(t,e){let r=TE(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function hE(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function qr(t){return`${t.teamfile}\0${t.alias}`}function AD(t){return t.map(e=>`${vD(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var kD,_E,la=E(()=>{"use strict";kD=6e4,_E=8*60*60*1e3});function bE(t){if(t.length===0||!t.startsWith("---"))throw new Rt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
2144
- `);if(e[0]!=="---")throw new Rt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Rt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!RD.has(c))throw new Rt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ca.join(", ")}`);r[c]=d}if(n===-1)throw new Rt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of ca)if(r[o]===void 0)throw new Rt(`missing required frontmatter key "${o}" \u2014 required: ${ca.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var ca,RD,Rt,SE=E(()=>{"use strict";ca=["title","description","members"],RD=new Set(ca),Rt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as LD,writeFileSync as S8,renameSync as v8,existsSync as kE}from"node:fs";import{basename as OD,resolve as In,dirname as nu}from"node:path";function CD(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];e[s]=i}return e}function MD(t){return/^\s*_MEMBER_\s+\S/.test(t)}function jD(t){return/^\s*_SESSION_\s+\S/.test(t)}function DD(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function da(t){let e=OD(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Fe(t){let e=LD(t,"utf-8"),r=nu(In(t)),n=iu(e,da(t),{baseDir:r,sourcePath:In(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=In(r,s.sessiondir));return n}function iu(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2143
+ `)}}async function aa(t,e=process.env){try{await O(t,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-ru(e)).toISOString())})}catch{}}function ru(t=process.env){let e=t.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(e===void 0||e.trim()==="")return cE;let r=Number(e);return!Number.isFinite(r)||r<=0?cE:r}function zt(t,e,r={}){let n=new Date().toISOString();for(let s of e)C({event:t,event_at:n,message_id:s.id,message_type:s.message_type,lane_key:JSON.stringify([s.sender_teamfile,s.sender_alias,s.receiver_teamfile,s.receiver_alias]),sender_teamfile:s.sender_teamfile,sender_alias:s.sender_alias,receiver_teamfile:s.receiver_teamfile,receiver_alias:s.receiver_alias,message_created_at:s.created_at,delivering_at:s.delivering_at,delivered_at:s.delivered_at,delivery_holder_pid:s.delivery_holder_pid,delivery_holder_host:s.delivery_holder_host,...r})}var cE,nu=E(()=>{"use strict";It();de();Le();cE=60*60*1e3});import{basename as vD}from"node:path";function gE(t,e){let r=new Date(e.now.getTime()-yr()).toISOString(),n=EE(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=ND(e.sender,n),i=xD(e.sender,n);i!==null&&i.teamfile===e.root&&!hE(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(f=>hE(f,o)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,d=c!==null&&e.now.getTime()-c<kD;return{stop:l.length>=1&&d,chain:AD(a)}}function yE(t,e){let r=new Date(e.now.getTime()-yr()).toISOString(),n=EE(t,r),s=TE(e.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function yr(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return _E;let r=Number(e);return!Number.isFinite(r)||r<=0?_E:r}function wE(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function ID(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 EE(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(ID).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function ND(t,e,r={}){let n=new Map;for(let a of e)n.set(qr(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([qr(t)]);for(let a=0;a<64;a+=1){let l=n.get(qr(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let d=qr(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function TE(t,e){let r=qr(t),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let c=qr(l.sender),d=qr(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function xD(t,e){let r=TE(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function hE(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function qr(t){return`${t.teamfile}\0${t.alias}`}function AD(t){return t.map(e=>`${vD(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var kD,_E,la=E(()=>{"use strict";kD=6e4,_E=8*60*60*1e3});function bE(t){if(t.length===0||!t.startsWith("---"))throw new Rt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
2144
+ `);if(e[0]!=="---")throw new Rt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Rt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!RD.has(c))throw new Rt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ca.join(", ")}`);r[c]=d}if(n===-1)throw new Rt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of ca)if(r[o]===void 0)throw new Rt(`missing required frontmatter key "${o}" \u2014 required: ${ca.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var ca,RD,Rt,SE=E(()=>{"use strict";ca=["title","description","members"],RD=new Set(ca),Rt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as LD,writeFileSync as S8,renameSync as v8,existsSync as kE}from"node:fs";import{basename as OD,resolve as In,dirname as su}from"node:path";function CD(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];e[s]=i}return e}function MD(t){return/^\s*_MEMBER_\s+\S/.test(t)}function jD(t){return/^\s*_SESSION_\s+\S/.test(t)}function DD(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function da(t){let e=OD(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Fe(t){let e=LD(t,"utf-8"),r=su(In(t)),n=ou(e,da(t),{baseDir:r,sourcePath:In(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=In(r,s.sessiondir));return n}function ou(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2145
2145
  `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=bE(i)}catch(l){if(l instanceof Rt)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
2146
2146
  `);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(jD(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(DD(c)||!MD(c))continue;let u=CD(c);for(let p of Object.keys(u))if(!vE.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2147
- allowed keys: ${vE.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:o}}function ou(t,e){let r=[];for(let i of t.parseErrors)r.push({field:"session",message:i});let n=t.members.filter(i=>i.alias.toLowerCase()===su.toLowerCase());n.length>1&&r.push({field:su,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?In(e,i.teamfile):In(i.teamfile);if(!kE(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=Fe(a),c=Lt(l);c?c.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else $D.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function Lt(t){return t.members.find(e=>e.alias.toLowerCase()===su.toLowerCase())}function au(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=In(e,t.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!kE(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=Fe(i),l=Lt(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return au(l,nu(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||nu(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function ua(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var su,$D,vE,Zt=E(()=>{"use strict";SE();su="Lead",$D=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);vE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as PD}from"node:crypto";import{existsSync as Rs,mkdirSync as FD,readFileSync as xE,realpathSync as UD,writeFileSync as WD}from"node:fs";import{basename as IE,dirname as AE,resolve as RE}from"node:path";function Te(t,e){let r=RE(t);if(Rs(r))return UD(r);if(e!==void 0){let n=HD(t,r,e);if(n!==null)return n}return r}function NE(t,e){let r=AE(e),n=iu(t,da(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=RE(r,s.sessiondir));return n}function Ue(t,e){let r=Te(t,qD(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Rs(r)&&"upsertRootTeam"in e&&(FD(AE(r),{recursive:!0}),WD(r,n.raw_text,"utf8")),NE(n.raw_text,r);if(Rs(r)){let s=xE(r,"utf8"),i=NE(s,r);return"upsertRootTeam"in e&&JD(i)&&XD(e,r,i,s),i}throw new Error(`teamfile not found: ${t}`)}if(!Rs(r))throw new Error(`teamfile not found: ${t}`);return Fe(r)}function LE(t,e,r){let n=Te(t,e),s=e.getRootTeam(n);s===null||!Rs(n)||xE(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 qD(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function HD(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=IE(t),i=da(t),o=r.listRootTeams().filter(l=>IE(l.teamfile_path)===s||l.name===i);if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function JD(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=BD)}function XD(t,e,r,n){let s=new Date().toISOString(),i={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:PD("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(i)}var BD,Ot=E(()=>{"use strict";Zt();BD=5});import{existsSync as GD}from"node:fs";import{dirname as OE}from"node:path";function YD(t){return KD.test(t)||VD.test(t)}function $E(t){return fa.test(t)}function Hr(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!fa.test(n)?null:{teamfile:r,alias:n}}function $e(t,e,r){if(!t.endsWith(".lmctl"))throw new we(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!$E(e))throw new we(`lmctl: "${e}" is not a valid alias (must match ${fa.source}).`);let n=Te(t,r);if(r===void 0&&!GD(n))throw new we(`lmctl: teamfile not found: ${t}`);let s;try{s=Ue(n,r)}catch(o){throw new we(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new we(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=ua(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new we(`lmctl: alias "${e}" not found in ${t}.
2148
- Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=au(i,OE(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new we(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
2147
+ allowed keys: ${vE.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:o}}function au(t,e){let r=[];for(let i of t.parseErrors)r.push({field:"session",message:i});let n=t.members.filter(i=>i.alias.toLowerCase()===iu.toLowerCase());n.length>1&&r.push({field:iu,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?In(e,i.teamfile):In(i.teamfile);if(!kE(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=Fe(a),c=Lt(l);c?c.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else $D.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function Lt(t){return t.members.find(e=>e.alias.toLowerCase()===iu.toLowerCase())}function lu(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=In(e,t.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!kE(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=Fe(i),l=Lt(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return lu(l,su(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||su(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function ua(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var iu,$D,vE,Zt=E(()=>{"use strict";SE();iu="Lead",$D=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);vE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as PD}from"node:crypto";import{existsSync as Rs,mkdirSync as FD,readFileSync as xE,realpathSync as UD,writeFileSync as WD}from"node:fs";import{basename as IE,dirname as AE,resolve as RE}from"node:path";function Te(t,e){let r=RE(t);if(Rs(r))return UD(r);if(e!==void 0){let n=HD(t,r,e);if(n!==null)return n}return r}function NE(t,e){let r=AE(e),n=ou(t,da(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=RE(r,s.sessiondir));return n}function Ue(t,e){let r=Te(t,qD(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Rs(r)&&"upsertRootTeam"in e&&(FD(AE(r),{recursive:!0}),WD(r,n.raw_text,"utf8")),NE(n.raw_text,r);if(Rs(r)){let s=xE(r,"utf8"),i=NE(s,r);return"upsertRootTeam"in e&&JD(i)&&XD(e,r,i,s),i}throw new Error(`teamfile not found: ${t}`)}if(!Rs(r))throw new Error(`teamfile not found: ${t}`);return Fe(r)}function LE(t,e,r){let n=Te(t,e),s=e.getRootTeam(n);s===null||!Rs(n)||xE(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 qD(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function HD(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=IE(t),i=da(t),o=r.listRootTeams().filter(l=>IE(l.teamfile_path)===s||l.name===i);if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function JD(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=BD)}function XD(t,e,r,n){let s=new Date().toISOString(),i={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:PD("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(i)}var BD,Ot=E(()=>{"use strict";Zt();BD=5});import{existsSync as GD}from"node:fs";import{dirname as OE}from"node:path";function YD(t){return KD.test(t)||VD.test(t)}function $E(t){return fa.test(t)}function Hr(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!fa.test(n)?null:{teamfile:r,alias:n}}function $e(t,e,r){if(!t.endsWith(".lmctl"))throw new we(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!$E(e))throw new we(`lmctl: "${e}" is not a valid alias (must match ${fa.source}).`);let n=Te(t,r);if(r===void 0&&!GD(n))throw new we(`lmctl: teamfile not found: ${t}`);let s;try{s=Ue(n,r)}catch(o){throw new we(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new we(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=ua(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new we(`lmctl: alias "${e}" not found in ${t}.
2148
+ Known aliases: ${o}`)}if(i.teamfile!==void 0){let o=lu(i,OE(n));return{teamfile:n,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(i.session===void 0)throw new we(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
2149
2149
  Run: lmctl seed ${t}`);return{teamfile:n,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??OE(n),isLead:Lt(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}function wr(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 o={mode:"managed"};return s.run!==void 0&&(o.run=s.run),s.project!==void 0&&(o.project=s.project),s.workflow!==void 0&&(o.workflow=s.workflow),o}if(r!==void 0){let o=Hr(r);if(o!==null)return n!==void 0&&n!==o.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:o.teamfile,alias:o.alias};if(r.endsWith(".lmctl"))return n!==void 0?$E(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${fa.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
2150
2150
  Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(YD(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.
2151
2151
  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}".
2152
2152
  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 o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${t.name}: a target is required.
2153
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var we,KD,VD,fa,ht=E(()=>{"use strict";Zt();Ot();we=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},KD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,VD=/^ses_[A-Za-z0-9_-]+$/,fa=/^[A-Za-z][A-Za-z0-9_-]*$/});function ma(t){return ZD.has(t)}function cu(){return lu===null&&(lu=bt(vt())),lu}function du(t,e,r={}){if(!ma(t))return null;try{let n=cu().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&r.isLead===!0?hi({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?zD[t]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:t,model:r.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...CE[t]??[]]}catch{return null}}function pa(t,e,r={}){let n=du(t,e,r);return n===null?null:n.join(" ")}function Ye(t,e){return cu().getSession(t,e)}async function Nn(t){return(await cu().resolveSessions(t)).map(r=>r.provider.name)}var CE,zD,ZD,ME,lu,Er=E(()=>{"use strict";It();bl();CE={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},zD={claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t]},ZD=new Set(Object.keys(CE)),ME=/^[\w.:-]+$/;lu=null});function QD(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return jE;let r=Number(e);return!Number.isFinite(r)||r<=0?jE:r}async function eP(t,e,r){try{let n=$e(e,r,t),s=n.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof n.provider=="string"&&n.provider.trim()!=="")i=n.provider;else{let c=await Nn(s);if(c.length!==1)return null;i=c[0]}let o=await Ye(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function _a(t,e,r,n,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??QD(),o=await eP(t,r,n),a=o!==null&&o>=i;return a&&M({event:"session_idle_reclaim",receiver_teamfile:r,receiver_alias:n,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var jE,uu=E(()=>{"use strict";ue();Er();ht();jE=36e5});function tP(t=process.env){let e=t.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(e===void 0||e.trim()==="")return DE;let r=Number(e);return!Number.isFinite(r)||r<=0?DE:Math.max(1,Math.trunc(r))}async function FE(t){let e=t.env??process.env,r=t.maxBatches??tP(e),n=lP(t.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};aP(t.dal,e);let i=new Set;for(;s.scanned<r;){let o=t.dal.listRelayMailboxLanes(r).find(l=>!i.has(PE(l)));if(o===void 0)break;i.add(PE(o)),s.scanned+=1;let a=await rP(t.dal,n,e,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function PE(t){return JSON.stringify([t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias])}async function rP(t,e,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Yt(t,n.receiver_teamfile,n.receiver_alias),o=!1;if(i.busy){if(!await _a(t,i,n.receiver_teamfile,n.receiver_alias))return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};o=!0}let a=null;try{let l=$e(n.receiver_teamfile,n.receiver_alias,t),c=gr(t,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:yr(),...o?{force:!0}:{}});if(!c.acquired)return{...s,skipped_busy:1};if(a=c.lease,n.message_type==="response"){let u=await fE({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:e,permissionMode:"yolo",env:r});return iP(u)}let d=await oa({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:e,permissionMode:"yolo",env:r,finalize:"caller"});return sP(t,d)}catch(l){return nP(t,n,`relay delivery error: ${l instanceof Error?l.message:String(l)}`)}finally{if(a!==null)try{t.releaseAgentInflight(a)}catch{}}}function nP(t,e,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=e.message_type==="response"?t.listEnqueuedResponseMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias):t.listEnqueuedRequestMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias),i=e.message_type==="response"?t.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):t.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function sP(t,e){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=oP(e),s=new Date().toISOString(),{marked:i}=t.markRelayRequestDeliveredAndEnqueueResponses(e.queued,n,s);return{...r,delivered:i,errors:e.status==="ok"?0:1}}function iP(t){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:t.deliveredIds.length,errors:t.status==="ok"?0:1}}function oP(t){return t.status==="ok"?t.receipt:t.status==="stalled"?`relay delivery error: provider stalled${t.stalledAfterMs!==void 0?` after ${t.stalledAfterMs}ms`:""}
2154
- ${t.receipt}`:`relay delivery error: ${t.error}`}function aP(t,e){t.reclaimStaleMailboxDeliveries(new Date(Date.now()-tu(e)).toISOString())}function lP(t){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:t}}var DE,UE=E(()=>{"use strict";Br();ru();la();ht();uu();DE=10});function Ls(){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 dP(t=process.env){let e=t.LMCTL_DAEMON_FEATURES;if(e===void 0)return new Set(["mailbox-relay"]);if(e.trim()==="")return new Set;let r=new Set;for(let n of e.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(WE);cP.has(s)&&r.add(s)}}return r}function BE(t){let e=t.intervalMs??Ls(),r=t.runOnceFn??Ur,n=new Set(t.features??dP()),s={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,enabled_features:[...n].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;n.has("rollup-updater")&&t.startRollupUpdaterFn!==!1&&(c=(t.startRollupUpdaterFn??Qw)(t.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(e))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=qE(t.dal,n,t.monitorSessionActivityFn??xc,e,s).finally(()=>{l=null})),l.finally(()=>u(Ac(t.dal,e)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=uP(t.dal,r,t.collectSessionSizesFn??b_,t.scanIntakeFn??_o,t.monitorSessionActivityFn??xc,t.mailboxRelayFn??FE,t.worker_id??"daemon",e,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=t.firstDelayMs??5e3;d(m),n.has("session-monitor")&&u(m)}return f}async function uP(t,e,r,n,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,h=fP();try{if(l.has("durable-memory-policies")&&Ay({dal:t}),l.has("drift-detectors")&&rE({dal:t}),l.has("intake")&&(m=await n(t)),l.has("job-worker"))for(;;){let g=await e({dal:t,worker_id:o,lease_ms:6e5});if(g===null)break;d.push(g)}if(l.has("mailbox-relay")&&(h=await i({dal:t})),l.has("session-size")){let g=await r(t);u=g.recorded,f=g.failed}l.has("session-monitor")&&(p=await qE(t,l,s,a,c))}catch(g){c.last_error=g instanceof Error?g.message:String(g);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((g,_)=>g+_.scanned,0),c.last_intake_new_jobs=m.reduce((g,_)=>g+_.new_jobs,0),c.last_intake_failures=m.filter(g=>g.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=h.scanned,c.last_mailbox_relay_delivered=h.delivered,c.last_mailbox_relay_errors=h.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:h}}function fP(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function qE(t,e,r,n,s){if(!e.has("session-monitor"))return null;let i=Ac(t,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:t,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var WE,cP,fu=E(()=>{"use strict";Qc();Do();Rd();Wi();eE();nE();Rc();UE();WE=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],cP=new Set(WE)});function HE(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 JE=E(()=>{"use strict"});import{mkdirSync as mP,readFileSync as pP,readdirSync as _P,statSync as hP,writeFileSync as gP}from"node:fs";import{dirname as yP,join as GE,sep as XE}from"node:path";function ha(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case KE:return wP(t,s.input);case VE:return EP(t,s.input);case YE:return TP(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:_u,GetObjectCommand:pu,PutObjectCommand:mu}}}function wP(t,e){let r=zE(t,e.Key);return mP(yP(r),{recursive:!0}),gP(r,e.Body),{}}function EP(t,e){let r=zE(t,e.Key),n;try{n=pP(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function TP(t,e){let r=e.Prefix??"";ZE(r);let s=bP(t).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function zE(t,e){return ZE(e),GE(t,e)}function ZE(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function bP(t){let e=[],r=(n,s)=>{let i;try{i=_P(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=GE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=XE==="/"?a:a.split(XE).join("/");e.push({key:c,lastModified:hP(l).mtime})}}};return r(t,""),e}var KE,VE,YE,mu,pu,_u,hu=E(()=>{"use strict";KE="localfs-put",VE="localfs-get",YE="localfs-list",mu=class{input;_localfsTag=KE;constructor(e){this.input=e}},pu=class{input;_localfsTag=VE;constructor(e){this.input=e}},_u=class{input;_localfsTag=YE;constructor(e){this.input=e}}});function QE(){return{put:0,get:0,list:0}}function gu(t,e=SP){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function yu(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var SP,ga,wu=E(()=>{"use strict";SP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};ga=class{counts=QE();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=QE(),e}estimateCostUsd(e){return gu(this.counts,e)}}});function eT(t){let e=t.now??Date.now,r=t.timers??vP,n=null,s=null;async function i(){let l=e(),c=yu(l),d=t.meter.drain();(d.put>0||d.get>0||d.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=t.store.loadUsage(t.userId,t.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.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=gu(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 o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===yu(e())}}}var vP,tT=E(()=>{"use strict";wu();vP={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Eu=E(()=>{"use strict";Bo();Ho();Ho()});function kP(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}let 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 IP(t){return t.reply_to!==void 0&&t.response!==void 0}function NP(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function rT(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 ya,Os,nT=E(()=>{"use strict";Eu();ya=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Os=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 ya("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=Vt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(rT(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(rT(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new ya;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=kP(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(IP(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??NP(e)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:Vt(this.now(),this.random),reply_to:n.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function Tu(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 sT=E(()=>{"use strict"});function bu(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var iT=E(()=>{"use strict"});function vu(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var Su,oT=E(()=>{"use strict";Su="daemon:events"});function lT(t){return{kind:"prompt",prompt_id:t.prompt_id??Vt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function ku(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 aT,Iu=E(()=>{"use strict";Eu();aT="prompt:root"});function $s(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(dT(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function xP(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(dT(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function cT(t,e=60){if(typeof t!="string"||t==="")return!0;let r=xP(t);return r===null?!0:Date.now()/1e3>=r-e}function dT(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var Nu=E(()=>{"use strict"});async function wa(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":AP},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 o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var AP,xu=E(()=>{"use strict";AP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as uT,mkdirSync as fT,readFileSync as mT,writeFileSync as pT}from"node:fs";import{homedir as _T}from"node:os";import{dirname as hT,join as gT}from"node:path";function Cs(){return process.env.LMCTL_DEVICE_AUTH_PATH??gT(_T(),".lmctl","device-auth.json")}function yT(){return process.env.LMCTL_TOKEN_PATH??gT(_T(),".lmctl","cli-tokens.json")}function Au(t=Cs()){try{let e=JSON.parse(mT(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 wT(t,e=Cs()){fT(hT(e),{recursive:!0,mode:448}),pT(e,JSON.stringify(t,null,2));try{uT(e,384)}catch{}}function Ru(t,e=yT()){let r={};try{r=JSON.parse(mT(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};fT(hT(e),{recursive:!0,mode:448}),pT(e,JSON.stringify(s,null,2));try{uT(e,384)}catch{}}async function ET(t){let e=t.deviceAuthPath??Cs(),r=Au(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await wa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Ru({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??yT()),{idToken:n.idToken,userId:r.userId}}var Lu=E(()=>{"use strict";xu()});import{existsSync as RP,realpathSync as LP}from"node:fs";import{dirname as OP}from"node:path";function Ou(t){$P(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function $P(t){let e=t.payload.root_teamfile;try{e=LP(t.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return xn({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unavailable"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return xn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"root_unregistered"}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=MP(e);if("error"in r)return xn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:r.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=gr(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:FP(t.env??process.env)});if(!n.acquired){let s=PP(r.alias,n.current);return xn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(t.chat??kt)({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}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return c==="ok"?await jP(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:i.text,status:c,error_detail:null,log:t.log}):xn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:l??"provider failed",reason:o?"stalled":"empty_response"}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return xn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function xn(t){M({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:CP(t.message)})}function CP(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function MP(t){if(!RP(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Fe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Lt(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??OP(t)}}async function jP(t,e){let r=ST(e.message),n=e.response===null?null:ST(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function ST(t){return t.length<=TT?{text:t,truncated:!1}:{text:t.slice(0,TT),truncated:!0}}function DP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function PP(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:DP(t,e)}function FP(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return bT;let r=Number(e);return!Number.isFinite(r)||r<=0?bT:r}var TT,bT,vT=E(()=>{"use strict";It();Zt();ue();Br();TT=256*1024,bT=30*60*1e3});import{chmodSync as RT,existsSync as UP,mkdirSync as LT,readFileSync as Sa,writeFileSync as OT}from"node:fs";import{dirname as $u,resolve as Ea,join as $T}from"node:path";import{fileURLToPath as WP}from"node:url";import{homedir as CT}from"node:os";import{CognitoIdentityClient as BP,GetIdCommand as qP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as kT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as HP,ListObjectsV2Command as JP,PutObjectCommand as XP,S3Client as IT}from"@aws-sdk/client-s3";function js(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:zP(t.selfUrl),n={},s;for(let I of r)if(UP(I)){n=YP(I),s=I;break}let i=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??GP,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??KP,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??VP,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",d=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??va,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=ba(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ba(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=ba(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=ba(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),T=i(e.LMCTL_MAILBOX_KEY),b=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...T!==void 0?{mailboxKey:T}:{},...b!==void 0?{tokenPath:b}:{}},f}function YP(t){try{let e=Sa(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function zP(t){let e=$u(WP(t??import.meta.url));return[Ea(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","infra","terraform","terraform.tfstate")]}function ba(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function ZP(t){let e=QP(t.intervalMs)??MT,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,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,r);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},e);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function QP(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function jT(t){let e=t.tokenPath??$T(CT(),".lmctl","cli-tokens.json"),r=xT(t.tokenPath);if(cT(r.cognito?.idToken)&&Au()!==null)try{await ET({region:t.region,clientId:t.cognitoClientId??va,cliTokensPath:e}),r=xT(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let ee=A instanceof Error?A.message:String(A);t.log?.(`[mx-mailbox] device-auth refresh failed: ${ee}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await AT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=kT({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new IT({region:t.region,credentials:a}),c={ListObjectsV2Command:JP,GetObjectCommand:HP,PutObjectCommand:XP},d=$s(n),u=d??i,f=t.deviceId,m=Tn({identityId:i,userId:d,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)h=A.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let ee=!1,B=0;for(;!ee&&B<2;){B+=1;try{let k=Uo(m,"web"),N=0,L;do{let W=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let D of W.Contents??[]){let C=Wo(D.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=W.IsTruncated===!0?W.NextContinuationToken:void 0}while(L!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),ee=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&rF(k)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),tF(e),o=!1,i=await AT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=kT({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new IT({region:t.region,credentials:a}),m=Tn({identityId:i,userId:d,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,y=t.persistentSessionManager,T=t.promptTriggerStore,b=new ga,I=new Wr({bucket:t.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>b.record(A),onMessage:async A=>{if(_!==void 0&&Tu(A.payload)){_.onInbound(A.payload);return}if(y!==void 0&&bu(A.payload)){await y.onInbound(A.payload);return}if(!vu(A.payload)){if(T!==void 0&&ku(A.payload)){Ou({store:T,payload:A.payload,log:t.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...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 Os({client:I,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),y!==void 0&&y.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:Su,payload:A});I.start();let H=t.chatLogTailStore===void 0?void 0:ZP({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??MT,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let pe=t.deviceId??i,U=`${u}/usage/`,j;return j=t.usageStore===void 0?void 0:eT({meter:b,store:t.usageStore,userId:u,deviceId:pe,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:ee,ceilingUsd:B})=>{t.log?.(`[usage] month ${A} cost $${ee.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),I.stop().catch(()=>{}),j?.stop()},publishOwnRollup:async(A,ee)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${U}${pe}-${A}.json`,Body:JSON.stringify({...ee,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let ee={put:0,get:0,list:0},B;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:U,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${A}.json`))try{let W=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:L}));if(W.Body===void 0)continue;let D=JSON.parse(await W.Body.transformToString("utf-8"));ee.put+=D.put??0,ee.get+=D.get??0,ee.list+=D.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return ee},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){H?.stop(),j!==void 0&&(await j.flushNow().catch(()=>{}),j.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function DT(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:ha(t.rootDir),r=Tn({identityId:Ms,userId:Ms,deviceId:NT}),n=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new Wr({bucket:"local",identityId:Ms,userId:Ms,deviceId:NT,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Tu(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&bu(c.payload)){await i.onInbound(c.payload);return}if(!vu(c.payload)){if(o!==void 0&&ku(c.payload)){Ou({store:o,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Ta,readIntervalMs:t.readIntervalMs??Ta,heartbeatIdleMs:t.heartbeatIdleMs??Ta,backoffReadIntervalMs:t.backoffReadIntervalMs??Ta});n=new Os({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:Su,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Ms,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function xT(t){let e=t??$T(CT(),".lmctl","cli-tokens.json");try{let r=Sa(e,"utf8");return JSON.parse(r)}catch{return{}}}function eF(t,e){if(e===void 0||e==="")return;let r={};try{let s=Sa(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};LT($u(t),{recursive:!0,mode:448}),OT(t,JSON.stringify(n,null,2));try{RT(t,384)}catch{}}function tF(t){let e={};try{let n=Sa(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,LT($u(t),{recursive:!0,mode:448}),OT(t,JSON.stringify(r,null,2));try{RT(t,384)}catch{}}async function AT(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new BP({region:t.region}).send(new qP({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{eF(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 rF(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 MT,Ta,va,GP,KP,VP,Ms,NT,Cu=E(()=>{"use strict";Jo();hu();wu();tT();nT();sT();iT();oT();Iu();Bo();Nu();Lu();vT();MT=3e3,Ta=1e3,va="79u5jhkk46qofog661c9i0bdcs",GP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",KP="us-east-1_4iUdFggDn",VP="lmctl-next-preview-mailbox-254332045686";Ms="local",NT="local"});import{spawn as Pu}from"node:child_process";import{createInterface as PT}from"node:readline";var Mu,ju,Du,FT,UT=E(()=>{"use strict";wi();ue();Mu=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=Pu(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=PT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(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,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let 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 i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:r});try{this.child.stdin.write(o+`
2153
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var we,KD,VD,fa,ht=E(()=>{"use strict";Zt();Ot();we=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},KD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,VD=/^ses_[A-Za-z0-9_-]+$/,fa=/^[A-Za-z][A-Za-z0-9_-]*$/});function ma(t){return ZD.has(t)}function du(){return cu===null&&(cu=bt(vt())),cu}function uu(t,e,r={}){if(!ma(t))return null;try{let n=du().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&r.isLead===!0?hi({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?zD[t]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:t,model:r.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...CE[t]??[]]}catch{return null}}function pa(t,e,r={}){let n=uu(t,e,r);return n===null?null:n.join(" ")}function Ye(t,e){return du().getSession(t,e)}async function Nn(t){return(await du().resolveSessions(t)).map(r=>r.provider.name)}var CE,zD,ZD,ME,cu,Er=E(()=>{"use strict";It();Sl();CE={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},zD={claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t]},ZD=new Set(Object.keys(CE)),ME=/^[\w.:-]+$/;cu=null});function QD(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return jE;let r=Number(e);return!Number.isFinite(r)||r<=0?jE:r}async function eP(t,e,r){try{let n=$e(e,r,t),s=n.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof n.provider=="string"&&n.provider.trim()!=="")i=n.provider;else{let c=await Nn(s);if(c.length!==1)return null;i=c[0]}let o=await Ye(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function _a(t,e,r,n,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??QD(),o=await eP(t,r,n),a=o!==null&&o>=i;return a&&C({event:"session_idle_reclaim",receiver_teamfile:r,receiver_alias:n,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var jE,fu=E(()=>{"use strict";de();Er();ht();jE=36e5});function tP(t=process.env){let e=t.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(e===void 0||e.trim()==="")return DE;let r=Number(e);return!Number.isFinite(r)||r<=0?DE:Math.max(1,Math.trunc(r))}async function FE(t){let e=t.env??process.env,r=t.maxBatches??tP(e),n=lP(t.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};aP(t.dal,e);let i=new Set;for(;s.scanned<r;){let o=t.dal.listRelayMailboxLanes(r).find(l=>!i.has(PE(l)));if(o===void 0)break;i.add(PE(o)),s.scanned+=1;let a=await rP(t.dal,n,e,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function PE(t){return JSON.stringify([t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias])}async function rP(t,e,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Yt(t,n.receiver_teamfile,n.receiver_alias),o=!1;if(i.busy){if(!await _a(t,i,n.receiver_teamfile,n.receiver_alias))return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};o=!0}let a=null;try{let l=$e(n.receiver_teamfile,n.receiver_alias,t),c=gr(t,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:yr(),...o?{force:!0}:{}});if(!c.acquired)return{...s,skipped_busy:1};if(a=c.lease,n.message_type==="response"){let u=await fE({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:e,permissionMode:"yolo",env:r});return iP(u)}let d=await oa({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:e,permissionMode:"yolo",env:r,finalize:"caller"});return sP(t,d)}catch(l){return nP(t,n,`relay delivery error: ${l instanceof Error?l.message:String(l)}`)}finally{if(a!==null)try{t.releaseAgentInflight(a)}catch{}}}function nP(t,e,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=e.message_type==="response"?t.listEnqueuedResponseMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias):t.listEnqueuedRequestMailFromSender(e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias),i=e.message_type==="response"?t.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):t.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function sP(t,e){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=oP(e),s=new Date().toISOString(),{marked:i}=t.markRelayRequestDeliveredAndEnqueueResponses(e.queued,n,s);return{...r,delivered:i,errors:e.status==="ok"?0:1}}function iP(t){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:t.deliveredIds.length,errors:t.status==="ok"?0:1}}function oP(t){return t.status==="ok"?t.receipt:t.status==="stalled"?`relay delivery error: provider stalled${t.stalledAfterMs!==void 0?` after ${t.stalledAfterMs}ms`:""}
2154
+ ${t.receipt}`:`relay delivery error: ${t.error}`}function aP(t,e){t.reclaimStaleMailboxDeliveries(new Date(Date.now()-ru(e)).toISOString())}function lP(t){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:t}}var DE,UE=E(()=>{"use strict";Br();nu();la();ht();fu();DE=10});function Ls(){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 dP(t=process.env){let e=t.LMCTL_DAEMON_FEATURES;if(e===void 0)return new Set(["mailbox-relay"]);if(e.trim()==="")return new Set;let r=new Set;for(let n of e.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(WE);cP.has(s)&&r.add(s)}}return r}function BE(t){let e=t.intervalMs??Ls(),r=t.runOnceFn??Ur,n=new Set(t.features??dP()),s={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,enabled_features:[...n].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;n.has("rollup-updater")&&t.startRollupUpdaterFn!==!1&&(c=(t.startRollupUpdaterFn??Qw)(t.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(e))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=qE(t.dal,n,t.monitorSessionActivityFn??Ac,e,s).finally(()=>{l=null})),l.finally(()=>u(Rc(t.dal,e)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=uP(t.dal,r,t.collectSessionSizesFn??b_,t.scanIntakeFn??_o,t.monitorSessionActivityFn??Ac,t.mailboxRelayFn??FE,t.worker_id??"daemon",e,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=t.firstDelayMs??5e3;d(m),n.has("session-monitor")&&u(m)}return f}async function uP(t,e,r,n,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,h=fP();try{if(l.has("durable-memory-policies")&&Ay({dal:t}),l.has("drift-detectors")&&rE({dal:t}),l.has("intake")&&(m=await n(t)),l.has("job-worker"))for(;;){let g=await e({dal:t,worker_id:o,lease_ms:6e5});if(g===null)break;d.push(g)}if(l.has("mailbox-relay")&&(h=await i({dal:t})),l.has("session-size")){let g=await r(t);u=g.recorded,f=g.failed}l.has("session-monitor")&&(p=await qE(t,l,s,a,c))}catch(g){c.last_error=g instanceof Error?g.message:String(g);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((g,_)=>g+_.scanned,0),c.last_intake_new_jobs=m.reduce((g,_)=>g+_.new_jobs,0),c.last_intake_failures=m.filter(g=>g.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=h.scanned,c.last_mailbox_relay_delivered=h.delivered,c.last_mailbox_relay_errors=h.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:h}}function fP(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function qE(t,e,r,n,s){if(!e.has("session-monitor"))return null;let i=Rc(t,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:t,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var WE,cP,mu=E(()=>{"use strict";ed();Do();Ld();Wi();eE();nE();Lc();UE();WE=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],cP=new Set(WE)});function HE(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 JE=E(()=>{"use strict"});import{mkdirSync as mP,readFileSync as pP,readdirSync as _P,statSync as hP,writeFileSync as gP}from"node:fs";import{dirname as yP,join as GE,sep as XE}from"node:path";function ha(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case KE:return wP(t,s.input);case VE:return EP(t,s.input);case YE:return TP(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:hu,GetObjectCommand:_u,PutObjectCommand:pu}}}function wP(t,e){let r=zE(t,e.Key);return mP(yP(r),{recursive:!0}),gP(r,e.Body),{}}function EP(t,e){let r=zE(t,e.Key),n;try{n=pP(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function TP(t,e){let r=e.Prefix??"";ZE(r);let s=bP(t).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function zE(t,e){return ZE(e),GE(t,e)}function ZE(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function bP(t){let e=[],r=(n,s)=>{let i;try{i=_P(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=GE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=XE==="/"?a:a.split(XE).join("/");e.push({key:c,lastModified:hP(l).mtime})}}};return r(t,""),e}var KE,VE,YE,pu,_u,hu,gu=E(()=>{"use strict";KE="localfs-put",VE="localfs-get",YE="localfs-list",pu=class{input;_localfsTag=KE;constructor(e){this.input=e}},_u=class{input;_localfsTag=VE;constructor(e){this.input=e}},hu=class{input;_localfsTag=YE;constructor(e){this.input=e}}});function QE(){return{put:0,get:0,list:0}}function yu(t,e=SP){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function wu(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var SP,ga,Eu=E(()=>{"use strict";SP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};ga=class{counts=QE();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=QE(),e}estimateCostUsd(e){return yu(this.counts,e)}}});function eT(t){let e=t.now??Date.now,r=t.timers??vP,n=null,s=null;async function i(){let l=e(),c=wu(l),d=t.meter.drain();(d.put>0||d.get>0||d.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=t.store.loadUsage(t.userId,t.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.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=yu(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 o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===wu(e())}}}var vP,tT=E(()=>{"use strict";Eu();vP={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Tu=E(()=>{"use strict";Bo();Ho();Ho()});function kP(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}let 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 IP(t){return t.reply_to!==void 0&&t.response!==void 0}function NP(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function rT(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 ya,Os,nT=E(()=>{"use strict";Tu();ya=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Os=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 ya("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=Vt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(rT(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(rT(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new ya;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=kP(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(IP(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??NP(e)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:Vt(this.now(),this.random),reply_to:n.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function bu(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 sT=E(()=>{"use strict"});function Su(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var iT=E(()=>{"use strict"});function ku(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var vu,oT=E(()=>{"use strict";vu="daemon:events"});function lT(t){return{kind:"prompt",prompt_id:t.prompt_id??Vt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Iu(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 aT,Nu=E(()=>{"use strict";Tu();aT="prompt:root"});function $s(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(dT(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function xP(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(dT(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function cT(t,e=60){if(typeof t!="string"||t==="")return!0;let r=xP(t);return r===null?!0:Date.now()/1e3>=r-e}function dT(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var xu=E(()=>{"use strict"});async function wa(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":AP},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 o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var AP,Au=E(()=>{"use strict";AP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as uT,mkdirSync as fT,readFileSync as mT,writeFileSync as pT}from"node:fs";import{homedir as _T}from"node:os";import{dirname as hT,join as gT}from"node:path";function Cs(){return process.env.LMCTL_DEVICE_AUTH_PATH??gT(_T(),".lmctl","device-auth.json")}function yT(){return process.env.LMCTL_TOKEN_PATH??gT(_T(),".lmctl","cli-tokens.json")}function Ru(t=Cs()){try{let e=JSON.parse(mT(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 wT(t,e=Cs()){fT(hT(e),{recursive:!0,mode:448}),pT(e,JSON.stringify(t,null,2));try{uT(e,384)}catch{}}function Lu(t,e=yT()){let r={};try{r=JSON.parse(mT(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};fT(hT(e),{recursive:!0,mode:448}),pT(e,JSON.stringify(s,null,2));try{uT(e,384)}catch{}}async function ET(t){let e=t.deviceAuthPath??Cs(),r=Ru(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await wa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Lu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??yT()),{idToken:n.idToken,userId:r.userId}}var Ou=E(()=>{"use strict";Au()});import{existsSync as RP,realpathSync as LP}from"node:fs";import{dirname as OP}from"node:path";function $u(t){$P(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function $P(t){let e=t.payload.root_teamfile;try{e=LP(t.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return xn({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unavailable"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return xn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"root_unregistered"}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=MP(e);if("error"in r)return xn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:r.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=gr(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:FP(t.env??process.env)});if(!n.acquired){let s=PP(r.alias,n.current);return xn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:s,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(t.chat??kt)({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}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return c==="ok"?await jP(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:i.text,status:c,error_detail:null,log:t.log}):xn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:l??"provider failed",reason:o?"stalled":"empty_response"}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return xn({rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function xn(t){C({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:CP(t.message)})}function CP(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function MP(t){if(!RP(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Fe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=Lt(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??OP(t)}}async function jP(t,e){let r=ST(e.message),n=e.response===null?null:ST(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function ST(t){return t.length<=TT?{text:t,truncated:!1}:{text:t.slice(0,TT),truncated:!0}}function DP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function PP(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:DP(t,e)}function FP(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return bT;let r=Number(e);return!Number.isFinite(r)||r<=0?bT:r}var TT,bT,vT=E(()=>{"use strict";It();Zt();de();Br();TT=256*1024,bT=30*60*1e3});import{chmodSync as RT,existsSync as UP,mkdirSync as LT,readFileSync as Sa,writeFileSync as OT}from"node:fs";import{dirname as Cu,resolve as Ea,join as $T}from"node:path";import{fileURLToPath as WP}from"node:url";import{homedir as CT}from"node:os";import{CognitoIdentityClient as BP,GetIdCommand as qP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as kT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as HP,ListObjectsV2Command as JP,PutObjectCommand as XP,S3Client as IT}from"@aws-sdk/client-s3";function js(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:zP(t.selfUrl),n={},s;for(let I of r)if(UP(I)){n=YP(I),s=I;break}let i=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??GP,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??KP,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??VP,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",d=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??va,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=ba(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ba(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=ba(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=ba(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),T=i(e.LMCTL_MAILBOX_KEY),b=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...T!==void 0?{mailboxKey:T}:{},...b!==void 0?{tokenPath:b}:{}},f}function YP(t){try{let e=Sa(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function zP(t){let e=Cu(WP(t??import.meta.url));return[Ea(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","..","infra","terraform","terraform.tfstate"),Ea(e,"..","..","infra","terraform","terraform.tfstate")]}function ba(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function ZP(t){let e=QP(t.intervalMs)??MT,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,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=t.store.listTeamChatLogSinceId(i,r);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},e);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function QP(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function jT(t){let e=t.tokenPath??$T(CT(),".lmctl","cli-tokens.json"),r=xT(t.tokenPath);if(cT(r.cognito?.idToken)&&Ru()!==null)try{await ET({region:t.region,clientId:t.cognitoClientId??va,cliTokensPath:e}),r=xT(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let ee=A instanceof Error?A.message:String(A);t.log?.(`[mx-mailbox] device-auth refresh failed: ${ee}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await AT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=kT({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new IT({region:t.region,credentials:a}),c={ListObjectsV2Command:JP,GetObjectCommand:HP,PutObjectCommand:XP},d=$s(n),u=d??i,f=t.deviceId,m=Tn({identityId:i,userId:d,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)h=A.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let ee=!1,B=0;for(;!ee&&B<2;){B+=1;try{let k=Uo(m,"web"),N=0,L;do{let W=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let D of W.Contents??[]){let M=Wo(D.Key??"",m,"web");M!==void 0&&M>N&&(N=M)}L=W.IsTruncated===!0?W.NextContinuationToken:void 0}while(L!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),ee=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&rF(k)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),tF(e),o=!1,i=await AT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=kT({identityId:i,logins:{[s]:n},clientConfig:{region:t.region}}),l=new IT({region:t.region,credentials:a}),m=Tn({identityId:i,userId:d,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,y=t.persistentSessionManager,T=t.promptTriggerStore,b=new ga,I=new Wr({bucket:t.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>b.record(A),onMessage:async A=>{if(_!==void 0&&bu(A.payload)){_.onInbound(A.payload);return}if(y!==void 0&&Su(A.payload)){await y.onInbound(A.payload);return}if(!ku(A.payload)){if(T!==void 0&&Iu(A.payload)){$u({store:T,payload:A.payload,log:t.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...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 Os({client:I,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),y!==void 0&&y.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:vu,payload:A});I.start();let H=t.chatLogTailStore===void 0?void 0:ZP({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??MT,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let pe=t.deviceId??i,U=`${u}/usage/`,j;return j=t.usageStore===void 0?void 0:eT({meter:b,store:t.usageStore,userId:u,deviceId:pe,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:ee,ceilingUsd:B})=>{t.log?.(`[usage] month ${A} cost $${ee.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),I.stop().catch(()=>{}),j?.stop()},publishOwnRollup:async(A,ee)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${U}${pe}-${A}.json`,Body:JSON.stringify({...ee,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let ee={put:0,get:0,list:0},B;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:U,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${A}.json`))try{let W=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:L}));if(W.Body===void 0)continue;let D=JSON.parse(await W.Body.transformToString("utf-8"));ee.put+=D.put??0,ee.get+=D.get??0,ee.list+=D.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return ee},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){H?.stop(),j!==void 0&&(await j.flushNow().catch(()=>{}),j.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function DT(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:ha(t.rootDir),r=Tn({identityId:Ms,userId:Ms,deviceId:NT}),n=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new Wr({bucket:"local",identityId:Ms,userId:Ms,deviceId:NT,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&bu(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&Su(c.payload)){await i.onInbound(c.payload);return}if(!ku(c.payload)){if(o!==void 0&&Iu(c.payload)){$u({store:o,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Ta,readIntervalMs:t.readIntervalMs??Ta,heartbeatIdleMs:t.heartbeatIdleMs??Ta,backoffReadIntervalMs:t.backoffReadIntervalMs??Ta});n=new Os({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:vu,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Ms,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function xT(t){let e=t??$T(CT(),".lmctl","cli-tokens.json");try{let r=Sa(e,"utf8");return JSON.parse(r)}catch{return{}}}function eF(t,e){if(e===void 0||e==="")return;let r={};try{let s=Sa(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};LT(Cu(t),{recursive:!0,mode:448}),OT(t,JSON.stringify(n,null,2));try{RT(t,384)}catch{}}function tF(t){let e={};try{let n=Sa(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,LT(Cu(t),{recursive:!0,mode:448}),OT(t,JSON.stringify(r,null,2));try{RT(t,384)}catch{}}async function AT(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new BP({region:t.region}).send(new qP({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{eF(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 rF(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 MT,Ta,va,GP,KP,VP,Ms,NT,Mu=E(()=>{"use strict";Jo();gu();Eu();tT();nT();sT();iT();oT();Nu();Bo();xu();Ou();vT();MT=3e3,Ta=1e3,va="79u5jhkk46qofog661c9i0bdcs",GP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",KP="us-east-1_4iUdFggDn",VP="lmctl-next-preview-mailbox-254332045686";Ms="local",NT="local"});import{spawn as Fu}from"node:child_process";import{createInterface as PT}from"node:readline";var ju,Du,Pu,FT,UT=E(()=>{"use strict";wi();de();ju=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=Fu(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=PT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(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,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let 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 i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:r});try{this.child.stdin.write(o+`
2155
2155
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(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+`
2156
- `)}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 o=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},i=this.normalizeNotification(n,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(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}}}},ju=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Pu(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 i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
2156
+ `)}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 o=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},i=this.normalizeNotification(n,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(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}}}},Du=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Fu(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 i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
2157
2157
  `);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),n}async sendTurn(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+`
2158
- `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(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 i=r.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Du=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{yi(n)}catch(a){M({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Pu(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=PT({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}async sendTurn(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 i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:r});try{this.child.stdin.write(o+`
2158
+ `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(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 i=r.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Pu=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{yi(n)}catch(a){C({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Fu(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=PT({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}async sendTurn(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 i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:e,params:r});try{this.child.stdin.write(o+`
2159
2159
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(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+`
2160
2160
  `)}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 i=r.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${o}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
2161
- `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},FT=t=>{switch(t){case"codex":return new Mu;case"claude":case"qwen":return new ju;case"gemini":case"copilot":case"opencode":return new Du;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as nF}from"node:crypto";import{existsSync as m6,mkdirSync as sF,readFileSync as iF,writeFileSync as oF}from"node:fs";import{homedir as aF}from"node:os";import{dirname as lF,join as cF}from"node:path";function ka(){return process.env.LMCTL_DEVICE_FILE??cF(aF(),".lmctl","device.json")}function Jr(t=ka()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(iF(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 Fu(t=ka()){let e=Jr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:nF(),created_at:new Date().toISOString()};return sF(lF(t),{recursive:!0}),oF(t,`${JSON.stringify(r,null,2)}
2162
- `,{encoding:"utf8",mode:384}),r}var Uu=E(()=>{"use strict"});import{mkdirSync as dF,readFileSync as WT,rmSync as uF,writeFileSync as fF}from"node:fs";import{dirname as BT,join as mF}from"node:path";function $t(t=Z()){return mF(BT(t),"serve.pid")}function qT(t,e){let r=$t(e);return dF(BT(r),{recursive:!0}),fF(r,`${JSON.stringify(t,null,2)}
2163
- `,"utf-8"),r}function Wu(t){let e=$t(t),r;try{r=WT(e,"utf-8")}catch{return null}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0?null:{pid:n.pid,startedAt:typeof n.startedAt=="string"?n.startedAt:"unknown",port:Number.isInteger(n.port)?n.port:0,bind:typeof n.bind=="string"?n.bind:"unknown",dbPath:typeof n.dbPath=="string"?n.dbPath:"unknown",startToken:typeof n.startToken=="string"?n.startToken:null}}catch{return null}}function An(t){uF($t(t),{force:!0})}function Ia(t){let e=pF(t),r=Wu(t);if(r===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(Pm(r.pid,r.startToken??null)){case"same":return{entry:r,running:!0,stale:!1,corrupt:!1};case"different":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:r,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function pF(t){let e=$t(t),r;try{r=WT(e,"utf-8")}catch{return!1}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0}catch{return!0}}function HT(){return ul(process.pid)}var JT=E(()=>{"use strict";Yn();Be()});var nb={};Ee(nb,{_resetStdoutEpipeGuardForTests:()=>TF,bootstrapAgentRestMailbox:()=>ZT,installStdoutEpipeGuard:()=>KT,publishRegisteredWorkflowsOnStart:()=>zT,resolveLocalMailboxDir:()=>tb,resolveLocalWebuiDir:()=>eb,resolveServeConfig:()=>QT,runServe:()=>wF,runServeStatus:()=>VT,runServeStop:()=>YT,validateServeArgs:()=>rb});import{randomBytes as _F}from"node:crypto";import{existsSync as hF}from"node:fs";import{homedir as gF}from"node:os";import{isAbsolute as GT,resolve as Bu}from"node:path";async function wF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(yF),0;let r=t[0];return r==="status"?VT(t.slice(1),e):r==="stop"?YT(t.slice(1),e):r!=="start"?(e.stderr.write(r===void 0?XT:`error: unknown serve subcommand: ${r}
2161
+ `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},FT=t=>{switch(t){case"codex":return new ju;case"claude":case"qwen":return new Du;case"gemini":case"copilot":case"opencode":return new Pu;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as nF}from"node:crypto";import{existsSync as m6,mkdirSync as sF,readFileSync as iF,writeFileSync as oF}from"node:fs";import{homedir as aF}from"node:os";import{dirname as lF,join as cF}from"node:path";function ka(){return process.env.LMCTL_DEVICE_FILE??cF(aF(),".lmctl","device.json")}function Jr(t=ka()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(iF(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 Uu(t=ka()){let e=Jr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:nF(),created_at:new Date().toISOString()};return sF(lF(t),{recursive:!0}),oF(t,`${JSON.stringify(r,null,2)}
2162
+ `,{encoding:"utf8",mode:384}),r}var Wu=E(()=>{"use strict"});import{mkdirSync as dF,readFileSync as WT,rmSync as uF,writeFileSync as fF}from"node:fs";import{dirname as BT,join as mF}from"node:path";function $t(t=Z()){return mF(BT(t),"serve.pid")}function qT(t,e){let r=$t(e);return dF(BT(r),{recursive:!0}),fF(r,`${JSON.stringify(t,null,2)}
2163
+ `,"utf-8"),r}function Bu(t){let e=$t(t),r;try{r=WT(e,"utf-8")}catch{return null}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0?null:{pid:n.pid,startedAt:typeof n.startedAt=="string"?n.startedAt:"unknown",port:Number.isInteger(n.port)?n.port:0,bind:typeof n.bind=="string"?n.bind:"unknown",dbPath:typeof n.dbPath=="string"?n.dbPath:"unknown",startToken:typeof n.startToken=="string"?n.startToken:null}}catch{return null}}function An(t){uF($t(t),{force:!0})}function Ia(t){let e=pF(t),r=Bu(t);if(r===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(Pm(r.pid,r.startToken??null)){case"same":return{entry:r,running:!0,stale:!1,corrupt:!1};case"different":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:r,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function pF(t){let e=$t(t),r;try{r=WT(e,"utf-8")}catch{return!1}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0}catch{return!0}}function HT(){return fl(process.pid)}var JT=E(()=>{"use strict";Yn();Be()});var nb={};Ee(nb,{_resetStdoutEpipeGuardForTests:()=>TF,bootstrapAgentRestMailbox:()=>ZT,installStdoutEpipeGuard:()=>KT,publishRegisteredWorkflowsOnStart:()=>zT,resolveLocalMailboxDir:()=>tb,resolveLocalWebuiDir:()=>eb,resolveServeConfig:()=>QT,runServe:()=>wF,runServeStatus:()=>VT,runServeStop:()=>YT,validateServeArgs:()=>rb});import{randomBytes as _F}from"node:crypto";import{existsSync as hF}from"node:fs";import{homedir as gF}from"node:os";import{isAbsolute as GT,resolve as qu}from"node:path";async function wF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(yF),0;let r=t[0];return r==="status"?VT(t.slice(1),e):r==="stop"?YT(t.slice(1),e):r!=="start"?(e.stderr.write(r===void 0?XT:`error: unknown serve subcommand: ${r}
2164
2164
 
2165
2165
  ${XT.replace(/^error: [^\n]*\n\n/,"")}`),2):EF(t.slice(1),e)}async function EF(t,e){let r=rb(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
2166
2166
  `),2;let n=ke({path:Z()}),s={portCli:RF(t)},i;try{i=QT({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(b){return n.close(),e.stderr.write(`error: ${b instanceof Error?b.message:String(b)}
@@ -2173,7 +2173,7 @@ ${XT.replace(/^error: [^\n]*\n\n/,"")}`),2):EF(t.slice(1),e)}async function EF(t
2173
2173
  `);let T=Z();try{let b=Ia(T);b.running&&b.entry!==null&&b.entry.pid!==process.pid&&e.stderr.write(`note: replacing pidfile for a still-running daemon (pid ${b.entry.pid}, port ${b.entry.port}); \`lmctl serve stop\` will now target pid ${process.pid}
2174
2174
  `);let I=qT({pid:process.pid,startedAt:new Date().toISOString(),port:i.port,bind:r.bind,dbPath:T,startToken:HT()},T);e.stdout.write(`pidfile ${I} (pid ${process.pid})
2175
2175
  `)}catch(b){e.stderr.write(`warning: could not write serve pidfile: ${b instanceof Error?b.message:String(b)}; \`lmctl serve status\`/\`stop\` will not find this daemon
2176
- `)}return await new Promise(b=>{let I=()=>{(async()=>{a!==void 0&&await a.stop(),y.close(),await g.stop(),c!==void 0&&await c.stop(),await d.stop(),n.close();try{let x=Wu(T);x!==null&&x.pid===process.pid&&An(T)}catch{}b()})()};process.once("SIGTERM",I),process.once("SIGINT",I)}),0}function KT(t){if(t.stdout!==process.stdout||qu)return;qu=!0;let e=r=>{throw r.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),r};process.stdout.on("error",e)}function TF(){qu=!1}async function VT(t,e){return KT(e),bF(t,e)}async function bF(t,e){if(t.length>0)return e.stderr.write(`error: lmctl serve status takes no arguments; got: ${t.join(" ")}
2176
+ `)}return await new Promise(b=>{let I=()=>{(async()=>{a!==void 0&&await a.stop(),y.close(),await g.stop(),c!==void 0&&await c.stop(),await d.stop(),n.close();try{let x=Bu(T);x!==null&&x.pid===process.pid&&An(T)}catch{}b()})()};process.once("SIGTERM",I),process.once("SIGINT",I)}),0}function KT(t){if(t.stdout!==process.stdout||Hu)return;Hu=!0;let e=r=>{throw r.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),r};process.stdout.on("error",e)}function TF(){Hu=!1}async function VT(t,e){return KT(e),bF(t,e)}async function bF(t,e){if(t.length>0)return e.stderr.write(`error: lmctl serve status takes no arguments; got: ${t.join(" ")}
2177
2177
  `),2;let r=Z(),n=Ia(r);if(n.entry===null)return e.stdout.write(`serve: not running
2178
2178
  `),e.stdout.write(n.corrupt?` unreadable pidfile at ${$t(r)} (could not parse)
2179
2179
  run \`lmctl serve stop\` to clear it
@@ -2213,7 +2213,7 @@ ${XT.replace(/^error: [^\n]*\n\n/,"")}`),2):EF(t.slice(1),e)}async function EF(t
2213
2213
  `)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
2214
2214
  `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function QT(t){let{dal:e,cli:r,env:n,parsed:s,io:i}=t,o=[],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,o.push("api.port")}else a=s.port;let c,d=e.getConfig("api.token");n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,d===null?o.push("api.token"):d!==c&&i.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this serve process.
2215
2215
  `)):d!==null?c=d:(c=_F(32).toString("hex"),e.setConfig("api.token",c),i.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let u,f=e.getConfig("api.url");f!==null?u=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(u=n.LMCTL_API_URL,o.push("api.url")):(u=`http://127.0.0.1:${a}`,e.setConfig("api.url",u));for(let m of o)i.stderr.write(`note: ${xF(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
2216
- `);return{port:a,apiUrl:u,apiToken:c}}function xF(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 AF(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 Vo({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 eb(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=GT(r)?r:Bu(process.cwd(),r);return hF(`${n}/index.html`)?n:null}function tb(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?GT(e)?e:Bu(process.cwd(),e):Bu(gF(),".lmctl","local-mailbox")}function RF(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 rb(t,e=process.env){let r=LF(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 or pass --insecure-no-auth":r}function LF(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 i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;e.port=i;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 yF,XT,qu,SF,kF,IF,sb=E(()=>{"use strict";Qe();Zw();fu();JE();td();Cu();hu();Hd();Jd();UT();Uu();Be();Yn();Dc();JT();yF=`usage: lmctl serve <start|status|stop> [options]
2216
+ `);return{port:a,apiUrl:u,apiToken:c}}function xF(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 AF(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 Vo({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 eb(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=GT(r)?r:qu(process.cwd(),r);return hF(`${n}/index.html`)?n:null}function tb(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?GT(e)?e:qu(process.cwd(),e):qu(gF(),".lmctl","local-mailbox")}function RF(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 rb(t,e=process.env){let r=LF(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 or pass --insecure-no-auth":r}function LF(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 i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;e.port=i;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 yF,XT,Hu,SF,kF,IF,sb=E(()=>{"use strict";Qe();Zw();mu();JE();rd();Mu();gu();Jd();Xd();UT();Wu();Be();Yn();Pc();JT();yF=`usage: lmctl serve <start|status|stop> [options]
2217
2217
 
2218
2218
  Manage the local lmctl daemon: HTTP API, web UI, queue daemon, terminal
2219
2219
  manager, and agent services. A subcommand is REQUIRED \u2014 bare \`lmctl serve\`
@@ -2268,19 +2268,19 @@ unauthenticated daemon.
2268
2268
  lmctl serve stop
2269
2269
 
2270
2270
  Run 'lmctl serve --help' for details.
2271
- `;qu=!1;SF=2e3;kF=100,IF=1e4});import{existsSync as OF,mkdirSync as $F,readFileSync as CF,renameSync as MF,unlinkSync as jF,writeFileSync as DF}from"node:fs";import{homedir as ob}from"node:os";import{dirname as Ds,join as gt,resolve as PF}from"node:path";function $n(t,e,r){let n=Ds(PF(r)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())Tr(gt(o,".mcp.json"),"mcpServers",[Rn(),Ln()]),a.has("opencode")&&Tr(gt(o,".opencode","opencode.json"),"mcp",[cb(),db()]);for(let o of s)BF(o)}function lb(t=ab??ob()){return gt(t,".copilot","mcp-config.json")}function UF(t,e){st.mkdirSync(Ds(t),{recursive:!0});let r=gt(Ds(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{st.writeFileSync(r,`${JSON.stringify(e,null,2)}
2272
- `,"utf8"),st.renameSync(r,t)}catch(n){try{st.unlinkSync(r)}catch{}throw n}}function WF(t,e){st.mkdirSync(Ds(t),{recursive:!0});let r=gt(Ds(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{st.writeFileSync(r,e,"utf8"),st.renameSync(r,t)}catch(n){try{st.unlinkSync(r)}catch{}throw n}}function Tr(t,e,r){try{if(!st.existsSync(t))return;let n=JSON.parse(st.readFileSync(t,"utf8"));if(!On(n)||!On(n[e]))return;let s={...n[e]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[e]=s,UF(t,n),M({event:"mcp_cleanup",path:t,removed:i})}catch{}}function Rn(){return{name:xa,shouldRemove:YF}}function cb(){return{name:xa,shouldRemove:zF}}function Ln(){return{name:Na,shouldRemove:KF}}function db(){return{name:Na,shouldRemove:VF}}function BF(t){let e=ab??ob();switch(t){case"copilot":Tr(lb(e),"mcpServers",[Rn(),Ln()]);return;case"claude":Tr(gt(e,".claude.json"),"mcpServers",[Rn(),Ln()]);return;case"gemini":Tr(gt(e,".gemini","settings.json"),"mcpServers",[Rn(),Ln()]);return;case"qwen":Tr(gt(e,".qwen","settings.json"),"mcpServers",[Rn(),Ln()]);return;case"agy":Tr(gt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Rn(),Ln()]);return;case"opencode":Tr(gt(e,".config","opencode","opencode.json"),"mcp",[cb(),db()]);return;case"codex":qF(gt(e,".codex","config.toml"));return;default:return}}function qF(t){try{if(!st.existsSync(t))return;let e=st.readFileSync(t,"utf8"),r=HF(e);if(r===null)return;let n=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=ub(l);if(c===null)return;if(c!==void 0){if(ib(c,r)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=XF(l);if(d===null)return;if(d!==void 0&&ib(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;WF(t,s.join(`
2273
- `)),M({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function ib(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function HF(t){let e=new Map,r;for(let s of t.split(/\n/)){let i=ub(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=JF(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Na&&c[1]!==xa)continue;let d=e.get(c[1])??{};if(c[2]==="command"){let u=fb(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=GF(l);if(u===null)return null;d.args=u}e.set(c[1],d)}let n=new Set;for(let[s,i]of e.entries())s===Na&&pb(i.command,i.args)&&n.add(s),s===xa&&_b(i.command,i.args)&&n.add(s);return n}function JF(t,e){if(t.startsWith("mcp_servers"))return Aa(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=Aa(t);return r===null?null:[...e,...r]}function ub(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Aa(e[1])}function XF(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 Aa(r)}function Aa(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="",i=!1;for(;r<t.length;){let o=t[r];if(o==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)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 fb(t){let e=mb(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function GF(t){let e=mb(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>fb(s.trim()));return n.some(s=>s===null)?null:n}function mb(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function KF(t){return On(t)?t.type==="stdio"&&typeof t.command=="string"&&pb(t.command,t.args):!1}function VF(t){return!On(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&gb(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&hb(t.command[0],[t.command[1],t.command[2]])}function YF(t){return On(t)?t.type==="stdio"&&_b(t.command,t.args):!1}function zF(t){return!On(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&yb(t.command[0])&&t.command[1]==="mcp"}function pb(t,e){return gb(t)&&wb(e)||hb(t,e)}function _b(t,e){return yb(t)&&wb(e)}function hb(t,e){return ZF(t)&&Array.isArray(e)&&e.length===2&&QF(e[0])&&e[1]==="mcp"}function gb(t){return typeof t=="string"&&Hu(t)==="lmctl"}function yb(t){return typeof t=="string"&&Hu(t)==="lmctl0"}function ZF(t){if(typeof t!="string")return!1;let e=Hu(t).toLowerCase();return e==="node"||e==="node.exe"}function QF(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Hu(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function wb(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function On(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Na,xa,FF,st,ab,Ps=E(()=>{"use strict";ue();Na="lmctl",xa="lmctl0",FF={existsSync:OF,mkdirSync:$F,readFileSync:CF,writeFileSync:DF,renameSync:MF,unlinkSync:jF},st=FF});function bb(t){let e=Eb(t.registry,t.fromTeamfile);if(e===void 0)return Cn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Tb(e,t.fromAlias))return Cn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=Eb(t.registry,t.toTeamfile);return r===void 0?Cn(`target team is not registered in policy graph: ${t.toTeamfile}`):Tb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Cn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Cn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Cn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function Eb(t,e){return t.teams.find(r=>r.teamfile===e)}function Tb(t,e){return t.aliases.some(r=>r===e)}function Cn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var Sb=E(()=>{"use strict"});import{randomUUID as e1}from"node:crypto";import{hostname as vb,networkInterfaces as t1}from"node:os";function kb(t){let e=(t.now??new Date).toISOString();return{lock_id:e1(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??vb(),holder_ips:t.ips??o1(),started_at:e,last_heartbeat:e}}function Ib(t=process.env){return Nb(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,r1)}function s1(t=process.env){return Nb(t.LMCTL_TERMINAL_LOCK_STALE_MS,n1)}function Ju(t,e={}){let r=e.now??new Date,n=e.localHost??vb(),s=e.staleMs??s1();if(t.holder_host===n)return(e.isProcessAlive??i1)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Xu(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function Nb(t,e){if(t===void 0||t.trim()==="")return e;let r=t.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?e:n}function i1(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function o1(){let t=new Set;for(let e of Object.values(t1()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var r1,n1,Gu=E(()=>{"use strict";r1=15e3,n1=12e4});function a1(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2271
+ `;Hu=!1;SF=2e3;kF=100,IF=1e4});import{existsSync as OF,mkdirSync as $F,readFileSync as CF,renameSync as MF,unlinkSync as jF,writeFileSync as DF}from"node:fs";import{homedir as ob}from"node:os";import{dirname as Ds,join as gt,resolve as PF}from"node:path";function $n(t,e,r){let n=Ds(PF(r)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())Tr(gt(o,".mcp.json"),"mcpServers",[Rn(),Ln()]),a.has("opencode")&&Tr(gt(o,".opencode","opencode.json"),"mcp",[cb(),db()]);for(let o of s)BF(o)}function lb(t=ab??ob()){return gt(t,".copilot","mcp-config.json")}function UF(t,e){st.mkdirSync(Ds(t),{recursive:!0});let r=gt(Ds(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{st.writeFileSync(r,`${JSON.stringify(e,null,2)}
2272
+ `,"utf8"),st.renameSync(r,t)}catch(n){try{st.unlinkSync(r)}catch{}throw n}}function WF(t,e){st.mkdirSync(Ds(t),{recursive:!0});let r=gt(Ds(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{st.writeFileSync(r,e,"utf8"),st.renameSync(r,t)}catch(n){try{st.unlinkSync(r)}catch{}throw n}}function Tr(t,e,r){try{if(!st.existsSync(t))return;let n=JSON.parse(st.readFileSync(t,"utf8"));if(!On(n)||!On(n[e]))return;let s={...n[e]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[e]=s,UF(t,n),C({event:"mcp_cleanup",path:t,removed:i})}catch{}}function Rn(){return{name:xa,shouldRemove:YF}}function cb(){return{name:xa,shouldRemove:zF}}function Ln(){return{name:Na,shouldRemove:KF}}function db(){return{name:Na,shouldRemove:VF}}function BF(t){let e=ab??ob();switch(t){case"copilot":Tr(lb(e),"mcpServers",[Rn(),Ln()]);return;case"claude":Tr(gt(e,".claude.json"),"mcpServers",[Rn(),Ln()]);return;case"gemini":Tr(gt(e,".gemini","settings.json"),"mcpServers",[Rn(),Ln()]);return;case"qwen":Tr(gt(e,".qwen","settings.json"),"mcpServers",[Rn(),Ln()]);return;case"agy":Tr(gt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Rn(),Ln()]);return;case"opencode":Tr(gt(e,".config","opencode","opencode.json"),"mcp",[cb(),db()]);return;case"codex":qF(gt(e,".codex","config.toml"));return;default:return}}function qF(t){try{if(!st.existsSync(t))return;let e=st.readFileSync(t,"utf8"),r=HF(e);if(r===null)return;let n=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=ub(l);if(c===null)return;if(c!==void 0){if(ib(c,r)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=XF(l);if(d===null)return;if(d!==void 0&&ib(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;WF(t,s.join(`
2273
+ `)),C({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function ib(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function HF(t){let e=new Map,r;for(let s of t.split(/\n/)){let i=ub(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=JF(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Na&&c[1]!==xa)continue;let d=e.get(c[1])??{};if(c[2]==="command"){let u=fb(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=GF(l);if(u===null)return null;d.args=u}e.set(c[1],d)}let n=new Set;for(let[s,i]of e.entries())s===Na&&pb(i.command,i.args)&&n.add(s),s===xa&&_b(i.command,i.args)&&n.add(s);return n}function JF(t,e){if(t.startsWith("mcp_servers"))return Aa(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=Aa(t);return r===null?null:[...e,...r]}function ub(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Aa(e[1])}function XF(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 Aa(r)}function Aa(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="",i=!1;for(;r<t.length;){let o=t[r];if(o==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)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 fb(t){let e=mb(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function GF(t){let e=mb(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>fb(s.trim()));return n.some(s=>s===null)?null:n}function mb(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function KF(t){return On(t)?t.type==="stdio"&&typeof t.command=="string"&&pb(t.command,t.args):!1}function VF(t){return!On(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&gb(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&hb(t.command[0],[t.command[1],t.command[2]])}function YF(t){return On(t)?t.type==="stdio"&&_b(t.command,t.args):!1}function zF(t){return!On(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&yb(t.command[0])&&t.command[1]==="mcp"}function pb(t,e){return gb(t)&&wb(e)||hb(t,e)}function _b(t,e){return yb(t)&&wb(e)}function hb(t,e){return ZF(t)&&Array.isArray(e)&&e.length===2&&QF(e[0])&&e[1]==="mcp"}function gb(t){return typeof t=="string"&&Ju(t)==="lmctl"}function yb(t){return typeof t=="string"&&Ju(t)==="lmctl0"}function ZF(t){if(typeof t!="string")return!1;let e=Ju(t).toLowerCase();return e==="node"||e==="node.exe"}function QF(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Ju(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function wb(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function On(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Na,xa,FF,st,ab,Ps=E(()=>{"use strict";de();Na="lmctl",xa="lmctl0",FF={existsSync:OF,mkdirSync:$F,readFileSync:CF,writeFileSync:DF,renameSync:MF,unlinkSync:jF},st=FF});function bb(t){let e=Eb(t.registry,t.fromTeamfile);if(e===void 0)return Cn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Tb(e,t.fromAlias))return Cn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=Eb(t.registry,t.toTeamfile);return r===void 0?Cn(`target team is not registered in policy graph: ${t.toTeamfile}`):Tb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?Cn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?Cn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:Cn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function Eb(t,e){return t.teams.find(r=>r.teamfile===e)}function Tb(t,e){return t.aliases.some(r=>r===e)}function Cn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var Sb=E(()=>{"use strict"});import{randomUUID as e1}from"node:crypto";import{hostname as vb,networkInterfaces as t1}from"node:os";function kb(t){let e=(t.now??new Date).toISOString();return{lock_id:e1(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??vb(),holder_ips:t.ips??o1(),started_at:e,last_heartbeat:e}}function Ib(t=process.env){return Nb(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,r1)}function s1(t=process.env){return Nb(t.LMCTL_TERMINAL_LOCK_STALE_MS,n1)}function Xu(t,e={}){let r=e.now??new Date,n=e.localHost??vb(),s=e.staleMs??s1();if(t.holder_host===n)return(e.isProcessAlive??i1)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Gu(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function Nb(t,e){if(t===void 0||t.trim()==="")return e;let r=t.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?e:n}function i1(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function o1(){let t=new Set;for(let e of Object.values(t1()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var r1,n1,Ku=E(()=>{"use strict";r1=15e3,n1=12e4});function a1(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2274
2274
  manually, outside a member session that lmctl started. Running lmctl this way is
2275
2275
  not officially supported.
2276
2276
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function Fs(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2277
2277
  The session marker may be stale or the team may not be registered in this lmctl database.
2278
2278
  Consulted ${ti(Pt(),Z())}
2279
2279
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function xb(t){return`unknown option --from
2280
- ${a1(t)}`}function Ab(t,e){let r=Ku(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Ku(t,e){let r=t[ts];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of e.listRootTeams()){let o=Ue(i.teamfile_path,e);for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ra=E(()=>{"use strict";at();Be();Ot()});function Xr(t){let e=Hr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Vu=E(()=>{"use strict";ht()});async function $a(t){let e=t.onEvent??(()=>{}),r=c1(t.io,e),n=null,s=null,i=null,o,a=null,l=t.prompt;try{let c=await O(r,I=>$e(t.teamfile,t.alias,I)),d=c.teamfile,u=await O(r,I=>g1(I,t.env??process.env)),f=u.sender,m=await y1(r,{explicitRoot:t.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await w1(r,{rootTeamfile:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2281
- `}),i=await f1(r,{receiverTeamfile:d,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:t.prompt,origin:u.origin}),o=_1(r,i);try{$n(r,Fe(d),d)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,origin:u.origin,policy:p};let h=await $b(r,d,c.alias);if(h!==null){let I=Xu(h);if(f!==null){let x=await Yu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=La(`enqueued mailbox message ${x.id}`,null),zu(x.id,f,d,c.alias)}return Mn(i,n,t.prompt,I,"unavailable"),a=Zu(I,null),{status:"busy",message:I,teamChatLogId:null}}let g=await d1(r,d,c.alias);if(g.busy){if(f!==null){let x=await Yu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=La(`enqueued mailbox message ${x.id}`,null),zu(x.id,f,d,c.alias)}let I=await u1(r,d,c.alias);return Mn(i,n,t.prompt,I,"unavailable"),a=Zu(I,null),{status:"busy",message:I,teamChatLogId:null}}if(f!==null&&f.teamfile!==d){let I=await O(r,x=>gE(x,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(I.stop){let x=wE(I.chain);return Mn(i,n,t.prompt,x,"cycle"),a=Oa(x,null),{status:"error",errorKind:"cycle",message:x,teamChatLogId:null}}}let _=await b1(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator",...g.idleReclaim?{force:!0}:{}});if(!_.acquired){let I=Cb(d,c.alias,_.current);if(f!==null){let x=await Yu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=La(`enqueued mailbox message ${x.id}`,null),zu(x.id,f,d,c.alias)}return Mn(i,n,t.prompt,I,"unavailable"),a=Zu(I,null),{status:"busy",message:I,teamChatLogId:null}}s=_.lease;let y=await oa({sender:f??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:t.prompt,newMessageFrom:f===null?"operator":`${f.teamfile}:${f.alias}`,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:I=>e({kind:"delta",chunk:I}),onProgress:I=>e({kind:"progress",alias:c.alias,event:I}),onPromptBuilt:I=>{if(l=I,i!==null)return p1(r,i,I)}});l=y.prompt;let T=y.status==="stalled",b=null;if(T){let I=`provider stalled${y.stalledAfterMs!==void 0?` after ${y.stalledAfterMs}ms`:""}`;Mn(i,n,l,I,"error"),a=Oa(I,null,y.receipt)}else b=await v1(r,{...n,message:l,response:y.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=La(y.receipt,b);return{status:T?"stalled":"ok",replyText:y.receipt,wroteDelta:y.wroteDelta,teamChatLogId:b,durationMs:y.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c);return Mn(i,n,l,d,"error"),a=Oa(d,null),{status:"error",errorKind:c instanceof we?"target":"provider",message:d,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await S1(r,s),i!==null&&await m1(r,i,a??Oa("chat turn exited without a terminal outcome",null))}}function c1(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function d1(t,e,r){let n=await O(t,i=>Yt(i,e,r));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>_a(i,n,e,r));return{busy:!s,idleReclaim:s}}async function u1(t,e,r){let n=await $b(t,e,r);if(n!==null)return Xu(n);let s=await O(t,i=>i.getAgentInflight(e,r));return s!==null?Cb(e,r,s):`${r} is busy; wait and retry`}async function Yu(t,e){return await aa(t,t.env??process.env),await O(t,r=>r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,payload:e.payload}))}function zu(t,e,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:t,message:`mailbox message ${t} enqueued to ${s}`,teamChatLogId:null,sender:`${e.teamfile}:${e.alias}`,receiver:s}}async function f1(t,e){try{return(await O(t,n=>n.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:h1(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return ce()&&Oe(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function m1(t,e,r){try{await O(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function p1(t,e,r){try{await O(t,n=>{n.updateTrackedInvocationRequestPayload(e,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function _1(t,e){if(e===null)return;let r=setInterval(()=>{O(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{ce()&&Oe(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},l1);return r.unref?.(),r}function La(t,e){return{status:"done",result_summary:Us(t),error:null,team_chat_log_id:e}}function Zu(t,e){return{status:"busy",result_summary:Us(t),error:t,team_chat_log_id:e}}function Oa(t,e,r){return{status:"error",result_summary:Us(r===void 0?t:r),error:t,team_chat_log_id:e}}function Us(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function h1(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function g1(t,e){let r=Ab(e,t);if(r.ok)return{sender:Xr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Fs("chat"))}async function y1(t,e){if(e.explicitRoot!==void 0)return await O(t,n=>Te(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await O(t,n=>yE(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function w1(t,e){return await O(t,r=>bb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:E1(r,e.sender.teamfile,e.receiverTeamfile)}))}function E1(t,e,r){return{teams:[e,r].map(s=>T1(s,t))}}function T1(t,e){let r=Ue(t,e),n=Lt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function b1(t,e){return await O(t,r=>{let n=ce(),s=gr(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:yr(),...e.force===!0?{force:!0}:{}});return s.acquired?(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:Lb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Oe(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:Lb(s.current)})),{acquired:!1,current:s.current})})}async function $b(t,e,r){return await O(t,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(e,r);if(o===null)return null;if(Ju(o).live)return o;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(e,r);return s===null?null:Ju(s).live?s:null})}function Lb(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function S1(t,e){try{await O(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)}
2280
+ ${a1(t)}`}function Ab(t,e){let r=Vu(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Vu(t,e){let r=t[ts];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of e.listRootTeams()){let o=Ue(i.teamfile_path,e);for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ra=E(()=>{"use strict";at();Be();Ot()});function Xr(t){let e=Hr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Yu=E(()=>{"use strict";ht()});async function $a(t){let e=t.onEvent??(()=>{}),r=c1(t.io,e),n=null,s=null,i=null,o,a=null,l=t.prompt;try{let c=await O(r,I=>$e(t.teamfile,t.alias,I)),d=c.teamfile,u=await O(r,I=>g1(I,t.env??process.env)),f=u.sender,m=await y1(r,{explicitRoot:t.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await w1(r,{rootTeamfile:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2281
+ `}),i=await f1(r,{receiverTeamfile:d,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:t.prompt,origin:u.origin}),o=_1(r,i);try{$n(r,Fe(d),d)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,origin:u.origin,policy:p};let h=await $b(r,d,c.alias);if(h!==null){let I=Gu(h);if(f!==null){let x=await zu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=La(`enqueued mailbox message ${x.id}`,null),Zu(x.id,f,d,c.alias)}return Mn(i,n,t.prompt,I,"unavailable"),a=Qu(I,null),{status:"busy",message:I,teamChatLogId:null}}let g=await d1(r,d,c.alias);if(g.busy){if(f!==null){let x=await zu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=La(`enqueued mailbox message ${x.id}`,null),Zu(x.id,f,d,c.alias)}let I=await u1(r,d,c.alias);return Mn(i,n,t.prompt,I,"unavailable"),a=Qu(I,null),{status:"busy",message:I,teamChatLogId:null}}if(f!==null&&f.teamfile!==d){let I=await O(r,x=>gE(x,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(I.stop){let x=wE(I.chain);return Mn(i,n,t.prompt,x,"cycle"),a=Oa(x,null),{status:"error",errorKind:"cycle",message:x,teamChatLogId:null}}}let _=await b1(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator",...g.idleReclaim?{force:!0}:{}});if(!_.acquired){let I=Cb(d,c.alias,_.current);if(f!==null){let x=await zu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:t.prompt});return a=La(`enqueued mailbox message ${x.id}`,null),Zu(x.id,f,d,c.alias)}return Mn(i,n,t.prompt,I,"unavailable"),a=Qu(I,null),{status:"busy",message:I,teamChatLogId:null}}s=_.lease;let y=await oa({sender:f??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:t.prompt,newMessageFrom:f===null?"operator":`${f.teamfile}:${f.alias}`,io:r,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:I=>e({kind:"delta",chunk:I}),onProgress:I=>e({kind:"progress",alias:c.alias,event:I}),onPromptBuilt:I=>{if(l=I,i!==null)return p1(r,i,I)}});l=y.prompt;let T=y.status==="stalled",b=null;if(T){let I=`provider stalled${y.stalledAfterMs!==void 0?` after ${y.stalledAfterMs}ms`:""}`;Mn(i,n,l,I,"error"),a=Oa(I,null,y.receipt)}else b=await v1(r,{...n,message:l,response:y.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=La(y.receipt,b);return{status:T?"stalled":"ok",replyText:y.receipt,wroteDelta:y.wroteDelta,teamChatLogId:b,durationMs:y.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c);return Mn(i,n,l,d,"error"),a=Oa(d,null),{status:"error",errorKind:c instanceof we?"target":"provider",message:d,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await S1(r,s),i!==null&&await m1(r,i,a??Oa("chat turn exited without a terminal outcome",null))}}function c1(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function d1(t,e,r){let n=await O(t,i=>Yt(i,e,r));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>_a(i,n,e,r));return{busy:!s,idleReclaim:s}}async function u1(t,e,r){let n=await $b(t,e,r);if(n!==null)return Gu(n);let s=await O(t,i=>i.getAgentInflight(e,r));return s!==null?Cb(e,r,s):`${r} is busy; wait and retry`}async function zu(t,e){return await aa(t,t.env??process.env),await O(t,r=>r.enqueueMail({sender_teamfile:e.sender.teamfile,sender_alias:e.sender.alias,receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,payload:e.payload}))}function Zu(t,e,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:t,message:`mailbox message ${t} enqueued to ${s}`,teamChatLogId:null,sender:`${e.teamfile}:${e.alias}`,receiver:s}}async function f1(t,e){try{return(await O(t,n=>n.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:h1(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(r){return ce()&&Oe(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function m1(t,e,r){try{await O(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function p1(t,e,r){try{await O(t,n=>{n.updateTrackedInvocationRequestPayload(e,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:n instanceof Error?n.message:String(n)}))}}function _1(t,e){if(e===null)return;let r=setInterval(()=>{O(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{ce()&&Oe(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},l1);return r.unref?.(),r}function La(t,e){return{status:"done",result_summary:Us(t),error:null,team_chat_log_id:e}}function Qu(t,e){return{status:"busy",result_summary:Us(t),error:t,team_chat_log_id:e}}function Oa(t,e,r){return{status:"error",result_summary:Us(r===void 0?t:r),error:t,team_chat_log_id:e}}function Us(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function h1(t,e,r){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function g1(t,e){let r=Ab(e,t);if(r.ok)return{sender:Xr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Fs("chat"))}async function y1(t,e){if(e.explicitRoot!==void 0)return await O(t,n=>Te(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await O(t,n=>yE(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function w1(t,e){return await O(t,r=>bb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:E1(r,e.sender.teamfile,e.receiverTeamfile)}))}function E1(t,e,r){return{teams:[e,r].map(s=>T1(s,t))}}function T1(t,e){let r=Ue(t,e),n=Lt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function b1(t,e){return await O(t,r=>{let n=ce(),s=gr(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:yr(),...e.force===!0?{force:!0}:{}});return s.acquired?(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:Lb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Oe(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:Lb(s.current)})),{acquired:!1,current:s.current})})}async function $b(t,e,r){return await O(t,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(e,r);if(o===null)return null;if(Xu(o).live)return o;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(e,r);return s===null?null:Xu(s).live?s:null})}function Lb(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function S1(t,e){try{await O(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)}
2282
2282
  `)}}function Cb(t,e,r){return`${e} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function v1(t,e){let r=Ob(e.message),n=e.response===null?null:Ob(e.response);try{return await O(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2283
- `),null}}function Mn(t,e,r,n,s){t!==null||e===null||M({event:"chat_attempt_error",reason:s,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,origin:e.origin,error_detail:n,message_preview:Us(r)})}function Ob(t){return t.length<=Rb?{text:t,truncated:!1}:{text:t.slice(0,Rb),truncated:!0}}var Rb,l1,Qu=E(()=>{"use strict";ht();Zt();Ps();Sb();Ot();la();ue();Le();Br();uu();Gu();Ra();Vu();ru();Rb=256*1024,l1=3e4});var Ub={};Ee(Ub,{parseIdleTimeoutMs:()=>Pb,resolvePromptInput:()=>Db,runChat:()=>N1});import{readFileSync as k1}from"node:fs";async function N1(t,e={stdout:process.stdout,stderr:process.stderr}){let r=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${jb}
2283
+ `),null}}function Mn(t,e,r,n,s){t!==null||e===null||C({event:"chat_attempt_error",reason:s,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,origin:e.origin,error_detail:n,message_preview:Us(r)})}function Ob(t){return t.length<=Rb?{text:t,truncated:!1}:{text:t.slice(0,Rb),truncated:!0}}var Rb,l1,ef=E(()=>{"use strict";ht();Zt();Ps();Sb();Ot();la();de();Le();Br();fu();Ku();Ra();Yu();nu();Rb=256*1024,l1=3e4});var Ub={};Ee(Ub,{parseIdleTimeoutMs:()=>Pb,resolvePromptInput:()=>Db,runChat:()=>N1});import{readFileSync as k1}from"node:fs";async function N1(t,e={stdout:process.stdout,stderr:process.stderr}){let r=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${jb}
2284
2284
  `),t.length===0?2:0;let n=x1(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
2285
2285
  ${jb}
2286
2286
  `),2;if(n.promptFile!==void 0){let u=await Db(n.promptFile,e);if(typeof u!="string")return e.stderr.write(`error: ${u.error}
@@ -2323,7 +2323,7 @@ ${jb}
2323
2323
  `),s}async function A1(t){let e=[];for await(let r of t)e.push(typeof r=="string"?Buffer.from(r,"utf8"):r);return Buffer.concat(e).toString("utf8")}function Pb(t){if(t==="0")return 0;if(/^\d+$/.test(t))return Number(t);let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function Fb(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
2324
2324
  `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
2325
2325
  `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
2326
- `)}function R1(t,e){return t.slice(-e)}function L1(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Fb(t,e.alias,e.event):t.stderr.write(e.message)}var I1,jb,Wb=E(()=>{"use strict";It();dl();Le();ht();Qu();Ra();ue();Zo();Ht();I1={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},jb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2326
+ `)}function R1(t,e){return t.slice(-e)}function L1(t,e){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Fb(t,e.alias,e.event):t.stderr.write(e.message)}var I1,jb,Wb=E(()=>{"use strict";It();ul();Le();ht();ef();Ra();de();Zo();Ht();I1={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},jb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2327
2327
  lmctl chat <teamfile> <alias> "<prompt>"
2328
2328
  lmctl chat <sessionid> "<prompt>" --provider <name>
2329
2329
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -2341,40 +2341,40 @@ Safe input (no shell involved) \u2014 use for anything non-trivial:
2341
2341
  your file-writing tool (not echo/heredoc), then pass --prompt-file.
2342
2342
  --permission-mode defaults to yolo.
2343
2343
 
2344
- Send a prompt to a team member or raw provider session, or answer a paused run.`});function Ws(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=O1.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:$1(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function $1(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let i=C1(e,n);try{let o=M1(t,s),a=Bb(o.year,o.month,o.day,i,r,s);if(a.getTime()<=t.getTime()){let l=F1(o,1);a=Bb(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function C1(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function M1(t,e){let r=qb(e,!1).formatToParts(t);return{year:Qt(r,"year"),month:Qt(r,"month"),day:Qt(r,"day")}}function Bb(t,e,r,n,s,i){let o=Date.UTC(t,e-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=j1(new Date(o),i);o=Date.UTC(t,e-1,r,n,s,0,0)-l}return new Date(o)}function j1(t,e){let r=qb(e,!0).formatToParts(t);return Date.UTC(Qt(r,"year"),Qt(r,"month")-1,Qt(r,"day"),Qt(r,"hour"),Qt(r,"minute"),Qt(r,"second"),0)-t.getTime()}function qb(t,e){let r=e?P1:D1,n=r.get(t);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(t,s),s}function Qt(t,e){let r=t.find(n=>n.type===e)?.value;if(r===void 0)throw new Error(`missing ${e}`);return Number.parseInt(r,10)}function F1(t,e){let r=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var O1,D1,P1,ef=E(()=>{"use strict";O1=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;D1=new Map,P1=new Map});var Xb={};Ee(Xb,{runRecover:()=>W1});import{dirname as Hb,resolve as Jb}from"node:path";async function W1(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${tf}
2344
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});function Ws(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=O1.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),i=n[2]===void 0?0:Number.parseInt(n[2],10),o=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:$1(r.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function $1(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let i=C1(e,n);try{let o=M1(t,s),a=Bb(o.year,o.month,o.day,i,r,s);if(a.getTime()<=t.getTime()){let l=F1(o,1);a=Bb(l.year,l.month,l.day,i,r,s)}return a.toISOString()}catch{return null}}function C1(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function M1(t,e){let r=qb(e,!1).formatToParts(t);return{year:Qt(r,"year"),month:Qt(r,"month"),day:Qt(r,"day")}}function Bb(t,e,r,n,s,i){let o=Date.UTC(t,e-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=j1(new Date(o),i);o=Date.UTC(t,e-1,r,n,s,0,0)-l}return new Date(o)}function j1(t,e){let r=qb(e,!0).formatToParts(t);return Date.UTC(Qt(r,"year"),Qt(r,"month")-1,Qt(r,"day"),Qt(r,"hour"),Qt(r,"minute"),Qt(r,"second"),0)-t.getTime()}function qb(t,e){let r=e?P1:D1,n=r.get(t);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(t,s),s}function Qt(t,e){let r=t.find(n=>n.type===e)?.value;if(r===void 0)throw new Error(`missing ${e}`);return Number.parseInt(r,10)}function F1(t,e){let r=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var O1,D1,P1,tf=E(()=>{"use strict";O1=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;D1=new Map,P1=new Map});var Xb={};Ee(Xb,{runRecover:()=>W1});import{dirname as Hb,resolve as Jb}from"node:path";async function W1(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${rf}
2345
2345
  `),0;let n=Q(t.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(n.error!==void 0)return v(e,`${n.error}
2346
2346
 
2347
- ${tf}`);if(n.positionals.length===0)return v(e,`recover requires a <teamfile>
2347
+ ${rf}`);if(n.positionals.length===0)return v(e,`recover requires a <teamfile>
2348
2348
 
2349
- ${tf}`);if(n.positionals.length>2)return v(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Hr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return v(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(K(n,"--all")&&l!==void 0)return v(e,"recover --all is mutually exclusive with <alias>");let c;try{c=await B1(e,o,l)}catch(p){if(p instanceof we)return v(e,p.message);throw p}let d=r.now??new Date,u=K(n,"--dry-run"),f=[];for(let p of c)f.push(await q1(e,p,{now:d,dryRun:u}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(K(n,"--json"))le(e,{dryRun:u,now:d.toISOString(),summary:m,members:f});else{for(let p of f)e.stdout.write(H1(p));e.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2350
- `)}return m.errors>0?1:0}async function B1(t,e,r){return await O(t,n=>{let s=Te(e,n);if(r!==void 0){let i=Ue(s,n);if(i.parseErrors.length>0)throw new we(`lmctl: ${e}: ${i.parseErrors.join("; ")}`);let o=ua(i,r);return o?.teamfile!==void 0?rf(Jb(Hb(s),o.teamfile),n,new Set):[$e(e,r,n)]}return rf(s,n,new Set)})}function rf(t,e,r){let n=Te(t,e);if(r.has(n))return[];r.add(n);let s=Ue(n,e);if(s.parseErrors.length>0)throw new we(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...rf(Jb(Hb(n),o.teamfile),e,r));continue}o.session!==void 0&&i.push($e(n,o.alias,e))}return i}async function q1(t,e,r){let n;try{let a=await Ye(e.sessionid,e.provider);if(a===null)return Ct(e,"session_not_found",null,"session detail not found");n=Ws(a.messages)}catch(a){return Ct(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Ct(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Ct(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Ct(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Ct(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await O(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(i!==null)return Ct(e,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return Ct(e,"would_recover",n,null);let o=await $a({teamfile:e.teamfile,alias:e.alias,prompt:U1,permissionMode:"yolo",io:t,env:process.env});return o.status==="ok"||o.status==="stalled"?Ct(e,"recovered",n,null):Ct(e,o.status==="busy"?"busy":"send_error",n,o.message)}function Ct(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function H1(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
2351
- `}var U1,tf,Gb=E(()=>{"use strict";ef();Er();Zt();Ot();ht();Qu();Le();U1="Your session limit reset time has passed. Continue your work from the last actionable point.",tf=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]"," lmctl recover <teamfile>:<alias> [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2352
- `)});var Bs,j5,nf=E(()=>{"use strict";Bs=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],j5=Bs.length});import{spawn as J1}from"node:child_process";async function Vb(t,e,r){let n=G1.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return K1(n.name,s)}function K1(t,e){return t==="lmctl_chat"?V1(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function V1(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",r,n,e];return ce()&&Oe(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),Y1(s,process.cwd())}function Y1(t,e){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=J1("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=z1(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){ce()&&Oe(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2353
- `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function z1(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return Kb;let r=Number(e);return!Number.isFinite(r)||r<=0?Kb:r}function sf(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:X1),s=t.getConfig("api.token"),i=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:n,token:i}}var X1,Kb,G1,of=E(()=>{"use strict";nf();ue();X1="http://127.0.0.1:8787",Kb=30*60*1e3,G1=new Map(Bs.map(t=>[t.name,t]))});async function tU(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(af({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:Z1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:Q1,version:eU}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Bs.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await Vb(i,o,e.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function af(t){return`${JSON.stringify(t)}
2354
- `}async function Yb(t,e){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){t.io.write(af({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await tU(l,t);c.kind==="response"?t.io.write(af(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=n.indexOf(`
2349
+ ${rf}`);if(n.positionals.length>2)return v(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Hr(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return v(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(K(n,"--all")&&l!==void 0)return v(e,"recover --all is mutually exclusive with <alias>");let c;try{c=await B1(e,o,l)}catch(p){if(p instanceof we)return v(e,p.message);throw p}let d=r.now??new Date,u=K(n,"--dry-run"),f=[];for(let p of c)f.push(await q1(e,p,{now:d,dryRun:u}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(K(n,"--json"))le(e,{dryRun:u,now:d.toISOString(),summary:m,members:f});else{for(let p of f)e.stdout.write(H1(p));e.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2350
+ `)}return m.errors>0?1:0}async function B1(t,e,r){return await O(t,n=>{let s=Te(e,n);if(r!==void 0){let i=Ue(s,n);if(i.parseErrors.length>0)throw new we(`lmctl: ${e}: ${i.parseErrors.join("; ")}`);let o=ua(i,r);return o?.teamfile!==void 0?nf(Jb(Hb(s),o.teamfile),n,new Set):[$e(e,r,n)]}return nf(s,n,new Set)})}function nf(t,e,r){let n=Te(t,e);if(r.has(n))return[];r.add(n);let s=Ue(n,e);if(s.parseErrors.length>0)throw new we(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...nf(Jb(Hb(n),o.teamfile),e,r));continue}o.session!==void 0&&i.push($e(n,o.alias,e))}return i}async function q1(t,e,r){let n;try{let a=await Ye(e.sessionid,e.provider);if(a===null)return Ct(e,"session_not_found",null,"session detail not found");n=Ws(a.messages)}catch(a){return Ct(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Ct(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Ct(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Ct(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Ct(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await O(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(i!==null)return Ct(e,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return Ct(e,"would_recover",n,null);let o=await $a({teamfile:e.teamfile,alias:e.alias,prompt:U1,permissionMode:"yolo",io:t,env:process.env});return o.status==="ok"||o.status==="stalled"?Ct(e,"recovered",n,null):Ct(e,o.status==="busy"?"busy":"send_error",n,o.message)}function Ct(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function H1(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
2351
+ `}var U1,rf,Gb=E(()=>{"use strict";tf();Er();Zt();Ot();ht();ef();Le();U1="Your session limit reset time has passed. Continue your work from the last actionable point.",rf=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]"," lmctl recover <teamfile>:<alias> [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2352
+ `)});var Bs,j5,sf=E(()=>{"use strict";Bs=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],j5=Bs.length});import{spawn as J1}from"node:child_process";async function Vb(t,e,r){let n=G1.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return K1(n.name,s)}function K1(t,e){return t==="lmctl_chat"?V1(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function V1(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",r,n,e];return ce()&&Oe(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),Y1(s,process.cwd())}function Y1(t,e){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=J1("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=z1(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){ce()&&Oe(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2353
+ `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function z1(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return Kb;let r=Number(e);return!Number.isFinite(r)||r<=0?Kb:r}function of(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:X1),s=t.getConfig("api.token"),i=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:n,token:i}}var X1,Kb,G1,af=E(()=>{"use strict";sf();de();X1="http://127.0.0.1:8787",Kb=30*60*1e3,G1=new Map(Bs.map(t=>[t.name,t]))});async function tU(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(lf({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:Z1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:Q1,version:eU}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Bs.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await Vb(i,o,e.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function lf(t){return`${JSON.stringify(t)}
2354
+ `}async function Yb(t,e){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){t.io.write(lf({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await tU(l,t);c.kind==="response"?t.io.write(lf(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=n.indexOf(`
2355
2355
  `);for(;u!==-1;){let f=n.slice(0,u);n=n.slice(u+1),a=a.then(()=>i(f)).then(()=>{s&&c(0)}),u=n.indexOf(`
2356
2356
  `)}};e.setEncoding("utf8"),e.on("data",u=>{n+=u,d()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>i(n))),a.finally(()=>c(0))}),e.on("error",u=>{t.io.log?.(`mcp: stdin error: ${u.message}
2357
- `),a.finally(()=>c(1))})})}var Z1,Q1,eU,zb=E(()=>{"use strict";nf();of();Z1="2025-06-18",Q1="lmctl",eU="0.0.1"});var Qb={};Ee(Qb,{runMcp:()=>nU});async function nU(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(rU),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
2358
- `),2;M({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??sU(),i=1;try{let o=s===void 0?sf({getConfig:()=>null},process.env):sf(s,process.env);return i=await Yb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{M({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function sU(){let t=Z(),e=3;for(let r=1;r<=e;r+=1)try{return ke({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(M({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&Zb(s))iU(50*r);else if(!Zb(s))break}}function Zb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function iU(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var rU,eS=E(()=>{"use strict";Qe();of();zb();ue();Be();rU=`usage: lmctl mcp
2357
+ `),a.finally(()=>c(1))})})}var Z1,Q1,eU,zb=E(()=>{"use strict";sf();af();Z1="2025-06-18",Q1="lmctl",eU="0.0.1"});var Qb={};Ee(Qb,{runMcp:()=>nU});async function nU(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(rU),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
2358
+ `),2;C({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??sU(),i=1;try{let o=s===void 0?of({getConfig:()=>null},process.env):of(s,process.env);return i=await Yb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{C({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function sU(){let t=Z(),e=3;for(let r=1;r<=e;r+=1)try{return ke({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(C({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&Zb(s))iU(50*r);else if(!Zb(s))break}}function Zb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function iU(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var rU,eS=E(()=>{"use strict";Qe();af();zb();de();Be();rU=`usage: lmctl mcp
2359
2359
 
2360
2360
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2361
2361
  local config, then uses stdin/stdout for JSON-RPC frames.
2362
- `});var tS={};Ee(tS,{runDevice:()=>hU});import{readFileSync as oU}from"node:fs";import{homedir as aU}from"node:os";import{join as lU}from"node:path";import{CognitoIdentityClient as cU,GetIdCommand as dU}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as uU}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as fU,ListObjectsV2Command as mU,PutObjectCommand as pU,S3Client as _U}from"@aws-sdk/client-s3";async function hU(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write(lf),0;if(r==="init"){let n=Fu();return e.stdout.write(`${n.device_id}
2362
+ `});var tS={};Ee(tS,{runDevice:()=>hU});import{readFileSync as oU}from"node:fs";import{homedir as aU}from"node:os";import{join as lU}from"node:path";import{CognitoIdentityClient as cU,GetIdCommand as dU}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as uU}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as fU,ListObjectsV2Command as mU,PutObjectCommand as pU,S3Client as _U}from"@aws-sdk/client-s3";async function hU(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write(cf),0;if(r==="init"){let n=Uu();return e.stdout.write(`${n.device_id}
2363
2363
  `),0}if(r==="id"){let n=Jr();return n===null?(e.stderr.write(`error: no device id initialized at ${ka()}; run 'lmctl device init'
2364
2364
  `),1):(e.stdout.write(`${n.device_id}
2365
2365
  `),0)}return r==="login"?await gU(t.slice(1),e):r==="prompt"?await wU(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
2366
2366
  `),1)}async function gU(t,e){let r=yU(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2367
- ${lf}`),2;let n=js();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2367
+ ${cf}`),2;let n=js();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2368
2368
  `),1;wT({userId:r.userId,refreshToken:r.accessKey});let s,i,o;try{let c=await wa({region:n.config.region,clientId:n.config.cognitoClientId??va,refreshToken:r.accessKey});s=c.idToken,i=c.accessToken,o=c.expiresAt}catch(c){let d=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${d}
2369
2369
  `),1}let a=$s(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
2370
- `),1;Ru({idToken:s,...i!==void 0?{accessToken:i}:{},refreshToken:r.accessKey,...o!==void 0?{expiresAt:o}:{}});let l=Jr()??Fu();return e.stdout.write(`logged in as ${r.userId}
2370
+ `),1;Lu({idToken:s,...i!==void 0?{accessToken:i}:{},refreshToken:r.accessKey,...o!==void 0?{expiresAt:o}:{}});let l=Jr()??Uu();return e.stdout.write(`logged in as ${r.userId}
2371
2371
  device id: ${l.device_id}
2372
2372
  mailbox prefix: ${r.userId}/${l.device_id}/
2373
2373
  access key stored at ${Cs()}
2374
2374
  `),0}function yU(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";e=i;continue}if(s==="--access-key"){let i=t[++n];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";r=i;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 wU(t,e){let r=EU(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2375
- ${lf}`),2;let n=js();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2375
+ ${cf}`),2;let n=js();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2376
2376
  `),1;let s=bU();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await TU({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:o,idToken:i}),l=uU({identityId:a,logins:{[o]:i},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Jr()?.device_id,d=$s(i)??void 0,u=new Wr({bucket:n.config.mailboxBucket,identityId:a,...d!==void 0?{userId:d}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new _U({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:mU,GetObjectCommand:fU,PutObjectCommand:pU},selfRole:"browser",onMessage:async()=>{}}),f=lT({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await u.putMessage({conversation_id:aT,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:u.getMailboxBasePrefix(),object_key:m},null,2)+`
2377
- `),0}function EU(t){let e,r,n;for(let s=0;s<t.length;s+=1){let i=t[s];if(i==="--root"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";e=o;continue}if(i==="--text"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function TU(t){let r=await new cU({region:t.region}).send(new dU({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 bU(t=process.env.LMCTL_TOKEN_PATH??lU(aU(),".lmctl","cli-tokens.json")){try{return JSON.parse(oU(t,"utf8"))}catch{return null}}var lf,rS=E(()=>{"use strict";Uu();Cu();Jo();Iu();Nu();Lu();xu();lf=`usage: lmctl device <id|init|login|prompt>
2377
+ `),0}function EU(t){let e,r,n;for(let s=0;s<t.length;s+=1){let i=t[s];if(i==="--root"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";e=o;continue}if(i==="--text"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=t[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function TU(t){let r=await new cU({region:t.region}).send(new dU({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 bU(t=process.env.LMCTL_TOKEN_PATH??lU(aU(),".lmctl","cli-tokens.json")){try{return JSON.parse(oU(t,"utf8"))}catch{return null}}var cf,rS=E(()=>{"use strict";Wu();Mu();Jo();Nu();xu();Ou();Au();cf=`usage: lmctl device <id|init|login|prompt>
2378
2378
  lmctl device login --user-id <sub> --access-key <refreshToken>
2379
2379
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
2380
2380
 
@@ -2384,8 +2384,8 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
2384
2384
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
2385
2385
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
2386
2386
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2387
- `});import{existsSync as nS,mkdirSync as SU,readdirSync as vU,readFileSync as sS,writeFileSync as kU}from"node:fs";import{join as jn}from"node:path";import{fileURLToPath as IU}from"node:url";function xU(t){try{return NU.some(e=>nS(jn(t,e)))}catch{return!1}}function AU(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),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function iS(t,e){t.durable_memory_mode!=="db"?RU(t):LU(t,e)}function oS(t){let e=xU(t),r;try{r=vU(cf).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 RU(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=jn(e,"durable-memory");try{SU(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i);return}let n=oS(e),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=jn(r,o);if(!nS(a))try{let l=sS(jn(cf,i),"utf8");kU(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function LU(t,e){let r=t.local_path??"",n=oS(r),s=[];for(let i of n){let o=jn(cf,i),a;try{a=sS(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c);continue}let l=AU(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`);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 cf,NU,aS=E(()=>{"use strict";cf=jn(IU(import.meta.url),"../../config/durable_memory_templates"),NU=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as OU}from"node:crypto";import{existsSync as $U,mkdirSync as CU,writeFileSync as MU}from"node:fs";import{dirname as jU,join as Dn}from"node:path";function df(t){return typeof t=="string"&&t.startsWith(lS)}function BU(t){if(!df(t))throw new yt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(lS.length),r=e.indexOf("/");if(r<=0)throw new yt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!UU.has(n))throw new yt(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new yt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new yt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function qU(t,e,r){if(t==="workflow")return vo(e,r);let n=t==="mcp"?Dn("templates","mcp",`${e}.json`):Dn("templates","skills",e,"SKILL.md");for(let s of md(r)){let i=Dn(s,n);if($U(i))return i}return null}function HU(t,e,r){let n=Dn(fd(r),PU,t);return t==="skill"?Dn(n,e,"SKILL.md"):Dn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function JU(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 cS(t,e){let{kind:r,name:n,ref:s}=BU(t),i=qU(r,n,e);if(i!==null)return i;let o=`${DU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(FU)})}catch(d){throw new yt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${d instanceof Error?d.message:String(d)}). Failing closed.`,"missing")}if(!a.ok)throw new yt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let d=WU.exec(s);if(d!==null){let u=OU("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new yt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!JU(r,l))throw new yt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=HU(r,n,e);return CU(jU(c),{recursive:!0}),MU(c,l,"utf8"),c}var lS,DU,PU,FU,UU,yt,WU,dS=E(()=>{"use strict";pd();lS="lmctl://",DU="https://lmctl.com/templates/",PU=".cache",FU=8e3,UU=new Set(["workflow","mcp","skill"]),yt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},WU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as XU}from"node:child_process";import{cpSync as uS,existsSync as GU,mkdirSync as KU,mkdtempSync as VU,readFileSync as T9,statSync as YU,writeFileSync as fS}from"node:fs";import{homedir as zU,tmpdir as ZU}from"node:os";import{basename as mS,join as er}from"node:path";function uf(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ff(t,e,r){if(Array.isArray(t)){for(let n of t)ff(n,e,r);return}if(uf(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))ff(n,e,r)}}function rW(t,e){let r={mcp:[],skills:[]},n=new Set;for(let i of t.listProjects()){if(i.team_id!==e.team_id)continue;let o=t.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!uf(a)||!Array.isArray(a.steps)))for(let l of a.steps)uf(l)&&l.members!==void 0&&ff(l.members,e.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(tW(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function nW(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function sW(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(QU)})}catch(s){throw new br(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new br(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>pS)throw new br(e,`fetched ${t} exceeds ${pS} bytes`);return n}function iW(t,e,r,n){let s=XU(t,e,{cwd:r,env:sr(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new br(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new br(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function oW(t){if(typeof t!="string")return t.name;let e=mS(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?mS(t.replace(/\/skill\.md$/i,"")):e}async function _S(t,e,r){let n=oW(t),s=er(e,n);if(KU(s,{recursive:!0}),typeof t!="string")return fS(er(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(df(t)&&(t=await cS(t)),gS.test(t))return fS(er(s,"SKILL.md"),await sW(t,r),"utf8"),{name:n,dir:s};if(!GU(t))throw new br(r,`skill path not found: ${t}`);return YU(t).isDirectory()?(uS(t,s,{recursive:!0}),{name:n,dir:s}):(uS(t,er(s,"SKILL.md")),{name:n,dir:s})}async function yS(t){let{dal:e,member:r,stderr:n}=t,s=rW(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=qe(r),o=r.sessiondir||t.baseDir||nW(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2388
- `)};if(s.mcp.length>0&&a(`MCP capability install is disabled in lmctl; ${s.mcp.length} declared server(s) NOT installed. Use nomcp for MCP server access.`),s.skills.length>0)if(eW.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=VU(er(ZU(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!gS.test(c)?c:(await _S(c,l,r.alias)).dir;iW(i,["skills","install",d,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(hS[i]!==void 0){let l=hS[i]();for(let c of s.skills)await _S(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var br,gS,QU,pS,eW,tW,Ca,hS,wS=E(()=>{"use strict";Qe();dS();at();Ps();br=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},gS=/^https?:\/\//i,QU=8e3,pS=1e6,eW=new Set(["opencode"]),tW=t=>JSON.stringify(t),Ca=()=>process.env.HOME??zU();hS={claude:()=>er(Ca(),".claude","skills"),qwen:()=>er(Ca(),".qwen","skills"),codex:()=>er(Ca(),".codex","skills"),copilot:()=>er(Ca(),".copilot","skills")}});var mf,ES=E(()=>{"use strict";mf=`---
2387
+ `});import{existsSync as nS,mkdirSync as SU,readdirSync as vU,readFileSync as sS,writeFileSync as kU}from"node:fs";import{join as jn}from"node:path";import{fileURLToPath as IU}from"node:url";function xU(t){try{return NU.some(e=>nS(jn(t,e)))}catch{return!1}}function AU(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),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}function iS(t,e){t.durable_memory_mode!=="db"?RU(t):LU(t,e)}function oS(t){let e=xU(t),r;try{r=vU(Ca).filter(n=>n.endsWith(".template")).sort()}catch(n){return C({event:"bootstrap_templates_unreadable",path:Ca,error_message:n instanceof Error?n.message:String(n)}),[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function RU(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),C({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let r=jn(e,"durable-memory");try{SU(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),C({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:r,error_message:i instanceof Error?i.message:String(i)});return}let n=oS(e),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=jn(r,o);if(!nS(a))try{let l=sS(jn(Ca,i),"utf8");kU(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),C({event:"bootstrap_template_copy_failed",project_id:t.id,template:i,path:a,error_message:l instanceof Error?l.message:String(l)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function LU(t,e){let r=t.local_path??"",n=oS(r),s=[];for(let i of n){let o=jn(Ca,i),a;try{a=sS(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c),C({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:c instanceof Error?c.message:String(c)});continue}let l=AU(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`),C({event:"bootstrap_template_frontmatter_invalid",project_id:t.id,template:i,path:o});continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c),C({event:"bootstrap_memory_upsert_failed",project_id:t.id,memory_name:l.name,template:i,error_message:c instanceof Error?c.message:String(c)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var Ca,NU,aS=E(()=>{"use strict";de();Ca=jn(IU(import.meta.url),"../../config/durable_memory_templates"),NU=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as OU}from"node:crypto";import{existsSync as $U,mkdirSync as CU,writeFileSync as MU}from"node:fs";import{dirname as jU,join as Dn}from"node:path";function df(t){return typeof t=="string"&&t.startsWith(lS)}function BU(t){if(!df(t))throw new yt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(lS.length),r=e.indexOf("/");if(r<=0)throw new yt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!UU.has(n))throw new yt(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new yt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new yt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function qU(t,e,r){if(t==="workflow")return vo(e,r);let n=t==="mcp"?Dn("templates","mcp",`${e}.json`):Dn("templates","skills",e,"SKILL.md");for(let s of pd(r)){let i=Dn(s,n);if($U(i))return i}return null}function HU(t,e,r){let n=Dn(md(r),PU,t);return t==="skill"?Dn(n,e,"SKILL.md"):Dn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function JU(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 cS(t,e){let{kind:r,name:n,ref:s}=BU(t),i=qU(r,n,e);if(i!==null)return i;let o=`${DU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(FU)})}catch(d){throw new yt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${d instanceof Error?d.message:String(d)}). Failing closed.`,"missing")}if(!a.ok)throw new yt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let d=WU.exec(s);if(d!==null){let u=OU("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new yt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!JU(r,l))throw new yt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=HU(r,n,e);return CU(jU(c),{recursive:!0}),MU(c,l,"utf8"),c}var lS,DU,PU,FU,UU,yt,WU,dS=E(()=>{"use strict";_d();lS="lmctl://",DU="https://lmctl.com/templates/",PU=".cache",FU=8e3,UU=new Set(["workflow","mcp","skill"]),yt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},WU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as XU}from"node:child_process";import{cpSync as uS,existsSync as GU,mkdirSync as KU,mkdtempSync as VU,readFileSync as b9,statSync as YU,writeFileSync as fS}from"node:fs";import{homedir as zU,tmpdir as ZU}from"node:os";import{basename as mS,join as er}from"node:path";function uf(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ff(t,e,r){if(Array.isArray(t)){for(let n of t)ff(n,e,r);return}if(uf(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))ff(n,e,r)}}function rW(t,e){let r={mcp:[],skills:[]},n=new Set;for(let i of t.listProjects()){if(i.team_id!==e.team_id)continue;let o=t.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!uf(a)||!Array.isArray(a.steps)))for(let l of a.steps)uf(l)&&l.members!==void 0&&ff(l.members,e.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(tW(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function nW(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function sW(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(QU)})}catch(s){throw new br(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new br(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>pS)throw new br(e,`fetched ${t} exceeds ${pS} bytes`);return n}function iW(t,e,r,n){let s=XU(t,e,{cwd:r,env:sr(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new br(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new br(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function oW(t){if(typeof t!="string")return t.name;let e=mS(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?mS(t.replace(/\/skill\.md$/i,"")):e}async function _S(t,e,r){let n=oW(t),s=er(e,n);if(KU(s,{recursive:!0}),typeof t!="string")return fS(er(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(df(t)&&(t=await cS(t)),gS.test(t))return fS(er(s,"SKILL.md"),await sW(t,r),"utf8"),{name:n,dir:s};if(!GU(t))throw new br(r,`skill path not found: ${t}`);return YU(t).isDirectory()?(uS(t,s,{recursive:!0}),{name:n,dir:s}):(uS(t,er(s,"SKILL.md")),{name:n,dir:s})}async function yS(t){let{dal:e,member:r,stderr:n}=t,s=rW(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=qe(r),o=r.sessiondir||t.baseDir||nW(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2388
+ `)};if(s.mcp.length>0&&a(`MCP capability install is disabled in lmctl; ${s.mcp.length} declared server(s) NOT installed. Use nomcp for MCP server access.`),s.skills.length>0)if(eW.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=VU(er(ZU(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!gS.test(c)?c:(await _S(c,l,r.alias)).dir;iW(i,["skills","install",d,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(hS[i]!==void 0){let l=hS[i]();for(let c of s.skills)await _S(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var br,gS,QU,pS,eW,tW,Ma,hS,wS=E(()=>{"use strict";Qe();dS();at();Ps();br=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},gS=/^https?:\/\//i,QU=8e3,pS=1e6,eW=new Set(["opencode"]),tW=t=>JSON.stringify(t),Ma=()=>process.env.HOME??zU();hS={claude:()=>er(Ma(),".claude","skills"),qwen:()=>er(Ma(),".qwen","skills"),codex:()=>er(Ma(),".codex","skills"),copilot:()=>er(Ma(),".copilot","skills")}});var mf,ES=E(()=>{"use strict";mf=`---
2389
2389
 
2390
2390
  # Durable memory \u2014 how to use it
2391
2391
 
@@ -2411,7 +2411,7 @@ ${mf}`:mf;r.setMemberPromptSnapshot(m.id,_),u.push(h);let y=pa(qe(h),p.sessionid
2411
2411
  `);try{await yS({dal:r,member:h,stderr:e.stderr})}catch(T){f=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
2412
2412
  `)}}}return K(s,"--json")?le(e,u):e.stdout.write(`seeded ${u.length} member(s)
2413
2413
  `),f?1:0}function _W(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function hW(t,e,r){let n=Q(t,["--interpreter","--of"]);if(n.error!==void 0)return v(e,n.error);let[s]=n.positionals;if(s===void 0)return v(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return v(e,`team not found: ${s}`);let o=F(n,"--interpreter"),a=F(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return v(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return v(e,`member not found: ${o}`);for(let c of a){let d=r.findTeamMemberByAlias(i.id,c);if(d===null)return v(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
2414
- `),0}var lW,SS=E(()=>{"use strict";Be();Ic();aS();Qe();Er();wS();Co();Le();ES();lW=`usage: lmctl team create <name>
2414
+ `),0}var lW,SS=E(()=>{"use strict";Be();Nc();aS();Qe();Er();wS();Co();Le();ES();lW=`usage: lmctl team create <name>
2415
2415
  lmctl team list [--json]
2416
2416
  lmctl team show <name> [--json]
2417
2417
  lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
@@ -2423,20 +2423,20 @@ ${mf}`:mf;r.setMemberPromptSnapshot(m.id,_),u.push(h);let y=pa(qe(h),p.sessionid
2423
2423
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2424
2424
  refresh to create/update native provider sessions for team members.
2425
2425
  team refresh rejects Lead members (alias matching is case-insensitive).
2426
- `});var RS={};Ee(RS,{applyMaxBytes:()=>Ma,renderMessage:()=>xS,runTail:()=>TW});async function TW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${EW}
2426
+ `});var RS={};Ee(RS,{applyMaxBytes:()=>ja,renderMessage:()=>xS,runTail:()=>TW});async function TW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${EW}
2427
2427
  `),0;let r=Q(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return v(e,r.error);let n=F(r,"--lines"),s=F(r,"--max-bytes");if(n!==void 0&&s!==void 0)return v(e,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return v(e,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?yW:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return v(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=K(r,"--watch"),a=F(r,"--watch-interval"),l=a===void 0?wW:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return v(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return v(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=F(r,"--run");if(c!==void 0){if(r.positionals.length>0)return v(e,"--run is mutually exclusive with positional [target] [alias]");if(F(r,"--session")!==void 0)return v(e,"--run is mutually exclusive with --session");if(F(r,"--provider")!==void 0)return v(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return v(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await O(e,async p=>bW(e,p,m,i,o,l))}catch(p){return Pe(e,p)}}let d=wr(gW,{target:r.positionals[0],alias:r.positionals[1],flags:{session:F(r,"--session"),provider:F(r,"--provider")}});if(d.mode==="error")return v(e,d.message);if(d.mode==="managed")return v(e,"tail managed mode requires --run <id>");let u;if(d.mode==="ai-team")if(d.alias===void 0){let m;try{m=await O(e,g=>Te(d.teamfile,g))}catch(g){return v(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Fe(m)}catch(g){return v(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=Lt(p);if(h===void 0)return v(e,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await O(e,_=>$e(d.teamfile,h.alias,_));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof we?v(e,g.message):Pe(e,g)}}else try{let m=await O(e,p=>$e(d.teamfile,d.alias,p));u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof we?v(e,m.message):Pe(e,m)}else{let m=d.sessionid,p=d.provider;if(p===void 0){let h=await Nn(m);if(h.length===0)return v(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return v(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}u={provider:p,sessionId:m}}let f=await vS(e,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let _=await vS(e,u.provider,u.sessionId,i,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2428
2428
  `)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function vS(t,e,r,n,s){let i;try{i=await Ye(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
2429
2429
  `),-1}if(i===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
2430
2430
  `),-1;let o=i.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,o.length-n.lines):s+1;if(a>=o.length)return o.length-1;let l="";for(let c=a;c<o.length;c+=1)l+=`${xS(o[c])}
2431
- `;return t.stdout.write(n.kind==="bytes"?Ma(l,n.maxBytes):l),o.length-1}function xS(t){let e=AS(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
2431
+ `;return t.stdout.write(n.kind==="bytes"?ja(l,n.maxBytes):l),o.length-1}function xS(t){let e=AS(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
2432
2432
  `).replace(/\r/g,`
2433
2433
  `).split(`
2434
2434
  `),i=s[0]??"",o=s.slice(1);return o.length===0?`${r}: ${i}`:`${r}: ${i}
2435
2435
  ${o.map(a=>` ${a}`).join(`
2436
2436
  `)}`}async function bW(t,e,r,n,s,i){if(e.getRun(r)===null)return v(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(u=>`${NS(u)}
2437
- `).join("");t.stdout.write(n.kind==="bytes"?Ma(c,n.maxBytes):c);let d=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,d),g="";for(let _ of h)g+=`${NS(_)}
2438
- `,d=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?Ma(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2439
- `)}},i*1e3),p=()=>{clearInterval(m),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Ma(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(kS,"utf8");if(n>=e)return IS(t,e);let s=e-n,i=IS(t,s);return`${kS}${i}`}function IS(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 NS(t){let e=AS(new Date(t.timestamp_ms))??"",r="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function AS(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 gW,yW,wW,EW,kS,LS=E(()=>{"use strict";Er();Le();ht();Zt();Ot();gW={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},yW=4096,wW=2,EW=`usage: lmctl tail [target] [alias]
2437
+ `).join("");t.stdout.write(n.kind==="bytes"?ja(c,n.maxBytes):c);let d=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,d),g="";for(let _ of h)g+=`${NS(_)}
2438
+ `,d=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?ja(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2439
+ `)}},i*1e3),p=()=>{clearInterval(m),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function ja(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(kS,"utf8");if(n>=e)return IS(t,e);let s=e-n,i=IS(t,s);return`${kS}${i}`}function IS(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 NS(t){let e=AS(new Date(t.timestamp_ms))??"",r="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function AS(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 gW,yW,wW,EW,kS,LS=E(()=>{"use strict";Er();Le();ht();Zt();Ot();gW={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},yW=4096,wW=2,EW=`usage: lmctl tail [target] [alias]
2440
2440
  lmctl tail --session <id> [--provider <name>]
2441
2441
  lmctl tail --run <id>
2442
2442
  [--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
@@ -2486,14 +2486,14 @@ A bare <teamfile> with no alias tails that team's Lead member.
2486
2486
  small. Re-read after the next turn before concluding a compaction failed or gating on the value.
2487
2487
  `),y.length>0){t.stdout.write(`Session limits:
2488
2488
  `);for(let T of y)t.stdout.write(` ${T.reportPath}: LIMITED resets_at=${MS(T.sessionLimit)}
2489
- `)}return 0}function $S(t,e,r,n){let s=Te(t,e);if(r.has(s))return[];r.add(s);let i=Ue(s,e);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...$S(SW(OS(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function LW(t,e,r){let n=await CS(t,[{teamfile:e.teamfile,alias:e.alias}]),s=jS(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:r.lastInputTokens??null,liveness:n.get(hf(e.teamfile,e.alias))??gf(),...i!==null?{activitySinceLastCommit:{messageCount:DS(r,i.since),tokens:null},cumulativeTokens:PS(r)??"n/a"}:{}}}async function CS(t,e){try{let r=await O(t,n=>e.map(s=>{let i=Yt(n,s.teamfile,s.alias);return[hf(s.teamfile,s.alias),OW(i)]}));return new Map(r)}catch{return new Map}}function hf(t,e){return`${t}\0${e.toLowerCase()}`}function OW(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host}}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null}:gf()}function gf(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function _f(t){return t.state==="idle"?"idle":`busy (${t.reason})`}function MS(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function wt(t){return t==null?"unknown":String(t)}function $W(t){return t==="n/a"?t:wt(t)}function CW(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function jS(t){let e=OS(t),r;try{pf("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{r=pf("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let n=r.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:MW(e)}}function MW(t){let e;try{e=pf("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function DS(t,e){let r=e.getTime();return t.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function PS(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return e.length===0?null:e.reduce((r,n)=>r+n,0)}var vW,kW,US=E(()=>{"use strict";Er();Le();ht();Ot();Br();Ht();ef();vW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},kW=`usage: lmctl health [target] [alias]
2489
+ `)}return 0}function $S(t,e,r,n){let s=Te(t,e);if(r.has(s))return[];r.add(s);let i=Ue(s,e);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(...$S(SW(OS(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function LW(t,e,r){let n=await CS(t,[{teamfile:e.teamfile,alias:e.alias}]),s=jS(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:r.lastInputTokens??null,liveness:n.get(hf(e.teamfile,e.alias))??gf(),...i!==null?{activitySinceLastCommit:{messageCount:DS(r,i.since),tokens:null},cumulativeTokens:PS(r)??"n/a"}:{}}}async function CS(t,e){try{let r=await O(t,n=>e.map(s=>{let i=Yt(n,s.teamfile,s.alias);return[hf(s.teamfile,s.alias),OW(i)]}));return new Map(r)}catch{return new Map}}function hf(t,e){return`${t}\0${e.toLowerCase()}`}function OW(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host}}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null}:gf()}function gf(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function _f(t){return t.state==="idle"?"idle":`busy (${t.reason})`}function MS(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function wt(t){return t==null?"unknown":String(t)}function $W(t){return t==="n/a"?t:wt(t)}function CW(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function jS(t){let e=OS(t),r;try{pf("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{r=pf("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let n=r.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:MW(e)}}function MW(t){let e;try{e=pf("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function DS(t,e){let r=e.getTime();return t.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function PS(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return e.length===0?null:e.reduce((r,n)=>r+n,0)}var vW,kW,US=E(()=>{"use strict";Er();Le();ht();Ot();Br();Ht();tf();vW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},kW=`usage: lmctl health [target] [alias]
2490
2490
  lmctl health <teamfile> # team rollup
2491
2491
  lmctl health <sessionid> [--provider <name>]
2492
2492
  lmctl health --run <id> # run state, step rollup, and token totals
2493
2493
  [--json]
2494
2494
 
2495
2495
  Show provider session details, team rollups, or managed run state/token totals.`});var BS={};Ee(BS,{runLs:()=>FW});import{resolve as yf}from"node:path";function PW(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 FW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${jW}
2496
- `),0;let r=Q(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(e,r.error);if(r.positionals.length>0)return v(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=F(r,"--format"),s=K(r,"--json");if(K(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(F(r,_)!==void 0)return v(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(K(r,_))return v(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return v(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=F(r,"--limit"),h=DW;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return v(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>WS)return v(e,`--limit ${_} exceeds maximum (${WS})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await O(e,async _=>UW(e,_,h,g))}catch(_){return Pe(e,_)}}let o=WW(n,s);if("error"in o)return v(e,o.error);let a=o.format,l=F(r,"--provider"),c=F(r,"--sessiondir"),d=K(r,"--recursive"),u=K(r,"--all"),f;try{f=await yc(l?{provider:l}:{})}catch(p){return v(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=c!==void 0?yf(c):yf(process.cwd());f=f.filter(h=>{let g=yf(h.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=PW(f),a==="json")return le(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=u?"(all)":c??process.cwd(),h=d?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
2496
+ `),0;let r=Q(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(e,r.error);if(r.positionals.length>0)return v(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=F(r,"--format"),s=K(r,"--json");if(K(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(F(r,_)!==void 0)return v(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(K(r,_))return v(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return v(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=F(r,"--limit"),h=DW;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return v(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>WS)return v(e,`--limit ${_} exceeds maximum (${WS})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await O(e,async _=>UW(e,_,h,g))}catch(_){return Pe(e,_)}}let o=WW(n,s);if("error"in o)return v(e,o.error);let a=o.format,l=F(r,"--provider"),c=F(r,"--sessiondir"),d=K(r,"--recursive"),u=K(r,"--all"),f;try{f=await wc(l?{provider:l}:{})}catch(p){return v(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=c!==void 0?yf(c):yf(process.cwd());f=f.filter(h=>{let g=yf(h.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=PW(f),a==="json")return le(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=u?"(all)":c??process.cwd(),h=d?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
2497
2497
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
2498
2498
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
2499
2499
  `);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()}
@@ -2504,30 +2504,30 @@ Show provider session details, team rollups, or managed run state/token totals.`
2504
2504
  [--recursive] [--all] [--format table|teamfile|json] [--json]
2505
2505
  lmctl ls --runs [--limit N] [--format table|json] [--json]
2506
2506
 
2507
- List native provider sessions in scope, or list recent managed runs with --runs.`,DW=50,WS=500});import{existsSync as Hs,readFileSync as HS}from"node:fs";import{homedir as BW}from"node:os";import{dirname as JS,resolve as Pn}from"node:path";import{fileURLToPath as qW}from"node:url";function Tf(t,e={}){let r=[],n=XW(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=ZW(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Da??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${eB(o)}`)}return r}function XW(t){if(!t&&qs)return qs;let e=new Map,r,n=t??GW();if(!Hs(n))return r=`${n} not found`,t||wf(e),t||(qs=e),t||(Da=r),e;let s;try{s=HS(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,t||wf(e),t||(qs=e),t||(Da=r),e}for(let[i,o]of Object.entries(HW)){let a=YW(s,o),l=zW(a);l.length>0&&e.set(i,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&wf(e),t||(qs=e),t||(Da=r),e}function GW(){return KW(JS(qW(import.meta.url)))}function KW(t){let e=VW(t);if(e){let n=Pn(e,"durable-memory","model_selection.md");if(Hs(n))return n}let r=[Pn(t,"..","..","durable-memory","model_selection.md"),Pn(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(Hs(n))return n;return r[r.length-1]}function VW(t){let e=Pn(t);for(;;){if(Hs(Pn(e,"package.json")))return e;let r=JS(e);if(r===e)return null;e=r}}function wf(t){for(let[e,r]of Object.entries(JW))t.set(e,r)}function YW(t,e){let n=new RegExp(`^## ${tB(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function zW(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 i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function ZW(t){let e=t??Pn(BW(),".config","opencode","opencode.json");if(!Hs(e))return{available:!0,models:[]};let r;try{r=JSON.parse(HS(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:QW(r)}}function QW(t){if(!Ef(t))return[];let e=ja(t.provider)??ja(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Ef(s))continue;let i=ja(s.models)??ja(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function ja(t){return Ef(t)?t:null}function Ef(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function eB(t){return t.length>0?t.join(", "):"(none)"}function tB(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var HW,JW,qs,Da,XS=E(()=>{"use strict";HW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},JW={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.6-sol","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["Gemini 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},qs=null});import{homedir as rB}from"node:os";import{basename as nB}from"node:path";function Pa(t,e){let r=new Set;return{text:t.replace(iB,(s,i)=>{let o=i.trim(),a=sB[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function Fa(t){return{workdir:t.workdir,teamfile:t.teamfile,date:oB(t.date)}}function oB(t){return t.toISOString().slice(0,10)}var sB,iB,bf=E(()=>{"use strict";sB={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=nB(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>rB(),date:t=>t.date},iB=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Gs={};Ee(Gs,{GEMINI_PROVIDER_NOTICE:()=>YS,_setLintOpenCodeConfigProbeForTests:()=>_B,_setLintSessiondirFsOpsForTests:()=>pB,_setTeamfileSeedForTests:()=>mB,buildRootTeamRegistrationRow:()=>rv,registerRootTeam:()=>nv,runHire:()=>vB,runLint:()=>SB,runRefresh:()=>kB,runSeed:()=>ev,sha256Text:()=>tv});import{createHash as aB}from"node:crypto";import{accessSync as lB,constants as GS,existsSync as cB,readFileSync as Ba,realpathSync as kf,statSync as dB,writeFileSync as Wa}from"node:fs";import{dirname as Sr,resolve as VS}from"node:path";function mB(t){zS=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(It(),Ec)),n=await r(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function pB(t){Gr=t===null?If:{...If,...t}}function _B(t){ZS=t??Cl}async function hB(t,e,r){let n=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(n.map(async i=>({member:i,result:await ZS({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...r!==void 0?{env:r}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function gB(t,e){let r=Sr(e),n=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=VS(o);if(n.has(a))continue;let l=yB(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function yB(t){try{if(Gr.existsSync(t)){if(!Gr.statSync(t).isDirectory())return"ENOTDIR";Gr.accessSync(t,GS.W_OK);return}let e=TB(t);if(e===void 0)return;if(!Gr.statSync(e).isDirectory())return"ENOTDIR";Gr.accessSync(e,GS.W_OK);return}catch(e){return bB(e)??"permission check failed"}}function wB(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||QS(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function EB(t,e,r,n){let s=!1;for(let i of t){if(i.teamfile!==void 0||i.sessiondir===void 0||!QS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=sv(e[o],"sessiondir");a!==e[o]&&(e[o]=a,s=!0),i.sessiondir=void 0}return s}function QS(t,e){return KS(t)===KS(e)}function KS(t){let e=VS(t);try{return kf(e)}catch{return e}}function TB(t){let e=t;for(;;){try{if(Gr.existsSync(e))return e}catch{return}let r=Sr(e);if(r===e)return;e=r}}function bB(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 SB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(uB),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2508
- `),2;let r=t[0],n;try{n=await O(e,c=>Te(r,c))}catch(c){return Ce(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(n)}catch(c){return Ce(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=ou(s,Sr(n)),o=Tf(s.members),a=Ba(n,"utf8"),l=Pa(a,Fa({workdir:Sr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Rl(s.members,Sr(n))),o.push(...gB(s.members,n)),o.push(...wB(s.members,Sr(n))),o.push(...await hB(s.members,Sr(n),e.env));for(let c of i)e.stderr.write(`error: ${c.field}: ${c.message}
2507
+ List native provider sessions in scope, or list recent managed runs with --runs.`,DW=50,WS=500});import{existsSync as Hs,readFileSync as HS}from"node:fs";import{homedir as BW}from"node:os";import{dirname as JS,resolve as Pn}from"node:path";import{fileURLToPath as qW}from"node:url";function Tf(t,e={}){let r=[],n=XW(e.modelSelectionDocPath);for(let s of t){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=ZW(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Pa??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${eB(o)}`)}return r}function XW(t){if(!t&&qs)return qs;let e=new Map,r,n=t??GW();if(!Hs(n))return r=`${n} not found`,t||wf(e),t||(qs=e),t||(Pa=r),e;let s;try{s=HS(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,t||wf(e),t||(qs=e),t||(Pa=r),e}for(let[i,o]of Object.entries(HW)){let a=YW(s,o),l=zW(a);l.length>0&&e.set(i,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&wf(e),t||(qs=e),t||(Pa=r),e}function GW(){return KW(JS(qW(import.meta.url)))}function KW(t){let e=VW(t);if(e){let n=Pn(e,"durable-memory","model_selection.md");if(Hs(n))return n}let r=[Pn(t,"..","..","durable-memory","model_selection.md"),Pn(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(Hs(n))return n;return r[r.length-1]}function VW(t){let e=Pn(t);for(;;){if(Hs(Pn(e,"package.json")))return e;let r=JS(e);if(r===e)return null;e=r}}function wf(t){for(let[e,r]of Object.entries(JW))t.set(e,r)}function YW(t,e){let n=new RegExp(`^## ${tB(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function zW(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 i=s[1].trim();i&&i!=="Configured `model="&&e.add(i)}return[...e]}function ZW(t){let e=t??Pn(BW(),".config","opencode","opencode.json");if(!Hs(e))return{available:!0,models:[]};let r;try{r=JSON.parse(HS(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:QW(r)}}function QW(t){if(!Ef(t))return[];let e=Da(t.provider)??Da(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Ef(s))continue;let i=Da(s.models)??Da(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Da(t){return Ef(t)?t:null}function Ef(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function eB(t){return t.length>0?t.join(", "):"(none)"}function tB(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var HW,JW,qs,Pa,XS=E(()=>{"use strict";HW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},JW={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.6-sol","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["Gemini 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},qs=null});import{homedir as rB}from"node:os";import{basename as nB}from"node:path";function Fa(t,e){let r=new Set;return{text:t.replace(iB,(s,i)=>{let o=i.trim(),a=sB[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function Ua(t){return{workdir:t.workdir,teamfile:t.teamfile,date:oB(t.date)}}function oB(t){return t.toISOString().slice(0,10)}var sB,iB,bf=E(()=>{"use strict";sB={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=nB(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>rB(),date:t=>t.date},iB=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Gs={};Ee(Gs,{GEMINI_PROVIDER_NOTICE:()=>YS,_setLintOpenCodeConfigProbeForTests:()=>_B,_setLintSessiondirFsOpsForTests:()=>pB,_setTeamfileSeedForTests:()=>mB,buildRootTeamRegistrationRow:()=>rv,registerRootTeam:()=>nv,runHire:()=>vB,runLint:()=>SB,runRefresh:()=>kB,runSeed:()=>ev,sha256Text:()=>tv});import{createHash as aB}from"node:crypto";import{accessSync as lB,constants as GS,existsSync as cB,readFileSync as qa,realpathSync as kf,statSync as dB,writeFileSync as Ba}from"node:fs";import{dirname as Sr,resolve as VS}from"node:path";function mB(t){zS=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(It(),Tc)),n=await r(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function pB(t){Gr=t===null?If:{...If,...t}}function _B(t){ZS=t??Ml}async function hB(t,e,r){let n=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(n.map(async i=>({member:i,result:await ZS({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...r!==void 0?{env:r}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function gB(t,e){let r=Sr(e),n=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=VS(o);if(n.has(a))continue;let l=yB(a);l!==void 0&&(n.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function yB(t){try{if(Gr.existsSync(t)){if(!Gr.statSync(t).isDirectory())return"ENOTDIR";Gr.accessSync(t,GS.W_OK);return}let e=TB(t);if(e===void 0)return;if(!Gr.statSync(e).isDirectory())return"ENOTDIR";Gr.accessSync(e,GS.W_OK);return}catch(e){return bB(e)??"permission check failed"}}function wB(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||QS(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function EB(t,e,r,n){let s=!1;for(let i of t){if(i.teamfile!==void 0||i.sessiondir===void 0||!QS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=sv(e[o],"sessiondir");a!==e[o]&&(e[o]=a,s=!0),i.sessiondir=void 0}return s}function QS(t,e){return KS(t)===KS(e)}function KS(t){let e=VS(t);try{return kf(e)}catch{return e}}function TB(t){let e=t;for(;;){try{if(Gr.existsSync(e))return e}catch{return}let r=Sr(e);if(r===e)return;e=r}}function bB(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 SB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(uB),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2508
+ `),2;let r=t[0],n;try{n=await O(e,c=>Te(r,c))}catch(c){return Ce(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(n)}catch(c){return Ce(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=au(s,Sr(n)),o=Tf(s.members),a=qa(n,"utf8"),l=Fa(a,Ua({workdir:Sr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Ll(s.members,Sr(n))),o.push(...gB(s.members,n)),o.push(...wB(s.members,Sr(n))),o.push(...await hB(s.members,Sr(n),e.env));for(let c of i)e.stderr.write(`error: ${c.field}: ${c.message}
2509
2509
  `);for(let c of s.members)xf([c],e),c.session!==void 0&&c.session.length<Js&&o.push(`${c.alias}: sessionid is shorter than ${Js} chars; run lmctl seed to refresh it`);for(let c of o)e.stderr.write(`warning: ${c}
2510
2510
  `);return await O(e,c=>{LE(n,c,d=>e.stderr.write(`${d}
2511
2511
  `))}),i.length>0?1:(e.stdout.write(`ok
2512
2512
  `),0)}async function ev(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(fB),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2513
- `),2;let r=t[0],n;try{n=await O(e,_=>Te(r,_))}catch(_){return Ce(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=kf(n)}catch(_){return Ce(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let i=Sr(n),o;try{o=Fe(n)}catch(_){return Ce(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=Ba(n,"utf8").split(`
2514
- `),c=xB(l),d=EB(o.members,l,c,i),u=ou(o,i);if(u.length>0){xf(o.members,e);for(let _ of u)e.stderr.write(`error: ${_.field}: ${_.message}
2513
+ `),2;let r=t[0],n;try{n=await O(e,_=>Te(r,_))}catch(_){return Ce(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=kf(n)}catch(_){return Ce(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let i=Sr(n),o;try{o=Fe(n)}catch(_){return Ce(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=qa(n,"utf8").split(`
2514
+ `),c=xB(l),d=EB(o.members,l,c,i),u=au(o,i);if(u.length>0){xf(o.members,e);for(let _ of u)e.stderr.write(`error: ${_.field}: ${_.message}
2515
2515
  `);return 1}try{$n(e,o,n)}catch{}xf(o.members,e);for(let _ of Tf(o.members))e.stderr.write(`warning: ${_}
2516
- `);for(let _ of Rl(o.members,i))e.stderr.write(`warning: ${_}
2516
+ `);for(let _ of Ll(o.members,i))e.stderr.write(`warning: ${_}
2517
2517
  `);let f=0,m=o.members.filter(_=>_.teamfile!==void 0?!1:_.session===void 0||_.session.length<Js);for(let _ of m)if(!iv(_.provider))return e.stderr.write(`error: ${_.alias}: invalid provider "${_.provider}"
2518
2518
  `),1;for(let _ of o.members){if(_.teamfile!==void 0)continue;if(_.session!==void 0&&_.session.length>=Js){e.stderr.write(`warning: ${_.alias}: existing sessionid preserved; skipping
2519
2519
  `);continue}let y=_.sessiondir??i,T=await zS({provider:_.provider,cwd:y,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.alias.toLowerCase()==="lead"?{prompt:IB(n,l.join(`
2520
2520
  `),o.members)}:{}});for(let x of T.warnings??[])e.stderr.write(`warning: ${_.alias}: ${x}
2521
2521
  `);if(T.error!==void 0||T.sessionId===void 0||T.sessionId.length<Js){let x=`provider did not report a sessionid; no new session was found for ${y} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${_.alias}: seed failed${T.error!==void 0?`: ${T.error}`:`; ${x}`}
2522
2522
  `),1}let b=c.get(_.alias.toLowerCase());if(b===void 0)return e.stderr.write(`error: ${_.alias}: could not find matching _MEMBER_ line to update
2523
- `),1;let I=OB(l[b],"sessionid",T.sessionId);l[b]=I,f+=1,Wa(n,l.join(`
2523
+ `),1;let I=OB(l[b],"sessionid",T.sessionId);l[b]=I,f+=1,Ba(n,l.join(`
2524
2524
  `),"utf8"),e.stdout.write(`${_.alias}: seeded ${T.sessionId} provider=${_.provider} sessiondir=${y}
2525
2525
  `)}let p=l.join(`
2526
- `),h=CB(p,kf(n));(h!==p||d)&&Wa(n,h,"utf8"),f===0&&e.stdout.write(`no members needed seeding
2527
- `);let g=new Date().toISOString();return await O(e,_=>{nv(_,{teamfilePath:s,name:o.name,rawText:h,now:g})}),0}async function vB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Ua),0;let r=Q(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return vf(e,r.error,Ua);if(r.positionals.length!==2)return vf(e,"expected <teamfile.lmctl> and <alias>",Ua);let[n,s]=r.positionals;if(!LB(s))return Ce(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Ce(e,"hire only applies to non-Lead members");let i=F(r,"--provider");if(i===void 0)return vf(e,"missing value for --provider",Ua);if(!iv(i))return Ce(e,`invalid provider "${i}"`);let o;try{o=await O(e,u=>Te(n,u))}catch(u){return Ce(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=Ba(o,"utf8")}catch(u){return Ce(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(RB(a,s))return Ce(e,`${s}: alias already exists in ${o}`);let l=F(r,"--sessiondir"),c=[`_MEMBER_ alias=${Nf(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${Nf(l)}`]].join(" "),d=$B(a,c);return Wa(o,d,"utf8"),e.stdout.write(`Hired ${s} (${i}) -> ${o}
2526
+ `),h=CB(p,kf(n));(h!==p||d)&&Ba(n,h,"utf8"),f===0&&e.stdout.write(`no members needed seeding
2527
+ `);let g=new Date().toISOString();return await O(e,_=>{nv(_,{teamfilePath:s,name:o.name,rawText:h,now:g})}),0}async function vB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Wa),0;let r=Q(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return vf(e,r.error,Wa);if(r.positionals.length!==2)return vf(e,"expected <teamfile.lmctl> and <alias>",Wa);let[n,s]=r.positionals;if(!LB(s))return Ce(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Ce(e,"hire only applies to non-Lead members");let i=F(r,"--provider");if(i===void 0)return vf(e,"missing value for --provider",Wa);if(!iv(i))return Ce(e,`invalid provider "${i}"`);let o;try{o=await O(e,u=>Te(n,u))}catch(u){return Ce(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=qa(o,"utf8")}catch(u){return Ce(e,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(RB(a,s))return Ce(e,`${s}: alias already exists in ${o}`);let l=F(r,"--sessiondir"),c=[`_MEMBER_ alias=${Nf(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${Nf(l)}`]].join(" "),d=$B(a,c);return Ba(o,d,"utf8"),e.stdout.write(`Hired ${s} (${i}) -> ${o}
2528
2528
  `),e.stdout.write(`Run: lmctl seed ${o}
2529
- `),0}async function kB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Sf),0;let r,n;if(t.length===1){let u=Hr(t[0]);if(u===null)return e.stderr.write(Sf),2;r=u.teamfile,n=u.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Sf),2;let s;try{s=await O(e,u=>Te(r,u))}catch(u){return Ce(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=Ba(s,"utf8")}catch(u){return Ce(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2530
- `),a=AB(o,n);if(a===void 0)return Ce(e,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(Xs(l,"teamfile")!==void 0)return Ce(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[ts],d=Xs(l,"sessionid");return c!==void 0&&c.length>0&&d===c?Ce(e,`${n}: cannot refresh its own running session \u2014 run this refresh from a different member session or a plain operator shell.`):(o[a]=sv(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Wa(s,o.join(`
2529
+ `),0}async function kB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Sf),0;let r,n;if(t.length===1){let u=Hr(t[0]);if(u===null)return e.stderr.write(Sf),2;r=u.teamfile,n=u.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Sf),2;let s;try{s=await O(e,u=>Te(r,u))}catch(u){return Ce(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=qa(s,"utf8")}catch(u){return Ce(e,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2530
+ `),a=AB(o,n);if(a===void 0)return Ce(e,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(Xs(l,"teamfile")!==void 0)return Ce(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[ts],d=Xs(l,"sessionid");return c!==void 0&&c.length>0&&d===c?Ce(e,`${n}: cannot refresh its own running session \u2014 run this refresh from a different member session or a plain operator shell.`):(o[a]=sv(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Ba(s,o.join(`
2531
2531
  `),"utf8"),ev([s],e))}function tv(t){return aB("sha256").update(t).digest("hex")}function rv(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:tv(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function nv(t,e){let r=rv(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function IB(t,e,r){let n=r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=n.length>0?n.join(`
2532
2532
  `):"- (no non-Lead members)",i=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=NB(i,t);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${t}" <alias> "your task here"`,"- SAFE INPUT \u2014 use for ANYTHING non-trivial. A prompt typed into the command line is expanded by YOUR shell first,"," so backticks, $(...), $VAR and quotes are executed or stripped out of the message before lmctl sees it."," If the text contains backticks, quotes, $, newlines, or ANY relayed/pasted/quoted content, do NOT put it in the command.",` Write it to a file with your file-writing tool (NOT echo/heredoc \u2014 those are shell too), then: lmctl chat "${t}" <alias> --prompt-file <path>`,"- lmctl is foreground/background agnostic. Use your provider or host runtime for async command handling when it supports that.","- For delegation, run the lmctl chat command above. If your runtime has a tracked background mode, it may wrap that same blocking command, but check the result with --json or lmctl status.","- Busy receiver ENQUEUES. lmctl chat exits 0 for BOTH delivered and enqueued, so exit code alone CANNOT tell you a reply arrived.",'- lmctl chat ... --json is machine-readable: status="ok" is a delivered reply (with replyText); status="enqueued" (plus path="enqueued") means it was queued, and carries id/sender/receiver.',"- lmctl status shows your identity, members with busy/idle, mail queued TO and FROM you, and why a receiver is busy. Run it when you are unsure whether a delegation landed.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the lmctl chat command above. lmctl exposes no delegation tool you should use \u2014 delegate with lmctl chat.","","Team members:",s,"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${t}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${t}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own session \u2014 run it from a different member session or a plain operator shell.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, use lmctl chat.)","","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
2533
2533
  `)}function NB(t,e){let r=`lmctl chat "${e}" <alias> "your task here"`;switch(t.toLowerCase()){case"claude":return`- Claude tip: run the blocking command (${r}) as background Bash (run_in_background: true); the runtime re-invokes you with the reply when it completes.`;case"copilot":return`- Copilot tip: run the blocking command (${r}) via bash async mode (mode:"async"); the runtime notifies you with output when it completes.`;case"agy":return`- Antigravity tip: run the blocking command (${r}) via run_command with WaitMsBeforeAsync: 0 (Background Tasks); agy wakes you with the output when it completes.`;case"qwen":return`- Qwen tip: run the blocking command (${r}) via the monitor tool; it notifies you on completion.`;case"codex":return"- Codex note: run lmctl chat as the blocking delegation primitive; use Codex-native tool/background behavior when available.";case"gemini":return"- Gemini note: run lmctl chat as the blocking delegation primitive; use Gemini-native tool/background behavior when available.";case"opencode":return"- OpenCode note: use the provider-native background/task surface when available; otherwise run one blocking lmctl chat turn and wait.";default:return"- If your provider has native background completion, use it around the blocking command; otherwise run one blocking lmctl chat turn at a time."}}function xB(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=Xs(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function AB(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)&&Xs(s,"alias")?.toLowerCase()===r)return n}}function RB(t,e){for(let r of t.split(`
@@ -2548,7 +2548,7 @@ ${t}`:`${r}
2548
2548
  `),1}function vf(t,e,r){return t.stderr.write(`error: ${e}
2549
2549
  ${r}`),2}function xf(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
2550
2550
  `),r.provider==="gemini"&&e.stderr.write(`${YS.replace("%s",r.alias)}
2551
- `)}var Js,uB,fB,Ua,Sf,YS,If,zS,Gr,ZS,Ks=E(()=>{"use strict";Zt();XS();wi();at();Ml();Le();Ot();ht();Ot();bf();Ps();Js=5,uB=`usage: lmctl lint <teamfile.lmctl>
2551
+ `)}var Js,uB,fB,Wa,Sf,YS,If,zS,Gr,ZS,Ks=E(()=>{"use strict";Zt();XS();wi();at();jl();Le();Ot();ht();Ot();bf();Ps();Js=5,uB=`usage: lmctl lint <teamfile.lmctl>
2552
2552
 
2553
2553
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2554
2554
  For opencode members with model=, lint also asks the local ACP provider to
@@ -2557,7 +2557,7 @@ validate model= and effort= without sending a prompt.
2557
2557
 
2558
2558
  Seed missing or placeholder session ids in an lmctl teamfile by calling each
2559
2559
  member's configured native provider.
2560
- `,Ua=`usage: lmctl hire <teamfile.lmctl> <alias> --provider <name> [--sessiondir <dir>]
2560
+ `,Wa=`usage: lmctl hire <teamfile.lmctl> <alias> --provider <name> [--sessiondir <dir>]
2561
2561
 
2562
2562
  Append an unseeded non-Lead _MEMBER_ line to an lmctl teamfile. Run lmctl seed
2563
2563
  after editing to create the provider session.
@@ -2570,7 +2570,7 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
2570
2570
  re-seed.
2571
2571
  A member cannot refresh its own running session; run the refresh from a
2572
2572
  different member session or a plain operator shell.
2573
- `,YS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',If={existsSync:cB,statSync:dB,accessSync:lB},zS=async t=>{let{seed:e}=await Promise.resolve().then(()=>(It(),Ec)),r=await e(t);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},Gr=If,ZS=Cl});var dv={};Ee(dv,{runClone:()=>BB});import{existsSync as Af,mkdirSync as MB,readFileSync as jB,readdirSync as DB,statSync as lv,writeFileSync as PB}from"node:fs";import{basename as ov,dirname as FB,extname as UB,join as cv,resolve as av}from"node:path";async function BB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(WB),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
2573
+ `,YS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',If={existsSync:cB,statSync:dB,accessSync:lB},zS=async t=>{let{seed:e}=await Promise.resolve().then(()=>(It(),Tc)),r=await e(t);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},Gr=If,ZS=Ml});var dv={};Ee(dv,{runClone:()=>BB});import{existsSync as Af,mkdirSync as MB,readFileSync as jB,readdirSync as DB,statSync as lv,writeFileSync as PB}from"node:fs";import{basename as ov,dirname as FB,extname as UB,join as cv,resolve as av}from"node:path";async function BB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(WB),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
2574
2574
  `),2;let[r,n]=t,s,i=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=av(r);if(!Af(c))throw new Error(`source not found: ${r}`);let u=lv(c).isDirectory()?qB(c):c;s=jB(u,"utf8"),i=u}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2575
2575
  `),1}let o=av(n),a=HB(o,i,n);if(Af(a))return e.stderr.write(`error: ${a} already exists.
2576
2576
  `),1;let l=XB(JB(s));return MB(FB(a),{recursive:!0}),PB(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
@@ -2595,7 +2595,7 @@ Examples:
2595
2595
  `),e.stderr.write(`usage: lmctl plan [options] <directory>
2596
2596
  `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
2597
2597
  `),2;let n=zB(r.positionals[0]);KB(n,{recursive:!0});let s=F(r,"--team")??fv(n),i=F(r,"--provider")??"claude",o=YB(n,eq(s));if(GB(o))return e.stderr.write(`error: ${o} already exists.
2598
- `),1;let a=rq({teamName:tq(s),leadProvider:i}),l=Pa(a,Fa({workdir:n,teamfile:o,date:new Date}));return VB(o,l.text,"utf8"),e.stdout.write(`Created ${o}
2598
+ `),1;let a=rq({teamName:tq(s),leadProvider:i}),l=Fa(a,Ua({workdir:n,teamfile:o,date:new Date}));return VB(o,l.text,"utf8"),e.stdout.write(`Created ${o}
2599
2599
  `),e.stdout.write(`Edit ${o}; only _MEMBER_ lines are parsed, everything else is free-form.
2600
2600
  `),e.stdout.write(`After editing, run: lmctl lint ${o}
2601
2601
  `),e.stdout.write(`Then run: lmctl seed ${o}
@@ -2626,7 +2626,7 @@ Examples:
2626
2626
 
2627
2627
  # Same shape, codex for the Lead and Reviewer2
2628
2628
  lmctl plan ./backend --provider codex
2629
- `});import{execFileSync as nq}from"node:child_process";import{resolve as hv}from"node:path";function sq(t){return t.filter(e=>e.state!=="retired")}function gv(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?v(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=nq("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return v(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=hv(s),o=e.listProjects().find(a=>hv(a.local_path)===i);return o===void 0?v(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function yv(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?v(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?v(t,`project ${r.name} has no assigned team; use --team <name>`):s}function wv(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?v(t,`member not found: ${n}`):i}let s=sq(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?v(t,`team ${r.name} has no active agent member`):s}var Ev=E(()=>{"use strict";Le()});var Sv={};Ee(Sv,{SIZE_WARN_EST_TOKENS:()=>Vs,estimateTokens:()=>bv,runTerminal:()=>lq});import{spawn as iq}from"node:child_process";import{statSync as oq}from"node:fs";async function lq(t,e){if(t.includes("--help")||t.includes("-h"))return _q(e);let r=Q(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return v(e,r.error);let n=F(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return v(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return v(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?K(r,o):F(r,o)!==void 0)return v(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=F(r,"--alias"),l=vw(o,s,a);return"err"in l?v(e,l.err):Rf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return Pe(e,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?K(r,l):F(r,l)!==void 0)return v(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return v(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=wr(aq,{target:i,alias:o,flags:{}});return a.mode==="error"?v(e,a.message):a.mode!=="ai-team"?v(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?v(e,"terminal: alias required for the teamfile target"):await O(e,l=>cq(e,a.teamfile,a.alias,l))}try{return await O(e,async s=>{let i=fq(e,s,r);if(typeof i=="number")return i;let o=F(r,"--alias");return K(r,"--size")?pq(e,s,i,o,K(r,"--json")):mq(e,s,i,o)})}catch(s){return Pe(e,s)}}async function cq(t,e,r,n){let s;try{s=$e(e,r,n)}catch(d){return d instanceof we?v(t,d.message):Pe(t,d)}let i=gr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:yr()});if(!i.acquired)return v(t,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=kb({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=dq(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Ib()),a.unref?.();try{$n(t,Fe(s.teamfile),s.teamfile)}catch{}return c=await Rf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,...s.model!==void 0?{model:s.model}:{},isLead:s.isLead}),c}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),uq(n,l,c)}}function dq(t,e){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function uq(t,e,r){if(e!==null)try{t.finishTrackedInvocation(e,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`})}catch{}}async function Rf(t,e){let{provider:r,sessionid:n,sessiondir:s,model:i}=e;if(!ma(r))return v(t,`no resume incantation for provider "${r}"`);if(!ME.test(n))return v(t,"refusing to resume: malformed sessionid");let o=du(r,n,{isLead:e.isLead,model:i,onModelIgnored:c=>{let d=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;t.stderr.write(`${d}
2629
+ `});import{execFileSync as nq}from"node:child_process";import{resolve as hv}from"node:path";function sq(t){return t.filter(e=>e.state!=="retired")}function gv(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?v(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=nq("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return v(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=hv(s),o=e.listProjects().find(a=>hv(a.local_path)===i);return o===void 0?v(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function yv(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?v(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?v(t,`project ${r.name} has no assigned team; use --team <name>`):s}function wv(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?v(t,`member not found: ${n}`):i}let s=sq(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?v(t,`team ${r.name} has no active agent member`):s}var Ev=E(()=>{"use strict";Le()});var Sv={};Ee(Sv,{SIZE_WARN_EST_TOKENS:()=>Vs,estimateTokens:()=>bv,runTerminal:()=>lq});import{spawn as iq}from"node:child_process";import{statSync as oq}from"node:fs";async function lq(t,e){if(t.includes("--help")||t.includes("-h"))return _q(e);let r=Q(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return v(e,r.error);let n=F(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return v(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return v(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?K(r,o):F(r,o)!==void 0)return v(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=F(r,"--alias"),l=vw(o,s,a);return"err"in l?v(e,l.err):Rf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return Pe(e,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?K(r,l):F(r,l)!==void 0)return v(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return v(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=wr(aq,{target:i,alias:o,flags:{}});return a.mode==="error"?v(e,a.message):a.mode!=="ai-team"?v(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?v(e,"terminal: alias required for the teamfile target"):await O(e,l=>cq(e,a.teamfile,a.alias,l))}try{return await O(e,async s=>{let i=fq(e,s,r);if(typeof i=="number")return i;let o=F(r,"--alias");return K(r,"--size")?pq(e,s,i,o,K(r,"--json")):mq(e,s,i,o)})}catch(s){return Pe(e,s)}}async function cq(t,e,r,n){let s;try{s=$e(e,r,n)}catch(d){return d instanceof we?v(t,d.message):Pe(t,d)}let i=gr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:yr()});if(!i.acquired)return v(t,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=kb({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=dq(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Ib()),a.unref?.();try{$n(t,Fe(s.teamfile),s.teamfile)}catch{}return c=await Rf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,...s.model!==void 0?{model:s.model}:{},isLead:s.isLead}),c}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),uq(n,l,c)}}function dq(t,e){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function uq(t,e,r){if(e!==null)try{t.finishTrackedInvocation(e,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`})}catch{}}async function Rf(t,e){let{provider:r,sessionid:n,sessiondir:s,model:i}=e;if(!ma(r))return v(t,`no resume incantation for provider "${r}"`);if(!ME.test(n))return v(t,"refusing to resume: malformed sessionid");let o=uu(r,n,{isLead:e.isLead,model:i,onModelIgnored:c=>{let d=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;t.stderr.write(`${d}
2630
2630
  `),Ae({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return v(t,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(c=>{let d=iq(a,l,{stdio:"inherit",cwd:s,env:je(process.env,s,n,"terminal")});d.on("error",u=>{c(v(t,`failed to launch ${a}: ${u.message}`))}),d.on("exit",u=>c(u??0))})}function fq(t,e,r){let n=F(r,"--team");if(n!==void 0){let o=e.findTeamByName(n);return o===null?v(t,`team not found: ${n}`):o}let s=gv(t,e,F(r,"--project"));return typeof s=="number"?s:yv(t,e,s,void 0)}async function mq(t,e,r,n){let s=wv(t,e,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?v(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Rf(t,{provider:qe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function bv(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=oq(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 pq(t,e,r,n,s){let i;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return v(t,`member not found: ${n}`);i=[a]}else i=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let c=qe(a),d=a.model??null,u=null;ma(c)&&(u=await Ye(l,c));let f=bv(u),m=f.est>Vs;o.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:d,resume_incantation:m?pa(c,l,d!==null?{model:d}:{}):null})}if(s)return le(t,{estimate:!0,legend:Tv,guide_tokens:Vs,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2631
2631
  `),t.stdout.write(`${Tv}
2632
2632
  `);for(let a of o){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
@@ -2666,24 +2666,24 @@ Examples:
2666
2666
  tokens it surfaces the resume incantation so YOU can
2667
2667
  open & self-compact. Nothing is ever changed
2668
2668
  automatically; ${Vs} is a guide, not a gate.
2669
- `),0}var aq,Vs,Tv,vv=E(()=>{"use strict";Qe();Er();Le();Ev();ht();Zt();at();Ps();Br();la();Gu();Zo();ue();aq={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Vs=2e5,Tv="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function Lf(t,e){let r=hq[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 hq,kv=E(()=>{"use strict";hq={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var Ov={};Ee(Ov,{initWorkspace:()=>Rv,runWorkspace:()=>Sq,setWorkspaceProvider:()=>Lv});import{copyFileSync as gq,cpSync as yq,existsSync as We,mkdirSync as vr,readdirSync as $f,renameSync as wq,rmSync as qa,statSync as Ha,writeFileSync as Eq}from"node:fs";import{spawnSync as Tq}from"node:child_process";import{homedir as Iv}from"node:os";import{dirname as Cf,join as Ys}from"node:path";async function Sq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(bq),0;switch(r){case"list":return vq(n,e);case"create":return kq(n,e);case"use":return Iq(n,e);case"show":return Nq(n,e);case"delete":return xq(n,e);case"migrate":return Aq(n,e);case"init":return Rv(n,e);case"set-provider":return Lv(n,e);default:return v(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function xv(){let t=ei(),e=[],r=new Set,n=Nr.default,s=We(Zs()),i=We(Dt(n));if((s||i||t===null||t===n)&&(e.push({name:n,db_path:i?kr(n):Zs(),active:t===null||t===n,legacy:!i&&s}),r.add(n)),We(Vr())){let o;try{o=$f(Vr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!Ze(a))continue;let l=!1;try{l=Ha(Dt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:kr(a),active:t===a,legacy:!1}),r.add(a))}}return e}function vq(t,e){let r=Q(t,[]);if(r.error!==void 0)return v(e,r.error);if(r.positionals.length!==0)return v(e,"usage: lmctl workspace list");let n=xv();if(K(r,"--json"))return le(e,n),0;for(let s of n){let i=s.active?"*":" ",o=s.legacy?" (legacy)":"";e.stdout.write(`${i} ${s.name} ${s.db_path}${o}
2670
- `)}return 0}function kq(t,e){let r=Q(t,["--docroot"]);if(r.error!==void 0)return v(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ze(n))return v(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Dt(n);if(We(s))return v(e,`workspace already exists: ${n} (${s})`);let i=F(r,"--docroot")??za(n);vr(s,{recursive:!0}),vr(i,{recursive:!0});let o=kr(n);vr(Cf(o),{recursive:!0});let a=ke({path:o});try{a.setConfig("project.docroot",i)}finally{a.close()}let l={name:n,dir:s,db_path:o,docroot:i};return K(r,"--json")?le(e,l):e.stdout.write(`created workspace ${n} at ${s}
2669
+ `),0}var aq,Vs,Tv,vv=E(()=>{"use strict";Qe();Er();Le();Ev();ht();Zt();at();Ps();Br();la();Ku();Zo();de();aq={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Vs=2e5,Tv="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function Lf(t,e){let r=hq[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 hq,kv=E(()=>{"use strict";hq={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var Ov={};Ee(Ov,{initWorkspace:()=>Rv,runWorkspace:()=>Sq,setWorkspaceProvider:()=>Lv});import{copyFileSync as gq,cpSync as yq,existsSync as We,mkdirSync as vr,readdirSync as $f,renameSync as wq,rmSync as Ha,statSync as Ja,writeFileSync as Eq}from"node:fs";import{spawnSync as Tq}from"node:child_process";import{homedir as Iv}from"node:os";import{dirname as Cf,join as Ys}from"node:path";async function Sq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(bq),0;switch(r){case"list":return vq(n,e);case"create":return kq(n,e);case"use":return Iq(n,e);case"show":return Nq(n,e);case"delete":return xq(n,e);case"migrate":return Aq(n,e);case"init":return Rv(n,e);case"set-provider":return Lv(n,e);default:return v(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function xv(){let t=ei(),e=[],r=new Set,n=Nr.default,s=We(Zs()),i=We(Dt(n));if((s||i||t===null||t===n)&&(e.push({name:n,db_path:i?kr(n):Zs(),active:t===null||t===n,legacy:!i&&s}),r.add(n)),We(Vr())){let o;try{o=$f(Vr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!Ze(a))continue;let l=!1;try{l=Ja(Dt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:kr(a),active:t===a,legacy:!1}),r.add(a))}}return e}function vq(t,e){let r=Q(t,[]);if(r.error!==void 0)return v(e,r.error);if(r.positionals.length!==0)return v(e,"usage: lmctl workspace list");let n=xv();if(K(r,"--json"))return le(e,n),0;for(let s of n){let i=s.active?"*":" ",o=s.legacy?" (legacy)":"";e.stdout.write(`${i} ${s.name} ${s.db_path}${o}
2670
+ `)}return 0}function kq(t,e){let r=Q(t,["--docroot"]);if(r.error!==void 0)return v(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ze(n))return v(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Dt(n);if(We(s))return v(e,`workspace already exists: ${n} (${s})`);let i=F(r,"--docroot")??Za(n);vr(s,{recursive:!0}),vr(i,{recursive:!0});let o=kr(n);vr(Cf(o),{recursive:!0});let a=ke({path:o});try{a.setConfig("project.docroot",i)}finally{a.close()}let l={name:n,dir:s,db_path:o,docroot:i};return K(r,"--json")?le(e,l):e.stdout.write(`created workspace ${n} at ${s}
2671
2671
  `),0}function Iq(t,e){let r=Q(t,[]);if(r.error!==void 0)return v(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(e,"usage: lmctl workspace use <name>");if(!Ze(n))return v(e,`invalid workspace name: ${n}`);if(n!==Nr.default&&!We(Dt(n)))return v(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Qs();return vr(Cf(s),{recursive:!0}),Eq(s,`${n}
2672
2672
  `),K(r,"--json")?le(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2673
- `),0}function Nq(t,e){let r=Q(t,[]);if(r.error!==void 0)return v(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(e,"usage: lmctl workspace show <name>");if(!Ze(n))return v(e,`invalid workspace name: ${n}`);let s=xv().find(d=>d.name===n);if(s===void 0)return v(e,`workspace not found: ${n}`);let i=0;try{i=We(s.db_path)?Ha(s.db_path).size:0}catch{i=0}let o=0,a=null,l={};if(We(s.db_path)){let d=ke({path:s.db_path});try{o=d.listProjects().length,l=d.getConfigAll(),a=l["project.docroot"]??null}finally{d.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:i,docroot:a,project_count:o,config_keys:Object.keys(l).sort()};return K(r,"--json")?le(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2674
- `),0}function xq(t,e){let r=Q(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return v(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ze(n))return v(e,`invalid workspace name: ${n}`);if(!K(r,"--confirm"))return v(e,`refusing to delete workspace ${n} without --confirm`);if(n===Nr.default&&!K(r,"--force"))return v(e,"refusing to delete the default workspace without --force");if(ei()===n&&!K(r,"--force"))return v(e,`refusing to delete the active workspace (${n}) without --force`);let i=Dt(n);return We(i)?(qa(i,{recursive:!0,force:!0}),K(r,"--json")?le(e,{deleted:n,dir:i}):e.stdout.write(`deleted workspace ${n}
2673
+ `),0}function Nq(t,e){let r=Q(t,[]);if(r.error!==void 0)return v(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(e,"usage: lmctl workspace show <name>");if(!Ze(n))return v(e,`invalid workspace name: ${n}`);let s=xv().find(d=>d.name===n);if(s===void 0)return v(e,`workspace not found: ${n}`);let i=0;try{i=We(s.db_path)?Ja(s.db_path).size:0}catch{i=0}let o=0,a=null,l={};if(We(s.db_path)){let d=ke({path:s.db_path});try{o=d.listProjects().length,l=d.getConfigAll(),a=l["project.docroot"]??null}finally{d.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:i,docroot:a,project_count:o,config_keys:Object.keys(l).sort()};return K(r,"--json")?le(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2674
+ `),0}function xq(t,e){let r=Q(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return v(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ze(n))return v(e,`invalid workspace name: ${n}`);if(!K(r,"--confirm"))return v(e,`refusing to delete workspace ${n} without --confirm`);if(n===Nr.default&&!K(r,"--force"))return v(e,"refusing to delete the default workspace without --force");if(ei()===n&&!K(r,"--force"))return v(e,`refusing to delete the active workspace (${n}) without --force`);let i=Dt(n);return We(i)?(Ha(i,{recursive:!0,force:!0}),K(r,"--json")?le(e,{deleted:n,dir:i}):e.stdout.write(`deleted workspace ${n}
2675
2675
  `),0):v(e,`workspace not found: ${n}`)}function Of(t,e,r){try{wq(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
2676
- `),Ha(t).isDirectory()?yq(t,e,{recursive:!0}):gq(t,e),!We(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);qa(t,{recursive:!0,force:!0})}function Aq(t,e){let r=Q(t,[],["--json"]);if(r.error!==void 0)return v(e,r.error);let n=K(r,"--json"),s=Za(),i=Vr(),o=[],a=(f,m)=>{if(n)le(e,{migrated:f,reason:m??null,actions:o});else{for(let p of o)e.stdout.write(`${p}
2676
+ `),Ja(t).isDirectory()?yq(t,e,{recursive:!0}):gq(t,e),!We(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);Ha(t,{recursive:!0,force:!0})}function Aq(t,e){let r=Q(t,[],["--json"]);if(r.error!==void 0)return v(e,r.error);let n=K(r,"--json"),s=Qa(),i=Vr(),o=[],a=(f,m)=>{if(n)le(e,{migrated:f,reason:m??null,actions:o});else{for(let p of o)e.stdout.write(`${p}
2677
2677
  `);e.stdout.write(f?`migration complete
2678
2678
  `:`${m??"nothing to migrate"}
2679
- `)}return 0};if(!We(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=$f(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ha(Ys(s,f)).isDirectory()}catch{return!1}});if(c.length===0)qa(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!We(i))Of(s,i,e),o.push(`renamed ${s} -> ${i}`);else{let f=c.filter(m=>We(Ys(i,m)));if(f.length>0)return v(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);vr(i,{recursive:!0});for(let m of c)Of(Ys(s,m),Ys(i,m),e),o.push(`moved ${m} -> workspaces/${m}`);try{$f(s).length===0&&(qa(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=Qf(),u=Qs();return We(d)&&(We(u)?o.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Of(d,u,e),o.push("renamed active-profile -> active-workspace"))),a(!0)}function Av(t,e){return Tq(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function Oq(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 Nv(t){return t==="~"?Iv():t.startsWith("~/")?Ys(Iv(),t.slice(2)):t}async function Rv(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: ${Fn.join(", ")}.`].join(`
2679
+ `)}return 0};if(!We(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=$f(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ja(Ys(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Ha(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!We(i))Of(s,i,e),o.push(`renamed ${s} -> ${i}`);else{let f=c.filter(m=>We(Ys(i,m)));if(f.length>0)return v(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);vr(i,{recursive:!0});for(let m of c)Of(Ys(s,m),Ys(i,m),e),o.push(`moved ${m} -> workspaces/${m}`);try{$f(s).length===0&&(Ha(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=Qf(),u=Qs();return We(d)&&(We(u)?o.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Of(d,u,e),o.push("renamed active-profile -> active-workspace"))),a(!0)}function Av(t,e){return Tq(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function Oq(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 Nv(t){return t==="~"?Iv():t.startsWith("~/")?Ys(Iv(),t.slice(2)):t}async function Rv(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: ${Fn.join(", ")}.`].join(`
2680
2680
  `)+`
2681
2681
  `),0;let s=Q(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return v(e,s.error);if(s.positionals.length!==0)return v(e,n);let i=r.spawn??Av,a=Fn.map(x=>Lf(x,i)).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 ${Fn.join("|")} first
2682
2682
  `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??Oq,d=r.promptLine!==void 0||l,u=x=>(e.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2683
2683
  `),2),f,m=F(s,"--name");if(m!==void 0){if(!Ze(m))return e.stderr.write(`error: invalid workspace name: ${m}
2684
2684
  `),2;f=m}else{if(!d)return u("--name");for(;;){let x=(await c("Workspace name [default]: ")).trim(),H=x.length===0?"default":x;if(Ze(H)){f=H;break}e.stderr.write(`invalid workspace name: ${H} (letters/digits/.-_, start alnum, \u226464)
2685
2685
  `)}}let p=Dt(f);if(We(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2686
- `),2;let h,g=F(s,"--basedir"),_=za(f);if(g!==void 0)h=Nv(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=x.length===0?_:Nv(x)}let y={};for(let x of["provider1","provider2","provider3"]){let H=F(s,`--${x}`),pe=Rq[x],U=a.includes(pe)?pe:a[0];if(H!==void 0){if(!a.includes(H))return e.stderr.write(`error: --${x} ${H} is not an available provider (available: ${a.join(", ")})
2686
+ `),2;let h,g=F(s,"--basedir"),_=Za(f);if(g!==void 0)h=Nv(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=x.length===0?_:Nv(x)}let y={};for(let x of["provider1","provider2","provider3"]){let H=F(s,`--${x}`),pe=Rq[x],U=a.includes(pe)?pe:a[0];if(H!==void 0){if(!a.includes(H))return e.stderr.write(`error: --${x} ${H} is not an available provider (available: ${a.join(", ")})
2687
2687
  `),2;y[x]=H;continue}if(!d)return u(`--${x}`);for(;;){let j=(await c(`${x} (${Lq[x]}) [${U}]: `)).trim(),A=j.length===0?U:j;if(a.includes(A)){y[x]=A;break}e.stderr.write(`not an available provider: ${A} (available: ${a.join(", ")})
2688
2688
  `)}}vr(p,{recursive:!0}),vr(h,{recursive:!0});let T=kr(f);vr(Cf(T),{recursive:!0});let b=ke({path:T});try{b.setConfig("project.docroot",h),b.setConfig("workspace.provider1",y.provider1),b.setConfig("workspace.provider2",y.provider2),b.setConfig("workspace.provider3",y.provider3)}finally{b.close()}let I={name:f,dir:p,db_path:T,basedir:h,providers:{...y}};return K(s,"--json")?le(e,I):(e.stdout.write(`created workspace ${f} at ${p}
2689
2689
  `),e.stdout.write(` basedir: ${h}
@@ -2746,8 +2746,8 @@ delete requires --confirm; deleting default or active workspaces also requires -
2746
2746
  `),e.stderr.write(`${Pf()}
2747
2747
  `),2;let n=r[0];try{return await O(e,s=>(e.stdout.write(Vv(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2748
2748
  `),1}}function Pf(){return["usage: lmctl diagnose-prompt <prompt_id>","",'Narrow read-only diagnostic for the WT-6 "prompt-pending-forever"',"symptom. Renders prompt + dispatch + run + project + workflows + team","state, then picks the top 1-3 likely root causes (daemon interval,","missing workflows, missing team aliases, etc).","","options:"," -h, --help show this help and exit"].join(`
2749
- `)}var Kv,Ff,Uf,ek=E(()=>{"use strict";fu();Le();Kv=["Coder","Reviewer1","Polisher"],Ff=3e4,Uf=new Set(["attention_needed","paused","escalation"])});var Sk={};Ee(Sk,{appendIntent:()=>pk,resolveIntentLogPath:()=>mk,runStatus:()=>cH});import{appendFileSync as Qq,mkdirSync as eH}from"node:fs";import{homedir as tH,hostname as tk}from"node:os";import{basename as rH,dirname as fk,isAbsolute as nH,join as sH,resolve as iH}from"node:path";function mk(){return process.env.LMCTL_INTENT_LOG??sH(tH(),".lmctl","recent-intents.log")}function pk(t){try{let e=mk();eH(fk(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});Qq(e,`${r}
2750
- `)}catch{}}async function cH(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(oH),0;let r=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return v(e,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Q(t,["--since"],["--json"]);if(n.error!==void 0)return v(e,n.error);if(n.positionals.length>0)return v(e,`unknown argument: ${n.positionals[0]}`);let s=K(n,"--json"),i=UH(F(n,"--since"));if("error"in i)return v(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>ok(l,o));le(e,a)}else{let a=await O(e,async l=>IH(await ok(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return pk({verb:"status",args:t}),0}catch(o){return v(e,o instanceof Error?o.message:String(o))}}async function ok(t,e){let r=Ku(e,t);if(!r.ok){if(r.reason==="not-found")throw new Error(Fs("status"));return await uH(t)}return await dH(t,r.identity)}async function dH(t,e){let r=Xr(e),n=t.getRootTeam(r.teamfile);if(n===null)throw new Error(Fs("status"));let s=Ue(n.teamfile_path,t),i=Bf(Xa(t,{from:r.value})),o=Bf(Xa(t,{target_teamfile:r.teamfile,target_alias:r.alias})),a=_H([...Wf(t,{from:r.value}),...Wf(t,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,..._k(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(l=>mH(t,n.teamfile_path,l)),activity:{from_me:i.map(l=>qf(l,t)),to_me:o.map(l=>qf(l,t))},transcript_harvest:await gk(a),mailbox:{outbound:Ga(hH(t,r.teamfile,r.alias),"outbound"),inbound_pending:Ga(gH(t,r.teamfile,r.alias),"inbound")},waiting_on:yH(t,r.teamfile,r.alias).map(l=>hk(l,t))}}function _k(){return{workspace:Pt(),db_path:Z()}}async function uH(t){let e=t.listRootTeams();return{scope:"workspace",identity:null,..._k(),teams:e.map(r=>fH(t,r)),activity:Bf(Xa(t)).map(r=>qf(r,t)),transcript_harvest:await gk(Wf(t)),mailbox:{pending_outbound:Ga(ak(t,"sender"),"outbound"),pending_inbound:Ga(ak(t,"receiver"),"inbound")},waiting_on:wH(t).map(r=>hk(r,t))}}function fH(t,e){let r=0;try{r=Ue(e.teamfile_path,t).members.length}catch{r=0}return{name:e.name,teamfile:e.teamfile_path,member_count:r,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function mH(t,e,r){let n=r.teamfile===void 0?null:Te(nH(r.teamfile)?r.teamfile:iH(fk(e),r.teamfile),t),s=Yt(t,e,r.alias),i=s.busy&&s.reason==="in-flight"?pH(t,e,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:e,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function pH(t,e,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=t.db.prepare(`
2749
+ `)}var Kv,Ff,Uf,ek=E(()=>{"use strict";mu();Le();Kv=["Coder","Reviewer1","Polisher"],Ff=3e4,Uf=new Set(["attention_needed","paused","escalation"])});var Sk={};Ee(Sk,{appendIntent:()=>pk,resolveIntentLogPath:()=>mk,runStatus:()=>cH});import{appendFileSync as Qq,mkdirSync as eH}from"node:fs";import{homedir as tH,hostname as tk}from"node:os";import{basename as rH,dirname as fk,isAbsolute as nH,join as sH,resolve as iH}from"node:path";function mk(){return process.env.LMCTL_INTENT_LOG??sH(tH(),".lmctl","recent-intents.log")}function pk(t){try{let e=mk();eH(fk(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});Qq(e,`${r}
2750
+ `)}catch{}}async function cH(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(oH),0;let r=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return v(e,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Q(t,["--since"],["--json"]);if(n.error!==void 0)return v(e,n.error);if(n.positionals.length>0)return v(e,`unknown argument: ${n.positionals[0]}`);let s=K(n,"--json"),i=UH(F(n,"--since"));if("error"in i)return v(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>ok(l,o));le(e,a)}else{let a=await O(e,async l=>IH(await ok(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return pk({verb:"status",args:t}),0}catch(o){return v(e,o instanceof Error?o.message:String(o))}}async function ok(t,e){let r=Vu(e,t);if(!r.ok){if(r.reason==="not-found")throw new Error(Fs("status"));return await uH(t)}return await dH(t,r.identity)}async function dH(t,e){let r=Xr(e),n=t.getRootTeam(r.teamfile);if(n===null)throw new Error(Fs("status"));let s=Ue(n.teamfile_path,t),i=Bf(Ga(t,{from:r.value})),o=Bf(Ga(t,{target_teamfile:r.teamfile,target_alias:r.alias})),a=_H([...Wf(t,{from:r.value}),...Wf(t,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,..._k(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(l=>mH(t,n.teamfile_path,l)),activity:{from_me:i.map(l=>qf(l,t)),to_me:o.map(l=>qf(l,t))},transcript_harvest:await gk(a),mailbox:{outbound:Ka(hH(t,r.teamfile,r.alias),"outbound"),inbound_pending:Ka(gH(t,r.teamfile,r.alias),"inbound")},waiting_on:yH(t,r.teamfile,r.alias).map(l=>hk(l,t))}}function _k(){return{workspace:Pt(),db_path:Z()}}async function uH(t){let e=t.listRootTeams();return{scope:"workspace",identity:null,..._k(),teams:e.map(r=>fH(t,r)),activity:Bf(Ga(t)).map(r=>qf(r,t)),transcript_harvest:await gk(Wf(t)),mailbox:{pending_outbound:Ka(ak(t,"sender"),"outbound"),pending_inbound:Ka(ak(t,"receiver"),"inbound")},waiting_on:wH(t).map(r=>hk(r,t))}}function fH(t,e){let r=0;try{r=Ue(e.teamfile_path,t).members.length}catch{r=0}return{name:e.name,teamfile:e.teamfile_path,member_count:r,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function mH(t,e,r){let n=r.teamfile===void 0?null:Te(nH(r.teamfile)?r.teamfile:iH(fk(e),r.teamfile),t),s=Yt(t,e,r.alias),i=s.busy&&s.reason==="in-flight"?pH(t,e,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:e,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function pH(t,e,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=t.db.prepare(`
2751
2751
  SELECT * FROM tracked_invocation
2752
2752
  WHERE kind = 'chat'
2753
2753
  AND status = 'running'
@@ -2757,11 +2757,11 @@ delete requires --confirm; deleting default or active workspaces also requires -
2757
2757
  AND holder_pid IS ?
2758
2758
  ORDER BY started_at DESC, id DESC
2759
2759
  LIMIT 5
2760
- `).all(e,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:bk(o.request_payload)}}function Xa(t,e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.target_teamfile!==void 0&&(r.push("target_teamfile = ?"),n.push(e.target_teamfile)),e.target_alias!==void 0&&(r.push("target_alias = ?"),n.push(e.target_alias));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`;return t.db.prepare(`
2760
+ `).all(e,r,s,n.holder_pid).find(a=>a.request_payload!==null);return o?.request_payload===void 0||o.request_payload===null?null:{tracked_invocation_id:o.id,from_identity:o.from_identity,started_at:o.started_at,request_payload:o.request_payload,request_preview:bk(o.request_payload)}}function Ga(t,e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.target_teamfile!==void 0&&(r.push("target_teamfile = ?"),n.push(e.target_teamfile)),e.target_alias!==void 0&&(r.push("target_alias = ?"),n.push(e.target_alias));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`;return t.db.prepare(`
2761
2761
  SELECT * FROM tracked_invocation
2762
2762
  ${s}
2763
2763
  ORDER BY started_at DESC, id DESC
2764
- `).all(...n)}function Wf(t,e={}){return Xa(t,e).filter(n=>n.kind==="chat"&&n.status==="running"&&sa(n)==="dead")}function _H(t){let e=new Set,r=[];for(let n of t)e.has(n.id)||(e.add(n.id),r.push(n));return r.sort((n,s)=>{let i=Date.parse(s.started_at)-Date.parse(n.started_at);return Number.isFinite(i)&&i!==0?i:s.id-n.id})}function hH(t,e,r){return t.db.prepare(`
2764
+ `).all(...n)}function Wf(t,e={}){return Ga(t,e).filter(n=>n.kind==="chat"&&n.status==="running"&&sa(n)==="dead")}function _H(t){let e=new Set,r=[];for(let n of t)e.has(n.id)||(e.add(n.id),r.push(n));return r.sort((n,s)=>{let i=Date.parse(s.started_at)-Date.parse(n.started_at);return Number.isFinite(i)&&i!==0?i:s.id-n.id})}function hH(t,e,r){return t.db.prepare(`
2765
2765
  SELECT * FROM agent_mailbox
2766
2766
  WHERE sender_teamfile = ?
2767
2767
  AND sender_alias = ?
@@ -2826,9 +2826,9 @@ delete requires --confirm; deleting default or active workspaces also requires -
2826
2826
  id ASC
2827
2827
  `).all()}function Bf(t){return t.filter(e=>sa(e)!=="dead")}function hk(t,e){let r=t.delivered_at!==null&&(t.receipt===null||t.receipt==="");return{id:t.id,state:r?"no reply":"queued",sender:t.sender_teamfile===null||t.sender_alias===null?null:`${t.sender_teamfile}:${t.sender_alias}`,receiver:`${t.receiver_teamfile}:${t.receiver_alias}`,message_type:t.message_type,payload:t.payload,payload_preview:bk(t.payload),receiver_availability:EH(Yt(e,t.receiver_teamfile,t.receiver_alias)),age_basis_at:r?t.delivered_at:t.created_at,created_at:t.created_at,delivered_at:t.delivered_at}}function EH(t){if(!t.busy)return{state:"idle",reason:null,detail:"receiver idle now"};if(t.reason==="in-flight"){let s=t.inFlight.sender_alias==="operator"?"operator":`${t.inFlight.sender_teamfile}:${t.inFlight.sender_alias}`,i=t.inFlight.holder_pid===null?"":`, holder pid ${t.inFlight.holder_pid}`;return{state:"busy",reason:"in-flight",detail:`receiver busy now (in-flight: ${ze(s)} since ${t.inFlight.started_at}${i})`}}if(t.source==="terminal-lock"){let s=t.terminalLock,i=s.holder_host===tk()?"this host":s.holder_host;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: holder pid ${s.holder_pid} alive on ${i})`}}let e=t.terminalInvocation,r=e.holder_host===null?"unknown host":e.holder_host===tk()?"this host":e.holder_host,n=e.holder_pid===null?"":` holder pid ${e.holder_pid}`;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: invocation #${e.id}${n} alive on ${r})`}}async function gk(t){let e=[];for(let r of t)e.push(await TH(r));return e}async function TH(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,r={tracked_invocation_id:t.id,from_identity:t.from_identity,target:e??"(unknown)",started_at:t.started_at,tail_hint:e===null?"":`lmctl tail "${t.target_teamfile}" ${t.target_alias}`};if(e===null)return Kr(r,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return Kr(r,"missing-request-payload",null,null);let n=bH(t.meta);if(n.provider===null||n.sessionid===null)return Kr(r,"missing-session-metadata",n.provider,n.sessionid);if(!SH(n.provider))return Kr(r,"unsupported-provider",n.provider,n.sessionid);let s;try{s=await Ye(n.sessionid,n.provider)}catch{return Kr(r,"read-error",n.provider,n.sessionid)}if(s===null)return Kr(r,"session-not-found",n.provider,n.sessionid);let i=vH(t.request_payload,s.messages);return i.state!=="completed"?Kr(r,i.reason,n.provider,n.sessionid):{...r,state:"completed",reason:null,provider:n.provider,session_id:n.sessionid,result_payload:i.result,result_preview:Tk(i.result),assistant_timestamp:i.assistantTimestamp,matched_user_index:i.userIndex}}function Kr(t,e,r,n){return{...t,state:"unreconciled",reason:e,provider:r,session_id:n,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function bH(t){if(t===null||t.trim()==="")return{provider:null,sessionid:null};try{let e=JSON.parse(t);return{provider:typeof e.provider=="string"&&e.provider.length>0?e.provider:null,sessionid:typeof e.sessionid=="string"&&e.sessionid.length>0?e.sessionid:null}}catch{return{provider:null,sessionid:null}}}function SH(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","ClaudeMock"].includes(t)}function vH(t,e){let r=e.map((i,o)=>({message:i,index:o})).filter(({message:i})=>i.role==="user"&&i.content===t);if(r.length===0)return{state:"unreconciled",reason:"request-not-found"};if(r.length>1)return{state:"unreconciled",reason:"duplicate-request"};let n=r[0].index,s=[];for(let i of e.slice(n+1)){if(i.role==="user")break;i.role==="assistant"&&i.content.trim().length>0&&s.push(i)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:n,result:s.map(i=>i.content).join(`
2828
2828
 
2829
- `),assistantTimestamp:kH(s[s.length-1]?.timestamp)}}function kH(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function qf(t,e){let r={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:sa(t),mailbox_delivery:null,from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:uk(t.result_summary),error:uk(t.error)};return r.mailbox_delivery=CH(r,e),r}function Ga(t,e){let r=new Map;for(let n of t){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=e==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function IH(t,e){return t.scope==="self"?NH(t,e):xH(t,e)}function NH(t,e){let r=[];r.push(`identity: ${t.identity}`),r.push(`team: ${t.team.name}`),r.push(`teamfile: ${t.team.teamfile}`),r.push(""),r.push("members:"),t.members.length===0&&r.push(" none");for(let n of t.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),wk(r,t.waiting_on,"self"),r.push(""),r.push("transcript harvest:"),Ek(r,t.transcript_harvest,"self"),r.push(""),r.push("activity from me:"),Hf(r,Jf(t.activity.from_me,e.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Hf(r,Jf(t.activity.to_me,e.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),Va(r,t.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),Va(r,t.mailbox.inbound_pending),r.push(""),r.push(yk(t)),r.join(`
2830
- `)}function xH(t,e){let r=[];r.push("scope: workspace"),r.push("identity: none"),r.push(""),r.push("teams:"),t.teams.length===0&&r.push(" none");for(let n of t.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),wk(r,t.waiting_on,"workspace"),r.push(""),r.push("transcript harvest:"),Ek(r,t.transcript_harvest,"workspace"),r.push(""),r.push("recent activity:"),Hf(r,Jf(t.activity,e.sinceIso),"workspace"),r.push(""),r.push("mailbox pending outbound:"),Va(r,t.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),Va(r,t.mailbox.pending_inbound),r.push(""),r.push(yk(t)),r.join(`
2831
- `)}function yk(t){return ti(t.workspace,t.db_path)}function Hf(t,e,r){if(e.length===0){t.push(" none");return}let n=e.filter(dk).sort(OH),s=n.length===0?e:e.filter(i=>!dk(i));for(let i of n.slice(0,rk))ck(t,i,r);Ka(t,n.length,rk,"more open delegations");for(let i of s.slice(0,Ja))ck(t,i,r);Ka(t,s.length,Ja,"older")}function wk(t,e,r){if(e.length===0){t.push(" none");return}let n=AH(e,aH);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${ze(s.sender)} -> ${ze(s.receiver)}`:ze(s.receiver);t.push(` ${i} - ${s.state} ${FH(s.age_basis_at)} (#${s.id}, ${s.message_type})`),t.push(` "${s.payload_preview}"`),t.push(` ${s.receiver_availability.detail}; lane key: sender+receiver, another sender's chat will not flush this queued mail`)}LH(t,e,n)}function Ek(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,Ja)){let s=r==="workspace"?` from ${ze(n.from_identity)} -> ${ze(n.target)}`:` -> ${ze(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;t.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else t.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&t.push(` inspect: ${n.tail_hint}`)}Ka(t,e.length,Ja,"more transcript harvest rows")}function AH(t,e){let r=[...t].sort(lk);if(r.length<=e)return r;let n=r.slice(0,e),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=RH(n);a>=0&&(n[a]=o)}return n.sort(lk)}function RH(t){let e=new Map;for(let r of t)e.set(r.state,(e.get(r.state)??0)+1);for(let r=t.length-1;r>=0;r-=1)if((e.get(t[r].state)??0)>1)return r;return-1}function LH(t,e,r){let n=new Set(r.map(l=>l.id)),s=e.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);t.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function lk(t,e){let r=Date.parse(t.age_basis_at),n=Date.parse(e.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:t.id-e.id}function Jf(t,e){let r=Date.parse(e);return Number.isFinite(r)?t.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):t}function ck(t,e,r){let n=PH(e,r),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${Tk(i)}"`;t.push(` #${e.id} ${$H(e)} ${e.kind}${n} ${s}${o}`)}function dk(t){return t.mailbox_delivery?.state==="queued"||t.mailbox_delivery?.state==="delivering"}function OH(t,e){let r=Date.parse(t.started_at)-Date.parse(e.started_at);return Number.isFinite(r)&&r!==0?r:t.id-e.id}function $H(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.mailbox_delivery===null?t.status.toUpperCase():t.mailbox_delivery.state.toUpperCase()}function CH(t,e){let r=MH(t,e);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function MH(t,e){if(t.kind!=="chat"||t.status!=="done"||t.target===null||t.result===null)return null;let r,n;try{r=Xr(t.from_identity),n=Xr(t.target)}catch{return null}for(let s of jH(t.result)){let i=e.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&DH(i,t))return i}return null}function jH(t){let e=new Set,r=[];for(let n of t.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||e.has(s)||(e.add(s),r.push(s))}return r}function DH(t,e){let r=Date.parse(e.started_at),n=Date.parse(e.ended_at??e.started_at),s=Date.parse(t.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function PH(t,e){if(e==="from-me")return t.target===null?"":` -> ${ze(t.target)}`;if(e==="to-me")return` from ${ze(t.from_identity)}`;let r=t.target===null?"":` -> ${ze(t.target)}`;return` from ${ze(t.from_identity)}${r}`}function Ka(t,e,r,n){let s=e-r;s>0&&t.push(` (+${s} ${n} -- use --json)`)}function Va(t,e){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,nk)){let n=r.sender??"operator";t.push(` ${ze(n)} -> ${ze(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Ka(t,e.length,nk,"more lanes")}function uk(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function Tk(t){let e=t.replace(/\s+/g," ").trim();return e.length<=sk?e:`${e.slice(0,sk-3)}...`}function bk(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=ik?e:`${e.slice(0,ik-3)}...`}function FH(t){let e=Date.parse(t);if(!Number.isFinite(e))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-e)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function ze(t){if(t==="operator")return t;try{let e=Xr(t);return`${rH(e.teamfile)}:${e.alias}`}catch{return t}}function UH(t){if(t===void 0)return{iso:new Date(Date.now()-lH).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}var oH,Ja,rk,nk,aH,lH,sk,ik,vk=E(()=>{"use strict";Br();Le();Vu();Be();Ra();Ot();Er();oH=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2829
+ `),assistantTimestamp:kH(s[s.length-1]?.timestamp)}}function kH(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function qf(t,e){let r={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:sa(t),mailbox_delivery:null,from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:uk(t.result_summary),error:uk(t.error)};return r.mailbox_delivery=CH(r,e),r}function Ka(t,e){let r=new Map;for(let n of t){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=e==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function IH(t,e){return t.scope==="self"?NH(t,e):xH(t,e)}function NH(t,e){let r=[];r.push(`identity: ${t.identity}`),r.push(`team: ${t.team.name}`),r.push(`teamfile: ${t.team.teamfile}`),r.push(""),r.push("members:"),t.members.length===0&&r.push(" none");for(let n of t.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),wk(r,t.waiting_on,"self"),r.push(""),r.push("transcript harvest:"),Ek(r,t.transcript_harvest,"self"),r.push(""),r.push("activity from me:"),Hf(r,Jf(t.activity.from_me,e.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Hf(r,Jf(t.activity.to_me,e.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),Ya(r,t.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),Ya(r,t.mailbox.inbound_pending),r.push(""),r.push(yk(t)),r.join(`
2830
+ `)}function xH(t,e){let r=[];r.push("scope: workspace"),r.push("identity: none"),r.push(""),r.push("teams:"),t.teams.length===0&&r.push(" none");for(let n of t.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),wk(r,t.waiting_on,"workspace"),r.push(""),r.push("transcript harvest:"),Ek(r,t.transcript_harvest,"workspace"),r.push(""),r.push("recent activity:"),Hf(r,Jf(t.activity,e.sinceIso),"workspace"),r.push(""),r.push("mailbox pending outbound:"),Ya(r,t.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),Ya(r,t.mailbox.pending_inbound),r.push(""),r.push(yk(t)),r.join(`
2831
+ `)}function yk(t){return ti(t.workspace,t.db_path)}function Hf(t,e,r){if(e.length===0){t.push(" none");return}let n=e.filter(dk).sort(OH),s=n.length===0?e:e.filter(i=>!dk(i));for(let i of n.slice(0,rk))ck(t,i,r);Va(t,n.length,rk,"more open delegations");for(let i of s.slice(0,Xa))ck(t,i,r);Va(t,s.length,Xa,"older")}function wk(t,e,r){if(e.length===0){t.push(" none");return}let n=AH(e,aH);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${ze(s.sender)} -> ${ze(s.receiver)}`:ze(s.receiver);t.push(` ${i} - ${s.state} ${FH(s.age_basis_at)} (#${s.id}, ${s.message_type})`),t.push(` "${s.payload_preview}"`),t.push(` ${s.receiver_availability.detail}; lane key: sender+receiver, another sender's chat will not flush this queued mail`)}LH(t,e,n)}function Ek(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,Xa)){let s=r==="workspace"?` from ${ze(n.from_identity)} -> ${ze(n.target)}`:` -> ${ze(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;t.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else t.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&t.push(` inspect: ${n.tail_hint}`)}Va(t,e.length,Xa,"more transcript harvest rows")}function AH(t,e){let r=[...t].sort(lk);if(r.length<=e)return r;let n=r.slice(0,e),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=RH(n);a>=0&&(n[a]=o)}return n.sort(lk)}function RH(t){let e=new Map;for(let r of t)e.set(r.state,(e.get(r.state)??0)+1);for(let r=t.length-1;r>=0;r-=1)if((e.get(t[r].state)??0)>1)return r;return-1}function LH(t,e,r){let n=new Set(r.map(l=>l.id)),s=e.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);t.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function lk(t,e){let r=Date.parse(t.age_basis_at),n=Date.parse(e.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:t.id-e.id}function Jf(t,e){let r=Date.parse(e);return Number.isFinite(r)?t.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):t}function ck(t,e,r){let n=PH(e,r),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${Tk(i)}"`;t.push(` #${e.id} ${$H(e)} ${e.kind}${n} ${s}${o}`)}function dk(t){return t.mailbox_delivery?.state==="queued"||t.mailbox_delivery?.state==="delivering"}function OH(t,e){let r=Date.parse(t.started_at)-Date.parse(e.started_at);return Number.isFinite(r)&&r!==0?r:t.id-e.id}function $H(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.mailbox_delivery===null?t.status.toUpperCase():t.mailbox_delivery.state.toUpperCase()}function CH(t,e){let r=MH(t,e);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function MH(t,e){if(t.kind!=="chat"||t.status!=="done"||t.target===null||t.result===null)return null;let r,n;try{r=Xr(t.from_identity),n=Xr(t.target)}catch{return null}for(let s of jH(t.result)){let i=e.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&DH(i,t))return i}return null}function jH(t){let e=new Set,r=[];for(let n of t.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||e.has(s)||(e.add(s),r.push(s))}return r}function DH(t,e){let r=Date.parse(e.started_at),n=Date.parse(e.ended_at??e.started_at),s=Date.parse(t.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function PH(t,e){if(e==="from-me")return t.target===null?"":` -> ${ze(t.target)}`;if(e==="to-me")return` from ${ze(t.from_identity)}`;let r=t.target===null?"":` -> ${ze(t.target)}`;return` from ${ze(t.from_identity)}${r}`}function Va(t,e,r,n){let s=e-r;s>0&&t.push(` (+${s} ${n} -- use --json)`)}function Ya(t,e){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,nk)){let n=r.sender??"operator";t.push(` ${ze(n)} -> ${ze(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Va(t,e.length,nk,"more lanes")}function uk(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function Tk(t){let e=t.replace(/\s+/g," ").trim();return e.length<=sk?e:`${e.slice(0,sk-3)}...`}function bk(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=ik?e:`${e.slice(0,ik-3)}...`}function FH(t){let e=Date.parse(t);if(!Number.isFinite(e))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-e)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function ze(t){if(t==="operator")return t;try{let e=Xr(t);return`${rH(e.teamfile)}:${e.alias}`}catch{return t}}function UH(t){if(t===void 0)return{iso:new Date(Date.now()-lH).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}var oH,Xa,rk,nk,aH,lH,sk,ik,vk=E(()=>{"use strict";Br();Le();Yu();Be();Ra();Ot();Er();oH=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2832
2832
 
2833
2833
  Show this member's team, busy/idle roster, recent tracked activity, and mailbox
2834
2834
  state. From a plain operator shell, show a workspace-level team/activity summary.
@@ -2836,8 +2836,8 @@ state. From a plain operator shell, show a workspace-level team/activity summary
2836
2836
  Text output shows recent activity from the last 24h by default. Use --since 7d
2837
2837
  or an ISO timestamp to widen the investigation window. --json returns complete,
2838
2838
  uncapped data.
2839
- `,Ja=5,rk=5,nk=5,aH=5,lH=24*60*60*1e3,sk=72,ik=80});Be();Hn();ue();import{pathToFileURL as WH}from"node:url";import{mkdirSync as yI,readFileSync as wI,renameSync as EI,writeFileSync as TI}from"node:fs";import{homedir as bI}from"node:os";import{dirname as SI,join as vI}from"node:path";function _m(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function hI(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function gI(t,e){return!hI(t)||_m(t)?null:`${e} must use https://: ${t}`}async function hm(t,e){let r=gI(t,e.description);if(r!==null||!_m(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw pm(t,e.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw pm(t,e.description,n,a)}}finally{clearTimeout(i)}}function pm(t,e,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${i}`)}Hn();var kI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",II=60*60*1e3,NI=1500;function xI(){let t=process.env.HOME??bI();return vI(t,".lmctl",".update-check.json")}function AI(t){return t.isTTY===!0}function RI(t,e){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function nl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!AI(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function LI(t,e){try{let r=JSON.parse(wI(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<II)return r.latest}catch{}return null}function OI(t,e){yI(SI(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;TI(r,`${JSON.stringify(e)}
2840
- `,"utf8"),EI(r,t)}async function $I(){let t=await hm(kI,{description:"lmctl npm metadata",timeoutMs:NI}),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 gm(t,e=[],r={}){try{if(nl(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??xI();if(LI(s,n)!==null)return;let o=await(r.fetchLatest??$I)();try{OI(s,{checkedAt:n,latest:o})}catch{return}let a=r.currentVersion?.()??Et();RI(o,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
2839
+ `,Xa=5,rk=5,nk=5,aH=5,lH=24*60*60*1e3,sk=72,ik=80});Be();Hn();de();import{pathToFileURL as WH}from"node:url";import{mkdirSync as yI,readFileSync as wI,renameSync as EI,writeFileSync as TI}from"node:fs";import{homedir as bI}from"node:os";import{dirname as SI,join as vI}from"node:path";function _m(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function hI(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function gI(t,e){return!hI(t)||_m(t)?null:`${e} must use https://: ${t}`}async function hm(t,e){let r=gI(t,e.description);if(r!==null||!_m(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw pm(t,e.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw pm(t,e.description,n,a)}}finally{clearTimeout(i)}}function pm(t,e,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${i}`)}Hn();var kI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",II=60*60*1e3,NI=1500;function xI(){let t=process.env.HOME??bI();return vI(t,".lmctl",".update-check.json")}function AI(t){return t.isTTY===!0}function RI(t,e){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function sl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!AI(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function LI(t,e){try{let r=JSON.parse(wI(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<II)return r.latest}catch{}return null}function OI(t,e){yI(SI(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;TI(r,`${JSON.stringify(e)}
2840
+ `,"utf8"),EI(r,t)}async function $I(){let t=await hm(kI,{description:"lmctl npm metadata",timeoutMs:NI}),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 gm(t,e=[],r={}){try{if(sl(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??xI();if(LI(s,n)!==null)return;let o=await(r.fetchLatest??$I)();try{OI(s,{checkedAt:n,latest:o})}catch{return}let a=r.currentVersion?.()??Et();RI(o,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
2841
2841
  `)}catch{}}var Un=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2842
2842
  `,Xf=`${Un}
2843
2843
  Setup & status:
@@ -2889,10 +2889,10 @@ ${Un}Run 'lmctl help' for usage.
2889
2889
  `),1):(t.stderr.write(`error: unknown command: ${e}
2890
2890
  ${Un}Run 'lmctl help' for usage.
2891
2891
  `),1)}async function BH(t,e={stdout:process.stdout,stderr:process.stderr}){let r=um();try{return await qH(t,e)}finally{fm(r)}}async function qH(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let a=0;a<t.length;a+=1){let l=t[a];if(l==="--db"){let c=t[++a];if(c===void 0||c.startsWith("--"))return Gf(e,"missing value for --db");process.env.LMCTL_DB=c;continue}if(l==="--workspace"){let c=t[++a];if(c===void 0||c.startsWith("--"))return Gf(e,"missing value for --workspace");if(!Ze(c))return Gf(e,`invalid workspace name: ${c}`);process.env.LMCTL_WORKSPACE=c;continue}if(l==="--debug"){dm();continue}r.push(l)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${Et()}
2892
- `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Xf),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(Xf),0):kk.has(a)?Ik(a,[...l,"--help"],e):Nk(e,a)}Zf(Z(),e.stderr),em(e.stderr);let[s,...i]=r;if(s===void 0)return e.stdout.write(Xf),0;let o=Date.now();Kf(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await Ik(s,i,e);return Kf(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),kk.has(s)&&!nl(r,e)&&await gm(e,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Kf(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:JH(l)}),HH(a,s,i,e)}}function Kf(t,e,r){Ae({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:Z(),workspace:process.env.LMCTL_WORKSPACE??null,lmctl_version:Et(),node_version:process.version,...r})}function HH(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));return n.stderr.write(`error: ${s.message}
2892
+ `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Xf),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(e.stdout.write(Xf),0):kk.has(a)?Ik(a,[...l,"--help"],e):Nk(e,a)}Zf(Z(),e.stderr),em(e.stderr);let[s,...i]=r;if(s===void 0)return e.stdout.write(Xf),0;let o=Date.now();Kf(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await Ik(s,i,e);return Kf(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),kk.has(s)&&!sl(r,e)&&await gm(e,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Kf(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:JH(l)}),HH(a,s,i,e)}}function Kf(t,e,r){Ae({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:Z(),workspace:process.env.LMCTL_WORKSPACE??null,lmctl_version:Et(),node_version:process.version,...r})}function HH(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));return n.stderr.write(`error: ${s.message}
2893
2893
  `),mm()?(n.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
2894
2894
  `),1):(n.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
2895
- `),1)}function JH(t){let e=[],r=t.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return e}async function Ik(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Dc(),nh));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(sb(),nb));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Wb(),Ub));return n(e,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(Gb(),Xb));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(eS(),Qb));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(rS(),tS));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(SS(),bS));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(LS(),RS));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(US(),FS));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(qS(),BS));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ks(),Gs));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ks(),Gs));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ks(),Gs));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ks(),Gs));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(uv(),dv));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(_v(),pv));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(vv(),Sv));return n(e,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>($v(),Ov));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Gv(),Xv));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(ek(),Qv));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(vk(),Sk));return n(e,r)}case"db":return XH(e,r);default:return Nk(r,t)}}function XH(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2895
+ `),1)}function JH(t){let e=[],r=t.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return e}async function Ik(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Pc(),nh));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(sb(),nb));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Wb(),Ub));return n(e,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(Gb(),Xb));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(eS(),Qb));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(rS(),tS));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(SS(),bS));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(LS(),RS));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(US(),FS));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(qS(),BS));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ks(),Gs));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ks(),Gs));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ks(),Gs));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ks(),Gs));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(uv(),dv));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(_v(),pv));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(vv(),Sv));return n(e,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>($v(),Ov));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Gv(),Xv));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(ek(),Qv));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(vk(),Sk));return n(e,r)}case"db":return XH(e,r);default:return Nk(r,t)}}function XH(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2896
2896
 
2897
2897
  Database utilities. The downgrade command is currently a documented stub;
2898
2898
  restore from backup for rollback and use normal migrations for forward changes.