@lmctl-ai/lmctl 0.1.16 → 0.1.18
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.
- package/README.md +32 -22
- package/dist/cli/index.js +199 -199
- package/package.json +6 -4
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
|
|
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
|
|
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
|
|
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=
|
|
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
|
|
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(
|
|
1510
|
+
<div class="grid">${ki.map(bO).join("")}</div>
|
|
1511
1511
|
<h2>Recent Activity</h2>
|
|
1512
|
-
${
|
|
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
|
|
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
|
|
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
|
|
1536
|
-
<p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${
|
|
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
|
|
1541
|
-
<h2>${T(
|
|
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
|
|
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?
|
|
1554
|
+
${n?RO(t,e,r):CO(e)}
|
|
1555
1555
|
<h2>Stage Log</h2>
|
|
1556
1556
|
${jg(e)}
|
|
1557
|
-
</section>`}function
|
|
1558
|
-
<pre>${T(
|
|
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
|
|
1561
|
-
${
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 >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
|
|
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(!
|
|
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??
|
|
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(
|
|
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
|
|
1660
|
-
`,{encoding:"utf8",mode:384}),r}var Qu=b(()=>{"use strict"});import*as Qy from"node:child_process";function
|
|
1661
|
-
`),2;try{aE(e)}catch(E){return 1}let n=pe({path:ce()}),s={portCli:
|
|
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
|
|
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:
|
|
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
|
|
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=
|
|
1674
|
-
`);return{port:a,apiUrl:d,apiToken:c}}function
|
|
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
|
|
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:()=>
|
|
1688
|
-
`),1)}async function
|
|
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
|
|
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(
|
|
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,
|
|
1699
|
-
`),t.length===0?2:0;let 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(
|
|
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=>
|
|
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
|
|
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=>
|
|
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
|
|
1725
|
-
`)}}function
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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: ${
|
|
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
|
|
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} ${
|
|
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:()=>
|
|
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
|
|
1806
|
-
`),1)}async function
|
|
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
|
|
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=
|
|
1817
|
-
`),0}function
|
|
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:()=>
|
|
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
|
|
1830
|
-
`),0}function
|
|
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
|
|
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
|
|
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=
|
|
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
|
|
1842
|
-
`),0}var
|
|
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:()=>
|
|
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?
|
|
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
|
|
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
|
|
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:()=>
|
|
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=>
|
|
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
|
|
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
|
|
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?
|
|
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
|
|
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:()=>
|
|
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=
|
|
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
|
|
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
|
|
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.`,
|
|
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(
|
|
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
|
|
1918
|
-
`),f=
|
|
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{
|
|
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:
|
|
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
|
-
`),_=
|
|
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
|
|
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
|
|
1932
|
-
`),a=
|
|
1933
|
-
`),"utf8"),Sb([s],e))}function kb(t){return
|
|
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
|
|
1936
|
-
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&fa(r,"alias")===e)return!0;return!1}function
|
|
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
|
|
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
|
|
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
|
|
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}),
|
|
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
|
|
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,
|
|
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
|
-
`,
|
|
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:
|
|
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{
|
|
1982
|
-
`),1}let c=
|
|
1983
|
-
`),1;let f=
|
|
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
|
|
1988
|
-
`),n=
|
|
1989
|
-
`)}function
|
|
1990
|
-
`).some(s=>/^\s*_CONNECT_(?:\s|$)/.test(s)&&Cb(s,"alias")===r&&
|
|
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:()=>
|
|
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()?
|
|
2000
|
-
`),1}let a=ma(n),l=
|
|
2001
|
-
`),1;let c=
|
|
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
|
|
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
|
|
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
|
|
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:()=>
|
|
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=
|
|
2019
|
-
`),1):(
|
|
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
|
|
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
|
|
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:()=>
|
|
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
|
|
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
|
|
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
|
|
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=
|
|
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
|
|
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
|
|
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
|
|
2123
|
-
`),a}function
|
|
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
|
|
2127
|
-
`),0}function
|
|
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
|
|
2130
|
-
`),0}function
|
|
2131
|
-
`,c=j(n,"--out");return c!==void 0?(
|
|
2132
|
-
`)):e.stdout.write(l),0}var
|
|
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:()=>
|
|
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??
|
|
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}: ${
|
|
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}))}
|
|
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=
|
|
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
|
|
2157
|
-
`)}}function
|
|
2158
|
-
`)}var Ea,Md,
|
|
2159
|
-
`)}return 0}function
|
|
2160
|
-
`),0}function
|
|
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
|
|
2163
|
-
`),0}function
|
|
2164
|
-
`),0):w(e,`workspace not found: ${n}`)}function Pd(t,e,r){try{
|
|
2165
|
-
`),Ta(t).isDirectory()?
|
|
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
|
|
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??
|
|
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=
|
|
2176
|
-
`),2;S[k]=R;continue}if(!u)return d(`--${k}`);for(;;){let ee=(await c(`${k} (${
|
|
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
|
|
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"],
|
|
2192
|
-
`),0}function
|
|
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
|
|
2195
|
-
`),0)}function
|
|
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
|
|
2198
|
-
`),0}function
|
|
2199
|
-
`),0}function
|
|
2200
|
-
`),0}function
|
|
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
|
|
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
|
|
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",
|
|
2225
|
-
`)}var OT=b(()=>{"use strict";Bd();Os()});import{spawnSync as
|
|
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??
|
|
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(!
|
|
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:()=>
|
|
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
|
|
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:()=>
|
|
2244
|
-
`)}catch{}}async function
|
|
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=
|
|
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
|
|
2255
|
-
`)}var
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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===
|
|
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};
|