@lmctl-ai/lmctl 0.1.16 → 0.1.17

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 +199 -199
  2. package/package.json +3 -3
package/dist/cli/index.js CHANGED
@@ -12,7 +12,7 @@ var tS=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ie=(t,e)=>{f
12
12
  FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:Dt(r)}}async function AS(t){let e=et(),r=process.version,n=$a("uname",["-a"],{encoding:"utf8"}),s=bn((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await af(i);let u=$a("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await af(a);let u=$a("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":bn(o.join(`
13
13
  `)),c=[];for(let u of vS){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(sf(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function RS(){return process.env.LMCTL_INTENT_LOG??SS(TS(),".lmctl","recent-intents.log")}async function OS(t){let e=t.intentLog??RS(),r=t.intentLogTailLines??500;try{let s=(await xa(e,"utf8")).split(`
14
14
  `).filter(i=>i.length>0),o=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:o.length,tail:bn(o.join(`
15
- `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Cs,vS,Na,Tn=b(()=>{"use strict";Os();Cs=["serve","db","runs","jobs","attentions","env","intents"];vS=["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"];Na=["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 CS,appendFileSync as LS,mkdirSync as MS,existsSync as iB,readdirSync as aB,unlinkSync as lB}from"node:fs";import{join as df,dirname as DS}from"node:path";import{homedir as ff}from"node:os";function mf(){ja=!0,process.env.LMCTL_DEBUG="1"}function Ae(){if(ja)return!0;let t=Date.now();return t-uf>=PS&&(cf=BS(),uf=t),cf}function US(){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 Pt(t,e){if(e?.verbose){if(!ja)return}else if(!e?.always&&!Ae())return;try{WS();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};LS(Ls,JSON.stringify(r)+`
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 Cs,vS,Na,Tn=b(()=>{"use strict";Os();Cs=["serve","db","runs","jobs","attentions","env","intents"];vS=["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"];Na=["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 CS,appendFileSync as LS,mkdirSync as MS,existsSync as lB,readdirSync as cB,unlinkSync as uB}from"node:fs";import{join as df,dirname as DS}from"node:path";import{homedir as ff}from"node:os";function mf(){ja=!0,process.env.LMCTL_DEBUG="1"}function Ae(){if(ja)return!0;let t=Date.now();return t-uf>=PS&&(cf=BS(),uf=t),cf}function US(){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 Pt(t,e){if(e?.verbose){if(!ja)return}else if(!e?.always&&!Ae())return;try{WS();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};LS(Ls,JSON.stringify(r)+`
16
16
  `)}catch{}}function WS(){if(!Ls){let e=US().slice(0,13).replace("T","-");Ls=df(ff(),".lmctl",`debug-${e}.log`)}MS(DS(Ls),{recursive:!0})}function ct(...t){Pt({event:"legacy",msg:t.join(" ")},{verbose:!0})}function te(t){Pt(t,{always:!0})}function BS(){try{let t=CS(FS,"utf-8");for(let e of t.split(`
17
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}var ja,cf,uf,PS,FS,Ls,We=b(()=>{"use strict";ja=!1,cf=!1,uf=0,PS=5e3,FS=df(ff(),".lmctl","config.toml");Ls=null});function ut(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Ft(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Sn(t,e){return!Ft(t)||ut(t)?null:`${e} must use https://: ${t}`}async function ur(t,e){let r=Sn(t,e.description);if(r!==null||!ut(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw pf(t,e.description,n,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw pf(t,e.description,n,a)}}finally{clearTimeout(o)}}function pf(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var Ms=b(()=>{"use strict"});import ak from"better-sqlite3";import{existsSync as lk,mkdirSync as ck,readFileSync as uk}from"node:fs";import{homedir as dk}from"node:os";import{dirname as _f,join as fk,resolve as gf}from"node:path";import{fileURLToPath as mk,pathToFileURL as pk}from"node:url";function Ra(t){t.dbPath!==":memory:"&&ck(_f(t.dbPath),{recursive:!0});let e=new ak(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=yf(e);return r===0&&(e.exec(uk(hk,"utf8")),e.pragma(`user_version = ${Aa}`)),gk(e,r),e}function gk(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
18
18
  CREATE TABLE IF NOT EXISTS session_size (
@@ -1493,33 +1493,33 @@ ${u}`:u;try{let f=await Qn({context:t,stateId:n,member:o,prompt:d,stepId:l.id,ti
1493
1493
  AND sa.content IS NOT NULL
1494
1494
  ORDER BY sa.id DESC
1495
1495
  LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:pi(o[0].content)}function pi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function qA(t,e){let r=L_(CA.lexer(t,{gfm:!0})),n=new IA({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:NA.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new at("")]:r}]});return xA.toBuffer(n)}function L_(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new at({heading:YA(r.depth),children:er(Qt(r))}));break;case"paragraph":e.push(new at({children:er(Qt(r))}));break;case"text":e.push(new at({children:Qt(r).length===0?[new lt(r.text)]:er(Qt(r))}));break;case"blockquote":e.push(...L_(Qt(r)).map(n=>n instanceof at?n:new at({children:[new lt(r.text)]})));break;case"list":XA(r)&&e.push(...HA(r));break;case"table":VA(r)&&e.push(JA(r));break;case"code":KA(r)&&e.push(...GA(r));break;case"hr":e.push(new at(""));break;case"html":r.text.trim().length>0&&e.push(new at({children:[new lt(r.text)]}));break;default:break}return e}function er(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new lt({text:n.text,...Bc(e)}));break;case"strong":r.push(...er(Qt(n),{...e,bold:!0}));break;case"em":r.push(...er(Qt(n),{...e,italics:!0}));break;case"codespan":r.push(new lt({text:n.text,...Bc({...e,code:!0})}));break;case"link":r.push(new $A({link:n.href,children:er(Qt(n),{...e})}));break;case"br":r.push(new lt({text:"",break:1}));break;case"image":r.push(new lt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new lt({text:n.text,strike:!0}));break;default:r.push(new lt({text:n.raw,...Bc(e)}));break}return r.length===0?[new lt("")]:r}function Bc(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function HA(t){return t.items.map(e=>new at({children:er(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:R_(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:R_(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function R_(t){return t.task?`[${t.checked?"x":" "}] `:""}function JA(t){let e=[t.header,...t.rows].map(r=>new RA({children:r.map(n=>new AA({children:[new at({children:er(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new jA({width:{size:100,type:OA.PERCENTAGE},rows:e})}function GA(t){return t.text.split(`
1496
- `).map(r=>new at({children:[new lt({text:r.length===0?" ":r,font:"Courier New"})]}))}function Qt(t){let e=t.tokens;return Array.isArray(e)?e:[]}function XA(t){return t.type==="list"&&Array.isArray(t.items)}function VA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function KA(t){return t.type==="code"&&typeof t.text=="string"}function YA(t){switch(t){case 1:return an.HEADING_1;case 2:return an.HEADING_2;case 3:return an.HEADING_3;case 4:return an.HEADING_4;case 5:return an.HEADING_5;default:return an.HEADING_6}}var C_,M_=b(()=>{"use strict";Fe();C_={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=>LA(t,t.state)}});import{createHash as zA}from"node:crypto";import{existsSync as ZA,mkdirSync as QA,readFileSync as D_,statSync as eR}from"node:fs";import{dirname as tR,isAbsolute as P_,normalize as rR,resolve as ts}from"node:path";import nR from"exceljs";import{marked as sR}from"marked";async function oR(t,e){let r=t.stateId,n=t.displayName,s=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await iR(t,e),i=aR(e.input_format),a=await lR(t,e),l=await cR(t,e.title),c=i==="markdown"?wR(o):mR(o);await yR({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=eR(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=zA("sha256").update(D_(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),K(t,r,n,{output_path:a,path:a,bytes:u}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),K(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function iR(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await He(e.source,t,t.stateId)).trim(),n=dR(t.project.local_path,r);if(n!==null){if(!ZA(n))throw new Error(`source file not found: ${n}`);return D_(n,"utf8")}return r}function aR(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function lR(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await He(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=uR(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function cR(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await He(e,t,t.stateId)).trim();return r.length===0?null:r}function uR(t,e){let r=ts(t);return rR(P_(e)?ts(e):ts(r,e))}function dR(t,e){return fR(e)?P_(e)?ts(e):ts(t,e):null}function fR(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function mR(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(!hi(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>pR(r,n))}function pR(t,e){if(!hi(t))throw new Error(`sheets[${e}] must be an object`);let r=hR(t.headers,`sheets[${e}].headers`),n=_R(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:gR(t.styles)}}function hR(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 _R(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function gR(t){if(!hi(t)||!hi(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 wR(t){let e=sR.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(kR(s)){n=s.text;continue}vR(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function yR(t){QA(tR(t.outputPath),{recursive:!0});let e=new nR.Workbook;e.creator="lmctl",e.created=new Date,e.modified=new Date,e.title=t.title;let r=new Set;for(let n of t.sheets){let s=e.addWorksheet(bR(n.name,r));if(n.headers.length>0){let o=s.addRow(n.headers);o.font={bold:n.headerStyle?.bold??!0};let i=SR(n.headerStyle?.fill);i!==null&&o.eachCell(a=>{a.fill={type:"pattern",pattern:"solid",fgColor:{argb:i}}})}for(let o of n.rows)s.addRow(o);ER(s,n)}await e.xlsx.writeFile(t.outputPath)}function ER(t,e){let r=Math.max(e.headers.length,...e.rows.map(n=>n.length),1);for(let n=1;n<=r;n+=1){let s=[e.headers[n-1],...e.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));t.getColumn(n).width=o}}function bR(t,e){let r=TR(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function TR(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function SR(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`FF${e.toUpperCase()}`:null}function kR(t){return t.type==="heading"&&typeof t.text=="string"}function vR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function hi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var F_,U_=b(()=>{"use strict";Fe();F_={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=>oR(t,t.state)}});import{spawnSync as IR}from"node:child_process";async function NR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(IR("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=G(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}`),K(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?V(t.workflow,h):{kind:"terminal",terminal:z(t.workflow)}}let o=on(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await sn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1497
- ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=s_(p.text);if(g!==null){let _=G(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=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let S=Object.keys(e.outcomes_from_stance),E=Yn(p.text,S);if(E.outcome===null){let I=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(I.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let v=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,E.outcome,"outcomes_from_stance"),K(t,r,n,E.outcome),V(t.workflow,e.outcomes_from_stance[E.outcome])}let g=Yn(p.text,$R);if(g.outcome!==null){let S=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(S.id,g.outcome,"default_failure_stance"),K(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),K(t,r,n,"approve"),e.write_back_durable_memory){let S=t.membersByAlias.get(e.coder.alias);S!==void 0&&await At(t,n,S,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>sn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1496
+ `).map(r=>new at({children:[new lt({text:r.length===0?" ":r,font:"Courier New"})]}))}function Qt(t){let e=t.tokens;return Array.isArray(e)?e:[]}function XA(t){return t.type==="list"&&Array.isArray(t.items)}function VA(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function KA(t){return t.type==="code"&&typeof t.text=="string"}function YA(t){switch(t){case 1:return an.HEADING_1;case 2:return an.HEADING_2;case 3:return an.HEADING_3;case 4:return an.HEADING_4;case 5:return an.HEADING_5;default:return an.HEADING_6}}var C_,M_=b(()=>{"use strict";Fe();C_={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=>LA(t,t.state)}});import{createHash as zA}from"node:crypto";import{existsSync as ZA,mkdirSync as QA,readFileSync as D_,statSync as eR}from"node:fs";import{dirname as tR,isAbsolute as P_,normalize as rR,resolve as ts}from"node:path";import{marked as nR}from"marked";import sR from"write-excel-file/node";async function oR(t,e){let r=t.stateId,n=t.displayName,s=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await iR(t,e),i=aR(e.input_format),a=await lR(t,e),l=await cR(t,e.title),c=i==="markdown"?wR(o):mR(o);await yR({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=eR(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=zA("sha256").update(D_(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),K(t,r,n,{output_path:a,path:a,bytes:u}),V(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),K(t,r,n,{error:i}),V(t.workflow,e.outcomes?.error??"@terminal:error")}}async function iR(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await He(e.source,t,t.stateId)).trim(),n=dR(t.project.local_path,r);if(n!==null){if(!ZA(n))throw new Error(`source file not found: ${n}`);return D_(n,"utf8")}return r}function aR(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function lR(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await He(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=uR(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function cR(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await He(e,t,t.stateId)).trim();return r.length===0?null:r}function uR(t,e){let r=ts(t);return rR(P_(e)?ts(e):ts(r,e))}function dR(t,e){return fR(e)?P_(e)?ts(e):ts(t,e):null}function fR(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function mR(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(!hi(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>pR(r,n))}function pR(t,e){if(!hi(t))throw new Error(`sheets[${e}] must be an object`);let r=hR(t.headers,`sheets[${e}].headers`),n=_R(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:gR(t.styles)}}function hR(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 _R(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function gR(t){if(!hi(t)||!hi(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 wR(t){let e=nR.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if(IR(s)){n=s.text;continue}$R(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function yR(t){QA(tR(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:SR(n.name,e),data:ER(n),columns:TR(n)}));await sR(r).toFile(t.outputPath)}function ER(t){let e=[];if(t.headers.length>0){let r=vR(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(bR));return e.length===0?[[{}]]:e}function bR(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 TR(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function SR(t,e){let r=kR(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function kR(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function vR(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 IR(t){return t.type==="heading"&&typeof t.text=="string"}function $R(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function hi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var F_,U_=b(()=>{"use strict";Fe();F_={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=>oR(t,t.state)}});import{spawnSync as NR}from"node:child_process";async function jR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(NR("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=G(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}`),K(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?V(t.workflow,h):{kind:"terminal",terminal:z(t.workflow)}}let o=on(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await sn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1497
+ ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=s_(p.text);if(g!==null){let _=G(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=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let S=Object.keys(e.outcomes_from_stance),E=Yn(p.text,S);if(E.outcome===null){let I=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(I.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let v=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(v.id,E.outcome,"outcomes_from_stance"),K(t,r,n,E.outcome),V(t.workflow,e.outcomes_from_stance[E.outcome])}let g=Yn(p.text,xR);if(g.outcome!==null){let S=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(S.id,g.outcome,"default_failure_stance"),K(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),K(t,r,n,"approve"),e.write_back_durable_memory){let S=t.membersByAlias.get(e.coder.alias);S!==void 0&&await At(t,n,S,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>sn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1498
1498
  ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=G(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),K(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await At(t,n,_,e.write_back_durable_memory)}return V(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1499
1499
 
1500
- `),e.loop_feedback_artifact!==void 0){let g=G(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),K(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:z(t.workflow)}}var $R,W_,B_=b(()=>{"use strict";Mc();Fe();$R=["blocked","failed","aborted"],W_={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=>NR(t,t.state)}});import{spawnSync as xR}from"node:child_process";async function jR(t,e){let r=t.stateId,n=t.displayName,s=await He(e.command,t,n),o=Uc(t,n),i=__(s);if(i.matched&&!o){let h=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=xR("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Wc(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:z(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),K(t,r,n,m),V(t.workflow,p))}var q_,H_=b(()=>{"use strict";Fe();q_={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=>jR(t,t.state)}});async function AR(t,e){let r=t.stateId,n=t.displayName,s=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:z(t.workflow)};let i=Oe(o.definition),a=await RR(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:z(t.workflow)};K(t,r,n,OR(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:z(t.workflow)}:V(t.workflow,u)}async function RR(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await c_(s,t);r[n]=o===s?await di(s,t):o}return r}function OR(t,e,r){let n={};for(let s of r)n[s.name]=CR(t,e,s);return n}function CR(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=LR(s,r.source_field);if(o.found)return o.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function LR(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 J_,G_=b(()=>{"use strict";tn();Fe();zn();J_={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=>AR(t,t.state)}});function MR(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),K(t,r,n,s),{kind:"terminal",terminal:s}}var X_,V_=b(()=>{"use strict";Fe();X_={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=>MR(t,t.state)}});async function DR(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=PR(t.cursor),a=o.filter(FR).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function PR(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function FR(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 K_,Y_=b(()=>{"use strict";K_={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=>DR(t)}});async function UR(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 z_,Z_=b(()=>{"use strict";z_={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=>UR(t)}});function Q_(t){t.register(w_),t.register(W_),t.register(T_),t.register(N_),t.register(j_),t.register(C_),t.register(F_),t.register(q_),t.register(E_),t.register(k_),t.register(J_),t.register(X_),t.register(z_),t.register(K_)}var eg=b(()=>{"use strict";y_();b_();S_();I_();x_();A_();M_();U_();B_();H_();G_();V_();Y_();Z_()});function gi(){return _i===null&&(_i=new qc,Q_(_i)),_i}var WR,qc,_i,Hc=b(()=>{"use strict";eg();WR={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"},qc=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:WR[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},_i=null});async function ng(t){lg(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=qR(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=rs(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=zh(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(rs(n)){let m=Jc({dal:t.dal,workflow:yi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:Zt(t.job.payload)??{},team_id:t.team.id}),p=await og(n,m,i.current_state??n.entry_step_id);return rg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Jc({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:Zt(t.job.payload)??{},team_id:t.team.id}),f=await sg(d,i.current_state??n.start_at);return rg(t.dal,r.id,i.id,n.name,f),f}function rg(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function Jc(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await Gc(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{lg(n);let o=rs(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=Jc({dal:t.dal,workflow:rs(n)?yi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return rs(n)?og(n,a,i.current_state??n.entry_step_id):sg(a,i.current_state??n.start_at)}};return e}async function sg(t,e){let r=e;if(r.startsWith(Zn))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 Rt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=wi(t,z(t.workflow));if(l.kind==="paused")return Ce(t);if(l.kind==="escalate")return ze(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Ce(t);if(l.kind==="terminal")return Rt(t,l.terminal);r=l.state;continue}let i,a=ag(t,r);if(a!==null){let l=G(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===kn)return Rt(t,Ca);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):ze(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Gc(t,r,o);if(i.kind==="paused")return Ce(t);if(i.kind==="escalate")return ze(t,{id:r,name:r,type:o.type},i.token,i.reason),Ce(t);if(i.kind==="terminal"){let l=wi(t,i.terminal);if(l.kind==="paused")return Ce(t);if(l.kind==="escalate")return ze(t,{id:r,name:r,type:o.type},l.token,l.reason),Ce(t);if(l.kind==="terminal")return Rt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=wi(t,z(t.workflow));return n.kind==="terminal"?Rt(t,n.terminal):Rt(t,z(t.workflow))}async function og(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return ze(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Ce(e);let l=ag(e,a.id);if(l!==null){let m=G(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===kn)return Rt(e,Ca);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 ze(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}),Ce(e);o=h;continue}let c=await BR(e,t,a);if(c.kind==="paused")return Ce(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return ze(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Ce(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=yi(t,a);try{let p=wi(e,d);if(p.kind==="paused")return Ce(e);if(p.kind==="escalate")return ze(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ce(e);if(p.kind==="terminal")return Rt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return ze(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ce(e);o=h.id;continue}finally{e.workflow=m}}if(Rr(d))return ze(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ce(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return ze(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ce(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Rt(e,"aborted")}async function BR(t,e,r){let n=ig(e,r),s=t.workflow;t.workflow=yi(e,r);try{return await Gc(t,r.id,n,r.name)}finally{t.workflow=s}}function ig(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function Gc(t,e,r,n){let s=gi().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?GR(t,s):void 0,t.progress_step_id=null;try{return await s.execute(p_(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function qR(t,e){try{let r=JSON.parse(t);if(JR(r)&&r.definition_schema_version===3)return pt.parse(r)}catch{return e}return e}function rs(t){return t.definition_schema_version===3}function yi(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=ig(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:HR(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 HR(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function JR(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function GR(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function Rt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Xh(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ce(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function ag(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function wi(t,e){if(!XR(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&&VR(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function XR(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function VR(t,e,r){let n=KR(t),s=r.capture_evidence&&n!==null?YR(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 KR(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 YR(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 lg(t){if(!tg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${tg.join(", ")}`)}var tg,cg=b(()=>{"use strict";Qr();Vh();Zh();Fe();Hc();vn();tg=[1,2,3]});import{readFileSync as zR,readdirSync as ZR}from"node:fs";import{basename as QR,join as eO,resolve as tO}from"node:path";function fg(t={}){let e=tO(t.workflowsDir??"workflows"),r=ZR(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=>rO(eO(e,n)))}}function rO(t){let e=QR(t);try{let r=zR(t,"utf8"),n=Oe(r);return hg(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:_g(r)}}}function mg(t,e){try{let r=Oe(e);return hg(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:_g(r)}}}function pg(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1500
+ `),e.loop_feedback_artifact!==void 0){let g=G(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),K(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?V(t.workflow,d):{kind:"terminal",terminal:z(t.workflow)}}var xR,W_,B_=b(()=>{"use strict";Mc();Fe();xR=["blocked","failed","aborted"],W_={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=>jR(t,t.state)}});import{spawnSync as AR}from"node:child_process";async function RR(t,e){let r=t.stateId,n=t.displayName,s=await He(e.command,t,n),o=Uc(t,n),i=__(s);if(i.matched&&!o){let h=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:z(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=AR("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:z(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Wc(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:z(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),K(t,r,n,m),V(t.workflow,p))}var q_,H_=b(()=>{"use strict";Fe();q_={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=>RR(t,t.state)}});async function OR(t,e){let r=t.stateId,n=t.displayName,s=G(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:z(t.workflow)};let i=Oe(o.definition),a=await CR(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:z(t.workflow)};K(t,r,n,LR(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:z(t.workflow)}:V(t.workflow,u)}async function CR(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await c_(s,t);r[n]=o===s?await di(s,t):o}return r}function LR(t,e,r){let n={};for(let s of r)n[s.name]=MR(t,e,s);return n}function MR(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=DR(s,r.source_field);if(o.found)return o.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function DR(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 J_,G_=b(()=>{"use strict";tn();Fe();zn();J_={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=>OR(t,t.state)}});function PR(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=G(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),K(t,r,n,s),{kind:"terminal",terminal:s}}var X_,V_=b(()=>{"use strict";Fe();X_={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=>PR(t,t.state)}});async function FR(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=UR(t.cursor),a=o.filter(WR).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function UR(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function WR(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 K_,Y_=b(()=>{"use strict";K_={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=>FR(t)}});async function BR(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 z_,Z_=b(()=>{"use strict";z_={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=>BR(t)}});function Q_(t){t.register(w_),t.register(W_),t.register(T_),t.register(N_),t.register(j_),t.register(C_),t.register(F_),t.register(q_),t.register(E_),t.register(k_),t.register(J_),t.register(X_),t.register(z_),t.register(K_)}var eg=b(()=>{"use strict";y_();b_();S_();I_();x_();A_();M_();U_();B_();H_();G_();V_();Y_();Z_()});function gi(){return _i===null&&(_i=new qc,Q_(_i)),_i}var qR,qc,_i,Hc=b(()=>{"use strict";eg();qR={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"},qc=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:qR[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},_i=null});async function ng(t){lg(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=JR(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=rs(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=zh(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.id,workflow_name:n.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(rs(n)){let m=Jc({dal:t.dal,workflow:yi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:Zt(t.job.payload)??{},team_id:t.team.id}),p=await og(n,m,i.current_state??n.entry_step_id);return rg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Jc({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:Zt(t.job.payload)??{},team_id:t.team.id}),f=await sg(d,i.current_state??n.start_at);return rg(t.dal,r.id,i.id,n.name,f),f}function rg(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="unknown"&&Array.isArray(f.steps)){for(let g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function Jc(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await Gc(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{lg(n);let o=rs(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=Jc({dal:t.dal,workflow:rs(n)?yi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return rs(n)?og(n,a,i.current_state??n.entry_step_id):sg(a,i.current_state??n.start_at)}};return e}async function sg(t,e){let r=e;if(r.startsWith(Zn))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 Rt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=wi(t,z(t.workflow));if(l.kind==="paused")return Ce(t);if(l.kind==="escalate")return ze(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Ce(t);if(l.kind==="terminal")return Rt(t,l.terminal);r=l.state;continue}let i,a=ag(t,r);if(a!==null){let l=G(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),K(t,r,r,a),a===kn)return Rt(t,Ca);let c=o.outcomes?.[a];i=c!==void 0?V(t.workflow,c):ze(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Gc(t,r,o);if(i.kind==="paused")return Ce(t);if(i.kind==="escalate")return ze(t,{id:r,name:r,type:o.type},i.token,i.reason),Ce(t);if(i.kind==="terminal"){let l=wi(t,i.terminal);if(l.kind==="paused")return Ce(t);if(l.kind==="escalate")return ze(t,{id:r,name:r,type:o.type},l.token,l.reason),Ce(t);if(l.kind==="terminal")return Rt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=wi(t,z(t.workflow));return n.kind==="terminal"?Rt(t,n.terminal):Rt(t,z(t.workflow))}async function og(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return ze(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Ce(e);let l=ag(e,a.id);if(l!==null){let m=G(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),K(e,a.id,a.name,l),l===kn)return Rt(e,Ca);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 ze(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}),Ce(e);o=h;continue}let c=await HR(e,t,a);if(c.kind==="paused")return Ce(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return ze(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Ce(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=yi(t,a);try{let p=wi(e,d);if(p.kind==="paused")return Ce(e);if(p.kind==="escalate")return ze(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ce(e);if(p.kind==="terminal")return Rt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return ze(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ce(e);o=h.id;continue}finally{e.workflow=m}}if(Rr(d))return ze(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ce(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return ze(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ce(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Rt(e,"aborted")}async function HR(t,e,r){let n=ig(e,r),s=t.workflow;t.workflow=yi(e,r);try{return await Gc(t,r.id,n,r.name)}finally{t.workflow=s}}function ig(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function Gc(t,e,r,n){let s=gi().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?VR(t,s):void 0,t.progress_step_id=null;try{return await s.execute(p_(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function JR(t,e){try{let r=JSON.parse(t);if(XR(r)&&r.definition_schema_version===3)return pt.parse(r)}catch{return e}return e}function rs(t){return t.definition_schema_version===3}function yi(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=ig(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:GR(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 GR(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function XR(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function VR(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function Rt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{Xh(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ce(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function ag(t,e){let n=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function wi(t,e){if(!KR(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&&YR(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function KR(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function YR(t,e,r){let n=zR(t),s=r.capture_evidence&&n!==null?ZR(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 zR(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 ZR(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 lg(t){if(!tg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${tg.join(", ")}`)}var tg,cg=b(()=>{"use strict";Qr();Vh();Zh();Fe();Hc();vn();tg=[1,2,3]});import{readFileSync as QR,readdirSync as eO}from"node:fs";import{basename as tO,join as rO,resolve as nO}from"node:path";function fg(t={}){let e=nO(t.workflowsDir??"workflows"),r=eO(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=>sO(rO(e,n)))}}function sO(t){let e=tO(t);try{let r=QR(t,"utf8"),n=Oe(r);return hg(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:_g(r)}}}function mg(t,e){try{let r=Oe(e);return hg(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:_g(r)}}}function pg(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1501
1501
  `)}
1502
- `}function hg(t,e){let r=sO(e),n=oO(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=nO(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 nO(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function sO(t){return Xc(t)?t.entry_step_id:t.start_at}function oO(t){return Xc(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Xc(t){return t.definition_schema_version===3}function _g(t){return t instanceof jt?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 gg(t){let e=new Set;if(Xc(t))for(let r of t.steps){let n=r.members??{};ug(n,e)}else for(let r of Object.values(t.states))ug(r,e);return[...e].sort()}function ug(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=dg(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=dg(i);a!==null&&e.add(a)}}}function dg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Ei=b(()=>{"use strict";tn()});function iO({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,bi)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=aO(t,r,i);if(a<20)continue;let c=i??"initial",u=`${ns}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:bi,source_ref:ns,payload:JSON.stringify({kind:ns,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function aO(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1502
+ `}function hg(t,e){let r=iO(e),n=aO(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=oO(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 oO(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function iO(t){return Xc(t)?t.entry_step_id:t.start_at}function aO(t){return Xc(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function Xc(t){return t.definition_schema_version===3}function _g(t){return t instanceof jt?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 gg(t){let e=new Set;if(Xc(t))for(let r of t.steps){let n=r.members??{};ug(n,e)}else for(let r of Object.values(t.states))ug(r,e);return[...e].sort()}function ug(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=dg(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=dg(i);a!==null&&e.add(a)}}}function dg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Ei=b(()=>{"use strict";tn()});function lO({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,bi)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=cO(t,r,i);if(a<20)continue;let c=i??"initial",u=`${ns}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:bi,source_ref:ns,payload:JSON.stringify({kind:ns,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function cO(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1503
1503
  FROM run r
1504
1504
  JOIN job j ON j.id = r.job_id
1505
1505
  WHERE j.project_id = ?
1506
1506
  AND r.terminal_state IS NOT NULL
1507
- ${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 wg(t){for(let e of lO)try{e(t)}catch{}}var bi,ns,lO,Vc=b(()=>{"use strict";bi="memory_policy",ns="memory_consolidation_request";lO=[iO]});var kg={};ie(kg,{getOrInsertConsolidationWorkflow:()=>Eg,runJobById:()=>ss,runOnce:()=>kr,startWorker:()=>mO});import{createHash as cO}from"node:crypto";import{readFileSync as uO}from"node:fs";import{pathToFileURL as dO}from"node:url";function Eg(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Po({swallow:!0});let n=Fo(e);if(n===null)return null;let s=uO(n,"utf8"),o=Oe(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:dO(n).href,source_sha256:cO("sha256").update(s).digest("hex")})}catch{return null}}async function kr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??yg,evaluator:n=>Tg(t.dal,n)}),r===null?null:await bg(t.dal,r,e)}catch(n){if(r!==null)return tr(t.dal,r,"worker_run_failed",Sr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ti(Sr(n))})})}catch{}return null}finally{t.max_concurrent}}async function ss(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??yg,evaluator:s=>Tg(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await bg(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...tr(t.dal,r,"worker_run_failed",Sr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ti(Sr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function bg(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return tr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===bi&&e.source_ref===ns,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=Eg(t):i=Sg(t,e,n),i===null)return tr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return tr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Oe(i.definition)}catch(d){return tr(t,e,"worker_workflow_invalid",Sr(d),r,n)}let u=pO(c,l);if(u.length>0)return tr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await ng({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return tr(t,e,"worker_run_failed",Sr(d),r,n,a)}}function Tg(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=Sg(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Oe(n.definition)}catch{s=null}return ei({workflow:s,job:e,project:r})}function Sg(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function mO(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await kr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ti(Sr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??fO))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function tr(t,e,r,n,s,o,i){let a=Ti(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Sr(t){return t instanceof Error?t.message:String(t)}function Ti(t){return t.length>4096?t.slice(0,4096):t}function pO(t,e){let r=gg(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var yg,fO,os=b(()=>{"use strict";Uo();cg();tn();Ei();gc();Vc();yg=6e5,fO=5e3});import{existsSync as hO,readFileSync as _O}from"node:fs";import{marked as gO}from"marked";function Ng(t,e){t.get("/layman",r=>r.html($e("Layman Home",wO(e.dal)))),t.get("/api/layman",r=>r.json(Rg(e.dal))),t.get("/layman/start/:workflow",r=>{let n=$g(r);return n===null?r.notFound():r.html($e(`Start ${ln(n)}`,bO(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=$g(r);return n===null?r.notFound():n==="newspaper"?vg(r,e.dal):TO(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=gr(e.dal,Si(r,"id"));return n===null?r.notFound():r.html($e(`Run ${n.id}`,vO(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=gr(e.dal,Si(r,"id"));return n===null?r.notFound():r.json(MO(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>$O(r,e.dal)),t.get("/layman/newspaper",r=>r.html($e("Newspaper Subscriptions",CO(e.dal)))),t.post("/layman/newspaper",r=>vg(r,e.dal)),t.delete("/layman/newspaper/:id",r=>Ig(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>Ig(r,e.dal))}function wO(t){let e=Rg(t);return`<section class="layman-home">
1507
+ ${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 wg(t){for(let e of uO)try{e(t)}catch{}}var bi,ns,uO,Vc=b(()=>{"use strict";bi="memory_policy",ns="memory_consolidation_request";uO=[lO]});var kg={};ie(kg,{getOrInsertConsolidationWorkflow:()=>Eg,runJobById:()=>ss,runOnce:()=>kr,startWorker:()=>hO});import{createHash as dO}from"node:crypto";import{readFileSync as fO}from"node:fs";import{pathToFileURL as mO}from"node:url";function Eg(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{Po({swallow:!0});let n=Fo(e);if(n===null)return null;let s=fO(n,"utf8"),o=Oe(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:mO(n).href,source_sha256:dO("sha256").update(s).digest("hex")})}catch{return null}}async function kr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??yg,evaluator:n=>Tg(t.dal,n)}),r===null?null:await bg(t.dal,r,e)}catch(n){if(r!==null)return tr(t.dal,r,"worker_run_failed",Sr(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ti(Sr(n))})})}catch{}return null}finally{t.max_concurrent}}async function ss(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??yg,evaluator:s=>Tg(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await bg(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...tr(t.dal,r,"worker_run_failed",Sr(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ti(Sr(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function bg(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return tr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===bi&&e.source_ref===ns,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=Eg(t):i=Sg(t,e,n),i===null)return tr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return tr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Oe(i.definition)}catch(d){return tr(t,e,"worker_workflow_invalid",Sr(d),r,n)}let u=_O(c,l);if(u.length>0)return tr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await ng({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return tr(t,e,"worker_run_failed",Sr(d),r,n,a)}}function Tg(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=Sg(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Oe(n.definition)}catch{s=null}return ei({workflow:s,job:e,project:r})}function Sg(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function hO(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await kr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ti(Sr(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??pO))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function tr(t,e,r,n,s,o,i){let a=Ti(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Sr(t){return t instanceof Error?t.message:String(t)}function Ti(t){return t.length>4096?t.slice(0,4096):t}function _O(t,e){let r=gg(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var yg,pO,os=b(()=>{"use strict";Uo();cg();tn();Ei();gc();Vc();yg=6e5,pO=5e3});import{existsSync as gO,readFileSync as wO}from"node:fs";import{marked as yO}from"marked";function Ng(t,e){t.get("/layman",r=>r.html($e("Layman Home",EO(e.dal)))),t.get("/api/layman",r=>r.json(Rg(e.dal))),t.get("/layman/start/:workflow",r=>{let n=$g(r);return n===null?r.notFound():r.html($e(`Start ${ln(n)}`,SO(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=$g(r);return n===null?r.notFound():n==="newspaper"?vg(r,e.dal):kO(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=gr(e.dal,Si(r,"id"));return n===null?r.notFound():r.html($e(`Run ${n.id}`,$O(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=gr(e.dal,Si(r,"id"));return n===null?r.notFound():r.json(PO(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>xO(r,e.dal)),t.get("/layman/newspaper",r=>r.html($e("Newspaper Subscriptions",MO(e.dal)))),t.post("/layman/newspaper",r=>vg(r,e.dal)),t.delete("/layman/newspaper/:id",r=>Ig(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>Ig(r,e.dal))}function EO(t){let e=Rg(t);return`<section class="layman-home">
1508
1508
  <h1>Welcome</h1>
1509
1509
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1510
- <div class="grid">${ki.map(yO).join("")}</div>
1510
+ <div class="grid">${ki.map(bO).join("")}</div>
1511
1511
  <h2>Recent Activity</h2>
1512
- ${EO(e.recent_runs)}
1512
+ ${TO(e.recent_runs)}
1513
1513
  <section class="metric">
1514
1514
  <h2>Newspaper</h2>
1515
1515
  <p>You have <strong>${T(e.newspaper_subscriptions)}</strong> daily digests configured.</p>
1516
1516
  <p><a href="/layman/newspaper">Manage newspaper subscriptions</a></p>
1517
1517
  </section>
1518
- </section>`}function yO(t){return`<article class="metric workflow-card">
1518
+ </section>`}function bO(t){return`<article class="metric workflow-card">
1519
1519
  <h2>${T(t.title)}</h2>
1520
1520
  <p>${T(t.description)}</p>
1521
1521
  <p><a href="/layman/start/${encodeURIComponent(t.name)}">Start</a></p>
1522
- </article>`}function EO(t){return de(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${T(e.id)}</a>`,T(ln(e.workflow_name)),T(e.terminal_state??e.current_state??"queued"),T(e.started_at)]))}function bO(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${T(ln(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${T(ln(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=xg(n);return e==="info-qa"?`<h1>Ask a Question</h1>
1522
+ </article>`}function TO(t){return de(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${T(e.id)}</a>`,T(ln(e.workflow_name)),T(e.terminal_state??e.current_state??"queued"),T(e.started_at)]))}function SO(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${T(ln(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${T(ln(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=xg(n);return e==="info-qa"?`<h1>Ask a Question</h1>
1523
1523
  <form method="post" action="/layman/start/info-qa">
1524
1524
  ${s}
1525
1525
  <label>Ask anything<textarea name="question" rows="8" required></textarea></label>
@@ -1532,13 +1532,13 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1532
1532
  <label>Slug<input name="slug" placeholder="my-document" required></label>
1533
1533
  <label>Output directory<input name="output_dir" value="drafts"></label>
1534
1534
  <button type="submit">Start Document Wizard</button>
1535
- </form>`:Ag(n,"/layman/start/newspaper")}function xg(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${T(e.id)}">${T(e.name)}</option>`).join("")}</select></label>`}async function TO(t,e,r){let n=await t.req.parseBody(),s=Lg(e,n);if(s===null)return t.html($e("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html($e("Start workflow",`<p class="error">${T(ln(r))} is not loaded.</p>`),400);let i=r==="info-qa"?SO(n):kO(n);if(typeof i=="string")return t.html($e("Start workflow",`<p class="error">${T(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await kr({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function SO(t){let e=Je(t.question).trim();if(e.length===0)return"Enter a question.";let r=Je(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function kO(t){let e=Je(t.task_description).trim(),r=qO(Je(t.slug).trim()),n=Je(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function vO(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${T(ln(r))}</h1>
1536
- <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${xO(t,e,r)}`;let s=Cg(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${IO(e,s)}`:`${n}<section hx-get="/layman/run/${T(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1535
+ </form>`:Ag(n,"/layman/start/newspaper")}function xg(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${T(e.id)}">${T(e.name)}</option>`).join("")}</select></label>`}async function kO(t,e,r){let n=await t.req.parseBody(),s=Lg(e,n);if(s===null)return t.html($e("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html($e("Start workflow",`<p class="error">${T(ln(r))} is not loaded.</p>`),400);let i=r==="info-qa"?vO(n):IO(n);if(typeof i=="string")return t.html($e("Start workflow",`<p class="error">${T(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await kr({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function vO(t){let e=Je(t.question).trim();if(e.length===0)return"Enter a question.";let r=Je(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function IO(t){let e=Je(t.task_description).trim(),r=JO(Je(t.slug).trim()),n=Je(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function $O(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${T(ln(r))}</h1>
1536
+ <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${AO(t,e,r)}`;let s=Cg(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${NO(e,s)}`:`${n}<section hx-get="/layman/run/${T(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1537
1537
  <h2>Running</h2>
1538
1538
  <p class="muted">Current stage: <strong>${T(e.current_state??"starting")}</strong></p>
1539
1539
  ${jg(e)}
1540
- </section>`}function jg(t){let e=t.steps.map(r=>[T(r.id),T(`\u25B6 ${r.state_name}`),T(r.outcome??"running"),T(r.status_detail??"")]);return de(["step","stage","outcome","detail"],e)}function IO(t,e){return`<section class="metric paused-interactive">
1541
- <h2>${T(FO(e.state_name))}</h2>
1540
+ </section>`}function jg(t){let e=t.steps.map(r=>[T(r.id),T(`\u25B6 ${r.state_name}`),T(r.outcome??"running"),T(r.status_detail??"")]);return de(["step","stage","outcome","detail"],e)}function NO(t,e){return`<section class="metric paused-interactive">
1541
+ <h2>${T(WO(e.state_name))}</h2>
1542
1542
  <p class="muted">The agent is waiting for your response.</p>
1543
1543
  <h3>Agent output</h3>
1544
1544
  <div class="metric">${Qc(e.last_agent_output??"")}</div>
@@ -1548,17 +1548,17 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1548
1548
  <button type="submit" name="done" value="false">Send response</button>
1549
1549
  <button type="submit" name="done" value="true">Done with this stage</button>
1550
1550
  </form>
1551
- </section>`}async function $O(t,e){let r=Si(t,"id"),n=await t.req.parseBody(),s=Number(Je(n.step_id)),o=Je(n.input),i=Je(n.done)==="true";if(!Number.isInteger(s))return t.html($e("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(NO(e,a.run.id),await kr({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html($e("Interactive response",`<p class="error">Could not submit response: ${T(a.reason)}</p>`),400)}function NO(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(!Yc(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>Yc(i)&&i.name===r.current_state&&typeof i.id=="string");Yc(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function xO(t,e,r){let n=UO(e.terminal_state);return`<section class="metric terminal-run">
1551
+ </section>`}async function xO(t,e){let r=Si(t,"id"),n=await t.req.parseBody(),s=Number(Je(n.step_id)),o=Je(n.input),i=Je(n.done)==="true";if(!Number.isInteger(s))return t.html($e("Interactive response",'<p class="error">Missing interactive step.</p>'),400);let a=e.resumeInteractive(s,o,i);return a.resumed?(jO(e,a.run.id),await kr({dal:e,worker_id:`layman-respond-${Date.now()}`}),t.redirect(`/layman/run/${r}`,302)):t.html($e("Interactive response",`<p class="error">Could not submit response: ${T(a.reason)}</p>`),400)}function jO(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(!Yc(s)||s.definition_schema_version!==3||!Array.isArray(s.steps))return;let o=s.steps.find(i=>Yc(i)&&i.name===r.current_state&&typeof i.id=="string");Yc(o)&&typeof o.id=="string"&&t.setRunCurrentState(r.id,o.id)}catch{return}}function AO(t,e,r){let n=BO(e.terminal_state);return`<section class="metric terminal-run">
1552
1552
  <h2>${n?"Complete":"Stopped"}</h2>
1553
1553
  <p>Status: <strong>${T(e.terminal_state)}</strong></p>
1554
- ${n?jO(t,e,r):RO(e)}
1554
+ ${n?RO(t,e,r):CO(e)}
1555
1555
  <h2>Stage Log</h2>
1556
1556
  ${jg(e)}
1557
- </section>`}function jO(t,e,r){if(r==="info-qa"){let n=Zc(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Qc(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return AO(t,e);if(r==="newspaper"){let n=Zc(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Qc(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function AO(t,e){let r=wr(t,e.id),n=Kc(r,["render_docx"]),s=Kc(r,["render_xlsx"]),o=Zc(e,["review:coder[0]_transcript","chat_output_md"])??OO(Kc(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${T(a)}">${T(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1558
- <pre>${T(BO(WO(o??"No preview available."),30))}</pre>
1557
+ </section>`}function RO(t,e,r){if(r==="info-qa"){let n=Zc(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Qc(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return OO(t,e);if(r==="newspaper"){let n=Zc(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Qc(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function OO(t,e){let r=wr(t,e.id),n=Kc(r,["render_docx"]),s=Kc(r,["render_xlsx"]),o=Zc(e,["review:coder[0]_transcript","chat_output_md"])??LO(Kc(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${T(a)}">${T(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1558
+ <pre>${T(HO(qO(o??"No preview available."),30))}</pre>
1559
1559
  <h3>Downloads</h3>
1560
- ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function RO(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${T(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function Zc(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Kc(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function OO(t){if(t===null||!hO(t)||!t.endsWith(".md"))return null;try{return _O(t,"utf8")}catch{return null}}function CO(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1561
- ${LO(Og(t))}
1560
+ ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function CO(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${T(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function Zc(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Kc(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function LO(t){if(t===null||!gO(t)||!t.endsWith(".md"))return null;try{return wO(t,"utf8")}catch{return null}}function MO(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1561
+ ${DO(Og(t))}
1562
1562
  <h2>Add Subscription</h2>
1563
1563
  ${e.length===0?'<p class="error">Create a project before subscribing.</p>':Ag(e,"/layman/newspaper")}`}function Ag(t,e){return`<form method="post" action="${T(e)}">
1564
1564
  ${xg(t)}
@@ -1571,7 +1571,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1571
1571
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1572
1572
  <label>Output directory<input name="output_dir" value="digests"></label>
1573
1573
  <button type="submit">Create subscription</button>
1574
- </form>`}async function vg(t,e){let r=await t.req.parseBody(),n=Lg(e,r);if(n===null)return t.html($e("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html($e("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Je(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html($e("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Je(r.output_dir).trim()||"digests",schedule:PO(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function Ig(t,e){let r=Si(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function LO(t){return de(["id","project","topics","status","action"],t.map(e=>{let r=HO(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[T(e.id),T(e.project_name),T(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function Rg(t){let e=Og(t);return{workflows:ki,recent_runs:DO(t),newspaper_subscriptions:e.length}}function MO(t,e){let r=Cg(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 DO(t){return t.query(`SELECT r.*, w.name AS workflow_name
1574
+ </form>`}async function vg(t,e){let r=await t.req.parseBody(),n=Lg(e,r);if(n===null)return t.html($e("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html($e("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Je(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html($e("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Je(r.output_dir).trim()||"digests",schedule:UO(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function Ig(t,e){let r=Si(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function DO(t){return de(["id","project","topics","status","action"],t.map(e=>{let r=GO(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[T(e.id),T(e.project_name),T(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function Rg(t){let e=Og(t);return{workflows:ki,recent_runs:FO(t),newspaper_subscriptions:e.length}}function PO(t,e){let r=Cg(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 FO(t){return t.query(`SELECT r.*, w.name AS workflow_name
1575
1575
  FROM run r
1576
1576
  JOIN workflow w ON w.id = r.workflow_id
1577
1577
  WHERE w.name IN (${zc.map(()=>"?").join(",")})
@@ -1581,30 +1581,30 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1581
1581
  JOIN workflow w ON w.id = pw.workflow_id
1582
1582
  JOIN project p ON p.id = pw.project_id
1583
1583
  WHERE w.name = ?
1584
- ORDER BY pw.id DESC`,"newspaper")}function Cg(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Lg(t,e){let r=Number(Je(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function PO(t){let e=Je(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Je(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function $g(t){let e=t.req.param("workflow");return zc.includes(e)?e:null}function ln(t){return ki.find(e=>e.name===t)?.title??t}function FO(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Qc(t){return gO.parse(t,{async:!1})}function UO(t){return t==="done"||t==="pr_ready"||t==="merged"}function WO(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function BO(t,e){return t.split(`
1584
+ ORDER BY pw.id DESC`,"newspaper")}function Cg(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function Lg(t,e){let r=Number(Je(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function UO(t){let e=Je(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Je(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function $g(t){let e=t.req.param("workflow");return zc.includes(e)?e:null}function ln(t){return ki.find(e=>e.name===t)?.title??t}function WO(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Qc(t){return yO.parse(t,{async:!1})}function BO(t){return t==="done"||t==="pr_ready"||t==="merged"}function qO(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function HO(t,e){return t.split(`
1585
1585
  `).slice(0,e).join(`
1586
- `)}function qO(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Je(t){return typeof t=="string"?t:""}function HO(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 Yc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Si(t,e){return Number(t.req.param(e))}var ki,zc,Mg=b(()=>{"use strict";os();$t();Ac();ki=[{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."}],zc=ki.map(t=>t.name)});function GO(t){return t.replace(/^\/+/,"")}function Dg(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function cn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=GO(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 Dg(t.userId)&&Dg(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${JO}/${t.identityId}/`}function VO(t){return String(Math.max(0,Math.floor(t))).padStart(XO,"0")}function eu(t,e,r){return`${t}${e}${VO(r)}.json`}function vi(t,e){return`${t}${e}`}function Ii(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var JO,XO,$i=b(()=>{"use strict";JO="mailbox";XO=12});function Ot(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Ni[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=Ni[a&15]+i,a=a>>4;let l=Ni[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Ni[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Ni,xi=b(()=>{"use strict";Ni="0123456789abcdef"});function ru(t,e){return!Number.isFinite(t)||t<=0?e:t}function nu(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 Bg(t){return t.conversation_id===Wg&&zO(t.payload)}function zO(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function ZO(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Bg(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Pg,Fg,Ug,KO,Wg,YO,tu,vr,ji=b(()=>{"use strict";$i();xi();Pg=3e3,Fg=1e4,Ug=12e3,KO=1e3,Wg="__lmctl_heartbeat__",YO={kind:"heartbeat"},tu={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},vr=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=cn({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=ru(e.readIntervalMs??e.pollIntervalMs??Pg,Pg),this.heartbeatIdleMs=ru(e.heartbeatIdleMs??Fg,Fg),this.backoffReadIntervalMs=ru(e.backoffReadIntervalMs??e.pollIntervalMs??Ug,Ug)}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??tu;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=vi(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:KO,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Ii(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:Ot(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=eu(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??tu;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=eu(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(nu(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Bg(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=ZO(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??tu;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(Wg,YO)}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 QO}from"@hono/node-server/conninfo";function qg(t,e){let r=e.bucket??eC,n=e.remoteAddressOf??(o=>rC(o)),s=o=>{let i=n(o);return nC(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=su(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return nu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:ou(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=su(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:ou(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=su(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=tC(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:ou(d)},500)}})}function su(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 tC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function rC(t){try{return QO(t).remote.address}catch{return}}function nC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function ou(t){return t instanceof Error?t.message:String(t)}var eC,Hg=b(()=>{"use strict";ji();eC="local"});function Jg(t,e){t.get("/mailbox/workspace",r=>iC(r,e)),t.get("/mailbox/projects",r=>aC(r,e)),t.get("/mailbox/projects/:id",r=>lC(r,e)),t.post("/mailbox/projects",r=>cC(r,e)),t.patch("/mailbox/projects/:id",r=>uC(r,e)),t.delete("/mailbox/projects/:id",r=>dC(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>fC(r,e)),t.get("/mailbox/prompts/:id",r=>mC(r,e))}function iC(t,e){e.dal.ensureWorkspace({id:dn,name:iu});let r=Gg(e.dal),n={id:dn,name:iu,created_at:oC,projects:r};return t.json({workspace:n})}function aC(t,e){return t.json({projects:Gg(e.dal)})}function lC(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(un)){let s=au(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Oi(s)})}let n=Vg(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Xg(n)})}async function cC(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:dn,name:iu});let s=e.dal.insertWebProject({workspace_id:dn,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:Oi(s)},201)}async function uC(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(un)){let o=au(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:Oi(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function dC(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(un)){let n=au(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 fC(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Vg(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${sC}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await pC({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${Ri}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function mC(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=hC(e.dal,r);return t.json({result:n})}function Gg(t){let e=t.listProjects().map(Xg),r=t.listWebProjectsActive(dn).map(Oi);return[...e,...r].sort(vC)}function Xg(t){return{id:`${Ri}${t.id}`,workspace_id:dn,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 Oi(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:`${un}${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 au(t,e){if(!e.startsWith(un))return null;let r=e.slice(un.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Vg(t,e){if(e.startsWith(Ri)){let n=e.slice(Ri.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 pC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(yc(),bh));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function hC(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=TC(t,o?.team_id??null),a=bC(s),l=SC(n,a,i.length>0),c=kC(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:_C(t,o.workflow_name),d=u.totalEstimatedMs,f=Kg(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:gC(t,s.id),g=wC(s,a,h,u.perStep,i),_=yC(h,u.perStep),S=EC(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Ai(d,f),...S},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,...Ai(d,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...Ai(d,f),...S},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,...Ai(d,f),...S},errors_json:null,duration_ms:c}}function _C(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function gC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function wC(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Kg(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function yC(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function EC(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Kg(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Ai(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function bC(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 TC(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 SC(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 kC(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 vC(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 Ri,un,sC,dn,iu,oC,Yg=b(()=>{"use strict";Ri="project:",un="web_project:",sC="prompt:",dn="default",iu="Default workspace",oC=new Date(0).toISOString()});import{Buffer as zg}from"node:buffer";function Zg(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 Qg(t){return NC[t]}function ew(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 IC,$C,Ci,NC,lu=b(()=>{"use strict";IC=1e4,$C=256*1024,Ci=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Zg(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,IC),this.pushByteCap=Zg(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,$C),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+=zg.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=${zg.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1586
+ `)}function JO(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Je(t){return typeof t=="string"?t:""}function GO(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 Yc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Si(t,e){return Number(t.req.param(e))}var ki,zc,Mg=b(()=>{"use strict";os();$t();Ac();ki=[{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."}],zc=ki.map(t=>t.name)});function VO(t){return t.replace(/^\/+/,"")}function Dg(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function cn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=VO(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 Dg(t.userId)&&Dg(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${XO}/${t.identityId}/`}function YO(t){return String(Math.max(0,Math.floor(t))).padStart(KO,"0")}function eu(t,e,r){return`${t}${e}${YO(r)}.json`}function vi(t,e){return`${t}${e}`}function Ii(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var XO,KO,$i=b(()=>{"use strict";XO="mailbox";KO=12});function Ot(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Ni[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=Ni[a&15]+i,a=a>>4;let l=Ni[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Ni[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Ni,xi=b(()=>{"use strict";Ni="0123456789abcdef"});function ru(t,e){return!Number.isFinite(t)||t<=0?e:t}function nu(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 Bg(t){return t.conversation_id===Wg&&QO(t.payload)}function QO(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function eC(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Bg(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var Pg,Fg,Ug,zO,Wg,ZO,tu,vr,ji=b(()=>{"use strict";$i();xi();Pg=3e3,Fg=1e4,Ug=12e3,zO=1e3,Wg="__lmctl_heartbeat__",ZO={kind:"heartbeat"},tu={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},vr=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=cn({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=ru(e.readIntervalMs??e.pollIntervalMs??Pg,Pg),this.heartbeatIdleMs=ru(e.heartbeatIdleMs??Fg,Fg),this.backoffReadIntervalMs=ru(e.backoffReadIntervalMs??e.pollIntervalMs??Ug,Ug)}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??tu;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=vi(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:zO,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Ii(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:Ot(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=eu(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??tu;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=eu(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(nu(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Bg(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=eC(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??tu;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(Wg,ZO)}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 tC}from"@hono/node-server/conninfo";function qg(t,e){let r=e.bucket??rC,n=e.remoteAddressOf??(o=>sC(o)),s=o=>{let i=n(o);return oC(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=su(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return nu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:ou(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=su(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:ou(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=su(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=nC(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:ou(d)},500)}})}function su(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 nC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function sC(t){try{return tC(t).remote.address}catch{return}}function oC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function ou(t){return t instanceof Error?t.message:String(t)}var rC,Hg=b(()=>{"use strict";ji();rC="local"});function Jg(t,e){t.get("/mailbox/workspace",r=>lC(r,e)),t.get("/mailbox/projects",r=>cC(r,e)),t.get("/mailbox/projects/:id",r=>uC(r,e)),t.post("/mailbox/projects",r=>dC(r,e)),t.patch("/mailbox/projects/:id",r=>fC(r,e)),t.delete("/mailbox/projects/:id",r=>mC(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>pC(r,e)),t.get("/mailbox/prompts/:id",r=>hC(r,e))}function lC(t,e){e.dal.ensureWorkspace({id:dn,name:iu});let r=Gg(e.dal),n={id:dn,name:iu,created_at:aC,projects:r};return t.json({workspace:n})}function cC(t,e){return t.json({projects:Gg(e.dal)})}function uC(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(un)){let s=au(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:Oi(s)})}let n=Vg(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Xg(n)})}async function dC(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:dn,name:iu});let s=e.dal.insertWebProject({workspace_id:dn,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:Oi(s)},201)}async function fC(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(un)){let o=au(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:Oi(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function mC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(un)){let n=au(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 pC(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Vg(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${iC}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await _C({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${Ri}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function hC(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=gC(e.dal,r);return t.json({result:n})}function Gg(t){let e=t.listProjects().map(Xg),r=t.listWebProjectsActive(dn).map(Oi);return[...e,...r].sort($C)}function Xg(t){return{id:`${Ri}${t.id}`,workspace_id:dn,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 Oi(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:`${un}${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 au(t,e){if(!e.startsWith(un))return null;let r=e.slice(un.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Vg(t,e){if(e.startsWith(Ri)){let n=e.slice(Ri.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 _C(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(yc(),bh));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function gC(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=kC(t,o?.team_id??null),a=SC(s),l=vC(n,a,i.length>0),c=IC(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:wC(t,o.workflow_name),d=u.totalEstimatedMs,f=Kg(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:yC(t,s.id),g=EC(s,a,h,u.perStep,i),_=bC(h,u.perStep),S=TC(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Ai(d,f),...S},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,...Ai(d,f),...S},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:i,...Ai(d,f),...S},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,...Ai(d,f),...S},errors_json:null,duration_ms:c}}function wC(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function yC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function EC(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Kg(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function bC(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function TC(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Kg(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Ai(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function SC(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 kC(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 vC(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 IC(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 $C(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 Ri,un,iC,dn,iu,aC,Yg=b(()=>{"use strict";Ri="project:",un="web_project:",iC="prompt:",dn="default",iu="Default workspace",aC=new Date(0).toISOString()});import{Buffer as zg}from"node:buffer";function Zg(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 Qg(t){return jC[t]}function ew(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 NC,xC,Ci,jC,lu=b(()=>{"use strict";NC=1e4,xC=256*1024,Ci=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Zg(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,NC),this.pushByteCap=Zg(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,xC),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+=zg.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=${zg.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1587
1587
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1588
- `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};NC={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 rw(t,e){t.post("/mailbox/terminal/launch",r=>xC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>jC(r,e)),t.get("/mailbox/terminal/sessions",r=>AC(r,e))}async function xC(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"||!tw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=ew(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Qg(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function jC(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||!tw.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 AC(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 tw,nw=b(()=>{"use strict";lu();tw=/^[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 RC}from"node:buffer";function LC(t){try{return RC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function sw(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 ow(t){return MC[t]}function iw(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var OC,CC,Li,MC,cu=b(()=>{"use strict";OC=2e3,CC=64*1024,Li=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=sw(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,OC),this.pushByteCap=sw(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,CC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=LC(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};MC={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 lw(t,e){t.post("/mailbox/chat/launch",r=>DC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>PC(r,e)),t.get("/mailbox/chat/sessions",r=>FC(r,e))}async function DC(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"||!aw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=iw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ow(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function PC(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||!aw.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 FC(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 aw,cw=b(()=>{"use strict";cu();aw=/^[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 UC}from"node:fs";function dw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return uw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=UC(e.path,{encoding:"utf8"});return uw(r)}catch{return[]}}function uw(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 fw=b(()=>{"use strict"});function mw(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function Mi(t,e){let r=t.query(`SELECT id, kind FROM attention
1588
+ `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};jC={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 rw(t,e){t.post("/mailbox/terminal/launch",r=>AC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>RC(r,e)),t.get("/mailbox/terminal/sessions",r=>OC(r,e))}async function AC(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"||!tw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=ew(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Qg(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function RC(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||!tw.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 OC(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 tw,nw=b(()=>{"use strict";lu();tw=/^[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 CC}from"node:buffer";function DC(t){try{return CC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function sw(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 ow(t){return PC[t]}function iw(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var LC,MC,Li,PC,cu=b(()=>{"use strict";LC=2e3,MC=64*1024,Li=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=sw(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,LC),this.pushByteCap=sw(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,MC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=DC(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};PC={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 lw(t,e){t.post("/mailbox/chat/launch",r=>FC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>UC(r,e)),t.get("/mailbox/chat/sessions",r=>WC(r,e))}async function FC(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"||!aw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=iw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ow(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function UC(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||!aw.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 WC(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 aw,cw=b(()=>{"use strict";cu();aw=/^[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 BC}from"node:fs";function dw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return uw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=BC(e.path,{encoding:"utf8"});return uw(r)}catch{return[]}}function uw(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 fw=b(()=>{"use strict"});function mw(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function Mi(t,e){let r=t.query(`SELECT id, kind FROM attention
1589
1589
  WHERE run_id = ?
1590
1590
  AND acknowledged_at IS NULL
1591
1591
  AND requires_user = 1
1592
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Di=b(()=>{"use strict"});function Sw(t,e){t.all("/runtime/*",r=>WC(r.req.raw,e))}async function WC(t,e){try{return Response.json(await BC(t,e))}catch(r){if(r instanceof se)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 BC(t,e){let r=new URL(t.url),n=KC(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return uu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Pi(t,n.id,s[2]),qC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Pi(t,n.id,s[2]);let o=hw(e.dal,s[4]);return pw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return uu(t),e.dal.listTeams().map(o=>VC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=_w(e.dal,gw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead chat body does not match route team");return yw(t,n.id,i.context),ww(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=_w(e.dal,gw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead message body does not match route team");yw(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return ww(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Pi(t,n.id,s[2]);let o=hw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new se(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return GC(e.dal,o,a),pw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return is(t,n.id),e.dal.listWorkflows().map(o=>YC(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){is(t,n.id);let o=ZC(e.dal,s[2]);return zC(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){is(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return QC(e.dal,o,i).map(l=>bw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){is(t,n.id);let o=Ew(e.dal,s[2]);return bw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){is(t,n.id);let o=Ew(e.dal,s[2]),i=tL(e.dal,o);return{runId:hu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function qC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>kw(t,e,r))}}function pw(t,e,r){let n=kw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:HC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:JC(t,r)}}function kw(t,e,r){let n=vw(t,r.id),s=fu(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 HC(t,e){let r=vw(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:fu(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 JC(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 GC(t,e,r){let n=XC(t,e.id);if(n!==null){let s=Mi(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new se(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=mt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new se(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function vw(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 XC(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 fu(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 hw(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function _w(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new se(404,`team not found: ${e}`);return r}function gw(t){return t.startsWith("team:")?t.slice(5):t}function VC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function ww(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??Tw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function KC(t){let e=t.workspaceName??yn()??lr.default;return{id:e,name:e}}function uu(t){if(t.headers.get("x-lmctl-workspace-id")!==Tw)throw new se(400,"runtime request requires global-admin workspace identity")}function Pi(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new se(400,"runtime workspace identity does not match route")}function is(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==e)throw new se(400,"runtime workspace identity does not match server workspace")}function yw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Pi(t,e,r.workspaceId);return}uu(t)}function mu(t){return`${fn}${pu(t.name)}`}function pu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function hu(t){return`${du}${t.id}`}function YC(t){let e=Fi(t.definition);return{id:mu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function zC(t){let e=Fi(t.definition);return{id:mu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Fi(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function ZC(t,e){if(!e.startsWith(fn))throw new se(404,`template not found: ${e}`);let r=e.slice(fn.length),n=t.listWorkflows().filter(s=>pu(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new se(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Ew(t,e){if(!e.startsWith(du))throw new se(404,`run not found: ${e}`);let r=e.slice(du.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new se(404,`run not found: ${e}`);return s}function QC(t,e,r){if(r!==null){if(!r.startsWith(fn))return[];let s=r.slice(fn.length),o=t.listWorkflows().filter(a=>pu(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function bw(t,e){let r=t.getWorkflow(e.workflow_id),n=fu(e),s=eL(r,e);return{id:hu(e),templateId:r===null?`${fn}unknown`:mu(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 eL(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]:[Fi(t.definition).nameToId.get(r)??r]}function tL(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Fi(r.definition),s=c=>n.nameToId.get(c)??c,o=hu(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=rL(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),d=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function rL(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 Tw,fn,du,se,Iw=b(()=>{"use strict";Ge();Di();$t();Tw="global-admin";fn="template:",du="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as nL,writeFileSync as sL}from"node:fs";import{randomUUID as $w}from"node:crypto";import{dirname as oL,resolve as Ui,sep as Nw}from"node:path";async function jw(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(!uL(n))return t.text("missing image file",400);if(n.size>iL)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=dL(s);if(o===null||!(o in xw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=aL(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Ui(cL()):Ui(i.local_path),l=Ui(a,"uploads",$w()),c=Ui(l,`${$w()}${xw[o]}`);if(!lL(c,a))return t.text("invalid upload path",400);nL(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);sL(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function aL(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function lL(t,e){let r=e.endsWith(Nw)?e:`${e}${Nw}`;return t.startsWith(r)}function cL(){return oL(ce())}function uL(t){return typeof File<"u"&&t instanceof File}function dL(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 iL,xw,Aw=b(()=>{"use strict";Ge();iL=10*1024*1024,xw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Wi}from"node:fs";import{basename as fL,dirname as mL,extname as pL,isAbsolute as hL,join as _L,relative as gL}from"node:path";import{fileURLToPath as wL}from"node:url";import{Hono as yL}from"hono";import{serveStatic as ht}from"@hono/node-server/serve-static";function Pw(t){let e=new yL,r=[],n=t.localWebui!==void 0?gu(t.localWebui.webuiDir):EL();if(t.localWebui!==void 0&&qg(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=bL();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,ht({root:n})),e.use("/vendor/*",s,ht({root:n})),e.use("/src/*",s,ht({root:n})),e.get("/",s,ht({root:n,path:"index.html"})),e.get("/admin",s,ht({root:n,path:"index.html"})),e.get("/admin/*",s,ht({root:n,path:"index.html"})),e.get("/terminal",s,ht({root:n,path:"index.html"})),e.get("/terminal/*",s,ht({root:n,path:"index.html"})),e.get("/chat",s,ht({root:n,path:"index.html"})),e.get("/chat/*",s,ht({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("*",Nh()),e.get("/login",s=>s.html($e("Login",`
1592
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Di=b(()=>{"use strict"});function Sw(t,e){t.all("/runtime/*",r=>qC(r.req.raw,e))}async function qC(t,e){try{return Response.json(await HC(t,e))}catch(r){if(r instanceof se)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 HC(t,e){let r=new URL(t.url),n=zC(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return uu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Pi(t,n.id,s[2]),JC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Pi(t,n.id,s[2]);let o=hw(e.dal,s[4]);return pw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return uu(t),e.dal.listTeams().map(o=>YC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=_w(e.dal,gw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead chat body does not match route team");return yw(t,n.id,i.context),ww(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=_w(e.dal,gw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new se(400,"runtime lead message body does not match route team");yw(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime lead message requires draft.body");return ww(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Pi(t,n.id,s[2]);let o=hw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new se(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new se(400,"runtime workflow message requires draft.body");return VC(e.dal,o,a),pw(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return is(t,n.id),e.dal.listWorkflows().map(o=>ZC(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){is(t,n.id);let o=eL(e.dal,s[2]);return QC(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){is(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new se(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return tL(e.dal,o,i).map(l=>bw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){is(t,n.id);let o=Ew(e.dal,s[2]);return bw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){is(t,n.id);let o=Ew(e.dal,s[2]),i=nL(e.dal,o);return{runId:hu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new se(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function JC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>kw(t,e,r))}}function pw(t,e,r){let n=kw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:GC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:XC(t,r)}}function kw(t,e,r){let n=vw(t,r.id),s=fu(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 GC(t,e){let r=vw(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:fu(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 XC(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 VC(t,e,r){let n=KC(t,e.id);if(n!==null){let s=Mi(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new se(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=mt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new se(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new se(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function vw(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 KC(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 fu(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 hw(t,e){let r=t.findProjectByName(e);if(r===null)throw new se(404,`project not found: ${e}`);return r}function _w(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new se(404,`team not found: ${e}`);return r}function gw(t){return t.startsWith("team:")?t.slice(5):t}function YC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function ww(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??Tw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function zC(t){let e=t.workspaceName??yn()??lr.default;return{id:e,name:e}}function uu(t){if(t.headers.get("x-lmctl-workspace-id")!==Tw)throw new se(400,"runtime request requires global-admin workspace identity")}function Pi(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new se(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new se(400,"runtime workspace identity does not match route")}function is(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new se(400,"runtime request requires workspace identity");if(r!==e)throw new se(400,"runtime workspace identity does not match server workspace")}function yw(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new se(400,"workspace manager context requires workspace identity");Pi(t,e,r.workspaceId);return}uu(t)}function mu(t){return`${fn}${pu(t.name)}`}function pu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function hu(t){return`${du}${t.id}`}function ZC(t){let e=Fi(t.definition);return{id:mu(t),name:t.name,...e.description===null?{}:{description:e.description}}}function QC(t){let e=Fi(t.definition);return{id:mu(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function Fi(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function eL(t,e){if(!e.startsWith(fn))throw new se(404,`template not found: ${e}`);let r=e.slice(fn.length),n=t.listWorkflows().filter(s=>pu(s.name)===r);if(n.length===0)throw new se(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new se(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Ew(t,e){if(!e.startsWith(du))throw new se(404,`run not found: ${e}`);let r=e.slice(du.length);if(!/^[1-9]\d*$/.test(r))throw new se(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new se(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new se(404,`run not found: ${e}`);return s}function tL(t,e,r){if(r!==null){if(!r.startsWith(fn))return[];let s=r.slice(fn.length),o=t.listWorkflows().filter(a=>pu(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function bw(t,e){let r=t.getWorkflow(e.workflow_id),n=fu(e),s=rL(r,e);return{id:hu(e),templateId:r===null?`${fn}unknown`:mu(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 rL(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]:[Fi(t.definition).nameToId.get(r)??r]}function nL(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Fi(r.definition),s=c=>n.nameToId.get(c)??c,o=hu(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=sL(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),d=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function sL(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 Tw,fn,du,se,Iw=b(()=>{"use strict";Ge();Di();$t();Tw="global-admin";fn="template:",du="run:";se=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as oL,writeFileSync as iL}from"node:fs";import{randomUUID as $w}from"node:crypto";import{dirname as aL,resolve as Ui,sep as Nw}from"node:path";async function jw(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(!fL(n))return t.text("missing image file",400);if(n.size>lL)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=mL(s);if(o===null||!(o in xw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=cL(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?Ui(dL()):Ui(i.local_path),l=Ui(a,"uploads",$w()),c=Ui(l,`${$w()}${xw[o]}`);if(!uL(c,a))return t.text("invalid upload path",400);oL(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);iL(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function cL(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function uL(t,e){let r=e.endsWith(Nw)?e:`${e}${Nw}`;return t.startsWith(r)}function dL(){return aL(ce())}function fL(t){return typeof File<"u"&&t instanceof File}function mL(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 lL,xw,Aw=b(()=>{"use strict";Ge();lL=10*1024*1024,xw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as Wi}from"node:fs";import{basename as pL,dirname as hL,extname as _L,isAbsolute as gL,join as wL,relative as yL}from"node:path";import{fileURLToPath as EL}from"node:url";import{Hono as bL}from"hono";import{serveStatic as ht}from"@hono/node-server/serve-static";function Pw(t){let e=new bL,r=[],n=t.localWebui!==void 0?gu(t.localWebui.webuiDir):TL();if(t.localWebui!==void 0&&qg(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=SL();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,ht({root:n})),e.use("/vendor/*",s,ht({root:n})),e.use("/src/*",s,ht({root:n})),e.get("/",s,ht({root:n,path:"index.html"})),e.get("/admin",s,ht({root:n,path:"index.html"})),e.get("/admin/*",s,ht({root:n,path:"index.html"})),e.get("/terminal",s,ht({root:n,path:"index.html"})),e.get("/terminal/*",s,ht({root:n,path:"index.html"})),e.get("/chat",s,ht({root:n,path:"index.html"})),e.get("/chat/*",s,ht({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("*",Nh()),e.get("/login",s=>s.html($e("Login",`
1593
1593
  <h1>Login</h1>
1594
1594
  <form method="post" action="/login">
1595
1595
  <label>Token <input name="token" type="password"></label>
1596
1596
  <button type="submit">Login</button>
1597
1597
  </form>
1598
- `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return jh(i)?(vc(s,i),s.redirect("/",302)):s.html($e("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Ah(s),s.redirect("/login",302))),Ng(e,{dal:t.dal}),Sw(e,{dal:t.dal}),Jg(e,{dal:t.dal}),rw(e,{terminalSessionManager:t.terminalSessionManager}),lw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Ln(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await jl(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return U(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${T(f.team)}: seeded [${f.seeded.map(m=>T(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${T(m.alias)}: ${T(m.error)}`).join(", ")}]`:""}</p>`)}),Ph(e,{dal:t.dal}),Jh(e,{dal:t.dal}),e.get("/api/status",s=>U(s,wo(t.dal),NL)),e.get("/api/projects",s=>U(s,yo(t.dal),xL)),e.get("/api/teams",s=>U(s,ep(t.dal),RL)),e.get("/api/workflows",s=>U(s,Eo(t.dal),OL)),e.get("/api/workflows/verify",s=>{let o=fg();return s.req.header("accept")?.includes("text/plain")?s.text(pg(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,tp(t.dal,{status:s.req.query("status")}),CL)),e.post("/api/uploads",s=>jw(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=bo(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return U(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(os(),kg)),i=bo(t.dal,Q(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():U(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():U(s,t.dal.listProjectWorkflows(o.id),jL)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await mn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{Yt(u)}catch{return s.text("invalid condition",400)}let d=kL(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return U(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(Q(s,"id"))?U(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(Q(s,"id"),!0);return o===null?s.notFound():U(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(Q(s,"id"),!1);return o===null?s.notFound():U(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=Ow(s.req.query("status"),vL);if(typeof i=="string")return s.text(i,400);let a=Ow(s.req.query("severity"),Uw);return typeof a=="string"?s.text(a,400):U(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),AL)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await mn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=IL(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=$L(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return U(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=Q(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await mn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):U(s,c,le)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await mn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):U(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(Q(s,"id"));if(o===null)return s.notFound();let i=await mn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return U(s,t.dal.closeIssue(Q(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(Q(s,"id"));if(o===null)return s.notFound();let i=await mn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return U(s,t.dal.reopenIssue(Q(s,"id"),a),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return U(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=Q(s,"run_id"),i=s.req.query("kind"),a=wr(t.dal,o,i);return U(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=Q(s,"run_id"),i=s.req.param("kind"),a=wr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):U(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=TL(l.path);if(SL(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=fL(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return U(s,l,le)}return U(s,l,le)}),e.get("/api/runs",s=>U(s,Br(t.dal,{limit:_u(s,"limit")??100}),LL)),e.get("/api/runs/:id",s=>{let o=gr(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,ML)}),e.get("/api/runs/:id/where",s=>{let o=qr(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(So(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=ko(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(vo(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(Q(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(Bi(t.daemon),U(s,i,Cw)):U(s,i,Cw,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=Q(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Bi(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=>Rw(s,t.dal,o=>U(s,o,PL))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=op(t.dal,Q(s,"id"),Q(s,"step_id"));return o===null?s.notFound():Fw(s)?s.html(`<pre>${T(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>Rw(s,t.dal,o=>{let i=dw(o);return U(s,i,a=>de(["role","text"],a.map(l=>[T(l.role),T(l.text)])))})),e.get("/api/external-objects",s=>U(s,ip(t.dal,{type:s.req.query("type")}),FL)),e.get("/api/external-signals",s=>U(s,ap(t.dal,{unhandled:s.req.query("unhandled")==="true"}),UL)),e.get("/api/attentions",s=>U(s,Xt(t.dal,{unacked:s.req.query("unacked")==="true"}),WL)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(Q(s,"id"));return o===null?s.notFound():U(s,o,i=>`<p>acknowledged attention ${T(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=To(t.dal,l);return U(s,c,u=>`<h1>Escalations</h1>${de(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[T(d.attention_id),T(d.project),T(d.run_id),T(d.workflow_name),T(d.state_name),T((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=mt(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=Q(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=mt(t.dal,o);if(c===null)return s.notFound();let u=Xt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Bi(t.daemon);let p=Xt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return Bi(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=rp(t.dal,{status:i,pr_url:o});return U(s,a,BL)}),e.get("/api/submitted-prs/:id",s=>{let o=Q(s,"id"),i=np(t.dal,o);return i===null?s.notFound():U(s,i,qL)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),Lw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Ln(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),Lw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Ln(s.req.param("team_name"));try{let i=await Xm(t.dal,o,s.req.param("alias"));return U(s,i,a=>Mw("compacted",a.row))}catch(i){if(i instanceof Cn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Ln(s.req.param("team_name")),i=await jl(t.dal,o,s.req.param("alias"));return U(s,i,a=>Mw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,Dw)),e.post("/api/intake/scan",async s=>(r=await rn(t.dal),U(s,r,Dw))),e.get("/api/stats/run-throughput",s=>U(s,up(t.dal),HL)),e.get("/api/daemon/state",s=>U(s,t.daemon?.state??null,JL)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return U(s,{disabled:!0},le);let o=await t.daemon.runCycle();return U(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=Q(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=Dl(t.dal,o),l=Pl(t.dal,{project_id:o});return s.html($e(`Metrics \u2014 ${i.name}`,GL(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=Q(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=_u(s,"since_days");return s.json(Dl(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=Q(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=_u(s,"since_days");return s.json(Pl(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(Q(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function Rw(t,e,r){let n=Ml(e,Q(t,"id"),Q(t,"step_id"));return n===null?t.notFound():r(n)}function Bi(t){t!==void 0&&t.runCycle().catch(()=>{})}function U(t,e,r,n=200){return Fw(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 Fw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function EL(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Wi(`${t}/index.html`)?gu(t):null;let e="src/serve/webui-dist";if(Wi(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Wi(`${r}/index.html`))return r;let n=_L(mL(wL(import.meta.url)),"webui-dist");return Wi(`${n}/index.html`)?gu(n):null}function gu(t){if(!hL(t))return t;let e=gL(process.cwd(),t);return e.length===0?".":e}function bL(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function Q(t,e){return Number(t.req.param(e))}function _u(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 TL(t){switch(pL(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 SL(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function mn(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 kL(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 Ow(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 IL(t){if(t!=null)return typeof t=="string"&&Uw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function $L(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 NL(t){return`<h1>Status</h1><div class="grid">
1598
+ `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return jh(i)?(vc(s,i),s.redirect("/",302)):s.html($e("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Ah(s),s.redirect("/login",302))),Ng(e,{dal:t.dal}),Sw(e,{dal:t.dal}),Jg(e,{dal:t.dal}),rw(e,{terminalSessionManager:t.terminalSessionManager}),lw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Ln(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await jl(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return U(s,{team:o,seeded:u,failed:d},f=>`<p>refreshed team ${T(f.team)}: seeded [${f.seeded.map(m=>T(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${T(m.alias)}: ${T(m.error)}`).join(", ")}]`:""}</p>`)}),Ph(e,{dal:t.dal}),Jh(e,{dal:t.dal}),e.get("/api/status",s=>U(s,wo(t.dal),jL)),e.get("/api/projects",s=>U(s,yo(t.dal),AL)),e.get("/api/teams",s=>U(s,ep(t.dal),CL)),e.get("/api/workflows",s=>U(s,Eo(t.dal),LL)),e.get("/api/workflows/verify",s=>{let o=fg();return s.req.header("accept")?.includes("text/plain")?s.text(pg(o)):s.json(o)}),e.get("/api/jobs",s=>U(s,tp(t.dal,{status:s.req.query("status")}),ML)),e.post("/api/uploads",s=>jw(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=bo(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return U(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(os(),kg)),i=bo(t.dal,Q(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():U(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():U(s,t.dal.listProjectWorkflows(o.id),RL)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await mn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{Yt(u)}catch{return s.text("invalid condition",400)}let d=IL(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return U(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(Q(s,"id"))?U(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(Q(s,"id"),!0);return o===null?s.notFound():U(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(Q(s,"id"),!1);return o===null?s.notFound():U(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=Ow(s.req.query("status"),$L);if(typeof i=="string")return s.text(i,400);let a=Ow(s.req.query("severity"),Uw);return typeof a=="string"?s.text(a,400):U(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),OL)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await mn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=NL(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=xL(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return U(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=Q(s,"id"),i=t.dal.getIssue(o);if(i===null)return s.notFound();let a=await mn(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):U(s,c,le)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await mn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):U(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(Q(s,"id"));if(o===null)return s.notFound();let i=await mn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return U(s,t.dal.closeIssue(Q(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(Q(s,"id"));if(o===null)return s.notFound();let i=await mn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return U(s,t.dal.reopenIssue(Q(s,"id"),a),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return U(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=Q(s,"run_id"),i=s.req.query("kind"),a=wr(t.dal,o,i);return U(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=Q(s,"run_id"),i=s.req.param("kind"),a=wr(t.dal,o,i);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):U(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=kL(l.path);if(vL(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=pL(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return U(s,l,le)}return U(s,l,le)}),e.get("/api/runs",s=>U(s,Br(t.dal,{limit:_u(s,"limit")??100}),DL)),e.get("/api/runs/:id",s=>{let o=gr(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,PL)}),e.get("/api/runs/:id/where",s=>{let o=qr(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(So(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=ko(t.dal,Q(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(vo(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(Q(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(Bi(t.daemon),U(s,i,Cw)):U(s,i,Cw,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=Q(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(Bi(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=>Rw(s,t.dal,o=>U(s,o,UL))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=op(t.dal,Q(s,"id"),Q(s,"step_id"));return o===null?s.notFound():Fw(s)?s.html(`<pre>${T(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>Rw(s,t.dal,o=>{let i=dw(o);return U(s,i,a=>de(["role","text"],a.map(l=>[T(l.role),T(l.text)])))})),e.get("/api/external-objects",s=>U(s,ip(t.dal,{type:s.req.query("type")}),WL)),e.get("/api/external-signals",s=>U(s,ap(t.dal,{unhandled:s.req.query("unhandled")==="true"}),BL)),e.get("/api/attentions",s=>U(s,Xt(t.dal,{unacked:s.req.query("unacked")==="true"}),qL)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(Q(s,"id"));return o===null?s.notFound():U(s,o,i=>`<p>acknowledged attention ${T(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=To(t.dal,l);return U(s,c,u=>`<h1>Escalations</h1>${de(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[T(d.attention_id),T(d.project),T(d.run_id),T(d.workflow_name),T(d.state_name),T((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=mt(t.dal,Q(s,"id"));return o===null?s.notFound():U(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=Q(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=mt(t.dal,o);if(c===null)return s.notFound();let u=Xt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);Bi(t.daemon);let p=Xt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return Bi(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=rp(t.dal,{status:i,pr_url:o});return U(s,a,HL)}),e.get("/api/submitted-prs/:id",s=>{let o=Q(s,"id"),i=np(t.dal,o);return i===null?s.notFound():U(s,i,JL)}),e.get("/api/sessions",s=>U(s,t.dal.latestSessionSizes(),Lw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Ln(s.req.param("team_name"));return U(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),Lw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Ln(s.req.param("team_name"));try{let i=await Xm(t.dal,o,s.req.param("alias"));return U(s,i,a=>Mw("compacted",a.row))}catch(i){if(i instanceof Cn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Ln(s.req.param("team_name")),i=await jl(t.dal,o,s.req.param("alias"));return U(s,i,a=>Mw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>U(s,r,Dw)),e.post("/api/intake/scan",async s=>(r=await rn(t.dal),U(s,r,Dw))),e.get("/api/stats/run-throughput",s=>U(s,up(t.dal),GL)),e.get("/api/daemon/state",s=>U(s,t.daemon?.state??null,XL)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return U(s,{disabled:!0},le);let o=await t.daemon.runCycle();return U(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=Q(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=Dl(t.dal,o),l=Pl(t.dal,{project_id:o});return s.html($e(`Metrics \u2014 ${i.name}`,VL(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=Q(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=_u(s,"since_days");return s.json(Dl(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=Q(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=_u(s,"since_days");return s.json(Pl(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(Q(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function Rw(t,e,r){let n=Ml(e,Q(t,"id"),Q(t,"step_id"));return n===null?t.notFound():r(n)}function Bi(t){t!==void 0&&t.runCycle().catch(()=>{})}function U(t,e,r,n=200){return Fw(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 Fw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function TL(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return Wi(`${t}/index.html`)?gu(t):null;let e="src/serve/webui-dist";if(Wi(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(Wi(`${r}/index.html`))return r;let n=wL(hL(EL(import.meta.url)),"webui-dist");return Wi(`${n}/index.html`)?gu(n):null}function gu(t){if(!gL(t))return t;let e=yL(process.cwd(),t);return e.length===0?".":e}function SL(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function Q(t,e){return Number(t.req.param(e))}function _u(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 kL(t){switch(_L(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 vL(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function mn(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 IL(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 Ow(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 NL(t){if(t!=null)return typeof t=="string"&&Uw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function xL(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 jL(t){return`<h1>Status</h1><div class="grid">
1599
1599
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
1600
1600
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
1601
1601
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
1602
1602
  <div class="metric"><strong>${t.attentions.unacked}</strong><br>unacked attentions</div>
1603
- </div><p class="muted">generated ${T(t.generated_at)}</p>`}function xL(t){return`<h1>Projects</h1>${de(["id","name","workflow","team","path"],t.map(e=>[T(e.id),T(e.name),T(e.workflow_name),T(e.team_id),T(e.local_path)]))}`}function jL(t){return`<h1>Project Workflows</h1>${de(["id","workflow","condition","priority","enabled"],t.map(e=>[T(e.id),T(e.workflow_id),T(e.condition),T(e.priority),T(e.enabled)]))}`}function AL(t){return`<h1>Issues</h1>${de(["id","status","severity","title","ai test"],t.map(e=>[T(e.id),T(e.status),T(e.severity),T(e.title),T(e.ai_test_path)]))}`}function RL(t){return`<h1>Teams</h1>${de(["id","name","members"],t.map(e=>[T(e.id),T(e.name),T(e.members.map(r=>r.alias).join(", "))]))}`}function OL(t){return`<h1>Workflows</h1>${de(["id","name","version"],t.map(e=>[T(e.id),`<a href="/workflows/${encodeURIComponent(e.name)}">${T(e.name)}</a>`,T(e.version)]))}`}function CL(t){return`<h1>Jobs</h1>${de(["id","status","source","source_ref","run"],t.map(e=>[T(e.id),T(e.status),T(e.source),T(e.source_ref),T(e.run_id)]))}`}function LL(t){return`<h1>Runs</h1>${de(["id","job","current","terminal","started"],t.map(e=>[`<a href="/runs/${e.id}">${T(e.id)}</a>`,T(e.job_id),T(e.current_state),T(e.terminal_state),T(e.started_at)]))}`}function ML(t){let e=DL(t);return`<h1>Run ${T(t.id)}</h1>
1603
+ </div><p class="muted">generated ${T(t.generated_at)}</p>`}function AL(t){return`<h1>Projects</h1>${de(["id","name","workflow","team","path"],t.map(e=>[T(e.id),T(e.name),T(e.workflow_name),T(e.team_id),T(e.local_path)]))}`}function RL(t){return`<h1>Project Workflows</h1>${de(["id","workflow","condition","priority","enabled"],t.map(e=>[T(e.id),T(e.workflow_id),T(e.condition),T(e.priority),T(e.enabled)]))}`}function OL(t){return`<h1>Issues</h1>${de(["id","status","severity","title","ai test"],t.map(e=>[T(e.id),T(e.status),T(e.severity),T(e.title),T(e.ai_test_path)]))}`}function CL(t){return`<h1>Teams</h1>${de(["id","name","members"],t.map(e=>[T(e.id),T(e.name),T(e.members.map(r=>r.alias).join(", "))]))}`}function LL(t){return`<h1>Workflows</h1>${de(["id","name","version"],t.map(e=>[T(e.id),`<a href="/workflows/${encodeURIComponent(e.name)}">${T(e.name)}</a>`,T(e.version)]))}`}function ML(t){return`<h1>Jobs</h1>${de(["id","status","source","source_ref","run"],t.map(e=>[T(e.id),T(e.status),T(e.source),T(e.source_ref),T(e.run_id)]))}`}function DL(t){return`<h1>Runs</h1>${de(["id","job","current","terminal","started"],t.map(e=>[`<a href="/runs/${e.id}">${T(e.id)}</a>`,T(e.job_id),T(e.current_state),T(e.terminal_state),T(e.started_at)]))}`}function PL(t){let e=FL(t);return`<h1>Run ${T(t.id)}</h1>
1604
1604
  ${le({id:t.id,terminal_state:t.terminal_state,current_state:t.current_state,job_id:t.job_id})}
1605
1605
  ${e}
1606
1606
  <h2>Steps</h2>
1607
- ${de(["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">${T(r.id)}</span><div id="step-${r.id}"></div>`,T(r.state_name),T(r.outcome),T(r.status_detail)]))}`}function DL(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 ${T(r)}</h2><p>(workflow definition unparseable)</p></section>`}let s=n.states?.[r],o=s?.schema?.outcomes??[];if(o.length===0)return`<section class="pause"><h2>Paused at ${T(r)}</h2><p>(state has no declared outcomes)</p></section>`;let i=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 u=c!==""?c:i,d=o.map((f,m)=>`<label class="pause-outcome"><input type="radio" name="outcome" value="${T(f)}"${m===0?" checked":""}/> <code>${T(f)}</code></label>`).join(" ");return`<section class="pause" id="pause-section" style="border:2px solid #d28e00;background:#fff8e6;padding:1em;margin:1em 0;">
1607
+ ${de(["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">${T(r.id)}</span><div id="step-${r.id}"></div>`,T(r.state_name),T(r.outcome),T(r.status_detail)]))}`}function FL(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 ${T(r)}</h2><p>(workflow definition unparseable)</p></section>`}let s=n.states?.[r],o=s?.schema?.outcomes??[];if(o.length===0)return`<section class="pause"><h2>Paused at ${T(r)}</h2><p>(state has no declared outcomes)</p></section>`;let i=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 u=c!==""?c:i,d=o.map((f,m)=>`<label class="pause-outcome"><input type="radio" name="outcome" value="${T(f)}"${m===0?" checked":""}/> <code>${T(f)}</code></label>`).join(" ");return`<section class="pause" id="pause-section" style="border:2px solid #d28e00;background:#fff8e6;padding:1em;margin:1em 0;">
1608
1608
  <h2 style="margin-top:0;">\u2605 Paused at <code>${T(r)}</code> \u2014 operator decision required</h2>
1609
1609
  ${u!==""?`<blockquote style="border-left:3px solid #888;padding-left:0.8em;margin-left:0;color:#444;white-space:pre-wrap;">${T(u)}</blockquote>`:""}
1610
1610
  <form hx-post="/api/runs/${T(t.id)}/resume" hx-target="#pause-result" hx-swap="innerHTML">
@@ -1615,11 +1615,11 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1615
1615
  </fieldset>
1616
1616
  </form>
1617
1617
  <div id="pause-result" style="margin-top:0.6em;"></div>
1618
- </section>`}function PL(t){return`<section><h3>${T(t.state_name)}</h3>${le(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function Cw(t){return t.resumed?`<p>resumed run ${T(t.run.id)}</p>`:`<p>resume failed: ${T(t.reason)}</p>`}function FL(t){return`<h1>External Objects</h1>${de(["id","type","provider","external_id","status","url"],t.map(e=>[T(e.id),T(e.type),T(e.provider),T(e.external_id),T(e.status),T(e.url)]))}`}function UL(t){return`<h1>External Signals</h1>${de(["id","object","kind","handled"],t.map(e=>[T(e.id),T(e.object_id),T(e.kind),T(e.handled_at)]))}`}function WL(t){let e=`<style>
1618
+ </section>`}function UL(t){return`<section><h3>${T(t.state_name)}</h3>${le(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function Cw(t){return t.resumed?`<p>resumed run ${T(t.run.id)}</p>`:`<p>resume failed: ${T(t.reason)}</p>`}function WL(t){return`<h1>External Objects</h1>${de(["id","type","provider","external_id","status","url"],t.map(e=>[T(e.id),T(e.type),T(e.provider),T(e.external_id),T(e.status),T(e.url)]))}`}function BL(t){return`<h1>External Signals</h1>${de(["id","object","kind","handled"],t.map(e=>[T(e.id),T(e.object_id),T(e.kind),T(e.handled_at)]))}`}function qL(t){let e=`<style>
1619
1619
  @keyframes attn-flicker { 0%,100%{background:#fff8e6;} 50%{background:#ffd766;} }
1620
1620
  tr.requires-user { animation: attn-flicker 1.4s ease-in-out infinite; font-weight:600; }
1621
1621
  tr.requires-user td:first-child::before { content:"\u2605 "; color:#d28e00; }
1622
- </style>`,r=t.map(n=>{let s=(n.requires_user??0)===1&&n.acknowledged_at===null,o=n.run_id!==null?`<a href="/runs/${T(n.run_id)}">${T(n.id)}</a>`:T(n.id),i=n.acknowledged_at===null?`<button hx-post="/api/attentions/${n.id}/ack" hx-swap="outerHTML">Ack</button>`:T(n.acknowledged_at),a=[o,T(n.kind),T(n.severity),i];return`<tr${s?' class="requires-user"':""}>${a.map(l=>`<td>${l}</td>`).join("")}</tr>`}).join("");return`<h1>Attentions</h1>${e}<table><thead><tr><th>id</th><th>kind</th><th>severity</th><th>ack</th></tr></thead><tbody>${r}</tbody></table>`}function BL(t){return`<h1>Submitted PRs</h1>${de(["id","repo","pr","status","last state","submitted","last scan"],t.map(e=>[`<a href="/api/submitted-prs/${T(e.id)}">${T(e.id)}</a>`,T(e.repo),`<a href="${T(e.pr_url)}" target="_blank" rel="noreferrer">${T(e.pr_url.replace(/^https:\/\/github\.com\//,""))}</a>`,T(e.status),T(e.last_known_state??""),T(e.submitted_at),T(e.last_scanned_at??"")]))}`}function qL(t){return t===null?"<p>not found</p>":`<h1>PR ${T(t.id)}</h1><dl>
1622
+ </style>`,r=t.map(n=>{let s=(n.requires_user??0)===1&&n.acknowledged_at===null,o=n.run_id!==null?`<a href="/runs/${T(n.run_id)}">${T(n.id)}</a>`:T(n.id),i=n.acknowledged_at===null?`<button hx-post="/api/attentions/${n.id}/ack" hx-swap="outerHTML">Ack</button>`:T(n.acknowledged_at),a=[o,T(n.kind),T(n.severity),i];return`<tr${s?' class="requires-user"':""}>${a.map(l=>`<td>${l}</td>`).join("")}</tr>`}).join("");return`<h1>Attentions</h1>${e}<table><thead><tr><th>id</th><th>kind</th><th>severity</th><th>ack</th></tr></thead><tbody>${r}</tbody></table>`}function HL(t){return`<h1>Submitted PRs</h1>${de(["id","repo","pr","status","last state","submitted","last scan"],t.map(e=>[`<a href="/api/submitted-prs/${T(e.id)}">${T(e.id)}</a>`,T(e.repo),`<a href="${T(e.pr_url)}" target="_blank" rel="noreferrer">${T(e.pr_url.replace(/^https:\/\/github\.com\//,""))}</a>`,T(e.status),T(e.last_known_state??""),T(e.submitted_at),T(e.last_scanned_at??"")]))}`}function JL(t){return t===null?"<p>not found</p>":`<h1>PR ${T(t.id)}</h1><dl>
1623
1623
  <dt>repo</dt><dd>${T(t.repo)}</dd>
1624
1624
  <dt>pr</dt><dd><a href="${T(t.pr_url)}" target="_blank" rel="noreferrer">${T(t.pr_url)}</a></dd>
1625
1625
  <dt>issue</dt><dd>${t.issue_url===null?"\u2014":`<a href="${T(t.issue_url)}" target="_blank" rel="noreferrer">${T(t.issue_url)}</a>`}</dd>
@@ -1629,7 +1629,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1629
1629
  <dt>submitted_at</dt><dd>${T(t.submitted_at)}</dd>
1630
1630
  <dt>last_scanned_at</dt><dd>${T(t.last_scanned_at??"\u2014")}</dd>
1631
1631
  <dt>last_known_state</dt><dd>${T(t.last_known_state??"\u2014")}</dd>
1632
- </dl>`}function Lw(t){return`<h1>Sessions</h1>${de(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=mo(e.team_name),n=encodeURIComponent(e.alias);return[T(e.team_name),T(e.alias),T(e.sessionid),T(e.input_tokens),T(e.cache_tokens),T(e.output_tokens),T(e.total_tokens),T(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 Mw(t,e){return e===null?`<span>${T(t)}</span>`:`<span>${T(t)} ${T(e.team_name)}/${T(e.alias)}</span>`}function HL(t){return`<h1>Run Throughput</h1>${de(["workflow","terminal","count"],t.map(e=>[T(e.workflow_name),T(e.terminal_state),T(e.count)]))}`}function Dw(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${de(["project","scanned","new jobs","error"],t.map(e=>[T(e.project_name),T(e.scanned),T(e.new_jobs),T(e.error)]))}`}function JL(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${le(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function GL(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[T(l.state_name),T(l.total),T(l.request_changes),T(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[T(l.state_name),T(l.lt_5min),T(l.btw_5_15min),T(l.btw_15_60min),T(l.gt_60min),T(l.no_end)]),i=e.retry_counts.map(l=>[T(l.state_name),T(l.retried_runs),T(l.avg_retries)]),a=r.map(l=>[T(l.tool_name),T(l.invocations),T(l.successes),T(l.hit_rate_pct),T(l.avg_latency_ms??"n/a"),T(l.p50_latency_ms??"n/a"),T(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${T(t)}</h1>
1632
+ </dl>`}function Lw(t){return`<h1>Sessions</h1>${de(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=mo(e.team_name),n=encodeURIComponent(e.alias);return[T(e.team_name),T(e.alias),T(e.sessionid),T(e.input_tokens),T(e.cache_tokens),T(e.output_tokens),T(e.total_tokens),T(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 Mw(t,e){return e===null?`<span>${T(t)}</span>`:`<span>${T(t)} ${T(e.team_name)}/${T(e.alias)}</span>`}function GL(t){return`<h1>Run Throughput</h1>${de(["workflow","terminal","count"],t.map(e=>[T(e.workflow_name),T(e.terminal_state),T(e.count)]))}`}function Dw(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${de(["project","scanned","new jobs","error"],t.map(e=>[T(e.project_name),T(e.scanned),T(e.new_jobs),T(e.error)]))}`}function XL(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${le(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function VL(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[T(l.state_name),T(l.total),T(l.request_changes),T(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[T(l.state_name),T(l.lt_5min),T(l.btw_5_15min),T(l.btw_15_60min),T(l.gt_60min),T(l.no_end)]),i=e.retry_counts.map(l=>[T(l.state_name),T(l.retried_runs),T(l.avg_retries)]),a=r.map(l=>[T(l.tool_name),T(l.invocations),T(l.successes),T(l.hit_rate_pct),T(l.avg_latency_ms??"n/a"),T(l.p50_latency_ms??"n/a"),T(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${T(t)}</h1>
1633
1633
  <h2>Request-changes rate</h2>
1634
1634
  <p>Total: ${T(n.request_changes)} of ${T(n.total)} steps (${T(n.rate_pct)})</p>
1635
1635
  ${de(["state","total steps","request_changes","rate"],s)}
@@ -1638,43 +1638,43 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1638
1638
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
1639
1639
  ${de(["state","retried runs","avg attempts"],i)}
1640
1640
  <h2>Tool efficacy</h2>
1641
- ${de(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var vL,Uw,Ww=b(()=>{"use strict";ni();zr();Oh();Fh();Gh();$t();Ac();Mg();Hg();Yg();nw();cw();fw();Iw();po();Aw();Ei();vL=["open","assigned","closed","reopened"],Uw=["low","medium","high","critical"]});function XL(t){return Math.floor(t/6e4)*6e4}function VL(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)KL(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function KL(t,e){let r=Date.now(),n=XL(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Bw(t,e=250){let r=setInterval(()=>{try{VL(t)}catch{}},e);return{stop(){clearInterval(r)}}}var qw=b(()=>{"use strict"});function zL({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1641
+ ${de(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var $L,Uw,Ww=b(()=>{"use strict";ni();zr();Oh();Fh();Gh();$t();Ac();Mg();Hg();Yg();nw();cw();fw();Iw();po();Aw();Ei();$L=["open","assigned","closed","reopened"],Uw=["low","medium","high","critical"]});function KL(t){return Math.floor(t/6e4)*6e4}function YL(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)zL(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function zL(t,e){let r=Date.now(),n=KL(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Bw(t,e=250){let r=setInterval(()=>{try{YL(t)}catch{}},e);return{stop(){clearInterval(r)}}}var qw=b(()=>{"use strict"});function QL({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1642
1642
  FROM run r
1643
1643
  JOIN job j ON j.id = r.job_id
1644
1644
  WHERE j.project_id = ?
1645
1645
  AND r.terminal_state IS NOT NULL
1646
1646
  ORDER BY r.id DESC
1647
- 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,YL).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,Hw)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Hw,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 Jw(t){for(let e of ZL)try{e(t)}catch{}}var YL,Hw,ZL,Gw=b(()=>{"use strict";YL="request_changes",Hw="reviewer_rejection_rate_high";ZL=[zL]});function as(){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 Xw(t){let e=t.intervalMs??as(),r=t.runOnceFn??kr,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??Bw)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Vw(t.dal,t.monitorSessionActivityFn??Al,e,n).finally(()=>{a=null})),a.finally(()=>u(Rl(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=QL(t.dal,r,t.collectSessionSizesFn??Gm,t.scanIntakeFn??rn,t.monitorSessionActivityFn??Al,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function QL(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(wg({dal:t}),Jw({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await Vw(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function Vw(t,e,r,n){let s=Rl(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var wu=b(()=>{"use strict";ni();os();Vc();po();qw();Gw();Ol()});function Kw(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 Yw=b(()=>{"use strict"});import{mkdirSync as eM,readFileSync as tM,readdirSync as rM,statSync as nM,writeFileSync as sM}from"node:fs";import{dirname as oM,join as Zw,sep as zw}from"node:path";function qi(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Qw:return iM(t,s.input);case ey:return aM(t,s.input);case ty:return lM(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:bu,GetObjectCommand:Eu,PutObjectCommand:yu}}}function iM(t,e){let r=ry(t,e.Key);return eM(oM(r),{recursive:!0}),sM(r,e.Body),{}}function aM(t,e){let r=ry(t,e.Key),n;try{n=tM(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function lM(t,e){let r=e.Prefix??"";ny(r);let s=cM(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function ry(t,e){return ny(e),Zw(t,e)}function ny(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function cM(t){let e=[],r=(n,s)=>{let o;try{o=rM(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=Zw(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=zw==="/"?a:a.split(zw).join("/");e.push({key:c,lastModified:nM(l).mtime})}}};return r(t,""),e}var Qw,ey,ty,yu,Eu,bu,Tu=b(()=>{"use strict";Qw="localfs-put",ey="localfs-get",ty="localfs-list",yu=class{input;_localfsTag=Qw;constructor(e){this.input=e}},Eu=class{input;_localfsTag=ey;constructor(e){this.input=e}},bu=class{input;_localfsTag=ty;constructor(e){this.input=e}}});function sy(){return{put:0,get:0,list:0}}function Su(t,e=uM){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function ku(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var uM,Hi,vu=b(()=>{"use strict";uM={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Hi=class{counts=sy();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=sy(),e}estimateCostUsd(e){return Su(this.counts,e)}}});function oy(t){let e=t.now??Date.now,r=t.timers??dM,n=null,s=null;async function o(){let l=e(),c=ku(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=Su(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===ku(e())}}}var dM,iy=b(()=>{"use strict";vu();dM={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Iu=b(()=>{"use strict";$i();xi();xi()});function fM(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function mM(t){return t.reply_to!==void 0&&t.response!==void 0}function pM(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function ay(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 Ji,ls,ly=b(()=>{"use strict";Iu();Ji=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},ls=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 Ji("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=Ot(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(ay(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(ay(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new Ji;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=fM(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(mM(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??pM(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:Ot(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function $u(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 cy=b(()=>{"use strict"});function Nu(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 uy=b(()=>{"use strict"});function ju(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var xu,dy=b(()=>{"use strict";xu="daemon:events"});function my(t){return{kind:"prompt",prompt_id:t.prompt_id??Ot(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Au(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 fy,Ru=b(()=>{"use strict";Iu();fy="prompt:root"});function cs(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(hy(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function hM(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(hy(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function py(t,e=60){if(typeof t!="string"||t==="")return!0;let r=hM(t);return r===null?!0:Date.now()/1e3>=r-e}function hy(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 Ou=b(()=>{"use strict"});async function Gi(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":_M},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var _M,Cu=b(()=>{"use strict";_M="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as _y,mkdirSync as gy,readFileSync as wy,writeFileSync as yy}from"node:fs";import{homedir as Ey}from"node:os";import{dirname as by,join as Ty}from"node:path";function us(){return process.env.LMCTL_DEVICE_AUTH_PATH??Ty(Ey(),".lmctl","device-auth.json")}function Sy(){return process.env.LMCTL_TOKEN_PATH??Ty(Ey(),".lmctl","cli-tokens.json")}function Lu(t=us()){try{let e=JSON.parse(wy(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 ky(t,e=us()){gy(by(e),{recursive:!0,mode:448}),yy(e,JSON.stringify(t,null,2));try{_y(e,384)}catch{}}function Mu(t,e=Sy()){let r={};try{r=JSON.parse(wy(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};gy(by(e),{recursive:!0,mode:448}),yy(e,JSON.stringify(s,null,2));try{_y(e,384)}catch{}}async function vy(t){let e=t.deviceAuthPath??us(),r=Lu(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Gi({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Mu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??Sy()),{idToken:n.idToken,userId:r.userId}}var Du=b(()=>{"use strict";Cu()});function Iy(t){if(t.length===0||!t.startsWith("---"))throw new _t("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1648
- `);if(e[0]!=="---")throw new _t("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new _t(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!gM.has(c))throw new _t(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Xi.join(", ")}`);r[c]=u}if(n===-1)throw new _t("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Xi)if(r[i]===void 0)throw new _t(`missing required frontmatter key "${i}" \u2014 required: ${Xi.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var Xi,gM,_t,$y=b(()=>{"use strict";Xi=["title","description","members"],gM=new Set(Xi),_t=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as wM,writeFileSync as UV,renameSync as WV,existsSync as Ay,realpathSync as Pu,statSync as yM}from"node:fs";import{basename as Ry,resolve as rr,dirname as Fu}from"node:path";function TM(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function SM(t){return/^\s*_MEMBER_\s+\S/.test(t)}function kM(t){return/^\s*_SESSION_\s+\S/.test(t)}function vM(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function IM(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Wu(t){let e=Ry(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Ne(t){let e=wM(t,"utf-8"),r=Fu(rr(t)),n=Bu(e,Wu(t),{baseDir:r,sourcePath:rr(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=rr(r,s.sessiondir));return n}function $M(t,e){let r={},n=[],s=t.replace(/^\s*_CONNECT_\s*/,""),o=0;function i(a){return s.slice(a).trim().split(/\s+/u)[0]??""}for(;o<s.length;){for(;o<s.length&&/\s/u.test(s[o]);)o+=1;if(o>=s.length)break;let a=o,l=/^[A-Za-z_][A-Za-z0-9_]*/u.exec(s.slice(o));if(l===null){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}let c=l[0];if(o+=c.length,s[o]!=="="){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}o+=1;let u="";if(s[o]==='"'){o+=1;let d=o;for(;o<s.length&&s[o]!=='"';)o+=1;if(o>=s.length){n.push(`line ${e}: unterminated quoted value for "${c}" on _CONNECT_ line: ${t.trim()}`);break}if(u=s.slice(d,o),o+=1,o<s.length&&!/\s/u.test(s[o])){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}}else{let d=o;for(;o<s.length&&!/\s/u.test(s[o]);)o+=1;u=s.slice(d,o)}if(!xy.includes(c)){n.push(`line ${e}: unknown key "${c}" on _CONNECT_ line: ${t.trim()}
1649
- allowed keys: ${xy.join(", ")}`);continue}if(Object.prototype.hasOwnProperty.call(r,c)){n.push(`line ${e}: duplicate key "${c}" on _CONNECT_ line: ${t.trim()}`);continue}r[c]=u}return{kvs:r,errors:n}}function Bu(t,e,r={}){let n=[],s=[],o=[],i=[],a=new Set,l=r.baseDir??bM,c;if(r.sourcePath!==void 0)try{c=Pu(r.sourcePath)}catch{c=void 0}let u=t;if(u.startsWith("#teamfile:")){let m=u.indexOf(`
1647
+ 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,ZL).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,Hw)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:Hw,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 Jw(t){for(let e of eM)try{e(t)}catch{}}var ZL,Hw,eM,Gw=b(()=>{"use strict";ZL="request_changes",Hw="reviewer_rejection_rate_high";eM=[QL]});function as(){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 Xw(t){let e=t.intervalMs??as(),r=t.runOnceFn??kr,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??Bw)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Vw(t.dal,t.monitorSessionActivityFn??Al,e,n).finally(()=>{a=null})),a.finally(()=>u(Rl(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=tM(t.dal,r,t.collectSessionSizesFn??Gm,t.scanIntakeFn??rn,t.monitorSessionActivityFn??Al,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function tM(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(wg({dal:t}),Jw({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await Vw(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function Vw(t,e,r,n){let s=Rl(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var wu=b(()=>{"use strict";ni();os();Vc();po();qw();Gw();Ol()});function Kw(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 Yw=b(()=>{"use strict"});import{mkdirSync as rM,readFileSync as nM,readdirSync as sM,statSync as oM,writeFileSync as iM}from"node:fs";import{dirname as aM,join as Zw,sep as zw}from"node:path";function qi(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Qw:return lM(t,s.input);case ey:return cM(t,s.input);case ty:return uM(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:bu,GetObjectCommand:Eu,PutObjectCommand:yu}}}function lM(t,e){let r=ry(t,e.Key);return rM(aM(r),{recursive:!0}),iM(r,e.Body),{}}function cM(t,e){let r=ry(t,e.Key),n;try{n=nM(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function uM(t,e){let r=e.Prefix??"";ny(r);let s=dM(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function ry(t,e){return ny(e),Zw(t,e)}function ny(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function dM(t){let e=[],r=(n,s)=>{let o;try{o=sM(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=Zw(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=zw==="/"?a:a.split(zw).join("/");e.push({key:c,lastModified:oM(l).mtime})}}};return r(t,""),e}var Qw,ey,ty,yu,Eu,bu,Tu=b(()=>{"use strict";Qw="localfs-put",ey="localfs-get",ty="localfs-list",yu=class{input;_localfsTag=Qw;constructor(e){this.input=e}},Eu=class{input;_localfsTag=ey;constructor(e){this.input=e}},bu=class{input;_localfsTag=ty;constructor(e){this.input=e}}});function sy(){return{put:0,get:0,list:0}}function Su(t,e=fM){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function ku(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var fM,Hi,vu=b(()=>{"use strict";fM={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Hi=class{counts=sy();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=sy(),e}estimateCostUsd(e){return Su(this.counts,e)}}});function oy(t){let e=t.now??Date.now,r=t.timers??mM,n=null,s=null;async function o(){let l=e(),c=ku(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=Su(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===ku(e())}}}var mM,iy=b(()=>{"use strict";vu();mM={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Iu=b(()=>{"use strict";$i();xi();xi()});function pM(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function hM(t){return t.reply_to!==void 0&&t.response!==void 0}function _M(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function ay(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 Ji,ls,ly=b(()=>{"use strict";Iu();Ji=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},ls=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 Ji("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=Ot(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(ay(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(ay(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new Ji;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=pM(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(hM(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??_M(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:Ot(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function $u(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 cy=b(()=>{"use strict"});function Nu(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 uy=b(()=>{"use strict"});function ju(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||typeof r.sender_alias!="string"||r.sender_alias===""||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var xu,dy=b(()=>{"use strict";xu="daemon:events"});function my(t){return{kind:"prompt",prompt_id:t.prompt_id??Ot(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Au(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 fy,Ru=b(()=>{"use strict";Iu();fy="prompt:root"});function cs(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(hy(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function gM(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(hy(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function py(t,e=60){if(typeof t!="string"||t==="")return!0;let r=gM(t);return r===null?!0:Date.now()/1e3>=r-e}function hy(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 Ou=b(()=>{"use strict"});async function Gi(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":wM},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var wM,Cu=b(()=>{"use strict";wM="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as _y,mkdirSync as gy,readFileSync as wy,writeFileSync as yy}from"node:fs";import{homedir as Ey}from"node:os";import{dirname as by,join as Ty}from"node:path";function us(){return process.env.LMCTL_DEVICE_AUTH_PATH??Ty(Ey(),".lmctl","device-auth.json")}function Sy(){return process.env.LMCTL_TOKEN_PATH??Ty(Ey(),".lmctl","cli-tokens.json")}function Lu(t=us()){try{let e=JSON.parse(wy(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 ky(t,e=us()){gy(by(e),{recursive:!0,mode:448}),yy(e,JSON.stringify(t,null,2));try{_y(e,384)}catch{}}function Mu(t,e=Sy()){let r={};try{r=JSON.parse(wy(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};gy(by(e),{recursive:!0,mode:448}),yy(e,JSON.stringify(s,null,2));try{_y(e,384)}catch{}}async function vy(t){let e=t.deviceAuthPath??us(),r=Lu(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Gi({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Mu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??Sy()),{idToken:n.idToken,userId:r.userId}}var Du=b(()=>{"use strict";Cu()});function Iy(t){if(t.length===0||!t.startsWith("---"))throw new _t("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1648
+ `);if(e[0]!=="---")throw new _t("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new _t(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!yM.has(c))throw new _t(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Xi.join(", ")}`);r[c]=u}if(n===-1)throw new _t("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Xi)if(r[i]===void 0)throw new _t(`missing required frontmatter key "${i}" \u2014 required: ${Xi.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var Xi,yM,_t,$y=b(()=>{"use strict";Xi=["title","description","members"],yM=new Set(Xi),_t=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as EM,writeFileSync as BV,renameSync as qV,existsSync as Ay,realpathSync as Pu,statSync as bM}from"node:fs";import{basename as Ry,resolve as rr,dirname as Fu}from"node:path";function kM(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function vM(t){return/^\s*_MEMBER_\s+\S/.test(t)}function IM(t){return/^\s*_SESSION_\s+\S/.test(t)}function $M(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function NM(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Wu(t){let e=Ry(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Ne(t){let e=EM(t,"utf-8"),r=Fu(rr(t)),n=Bu(e,Wu(t),{baseDir:r,sourcePath:rr(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=rr(r,s.sessiondir));return n}function xM(t,e){let r={},n=[],s=t.replace(/^\s*_CONNECT_\s*/,""),o=0;function i(a){return s.slice(a).trim().split(/\s+/u)[0]??""}for(;o<s.length;){for(;o<s.length&&/\s/u.test(s[o]);)o+=1;if(o>=s.length)break;let a=o,l=/^[A-Za-z_][A-Za-z0-9_]*/u.exec(s.slice(o));if(l===null){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}let c=l[0];if(o+=c.length,s[o]!=="="){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}o+=1;let u="";if(s[o]==='"'){o+=1;let d=o;for(;o<s.length&&s[o]!=='"';)o+=1;if(o>=s.length){n.push(`line ${e}: unterminated quoted value for "${c}" on _CONNECT_ line: ${t.trim()}`);break}if(u=s.slice(d,o),o+=1,o<s.length&&!/\s/u.test(s[o])){n.push(`line ${e}: malformed token "${i(a)}" on _CONNECT_ line: ${t.trim()}`);break}}else{let d=o;for(;o<s.length&&!/\s/u.test(s[o]);)o+=1;u=s.slice(d,o)}if(!xy.includes(c)){n.push(`line ${e}: unknown key "${c}" on _CONNECT_ line: ${t.trim()}
1649
+ allowed keys: ${xy.join(", ")}`);continue}if(Object.prototype.hasOwnProperty.call(r,c)){n.push(`line ${e}: duplicate key "${c}" on _CONNECT_ line: ${t.trim()}`);continue}r[c]=u}return{kvs:r,errors:n}}function Bu(t,e,r={}){let n=[],s=[],o=[],i=[],a=new Set,l=r.baseDir??SM,c;if(r.sourcePath!==void 0)try{c=Pu(r.sourcePath)}catch{c=void 0}let u=t;if(u.startsWith("#teamfile:")){let m=u.indexOf(`
1650
1650
  `);u=m>=0?u.slice(m+1):""}let d=null;if(u.startsWith("---"))try{d=Iy(u)}catch(m){if(m instanceof _t)i.push(`frontmatter: ${m.message}`);else throw m}let f=t.split(`
1651
- `);for(let m=0;m<f.length;m++){let p=f[m],h=m+1;if(kM(p))throw new Error(`line ${h}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${p.trim()})`);if(vM(p)){let{kvs:E,errors:v}=$M(p,h);if(i.push(...v),v.length>0)continue;let I=E.alias,k=E.teamfile;if(I||i.push(`line ${h}: _CONNECT_ missing alias: ${p.trim()}`),k||i.push(`line ${h}: _CONNECT_ missing teamfile: ${p.trim()}`),!I||!k)continue;let R=rr(l,k);try{let C=Pu(R);if(c!==void 0&&C===c){i.push(`line ${h}: ${Vi}`);continue}let B=`${I}\0${C}`;if(a.has(B)){i.push(`line ${h}: duplicate _CONNECT_ alias "${I}" for teamfile "${k}"`);continue}a.add(B),s.push({alias:I,teamfile:C})}catch(C){i.push(`line ${h}: _CONNECT_ teamfile missing/unreadable: ${R}: ${C instanceof Error?C.message:String(C)}`)}continue}if(IM(p)){let E=p.replace(/^\s*_SKILL_\s*/,"").trim(),v=E.length===0?[]:E.split(/\s+/u);if(v.length!==1){i.push(`line ${h}: _SKILL_ requires exactly one https:// URL or local path: ${p.trim()}`);continue}let I=v[0];try{if(new URL(I).protocol!=="https:"){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${I}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(I)&&!/^[A-Za-z]:[\\/]/u.test(I)){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${I}`);continue}}o.push(I);continue}if(!SM(p))continue;let g=TM(p);for(let E of Object.keys(g))if(!Ny.includes(E))throw new Error(`line ${h}: unknown key "${E}" on _MEMBER_ line: ${p.trim()}
1652
- allowed keys: ${Ny.join(", ")}`);if(!g.provider&&!g.teamfile){i.push(`line ${h}: member line missing provider (or teamfile): ${p.trim()}`);continue}let S={alias:g.alias||`member${n.length+1}`,provider:g.provider||"",extra:{}};g.sessionid&&(S.session=g.sessionid),g.sessiondir&&(S.sessiondir=g.sessiondir),g.teamfile&&(S.teamfile=g.teamfile),g.model&&(S.model=g.model),g.effort&&(S.effort=g.effort),n.push(S)}return{name:e,members:n,connections:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:d}}function qu(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===Uu.toLowerCase());n.length>1&&r.push({field:Uu,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?rr(e,o.teamfile):rr(o.teamfile);if(!Ay(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Ne(a),c=gt(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else EM.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function gt(t){return t.members.find(e=>e.alias.toLowerCase()===Uu.toLowerCase())}function Hu(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=rr(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!Ay(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Ne(o),l=gt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return Hu(l,Fu(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Fu(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function jy(t){let e;try{e=Pu(t)}catch(n){throw new Error(`connect target missing/unreadable: ${t}: ${n instanceof Error?n.message:String(n)}`)}let r=yM(e);return{path:e,key:`${r.dev}:${r.ino}`}}function NM(t){return t.map(e=>Ry(e)).join(" -> ")}function xM(t){let e=new Map;for(let i of t){let a=e.get(i.from.key)??[];a.push(i),e.set(i.from.key,a)}let r=new Set,n=new Set,s=[];function o(i){if(r.has(i.key)){let a=s.findIndex(c=>c.key===i.key),l=a>=0?s.slice(a).map(c=>c.path):[i.path];return l.push(i.path),l}if(n.has(i.key))return null;r.add(i.key),s.push(i);for(let a of e.get(i.key)??[]){let l=o(a.to);if(l!==null)return l}return s.pop(),r.delete(i.key),n.add(i.key),null}for(let i of t){let a=o(i.from);if(a!==null)return a}return null}function Ir(t){let e=jy(rr(t)),r=new Map,n=new Map,s=[];function o(a,l){if(r.has(a.key))return;r.set(a.key,a);let c;try{c=Ne(a.path)}catch(d){throw new Error(`connect parse error in ${a.path}: ${d instanceof Error?d.message:String(d)}`)}if(c.parseErrors.length>0){let d=c.parseErrors.find(f=>f.includes("_CONNECT_ teamfile missing/unreadable"));throw d!==void 0?new Error(`${a.path}: ${d}`):new Error(`connect parse error in ${a.path}: ${c.parseErrors.join("; ")}`)}let u=[];n.set(a.key,{source_teamfile:a.path,connections:u});for(let d of c.connections){let f=jy(d.teamfile);if(f.key===a.key)throw new Error(Vi);let m;try{m=Ne(f.path)}catch(p){throw new Error(`connect target missing/unreadable: ${d.alias} -> ${f.path}: ${p instanceof Error?p.message:String(p)}`)}if(m.parseErrors.length>0)throw new Error(`connect target invalid: ${d.alias} -> ${f.path}: ${m.parseErrors.join("; ")}`);if(ds(m,d.alias)===void 0)throw new Error(`connect target has no member alias "${d.alias}": ${f.path}`);s.push({from:a,to:f,alias:d.alias}),u.push({target_name:d.alias,target_teamfile:f.path}),!l.has(f.key)&&o(f,new Set([...l,f.key]))}}o(e,new Set([e.key]));let i=xM(s);if(i!==null)throw new Error(`connect cycle: ${NM(i)}`);return{root_teamfile:e.path,snapshots:[...n.values()],edges:s}}function ds(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Uu,Vi,EM,bM,Ny,xy,Ct=b(()=>{"use strict";$y();Uu="Lead",Vi="_CONNECT_ cannot target its own team (self-edge); intra-team members are connected implicitly via _MEMBER_",EM=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]),bM=process.cwd();Ny=["alias","provider","sessionid","sessiondir","teamfile","model","effort"],xy=["alias","teamfile"]});import{existsSync as jM,realpathSync as AM}from"node:fs";import{dirname as RM}from"node:path";function Ju(t){OM(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function OM(t){let e=t.payload.root_teamfile;try{e=AM(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await pn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await pn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=CM(e);if("error"in r)return await pn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-DM(t.env??process.env)).toISOString()});if(!s.acquired){let o=MM(r.alias,s.current);return await pn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??hr)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await pn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await pn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function CM(t){if(!jM(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Ne(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=gt(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??RM(t)}}async function pn(t,e){let r=Ly(e.message),n=e.response===null?null:Ly(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Ly(t){return t.length<=Oy?{text:t,truncated:!1}:{text:t.slice(0,Oy),truncated:!0}}function LM(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function MM(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:LM(t,e)}function DM(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Cy;let r=Number(e);return!Number.isFinite(r)||r<=0?Cy:r}var Oy,Cy,My=b(()=>{"use strict";It();Ct();Oy=256*1024,Cy=30*60*1e3});import{chmodSync as By,existsSync as PM,mkdirSync as qy,readFileSync as Zi,writeFileSync as Hy}from"node:fs";import{dirname as Gu,resolve as Ki,join as Jy}from"node:path";import{fileURLToPath as FM}from"node:url";import{homedir as Gy}from"node:os";import{CognitoIdentityClient as UM,GetIdCommand as WM}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Dy}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as BM,ListObjectsV2Command as qM,PutObjectCommand as HM,S3Client as Py}from"@aws-sdk/client-s3";function ms(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:KM(t.selfUrl),n={},s;for(let I of r)if(PM(I)){n=VM(I),s=I;break}let o=(...I)=>{for(let k of I)if(typeof k=="string"&&k!=="")return k},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??JM,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??GM,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??XM,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Qi,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=zi(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=zi(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=zi(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=zi(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),v=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...E!==void 0?{mailboxKey:E}:{},...v!==void 0?{tokenPath:v}:{}},f}function VM(t){try{let e=Zi(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function KM(t){let e=Gu(FM(t??import.meta.url));return[Ki(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ki(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ki(e,"..","..","..","infra","terraform","terraform.tfstate"),Ki(e,"..","..","infra","terraform","terraform.tfstate")]}function zi(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function YM(t){let e=zM(t.intervalMs)??Xy,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function zM(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Vy(t){let e=t.tokenPath??Jy(Gy(),".lmctl","cli-tokens.json"),r=Uy(t.tokenPath);if(py(r.cognito?.idToken)&&Lu()!==null)try{await vy({region:t.region,clientId:t.cognitoClientId??Qi,cliTokensPath:e}),r=Uy(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let H=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await Wy({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=Dy({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Py({region:t.region,credentials:a}),c={ListObjectsV2Command:qM,GetObjectCommand:BM,PutObjectCommand:HM},u=cs(n),d=u??o,f=t.deviceId,m=cn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let x=p.loadMailboxCursor(d,m);if(x!==null)h=x.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let H=!1,me=0;for(;!H&&me<2;){me+=1;try{let $=vi(m,"web"),N=0,O;do{let q=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:$,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of q.Contents??[]){let L=Ii(F.Key??"",m,"web");L!==void 0&&L>N&&(N=L)}O=q.IsTruncated===!0?q.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),H=!0}catch($){let N=$ instanceof Error?$.message:String($);if(i&&me===1&&eD($)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),QM(e),i=!1,o=await Wy({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=Dy({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Py({region:t.region,credentials:a}),m=cn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,S=t.persistentSessionManager,E=t.promptTriggerStore,v=new Hi,I=new vr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>v.record(x),onMessage:async x=>{if(_!==void 0&&$u(x.payload)){_.onInbound(x.payload);return}if(S!==void 0&&Nu(x.payload)){await S.onInbound(x.payload);return}if(!ju(x.payload)){if(E!==void 0&&Au(x.payload)){Ju({store:E,payload:x.payload,log:t.log});return}g!==null&&await g.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:x,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new ls({client:I,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async x=>I.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),S!==void 0&&S.setPublish(async x=>I.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let k=x=>I.putMessage({conversation_id:xu,payload:x});I.start();let R=t.chatLogTailStore===void 0?void 0:YM({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Xy,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let C=t.deviceId??o,B=`${d}/usage/`,ee;return ee=t.usageStore===void 0?void 0:oy({meter:v,store:t.usageStore,userId:d,deviceId:C,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:H,ceilingUsd:me})=>{t.log?.(`[usage] month ${x} cost $${H.toFixed(4)} >= ceiling $${me} \u2014 blocking mailbox`),I.stop().catch(()=>{}),ee?.stop()},publishOwnRollup:async(x,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${B}${C}-${x}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let H={put:0,get:0,list:0},me;do{let $=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:B,MaxKeys:1e3,...me!==void 0?{ContinuationToken:me}:{}}));for(let N of $.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${x}.json`))try{let q=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(q.Body===void 0)continue;let F=JSON.parse(await q.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}me=$.IsTruncated===!0?$.NextContinuationToken:void 0}while(me!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:I,fetchClient:g,publishDaemonEvent:k,async stop(){R?.stop(),ee!==void 0&&(await ee.flushNow().catch(()=>{}),ee.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function Ky(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:qi(t.rootDir),r=cn({identityId:fs,userId:fs,deviceId:Fy}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new vr({bucket:"local",identityId:fs,userId:fs,deviceId:Fy,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&$u(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Nu(c.payload)){await o.onInbound(c.payload);return}if(!ju(c.payload)){if(i!==void 0&&Au(c.payload)){Ju({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Yi,readIntervalMs:t.readIntervalMs??Yi,heartbeatIdleMs:t.heartbeatIdleMs??Yi,backoffReadIntervalMs:t.backoffReadIntervalMs??Yi});n=new ls({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:xu,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:fs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Uy(t){let e=t??Jy(Gy(),".lmctl","cli-tokens.json");try{let r=Zi(e,"utf8");return JSON.parse(r)}catch{return{}}}function ZM(t,e){if(e===void 0||e==="")return;let r={};try{let s=Zi(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};qy(Gu(t),{recursive:!0,mode:448}),Hy(t,JSON.stringify(n,null,2));try{By(t,384)}catch{}}function QM(t){let e={};try{let n=Zi(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,qy(Gu(t),{recursive:!0,mode:448}),Hy(t,JSON.stringify(r,null,2));try{By(t,384)}catch{}}async function Wy(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new UM({region:t.region}).send(new WM({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{ZM(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 eD(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 Xy,Yi,Qi,JM,GM,XM,fs,Fy,Xu=b(()=>{"use strict";ji();Tu();vu();iy();ly();cy();uy();dy();Ru();$i();Ou();Du();My();Xy=3e3,Yi=1e3,Qi="79u5jhkk46qofog661c9i0bdcs",JM="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",GM="us-east-1_4iUdFggDn",XM="lmctl-next-preview-mailbox-254332045686";fs="local",Fy="local"});import{spawn as zu}from"node:child_process";import{createInterface as Yy}from"node:readline";var Vu,Ku,Yu,zy,Zy=b(()=>{"use strict";Ja();We();Vu=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=zu(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=Yy({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1651
+ `);for(let m=0;m<f.length;m++){let p=f[m],h=m+1;if(IM(p))throw new Error(`line ${h}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${p.trim()})`);if($M(p)){let{kvs:E,errors:v}=xM(p,h);if(i.push(...v),v.length>0)continue;let I=E.alias,k=E.teamfile;if(I||i.push(`line ${h}: _CONNECT_ missing alias: ${p.trim()}`),k||i.push(`line ${h}: _CONNECT_ missing teamfile: ${p.trim()}`),!I||!k)continue;let R=rr(l,k);try{let C=Pu(R);if(c!==void 0&&C===c){i.push(`line ${h}: ${Vi}`);continue}let B=`${I}\0${C}`;if(a.has(B)){i.push(`line ${h}: duplicate _CONNECT_ alias "${I}" for teamfile "${k}"`);continue}a.add(B),s.push({alias:I,teamfile:C})}catch(C){i.push(`line ${h}: _CONNECT_ teamfile missing/unreadable: ${R}: ${C instanceof Error?C.message:String(C)}`)}continue}if(NM(p)){let E=p.replace(/^\s*_SKILL_\s*/,"").trim(),v=E.length===0?[]:E.split(/\s+/u);if(v.length!==1){i.push(`line ${h}: _SKILL_ requires exactly one https:// URL or local path: ${p.trim()}`);continue}let I=v[0];try{if(new URL(I).protocol!=="https:"){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${I}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(I)&&!/^[A-Za-z]:[\\/]/u.test(I)){i.push(`line ${h}: _SKILL_ URL must use https:// or a local path: ${I}`);continue}}o.push(I);continue}if(!vM(p))continue;let g=kM(p);for(let E of Object.keys(g))if(!Ny.includes(E))throw new Error(`line ${h}: unknown key "${E}" on _MEMBER_ line: ${p.trim()}
1652
+ allowed keys: ${Ny.join(", ")}`);if(!g.provider&&!g.teamfile){i.push(`line ${h}: member line missing provider (or teamfile): ${p.trim()}`);continue}let S={alias:g.alias||`member${n.length+1}`,provider:g.provider||"",extra:{}};g.sessionid&&(S.session=g.sessionid),g.sessiondir&&(S.sessiondir=g.sessiondir),g.teamfile&&(S.teamfile=g.teamfile),g.model&&(S.model=g.model),g.effort&&(S.effort=g.effort),n.push(S)}return{name:e,members:n,connections:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:d}}function qu(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===Uu.toLowerCase());n.length>1&&r.push({field:Uu,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?rr(e,o.teamfile):rr(o.teamfile);if(!Ay(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Ne(a),c=gt(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else TM.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function gt(t){return t.members.find(e=>e.alias.toLowerCase()===Uu.toLowerCase())}function Hu(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=rr(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!Ay(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Ne(o),l=gt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return Hu(l,Fu(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Fu(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function jy(t){let e;try{e=Pu(t)}catch(n){throw new Error(`connect target missing/unreadable: ${t}: ${n instanceof Error?n.message:String(n)}`)}let r=bM(e);return{path:e,key:`${r.dev}:${r.ino}`}}function jM(t){return t.map(e=>Ry(e)).join(" -> ")}function AM(t){let e=new Map;for(let i of t){let a=e.get(i.from.key)??[];a.push(i),e.set(i.from.key,a)}let r=new Set,n=new Set,s=[];function o(i){if(r.has(i.key)){let a=s.findIndex(c=>c.key===i.key),l=a>=0?s.slice(a).map(c=>c.path):[i.path];return l.push(i.path),l}if(n.has(i.key))return null;r.add(i.key),s.push(i);for(let a of e.get(i.key)??[]){let l=o(a.to);if(l!==null)return l}return s.pop(),r.delete(i.key),n.add(i.key),null}for(let i of t){let a=o(i.from);if(a!==null)return a}return null}function Ir(t){let e=jy(rr(t)),r=new Map,n=new Map,s=[];function o(a,l){if(r.has(a.key))return;r.set(a.key,a);let c;try{c=Ne(a.path)}catch(d){throw new Error(`connect parse error in ${a.path}: ${d instanceof Error?d.message:String(d)}`)}if(c.parseErrors.length>0){let d=c.parseErrors.find(f=>f.includes("_CONNECT_ teamfile missing/unreadable"));throw d!==void 0?new Error(`${a.path}: ${d}`):new Error(`connect parse error in ${a.path}: ${c.parseErrors.join("; ")}`)}let u=[];n.set(a.key,{source_teamfile:a.path,connections:u});for(let d of c.connections){let f=jy(d.teamfile);if(f.key===a.key)throw new Error(Vi);let m;try{m=Ne(f.path)}catch(p){throw new Error(`connect target missing/unreadable: ${d.alias} -> ${f.path}: ${p instanceof Error?p.message:String(p)}`)}if(m.parseErrors.length>0)throw new Error(`connect target invalid: ${d.alias} -> ${f.path}: ${m.parseErrors.join("; ")}`);if(ds(m,d.alias)===void 0)throw new Error(`connect target has no member alias "${d.alias}": ${f.path}`);s.push({from:a,to:f,alias:d.alias}),u.push({target_name:d.alias,target_teamfile:f.path}),!l.has(f.key)&&o(f,new Set([...l,f.key]))}}o(e,new Set([e.key]));let i=AM(s);if(i!==null)throw new Error(`connect cycle: ${jM(i)}`);return{root_teamfile:e.path,snapshots:[...n.values()],edges:s}}function ds(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Uu,Vi,TM,SM,Ny,xy,Ct=b(()=>{"use strict";$y();Uu="Lead",Vi="_CONNECT_ cannot target its own team (self-edge); intra-team members are connected implicitly via _MEMBER_",TM=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]),SM=process.cwd();Ny=["alias","provider","sessionid","sessiondir","teamfile","model","effort"],xy=["alias","teamfile"]});import{existsSync as RM,realpathSync as OM}from"node:fs";import{dirname as CM}from"node:path";function Ju(t){LM(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function LM(t){let e=t.payload.root_teamfile;try{e=OM(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await pn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await pn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=MM(e);if("error"in r)return await pn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-FM(t.env??process.env)).toISOString()});if(!s.acquired){let o=PM(r.alias,s.current);return await pn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??hr)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await pn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await pn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function MM(t){if(!RM(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Ne(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=gt(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??CM(t)}}async function pn(t,e){let r=Ly(e.message),n=e.response===null?null:Ly(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Ly(t){return t.length<=Oy?{text:t,truncated:!1}:{text:t.slice(0,Oy),truncated:!0}}function DM(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function PM(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:DM(t,e)}function FM(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Cy;let r=Number(e);return!Number.isFinite(r)||r<=0?Cy:r}var Oy,Cy,My=b(()=>{"use strict";It();Ct();Oy=256*1024,Cy=30*60*1e3});import{chmodSync as By,existsSync as UM,mkdirSync as qy,readFileSync as Zi,writeFileSync as Hy}from"node:fs";import{dirname as Gu,resolve as Ki,join as Jy}from"node:path";import{fileURLToPath as WM}from"node:url";import{homedir as Gy}from"node:os";import{CognitoIdentityClient as BM,GetIdCommand as qM}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Dy}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as HM,ListObjectsV2Command as JM,PutObjectCommand as GM,S3Client as Py}from"@aws-sdk/client-s3";function ms(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:zM(t.selfUrl),n={},s;for(let I of r)if(UM(I)){n=YM(I),s=I;break}let o=(...I)=>{for(let k of I)if(typeof k=="string"&&k!=="")return k},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??XM,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??VM,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??KM,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Qi,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=zi(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=zi(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=zi(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=zi(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),v=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...E!==void 0?{mailboxKey:E}:{},...v!==void 0?{tokenPath:v}:{}},f}function YM(t){try{let e=Zi(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function zM(t){let e=Gu(WM(t??import.meta.url));return[Ki(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Ki(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Ki(e,"..","..","..","infra","terraform","terraform.tfstate"),Ki(e,"..","..","infra","terraform","terraform.tfstate")]}function zi(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function ZM(t){let e=QM(t.intervalMs)??Xy,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function QM(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Vy(t){let e=t.tokenPath??Jy(Gy(),".lmctl","cli-tokens.json"),r=Uy(t.tokenPath);if(py(r.cognito?.idToken)&&Lu()!==null)try{await vy({region:t.region,clientId:t.cognitoClientId??Qi,cliTokensPath:e}),r=Uy(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let H=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await Wy({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=Dy({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Py({region:t.region,credentials:a}),c={ListObjectsV2Command:JM,GetObjectCommand:HM,PutObjectCommand:GM},u=cs(n),d=u??o,f=t.deviceId,m=cn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let x=p.loadMailboxCursor(d,m);if(x!==null)h=x.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let H=!1,me=0;for(;!H&&me<2;){me+=1;try{let $=vi(m,"web"),N=0,O;do{let q=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:$,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let F of q.Contents??[]){let L=Ii(F.Key??"",m,"web");L!==void 0&&L>N&&(N=L)}O=q.IsTruncated===!0?q.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),H=!0}catch($){let N=$ instanceof Error?$.message:String($);if(i&&me===1&&rD($)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),tD(e),i=!1,o=await Wy({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=Dy({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new Py({region:t.region,credentials:a}),m=cn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,S=t.persistentSessionManager,E=t.promptTriggerStore,v=new Hi,I=new vr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>v.record(x),onMessage:async x=>{if(_!==void 0&&$u(x.payload)){_.onInbound(x.payload);return}if(S!==void 0&&Nu(x.payload)){await S.onInbound(x.payload);return}if(!ju(x.payload)){if(E!==void 0&&Au(x.payload)){Ju({store:E,payload:x.payload,log:t.log});return}g!==null&&await g.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:x,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new ls({client:I,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async x=>I.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),S!==void 0&&S.setPublish(async x=>I.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let k=x=>I.putMessage({conversation_id:xu,payload:x});I.start();let R=t.chatLogTailStore===void 0?void 0:ZM({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Xy,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let C=t.deviceId??o,B=`${d}/usage/`,ee;return ee=t.usageStore===void 0?void 0:oy({meter:v,store:t.usageStore,userId:d,deviceId:C,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:H,ceilingUsd:me})=>{t.log?.(`[usage] month ${x} cost $${H.toFixed(4)} >= ceiling $${me} \u2014 blocking mailbox`),I.stop().catch(()=>{}),ee?.stop()},publishOwnRollup:async(x,H)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${B}${C}-${x}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let H={put:0,get:0,list:0},me;do{let $=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:B,MaxKeys:1e3,...me!==void 0?{ContinuationToken:me}:{}}));for(let N of $.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${x}.json`))try{let q=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(q.Body===void 0)continue;let F=JSON.parse(await q.Body.transformToString("utf-8"));H.put+=F.put??0,H.get+=F.get??0,H.list+=F.list??0}catch{}}me=$.IsTruncated===!0?$.NextContinuationToken:void 0}while(me!==void 0);return H},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:I,fetchClient:g,publishDaemonEvent:k,async stop(){R?.stop(),ee!==void 0&&(await ee.flushNow().catch(()=>{}),ee.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function Ky(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:qi(t.rootDir),r=cn({identityId:fs,userId:fs,deviceId:Fy}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new vr({bucket:"local",identityId:fs,userId:fs,deviceId:Fy,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&$u(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Nu(c.payload)){await o.onInbound(c.payload);return}if(!ju(c.payload)){if(i!==void 0&&Au(c.payload)){Ju({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Yi,readIntervalMs:t.readIntervalMs??Yi,heartbeatIdleMs:t.heartbeatIdleMs??Yi,backoffReadIntervalMs:t.backoffReadIntervalMs??Yi});n=new ls({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:xu,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:fs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Uy(t){let e=t??Jy(Gy(),".lmctl","cli-tokens.json");try{let r=Zi(e,"utf8");return JSON.parse(r)}catch{return{}}}function eD(t,e){if(e===void 0||e==="")return;let r={};try{let s=Zi(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};qy(Gu(t),{recursive:!0,mode:448}),Hy(t,JSON.stringify(n,null,2));try{By(t,384)}catch{}}function tD(t){let e={};try{let n=Zi(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,qy(Gu(t),{recursive:!0,mode:448}),Hy(t,JSON.stringify(r,null,2));try{By(t,384)}catch{}}async function Wy(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new BM({region:t.region}).send(new qM({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{eD(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 rD(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 Xy,Yi,Qi,XM,VM,KM,fs,Fy,Xu=b(()=>{"use strict";ji();Tu();vu();iy();ly();cy();uy();dy();Ru();$i();Ou();Du();My();Xy=3e3,Yi=1e3,Qi="79u5jhkk46qofog661c9i0bdcs",XM="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",VM="us-east-1_4iUdFggDn",KM="lmctl-next-preview-mailbox-254332045686";fs="local",Fy="local"});import{spawn as zu}from"node:child_process";import{createInterface as Yy}from"node:readline";var Vu,Ku,Yu,zy,Zy=b(()=>{"use strict";Ja();We();Vu=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=zu(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=Yy({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1653
1653
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1654
1654
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:e,params:r}}}},Ku=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=zu(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
1655
1655
  `);this.buffer=i.pop()??"";for(let a of i)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),n}async sendTurn(e){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(n+`
1656
1656
  `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let o=r.message?.content;if(Array.isArray(o))for(let i of o)i.type==="text"&&typeof i.text=="string"&&i.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:i.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let o of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(o);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Yu=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{Vs(n)}catch(a){te({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=zu(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=Yy({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let i=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof i?.sessionId=="string"?i.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:i}}),s}async sendTurn(e){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:e}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1657
1657
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1658
1658
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let o=r.error,i=typeof o?.message=="string"&&o.message!==""?o.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${i}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
1659
- `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},zy=t=>{switch(t){case"codex":return new Vu;case"claude":case"qwen":return new Ku;case"gemini":case"copilot":case"opencode":return new Yu;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as tD}from"node:crypto";import{existsSync as kK,mkdirSync as rD,readFileSync as nD,writeFileSync as sD}from"node:fs";import{homedir as oD}from"node:os";import{dirname as iD,join as aD}from"node:path";function ea(){return process.env.LMCTL_DEVICE_FILE??aD(oD(),".lmctl","device.json")}function $r(t=ea()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(nD(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 Zu(t=ea()){let e=$r(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:tD(),created_at:new Date().toISOString()};return rD(iD(t),{recursive:!0}),sD(t,`${JSON.stringify(r,null,2)}
1660
- `,{encoding:"utf8",mode:384}),r}var Qu=b(()=>{"use strict"});import*as Qy from"node:child_process";function cD(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function ed(t,e={}){let r=e.spawnSync===void 0&&process.env[uD]==="1",n=e.spawnSync??Qy.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=ta[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=cD(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function eE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(ta).join(", ")})`;let e=lD[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var ta,lD,uD,tE=b(()=>{"use strict";ta={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},lD={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};uD="LMCTL_SKIP_BINARY_CHECK"});var dE={};ie(dE,{ProviderBinaryPreflightError:()=>ra,__setProviderBinaryCheckForTest:()=>yD,bootstrapAgentRestMailbox:()=>sE,publishRegisteredWorkflowsOnStart:()=>nE,resolveLocalMailboxDir:()=>cE,resolveLocalWebuiDir:()=>lE,resolveServeConfig:()=>oE,runProviderBinaryPreflight:()=>aE,runServe:()=>hD,validateServeArgs:()=>uE});import{randomBytes as dD}from"node:crypto";import{existsSync as fD}from"node:fs";import{homedir as mD}from"node:os";import{isAbsolute as rE,resolve as td}from"node:path";async function hD(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(pD),0;let r=uE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1661
- `),2;try{aE(e)}catch(E){return 1}let n=pe({path:ce()}),s={portCli:ED(t)},o;try{o=oE({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(E){return n.close(),e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
1659
+ `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},zy=t=>{switch(t){case"codex":return new Vu;case"claude":case"qwen":return new Ku;case"gemini":case"copilot":case"opencode":return new Yu;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as nD}from"node:crypto";import{existsSync as IK,mkdirSync as sD,readFileSync as oD,writeFileSync as iD}from"node:fs";import{homedir as aD}from"node:os";import{dirname as lD,join as cD}from"node:path";function ea(){return process.env.LMCTL_DEVICE_FILE??cD(aD(),".lmctl","device.json")}function $r(t=ea()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(oD(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 Zu(t=ea()){let e=$r(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:nD(),created_at:new Date().toISOString()};return sD(lD(t),{recursive:!0}),iD(t,`${JSON.stringify(r,null,2)}
1660
+ `,{encoding:"utf8",mode:384}),r}var Qu=b(()=>{"use strict"});import*as Qy from"node:child_process";function dD(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function ed(t,e={}){let r=e.spawnSync===void 0&&process.env[fD]==="1",n=e.spawnSync??Qy.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=ta[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=dD(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function eE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(ta).join(", ")})`;let e=uD[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var ta,uD,fD,tE=b(()=>{"use strict";ta={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},uD={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};fD="LMCTL_SKIP_BINARY_CHECK"});var dE={};ie(dE,{ProviderBinaryPreflightError:()=>ra,__setProviderBinaryCheckForTest:()=>bD,bootstrapAgentRestMailbox:()=>sE,publishRegisteredWorkflowsOnStart:()=>nE,resolveLocalMailboxDir:()=>cE,resolveLocalWebuiDir:()=>lE,resolveServeConfig:()=>oE,runProviderBinaryPreflight:()=>aE,runServe:()=>gD,validateServeArgs:()=>uE});import{randomBytes as mD}from"node:crypto";import{existsSync as pD}from"node:fs";import{homedir as hD}from"node:os";import{isAbsolute as rE,resolve as td}from"node:path";async function gD(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(_D),0;let r=uE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1661
+ `),2;try{aE(e)}catch(E){return 1}let n=pe({path:ce()}),s={portCli:TD(t)},o;try{o=oE({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(E){return n.close(),e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
1662
1662
  `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Kw(n);let i;if(r.localWebui!==void 0){let E=lE(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let v=cE(process.env),{s3:I,commands:k}=qi(v);i={webuiDir:E,rootDir:v,s3:I,commands:k},e.stdout.write(`local webui: serving SPA from ${E}; mailbox store ${v}
1663
1663
  `)}let a=r.noDaemon?void 0:Xw({dal:n,intervalMs:as()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:ms({env:process.env});l.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${l.missing.join(", ")}; running without cloud sync`+(l.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${l.tfstateCandidatesChecked.length} candidate path${l.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${l.tfstatePathUsed} did not supply the missing fields)`)+`
1664
- `);let c=await wD({log:E=>e.stderr.write(`${E}
1664
+ `);let c=await ED({log:E=>e.stderr.write(`${E}
1665
1665
  `)}),u=new Li({adapterFactory:zy,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:E=>e.stderr.write(`${E}
1666
- `)}),d=$r()?.device_id,f=Pw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:_D(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await sE({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await nE({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),S=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1667
- `),await new Promise(E=>{let v=()=>{(async()=>(a!==void 0&&await a.stop(),S.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),E()))()};process.once("SIGTERM",v),process.once("SIGINT",v)}),0}function _D(t,e){return{identityPoolId:t.identityPoolId,cognitoUserPoolId:t.cognitoUserPoolId,cognitoRegion:t.region,mailboxBucket:t.mailboxBucket,workspaceFetchMode:"mailbox",...e!==void 0?{deviceId:e}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},mailboxPolling:{...t.readIntervalMs!==void 0?{readIntervalSeconds:t.readIntervalMs/1e3}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:t.heartbeatIdleMs/1e3}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:t.backoffReadIntervalMs/1e3}:{}}}}async function nE(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
1666
+ `)}),d=$r()?.device_id,f=Pw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:wD(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await sE({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await nE({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),S=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1667
+ `),await new Promise(E=>{let v=()=>{(async()=>(a!==void 0&&await a.stop(),S.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),E()))()};process.once("SIGTERM",v),process.once("SIGINT",v)}),0}function wD(t,e){return{identityPoolId:t.identityPoolId,cognitoUserPoolId:t.cognitoUserPoolId,cognitoRegion:t.region,mailboxBucket:t.mailboxBucket,workspaceFetchMode:"mailbox",...e!==void 0?{deviceId:e}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},mailboxPolling:{...t.readIntervalMs!==void 0?{readIntervalSeconds:t.readIntervalMs/1e3}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:t.heartbeatIdleMs/1e3}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:t.backoffReadIntervalMs/1e3}:{}}}}async function nE(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
1668
1668
  `)}}async function sE(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await Ky({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
1669
1669
  `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await Vy({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
1670
1670
  `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(Ih({app:t.app,log:r=>t.io?.stderr.write(`${r}
1671
1671
  `)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
1672
1672
  `)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
1673
- `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function oE(t){let{dal:e,cli:r,env:n,parsed:s,io:o}=t,i=[],a,l=e.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,i.push("api.port")}else a=s.port;let c,u=e.getConfig("api.token");u!==null?c=u:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,i.push("api.token")):(c=dD(32).toString("hex"),e.setConfig("api.token",c),o.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let d,f=e.getConfig("api.url");f!==null?d=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(d=n.LMCTL_API_URL,i.push("api.url")):(d=`http://127.0.0.1:${a}`,e.setConfig("api.url",d));for(let m of i)o.stderr.write(`note: ${gD(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
1674
- `);return{port:a,apiUrl:d,apiToken:c}}function gD(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 wD(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 Ci({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 yD(t){iE=t??ed}function aE(t){let e=Object.keys(ta),r=iE(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${eE(o)}
1673
+ `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function oE(t){let{dal:e,cli:r,env:n,parsed:s,io:o}=t,i=[],a,l=e.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,i.push("api.port")}else a=s.port;let c,u=e.getConfig("api.token");u!==null?c=u:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,i.push("api.token")):(c=mD(32).toString("hex"),e.setConfig("api.token",c),o.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let d,f=e.getConfig("api.url");f!==null?d=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(d=n.LMCTL_API_URL,i.push("api.url")):(d=`http://127.0.0.1:${a}`,e.setConfig("api.url",d));for(let m of i)o.stderr.write(`note: ${yD(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
1674
+ `);return{port:a,apiUrl:d,apiToken:c}}function yD(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 ED(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 Ci({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 bD(t){iE=t??ed}function aE(t){let e=Object.keys(ta),r=iE(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${eE(o)}
1675
1675
  `);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
1676
1676
  `),new ra(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
1677
- `)}function lE(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=rE(r)?r:td(process.cwd(),r);return fD(`${n}/index.html`)?n:null}function cE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?rE(e)?e:td(process.cwd(),e):td(mD(),".lmctl","local-mailbox")}function ED(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 uE(t,e=process.env){let r=bD(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function bD(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var pD,ra,iE,fE=b(()=>{"use strict";De();Ww();wu();Yw();Sc();Xu();Tu();lu();cu();Zy();Qu();tE();Ge();pD=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1677
+ `)}function lE(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=rE(r)?r:td(process.cwd(),r);return pD(`${n}/index.html`)?n:null}function cE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?rE(e)?e:td(process.cwd(),e):td(hD(),".lmctl","local-mailbox")}function TD(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 uE(t,e=process.env){let r=SD(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function SD(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var _D,ra,iE,fE=b(()=>{"use strict";De();Ww();wu();Yw();Sc();Xu();Tu();lu();cu();Zy();Qu();tE();Ge();_D=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1678
1678
 
1679
1679
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
1680
1680
  services. Help exits before any port binding or daemon startup.
@@ -1684,19 +1684,19 @@ services. Help exits before any port binding or daemon startup.
1684
1684
  against the local filesystem (no S3, no Cognito) with a fixed
1685
1685
  local identity. Mailbox store defaults to
1686
1686
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
1687
- `;ra=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},iE=ed});var mE={};ie(mE,{runIntake:()=>SD});async function SD(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(TD),0):r==="scan"?kD(n,e):r==="config"?vD(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1688
- `),1)}async function kD(t,e){let r=P(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=j(r,"--project");return J(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await bc({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await rn(s)),0})}async function vD(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=P(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=j(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=j(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=j(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return J(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return W(e,d),0})}var TD,pE=b(()=>{"use strict";ni();Se();TD=`usage: lmctl intake <scan|config> ...
1687
+ `;ra=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},iE=ed});var mE={};ie(mE,{runIntake:()=>vD});async function vD(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(kD),0):r==="scan"?ID(n,e):r==="config"?$D(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1688
+ `),1)}async function ID(t,e){let r=P(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=j(r,"--project");return J(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await bc({dal:s,project:o});return W(e,{project_id:o.id,project_name:o.name,...i}),0}return W(e,await rn(s)),0})}async function $D(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=P(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=j(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=j(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=j(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return J(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return W(e,d),0})}var kD,pE=b(()=>{"use strict";ni();Se();kD=`usage: lmctl intake <scan|config> ...
1689
1689
 
1690
1690
  Scan configured project GitHub issues into lmctl, or update per-project
1691
1691
  intake settings such as enabled state, labels, and issue state filters.
1692
- `});import{createHash as ID}from"node:crypto";import{existsSync as ps,mkdirSync as $D,readFileSync as _E,realpathSync as ND,writeFileSync as xD}from"node:fs";import{dirname as gE,resolve as wE}from"node:path";function Nr(t){let e=wE(t);return ps(e)?ND(e):e}function hE(t,e){let r=gE(e),n=Bu(t,Wu(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=wE(r,s.sessiondir));return n}function hs(t,e){let r=Nr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!ps(r)&&"upsertRootTeam"in e&&($D(gE(r),{recursive:!0}),xD(r,n.raw_text,"utf8")),hE(n.raw_text,r);if(ps(r)){let s=_E(r,"utf8"),o=hE(s,r);return"upsertRootTeam"in e&&AD(o)&&RD(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!ps(r))throw new Error(`teamfile not found: ${t}`);return Ne(r)}function yE(t,e,r){let n=Nr(t),s=e.getRootTeam(n);s===null||!ps(n)||_E(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 AD(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=jD)}function RD(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:ID("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o);try{let i=Ir(e);for(let a of i.snapshots){let l=a.connections.map(c=>({target_name:c.target_name,target_teamfile:c.target_teamfile,created_at:s}));t.replaceTeamConnections(a.source_teamfile,l)}}catch{}}var jD,na=b(()=>{"use strict";Ct();jD=5});import{existsSync as OD}from"node:fs";import{dirname as EE}from"node:path";function MD(t){return CD.test(t)||LD.test(t)}function bE(t){return sa.test(t)}function rd(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!sa.test(n)?null:{teamfile:r,alias:n}}function Lt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!bE(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${sa.source}).`);let n=Nr(t);if(r===void 0&&!OD(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=hs(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=ds(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1692
+ `});import{createHash as ND}from"node:crypto";import{existsSync as ps,mkdirSync as xD,readFileSync as _E,realpathSync as jD,writeFileSync as AD}from"node:fs";import{dirname as gE,resolve as wE}from"node:path";function Nr(t){let e=wE(t);return ps(e)?jD(e):e}function hE(t,e){let r=gE(e),n=Bu(t,Wu(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=wE(r,s.sessiondir));return n}function hs(t,e){let r=Nr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!ps(r)&&"upsertRootTeam"in e&&(xD(gE(r),{recursive:!0}),AD(r,n.raw_text,"utf8")),hE(n.raw_text,r);if(ps(r)){let s=_E(r,"utf8"),o=hE(s,r);return"upsertRootTeam"in e&&OD(o)&&CD(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!ps(r))throw new Error(`teamfile not found: ${t}`);return Ne(r)}function yE(t,e,r){let n=Nr(t),s=e.getRootTeam(n);s===null||!ps(n)||_E(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 OD(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=RD)}function CD(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:ND("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o);try{let i=Ir(e);for(let a of i.snapshots){let l=a.connections.map(c=>({target_name:c.target_name,target_teamfile:c.target_teamfile,created_at:s}));t.replaceTeamConnections(a.source_teamfile,l)}}catch{}}var RD,na=b(()=>{"use strict";Ct();RD=5});import{existsSync as LD}from"node:fs";import{dirname as EE}from"node:path";function PD(t){return MD.test(t)||DD.test(t)}function bE(t){return sa.test(t)}function rd(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!sa.test(n)?null:{teamfile:r,alias:n}}function Lt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!bE(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${sa.source}).`);let n=Nr(t);if(r===void 0&&!LD(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=hs(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=ds(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1693
1693
  Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=Hu(o,EE(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
1694
1694
  Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??EE(n),...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function nr(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=rd(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?bE(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${sa.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1695
- Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(MD(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.
1695
+ Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(PD(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.
1696
1696
  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}".
1697
1697
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
1698
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,CD,LD,sa,_s=b(()=>{"use strict";Ct();na();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},CD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,LD=/^ses_[A-Za-z0-9_-]+$/,sa=/^[A-Za-z][A-Za-z0-9_-]*$/});function kE(t){let e=TE(t.registry,t.fromTeamfile);if(e===void 0)return xr(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!SE(e,t.fromAlias))return xr(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=TE(t.registry,t.toTeamfile);if(r===void 0)return xr(`target team is not registered in policy graph: ${t.toTeamfile}`);if(!SE(r,t.toAlias))return xr(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`);if(t.toTeamfile===t.fromTeamfile)return{allowed:!0,outOfPolicy:!1,reason:"same team"};if(e.leadAlias===null)return xr(`sender team has no Lead: ${t.fromTeamfile}`);if(t.fromAlias!==e.leadAlias)return xr(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`);let n=t.registry.connections.find(s=>s.sourceTeamfile===t.fromTeamfile&&s.targetTeamfile===t.toTeamfile&&s.targetName===t.toAlias);return n===void 0?xr(`target alias is not connected from sender team: ${t.fromTeamfile} -> ${t.toTeamfile}:${t.toAlias}`):{allowed:!0,outOfPolicy:!1,reason:`connected target alias ${n.targetName}`}}function TE(t,e){return t.teams.find(r=>r.teamfile===e)}function SE(t,e){return t.aliases.some(r=>r===e)}function xr(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var vE=b(()=>{"use strict"});var RE={};ie(RE,{agentInflightTtlMsFromEnv:()=>jE,parseIdleTimeoutMs:()=>AE,runChat:()=>PD});async function PD(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${NE}
1699
- `),t.length===0?2:0;let r=FD(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1698
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,MD,DD,sa,_s=b(()=>{"use strict";Ct();na();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},MD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,DD=/^ses_[A-Za-z0-9_-]+$/,sa=/^[A-Za-z][A-Za-z0-9_-]*$/});function kE(t){let e=TE(t.registry,t.fromTeamfile);if(e===void 0)return xr(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!SE(e,t.fromAlias))return xr(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=TE(t.registry,t.toTeamfile);if(r===void 0)return xr(`target team is not registered in policy graph: ${t.toTeamfile}`);if(!SE(r,t.toAlias))return xr(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`);if(t.toTeamfile===t.fromTeamfile)return{allowed:!0,outOfPolicy:!1,reason:"same team"};if(e.leadAlias===null)return xr(`sender team has no Lead: ${t.fromTeamfile}`);if(t.fromAlias!==e.leadAlias)return xr(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`);let n=t.registry.connections.find(s=>s.sourceTeamfile===t.fromTeamfile&&s.targetTeamfile===t.toTeamfile&&s.targetName===t.toAlias);return n===void 0?xr(`target alias is not connected from sender team: ${t.fromTeamfile} -> ${t.toTeamfile}:${t.toAlias}`):{allowed:!0,outOfPolicy:!1,reason:`connected target alias ${n.targetName}`}}function TE(t,e){return t.teams.find(r=>r.teamfile===e)}function SE(t,e){return t.aliases.some(r=>r===e)}function xr(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var vE=b(()=>{"use strict"});var RE={};ie(RE,{agentInflightTtlMsFromEnv:()=>jE,parseIdleTimeoutMs:()=>AE,runChat:()=>UD});async function UD(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${NE}
1699
+ `),t.length===0?2:0;let r=WD(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1700
1700
  ${NE}
1701
1701
  `),2;if(r.runFlag!==void 0){let l=Number.parseInt(r.runFlag,10);return!Number.isFinite(l)||l<=0||String(l)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
1702
1702
  `),2):await J(e,async c=>{let u=c.getRun(l);if(u===null)return e.stderr.write(`error: run ${l}: not found
@@ -1708,25 +1708,25 @@ ${NE}
1708
1708
  `),1;let m=c.resumeInteractive(f.step_id,r.prompt,r.done===!0);return m.resumed===!0?(e.stdout.write(`run ${l}: interactive resumed (step ${f.step_id}${r.done===!0?", done":""})
1709
1709
  `),0):(e.stderr.write(`error: run ${l}: resumeInteractive failed (${m.reason})
1710
1710
  `),1)}return e.stderr.write(`error: run ${l}: pending attention kind "${d.kind}" is not operator-answerable
1711
- `),1})}let n=nr(DD,{target:r.target,alias:r.alias,flags:{session:r.sessionFlag,provider:r.providerFlag}});if(n.mode==="error")return e.stderr.write(`error: ${n.message}
1711
+ `),1})}let n=nr(FD,{target:r.target,alias:r.alias,flags:{session:r.sessionFlag,provider:r.providerFlag}});if(n.mode==="error")return e.stderr.write(`error: ${n.message}
1712
1712
  `),2;if(n.mode==="managed")return e.stderr.write(`error: chat managed mode requires --run <id>
1713
1713
  `),2;let s,o=null,i=null;if(n.mode==="ai-team"){if(n.alias===void 0)return e.stderr.write(`error: chat: alias required (internal)
1714
- `),2;let l=n.alias;try{let c=await J(e,h=>Lt(n.teamfile,l,h)),u=c.teamfile,d=await J(e,h=>UD(r.fromFlag,u,h)),f=await WD(e,{explicitRoot:r.rootFlag,sender:d,receiverTeamfile:u,operatorOrigin:r.fromFlag===void 0}),m=r.fromFlag===void 0?null:await JD(e,{rootTeamfile:f,sender:d,receiverTeamfile:u,receiverAlias:c.alias});m!==null&&!m.allowed&&e.stderr.write(`warning: out-of-policy chat send: ${m.reason}
1715
- `),s={provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,alias:c.alias,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{}},o={root_teamfile:f,sender_teamfile:d.teamfile,sender_alias:d.alias,receiver_teamfile:u,receiver_alias:c.alias,policy:m};let p=await VD(e,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:d.teamfile,sender_alias:d.alias,force:r.force===!0});if(!p.acquired){let h=YD(c.alias,p.current);return await nd(e,{...o,message:r.prompt,response:null,status:"error",error_detail:h}),e.stderr.write(`error: ${h}
1714
+ `),2;let l=n.alias;try{let c=await J(e,h=>Lt(n.teamfile,l,h)),u=c.teamfile,d=await J(e,h=>BD(r.fromFlag,u,h)),f=await qD(e,{explicitRoot:r.rootFlag,sender:d,receiverTeamfile:u,operatorOrigin:r.fromFlag===void 0}),m=r.fromFlag===void 0?null:await XD(e,{rootTeamfile:f,sender:d,receiverTeamfile:u,receiverAlias:c.alias});m!==null&&!m.allowed&&e.stderr.write(`warning: out-of-policy chat send: ${m.reason}
1715
+ `),s={provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,alias:c.alias,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{}},o={root_teamfile:f,sender_teamfile:d.teamfile,sender_alias:d.alias,receiver_teamfile:u,receiver_alias:c.alias,policy:m};let p=await YD(e,{receiver_teamfile:u,receiver_alias:c.alias,sender_teamfile:d.teamfile,sender_alias:d.alias,force:r.force===!0});if(!p.acquired){let h=ZD(c.alias,p.current);return await nd(e,{...o,message:r.prompt,response:null,status:"error",error_detail:h}),e.stderr.write(`error: ${h}
1716
1716
  `),1}i=p.lease}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: ${u}
1717
1717
  `),c instanceof ge,1}}else{if(r.force===!0)return e.stderr.write(`error: --force is only valid for AI-team chat
1718
1718
  `),2;if(n.provider===void 0)return e.stderr.write(`error: chat raw mode (bare sessionid / --session) requires --provider <name>
1719
- `),2;s={provider:n.provider,sessionId:n.sessionid,cwd:process.cwd()}}let a=!1;try{let l={provider:s.provider,sessionId:s.sessionId,cwd:s.cwd,prompt:r.prompt,permissionMode:r.permissionMode,env:process.env,onDelta:d=>{a=!0,e.stdout.write(d)},onProgress:d=>zD(e,s.alias??"(raw)",d)};s.model!==void 0&&(l.model=s.model),s.effort!==void 0&&(l.effort=s.effort),s.alias!==void 0&&(l.alias=s.alias),r.idleTimeoutMs!==void 0&&(l.timeoutMs=r.idleTimeoutMs);let c=await hr(l),u=c.status==="stalled";return o!==null&&await nd(e,{...o,message:r.prompt,response:u?null:c.text,status:o.policy?.outOfPolicy===!0?"out_of_policy":u?"error":"ok",error_detail:o.policy?.outOfPolicy===!0?o.policy.reason:u?`provider stalled${c.stalledAfterMs!==void 0?` after ${c.stalledAfterMs}ms`:""}`:null}),a?c.text.endsWith(`
1719
+ `),2;s={provider:n.provider,sessionId:n.sessionid,cwd:process.cwd()}}let a=!1;try{let l={provider:s.provider,sessionId:s.sessionId,cwd:s.cwd,prompt:r.prompt,permissionMode:r.permissionMode,env:process.env,onDelta:d=>{a=!0,e.stdout.write(d)},onProgress:d=>QD(e,s.alias??"(raw)",d)};s.model!==void 0&&(l.model=s.model),s.effort!==void 0&&(l.effort=s.effort),s.alias!==void 0&&(l.alias=s.alias),r.idleTimeoutMs!==void 0&&(l.timeoutMs=r.idleTimeoutMs);let c=await hr(l),u=c.status==="stalled";return o!==null&&await nd(e,{...o,message:r.prompt,response:u?null:c.text,status:o.policy?.outOfPolicy===!0?"out_of_policy":u?"error":"ok",error_detail:o.policy?.outOfPolicy===!0?o.policy.reason:u?`provider stalled${c.stalledAfterMs!==void 0?` after ${c.stalledAfterMs}ms`:""}`:null}),a?c.text.endsWith(`
1720
1720
  `)||e.stdout.write(`
1721
1721
  `):e.stdout.write(`${c.text}${c.text.endsWith(`
1722
1722
  `)?"":`
1723
1723
  `}`),c.status==="stalled"?1:0}catch(l){let c=l instanceof Error?l.message:String(l);return o!==null&&await nd(e,{...o,message:r.prompt,response:null,status:o.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:o.policy?.outOfPolicy===!0?`${o.policy.reason}; provider error: ${c}`:c}),e.stderr.write(`error: ${c}
1724
- `),1}finally{i!==null&&await KD(e,i)}}function FD(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let S=AE(_);if(typeof S=="string")return S;n=S;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function UD(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=rd(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Nr(n.teamfile),o=hs(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=ds(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function WD(t,e){return e.explicitRoot!==void 0?Nr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await J(t,r=>BD(r,e.sender.teamfile)??e.receiverTeamfile)}function BD(t,e){let r=t.listRootTeams().slice().sort(qD);for(let n of r)if(HD(t,n.teamfile_path,e))return n.teamfile_path;return null}function qD(t,e){let r=t.last_seeded_at??t.registered_at,s=(e.last_seeded_at??e.registered_at).localeCompare(r);if(s!==0)return s;let o=e.registered_at.localeCompare(t.registered_at);return o!==0?o:t.teamfile_path.localeCompare(e.teamfile_path)}function HD(t,e,r){let n=[e],s=new Set;for(;n.length>0;){let o=n.shift();if(!s.has(o)){if(s.add(o),o===r)return!0;for(let i of t.listTeamConnections(o))n.push(i.target_teamfile)}}return!1}async function JD(t,e){return await J(t,r=>kE({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:GD(r,e.sender.teamfile,e.receiverTeamfile)}))}function GD(t,e,r){let n=new Set([e,r]),s=t.listTeamConnections(e);for(let o of s)n.add(o.target_teamfile);return{teams:[...n].map(o=>XD(o,t)),connections:s.map(o=>({sourceTeamfile:o.source_teamfile,targetTeamfile:o.target_teamfile,targetName:o.target_name}))}}function XD(t,e){let r=hs(t,e),n=gt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function VD(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-jE()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await J(t,o=>{let i=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});return i.acquired?{acquired:!0,lease:i.current??s}:{acquired:!1,current:i.current}})}async function KD(t,e){try{await J(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)}
1725
- `)}}function YD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function jE(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}async function nd(t,e){let r=xE(e.message),n=e.response===null?null:xE(e.response);try{await J(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1726
- `)}}function xE(t){return t.length<=IE?{text:t,truncated:!1}:{text:t.slice(0,IE),truncated:!0}}function AE(t){if(t==="0")return 0;let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d) or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function zD(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1724
+ `),1}finally{i!==null&&await zD(e,i)}}function WD(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let S=AE(_);if(typeof S=="string")return S;n=S;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function BD(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=rd(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Nr(n.teamfile),o=hs(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=ds(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function qD(t,e){return e.explicitRoot!==void 0?Nr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await J(t,r=>HD(r,e.sender.teamfile)??e.receiverTeamfile)}function HD(t,e){let r=t.listRootTeams().slice().sort(JD);for(let n of r)if(GD(t,n.teamfile_path,e))return n.teamfile_path;return null}function JD(t,e){let r=t.last_seeded_at??t.registered_at,s=(e.last_seeded_at??e.registered_at).localeCompare(r);if(s!==0)return s;let o=e.registered_at.localeCompare(t.registered_at);return o!==0?o:t.teamfile_path.localeCompare(e.teamfile_path)}function GD(t,e,r){let n=[e],s=new Set;for(;n.length>0;){let o=n.shift();if(!s.has(o)){if(s.add(o),o===r)return!0;for(let i of t.listTeamConnections(o))n.push(i.target_teamfile)}}return!1}async function XD(t,e){return await J(t,r=>kE({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:VD(r,e.sender.teamfile,e.receiverTeamfile)}))}function VD(t,e,r){let n=new Set([e,r]),s=t.listTeamConnections(e);for(let o of s)n.add(o.target_teamfile);return{teams:[...n].map(o=>KD(o,t)),connections:s.map(o=>({sourceTeamfile:o.source_teamfile,targetTeamfile:o.target_teamfile,targetName:o.target_name}))}}function KD(t,e){let r=hs(t,e),n=gt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function YD(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-jE()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await J(t,o=>{let i=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});return i.acquired?{acquired:!0,lease:i.current??s}:{acquired:!1,current:i.current}})}async function zD(t,e){try{await J(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)}
1725
+ `)}}function ZD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function jE(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}async function nd(t,e){let r=xE(e.message),n=e.response===null?null:xE(e.response);try{await J(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1726
+ `)}}function xE(t){return t.length<=IE?{text:t,truncated:!1}:{text:t.slice(0,IE),truncated:!0}}function AE(t){if(t==="0")return 0;let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d) or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function QD(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1727
1727
  `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
1728
1728
  `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
1729
- `)}var DD,IE,$E,NE,OE=b(()=>{"use strict";It();Se();_s();Ct();vE();na();Di();$t();DD={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},IE=256*1024,$E=30*60*1e3,NE=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1729
+ `)}var FD,IE,$E,NE,OE=b(()=>{"use strict";It();Se();_s();Ct();vE();na();Di();$t();FD={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},IE=256*1024,$E=30*60*1e3,NE=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1730
1730
  lmctl chat <teamfile> <alias> "<prompt>"
1731
1731
  lmctl chat <sessionid> "<prompt>" --provider <name>
1732
1732
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -1734,16 +1734,16 @@ ${NE}
1734
1734
  [--permission-mode plan|yolo] [--idle-timeout <duration>]
1735
1735
  [--from <teamfile>:<alias>] [--root <teamfile>] [--force]
1736
1736
 
1737
- Send a prompt to a team member or raw provider session, or answer a paused run.`});var gs,m8,sd=b(()=>{"use strict";gs=[{name:"lmctl_chat",description:"Send one prompt to an AI-managed .lmctl team member by explicit teamfile path and alias. This is the only MCP tool exposed by lmctl; managed workflows use the lmctl CLI surface.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},provider:{type:"string",description:"(deprecated: use team+alias)"},sessionid:{type:"string",description:"(deprecated: use team+alias)"},sessiondir:{type:"string",description:"(deprecated: use team+alias)"},prompt:{type:"string",description:"Prompt text to send"},idle_timeout:{type:"string",description:"Idle timeout, e.g. 8h, 30m, 0"},heartbeat:{type:"string",description:"Accepted for lmctl0 compatibility; ignored by lmctl"}},required:["prompt"],additionalProperties:!1},local:!0}],m8=gs.length});import{spawn as ZD}from"node:child_process";async function CE(t,e,r){let n=eP.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 o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return tP(n.name,s)}function tP(t,e){return t==="lmctl_chat"?rP(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function rP(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:void 0,n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=typeof t.provider=="string"?t.provider:void 0,i=typeof t.sessionid=="string"?t.sessionid:void 0,a=typeof t.sessiondir=="string"&&t.sessiondir.length>0?t.sessiondir:process.cwd(),l=typeof t.idle_timeout=="string"?t.idle_timeout:void 0,c,u=process.cwd();if(r!==void 0&&r.length>0)c=["chat",r,n,e],s!==void 0&&c.push("--from",s);else if(o!==void 0&&i!==void 0)c=["chat",i,e,"--provider",o],u=a;else return Promise.resolve({status:"error",code:400,message:"provide either 'team' or all of 'provider'+'sessionid'"});return l!==void 0&&c.push("--idle-timeout",l),nP(c,u)}function nP(t,e){return new Promise(r=>{let n=!1,s=l=>{n||(n=!0,r(l))},o=ZD("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),i="",a="";o.stdout?.on("data",l=>{i+=l.toString("utf8")}),o.stderr?.on("data",l=>{a+=l.toString("utf8")}),o.on("error",l=>{s({status:"error",code:1,message:`failed to spawn lmctl chat: ${l.message}`})}),o.on("exit",l=>{if(l===0){s({status:"ok",data:{text:i.trim()||"(empty response)"}});return}s({status:"error",code:l??1,message:a.trim()||`lmctl chat exited with code ${l}`})})})}function LE(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:QD),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var QD,eP,od=b(()=>{"use strict";sd();QD="http://127.0.0.1:8787",eP=new Map(gs.map(t=>[t.name,t]))});async function aP(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(id({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:sP,capabilities:{tools:{listChanged:!1}},serverInfo:{name:oP,version:iP}}}};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:gs.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:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await CE(o,i,e.dispatch),l=o==="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 id(t){return`${JSON.stringify(t)}
1738
- `}async function ME(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(id({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await aP(l,t);c.kind==="response"?t.io.write(id(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1737
+ Send a prompt to a team member or raw provider session, or answer a paused run.`});var gs,h8,sd=b(()=>{"use strict";gs=[{name:"lmctl_chat",description:"Send one prompt to an AI-managed .lmctl team member by explicit teamfile path and alias. This is the only MCP tool exposed by lmctl; managed workflows use the lmctl CLI surface.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},from:{type:"string",description:"Optional self-asserted sender identity: <teamfile.lmctl>:<alias>"},provider:{type:"string",description:"(deprecated: use team+alias)"},sessionid:{type:"string",description:"(deprecated: use team+alias)"},sessiondir:{type:"string",description:"(deprecated: use team+alias)"},prompt:{type:"string",description:"Prompt text to send"},idle_timeout:{type:"string",description:"Idle timeout, e.g. 8h, 30m, 0"},heartbeat:{type:"string",description:"Accepted for lmctl0 compatibility; ignored by lmctl"}},required:["prompt"],additionalProperties:!1},local:!0}],h8=gs.length});import{spawn as eP}from"node:child_process";async function CE(t,e,r){let n=rP.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 o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return nP(n.name,s)}function nP(t,e){return t==="lmctl_chat"?sP(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function sP(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:void 0,n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=typeof t.provider=="string"?t.provider:void 0,i=typeof t.sessionid=="string"?t.sessionid:void 0,a=typeof t.sessiondir=="string"&&t.sessiondir.length>0?t.sessiondir:process.cwd(),l=typeof t.idle_timeout=="string"?t.idle_timeout:void 0,c,u=process.cwd();if(r!==void 0&&r.length>0)c=["chat",r,n,e],s!==void 0&&c.push("--from",s);else if(o!==void 0&&i!==void 0)c=["chat",i,e,"--provider",o],u=a;else return Promise.resolve({status:"error",code:400,message:"provide either 'team' or all of 'provider'+'sessionid'"});return l!==void 0&&c.push("--idle-timeout",l),oP(c,u)}function oP(t,e){return new Promise(r=>{let n=!1,s=l=>{n||(n=!0,r(l))},o=eP("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),i="",a="";o.stdout?.on("data",l=>{i+=l.toString("utf8")}),o.stderr?.on("data",l=>{a+=l.toString("utf8")}),o.on("error",l=>{s({status:"error",code:1,message:`failed to spawn lmctl chat: ${l.message}`})}),o.on("exit",l=>{if(l===0){s({status:"ok",data:{text:i.trim()||"(empty response)"}});return}s({status:"error",code:l??1,message:a.trim()||`lmctl chat exited with code ${l}`})})})}function LE(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:tP),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var tP,rP,od=b(()=>{"use strict";sd();tP="http://127.0.0.1:8787",rP=new Map(gs.map(t=>[t.name,t]))});async function cP(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(id({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:iP,capabilities:{tools:{listChanged:!1}},serverInfo:{name:aP,version:lP}}}};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:gs.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:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await CE(o,i,e.dispatch),l=o==="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 id(t){return`${JSON.stringify(t)}
1738
+ `}async function ME(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(id({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await cP(l,t);c.kind==="response"?t.io.write(id(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1739
1739
  `);for(;d!==-1;){let f=n.slice(0,d);n=n.slice(d+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),d=n.indexOf(`
1740
1740
  `)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
1741
- `),a.finally(()=>c(1))})})}var sP,oP,iP,DE=b(()=>{"use strict";sd();od();sP="2025-06-18",oP="lmctl",iP="0.0.1"});var PE={};ie(PE,{runMcp:()=>cP});async function cP(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(lP),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1742
- `),2;let n=e.dal===void 0,s=e.dal??pe({path:ce()});try{let o=LE(s,process.env);return await ME({io:{write:a=>e.stdout.write(a),log:a=>e.stderr.write(a)},dispatch:{config:o,dal:s}},r)}finally{n&&s.close()}}var lP,FE=b(()=>{"use strict";De();od();DE();Ge();lP=`usage: lmctl mcp
1741
+ `),a.finally(()=>c(1))})})}var iP,aP,lP,DE=b(()=>{"use strict";sd();od();iP="2025-06-18",aP="lmctl",lP="0.0.1"});var PE={};ie(PE,{runMcp:()=>dP});async function dP(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(uP),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1742
+ `),2;let n=e.dal===void 0,s=e.dal??pe({path:ce()});try{let o=LE(s,process.env);return await ME({io:{write:a=>e.stdout.write(a),log:a=>e.stderr.write(a)},dispatch:{config:o,dal:s}},r)}finally{n&&s.close()}}var uP,FE=b(()=>{"use strict";De();od();DE();Ge();uP=`usage: lmctl mcp
1743
1743
 
1744
1744
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
1745
1745
  local config, then uses stdin/stdout for JSON-RPC frames.
1746
- `});function ws(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var UE=b(()=>{"use strict"});function uP(t){return{stale_run_minutes:Es(t,"monitor.stale_run_minutes",ys.stale_run_minutes),old_attention_days:Es(t,"monitor.old_attention_days",ys.old_attention_days),old_issue_days:Es(t,"monitor.old_issue_days",ys.old_issue_days),stuck_job_minutes:Es(t,"monitor.stuck_job_minutes",ys.stuck_job_minutes),dedupe_window_hours:Es(t,"monitor.dedupe_window_hours",ys.dedupe_window_hours)}}function Es(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function WE(t,e={}){let r=e.now??new Date,n=uP(t),s=[];for(let o of dP(t,n,r))s.push(o);for(let o of fP(t,n,r))s.push(o);for(let o of mP(t,n,r))s.push(o);for(let o of pP(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function dP(t,e,r){let n=BE(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
1746
+ `});function ws(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var UE=b(()=>{"use strict"});function fP(t){return{stale_run_minutes:Es(t,"monitor.stale_run_minutes",ys.stale_run_minutes),old_attention_days:Es(t,"monitor.old_attention_days",ys.old_attention_days),old_issue_days:Es(t,"monitor.old_issue_days",ys.old_issue_days),stuck_job_minutes:Es(t,"monitor.stuck_job_minutes",ys.stuck_job_minutes),dedupe_window_hours:Es(t,"monitor.dedupe_window_hours",ys.dedupe_window_hours)}}function Es(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function WE(t,e={}){let r=e.now??new Date,n=fP(t),s=[];for(let o of mP(t,n,r))s.push(o);for(let o of pP(t,n,r))s.push(o);for(let o of hP(t,n,r))s.push(o);for(let o of _P(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function mP(t,e,r){let n=BE(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
1747
1747
  SELECT r.id AS id,
1748
1748
  r.job_id AS job_id,
1749
1749
  w.name AS workflow_name,
@@ -1754,12 +1754,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1754
1754
  WHERE r.terminal_state IS NULL
1755
1755
  AND r.paused_at IS NULL
1756
1756
  AND r.started_at <= ?
1757
- `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=ws(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(oa(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function fP(t,e,r){let n=BE(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
1757
+ `).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=ws(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(oa(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function pP(t,e,r){let n=BE(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
1758
1758
  SELECT id, project_id, source, source_ref, status, enqueued_at
1759
1759
  FROM job
1760
1760
  WHERE status NOT IN ('done', 'failed')
1761
1761
  AND enqueued_at <= ?
1762
- `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=ws(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(oa(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function mP(t,e,r){let n=qE(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
1762
+ `).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=ws(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(oa(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function hP(t,e,r){let n=qE(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
1763
1763
  SELECT project_id,
1764
1764
  COUNT(*) AS count,
1765
1765
  (SELECT kind FROM attention a2
@@ -1774,7 +1774,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1774
1774
  AND kind NOT IN ('attentions_overdue', 'issues_overdue')
1775
1775
  AND created_at <= ?
1776
1776
  GROUP BY project_id
1777
- `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=ws(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(oa(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function pP(t,e,r){let n=qE(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
1777
+ `).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=ws(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(oa(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function _P(t,e,r){let n=qE(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
1778
1778
  SELECT project_id,
1779
1779
  COUNT(*) AS count,
1780
1780
  (SELECT title FROM project_issue i2
@@ -1787,23 +1787,23 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1787
1787
  WHERE status IN ('open', 'reopened')
1788
1788
  AND created_at <= ?
1789
1789
  GROUP BY project_id
1790
- `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=ws(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${gP(i.oldest_title,40)})`;o.push(oa(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function oa(t,e){let r=hP(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function hP(t,e,r,n){let s=_P(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
1790
+ `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=ws(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${yP(i.oldest_title,40)})`;o.push(oa(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function oa(t,e){let r=gP(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function gP(t,e,r,n){let s=wP(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
1791
1791
  SELECT * FROM attention
1792
1792
  WHERE acknowledged_at IS NULL
1793
1793
  AND created_at >= ?
1794
1794
  AND payload LIKE ?
1795
1795
  ORDER BY id DESC
1796
1796
  LIMIT 1
1797
- `).get(s,o)??null}function BE(t,e){return new Date(t.getTime()-e*60*1e3)}function _P(t,e){return new Date(t.getTime()-e*60*60*1e3)}function qE(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function gP(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var ys,HE=b(()=>{"use strict";UE();ys={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var GE={};ie(GE,{renderSummary:()=>JE,runMonitor:()=>yP});async function yP(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(wP),0;let r=P(t,[],["--json","--quiet"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--json"),s=M(r,"--quiet");try{return await J(e,o=>{let i=WE(o);return n?W(e,i):s||e.stdout.write(`${JE(i.findings)}
1798
- `),0})}catch(o){return fe(e,o)}}function JE(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${EP(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function EP(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var wP,XE=b(()=>{"use strict";Se();HE();wP=`usage: lmctl monitor [--json] [--quiet]
1797
+ `).get(s,o)??null}function BE(t,e){return new Date(t.getTime()-e*60*1e3)}function wP(t,e){return new Date(t.getTime()-e*60*60*1e3)}function qE(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function yP(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var ys,HE=b(()=>{"use strict";UE();ys={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var GE={};ie(GE,{renderSummary:()=>JE,runMonitor:()=>bP});async function bP(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(EP),0;let r=P(t,[],["--json","--quiet"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--json"),s=M(r,"--quiet");try{return await J(e,o=>{let i=WE(o);return n?W(e,i):s||e.stdout.write(`${JE(i.findings)}
1798
+ `),0})}catch(o){return fe(e,o)}}function JE(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${TP(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function TP(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var EP,XE=b(()=>{"use strict";Se();HE();EP=`usage: lmctl monitor [--json] [--quiet]
1799
1799
 
1800
1800
  Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
1801
1801
  issues; emit findings as attentions for the operator/master to handle.
1802
- `});var VE={};ie(VE,{runDevice:()=>AP});import{readFileSync as bP}from"node:fs";import{homedir as TP}from"node:os";import{join as SP}from"node:path";import{CognitoIdentityClient as kP,GetIdCommand as vP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as IP}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as $P,ListObjectsV2Command as NP,PutObjectCommand as xP,S3Client as jP}from"@aws-sdk/client-s3";async function AP(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(ad),0;if(r==="init"){let n=Zu();return e.stdout.write(`${n.device_id}
1802
+ `});var VE={};ie(VE,{runDevice:()=>OP});import{readFileSync as SP}from"node:fs";import{homedir as kP}from"node:os";import{join as vP}from"node:path";import{CognitoIdentityClient as IP,GetIdCommand as $P}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as NP}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as xP,ListObjectsV2Command as jP,PutObjectCommand as AP,S3Client as RP}from"@aws-sdk/client-s3";async function OP(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(ad),0;if(r==="init"){let n=Zu();return e.stdout.write(`${n.device_id}
1803
1803
  `),0}if(r==="id"){let n=$r();return n===null?(e.stderr.write(`error: no device id initialized at ${ea()}; run 'lmctl device init'
1804
1804
  `),1):(e.stdout.write(`${n.device_id}
1805
- `),0)}return r==="login"?await RP(t.slice(1),e):r==="prompt"?await CP(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
1806
- `),1)}async function RP(t,e){let r=OP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1805
+ `),0)}return r==="login"?await CP(t.slice(1),e):r==="prompt"?await MP(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
1806
+ `),1)}async function CP(t,e){let r=LP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1807
1807
  ${ad}`),2;let n=ms();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1808
1808
  `),1;ky({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await Gi({region:n.config.region,clientId:n.config.cognitoClientId??Qi,refreshToken:r.accessKey});s=c.idToken,o=c.accessToken,i=c.expiresAt}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${u}
1809
1809
  `),1}let a=cs(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
@@ -1811,10 +1811,10 @@ ${ad}`),2;let n=ms();if(n.config===void 0)return e.stderr.write(`error: mailbox
1811
1811
  device id: ${l.device_id}
1812
1812
  mailbox prefix: ${r.userId}/${l.device_id}/
1813
1813
  access key stored at ${us()}
1814
- `),0}function OP(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --user-id";e=o;continue}if(s==="--access-key"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --access-key";r=o;continue}return`unknown argument: ${s}`}return e===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:e,accessKey:r}}async function CP(t,e){let r=LP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1814
+ `),0}function LP(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --user-id";e=o;continue}if(s==="--access-key"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --access-key";r=o;continue}return`unknown argument: ${s}`}return e===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:e,accessKey:r}}async function MP(t,e){let r=DP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1815
1815
  ${ad}`),2;let n=ms();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1816
- `),1;let s=DP();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await MP({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=IP({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??$r()?.device_id,u=cs(o)??void 0,d=new vr({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new jP({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:NP,GetObjectCommand:$P,PutObjectCommand:xP},selfRole:"browser",onMessage:async()=>{}}),f=my({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:fy,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
1817
- `),0}function LP(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function MP(t){let r=await new kP({region:t.region}).send(new vP({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 DP(t=process.env.LMCTL_TOKEN_PATH??SP(TP(),".lmctl","cli-tokens.json")){try{return JSON.parse(bP(t,"utf8"))}catch{return null}}var ad,KE=b(()=>{"use strict";Qu();Xu();ji();Ru();Ou();Du();Cu();ad=`usage: lmctl device <id|init>
1816
+ `),1;let s=FP();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await PP({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=NP({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??$r()?.device_id,u=cs(o)??void 0,d=new vr({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new RP({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:jP,GetObjectCommand:xP,PutObjectCommand:AP},selfRole:"browser",onMessage:async()=>{}}),f=my({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:fy,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
1817
+ `),0}function DP(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function PP(t){let r=await new IP({region:t.region}).send(new $P({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 FP(t=process.env.LMCTL_TOKEN_PATH??vP(kP(),".lmctl","cli-tokens.json")){try{return JSON.parse(SP(t,"utf8"))}catch{return null}}var ad,KE=b(()=>{"use strict";Qu();Xu();ji();Ru();Ou();Du();Cu();ad=`usage: lmctl device <id|init>
1818
1818
  lmctl device login --user-id <sub> --access-key <refreshToken>
1819
1819
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
1820
1820
 
@@ -1824,30 +1824,30 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
1824
1824
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
1825
1825
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
1826
1826
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
1827
- `});var zE={};ie(zE,{runTeam:()=>UP});import{join as PP}from"node:path";async function UP(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(FP),0;try{return await J(e,async s=>{switch(r){case"create":return BP(n,e,s);case"list":return qP(n,e,s);case"show":return HP(n,e,s);case"add-member":return JP(n,e,s);case"seed":return YE(n,e,s,!1);case"refresh":return YE(n,e,s,!0);case"companion":return XP(n,e,s);case"list-roots":return WP(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return fe(e,s)}}function WP(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);if(n.positionals.length>0)return w(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?W(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
1827
+ `});var zE={};ie(zE,{runTeam:()=>BP});import{join as UP}from"node:path";async function BP(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(WP),0;try{return await J(e,async s=>{switch(r){case"create":return HP(n,e,s);case"list":return JP(n,e,s);case"show":return GP(n,e,s);case"add-member":return XP(n,e,s);case"seed":return YE(n,e,s,!1);case"refresh":return YE(n,e,s,!0);case"companion":return KP(n,e,s);case"list-roots":return qP(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return fe(e,s)}}function qP(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);if(n.positionals.length>0)return w(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?W(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
1828
1828
  `)+(s.length>0?`
1829
- `:"")),0}function BP(t,e,r){let[n]=t;if(n===void 0)return w(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
1830
- `),0}function qP(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
1829
+ `:"")),0}function HP(t,e,r){let[n]=t;if(n===void 0)return w(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
1830
+ `),0}function JP(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
1831
1831
  `)}${s.length>0?`
1832
- `:""}`),0}function HP(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(M(n,"--json"))W(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
1832
+ `:""}`),0}function GP(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(M(n,"--json"))W(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
1833
1833
  `);for(let a of i)e.stdout.write(`- ${a.alias} ${ke(a)} ${a.sessionid??"(unseeded)"}
1834
- `)}return 0}function JP(t,e,r){let n=P(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=j(n,"--alias"),a=j(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:j(n,"--model")??null,role:j(n,"--role")??"agent",sessiondir:j(n,"--sessiondir")??PP(ir(),"sessions",o.name,i)});return M(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1835
- `),0}async function YE(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=j(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=GP(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return w(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=mg(f.workflow_name,m.definition);if(p.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))jo(f,r),Ro(f);let u=[],d=!1;for(let f of l){let m=await Wr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1834
+ `)}return 0}function XP(t,e,r){let n=P(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=j(n,"--alias"),a=j(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:j(n,"--model")??null,role:j(n,"--role")??"agent",sessiondir:j(n,"--sessiondir")??UP(ir(),"sessions",o.name,i)});return M(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1835
+ `),0}async function YE(t,e,r,n){let s=P(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=j(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=VP(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return w(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=mg(f.workflow_name,m.definition);if(p.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))jo(f,r),Ro(f);let u=[],d=!1;for(let f of l){let m=await Wr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1836
1836
 
1837
1837
  ${Jr}`:Jr;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=Gr(ke(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
1838
1838
  ${_}
1839
1839
  `);try{await Bo({dal:r,member:p,stderr:e.stderr})}catch(S){d=!0,e.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
1840
1840
  `)}}}return M(s,"--json")?W(e,u):e.stdout.write(`seeded ${u.length} member(s)
1841
- `),d?1:0}function GP(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function XP(t,e,r){let n=P(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=j(n,"--interpreter"),a=j(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
1842
- `),0}var FP,ZE=b(()=>{"use strict";Ge();fo();Fn();Bl();De();Xr();rc();Ei();Se();ql();FP=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1841
+ `),d?1:0}function VP(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function KP(t,e,r){let n=P(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=j(n,"--interpreter"),a=j(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
1842
+ `),0}var WP,ZE=b(()=>{"use strict";Ge();fo();Fn();Bl();De();Xr();rc();Ei();Se();ql();WP=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1843
1843
 
1844
1844
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
1845
1845
  refresh to create/update native provider sessions for team members.
1846
1846
 
1847
1847
  Root team registry:
1848
1848
  list-roots [--json] List .lmctl root teams registered by lmctl seed.
1849
- `});var nb={};ie(nb,{renderMessage:()=>tb,runTail:()=>ZP});async function ZP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${zP}
1850
- `),0;let r=P(t,["--lines","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--lines"),s=n===void 0?KP:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=M(r,"--watch"),i=j(r,"--watch-interval"),a=i===void 0?YP:Number.parseInt(i.replace(/s$/,""),10);if(!Number.isFinite(a)||a<1)return w(e,`invalid --watch-interval "${i}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let l=j(r,"--run");if(l!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(l,10);if(!Number.isFinite(f)||f<=0||String(f)!==l)return w(e,`invalid --run "${l}" (expected a positive integer run id)`);try{return await J(e,async m=>QP(e,m,f,s,o,a))}catch(m){return fe(e,m)}}let c=nr(VP,{target:r.positionals[0],alias:r.positionals[1],flags:{session:j(r,"--session"),provider:j(r,"--provider")}});if(c.mode==="error")return w(e,c.message);if(c.mode==="managed")return w(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let f;try{f=Ne(c.teamfile)}catch(p){return w(e,`tail: ${p instanceof Error?p.message:String(p)}`)}let m=gt(f);if(m===void 0)return w(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let p=Lt(c.teamfile,m.alias);u={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ge?w(e,p.message):fe(e,p)}}else try{let f=Lt(c.teamfile,c.alias);u={provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir}}catch(f){return f instanceof ge?w(e,f.message):fe(e,f)}else{let f=c.sessionid,m=c.provider;if(m===void 0){let p=await Co(f);if(p.length===0)return w(e,`tail: session "${f}" not found in any provider store`);if(p.length>1)return w(e,`tail: session "${f}" matches multiple providers (${p.join(", ")}); pass --provider`);m=p[0]}u={provider:m,sessionId:f}}let d=await QE(e,u.provider,u.sessionId,s,-1);return d<0?1:o?await new Promise(f=>{let m=async()=>{try{let g=await QE(e,u.provider,u.sessionId,s,d);g>=0&&(d=g)}catch(g){e.stderr.write(`tail: ${g instanceof Error?g.message:String(g)}
1849
+ `});var nb={};ie(nb,{renderMessage:()=>tb,runTail:()=>e1});async function e1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${QP}
1850
+ `),0;let r=P(t,["--lines","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--lines"),s=n===void 0?zP:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=M(r,"--watch"),i=j(r,"--watch-interval"),a=i===void 0?ZP:Number.parseInt(i.replace(/s$/,""),10);if(!Number.isFinite(a)||a<1)return w(e,`invalid --watch-interval "${i}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let l=j(r,"--run");if(l!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let f=Number.parseInt(l,10);if(!Number.isFinite(f)||f<=0||String(f)!==l)return w(e,`invalid --run "${l}" (expected a positive integer run id)`);try{return await J(e,async m=>t1(e,m,f,s,o,a))}catch(m){return fe(e,m)}}let c=nr(YP,{target:r.positionals[0],alias:r.positionals[1],flags:{session:j(r,"--session"),provider:j(r,"--provider")}});if(c.mode==="error")return w(e,c.message);if(c.mode==="managed")return w(e,"tail managed mode requires --run <id>");let u;if(c.mode==="ai-team")if(c.alias===void 0){let f;try{f=Ne(c.teamfile)}catch(p){return w(e,`tail: ${p instanceof Error?p.message:String(p)}`)}let m=gt(f);if(m===void 0)return w(e,`tail: ${c.teamfile} has no Lead member; pass <tf>:<alias>`);try{let p=Lt(c.teamfile,m.alias);u={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ge?w(e,p.message):fe(e,p)}}else try{let f=Lt(c.teamfile,c.alias);u={provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir}}catch(f){return f instanceof ge?w(e,f.message):fe(e,f)}else{let f=c.sessionid,m=c.provider;if(m===void 0){let p=await Co(f);if(p.length===0)return w(e,`tail: session "${f}" not found in any provider store`);if(p.length>1)return w(e,`tail: session "${f}" matches multiple providers (${p.join(", ")}); pass --provider`);m=p[0]}u={provider:m,sessionId:f}}let d=await QE(e,u.provider,u.sessionId,s,-1);return d<0?1:o?await new Promise(f=>{let m=async()=>{try{let g=await QE(e,u.provider,u.sessionId,s,d);g>=0&&(d=g)}catch(g){e.stderr.write(`tail: ${g instanceof Error?g.message:String(g)}
1851
1851
  `)}},p=setInterval(()=>{m()},a*1e3),h=()=>{clearInterval(p),f(0)};process.once("SIGINT",h),process.once("SIGTERM",h)}):0}async function QE(t,e,r,n,s){let o;try{o=await Er(r,e)}catch(l){return t.stderr.write(`tail: failed to load session: ${l instanceof Error?l.message:String(l)}
1852
1852
  `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
1853
1853
  `),-1;let i=o.messages??[],a=s<0?Math.max(0,i.length-n):s+1;if(a>=i.length)return i.length-1;for(let l=a;l<i.length;l+=1)t.stdout.write(`${tb(i[l])}
@@ -1856,16 +1856,16 @@ Root team registry:
1856
1856
  `).split(`
1857
1857
  `),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
1858
1858
  ${i.map(a=>` ${a}`).join(`
1859
- `)}`}async function QP(t,e,r,n,s,o){if(e.getRun(r)===null)return w(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),l=a.slice(Math.max(0,a.length-n));for(let u of l)t.stdout.write(`${eb(u)}
1859
+ `)}`}async function t1(t,e,r,n,s,o){if(e.getRun(r)===null)return w(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),l=a.slice(Math.max(0,a.length-n));for(let u of l)t.stdout.write(`${eb(u)}
1860
1860
  `);let c=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let f=setInterval(()=>{try{let p=e.listSessionEvents(r,c);for(let h of p)t.stdout.write(`${eb(h)}
1861
1861
  `),c=h.id}catch(p){t.stderr.write(`tail: ${p instanceof Error?p.message:String(p)}
1862
- `)}},o*1e3),m=()=>{clearInterval(f),u(0)};process.once("SIGINT",m),process.once("SIGTERM",m)}):0}function eb(t){let e=rb(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function rb(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 VP,KP,YP,zP,sb=b(()=>{"use strict";Xr();Se();_s();Ct();VP={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},KP=20,YP=2,zP=`usage: lmctl tail [target] [alias]
1862
+ `)}},o*1e3),m=()=>{clearInterval(f),u(0)};process.once("SIGINT",m),process.once("SIGTERM",m)}):0}function eb(t){let e=rb(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function rb(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 YP,zP,ZP,QP,sb=b(()=>{"use strict";Xr();Se();_s();Ct();YP={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},zP=20,ZP=2,QP=`usage: lmctl tail [target] [alias]
1863
1863
  lmctl tail --session <id> [--provider <name>]
1864
1864
  lmctl tail --run <id> [--watch] [--watch-interval Ns]
1865
1865
  [--lines N] [--watch] [--watch-interval Ns] [--provider <name>]
1866
1866
 
1867
- Print or watch provider session messages, or follow a managed run timeline.`});var ob={};ie(ob,{runInfo:()=>n1});function r1(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function n1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${t1}
1868
- `),0;let r=P(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=j(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await J(e,async u=>o1(e,u,c,n))}catch(u){return fe(e,u)}}let o=nr(e1,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:j(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"info managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return i1(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Lt(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):fe(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await Co(a);if(c.length===0)return w(e,`info: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`info: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return s1(e,i,a,l,n)}async function s1(t,e,r,n,s){let o;try{o=await Er(r,e)}catch(a){return w(t,`info: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`info: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??0,totalOutputTokens:o.totalOutputTokens??0,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(W(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
1867
+ Print or watch provider session messages, or follow a managed run timeline.`});var ob={};ie(ob,{runInfo:()=>o1});function s1(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function o1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${n1}
1868
+ `),0;let r=P(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=j(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(j(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await J(e,async u=>a1(e,u,c,n))}catch(u){return fe(e,u)}}let o=nr(r1,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:j(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"info managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return l1(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Lt(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):fe(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await Co(a);if(c.length===0)return w(e,`info: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`info: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return i1(e,i,a,l,n)}async function i1(t,e,r,n,s){let o;try{o=await Er(r,e)}catch(a){return w(t,`info: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`info: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??0,totalOutputTokens:o.totalOutputTokens??0,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(W(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
1869
1869
  `),t.stdout.write(` Provider: ${o.provider}
1870
1870
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
1871
1871
  `),t.stdout.write(` CWD: ${o.cwd}
@@ -1874,7 +1874,7 @@ Print or watch provider session messages, or follow a managed run timeline.`});v
1874
1874
  `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out`),i.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${i.totalCachedInputTokens})`),t.stdout.write(`
1875
1875
  `),t.stdout.write(` Created: ${i.createdAt}
1876
1876
  `),t.stdout.write(` Modified: ${i.modifiedAt}
1877
- `),0)}async function o1(t,e,r,n){let s=gr(e,r);if(s===null)return w(t,`info: run ${r}: not found`);let o=qr(e,r),i=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(W(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:o?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:i.totalInputTokens,totalOutputTokens:i.totalOutputTokens,agent_call_count:i.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
1877
+ `),0)}async function a1(t,e,r,n){let s=gr(e,r);if(s===null)return w(t,`info: run ${r}: not found`);let o=qr(e,r),i=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(W(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:o?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:i.totalInputTokens,totalOutputTokens:i.totalOutputTokens,agent_call_count:i.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
1878
1878
  `),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
1879
1879
  `),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
1880
1880
  `),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
@@ -1884,56 +1884,56 @@ Print or watch provider session messages, or follow a managed run timeline.`});v
1884
1884
  `),t.stdout.write(` Steps: ${s.steps.length}
1885
1885
  `),t.stdout.write(` AgentCalls: ${i.agentCallCount}
1886
1886
  `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
1887
- `),0)}async function i1(t,e,r){let n;try{n=Ne(e)}catch(u){return w(t,`info: ${u instanceof Error?u.message:String(u)}`)}let s=[],o=0;for(let u of n.members){if(u.teamfile!==void 0||u.session===void 0||u.session.length===0)continue;let d=null;try{d=await Er(u.session,u.provider)}catch(m){t.stderr.write(`warning: failed to load session "${u.session}" for ${u.alias} (${u.provider}): ${m instanceof Error?m.message:String(m)}
1887
+ `),0)}async function l1(t,e,r){let n;try{n=Ne(e)}catch(u){return w(t,`info: ${u instanceof Error?u.message:String(u)}`)}let s=[],o=0;for(let u of n.members){if(u.teamfile!==void 0||u.session===void 0||u.session.length===0)continue;let d=null;try{d=await Er(u.session,u.provider)}catch(m){t.stderr.write(`warning: failed to load session "${u.session}" for ${u.alias} (${u.provider}): ${m instanceof Error?m.message:String(m)}
1888
1888
  `)}let f=d?.messageCount??0;s.push({alias:u.alias,provider:u.provider,sessionid:u.session,messageCount:f,model:d?.model??"(unknown)",lastContext:d?.lastInputTokens}),o+=f}if(r)return W(t,{team:n.name,members:s,total:{messageCount:o}}),0;let i=Math.max(7,...s.map(u=>u.sessionid.length)),a=Math.max(5,...s.map(u=>u.alias.length))+1,l=Math.max(8,...s.map(u=>u.provider.length))+1,c=Math.max(5,...s.map(u=>u.model.length))+1;t.stdout.write(`TEAM: ${n.name}
1889
1889
  `),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
1890
- `);for(let u of s){let d=u.lastContext!==void 0?r1(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${String(u.messageCount).padStart(6)} ${d.padStart(12)}
1890
+ `);for(let u of s){let d=u.lastContext!==void 0?s1(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${String(u.messageCount).padStart(6)} ${d.padStart(12)}
1891
1891
  `)}return t.stdout.write(` ${"TOTAL".padEnd(i)} ${"".padEnd(a)}${"".padEnd(l)}${"".padEnd(c)}${String(o).padStart(6)}
1892
- `),0}var e1,t1,ib=b(()=>{"use strict";Xr();Se();_s();Ct();$t();e1={name:"info",allowsBareTeamfile:!0,supportsRaw:!0},t1=`usage: lmctl info [target] [alias]
1892
+ `),0}var r1,n1,ib=b(()=>{"use strict";Xr();Se();_s();Ct();$t();r1={name:"info",allowsBareTeamfile:!0,supportsRaw:!0},n1=`usage: lmctl info [target] [alias]
1893
1893
  lmctl info <teamfile> # team rollup
1894
1894
  lmctl info <sessionid> [--provider <name>]
1895
1895
  [--json]
1896
1896
 
1897
- Show provider session details, team rollups, or managed run state/token totals.`});var lb={};ie(lb,{runLs:()=>u1});import{resolve as ld}from"node:path";function c1(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 u1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${a1}
1898
- `),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=j(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(j(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=j(r,"--limit"),h=l1;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>ab)return w(e,`--limit ${_} exceeds maximum (${ab})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await J(e,async _=>d1(e,_,h,g))}catch(_){return fe(e,_)}}let i=f1(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=j(r,"--provider"),c=j(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await Tl(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?ld(c):ld(process.cwd());f=f.filter(h=>{let g=ld(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=c1(f),a==="json")return W(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1897
+ Show provider session details, team rollups, or managed run state/token totals.`});var lb={};ie(lb,{runLs:()=>f1});import{resolve as ld}from"node:path";function d1(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 f1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${c1}
1898
+ `),0;let r=P(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=j(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(j(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=j(r,"--limit"),h=u1;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>ab)return w(e,`--limit ${_} exceeds maximum (${ab})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await J(e,async _=>m1(e,_,h,g))}catch(_){return fe(e,_)}}let i=p1(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=j(r,"--provider"),c=j(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await Tl(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?ld(c):ld(process.cwd());f=f.filter(h=>{let g=ld(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=d1(f),a==="json")return W(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1899
1899
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
1900
1900
  `);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
1901
1901
  `);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()}
1902
- `)}return 0}async function d1(t,e,r,n){let s=Br(e,{limit:r});if(n==="json")return W(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
1902
+ `)}return 0}async function m1(t,e,r,n){let s=Br(e,{limit:r});if(n==="json")return W(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
1903
1903
  `),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
1904
1904
  `);for(let o of s){let i=(o.current_state??"").padEnd(20),a=(o.terminal_state??"").padEnd(20);t.stdout.write(`${String(o.id).padEnd(8)} ${String(o.workflow_id).padEnd(8)} ${String(o.team_id).padEnd(8)} ${i} ${a} ${o.started_at}
1905
- `)}return 0}function f1(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var a1,l1,ab,cb=b(()=>{"use strict";It();Se();$t();a1=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
1905
+ `)}return 0}function p1(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var c1,u1,ab,cb=b(()=>{"use strict";It();Se();$t();c1=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
1906
1906
  [--recursive] [--all] [--format table|teamfile|json] [--json]
1907
1907
  lmctl ls --runs [--limit N] [--format table|json] [--json]
1908
1908
 
1909
- List native provider sessions in scope, or list recent managed runs with --runs.`,l1=50,ab=500});import{existsSync as db,readFileSync as fb}from"node:fs";import{homedir as m1}from"node:os";import{dirname as p1,resolve as mb}from"node:path";import{fileURLToPath as h1}from"node:url";function pb(t,e={}){let r=[],n=w1(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model)continue;let a=T1(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.github-copilot.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${ub(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(aa??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${ub(i)}`)}return r}function w1(t){if(!t&&bs)return bs;let e=new Map,r,n=t??y1();if(!db(n))return r=`${n} not found`,t||cd(e),t||(bs=e),t||(aa=r),e;let s;try{s=fb(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||cd(e),t||(bs=e),t||(aa=r),e}for(let[o,i]of Object.entries(_1)){let a=E1(s,i),l=b1(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&cd(e),t||(bs=e),t||(aa=r),e}function y1(){let t=p1(h1(import.meta.url));return mb(t,"..","..","..","durable-memory","model_selection.md")}function cd(t){for(let[e,r]of Object.entries(g1))t.set(e,r)}function E1(t,e){let n=new RegExp(`^## ${k1(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function b1(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function T1(t){let e=t??mb(m1(),".config","opencode","opencode.json"),r=zf();if(!db(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(fb(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...S1(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function S1(t){if(!ud(t))return[];let e=ia(t.provider)??ia(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!ud(s))continue;let o=ia(s.models)??ia(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function ia(t){return ud(t)?t:null}function ud(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ub(t){return t.length>0?t.join(", "):"(none)"}function k1(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var _1,g1,bs,aa,hb=b(()=>{"use strict";Ha();_1={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},g1={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},bs=null});var Is={};ie(Is,{GEMINI_PROVIDER_NOTICE:()=>bb,_setSkillFileOpsForTests:()=>M1,_setTeamfileSeedForTests:()=>L1,buildRootTeamRegistrationRow:()=>vb,persistTeamConnections:()=>$b,registerRootTeam:()=>Ib,runHire:()=>P1,runLint:()=>D1,runRefresh:()=>F1,runSeed:()=>Sb,sha256Text:()=>kb,skillNameFromSource:()=>_d,skillNameFromUrl:()=>eF});import{createHash as v1,randomUUID as I1}from"node:crypto";import{existsSync as $1,mkdirSync as N1,readFileSync as ks,realpathSync as fd,renameSync as x1,unlinkSync as j1,writeFileSync as jr}from"node:fs";import{basename as A1,dirname as da,isAbsolute as _b,join as ua,resolve as vs}from"node:path";function L1(t){Tb=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(It(),kl)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function M1(t){Ss=t===null?md:{...md,...t}}async function D1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(O1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1909
+ List native provider sessions in scope, or list recent managed runs with --runs.`,u1=50,ab=500});import{existsSync as db,readFileSync as fb}from"node:fs";import{homedir as h1}from"node:os";import{dirname as _1,resolve as mb}from"node:path";import{fileURLToPath as g1}from"node:url";function pb(t,e={}){let r=[],n=E1(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model)continue;let a=k1(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.github-copilot.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${ub(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(aa??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${ub(i)}`)}return r}function E1(t){if(!t&&bs)return bs;let e=new Map,r,n=t??b1();if(!db(n))return r=`${n} not found`,t||cd(e),t||(bs=e),t||(aa=r),e;let s;try{s=fb(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||cd(e),t||(bs=e),t||(aa=r),e}for(let[o,i]of Object.entries(w1)){let a=T1(s,i),l=S1(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&cd(e),t||(bs=e),t||(aa=r),e}function b1(){let t=_1(g1(import.meta.url));return mb(t,"..","..","..","durable-memory","model_selection.md")}function cd(t){for(let[e,r]of Object.entries(y1))t.set(e,r)}function T1(t,e){let n=new RegExp(`^## ${I1(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function S1(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function k1(t){let e=t??mb(h1(),".config","opencode","opencode.json"),r=zf();if(!db(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(fb(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...v1(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function v1(t){if(!ud(t))return[];let e=ia(t.provider)??ia(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!ud(s))continue;let o=ia(s.models)??ia(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function ia(t){return ud(t)?t:null}function ud(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ub(t){return t.length>0?t.join(", "):"(none)"}function I1(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var w1,y1,bs,aa,hb=b(()=>{"use strict";Ha();w1={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},y1={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},bs=null});var Is={};ie(Is,{GEMINI_PROVIDER_NOTICE:()=>bb,_setSkillFileOpsForTests:()=>P1,_setTeamfileSeedForTests:()=>D1,buildRootTeamRegistrationRow:()=>vb,persistTeamConnections:()=>$b,registerRootTeam:()=>Ib,runHire:()=>U1,runLint:()=>F1,runRefresh:()=>W1,runSeed:()=>Sb,sha256Text:()=>kb,skillNameFromSource:()=>_d,skillNameFromUrl:()=>rF});import{createHash as $1,randomUUID as N1}from"node:crypto";import{existsSync as x1,mkdirSync as j1,readFileSync as ks,realpathSync as fd,renameSync as A1,unlinkSync as R1,writeFileSync as jr}from"node:fs";import{basename as O1,dirname as da,isAbsolute as _b,join as ua,resolve as vs}from"node:path";function D1(t){Tb=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(It(),kl)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function P1(t){Ss=t===null?md:{...md,...t}}async function F1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(L1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1910
1910
  `),2;let r=t[0],n;try{n=Ne(r)}catch(i){return Le(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=qu(n,da(vs(r))),o=pb(n.members);for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1911
1911
  `);if(s.length===0)try{Ir(r)}catch(i){return e.stderr.write(`error: connect: ${i instanceof Error?i.message:String(i)}
1912
1912
  `),1}for(let i of n.members)hd([i],e),i.session!==void 0&&i.session.length<Ts&&o.push(`${i.alias}: sessionid is shorter than ${Ts} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1913
1913
  `);return await J(e,i=>{yE(r,i,a=>e.stderr.write(`${a}
1914
1914
  `))}),s.length>0?1:(e.stdout.write(`ok
1915
- `),0)}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(C1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
1915
+ `),0)}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(M1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
1916
1916
  `),2;let r=t[0],n=vs(r),s;try{s=fd(n)}catch(E){return Le(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let o=da(n),i;try{i=Ne(n)}catch(E){return Le(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let a=qu(i,o);if(a.length>0){hd(i.members,e);for(let E of a)e.stderr.write(`error: ${E.field}: ${E.message}
1917
- `);return 1}let l;try{l=Ir(n)}catch(E){return Le(e,`connect: ${E instanceof Error?E.message:String(E)}`)}hd(i.members,e);let c=await Y1(i.skillUrls,o,e);if(c!==0)return c;let u=ks(n,"utf8"),d=u.split(`
1918
- `),f=W1(d),m=0,p=i.members.filter(E=>E.teamfile!==void 0?!1:E.session===void 0||E.session.length<Ts);for(let E of p)if(!xb(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
1917
+ `);return 1}let l;try{l=Ir(n)}catch(E){return Le(e,`connect: ${E instanceof Error?E.message:String(E)}`)}hd(i.members,e);let c=await Z1(i.skillUrls,o,e);if(c!==0)return c;let u=ks(n,"utf8"),d=u.split(`
1918
+ `),f=q1(d),m=0,p=i.members.filter(E=>E.teamfile!==void 0?!1:E.session===void 0||E.session.length<Ts);for(let E of p)if(!xb(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
1919
1919
  `),1;let h=i.members.find(E=>E.alias.toLowerCase()==="lead");if(h!==void 0){Mr("lmctl","lmctl_chat",{warn:v=>e.stderr.write(`${v}
1920
- `)});let E=h.sessiondir??o;try{K1(E)&&e.stdout.write(`.mcp.json installed in ${E}
1920
+ `)});let E=h.sessiondir??o;try{z1(E)&&e.stdout.write(`.mcp.json installed in ${E}
1921
1921
  `)}catch(v){e.stderr.write(`warning: .mcp.json install failed: ${v instanceof Error?v.message:String(v)}
1922
1922
  `)}}for(let E of i.members){if(E.teamfile!==void 0)continue;if(E.session!==void 0&&E.session.length>=Ts){e.stderr.write(`warning: ${E.alias}: existing sessionid preserved; skipping
1923
- `);continue}let v=E.sessiondir??o,I=await Tb({provider:E.provider,cwd:v,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:U1(n,u,i.members)}:{}});if(I.error!==void 0||I.sessionId===void 0||I.sessionId.length<Ts)return e.stderr.write(`error: ${E.alias}: seed failed${I.error!==void 0?`: ${I.error}`:"; provider did not report a sessionid"}
1923
+ `);continue}let v=E.sessiondir??o,I=await Tb({provider:E.provider,cwd:v,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:B1(n,u,i.members)}:{}});if(I.error!==void 0||I.sessionId===void 0||I.sessionId.length<Ts)return e.stderr.write(`error: ${E.alias}: seed failed${I.error!==void 0?`: ${I.error}`:"; provider did not report a sessionid"}
1924
1924
  `),1;let k=f.get(E.alias.toLowerCase());if(k===void 0)return e.stderr.write(`error: ${E.alias}: could not find matching _MEMBER_ line to update
1925
1925
  `),1;let R=wb(d[k],"sessionid",I.sessionId);E.sessiondir===void 0&&(R=wb(R,"sessiondir",o)),d[k]=R,m+=1,jr(n,d.join(`
1926
1926
  `),"utf8"),e.stdout.write(`${E.alias}: seeded ${I.sessionId}
1927
1927
  `)}let g=d.join(`
1928
- `),_=X1(g,fd(n));_!==g&&jr(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
1929
- `);let S=new Date().toISOString();return await J(e,E=>{Ib(E,{teamfilePath:s,name:i.name,rawText:_,now:S}),$b(E,l,S)}),0}async function P1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ca),0;let r=P(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return dd(e,r.error,ca);if(r.positionals.length!==2)return dd(e,"expected <teamfile.lmctl> and <alias>",ca);let[n,s]=r.positionals;if(!H1(s))return Le(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Le(e,"hire only applies to non-Lead members");let o=j(r,"--provider");if(o===void 0)return dd(e,"missing value for --provider",ca);if(!xb(o))return Le(e,`invalid provider "${o}"`);let i=vs(n),a;try{a=ks(i,"utf8")}catch(d){return Le(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(q1(a,s))return Le(e,`${s}: alias already exists in ${i}`);let l=j(r,"--sessiondir")??da(i),c=`_MEMBER_ alias=${pd(s)} provider=${o} sessiondir=${pd(l)}`,u=G1(a,c);return jr(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
1928
+ `),_=K1(g,fd(n));_!==g&&jr(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
1929
+ `);let S=new Date().toISOString();return await J(e,E=>{Ib(E,{teamfilePath:s,name:i.name,rawText:_,now:S}),$b(E,l,S)}),0}async function U1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ca),0;let r=P(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return dd(e,r.error,ca);if(r.positionals.length!==2)return dd(e,"expected <teamfile.lmctl> and <alias>",ca);let[n,s]=r.positionals;if(!G1(s))return Le(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Le(e,"hire only applies to non-Lead members");let o=j(r,"--provider");if(o===void 0)return dd(e,"missing value for --provider",ca);if(!xb(o))return Le(e,`invalid provider "${o}"`);let i=vs(n),a;try{a=ks(i,"utf8")}catch(d){return Le(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(J1(a,s))return Le(e,`${s}: alias already exists in ${i}`);let l=j(r,"--sessiondir")??da(i),c=`_MEMBER_ alias=${pd(s)} provider=${o} sessiondir=${pd(l)}`,u=V1(a,c);return jr(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
1930
1930
  `),e.stdout.write(`Run: lmctl seed ${i}
1931
- `),0}async function F1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(gb),0;if(t.length!==2)return e.stderr.write(gb),2;let[r,n]=t;if(n.toLowerCase()==="lead")return Le(e,"refresh only applies to non-Lead members");let s=vs(r),o;try{o=ks(s,"utf8")}catch(c){return Le(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=o.split(`
1932
- `),a=B1(i,n);if(a===void 0)return Le(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];return fa(l,"teamfile")!==void 0?Le(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`):(i[a]=J1(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),jr(s,i.join(`
1933
- `),"utf8"),Sb([s],e))}function kb(t){return v1("sha256").update(t).digest("hex")}function vb(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:kb(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function Ib(t,e){let r=vb(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function $b(t,e,r){for(let n of e.snapshots)t.replaceTeamConnections(n.source_teamfile,n.connections.map(s=>({target_name:s.target_name,target_teamfile:s.target_teamfile,created_at:r})))}function U1(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
1931
+ `),0}async function W1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(gb),0;if(t.length!==2)return e.stderr.write(gb),2;let[r,n]=t;if(n.toLowerCase()==="lead")return Le(e,"refresh only applies to non-Lead members");let s=vs(r),o;try{o=ks(s,"utf8")}catch(c){return Le(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=o.split(`
1932
+ `),a=H1(i,n);if(a===void 0)return Le(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];return fa(l,"teamfile")!==void 0?Le(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`):(i[a]=X1(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),jr(s,i.join(`
1933
+ `),"utf8"),Sb([s],e))}function kb(t){return $1("sha256").update(t).digest("hex")}function vb(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:kb(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function Ib(t,e){let r=vb(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function $b(t,e,r){for(let n of e.snapshots)t.replaceTeamConnections(n.source_teamfile,n.connections.map(s=>({target_name:s.target_name,target_teamfile:s.target_teamfile,created_at:r})))}function B1(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
1934
1934
  `):"- (no non-Lead members)";return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Use only the lmctl_chat MCP tool for member pings and delegation.","","Team members:",s,"","Example MCP calls:",...r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>`lmctl_chat(team="${t}", alias="${o.alias}", prompt="your task here")`),"","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(`
1935
- `)}function W1(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=fa(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function B1(t,e){for(let r=0;r<t.length;r+=1){let n=t[r];if(/^\s*_MEMBER_\s+\S/u.test(n)&&fa(n,"alias")===e)return r}}function q1(t,e){for(let r of t.split(`
1936
- `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&fa(r,"alias")===e)return!0;return!1}function H1(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function fa(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function wb(t,e,r){let n=`${e}=${pd(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function J1(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function pd(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function G1(t,e){let r=t.split(`
1935
+ `)}function q1(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=fa(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function H1(t,e){for(let r=0;r<t.length;r+=1){let n=t[r];if(/^\s*_MEMBER_\s+\S/u.test(n)&&fa(n,"alias")===e)return r}}function J1(t,e){for(let r of t.split(`
1936
+ `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&fa(r,"alias")===e)return!0;return!1}function G1(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function fa(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function wb(t,e,r){let n=`${e}=${pd(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function X1(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function pd(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function V1(t,e){let r=t.split(`
1937
1937
  `),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*(?:_MEMBER_|_CONNECT_|_SKILL_)(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,e),r.join(`
1938
1938
  `);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
1939
1939
  `),i=r.slice(s).join(`
@@ -1941,26 +1941,26 @@ List native provider sessions in scope, or list recent managed runs with --runs.
1941
1941
 
1942
1942
  `:""}${e}${i.length>0?`
1943
1943
  ${i}`:`
1944
- `}`}function X1(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
1944
+ `}`}function K1(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
1945
1945
  `),s=n>=0?t.slice(0,n):t,o=n>=0?t.slice(n+1):"";return s===r?t:s.startsWith("#teamfile:")?o.length>0?`${r}
1946
1946
  ${o}`:`${r}
1947
1947
  `:t.length>0?`${r}
1948
1948
  ${t}`:`${r}
1949
- `}function V1(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function K1(t){let e=ua(t,".mcp.json"),r=V1();if(!$1(e))return jr(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
1949
+ `}function Y1(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function z1(t){let e=ua(t,".mcp.json"),r=Y1();if(!x1(e))return jr(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
1950
1950
  `,"utf8"),!0;let n;try{n=JSON.parse(ks(e,"utf8"))}catch{return!1}if(n===null||typeof n!="object"||Array.isArray(n))return!1;let s=Eb(n.mcpServers)?{...n.mcpServers}:{},o=Eb(s.lmctl)?s.lmctl:void 0;return o!==void 0&&o.type===r.type&&o.command===r.command&&JSON.stringify(o.args)===JSON.stringify(r.args)?!1:(s.lmctl=r,n.mcpServers=s,jr(e,JSON.stringify(n,null,2)+`
1951
- `,"utf8"),!0)}async function Y1(t,e,r){if(t.length===0)return 0;let n=ua(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await Nb(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return Le(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
1951
+ `,"utf8"),!0)}async function Z1(t,e,r){if(t.length===0)return 0;let n=ua(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await Nb(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return Le(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
1952
1952
  `);for(let i of o){let a=`<!-- lmctl _SKILL_ source: ${i.source} -->
1953
1953
  ${i.body}${i.body.endsWith(`
1954
1954
  `)?"":`
1955
- `}`;try{Ss.mkdirSync(n,{recursive:!0}),Q1(n,i.name,a)}catch(l){return Le(r,`skill ${i.source}: ${l instanceof Error?l.message:String(l)}`)}r.stdout.write(`skill ${i.name}: wrote durable-memory/skills/${i.name}.md
1956
- `)}return 0}async function Nb(t,e,r,n,s){if(s>la)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${la}`);let o=await z1(t,e),i=Z1(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:_d(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=la)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${la}`);for(let a of i)await Nb(a,o.base,r,n,s+1)}async function z1(t,e){if(e.kind==="https"){if(Ft(t)||!_b(t)){let o=yb(t,e),i;try{i=await ur(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:hn(o),source:hn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(Ft(t)){let o=yb(t,e),i;try{i=await ur(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:hn(o),source:hn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=_b(t)?t:vs(e.kind==="file"?e.baseDir:".",t),n,s;try{n=fd(r),s=ks(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:da(n)},text:s}}function yb(t,e){if(Ft(t)){if(!ut(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return hn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!ut(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return hn(r)}function Z1(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(Ft(l)&&!ut(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function hn(t){return new URL(t).href}function Q1(t,e,r){let n=ua(t,`${e}.md`),s=ua(t,`${e}.${process.pid}.${I1().slice(0,8)}.tmp`);try{Ss.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Ss.renameSync(s,n)}catch(o){try{Ss.unlinkSync(s)}catch{}throw o}}function eF(t){return _d(t)}function _d(t){let e=ut(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(A1(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,R1).replace(/-+$/gu,"")||"skill"}function Eb(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function xb(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Le(t,e){return t.stderr.write(`error: ${e}
1955
+ `}`;try{Ss.mkdirSync(n,{recursive:!0}),tF(n,i.name,a)}catch(l){return Le(r,`skill ${i.source}: ${l instanceof Error?l.message:String(l)}`)}r.stdout.write(`skill ${i.name}: wrote durable-memory/skills/${i.name}.md
1956
+ `)}return 0}async function Nb(t,e,r,n,s){if(s>la)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${la}`);let o=await Q1(t,e),i=eF(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:_d(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=la)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${la}`);for(let a of i)await Nb(a,o.base,r,n,s+1)}async function Q1(t,e){if(e.kind==="https"){if(Ft(t)||!_b(t)){let o=yb(t,e),i;try{i=await ur(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:hn(o),source:hn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(Ft(t)){let o=yb(t,e),i;try{i=await ur(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:hn(o),source:hn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=_b(t)?t:vs(e.kind==="file"?e.baseDir:".",t),n,s;try{n=fd(r),s=ks(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:da(n)},text:s}}function yb(t,e){if(Ft(t)){if(!ut(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return hn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!ut(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return hn(r)}function eF(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(Ft(l)&&!ut(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function hn(t){return new URL(t).href}function tF(t,e,r){let n=ua(t,`${e}.md`),s=ua(t,`${e}.${process.pid}.${N1().slice(0,8)}.tmp`);try{Ss.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Ss.renameSync(s,n)}catch(o){try{Ss.unlinkSync(s)}catch{}throw o}}function rF(t){return _d(t)}function _d(t){let e=ut(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(O1(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,C1).replace(/-+$/gu,"")||"skill"}function Eb(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function xb(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Le(t,e){return t.stderr.write(`error: ${e}
1957
1957
  `),1}function dd(t,e,r){return t.stderr.write(`error: ${e}
1958
1958
  ${r}`),2}function hd(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; migrate to team-level _CONNECT_ (alias=${r.alias} teamfile=${r.teamfile})
1959
1959
  `),r.provider==="gemini"&&e.stderr.write(`${bb.replace("%s",r.alias)}
1960
- `)}var Ts,R1,la,O1,C1,ca,gb,bb,md,Tb,Ss,$s=b(()=>{"use strict";Ct();hb();Gs();Se();na();Ms();Ts=5,R1=80,la=16,O1=`usage: lmctl lint <teamfile.lmctl>
1960
+ `)}var Ts,C1,la,L1,M1,ca,gb,bb,md,Tb,Ss,$s=b(()=>{"use strict";Ct();hb();Gs();Se();na();Ms();Ts=5,C1=80,la=16,L1=`usage: lmctl lint <teamfile.lmctl>
1961
1961
 
1962
1962
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
1963
- `,C1=`usage: lmctl seed <teamfile.lmctl>
1963
+ `,M1=`usage: lmctl seed <teamfile.lmctl>
1964
1964
 
1965
1965
  Seed missing or placeholder session ids in an lmctl teamfile by calling each
1966
1966
  member's configured native provider.
@@ -1972,22 +1972,22 @@ after editing to create the provider session.
1972
1972
 
1973
1973
  Replace a non-Lead member's provider session by clearing its sessionid and
1974
1974
  running lmctl seed for the teamfile.
1975
- `,bb='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',md={mkdirSync:N1,writeFileSync:jr,renameSync:x1,unlinkSync:j1},Tb=async t=>{let{seed:e}=await Promise.resolve().then(()=>(It(),kl)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Ss=md});var Lb={};ie(Lb,{runConnect:()=>sF});import{existsSync as jb,readFileSync as tF,realpathSync as gd,writeFileSync as Ab}from"node:fs";import{dirname as Ob,relative as rF,resolve as wd}from"node:path";async function sF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(nF),0;if(t.length!==3)return e.stderr.write(`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1975
+ `,bb='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',md={mkdirSync:j1,writeFileSync:jr,renameSync:A1,unlinkSync:R1},Tb=async t=>{let{seed:e}=await Promise.resolve().then(()=>(It(),kl)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Ss=md});var Lb={};ie(Lb,{runConnect:()=>iF});import{existsSync as jb,readFileSync as nF,realpathSync as gd,writeFileSync as Ab}from"node:fs";import{dirname as Ob,relative as sF,resolve as wd}from"node:path";async function iF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(oF),0;if(t.length!==3)return e.stderr.write(`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1976
1976
  `),2;let[r,n,s]=t;if(!Rb.test(s))return e.stderr.write(`error: invalid connection name "${s}" (must match ${Rb.source})
1977
1977
  `),2;let o=wd(r),i=wd(n);if(!o.endsWith(".lmctl")||!i.endsWith(".lmctl"))return e.stderr.write(`error: from_lmctl and to_lmctl must both end with .lmctl
1978
1978
  `),2;if(!jb(o))return e.stderr.write(`error: source teamfile not found: ${o}
1979
1979
  `),1;if(!jb(i))return e.stderr.write(`error: target teamfile not found: ${i}
1980
1980
  `),1;let a=gd(o),l=gd(i);if(a===l)return e.stderr.write(`error: ${Vi}
1981
- `),1;try{oF(o,"source")}catch(m){return e.stderr.write(`error: ${m instanceof Error?m.message:String(m)}
1982
- `),1}let c=tF(o,"utf8"),u=iF(o,i),d=`_CONNECT_ alias=${s} teamfile=${fF(u)}`;if(cF(c,Ob(o),s,l))return e.stderr.write(`error: _CONNECT_ alias "${s}" to ${l} already exists in ${o}
1983
- `),1;let f=aF(c,d);Ab(o,f,"utf8");try{Ir(o)}catch(m){return Ab(o,c,"utf8"),e.stderr.write(`error: connect validation failed; source restored: ${m instanceof Error?m.message:String(m)}
1981
+ `),1;try{aF(o,"source")}catch(m){return e.stderr.write(`error: ${m instanceof Error?m.message:String(m)}
1982
+ `),1}let c=nF(o,"utf8"),u=lF(o,i),d=`_CONNECT_ alias=${s} teamfile=${pF(u)}`;if(dF(c,Ob(o),s,l))return e.stderr.write(`error: _CONNECT_ alias "${s}" to ${l} already exists in ${o}
1983
+ `),1;let f=cF(c,d);Ab(o,f,"utf8");try{Ir(o)}catch(m){return Ab(o,c,"utf8"),e.stderr.write(`error: connect validation failed; source restored: ${m instanceof Error?m.message:String(m)}
1984
1984
  `),1}return e.stdout.write(`Connected ${o} -> ${s} (${l})
1985
1985
  `),e.stdout.write(`Run: lmctl lint ${o}
1986
1986
  `),e.stdout.write(`Then run: lmctl seed ${o}
1987
- `),0}function oF(t,e){let r=Ne(t);if(r.parseErrors.length>0)throw new Error(`${e} teamfile parse error: ${r.parseErrors.join("; ")}`);if(gt(r)===void 0)throw new Error(`${e} teamfile has no Lead: ${t}`)}function iF(t,e){let r=rF(Ob(t),e).replace(/\\/g,"/");return r.startsWith(".")?r:`./${r}`}function aF(t,e){let r=t.split(`
1988
- `),n=lF(r),s=n>=0?n+1:dF(r);return r.splice(s,0,e),r.join(`
1989
- `)}function lF(t){for(let e=t.length-1;e>=0;e-=1)if(/^\s*(?:_MEMBER_|_CONNECT_)(?:\s|$)/.test(t[e]))return e;return-1}function cF(t,e,r,n){return t.split(`
1990
- `).some(s=>/^\s*_CONNECT_(?:\s|$)/.test(s)&&Cb(s,"alias")===r&&uF(e,s)===n)}function uF(t,e){let r=Cb(e,"teamfile");if(r===void 0||r.length===0)return null;try{return gd(wd(t,r))}catch{return null}}function dF(t){let e=t.length;for(;e>0&&t[e-1]==="";)e-=1;return e}function Cb(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function fF(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}var nF,Rb,Mb=b(()=>{"use strict";Ct();nF=`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1987
+ `),0}function aF(t,e){let r=Ne(t);if(r.parseErrors.length>0)throw new Error(`${e} teamfile parse error: ${r.parseErrors.join("; ")}`);if(gt(r)===void 0)throw new Error(`${e} teamfile has no Lead: ${t}`)}function lF(t,e){let r=sF(Ob(t),e).replace(/\\/g,"/");return r.startsWith(".")?r:`./${r}`}function cF(t,e){let r=t.split(`
1988
+ `),n=uF(r),s=n>=0?n+1:mF(r);return r.splice(s,0,e),r.join(`
1989
+ `)}function uF(t){for(let e=t.length-1;e>=0;e-=1)if(/^\s*(?:_MEMBER_|_CONNECT_)(?:\s|$)/.test(t[e]))return e;return-1}function dF(t,e,r,n){return t.split(`
1990
+ `).some(s=>/^\s*_CONNECT_(?:\s|$)/.test(s)&&Cb(s,"alias")===r&&fF(e,s)===n)}function fF(t,e){let r=Cb(e,"teamfile");if(r===void 0||r.length===0)return null;try{return gd(wd(t,r))}catch{return null}}function mF(t){let e=t.length;for(;e>0&&t[e-1]==="";)e-=1;return e}function Cb(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function pF(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}var oF,Rb,Mb=b(()=>{"use strict";Ct();oF=`usage: lmctl connect <from.lmctl> <to.lmctl> <name>
1991
1991
 
1992
1992
  Append a team-level _CONNECT_ edge to member <name> in the target teamfile.
1993
1993
  The sender is always the source team's Lead.
@@ -1995,32 +1995,32 @@ The sender is always the source team's Lead.
1995
1995
  After editing, run:
1996
1996
  lmctl lint <from.lmctl>
1997
1997
  lmctl seed <from.lmctl>
1998
- `,Rb=/^[A-Za-z][A-Za-z0-9_-]*$/});var Ub={};ie(Ub,{runClone:()=>yF});import{existsSync as Ed,mkdirSync as mF,readFileSync as pF,readdirSync as hF,statSync as Pb,writeFileSync as _F}from"node:fs";import{basename as Db,dirname as yd,extname as gF,join as Fb,resolve as ma}from"node:path";async function yF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(wF),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
1999
- `),2;let[r,n]=t,s,o=null,i=r;try{if(/^https?:\/\//i.test(r)){let u=await fetch(r);if(!u.ok)throw new Error(`HTTP ${u.status}`);s=await u.text()}else{let u=ma(r);if(!Ed(u))throw new Error(`source not found: ${r}`);let f=Pb(u).isDirectory()?EF(u):u;s=pF(f,"utf8"),o=yd(f),i=f}}catch(u){return e.stderr.write(`error: ${u instanceof Error?u.message:String(u)}
2000
- `),1}let a=ma(n),l=bF(a,i,n);if(Ed(l))return e.stderr.write(`error: ${l} already exists.
2001
- `),1;let c=TF(s);return o!==null&&(c=SF(c,o,yd(l))),mF(yd(l),{recursive:!0}),_F(l,c,"utf8"),e.stdout.write(`Cloned ${r} -> ${l}
1998
+ `,Rb=/^[A-Za-z][A-Za-z0-9_-]*$/});var Ub={};ie(Ub,{runClone:()=>bF});import{existsSync as Ed,mkdirSync as hF,readFileSync as _F,readdirSync as gF,statSync as Pb,writeFileSync as wF}from"node:fs";import{basename as Db,dirname as yd,extname as yF,join as Fb,resolve as ma}from"node:path";async function bF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(EF),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
1999
+ `),2;let[r,n]=t,s,o=null,i=r;try{if(/^https?:\/\//i.test(r)){let u=await fetch(r);if(!u.ok)throw new Error(`HTTP ${u.status}`);s=await u.text()}else{let u=ma(r);if(!Ed(u))throw new Error(`source not found: ${r}`);let f=Pb(u).isDirectory()?TF(u):u;s=_F(f,"utf8"),o=yd(f),i=f}}catch(u){return e.stderr.write(`error: ${u instanceof Error?u.message:String(u)}
2000
+ `),1}let a=ma(n),l=SF(a,i,n);if(Ed(l))return e.stderr.write(`error: ${l} already exists.
2001
+ `),1;let c=kF(s);return o!==null&&(c=vF(c,o,yd(l))),hF(yd(l),{recursive:!0}),wF(l,c,"utf8"),e.stdout.write(`Cloned ${r} -> ${l}
2002
2002
  `),e.stdout.write(`Edit ${l}; only _MEMBER_ lines are parsed, everything else is free-form.
2003
2003
  `),e.stdout.write(`After editing, run: lmctl lint ${l}
2004
2004
  `),e.stdout.write(`Then run: lmctl seed ${l}
2005
- `),0}function EF(t){let e=hF(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return Fb(t,e[0])}function bF(t,e,r){if(r.endsWith("/")||Ed(t)&&Pb(t).isDirectory()){let n=Db(e).endsWith(".lmctl")?Db(e):"team.lmctl";return Fb(t,n)}return gF(t)?t:`${t}.lmctl`}function TF(t){return t.split(`
2005
+ `),0}function TF(t){let e=gF(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return Fb(t,e[0])}function SF(t,e,r){if(r.endsWith("/")||Ed(t)&&Pb(t).isDirectory()){let n=Db(e).endsWith(".lmctl")?Db(e):"team.lmctl";return Fb(t,n)}return yF(t)?t:`${t}.lmctl`}function kF(t){return t.split(`
2006
2006
  `).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
2007
- `)}function SF(t,e,r){let n=ma(e),s=ma(r);return n===s?t:t.split(`
2007
+ `)}function vF(t,e,r){let n=ma(e),s=ma(r);return n===s?t:t.split(`
2008
2008
  `).map(o=>/^\s*_MEMBER_\s+\S/.test(o)?o.replace(/sessiondir=(?:"([^"]*)"|(\S+))/g,(i,a,l)=>{let c=a??l??"",u=a!==void 0;if(!c.startsWith("/")||c!==n&&!c.startsWith(`${n}/`))return i;let d=`${s}${c.slice(n.length)}`;return u||d.includes(" ")?`sessiondir="${d}"`:`sessiondir=${d}`}):o).join(`
2009
- `)}var wF,Wb=b(()=>{"use strict";wF=`usage: lmctl clone <source> <dest>
2009
+ `)}var EF,Wb=b(()=>{"use strict";EF=`usage: lmctl clone <source> <dest>
2010
2010
 
2011
2011
  Copy a teamfile and strip its session ids, producing a static editable template.
2012
2012
 
2013
2013
  Examples:
2014
2014
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
2015
- `});var Hb={};ie(Hb,{runPlan:()=>jF});import{existsSync as kF,mkdirSync as vF,writeFileSync as IF}from"node:fs";import{basename as Bb,extname as qb,join as $F,resolve as NF}from"node:path";async function jF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(xF),0;let r=P(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
2015
+ `});var Hb={};ie(Hb,{runPlan:()=>RF});import{existsSync as IF,mkdirSync as $F,writeFileSync as NF}from"node:fs";import{basename as Bb,extname as qb,join as xF,resolve as jF}from"node:path";async function RF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(AF),0;let r=P(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
2016
2016
  `),e.stderr.write(`usage: lmctl plan [options] <directory>
2017
2017
  `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
2018
- `),2;let n=NF(r.positionals[0]);vF(n,{recursive:!0});let s=j(r,"--team")??Bb(n),o=j(r,"--provider")??"claude",i=$F(n,AF(s));return kF(i)?(e.stderr.write(`error: ${i} already exists.
2019
- `),1):(IF(i,OF({teamName:RF(s),workdir:n,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
2018
+ `),2;let n=jF(r.positionals[0]);$F(n,{recursive:!0});let s=j(r,"--team")??Bb(n),o=j(r,"--provider")??"claude",i=xF(n,OF(s));return IF(i)?(e.stderr.write(`error: ${i} already exists.
2019
+ `),1):(NF(i,LF({teamName:CF(s),workdir:n,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
2020
2020
  `),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
2021
2021
  `),e.stdout.write(`After editing, run: lmctl lint ${i}
2022
2022
  `),e.stdout.write(`Then run: lmctl seed ${i}
2023
- `),0)}function AF(t){return qb(t)?t:`${t}.lmctl`}function RF(t){let e=qb(t);return e?Bb(t,e):t}function OF(t){let{teamName:e,workdir:r,leadProvider:n}=t;return`# ${e}
2023
+ `),0)}function OF(t){return qb(t)?t:`${t}.lmctl`}function CF(t){let e=qb(t);return e?Bb(t,e):t}function LF(t){let{teamName:e,workdir:r,leadProvider:n}=t;return`# ${e}
2024
2024
 
2025
2025
  # Lead, you take tasks from the operator. Clarify only when needed,
2026
2026
  # delegate implementation to Coder, and send completed work to
@@ -2052,7 +2052,7 @@ context, so knowledge is shared across agents and survives fresh sessions: a
2052
2052
  refreshed or swapped-in agent loses its chat history but NOT what's written
2053
2053
  here. When a task is done, record durable project knowledge in durable-memory/
2054
2054
  and keep durable-memory/index.md current so any agent can get up to speed fast.
2055
- `}var xF,Jb=b(()=>{"use strict";Se();xF=`usage: lmctl plan [options] <directory>
2055
+ `}var AF,Jb=b(()=>{"use strict";Se();AF=`usage: lmctl plan [options] <directory>
2056
2056
 
2057
2057
  Generate a starter lmctl team document template for a directory.
2058
2058
 
@@ -2067,7 +2067,7 @@ Examples:
2067
2067
 
2068
2068
  # Same shape, codex for the Lead and Reviewer2
2069
2069
  lmctl plan ./backend --provider codex
2070
- `});var Vb={};ie(Vb,{SIZE_WARN_EST_TOKENS:()=>Ns,estimateTokens:()=>Xb,runTerminal:()=>DF});import{spawn as CF}from"node:child_process";import{statSync as LF}from"node:fs";async function DF(t,e){if(t.includes("--help")||t.includes("-h"))return BF(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):j(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await J(e,async i=>{let a=j(r,"--alias"),l=mw(i,s,a);return"err"in l?w(e,l.err):bd(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return fe(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):j(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=nr(MF,{target:o,alias:i,flags:{}});return a.mode==="error"?w(e,a.message):a.mode!=="ai-team"?w(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?w(e,"terminal: alias required for the teamfile target"):await J(e,l=>PF(e,a.teamfile,a.alias,l))}try{return await J(e,async s=>{let o=FF(e,s,r);if(typeof o=="number")return o;let i=j(r,"--alias");return M(r,"--size")?WF(e,s,o,i,M(r,"--json")):UF(e,s,o,i)})}catch(s){return fe(e,s)}}async function PF(t,e,r,n){let s;try{s=Lt(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):fe(t,o)}return bd(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir})}async function bd(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Oo(r))return w(t,`no resume incantation for provider "${r}"`);if(!Op.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Gl(r,n);if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=CF(i,a,{stdio:"inherit",cwd:s});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function FF(t,e,r){let n=j(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=qo(t,e,j(r,"--project"));return typeof s=="number"?s:Ho(t,e,s,void 0)}async function UF(t,e,r,n){let s=Jo(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?w(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):bd(t,{provider:ke(s),sessionid:o,sessiondir:s.sessiondir})}function Xb(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=LF(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 WF(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return w(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=ke(a),u=null;Oo(c)&&(u=await Er(l,c));let d=Xb(u),f=d.est>Ns;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?Gr(c,l):null})}if(s)return W(t,{estimate:!0,legend:Gb,guide_tokens:Ns,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2070
+ `});var Vb={};ie(Vb,{SIZE_WARN_EST_TOKENS:()=>Ns,estimateTokens:()=>Xb,runTerminal:()=>FF});import{spawn as MF}from"node:child_process";import{statSync as DF}from"node:fs";async function FF(t,e){if(t.includes("--help")||t.includes("-h"))return HF(e);let r=P(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=j(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):j(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await J(e,async i=>{let a=j(r,"--alias"),l=mw(i,s,a);return"err"in l?w(e,l.err):bd(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return fe(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):j(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=nr(PF,{target:o,alias:i,flags:{}});return a.mode==="error"?w(e,a.message):a.mode!=="ai-team"?w(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?w(e,"terminal: alias required for the teamfile target"):await J(e,l=>UF(e,a.teamfile,a.alias,l))}try{return await J(e,async s=>{let o=WF(e,s,r);if(typeof o=="number")return o;let i=j(r,"--alias");return M(r,"--size")?qF(e,s,o,i,M(r,"--json")):BF(e,s,o,i)})}catch(s){return fe(e,s)}}async function UF(t,e,r,n){let s;try{s=Lt(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):fe(t,o)}return bd(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir})}async function bd(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Oo(r))return w(t,`no resume incantation for provider "${r}"`);if(!Op.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Gl(r,n);if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=MF(i,a,{stdio:"inherit",cwd:s});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function WF(t,e,r){let n=j(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=qo(t,e,j(r,"--project"));return typeof s=="number"?s:Ho(t,e,s,void 0)}async function BF(t,e,r,n){let s=Jo(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?w(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):bd(t,{provider:ke(s),sessionid:o,sessiondir:s.sessiondir})}function Xb(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=DF(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 qF(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return w(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=ke(a),u=null;Oo(c)&&(u=await Er(l,c));let d=Xb(u),f=d.est>Ns;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?Gr(c,l):null})}if(s)return W(t,{estimate:!0,legend:Gb,guide_tokens:Ns,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2071
2071
  `),t.stdout.write(`${Gb}
2072
2072
  `);for(let a of i){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
2073
2073
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2075,7 +2075,7 @@ Examples:
2075
2075
  session yourself:
2076
2076
  ${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
2077
2077
  (or: lmctl terminal --team ${r.name} --alias ${a.alias})
2078
- `)}return 0}function BF(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2078
+ `)}return 0}function HF(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2079
2079
  lmctl terminal <teamfile> <alias>
2080
2080
  lmctl terminal --run <id> [--alias A]
2081
2081
  lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
@@ -2105,75 +2105,75 @@ Examples:
2105
2105
  tokens it surfaces the resume incantation so YOU can
2106
2106
  open & self-compact. Nothing is ever changed
2107
2107
  automatically; ${Ns} is a guide, not a gate.
2108
- `),0}var MF,Ns,Gb,Kb=b(()=>{"use strict";De();Xr();Se();oc();_s();Di();MF={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Ns=2e5,Gb="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import qF from"better-sqlite3";import{resolve as Td,dirname as Qb}from"node:path";function Sd(t,e){let r=Td(t);for(;;){let n=HF(e,r);if(n!==null)return n;let s=Qb(r);if(s===r)return null;r=s}}function HF(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function pa(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function ha(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function kd(t){if(t.io.dal!==void 0){let o=Yb(t.io.dal,t.cwd,t.projectName);if(o===null)throw new Ze(zb(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(pa()||ha()){let o=ce(),i=pe({path:o}),a=Yb(i,t.cwd,t.projectName);if(a===null)throw i.close(),new Ze(zb(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:ha()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:pa()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?tT(t.cwd):JF(t.projectName),r=rT(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new Ze(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function eT(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(pa()||ha()){let n=ce();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:ha()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:pa()?"explicit-db":"explicit-workspace"}}let e;try{e=tT(t.cwd)}catch{throw new Ze("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=rT(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function Yb(t,e,r){return r!==void 0?t.findProjectByName(r):Sd(e,t)}function zb(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function JF(t){let e=[];for(let r of ka())for(let n of nT(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new Ze(`project not found in any workspace DB: ${t}`);return e}function tT(t){let e=GF(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of ka())for(let o of nT(s)){let i=Td(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new Ze("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function rT(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new Ze(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2108
+ `),0}var PF,Ns,Gb,Kb=b(()=>{"use strict";De();Xr();Se();oc();_s();Di();PF={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Ns=2e5,Gb="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import JF from"better-sqlite3";import{resolve as Td,dirname as Qb}from"node:path";function Sd(t,e){let r=Td(t);for(;;){let n=GF(e,r);if(n!==null)return n;let s=Qb(r);if(s===r)return null;r=s}}function GF(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function pa(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function ha(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function kd(t){if(t.io.dal!==void 0){let o=Yb(t.io.dal,t.cwd,t.projectName);if(o===null)throw new Ze(zb(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(pa()||ha()){let o=ce(),i=pe({path:o}),a=Yb(i,t.cwd,t.projectName);if(a===null)throw i.close(),new Ze(zb(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:ha()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:pa()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?tT(t.cwd):XF(t.projectName),r=rT(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new Ze(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function eT(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(pa()||ha()){let n=ce();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:ha()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:pa()?"explicit-db":"explicit-workspace"}}let e;try{e=tT(t.cwd)}catch{throw new Ze("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=rT(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function Yb(t,e,r){return r!==void 0?t.findProjectByName(r):Sd(e,t)}function zb(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function XF(t){let e=[];for(let r of ka())for(let n of nT(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new Ze(`project not found in any workspace DB: ${t}`);return e}function tT(t){let e=VF(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of ka())for(let o of nT(s)){let i=Td(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new Ze("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function rT(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new Ze(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2109
2109
  ${Zb(n)}`):new Ze(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2110
2110
  ${Zb(n)}`)}function Zb(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2111
- `)}function GF(t){let e=[],r=Td(t);for(;;){e.push(r);let n=Qb(r);if(n===r)return e;r=n}}function nT(t){let e=null;try{e=new qF(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>Aa)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var Ze,vd=b(()=>{"use strict";Oa();De();Ge();Ze=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Ad={};ie(Ad,{assertNoCrossWorkflowSubflowCycle:()=>uT,firstUnregisteredArchetype:()=>jd,runWorkflow:()=>iU});import{createHash as Nd,randomUUID as XF}from"node:crypto";import{existsSync as VF,readFileSync as wa,readdirSync as KF,writeFileSync as YF}from"node:fs";import{basename as zF,join as ZF,resolve as QF}from"node:path";import{pathToFileURL as eU}from"node:url";function xd(t,e){return{source_uri:eU(QF(t)).href,source_sha256:Nd("sha256").update(e).digest("hex")}}function iT(t){return Nd("sha256").update(t).digest("hex")}async function sU(t){let e=await ur(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:iT(e),remote:!0}}async function ga(t){if(Kt(t)){let n=await Wn(t),s=wa(n,"utf8");return{definition:s,source_uri:t,source_sha256:iT(s),remote:!1}}let e=Sn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(ut(t))return sU(t);let r=wa(t,"utf8");return{definition:r,...xd(t,r),remote:!1}}function aT(t){return Oe(t.definition)}function lT(t){if(t.definition_schema_version!==3)return null;let e=jd(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function oU(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function iU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(nU),0;try{return r==="run"?await aU(n,e):await J(e,s=>{switch(r){case"load":return dU(n,e,s);case"author":return fU(n,e,s);case"list":return mU(n,e,s);case"sync":return pU(n,e,s);case"export":return hU(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof Ze?w(e,s.message):fe(e,s)}}async function aU(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${_a}
2112
- `),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return sr(e,r.error);if(r.positionals.length>1)return sr(e,_a);let n=M(r,"--json"),s=j(r,"--workflow"),o=j(r,"--project"),i=j(r,"--job"),a=j(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return sr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Ft(c))return sr(e,_a);if(Kt(c))return sT(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Sn(c,"remote workflow URLs");return m!==null?w(e,m):sT(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return sr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return sr(e,_a);if(i!==void 0&&(o!==void 0||a!==void 0))return sr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=lU(i);if(m===null)return sr(e,`invalid --job: ${i}`);let p=eT({cwd:process.cwd(),io:e});try{let h=await ss({dal:p.dal,job_id:m,worker_id:Id()});return $d(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=cT(a,e);if(d===ya)return 2;let f=kd({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await ss({dal:f.dal,job_id:p.id,worker_id:Id()});return $d(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function sT(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=cT(o,r);if(l===ya)return 2;let c,u;try{c=await ga(t),u=aT(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=lT(u);if(d!==null)return w(r,d);if(c.remote&&!await cU(r,c,u,a))return 1;let f=kd({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await ss({dal:f.dal,job_id:p.id,worker_id:Id()});return $d(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function sr(t,e){return t.stderr.write(`error: ${e}
2111
+ `)}function VF(t){let e=[],r=Td(t);for(;;){e.push(r);let n=Qb(r);if(n===r)return e;r=n}}function nT(t){let e=null;try{e=new JF(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>Aa)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var Ze,vd=b(()=>{"use strict";Oa();De();Ge();Ze=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Ad={};ie(Ad,{assertNoCrossWorkflowSubflowCycle:()=>uT,firstUnregisteredArchetype:()=>jd,runWorkflow:()=>lU});import{createHash as Nd,randomUUID as KF}from"node:crypto";import{existsSync as YF,readFileSync as wa,readdirSync as zF,writeFileSync as ZF}from"node:fs";import{basename as QF,join as eU,resolve as tU}from"node:path";import{pathToFileURL as rU}from"node:url";function xd(t,e){return{source_uri:rU(tU(t)).href,source_sha256:Nd("sha256").update(e).digest("hex")}}function iT(t){return Nd("sha256").update(t).digest("hex")}async function iU(t){let e=await ur(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:iT(e),remote:!0}}async function ga(t){if(Kt(t)){let n=await Wn(t),s=wa(n,"utf8");return{definition:s,source_uri:t,source_sha256:iT(s),remote:!1}}let e=Sn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(ut(t))return iU(t);let r=wa(t,"utf8");return{definition:r,...xd(t,r),remote:!1}}function aT(t){return Oe(t.definition)}function lT(t){if(t.definition_schema_version!==3)return null;let e=jd(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function aU(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function lU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(oU),0;try{return r==="run"?await cU(n,e):await J(e,s=>{switch(r){case"load":return mU(n,e,s);case"author":return pU(n,e,s);case"list":return hU(n,e,s);case"sync":return _U(n,e,s);case"export":return gU(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof Ze?w(e,s.message):fe(e,s)}}async function cU(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${_a}
2112
+ `),0;let r=P(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return sr(e,r.error);if(r.positionals.length>1)return sr(e,_a);let n=M(r,"--json"),s=j(r,"--workflow"),o=j(r,"--project"),i=j(r,"--job"),a=j(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return sr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Ft(c))return sr(e,_a);if(Kt(c))return sT(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Sn(c,"remote workflow URLs");return m!==null?w(e,m):sT(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return sr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return sr(e,_a);if(i!==void 0&&(o!==void 0||a!==void 0))return sr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=uU(i);if(m===null)return sr(e,`invalid --job: ${i}`);let p=eT({cwd:process.cwd(),io:e});try{let h=await ss({dal:p.dal,job_id:m,worker_id:Id()});return $d(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=cT(a,e);if(d===ya)return 2;let f=kd({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await ss({dal:f.dal,job_id:p.id,worker_id:Id()});return $d(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function sT(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=cT(o,r);if(l===ya)return 2;let c,u;try{c=await ga(t),u=aT(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=lT(u);if(d!==null)return w(r,d);if(c.remote&&!await dU(r,c,u,a))return 1;let f=kd({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await ss({dal:f.dal,job_id:p.id,worker_id:Id()});return $d(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function sr(t,e){return t.stderr.write(`error: ${e}
2113
2113
  `),2}function cT(t,e){if(t===void 0)return{};let r;try{r=JSON.parse(t)}catch(n){return e.stderr.write(`error: invalid --inputs JSON: ${n instanceof Error?n.message:String(n)}
2114
2114
  `),ya}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2115
- `),ya):r}function lU(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Id(){return`cli-${process.pid}-${XF().slice(0,8)}`}function $d(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?W(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2115
+ `),ya):r}function uU(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Id(){return`cli-${process.pid}-${KF().slice(0,8)}`}function $d(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?W(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2116
2116
  `),1}let n={ok:e.status!=="failed",job_id:e.job_id,run_id:e.run_id,status:e.status,terminal_state:e.terminal_state,workflow:r.workflowName,project:r.projectName,workspace:r.workspaceName,ms:e.ms,...r.verbose?{db_path:r.dbPath}:{}};return r.json?W(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
2117
2117
  `):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
2118
2118
  `):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
2119
2119
  `),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
2120
- `)),e.status==="failed"?1:0}async function cU(t,e,r,n){let s=oU(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
2120
+ `)),e.status==="failed"?1:0}async function dU(t,e,r,n){let s=aU(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
2121
2121
  `)+`
2122
- `),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await uU(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
2123
- `),a}function uU(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function dU(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(Kt(s))try{o=await ga(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(ut(s))try{o=await ga(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=Sn(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await ga(s)}let i;try{i=aT(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?lT(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2122
+ `),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await fU(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
2123
+ `),a}function fU(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function mU(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(Kt(s))try{o=await ga(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(ut(s))try{o=await ga(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=Sn(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await ga(s)}let i;try{i=aT(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?lT(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2124
2124
  `),o.remote&&e.stdout.write(`source: ${o.source_uri}
2125
2125
  sha256: ${o.source_sha256}
2126
- `),0}function jd(t){let e=gi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function oT(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function uT(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function fU(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return w(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return w(e,"usage: lmctl workflow author <file.dsl> [name]");let i=wa(s,"utf8"),a;try{a=Oe(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return fe(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=jd(l);if(c!==null)return w(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{uT(u,oT(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return oT(JSON.parse(p.definition))}catch{return null}})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...xd(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:Nd("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2127
- `),0}function mU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2126
+ `),0}function jd(t){let e=gi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function oT(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function uT(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function pU(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return w(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return w(e,"usage: lmctl workflow author <file.dsl> [name]");let i=wa(s,"utf8"),a;try{a=Oe(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return fe(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=jd(l);if(c!==null)return w(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{uT(u,oT(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return oT(JSON.parse(p.definition))}catch{return null}})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...xd(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:Nd("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2127
+ `),0}function hU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2128
2128
  `)}${s.length>0?`
2129
- `:""}`),0}function pU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);Po({swallow:!0});let s=Pp(),o=[];try{o=VF(s)?KF(s).filter(c=>tU.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=ZF(s,c),d=wa(u,"utf8"),f;try{f=Oe(d)}catch(I){return w(e,`compile failed for ${c}: ${I instanceof Error?I.message:String(I)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:zF(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,S=xd(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===S.source_sha256){l+=1;continue}let v=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...S}),v?i+=1:a+=1}return M(n,"--json")?W(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2130
- `),0}function hU(t,e,r){let n=P(t,["--out"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return w(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:rU,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
2131
- `,c=j(n,"--out");return c!==void 0?(YF(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2132
- `)):e.stdout.write(l),0}var tU,rU,nU,_a,ya,Rd=b(()=>{"use strict";Hc();tn();Uo();zl();Se();vd();Ms();os();tU=[".compound.json",".lmctl"],rU="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",nU=`usage: lmctl workflow <load|author|list|sync|export|run>
2129
+ `:""}`),0}function _U(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);Po({swallow:!0});let s=Pp(),o=[];try{o=YF(s)?zF(s).filter(c=>nU.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=eU(s,c),d=wa(u,"utf8"),f;try{f=Oe(d)}catch(I){return w(e,`compile failed for ${c}: ${I instanceof Error?I.message:String(I)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:QF(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,S=xd(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===S.source_sha256){l+=1;continue}let v=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...S}),v?i+=1:a+=1}return M(n,"--json")?W(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2130
+ `),0}function gU(t,e,r){let n=P(t,["--out"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return w(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:sU,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
2131
+ `,c=j(n,"--out");return c!==void 0?(ZF(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2132
+ `)):e.stdout.write(l),0}var nU,sU,oU,_a,ya,Rd=b(()=>{"use strict";Hc();tn();Uo();zl();Se();vd();Ms();os();nU=[".compound.json",".lmctl"],sU="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",oU=`usage: lmctl workflow <load|author|list|sync|export|run>
2133
2133
 
2134
2134
  Load, author, list, synchronize, inspect, or run workflow definitions. The
2135
2135
  load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
2136
2136
  URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
2137
2137
  remote https:// workflow after a trust prompt.
2138
- `,_a="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";ya=Symbol("inputs-error")});var fT={};ie(fT,{CANDIDATE_PROVIDERS:()=>Ea,parseInitArgs:()=>dT,probeProvider:()=>xs,probeProviderWithAuth:()=>Ld,runInit:()=>wU});import{spawnSync as _U}from"node:child_process";import{existsSync as gU}from"node:fs";import{homedir as Od}from"node:os";import{join as Cd}from"node:path";async function wU(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${IU()}
2138
+ `,_a="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";ya=Symbol("inputs-error")});var fT={};ie(fT,{CANDIDATE_PROVIDERS:()=>Ea,parseInitArgs:()=>dT,probeProvider:()=>xs,probeProviderWithAuth:()=>Ld,runInit:()=>EU});import{spawnSync as wU}from"node:child_process";import{existsSync as yU}from"node:fs";import{homedir as Od}from"node:os";import{join as Cd}from"node:path";async function EU(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${NU()}
2139
2139
  `),0;let n=dT(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
2140
- `),2;let s=r.spawn??SU,o=r.env??kU,i=r.fileExists??gU,a=r.isTty??(!!process.stdin.isTTY&&!n.yes),l=r.promptYesNo??vU;try{return await J(e,async c=>{e.stdout.write(`Detecting providers...
2140
+ `),2;let s=r.spawn??vU,o=r.env??IU,i=r.fileExists??yU,a=r.isTty??(!!process.stdin.isTTY&&!n.yes),l=r.promptYesNo??$U;try{return await J(e,async c=>{e.stdout.write(`Detecting providers...
2141
2141
  `);let u=await Promise.all(Ea.map(f=>Ld(f,{spawn:s,env:o,fileExists:i})));if(a)for(let f=0;f<u.length;f+=1){let m=u[f],p=Md[m.provider];m.status==="ok"||m.status==="skipped"||p.optional&&m.status==="missing"||p.optional&&m.status==="unauthed"||(e.stderr.write(`
2142
- ${m.provider}: ${TU(m)}
2142
+ ${m.provider}: ${kU(m)}
2143
2143
  `),m.status==="missing"?(e.stderr.write(` install: ${p.install_hint}
2144
2144
  `),e.stderr.write(` fix: ${p.install_remediation}
2145
2145
  `)):m.status==="unauthed"?e.stderr.write(` fix: ${p.auth_remediation}
2146
2146
  `):(e.stderr.write(` install: ${p.install_hint}
2147
2147
  `),e.stderr.write(` after install, run \`${m.provider} login\` (or provider equivalent) to authenticate.
2148
- `)),!await l(" proceed when ready? [Y/n] "))||(u[f]=await Ld(m.provider,{spawn:s,env:o,fileExists:i}))}EU(e,u);let d=u.filter(f=>f.status==="ok"||f.status==="unverified").map(f=>f.provider);return d.length===0?(e.stderr.write(`
2148
+ `)),!await l(" proceed when ready? [Y/n] "))||(u[f]=await Ld(m.provider,{spawn:s,env:o,fileExists:i}))}TU(e,u);let d=u.filter(f=>f.status==="ok"||f.status==="unverified").map(f=>f.provider);return d.length===0?(e.stderr.write(`
2149
2149
  No usable providers detected. See install/auth hints above.
2150
2150
  `),1):(c.setConfig("providers.active",JSON.stringify(d)),e.stdout.write(`
2151
2151
  Setup complete. ${d.length} provider${d.length===1?"":"s"} active: ${d.join(", ")}.
2152
2152
  `),e.stdout.write(`Persisted to lmctl_config[providers.active].
2153
2153
  `),n.json&&e.stdout.write(`${JSON.stringify({active:d,results:u},null,2)}
2154
2154
  `),0)})}catch(c){return e.stderr.write(`init failed: ${c instanceof Error?c.message:String(c)}
2155
- `),1}}function xs(t,e){let r=Md[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").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}}async function Ld(t,e){let r=xs(t,e.spawn);if(r.status==="missing"||r.status==="skipped"||r.status==="unverified")return r;let n=Md[t],s=yU[t];if(s.kind==="spawn"){let a=e.spawn(s.cmd,s.args),l=(a.stdout??"").toString(),c=(a.stderr??"").toString(),u=`${l}
2156
- ${c}`;return a.status===0&&(s.successPattern?s.successPattern.test(u):!0)?{provider:t,status:"ok",detail:"installed + authed"}:a.status===null||/unknown (option|command)|usage:|command not found/i.test(c)?{provider:t,status:"unverified",detail:`installed, auth status unverifiable via \`${s.cmd} ${s.args.join(" ")}\``}:{provider:t,status:"unauthed",detail:`installed, but \`${s.cmd} ${s.args.join(" ")}\` says not authenticated`,remediation:n.auth_remediation}}let o=s.envVars.find(a=>{let l=e.env(a);return typeof l=="string"&&l.trim()!==""});if(o!==void 0)return{provider:t,status:"ok",detail:`installed + authed (via env ${o})`};let i=s.filePaths.find(a=>e.fileExists(a));return i!==void 0?{provider:t,status:"ok",detail:`installed + authed (via ${i})`}:{provider:t,status:"unauthed",detail:`installed, but no credential found (checked env: ${s.envVars.join(", ")}; files: ${s.filePaths.join(", ")})`,remediation:n.auth_remediation}}function EU(t,e){let r=Math.max(...Ea.map(n=>n.length));for(let n of e){let s=bU(n.status),o=n.provider.padEnd(r," ");t.stdout.write(` ${o} ${s} ${n.detail}
2157
- `)}}function bU(t){switch(t){case"ok":return"\u2713";case"unauthed":return"\u26A0";case"unverified":return"?";case"missing":return"\u2717";case"skipped":return"-"}}function TU(t){return t.detail}function SU(t,e){return _U(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function kU(t){return process.env[t]}async function vU(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim().toLowerCase();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s===""||s==="y"||s==="yes")};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function dT(t){let e={json:!1,yes:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--json"){e.json=!0;continue}if(n==="--yes"||n==="-y"||n==="--no-prompt"){e.yes=!0;continue}if(!(n==="--help"||n==="-h"))return`unknown argument: ${n}`}return e}function IU(){return["usage: lmctl init [options]","","One-time provider lifecycle setup. Detects which provider CLIs",`(${Ea.join(", ")}) are installed + authenticated`,"on this machine and persists the active list to","lmctl_config[providers.active].","","Re-runnable: each invocation refreshes the active list to current state.","","options:"," --yes, -y non-interactive (skip prompts; default in non-TTY)"," --no-prompt alias for --yes (used by sanity-check.sh)"," --json emit JSON summary of probe results to stdout"].join(`
2158
- `)}var Ea,Md,yU,Dd=b(()=>{"use strict";Se();Ea=["claude","codex","gemini","opencode","qwen","copilot","agy"],Md={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,auth_remediation:"claude auth login",install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,auth_remediation:"codex login",install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,auth_remediation:"gemini (run interactively to complete OAuth flow) or set GEMINI_API_KEY",install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,auth_remediation:"opencode providers login",install_remediation:"see https://opencode.ai"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,auth_remediation:"qwen auth qwen-oauth (or `qwen auth api-key`)",install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,auth_remediation:"copilot login (or set COPILOT_GITHUB_TOKEN / GH_TOKEN)",install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,auth_remediation:"agy (run interactively to complete OAuth flow) or set GEMINI_API_KEY",install_remediation:"see https://antigravity.google"}};yU={claude:{kind:"spawn",cmd:"claude",args:["auth","status"],successPattern:/"loggedIn"\s*:\s*true/},codex:{kind:"spawn",cmd:"codex",args:["login","status"],successPattern:/Logged in/i},qwen:{kind:"spawn",cmd:"qwen",args:["auth","status"],successPattern:/Authentication Method/},opencode:{kind:"spawn",cmd:"opencode",args:["providers","list"],successPattern:/credential/i},gemini:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[Cd(Od(),".gemini","oauth_creds.json")]},copilot:{kind:"env-or-file",envVars:["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"],filePaths:[Cd(Od(),".copilot","credentials.json")]},agy:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[Cd(Od(),".gemini","oauth_creds.json")]}}});var yT={};ie(yT,{initWorkspace:()=>gT,runWorkspace:()=>OU,setWorkspaceProvider:()=>wT});import{copyFileSync as $U,cpSync as NU,existsSync as Me,mkdirSync as or,readdirSync as Fd,renameSync as xU,rmSync as ba,statSync as Ta,writeFileSync as jU}from"node:fs";import{spawnSync as AU}from"node:child_process";import{homedir as mT}from"node:os";import{dirname as Ud,join as js}from"node:path";async function OU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(RU),0;switch(r){case"list":return CU(n,e);case"create":return LU(n,e);case"use":return MU(n,e);case"show":return DU(n,e);case"delete":return PU(n,e);case"migrate":return FU(n,e);case"init":return gT(n,e);case"set-provider":return wT(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function hT(){let t=Rs(),e=[],r=new Set,n=lr.default,s=Me(wn()),o=Me(Et(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Mt(n):wn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Me(ar())){let i;try{i=Fd(ar())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Ue(a))continue;let l=!1;try{l=Ta(Et(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Mt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function CU(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==0)return w(e,"usage: lmctl workspace list");let n=hT();if(M(r,"--json"))return W(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2159
- `)}return 0}function LU(t,e){let r=P(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ue(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Et(n);if(Me(s))return w(e,`workspace already exists: ${n} (${s})`);let o=j(r,"--docroot")??va(n);or(s,{recursive:!0}),or(o,{recursive:!0});let i=Mt(n);or(Ud(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2160
- `),0}function MU(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!Ue(n))return w(e,`invalid workspace name: ${n}`);if(n!==lr.default&&!Me(Et(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=As();return or(Ud(s),{recursive:!0}),jU(s,`${n}
2155
+ `),1}}function xs(t,e){let r=Md[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").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}}async function Ld(t,e){let r=xs(t,e.spawn);if(r.status==="missing"||r.status==="skipped"||r.status==="unverified")return r;let n=Md[t],s=bU[t];if(s.kind==="spawn"){let a=e.spawn(s.cmd,s.args),l=(a.stdout??"").toString(),c=(a.stderr??"").toString(),u=`${l}
2156
+ ${c}`;return a.status===0&&(s.successPattern?s.successPattern.test(u):!0)?{provider:t,status:"ok",detail:"installed + authed"}:a.status===null||/unknown (option|command)|usage:|command not found/i.test(c)?{provider:t,status:"unverified",detail:`installed, auth status unverifiable via \`${s.cmd} ${s.args.join(" ")}\``}:{provider:t,status:"unauthed",detail:`installed, but \`${s.cmd} ${s.args.join(" ")}\` says not authenticated`,remediation:n.auth_remediation}}let o=s.envVars.find(a=>{let l=e.env(a);return typeof l=="string"&&l.trim()!==""});if(o!==void 0)return{provider:t,status:"ok",detail:`installed + authed (via env ${o})`};let i=s.filePaths.find(a=>e.fileExists(a));return i!==void 0?{provider:t,status:"ok",detail:`installed + authed (via ${i})`}:{provider:t,status:"unauthed",detail:`installed, but no credential found (checked env: ${s.envVars.join(", ")}; files: ${s.filePaths.join(", ")})`,remediation:n.auth_remediation}}function TU(t,e){let r=Math.max(...Ea.map(n=>n.length));for(let n of e){let s=SU(n.status),o=n.provider.padEnd(r," ");t.stdout.write(` ${o} ${s} ${n.detail}
2157
+ `)}}function SU(t){switch(t){case"ok":return"\u2713";case"unauthed":return"\u26A0";case"unverified":return"?";case"missing":return"\u2717";case"skipped":return"-"}}function kU(t){return t.detail}function vU(t,e){return wU(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function IU(t){return process.env[t]}async function $U(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim().toLowerCase();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s===""||s==="y"||s==="yes")};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function dT(t){let e={json:!1,yes:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--json"){e.json=!0;continue}if(n==="--yes"||n==="-y"||n==="--no-prompt"){e.yes=!0;continue}if(!(n==="--help"||n==="-h"))return`unknown argument: ${n}`}return e}function NU(){return["usage: lmctl init [options]","","One-time provider lifecycle setup. Detects which provider CLIs",`(${Ea.join(", ")}) are installed + authenticated`,"on this machine and persists the active list to","lmctl_config[providers.active].","","Re-runnable: each invocation refreshes the active list to current state.","","options:"," --yes, -y non-interactive (skip prompts; default in non-TTY)"," --no-prompt alias for --yes (used by sanity-check.sh)"," --json emit JSON summary of probe results to stdout"].join(`
2158
+ `)}var Ea,Md,bU,Dd=b(()=>{"use strict";Se();Ea=["claude","codex","gemini","opencode","qwen","copilot","agy"],Md={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,auth_remediation:"claude auth login",install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,auth_remediation:"codex login",install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,auth_remediation:"gemini (run interactively to complete OAuth flow) or set GEMINI_API_KEY",install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,auth_remediation:"opencode providers login",install_remediation:"see https://opencode.ai"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,auth_remediation:"qwen auth qwen-oauth (or `qwen auth api-key`)",install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,auth_remediation:"copilot login (or set COPILOT_GITHUB_TOKEN / GH_TOKEN)",install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,auth_remediation:"agy (run interactively to complete OAuth flow) or set GEMINI_API_KEY",install_remediation:"see https://antigravity.google"}};bU={claude:{kind:"spawn",cmd:"claude",args:["auth","status"],successPattern:/"loggedIn"\s*:\s*true/},codex:{kind:"spawn",cmd:"codex",args:["login","status"],successPattern:/Logged in/i},qwen:{kind:"spawn",cmd:"qwen",args:["auth","status"],successPattern:/Authentication Method/},opencode:{kind:"spawn",cmd:"opencode",args:["providers","list"],successPattern:/credential/i},gemini:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[Cd(Od(),".gemini","oauth_creds.json")]},copilot:{kind:"env-or-file",envVars:["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"],filePaths:[Cd(Od(),".copilot","credentials.json")]},agy:{kind:"env-or-file",envVars:["GEMINI_API_KEY","GOOGLE_API_KEY","GOOGLE_GENAI_API_KEY"],filePaths:[Cd(Od(),".gemini","oauth_creds.json")]}}});var yT={};ie(yT,{initWorkspace:()=>gT,runWorkspace:()=>LU,setWorkspaceProvider:()=>wT});import{copyFileSync as xU,cpSync as jU,existsSync as Me,mkdirSync as or,readdirSync as Fd,renameSync as AU,rmSync as ba,statSync as Ta,writeFileSync as RU}from"node:fs";import{spawnSync as OU}from"node:child_process";import{homedir as mT}from"node:os";import{dirname as Ud,join as js}from"node:path";async function LU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(CU),0;switch(r){case"list":return MU(n,e);case"create":return DU(n,e);case"use":return PU(n,e);case"show":return FU(n,e);case"delete":return UU(n,e);case"migrate":return WU(n,e);case"init":return gT(n,e);case"set-provider":return wT(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function hT(){let t=Rs(),e=[],r=new Set,n=lr.default,s=Me(wn()),o=Me(Et(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Mt(n):wn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Me(ar())){let i;try{i=Fd(ar())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Ue(a))continue;let l=!1;try{l=Ta(Et(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Mt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function MU(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==0)return w(e,"usage: lmctl workspace list");let n=hT();if(M(r,"--json"))return W(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2159
+ `)}return 0}function DU(t,e){let r=P(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ue(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Et(n);if(Me(s))return w(e,`workspace already exists: ${n} (${s})`);let o=j(r,"--docroot")??va(n);or(s,{recursive:!0}),or(o,{recursive:!0});let i=Mt(n);or(Ud(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2160
+ `),0}function PU(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!Ue(n))return w(e,`invalid workspace name: ${n}`);if(n!==lr.default&&!Me(Et(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=As();return or(Ud(s),{recursive:!0}),RU(s,`${n}
2161
2161
  `),M(r,"--json")?W(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2162
- `),0}function DU(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace show <name>");if(!Ue(n))return w(e,`invalid workspace name: ${n}`);let s=hT().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=Me(s.db_path)?Ta(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Me(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return M(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2163
- `),0}function PU(t,e){let r=P(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ue(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===lr.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(Rs()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=Et(n);return Me(o)?(ba(o,{recursive:!0,force:!0}),M(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2164
- `),0):w(e,`workspace not found: ${n}`)}function Pd(t,e,r){try{xU(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
2165
- `),Ta(t).isDirectory()?NU(t,e,{recursive:!0}):$U(t,e),!Me(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);ba(t,{recursive:!0,force:!0})}function FU(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=Ia(),o=ar(),i=[],a=(f,m)=>{if(n)W(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2162
+ `),0}function FU(t,e){let r=P(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace show <name>");if(!Ue(n))return w(e,`invalid workspace name: ${n}`);let s=hT().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=Me(s.db_path)?Ta(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Me(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return M(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2163
+ `),0}function UU(t,e){let r=P(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ue(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===lr.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(Rs()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=Et(n);return Me(o)?(ba(o,{recursive:!0,force:!0}),M(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2164
+ `),0):w(e,`workspace not found: ${n}`)}function Pd(t,e,r){try{AU(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
2165
+ `),Ta(t).isDirectory()?jU(t,e,{recursive:!0}):xU(t,e),!Me(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);ba(t,{recursive:!0,force:!0})}function WU(t,e){let r=P(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=Ia(),o=ar(),i=[],a=(f,m)=>{if(n)W(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2166
2166
  `);e.stdout.write(f?`migration complete
2167
2167
  `:`${m??"nothing to migrate"}
2168
- `)}return 0};if(!Me(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Fd(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ta(js(s,f)).isDirectory()}catch{return!1}});if(c.length===0)ba(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Me(o))Pd(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Me(js(o,m)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);or(o,{recursive:!0});for(let m of c)Pd(js(s,m),js(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{Fd(s).length===0&&(ba(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=ef(),d=As();return Me(u)&&(Me(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Pd(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function _T(t,e){return AU(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function BU(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 pT(t){return t==="~"?mT():t.startsWith("~/")?js(mT(),t.slice(2)):t}async function gT(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${_n.join(", ")}.`].join(`
2168
+ `)}return 0};if(!Me(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Fd(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ta(js(s,f)).isDirectory()}catch{return!1}});if(c.length===0)ba(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Me(o))Pd(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Me(js(o,m)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);or(o,{recursive:!0});for(let m of c)Pd(js(s,m),js(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{Fd(s).length===0&&(ba(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=ef(),d=As();return Me(u)&&(Me(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Pd(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function _T(t,e){return OU(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function HU(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 pT(t){return t==="~"?mT():t.startsWith("~/")?js(mT(),t.slice(2)):t}async function gT(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${_n.join(", ")}.`].join(`
2169
2169
  `)+`
2170
2170
  `),0;let s=P(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return w(e,s.error);if(s.positionals.length!==0)return w(e,n);let o=r.spawn??_T,a=_n.map(k=>xs(k,o)).filter(k=>k.status==="ok"||k.status==="unverified").map(k=>k.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${_n.join("|")} first (see \`lmctl init\`)
2171
- `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??BU,u=r.promptLine!==void 0||l,d=k=>(e.stderr.write(`error: ${k} is required in non-interactive mode (no TTY); pass it explicitly
2171
+ `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??HU,u=r.promptLine!==void 0||l,d=k=>(e.stderr.write(`error: ${k} is required in non-interactive mode (no TTY); pass it explicitly
2172
2172
  `),2),f,m=j(s,"--name");if(m!==void 0){if(!Ue(m))return e.stderr.write(`error: invalid workspace name: ${m}
2173
2173
  `),2;f=m}else{if(!u)return d("--name");for(;;){let k=(await c("Workspace name [default]: ")).trim(),R=k.length===0?"default":k;if(Ue(R)){f=R;break}e.stderr.write(`invalid workspace name: ${R} (letters/digits/.-_, start alnum, \u226464)
2174
2174
  `)}}let p=Et(f);if(Me(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2175
- `),2;let h,g=j(s,"--basedir"),_=va(f);if(g!==void 0)h=pT(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:pT(k)}let S={};for(let k of["provider1","provider2","provider3"]){let R=j(s,`--${k}`),C=UU[k],B=a.includes(C)?C:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${k} ${R} is not an available provider (available: ${a.join(", ")})
2176
- `),2;S[k]=R;continue}if(!u)return d(`--${k}`);for(;;){let ee=(await c(`${k} (${WU[k]}) [${B}]: `)).trim(),x=ee.length===0?B:ee;if(a.includes(x)){S[k]=x;break}e.stderr.write(`not an available provider: ${x} (available: ${a.join(", ")})
2175
+ `),2;let h,g=j(s,"--basedir"),_=va(f);if(g!==void 0)h=pT(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:pT(k)}let S={};for(let k of["provider1","provider2","provider3"]){let R=j(s,`--${k}`),C=BU[k],B=a.includes(C)?C:a[0];if(R!==void 0){if(!a.includes(R))return e.stderr.write(`error: --${k} ${R} is not an available provider (available: ${a.join(", ")})
2176
+ `),2;S[k]=R;continue}if(!u)return d(`--${k}`);for(;;){let ee=(await c(`${k} (${qU[k]}) [${B}]: `)).trim(),x=ee.length===0?B:ee;if(a.includes(x)){S[k]=x;break}e.stderr.write(`not an available provider: ${x} (available: ${a.join(", ")})
2177
2177
  `)}}or(p,{recursive:!0}),or(h,{recursive:!0});let E=Mt(f);or(Ud(E),{recursive:!0});let v=pe({path:E});try{v.setConfig("project.docroot",h),v.setConfig("workspace.provider1",S.provider1),v.setConfig("workspace.provider2",S.provider2),v.setConfig("workspace.provider3",S.provider3)}finally{v.close()}let I={name:f,dir:p,db_path:E,basedir:h,providers:{...S}};return M(s,"--json")?W(e,I):(e.stdout.write(`created workspace ${f} at ${p}
2178
2178
  `),e.stdout.write(` basedir: ${h}
2179
2179
  `),e.stdout.write(` provider1=${S.provider1} provider2=${S.provider2} provider3=${S.provider3}
@@ -2184,26 +2184,26 @@ ${c}`;return a.status===0&&(s.successPattern?s.successPattern.test(u):!0)?{provi
2184
2184
  `),2;let c=r.spawn??_T,u=_n.map(p=>xs(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${_n.join("|")} first (see \`lmctl init\`)
2185
2185
  `),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
2186
2186
  `),2;let d=e.dal===void 0,f=e.dal??pe({path:ce()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=yn()??lr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2187
- `),0}var RU,_n,UU,WU,ET=b(()=>{"use strict";De();Dd();Se();Ge();RU=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2187
+ `),0}var CU,_n,BU,qU,ET=b(()=>{"use strict";De();Dd();Se();Ge();CU=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2188
2188
 
2189
2189
  Manage isolated workspace state directories, active workspace selection,
2190
2190
  legacy profile migration, and configured provider slots.
2191
- `;_n=["claude","codex","gemini","qwen"],UU={provider1:"claude",provider2:"codex",provider3:"gemini"},WU={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var ST={};ie(ST,{runProject:()=>GU});import{existsSync as qU,statSync as HU}from"node:fs";import{join as TT}from"node:path";async function GU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(JU),0;try{return await J(e,s=>{switch(r){case"create":return tW(n,e,s);case"list":return rW(n,e,s);case"show":return QU(n,e,s);case"status":return eW(n,e,s);case"workflow":return XU(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return fe(e,s)}}function XU(t,e,r){let[n,...s]=t;switch(n){case"add":return VU(s,e,r);case"list":return KU(s,e,r);case"show":return YU(s,e,r);case"remove":return zU(s,e,r);case"enable":return bT(s,e,r,!0);case"disable":return bT(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function VU(t,e,r){let n=P(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=j(n,"--condition")??null;if(l!==null)try{Yt(l)}catch{return w(e,"invalid --condition JEXL")}let c=ZU(j(n,"--params"));if(typeof c=="string")return w(e,c);let u=j(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
2192
- `),0}function KU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?W(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2191
+ `;_n=["claude","codex","gemini","qwen"],BU={provider1:"claude",provider2:"codex",provider3:"gemini"},qU={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var ST={};ie(ST,{runProject:()=>VU});import{existsSync as JU,statSync as GU}from"node:fs";import{join as TT}from"node:path";async function VU(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(XU),0;try{return await J(e,s=>{switch(r){case"create":return nW(n,e,s);case"list":return sW(n,e,s);case"show":return tW(n,e,s);case"status":return rW(n,e,s);case"workflow":return KU(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return fe(e,s)}}function KU(t,e,r){let[n,...s]=t;switch(n){case"add":return YU(s,e,r);case"list":return zU(s,e,r);case"show":return ZU(s,e,r);case"remove":return QU(s,e,r);case"enable":return bT(s,e,r,!0);case"disable":return bT(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function YU(t,e,r){let n=P(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=j(n,"--condition")??null;if(l!==null)try{Yt(l)}catch{return w(e,"invalid --condition JEXL")}let c=eW(j(n,"--params"));if(typeof c=="string")return w(e,c);let u=j(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
2192
+ `),0}function zU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?W(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2193
2193
  `)}${i.length>0?`
2194
- `:""}`),0}function YU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Wd(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(M(n,"--json")?W(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2195
- `),0)}function zU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Wd(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?w(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2194
+ `:""}`),0}function ZU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Wd(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(M(n,"--json")?W(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2195
+ `),0)}function QU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Wd(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?w(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2196
2196
  `),0):w(e,`project workflow not found: ${s}`)}function bT(t,e,r,n){let s=P(t,[]);if(s.error!==void 0)return w(e,s.error);let o=Wd(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return w(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?w(e,`project workflow not found: ${o}`):(M(s,"--json")?W(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2197
- `),0)}function ZU(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function Wd(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function QU(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return M(n,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2198
- `),0}function eW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return M(n,"--json")?W(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2199
- `),0}function tW(t,e,r){let n=P(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=j(n,"--owner"),i=j(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=j(n,"--local-path")??(l!==null?TT(l,u):void 0),f=j(n,"--workflow"),m=j(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=j(n,"--test-argv"),g=null;if(h!==void 0)try{let v=JSON.parse(h);if(!Array.isArray(v)||!v.every(I=>typeof I=="string")||v.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(v)}catch{return w(e,"--test-argv must be valid JSON")}let _=j(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let S=_!==void 0?_:nW(d)||Pn(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:j(n,"--default-branch")??null,test_argv:g,durable_memory_mode:S});return M(n,"--json")?W(e,E):e.stdout.write(`created project ${E.name}
2200
- `),0}function rW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2197
+ `),0)}function eW(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function Wd(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function tW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return M(n,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2198
+ `),0}function rW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return M(n,"--json")?W(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2199
+ `),0}function nW(t,e,r){let n=P(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=j(n,"--owner"),i=j(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=j(n,"--local-path")??(l!==null?TT(l,u):void 0),f=j(n,"--workflow"),m=j(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=j(n,"--test-argv"),g=null;if(h!==void 0)try{let v=JSON.parse(h);if(!Array.isArray(v)||!v.every(I=>typeof I=="string")||v.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(v)}catch{return w(e,"--test-argv must be valid JSON")}let _=j(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let S=_!==void 0?_:oW(d)||Pn(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:j(n,"--default-branch")??null,test_argv:g,durable_memory_mode:S});return M(n,"--json")?W(e,E):e.stdout.write(`created project ${E.name}
2200
+ `),0}function sW(t,e,r){let n=P(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return M(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2201
2201
  `)}${s.length>0?`
2202
- `:""}`),0}function nW(t){try{let e=TT(t,"durable-memory");return qU(e)&&HU(e).isDirectory()}catch{return!1}}var JU,kT=b(()=>{"use strict";Se();zr();Fn();JU=`usage: lmctl project <create|list|show|status|workflow>
2202
+ `:""}`),0}function oW(t){try{let e=TT(t,"durable-memory");return JU(e)&&GU(e).isDirectory()}catch{return!1}}var XU,kT=b(()=>{"use strict";Se();zr();Fn();XU=`usage: lmctl project <create|list|show|status|workflow>
2203
2203
 
2204
2204
  Create, list, inspect, and check projects. The workflow subcommand manages
2205
2205
  per-project workflow bindings and routing conditions.
2206
- `});import{createHash as sW,randomBytes as oW}from"node:crypto";import{readFile as iW}from"node:fs/promises";function vT(t=new Date,e=oW(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function aW(t){return sW("sha256").update(t).digest("hex")}async function IT(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await iW(n);return{path:r,sha256:aW(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function $T(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var Bd=b(()=>{"use strict"});import{spawnSync as NT}from"node:child_process";import{mkdir as qd,writeFile as xT,readFile as lW,rm as jT}from"node:fs/promises";import{tmpdir as cW}from"node:os";import{dirname as AT,join as Hd}from"node:path";async function RT(t){let e=t.stagingDir??Hd(cW(),`lmctl-diag-${t.ticketId}`),r=Hd(e,`diagnostic-${t.ticketId}`);await qd(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Hd(r,d);if(await qd(AT(m),{recursive:!0}),typeof f=="string")await xT(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await xT(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2206
+ `});import{createHash as iW,randomBytes as aW}from"node:crypto";import{readFile as lW}from"node:fs/promises";function vT(t=new Date,e=aW(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function cW(t){return iW("sha256").update(t).digest("hex")}async function IT(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await lW(n);return{path:r,sha256:cW(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function $T(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var Bd=b(()=>{"use strict"});import{spawnSync as NT}from"node:child_process";import{mkdir as qd,writeFile as xT,readFile as uW,rm as jT}from"node:fs/promises";import{tmpdir as dW}from"node:os";import{dirname as AT,join as Hd}from"node:path";async function RT(t){let e=t.stagingDir??Hd(dW(),`lmctl-diag-${t.ticketId}`),r=Hd(e,`diagnostic-${t.ticketId}`);await qd(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Hd(r,d);if(await qd(AT(m),{recursive:!0}),typeof f=="string")await xT(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await xT(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2207
2207
  `;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
2208
2208
  `:`${d.pid}
2209
2209
  # source=${d.pid_source} alive=${String(d.pid_alive)}
@@ -2221,29 +2221,29 @@ per-project workflow bindings and routing conditions.
2221
2221
  `:`# source=${f}
2222
2222
  # tail_lines=${d.tail_lines}
2223
2223
  `;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
2224
- `:""}`)}if(await s("README.md",uW(t)),t.sanitized)for(let d of n){let f=await lW(d.absPath);try{of(d.bundlePath,f.toString("utf8"))}catch(m){throw await jT(e,{recursive:!0,force:!0}),m instanceof cr,m}}let i=await IT(n),a=$T({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await qd(AT(t.outputPath),{recursive:!0});let l=NT("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=NT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await jT(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function uW(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2225
- `)}var OT=b(()=>{"use strict";Bd();Os()});import{spawnSync as dW}from"node:child_process";import{stat as fW}from"node:fs/promises";async function CT(t){try{if(!(await fW(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return mW(t);case"hq":return pW(t)}}function mW(t){let r=dW("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function pW(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var LT=b(()=>{"use strict"});var DT={};ie(DT,{parseDiagnoseArgs:()=>MT,runDiagnose:()=>gW});import{tmpdir as hW}from"node:os";import{join as _W}from"node:path";async function gW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${EW()}
2224
+ `:""}`)}if(await s("README.md",fW(t)),t.sanitized)for(let d of n){let f=await uW(d.absPath);try{of(d.bundlePath,f.toString("utf8"))}catch(m){throw await jT(e,{recursive:!0,force:!0}),m instanceof cr,m}}let i=await IT(n),a=$T({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await qd(AT(t.outputPath),{recursive:!0});let l=NT("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=NT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await jT(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function fW(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2225
+ `)}var OT=b(()=>{"use strict";Bd();Os()});import{spawnSync as mW}from"node:child_process";import{stat as pW}from"node:fs/promises";async function CT(t){try{if(!(await pW(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return hW(t);case"hq":return _W(t)}}function hW(t){let r=mW("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function _W(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var LT=b(()=>{"use strict"});var DT={};ie(DT,{parseDiagnoseArgs:()=>MT,runDiagnose:()=>yW});import{tmpdir as gW}from"node:os";import{join as wW}from"node:path";async function yW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${TW()}
2226
2226
  `),0;let r=MT(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2227
2227
  `),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
2228
2228
  `),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2229
- `),2;let n=vT(),s=r.outputPath??yW(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await J(e,async i=>{let a=await lf({dal:i,include:r.include,dbPath:ce(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await RT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:et(),sanitized:!r.noSanitize})}catch(d){if(d instanceof cr)return e.stderr.write(`sanitization failed: ${d.message}
2229
+ `),2;let n=vT(),s=r.outputPath??bW(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await J(e,async i=>{let a=await lf({dal:i,include:r.include,dbPath:ce(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await RT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:et(),sanitized:!r.noSanitize})}catch(d){if(d instanceof cr)return e.stderr.write(`sanitization failed: ${d.message}
2230
2230
  `),2;throw d}let c=await CT({mode:o,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),u={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(u,null,2)}
2231
2231
  `):(e.stdout.write(`ticket: ${n}
2232
2232
  `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2233
2233
  `),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2234
2234
  `)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
2235
- `),1}}function MT(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!wW(o))return`unknown section: ${o} (expected one of ${Cs.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function wW(t){return Cs.includes(t)}function yW(t){return _W(hW(),`lmctl-diag-${t}.tar.gz`)}function EW(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
2236
- `)}var PT=b(()=>{"use strict";Tn();OT();Bd();Os();LT();Ge();Se()});var JT={};ie(JT,{ATTENTION_STATES:()=>Gd,DAEMON_INTERVAL_FAST_MS:()=>Jd,REQUIRED_TEAM_ALIASES:()=>UT,chooseDiagnoses:()=>qT,collectEvidence:()=>BT,diagnose:()=>WT,renderReport:()=>HT,runDiagnosePrompt:()=>SW});function WT(t,e){let r=BT(t,e),n=qT(r);return HT(r,n)}function BT(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:as(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=TW(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=UT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function qT(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>Jd&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${Jd}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>Gd.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function HT(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${bW(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>Gd.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2235
+ `),1}}function MT(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!EW(o))return`unknown section: ${o} (expected one of ${Cs.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function EW(t){return Cs.includes(t)}function bW(t){return wW(gW(),`lmctl-diag-${t}.tar.gz`)}function TW(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
2236
+ `)}var PT=b(()=>{"use strict";Tn();OT();Bd();Os();LT();Ge();Se()});var JT={};ie(JT,{ATTENTION_STATES:()=>Gd,DAEMON_INTERVAL_FAST_MS:()=>Jd,REQUIRED_TEAM_ALIASES:()=>UT,chooseDiagnoses:()=>qT,collectEvidence:()=>BT,diagnose:()=>WT,renderReport:()=>HT,runDiagnosePrompt:()=>vW});function WT(t,e){let r=BT(t,e),n=qT(r);return HT(r,n)}function BT(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:as(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=kW(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=UT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function qT(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>Jd&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${Jd}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>Gd.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function HT(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${SW(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>Gd.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2237
2237
  `)+`
2238
- `}function bW(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function TW(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function SW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${FT()}
2238
+ `}function SW(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function kW(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function vW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${FT()}
2239
2239
  `),0;let r=t.filter(s=>!s.startsWith("--"));if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2240
2240
  `),e.stderr.write(`${FT()}
2241
2241
  `),2;let n=r[0];try{return await J(e,s=>(e.stdout.write(WT(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2242
2242
  `),1}}function FT(){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(`
2243
- `)}var UT,Jd,Gd,GT=b(()=>{"use strict";wu();Se();UT=["Coder","Reviewer1","Polisher"],Jd=3e4,Gd=new Set(["attention_needed","paused","escalation"])});var YT={};ie(YT,{appendIntent:()=>KT,resolveIntentLogPath:()=>VT,runStatus:()=>RW});import{appendFileSync as kW,mkdirSync as vW}from"node:fs";import{homedir as IW}from"node:os";import{dirname as $W,join as NW}from"node:path";function VT(){return process.env.LMCTL_INTENT_LOG??NW(IW(),".lmctl","recent-intents.log")}function KT(t){try{let e=VT();vW($W(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});kW(e,`${r}
2244
- `)}catch{}}async function RW(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(AW),0;let r=P(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=j(r,"--project"),o=M(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):J(e,i=>{let a=OW(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2243
+ `)}var UT,Jd,Gd,GT=b(()=>{"use strict";wu();Se();UT=["Coder","Reviewer1","Polisher"],Jd=3e4,Gd=new Set(["attention_needed","paused","escalation"])});var YT={};ie(YT,{appendIntent:()=>KT,resolveIntentLogPath:()=>VT,runStatus:()=>CW});import{appendFileSync as IW,mkdirSync as $W}from"node:fs";import{homedir as NW}from"node:os";import{dirname as xW,join as jW}from"node:path";function VT(){return process.env.LMCTL_INTENT_LOG??jW(NW(),".lmctl","recent-intents.log")}function KT(t){try{let e=VT();$W(xW(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});IW(e,`${r}
2244
+ `)}catch{}}async function CW(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(OW),0;let r=P(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=j(r,"--project"),o=M(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):J(e,i=>{let a=LW(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2245
2245
  `),1;if(a.kind==="no-web-focus")return e.stderr.write(`no active webui focus; run lmctl status --web after navigating webui to a project, or omit --web.
2246
- `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=CW(i,l,a.source);return o?W(e,c):e.stdout.write(UW(c)),KT({verb:"status",args:t}),0})}function OW(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=Sd(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function CW(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=LW(t,e.id,jW),a=MW(t,e.id),l=DW(t,e.id,xW),c=PW(t);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(u=>({id:u.id,kind:u.kind,severity:u.severity,payload_summary:FW(u.payload),created_at:u.created_at}))},recent_runs:l.map(u=>({id:u.id,workflow_name:u.workflow_name,current_state:u.current_state,terminal_state:u.terminal_state,started_at:u.started_at,ended_at:u.ended_at})),providers_active:c,context_source:r}}function LW(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function MW(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function DW(t,e,r){return t.db.prepare(`
2246
+ `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=MW(i,l,a.source);return o?W(e,c):e.stdout.write(BW(c)),KT({verb:"status",args:t}),0})}function LW(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=Sd(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function MW(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=DW(t,e.id,RW),a=PW(t,e.id),l=FW(t,e.id,AW),c=UW(t);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(u=>({id:u.id,kind:u.kind,severity:u.severity,payload_summary:WW(u.payload),created_at:u.created_at}))},recent_runs:l.map(u=>({id:u.id,workflow_name:u.workflow_name,current_state:u.current_state,terminal_state:u.terminal_state,started_at:u.started_at,ended_at:u.ended_at})),providers_active:c,context_source:r}}function DW(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function PW(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function FW(t,e,r){return t.db.prepare(`
2247
2247
  SELECT r.*, w.name AS workflow_name
2248
2248
  FROM run r
2249
2249
  JOIN job j ON j.id = r.job_id
@@ -2251,14 +2251,14 @@ per-project workflow bindings and routing conditions.
2251
2251
  WHERE j.project_id = ?
2252
2252
  ORDER BY r.id DESC
2253
2253
  LIMIT ?
2254
- `).all(e,r)}function PW(t){let e=t.getConfig("providers.active");if(e===null||e.length===0)return null;try{let r=JSON.parse(e);if(Array.isArray(r)&&r.every(n=>typeof n=="string"))return r}catch{}return null}function FW(t){if(t===null||t.length===0)return null;try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let r=e,n=["message","detail","reason","action","state"];for(let s of n){let o=r[s];if(typeof o=="string"&&o.length>0)return XT(o,100)}}}catch{}return XT(t,100)}function XT(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function UW(t){let e=[];if(e.push(`project: ${t.project.name}`),e.push(` local_path: ${t.project.local_path}`),e.push(` workflow: ${t.project.workflow_name}`),t.project.team_name!==null&&e.push(` team: ${t.project.team_name}`),e.push(""),t.active_run===null)e.push("active run: none");else{let r=t.active_run.paused_at!==null?`paused at ${t.active_run.current_state??"?"}`:t.active_run.current_state??"unknown";e.push(`active run: #${t.active_run.id} (${r}, started ${t.active_run.started_at})`)}if(e.push(""),t.attentions.unacked_count===0)e.push("attentions: none");else{e.push(`attentions: ${t.attentions.unacked_count} unread`);for(let r of t.attentions.recent){let n=r.payload_summary===null?"":` \u2014 ${r.payload_summary}`;e.push(` - ${r.kind}: #${r.id}${n} (${r.created_at})`)}}if(e.push(""),t.recent_runs.length===0)e.push("recent runs: none");else{e.push("recent runs:");for(let r of t.recent_runs){let n=r.terminal_state??r.current_state??"pending";e.push(` #${r.id} ${r.workflow_name} ${n} (${r.started_at})`)}}return e.push(""),t.providers_active===null?e.push("providers active: (run `lmctl init` to detect)"):t.providers_active.length===0?e.push("providers active: none"):e.push(`providers active: ${t.providers_active.join(", ")}`),e.push(""),e.join(`
2255
- `)}var xW,jW,AW,zT=b(()=>{"use strict";Se();vd();xW=5,jW=10,AW=`usage: lmctl status [--project NAME|--web] [--json]
2254
+ `).all(e,r)}function UW(t){let e=t.getConfig("providers.active");if(e===null||e.length===0)return null;try{let r=JSON.parse(e);if(Array.isArray(r)&&r.every(n=>typeof n=="string"))return r}catch{}return null}function WW(t){if(t===null||t.length===0)return null;try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let r=e,n=["message","detail","reason","action","state"];for(let s of n){let o=r[s];if(typeof o=="string"&&o.length>0)return XT(o,100)}}}catch{}return XT(t,100)}function XT(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function BW(t){let e=[];if(e.push(`project: ${t.project.name}`),e.push(` local_path: ${t.project.local_path}`),e.push(` workflow: ${t.project.workflow_name}`),t.project.team_name!==null&&e.push(` team: ${t.project.team_name}`),e.push(""),t.active_run===null)e.push("active run: none");else{let r=t.active_run.paused_at!==null?`paused at ${t.active_run.current_state??"?"}`:t.active_run.current_state??"unknown";e.push(`active run: #${t.active_run.id} (${r}, started ${t.active_run.started_at})`)}if(e.push(""),t.attentions.unacked_count===0)e.push("attentions: none");else{e.push(`attentions: ${t.attentions.unacked_count} unread`);for(let r of t.attentions.recent){let n=r.payload_summary===null?"":` \u2014 ${r.payload_summary}`;e.push(` - ${r.kind}: #${r.id}${n} (${r.created_at})`)}}if(e.push(""),t.recent_runs.length===0)e.push("recent runs: none");else{e.push("recent runs:");for(let r of t.recent_runs){let n=r.terminal_state??r.current_state??"pending";e.push(` #${r.id} ${r.workflow_name} ${n} (${r.started_at})`)}}return e.push(""),t.providers_active===null?e.push("providers active: (run `lmctl init` to detect)"):t.providers_active.length===0?e.push("providers active: none"):e.push(`providers active: ${t.providers_active.join(", ")}`),e.push(""),e.join(`
2255
+ `)}var AW,RW,OW,zT=b(()=>{"use strict";Se();vd();AW=5,RW=10,OW=`usage: lmctl status [--project NAME|--web] [--json]
2256
2256
 
2257
2257
  Show the current project context, active run, unacked attentions, recent runs,
2258
2258
  and active providers. Defaults to resolving the project from the current
2259
2259
  working directory; --project selects a project by name, and --web uses the
2260
2260
  web UI focus.
2261
- `});Ge();Tn();We();import{pathToFileURL as WW}from"node:url";Ms();Tn();import{mkdirSync as qS,readFileSync as HS,renameSync as JS,writeFileSync as GS}from"node:fs";import{homedir as XS}from"node:os";import{dirname as VS,join as KS}from"node:path";var YS="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",zS=24*60*60*1e3,ZS=1500,QS=new Set(["serve","mcp","api","monitor","intake","tail","device"]);function ek(){let t=process.env.HOME??XS();return KS(t,".lmctl",".update-check.json")}function tk(t){return t.isTTY===!0}function rk(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function nk(t,e){if(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!tk(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help")return!0;let r=t[0];return!!(r!==void 0&&QS.has(r))}function sk(t,e){try{let r=JSON.parse(HS(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<zS)return r.latest}catch{}return null}function ok(t,e){qS(VS(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;GS(r,`${JSON.stringify(e)}
2261
+ `});Ge();Tn();We();import{pathToFileURL as qW}from"node:url";Ms();Tn();import{mkdirSync as qS,readFileSync as HS,renameSync as JS,writeFileSync as GS}from"node:fs";import{homedir as XS}from"node:os";import{dirname as VS,join as KS}from"node:path";var YS="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",zS=24*60*60*1e3,ZS=1500,QS=new Set(["serve","mcp","api","monitor","intake","tail","device"]);function ek(){let t=process.env.HOME??XS();return KS(t,".lmctl",".update-check.json")}function tk(t){return t.isTTY===!0}function rk(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function nk(t,e){if(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!tk(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help")return!0;let r=t[0];return!!(r!==void 0&&QS.has(r))}function sk(t,e){try{let r=JSON.parse(HS(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<zS)return r.latest}catch{}return null}function ok(t,e){qS(VS(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;GS(r,`${JSON.stringify(e)}
2262
2262
  `,"utf8"),JS(r,t)}async function ik(){let t=await ur(YS,{description:"lmctl npm metadata",timeoutMs:ZS}),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 hf(t,e=[],r={}){try{if(nk(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??ek(),o=sk(s,n);if(o===null){o=await(r.fetchLatest??ik)();try{ok(s,{checkedAt:n,latest:o})}catch{}}let i=r.currentVersion?.()??et();rk(o,i)>0&&t.stderr.write(`update available: ${i} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
2263
2263
  `)}catch{}}var Kd=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2264
2264
  `,Xd=`${Kd}
@@ -2312,10 +2312,10 @@ Run 'lmctl help <command>' for command-specific help.
2312
2312
  ${Kd}Run 'lmctl help' for usage.
2313
2313
  `),2}function eS(t,e){return t.stderr.write(`error: unknown command: ${e}
2314
2314
  ${Kd}Run 'lmctl help' for usage.
2315
- `),1}async function BW(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Vd(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Vd(e,"missing value for --workspace");if(!Ue(l))return Vd(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){mf();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${et()}
2315
+ `),1}async function HW(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Vd(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Vd(e,"missing value for --workspace");if(!Ue(l))return Vd(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){mf();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${et()}
2316
2316
  `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(Xd),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(Xd),0):ZT.has(i)?QT(i,[...a,"--help"],e):eS(e,i)}Qd(ce(),e.stderr),tf(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(Xd),0;Ae()&&e.stderr.write(`[debug] lmctl ${et()} | node ${process.version} | cmd ${s} ${o.join(" ")}
2317
2317
  [debug] cwd ${process.cwd()} | db ${ce()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}
2318
- `);try{let i=await QT(s,o,e);return ZT.has(s)&&await hf(e,r),i}catch(i){return qW(i,s,o,e)}}function qW(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Ae())return n.stderr.write(`error: ${s.message}
2318
+ `);try{let i=await QT(s,o,e);return ZT.has(s)&&await hf(e,r),i}catch(i){return JW(i,s,o,e)}}function JW(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Ae())return n.stderr.write(`error: ${s.message}
2319
2319
  `),n.stderr.write(`(re-run with --debug for the full stack trace and context)
2320
2320
  `),1;n.stderr.write(`error: ${s.message}
2321
2321
  `),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}
@@ -2323,10 +2323,10 @@ ${Kd}Run 'lmctl help' for usage.
2323
2323
  `),s.stack&&n.stderr.write(`${s.stack}
2324
2324
  `);let o=s.cause,i=0;for(;o!=null&&i<8;){let a=o instanceof Error?o:new Error(String(o));n.stderr.write(`caused by: ${a.message}
2325
2325
  `),a.stack&&n.stderr.write(`${a.stack}
2326
- `),o=a.cause,i+=1}return 1}async function QT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Ul(),$p));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(oc(),th));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(fE(),dE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(pE(),mE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(OE(),RE));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(FE(),PE));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(XE(),GE));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(KE(),VE));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(ZE(),zE));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(sb(),nb));return n(e,r)}case"info":{let{runInfo:n}=await Promise.resolve().then(()=>(ib(),ob));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(cb(),lb));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>($s(),Is));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>($s(),Is));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>($s(),Is));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>($s(),Is));return n(e,r)}case"connect":{let{runConnect:n}=await Promise.resolve().then(()=>(Mb(),Lb));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(Wb(),Ub));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(Jb(),Hb));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Kb(),Vb));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Rd(),Ad));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Rd(),Ad));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(ET(),yT));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(kT(),ST));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(PT(),DT));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(GT(),JT));return n(e,r)}case"init":{let{runInit:n}=await Promise.resolve().then(()=>(Dd(),fT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(zT(),YT));return n(e,r)}case"db":return HW(e,r);default:return eS(r,t)}}function HW(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2326
+ `),o=a.cause,i+=1}return 1}async function QT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Ul(),$p));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(oc(),th));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(fE(),dE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(pE(),mE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(OE(),RE));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(FE(),PE));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(XE(),GE));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(KE(),VE));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(ZE(),zE));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(sb(),nb));return n(e,r)}case"info":{let{runInfo:n}=await Promise.resolve().then(()=>(ib(),ob));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(cb(),lb));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>($s(),Is));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>($s(),Is));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>($s(),Is));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>($s(),Is));return n(e,r)}case"connect":{let{runConnect:n}=await Promise.resolve().then(()=>(Mb(),Lb));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(Wb(),Ub));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(Jb(),Hb));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Kb(),Vb));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Rd(),Ad));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(Rd(),Ad));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(ET(),yT));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(kT(),ST));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(PT(),DT));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(GT(),JT));return n(e,r)}case"init":{let{runInit:n}=await Promise.resolve().then(()=>(Dd(),fT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(zT(),YT));return n(e,r)}case"db":return GW(e,r);default:return eS(r,t)}}function GW(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2327
2327
 
2328
2328
  Database utilities. The downgrade command is currently a documented stub;
2329
2329
  restore from backup for rollback and use normal migrations for forward changes.
2330
2330
  `),0):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
2331
2331
  `),1):(e.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
2332
- `),1)}if(process.argv[1]!==void 0&&import.meta.url===WW(process.argv[1]).href){let t=await BW(process.argv.slice(2));process.exitCode=t}export{BW as runCli};
2332
+ `),1)}if(process.argv[1]!==void 0&&import.meta.url===qW(process.argv[1]).href){let t=await HW(process.argv.slice(2));process.exitCode=t}export{HW as runCli};