@lmctl-ai/lmctl 0.1.87 → 0.1.88

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/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable public-preview changes for `@lmctl-ai/lmctl` are recorded here.
4
4
 
5
+ ## 0.1.88 — 2026-07-08
6
+
7
+ - **Removed `lmctl wait --all`.** System-wide scope is a foot-gun for a paced
8
+ wake (field-confirmed): unrelated completions can wake the caller before its
9
+ own next job finishes. Scope `wait` with default-self, `--from`, `[teamfile]`,
10
+ or `--id`.
11
+
5
12
  ## 0.1.87 — 2026-07-07
6
13
 
7
14
  - **`lmctl wait`/`lmctl exec` are now the synchronous wake model, on a new
package/dist/cli/index.js CHANGED
@@ -1130,10 +1130,10 @@ ${r}`:r}function ep(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.b
1130
1130
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
1131
1131
  ${e}
1132
1132
 
1133
- ${r}`:r}function a0(t,e){let r=s0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function l0(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function np(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead",a=i?vo():[];o.push(...a),_e()&&Xe(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:a.length>0}));let l=e.permissionMode??"yolo",c=QI(l);try{ut("codex",o,l)}catch(U){return n(U)}if(e.cwd&&!YI(e.cwd))return z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ve(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=KI(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:We(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ct(u).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:"codex"}),ct(u).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=VI({input:u.stdout}),m=new Map,p=1,h=e.threadId||"",g="",_=!1,y=!1,E=Date.now(),k=r0(),A=o0();function I(U,M={}){return new Promise((j,Z)=>{let X=p++;m.set(X,{resolve:j,reject:Z});let v=JSON.stringify({jsonrpc:"2.0",id:X,method:U,params:M});u.stdin?.write(v+`
1134
- `)})}function $(U,M={}){let j=JSON.stringify({jsonrpc:"2.0",method:U,params:M});u.stdin?.write(j+`
1135
- `)}f.on("line",U=>{let M;try{M=JSON.parse(U)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let X=m.get(M.id);if(m.delete(M.id),M.error){let v=M.error,N=typeof v?.message=="string"&&v.message.length>0?v.message:JSON.stringify(M.error);X.reject(So(`codex app-server error: ${N}`,v))}else X.resolve(M);e.onEvent?.(M);return}let j=M.method;if(!j){e.onEvent?.(M);return}if(j==="thread/started"){let v=M.params?.thread;v?.id&&(h=v.id)}let Z=_e()?X=>{ir("item.text/buffer-mismatch",{itemId:X.itemId,threadId:X.threadId??null,turnId:X.turnId??null,expectedFromItemText:X.expectedFromItemText,gotFromBuffer:X.gotFromBuffer,expectedLen:X.expectedFromItemText.length,gotLen:X.gotFromBuffer.length})}:void 0;if(j==="turn/started"){let X=M.params,v=X?.turn;v?.id&&(g=v.id),rp(M,k,e.onDelta,Z),_e()&&ir("turn/started",{params:X??null})}if(_e()&&(j==="item/started"||j==="item/completed")){let X=M.params;X?.item?.type==="agentMessage"&&ir(j,{params:X??null})}if(j==="item/started"||j==="item/agentMessage/delta"||j==="item/completed"){if(j==="item/agentMessage/delta"){let X=M.params;_e()&&ir("agentMessage/delta",{params:X??null})}rp(M,k,e.onDelta,Z)}if(j==="turn/completed"){let X=M.params;if(_e())for(let[N,O]of k.agentItems.entries())O.buffer&&ir("turn/completed/unflushed-item",{itemId:N,phase:O.phase,bufferLen:O.buffer.length});n0(k),_e()&&ir("turn/completed",{params:X??null});let v=l0(M,A);v.shouldReject?(_e()&&ir("turn/completed/terminal-reject",{message:v.turnError.message}),y=!0,_=!0,u.stdin?.end(),n(v.turnError)):(_=!0,u.stdin?.end())}if(j==="error"){let X=a0(M,A);if(_e()){let v=M.params,N=v?.error,O=typeof N?.message=="string"?N.message:"(no message)";ir(X.willRetry?"error/retry":"error/terminal-deferred",{message:O,willRetry:X.willRetry,params:v??null})}}e.onEvent?.(M)});let q="";u.stderr?.on("data",U=>{q+=U.toString()}),u.on("error",U=>{z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:U.message}),n(new ve(`Failed to spawn codex app-server: ${U.message}`,{cause:U}))}),u.on("exit",U=>{if(!d&&!y){if(_){r({result:k.resultText,threadId:h,turnId:g,durationMs:Date.now()-E,exitCode:U});return}if(A.pendingCodexError){n(A.pendingCodexError);return}z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:U,stderr_tail:q.slice(0,500)}),n(new Error(i0({exitCode:U,stderr:q})))}}),(async()=>{try{if(await I("initialize",t0()),$("initialized",{}),e.threadId)try{let U=I("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),M=new Promise((j,Z)=>setTimeout(()=>Z(new Error("resume timeout")),5e3));await Promise.race([U,M]),h=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1136
- `);let M=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;M?.id&&(h=M.id)}else{let M=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;M?.id&&(h=M.id)}await I("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(U){ct(u).catch(()=>{}),n(U instanceof Error?U:new Error(String(U)))}})()})}var e0,sp=b(()=>{"use strict";xe();xe();Zr();ko();Qr();Fl();xe();lt();e0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(zI(ZI(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as ap,mkdirSync as c0,readFileSync as lp,writeFileSync as op}from"node:fs";import{join as ns,resolve as u0}from"node:path";function cp(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function Ul(t,e,r={existsSync:ap,readFileSync:lp}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=u0(e,s.sessiondir??e);for(let i of d0(o)){let a=f0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(cp(a.permission)||n.push(`[${s.alias}] ${i} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function d0(t){return[ns(t,".opencode","opencode.jsonc"),ns(t,"opencode.jsonc"),ns(t,"opencode.json")]}function f0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(m0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function m0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
1133
+ ${r}`:r}function a0(t,e){let r=s0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function l0(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function np(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead",a=i?vo():[];o.push(...a),_e()&&Xe(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:a.length>0}));let l=e.permissionMode??"yolo",c=QI(l);try{ut("codex",o,l)}catch(U){return n(U)}if(e.cwd&&!YI(e.cwd))return z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ve(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=KI(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:We(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ct(u).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:"codex"}),ct(u).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=VI({input:u.stdout}),m=new Map,p=1,h=e.threadId||"",g="",_=!1,y=!1,E=Date.now(),k=r0(),A=o0();function I(U,C={}){return new Promise((j,Z)=>{let X=p++;m.set(X,{resolve:j,reject:Z});let v=JSON.stringify({jsonrpc:"2.0",id:X,method:U,params:C});u.stdin?.write(v+`
1134
+ `)})}function $(U,C={}){let j=JSON.stringify({jsonrpc:"2.0",method:U,params:C});u.stdin?.write(j+`
1135
+ `)}f.on("line",U=>{let C;try{C=JSON.parse(U)}catch{return}if(typeof C.id=="number"&&m.has(C.id)){let X=m.get(C.id);if(m.delete(C.id),C.error){let v=C.error,N=typeof v?.message=="string"&&v.message.length>0?v.message:JSON.stringify(C.error);X.reject(So(`codex app-server error: ${N}`,v))}else X.resolve(C);e.onEvent?.(C);return}let j=C.method;if(!j){e.onEvent?.(C);return}if(j==="thread/started"){let v=C.params?.thread;v?.id&&(h=v.id)}let Z=_e()?X=>{ir("item.text/buffer-mismatch",{itemId:X.itemId,threadId:X.threadId??null,turnId:X.turnId??null,expectedFromItemText:X.expectedFromItemText,gotFromBuffer:X.gotFromBuffer,expectedLen:X.expectedFromItemText.length,gotLen:X.gotFromBuffer.length})}:void 0;if(j==="turn/started"){let X=C.params,v=X?.turn;v?.id&&(g=v.id),rp(C,k,e.onDelta,Z),_e()&&ir("turn/started",{params:X??null})}if(_e()&&(j==="item/started"||j==="item/completed")){let X=C.params;X?.item?.type==="agentMessage"&&ir(j,{params:X??null})}if(j==="item/started"||j==="item/agentMessage/delta"||j==="item/completed"){if(j==="item/agentMessage/delta"){let X=C.params;_e()&&ir("agentMessage/delta",{params:X??null})}rp(C,k,e.onDelta,Z)}if(j==="turn/completed"){let X=C.params;if(_e())for(let[N,O]of k.agentItems.entries())O.buffer&&ir("turn/completed/unflushed-item",{itemId:N,phase:O.phase,bufferLen:O.buffer.length});n0(k),_e()&&ir("turn/completed",{params:X??null});let v=l0(C,A);v.shouldReject?(_e()&&ir("turn/completed/terminal-reject",{message:v.turnError.message}),y=!0,_=!0,u.stdin?.end(),n(v.turnError)):(_=!0,u.stdin?.end())}if(j==="error"){let X=a0(C,A);if(_e()){let v=C.params,N=v?.error,O=typeof N?.message=="string"?N.message:"(no message)";ir(X.willRetry?"error/retry":"error/terminal-deferred",{message:O,willRetry:X.willRetry,params:v??null})}}e.onEvent?.(C)});let q="";u.stderr?.on("data",U=>{q+=U.toString()}),u.on("error",U=>{z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:U.message}),n(new ve(`Failed to spawn codex app-server: ${U.message}`,{cause:U}))}),u.on("exit",U=>{if(!d&&!y){if(_){r({result:k.resultText,threadId:h,turnId:g,durationMs:Date.now()-E,exitCode:U});return}if(A.pendingCodexError){n(A.pendingCodexError);return}z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:U,stderr_tail:q.slice(0,500)}),n(new Error(i0({exitCode:U,stderr:q})))}}),(async()=>{try{if(await I("initialize",t0()),$("initialized",{}),e.threadId)try{let U=I("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),C=new Promise((j,Z)=>setTimeout(()=>Z(new Error("resume timeout")),5e3));await Promise.race([U,C]),h=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1136
+ `);let C=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(h=C.id)}else{let C=(await I("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(h=C.id)}await I("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(U){ct(u).catch(()=>{}),n(U instanceof Error?U:new Error(String(U)))}})()})}var e0,sp=b(()=>{"use strict";xe();xe();Zr();ko();Qr();Fl();xe();lt();e0=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(zI(ZI(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as ap,mkdirSync as c0,readFileSync as lp,writeFileSync as op}from"node:fs";import{join as ns,resolve as u0}from"node:path";function cp(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function Ul(t,e,r={existsSync:ap,readFileSync:lp}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=u0(e,s.sessiondir??e);for(let i of d0(o)){let a=f0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(cp(a.permission)||n.push(`[${s.alias}] ${i} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return n}function d0(t){return[ns(t,".opencode","opencode.jsonc"),ns(t,"opencode.jsonc"),ns(t,"opencode.json")]}function f0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(m0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function m0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
1137
1137
  `;)o+=1;o<t.length&&(e+=t[o]);continue}if(i==="/"&&a==="*"){for(o+=2;o<t.length&&!(t[o]==="*"&&t[o+1]==="/");)o+=1;o+=1;continue}e+=i}return e.replace(/,\s*([}\]])/g,"$1")}function Io(t,e={}){let r=ns(t,".opencode"),n=ns(r,"opencode.json");if(!ap(n)){c0(r,{recursive:!0});let i=JSON.stringify({permission:"allow"},null,2);return op(n,i+`
1138
1138
  `,"utf-8"),!0}let s;try{s=JSON.parse(lp(n,"utf-8"))}catch{return console.log(ip.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(ip.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;return s.permission===void 0&&(s.permission="allow",o=!0),cp(s.permission)||z({event:"opencode_yolo_override",provider:"opencode",config_path:n,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),o&&op(n,JSON.stringify(s,null,2)+`
1139
1139
  `,"utf-8"),o}var ip,No=b(()=>{"use strict";xe();ip={yellow:t=>t}});import{spawn as p0}from"node:child_process";import{existsSync as h0}from"node:fs";import{createInterface as _0}from"node:readline";function g0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
@@ -1142,9 +1142,9 @@ ${e}
1142
1142
 
1143
1143
  ${r}`:r}function v0(t){let e=[...t.matchAll(E0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return up(t.slice(n).trimStart())}return up(I0(t.replace(b0,"")))}function I0(t){let e=T0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(S0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function up(t){let e=[...t.matchAll(k0)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function fp(t,e){let r=w0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{Io(e.cwd)}catch(I){z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:I instanceof Error?I.message:String(I)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let I=or("gemini","plan"),$=or("gemini","yolo");a=a.filter(q=>!($??[]).includes(q)),I&&a.push(...I)}else e.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
1144
1144
  `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{ut(e.tool,a,l)}catch(I){return s(I)}if(e.model&&e.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1145
- `),e.cwd&&!h0(e.cwd))return z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ve(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=p0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:We(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),ct(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),ct(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=_0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1,y=!1;function E(I,$={}){return new Promise((q,U)=>{let M=y0++;m.set(M,{resolve:q,reject:U});let j=JSON.stringify({jsonrpc:"2.0",id:M,method:I,params:$});Pt({event:"acp_send",direction:"SEND",provider:e.tool,method:I,id:M,params:$}),c.stdin?.write(j+`
1146
- `)})}f.on("line",I=>{let $;try{$=JSON.parse(I)}catch{return}if(Pt({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof $.id=="number"?$.id:void 0,method:typeof $.method=="string"?$.method:void 0,preview:JSON.stringify($).slice(0,300)}),e.onEvent?.($),typeof $.id=="number"&&m.has($.id)){let U=m.get($.id);if(m.delete($.id),$.error){let M=$.error,j=typeof M?.message=="string"&&M.message.length>0?M.message:JSON.stringify($.error);U.reject(So(`ACP RPC error: ${j}`,M))}else U.resolve($);return}let q=$.method;if(q){if(typeof $.id=="number"){z({event:"acp_unhandled_request",provider:e.tool,method:q,id:$.id,params:$.params});let U=JSON.stringify({jsonrpc:"2.0",id:$.id,error:{code:-32601,message:`Method not found: ${q} (lmctl does not implement server-side ACP methods)`}});Pt({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:$.id,error:"method not found"}),c.stdin?.write(U+`
1147
- `);return}if(q==="session/update"){let M=$.params?.update;if(M?.sessionUpdate==="agent_message_chunk"){let Z=M.content?.text||"";Z&&y&&(h+=Z,e.onDelta?.(Z))}}}});let k="";c.stderr?.on("data",I=>{k+=I.toString()}),c.on("error",I=>{z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:I.message,elapsed_ms:Date.now()-u}),s(new ve(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${I.message}`,{cause:I}))}),c.on("exit",I=>{d||(_?n({result:e.tool==="gemini"?v0(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:I}):(z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:I,stderr_tail:k.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(g0({tool:e.tool,exitCode:I,stderr:k})))))});function A(I,$={}){let q=JSON.stringify({jsonrpc:"2.0",method:I,params:$});c.stdin?.write(q+`
1145
+ `),e.cwd&&!h0(e.cwd))return z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ve(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=p0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:We(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),ct(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),ct(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=_0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1,y=!1;function E(I,$={}){return new Promise((q,U)=>{let C=y0++;m.set(C,{resolve:q,reject:U});let j=JSON.stringify({jsonrpc:"2.0",id:C,method:I,params:$});Pt({event:"acp_send",direction:"SEND",provider:e.tool,method:I,id:C,params:$}),c.stdin?.write(j+`
1146
+ `)})}f.on("line",I=>{let $;try{$=JSON.parse(I)}catch{return}if(Pt({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof $.id=="number"?$.id:void 0,method:typeof $.method=="string"?$.method:void 0,preview:JSON.stringify($).slice(0,300)}),e.onEvent?.($),typeof $.id=="number"&&m.has($.id)){let U=m.get($.id);if(m.delete($.id),$.error){let C=$.error,j=typeof C?.message=="string"&&C.message.length>0?C.message:JSON.stringify($.error);U.reject(So(`ACP RPC error: ${j}`,C))}else U.resolve($);return}let q=$.method;if(q){if(typeof $.id=="number"){z({event:"acp_unhandled_request",provider:e.tool,method:q,id:$.id,params:$.params});let U=JSON.stringify({jsonrpc:"2.0",id:$.id,error:{code:-32601,message:`Method not found: ${q} (lmctl does not implement server-side ACP methods)`}});Pt({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:$.id,error:"method not found"}),c.stdin?.write(U+`
1147
+ `);return}if(q==="session/update"){let C=$.params?.update;if(C?.sessionUpdate==="agent_message_chunk"){let Z=C.content?.text||"";Z&&y&&(h+=Z,e.onDelta?.(Z))}}}});let k="";c.stderr?.on("data",I=>{k+=I.toString()}),c.on("error",I=>{z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:I.message,elapsed_ms:Date.now()-u}),s(new ve(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${I.message}`,{cause:I}))}),c.on("exit",I=>{d||(_?n({result:e.tool==="gemini"?v0(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:I}):(z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:I,stderr_tail:k.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(g0({tool:e.tool,exitCode:I,stderr:k})))))});function A(I,$={}){let q=JSON.stringify({jsonrpc:"2.0",method:I,params:$});c.stdin?.write(q+`
1148
1148
  `)}(async()=>{try{if(await E("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),A("notifications/initialized"),e.sessionId)try{p=(await E("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch($){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${$ instanceof Error?$.message:String($)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1149
1149
  `),p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),Et(`acp: set_config_option(model=${e.model}) ok`)}catch($){let q=$ instanceof Error?$.message:String($);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${q}
1150
1150
  `)}if(e.effort&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),Et(`acp: set_config_option(effort=${e.effort}) ok`)}catch($){let q=$ instanceof Error?$.message:String($);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${q}
@@ -1308,7 +1308,7 @@ ${r}`:r}function v0(t){let e=[...t.matchAll(E0)];if(e.length>0){let r=e[e.length
1308
1308
  WHERE run_id = ?
1309
1309
  AND kind = 'session_hung'
1310
1310
  AND acknowledged_at IS NULL
1311
- ORDER BY id ASC`,e).map(A=>({kind:A.kind,severity:A.severity,payload:cx(A.payload)})),k=_.map(A=>{let I=f.get(A),$=p.get(A),q=nx(s,A,y,I,$),U=I===void 0?null:Date.parse(I.started_at),M=I?.ended_at===null||I===void 0?null:Date.parse(I.ended_at),j=I===void 0||Number.isNaN(U??NaN)?null:M!==null&&!Number.isNaN(M)?M-U:q==="running"||q==="paused"?n-U:null,Z=I===void 0?null:h.get(I.id)??null,X=ux($?.last_activity_at??null,Z,g),v=o===null||$===void 0?void 0:ix(t,s.team_id,o.definition,$.state_name,I?.state_name??A);return{step_id:I?.id??null,state_id:A,status:q,started_at:I?.started_at??null,ended_at:I?.ended_at??null,last_activity_at:X,elapsed_ms:j,...v!==void 0?{member:v}:{},...$!==void 0?{interactive_session:{id:$.id,status:$.status,turn_count:$.turn_count,state_name:$.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:ox(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:sx(k,s.terminal_state!==null),related_attentions:E}}function ni(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${ch(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${lh(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":lh(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${si(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${ch(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${dx(a.payload)}`)}return`${n.join(`
1311
+ ORDER BY id ASC`,e).map(A=>({kind:A.kind,severity:A.severity,payload:cx(A.payload)})),k=_.map(A=>{let I=f.get(A),$=p.get(A),q=nx(s,A,y,I,$),U=I===void 0?null:Date.parse(I.started_at),C=I?.ended_at===null||I===void 0?null:Date.parse(I.ended_at),j=I===void 0||Number.isNaN(U??NaN)?null:C!==null&&!Number.isNaN(C)?C-U:q==="running"||q==="paused"?n-U:null,Z=I===void 0?null:h.get(I.id)??null,X=ux($?.last_activity_at??null,Z,g),v=o===null||$===void 0?void 0:ix(t,s.team_id,o.definition,$.state_name,I?.state_name??A);return{step_id:I?.id??null,state_id:A,status:q,started_at:I?.started_at??null,ended_at:I?.ended_at??null,last_activity_at:X,elapsed_ms:j,...v!==void 0?{member:v}:{},...$!==void 0?{interactive_session:{id:$.id,status:$.status,turn_count:$.turn_count,state_name:$.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:ox(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:sx(k,s.terminal_state!==null),related_attentions:E}}function ni(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${ch(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${lh(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":lh(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${si(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${ch(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${dx(a.payload)}`)}return`${n.join(`
1312
1312
  `)}
1313
1313
  `}function tx(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function rx(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function nx(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function sx(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function ox(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function ix(t,e,r,n,s){let o=ax(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:$e(i)}}function ax(t,e,r){let n=lx(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>cr(a)?a.id===e||a.name===e||a.name===r:!1),o=cr(s?.members)?s.members:null,i=o!==null&&cr(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(cr(n.states)){let s=n.states[e]??n.states[r];if(!cr(s))return null;let o=cr(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function lx(t){try{let e=JSON.parse(t);return cr(e)?e:null}catch{return null}}function cx(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function cr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ux(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function lh(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${si(Math.max(0,n-r)).padEnd(6)}]`}function ch(t,e){return Number.isNaN(t)?"?":si(Math.max(0,e-t))}function si(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function dx(t){if(!cr(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${si(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var wh,Xt=b(()=>{"use strict";Fe();wh=`SELECT a.id AS attention_id,
1314
1314
  a.kind AS kind,
@@ -1545,19 +1545,19 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1545
1545
  `,"utf8"),Be.renameSync(r,t)}catch(n){try{Be.unlinkSync(r)}catch{}throw n}}function TA(t,e){Be.mkdirSync(ys(t),{recursive:!0});let r=Nt(ys(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Be.writeFileSync(r,e,"utf8"),Be.renameSync(r,t)}catch(n){try{Be.unlinkSync(r)}catch{}throw n}}function Fr(t,e,r){try{if(!Be.existsSync(t))return;let n=JSON.parse(Be.readFileSync(t,"utf8"));if(!pn(n)||!pn(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,r_(t,n),z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function SA(t){let e=e_??Qh();switch(t){case"copilot":Fr(Yc(e),"mcpServers",[mr]);return;case"claude":Fr(Nt(e,".claude.json"),"mcpServers",[mr]);return;case"gemini":Fr(Nt(e,".gemini","settings.json"),"mcpServers",[mr]);return;case"qwen":Fr(Nt(e,".qwen","settings.json"),"mcpServers",[mr]);return;case"agy":Fr(Nt(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[mr]);return;case"opencode":Fr(Nt(e,".config","opencode","opencode.json"),"mcp",[mr]);return;case"codex":kA(Nt(e,".codex","config.toml"),mr);return;default:return}}function kA(t,e){try{if(!Be.existsSync(t))return;let n=Be.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=vA(a);if(l===null)return;if(l!==void 0){if(Zh(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=IA(a);if(c===null)return;if(c!==void 0&&Zh(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;TA(t,s.join(`
1546
1546
  `)),z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Zh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function vA(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:n_(e[1])}function IA(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return n_(r)}function n_(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function NA(t,e){return t!==void 0&&yi(t)===yi(e)}function yi(t){return Array.isArray(t)?`[${t.map(e=>yi(e)).join(",")}]`:pn(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${yi(t[e])}`).join(",")}}`:JSON.stringify(t)}function pn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var EA,mr,bA,Be,e_,bi=b(()=>{"use strict";xe();EA="lmctl",mr="lmctl0",bA={existsSync:mA,mkdirSync:pA,readFileSync:hA,writeFileSync:wA,renameSync:_A,unlinkSync:gA},Be=bA});import{spawnSync as c_}from"node:child_process";import{cpSync as s_,existsSync as Qc,mkdirSync as u_,mkdtempSync as xA,readFileSync as d_,statSync as $A,writeFileSync as zc}from"node:fs";import{homedir as AA,tmpdir as jA}from"node:os";import{basename as o_,join as et}from"node:path";function Kt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Zc(t,e,r){if(Array.isArray(t)){for(let n of t)Zc(n,e,r);return}if(Kt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))Zc(n,e,r)}}function CA(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Kt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Kt(l)&&l.members!==void 0&&Zc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(LA(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function MA(t,e){return t.listProjects().find(r=>r.team_id===e.team_id)?.local_path}async function f_(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(RA)})}catch(s){throw new tt(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new tt(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>i_)throw new tt(e,`fetched ${t} exceeds ${i_} bytes`);return n}async function DA(t,e){if(typeof t!="string")return[t];fr(t)&&(t=await ws(t));let r;if(eu.test(t))r=await f_(t,e);else{if(!Qc(t))throw new tt(e,`mcp file not found: ${t}`);r=d_(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new tt(e,`mcp source is not JSON: ${t}`)}if(Kt(n)&&Kt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Kt(o)?o:{}}));if(Kt(n)&&typeof n.name=="string")return[n];throw new tt(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function Si(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function Ti(t,e,r,n){let s=c_(t,e,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new tt(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new tt(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function PA(t,e,r){c_(t,e,{cwd:r,env:Ut(void 0,r),encoding:"utf8",timeout:6e4})}function FA(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function UA(t){let e=["mcp","add"];if(Si(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function WA(t){if(Si(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function BA(t){let e=et(process.env.XDG_CONFIG_HOME??et(hn(),".config"),"opencode"),r=et(e,"opencode.json"),n={};if(Qc(r))try{let o=JSON.parse(d_(r,"utf8"));Kt(o)&&(n=o)}catch{}let s=Kt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=Si(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),u_(e,{recursive:!0}),zc(r,`${JSON.stringify(n,null,2)}
1547
1547
  `,"utf8")}function HA(t,e){let r={};for(let n of t)r[n.name]=Si(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{t_(Yc(hn()),r)}catch(n){throw new tt(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function qA(t){if(typeof t!="string")return t.name;let e=o_(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?o_(t.replace(/\/skill\.md$/i,"")):e}async function a_(t,e,r){let n=qA(t),s=et(e,n);if(u_(s,{recursive:!0}),typeof t!="string")return zc(et(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(fr(t)&&(t=await ws(t)),eu.test(t))return zc(et(s,"SKILL.md"),await f_(t,r),"utf8"),{name:n,dir:s};if(!Qc(t))throw new tt(r,`skill path not found: ${t}`);return $A(t).isDirectory()?(s_(t,s,{recursive:!0}),{name:n,dir:s}):(s_(t,et(s,"SKILL.md")),{name:n,dir:s})}async function ki(t){let{dal:e,member:r,stderr:n}=t,s=CA(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=$e(r),i=r.sessiondir||t.baseDir||MA(e,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1548
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await DA(c,r.alias));if(o==="opencode")BA(l);else if(o==="copilot")HA(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(PA(o,FA(o,c.name),i),o==="claude"){let{name:u,...d}=c;Ti("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?Ti("codex",WA(c),i,r.alias):Ti(o,UA(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(OA.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=xA(et(jA(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!eu.test(c)?c:(await a_(c,l,r.alias)).dir;Ti(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(l_[o]!==void 0){let l=l_[o]();for(let c of s.skills)await a_(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var tt,eu,RA,i_,OA,LA,hn,l_,tu=b(()=>{"use strict";Fe();Vc();lt();bi();tt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},eu=/^https?:\/\//i,RA=8e3,i_=1e6,OA=new Set(["opencode"]),LA=t=>JSON.stringify(t),hn=()=>process.env.HOME??AA();l_={claude:()=>et(hn(),".claude","skills"),qwen:()=>et(hn(),".qwen","skills"),codex:()=>et(hn(),".codex","skills"),copilot:()=>et(hn(),".copilot","skills")}});async function L(t,e){if(t.dal!==void 0)return e(t.dal);let r=ge({path:de()});try{return await e(r)}finally{r.close()}}function D(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function x(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function C(t,e){return t.flags[e]===!0}function W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1548
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await DA(c,r.alias));if(o==="opencode")BA(l);else if(o==="copilot")HA(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if(PA(o,FA(o,c.name),i),o==="claude"){let{name:u,...d}=c;Ti("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?Ti("codex",WA(c),i,r.alias):Ti(o,UA(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(OA.has(o))a(`skills for ${o} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(o==="gemini"||o==="agy"){let l=xA(et(jA(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!eu.test(c)?c:(await a_(c,l,r.alias)).dir;Ti(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(l_[o]!==void 0){let l=l_[o]();for(let c of s.skills)await a_(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var tt,eu,RA,i_,OA,LA,hn,l_,tu=b(()=>{"use strict";Fe();Vc();lt();bi();tt=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},eu=/^https?:\/\//i,RA=8e3,i_=1e6,OA=new Set(["opencode"]),LA=t=>JSON.stringify(t),hn=()=>process.env.HOME??AA();l_={claude:()=>et(hn(),".claude","skills"),qwen:()=>et(hn(),".qwen","skills"),codex:()=>et(hn(),".codex","skills"),copilot:()=>et(hn(),".copilot","skills")}});async function L(t,e){if(t.dal!==void 0)return e(t.dal);let r=ge({path:de()});try{return await e(r)}finally{r.close()}}function D(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function x(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function W(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1549
1549
  `)}function w(t,e){return t.stderr.write(`error: ${e}
1550
1550
  `),1}function he(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1551
1551
  `),2}var ye=b(()=>{"use strict";Fe();ze()});var g_={};ne(g_,{defaultTeamNameForProject:()=>cj,resolveAlias:()=>Ni,resolveProject:()=>vi,resolveTeam:()=>Ii,runCode:()=>GA});import{execFileSync as JA}from"node:child_process";import{basename as XA,resolve as m_}from"node:path";import*as nu from"node:readline";import{setTimeout as ru}from"node:timers/promises";async function GA(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return KA(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return h_(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return nj(e);try{return await L(e,async s=>{switch(r){case"team":return VA(n,e,s);case"chat":return ej(n,e,s);case"spec":return tj(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return he(e,s)}}function KA(t){return t.stdout.write(["usage: lmctl code <team|chat|spec> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1552
- `)),0}function VA(t,e,r){let[n,...s]=t;switch(n){case"add":return YA(s,e,r);case"list":return zA(s,e,r);case"show":return ZA(s,e,r);case"rm":return QA(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function YA(t,e,r){let n=D(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]");let o=x(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=_n(e,r,x(n,"--project"),x(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??i.project.local_path});return C(n,"--json")?W(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1553
- `),0}function zA(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=_n(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=__(r.listTeamMembers(s.team.id));if(C(n,"--json"))W(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${$e(i)} ${i.sessionid??"(unseeded)"}
1554
- `);return 0}function ZA(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team show <alias>");let o=_n(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?w(e,`member not found: ${s}`):(C(n,"--json")?W(e,i):(e.stdout.write(`member ${i.alias}
1552
+ `)),0}function VA(t,e,r){let[n,...s]=t;switch(n){case"add":return YA(s,e,r);case"list":return zA(s,e,r);case"show":return ZA(s,e,r);case"rm":return QA(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function YA(t,e,r){let n=D(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team add <alias> --provider P [--model M] [--role R] [--sessiondir DIR] [--project NAME] [--team NAME] [--json]");let o=x(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=_n(e,r,x(n,"--project"),x(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??i.project.local_path});return M(n,"--json")?W(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1553
+ `),0}function zA(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=_n(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=__(r.listTeamMembers(s.team.id));if(M(n,"--json"))W(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${$e(i)} ${i.sessionid??"(unseeded)"}
1554
+ `);return 0}function ZA(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team show <alias>");let o=_n(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?w(e,`member not found: ${s}`):(M(n,"--json")?W(e,i):(e.stdout.write(`member ${i.alias}
1555
1555
  `),e.stdout.write(`role: ${i.role}
1556
1556
  `),e.stdout.write(`provider: ${$e(i)}
1557
1557
  `),e.stdout.write(`model: ${i.model??"(default)"}
1558
1558
  `),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
1559
1559
  `),e.stdout.write(`sessiondir: ${i.sessiondir}
1560
- `)),0)}function QA(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team rm <alias>");let o=_n(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return w(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return C(n,"--json")?W(e,a):e.stdout.write(`retired member ${i.alias}
1560
+ `)),0)}function QA(t,e,r){let n=D(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team rm <alias>");let o=_n(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return w(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return M(n,"--json")?W(e,a):e.stdout.write(`retired member ${i.alias}
1561
1561
  `),0}async function ej(t,e,r){if(t.includes("--help")||t.includes("-h"))return h_(e);let n=D(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=_n(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=Ni(e,r,s.team,x(n,"--alias"));if(typeof o=="number")return o;let i=await lj(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1562
1562
  `);let a=e.stdin??process.stdin,l=nu.createInterface({input:a,terminal:!1}),c=i;Es(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){Es(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1563
1563
  `),0;if(d==="/help"){aj(e),Es(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
@@ -1581,7 +1581,7 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1581
1581
 
1582
1582
  ${un}`:un;return e.setMemberPromptSnapshot(o.id,l)??o}function cj(t){return`${XA(t.local_path)}-code`}var p_,su=b(()=>{"use strict";cs();qo();hs();Wc();Bc();Fe();Pr();tu();ye();Fc();p_="spec-driven-task"});import w_ from"jexl";function pr(t){w_.compile(y_(t))}async function Ur(t,e){return w_.eval(y_(t),e)}function y_(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var gn=b(()=>{"use strict"});import{z as T}from"zod";function du(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var uj,E_,ou,iu,au,lu,cu,uu,b_,dj,fj,mj,Ts,pj,xi,$i,Ai,ji,Ri,T_,hj,_j,gj,wj,Oi,wn=b(()=>{"use strict";gn();uj=T.object({kind:T.enum(["success","neutral","failure"])}),E_=T.enum(["string","number","boolean","object","array"]),ou=T.object({name:T.string().min(1),type:E_,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),iu=T.object({name:T.string().min(1),type:E_,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),au=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),lu="__failure__",cu=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),uu=T.object({on_unhandled_failure:T.object({attention_kind:T.string().min(1).default("workflow_failed"),severity:T.enum(["warn","error","critical"]).default("warn"),capture_evidence:T.boolean().default(!0),recommend_recovery:T.string().min(1).optional()}).optional(),on_unhandled_failure_state:T.string().min(1).optional()}).optional(),b_=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),dj=T.object({name:T.string().min(1),command:T.string().min(1).optional(),args:T.array(T.string()).optional(),env:T.record(T.string(),T.string()).optional(),type:T.enum(["stdio","http","sse"]).optional(),url:T.string().min(1).optional(),headers:T.record(T.string(),T.string()).optional()}).strict(),fj=T.union([T.string().min(1),dj]),mj=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),Ts=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(fj).optional(),skills:T.array(mj).optional()}),pj=T.object({kind:T.literal("shell"),command:T.string().min(1),description:T.string().optional()}),xi=T.object({type:T.literal("Review"),state_name:T.string().min(1),coder:Ts,pre_checks:T.array(pj).optional(),reviewers:T.array(Ts.extend({rubric_artifact:T.string().optional()})).optional(),outcomes:T.object({approve:T.string().min(1),request_changes:T.string().optional(),fail_pre_check:T.string().optional(),max_loops_exceeded:T.string().optional()}),writes_to_project_path:T.boolean().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional(),max_loops:T.number().int().positive().default(5),loop_feedback_artifact:T.string().optional(),outcomes_from_stance:T.record(T.string(),T.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),$i=T.object({type:T.literal("Consolidate"),state_name:T.string().min(1),researchers:T.array(Ts.extend({topic:T.string().min(1)})).optional(),consolidator:Ts,outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),research_artifact_prefix:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),Ai=T.object({type:T.literal("Interactive"),state_name:T.string().min(1),agent:Ts.extend({initial_prompt_template:T.string().min(1)}),termination:T.object({operator_signal:T.boolean().default(!0),agent_signal:T.string().optional(),max_turns:T.number().int().positive().default(20),timeout_seconds:T.number().int().positive().optional()}),outcomes:T.object({done:T.string().min(1),timeout:T.string().optional()}),artifact_name:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),ji=T.object({type:T.literal("Loop"),state_name:T.string().min(1),over:T.string().min(1),item_var:T.string().min(1),body:T.string().min(1),outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),stop_on_error:T.boolean().default(!0),max_items:T.number().int().positive().default(1e3)}),Ri=T.object({type:T.literal("ShellStep"),state_name:T.string().min(1),command:T.string().min(1),outcomes_from_exit:T.record(T.string(),T.string().min(1)),timeout_ms:T.number().int().nonnegative().optional(),capture_output_to:T.string().optional(),writes_to_project_path:T.boolean().optional()}),T_=T.object({type:T.literal("Choice"),state_name:T.string().min(1),branches:T.array(T.object({when:T.string().min(1),next:T.string().min(1)})).default([]),default_next:T.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{pr(du(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),hj=T.discriminatedUnion("type",[b_,xi,$i,Ai,ji,Ri,T_]),_j=T.object({type:T.literal("ForEach"),state_name:T.string().min(1),items_from:T.string().min(1),mode:T.enum(["sequential","parallel"]).default("sequential"),max_concurrency:T.number().int().positive().default(1),on_item_failure:T.enum(["continue","stop"]).default("stop"),body:hj,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((t,e)=>{try{pr(du(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),gj=T.object({type:T.literal("Subflow"),state_name:T.string().min(1),workflow_name:T.string().min(1),inputs:T.record(T.string(),T.string().min(1)).optional(),outcomes:T.record(T.string(),T.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{pr(du(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),wj=T.discriminatedUnion("type",[b_,xi,$i,Ai,ji,Ri,T_,_j,gj]),Oi=T.object({name:T.string().min(1),version:T.number().int().positive(),definition_schema_version:T.union([T.literal(1),T.literal(2)]),description:T.string().optional(),estimated_duration_ms:T.number().int().nonnegative().optional(),primitive_version:T.union([T.literal(1),T.literal(2)]).default(1),start_at:T.string().min(1),states:T.record(T.string().min(1),wj),terminals:T.record(T.string().min(1),uj),errors:uu,concurrency_key:T.string().min(1).optional(),concurrent_limit:T.number().int().positive().optional(),default_task_timeout_ms:T.number().int().positive().max(216e5).optional(),inputs:T.array(ou).optional(),outputs:T.array(iu).optional(),triggers:T.array(au).optional(),read_only:T.boolean().optional(),requires:cu}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var yj,Li,Ej,bj,Tj,xt,yn=b(()=>{"use strict";wn();yj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Li=Q.string().regex(yj),Ej=Q.object({step_id:Li,type:Q.literal("main"),index:Q.number().int().min(0)}),bj=Q.record(Li,Q.record(Q.string().min(1),Q.array(Q.array(Ej)))),Tj=Q.object({id:Li,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),xt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:uu,inputs:Q.array(ou).optional(),outputs:Q.array(iu).optional(),steps:Q.array(Tj).min(1),connections:bj.default({}),entry_step_id:Li,triggers:Q.array(au).optional(),read_only:Q.boolean().optional(),requires:cu}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function Ci(t){return mu(t)}function mu(t){if(Array.isArray(t))return t.map(mu);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=mu(e[n]);if(typeof r.type=="string"){let n=kj[r.type];n!==void 0&&(r.type=n)}return r}var fu,Sj,kj,pu=b(()=>{"use strict";fu="lmctl.builtin.",Sj={Review:`${fu}Review`,Research:`${fu}Research`,Consolidate:`${fu}Consolidate`},kj=Object.fromEntries(Object.entries(Sj).map(([t,e])=>[e,t]))});import{readFileSync as vj}from"node:fs";function v_(t){return Ij(t)}function Ij(t){let e=Ci($j(t));if(xj(e),I_(e)===3)return Nj(e);let r=Oi.safeParse(e);if(!r.success)throw new Vt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=Aj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Vt(n);return r.data}function Nj(t){let e=xt.safeParse(t);if(!e.success)throw new Vt({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function xj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=I_(t);if(!(e===null||S_.includes(e)))throw new Vt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${S_.join(", ")}`}]})}function I_(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function $j(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1583
1583
  `)||e.startsWith("{")||e.startsWith("[")?k_(t,"$"):e.endsWith(".json")?k_(vj(e,"utf8"),e):t}function k_(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Vt({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function Aj(t){let e=[],r=[],n=new Set(Object.keys(t.states));n.has(t.start_at)||r.push({state:"$",ref:t.start_at,kind:"next"}),jj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function jj(t,e,r){let n=t.errors?.on_unhandled_failure_state;n!==void 0&&(e.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var S_,Vt,N_=b(()=>{"use strict";wn();yn();pu();S_=[1,2,3],Vt=class extends Error{errors;unresolvedRefs;constructor(e){super(e.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=e.errors??[],this.unresolvedRefs=e.unresolvedRefs??[]}}});import{createHash as Rj}from"node:crypto";function x_(t,e){let r=Oj(e),n=Rj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function Oj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var $_=b(()=>{"use strict";yn()});function Mj(t,e){let r=Cj[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function O_(t){let e=[],r=(v,N)=>{throw new En([{line:v,message:N}])},n=t.split(`
1584
- `),s=[];for(let v=0;v<n.length;v+=1){let O=Fj(n[v]).trim();O.length>0&&s.push({n:v+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(v,N,O,J,B,P)=>{l.has(v)&&r(J,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(J,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:N,params:O,line:J,isTerminal:B,...P?{members:P}:{}}),u.push(v)},y=v=>{let N=[],O=v+1;for(;O<s.length;O+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(J===null)break;N.push({label:J[1],dst:J[2]})}return{branches:N,nextIdx:O-1}};for(let v=1;v<s.length;v+=1){let{n:N,text:O}=s[v],J=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){v!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let B=/^meta\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),P=hr(B[1],N,r);for(let te of Object.keys(P))j_.has(te)||r(N,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...j_].join(", ")} (no grammar inflation; bounded)`);m=P;continue}if(J==="step"){let B=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),P=B[1],te=B[2],Ee=B[3],ae=A_[te];ae===void 0&&r(N,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(A_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Se,members:Ct}=Mj(ae,hr(Ee,N,r));_(P,ae,Se,N,!1,Object.keys(Ct).length>0?Ct:void 0);continue}if(J==="trigger"){let B=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),P=B[1],te=B[2],Ee=B[3],ae=R_[te];ae===void 0&&r(N,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(R_).join(", ")})`),p.has(P)&&r(N,`duplicate trigger id: ${P}`),p.set(P,{id:P,type:ae,parameters:hr(Ee,N,r)});continue}if(J==="mcp"||J==="skill"){let B=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${O}`),P=B[1],te=B[2].trim(),Ee=J==="mcp"?h:g;Ee.has(P)&&r(N,`duplicate ${J} declaration: ${P}`);let ae;if(te.startsWith("{")){let Se=hr(te,N,r);J==="mcp"?ae={...Se,name:P}:((typeof Se.content!="string"||Se.content.length===0)&&r(N,`\`skill ${P}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ae={name:P,content:Se.content})}else{let Se=L_(te);(typeof Se!="string"||Se.length===0)&&r(N,`\`${J} ${P}\`: string form must be a non-empty file path or http(s) URL`),ae=Se}Ee.set(P,ae);continue}if(J==="terminal"){let B=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(B[1],"lmctl/terminal",{name:B[2],kind:B[3]??"neutral"},N,!0);continue}if(J==="seq"){let P=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(P.length<3||P.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<P.length+1&&!(te+2>P.length-1);te+=2){let Ee=P[te],ae=P[te+1],Se=P[te+2],Ct=ae==="->"?"main":ae.slice(1,-2);c.push({srcDeclId:Ee,port:Ct,dstDeclId:Se,line:N})}continue}if(J==="choice"){let P=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],Ee,ae=v+1;for(;ae<s.length;ae+=1){let Se=s[ae].text,Ct=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(Ct!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${P}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Hn=Ct[2];te.push({when:Ct[1].trim(),next:`@terminal:${Hn}`}),c.push({srcDeclId:P,port:Hn,dstDeclId:Ct[3],line:s[ae].n});continue}let dl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(dl!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${P}\` has more than one \`default\``);let Hn=dl[1];Ee=`@terminal:${Hn}`,c.push({srcDeclId:P,port:Hn,dstDeclId:dl[2],line:s[ae].n});continue}break}te.length===0&&r(N,`\`choice ${P}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(P,"lmctl/choice",{branches:te,...Ee!==void 0?{default_next:Ee}:{}},N,!1),v=ae-1;continue}if(J==="loop"){let B=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(B[1],"lmctl/loop",hr(B[2],N,r),N,!1);continue}if(J==="foreach"){let B=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),P=hr(B[2],N,r);"mode"in P&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(B[1],"lmctl/foreach",P,N,!1);continue}if(J==="call"){let B=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),P=B[1],te=hr(B[2],N,r),Ee=te.workflow;(typeof Ee!="string"||Ee.length===0)&&r(N,`\`call ${P}\` requires a \`workflow=<name>\` argument`);let{workflow:ae,...Se}=te;_(P,"lmctl/subflow",{workflow_name:Ee,...Se},N,!1),d.push({declId:P,target:Ee,line:N});continue}if(J==="decide"){let B=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),P=B[1],te=hr(B[2],N,r),{branches:Ee,nextIdx:ae}=y(v);Ee.length===0&&r(N,`\`decide ${P}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(P,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:te});for(let Se of Ee)c.push({srcDeclId:P,port:Se.label,dstDeclId:Se.dst,line:N});v=ae;continue}if(J==="entry"){let B=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=B[1];continue}r(N,`unknown statement \`${J}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=v=>{if(Array.isArray(v)){for(let O of v)E(O);return}if(typeof v!="object"||v===null)return;let N=v;if(typeof N.alias=="string")for(let[O,J]of[["mcp",h],["skills",g]]){let B=N[O];Array.isArray(B)&&(N[O]=B.map(P=>typeof P=="string"&&J.has(P)?structuredClone(J.get(P)):P))}for(let O of Object.values(N))E(O)};for(let v of u){let N=l.get(v);N.members!==void 0&&E(N.members)}let k=v=>x_(i,v),A=u.map(v=>{let N=l.get(v);return{id:k(v),name:v,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),I={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let N=k(v.srcDeclId);I[N]??={},I[N][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),I[N][v.port]=[[{step_id:k(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let N=l.get(v);Dj.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let $=new Map;for(let v of c){let N=$.get(v.srcDeclId);N===void 0?$.set(v.srcDeclId,[v.dstDeclId]):N.push(v.dstDeclId)}for(let v of u){let N=l.get(v);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let J=$.get(v);J===void 0?$.set(v,[O]):J.push(O)}}let q=new Set([f]),U=[f];for(;U.length>0;){let v=U.shift();for(let N of $.get(v)??[])q.has(N)||(q.add(N),U.push(N))}for(let v of u)q.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let M=new Map;for(let v of c){let N=M.get(v.srcDeclId);N===void 0&&(N=new Set,M.set(v.srcDeclId,N)),N.add(v.port)}let j=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let N=l.get(v);if(N.isTerminal)continue;let O=M.get(v)??new Set;if(N.type==="lmctl/review"){let B=[...O].some(P=>!j.has(P));!O.has("approve")&&!B&&r(N.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let J=Pj[N.type];if(J!==void 0)for(let B of J)O.has(B)||r(N.line,`uncovered outcome: required outcome \`${B}\` of step \`${v}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${v} -${B}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${v}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let N=l.get(v),O=Lj[N.type];if(O===void 0)continue;let J={...N.params,...N.members??{},type:O.v2type,state_name:v,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},B=O.schema.safeParse(J);if(!B.success){let P=B.error.issues[0],te=P.path.length===0?"$":P.path.map(String).join(".");r(N.line,`step \`${v}\` (\`${N.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${P.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let Z={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:A,connections:I,entry_step_id:k(f)},X=xt.safeParse(Z);if(!X.success)throw new En(X.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return X.data}function Fj(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function hr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of Uj(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=L_(l)}return s}function Uj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function L_(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var Lj,Cj,A_,En,Dj,Pj,j_,R_,C_=b(()=>{"use strict";yn();$_();wn();Lj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:xi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:$i},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Ai},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:ji},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Ri}},Cj={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};A_={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},En=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1584
+ `),s=[];for(let v=0;v<n.length;v+=1){let O=Fj(n[v]).trim();O.length>0&&s.push({n:v+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(v,N,O,J,B,P)=>{l.has(v)&&r(J,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(J,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:N,params:O,line:J,isTerminal:B,...P?{members:P}:{}}),u.push(v)},y=v=>{let N=[],O=v+1;for(;O<s.length;O+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(J===null)break;N.push({label:J[1],dst:J[2]})}return{branches:N,nextIdx:O-1}};for(let v=1;v<s.length;v+=1){let{n:N,text:O}=s[v],J=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){v!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let B=/^meta\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),P=hr(B[1],N,r);for(let te of Object.keys(P))j_.has(te)||r(N,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...j_].join(", ")} (no grammar inflation; bounded)`);m=P;continue}if(J==="step"){let B=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),P=B[1],te=B[2],Ee=B[3],ae=A_[te];ae===void 0&&r(N,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(A_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Se,members:Ct}=Mj(ae,hr(Ee,N,r));_(P,ae,Se,N,!1,Object.keys(Ct).length>0?Ct:void 0);continue}if(J==="trigger"){let B=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),P=B[1],te=B[2],Ee=B[3],ae=R_[te];ae===void 0&&r(N,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(R_).join(", ")})`),p.has(P)&&r(N,`duplicate trigger id: ${P}`),p.set(P,{id:P,type:ae,parameters:hr(Ee,N,r)});continue}if(J==="mcp"||J==="skill"){let B=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(N,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${O}`),P=B[1],te=B[2].trim(),Ee=J==="mcp"?h:g;Ee.has(P)&&r(N,`duplicate ${J} declaration: ${P}`);let ae;if(te.startsWith("{")){let Se=hr(te,N,r);J==="mcp"?ae={...Se,name:P}:((typeof Se.content!="string"||Se.content.length===0)&&r(N,`\`skill ${P}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ae={name:P,content:Se.content})}else{let Se=L_(te);(typeof Se!="string"||Se.length===0)&&r(N,`\`${J} ${P}\`: string form must be a non-empty file path or http(s) URL`),ae=Se}Ee.set(P,ae);continue}if(J==="terminal"){let B=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(B[1],"lmctl/terminal",{name:B[2],kind:B[3]??"neutral"},N,!0);continue}if(J==="seq"){let P=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(P.length<3||P.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<P.length+1&&!(te+2>P.length-1);te+=2){let Ee=P[te],ae=P[te+1],Se=P[te+2],Ct=ae==="->"?"main":ae.slice(1,-2);c.push({srcDeclId:Ee,port:Ct,dstDeclId:Se,line:N})}continue}if(J==="choice"){let P=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],Ee,ae=v+1;for(;ae<s.length;ae+=1){let Se=s[ae].text,Ct=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(Ct!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${P}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Hn=Ct[2];te.push({when:Ct[1].trim(),next:`@terminal:${Hn}`}),c.push({srcDeclId:P,port:Hn,dstDeclId:Ct[3],line:s[ae].n});continue}let dl=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Se);if(dl!==null){Ee!==void 0&&r(s[ae].n,`\`choice ${P}\` has more than one \`default\``);let Hn=dl[1];Ee=`@terminal:${Hn}`,c.push({srcDeclId:P,port:Hn,dstDeclId:dl[2],line:s[ae].n});continue}break}te.length===0&&r(N,`\`choice ${P}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(P,"lmctl/choice",{branches:te,...Ee!==void 0?{default_next:Ee}:{}},N,!1),v=ae-1;continue}if(J==="loop"){let B=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(B[1],"lmctl/loop",hr(B[2],N,r),N,!1);continue}if(J==="foreach"){let B=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),P=hr(B[2],N,r);"mode"in P&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(B[1],"lmctl/foreach",P,N,!1);continue}if(J==="call"){let B=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),P=B[1],te=hr(B[2],N,r),Ee=te.workflow;(typeof Ee!="string"||Ee.length===0)&&r(N,`\`call ${P}\` requires a \`workflow=<name>\` argument`);let{workflow:ae,...Se}=te;_(P,"lmctl/subflow",{workflow_name:Ee,...Se},N,!1),d.push({declId:P,target:Ee,line:N});continue}if(J==="decide"){let B=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),P=B[1],te=hr(B[2],N,r),{branches:Ee,nextIdx:ae}=y(v);Ee.length===0&&r(N,`\`decide ${P}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(P,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:te});for(let Se of Ee)c.push({srcDeclId:P,port:Se.label,dstDeclId:Se.dst,line:N});v=ae;continue}if(J==="entry"){let B=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=B[1];continue}r(N,`unknown statement \`${J}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=v=>{if(Array.isArray(v)){for(let O of v)E(O);return}if(typeof v!="object"||v===null)return;let N=v;if(typeof N.alias=="string")for(let[O,J]of[["mcp",h],["skills",g]]){let B=N[O];Array.isArray(B)&&(N[O]=B.map(P=>typeof P=="string"&&J.has(P)?structuredClone(J.get(P)):P))}for(let O of Object.values(N))E(O)};for(let v of u){let N=l.get(v);N.members!==void 0&&E(N.members)}let k=v=>x_(i,v),A=u.map(v=>{let N=l.get(v);return{id:k(v),name:v,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),I={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let N=k(v.srcDeclId);I[N]??={},I[N][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),I[N][v.port]=[[{step_id:k(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let N=l.get(v);Dj.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let $=new Map;for(let v of c){let N=$.get(v.srcDeclId);N===void 0?$.set(v.srcDeclId,[v.dstDeclId]):N.push(v.dstDeclId)}for(let v of u){let N=l.get(v);if(N.type!=="lmctl/loop")continue;let O=N.params.body;if(typeof O=="string"&&l.has(O)){let J=$.get(v);J===void 0?$.set(v,[O]):J.push(O)}}let q=new Set([f]),U=[f];for(;U.length>0;){let v=U.shift();for(let N of $.get(v)??[])q.has(N)||(q.add(N),U.push(N))}for(let v of u)q.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let C=new Map;for(let v of c){let N=C.get(v.srcDeclId);N===void 0&&(N=new Set,C.set(v.srcDeclId,N)),N.add(v.port)}let j=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let N=l.get(v);if(N.isTerminal)continue;let O=C.get(v)??new Set;if(N.type==="lmctl/review"){let B=[...O].some(P=>!j.has(P));!O.has("approve")&&!B&&r(N.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let J=Pj[N.type];if(J!==void 0)for(let B of J)O.has(B)||r(N.line,`uncovered outcome: required outcome \`${B}\` of step \`${v}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${v} -${B}-> <target|terminal>\`)`);else O.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${v}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let N=l.get(v),O=Lj[N.type];if(O===void 0)continue;let J={...N.params,...N.members??{},type:O.v2type,state_name:v,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},B=O.schema.safeParse(J);if(!B.success){let P=B.error.issues[0],te=P.path.length===0?"$":P.path.map(String).join(".");r(N.line,`step \`${v}\` (\`${N.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${P.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let Z={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:A,connections:I,entry_step_id:k(f)},X=xt.safeParse(Z);if(!X.success)throw new En(X.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return X.data}function Fj(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function hr(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of Uj(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=L_(l)}return s}function Uj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function L_(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var Lj,Cj,A_,En,Dj,Pj,j_,R_,C_=b(()=>{"use strict";yn();$_();wn();Lj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:xi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:$i},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:Ai},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:ji},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:Ri}},Cj={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};A_={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},En=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1585
1585
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1586
1586
  `)}`),this.issues=e,this.name="DslCompileError"}},Dj=new Set(["lmctl/assert-repo-clean","lmctl/review","lmctl/consolidate","lmctl/interactive","lmctl/loop","lmctl/render-docx","lmctl/render-xlsx","lmctl/shell-step","lmctl/choice","lmctl/foreach","lmctl/subflow","lmctl/terminal","lmctl/trigger-schedule","lmctl/trigger-gh-issue"]),Pj={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},j_=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),R_={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as Wj}from"node:fs";function Bj(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function Hj(t){for(let e of t.split(`
1587
1587
  `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Ce(t){if(typeof t=="string"&&Bj()&&Hj(t)){let r;try{r=O_(t)}catch(s){throw s instanceof En?new Yt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=xt.safeParse(r);if(!n.success)throw new Yt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=Ci(Jj(t));if(Xj(e)&&e.definition_schema_version===3){let r=xt.safeParse(e);if(!r.success)throw new Yt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return qj(e)}function qj(t){let e=Oi.safeParse(t);if(!e.success)throw new Yt(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new Yt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return v_(r)}catch(s){throw s instanceof Vt?new hu(s):s}}function Jj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
@@ -1666,7 +1666,7 @@ ${s}`;RR(t,i,"utf8")}function CR(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1666
1666
  JOIN step s ON s.id = sa.step_id
1667
1667
  WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let j of a){let Z=l.get(j.step_id)??[];Z.push({kind:j.kind,id:j.id}),l.set(j.step_id,Z)}let c=i.map(j=>({id:j.id,state_name:j.state_name,outcome:j.outcome,duration_ms:j.started_at!==null&&j.ended_at!==null?Math.max(0,new Date(j.ended_at).getTime()-new Date(j.started_at).getTime()):null,artifacts:l.get(j.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let j of d)try{let Z=JSON.parse(j.payload);typeof Z.elapsedMs=="number"&&Z.elapsedMs>0&&(f+=Z.elapsedMs)}catch{}let m=u.map(j=>({kind:j.kind,count:j.count,total_elapsed_ms:j.kind==="tool_result"?f:0})),p=c.filter(j=>j.outcome==="request_changes"),h=[...new Set(p.map(j=>j.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),E=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,k=E!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1668
1668
  WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,E,g,_):[],I=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1669
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],$=I?.input!==null&&I?.input!==void 0?`input: ${I.input}, output: ${I.output??0}`:"n/a",q=e.getWorkflow(n.workflow_id),U=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,M={run_id:t,workflow_name:q?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:U,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:k,token_totals:$};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(M)})}var ug=b(()=>{"use strict"});import{spawnSync as fg}from"node:child_process";function ju(t){return FR[t]??`no install hint; ensure '${t}' is on PATH`}function UR(t){switch(t){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function dg(t){return fg("which",[t],{encoding:"utf8"}).status===0}function mg(t){if(t===void 0)return null;for(let e of t.tools??[])if(!dg(e)){let r=ju(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!dg(e)){let s=ju(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=UR(e);if(r===null)continue;let n=fg(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:ju(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var FR,pg=b(()=>{"use strict";FR={gh:"install: https://cli.github.com/",git:"install: apt-get install git OR brew install git",node:"install: https://nodejs.org/",claude:"install: https://docs.anthropic.com/en/docs/claude-code/quickstart",codex:"install: https://github.com/openai/codex",gemini:"install: https://github.com/google-gemini/gemini-cli",opencode:"install: https://opencode.ai/",qwen:"install: https://github.com/QwenLM/qwen-code"}});import{existsSync as WR,readdirSync as BR,readFileSync as HR}from"node:fs";import{join as hg}from"node:path";function qR(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1669
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],$=I?.input!==null&&I?.input!==void 0?`input: ${I.input}, output: ${I.output??0}`:"n/a",q=e.getWorkflow(n.workflow_id),U=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,C={run_id:t,workflow_name:q?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:U,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:k,token_totals:$};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(C)})}var ug=b(()=>{"use strict"});import{spawnSync as fg}from"node:child_process";function ju(t){return FR[t]??`no install hint; ensure '${t}' is on PATH`}function UR(t){switch(t){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function dg(t){return fg("which",[t],{encoding:"utf8"}).status===0}function mg(t){if(t===void 0)return null;for(let e of t.tools??[])if(!dg(e)){let r=ju(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!dg(e)){let s=ju(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=UR(e);if(r===null)continue;let n=fg(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:ju(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var FR,pg=b(()=>{"use strict";FR={gh:"install: https://cli.github.com/",git:"install: apt-get install git OR brew install git",node:"install: https://nodejs.org/",claude:"install: https://docs.anthropic.com/en/docs/claude-code/quickstart",codex:"install: https://github.com/openai/codex",gemini:"install: https://github.com/google-gemini/gemini-cli",opencode:"install: https://opencode.ai/",qwen:"install: https://github.com/QwenLM/qwen-code"}});import{existsSync as WR,readdirSync as BR,readFileSync as HR}from"node:fs";import{join as hg}from"node:path";function qR(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1670
1670
  `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function _g(t,e){let r=t.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function gg(t,e){if(e.length===0)return null;let r=hg(t,"durable-memory");if(!WR(r))return null;let n;try{n=BR(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=HR(hg(r,o),"utf8");if(qR(i).some(l=>e.includes(l))){let l=_g(i,"name")??o.replace(".md",""),c=_g(i,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var wg=b(()=>{"use strict"});function Lu(t){let e=t.trim().replace(JR,"").trim();for(let r=0;r<4;r+=1){let n=XR.exec(e);if(n===null)break;e=n[2].trim()}return e}function yg(t){let e=t.trim(),r=GR.exec(e);if(r!==null)return r[2];let n=KR.exec(e);return n!==null?n[0]:null}function Is(t,e){let r=t.split(`
1671
1671
  `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=Lu(r[i]),l=Ru.exec(a);if(l===null)continue;let c=l[1].trim();if(Ou.test(c))continue;let u=yg(c);u!==null&&(n=u,s=i)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let o={};for(let i=s-1;i>=0;i-=1){let a=Lu(r[i]),l=Ru.exec(a);if(l===null)break;let c=Ou.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function Eg(t){let e=t.split(`
1672
1672
  `),r=null;for(let n=0;n<e.length;n+=1){let s=Lu(e[n]),o=Ru.exec(s);if(o===null)continue;let i=o[1].trim();if(Ou.test(i))continue;let a=yg(i);if(a===null||!Yr(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var JR,XR,Ru,Ou,GR,KR,Cu=b(()=>{"use strict";es();JR=/^#{1,6}\s+/,XR=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Ru=/^STANCE:\s+(.+)$/,Ou=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,GR=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,KR=/^[A-Za-z0-9_-]+/});function bg(t,e,r){return n=>{let s=r(),o=Date.now(),i=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var Tg=b(()=>{"use strict"});import{readFileSync as VR}from"node:fs";import{dirname as YR,join as zR}from"node:path";import{fileURLToPath as ZR}from"node:url";function tO(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function oO(t){let e=[],r=[];for(let n of t)QR.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function iO(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&eO.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function aO(t,e){if(t.length===0)return{matched:!1};let r=oO(t);for(let n of r){let s=iO(n,e);if(s.matched)return s}return{matched:!1}}function Mu(t){return aO(t,sO)}function lO(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function Du(t){return lO(t).split(" ").filter(e=>e.length>0)}var QR,eO,rO,nO,sO,Sg=b(()=>{"use strict";QR=new Set(["&&","||",";","|",">",">>","<","<<"]),eO=/^[A-Za-z_][A-Za-z0-9_]*=/;rO=YR(ZR(import.meta.url)),nO=JSON.parse(VR(zR(rO,"side_effect_classifier.json"),"utf-8")),sO=tO(nO)});function Xi(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function kg(t,e){try{return await Ur(Pu(t)??t,Xi(e))===!0}catch{return!1}}async function Gi(t,e){try{return await Ur(Pu(t)??t,Xi(e))}catch{return}}async function vg(t,e){if(typeof t!="string")return t;let r=Pu(t);if(r===null)return t;try{return await Ur(r,Xi(e))}catch{return}}async function Ig(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=cO(await Ur(a,Xi(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function Pu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function cO(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var Ns=b(()=>{"use strict";gn()});import{existsSync as Ng,readdirSync as xg,readFileSync as uO,statSync as $g}from"node:fs";import{join as Vi}from"node:path";function Ag(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function G(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function V(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function nt(t,e,r,n,s={}){let o=F(),i=G(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${xs}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Yr(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:go,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:dO(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function dO(t){return t.length>8e3?`${t.slice(0,8e3)}
@@ -1843,7 +1843,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1843
1843
  `);if(e[0]!=="---")throw new At("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 At(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!jP.has(c))throw new At(`unknown frontmatter key "${c}" \u2014 allowed keys: ${$a.join(", ")}`);r[c]=u}if(n===-1)throw new At("frontmatter not closed (missing trailing `---` on its own line)");for(let i of $a)if(r[i]===void 0)throw new At(`missing required frontmatter key "${i}" \u2014 required: ${$a.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 $a,jP,At,HE=b(()=>{"use strict";$a=["title","description","members"],jP=new Set($a),At=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as RP,writeFileSync as zz,renameSync as Zz,existsSync as JE}from"node:fs";import{basename as OP,resolve as On,dirname as Dd}from"node:path";function CP(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 MP(t){return/^\s*_MEMBER_\s+\S/.test(t)}function DP(t){return/^\s*_SESSION_\s+\S/.test(t)}function PP(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Aa(t){let e=OP(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function De(t){let e=RP(t,"utf-8"),r=Dd(On(t)),n=Fd(e,Aa(t),{baseDir:r,sourcePath:On(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=On(r,s.sessiondir));return n}function Fd(t,e,r={}){let n=[],s=[],o=[];r.sourcePath,r.baseDir;let i=t;if(i.startsWith("#teamfile:")){let c=i.indexOf(`
1844
1844
  `);i=c>=0?i.slice(c+1):""}let a=null;if(i.startsWith("---"))try{a=BE(i)}catch(c){if(c instanceof At)o.push(`frontmatter: ${c.message}`);else throw c}let l=t.split(`
1845
1845
  `);for(let c=0;c<l.length;c++){let u=l[c],d=c+1;if(DP(u))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${u.trim()})`);if(PP(u)){let h=u.replace(/^\s*_SKILL_\s*/,"").trim(),g=h.length===0?[]:h.split(/\s+/u);if(g.length!==1){o.push(`line ${d}: _SKILL_ requires exactly one https:// URL or local path: ${u.trim()}`);continue}let _=g[0];try{if(new URL(_).protocol!=="https:"){o.push(`line ${d}: _SKILL_ URL must use https:// or a local path: ${_}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(_)&&!/^[A-Za-z]:[\\/]/u.test(_)){o.push(`line ${d}: _SKILL_ URL must use https:// or a local path: ${_}`);continue}}s.push(_);continue}if(!MP(u))continue;let f=CP(u);for(let h of Object.keys(f))if(!qE.includes(h))throw new Error(`line ${d}: unknown key "${h}" on _MEMBER_ line: ${u.trim()}
1846
- allowed keys: ${qE.join(", ")}`);if(!f.provider&&!f.teamfile){o.push(`line ${d}: member line missing provider (or teamfile): ${u.trim()}`);continue}let p={alias:f.alias||`member${n.length+1}`,provider:f.provider||"",extra:{}};f.sessionid&&(p.session=f.sessionid),Object.prototype.hasOwnProperty.call(f,"sessiondir")&&(p.sessiondir=f.sessiondir),f.teamfile&&(p.teamfile=f.teamfile),f.model&&(p.model=f.model),f.effort&&(p.effort=f.effort),n.push(p)}return{name:e,members:n,skillUrls:s,rawText:t,parseErrors:o,frontmatter:a}}function Ud(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===Pd.toLowerCase());n.length>1&&r.push({field:Pd,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?On(e,o.teamfile):On(o.teamfile);if(!JE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=De(a),c=jt(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 LP.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 jt(t){return t.members.find(e=>e.alias.toLowerCase()===Pd.toLowerCase())}function Wd(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=On(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),!JE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=De(o),l=jt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return Wd(l,Dd(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||Dd(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Er(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Pd,LP,qE,Rt=b(()=>{"use strict";HE();Pd="Lead",LP=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);qE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});function ja(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}var Bd=b(()=>{"use strict"});function Ln(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},o=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),i=t.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(i.acquired){let l=o===null?null:e.force===!0?"force":o.holder_pid===null&&o.started_at<n?"stale":null;return{acquired:!0,lease:i.current??s,previous:o,reclaimReason:l}}if(!FP(i.current,n))return{acquired:!1,current:i.current};let a=t.tryAcquireAgentInflight(s,i.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:i.current.sender_teamfile,sender_alias:i.current.sender_alias,started_at:i.current.started_at,holder_pid:i.current.holder_pid}});return a.acquired?{acquired:!0,lease:a.current??s,previous:i.current,reclaimReason:i.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:a.current}}function FP(t,e){return t.holder_pid===null?t.started_at<e:!ja(t.holder_pid)}var Ra=b(()=>{"use strict";Bd()});import{existsSync as UP,realpathSync as WP}from"node:fs";import{dirname as BP}from"node:path";function Hd(t){HP(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function HP(t){let e=t.payload.root_teamfile;try{e=WP(t.payload.root_teamfile)}catch(s){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Cn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,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}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return await Cn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=qP(e);if("error"in r)return await Cn(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=Ln(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:GP(t.env??process.env)});if(!n.acquired){let s=XP(r.alias,n.current);return await Cn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let o=await(t.chat??Jt)({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}:{}}),i=o.status==="stalled",a=!i&&o.text.trim()==="",l=i?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=i||a?"error":"ok";return await Cn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:c==="error"?null:o.text,status:c,error_detail:l,log:t.log}),{status:c,response:c==="error"?null:o.text,error_detail:l}}catch(s){let o=s instanceof Error?s.message:String(s);return await Cn(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 provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function qP(t){if(!UP(t))return{error:`prompt root missing/unreadable: ${t}`};let e=De(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=jt(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??BP(t)}}async function Cn(t,e){let r=KE(e.message),n=e.response===null?null:KE(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 KE(t){return t.length<=XE?{text:t,truncated:!1}:{text:t.slice(0,XE),truncated:!0}}function JP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function XP(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:JP(t,e)}function GP(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return GE;let r=Number(e);return!Number.isFinite(r)||r<=0?GE:r}var XE,GE,VE=b(()=>{"use strict";vt();Rt();Ra();XE=256*1024,GE=30*60*1e3});import{chmodSync as tb,existsSync as KP,mkdirSync as rb,readFileSync as Ma,writeFileSync as nb}from"node:fs";import{dirname as qd,resolve as Oa,join as sb}from"node:path";import{fileURLToPath as VP}from"node:url";import{homedir as ob}from"node:os";import{CognitoIdentityClient as YP,GetIdCommand as zP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as YE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as ZP,ListObjectsV2Command as QP,PutObjectCommand as e1,S3Client as zE}from"@aws-sdk/client-s3";function Bs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:o1(t.selfUrl),n={},s;for(let A of r)if(KP(A)){n=s1(A),s=A;break}let o=(...A)=>{for(let I of A)if(typeof I=="string"&&I!=="")return I},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??t1,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??r1,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??n1,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)??Da,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=Ca(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Ca(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Ca(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=Ca(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function s1(t){try{let e=Ma(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 o1(t){let e=qd(VP(t??import.meta.url));return[Oa(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Oa(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Oa(e,"..","..","..","infra","terraform","terraform.tfstate"),Oa(e,"..","..","infra","terraform","terraform.tfstate")]}function Ca(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function i1(t){let e=a1(t.intervalMs)??ib,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 a1(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function ab(t){let e=t.tokenPath??sb(ob(),".lmctl","cli-tokens.json"),r=QE(t.tokenPath);if(AE(r.cognito?.idToken)&&Ld()!==null)try{await WE({region:t.region,clientId:t.cognitoClientId??Da,cliTokensPath:e}),r=QE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(j){let Z=j instanceof Error?j.message:String(j);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Z}`)}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 eb({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=YE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new zE({region:t.region,credentials:a}),c={ListObjectsV2Command:QP,GetObjectCommand:ZP,PutObjectCommand:e1},u=Fs(n),d=u??o,f=t.deviceId,m=xn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let j=p.loadMailboxCursor(d,m);if(j!==null)h=j.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let Z=!1,X=0;for(;!Z&&X<2;){X+=1;try{let v=aa(m,"web"),N=0,O;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let B of J.Contents??[]){let P=la(B.Key??"",m,"web");P!==void 0&&P>N&&(N=P)}O=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),Z=!0}catch(v){let N=v instanceof Error?v.message:String(v);if(i&&X===1&&u1(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),c1(e),i=!1,o=await eb({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=YE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new zE({region:t.region,credentials:a}),m=xn({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,y=t.persistentSessionManager,E=t.promptTriggerStore,k=new Ia,A=new qr({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:j=>k.record(j),onMessage:async j=>{if(_!==void 0&&Id(j.payload)){_.onInbound(j.payload);return}if(y!==void 0&&Nd(j.payload)){await y.onInbound(j.payload);return}if(!$d(j.payload)){if(E!==void 0&&Ad(j.payload)){Hd({store:E,payload:j.payload,log:t.log});return}g!==null&&await g.handleIncoming(j.payload,j)}},...p!==void 0?{onCursorAdvance:j=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:j,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 Ps({client:A,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async j=>A.putMessage({conversation_id:`terminal:${j.session_id}`,payload:j})),y!==void 0&&y.setPublish(async j=>A.putMessage({conversation_id:`provider:${j.session_id}`,payload:j}));let I=j=>A.putMessage({conversation_id:xd,payload:j});A.start();let $=t.chatLogTailStore===void 0?void 0:i1({store:t.chatLogTailStore,publishDaemonEvent:I,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??ib,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let q=t.deviceId??o,U=`${d}/usage/`,M;return M=t.usageStore===void 0?void 0:bE({meter:k,store:t.usageStore,userId:d,deviceId:q,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:j,costUsd:Z,ceilingUsd:X})=>{t.log?.(`[usage] month ${j} cost $${Z.toFixed(4)} >= ceiling $${X} \u2014 blocking mailbox`),A.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async(j,Z)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${U}${q}-${j}.json`,Body:JSON.stringify({...Z,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async j=>{let Z={put:0,get:0,list:0},X;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:U,MaxKeys:1e3,...X!==void 0?{ContinuationToken:X}:{}}));for(let N of v.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${j}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(J.Body===void 0)continue;let B=JSON.parse(await J.Body.transformToString("utf-8"));Z.put+=B.put??0,Z.get+=B.get??0,Z.list+=B.list??0}catch{}}X=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(X!==void 0);return Z},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:A,fetchClient:g,publishDaemonEvent:I,async stop(){$?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await A.stop().catch(()=>{})}}}async function lb(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:va(t.rootDir),r=xn({identityId:Ws,userId:Ws,deviceId:ZE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new qr({bucket:"local",identityId:Ws,userId:Ws,deviceId:ZE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Id(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Nd(c.payload)){await o.onInbound(c.payload);return}if(!$d(c.payload)){if(i!==void 0&&Ad(c.payload)){Hd({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??La,readIntervalMs:t.readIntervalMs??La,heartbeatIdleMs:t.heartbeatIdleMs??La,backoffReadIntervalMs:t.backoffReadIntervalMs??La});n=new Ps({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:xd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Ws,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function QE(t){let e=t??sb(ob(),".lmctl","cli-tokens.json");try{let r=Ma(e,"utf8");return JSON.parse(r)}catch{return{}}}function l1(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ma(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};rb(qd(t),{recursive:!0,mode:448}),nb(t,JSON.stringify(n,null,2));try{tb(t,384)}catch{}}function c1(t){let e={};try{let n=Ma(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,rb(qd(t),{recursive:!0,mode:448}),nb(t,JSON.stringify(r,null,2));try{tb(t,384)}catch{}}async function eb(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new YP({region:t.region}).send(new zP({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{l1(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 u1(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 ib,La,Da,t1,r1,n1,Ws,ZE,Jd=b(()=>{"use strict";fa();bd();kd();TE();kE();vE();IE();NE();jd();ca();Rd();Md();VE();ib=3e3,La=1e3,Da="79u5jhkk46qofog661c9i0bdcs",t1="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",r1="us-east-1_4iUdFggDn",n1="lmctl-next-preview-mailbox-254332045686";Ws="local",ZE="local"});import{spawn as Vd}from"node:child_process";import{createInterface as cb}from"node:readline";var Xd,Gd,Kd,ub,db=b(()=>{"use strict";No();xe();Xd=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=Vd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=cb({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+`
1846
+ allowed keys: ${qE.join(", ")}`);if(!f.provider&&!f.teamfile){o.push(`line ${d}: member line missing provider (or teamfile): ${u.trim()}`);continue}let p={alias:f.alias||`member${n.length+1}`,provider:f.provider||"",extra:{}};f.sessionid&&(p.session=f.sessionid),Object.prototype.hasOwnProperty.call(f,"sessiondir")&&(p.sessiondir=f.sessiondir),f.teamfile&&(p.teamfile=f.teamfile),f.model&&(p.model=f.model),f.effort&&(p.effort=f.effort),n.push(p)}return{name:e,members:n,skillUrls:s,rawText:t,parseErrors:o,frontmatter:a}}function Ud(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===Pd.toLowerCase());n.length>1&&r.push({field:Pd,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?On(e,o.teamfile):On(o.teamfile);if(!JE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=De(a),c=jt(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 LP.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 jt(t){return t.members.find(e=>e.alias.toLowerCase()===Pd.toLowerCase())}function Wd(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=On(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),!JE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=De(o),l=jt(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return Wd(l,Dd(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||Dd(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Er(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var Pd,LP,qE,Rt=b(()=>{"use strict";HE();Pd="Lead",LP=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);qE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});function ja(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}var Bd=b(()=>{"use strict"});function Ln(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},o=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),i=t.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(i.acquired){let l=o===null?null:e.force===!0?"force":o.holder_pid===null&&o.started_at<n?"stale":null;return{acquired:!0,lease:i.current??s,previous:o,reclaimReason:l}}if(!FP(i.current,n))return{acquired:!1,current:i.current};let a=t.tryAcquireAgentInflight(s,i.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:i.current.sender_teamfile,sender_alias:i.current.sender_alias,started_at:i.current.started_at,holder_pid:i.current.holder_pid}});return a.acquired?{acquired:!0,lease:a.current??s,previous:i.current,reclaimReason:i.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:a.current}}function FP(t,e){return t.holder_pid===null?t.started_at<e:!ja(t.holder_pid)}var Ra=b(()=>{"use strict";Bd()});import{existsSync as UP,realpathSync as WP}from"node:fs";import{dirname as BP}from"node:path";function Hd(t){HP(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function HP(t){let e=t.payload.root_teamfile;try{e=WP(t.payload.root_teamfile)}catch(s){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Cn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,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}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return await Cn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=qP(e);if("error"in r)return await Cn(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=Ln(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:GP(t.env??process.env)});if(!n.acquired){let s=XP(r.alias,n.current);return await Cn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let o=await(t.chat??Jt)({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}:{}}),i=o.status==="stalled",a=!i&&o.text.trim()==="",l=i?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=i||a?"error":"ok";return await Cn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:c==="error"?null:o.text,status:c,error_detail:l,log:t.log}),{status:c,response:c==="error"?null:o.text,error_detail:l}}catch(s){let o=s instanceof Error?s.message:String(s);return await Cn(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 provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function qP(t){if(!UP(t))return{error:`prompt root missing/unreadable: ${t}`};let e=De(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=jt(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??BP(t)}}async function Cn(t,e){let r=KE(e.message),n=e.response===null?null:KE(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 KE(t){return t.length<=XE?{text:t,truncated:!1}:{text:t.slice(0,XE),truncated:!0}}function JP(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function XP(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:JP(t,e)}function GP(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return GE;let r=Number(e);return!Number.isFinite(r)||r<=0?GE:r}var XE,GE,VE=b(()=>{"use strict";vt();Rt();Ra();XE=256*1024,GE=30*60*1e3});import{chmodSync as tb,existsSync as KP,mkdirSync as rb,readFileSync as Ma,writeFileSync as nb}from"node:fs";import{dirname as qd,resolve as Oa,join as sb}from"node:path";import{fileURLToPath as VP}from"node:url";import{homedir as ob}from"node:os";import{CognitoIdentityClient as YP,GetIdCommand as zP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as YE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as ZP,ListObjectsV2Command as QP,PutObjectCommand as e1,S3Client as zE}from"@aws-sdk/client-s3";function Bs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:o1(t.selfUrl),n={},s;for(let A of r)if(KP(A)){n=s1(A),s=A;break}let o=(...A)=>{for(let I of A)if(typeof I=="string"&&I!=="")return I},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??t1,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??r1,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??n1,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)??Da,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=Ca(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Ca(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Ca(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=Ca(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function s1(t){try{let e=Ma(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 o1(t){let e=qd(VP(t??import.meta.url));return[Oa(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Oa(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Oa(e,"..","..","..","infra","terraform","terraform.tfstate"),Oa(e,"..","..","infra","terraform","terraform.tfstate")]}function Ca(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function i1(t){let e=a1(t.intervalMs)??ib,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 a1(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function ab(t){let e=t.tokenPath??sb(ob(),".lmctl","cli-tokens.json"),r=QE(t.tokenPath);if(AE(r.cognito?.idToken)&&Ld()!==null)try{await WE({region:t.region,clientId:t.cognitoClientId??Da,cliTokensPath:e}),r=QE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(j){let Z=j instanceof Error?j.message:String(j);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Z}`)}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 eb({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=YE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new zE({region:t.region,credentials:a}),c={ListObjectsV2Command:QP,GetObjectCommand:ZP,PutObjectCommand:e1},u=Fs(n),d=u??o,f=t.deviceId,m=xn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let j=p.loadMailboxCursor(d,m);if(j!==null)h=j.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let Z=!1,X=0;for(;!Z&&X<2;){X+=1;try{let v=aa(m,"web"),N=0,O;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let B of J.Contents??[]){let P=la(B.Key??"",m,"web");P!==void 0&&P>N&&(N=P)}O=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),Z=!0}catch(v){let N=v instanceof Error?v.message:String(v);if(i&&X===1&&u1(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),c1(e),i=!1,o=await eb({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=YE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new zE({region:t.region,credentials:a}),m=xn({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,y=t.persistentSessionManager,E=t.promptTriggerStore,k=new Ia,A=new qr({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:j=>k.record(j),onMessage:async j=>{if(_!==void 0&&Id(j.payload)){_.onInbound(j.payload);return}if(y!==void 0&&Nd(j.payload)){await y.onInbound(j.payload);return}if(!$d(j.payload)){if(E!==void 0&&Ad(j.payload)){Hd({store:E,payload:j.payload,log:t.log});return}g!==null&&await g.handleIncoming(j.payload,j)}},...p!==void 0?{onCursorAdvance:j=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:j,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 Ps({client:A,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async j=>A.putMessage({conversation_id:`terminal:${j.session_id}`,payload:j})),y!==void 0&&y.setPublish(async j=>A.putMessage({conversation_id:`provider:${j.session_id}`,payload:j}));let I=j=>A.putMessage({conversation_id:xd,payload:j});A.start();let $=t.chatLogTailStore===void 0?void 0:i1({store:t.chatLogTailStore,publishDaemonEvent:I,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??ib,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let q=t.deviceId??o,U=`${d}/usage/`,C;return C=t.usageStore===void 0?void 0:bE({meter:k,store:t.usageStore,userId:d,deviceId:q,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:j,costUsd:Z,ceilingUsd:X})=>{t.log?.(`[usage] month ${j} cost $${Z.toFixed(4)} >= ceiling $${X} \u2014 blocking mailbox`),A.stop().catch(()=>{}),C?.stop()},publishOwnRollup:async(j,Z)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${U}${q}-${j}.json`,Body:JSON.stringify({...Z,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async j=>{let Z={put:0,get:0,list:0},X;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:U,MaxKeys:1e3,...X!==void 0?{ContinuationToken:X}:{}}));for(let N of v.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${j}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(J.Body===void 0)continue;let B=JSON.parse(await J.Body.transformToString("utf-8"));Z.put+=B.put??0,Z.get+=B.get??0,Z.list+=B.list??0}catch{}}X=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(X!==void 0);return Z},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:A,fetchClient:g,publishDaemonEvent:I,async stop(){$?.stop(),C!==void 0&&(await C.flushNow().catch(()=>{}),C.stop()),await g.stop().catch(()=>{}),await A.stop().catch(()=>{})}}}async function lb(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:va(t.rootDir),r=xn({identityId:Ws,userId:Ws,deviceId:ZE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new qr({bucket:"local",identityId:Ws,userId:Ws,deviceId:ZE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Id(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Nd(c.payload)){await o.onInbound(c.payload);return}if(!$d(c.payload)){if(i!==void 0&&Ad(c.payload)){Hd({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??La,readIntervalMs:t.readIntervalMs??La,heartbeatIdleMs:t.heartbeatIdleMs??La,backoffReadIntervalMs:t.backoffReadIntervalMs??La});n=new Ps({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:xd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Ws,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function QE(t){let e=t??sb(ob(),".lmctl","cli-tokens.json");try{let r=Ma(e,"utf8");return JSON.parse(r)}catch{return{}}}function l1(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ma(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};rb(qd(t),{recursive:!0,mode:448}),nb(t,JSON.stringify(n,null,2));try{tb(t,384)}catch{}}function c1(t){let e={};try{let n=Ma(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,rb(qd(t),{recursive:!0,mode:448}),nb(t,JSON.stringify(r,null,2));try{tb(t,384)}catch{}}async function eb(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new YP({region:t.region}).send(new zP({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{l1(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 u1(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 ib,La,Da,t1,r1,n1,Ws,ZE,Jd=b(()=>{"use strict";fa();bd();kd();TE();kE();vE();IE();NE();jd();ca();Rd();Md();VE();ib=3e3,La=1e3,Da="79u5jhkk46qofog661c9i0bdcs",t1="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",r1="us-east-1_4iUdFggDn",n1="lmctl-next-preview-mailbox-254332045686";Ws="local",ZE="local"});import{spawn as Vd}from"node:child_process";import{createInterface as cb}from"node:readline";var Xd,Gd,Kd,ub,db=b(()=>{"use strict";No();xe();Xd=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=Vd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=cb({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+`
1847
1847
  `)}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+`
1848
1848
  `)}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}}}},Gd=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Vd(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(`
1849
1849
  `);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+`
@@ -1954,21 +1954,21 @@ ${nf}`);let o=jF(x(n,"--max-iterations"));if(typeof o=="string")return w(e,o);le
1954
1954
  `):r.kind==="tool_result"?t.stderr.write(`[${e.alias}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
1955
1955
  `):r.kind==="api_retry"&&t.stderr.write(`[${e.alias}] api_retry${r.summary?`: ${r.summary}`:""}
1956
1956
  `)}var xF,nf,lT=b(()=>{"use strict";qa();Ot();ye();xF="Continue autopiloting. If nothing further can be done, end your reply with a final line exactly: ALL DONE. If you hit a challenge or blocker that needs the operator, end your reply with a final line exactly: OPERATOR ESCALATION.",nf=["usage: lmctl loop <teamfile>:<alias> [--max-iterations N] [--prompt TEXT] [--from <teamfile>:<alias>] [--root <teamfile>]"," lmctl loop <teamfile> <alias> [--max-iterations N] [--prompt TEXT] [--from <teamfile>:<alias>] [--root <teamfile>]","","Drive one AI-team member with a repeated autopilot prompt until it ends","with ALL DONE or OPERATOR ESCALATION."].join(`
1957
- `)});function Ja(t,e){let r=wt(t);if(r===null)throw new Error(`--from must be <teamfile.lmctl>:<alias>, got '${t}'`);let n=ue(r.teamfile,e),s=qe(n,e);if(s.parseErrors.length>0)throw new Error(`--from ${r.teamfile}: ${s.parseErrors.join("; ")}`);let o=Er(s,r.alias);if(o===void 0)throw new Error(`--from alias "${r.alias}" not found in ${r.teamfile}`);return`${n}:${o.alias}`}function Xa(t,e){let r=t[rs];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let o of e.listRootTeams()){let i=qe(o.teamfile_path,e);for(let a of i.members)a.teamfile===void 0&&a.session===r&&n.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; pass --from explicitly");return{ok:!0,identity:s[0]}}var sf=b(()=>{"use strict";lt();Rt();Ot();gt()});var wT={};ne(wT,{runWait:()=>WF});import{hostname as LF}from"node:os";async function WF(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(CF),0;let n=D(t,["--from","--id","--interval","--timeout"],["--json","--all"]);if(n.error!==void 0)return Fn(e,n.error);if(n.positionals.length>1)return Fn(e,`unexpected positional: ${n.positionals[1]}`);let s=fT(x(n,"--interval"),"--interval",MF);if(typeof s=="string")return Fn(e,s);let o=fT(x(n,"--timeout"),"--timeout",DF);if(typeof o=="string")return Fn(e,o);if([C(n,"--all"),x(n,"--from")!==void 0,x(n,"--id")!==void 0,n.positionals.length===1].filter(Boolean).length>1)return Fn(e,"--id, --all, --from, and teamfile positional are mutually exclusive");let a;try{a=await BF(e,{all:C(n,"--all"),from:x(n,"--from"),ids:x(n,"--id"),teamfile:n.positionals[0]})}catch(E){return Fn(e,E instanceof Error?E.message:String(E))}let l=C(n,"--json"),c=r.sleep??(E=>new Promise(k=>setTimeout(k,E))),u=r.now??(()=>Date.now()),d=r.appearanceGraceMs??mT("LMCTL_WAIT_APPEARANCE_GRACE_MS",PF),f=r.reclaimStaleMs??mT("LMCTL_WAIT_RECLAIM_STALE_MS",FF),m=u(),p=m+o,h=a.kind!=="ids",g=m+(h?d:0),_=new Set;if(a.kind==="ids")for(let E of a.ids)_.add(E);let y=await L(e,E=>XF(E,a));for(;;){let E=await L(e,k=>qF(k,{scope:a,snapshotIds:_,nowMs:u(),initialMaxId:y,reclaimStaleMs:f}));if(E.finished!==null)return Ga(e,{status:"completed",finished:[ZF(E.finished)],in_flight:uT(E.running)},l),0;if(_.size>0){if(u()>=p)return Ga(e,{status:"timeout",finished:[],in_flight:uT(E.running)},l),1;await c(pT(u(),s,p));continue}if(u()>=p)return Ga(e,{status:"timeout",finished:[],in_flight:[]},l),1;if(!h||u()>=g)return Ga(e,{status:"idle",finished:[],in_flight:[]},l),0;await c(pT(u(),s,g,p))}}function Fn(t,e){return t.stderr.write(`error: ${e}
1958
- `),2}async function BF(t,e){if(e.ids!==void 0){let n=HF(e.ids);if(typeof n=="string")throw new Error(n);return await L(t,s=>{for(let o of n)if(s.getTrackedInvocation(o)===null)throw new Error(`unknown tracked invocation id: ${o}`)}),{kind:"ids",ids:n}}if(e.all)return{kind:"all"};if(e.from!==void 0)return await L(t,n=>({kind:"from",from:Ja(e.from,n)}));if(e.teamfile!==void 0)return await L(t,n=>({kind:"team",teamfile:ue(e.teamfile,n)}));let r=t.env??process.env;return await L(t,n=>{let s=Xa(r,n);if(s.ok)return{kind:"from",from:s.identity};throw s.reason==="unset"?new Error("lmctl wait could not infer caller: LMCTL_SELF_SESSIONID is not set; pass --from, --all, or a teamfile"):new Error("lmctl wait could not infer caller from LMCTL_SELF_SESSIONID; pass --from, --all, or a teamfile")})}function HF(t){let e=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(e.length===0)return"--id requires at least one id";let r=[];for(let n of e){let s=Number(n);if(!Number.isInteger(s)||s<=0)return`invalid tracked invocation id: ${n}`;r.push(s)}return[...new Set(r)]}function qF(t,e){if(e.snapshotIds.size===0&&e.scope.kind!=="ids"){let s=YF(hT(t,e.scope),e.initialMaxId);if(s!==null)return{finished:s,running:[]};for(let o of JF(t,e.scope))e.snapshotIds.add(o.id)}let r=[...e.snapshotIds].map(s=>GF(t,s,e.nowMs,e.reclaimStaleMs)).filter(s=>s!==null);return{finished:r.filter(gT).sort((s,o)=>s.id-o.id)[0]??null,running:r.filter(_T).sort((s,o)=>s.id-o.id)}}function hT(t,e){return e.kind==="ids"?e.ids.map(r=>t.getTrackedInvocation(r)).filter(r=>r!==null):e.kind==="all"?t.listTrackedInvocations({limit:1e3}):e.kind==="team"?t.listTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listTrackedInvocations({from:e.from,limit:1e3})}function JF(t,e){return e.kind==="ids"?hT(t,e).filter(_T):e.kind==="all"?t.listRunningTrackedInvocations({limit:1e3}):e.kind==="team"?t.listRunningTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listRunningTrackedInvocations({from:e.from,limit:1e3})}function XF(t,e){return e.kind==="ids"?0:e.kind==="all"?t.maxTrackedInvocationId():e.kind==="team"?t.maxTrackedInvocationId({scope_teamfile:e.teamfile}):t.maxTrackedInvocationId({from:e.from})}function GF(t,e,r,n){let s=t.getTrackedInvocation(e);return s===null||s.status!=="running"||!KF(s,r,n)?s:t.reclaimTrackedInvocationIfUnchanged(s.id,{holder_pid:s.holder_pid,holder_host:s.holder_host,started_at:s.started_at,last_heartbeat_at:s.last_heartbeat_at},{status:"error",error:cT,result_summary:cT})??t.getTrackedInvocation(s.id)}function KF(t,e,r){return t.holder_host===LF()&&zF(t.holder_pid)?!ja(t.holder_pid):VF(t,e,r)}function VF(t,e,r){let n=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(n)&&e-n>r}function YF(t,e){return t.filter(n=>n.id>e&&gT(n)).sort((n,s)=>n.id-s.id)[0]??null}function zF(t){return Number.isInteger(t)&&(t??0)>0}function _T(t){return t.status==="running"}function gT(t){return UF.has(t.status)}function ZF(t){return{id:t.id,kind:t.kind,status:t.status,from_identity:t.from_identity,scope_teamfile:t.scope_teamfile,target_teamfile:t.target_teamfile,target_alias:t.target_alias,result_summary:QF(t)}}function uT(t){return t.sort((e,r)=>e.id-r.id).map(e=>({id:e.id,kind:e.kind,status:"running",from_identity:e.from_identity,target_alias:e.target_alias}))}function QF(t){let r=(t.result_summary??t.error??t.status).replace(/\s+/g," ").trim();return r.length===0?"(empty)":r.length<=240?r:`${r.slice(0,239)}\u2026`}function Ga(t,e,r){if(r){W(t,e);return}if(e.status==="idle"){t.stdout.write(`wait: idle (no running tracked invocations)
1957
+ `)});function Ja(t,e){let r=wt(t);if(r===null)throw new Error(`--from must be <teamfile.lmctl>:<alias>, got '${t}'`);let n=ue(r.teamfile,e),s=qe(n,e);if(s.parseErrors.length>0)throw new Error(`--from ${r.teamfile}: ${s.parseErrors.join("; ")}`);let o=Er(s,r.alias);if(o===void 0)throw new Error(`--from alias "${r.alias}" not found in ${r.teamfile}`);return`${n}:${o.alias}`}function Xa(t,e){let r=t[rs];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let o of e.listRootTeams()){let i=qe(o.teamfile_path,e);for(let a of i.members)a.teamfile===void 0&&a.session===r&&n.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; pass --from explicitly");return{ok:!0,identity:s[0]}}var sf=b(()=>{"use strict";lt();Rt();Ot();gt()});var wT={};ne(wT,{runWait:()=>WF});import{hostname as LF}from"node:os";async function WF(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(CF),0;let n=D(t,["--from","--id","--interval","--timeout"],["--json"]);if(n.error!==void 0)return Fn(e,n.error);if(n.positionals.length>1)return Fn(e,`unexpected positional: ${n.positionals[1]}`);let s=fT(x(n,"--interval"),"--interval",MF);if(typeof s=="string")return Fn(e,s);let o=fT(x(n,"--timeout"),"--timeout",DF);if(typeof o=="string")return Fn(e,o);if([x(n,"--from")!==void 0,x(n,"--id")!==void 0,n.positionals.length===1].filter(Boolean).length>1)return Fn(e,"--id, --from, and teamfile positional are mutually exclusive");let a;try{a=await BF(e,{from:x(n,"--from"),ids:x(n,"--id"),teamfile:n.positionals[0]})}catch(E){return Fn(e,E instanceof Error?E.message:String(E))}let l=M(n,"--json"),c=r.sleep??(E=>new Promise(k=>setTimeout(k,E))),u=r.now??(()=>Date.now()),d=r.appearanceGraceMs??mT("LMCTL_WAIT_APPEARANCE_GRACE_MS",PF),f=r.reclaimStaleMs??mT("LMCTL_WAIT_RECLAIM_STALE_MS",FF),m=u(),p=m+o,h=a.kind!=="ids",g=m+(h?d:0),_=new Set;if(a.kind==="ids")for(let E of a.ids)_.add(E);let y=await L(e,E=>XF(E,a));for(;;){let E=await L(e,k=>qF(k,{scope:a,snapshotIds:_,nowMs:u(),initialMaxId:y,reclaimStaleMs:f}));if(E.finished!==null)return Ga(e,{status:"completed",finished:[ZF(E.finished)],in_flight:uT(E.running)},l),0;if(_.size>0){if(u()>=p)return Ga(e,{status:"timeout",finished:[],in_flight:uT(E.running)},l),1;await c(pT(u(),s,p));continue}if(u()>=p)return Ga(e,{status:"timeout",finished:[],in_flight:[]},l),1;if(!h||u()>=g)return Ga(e,{status:"idle",finished:[],in_flight:[]},l),0;await c(pT(u(),s,g,p))}}function Fn(t,e){return t.stderr.write(`error: ${e}
1958
+ `),2}async function BF(t,e){if(e.ids!==void 0){let n=HF(e.ids);if(typeof n=="string")throw new Error(n);return await L(t,s=>{for(let o of n)if(s.getTrackedInvocation(o)===null)throw new Error(`unknown tracked invocation id: ${o}`)}),{kind:"ids",ids:n}}if(e.from!==void 0)return await L(t,n=>({kind:"from",from:Ja(e.from,n)}));if(e.teamfile!==void 0)return await L(t,n=>({kind:"team",teamfile:ue(e.teamfile,n)}));let r=t.env??process.env;return await L(t,n=>{let s=Xa(r,n);if(s.ok)return{kind:"from",from:s.identity};throw s.reason==="unset"?new Error("lmctl wait could not infer caller: LMCTL_SELF_SESSIONID is not set; pass --from, --id, or a teamfile"):new Error("lmctl wait could not infer caller from LMCTL_SELF_SESSIONID; pass --from, --id, or a teamfile")})}function HF(t){let e=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(e.length===0)return"--id requires at least one id";let r=[];for(let n of e){let s=Number(n);if(!Number.isInteger(s)||s<=0)return`invalid tracked invocation id: ${n}`;r.push(s)}return[...new Set(r)]}function qF(t,e){if(e.snapshotIds.size===0&&e.scope.kind!=="ids"){let s=YF(hT(t,e.scope),e.initialMaxId);if(s!==null)return{finished:s,running:[]};for(let o of JF(t,e.scope))e.snapshotIds.add(o.id)}let r=[...e.snapshotIds].map(s=>GF(t,s,e.nowMs,e.reclaimStaleMs)).filter(s=>s!==null);return{finished:r.filter(gT).sort((s,o)=>s.id-o.id)[0]??null,running:r.filter(_T).sort((s,o)=>s.id-o.id)}}function hT(t,e){return e.kind==="ids"?e.ids.map(r=>t.getTrackedInvocation(r)).filter(r=>r!==null):e.kind==="team"?t.listTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listTrackedInvocations({from:e.from,limit:1e3})}function JF(t,e){return e.kind==="ids"?hT(t,e).filter(_T):e.kind==="team"?t.listRunningTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listRunningTrackedInvocations({from:e.from,limit:1e3})}function XF(t,e){return e.kind==="ids"?0:e.kind==="team"?t.maxTrackedInvocationId({scope_teamfile:e.teamfile}):t.maxTrackedInvocationId({from:e.from})}function GF(t,e,r,n){let s=t.getTrackedInvocation(e);return s===null||s.status!=="running"||!KF(s,r,n)?s:t.reclaimTrackedInvocationIfUnchanged(s.id,{holder_pid:s.holder_pid,holder_host:s.holder_host,started_at:s.started_at,last_heartbeat_at:s.last_heartbeat_at},{status:"error",error:cT,result_summary:cT})??t.getTrackedInvocation(s.id)}function KF(t,e,r){return t.holder_host===LF()&&zF(t.holder_pid)?!ja(t.holder_pid):VF(t,e,r)}function VF(t,e,r){let n=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(n)&&e-n>r}function YF(t,e){return t.filter(n=>n.id>e&&gT(n)).sort((n,s)=>n.id-s.id)[0]??null}function zF(t){return Number.isInteger(t)&&(t??0)>0}function _T(t){return t.status==="running"}function gT(t){return UF.has(t.status)}function ZF(t){return{id:t.id,kind:t.kind,status:t.status,from_identity:t.from_identity,scope_teamfile:t.scope_teamfile,target_teamfile:t.target_teamfile,target_alias:t.target_alias,result_summary:QF(t)}}function uT(t){return t.sort((e,r)=>e.id-r.id).map(e=>({id:e.id,kind:e.kind,status:"running",from_identity:e.from_identity,target_alias:e.target_alias}))}function QF(t){let r=(t.result_summary??t.error??t.status).replace(/\s+/g," ").trim();return r.length===0?"(empty)":r.length<=240?r:`${r.slice(0,239)}\u2026`}function Ga(t,e,r){if(r){W(t,e);return}if(e.status==="idle"){t.stdout.write(`wait: idle (no running tracked invocations)
1959
1959
  `);return}if(e.status==="timeout"){t.stdout.write(`wait: timeout; ${e.in_flight.length} invocation(s) still running
1960
1960
  `),dT(t,e.in_flight);return}let n=e.finished[0];t.stdout.write(`wait: completed invocation ${n.id} [${n.status}] ${n.kind}`),n.target_alias!==null&&t.stdout.write(` \u2192 ${n.target_alias}`),t.stdout.write(`
1961
1961
  `),t.stdout.write(`summary: ${n.result_summary}
1962
1962
  `),dT(t,e.in_flight)}function dT(t,e){if(e.length===0){t.stdout.write(`in flight: none
1963
1963
  `);return}t.stdout.write(`in flight:
1964
1964
  `);for(let r of e)t.stdout.write(` ${r.id} ${r.status} ${r.kind} \u2192 ${r.target_alias??"(unknown)"}
1965
- `)}function fT(t,e,r){return t===void 0?r:eU(t,e)}function eU(t,e){let r=Number(t);return!Number.isFinite(r)||r<=0?`${e} must be a positive number of seconds`:Math.max(1,Math.ceil(r*1e3))}function mT(t,e){let r=process.env[t];if(r===void 0||r.trim()==="")return e;let n=Number(r);return!Number.isFinite(n)||n<=0?e:Math.max(1,Math.ceil(n))}function pT(t,e,...r){let n=Math.min(...r);return Math.min(e,Math.max(1,n-t))}var CF,MF,DF,PF,FF,UF,cT,yT=b(()=>{"use strict";Bd();ye();gt();sf();CF=`usage: lmctl wait [teamfile] [--from <teamfile:alias> | --all | --id <id[,id...]>] [--interval <seconds>] [--timeout <seconds>] [--json]
1965
+ `)}function fT(t,e,r){return t===void 0?r:eU(t,e)}function eU(t,e){let r=Number(t);return!Number.isFinite(r)||r<=0?`${e} must be a positive number of seconds`:Math.max(1,Math.ceil(r*1e3))}function mT(t,e){let r=process.env[t];if(r===void 0||r.trim()==="")return e;let n=Number(r);return!Number.isFinite(n)||n<=0?e:Math.max(1,Math.ceil(n))}function pT(t,e,...r){let n=Math.min(...r);return Math.min(e,Math.max(1,n-t))}var CF,MF,DF,PF,FF,UF,cT,yT=b(()=>{"use strict";Bd();ye();gt();sf();CF=`usage: lmctl wait [teamfile] [--from <teamfile:alias> | --id <id[,id...]>] [--interval <seconds>] [--timeout <seconds>] [--json]
1966
1966
 
1967
1967
  Wait for the first tracked invocation in scope to finish.
1968
1968
  Default scope is the calling member's own invocations, inferred from
1969
1969
  LMCTL_SELF_SESSIONID. Use --from for an explicit sender, a teamfile positional
1970
- for invocations targeting that team, --all for every running invocation, or
1971
- --id for exact tracked invocation ids from lmctl exec.
1970
+ for invocations targeting that team, or --id for exact tracked invocation ids
1971
+ from lmctl exec.
1972
1972
 
1973
1973
  Exit codes:
1974
1974
  0 completed or idle (inspect status in output/JSON)
@@ -1990,7 +1990,7 @@ Use "lmctl exec -- sh -lc '<command>'" when shell expansion is desired.
1990
1990
 
1991
1991
  ${af}`);if(n.positionals.length===0)return w(e,`recover requires a <teamfile>
1992
1992
 
1993
- ${af}`);if(n.positionals.length>2)return w(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],o=wt(s),i=o?.teamfile??s,a=n.positionals[1],l=o?.alias??a;if(o!==null&&a!==void 0)return w(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(C(n,"--all")&&l!==void 0)return w(e,"recover --all is mutually exclusive with <alias>");let c;try{c=await xU(e,i,l)}catch(p){if(p instanceof pe)return w(e,p.message);throw p}let u=r.now??new Date,d=C(n,"--dry-run"),f=[];for(let p of c)f.push(await $U(e,p,{now:u,dryRun:d}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(C(n,"--json"))W(e,{dryRun:d,now:u.toISOString(),summary:m,members:f});else{for(let p of f)e.stdout.write(AU(p));e.stdout.write(`Recover checked ${m.checked}: ${d?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
1993
+ ${af}`);if(n.positionals.length>2)return w(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],o=wt(s),i=o?.teamfile??s,a=n.positionals[1],l=o?.alias??a;if(o!==null&&a!==void 0)return w(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(M(n,"--all")&&l!==void 0)return w(e,"recover --all is mutually exclusive with <alias>");let c;try{c=await xU(e,i,l)}catch(p){if(p instanceof pe)return w(e,p.message);throw p}let u=r.now??new Date,d=M(n,"--dry-run"),f=[];for(let p of c)f.push(await $U(e,p,{now:u,dryRun:d}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(M(n,"--json"))W(e,{dryRun:d,now:u.toISOString(),summary:m,members:f});else{for(let p of f)e.stdout.write(AU(p));e.stdout.write(`Recover checked ${m.checked}: ${d?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
1994
1994
  `)}return m.errors>0?1:0}async function xU(t,e,r){return await L(t,n=>{let s=ue(e,n);if(r!==void 0){let o=qe(s,n);if(o.parseErrors.length>0)throw new pe(`lmctl: ${e}: ${o.parseErrors.join("; ")}`);let i=Er(o,r);return i?.teamfile!==void 0?lf(IT(vT(s),i.teamfile),n,new Set):[st(e,r,n)]}return lf(s,n,new Set)})}function lf(t,e,r){let n=ue(t,e);if(r.has(n))return[];r.add(n);let s=qe(n,e);if(s.parseErrors.length>0)throw new pe(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let o=[];for(let i of s.members){if(i.teamfile!==void 0){o.push(...lf(IT(vT(n),i.teamfile),e,r));continue}i.session!==void 0&&o.push(st(n,i.alias,e))}return o}async function $U(t,e,r){let n;try{let a=await Gt(e.sessionid,e.provider);if(a===null)return Lt(e,"session_not_found",null,"session detail not found");n=Js(a.messages)}catch(a){return Lt(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Lt(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Lt(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Lt(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Lt(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let o=await L(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(o!==null)return Lt(e,"busy",n,`in-flight since ${o.started_at}`);if(r.dryRun)return Lt(e,"would_recover",n,null);let i=await Pn({teamfile:e.teamfile,alias:e.alias,prompt:IU,permissionMode:"yolo",io:t,env:process.env});return i.status==="ok"||i.status==="stalled"?Lt(e,"recovered",n,null):Lt(e,i.status==="busy"?"busy":"send_error",n,i.message)}function Lt(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function AU(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
1995
1995
  `}var IU,af,xT=b(()=>{"use strict";of();Pr();Rt();gt();Ot();qa();ye();IU="Your session limit reset time has passed. Continue your work from the last actionable point.",af=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
1996
1996
  `)});var Xs,w9,cf=b(()=>{"use strict";Xs=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For batch or long-running shell work, launch it through `lmctl exec -- <command> &` and wait for completion with `lmctl wait`.",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>"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],w9=Xs.length});import{spawn as jU}from"node:child_process";async function AT(t,e,r){let n=OU.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 LU(n.name,s)}function LU(t,e){return t==="lmctl_chat"?CU(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function CU(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=typeof t.from=="string"&&t.from.length>0?t.from:void 0,o=["chat",r,n,e];return s!==void 0&&o.push("--from",s),_e()&&Xe(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n,from:s??null})),MU(o,process.cwd())}function MU(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=jU("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=DU(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){_e()&&Xe(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
@@ -2054,7 +2054,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
2054
2054
  AND payload LIKE ?
2055
2055
  ORDER BY id DESC
2056
2056
  LIMIT 1
2057
- `).get(s,o)??null}function PT(t,e){return new Date(t.getTime()-e*60*1e3)}function ZU(t,e){return new Date(t.getTime()-e*60*60*1e3)}function FT(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function QU(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Ks,UT=b(()=>{"use strict";MT();Ks={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var BT={};ne(BT,{renderSummary:()=>WT,runMonitor:()=>tW});async function tW(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(eW),0;let r=D(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=C(r,"--json"),s=C(r,"--quiet");try{return await L(e,o=>{let i=DT(o);return n?W(e,i):s||e.stdout.write(`${WT(i.findings)}
2057
+ `).get(s,o)??null}function PT(t,e){return new Date(t.getTime()-e*60*1e3)}function ZU(t,e){return new Date(t.getTime()-e*60*60*1e3)}function FT(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function QU(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Ks,UT=b(()=>{"use strict";MT();Ks={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var BT={};ne(BT,{renderSummary:()=>WT,runMonitor:()=>tW});async function tW(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(eW),0;let r=D(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 L(e,o=>{let i=DT(o);return n?W(e,i):s||e.stdout.write(`${WT(i.findings)}
2058
2058
  `),0})}catch(o){return he(e,o)}}function WT(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} ${rW(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function rW(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 eW,HT=b(()=>{"use strict";ye();UT();eW=`usage: lmctl monitor [--json] [--quiet]
2059
2059
 
2060
2060
  Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
@@ -2084,20 +2084,20 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
2084
2084
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
2085
2085
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
2086
2086
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2087
- `});var GT={};ne(GT,{runTeam:()=>TW});import{join as EW}from"node:path";async function TW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(bW),0;try{return await L(e,async s=>{switch(r){case"create":return kW(n,e,s);case"list":return vW(n,e,s);case"show":return IW(n,e,s);case"add-member":return NW(n,e,s);case"seed":return XT(n,e,s,!1);case"refresh":return XT(n,e,s,!0);case"companion":return $W(n,e,s);case"list-roots":return SW(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return he(e,s)}}function SW(t,e,r){let n=D(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 C(n,"--json")?W(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
2087
+ `});var GT={};ne(GT,{runTeam:()=>TW});import{join as EW}from"node:path";async function TW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(bW),0;try{return await L(e,async s=>{switch(r){case"create":return kW(n,e,s);case"list":return vW(n,e,s);case"show":return IW(n,e,s);case"add-member":return NW(n,e,s);case"seed":return XT(n,e,s,!1);case"refresh":return XT(n,e,s,!0);case"companion":return $W(n,e,s);case"list-roots":return SW(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return he(e,s)}}function SW(t,e,r){let n=D(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(`
2088
2088
  `)+(s.length>0?`
2089
2089
  `:"")),0}function kW(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}
2090
- `),0}function vW(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return C(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
2090
+ `),0}function vW(t,e,r){let n=D(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(`
2091
2091
  `)}${s.length>0?`
2092
- `:""}`),0}function IW(t,e,r){let n=D(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(C(n,"--json"))W(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
2092
+ `:""}`),0}function IW(t,e,r){let n=D(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}
2093
2093
  `);for(let a of i)e.stdout.write(`- ${a.alias} ${$e(a)} ${a.sessionid??"(unseeded)"}
2094
- `)}return 0}function NW(t,e,r){let n=D(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=x(n,"--alias"),a=x(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??EW(vr(),"sessions",o.name,i)});return C(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
2094
+ `)}return 0}function NW(t,e,r){let n=D(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=x(n,"--alias"),a=x(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??EW(vr(),"sessions",o.name,i)});return M(n,"--json")?W(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
2095
2095
  `),0}async function XT(t,e,r,n){let s=D(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=x(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=xW(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=$w(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))li(f,r),ui(f);let u=[],d=!1;for(let f of l){let m=await on({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
2096
2096
 
2097
2097
  ${un}`:un;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=dn($e(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
2098
2098
  ${_}
2099
2099
  `);try{await ki({dal:r,member:p,stderr:e.stderr})}catch(y){d=!0,e.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
2100
- `)}}}return C(s,"--json")?W(e,u):e.stdout.write(`seeded ${u.length} member(s)
2100
+ `)}}}return M(s,"--json")?W(e,u):e.stdout.write(`seeded ${u.length} member(s)
2101
2101
  `),d?1:0}function xW(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function $W(t,e,r){let n=D(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=x(n,"--interpreter"),a=x(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
2102
2102
  `),0}var bW,KT=b(()=>{"use strict";ze();qo();hs();Wc();Fe();Pr();tu();ra();ye();Bc();bW=`usage: lmctl team create <name>
2103
2103
  lmctl team list [--json]
@@ -2111,7 +2111,7 @@ ${un}`:un;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=dn($e(p),m.sessionid
2111
2111
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2112
2112
  refresh to create/update native provider sessions for team members.
2113
2113
  `});var tS={};ne(tS,{applyMaxBytes:()=>Va,renderMessage:()=>QT,runTail:()=>LW});async function LW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${OW}
2114
- `),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(r,"--lines"),s=x(r,"--max-bytes");if(n!==void 0&&s!==void 0)return w(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return w(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?jW:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return w(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=C(r,"--watch"),a=x(r,"--watch-interval"),l=a===void 0?RW:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return w(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=x(r,"--run");if(c!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return w(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await L(e,async p=>CW(e,p,m,o,i,l))}catch(p){return he(e,p)}}let u=br(AW,{target:r.positionals[0],alias:r.positionals[1],flags:{session:x(r,"--session"),provider:x(r,"--provider")}});if(u.mode==="error")return w(e,u.message);if(u.mode==="managed")return w(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await L(e,g=>ue(u.teamfile,g))}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=De(m)}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=jt(p);if(h===void 0)return w(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await L(e,_=>st(u.teamfile,h.alias,_));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof pe?w(e,g.message):he(e,g)}}else try{let m=await L(e,p=>st(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof pe?w(e,m.message):he(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await fi(m);if(h.length===0)return w(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return w(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await VT(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await VT(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2114
+ `),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(r,"--lines"),s=x(r,"--max-bytes");if(n!==void 0&&s!==void 0)return w(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return w(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?jW:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return w(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=M(r,"--watch"),a=x(r,"--watch-interval"),l=a===void 0?RW:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return w(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=x(r,"--run");if(c!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return w(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await L(e,async p=>CW(e,p,m,o,i,l))}catch(p){return he(e,p)}}let u=br(AW,{target:r.positionals[0],alias:r.positionals[1],flags:{session:x(r,"--session"),provider:x(r,"--provider")}});if(u.mode==="error")return w(e,u.message);if(u.mode==="managed")return w(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await L(e,g=>ue(u.teamfile,g))}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=De(m)}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=jt(p);if(h===void 0)return w(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await L(e,_=>st(u.teamfile,h.alias,_));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof pe?w(e,g.message):he(e,g)}}else try{let m=await L(e,p=>st(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof pe?w(e,m.message):he(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await fi(m);if(h.length===0)return w(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return w(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await VT(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await VT(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2115
2115
  `)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function VT(t,e,r,n,s){let o;try{o=await Gt(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
2116
2116
  `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
2117
2117
  `),-1;let i=o.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,i.length-n.lines):s+1;if(a>=i.length)return i.length-1;let l="";for(let c=a;c<i.length;c+=1)l+=`${QT(i[c])}
@@ -2131,7 +2131,7 @@ ${i.map(a=>` ${a}`).join(`
2131
2131
  Print or watch provider session messages, or follow a managed run timeline.
2132
2132
  --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;YT=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2133
2133
  `});var cS={};ne(cS,{runInfo:()=>UW});import{execFileSync as pf}from"node:child_process";import{dirname as sS,resolve as MW}from"node:path";function FW(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function UW(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${PW}
2134
- `),0;let r=D(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=C(r,"--json"),s=x(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await L(e,async u=>BW(e,u,c,n))}catch(u){return he(e,u)}}let o=br(DW,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:x(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await L(e,u=>ue(o.teamfile,u))}catch(u){return w(e,`health: ${u instanceof Error?u.message:String(u)}`)}return HW(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await L(e,u=>st(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof pe?w(e,c.message):he(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await fi(a);if(c.length===0)return w(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return WW(e,i,a,l,n)}async function WW(t,e,r,n,s){let o;try{o=await Gt(r,e)}catch(l){return w(t,`health: failed to load session: ${l instanceof Error?l.message:String(l)}`)}if(o===null)return w(t,`health: session not found: ${r} (provider=${e})`);let i=Js(o.messages),a={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(W(t,a),0):(t.stdout.write(`Session: ${o.sessionId}
2134
+ `),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=x(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await L(e,async u=>BW(e,u,c,n))}catch(u){return he(e,u)}}let o=br(DW,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:x(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await L(e,u=>ue(o.teamfile,u))}catch(u){return w(e,`health: ${u instanceof Error?u.message:String(u)}`)}return HW(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await L(e,u=>st(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof pe?w(e,c.message):he(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await fi(a);if(c.length===0)return w(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return WW(e,i,a,l,n)}async function WW(t,e,r,n,s){let o;try{o=await Gt(r,e)}catch(l){return w(t,`health: failed to load session: ${l instanceof Error?l.message:String(l)}`)}if(o===null)return w(t,`health: session not found: ${r} (provider=${e})`);let i=Js(o.messages),a={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(W(t,a),0):(t.stdout.write(`Session: ${o.sessionId}
2135
2135
  `),t.stdout.write(` Provider: ${o.provider}
2136
2136
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
2137
2137
  `),t.stdout.write(` CWD: ${o.cwd}
@@ -2171,7 +2171,7 @@ Print or watch provider session messages, or follow a managed run timeline.
2171
2171
  [--json]
2172
2172
 
2173
2173
  Show provider session details, team rollups, or managed run state/token totals.`});var fS={};ne(fS,{runLs:()=>tB});import{resolve as hf}from"node:path";function eB(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 tB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${ZW}
2174
- `),0;let r=D(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=x(r,"--format"),s=C(r,"--json");if(C(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(x(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(C(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=x(r,"--limit"),h=QW;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(_>dS)return w(e,`--limit ${_} exceeds maximum (${dS})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await L(e,async _=>rB(e,_,h,g))}catch(_){return he(e,_)}}let i=nB(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=x(r,"--provider"),c=x(r,"--sessiondir"),u=C(r,"--recursive"),d=C(r,"--all"),f;try{f=await bc(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?hf(c):hf(process.cwd());f=f.filter(h=>{let g=hf(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=eB(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}.
2174
+ `),0;let r=D(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=x(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(x(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=x(r,"--limit"),h=QW;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(_>dS)return w(e,`--limit ${_} exceeds maximum (${dS})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await L(e,async _=>rB(e,_,h,g))}catch(_){return he(e,_)}}let i=nB(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=x(r,"--provider"),c=x(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await bc(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?hf(c):hf(process.cwd());f=f.filter(h=>{let g=hf(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=eB(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}.
2175
2175
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
2176
2176
  `);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
2177
2177
  `);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()}
@@ -2306,7 +2306,7 @@ Examples:
2306
2306
 
2307
2307
  # Same shape, codex for the Lead and Reviewer2
2308
2308
  lmctl plan ./backend --provider codex
2309
- `});var HS={};ne(HS,{SIZE_WARN_EST_TOKENS:()=>oo,estimateTokens:()=>BS,runTerminal:()=>R2});import{spawn as $2}from"node:child_process";import{statSync as A2}from"node:fs";async function R2(t,e){if(t.includes("--help")||t.includes("-h"))return D2(e);let r=D(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?C(r,i):x(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await L(e,async i=>{let a=x(r,"--alias"),l=$y(i,s,a);return"err"in l?w(e,l.err):Af(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return he(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?C(r,l):x(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=br(j2,{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 L(e,l=>O2(e,a.teamfile,a.alias,l))}try{return await L(e,async s=>{let o=L2(e,s,r);if(typeof o=="number")return o;let i=x(r,"--alias");return C(r,"--size")?M2(e,s,o,i,C(r,"--json")):C2(e,s,o,i)})}catch(s){return he(e,s)}}async function O2(t,e,r,n){let s;try{s=st(e,r,n)}catch(l){return l instanceof pe?w(t,l.message):he(t,l)}let o=Ln(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:Dn()});if(!o.acquired)return w(t,`${s.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at}`);let i=Kb({teamfile:s.teamfile,alias:s.alias}),a=null;try{n.setTerminalLock(i),a=setInterval(()=>{try{!n.heartbeatTerminalLock(i.teamfile,i.alias,i.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Vb()),a.unref?.();try{Ei(t,De(s.teamfile),s.teamfile)}catch{}return await Af(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}finally{a!==null&&clearInterval(a),n.clearTerminalLock(i.teamfile,i.alias,i.lock_id),n.releaseAgentInflight(o.lease)}}async function Af(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!di(r))return w(t,`no resume incantation for provider "${r}"`);if(!Hh.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Jc(r,n,{isLead:e.isLead});if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=$2(i,a,{stdio:"inherit",cwd:s,env:We(process.env,s,n)});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function L2(t,e,r){let n=x(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=vi(t,e,x(r,"--project"));return typeof s=="number"?s:Ii(t,e,s,void 0)}async function C2(t,e,r,n){let s=Ni(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`):Af(t,{provider:$e(s),sessionid:o,sessiondir:s.sessiondir})}function BS(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=A2(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 M2(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=$e(a),u=null;di(c)&&(u=await Gt(l,c));let d=BS(u),f=d.est>oo;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?dn(c,l):null})}if(s)return W(t,{estimate:!0,legend:WS,guide_tokens:oo,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2309
+ `});var HS={};ne(HS,{SIZE_WARN_EST_TOKENS:()=>oo,estimateTokens:()=>BS,runTerminal:()=>R2});import{spawn as $2}from"node:child_process";import{statSync as A2}from"node:fs";async function R2(t,e){if(t.includes("--help")||t.includes("-h"))return D2(e);let r=D(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):x(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await L(e,async i=>{let a=x(r,"--alias"),l=$y(i,s,a);return"err"in l?w(e,l.err):Af(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return he(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):x(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=br(j2,{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 L(e,l=>O2(e,a.teamfile,a.alias,l))}try{return await L(e,async s=>{let o=L2(e,s,r);if(typeof o=="number")return o;let i=x(r,"--alias");return M(r,"--size")?M2(e,s,o,i,M(r,"--json")):C2(e,s,o,i)})}catch(s){return he(e,s)}}async function O2(t,e,r,n){let s;try{s=st(e,r,n)}catch(l){return l instanceof pe?w(t,l.message):he(t,l)}let o=Ln(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:Dn()});if(!o.acquired)return w(t,`${s.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at}`);let i=Kb({teamfile:s.teamfile,alias:s.alias}),a=null;try{n.setTerminalLock(i),a=setInterval(()=>{try{!n.heartbeatTerminalLock(i.teamfile,i.alias,i.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Vb()),a.unref?.();try{Ei(t,De(s.teamfile),s.teamfile)}catch{}return await Af(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}finally{a!==null&&clearInterval(a),n.clearTerminalLock(i.teamfile,i.alias,i.lock_id),n.releaseAgentInflight(o.lease)}}async function Af(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!di(r))return w(t,`no resume incantation for provider "${r}"`);if(!Hh.test(n))return w(t,"refusing to resume: malformed sessionid");let o=Jc(r,n,{isLead:e.isLead});if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=$2(i,a,{stdio:"inherit",cwd:s,env:We(process.env,s,n)});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function L2(t,e,r){let n=x(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=vi(t,e,x(r,"--project"));return typeof s=="number"?s:Ii(t,e,s,void 0)}async function C2(t,e,r,n){let s=Ni(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`):Af(t,{provider:$e(s),sessionid:o,sessiondir:s.sessiondir})}function BS(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=A2(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 M2(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=$e(a),u=null;di(c)&&(u=await Gt(l,c));let d=BS(u),f=d.est>oo;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?dn(c,l):null})}if(s)return W(t,{estimate:!0,legend:WS,guide_tokens:oo,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2310
2310
  `),t.stdout.write(`${WS}
2311
2311
  `);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)
2312
2312
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2349,7 +2349,7 @@ Examples:
2349
2349
  ${GS(n)}`):new ot(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2350
2350
  ${GS(n)}`)}function GS(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2351
2351
  `)}function U2(t){let e=[],r=jf(t);for(;;){e.push(r);let n=KS(r);if(n===r)return e;r=n}}function ZS(t){let e=null;try{e=new ho(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>Nl)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 ot,Lf=b(()=>{"use strict";Il();$l();Fe();ze();ot=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var Uf={};ne(Uf,{assertNoCrossWorkflowSubflowCycle:()=>ok,firstUnregisteredArchetype:()=>Ff,runWorkflow:()=>eH});import{createHash as Df,randomUUID as W2}from"node:crypto";import{existsSync as B2,readFileSync as al,readdirSync as H2,writeFileSync as q2}from"node:fs";import{basename as J2,join as X2,resolve as G2}from"node:path";import{pathToFileURL as K2}from"node:url";function Pf(t,e){return{source_uri:K2(G2(t)).href,source_sha256:Df("sha256").update(e).digest("hex")}}function tk(t){return Df("sha256").update(t).digest("hex")}async function Z2(t){let e=await $r(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:tk(e),remote:!0}}async function il(t){if(fr(t)){let n=await ws(t),s=al(n,"utf8");return{definition:s,source_uri:t,source_sha256:tk(s),remote:!1}}let e=Vn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(bt(t))return Z2(t);let r=al(t,"utf8");return{definition:r,...Pf(t,r),remote:!1}}function rk(t){return Ce(t.definition)}function nk(t){if(t.definition_schema_version!==3)return null;let e=Ff(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function Q2(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 eH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(z2),0;try{return r==="run"?await tH(n,e):await L(e,s=>{switch(r){case"load":return oH(n,e,s);case"author":return iH(n,e,s);case"list":return aH(n,e,s);case"sync":return lH(n,e,s);case"export":return cH(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof ot?w(e,s.message):he(e,s)}}async function tH(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${ol}
2352
- `),0;let r=D(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,ol);let n=C(r,"--json"),s=x(r,"--workflow"),o=x(r,"--project"),i=x(r,"--job"),a=x(r,"--inputs"),l=C(r,"--verbose"),c=r.positionals[0],u=C(r,"--yes")||C(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(!nr(c))return Sr(e,ol);if(fr(c))return QS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Vn(c,"remote workflow URLs");return m!==null?w(e,m):QS(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,ol);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=rH(i);if(m===null)return Sr(e,`invalid --job: ${i}`);let p=VS({cwd:process.cwd(),io:e});try{let h=await Ls({dal:p.dal,job_id:m,worker_id:Cf()});return Mf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=sk(a,e);if(d===ll)return 2;let f=Of({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 Ls({dal:f.dal,job_id:p.id,worker_id:Cf()});return Mf(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 QS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=sk(o,r);if(l===ll)return 2;let c,u;try{c=await il(t),u=rk(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=nk(u);if(d!==null)return w(r,d);if(c.remote&&!await nH(r,c,u,a))return 1;let f=Of({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 Ls({dal:f.dal,job_id:p.id,worker_id:Cf()});return Mf(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}
2352
+ `),0;let r=D(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,ol);let n=M(r,"--json"),s=x(r,"--workflow"),o=x(r,"--project"),i=x(r,"--job"),a=x(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return Sr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!nr(c))return Sr(e,ol);if(fr(c))return QS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Vn(c,"remote workflow URLs");return m!==null?w(e,m):QS(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,ol);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=rH(i);if(m===null)return Sr(e,`invalid --job: ${i}`);let p=VS({cwd:process.cwd(),io:e});try{let h=await Ls({dal:p.dal,job_id:m,worker_id:Cf()});return Mf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=sk(a,e);if(d===ll)return 2;let f=Of({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 Ls({dal:f.dal,job_id:p.id,worker_id:Cf()});return Mf(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 QS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=sk(o,r);if(l===ll)return 2;let c,u;try{c=await il(t),u=rk(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=nk(u);if(d!==null)return w(r,d);if(c.remote&&!await nH(r,c,u,a))return 1;let f=Of({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 Ls({dal:f.dal,job_id:p.id,worker_id:Cf()});return Mf(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}
2353
2353
  `),2}function sk(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)}
2354
2354
  `),ll}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2355
2355
  `),ll):r}function rH(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Cf(){return`cli-${process.pid}-${W2().slice(0,8)}`}function Mf(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})`:""}
@@ -2364,9 +2364,9 @@ ${GS(n)}`)}function GS(t){return t.map(e=>` workspace ${e.candidate.workspace_n
2364
2364
  `),o.remote&&e.stdout.write(`source: ${o.source_uri}
2365
2365
  sha256: ${o.source_sha256}
2366
2366
  `),0}function Ff(t){let e=Qi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function ek(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 ok(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 iH(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=al(s,"utf8"),a;try{a=Ce(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return he(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=Ff(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{ok(u,ek(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return ek(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,...Pf(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:Df("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2367
- `),0}function aH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return C(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2367
+ `),0}function aH(t,e,r){let n=D(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(`
2368
2368
  `)}${s.length>0?`
2369
- `:""}`),0}function lH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);_i({swallow:!0});let s=Kh(),o=[];try{o=B2(s)?H2(s).filter(c=>V2.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=X2(s,c),d=al(u,"utf8"),f;try{f=Ce(d)}catch(A){return w(e,`compile failed for ${c}: ${A instanceof Error?A.message:String(A)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:J2(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,y=Pf(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===y.source_sha256){l+=1;continue}let k=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...y}),k?i+=1:a+=1}return C(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
2369
+ `:""}`),0}function lH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);_i({swallow:!0});let s=Kh(),o=[];try{o=B2(s)?H2(s).filter(c=>V2.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=X2(s,c),d=al(u,"utf8"),f;try{f=Ce(d)}catch(A){return w(e,`compile failed for ${c}: ${A instanceof Error?A.message:String(A)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:J2(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,y=Pf(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===y.source_sha256){l+=1;continue}let k=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...y}),k?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
2370
2370
  `),0}function cH(t,e,r){let n=D(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:Y2,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)}
2371
2371
  `,c=x(n,"--out");return c!==void 0?(q2(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2372
2372
  `)):e.stdout.write(l),0}var V2,Y2,z2,ol,ll,Wf=b(()=>{"use strict";Hu();bn();wi();Vc();ye();Lf();po();Cs();V2=[".compound.json",".lmctl"],Y2="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",z2=`usage: lmctl workflow <load|author|list|sync|export|run>
@@ -2375,14 +2375,14 @@ Load, author, list, synchronize, inspect, or run workflow definitions. The
2375
2375
  load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
2376
2376
  URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
2377
2377
  remote https:// workflow after a trust prompt.
2378
- `,ol="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";ll=Symbol("inputs-error")});function Bf(t,e){let r=uH[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var uH,ik=b(()=>{"use strict";uH={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var mk={};ne(mk,{initWorkspace:()=>dk,runWorkspace:()=>gH,setWorkspaceProvider:()=>fk});import{copyFileSync as dH,cpSync as fH,existsSync as Pe,mkdirSync as kr,readdirSync as qf,renameSync as mH,rmSync as cl,statSync as ul,writeFileSync as pH}from"node:fs";import{spawnSync as hH}from"node:child_process";import{homedir as ak}from"node:os";import{dirname as Jf,join as io}from"node:path";async function gH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(_H),0;switch(r){case"list":return wH(n,e);case"create":return yH(n,e);case"use":return EH(n,e);case"show":return bH(n,e);case"delete":return TH(n,e);case"migrate":return SH(n,e);case"init":return dk(n,e);case"set-provider":return fk(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function ck(){let t=lo(),e=[],r=new Set,n=Nr.default,s=Pe(qn()),o=Pe(Dt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?tr(n):qn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Pe(Ir())){let i;try{i=qf(Ir())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Je(a))continue;let l=!1;try{l=ul(Dt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:tr(a),active:t===a,legacy:!1}),r.add(a))}}return e}function wH(t,e){let r=D(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=ck();if(C(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}
2379
- `)}return 0}function yH(t,e){let r=D(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(!Je(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Dt(n);if(Pe(s))return w(e,`workspace already exists: ${n} (${s})`);let o=x(r,"--docroot")??ml(n);kr(s,{recursive:!0}),kr(o,{recursive:!0});let i=tr(n);kr(Jf(i),{recursive:!0});let a=ge({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return C(r,"--json")?W(e,l):e.stdout.write(`created workspace ${n} at ${s}
2378
+ `,ol="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";ll=Symbol("inputs-error")});function Bf(t,e){let r=uH[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var uH,ik=b(()=>{"use strict";uH={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var mk={};ne(mk,{initWorkspace:()=>dk,runWorkspace:()=>gH,setWorkspaceProvider:()=>fk});import{copyFileSync as dH,cpSync as fH,existsSync as Pe,mkdirSync as kr,readdirSync as qf,renameSync as mH,rmSync as cl,statSync as ul,writeFileSync as pH}from"node:fs";import{spawnSync as hH}from"node:child_process";import{homedir as ak}from"node:os";import{dirname as Jf,join as io}from"node:path";async function gH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(_H),0;switch(r){case"list":return wH(n,e);case"create":return yH(n,e);case"use":return EH(n,e);case"show":return bH(n,e);case"delete":return TH(n,e);case"migrate":return SH(n,e);case"init":return dk(n,e);case"set-provider":return fk(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function ck(){let t=lo(),e=[],r=new Set,n=Nr.default,s=Pe(qn()),o=Pe(Dt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?tr(n):qn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Pe(Ir())){let i;try{i=qf(Ir())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Je(a))continue;let l=!1;try{l=ul(Dt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:tr(a),active:t===a,legacy:!1}),r.add(a))}}return e}function wH(t,e){let r=D(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=ck();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}
2379
+ `)}return 0}function yH(t,e){let r=D(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(!Je(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Dt(n);if(Pe(s))return w(e,`workspace already exists: ${n} (${s})`);let o=x(r,"--docroot")??ml(n);kr(s,{recursive:!0}),kr(o,{recursive:!0});let i=tr(n);kr(Jf(i),{recursive:!0});let a=ge({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}
2380
2380
  `),0}function EH(t,e){let r=D(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(!Je(n))return w(e,`invalid workspace name: ${n}`);if(n!==Nr.default&&!Pe(Dt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=ao();return kr(Jf(s),{recursive:!0}),pH(s,`${n}
2381
- `),C(r,"--json")?W(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2382
- `),0}function bH(t,e){let r=D(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(!Je(n))return w(e,`invalid workspace name: ${n}`);let s=ck().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=Pe(s.db_path)?ul(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Pe(s.db_path)){let u=ge({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 C(r,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2383
- `),0}function TH(t,e){let r=D(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(!Je(n))return w(e,`invalid workspace name: ${n}`);if(!C(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===Nr.default&&!C(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(lo()===n&&!C(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=Dt(n);return Pe(o)?(cl(o,{recursive:!0,force:!0}),C(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2381
+ `),M(r,"--json")?W(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2382
+ `),0}function bH(t,e){let r=D(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(!Je(n))return w(e,`invalid workspace name: ${n}`);let s=ck().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=Pe(s.db_path)?ul(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Pe(s.db_path)){let u=ge({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)}
2383
+ `),0}function TH(t,e){let r=D(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(!Je(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===Nr.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(lo()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=Dt(n);return Pe(o)?(cl(o,{recursive:!0,force:!0}),M(r,"--json")?W(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2384
2384
  `),0):w(e,`workspace not found: ${n}`)}function Hf(t,e,r){try{mH(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
2385
- `),ul(t).isDirectory()?fH(t,e,{recursive:!0}):dH(t,e),!Pe(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);cl(t,{recursive:!0,force:!0})}function SH(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=C(r,"--json"),s=pl(),o=Ir(),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}
2385
+ `),ul(t).isDirectory()?fH(t,e,{recursive:!0}):dH(t,e),!Pe(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);cl(t,{recursive:!0,force:!0})}function SH(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=pl(),o=Ir(),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}
2386
2386
  `);e.stdout.write(f?`migration complete
2387
2387
  `:`${m??"nothing to migrate"}
2388
2388
  `)}return 0};if(!Pe(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=qf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return ul(io(s,f)).isDirectory()}catch{return!1}});if(c.length===0)cl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Pe(o))Hf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Pe(io(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\`)`);kr(o,{recursive:!0});for(let m of c)Hf(io(s,m),io(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{qf(s).length===0&&(cl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=im(),d=ao();return Pe(u)&&(Pe(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(Hf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function uk(t,e){return hH(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function IH(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 lk(t){return t==="~"?ak():t.startsWith("~/")?io(ak(),t.slice(2)):t}async function dk(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: ${Bn.join(", ")}.`].join(`
@@ -2393,8 +2393,8 @@ remote https:// workflow after a trust prompt.
2393
2393
  `),2;f=m}else{if(!u)return d("--name");for(;;){let I=(await c("Workspace name [default]: ")).trim(),$=I.length===0?"default":I;if(Je($)){f=$;break}e.stderr.write(`invalid workspace name: ${$} (letters/digits/.-_, start alnum, \u226464)
2394
2394
  `)}}let p=Dt(f);if(Pe(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2395
2395
  `),2;let h,g=x(s,"--basedir"),_=ml(f);if(g!==void 0)h=lk(g);else{if(!u)return d("--basedir");let I=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=I.length===0?_:lk(I)}let y={};for(let I of["provider1","provider2","provider3"]){let $=x(s,`--${I}`),q=kH[I],U=a.includes(q)?q:a[0];if($!==void 0){if(!a.includes($))return e.stderr.write(`error: --${I} ${$} is not an available provider (available: ${a.join(", ")})
2396
- `),2;y[I]=$;continue}if(!u)return d(`--${I}`);for(;;){let M=(await c(`${I} (${vH[I]}) [${U}]: `)).trim(),j=M.length===0?U:M;if(a.includes(j)){y[I]=j;break}e.stderr.write(`not an available provider: ${j} (available: ${a.join(", ")})
2397
- `)}}kr(p,{recursive:!0}),kr(h,{recursive:!0});let E=tr(f);kr(Jf(E),{recursive:!0});let k=ge({path:E});try{k.setConfig("project.docroot",h),k.setConfig("workspace.provider1",y.provider1),k.setConfig("workspace.provider2",y.provider2),k.setConfig("workspace.provider3",y.provider3)}finally{k.close()}let A={name:f,dir:p,db_path:E,basedir:h,providers:{...y}};return C(s,"--json")?W(e,A):(e.stdout.write(`created workspace ${f} at ${p}
2396
+ `),2;y[I]=$;continue}if(!u)return d(`--${I}`);for(;;){let C=(await c(`${I} (${vH[I]}) [${U}]: `)).trim(),j=C.length===0?U:C;if(a.includes(j)){y[I]=j;break}e.stderr.write(`not an available provider: ${j} (available: ${a.join(", ")})
2397
+ `)}}kr(p,{recursive:!0}),kr(h,{recursive:!0});let E=tr(f);kr(Jf(E),{recursive:!0});let k=ge({path:E});try{k.setConfig("project.docroot",h),k.setConfig("workspace.provider1",y.provider1),k.setConfig("workspace.provider2",y.provider2),k.setConfig("workspace.provider3",y.provider3)}finally{k.close()}let A={name:f,dir:p,db_path:E,basedir:h,providers:{...y}};return M(s,"--json")?W(e,A):(e.stdout.write(`created workspace ${f} at ${p}
2398
2398
  `),e.stdout.write(` basedir: ${h}
2399
2399
  `),e.stdout.write(` provider1=${y.provider1} provider2=${y.provider2} provider3=${y.provider3}
2400
2400
  `),e.stdout.write(`activate it with: lmctl workspace use ${f}
@@ -2416,16 +2416,16 @@ remote https:// workflow after a trust prompt.
2416
2416
  Manage isolated workspace state directories, active workspace selection,
2417
2417
  legacy profile migration, and configured provider slots.
2418
2418
  delete requires --confirm; deleting default or active workspaces also requires --force.
2419
- `;Bn=["claude","codex","gemini","qwen"],kH={provider1:"claude",provider2:"codex",provider3:"gemini"},vH={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var gk={};ne(gk,{runProject:()=>AH});import{existsSync as NH,statSync as xH}from"node:fs";import{join as _k}from"node:path";async function AH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write($H),0;try{return await L(e,s=>{switch(r){case"create":return FH(n,e,s);case"list":return UH(n,e,s);case"show":return DH(n,e,s);case"status":return PH(n,e,s);case"workflow":return jH(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return he(e,s)}}function jH(t,e,r){let[n,...s]=t;switch(n){case"add":return RH(s,e,r);case"list":return OH(s,e,r);case"show":return LH(s,e,r);case"remove":return CH(s,e,r);case"enable":return hk(s,e,r,!0);case"disable":return hk(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function RH(t,e,r){let n=D(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=x(n,"--condition")??null;if(l!==null)try{pr(l)}catch{return w(e,"invalid --condition JEXL")}let c=MH(x(n,"--params"));if(typeof c=="string")return w(e,c);let u=x(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return C(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
2420
- `),0}function OH(t,e,r){let n=D(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 C(n,"--json")?W(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2419
+ `;Bn=["claude","codex","gemini","qwen"],kH={provider1:"claude",provider2:"codex",provider3:"gemini"},vH={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var gk={};ne(gk,{runProject:()=>AH});import{existsSync as NH,statSync as xH}from"node:fs";import{join as _k}from"node:path";async function AH(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write($H),0;try{return await L(e,s=>{switch(r){case"create":return FH(n,e,s);case"list":return UH(n,e,s);case"show":return DH(n,e,s);case"status":return PH(n,e,s);case"workflow":return jH(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return he(e,s)}}function jH(t,e,r){let[n,...s]=t;switch(n){case"add":return RH(s,e,r);case"list":return OH(s,e,r);case"show":return LH(s,e,r);case"remove":return CH(s,e,r);case"enable":return hk(s,e,r,!0);case"disable":return hk(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function RH(t,e,r){let n=D(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=x(n,"--condition")??null;if(l!==null)try{pr(l)}catch{return w(e,"invalid --condition JEXL")}let c=MH(x(n,"--params"));if(typeof c=="string")return w(e,c);let u=x(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?W(e,f):e.stdout.write(`added project workflow ${f.id}
2420
+ `),0}function OH(t,e,r){let n=D(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(`
2421
2421
  `)}${i.length>0?`
2422
- `:""}`),0}function LH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Xf(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}`):(C(n,"--json")?W(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2422
+ `:""}`),0}function LH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Xf(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)}
2423
2423
  `),0)}function CH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Xf(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}
2424
- `),0):w(e,`project workflow not found: ${s}`)}function hk(t,e,r,n){let s=D(t,[]);if(s.error!==void 0)return w(e,s.error);let o=Xf(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}`):(C(s,"--json")?W(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2425
- `),0)}function MH(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 Xf(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function DH(t,e,r){let n=D(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 C(n,"--json")?W(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2426
- `),0}function PH(t,e,r){let n=D(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 C(n,"--json")?W(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2427
- `),0}function FH(t,e,r){let n=D(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=x(n,"--owner"),i=x(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=x(n,"--local-path")??(l!==null?_k(l,u):void 0),f=x(n,"--workflow"),m=x(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=x(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every(A=>typeof A=="string")||k.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return w(e,"--test-argv must be valid JSON")}let _=x(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let y=_!==void 0?_:WH(d)||ps(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:x(n,"--default-branch")??null,test_argv:g,durable_memory_mode:y});return C(n,"--json")?W(e,E):e.stdout.write(`created project ${E.name}
2428
- `),0}function UH(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return C(n,"--json")?W(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2424
+ `),0):w(e,`project workflow not found: ${s}`)}function hk(t,e,r,n){let s=D(t,[]);if(s.error!==void 0)return w(e,s.error);let o=Xf(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}
2425
+ `),0)}function MH(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 Xf(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function DH(t,e,r){let n=D(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)}
2426
+ `),0}function PH(t,e,r){let n=D(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)}
2427
+ `),0}function FH(t,e,r){let n=D(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=x(n,"--owner"),i=x(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=x(n,"--local-path")??(l!==null?_k(l,u):void 0),f=x(n,"--workflow"),m=x(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=x(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every(A=>typeof A=="string")||k.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return w(e,"--test-argv must be valid JSON")}let _=x(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let y=_!==void 0?_:WH(d)||ps(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:x(n,"--default-branch")??null,test_argv:g,durable_memory_mode:y});return M(n,"--json")?W(e,E):e.stdout.write(`created project ${E.name}
2428
+ `),0}function UH(t,e,r){let n=D(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(`
2429
2429
  `)}${s.length>0?`
2430
2430
  `:""}`),0}function WH(t){try{let e=_k(t,"durable-memory");return NH(e)&&xH(e).isDirectory()}catch{return!1}}var $H,wk=b(()=>{"use strict";ye();gn();hs();$H=`usage: lmctl project create <name> [--local-path P] --workflow W --team T [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
2431
2431
  lmctl project create --owner OWNER --repo REPO --workflow W --team T [--local-path P] [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
@@ -2482,7 +2482,7 @@ If project create omits --local-path, project.docroot must be configured.
2482
2482
  `),2;let n=r[0];try{return await L(e,s=>(e.stdout.write(Lk(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2483
2483
  `),1}}function Yf(){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(`
2484
2484
  `)}var Ok,zf,Zf,Fk=b(()=>{"use strict";gd();ye();Ok=["Coder","Reviewer1","Polisher"],zf=3e4,Zf=new Set(["attention_needed","paused","escalation"])});var Hk={};ne(Hk,{appendIntent:()=>Bk,resolveIntentLogPath:()=>Wk,runStatus:()=>_q});import{appendFileSync as lq,mkdirSync as cq}from"node:fs";import{homedir as uq}from"node:os";import{dirname as dq,join as fq}from"node:path";function Wk(){return process.env.LMCTL_INTENT_LOG??fq(uq(),".lmctl","recent-intents.log")}function Bk(t){try{let e=Wk();cq(dq(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});lq(e,`${r}
2485
- `)}catch{}}async function _q(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(hq),0;let r=D(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=C(r,"--web"),s=x(r,"--project"),o=C(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):L(e,i=>{let a=gq(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.
2485
+ `)}catch{}}async function _q(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(hq),0;let r=D(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=x(r,"--project"),o=M(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):L(e,i=>{let a=gq(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.
2486
2486
  `),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.
2487
2487
  `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=wq(i,l,a.source);return o?W(e,c):e.stdout.write(Sq(c)),Bk({verb:"status",args:t}),0})}function gq(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=Rf(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function wq(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=yq(t,e.id,pq),a=Eq(t,e.id),l=bq(t,e.id,mq);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:Tq(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function yq(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 Eq(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 bq(t,e,r){return t.db.prepare(`
2488
2488
  SELECT r.*, w.name AS workflow_name
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lmctl-ai/lmctl",
3
- "version": "0.1.87",
3
+ "version": "0.1.88",
4
4
  "description": "A provider-agnostic control plane for teams of AI coding agents — across providers, with independent review and durable memory.",
5
5
  "type": "module",
6
6
  "homepage": "https://lmctl.com",