@lmctl-ai/lmctl 0.2.84 → 0.2.85

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.
@@ -1,4 +1,4 @@
1
- var $v=Object.create;var ia=Object.defineProperty;var jv=Object.getOwnPropertyDescriptor;var Uv=Object.getOwnPropertyNames;var Hv=Object.getPrototypeOf,Bv=Object.prototype.hasOwnProperty;var O=(t,e)=>()=>(t&&(e=t(t=0)),e);var Wv=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Cs=(t,e)=>{for(var n in e)ia(t,n,{get:e[n],enumerable:!0})},Xv=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Uv(e))!Bv.call(t,s)&&s!==n&&ia(t,s,{get:()=>e[s],enumerable:!(r=jv(e,s))||r.enumerable});return t};var vu=(t,e,n)=>(n=t!=null?$v(Hv(t)):{},Xv(e||!t||!t.__esModule?ia(n,"default",{value:t,enumerable:!0}):n,t));function wu(t,e,n){let r=new Set(["core",...t.getBuiltinProviders().map(l=>l.name)]),s=l=>(r.has(l)?"Built-in: ":"Module: ")+l,i=new Map;for(let l of t.getFunctionDocs())(l.category==="Language Constructs"||!t.scanAndCheck(l.name+";").diagnostics.some(c=>c.severity==="error"))&&i.set(l.name,l);for(let l of t.getRegisteredFunctions()){let c=t.getFunctionMetadata(l),d=typeof c.arity=="number"?{min:c.arity,max:c.arity}:c.arity;i.set(l,t.getFunctionDoc(l)??{name:l,module:"core",category:"Core Functions",description:c.description??"Core function",signature:l+"("+Array.from({length:d?.min??0},(u,m)=>"arg"+(m+1)).join(", ")+(d?.max===void 0?", ...":"")+")"})}for(let l of e)for(let c of l.declarations.functions)i.set(c.name,c.doc??{name:c.name,module:l.name,category:"Host Functions",description:"Declared by "+l.name,signature:c.name+"("+(c.params?.map(d=>d.name).join(", ")??"...")+")"});if(n==="conditional")return`condition ? trueExpr : falseExpr
1
+ var Wv=Object.create;var la=Object.defineProperty;var Xv=Object.getOwnPropertyDescriptor;var qv=Object.getOwnPropertyNames;var Gv=Object.getPrototypeOf,Jv=Object.prototype.hasOwnProperty;var O=(t,e)=>()=>(t&&(e=t(t=0)),e);var Kv=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Ls=(t,e)=>{for(var n in e)la(t,n,{get:e[n],enumerable:!0})},Vv=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of qv(e))!Jv.call(t,s)&&s!==n&&la(t,s,{get:()=>e[s],enumerable:!(r=Xv(e,s))||r.enumerable});return t};var Su=(t,e,n)=>(n=t!=null?Wv(Gv(t)):{},Vv(e||!t||!t.__esModule?la(n,"default",{value:t,enumerable:!0}):n,t));function ku(t,e,n){let r=new Set(["core",...t.getBuiltinProviders().map(l=>l.name)]),s=l=>(r.has(l)?"Built-in: ":"Module: ")+l,i=new Map;for(let l of t.getFunctionDocs())(l.category==="Language Constructs"||!t.scanAndCheck(l.name+";").diagnostics.some(c=>c.severity==="error"))&&i.set(l.name,l);for(let l of t.getRegisteredFunctions()){let c=t.getFunctionMetadata(l),d=typeof c.arity=="number"?{min:c.arity,max:c.arity}:c.arity;i.set(l,t.getFunctionDoc(l)??{name:l,module:"core",category:"Core Functions",description:c.description??"Core function",signature:l+"("+Array.from({length:d?.min??0},(u,m)=>"arg"+(m+1)).join(", ")+(d?.max===void 0?", ...":"")+")"})}for(let l of e)for(let c of l.declarations.functions)i.set(c.name,c.doc??{name:c.name,module:l.name,category:"Host Functions",description:"Declared by "+l.name,signature:c.name+"("+(c.params?.map(d=>d.name).join(", ")??"...")+")"});if(n==="conditional")return`condition ? trueExpr : falseExpr
2
2
  Precedence below || and above assignment; only the selected arm is evaluated.
3
3
  `;if(n==="topics")return`Topics: conditional, regex
4
4
  `;if(n==="regex")return`Topic: Regular expressions
@@ -21,13 +21,13 @@ ${l.parameters?.length?`Parameters:
21
21
  `}}return a+`
22
22
  Topics: conditional, regex
23
23
  Use help <function|built-in|topic> for details.
24
- `}var Tu=O(()=>{"use strict"});function bu(t,e){return new Error("Invalid template reference "+JSON.stringify(t)+" at offset "+e+"; use a simple name, PROPS.path or ARGV[n]. Assign a temporary variable first and pass it in vars.")}function aa(t){if(typeof t!="string")throw new Error("expand: text must be a string");let e=[],n=0;for(;n<t.length;){let r=t.indexOf("${",n);if(r<0){e.push(t.slice(n));break}if(r>n&&t[r-1]==="$"){e.push(t.slice(n,r-1),"${"),n=r+2;continue}e.push(t.slice(n,r));let s=t.indexOf("}",r+2);if(s<0)throw bu(t.slice(r+2),r);let i=t.slice(r+2,s),o=Gv.exec(i),a=Jv.exec(i);if(o)e.push({kind:"property",name:i,key:o[1],offset:r});else if(a&&Number.isSafeInteger(Number(a[1])))e.push({kind:"argument",name:i,index:Number(a[1]),offset:r});else if(qv.test(i)&&i!=="PROPS"&&i!=="ARGV")e.push({kind:"variable",name:i,offset:r});else throw bu(i,r);n=s+1}return e}function Ns(t,e,n=r=>r!==null&&typeof r=="object"?JSON.stringify(r):String(r)){let r=[],s=new Map;for(let i of aa(t)){if(typeof i=="string"){r.push(i);continue}let o;try{o=e(i)}catch(a){s.set(i.name,a instanceof Error?a.message:String(a));continue}if(o===void 0){s.set(i.name,"not defined");continue}r.push(n(o))}if(s.size)throw new Error("expand: missing references: "+[...s].map(([i,o])=>i+" ("+o+")").join("; "));return r.join("")}var oa,qv,Gv,Jv,la=O(()=>{oa="[_a-zA-Z][_a-zA-Z0-9]*",qv=new RegExp("^"+oa+"$"),Gv=new RegExp("^PROPS\\.("+oa+"(?:\\."+oa+")*)$"),Jv=/^ARGV\[(0|[1-9][0-9]*)\]$/});import{spawn as Su,spawnSync as ua}from"node:child_process";import{randomUUID as Kv,createHash as Vv}from"node:crypto";import{tmpdir as zv}from"node:os";import*as $ from"node:fs";import*as le from"node:path";import*as Nu from"node:readline";import{fileURLToPath as ka}from"node:url";function Yv(t,e){let n=t.file&&t.file!=="<main>"?`${t.file}:${t.line}:${t.column}`:`${t.line}:${t.column}`,r=e;if(t.file&&(!r||r&&t.file!=="<main>"&&t.file!=="<std>"))try{$.existsSync(t.file)&&$.statSync(t.file).isFile()&&(r=$.readFileSync(t.file,"utf-8"))}catch{}if(!r)return`[${t.severity.toUpperCase()} at ${n}] ${t.message}`;let s=r.split(`
24
+ `}var Ru=O(()=>{"use strict"});function Iu(t,e){return new Error("Invalid template reference "+JSON.stringify(t)+" at offset "+e+"; use a simple name, PROPS.path or ARGV[n]. Assign a temporary variable first and pass it in vars.")}function da(t){if(typeof t!="string")throw new Error("expand: text must be a string");let e=[],n=0;for(;n<t.length;){let r=t.indexOf("${",n);if(r<0){e.push(t.slice(n));break}if(r>n&&t[r-1]==="$"){e.push(t.slice(n,r-1),"${"),n=r+2;continue}e.push(t.slice(n,r));let s=t.indexOf("}",r+2);if(s<0)throw Iu(t.slice(r+2),r);let i=t.slice(r+2,s),o=Yv.exec(i),a=Qv.exec(i);if(o)e.push({kind:"property",name:i,key:o[1],offset:r});else if(a&&Number.isSafeInteger(Number(a[1])))e.push({kind:"argument",name:i,index:Number(a[1]),offset:r});else if(zv.test(i)&&i!=="PROPS"&&i!=="ARGV")e.push({kind:"variable",name:i,offset:r});else throw Iu(i,r);n=s+1}return e}function Ms(t,e,n=r=>r!==null&&typeof r=="object"?JSON.stringify(r):String(r)){let r=[],s=new Map;for(let i of da(t)){if(typeof i=="string"){r.push(i);continue}let o;try{o=e(i)}catch(a){s.set(i.name,a instanceof Error?a.message:String(a));continue}if(o===void 0){s.set(i.name,"not defined");continue}r.push(n(o))}if(s.size)throw new Error("expand: missing references: "+[...s].map(([i,o])=>i+" ("+o+")").join("; "));return r.join("")}var ca,zv,Yv,Qv,ua=O(()=>{ca="[_a-zA-Z][_a-zA-Z0-9]*",zv=new RegExp("^"+ca+"$"),Yv=new RegExp("^PROPS\\.("+ca+"(?:\\."+ca+")*)$"),Qv=/^ARGV\[(0|[1-9][0-9]*)\]$/});import{spawn as xu,spawnSync as fa}from"node:child_process";import{randomUUID as Zv,createHash as ew}from"node:crypto";import{tmpdir as tw}from"node:os";import*as $ from"node:fs";import*as le from"node:path";import*as Du from"node:readline";import{fileURLToPath as Aa}from"node:url";function nw(t,e){let n=t.file&&t.file!=="<main>"?`${t.file}:${t.line}:${t.column}`:`${t.line}:${t.column}`,r=e;if(t.file&&(!r||r&&t.file!=="<main>"&&t.file!=="<std>"))try{$.existsSync(t.file)&&$.statSync(t.file).isFile()&&(r=$.readFileSync(t.file,"utf-8"))}catch{}if(!r)return`[${t.severity.toUpperCase()} at ${n}] ${t.message}`;let s=r.split(`
25
25
  `),i=String(t.line),o=t.line-1,a=s[o]??"",l=" | ",c=` ${i.padStart(4," ")} | `,d=" ".repeat(Math.max(0,t.column-1));return`[${t.severity.toUpperCase()} at ${n}] ${t.message}
26
26
  `+l+`
27
27
  ${c}${a}
28
- ${l}${d}^`}function Ou(t){if(typeof t!="string"||t.length!==1||/["\r\n]/.test(t))throw new Error("CSV delimiter must be one character other than a quote or newline")}function De(t,e){return t&&typeof t=="object"&&fa.has(t)?fa.get(t)(String(e)):t!=null&&Object.hasOwn(t,e)?t[e]:void 0}function Be(t,e,n){String(e)==="__proto__"?Object.defineProperty(t,e,{value:n,writable:!0,enumerable:!0,configurable:!0}):t[e]=n}function Lu(t,e,n){if(t==null||t===""||t===!1||Array.isArray(t)&&t.length===0)throw n?.(String(e)),new mt(2);return t}function _r(t,e){if(t==null)return;let n=Array.isArray(e)?e:String(e).replace(/\[(\w+)\]/g,".$1").split(".").filter(Boolean),r=t;for(let s of n){if(r==null||typeof r!="object")return;r=De(r,s)}return r}function Mu(t){if(typeof t!="string"||!t.trim())throw new Error("http_get() requires a non-empty URL string");let e;try{e=new URL(t)}catch{throw new Error("http_get() requires a valid HTTP(S) URL")}if(e.protocol!=="http:"&&e.protocol!=="https:"||e.username||e.password)throw new Error("http_get() only permits HTTP(S) URLs without embedded credentials");let n=`
28
+ ${l}${d}^`}function Fu(t){if(typeof t!="string"||t.length!==1||/["\r\n]/.test(t))throw new Error("CSV delimiter must be one character other than a quote or newline")}function De(t,e){return t&&typeof t=="object"&&_a.has(t)?_a.get(t)(String(e)):t!=null&&Object.hasOwn(t,e)?t[e]:void 0}function Be(t,e,n){String(e)==="__proto__"?Object.defineProperty(t,e,{value:n,writable:!0,enumerable:!0,configurable:!0}):t[e]=n}function $u(t,e,n){if(t==null||t===""||t===!1||Array.isArray(t)&&t.length===0)throw n?.(String(e)),new pt(2);return t}function vr(t,e){if(t==null)return;let n=Array.isArray(e)?e:String(e).replace(/\[(\w+)\]/g,".$1").split(".").filter(Boolean),r=t;for(let s of n){if(r==null||typeof r!="object")return;r=De(r,s)}return r}function ju(t){if(typeof t!="string"||!t.trim())throw new Error("http_get() requires a non-empty URL string");let e;try{e=new URL(t)}catch{throw new Error("http_get() requires a valid HTTP(S) URL")}if(e.protocol!=="http:"&&e.protocol!=="https:"||e.username||e.password)throw new Error("http_get() only permits HTTP(S) URLs without embedded credentials");let n=`
29
29
  const target = process.argv[1];
30
- const maxBytes = ${ma};
30
+ const maxBytes = ${ga};
31
31
  const controller = new AbortController();
32
32
  const timer = setTimeout(() => controller.abort(), 30000);
33
33
  try {
@@ -53,23 +53,23 @@ try {
53
53
  } finally {
54
54
  clearTimeout(timer);
55
55
  }
56
- `,r=ua(process.execPath,["--input-type=module","-e",n,t],{encoding:"utf8",shell:!1,timeout:35e3,maxBuffer:ma+4096,windowsHide:!0});if(r.error)throw r.error.code==="ETIMEDOUT"?new Error("http_get() request timed out"):new Error(`http_get() failed: ${r.error.message}`);if(r.status!==0)throw new Error(`http_get() failed: ${String(r.stderr||"child process exited")}`.trim());return String(r.stdout||"")}async function Qv(t){if(typeof t!="string"||!t.trim())throw new Error("http_get() requires a non-empty URL string");let e;try{e=new URL(t)}catch{throw new Error("http_get() requires a valid HTTP(S) URL")}if(e.protocol!=="http:"&&e.protocol!=="https:"||e.username||e.password)throw new Error("http_get() only permits HTTP(S) URLs without embedded credentials");let n=new AbortController,r=setTimeout(()=>n.abort(),3e4),s;try{let i=await fetch(e.toString(),{method:"GET",redirect:"follow",signal:n.signal});if(!i.ok)throw n.abort(),new Error("HTTP "+i.status+" "+i.statusText);s=i.body?.getReader();let o=[],a=0;if(s)for(;;){let l=await s.read();if(l.done)break;if(a+=l.value.byteLength,a>ma)throw await s.cancel().catch(()=>{}),n.abort(),new Error("response exceeds 10 MiB limit");o.push(l.value)}return Buffer.concat(o).toString("utf-8")}catch(i){if(n.abort(),s)try{await s.cancel().catch(()=>{})}catch{}throw i.name==="AbortError"?new Error("http_get() request timed out"):new Error(`http_get() failed: ${i?.message||String(i)}`)}finally{clearTimeout(r)}}function Fs(t,e,n,r=null,s=!1,i=0,o=null){return{stdout:t,stderr:e,code:n,signal:r,timed_out:s,duration_ms:i,pid:o}}function Pu(t){let e=String(t);return e.length>0&&/^[a-zA-Z0-9_./@=-]+$/.test(e)?e:"'"+e.replace(/'/g,"'\\''")+"'"}function Du(t,e=6e4){if(!Number.isSafeInteger(e)||e<0)throw new Error("system() timeout must be a non-negative safe integer in milliseconds");let n=performance.now(),r;if(Array.isArray(t)){if(t.length===0)throw new Error("system() argv array must not be empty");let d=String(t[0]),u=t.slice(1).map(String);r=ua(d,u,{shell:!1,encoding:"utf-8",timeout:e>0?e:void 0,maxBuffer:10*1024*1024,killSignal:"SIGKILL"})}else r=ua(t,{shell:!0,encoding:"utf-8",timeout:e>0?e:void 0,maxBuffer:10*1024*1024,killSignal:"SIGKILL"});let s=Math.max(0,Math.round(performance.now()-n)),i=typeof r.pid=="number"?r.pid:null;if(r.error){if(r.error.code==="ETIMEDOUT"){let d=r.stdout!=null?String(r.stdout):"",u=r.stderr!=null?String(r.stderr):"";return Fs(d,u,null,r.signal||"SIGKILL",!0,s,i)}throw r.error}let o=r.stdout!=null?String(r.stdout):"",a=r.stderr!=null?String(r.stderr):"",l=r.status!==null?r.status:null,c=r.signal!==null?String(r.signal):null;return Fs(o,a,l,c,!1,s,i)}function Fu(t,e=6e4){return new Promise((n,r)=>{if(!Number.isSafeInteger(e)||e<0){r(new Error("system() timeout must be a non-negative safe integer in milliseconds"));return}let s=performance.now();try{let i=process.platform!=="win32",o;if(Array.isArray(t)){if(t.length===0){r(new Error("system() argv array must not be empty"));return}let g=String(t[0]),E=t.slice(1).map(String);o=Su(g,E,{shell:!1,detached:i,stdio:["ignore","pipe","pipe"]})}else o=Su(t,{shell:!0,detached:i,stdio:["ignore","pipe","pipe"]});Ds.add(o);let a="",l="",c=null,d=null,u=0,m=!1,p=!1,h,_=!1,y,f=()=>{if(_)return;_=!0,Ds.delete(o),y&&clearTimeout(y);try{o.stdout?.destroy(),o.stderr?.destroy()}catch{}let g=Math.max(0,Math.round(performance.now()-s)),E=typeof o.pid=="number"?o.pid:null;if(h){r(h);return}if(p){n(Fs(a,l,null,d||"SIGKILL",!0,g,E));return}n(Fs(a,l,c,d,!1,g,E))};e>0&&(y=setTimeout(()=>{p=!0,d="SIGKILL";try{if(i&&o.pid)try{process.kill(-o.pid,"SIGKILL")}catch{o.kill("SIGKILL")}else o.kill("SIGKILL")}catch{}f()},e));let w=10*1024*1024;o.stdout?.setEncoding("utf-8"),o.stderr?.setEncoding("utf-8"),o.stdout?.on("data",g=>{let E=Buffer.byteLength(g,"utf-8");if(u+E>w){if(!m){m=!0;try{if(i&&o.pid)try{process.kill(-o.pid,"SIGKILL")}catch{o.kill("SIGKILL")}else o.kill("SIGKILL")}catch{}l+=(l&&!l.endsWith(`
56
+ `,r=fa(process.execPath,["--input-type=module","-e",n,t],{encoding:"utf8",shell:!1,timeout:35e3,maxBuffer:ga+4096,windowsHide:!0});if(r.error)throw r.error.code==="ETIMEDOUT"?new Error("http_get() request timed out"):new Error(`http_get() failed: ${r.error.message}`);if(r.status!==0)throw new Error(`http_get() failed: ${String(r.stderr||"child process exited")}`.trim());return String(r.stdout||"")}async function rw(t){if(typeof t!="string"||!t.trim())throw new Error("http_get() requires a non-empty URL string");let e;try{e=new URL(t)}catch{throw new Error("http_get() requires a valid HTTP(S) URL")}if(e.protocol!=="http:"&&e.protocol!=="https:"||e.username||e.password)throw new Error("http_get() only permits HTTP(S) URLs without embedded credentials");let n=new AbortController,r=setTimeout(()=>n.abort(),3e4),s;try{let i=await fetch(e.toString(),{method:"GET",redirect:"follow",signal:n.signal});if(!i.ok)throw n.abort(),new Error("HTTP "+i.status+" "+i.statusText);s=i.body?.getReader();let o=[],a=0;if(s)for(;;){let l=await s.read();if(l.done)break;if(a+=l.value.byteLength,a>ga)throw await s.cancel().catch(()=>{}),n.abort(),new Error("response exceeds 10 MiB limit");o.push(l.value)}return Buffer.concat(o).toString("utf-8")}catch(i){if(n.abort(),s)try{await s.cancel().catch(()=>{})}catch{}throw i.name==="AbortError"?new Error("http_get() request timed out"):new Error(`http_get() failed: ${i?.message||String(i)}`)}finally{clearTimeout(r)}}function js(t,e,n,r=null,s=!1,i=0,o=null){return{stdout:t,stderr:e,code:n,signal:r,timed_out:s,duration_ms:i,pid:o}}function Uu(t){let e=String(t);return e.length>0&&/^[a-zA-Z0-9_./@=-]+$/.test(e)?e:"'"+e.replace(/'/g,"'\\''")+"'"}function Hu(t,e=6e4){if(!Number.isSafeInteger(e)||e<0)throw new Error("system() timeout must be a non-negative safe integer in milliseconds");let n=performance.now(),r;if(Array.isArray(t)){if(t.length===0)throw new Error("system() argv array must not be empty");let d=String(t[0]),u=t.slice(1).map(String);r=fa(d,u,{shell:!1,encoding:"utf-8",timeout:e>0?e:void 0,maxBuffer:10*1024*1024,killSignal:"SIGKILL"})}else r=fa(t,{shell:!0,encoding:"utf-8",timeout:e>0?e:void 0,maxBuffer:10*1024*1024,killSignal:"SIGKILL"});let s=Math.max(0,Math.round(performance.now()-n)),i=typeof r.pid=="number"?r.pid:null;if(r.error){if(r.error.code==="ETIMEDOUT"){let d=r.stdout!=null?String(r.stdout):"",u=r.stderr!=null?String(r.stderr):"";return js(d,u,null,r.signal||"SIGKILL",!0,s,i)}throw r.error}let o=r.stdout!=null?String(r.stdout):"",a=r.stderr!=null?String(r.stderr):"",l=r.status!==null?r.status:null,c=r.signal!==null?String(r.signal):null;return js(o,a,l,c,!1,s,i)}function Bu(t,e=6e4){return new Promise((n,r)=>{if(!Number.isSafeInteger(e)||e<0){r(new Error("system() timeout must be a non-negative safe integer in milliseconds"));return}let s=performance.now();try{let i=process.platform!=="win32",o;if(Array.isArray(t)){if(t.length===0){r(new Error("system() argv array must not be empty"));return}let g=String(t[0]),E=t.slice(1).map(String);o=xu(g,E,{shell:!1,detached:i,stdio:["ignore","pipe","pipe"]})}else o=xu(t,{shell:!0,detached:i,stdio:["ignore","pipe","pipe"]});$s.add(o);let a="",l="",c=null,d=null,u=0,m=!1,p=!1,h,_=!1,y,f=()=>{if(_)return;_=!0,$s.delete(o),y&&clearTimeout(y);try{o.stdout?.destroy(),o.stderr?.destroy()}catch{}let g=Math.max(0,Math.round(performance.now()-s)),E=typeof o.pid=="number"?o.pid:null;if(h){r(h);return}if(p){n(js(a,l,null,d||"SIGKILL",!0,g,E));return}n(js(a,l,c,d,!1,g,E))};e>0&&(y=setTimeout(()=>{p=!0,d="SIGKILL";try{if(i&&o.pid)try{process.kill(-o.pid,"SIGKILL")}catch{o.kill("SIGKILL")}else o.kill("SIGKILL")}catch{}f()},e));let w=10*1024*1024;o.stdout?.setEncoding("utf-8"),o.stderr?.setEncoding("utf-8"),o.stdout?.on("data",g=>{let E=Buffer.byteLength(g,"utf-8");if(u+E>w){if(!m){m=!0;try{if(i&&o.pid)try{process.kill(-o.pid,"SIGKILL")}catch{o.kill("SIGKILL")}else o.kill("SIGKILL")}catch{}l+=(l&&!l.endsWith(`
57
57
  `)?`
58
58
  `:"")+"system() output exceeds 10 MiB limit",h=new Error("system() output exceeds 10 MiB limit"),f()}return}u+=E,a+=g}),o.stderr?.on("data",g=>{let E=Buffer.byteLength(g,"utf-8");if(u+E>w){if(!m){m=!0;try{if(i&&o.pid)try{process.kill(-o.pid,"SIGKILL")}catch{o.kill("SIGKILL")}else o.kill("SIGKILL")}catch{}l+=(l&&!l.endsWith(`
59
59
  `)?`
60
- `:"")+"system() output exceeds 10 MiB limit",h=new Error("system() output exceeds 10 MiB limit"),f()}return}u+=E,l+=g}),o.on("error",g=>{h||(h=g)}),o.on("close",(g,E)=>{g!==null?(c=g,d=null):(c=null,d=E?String(E):null),f()})}catch(i){r(i instanceof Error?i:new Error(String(i)))}})}function Zv(t,e=null){if(typeof t!="string")return t??e;let n=t.trim();if(n.length===0)return e;try{return JSON.parse(n)}catch{}let r=n.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);if(r&&r[1])try{return JSON.parse(r[1].trim())}catch{}let s=n.indexOf("{"),i=n.lastIndexOf("}");if(s!==-1&&i>s)try{return JSON.parse(n.slice(s,i+1))}catch{}let o=n.indexOf("["),a=n.lastIndexOf("]");if(o!==-1&&a>o)try{return JSON.parse(n.slice(o,a+1))}catch{}return e}function $u(t){if(typeof process>"u"||!process.stdin||!process.stdin.isTTY)return null;t!=null&&process.stdout&&typeof process.stdout.write=="function"&&process.stdout.write(String(t));try{let e=Buffer.alloc(1024),n="";for(;;){let r=0;try{r=$.readSync(0,e,0,1,null)}catch{return n.length>0?n:null}if(r===0)return n.length>0?n:null;let s=e.toString("utf-8",0,r);if(s===`
61
- `)return n.endsWith("\r")&&(n=n.slice(0,-1)),n;n+=s}}catch{return null}}function Gs(t,e=typeof process<"u"?process.stdin:null,n=typeof process<"u"?process.stdout:null){return new Promise(r=>{if(!e||typeof e.on!="function"){r(null);return}if(e.destroyed||e.readableEnded){r(null);return}if(e.isTTY===!1||typeof process<"u"&&e===process.stdin&&!process.stdin.isTTY){r(null);return}t!=null&&n&&typeof n.write=="function"&&n.write(String(t));let s=Nu.createInterface({input:e,output:n,terminal:!!e.isTTY}),i=!1,o=()=>{s.close()};s.question("",a=>{i||(i=!0,o(),r(a))}),s.on("close",()=>{i||(i=!0,r(null))}),s.on("error",()=>{i||(i=!0,o(),r(null))})})}async function ju(t,e){let n=le.resolve(String(e.dir));$.mkdirSync(n,{recursive:!0});let r=e.sessionId??`prompt_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,s=r.replace(/[/\\?%*:|"<>]/g,"_"),i=le.join(n,`${s}.out`),o=le.join(n,`${s}.out_state`),a=le.join(n,`${s}.in`),l=le.join(n,`${s}.in_state`);try{$.existsSync(l)&&$.unlinkSync(l)}catch{}try{$.existsSync(a)&&$.unlinkSync(a)}catch{}$.writeFileSync(i,t!=null?String(t):"","utf-8"),$.writeFileSync(o,JSON.stringify({sessionId:r,status:"waiting",timestamp:Date.now()})+`
60
+ `:"")+"system() output exceeds 10 MiB limit",h=new Error("system() output exceeds 10 MiB limit"),f()}return}u+=E,l+=g}),o.on("error",g=>{h||(h=g)}),o.on("close",(g,E)=>{g!==null?(c=g,d=null):(c=null,d=E?String(E):null),f()})}catch(i){r(i instanceof Error?i:new Error(String(i)))}})}function sw(t,e=null){if(typeof t!="string")return t??e;let n=t.trim();if(n.length===0)return e;try{return JSON.parse(n)}catch{}let r=n.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);if(r&&r[1])try{return JSON.parse(r[1].trim())}catch{}let s=n.indexOf("{"),i=n.lastIndexOf("}");if(s!==-1&&i>s)try{return JSON.parse(n.slice(s,i+1))}catch{}let o=n.indexOf("["),a=n.lastIndexOf("]");if(o!==-1&&a>o)try{return JSON.parse(n.slice(o,a+1))}catch{}return e}function Wu(t){if(typeof process>"u"||!process.stdin||!process.stdin.isTTY)return null;t!=null&&process.stdout&&typeof process.stdout.write=="function"&&process.stdout.write(String(t));try{let e=Buffer.alloc(1024),n="";for(;;){let r=0;try{r=$.readSync(0,e,0,1,null)}catch{return n.length>0?n:null}if(r===0)return n.length>0?n:null;let s=e.toString("utf-8",0,r);if(s===`
61
+ `)return n.endsWith("\r")&&(n=n.slice(0,-1)),n;n+=s}}catch{return null}}function Vs(t,e=typeof process<"u"?process.stdin:null,n=typeof process<"u"?process.stdout:null){return new Promise(r=>{if(!e||typeof e.on!="function"){r(null);return}if(e.destroyed||e.readableEnded){r(null);return}if(e.isTTY===!1||typeof process<"u"&&e===process.stdin&&!process.stdin.isTTY){r(null);return}t!=null&&n&&typeof n.write=="function"&&n.write(String(t));let s=Du.createInterface({input:e,output:n,terminal:!!e.isTTY}),i=!1,o=()=>{s.close()};s.question("",a=>{i||(i=!0,o(),r(a))}),s.on("close",()=>{i||(i=!0,r(null))}),s.on("error",()=>{i||(i=!0,o(),r(null))})})}async function Xu(t,e){let n=le.resolve(String(e.dir));$.mkdirSync(n,{recursive:!0});let r=e.sessionId??`prompt_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,s=r.replace(/[/\\?%*:|"<>]/g,"_"),i=le.join(n,`${s}.out`),o=le.join(n,`${s}.out_state`),a=le.join(n,`${s}.in`),l=le.join(n,`${s}.in_state`);try{$.existsSync(l)&&$.unlinkSync(l)}catch{}try{$.existsSync(a)&&$.unlinkSync(a)}catch{}$.writeFileSync(i,t!=null?String(t):"","utf-8"),$.writeFileSync(o,JSON.stringify({sessionId:r,status:"waiting",timestamp:Date.now()})+`
62
62
  `,"utf-8");let c=typeof e.timeoutMs=="number"&&Number.isFinite(e.timeoutMs)&&e.timeoutMs>0?e.timeoutMs:0,d=typeof e.pollIntervalMs=="number"&&Number.isFinite(e.pollIntervalMs)&&e.pollIntervalMs>0?e.pollIntervalMs:200,u=`[prompt_human] Waiting for marker: ${l} (session: ${r})${c>0?` [timeout: ${c}ms]`:""}
63
63
  `;e.onWaiting?e.onWaiting(u):typeof process<"u"&&process.stderr&&process.stderr.write(u);let m=Date.now(),p=m;for(;!$.existsSync(l);){if(c>0&&Date.now()-m>=c){try{$.existsSync(o)&&$.unlinkSync(o)}catch{}return null}if(Date.now()-p>=3e4){p=Date.now();let _=`[prompt_human] Still waiting for ${l} (session: ${r})...
64
- `;e.onWaiting?e.onWaiting(_):typeof process<"u"&&process.stderr&&process.stderr.write(_)}await new Promise(_=>setTimeout(_,d))}let h="";if($.existsSync(a))try{h=$.readFileSync(a,"utf-8")}catch{}if(!h.trim()&&$.existsSync(l))try{h=$.readFileSync(l,"utf-8")}catch{}try{$.existsSync(l)&&$.unlinkSync(l)}catch{}try{$.existsSync(a)&&$.unlinkSync(a)}catch{}try{$.existsSync(o)&&$.unlinkSync(o)}catch{}try{$.existsSync(i)&&$.unlinkSync(i)}catch{}return h.replace(/\r?\n$/u,"")}function ku(t,e=!0,n=","){Ou(n);let r=[],s=[],i="",o=!1,a=!1,l=!1;for(let u=0;u<t.length;u++){let m=t[u],p=t[u+1];if(l=!0,o)m==='"'?p==='"'?(i+='"',u++):(o=!1,a=!0):i+=m;else{if(a&&m!==n&&m!=="\r"&&m!==`
64
+ `;e.onWaiting?e.onWaiting(_):typeof process<"u"&&process.stderr&&process.stderr.write(_)}await new Promise(_=>setTimeout(_,d))}let h="";if($.existsSync(a))try{h=$.readFileSync(a,"utf-8")}catch{}if(!h.trim()&&$.existsSync(l))try{h=$.readFileSync(l,"utf-8")}catch{}try{$.existsSync(l)&&$.unlinkSync(l)}catch{}try{$.existsSync(a)&&$.unlinkSync(a)}catch{}try{$.existsSync(o)&&$.unlinkSync(o)}catch{}try{$.existsSync(i)&&$.unlinkSync(i)}catch{}return h.replace(/\r?\n$/u,"")}function Au(t,e=!0,n=","){Fu(n);let r=[],s=[],i="",o=!1,a=!1,l=!1;for(let u=0;u<t.length;u++){let m=t[u],p=t[u+1];if(l=!0,o)m==='"'?p==='"'?(i+='"',u++):(o=!1,a=!0):i+=m;else{if(a&&m!==n&&m!=="\r"&&m!==`
65
65
  `)throw new Error("Invalid CSV: unexpected character after closing quote");if(m==='"'){if(i.length>0)throw new Error("Invalid CSV: quote inside unquoted field");o=!0}else m===n?(a=!1,s.push(i),i=""):m==="\r"?(p===`
66
66
  `&&u++,s.push(i),r.push(s),s=[],i="",a=!1,l=!1):m===`
67
- `?(s.push(i),r.push(s),s=[],i="",a=!1,l=!1):i+=m}}if(o)throw new Error("Invalid CSV: unterminated quoted field");if(l&&(s.push(i),r.push(s)),!e)return r.map(u=>u.map(Ru));if(r.length===0)return[];let c=r[0].map(u=>u.trim()),d=[];for(let u=1;u<r.length;u++){let m=r[u],p={};for(let h=0;h<c.length;h++)Be(p,c[h],h<m.length?Ru(m[h]):null);d.push(p)}return d}function Ru(t){let e=t.trim();if(e==="")return"";if(/^-?\d+$/.test(e)){let n=Number(e);if(!Number.isNaN(n))return n}if(/^-?\d+\.\d+$/.test(e)){let n=Number(e);if(!Number.isNaN(n))return n}return e.toLowerCase()==="true"?!0:e.toLowerCase()==="false"?!1:e.toLowerCase()==="null"?null:t}function Iu(t,e=","){if(Ou(e),!Array.isArray(t)||t.length===0)return"";let n=t[0];if(Array.isArray(n))return t.map(r=>r.map(s=>Ls(s,e)).join(e)).join(`
68
- `);if(typeof n=="object"&&n!==null){let r=Object.keys(n),s=r.map(o=>Ls(o,e)).join(e),i=t.map(o=>r.map(a=>Ls(De(o,a)??"",e)).join(e));return[s,...i].join(`
69
- `)}return t.map(r=>Ls(r,e)).join(`
70
- `)}function Ls(t,e){let n=t==null?"":String(t);return n===""||n.includes(e)||n.includes('"')||n.includes(`
71
- `)||n.includes("\r")?`"${n.replaceAll('"','""')}"`:n}function Er(t,e,n="native"){if(typeof e!="string")throw new Error("Regex flags must be a string");let r=new Set;for(let s of e){if(!"dgimsuvy".includes(s))throw new Error(`Unsupported regex flag '${s}'`);if(r.has(s))throw new Error(`Duplicate regex flag '${s}'`);r.add(s)}if(r.has("u")&&r.has("v"))throw new Error("Regex flags cannot combine 'u' and 'v' Unicode modes");if(n!=="native"&&r.has("y"))throw new Error("Sticky regex flag 'y' is incompatible with capture helpers that search anywhere");try{return new RegExp(t,n==="all"&&!r.has("g")?e+"g":e)}catch(s){throw new Error(`Invalid regex pattern: ${s instanceof Error?s.message:String(s)}`)}}function Uu(t){return Array.from(t,e=>e===void 0?null:e)}function ew(t,e,n=""){let r=Er(e,n,"first").exec(String(t));return r===null?null:Uu(r)}function tw(t,e,n=""){let r=Er(e,n,"all"),s=String(t),i=n.includes("u")||n.includes("v"),o=[],a;for(;(a=r.exec(s))!==null;)if(o.push(Uu(a)),a[0]===""){let l=r.lastIndex;if(l>=s.length)break;let c=s.charCodeAt(l),d=s.charCodeAt(l+1),u=i&&c>=55296&&c<=56319&&d>=56320&&d<=57343?2:1;r.lastIndex=l+u}return o}function xu(t,e){try{if(Array.isArray(t))return Array.from({length:t.length},(r,s)=>t[s]);if(typeof t=="string")return Array.from(t);if(t!==null&&typeof t=="object"&&(Object.getPrototypeOf(t)===Object.prototype||Object.getPrototypeOf(t)===null))return Object.keys(t);let n=t===null?"null":t instanceof Date?"Date":typeof t;throw new M(`Cannot iterate value of type ${n}; expected list, map or string`,e.line,e.column,"RUNTIME",e.file)}catch(n){throw n instanceof M?n:new M(`Cannot snapshot iterable: ${n instanceof Error?n.message:String(n)}`,e.line,e.column,"RUNTIME",e.file)}}function pa(t,e){if(!(!t||typeof t!="object")){"line"in t&&"column"in t&&!t.file&&(t.file=e);for(let n of Object.keys(t)){let r=t[n];if(Array.isArray(r))for(let s of r)pa(s,e);else r&&typeof r=="object"&&pa(r,e)}}}function vr(t,e="Call to undefined function"){let n=`${e} '${t}'`;if(!Object.hasOwn(Us,t))return n;let r=n+`; did you mean '${Us[t]}'?`;return t==="json"?r+" Use json_stringify for serialization.":t==="count"?r+" Use count_matches for substring occurrences.":t==="parseInt"||t==="parseFloat"?r+" num uses whole-value Number conversion; it does not provide prefix parsing or integer truncation.":r}function rw(){if(!ca){let e=new js(nw,"<std>").tokenize(),r=new Hs(e,"<std>").parse();for(let s of r.statements)s.kind==="FunctionDeclStmt"&&(s.isStdlib=!0);ca=r}return{kind:"Program",statements:[...ca.statements],line:1,column:1,file:"<std>"}}function yr(t){return t&&typeof t=="object"&&wr.has(t)?wr.get(t)():t}function ga(t){if(typeof t!="string"||!/^[_a-zA-Z]\w*(?:\.[_a-zA-Z]\w*)*$/.test(t))throw Error(`Invalid property key '${String(t)}'; use dotted identifier segments`);return t}function ha(t,e){return e.find(n=>{let r=n.lastIndexOf(".");return n===t||r>=0&&t===n.slice(0,r+1)+n.slice(r+1).toLowerCase()})??t}function Ht(t,e,n=new Set){if(t instanceof Date)return t.toISOString();if(t===null||typeof t=="string"||typeof t=="boolean"||typeof t=="number"&&Number.isFinite(t))return t;if(t&&typeof t=="object"){if(!Array.isArray(t)&&![Object.prototype,null].includes(Object.getPrototypeOf(t)))throw Error(`Property '${e}' has an unsupported object value`);if(n.has(t))throw Error(`Property '${e}' contains a cycle`);n.add(t);try{if(Array.isArray(t))return t.map((s,i)=>Ht(s,e+"."+i,n));let r={};for(let[s,i]of Object.entries(t))Be(r,s,Ht(i,e?e+"."+s:s,n));return r}finally{n.delete(t)}}throw Error(`Property '${e}' has an unsupported value type: ${typeof t}`)}function Ws(t){if(t.kind==="IdentifierExpr"&&t.name==="PROPS")return"";if(t.kind==="IndexExpr"&&t.index.kind==="LiteralExpr"&&typeof t.index.value=="string"){let e=Ws(t.target);if(e!==void 0)return e?e+"."+t.index.value:t.index.value}}function Js(t){return t.trim().length>0&&!/[\0\r\n]/.test(t)&&!/[\/\\]/.test(t)&&!t.startsWith(".")&&!t.endsWith(".lms")}function sw(t){let e=t instanceof Error&&t.name!=="Error"?`${t.name}: `:"",n=t instanceof Error?t.message:String(t),r=[];for(let i of n.split(/\r?\n/)){if(/^\s*Require stack:\s*$/.test(i))break;/^\s*(?:at\s|-\s)/.test(i)||r.push(i)}let s=r.join(" ").replace(/__lmscript_modules__\.cjs/g,"").replace(/(?:file:\/\/)?(?:[A-Za-z]:)?[\\/][^\s'"<>]+/g,"<module file>").replace(/\s+/g," ").trim();return(e+(s||"module loading failed")).trim()}function Fe(t){if(t?.aborted)throw new Error("Execution aborted")}function Ps(t){return t!==null&&(typeof t=="object"||typeof t=="function")&&typeof t.then=="function"}function _a(t,e,n){if(/^https?:/i.test(t)||/^https?:/i.test(e??"")){let s=/^https?:/i.test(t)?new URL(t):new URL(t,e);if(!["http:","https:"].includes(s.protocol))throw Error("Only http/https module URLs are supported");return s.hash="",s.href}let r=le.resolve(e&&e!=="<main>"&&!e.startsWith("<")?le.dirname(e):n,t);try{return $.realpathSync(r)}catch{return r}}function Hu(t){if(t.kind==="IdentifierExpr")return t.name;if(t.kind==="IndexExpr"&&t.index.kind==="LiteralExpr"&&typeof t.index.value=="string"){let e=Hu(t.target);if(e)return e+"."+t.index.value}}function ya(t){let e=new Set,n=r=>{if(!(!r||typeof r!="object")){r.kind==="AssignExpr"&&e.add(r.target),r.kind==="TupleAssignExpr"&&r.targets.forEach(s=>e.add(s));for(let s of Object.values(r))Array.isArray(s)?s.forEach(n):s&&typeof s=="object"&&n(s)}};for(let r of t.statements)(r.kind==="FunctionDeclStmt"||r.kind==="VarDeclStmt")&&e.add(r.name),r.kind==="TupleVarDeclStmt"&&r.names.forEach(s=>e.add(s)),r.kind==="ExprStmt"&&n(r.expr);return e}function iw(t,e){let n=ya(t),r=(o,a)=>n.has(o)&&!a.locals.has(o)?e+"."+o:o,s=(o,a)=>{if(!o||typeof o!="object")return o;let l={...o};if(o.kind==="IdentifierExpr")return l.name=r(o.name,a),l;if(o.kind==="AssignExpr"||o.kind==="TupleAssignExpr"){l.value=s(o.value,a);let d=(o.kind==="AssignExpr"?[o.target]:o.targets).map(u=>a.fn?(a.locals.add(u),u):r(u,a));return o.kind==="AssignExpr"?l.target=d[0]:l.targets=d,l}o.kind==="CallExpr"&&(l.callee=n.has(o.callee)&&!a.locals.has(o.callee)?e+"."+o.callee:o.callee);for(let[c,d]of Object.entries(o))c!=="callee"&&(Array.isArray(d)?l[c]=d.map(u=>u&&typeof u=="object"?s(u,a):u):d&&typeof d=="object"&&(l[c]=s(d,a)));return l},i=(o,a)=>{let l={...o};if(o.kind==="FunctionDeclStmt")return l.name=e+"."+o.name,l.body=i(o.body,{locals:new Set(o.params),root:!1,fn:!0}),l;if(o.kind==="BlockStmt"){let c={...a,locals:new Set(a.locals),root:!1};return l.statements=o.statements.map(d=>i(d,c)),l}if(o.kind==="VarDeclStmt"||o.kind==="TupleVarDeclStmt"){o.initializer&&(l.initializer=s(o.initializer,a));let d=(o.kind==="VarDeclStmt"?[o.name]:o.names).map(u=>a.root?r(u,a):(a.locals.add(u),u));return o.kind==="VarDeclStmt"?l.name=d[0]:l.names=d,l}if(o.kind==="ForInStmt"){l.iterable=s(o.iterable,a);let c={...a,root:!1,locals:new Set(a.locals)};return c.locals.add(o.name),l.body=i(o.body,c),l}if(o.kind==="ForStmt"){let c={...a,root:!1,locals:new Set(a.locals)};return o.init&&(l.init=i(o.init,c)),o.condition&&(l.condition=s(o.condition,c)),o.update&&(l.update=s(o.update,c)),l.body=i(o.body,c),l}o.kind==="SyncAssignStmt"&&(l.target=r(o.target,a));for(let[c,d]of Object.entries(o))c==="target"&&o.kind==="SyncAssignStmt"||d&&typeof d=="object"&&(l[c]=d.kind?.endsWith("Stmt")?i(d,a):s(d,a));return l};return{...t,statements:t.statements.map(o=>i(o,{locals:new Set,root:!0,fn:!1}))}}function*Bu(t,e){let n=e.file??"<main>",r=e.baseDir??(e.file&&!/^https?:/i.test(e.file)?le.dirname(le.resolve(e.file)):process.cwd()),s=[],i=new Map,o=new Map,a=[],l=[];for(let _ of e.modules??[]){if(!Js(_))throw new M("--module requires a host module name",1,1,"CHECKER",n);if(e.builtinProviderNames?.includes(_))throw new M(_+" functions are built in; remove this line",1,1,"CHECKER",n);l.push({name:_,line:1,column:1,file:n})}let c=(_,y)=>{let f=new js(_,y),w=f.tokenize();return s.push(...f.diagnostics),new Hs(w,y).parse()};function*d(_,y){let f=_.statements.find(g=>g.kind==="PackageStmt");if(f&&_.statements[0]!==f)throw new M("package must be the first statement in its file",f.line,f.column,"CHECKER",y);if(_.statements.filter(g=>g.kind==="PackageStmt").length>1)throw new M("Only one package declaration is allowed",f.line,f.column,"CHECKER",y);if(f?.kind==="PackageStmt"){if(ya(_).has(f.name))throw new M("Package name collision: "+f.name+" is also a module variable/function",f.line,f.column,"CHECKER",y);let g=o.get(f.name);if(g&&g.location!==y)throw new M("Duplicate package "+f.name+": "+g.location+" and "+y,f.line,f.column,"CHECKER",y);o.set(f.name,{location:y,members:[...ya(_)].map(E=>f.name+"."+E)}),_=iw(_,f.name)}let w=[];for(let g of _.statements){if(g.kind!=="ImportStmt"){w.push(g);continue}if(e.builtinProviderNames?.includes(g.path))throw new M(g.path+" functions are built in; remove this line",g.line,g.column,"CHECKER",g.file??y);let E;try{E=_a(g.path,y===u?e.baseDir?le.join(r,"__entry__.lms"):u:y,r)}catch(C){throw new M("Cannot resolve import "+g.path+": "+String(C),g.line,g.column,"CHECKER",y)}if(i.get(E)==="loading")throw new M("Import cycle: "+y+" -> "+E,g.line,g.column,"CHECKER",y);if(i.get(E)==="loaded")continue;let b=yield{location:E,specifier:g.path,from:y,node:g};if(E=b.location,i.get(E)==="loading")throw new M("Import cycle: "+y+" -> "+E,g.line,g.column,"CHECKER",y);i.get(E)!=="loaded"&&(i.set(E,"loading"),a.push(E),w.push(...yield*d(c(b.source,E),E)),i.set(E,"loaded"))}return w}let u=e.entryLocation??n;try{u!=="<main>"&&!u.startsWith("<")&&(u=_a(u,void 0,r))}catch{}i.set(u,"loading"),a.push(u);let m=yield*d(c(t,n),u);i.set(u,"loaded");let p=_=>{if(!_||typeof _!="object")return _;let y={..._};if(_.kind==="IndexExpr"&&_.target.kind==="IdentifierExpr"&&o.has(_.target.name)&&_.index.kind==="LiteralExpr"&&typeof _.index.value=="string")return{kind:"IdentifierExpr",name:_.target.name+"."+_.index.value,line:_.line,column:_.column,file:_.file};if(_.kind==="IndexAssignExpr"&&_.target.kind==="IdentifierExpr"&&o.has(_.target.name)&&_.index.kind==="LiteralExpr"&&typeof _.index.value=="string")return{kind:"AssignExpr",target:_.target.name+"."+_.index.value,value:p(_.value),line:_.line,column:_.column,file:_.file};for(let[f,w]of Object.entries(_))Array.isArray(w)?y[f]=w.map(p):w&&typeof w=="object"&&(y[f]=p(w));return y};return{program:{kind:"Program",statements:[...e.noStdlib?[]:rw().statements,...m.map(p)],line:1,column:1,file:n},loadedFiles:a,diagnostics:s,hostImports:l,packages:o}}function Wu(t,e){try{if(e.moduleResolver){let n=e.moduleResolver(t.specifier,t.from);return{location:_a(n.path,void 0,e.baseDir??process.cwd()),source:n.source}}if(/^https?:/i.test(t.location))throw Error("URL imports require runAsync or scanAndCheckAsync");return{location:t.location,source:$.readFileSync(t.location,"utf8")}}catch(n){throw new M("Cannot load module "+t.location+": "+String(n.message??n),t.node.line,t.node.column,"CHECKER",t.node.file)}}function ow(t,e={}){let n=Bu(t,e),r=n.next();for(;!r.done;)r=n.next(Wu(r.value,e));return r.value}async function aw(t,e={}){let n=e.importCache??new Map,r=Bu(t,e),s=r.next();for(;!s.done;){let i=s.value,o=n.get(i.location);o||(o=(async()=>{if(!/^https?:/i.test(i.location)||e.moduleResolver)return Wu(i,e);try{let a=await fetch(i.location,{signal:AbortSignal.timeout(e.importTimeoutMs??5e3)});if(!a.ok)throw Error("HTTP "+a.status);return{location:i.location,source:await a.text()}}catch(a){throw new M("Cannot load module URL "+i.location+": "+String(a.message??a),i.node.line,i.node.column,"CHECKER",i.node.file)}})(),n.set(i.location,o)),s=r.next(await o)}return s.value}function va(t,e){t&&typeof t=="object"&&wr.has(t)&&(t=wr.get(t)());let n,r=o=>{throw n=e?new M("Cannot interpolate value: "+o,e.line,e.column,"RUNTIME",e.file):new Error("Cannot convert value to text: "+o),n},s=new Set,i=o=>{if(o===null)return"null";if(typeof o=="string")return JSON.stringify(o);if(typeof o=="boolean")return String(o);if(typeof o=="number")return Number.isFinite(o)?String(o):r("nonfinite number");if(typeof o!="object")return r(o===void 0?"undefined":"unsupported "+typeof o);let a=Array.isArray(o),l=Object.getPrototypeOf(o);if(!a&&l!==Object.prototype&&l!==null)return r("unsupported host object");if(s.has(o))return r("cyclic collection");s.add(o);try{if(Reflect.ownKeys(o).some(m=>typeof m=="symbol"))return r("symbol-keyed collection");let c=a?Array.from({length:o.length},(m,p)=>String(p)):Object.keys(o);if(a&&c.some(m=>!Object.hasOwn(o,m)))return r("sparse array");let d=Object.getOwnPropertyNames(o).filter(m=>!a||m!=="length");if(d.length!==c.length||d.some(m=>!c.includes(m)))return r("extra or non-enumerable collection property");let u=[];for(let m of c){let p=Object.getOwnPropertyDescriptor(o,m);if(!p)return r("sparse array");if(!Object.hasOwn(p,"value"))return r("accessor property");let h=i(p.value);u.push(a?h:JSON.stringify(m)+":"+h)}return a?"["+u.join(",")+"]":"{"+u.join(",")+"}"}finally{s.delete(o)}};try{return typeof t=="string"?t:i(t)}catch(o){if(o===n)throw o;return r("serialization failed: "+(o instanceof Error?o.message:String(o)))}}function Ms(t){if(t!==null&&typeof t=="object"){let e=Object.getPrototypeOf(t);if(Array.isArray(t)||e===Object.prototype||e===null)return va(t)}return t===null?"null":String(t)}function Cu(t,e){if(typeof t!="number"||!Number.isFinite(t)||typeof e!="string")throw new Error("strftime: expected epoch milliseconds first and format string second");let n=new Date(t);if(!Number.isFinite(n.getTime()))throw new Error("strftime: invalid epoch milliseconds");let r=i=>String(i).padStart(2,"0"),s={"%Y":String(n.getFullYear()),"%m":r(n.getMonth()+1),"%d":r(n.getDate()),"%H":r(n.getHours()),"%M":r(n.getMinutes()),"%S":r(n.getSeconds()),"%%":"%"};return e.replace(/%[YmdHMS%]/g,i=>s[i])}function Sa(t,e,n="sprintf"){let r=0;return String(t).replace(/%(-?0?)(\d+)?(?:\.(\d+))?([sdf%])|%/g,(s,i,o,a,l)=>{if(s==="%%")return"%";if(!l||l==="%")throw new Error(`${n}: unsupported or malformed directive`);if(r>=e.length)throw new Error(`${n}: missing value for ${s}`);let c=o===void 0?0:Number(o),d=a===void 0?void 0:Number(a);if(c>1e4||d!==void 0&&d>(l==="f"?100:1e4))throw new Error(`${n}: width or precision exceeds supported limit`);let u=e[r++],m;if(l==="s")m=u!==null&&typeof u=="object"?JSON.stringify(u):String(u),d!==void 0&&(m=m.slice(0,d));else{let p=Number(u);if(!Number.isFinite(p))throw new Error(`${n}: numeric directive needs a finite number`);if(l==="f")m=d===void 0?String(p):p.toFixed(d);else{let h=Math.trunc(p);m=BigInt(Math.abs(h)).toString().padStart(d??0,"0"),h<0&&(m="-"+m)}}return i.includes("-")?m.padEnd(c," "):l!=="s"&&i.includes("0")&&!(l==="d"&&d!==void 0)?m.startsWith("-")?"-"+m.slice(1).padStart(Math.max(0,c-1),"0"):m.padStart(c,"0"):m.padStart(c," ")})}async function uw(){console.log("================================================="),console.log(" LMScript Verification & Full Feature Test Suite "),console.log(`=================================================
72
- `);let t=new Wt,e=!0;console.log("Test Suite 1: Functions, Recursion, and Control Flow");let r=t.run(`
67
+ `?(s.push(i),r.push(s),s=[],i="",a=!1,l=!1):i+=m}}if(o)throw new Error("Invalid CSV: unterminated quoted field");if(l&&(s.push(i),r.push(s)),!e)return r.map(u=>u.map(Cu));if(r.length===0)return[];let c=r[0].map(u=>u.trim()),d=[];for(let u=1;u<r.length;u++){let m=r[u],p={};for(let h=0;h<c.length;h++)Be(p,c[h],h<m.length?Cu(m[h]):null);d.push(p)}return d}function Cu(t){let e=t.trim();if(e==="")return"";if(/^-?\d+$/.test(e)){let n=Number(e);if(!Number.isNaN(n))return n}if(/^-?\d+\.\d+$/.test(e)){let n=Number(e);if(!Number.isNaN(n))return n}return e.toLowerCase()==="true"?!0:e.toLowerCase()==="false"?!1:e.toLowerCase()==="null"?null:t}function Nu(t,e=","){if(Fu(e),!Array.isArray(t)||t.length===0)return"";let n=t[0];if(Array.isArray(n))return t.map(r=>r.map(s=>Ds(s,e)).join(e)).join(`
68
+ `);if(typeof n=="object"&&n!==null){let r=Object.keys(n),s=r.map(o=>Ds(o,e)).join(e),i=t.map(o=>r.map(a=>Ds(De(o,a)??"",e)).join(e));return[s,...i].join(`
69
+ `)}return t.map(r=>Ds(r,e)).join(`
70
+ `)}function Ds(t,e){let n=t==null?"":String(t);return n===""||n.includes(e)||n.includes('"')||n.includes(`
71
+ `)||n.includes("\r")?`"${n.replaceAll('"','""')}"`:n}function Tr(t,e,n="native"){if(typeof e!="string")throw new Error("Regex flags must be a string");let r=new Set;for(let s of e){if(!"dgimsuvy".includes(s))throw new Error(`Unsupported regex flag '${s}'`);if(r.has(s))throw new Error(`Duplicate regex flag '${s}'`);r.add(s)}if(r.has("u")&&r.has("v"))throw new Error("Regex flags cannot combine 'u' and 'v' Unicode modes");if(n!=="native"&&r.has("y"))throw new Error("Sticky regex flag 'y' is incompatible with capture helpers that search anywhere");try{return new RegExp(t,n==="all"&&!r.has("g")?e+"g":e)}catch(s){throw new Error(`Invalid regex pattern: ${s instanceof Error?s.message:String(s)}`)}}function qu(t){return Array.from(t,e=>e===void 0?null:e)}function iw(t,e,n=""){let r=Tr(e,n,"first").exec(String(t));return r===null?null:qu(r)}function ow(t,e,n=""){let r=Tr(e,n,"all"),s=String(t),i=n.includes("u")||n.includes("v"),o=[],a;for(;(a=r.exec(s))!==null;)if(o.push(qu(a)),a[0]===""){let l=r.lastIndex;if(l>=s.length)break;let c=s.charCodeAt(l),d=s.charCodeAt(l+1),u=i&&c>=55296&&c<=56319&&d>=56320&&d<=57343?2:1;r.lastIndex=l+u}return o}function Ou(t,e){try{if(Array.isArray(t))return Array.from({length:t.length},(r,s)=>t[s]);if(typeof t=="string")return Array.from(t);if(t!==null&&typeof t=="object"&&(Object.getPrototypeOf(t)===Object.prototype||Object.getPrototypeOf(t)===null))return Object.keys(t);let n=t===null?"null":t instanceof Date?"Date":typeof t;throw new M(`Cannot iterate value of type ${n}; expected list, map or string`,e.line,e.column,"RUNTIME",e.file)}catch(n){throw n instanceof M?n:new M(`Cannot snapshot iterable: ${n instanceof Error?n.message:String(n)}`,e.line,e.column,"RUNTIME",e.file)}}function ha(t,e){if(!(!t||typeof t!="object")){"line"in t&&"column"in t&&!t.file&&(t.file=e);for(let n of Object.keys(t)){let r=t[n];if(Array.isArray(r))for(let s of r)ha(s,e);else r&&typeof r=="object"&&ha(r,e)}}}function br(t,e="Call to undefined function"){let n=`${e} '${t}'`;if(!Object.hasOwn(Bs,t))return n;let r=n+`; did you mean '${Bs[t]}'?`;return t==="json"?r+" Use json_stringify for serialization.":t==="count"?r+" Use count_matches for substring occurrences.":t==="parseInt"||t==="parseFloat"?r+" num uses whole-value Number conversion; it does not provide prefix parsing or integer truncation.":r}function lw(){if(!ma){let e=new Hs(aw,"<std>").tokenize(),r=new Ws(e,"<std>").parse();for(let s of r.statements)s.kind==="FunctionDeclStmt"&&(s.isStdlib=!0);ma=r}return{kind:"Program",statements:[...ma.statements],line:1,column:1,file:"<std>"}}function wr(t){return t&&typeof t=="object"&&Sr.has(t)?Sr.get(t)():t}function ya(t){if(typeof t!="string"||!/^[_a-zA-Z]\w*(?:\.[_a-zA-Z]\w*)*$/.test(t))throw Error(`Invalid property key '${String(t)}'; use dotted identifier segments`);return t}function Ea(t,e){return e.find(n=>{let r=n.lastIndexOf(".");return n===t||r>=0&&t===n.slice(0,r+1)+n.slice(r+1).toLowerCase()})??t}function Bt(t,e,n=new Set){if(t instanceof Date)return t.toISOString();if(t===null||typeof t=="string"||typeof t=="boolean"||typeof t=="number"&&Number.isFinite(t))return t;if(t&&typeof t=="object"){if(!Array.isArray(t)&&![Object.prototype,null].includes(Object.getPrototypeOf(t)))throw Error(`Property '${e}' has an unsupported object value`);if(n.has(t))throw Error(`Property '${e}' contains a cycle`);n.add(t);try{if(Array.isArray(t))return t.map((s,i)=>Bt(s,e+"."+i,n));let r={};for(let[s,i]of Object.entries(t))Be(r,s,Bt(i,e?e+"."+s:s,n));return r}finally{n.delete(t)}}throw Error(`Property '${e}' has an unsupported value type: ${typeof t}`)}function qs(t){if(t.kind==="IdentifierExpr"&&t.name==="PROPS")return"";if(t.kind==="IndexExpr"&&t.index.kind==="LiteralExpr"&&typeof t.index.value=="string"){let e=qs(t.target);if(e!==void 0)return e?e+"."+t.index.value:t.index.value}}function zs(t){return t.trim().length>0&&!/[\0\r\n]/.test(t)&&!/[\/\\]/.test(t)&&!t.startsWith(".")&&!t.endsWith(".lms")}function cw(t){let e=t instanceof Error&&t.name!=="Error"?`${t.name}: `:"",n=t instanceof Error?t.message:String(t),r=[];for(let i of n.split(/\r?\n/)){if(/^\s*Require stack:\s*$/.test(i))break;/^\s*(?:at\s|-\s)/.test(i)||r.push(i)}let s=r.join(" ").replace(/__lmscript_modules__\.cjs/g,"").replace(/(?:file:\/\/)?(?:[A-Za-z]:)?[\\/][^\s'"<>]+/g,"<module file>").replace(/\s+/g," ").trim();return(e+(s||"module loading failed")).trim()}function Fe(t){if(t?.aborted)throw new Error("Execution aborted")}function jn(t){return t!==null&&(typeof t=="object"||typeof t=="function")&&typeof t.then=="function"}function va(t,e,n){if(/^https?:/i.test(t)||/^https?:/i.test(e??"")){let s=/^https?:/i.test(t)?new URL(t):new URL(t,e);if(!["http:","https:"].includes(s.protocol))throw Error("Only http/https module URLs are supported");return s.hash="",s.href}let r=le.resolve(e&&e!=="<main>"&&!e.startsWith("<")?le.dirname(e):n,t);try{return $.realpathSync(r)}catch{return r}}function Gu(t){if(t.kind==="IdentifierExpr")return t.name;if(t.kind==="IndexExpr"&&t.index.kind==="LiteralExpr"&&typeof t.index.value=="string"){let e=Gu(t.target);if(e)return e+"."+t.index.value}}function wa(t){let e=new Set,n=r=>{if(!(!r||typeof r!="object")){r.kind==="AssignExpr"&&e.add(r.target),r.kind==="TupleAssignExpr"&&r.targets.forEach(s=>e.add(s));for(let s of Object.values(r))Array.isArray(s)?s.forEach(n):s&&typeof s=="object"&&n(s)}};for(let r of t.statements)(r.kind==="FunctionDeclStmt"||r.kind==="VarDeclStmt")&&e.add(r.name),r.kind==="TupleVarDeclStmt"&&r.names.forEach(s=>e.add(s)),r.kind==="ExprStmt"&&n(r.expr);return e}function dw(t,e){let n=wa(t),r=(o,a)=>n.has(o)&&!a.locals.has(o)?e+"."+o:o,s=(o,a)=>{if(!o||typeof o!="object")return o;let l={...o};if(o.kind==="IdentifierExpr")return l.name=r(o.name,a),l;if(o.kind==="AssignExpr"||o.kind==="TupleAssignExpr"){l.value=s(o.value,a);let d=(o.kind==="AssignExpr"?[o.target]:o.targets).map(u=>a.fn?(a.locals.add(u),u):r(u,a));return o.kind==="AssignExpr"?l.target=d[0]:l.targets=d,l}o.kind==="CallExpr"&&(l.callee=n.has(o.callee)&&!a.locals.has(o.callee)?e+"."+o.callee:o.callee);for(let[c,d]of Object.entries(o))c!=="callee"&&(Array.isArray(d)?l[c]=d.map(u=>u&&typeof u=="object"?s(u,a):u):d&&typeof d=="object"&&(l[c]=s(d,a)));return l},i=(o,a)=>{let l={...o};if(o.kind==="FunctionDeclStmt")return l.name=e+"."+o.name,l.body=i(o.body,{locals:new Set(o.params),root:!1,fn:!0}),l;if(o.kind==="BlockStmt"){let c={...a,locals:new Set(a.locals),root:!1};return l.statements=o.statements.map(d=>i(d,c)),l}if(o.kind==="VarDeclStmt"||o.kind==="TupleVarDeclStmt"){o.initializer&&(l.initializer=s(o.initializer,a));let d=(o.kind==="VarDeclStmt"?[o.name]:o.names).map(u=>a.root?r(u,a):(a.locals.add(u),u));return o.kind==="VarDeclStmt"?l.name=d[0]:l.names=d,l}if(o.kind==="ForInStmt"){l.iterable=s(o.iterable,a);let c={...a,root:!1,locals:new Set(a.locals)};return c.locals.add(o.name),l.body=i(o.body,c),l}if(o.kind==="ForStmt"){let c={...a,root:!1,locals:new Set(a.locals)};return o.init&&(l.init=i(o.init,c)),o.condition&&(l.condition=s(o.condition,c)),o.update&&(l.update=s(o.update,c)),l.body=i(o.body,c),l}o.kind==="SyncAssignStmt"&&(l.target=r(o.target,a));for(let[c,d]of Object.entries(o))c==="target"&&o.kind==="SyncAssignStmt"||d&&typeof d=="object"&&(l[c]=d.kind?.endsWith("Stmt")?i(d,a):s(d,a));return l};return{...t,statements:t.statements.map(o=>i(o,{locals:new Set,root:!0,fn:!1}))}}function*Ju(t,e){let n=e.file??"<main>",r=e.baseDir??(e.file&&!/^https?:/i.test(e.file)?le.dirname(le.resolve(e.file)):process.cwd()),s=[],i=new Map,o=new Map,a=[],l=[];for(let _ of e.modules??[]){if(!zs(_))throw new M("--module requires a host module name",1,1,"CHECKER",n);if(e.builtinProviderNames?.includes(_))throw new M(_+" functions are built in; remove this line",1,1,"CHECKER",n);l.push({name:_,line:1,column:1,file:n})}let c=(_,y)=>{let f=new Hs(_,y),w=f.tokenize();return s.push(...f.diagnostics),new Ws(w,y).parse()};function*d(_,y){let f=_.statements.find(g=>g.kind==="PackageStmt");if(f&&_.statements[0]!==f)throw new M("package must be the first statement in its file",f.line,f.column,"CHECKER",y);if(_.statements.filter(g=>g.kind==="PackageStmt").length>1)throw new M("Only one package declaration is allowed",f.line,f.column,"CHECKER",y);if(f?.kind==="PackageStmt"){if(wa(_).has(f.name))throw new M("Package name collision: "+f.name+" is also a module variable/function",f.line,f.column,"CHECKER",y);let g=o.get(f.name);if(g&&g.location!==y)throw new M("Duplicate package "+f.name+": "+g.location+" and "+y,f.line,f.column,"CHECKER",y);o.set(f.name,{location:y,members:[...wa(_)].map(E=>f.name+"."+E)}),_=dw(_,f.name)}let w=[];for(let g of _.statements){if(g.kind!=="ImportStmt"){w.push(g);continue}if(e.builtinProviderNames?.includes(g.path))throw new M(g.path+" functions are built in; remove this line",g.line,g.column,"CHECKER",g.file??y);let E;try{E=va(g.path,y===u?e.baseDir?le.join(r,"__entry__.lms"):u:y,r)}catch(C){throw new M("Cannot resolve import "+g.path+": "+String(C),g.line,g.column,"CHECKER",y)}if(i.get(E)==="loading")throw new M("Import cycle: "+y+" -> "+E,g.line,g.column,"CHECKER",y);if(i.get(E)==="loaded")continue;let b=yield{location:E,specifier:g.path,from:y,node:g};if(E=b.location,i.get(E)==="loading")throw new M("Import cycle: "+y+" -> "+E,g.line,g.column,"CHECKER",y);i.get(E)!=="loaded"&&(i.set(E,"loading"),a.push(E),w.push(...yield*d(c(b.source,E),E)),i.set(E,"loaded"))}return w}let u=e.entryLocation??n;try{u!=="<main>"&&!u.startsWith("<")&&(u=va(u,void 0,r))}catch{}i.set(u,"loading"),a.push(u);let m=yield*d(c(t,n),u);i.set(u,"loaded");let p=_=>{if(!_||typeof _!="object")return _;let y={..._};if(_.kind==="IndexExpr"&&_.target.kind==="IdentifierExpr"&&o.has(_.target.name)&&_.index.kind==="LiteralExpr"&&typeof _.index.value=="string")return{kind:"IdentifierExpr",name:_.target.name+"."+_.index.value,line:_.line,column:_.column,file:_.file};if(_.kind==="IndexAssignExpr"&&_.target.kind==="IdentifierExpr"&&o.has(_.target.name)&&_.index.kind==="LiteralExpr"&&typeof _.index.value=="string")return{kind:"AssignExpr",target:_.target.name+"."+_.index.value,value:p(_.value),line:_.line,column:_.column,file:_.file};for(let[f,w]of Object.entries(_))Array.isArray(w)?y[f]=w.map(p):w&&typeof w=="object"&&(y[f]=p(w));return y};return{program:{kind:"Program",statements:[...e.noStdlib?[]:lw().statements,...m.map(p)],line:1,column:1,file:n},loadedFiles:a,diagnostics:s,hostImports:l,packages:o}}function Ku(t,e){try{if(e.moduleResolver){let n=e.moduleResolver(t.specifier,t.from);return{location:va(n.path,void 0,e.baseDir??process.cwd()),source:n.source}}if(/^https?:/i.test(t.location))throw Error("URL imports require runAsync or scanAndCheckAsync");return{location:t.location,source:$.readFileSync(t.location,"utf8")}}catch(n){throw new M("Cannot load module "+t.location+": "+String(n.message??n),t.node.line,t.node.column,"CHECKER",t.node.file)}}function uw(t,e={}){let n=Ju(t,e),r=n.next();for(;!r.done;)r=n.next(Ku(r.value,e));return r.value}async function mw(t,e={}){let n=e.importCache??new Map,r=Ju(t,e),s=r.next();for(;!s.done;){let i=s.value,o=n.get(i.location);o||(o=(async()=>{if(!/^https?:/i.test(i.location)||e.moduleResolver)return Ku(i,e);try{let a=await fetch(i.location,{signal:AbortSignal.timeout(e.importTimeoutMs??5e3)});if(!a.ok)throw Error("HTTP "+a.status);return{location:i.location,source:await a.text()}}catch(a){throw new M("Cannot load module URL "+i.location+": "+String(a.message??a),i.node.line,i.node.column,"CHECKER",i.node.file)}})(),n.set(i.location,o)),s=r.next(await o)}return s.value}function ba(t,e){t&&typeof t=="object"&&Sr.has(t)&&(t=Sr.get(t)());let n,r=o=>{throw n=e?new M("Cannot interpolate value: "+o,e.line,e.column,"RUNTIME",e.file):new Error("Cannot convert value to text: "+o),n},s=new Set,i=o=>{if(o===null)return"null";if(typeof o=="string")return JSON.stringify(o);if(typeof o=="boolean")return String(o);if(typeof o=="number")return Number.isFinite(o)?String(o):r("nonfinite number");if(typeof o!="object")return r(o===void 0?"undefined":"unsupported "+typeof o);let a=Array.isArray(o),l=Object.getPrototypeOf(o);if(!a&&l!==Object.prototype&&l!==null)return r("unsupported host object");if(s.has(o))return r("cyclic collection");s.add(o);try{if(Reflect.ownKeys(o).some(m=>typeof m=="symbol"))return r("symbol-keyed collection");let c=a?Array.from({length:o.length},(m,p)=>String(p)):Object.keys(o);if(a&&c.some(m=>!Object.hasOwn(o,m)))return r("sparse array");let d=Object.getOwnPropertyNames(o).filter(m=>!a||m!=="length");if(d.length!==c.length||d.some(m=>!c.includes(m)))return r("extra or non-enumerable collection property");let u=[];for(let m of c){let p=Object.getOwnPropertyDescriptor(o,m);if(!p)return r("sparse array");if(!Object.hasOwn(p,"value"))return r("accessor property");let h=i(p.value);u.push(a?h:JSON.stringify(m)+":"+h)}return a?"["+u.join(",")+"]":"{"+u.join(",")+"}"}finally{s.delete(o)}};try{return typeof t=="string"?t:i(t)}catch(o){if(o===n)throw o;return r("serialization failed: "+(o instanceof Error?o.message:String(o)))}}function Fs(t){if(t!==null&&typeof t=="object"){let e=Object.getPrototypeOf(t);if(Array.isArray(t)||e===Object.prototype||e===null)return ba(t)}return t===null?"null":String(t)}function Mu(t){return{returnsResource:t.returnsResource===!0||void 0,usesResource:t.usesResource===!0||void 0,closesResource:t.closesResource===!0||void 0}}function gn(t){return t instanceof Qe}function gw(t){for(let e=0;e<t.length;e++)if(t[e]instanceof Qe)return!0;return!1}function Pu(t,e){if(typeof t!="number"||!Number.isFinite(t)||typeof e!="string")throw new Error("strftime: expected epoch milliseconds first and format string second");let n=new Date(t);if(!Number.isFinite(n.getTime()))throw new Error("strftime: invalid epoch milliseconds");let r=i=>String(i).padStart(2,"0"),s={"%Y":String(n.getFullYear()),"%m":r(n.getMonth()+1),"%d":r(n.getDate()),"%H":r(n.getHours()),"%M":r(n.getMinutes()),"%S":r(n.getSeconds()),"%%":"%"};return e.replace(/%[YmdHMS%]/g,i=>s[i])}function xa(t,e,n="sprintf"){let r=0;return String(t).replace(/%(-?0?)(\d+)?(?:\.(\d+))?([sdf%])|%/g,(s,i,o,a,l)=>{if(s==="%%")return"%";if(!l||l==="%")throw new Error(`${n}: unsupported or malformed directive`);if(r>=e.length)throw new Error(`${n}: missing value for ${s}`);let c=o===void 0?0:Number(o),d=a===void 0?void 0:Number(a);if(c>1e4||d!==void 0&&d>(l==="f"?100:1e4))throw new Error(`${n}: width or precision exceeds supported limit`);let u=e[r++],m;if(l==="s")m=u!==null&&typeof u=="object"?JSON.stringify(u):String(u),d!==void 0&&(m=m.slice(0,d));else{let p=Number(u);if(!Number.isFinite(p))throw new Error(`${n}: numeric directive needs a finite number`);if(l==="f")m=d===void 0?String(p):p.toFixed(d);else{let h=Math.trunc(p);m=BigInt(Math.abs(h)).toString().padStart(d??0,"0"),h<0&&(m="-"+m)}}return i.includes("-")?m.padEnd(c," "):l!=="s"&&i.includes("0")&&!(l==="d"&&d!==void 0)?m.startsWith("-")?"-"+m.slice(1).padStart(Math.max(0,c-1),"0"):m.padStart(c,"0"):m.padStart(c," ")})}async function Ew(){console.log("================================================="),console.log(" LMScript Verification & Full Feature Test Suite "),console.log(`=================================================
72
+ `);let t=new Xt,e=!0;console.log("Test Suite 1: Functions, Recursion, and Control Flow");let r=t.run(`
73
73
  fn factorial(n) {
74
74
  if (n <= 1) {
75
75
  return 1;
@@ -125,7 +125,7 @@ try {
125
125
 
126
126
  undefinedFunctionCall(); // ERROR 4: undefined function
127
127
  base64Encode("hello", "extra_arg"); // ERROR 5: arity mismatch
128
- `,a=t.run(o);console.log(" Executed successfully?",a.success),console.log(" Formatted visual diagnostics caught BEFORE execution:");for(let w of a.diagnostics)console.log(" "+Yv(w,o).split(`
128
+ `,a=t.run(o);console.log(" Executed successfully?",a.success),console.log(" Formatted visual diagnostics caught BEFORE execution:");for(let w of a.diagnostics)console.log(" "+nw(w,o).split(`
129
129
  `).join(`
130
130
  `));!a.success&&a.diagnostics.length===5?console.log(` -> Passed! (All 5 static errors caught upfront with visual carets)
131
131
  `):(console.error(" -> Failed! Expected 5 diagnostics, got",a.diagnostics.length),e=!1),console.log("Test Suite 4: Forward Function Declarations & Mutual Recursion");let c=t.run(`
@@ -295,7 +295,7 @@ try {
295
295
  assert(res1 == "a" && res2 == "b" && res3 == "c", "parallel results must match return values");
296
296
  `);return f.success?(console.log(f.output.map(w=>" [out] "+w).join(`
297
297
  `)),console.log(` -> Passed!
298
- `)):(console.error(" -> Failed:",f.diagnostics),e=!1),e}function Xu(){try{let t=le.dirname(ka(import.meta.url));for(let e of["package.json","../package.json","../../package.json"]){let n=le.resolve(t,e);if($.existsSync(n))return JSON.parse($.readFileSync(n,"utf8")).version??"unknown"}}catch{}return"unknown"}async function mw(){let t=process.argv.slice(2);if(t.length===0||t.length===1&&t[0]==="--test"){await uw()||(process.exitCode=1);return}let{runCli:e}=await Promise.resolve().then(()=>(Ia(),qu));process.exitCode=await e(t)}var M,mt,ma,Ds,Os,$s,js,Us,Hs,nw,ca,fa,wr,Au,Bs,Bt,Ea,Dn,dt,ut,Fn,He,Xs,wa,Ta,ba,qs,lw,cw,dw,Wt,da,Ra=O(()=>{"use strict";la();M=class extends Error{message;line;column;stage;file;constructor(e,n,r,s,i){let o=i&&i!=="<main>"?`${i}:${n}:${r}`:`${n}:${r}`;super(`[${s} Error at ${o}] ${e}`),this.name="LMScriptError",this.message=e,this.line=n,this.column=r,this.stage=s,this.file=i}},mt=class extends Error{isControlFlow=!0;exitCode;constructor(e=0){super(`LMScript exited with code ${e}`),this.name="LMScriptExit",this.exitCode=e}};ma=10*1024*1024;Ds=new Set,Os=1e3;process.on("exit",()=>{for(let t of Ds)try{process.platform!=="win32"&&t.pid?process.kill(-t.pid,"SIGKILL"):t.kill("SIGKILL")}catch{}Ds.clear()});$s={fn:"FN",function:"FN",let:"LET",if:"IF",else:"ELSE",while:"WHILE",for:"FOR",return:"RETURN",break:"BREAK",continue:"CONTINUE",true:"TRUE",false:"FALSE",null:"NULL",parallel:"PARALLEL",sync:"SYNC",import:"IMPORT"},js=class{diagnostics=[];formattedDepth=0;modes=[];source;length;file;pos=0;line=1;column=1;constructor(e,n){this.source=e,this.length=e.length,this.file=n}tokenize(){let e=[];return this.scanTokens(e),e.push({type:"EOF",value:"",line:this.line,column:this.column}),e}position(){return{offset:this.pos,line:this.line,column:this.column}}spannedToken(e,n,r){return{type:e,value:n,line:r.line,column:r.column,offset:r.offset,endOffset:this.pos,endLine:this.line,endColumn:this.column}}scanTokens(e,n){for(;this.pos<this.length&&(this.skipWhitespaceAndComments(),!(this.pos>=this.length));){let r=this.position(),s=this.peek();if(n&&n.delimiters.length===0){if(s==="}"){if(n.lastToken===void 0)throw new M("Empty formatted-string field",r.line,r.column,"LEXER",this.file);this.advance(),e.push(this.spannedToken("FSTRING_FIELD_END","}",r));return}if(s==="?"&&n.pendingQuestions++,s===":")if(n.pendingQuestions>0)n.pendingQuestions--;else throw new M("Format specifications are not supported in formatted strings",r.line,r.column,"LEXER",this.file);if(n.lastToken&&["IDENTIFIER","NUMBER","STRING","TRUE","FALSE","NULL","RPAREN","RBRACKET","RBRACE","FSTRING_END"].includes(n.lastToken)&&s==="!"&&/[rsa]/.test(this.peekNext())&&this.peekNext()!=="")throw new M("Conversion suffixes (!r, !s, !a) are not supported in formatted strings",r.line,r.column,"LEXER",this.file);if(s==="="&&this.peekNext()!=="=")throw new M("Assignment/debug fields ({x=}) are not supported in formatted strings",r.line,r.column,"LEXER",this.file)}let i=e.length;this.readNextToken(e);for(let o of e.slice(i))o.offset===void 0&&(o.offset=r.offset,o.endOffset=this.pos,o.endLine=this.line,o.endColumn=this.column);if(n){let o=e[i],a={RPAREN:"LPAREN",RBRACKET:"LBRACKET",RBRACE:"LBRACE"};if(["LPAREN","LBRACKET","LBRACE"].includes(o.type))n.delimiters.push(o.type);else if(a[o.type]&&n.delimiters.pop()!==a[o.type])throw new M("Mismatched delimiter in formatted-string field",o.line,o.column,"LEXER",this.file);n.lastToken=e[e.length-1].type}}if(n)throw new M("Unterminated formatted-string field; expected '}'",n.opener.line,n.opener.column,"LEXER",this.file)}readNextToken(e){let n=this.line,r=this.column,s=this.peek();if(this.isDigit(s)||s==="."&&this.isDigit(this.peekNext())){e.push(this.readNumber(n,r));return}if(s==='"'||s==="'"){e.push(this.source.startsWith(s.repeat(3),this.pos)?this.readModernString("",n,r,e):this.readString(s,n,r));return}if(s==="<"&&this.peekNext()==="<"&&/^<<[A-Za-z_][A-Za-z0-9_]*(?:\r\n|\r|\n)/.test(this.source.slice(this.pos)))throw new M('Heredocs are not supported; use raw triple-quoted strings (r"""...""")',n,r,"LEXER",this.file);if(this.isAlpha(s)){let i=this.pos+1;for(;i<this.length&&this.isAlphaNumeric(this.source[i]);)i++;if(this.source[i]==='"'||this.source[i]==="'"){let o=this.source.slice(this.pos,i);if(!/^(r|f|rf|fr)$/i.test(o)){let a=this.modes.at(-1);throw a?.kind==="field"&&a.delimiters.length===0?new M("Unterminated formatted-string field; expected '}' before enclosing quote",a.opener.line,a.opener.column,"LEXER",this.file):new M("Unsupported string prefix '"+o+"'; separate an identifier or keyword from its string with whitespace",n,r,"LEXER",this.file)}e.push(this.readModernString(o,n,r,e));return}e.push(this.readIdentifier(n,r));return}switch(this.advance(),s){case".":e.push({type:"DOT",value:".",line:n,column:r});break;case"?":e.push({type:"QUESTION",value:"?",line:n,column:r});break;case":":e.push({type:"COLON",value:":",line:n,column:r});break;case"(":e.push({type:"LPAREN",value:"(",line:n,column:r});break;case")":e.push({type:"RPAREN",value:")",line:n,column:r});break;case"{":e.push({type:"LBRACE",value:"{",line:n,column:r});break;case"}":e.push({type:"RBRACE",value:"}",line:n,column:r});break;case"[":e.push({type:"LBRACKET",value:"[",line:n,column:r});break;case"]":e.push({type:"RBRACKET",value:"]",line:n,column:r});break;case",":e.push({type:"COMMA",value:",",line:n,column:r});break;case";":e.push({type:"SEMICOLON",value:";",line:n,column:r});break;case"+":e.push({type:"PLUS",value:"+",line:n,column:r});break;case"-":e.push({type:"MINUS",value:"-",line:n,column:r});break;case"*":e.push({type:"STAR",value:"*",line:n,column:r});break;case"/":e.push({type:"SLASH",value:"/",line:n,column:r});break;case"%":e.push({type:"PERCENT",value:"%",line:n,column:r});break;case"=":this.match("=")?e.push({type:"EQUAL",value:"==",line:n,column:r}):e.push({type:"ASSIGN",value:"=",line:n,column:r});break;case"!":this.match("=")?e.push({type:"NOT_EQUAL",value:"!=",line:n,column:r}):e.push({type:"NOT",value:"!",line:n,column:r});break;case"<":this.match("=")?e.push({type:"LESS_EQUAL",value:"<=",line:n,column:r}):e.push({type:"LESS",value:"<",line:n,column:r});break;case">":this.match("=")?e.push({type:"GREATER_EQUAL",value:">=",line:n,column:r}):e.push({type:"GREATER",value:">",line:n,column:r});break;case"&":if(this.match("&"))e.push({type:"AND",value:"&&",line:n,column:r});else throw new M("Unexpected character '&'. Did you mean '&&'?",n,r,"LEXER",this.file);break;case"|":if(this.match("|"))e.push({type:"OR",value:"||",line:n,column:r});else throw new M("Unexpected character '|'. Did you mean '||'?",n,r,"LEXER",this.file);break;default:throw new M(`Unexpected character: '${s}'`,n,r,"LEXER",this.file)}}peek(){return this.source[this.pos]||""}peekNext(){return this.source[this.pos+1]||""}advance(){let e=this.source[this.pos++];return e==="\r"||e===`
298
+ `)):(console.error(" -> Failed:",f.diagnostics),e=!1),e}function Vu(){try{let t=le.dirname(Aa(import.meta.url));for(let e of["package.json","../package.json","../../package.json"]){let n=le.resolve(t,e);if($.existsSync(n))return JSON.parse($.readFileSync(n,"utf8")).version??"unknown"}}catch{}return"unknown"}async function vw(){let t=process.argv.slice(2);if(t.length===0||t.length===1&&t[0]==="--test"){await Ew()||(process.exitCode=1);return}let{runCli:e}=await Promise.resolve().then(()=>(Na(),zu));process.exitCode=await e(t)}var M,pt,ga,$s,Ps,Us,Hs,Bs,Ws,aw,ma,_a,Sr,Lu,Xs,Wt,Ta,$n,ut,mt,Un,He,Gs,Sa,ka,Ra,pw,fw,Qe,Js,Ia,Ks,hw,_w,yw,Xt,pa,Ca=O(()=>{"use strict";ua();M=class extends Error{message;line;column;stage;file;constructor(e,n,r,s,i){let o=i&&i!=="<main>"?`${i}:${n}:${r}`:`${n}:${r}`;super(`[${s} Error at ${o}] ${e}`),this.name="LMScriptError",this.message=e,this.line=n,this.column=r,this.stage=s,this.file=i}},pt=class extends Error{isControlFlow=!0;exitCode;constructor(e=0){super(`LMScript exited with code ${e}`),this.name="LMScriptExit",this.exitCode=e}};ga=10*1024*1024;$s=new Set,Ps=1e3;process.on("exit",()=>{for(let t of $s)try{process.platform!=="win32"&&t.pid?process.kill(-t.pid,"SIGKILL"):t.kill("SIGKILL")}catch{}$s.clear()});Us={fn:"FN",function:"FN",let:"LET",if:"IF",else:"ELSE",while:"WHILE",for:"FOR",return:"RETURN",break:"BREAK",continue:"CONTINUE",true:"TRUE",false:"FALSE",null:"NULL",parallel:"PARALLEL",sync:"SYNC",import:"IMPORT"},Hs=class{diagnostics=[];formattedDepth=0;modes=[];source;length;file;pos=0;line=1;column=1;constructor(e,n){this.source=e,this.length=e.length,this.file=n}tokenize(){let e=[];return this.scanTokens(e),e.push({type:"EOF",value:"",line:this.line,column:this.column}),e}position(){return{offset:this.pos,line:this.line,column:this.column}}spannedToken(e,n,r){return{type:e,value:n,line:r.line,column:r.column,offset:r.offset,endOffset:this.pos,endLine:this.line,endColumn:this.column}}scanTokens(e,n){for(;this.pos<this.length&&(this.skipWhitespaceAndComments(),!(this.pos>=this.length));){let r=this.position(),s=this.peek();if(n&&n.delimiters.length===0){if(s==="}"){if(n.lastToken===void 0)throw new M("Empty formatted-string field",r.line,r.column,"LEXER",this.file);this.advance(),e.push(this.spannedToken("FSTRING_FIELD_END","}",r));return}if(s==="?"&&n.pendingQuestions++,s===":")if(n.pendingQuestions>0)n.pendingQuestions--;else throw new M("Format specifications are not supported in formatted strings",r.line,r.column,"LEXER",this.file);if(n.lastToken&&["IDENTIFIER","NUMBER","STRING","TRUE","FALSE","NULL","RPAREN","RBRACKET","RBRACE","FSTRING_END"].includes(n.lastToken)&&s==="!"&&/[rsa]/.test(this.peekNext())&&this.peekNext()!=="")throw new M("Conversion suffixes (!r, !s, !a) are not supported in formatted strings",r.line,r.column,"LEXER",this.file);if(s==="="&&this.peekNext()!=="=")throw new M("Assignment/debug fields ({x=}) are not supported in formatted strings",r.line,r.column,"LEXER",this.file)}let i=e.length;this.readNextToken(e);for(let o of e.slice(i))o.offset===void 0&&(o.offset=r.offset,o.endOffset=this.pos,o.endLine=this.line,o.endColumn=this.column);if(n){let o=e[i],a={RPAREN:"LPAREN",RBRACKET:"LBRACKET",RBRACE:"LBRACE"};if(["LPAREN","LBRACKET","LBRACE"].includes(o.type))n.delimiters.push(o.type);else if(a[o.type]&&n.delimiters.pop()!==a[o.type])throw new M("Mismatched delimiter in formatted-string field",o.line,o.column,"LEXER",this.file);n.lastToken=e[e.length-1].type}}if(n)throw new M("Unterminated formatted-string field; expected '}'",n.opener.line,n.opener.column,"LEXER",this.file)}readNextToken(e){let n=this.line,r=this.column,s=this.peek();if(this.isDigit(s)||s==="."&&this.isDigit(this.peekNext())){e.push(this.readNumber(n,r));return}if(s==='"'||s==="'"){e.push(this.source.startsWith(s.repeat(3),this.pos)?this.readModernString("",n,r,e):this.readString(s,n,r));return}if(s==="<"&&this.peekNext()==="<"&&/^<<[A-Za-z_][A-Za-z0-9_]*(?:\r\n|\r|\n)/.test(this.source.slice(this.pos)))throw new M('Heredocs are not supported; use raw triple-quoted strings (r"""...""")',n,r,"LEXER",this.file);if(this.isAlpha(s)){let i=this.pos+1;for(;i<this.length&&this.isAlphaNumeric(this.source[i]);)i++;if(this.source[i]==='"'||this.source[i]==="'"){let o=this.source.slice(this.pos,i);if(!/^(r|f|rf|fr)$/i.test(o)){let a=this.modes.at(-1);throw a?.kind==="field"&&a.delimiters.length===0?new M("Unterminated formatted-string field; expected '}' before enclosing quote",a.opener.line,a.opener.column,"LEXER",this.file):new M("Unsupported string prefix '"+o+"'; separate an identifier or keyword from its string with whitespace",n,r,"LEXER",this.file)}e.push(this.readModernString(o,n,r,e));return}e.push(this.readIdentifier(n,r));return}switch(this.advance(),s){case".":e.push({type:"DOT",value:".",line:n,column:r});break;case"?":e.push({type:"QUESTION",value:"?",line:n,column:r});break;case":":e.push({type:"COLON",value:":",line:n,column:r});break;case"(":e.push({type:"LPAREN",value:"(",line:n,column:r});break;case")":e.push({type:"RPAREN",value:")",line:n,column:r});break;case"{":e.push({type:"LBRACE",value:"{",line:n,column:r});break;case"}":e.push({type:"RBRACE",value:"}",line:n,column:r});break;case"[":e.push({type:"LBRACKET",value:"[",line:n,column:r});break;case"]":e.push({type:"RBRACKET",value:"]",line:n,column:r});break;case",":e.push({type:"COMMA",value:",",line:n,column:r});break;case";":e.push({type:"SEMICOLON",value:";",line:n,column:r});break;case"+":e.push({type:"PLUS",value:"+",line:n,column:r});break;case"-":e.push({type:"MINUS",value:"-",line:n,column:r});break;case"*":e.push({type:"STAR",value:"*",line:n,column:r});break;case"/":e.push({type:"SLASH",value:"/",line:n,column:r});break;case"%":e.push({type:"PERCENT",value:"%",line:n,column:r});break;case"=":this.match("=")?e.push({type:"EQUAL",value:"==",line:n,column:r}):e.push({type:"ASSIGN",value:"=",line:n,column:r});break;case"!":this.match("=")?e.push({type:"NOT_EQUAL",value:"!=",line:n,column:r}):e.push({type:"NOT",value:"!",line:n,column:r});break;case"<":this.match("=")?e.push({type:"LESS_EQUAL",value:"<=",line:n,column:r}):e.push({type:"LESS",value:"<",line:n,column:r});break;case">":this.match("=")?e.push({type:"GREATER_EQUAL",value:">=",line:n,column:r}):e.push({type:"GREATER",value:">",line:n,column:r});break;case"&":if(this.match("&"))e.push({type:"AND",value:"&&",line:n,column:r});else throw new M("Unexpected character '&'. Did you mean '&&'?",n,r,"LEXER",this.file);break;case"|":if(this.match("|"))e.push({type:"OR",value:"||",line:n,column:r});else throw new M("Unexpected character '|'. Did you mean '||'?",n,r,"LEXER",this.file);break;default:throw new M(`Unexpected character: '${s}'`,n,r,"LEXER",this.file)}}peek(){return this.source[this.pos]||""}peekNext(){return this.source[this.pos+1]||""}advance(){let e=this.source[this.pos++];return e==="\r"||e===`
299
299
  `?((e!==`
300
300
  `||this.source[this.pos-2]!=="\r")&&this.line++,this.column=1):this.column++,e}match(e){return this.pos>=this.length||this.source[this.pos]!==e?!1:(this.advance(),!0)}isDigit(e){return e>="0"&&e<="9"}isAlpha(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"||e==="_"}isAlphaNumeric(e){return this.isAlpha(e)||this.isDigit(e)}skipWhitespaceAndComments(){for(;this.pos<this.length;){let e=this.peek();if(e===" "||e===" "||e==="\r"||e===`
301
301
  `)this.advance();else if(e==="/"&&this.peekNext()==="/"||e==="#")for(;this.pos<this.length&&this.peek()!==`
@@ -307,7 +307,7 @@ try {
307
307
  `)return this.consumeStringNewline(),"";let i={"\\":"\\",'"':'"',"'":"'",a:"\x07",b:"\b",f:"\f",n:`
308
308
  `,r:"\r",t:" ",v:"\v"};if(Object.hasOwn(i,s))return this.advance(),i[s];if(s==="N")throw new M("Named Unicode escapes (\\N) are not supported",n,r,"LEXER",this.file);if(s==="x"||s==="u"||s==="U"){this.advance();let o=s==="x"?2:s==="u"?4:8,a=this.source.slice(this.pos,this.pos+o);if(a.length!==o||!/^[0-9a-fA-F]+$/.test(a))throw new M("Invalid \\"+s+" escape; expected "+o+" hexadecimal digits",n,r,"LEXER",this.file);let l=Number.parseInt(a,16);if(l>1114111||l>=55296&&l<=57343)throw new M("Invalid Unicode scalar in string escape",n,r,"LEXER",this.file);for(let c=0;c<o;c++)this.advance();return String.fromCodePoint(l)}if(/[0-7]/.test(s)){let o=this.advance();for(;o.length<3&&this.peek()!==""&&/[0-7]/.test(this.peek());)o+=this.advance();return String.fromCodePoint(Number.parseInt(o,8))}return this.diagnostics.push({message:"Unknown escape '\\"+s+"'; backslash preserved",severity:"warning",line:n,column:r,file:this.file}),e&&(s==="{"||s==="}")?"\\":"\\"+this.advance()}readModernString(e,n,r,s){let i=this.pos;for(let p=0;p<e.length;p++)this.advance();let o=this.peek(),a=this.source.startsWith(o.repeat(3),this.pos),l=o.repeat(a?3:1),c={prefix:e.toLowerCase(),raw:/r/i.test(e),triple:a,formatted:/f/i.test(e)};if(c.formatted&&this.formattedDepth>=64)throw new M("Formatted-string nesting exceeds limit 64",n,r,"LEXER",this.file);c.formatted&&this.formattedDepth++;for(let p=0;p<l.length;p++)this.advance();if(this.modes.push({kind:"string",delimiter:l}),c.formatted){let p=this.spannedToken("FSTRING_START",e+l,{offset:i,line:n,column:r});p.stringLiteral=c,s.push(p)}let d=this.position(),u="",m=()=>{if(this.pos>d.offset){let p=this.spannedToken("FSTRING_TEXT",u,d);p.literal=u,s.push(p)}u=""};try{for(;this.pos<this.length;){if(this.source.startsWith(l,this.pos)){c.formatted&&m();let h=this.position();for(let _=0;_<l.length;_++)this.advance();return c.formatted?this.spannedToken("FSTRING_END",l,h):{type:"STRING",value:u,literal:u,line:n,column:r,offset:i,endOffset:this.pos,endLine:this.line,endColumn:this.column,stringLiteral:c}}let p=this.peek();if(c.formatted&&(p==="{"||p==="}"))if(this.peekNext()===p)this.advance(),this.advance(),u+=p;else{if(p==="}")throw new M("Unmatched '}' in formatted-string text; use '}}' for a literal brace",this.line,this.column,"LEXER",this.file);{m();let h=this.position();this.advance();let _=this.spannedToken("FSTRING_FIELD_START","{",h);s.push(_);let y={kind:"field",opener:_,delimiters:[],pendingQuestions:0};this.modes.push(y);try{this.scanTokens(s,y)}finally{this.modes.pop()}d=this.position()}}else if(p==="\r"||p===`
309
309
  `){if(!a)throw new M("Unterminated short string across newline",n,r,"LEXER",this.file);u+=this.consumeStringNewline()}else p==="\\"?c.raw?(u+=this.advance(),this.pos<this.length&&!(c.formatted&&(this.peek()==="{"||this.peek()==="}"))&&(u+=this.peek()==="\r"||this.peek()===`
310
- `?this.consumeStringNewline():this.advance())):u+=this.readModernEscape(c.formatted):u+=this.advance()}throw new M("Unterminated string literal; expected "+l,n,r,"LEXER",this.file)}finally{this.modes.pop(),c.formatted&&this.formattedDepth--}}readIdentifier(e,n){let r="";for(;this.pos<this.length&&this.isAlphaNumeric(this.peek());)r+=this.advance();let s=Object.hasOwn($s,r)?$s[r]:void 0;if(s){let i;return s==="TRUE"&&(i=!0),s==="FALSE"&&(i=!1),s==="NULL"&&(i=null),{type:s,value:r,literal:i,line:e,column:n}}return{type:"IDENTIFIER",value:r,line:e,column:n}}};Us=Object.freeze({count:"len",findall:"regex_find_all",has:"has_key",match:"regex_match",test:"regex_test",search:"regex_match",regex_split:"split_regex",regexSplit:"split_regex",splitRegex:"split_regex",clock:"now",json:"json_parse",sleep:"sleep_ms",urlget:"http_get",capitalize:"upper_first",startsWith:"starts_with",endsWith:"ends_with",indexOf:"index_of",lastIndexOf:"last_index_of",toUpperCase:"upper",toLowerCase:"lower",parseInt:"num",parseFloat:"num",trimStart:"trim_start",trimLeft:"trim_start",trimEnd:"trim_end",trimRight:"trim_end",strip:"trim",lstrip:"trim_start",rstrip:"trim_end",length:"len",append:"push",prepend:"unshift",push_back:"push",push_front:"unshift","JSON.parse":"json_parse","JSON.stringify":"json_stringify"});Hs=class{tokens;current=0;file;constructor(e,n){this.tokens=e,this.file=n}parse(){let e=[],n=this.peek();for(;!this.isAtEnd();)e.push(this.parseDeclaration(!0));let r={kind:"Program",statements:e,line:n.line,column:n.column,file:this.file};return this.file&&pa(r,this.file),r}parseDeclaration(e=!1){try{if(this.match("FN"))return this.parseFunctionDecl();if(this.match("LET"))return this.parseVarDecl();if(this.match("IMPORT")){if(!e)throw new M("'import' statement is only allowed at the top level of a file",this.previous().line,this.previous().column,"PARSER",this.file);return this.parseImportStmt()}return this.parseStatement()}catch(n){throw n instanceof M?n:new M(n instanceof Error?n.message:String(n),this.peek().line,this.peek().column,"PARSER",this.file)}}parsePackageStmt(){let e=this.advance(),n=this.consume("IDENTIFIER","Expected package name");return this.consume("SEMICOLON","Expected ';' after package name"),{kind:"PackageStmt",name:n.value,line:e.line,column:e.column,file:this.file}}parseImportStmt(){let e=this.previous();if(this.check("FSTRING_START")){let r=this.peek();throw new M("Import paths require an unprefixed short string",r.line,r.column,"PARSER",this.file)}let n=this.consume("STRING","Expected file path string after 'import'");if(!n.value.trim())throw new M("Import specifier must not be empty or whitespace-only",e.line,e.column,"CHECKER",this.file);if(/[\0\r\n]/.test(n.value))throw new M("Import specifier must not contain NUL or line breaks",e.line,e.column,"CHECKER",this.file);if(n.stringLiteral?.prefix||n.stringLiteral?.triple)throw new M("Import paths require an unprefixed short string",n.line,n.column,"PARSER",this.file);if(this.check("IDENTIFIER")&&this.peek().value==="as"&&this.peek().line===n.line){let r=this.peek();throw new M("import has no as clause: a module is a literal include; its package name is declared inside the module (package ns;)",r.line,r.column,"PARSER",this.file)}return this.consumeOptionalSemicolon(),{kind:"ImportStmt",path:n.value,hostModule:Js(n.value),line:e.line,column:e.column,file:this.file}}parseFunctionDecl(){let e=this.previous(),n=this.consume("IDENTIFIER","Expected function name after 'fn'");this.consume("LPAREN","Expected '(' after function name");let r=[];if(!this.check("RPAREN"))do{let i=this.consume("IDENTIFIER","Expected parameter name");r.push(i.value)}while(this.match("COMMA"));this.consume("RPAREN","Expected ')' after parameters"),this.consume("LBRACE","Expected '{' before function body");let s=this.parseBlockBody(this.previous());return{kind:"FunctionDeclStmt",name:n.value,params:r,body:s,line:e.line,column:e.column}}parseVarDecl(){let e=this.previous();if(this.match("LPAREN","LBRACKET")){let s=this.previous().type==="LPAREN"?"RPAREN":"RBRACKET",i=[];if(!this.check(s))do{let a=this.consume("IDENTIFIER","Expected variable name in destructuring");i.push(a.value)}while(this.match("COMMA"));this.consume(s,`Expected '${s==="RPAREN"?")":"]"}' after variable list`),this.consume("ASSIGN","Expected '=' after destructuring variable list");let o=this.parseExpression();return this.consumeOptionalSemicolon(),{kind:"TupleVarDeclStmt",names:i,initializer:o,line:e.line,column:e.column}}let n=this.consume("IDENTIFIER","Expected variable name after 'let'"),r;return this.match("ASSIGN")&&(r=this.parseExpression()),this.consumeOptionalSemicolon(),{kind:"VarDeclStmt",name:n.value,initializer:r,line:e.line,column:e.column}}parseStatement(){if(this.check("IDENTIFIER")&&this.peek().value==="package"&&this.tokens[this.current+1]?.type==="IDENTIFIER")return this.parsePackageStmt();if(this.match("IMPORT"))throw new M("'import' statement is only allowed at the top level of a file",this.previous().line,this.previous().column,"PARSER",this.file);return this.match("SYNC")?this.parseSyncStatement():this.match("IF")?this.parseIfStatement():this.match("WHILE")?this.parseWhileStatement():this.match("FOR")?this.parseForStatement():this.match("RETURN")?this.parseReturnStatement():this.match("BREAK")?this.parseBreakStatement():this.match("CONTINUE")?this.parseContinueStatement():this.match("LBRACE")?this.parseBlockBody(this.previous()):this.parseExpressionStatement()}parseSyncStatement(){let e=this.previous(),n=this.parseExpression();if(this.consumeOptionalSemicolon(),n.kind==="AssignExpr")return{kind:"SyncAssignStmt",target:n.target,value:n.value,line:e.line,column:e.column};if(n.kind==="IndexAssignExpr")return{kind:"SyncIndexAssignStmt",target:n.target,index:n.index,value:n.value,line:e.line,column:e.column};if(n.kind==="CallExpr")return{kind:"SyncCallStmt",call:n,line:e.line,column:e.column};throw new M("Invalid 'sync' statement target; expected variable assignment ('sync a = ...'), member/index assignment ('sync obj.k = ...'), or container mutation call ('sync push(arr, ...)').",e.line,e.column,"PARSER",this.file)}parseIfStatement(){let e=this.previous();this.consume("LPAREN","Expected '(' after 'if'");let n=this.parseExpression();this.consume("RPAREN","Expected ')' after if condition");let r=this.parseStatement(),s;return this.match("ELSE")&&(s=this.parseStatement()),{kind:"IfStmt",condition:n,thenBranch:r,elseBranch:s,line:e.line,column:e.column}}parseWhileStatement(){let e=this.previous();this.consume("LPAREN","Expected '(' after 'while'");let n=this.parseExpression();this.consume("RPAREN","Expected ')' after while condition");let r=this.parseStatement();return{kind:"WhileStmt",condition:n,body:r,line:e.line,column:e.column}}parseForStatement(){let e=this.previous();if(this.consume("LPAREN","Expected '(' after 'for'"),this.check("IDENTIFIER")&&this.tokens[this.current+1]?.type==="COMMA")throw new M("For-in requires one binding; use 'for (x in expr)'",this.peek().line,this.peek().column,"PARSER",this.file);if(this.check("IDENTIFIER")&&this.tokens[this.current+1]?.type==="IDENTIFIER"&&this.tokens[this.current+1].value==="in"){let o=this.advance().value;if(this.advance(),this.check("RPAREN"))throw new M("Expected expression after 'in' in for-loop",this.peek().line,this.peek().column,"PARSER",this.file);let a=this.parseExpression();this.consume("RPAREN","Expected ')' after for-in expression");let l=this.parseStatement();return{kind:"ForInStmt",name:o,iterable:a,body:l,line:e.line,column:e.column}}let n;if(this.match("SEMICOLON"))n=void 0;else if(this.match("LET"))n=this.parseVarDecl();else{let o=this.parseExpression();this.consume("SEMICOLON","Expected ';' after for-loop initializer"),n={kind:"ExprStmt",expr:o,line:o.line,column:o.column}}let r;this.check("SEMICOLON")||(r=this.parseExpression()),this.consume("SEMICOLON","Expected ';' after for-loop condition");let s;this.check("RPAREN")||(s=this.parseExpression()),this.consume("RPAREN","Expected ')' after for clauses");let i=this.parseStatement();return{kind:"ForStmt",init:n,condition:r,update:s,body:i,line:e.line,column:e.column}}parseReturnStatement(){let e=this.previous(),n;return!this.check("SEMICOLON")&&!this.check("RBRACE")&&!this.isAtEnd()&&(n=this.parseExpression()),this.consumeOptionalSemicolon(),{kind:"ReturnStmt",value:n,line:e.line,column:e.column}}parseBreakStatement(){let e=this.previous();return this.consumeOptionalSemicolon(),{kind:"BreakStmt",line:e.line,column:e.column}}parseContinueStatement(){let e=this.previous();return this.consumeOptionalSemicolon(),{kind:"ContinueStmt",line:e.line,column:e.column}}parseBlockBody(e){let n=[];for(;!this.check("RBRACE")&&!this.isAtEnd();)n.push(this.parseDeclaration());return this.consume("RBRACE","Expected '}' after block"),{kind:"BlockStmt",statements:n,line:e.line,column:e.column}}parseExpressionStatement(){let e=this.parseExpression();return this.consumeOptionalSemicolon(),{kind:"ExprStmt",expr:e,line:e.line,column:e.column}}parseExpression(){return this.parseAssignment()}parseAssignment(){let e=this.parseConditional();if(this.match("ASSIGN")){let n=this.previous(),r=this.parseAssignment();if(e.kind==="IdentifierExpr")return{kind:"AssignExpr",target:e.name,value:r,line:n.line,column:n.column};if(e.kind==="IndexExpr")return{kind:"IndexAssignExpr",target:e.target,index:e.index,value:r,line:n.line,column:n.column};if(e.kind==="TupleExpr"||e.kind==="ArrayExpr"){let s=[];for(let i of e.elements){if(i.kind!=="IdentifierExpr")throw new M("Destructuring assignment target must be an identifier",i.line,i.column,"PARSER",this.file);s.push(i.name)}return{kind:"TupleAssignExpr",targets:s,value:r,line:n.line,column:n.column}}throw new M("Invalid assignment target",e.line,e.column,"PARSER",this.file)}return e}parseConditional(){let e=this.parseLogicalOr();if(!this.match("QUESTION"))return e;let n=this.previous(),r=()=>["COLON","SEMICOLON","RPAREN","RBRACKET","RBRACE","FSTRING_FIELD_END","EOF","COMMA"].includes(this.peek().type);if(r())throw new M("Expected true arm after '?'",this.peek().line,this.peek().column,"PARSER",this.file);let s=this.parseAssignment();if(this.consume("COLON","Expected ':' after conditional true arm"),r())throw new M("Expected false arm after ':'",this.peek().line,this.peek().column,"PARSER",this.file);let i=this.parseAssignment();return{kind:"ConditionalExpr",condition:e,trueArm:s,falseArm:i,line:n.line,column:n.column}}parseLogicalOr(){let e=this.parseLogicalAnd();for(;this.match("OR");){let n=this.previous(),r=this.parseLogicalAnd();e={kind:"BinaryExpr",operator:"||",left:e,right:r,line:n.line,column:n.column}}return e}parseLogicalAnd(){let e=this.parseEquality();for(;this.match("AND");){let n=this.previous(),r=this.parseEquality();e={kind:"BinaryExpr",operator:"&&",left:e,right:r,line:n.line,column:n.column}}return e}parseEquality(){let e=this.parseRelational();for(;this.match("EQUAL","NOT_EQUAL");){let n=this.previous(),r=n.type==="EQUAL"?"==":"!=",s=this.parseRelational();e={kind:"BinaryExpr",operator:r,left:e,right:s,line:n.line,column:n.column}}return e}parseRelational(){let e=this.parseAdditive();for(;this.match("LESS","LESS_EQUAL","GREATER","GREATER_EQUAL");){let n=this.previous(),r=n.type==="LESS"?"<":n.type==="LESS_EQUAL"?"<=":n.type==="GREATER"?">":">=",s=this.parseAdditive();e={kind:"BinaryExpr",operator:r,left:e,right:s,line:n.line,column:n.column}}return e}parseAdditive(){let e=this.parseMultiplicative();for(;this.match("PLUS","MINUS");){let n=this.previous(),r=n.type==="PLUS"?"+":"-",s=this.parseMultiplicative();e={kind:"BinaryExpr",operator:r,left:e,right:s,line:n.line,column:n.column}}return e}parseMultiplicative(){let e=this.parseUnary();for(;this.match("STAR","SLASH","PERCENT");){let n=this.previous(),r=n.type==="STAR"?"*":n.type==="SLASH"?"/":"%",s=this.parseUnary();e={kind:"BinaryExpr",operator:r,left:e,right:s,line:n.line,column:n.column}}return e}parseUnary(){if(this.match("NOT","MINUS")){let e=this.previous(),n=e.type==="NOT"?"!":"-",r=this.parseUnary();return{kind:"UnaryExpr",operator:n,operand:r,line:e.line,column:e.column}}return this.parseCallAndIndex()}parseCallAndIndex(){let e=this.parsePrimary();for(;;)if(this.match("LPAREN")){let n=Hu(e);if(!n)throw new M("Only identifiers or package members can be called directly as functions",e.line,e.column,"PARSER",this.file);let r=[];if(!this.check("RPAREN"))do r.push(this.parseExpression());while(this.match("COMMA"));this.consume("RPAREN","Expected ')' after function arguments"),e={kind:"CallExpr",callee:n,args:r,line:e.line,column:e.column}}else if(this.match("LBRACKET")){let n=this.parseExpression();this.consume("RBRACKET","Expected ']' after index expression"),e={kind:"IndexExpr",target:e,index:n,line:e.line,column:e.column}}else if(this.match("DOT")){let n=this.consume("IDENTIFIER","Expected property name after '.'");e={kind:"IndexExpr",target:e,index:{kind:"LiteralExpr",value:n.value,line:n.line,column:n.column},line:n.line,column:n.column}}else break;return e}parsePrimary(){let e=this.peek();if(this.check("FSTRING_START"))return this.parseFormattedString();if(this.match("NUMBER","STRING","TRUE","FALSE","NULL"))return{kind:"LiteralExpr",value:this.previous().literal,line:e.line,column:e.column};if(this.match("PARALLEL")){let n=this.previous();this.consume("LPAREN","Expected '(' after 'parallel'"),this.consume("LBRACKET","Expected '[' starting array of function calls in 'parallel([ ... ])'");let r=[];if(!this.check("RBRACKET"))do{let s=this.parseExpression();if(s.kind!=="CallExpr")throw new M("Each task in parallel([...]) must be a direct function call expression",s.line,s.column,"PARSER",this.file);r.push(s)}while(this.match("COMMA"));return this.consume("RBRACKET","Expected ']' closing array in 'parallel([ ... ])'"),this.consume("RPAREN","Expected ')' closing 'parallel(...)'"),{kind:"ParallelExpr",tasks:r,line:n.line,column:n.column}}if(this.match("IDENTIFIER"))return{kind:"IdentifierExpr",name:this.previous().value,line:e.line,column:e.column};if(this.match("LPAREN")){let n=this.previous(),r=[],s=!1;if(!this.check("RPAREN"))do if(r.push(this.parseExpression()),this.match("COMMA"))s=!0;else break;while(!this.check("RPAREN")&&!this.isAtEnd());return this.consume("RPAREN","Expected ')' after expression"),r.length===1&&!s?{kind:"GroupingExpr",expression:r[0],line:n.line,column:n.column}:{kind:"TupleExpr",elements:r,line:n.line,column:n.column}}if(this.match("LBRACKET")){let n=[];if(!this.check("RBRACKET"))do n.push(this.parseExpression());while(this.match("COMMA"));return this.consume("RBRACKET","Expected ']' after array elements"),{kind:"ArrayExpr",elements:n,line:e.line,column:e.column}}if(this.match("LBRACE")){let n=this.previous(),r=[];if(!this.check("RBRACE"))do{let s="";if(this.match("IDENTIFIER","STRING"))s=this.previous().value;else throw new M("Expected object key (identifier or string)",this.peek().line,this.peek().column,"PARSER",this.file);let i=this.previous();this.consume("COLON","Expected ':' after object key");let o=this.parseExpression();r.push({key:s,value:o,line:i.line,column:i.column})}while(this.match("COMMA"));return this.consume("RBRACE","Expected '}' after object literal"),{kind:"ObjectExpr",properties:r,line:n.line,column:n.column}}throw new M(`Unexpected token '${e.value||e.type}' in expression`,e.line,e.column,"PARSER",this.file)}parseFormattedString(){let e=this.advance(),n=[];for(;!this.check("FSTRING_END")&&!this.isAtEnd();){if(this.match("FSTRING_TEXT")){n.push(this.previous().value);continue}let r=this.consume("FSTRING_FIELD_START","Expected formatted-string text or field"),s=this.parseExpression();this.validateFieldExpression(s);let i=this.consume("FSTRING_FIELD_END","Expected '}' after one formatted-string expression");n.push({expression:s,line:r.line,column:r.column,file:this.file,offset:r.offset,endOffset:i.endOffset})}return this.consume("FSTRING_END","Unterminated formatted string"),{kind:"InterpolatedStringExpr",parts:n,line:e.line,column:e.column,file:this.file}}validateFieldExpression(e){let n=[];switch(e.kind){case"AssignExpr":case"IndexAssignExpr":case"TupleAssignExpr":case"ParallelExpr":throw new M("Assignment and parallel expressions are not permitted in formatted-string fields",e.line,e.column,"PARSER",this.file);case"UnaryExpr":n=[e.operand];break;case"BinaryExpr":n=[e.left,e.right];break;case"ConditionalExpr":n=[e.condition,e.trueArm,e.falseArm];break;case"GroupingExpr":n=[e.expression];break;case"CallExpr":n=e.args;break;case"ArrayExpr":case"TupleExpr":n=e.elements;break;case"ObjectExpr":n=e.properties.map(r=>r.value);break;case"IndexExpr":n=[e.target,e.index];break;case"InterpolatedStringExpr":n=e.parts.flatMap(r=>typeof r=="string"?[]:[r.expression]);break;case"LiteralExpr":case"IdentifierExpr":break}for(let r of n)this.validateFieldExpression(r)}match(...e){for(let n of e)if(this.check(n))return this.advance(),!0;return!1}check(e){return this.isAtEnd()?!1:this.peek().type===e}advance(){return this.isAtEnd()||this.current++,this.previous()}isAtEnd(){return this.peek().type==="EOF"}peek(){return this.tokens[this.current]}previous(){return this.tokens[this.current-1]}consume(e,n){if(this.check(e))return this.advance();let r=this.peek();throw new M(n,r.line,r.column,"PARSER",this.file)}consumeOptionalSemicolon(){this.check("SEMICOLON")&&this.advance()}},nw=`# LMScript Standard Library (std.lms)
310
+ `?this.consumeStringNewline():this.advance())):u+=this.readModernEscape(c.formatted):u+=this.advance()}throw new M("Unterminated string literal; expected "+l,n,r,"LEXER",this.file)}finally{this.modes.pop(),c.formatted&&this.formattedDepth--}}readIdentifier(e,n){let r="";for(;this.pos<this.length&&this.isAlphaNumeric(this.peek());)r+=this.advance();let s=Object.hasOwn(Us,r)?Us[r]:void 0;if(s){let i;return s==="TRUE"&&(i=!0),s==="FALSE"&&(i=!1),s==="NULL"&&(i=null),{type:s,value:r,literal:i,line:e,column:n}}return{type:"IDENTIFIER",value:r,line:e,column:n}}};Bs=Object.freeze({count:"len",findall:"regex_find_all",has:"has_key",match:"regex_match",test:"regex_test",search:"regex_match",regex_split:"split_regex",regexSplit:"split_regex",splitRegex:"split_regex",clock:"now",json:"json_parse",sleep:"sleep_ms",urlget:"http_get",capitalize:"upper_first",startsWith:"starts_with",endsWith:"ends_with",indexOf:"index_of",lastIndexOf:"last_index_of",toUpperCase:"upper",toLowerCase:"lower",parseInt:"num",parseFloat:"num",trimStart:"trim_start",trimLeft:"trim_start",trimEnd:"trim_end",trimRight:"trim_end",strip:"trim",lstrip:"trim_start",rstrip:"trim_end",length:"len",append:"push",prepend:"unshift",push_back:"push",push_front:"unshift","JSON.parse":"json_parse","JSON.stringify":"json_stringify"});Ws=class{tokens;current=0;file;constructor(e,n){this.tokens=e,this.file=n}parse(){let e=[],n=this.peek();for(;!this.isAtEnd();)e.push(this.parseDeclaration(!0));let r={kind:"Program",statements:e,line:n.line,column:n.column,file:this.file};return this.file&&ha(r,this.file),r}parseDeclaration(e=!1){try{if(this.match("FN"))return this.parseFunctionDecl();if(this.match("LET"))return this.parseVarDecl();if(this.match("IMPORT")){if(!e)throw new M("'import' statement is only allowed at the top level of a file",this.previous().line,this.previous().column,"PARSER",this.file);return this.parseImportStmt()}return this.parseStatement()}catch(n){throw n instanceof M?n:new M(n instanceof Error?n.message:String(n),this.peek().line,this.peek().column,"PARSER",this.file)}}parsePackageStmt(){let e=this.advance(),n=this.consume("IDENTIFIER","Expected package name");return this.consume("SEMICOLON","Expected ';' after package name"),{kind:"PackageStmt",name:n.value,line:e.line,column:e.column,file:this.file}}parseImportStmt(){let e=this.previous();if(this.check("FSTRING_START")){let r=this.peek();throw new M("Import paths require an unprefixed short string",r.line,r.column,"PARSER",this.file)}let n=this.consume("STRING","Expected file path string after 'import'");if(!n.value.trim())throw new M("Import specifier must not be empty or whitespace-only",e.line,e.column,"CHECKER",this.file);if(/[\0\r\n]/.test(n.value))throw new M("Import specifier must not contain NUL or line breaks",e.line,e.column,"CHECKER",this.file);if(n.stringLiteral?.prefix||n.stringLiteral?.triple)throw new M("Import paths require an unprefixed short string",n.line,n.column,"PARSER",this.file);if(this.check("IDENTIFIER")&&this.peek().value==="as"&&this.peek().line===n.line){let r=this.peek();throw new M("import has no as clause: a module is a literal include; its package name is declared inside the module (package ns;)",r.line,r.column,"PARSER",this.file)}return this.consumeOptionalSemicolon(),{kind:"ImportStmt",path:n.value,hostModule:zs(n.value),line:e.line,column:e.column,file:this.file}}parseFunctionDecl(){let e=this.previous(),n=this.consume("IDENTIFIER","Expected function name after 'fn'");this.consume("LPAREN","Expected '(' after function name");let r=[];if(!this.check("RPAREN"))do{let i=this.consume("IDENTIFIER","Expected parameter name");r.push(i.value)}while(this.match("COMMA"));this.consume("RPAREN","Expected ')' after parameters"),this.consume("LBRACE","Expected '{' before function body");let s=this.parseBlockBody(this.previous());return{kind:"FunctionDeclStmt",name:n.value,params:r,body:s,line:e.line,column:e.column}}parseVarDecl(){let e=this.previous();if(this.match("LPAREN","LBRACKET")){let s=this.previous().type==="LPAREN"?"RPAREN":"RBRACKET",i=[];if(!this.check(s))do{let a=this.consume("IDENTIFIER","Expected variable name in destructuring");i.push(a.value)}while(this.match("COMMA"));this.consume(s,`Expected '${s==="RPAREN"?")":"]"}' after variable list`),this.consume("ASSIGN","Expected '=' after destructuring variable list");let o=this.parseExpression();return this.consumeOptionalSemicolon(),{kind:"TupleVarDeclStmt",names:i,initializer:o,line:e.line,column:e.column}}let n=this.consume("IDENTIFIER","Expected variable name after 'let'"),r;return this.match("ASSIGN")&&(r=this.parseExpression()),this.consumeOptionalSemicolon(),{kind:"VarDeclStmt",name:n.value,initializer:r,line:e.line,column:e.column}}parseStatement(){if(this.check("IDENTIFIER")&&this.peek().value==="package"&&this.tokens[this.current+1]?.type==="IDENTIFIER")return this.parsePackageStmt();if(this.match("IMPORT"))throw new M("'import' statement is only allowed at the top level of a file",this.previous().line,this.previous().column,"PARSER",this.file);return this.match("SYNC")?this.parseSyncStatement():this.match("IF")?this.parseIfStatement():this.match("WHILE")?this.parseWhileStatement():this.match("FOR")?this.parseForStatement():this.match("RETURN")?this.parseReturnStatement():this.match("BREAK")?this.parseBreakStatement():this.match("CONTINUE")?this.parseContinueStatement():this.match("LBRACE")?this.parseBlockBody(this.previous()):this.parseExpressionStatement()}parseSyncStatement(){let e=this.previous(),n=this.parseExpression();if(this.consumeOptionalSemicolon(),n.kind==="AssignExpr")return{kind:"SyncAssignStmt",target:n.target,value:n.value,line:e.line,column:e.column};if(n.kind==="IndexAssignExpr")return{kind:"SyncIndexAssignStmt",target:n.target,index:n.index,value:n.value,line:e.line,column:e.column};if(n.kind==="CallExpr")return{kind:"SyncCallStmt",call:n,line:e.line,column:e.column};throw new M("Invalid 'sync' statement target; expected variable assignment ('sync a = ...'), member/index assignment ('sync obj.k = ...'), or container mutation call ('sync push(arr, ...)').",e.line,e.column,"PARSER",this.file)}parseIfStatement(){let e=this.previous();this.consume("LPAREN","Expected '(' after 'if'");let n=this.parseExpression();this.consume("RPAREN","Expected ')' after if condition");let r=this.parseStatement(),s;return this.match("ELSE")&&(s=this.parseStatement()),{kind:"IfStmt",condition:n,thenBranch:r,elseBranch:s,line:e.line,column:e.column}}parseWhileStatement(){let e=this.previous();this.consume("LPAREN","Expected '(' after 'while'");let n=this.parseExpression();this.consume("RPAREN","Expected ')' after while condition");let r=this.parseStatement();return{kind:"WhileStmt",condition:n,body:r,line:e.line,column:e.column}}parseForStatement(){let e=this.previous();if(this.consume("LPAREN","Expected '(' after 'for'"),this.check("IDENTIFIER")&&this.tokens[this.current+1]?.type==="COMMA")throw new M("For-in requires one binding; use 'for (x in expr)'",this.peek().line,this.peek().column,"PARSER",this.file);if(this.check("IDENTIFIER")&&this.tokens[this.current+1]?.type==="IDENTIFIER"&&this.tokens[this.current+1].value==="in"){let o=this.advance().value;if(this.advance(),this.check("RPAREN"))throw new M("Expected expression after 'in' in for-loop",this.peek().line,this.peek().column,"PARSER",this.file);let a=this.parseExpression();this.consume("RPAREN","Expected ')' after for-in expression");let l=this.parseStatement();return{kind:"ForInStmt",name:o,iterable:a,body:l,line:e.line,column:e.column}}let n;if(this.match("SEMICOLON"))n=void 0;else if(this.match("LET"))n=this.parseVarDecl();else{let o=this.parseExpression();this.consume("SEMICOLON","Expected ';' after for-loop initializer"),n={kind:"ExprStmt",expr:o,line:o.line,column:o.column}}let r;this.check("SEMICOLON")||(r=this.parseExpression()),this.consume("SEMICOLON","Expected ';' after for-loop condition");let s;this.check("RPAREN")||(s=this.parseExpression()),this.consume("RPAREN","Expected ')' after for clauses");let i=this.parseStatement();return{kind:"ForStmt",init:n,condition:r,update:s,body:i,line:e.line,column:e.column}}parseReturnStatement(){let e=this.previous(),n;return!this.check("SEMICOLON")&&!this.check("RBRACE")&&!this.isAtEnd()&&(n=this.parseExpression()),this.consumeOptionalSemicolon(),{kind:"ReturnStmt",value:n,line:e.line,column:e.column}}parseBreakStatement(){let e=this.previous();return this.consumeOptionalSemicolon(),{kind:"BreakStmt",line:e.line,column:e.column}}parseContinueStatement(){let e=this.previous();return this.consumeOptionalSemicolon(),{kind:"ContinueStmt",line:e.line,column:e.column}}parseBlockBody(e){let n=[];for(;!this.check("RBRACE")&&!this.isAtEnd();)n.push(this.parseDeclaration());return this.consume("RBRACE","Expected '}' after block"),{kind:"BlockStmt",statements:n,line:e.line,column:e.column}}parseExpressionStatement(){let e=this.parseExpression();return this.consumeOptionalSemicolon(),{kind:"ExprStmt",expr:e,line:e.line,column:e.column}}parseExpression(){return this.parseAssignment()}parseAssignment(){let e=this.parseConditional();if(this.match("ASSIGN")){let n=this.previous(),r=this.parseAssignment();if(e.kind==="IdentifierExpr")return{kind:"AssignExpr",target:e.name,value:r,line:n.line,column:n.column};if(e.kind==="IndexExpr")return{kind:"IndexAssignExpr",target:e.target,index:e.index,value:r,line:n.line,column:n.column};if(e.kind==="TupleExpr"||e.kind==="ArrayExpr"){let s=[];for(let i of e.elements){if(i.kind!=="IdentifierExpr")throw new M("Destructuring assignment target must be an identifier",i.line,i.column,"PARSER",this.file);s.push(i.name)}return{kind:"TupleAssignExpr",targets:s,value:r,line:n.line,column:n.column}}throw new M("Invalid assignment target",e.line,e.column,"PARSER",this.file)}return e}parseConditional(){let e=this.parseLogicalOr();if(!this.match("QUESTION"))return e;let n=this.previous(),r=()=>["COLON","SEMICOLON","RPAREN","RBRACKET","RBRACE","FSTRING_FIELD_END","EOF","COMMA"].includes(this.peek().type);if(r())throw new M("Expected true arm after '?'",this.peek().line,this.peek().column,"PARSER",this.file);let s=this.parseAssignment();if(this.consume("COLON","Expected ':' after conditional true arm"),r())throw new M("Expected false arm after ':'",this.peek().line,this.peek().column,"PARSER",this.file);let i=this.parseAssignment();return{kind:"ConditionalExpr",condition:e,trueArm:s,falseArm:i,line:n.line,column:n.column}}parseLogicalOr(){let e=this.parseLogicalAnd();for(;this.match("OR");){let n=this.previous(),r=this.parseLogicalAnd();e={kind:"BinaryExpr",operator:"||",left:e,right:r,line:n.line,column:n.column}}return e}parseLogicalAnd(){let e=this.parseEquality();for(;this.match("AND");){let n=this.previous(),r=this.parseEquality();e={kind:"BinaryExpr",operator:"&&",left:e,right:r,line:n.line,column:n.column}}return e}parseEquality(){let e=this.parseRelational();for(;this.match("EQUAL","NOT_EQUAL");){let n=this.previous(),r=n.type==="EQUAL"?"==":"!=",s=this.parseRelational();e={kind:"BinaryExpr",operator:r,left:e,right:s,line:n.line,column:n.column}}return e}parseRelational(){let e=this.parseAdditive();for(;this.match("LESS","LESS_EQUAL","GREATER","GREATER_EQUAL");){let n=this.previous(),r=n.type==="LESS"?"<":n.type==="LESS_EQUAL"?"<=":n.type==="GREATER"?">":">=",s=this.parseAdditive();e={kind:"BinaryExpr",operator:r,left:e,right:s,line:n.line,column:n.column}}return e}parseAdditive(){let e=this.parseMultiplicative();for(;this.match("PLUS","MINUS");){let n=this.previous(),r=n.type==="PLUS"?"+":"-",s=this.parseMultiplicative();e={kind:"BinaryExpr",operator:r,left:e,right:s,line:n.line,column:n.column}}return e}parseMultiplicative(){let e=this.parseUnary();for(;this.match("STAR","SLASH","PERCENT");){let n=this.previous(),r=n.type==="STAR"?"*":n.type==="SLASH"?"/":"%",s=this.parseUnary();e={kind:"BinaryExpr",operator:r,left:e,right:s,line:n.line,column:n.column}}return e}parseUnary(){if(this.match("NOT","MINUS")){let e=this.previous(),n=e.type==="NOT"?"!":"-",r=this.parseUnary();return{kind:"UnaryExpr",operator:n,operand:r,line:e.line,column:e.column}}return this.parseCallAndIndex()}parseCallAndIndex(){let e=this.parsePrimary();for(;;)if(this.match("LPAREN")){let n=Gu(e);if(!n)throw new M("Only identifiers or package members can be called directly as functions",e.line,e.column,"PARSER",this.file);let r=[];if(!this.check("RPAREN"))do r.push(this.parseExpression());while(this.match("COMMA"));this.consume("RPAREN","Expected ')' after function arguments"),e={kind:"CallExpr",callee:n,args:r,line:e.line,column:e.column}}else if(this.match("LBRACKET")){let n=this.parseExpression();this.consume("RBRACKET","Expected ']' after index expression"),e={kind:"IndexExpr",target:e,index:n,line:e.line,column:e.column}}else if(this.match("DOT")){let n=this.consume("IDENTIFIER","Expected property name after '.'");e={kind:"IndexExpr",target:e,index:{kind:"LiteralExpr",value:n.value,line:n.line,column:n.column},line:n.line,column:n.column}}else break;return e}parsePrimary(){let e=this.peek();if(this.check("FSTRING_START"))return this.parseFormattedString();if(this.match("NUMBER","STRING","TRUE","FALSE","NULL"))return{kind:"LiteralExpr",value:this.previous().literal,line:e.line,column:e.column};if(this.match("PARALLEL")){let n=this.previous();this.consume("LPAREN","Expected '(' after 'parallel'"),this.consume("LBRACKET","Expected '[' starting array of function calls in 'parallel([ ... ])'");let r=[];if(!this.check("RBRACKET"))do{let s=this.parseExpression();if(s.kind!=="CallExpr")throw new M("Each task in parallel([...]) must be a direct function call expression",s.line,s.column,"PARSER",this.file);r.push(s)}while(this.match("COMMA"));return this.consume("RBRACKET","Expected ']' closing array in 'parallel([ ... ])'"),this.consume("RPAREN","Expected ')' closing 'parallel(...)'"),{kind:"ParallelExpr",tasks:r,line:n.line,column:n.column}}if(this.match("IDENTIFIER"))return{kind:"IdentifierExpr",name:this.previous().value,line:e.line,column:e.column};if(this.match("LPAREN")){let n=this.previous(),r=[],s=!1;if(!this.check("RPAREN"))do if(r.push(this.parseExpression()),this.match("COMMA"))s=!0;else break;while(!this.check("RPAREN")&&!this.isAtEnd());return this.consume("RPAREN","Expected ')' after expression"),r.length===1&&!s?{kind:"GroupingExpr",expression:r[0],line:n.line,column:n.column}:{kind:"TupleExpr",elements:r,line:n.line,column:n.column}}if(this.match("LBRACKET")){let n=[];if(!this.check("RBRACKET"))do n.push(this.parseExpression());while(this.match("COMMA"));return this.consume("RBRACKET","Expected ']' after array elements"),{kind:"ArrayExpr",elements:n,line:e.line,column:e.column}}if(this.match("LBRACE")){let n=this.previous(),r=[];if(!this.check("RBRACE"))do{let s="";if(this.match("IDENTIFIER","STRING"))s=this.previous().value;else throw new M("Expected object key (identifier or string)",this.peek().line,this.peek().column,"PARSER",this.file);let i=this.previous();this.consume("COLON","Expected ':' after object key");let o=this.parseExpression();r.push({key:s,value:o,line:i.line,column:i.column})}while(this.match("COMMA"));return this.consume("RBRACE","Expected '}' after object literal"),{kind:"ObjectExpr",properties:r,line:n.line,column:n.column}}throw new M(`Unexpected token '${e.value||e.type}' in expression`,e.line,e.column,"PARSER",this.file)}parseFormattedString(){let e=this.advance(),n=[];for(;!this.check("FSTRING_END")&&!this.isAtEnd();){if(this.match("FSTRING_TEXT")){n.push(this.previous().value);continue}let r=this.consume("FSTRING_FIELD_START","Expected formatted-string text or field"),s=this.parseExpression();this.validateFieldExpression(s);let i=this.consume("FSTRING_FIELD_END","Expected '}' after one formatted-string expression");n.push({expression:s,line:r.line,column:r.column,file:this.file,offset:r.offset,endOffset:i.endOffset})}return this.consume("FSTRING_END","Unterminated formatted string"),{kind:"InterpolatedStringExpr",parts:n,line:e.line,column:e.column,file:this.file}}validateFieldExpression(e){let n=[];switch(e.kind){case"AssignExpr":case"IndexAssignExpr":case"TupleAssignExpr":case"ParallelExpr":throw new M("Assignment and parallel expressions are not permitted in formatted-string fields",e.line,e.column,"PARSER",this.file);case"UnaryExpr":n=[e.operand];break;case"BinaryExpr":n=[e.left,e.right];break;case"ConditionalExpr":n=[e.condition,e.trueArm,e.falseArm];break;case"GroupingExpr":n=[e.expression];break;case"CallExpr":n=e.args;break;case"ArrayExpr":case"TupleExpr":n=e.elements;break;case"ObjectExpr":n=e.properties.map(r=>r.value);break;case"IndexExpr":n=[e.target,e.index];break;case"InterpolatedStringExpr":n=e.parts.flatMap(r=>typeof r=="string"?[]:[r.expression]);break;case"LiteralExpr":case"IdentifierExpr":break}for(let r of n)this.validateFieldExpression(r)}match(...e){for(let n of e)if(this.check(n))return this.advance(),!0;return!1}check(e){return this.isAtEnd()?!1:this.peek().type===e}advance(){return this.isAtEnd()||this.current++,this.previous()}isAtEnd(){return this.peek().type==="EOF"}peek(){return this.tokens[this.current]}previous(){return this.tokens[this.current-1]}consume(e,n){if(this.check(e))return this.advance();let r=this.peek();throw new M(n,r.line,r.column,"PARSER",this.file)}consumeOptionalSemicolon(){this.check("SEMICOLON")&&this.advance()}},aw=`# LMScript Standard Library (std.lms)
311
311
 
312
312
  # String Utilities
313
313
  fn is_blank(s) {
@@ -402,23 +402,23 @@ fn clamp(val, low, high) {
402
402
  }
403
403
  return val;
404
404
  }
405
- `,ca=null;fa=new WeakMap,wr=new WeakMap,Au=["get_property","has_property","get_properties","set_property"];Bs=class{sources=new Map;loaded=!1;path="the registered property source";hint="Define it in the property source";tree={};known=[];constructor(e,n){this.tree.Directory=e,this.tree.NonInteractive=n.LMCTL_NON_INTERACTIVE==="1"}addSource(e,n,r){this.sources.has(e)||(this.sources.set(e,n),this.known.push(...r))}load(e){if(this.loaded)return;let n={};for(let r of this.sources.values()){let s;try{s=r()}catch(i){throw Error(`Property '${e}': ${i instanceof Error?i.message:String(i)}`)}this.path=s.path,this.hint=s.hint??"Define it in the property source";for(let[i,o]of Object.entries(s.properties)){if(i==="Directory"||i==="NonInteractive"||Object.hasOwn(n,i))throw Error(`Property '${i}' conflicts with a read-only invocation fact or another source in ${this.path}`);Be(n,i,structuredClone(o))}}for(let[r,s]of Object.entries(n))Be(this.tree,r,s);this.loaded=!0}find(e,n=!0){let r=ha(ga(e),this.known);n&&!["Directory","NonInteractive"].includes(r.split(".")[0])&&this.load(r);let s=this.tree;for(let i of r.split(".")){if(!s||typeof s!="object"||!Object.hasOwn(s,i))return{found:!1,value:void 0,key:r};s=s[i]}return{found:!0,value:s,key:r}}missing(e){throw Error(`Property '${e}' is not defined in ${this.path}; ${this.hint}`)}get(e,...n){let r=this.find(e);return r.found?Ht(r.value,r.key):n.length?n[0]:this.missing(r.key)}has(e){return this.find(e).found}copy(e=""){if(!e)return this.load("<all>"),Ht(this.tree,"");let n=this.find(e);if(!n.found)return this.missing(n.key);if(!n.value||typeof n.value!="object"||Array.isArray(n.value)||n.value instanceof Date)throw Error(`Property '${n.key}' is not a table; get_properties requires a table`);return Ht(n.value,n.key)}set(e,n){let r=ha(ga(e),this.known);if(["Directory","NonInteractive"].includes(r.split(".")[0]))throw Error(`Property '${r}' is read-only`);let s=Ht(n,r),i=this.find(r),o=this.tree,a=r.split(".");for(let d of a.slice(0,-1)){if(Object.hasOwn(o,d)||Be(o,d,{}),!o[d]||typeof o[d]!="object"||Array.isArray(o[d])||o[d]instanceof Date)throw Error(`Property '${d}' is a value, not a table`);o=o[d]}let l=i.found?Ht(i.value,r):null,c=d=>d!==null&&typeof d=="object"&&!Array.isArray(d)&&!(d instanceof Date);if(i.found&&c(i.value)!==c(s))throw Error(`Property '${r}' cannot change between a table and a value`);return Be(o,a.at(-1),s),l}view(e=""){let n=i=>{let o=e?e+"."+i:i,a=this.find(o);if(!a.found)return this.missing(a.key);if(a.value&&typeof a.value=="object"&&!Array.isArray(a.value)&&!(a.value instanceof Date))return this.view(a.key);let l=Ht(a.value,a.key),c=d=>{if(d&&typeof d=="object"){for(let u of Object.values(d))c(u);Object.freeze(d)}return d};return c(l)},r=()=>{throw Error(`PROPS${e?"."+e:""} is read-only; use set_property`)},s=new Proxy({},{get:(i,o)=>typeof o=="symbol"||o==="then"?void 0:o==="toJSON"?()=>this.copy(e):n(o),ownKeys:()=>(e||this.load("<keys>"),Object.keys(e?this.find(e).value:this.tree)),getOwnPropertyDescriptor:(i,o)=>{if(typeof o!="string")return;!e&&!["Directory","NonInteractive"].includes(o)&&this.load("<keys>");let a=e?this.find(e).value:this.tree;return Object.hasOwn(a,o)?{enumerable:!0,configurable:!0}:void 0},set:r,deleteProperty:r,defineProperty:r,setPrototypeOf:r});return fa.set(s,n),wr.set(s,()=>this.copy(e)),s}};Bt=class{variables=new Set;shadowedGlobals=new Set;parent;isFunctionScope;constructor(e,n=!1){this.parent=e,this.isFunctionScope=n}define(e){this.variables.add(e)}hasInCurrent(e){return this.variables.has(e)}resolvingScope(e){return this.variables.has(e)?this:this.parent?.resolvingScope(e)}resolve(e){return this.variables.has(e)?!0:this.parent?this.parent.resolve(e):!1}resolveInScope(e){return this.variables.has(e)?!0:this.isFunctionScope?!1:this.parent?this.parent.resolveInScope(e):!1}},Ea=class{diagnostics=[];hostFunctions=new Map;options;functions=new Map;currentScope=new Bt;loopDepth=0;inFunction=!1;hasConcurrency=!1;usedGlobals=new Set;usedProperties=!1;loadedPackages=new Set;functionPackages=new WeakMap;constructor(e,n={}){this.options=n;for(let[r,s]of e.entries())this.hostFunctions.set(r,s),this.functions.set(r,{name:r,paramCount:typeof s.arity=="number"?s.arity:-1,params:[],isHost:!0,line:0,column:0})}check(e){if(this.diagnostics=[],this.hasConcurrency=!1,this.usedGlobals.clear(),this.usedProperties=!1,this.loadedPackages=new Set,this.functionPackages=new WeakMap,this.loopDepth=0,this.inFunction=!1,this.currentScope=new Bt,this.options.globals)for(let r of this.options.globals)this.currentScope.define(r);this.functions.clear();for(let[r,s]of this.hostFunctions.entries())this.functions.set(r,{name:r,paramCount:typeof s.arity=="number"?s.arity:-1,params:[],isHost:!0,line:0,column:0});for(let r of e.statements)r.kind==="FunctionDeclStmt"&&this.collectFunction(r);for(let r of e.statements)r.kind==="FunctionDeclStmt"?this.functionPackages.set(r,new Set(this.loadedPackages)):this.checkStmt(r);let n=this.loadedPackages;for(let r of e.statements)r.kind==="FunctionDeclStmt"&&(this.loadedPackages=this.functionPackages.get(r),this.checkStmt(r));return this.loadedPackages=n,this.diagnostics}addError(e,n,r,s){this.diagnostics.push({message:e,line:n,column:r,severity:"error",file:s})}isPropsBinding(e){return e==="PROPS"||e.endsWith(".PROPS")}packageBindingCollision(e){return this.options.sourcePackages?.has(e.split(".").at(-1))??!1}collectFunction(e){for(let r of[e.name,...e.params])this.packageBindingCollision(r)&&this.addError("Package name collision: '"+r+"' is a function or parameter",e.line,e.column,e.file);if((this.isPropsBinding(e.name)||e.params.includes("PROPS"))&&this.addError("PROPS is a reserved read-only map binding",e.line,e.column,e.file),!e.isStdlib&&this.options.reservedFunctionPrefixes?.some(r=>e.name.startsWith(r))){this.addError(`Function name '${e.name}' uses a reserved built-in prefix`,e.line,e.column,e.file);return}if(this.functions.has(e.name)){let r=this.functions.get(e.name);if(r.isHost){this.addError(`Cannot redefine host function '${e.name}'`,e.line,e.column,e.file);return}if(r.isStdlib){this.functions.set(e.name,{name:e.name,paramCount:e.params.length,params:e.params,isHost:!1,isStdlib:!1,file:e.file,line:e.line,column:e.column});return}let s=r.file?`${r.file}:${r.line}`:`line ${r.line}`;this.addError(`Duplicate function declaration '${e.name}' (already defined at ${s})`,e.line,e.column,e.file);return}let n=new Set;for(let r of e.params)n.has(r)&&this.addError(`Duplicate parameter name '${r}' in function '${e.name}'`,e.line,e.column,e.file),n.add(r);this.functions.set(e.name,{name:e.name,paramCount:e.params.length,params:e.params,isHost:!1,isStdlib:e.isStdlib||!1,file:e.file,line:e.line,column:e.column})}checkStmt(e){switch(e.kind){case"PackageStmt":{(this.currentScope.parent||this.inFunction)&&this.addError("package must be the first file-level statement",e.line,e.column,e.file),(["lm_","lmbee_",...this.options.reservedFunctionPrefixes??[]].some(n=>e.name.startsWith(n))||this.options.builtinProviderNames?.includes(e.name))&&this.addError("Package name '"+e.name+"' uses a reserved built-in name/prefix",e.line,e.column,e.file),(e.name==="ARGV"||this.currentScope.resolve(e.name)||this.functions.has(e.name))&&this.addError("Package name collision: '"+e.name+"' is already a variable or function",e.line,e.column,e.file),this.loadedPackages.add(e.name);break}case"ImportStmt":{this.addError("Import must be at file top level; move the literal include before use",e.line,e.column,e.file);break}case"FunctionDeclStmt":{if(this.inFunction||this.currentScope.parent){this.addError("Function declarations are only allowed at top level",e.line,e.column,e.file);break}let n=this.currentScope,r=this.inFunction;this.inFunction=!0,this.currentScope=new Bt(n,!0);for(let s of e.params)this.currentScope.define(s);for(let s of e.body.statements)this.checkStmt(s);this.inFunction=r,this.currentScope=n;break}case"VarDeclStmt":{this.packageBindingCollision(e.name)&&this.addError("Package name collision: '"+e.name+"' is a variable",e.line,e.column,e.file),this.isPropsBinding(e.name)&&this.addError("PROPS is read-only; use set_property",e.line,e.column,e.file),this.currentScope.hasInCurrent(e.name)&&!(this.options.builtinGlobals?.includes(e.name)&&!this.currentScope.parent&&!this.currentScope.shadowedGlobals.has(e.name))&&this.addError(`Variable '${e.name}' is already declared in this scope`,e.line,e.column,e.file),e.initializer&&this.checkExpr(e.initializer),this.currentScope.define(e.name),this.currentScope.shadowedGlobals.add(e.name);break}case"TupleVarDeclStmt":{e.names.some(n=>this.isPropsBinding(n))&&this.addError("PROPS is read-only; use set_property",e.line,e.column,e.file),this.checkExpr(e.initializer);for(let n of e.names)this.packageBindingCollision(n)&&this.addError("Package name collision: '"+n+"' is a tuple binding",e.line,e.column,e.file),this.currentScope.hasInCurrent(n)&&!(this.options.builtinGlobals?.includes(n)&&!this.currentScope.parent&&!this.currentScope.shadowedGlobals.has(n))&&this.addError(`Variable '${n}' is already declared in this scope`,e.line,e.column,e.file),this.currentScope.define(n),this.currentScope.shadowedGlobals.add(n);break}case"IfStmt":{this.checkExpr(e.condition),this.checkStmt(e.thenBranch),e.elseBranch&&this.checkStmt(e.elseBranch);break}case"WhileStmt":{this.checkExpr(e.condition),this.loopDepth++,this.checkStmt(e.body),this.loopDepth--;break}case"ForInStmt":{this.packageBindingCollision(e.name)&&this.addError("Package name collision: '"+e.name+"' is a loop binding",e.line,e.column,e.file),this.isPropsBinding(e.name)&&this.addError("PROPS is a reserved read-only map binding",e.line,e.column,e.file),this.checkExpr(e.iterable);let n=this.currentScope;if(this.currentScope=new Bt(n),this.currentScope.define(e.name),this.loopDepth++,e.body.kind==="BlockStmt")for(let r of e.body.statements)this.checkStmt(r);else this.checkStmt(e.body);this.loopDepth--,this.currentScope=n;break}case"ForStmt":{let n=this.currentScope;this.currentScope=new Bt(n),e.init&&this.checkStmt(e.init),e.condition&&this.checkExpr(e.condition),e.update&&this.checkExpr(e.update),this.loopDepth++,this.checkStmt(e.body),this.loopDepth--,this.currentScope=n;break}case"ReturnStmt":{this.inFunction||this.addError("'return' statement is only allowed inside a function",e.line,e.column,e.file),e.value&&this.checkExpr(e.value);break}case"BreakStmt":{this.loopDepth===0&&this.addError("'break' statement is only allowed inside a loop",e.line,e.column,e.file);break}case"ContinueStmt":{this.loopDepth===0&&this.addError("'continue' statement is only allowed inside a loop",e.line,e.column,e.file);break}case"BlockStmt":{let n=this.currentScope;this.currentScope=new Bt(n);for(let r of e.statements)this.checkStmt(r);this.currentScope=n;break}case"SyncAssignStmt":{this.isPropsBinding(e.target)&&this.addError("PROPS is read-only; use set_property",e.line,e.column,e.file),this.hasConcurrency=!0,this.currentScope.resolve(e.target)||this.addError(`Synchronized assignment target '${e.target}' must be declared beforehand`,e.line,e.column,e.file),this.checkExpr(e.value);break}case"SyncIndexAssignStmt":{this.hasConcurrency=!0,this.checkExpr(e.target),this.checkExpr(e.index),this.checkExpr(e.value);break}case"SyncCallStmt":{this.hasConcurrency=!0;let n=e.call;n.args.length===0&&this.addError(`Synchronized call '${n.callee}' requires at least one argument (the target container)`,e.line,e.column,e.file);let r=this.hostFunctions.get(n.callee);(!r||!r.isContainerMutation)&&this.addError(`Synchronized call '${n.callee}' is not an authorized container mutation operation`,e.line,e.column,e.file),this.checkExpr(e.call);break}case"ExprStmt":{this.checkExpr(e.expr);break}}}checkReadPath(e){let n=e.args[0];for(;n.kind==="GroupingExpr";)n=n.expression;if(n.kind!=="LiteralExpr"){this.diagnostics.push({message:`Cannot preflight dynamic file path in '${e.callee}'; check it at runtime with file_exists(path)`,line:e.line,column:e.column,severity:"warning",file:e.file});return}if(typeof n.value!="string"){this.addError(`File path in '${e.callee}' must be a string`,e.line,e.column,e.file);return}try{if(!$.statSync(n.value).isFile())throw new Error("path is not a regular file");$.accessSync(n.value,$.constants.R_OK)}catch(r){this.addError(`Cannot read file ${JSON.stringify(n.value)}: ${r instanceof Error?r.message:String(r)}`,e.line,e.column,e.file)}}optionLiteral(e){if(e.kind==="GroupingExpr")return this.optionLiteral(e.expression);if(e.kind==="LiteralExpr")return{type:e.value===null?"null":typeof e.value,value:e.value};if(e.kind==="ArrayExpr"||e.kind==="TupleExpr")return{type:"list"};if(e.kind==="ObjectExpr")return{type:"map"};if(e.kind==="UnaryExpr"&&e.operator==="-"&&e.operand.kind==="LiteralExpr"&&typeof e.operand.value=="number")return{type:"number",value:-e.operand.value}}optionSuggestion(e,n){let r=a=>a.toLowerCase().replace(/[_-]/g,"");function s(a,l){let c=Array.from({length:l.length+1},(d,u)=>u);for(let d=1;d<=a.length;d++){let u=[d];for(let m=1;m<=l.length;m++)u[m]=Math.min(u[m-1]+1,c[m]+1,c[m-1]+(a[d-1]===l[m-1]?0:1));c=u}return c[l.length]}let i=n.filter(a=>a.name!=="*"),o=a=>{let l=r(e),c=r(a),d=0;for(;d<l.length&&d<c.length&&l[d]===c[d];)d++;return s(l,c)/Math.max(1,l.length,c.length)-d/Math.max(1,l.length)};return i.sort((a,l)=>o(a.name)-o(l.name)),i[0]?`; did you mean '${i[0].name}'?`:""}checkHostOptions(e,n){for(let[r,s]of n.entries()){if(!s.keys)continue;let i=e.args[r];for(;i?.kind==="GroupingExpr";)i=i.expression;if(i?.kind!=="ObjectExpr")continue;let o=new Set,a=s.open||s.keys.some(l=>l.name==="*"&&(l.type==="any"||l.type==="open"));for(let l of i.properties){let c=l.line??i.line,d=l.column??i.column,u=l.file??i.file;o.has(l.key)&&this.addError(`Duplicate option '${l.key}' in '${e.callee}' argument '${s.name}'`,c,d,u),o.add(l.key);let m=s.keys.find(y=>y.name===l.key);if(!m){a||this.addError(`Unknown option '${l.key}' in '${e.callee}' argument '${s.name}'${this.optionSuggestion(l.key,s.keys)}`,c,d,u);continue}let p=this.optionLiteral(l.value);if(!p||!m.type||m.type==="any"||m.type==="open")continue;let h=m.type.split("|").map(y=>y.trim().replace(/^array$/,"list").replace(/^object$/,"map")),_=["string","number","boolean","null","list","map"];h.every(y=>_.includes(y))&&!h.includes(p.type)&&this.addError(`Option '${l.key}' expects ${m.type}, got ${p.type}`,l.value.line,l.value.column,l.value.file),m.values&&p.type!=="list"&&p.type!=="map"&&!m.values.includes(p.value)&&this.addError(`Option '${l.key}' has a literal value outside its declared values`,l.value.line,l.value.column,l.value.file)}for(let l of s.keys)l.required&&l.name!=="*"&&!o.has(l.name)&&this.addError(`Missing required option '${l.name}' in '${e.callee}' argument '${s.name}'`,i.line,i.column,i.file)}}checkPackageMember(e,n){let r=e.split(".")[0],s=this.options.sourcePackages?.get(r);if(!this.loadedPackages.has(r)&&this.currentScope.resolve(r)){this.addError("Map member calls are not supported; use a named function",n.line,n.column,n.file);return}if(!this.loadedPackages.has(r)){this.addError("package "+r+" not loaded: import it before use; import order matters, leaf packages first",n.line,n.column,n.file);return}s?.members.includes(e)||this.addError("Unknown package member '"+e+"'"+this.optionSuggestion(e,(s?.members??[]).map(i=>({name:i}))),n.line,n.column,n.file)}checkPropertyPath(e,n){let r;try{r=ga(e)}catch(c){this.addError(c.message,n.line,n.column,n.file);return}let s=this.options.propertyDeclarations;if(!s||(r=ha(r,s.known),s.known.includes(r)||s.closedTables?.includes(r)))return;let o=r.split(".")[0],a=this.optionSuggestion(r,s.known.map(c=>({name:c}))),l=(s.closedTables??[]).some(c=>/\d+$/.test(c)&&c.replace(/\d+$/,"")===o.replace(/\d+$/,""));(s.closedTables?.includes(o)||l)&&this.addError(`Unknown property '${e}'${a}`,n.line,n.column,n.file)}checkExpr(e){switch(e.kind){case"InterpolatedStringExpr":for(let n of e.parts)typeof n!="string"&&this.checkExpr(n.expression);break;case"LiteralExpr":break;case"IdentifierExpr":{if(e.name.includes(".")){this.checkPackageMember(e.name,e),this.loadedPackages.has(e.name.split(".")[0])&&!this.currentScope.resolve(e.name)&&!this.functions.has(e.name)&&this.addError("Package variable '"+e.name+"' used before declaration",e.line,e.column,e.file);break}(e.name==="PROPS"||e.name==="expand"||Au.includes(e.name))&&(this.usedProperties=!0);let n=this.currentScope.resolvingScope(e.name);n&&!n.parent&&this.options.globals?.includes(e.name)&&this.usedGlobals.add(e.name),!this.currentScope.resolve(e.name)&&!this.functions.has(e.name)&&this.addError(Object.hasOwn(Us,e.name)?vr(e.name,"Undeclared variable"):this.options.propertyDeclarations?.removedGlobals?.[e.name]?`'${e.name}' was replaced by ${this.options.propertyDeclarations.removedGlobals[e.name]}; declare a local variable if intended`:`Undeclared variable '${e.name}'`,e.line,e.column,e.file);break}case"AssignExpr":{this.packageBindingCollision(e.target)&&this.addError("Package name collision: '"+e.target+"' is a variable",e.line,e.column,e.file),e.target.includes(".")&&this.checkPackageMember(e.target,e),this.isPropsBinding(e.target)&&this.addError("PROPS is read-only; use set_property",e.line,e.column,e.file),this.checkExpr(e.value),this.currentScope.resolveInScope(e.target)||this.currentScope.define(e.target),this.currentScope.resolvingScope(e.target)?.shadowedGlobals.add(e.target);break}case"TupleAssignExpr":{e.targets.some(n=>this.isPropsBinding(n))&&this.addError("PROPS is read-only; use set_property",e.line,e.column,e.file),this.checkExpr(e.value);for(let n of e.targets)this.packageBindingCollision(n)&&this.addError("Package name collision: '"+n+"' is a tuple binding",e.line,e.column,e.file),this.currentScope.resolveInScope(n)||this.currentScope.define(n),this.currentScope.resolvingScope(n)?.shadowedGlobals.add(n);break}case"IndexAssignExpr":{this.checkExpr(e.target),this.checkExpr(e.index),this.checkExpr(e.value);break}case"UnaryExpr":{this.checkExpr(e.operand);break}case"ConditionalExpr":{this.checkExpr(e.condition),this.checkExpr(e.trueArm),this.checkExpr(e.falseArm);break}case"BinaryExpr":{this.checkExpr(e.left),this.checkExpr(e.right);break}case"GroupingExpr":{this.checkExpr(e.expression);break}case"TupleExpr":{for(let n of e.elements)this.checkExpr(n);break}case"ArrayExpr":{for(let n of e.elements)this.checkExpr(n);break}case"ObjectExpr":{for(let n of e.properties)this.checkExpr(n.value);break}case"IndexExpr":{let n=Ws(e);n&&this.checkPropertyPath(n,e),this.checkExpr(e.target),this.checkExpr(e.index);break}case"ParallelExpr":{this.hasConcurrency=!0;for(let n of e.tasks)this.checkExpr(n);break}case"CallExpr":{if(e.callee.includes(".")&&(Object.hasOwn(Us,e.callee)&&!this.options.sourcePackages?.has(e.callee.split(".")[0])?this.addError(vr(e.callee),e.line,e.column,e.file):this.checkPackageMember(e.callee,e)),Au.includes(e.callee)&&(this.usedProperties=!0,e.args[0]?.kind==="LiteralExpr"&&typeof e.args[0].value=="string"&&e.args[0].value!==""&&this.checkPropertyPath(e.args[0].value,e.args[0])),e.callee==="expand"){let i=e.args[0];if(i?.kind==="LiteralExpr"&&typeof i.value=="string")try{let o=aa(i.value),a=e.args[1];for(;a?.kind==="GroupingExpr";)a=a.expression;let l=e.args[1]?a?.kind==="ObjectExpr"?new Set(a.properties.map(d=>d.key)):void 0:new Set,c=new Set;for(let d of o)typeof d!="string"&&(d.kind==="property"?(this.usedProperties=!0,this.checkPropertyPath(d.key,i)):d.kind==="variable"&&l&&!l.has(d.name)&&c.add(d.name));if(c.size){let d=[...c].map(u=>`${u} (not defined)`).join("; ");this.addError(`expand: missing references: ${d}; assign a temporary variable first and pass it in vars.`,i.line,i.column,i.file)}}catch(o){this.addError(o.message,i.line,i.column,i.file)}else this.usedProperties=!0}let n=this.functions.get(e.callee);n?n.paramCount>=0&&e.args.length!==n.paramCount&&this.addError(`Function '${e.callee}' expects ${n.paramCount} argument(s), but received ${e.args.length}`,e.line,e.column,e.file):this.currentScope.resolve(e.callee)||this.addError(vr(e.callee),e.line,e.column,e.file);let r=this.hostFunctions.get(e.callee),s=r?.arity;typeof s=="object"&&(e.args.length<s.min||e.args.length>(s.max??1/0))&&this.addError(`Function '${e.callee}' expects ${s.min}..${s.max??"unlimited"} argument(s), but received ${e.args.length}`,e.line,e.column,e.file),r?.params&&this.checkHostOptions(e,r.params),this.options.checkFiles&&r?.readsFile&&e.args.length>0&&this.checkReadPath(e);for(let i of e.args)this.checkExpr(i);break}}}};Dn=class{value;constructor(e){this.value=e}},dt=class{},ut=class{},Fn=class{name;constructor(e){this.name=e}toString(){return`<function ${this.name}>`}},He=class t{static nextId=1;id=t.nextId++;values=new Map;parent;isFunctionScope;constructor(e,n=!1){this.parent=e,this.isFunctionScope=n}resolveBinding(e){if(this.values.has(e))return{env:this,name:e};if(this.parent)return this.parent.resolveBinding(e)}define(e,n){this.values.set(e,n)}get(e){if(this.values.has(e))return this.values.get(e);if(this.parent)return this.parent.get(e)}has(e){return this.values.has(e)||(this.parent?.has(e)??!1)}hasInScope(e){return this.values.has(e)?!0:this.isFunctionScope?!1:this.parent?this.parent.hasInScope(e):!1}set(e,n){if(this.values.has(e)){this.values.set(e,n);return}if(!this.isFunctionScope&&this.parent&&this.parent.hasInScope(e)){this.parent.set(e,n);return}this.values.set(e,n)}},Xs=class{holderTaskId;depth=0;waiters=[];acquire(e=0,n=1e4){return this.depth===0?(this.holderTaskId=e,this.depth=1,Promise.resolve()):this.holderTaskId===e?(this.depth++,Promise.resolve()):new Promise((r,s)=>{let i;n>0&&(i=setTimeout(()=>{let a=this.waiters.findIndex(l=>l.resolve===o);a!==-1&&(this.waiters.splice(a,1),s(new Error(`Lock acquisition timed out after ${n}ms (possible deadlock)`)))},n));let o=()=>{i&&clearTimeout(i),this.holderTaskId=e,this.depth=1,r()};this.waiters.push({taskId:e,resolve:o})})}release(){this.depth<=0||(this.depth--,this.depth===0&&(this.holderTaskId=void 0,this.waiters.length>0&&this.waiters.shift().resolve()))}async withLock(e,n=0,r=1e4){await this.acquire(n,r);try{return await e()}finally{this.release()}}},wa=class{bindingLocks=new Map;objectLocks=new WeakMap;getBindingLock(e){let n=this.bindingLocks.get(e);return n||(n=new Xs,this.bindingLocks.set(e,n)),n}getObjectLock(e){let n=this.objectLocks.get(e);return n||(n=new Xs,this.objectLocks.set(e,n)),n}},Ta=new WeakMap,ba=class{constructor(e){Ta.set(this,e)}},qs=class{abortSignal;globalEnv;userFunctions=new Map;hostFunctions;stdout;stderr;lockManager=new wa;isAsync;nextTaskId=1;initialGlobals;callDepth=0;asyncCallDepth=new Map;recordedErrors=[];promptHumanConfig;constructor(e,n=a=>console.log(a),r=!1,s,i,o){this.stdout=n,this.stderr=i,this.isAsync=r,this.initialGlobals=s,this.globalEnv=new He,this.hostFunctions=new Map(e),this.promptHumanConfig=o??{mode:"interactive"};let a=e.get("print");(!a||a.isDefault)&&this.hostFunctions.set("print",{...a,fn:(...g)=>{let E=g.map(b=>typeof b=="object"?JSON.stringify(b):String(b)).join(" ");return this.stdout(E),E},arity:{min:0},description:a?.description??"Prints formatted values to output log",isDefault:!0});let l=e.get("println");(!l||l.isDefault)&&this.hostFunctions.set("println",{...l,fn:(...g)=>{let E=g.map(b=>typeof b=="object"?JSON.stringify(b):String(b)).join(" ");return this.stdout(E),E},arity:{min:0},description:l?.description??"Prints line to output log",isDefault:!0});let c=e.get("printf");(!c||c.isDefault)&&this.hostFunctions.set("printf",{...c,fn:(g,...E)=>{let b=Sa(g,E,"printf");return this.stdout(b),b},arity:{min:1},description:c?.description??"Formats and prints %s, %d, %f and %% using sprintf rules",isDefault:!0});let d=e.get("require");(!d||d.isDefault)&&this.hostFunctions.set("require",{...d,fn:(g,E)=>Lu(g,E,b=>{this.recordedErrors.push(b),this.stderr?.(`error: ${b}`)}),arity:2,isDefault:!0});let u=e.get("error");(!u||u.isDefault)&&this.hostFunctions.set("error",{...u,fn:(...g)=>{let E=g.map(b=>typeof b=="object"?JSON.stringify(b):String(b)).join(" ");return this.stderr?this.stderr(`error: ${E}`):typeof process<"u"&&process.stderr?process.stderr.write(`error: ${E}
406
- `):console.error(`error: ${E}`),this.recordedErrors.push(E),E},arity:{min:1},description:u?.description??"Prints error message to stderr and records it for execution error summary",isDefault:!0});let m=e.get("system");(!m||m.isDefault)&&this.hostFunctions.set("system",{fn:(g,E=6e4)=>{if(!Number.isSafeInteger(E)||E<0)throw new Error("system() timeout must be a non-negative safe integer in milliseconds");return this.isAsync?Fu(g,E):Du(g,E)},arity:{min:1,max:2},description:"Executes shell command or argv array directly with shell:false and optional timeoutMs (default 60000), returning {stdout, stderr, code, signal, timed_out, duration_ms, pid}",isDefault:!0});let p=e.get("prompt_human_config");(!p||p.isDefault)&&this.hostFunctions.set("prompt_human_config",{fn:(g,E)=>{if(g===void 0)return{mode:this.promptHumanConfig.mode??"interactive",dir:this.promptHumanConfig.dir??null,timeout_ms:this.promptHumanConfig.timeoutMs??null,poll_interval_ms:this.promptHumanConfig.pollIntervalMs??200};if(typeof g=="string")g==="interactive"?this.promptHumanConfig.mode="interactive":g==="file"?(this.promptHumanConfig.mode="file",E&&(this.promptHumanConfig.dir=String(E))):(this.promptHumanConfig.mode="file",this.promptHumanConfig.dir=g);else if(g&&typeof g=="object"){let b=g.mode?String(g.mode):g.dir?"file":this.promptHumanConfig.mode??"interactive",C=g.dir!==void 0?String(g.dir):this.promptHumanConfig.dir,I=g.timeout_ms!==void 0?Number(g.timeout_ms):g.timeoutMs!==void 0?Number(g.timeoutMs):this.promptHumanConfig.timeoutMs,N=g.poll_ms!==void 0?Number(g.poll_ms):g.pollIntervalMs!==void 0?Number(g.pollIntervalMs):this.promptHumanConfig.pollIntervalMs;this.promptHumanConfig.mode=b==="file"?"file":"interactive",this.promptHumanConfig.dir=C,this.promptHumanConfig.timeoutMs=typeof I=="number"&&Number.isFinite(I)?I:void 0,this.promptHumanConfig.pollIntervalMs=typeof N=="number"&&Number.isFinite(N)&&N>0?N:200}return{mode:this.promptHumanConfig.mode,dir:this.promptHumanConfig.dir??null,timeout_ms:this.promptHumanConfig.timeoutMs??null,poll_interval_ms:this.promptHumanConfig.pollIntervalMs??200}},arity:{min:0,max:2},description:"Configures prompt_human mode ('interactive' or 'file' with dedicated directory, timeout_ms, poll_ms)",isDefault:!0});let h=e.get("prompt_human");(!h||h.isDefault)&&this.hostFunctions.set("prompt_human",{fn:(g,E)=>{if((E?.mode??(E?.dir?"file":this.promptHumanConfig.mode??"interactive"))==="file"){let C=E?.dir??this.promptHumanConfig.dir;if(!C)throw new Error("prompt_human: file mode requires a directory (configure via prompt_human_config({ dir }) or pass { dir })");if(!this.isAsync)throw new Error("prompt_human: file mode requires asynchronous execution (runAsync)");return ju(g,{dir:C,sessionId:E?.sessionId??E?.sessionid??E?.id,timeoutMs:E?.timeout_ms??E?.timeoutMs??this.promptHumanConfig.timeoutMs,pollIntervalMs:E?.poll_ms??E?.pollIntervalMs??this.promptHumanConfig.pollIntervalMs,onWaiting:I=>this.stderr?this.stderr(I):typeof process<"u"&&process.stderr?process.stderr.write(I):void 0})}return this.isAsync?Gs(g):$u(g)},arity:{min:0,max:2},description:"Prompts operator on stdin/terminal or dedicated directory, returning input string or null if closed/non-interactive",isDefault:!0});let _=e.get("shell_quote");(!_||_.isDefault)&&this.hostFunctions.set("shell_quote",{fn:g=>Pu(g),arity:1,description:"Quotes string safely for POSIX shell command execution",isDefault:!0});let y=e.get("run_script");(!y||y.isDefault)&&this.hostFunctions.set("run_script",{fn:(g,E=[])=>{let b=le.resolve(String(g));if(!$.existsSync(b))throw new Error(`run_script: file not found: '${b}'`);let C=$.readFileSync(b,"utf-8"),I=Array.isArray(E)?E.map(String):[],N=new Wt;for(let[A,S]of this.hostFunctions)N.hasFunction(A)?S.isDefault||N.registerFunction(A,S.fn,S.arity,{description:S.description,params:S.params,doc:S.doc,allowOverwrite:!0,isContainerMutation:S.isContainerMutation},!1,S.isContainerMutation):N.registerFunction(A,S.fn,S.arity,{description:S.description,params:S.params,doc:S.doc,isDefault:S.isDefault,isContainerMutation:S.isContainerMutation});if(N.setGlobal("args",[...I]),N.setGlobal("ARGV",[...I]),this.isAsync)return(async()=>{let A=await N.runAsync(C,{file:b}),S=A.output.join(`
405
+ `,ma=null;_a=new WeakMap,Sr=new WeakMap,Lu=["get_property","has_property","get_properties","set_property"];Xs=class{sources=new Map;loaded=!1;path="the registered property source";hint="Define it in the property source";tree={};known=[];constructor(e,n){this.tree.Directory=e,this.tree.NonInteractive=n.LMCTL_NON_INTERACTIVE==="1"}addSource(e,n,r){this.sources.has(e)||(this.sources.set(e,n),this.known.push(...r))}load(e){if(this.loaded)return;let n={};for(let r of this.sources.values()){let s;try{s=r()}catch(i){throw Error(`Property '${e}': ${i instanceof Error?i.message:String(i)}`)}this.path=s.path,this.hint=s.hint??"Define it in the property source";for(let[i,o]of Object.entries(s.properties)){if(i==="Directory"||i==="NonInteractive"||Object.hasOwn(n,i))throw Error(`Property '${i}' conflicts with a read-only invocation fact or another source in ${this.path}`);Be(n,i,structuredClone(o))}}for(let[r,s]of Object.entries(n))Be(this.tree,r,s);this.loaded=!0}find(e,n=!0){let r=Ea(ya(e),this.known);n&&!["Directory","NonInteractive"].includes(r.split(".")[0])&&this.load(r);let s=this.tree;for(let i of r.split(".")){if(!s||typeof s!="object"||!Object.hasOwn(s,i))return{found:!1,value:void 0,key:r};s=s[i]}return{found:!0,value:s,key:r}}missing(e){throw Error(`Property '${e}' is not defined in ${this.path}; ${this.hint}`)}get(e,...n){let r=this.find(e);return r.found?Bt(r.value,r.key):n.length?n[0]:this.missing(r.key)}has(e){return this.find(e).found}copy(e=""){if(!e)return this.load("<all>"),Bt(this.tree,"");let n=this.find(e);if(!n.found)return this.missing(n.key);if(!n.value||typeof n.value!="object"||Array.isArray(n.value)||n.value instanceof Date)throw Error(`Property '${n.key}' is not a table; get_properties requires a table`);return Bt(n.value,n.key)}set(e,n){let r=Ea(ya(e),this.known);if(["Directory","NonInteractive"].includes(r.split(".")[0]))throw Error(`Property '${r}' is read-only`);let s=Bt(n,r),i=this.find(r),o=this.tree,a=r.split(".");for(let d of a.slice(0,-1)){if(Object.hasOwn(o,d)||Be(o,d,{}),!o[d]||typeof o[d]!="object"||Array.isArray(o[d])||o[d]instanceof Date)throw Error(`Property '${d}' is a value, not a table`);o=o[d]}let l=i.found?Bt(i.value,r):null,c=d=>d!==null&&typeof d=="object"&&!Array.isArray(d)&&!(d instanceof Date);if(i.found&&c(i.value)!==c(s))throw Error(`Property '${r}' cannot change between a table and a value`);return Be(o,a.at(-1),s),l}view(e=""){let n=i=>{let o=e?e+"."+i:i,a=this.find(o);if(!a.found)return this.missing(a.key);if(a.value&&typeof a.value=="object"&&!Array.isArray(a.value)&&!(a.value instanceof Date))return this.view(a.key);let l=Bt(a.value,a.key),c=d=>{if(d&&typeof d=="object"){for(let u of Object.values(d))c(u);Object.freeze(d)}return d};return c(l)},r=()=>{throw Error(`PROPS${e?"."+e:""} is read-only; use set_property`)},s=new Proxy({},{get:(i,o)=>typeof o=="symbol"||o==="then"?void 0:o==="toJSON"?()=>this.copy(e):n(o),ownKeys:()=>(e||this.load("<keys>"),Object.keys(e?this.find(e).value:this.tree)),getOwnPropertyDescriptor:(i,o)=>{if(typeof o!="string")return;!e&&!["Directory","NonInteractive"].includes(o)&&this.load("<keys>");let a=e?this.find(e).value:this.tree;return Object.hasOwn(a,o)?{enumerable:!0,configurable:!0}:void 0},set:r,deleteProperty:r,defineProperty:r,setPrototypeOf:r});return _a.set(s,n),Sr.set(s,()=>this.copy(e)),s}};Wt=class{variables=new Set;shadowedGlobals=new Set;parent;isFunctionScope;constructor(e,n=!1){this.parent=e,this.isFunctionScope=n}define(e){this.variables.add(e)}hasInCurrent(e){return this.variables.has(e)}resolvingScope(e){return this.variables.has(e)?this:this.parent?.resolvingScope(e)}resolve(e){return this.variables.has(e)?!0:this.parent?this.parent.resolve(e):!1}resolveInScope(e){return this.variables.has(e)?!0:this.isFunctionScope?!1:this.parent?this.parent.resolveInScope(e):!1}},Ta=class{diagnostics=[];hostFunctions=new Map;options;functions=new Map;currentScope=new Wt;loopDepth=0;inFunction=!1;hasConcurrency=!1;usedGlobals=new Set;usedProperties=!1;loadedPackages=new Set;functionPackages=new WeakMap;constructor(e,n={}){this.options=n;for(let[r,s]of e.entries())this.hostFunctions.set(r,s),this.functions.set(r,{name:r,paramCount:typeof s.arity=="number"?s.arity:-1,params:[],isHost:!0,line:0,column:0})}check(e){if(this.diagnostics=[],this.hasConcurrency=!1,this.usedGlobals.clear(),this.usedProperties=!1,this.loadedPackages=new Set,this.functionPackages=new WeakMap,this.loopDepth=0,this.inFunction=!1,this.currentScope=new Wt,this.options.globals)for(let r of this.options.globals)this.currentScope.define(r);this.functions.clear();for(let[r,s]of this.hostFunctions.entries())this.functions.set(r,{name:r,paramCount:typeof s.arity=="number"?s.arity:-1,params:[],isHost:!0,line:0,column:0});for(let r of e.statements)r.kind==="FunctionDeclStmt"&&this.collectFunction(r);for(let r of e.statements)r.kind==="FunctionDeclStmt"?this.functionPackages.set(r,new Set(this.loadedPackages)):this.checkStmt(r);let n=this.loadedPackages;for(let r of e.statements)r.kind==="FunctionDeclStmt"&&(this.loadedPackages=this.functionPackages.get(r),this.checkStmt(r));return this.loadedPackages=n,this.diagnostics}addError(e,n,r,s){this.diagnostics.push({message:e,line:n,column:r,severity:"error",file:s})}isPropsBinding(e){return e==="PROPS"||e.endsWith(".PROPS")}packageBindingCollision(e){return this.options.sourcePackages?.has(e.split(".").at(-1))??!1}collectFunction(e){for(let r of[e.name,...e.params])this.packageBindingCollision(r)&&this.addError("Package name collision: '"+r+"' is a function or parameter",e.line,e.column,e.file);if((this.isPropsBinding(e.name)||e.params.includes("PROPS"))&&this.addError("PROPS is a reserved read-only map binding",e.line,e.column,e.file),!e.isStdlib&&this.options.reservedFunctionPrefixes?.some(r=>e.name.startsWith(r))){this.addError(`Function name '${e.name}' uses a reserved built-in prefix`,e.line,e.column,e.file);return}if(this.functions.has(e.name)){let r=this.functions.get(e.name);if(r.isHost){this.addError(`Cannot redefine host function '${e.name}'`,e.line,e.column,e.file);return}if(r.isStdlib){this.functions.set(e.name,{name:e.name,paramCount:e.params.length,params:e.params,isHost:!1,isStdlib:!1,file:e.file,line:e.line,column:e.column});return}let s=r.file?`${r.file}:${r.line}`:`line ${r.line}`;this.addError(`Duplicate function declaration '${e.name}' (already defined at ${s})`,e.line,e.column,e.file);return}let n=new Set;for(let r of e.params)n.has(r)&&this.addError(`Duplicate parameter name '${r}' in function '${e.name}'`,e.line,e.column,e.file),n.add(r);this.functions.set(e.name,{name:e.name,paramCount:e.params.length,params:e.params,isHost:!1,isStdlib:e.isStdlib||!1,file:e.file,line:e.line,column:e.column})}checkStmt(e){switch(e.kind){case"PackageStmt":{(this.currentScope.parent||this.inFunction)&&this.addError("package must be the first file-level statement",e.line,e.column,e.file),(["lm_","lmbee_",...this.options.reservedFunctionPrefixes??[]].some(n=>e.name.startsWith(n))||this.options.builtinProviderNames?.includes(e.name))&&this.addError("Package name '"+e.name+"' uses a reserved built-in name/prefix",e.line,e.column,e.file),(e.name==="ARGV"||this.currentScope.resolve(e.name)||this.functions.has(e.name))&&this.addError("Package name collision: '"+e.name+"' is already a variable or function",e.line,e.column,e.file),this.loadedPackages.add(e.name);break}case"ImportStmt":{this.addError("Import must be at file top level; move the literal include before use",e.line,e.column,e.file);break}case"FunctionDeclStmt":{if(this.inFunction||this.currentScope.parent){this.addError("Function declarations are only allowed at top level",e.line,e.column,e.file);break}let n=this.currentScope,r=this.inFunction;this.inFunction=!0,this.currentScope=new Wt(n,!0);for(let s of e.params)this.currentScope.define(s);for(let s of e.body.statements)this.checkStmt(s);this.inFunction=r,this.currentScope=n;break}case"VarDeclStmt":{this.packageBindingCollision(e.name)&&this.addError("Package name collision: '"+e.name+"' is a variable",e.line,e.column,e.file),this.isPropsBinding(e.name)&&this.addError("PROPS is read-only; use set_property",e.line,e.column,e.file),this.currentScope.hasInCurrent(e.name)&&!(this.options.builtinGlobals?.includes(e.name)&&!this.currentScope.parent&&!this.currentScope.shadowedGlobals.has(e.name))&&this.addError(`Variable '${e.name}' is already declared in this scope`,e.line,e.column,e.file),e.initializer&&this.checkExpr(e.initializer),this.currentScope.define(e.name),this.currentScope.shadowedGlobals.add(e.name);break}case"TupleVarDeclStmt":{e.names.some(n=>this.isPropsBinding(n))&&this.addError("PROPS is read-only; use set_property",e.line,e.column,e.file),this.checkExpr(e.initializer);for(let n of e.names)this.packageBindingCollision(n)&&this.addError("Package name collision: '"+n+"' is a tuple binding",e.line,e.column,e.file),this.currentScope.hasInCurrent(n)&&!(this.options.builtinGlobals?.includes(n)&&!this.currentScope.parent&&!this.currentScope.shadowedGlobals.has(n))&&this.addError(`Variable '${n}' is already declared in this scope`,e.line,e.column,e.file),this.currentScope.define(n),this.currentScope.shadowedGlobals.add(n);break}case"IfStmt":{this.checkExpr(e.condition),this.checkStmt(e.thenBranch),e.elseBranch&&this.checkStmt(e.elseBranch);break}case"WhileStmt":{this.checkExpr(e.condition),this.loopDepth++,this.checkStmt(e.body),this.loopDepth--;break}case"ForInStmt":{this.packageBindingCollision(e.name)&&this.addError("Package name collision: '"+e.name+"' is a loop binding",e.line,e.column,e.file),this.isPropsBinding(e.name)&&this.addError("PROPS is a reserved read-only map binding",e.line,e.column,e.file),this.checkExpr(e.iterable);let n=this.currentScope;if(this.currentScope=new Wt(n),this.currentScope.define(e.name),this.loopDepth++,e.body.kind==="BlockStmt")for(let r of e.body.statements)this.checkStmt(r);else this.checkStmt(e.body);this.loopDepth--,this.currentScope=n;break}case"ForStmt":{let n=this.currentScope;this.currentScope=new Wt(n),e.init&&this.checkStmt(e.init),e.condition&&this.checkExpr(e.condition),e.update&&this.checkExpr(e.update),this.loopDepth++,this.checkStmt(e.body),this.loopDepth--,this.currentScope=n;break}case"ReturnStmt":{this.inFunction||this.addError("'return' statement is only allowed inside a function",e.line,e.column,e.file),e.value&&this.checkExpr(e.value);break}case"BreakStmt":{this.loopDepth===0&&this.addError("'break' statement is only allowed inside a loop",e.line,e.column,e.file);break}case"ContinueStmt":{this.loopDepth===0&&this.addError("'continue' statement is only allowed inside a loop",e.line,e.column,e.file);break}case"BlockStmt":{let n=this.currentScope;this.currentScope=new Wt(n);for(let r of e.statements)this.checkStmt(r);this.currentScope=n;break}case"SyncAssignStmt":{this.isPropsBinding(e.target)&&this.addError("PROPS is read-only; use set_property",e.line,e.column,e.file),this.hasConcurrency=!0,this.currentScope.resolve(e.target)||this.addError(`Synchronized assignment target '${e.target}' must be declared beforehand`,e.line,e.column,e.file),this.checkExpr(e.value);break}case"SyncIndexAssignStmt":{this.hasConcurrency=!0,this.checkExpr(e.target),this.checkExpr(e.index),this.checkExpr(e.value);break}case"SyncCallStmt":{this.hasConcurrency=!0;let n=e.call;n.args.length===0&&this.addError(`Synchronized call '${n.callee}' requires at least one argument (the target container)`,e.line,e.column,e.file);let r=this.hostFunctions.get(n.callee);(!r||!r.isContainerMutation)&&this.addError(`Synchronized call '${n.callee}' is not an authorized container mutation operation`,e.line,e.column,e.file),this.checkExpr(e.call);break}case"ExprStmt":{this.checkExpr(e.expr);break}}}checkReadPath(e){let n=e.args[0];for(;n.kind==="GroupingExpr";)n=n.expression;if(n.kind!=="LiteralExpr"){this.diagnostics.push({message:`Cannot preflight dynamic file path in '${e.callee}'; check it at runtime with file_exists(path)`,line:e.line,column:e.column,severity:"warning",file:e.file});return}if(typeof n.value!="string"){this.addError(`File path in '${e.callee}' must be a string`,e.line,e.column,e.file);return}try{if(!$.statSync(n.value).isFile())throw new Error("path is not a regular file");$.accessSync(n.value,$.constants.R_OK)}catch(r){this.addError(`Cannot read file ${JSON.stringify(n.value)}: ${r instanceof Error?r.message:String(r)}`,e.line,e.column,e.file)}}optionLiteral(e){if(e.kind==="GroupingExpr")return this.optionLiteral(e.expression);if(e.kind==="LiteralExpr")return{type:e.value===null?"null":typeof e.value,value:e.value};if(e.kind==="ArrayExpr"||e.kind==="TupleExpr")return{type:"list"};if(e.kind==="ObjectExpr")return{type:"map"};if(e.kind==="UnaryExpr"&&e.operator==="-"&&e.operand.kind==="LiteralExpr"&&typeof e.operand.value=="number")return{type:"number",value:-e.operand.value}}optionSuggestion(e,n){let r=a=>a.toLowerCase().replace(/[_-]/g,"");function s(a,l){let c=Array.from({length:l.length+1},(d,u)=>u);for(let d=1;d<=a.length;d++){let u=[d];for(let m=1;m<=l.length;m++)u[m]=Math.min(u[m-1]+1,c[m]+1,c[m-1]+(a[d-1]===l[m-1]?0:1));c=u}return c[l.length]}let i=n.filter(a=>a.name!=="*"),o=a=>{let l=r(e),c=r(a),d=0;for(;d<l.length&&d<c.length&&l[d]===c[d];)d++;return s(l,c)/Math.max(1,l.length,c.length)-d/Math.max(1,l.length)};return i.sort((a,l)=>o(a.name)-o(l.name)),i[0]?`; did you mean '${i[0].name}'?`:""}checkHostOptions(e,n){for(let[r,s]of n.entries()){if(!s.keys)continue;let i=e.args[r];for(;i?.kind==="GroupingExpr";)i=i.expression;if(i?.kind!=="ObjectExpr")continue;let o=new Set,a=s.open||s.keys.some(l=>l.name==="*"&&(l.type==="any"||l.type==="open"));for(let l of i.properties){let c=l.line??i.line,d=l.column??i.column,u=l.file??i.file;o.has(l.key)&&this.addError(`Duplicate option '${l.key}' in '${e.callee}' argument '${s.name}'`,c,d,u),o.add(l.key);let m=s.keys.find(y=>y.name===l.key);if(!m){a||this.addError(`Unknown option '${l.key}' in '${e.callee}' argument '${s.name}'${this.optionSuggestion(l.key,s.keys)}`,c,d,u);continue}let p=this.optionLiteral(l.value);if(!p||!m.type||m.type==="any"||m.type==="open")continue;let h=m.type.split("|").map(y=>y.trim().replace(/^array$/,"list").replace(/^object$/,"map")),_=["string","number","boolean","null","list","map"];h.every(y=>_.includes(y))&&!h.includes(p.type)&&this.addError(`Option '${l.key}' expects ${m.type}, got ${p.type}`,l.value.line,l.value.column,l.value.file),m.values&&p.type!=="list"&&p.type!=="map"&&!m.values.includes(p.value)&&this.addError(`Option '${l.key}' has a literal value outside its declared values`,l.value.line,l.value.column,l.value.file)}for(let l of s.keys)l.required&&l.name!=="*"&&!o.has(l.name)&&this.addError(`Missing required option '${l.name}' in '${e.callee}' argument '${s.name}'`,i.line,i.column,i.file)}}checkPackageMember(e,n){let r=e.split(".")[0],s=this.options.sourcePackages?.get(r);if(!this.loadedPackages.has(r)&&this.currentScope.resolve(r)){this.addError("Map member calls are not supported; use a named function",n.line,n.column,n.file);return}if(!this.loadedPackages.has(r)){this.addError("package "+r+" not loaded: import it before use; import order matters, leaf packages first",n.line,n.column,n.file);return}s?.members.includes(e)||this.addError("Unknown package member '"+e+"'"+this.optionSuggestion(e,(s?.members??[]).map(i=>({name:i}))),n.line,n.column,n.file)}checkPropertyPath(e,n){let r;try{r=ya(e)}catch(c){this.addError(c.message,n.line,n.column,n.file);return}let s=this.options.propertyDeclarations;if(!s||(r=Ea(r,s.known),s.known.includes(r)||s.closedTables?.includes(r)))return;let o=r.split(".")[0],a=this.optionSuggestion(r,s.known.map(c=>({name:c}))),l=(s.closedTables??[]).some(c=>/\d+$/.test(c)&&c.replace(/\d+$/,"")===o.replace(/\d+$/,""));(s.closedTables?.includes(o)||l)&&this.addError(`Unknown property '${e}'${a}`,n.line,n.column,n.file)}checkExpr(e){switch(e.kind){case"InterpolatedStringExpr":for(let n of e.parts)typeof n!="string"&&this.checkExpr(n.expression);break;case"LiteralExpr":break;case"IdentifierExpr":{if(e.name.includes(".")){this.checkPackageMember(e.name,e),this.loadedPackages.has(e.name.split(".")[0])&&!this.currentScope.resolve(e.name)&&!this.functions.has(e.name)&&this.addError("Package variable '"+e.name+"' used before declaration",e.line,e.column,e.file);break}(e.name==="PROPS"||e.name==="expand"||Lu.includes(e.name))&&(this.usedProperties=!0);let n=this.currentScope.resolvingScope(e.name);n&&!n.parent&&this.options.globals?.includes(e.name)&&this.usedGlobals.add(e.name),!this.currentScope.resolve(e.name)&&!this.functions.has(e.name)&&this.addError(Object.hasOwn(Bs,e.name)?br(e.name,"Undeclared variable"):this.options.propertyDeclarations?.removedGlobals?.[e.name]?`'${e.name}' was replaced by ${this.options.propertyDeclarations.removedGlobals[e.name]}; declare a local variable if intended`:`Undeclared variable '${e.name}'`,e.line,e.column,e.file);break}case"AssignExpr":{this.packageBindingCollision(e.target)&&this.addError("Package name collision: '"+e.target+"' is a variable",e.line,e.column,e.file),e.target.includes(".")&&this.checkPackageMember(e.target,e),this.isPropsBinding(e.target)&&this.addError("PROPS is read-only; use set_property",e.line,e.column,e.file),this.checkExpr(e.value),this.currentScope.resolveInScope(e.target)||this.currentScope.define(e.target),this.currentScope.resolvingScope(e.target)?.shadowedGlobals.add(e.target);break}case"TupleAssignExpr":{e.targets.some(n=>this.isPropsBinding(n))&&this.addError("PROPS is read-only; use set_property",e.line,e.column,e.file),this.checkExpr(e.value);for(let n of e.targets)this.packageBindingCollision(n)&&this.addError("Package name collision: '"+n+"' is a tuple binding",e.line,e.column,e.file),this.currentScope.resolveInScope(n)||this.currentScope.define(n),this.currentScope.resolvingScope(n)?.shadowedGlobals.add(n);break}case"IndexAssignExpr":{this.checkExpr(e.target),this.checkExpr(e.index),this.checkExpr(e.value);break}case"UnaryExpr":{this.checkExpr(e.operand);break}case"ConditionalExpr":{this.checkExpr(e.condition),this.checkExpr(e.trueArm),this.checkExpr(e.falseArm);break}case"BinaryExpr":{this.checkExpr(e.left),this.checkExpr(e.right);break}case"GroupingExpr":{this.checkExpr(e.expression);break}case"TupleExpr":{for(let n of e.elements)this.checkExpr(n);break}case"ArrayExpr":{for(let n of e.elements)this.checkExpr(n);break}case"ObjectExpr":{for(let n of e.properties)this.checkExpr(n.value);break}case"IndexExpr":{let n=qs(e);n&&this.checkPropertyPath(n,e),this.checkExpr(e.target),this.checkExpr(e.index);break}case"ParallelExpr":{this.hasConcurrency=!0;for(let n of e.tasks)this.checkExpr(n);break}case"CallExpr":{if(e.callee.includes(".")&&(Object.hasOwn(Bs,e.callee)&&!this.options.sourcePackages?.has(e.callee.split(".")[0])?this.addError(br(e.callee),e.line,e.column,e.file):this.checkPackageMember(e.callee,e)),Lu.includes(e.callee)&&(this.usedProperties=!0,e.args[0]?.kind==="LiteralExpr"&&typeof e.args[0].value=="string"&&e.args[0].value!==""&&this.checkPropertyPath(e.args[0].value,e.args[0])),e.callee==="expand"){let i=e.args[0];if(i?.kind==="LiteralExpr"&&typeof i.value=="string")try{let o=da(i.value),a=e.args[1];for(;a?.kind==="GroupingExpr";)a=a.expression;let l=e.args[1]?a?.kind==="ObjectExpr"?new Set(a.properties.map(d=>d.key)):void 0:new Set,c=new Set;for(let d of o)typeof d!="string"&&(d.kind==="property"?(this.usedProperties=!0,this.checkPropertyPath(d.key,i)):d.kind==="variable"&&l&&!l.has(d.name)&&c.add(d.name));if(c.size){let d=[...c].map(u=>`${u} (not defined)`).join("; ");this.addError(`expand: missing references: ${d}; assign a temporary variable first and pass it in vars.`,i.line,i.column,i.file)}}catch(o){this.addError(o.message,i.line,i.column,i.file)}else this.usedProperties=!0}let n=this.functions.get(e.callee);n?n.paramCount>=0&&e.args.length!==n.paramCount&&this.addError(`Function '${e.callee}' expects ${n.paramCount} argument(s), but received ${e.args.length}`,e.line,e.column,e.file):this.currentScope.resolve(e.callee)||this.addError(br(e.callee),e.line,e.column,e.file);let r=this.hostFunctions.get(e.callee),s=r?.arity;typeof s=="object"&&(e.args.length<s.min||e.args.length>(s.max??1/0))&&this.addError(`Function '${e.callee}' expects ${s.min}..${s.max??"unlimited"} argument(s), but received ${e.args.length}`,e.line,e.column,e.file),r?.params&&this.checkHostOptions(e,r.params),this.options.checkFiles&&r?.readsFile&&e.args.length>0&&this.checkReadPath(e);for(let i of e.args)this.checkExpr(i);break}}}};$n=class{value;constructor(e){this.value=e}},ut=class{},mt=class{},Un=class{name;constructor(e){this.name=e}toString(){return`<function ${this.name}>`}},He=class t{static nextId=1;id=t.nextId++;values=new Map;parent;isFunctionScope;constructor(e,n=!1){this.parent=e,this.isFunctionScope=n}resolveBinding(e){if(this.values.has(e))return{env:this,name:e};if(this.parent)return this.parent.resolveBinding(e)}define(e,n){this.values.set(e,n)}get(e){if(this.values.has(e))return this.values.get(e);if(this.parent)return this.parent.get(e)}has(e){return this.values.has(e)||(this.parent?.has(e)??!1)}hasInScope(e){return this.values.has(e)?!0:this.isFunctionScope?!1:this.parent?this.parent.hasInScope(e):!1}writeTarget(e){return this.values.has(e)?this:!this.isFunctionScope&&this.parent&&this.parent.hasInScope(e)?this.parent.writeTarget(e):this}set(e,n){if(this.values.has(e)){this.values.set(e,n);return}if(!this.isFunctionScope&&this.parent&&this.parent.hasInScope(e)){this.parent.set(e,n);return}this.values.set(e,n)}},Gs=class{holderTaskId;depth=0;waiters=[];acquire(e=0,n=1e4){return this.depth===0?(this.holderTaskId=e,this.depth=1,Promise.resolve()):this.holderTaskId===e?(this.depth++,Promise.resolve()):new Promise((r,s)=>{let i;n>0&&(i=setTimeout(()=>{let a=this.waiters.findIndex(l=>l.resolve===o);a!==-1&&(this.waiters.splice(a,1),s(new Error(`Lock acquisition timed out after ${n}ms (possible deadlock)`)))},n));let o=()=>{i&&clearTimeout(i),this.holderTaskId=e,this.depth=1,r()};this.waiters.push({taskId:e,resolve:o})})}release(){this.depth<=0||(this.depth--,this.depth===0&&(this.holderTaskId=void 0,this.waiters.length>0&&this.waiters.shift().resolve()))}async withLock(e,n=0,r=1e4){await this.acquire(n,r);try{return await e()}finally{this.release()}}},Sa=class{bindingLocks=new Map;objectLocks=new WeakMap;getBindingLock(e){let n=this.bindingLocks.get(e);return n||(n=new Gs,this.bindingLocks.set(e,n)),n}getObjectLock(e){let n=this.objectLocks.get(e);return n||(n=new Gs,this.objectLocks.set(e,n)),n}},ka=new WeakMap,Ra=class{constructor(e){ka.set(this,e)}},pw=5e3;fw=1,Qe=class{id;constructor(e){Object.defineProperty(this,"id",{value:e,enumerable:!0}),Object.freeze(this)}};Js=class{records=[];label;parent;constructor(e,n){this.label=e,this.parent=n}isAncestorOf(e){for(let n=e.parent;n;n=n.parent)if(n===this)return!0;return!1}},Ia=class{token=`run-${process.pid}-${fw++}`;root=new Js("root");ordinal=0;records=new WeakMap;ordered=[];scopes=new WeakMap;onFailure;defaultDeadlineMs;failures=[];constructor(e,n={}){this.onFailure=e;let r=n.defaultDeadlineMs;this.defaultDeadlineMs=typeof r=="number"&&Number.isFinite(r)&&r>0?r:pw}scopeFor(e){for(let n=e;n;n=n.isFunctionScope?void 0:n.parent){let r=this.scopes.get(n);if(r)return r}return this.root}enterFunction(e,n,r){let s=new Js(r,this.scopeFor(n));return this.scopes.set(e,s),s}register(e,n,r,s){let i=String(e.id),o={handle:new Qe(i),raw:e,kind:typeof e.kind=="string"&&e.kind?e.kind:n,id:i,site:r,ordinal:++this.ordinal,owner:s,state:"open",adoptable:!0,unresolved:!1};return this.records.set(o.handle,o),this.ordered.push(o),s.records.push(o),o.handle}lookup(e){return this.records.get(e)}describe(e){let n=this.records.get(e);return n?`${n.kind} ${n.id}`:`${e.id} (from another run)`}borrow(e){if(gn(e)){let n=this.records.get(e);n&&(n.adoptable=!1)}}bind(e,n,r){if(!gn(e))return;let s=this.records.get(e);if(!s)return`resource ${e.id} belongs to another run`;let i=this.scopeFor(n);if(s.adoptable){s.adoptable=!1,i!==s.owner&&(s.owner.records.splice(s.owner.records.indexOf(s),1),i.records.push(s),s.owner=i);return}if(i!==s.owner&&i.isAncestorOf(s.owner))return`resource ${s.kind} ${s.id} cannot escape its owner into the longer-lived binding '${r}'`}close(e){if(e.closing)return e.closing;e.state="closing";let n=e.raw,r=n.closeDeadlineMs,s=typeof r=="number"&&Number.isFinite(r)&&r>0?r:this.defaultDeadlineMs,i=performance.now(),o;e.closing=new Promise(l=>{o=l});let a=`close did not finish within its ${s} ms deadline`;return(async()=>{let l,c=!1;try{let d=n.close();if(jn(d)){let u=Promise.resolve(d).then(()=>!0);u.catch(()=>{});let m=s-(performance.now()-i);if(!(m>0&&await Promise.race([u,new Promise(h=>{l=setTimeout(()=>h(!1),m)})]))){this.critical(e),c=this.fail(e,a);return}}if(performance.now()-i>s){this.critical(e),c=this.fail(e,a);return}e.state="closed",c=!0}catch(d){c=this.fail(e,d instanceof Error?d.message:String(d))}finally{l&&clearTimeout(l),o(c)}})(),e.closing}critical(e){try{typeof e.raw.finalizeSync=="function"&&e.raw.finalizeSync()}catch(n){this.report(`resource ${e.kind} ${e.id} (${e.site}): critical finalization failed: ${n instanceof Error?n.message:String(n)}`)}}fail(e,n){return e.state="close_failed",e.unresolved=!0,this.report(`resource close failed: ${e.kind} ${e.id} (${e.site}): ${n}`),!1}report(e){this.failures.push(e);try{this.onFailure(e)}catch{}}async drain(e){for(let n of[...e.records].sort((r,s)=>s.ordinal-r.ordinal))if(!(n.state==="closed"||n.state==="close_failed"))try{await this.close(n)}catch{}}snapshot(){return this.ordered.map(e=>({id:e.id,kind:e.kind,owner:e.owner.label,site:e.site,state:e.state,unresolved:e.unresolved,ordinal:e.ordinal}))}},Ks=class{abortSignal;resources;resourcesEnabled;globalEnv;userFunctions=new Map;hostFunctions;stdout;stderr;lockManager=new Sa;isAsync;nextTaskId=1;initialGlobals;callDepth=0;asyncCallDepth=new Map;recordedErrors=[];promptHumanConfig;constructor(e,n=a=>console.log(a),r=!1,s,i,o){this.stdout=n,this.stderr=i,this.isAsync=r,this.initialGlobals=s,this.globalEnv=new He,this.hostFunctions=new Map(e),this.promptHumanConfig=o??{mode:"interactive"},this.resourcesEnabled=[...this.hostFunctions.values()].some(g=>g.returnsResource===!0),this.resources=new Ia(g=>{this.recordedErrors.push(g);try{this.stderr?.(`error: ${g}`)}catch{}});let a=e.get("print");(!a||a.isDefault)&&this.hostFunctions.set("print",{...a,fn:(...g)=>{let E=g.map(b=>typeof b=="object"?JSON.stringify(b):String(b)).join(" ");return this.stdout(E),E},arity:{min:0},description:a?.description??"Prints formatted values to output log",isDefault:!0});let l=e.get("println");(!l||l.isDefault)&&this.hostFunctions.set("println",{...l,fn:(...g)=>{let E=g.map(b=>typeof b=="object"?JSON.stringify(b):String(b)).join(" ");return this.stdout(E),E},arity:{min:0},description:l?.description??"Prints line to output log",isDefault:!0});let c=e.get("printf");(!c||c.isDefault)&&this.hostFunctions.set("printf",{...c,fn:(g,...E)=>{let b=xa(g,E,"printf");return this.stdout(b),b},arity:{min:1},description:c?.description??"Formats and prints %s, %d, %f and %% using sprintf rules",isDefault:!0});let d=e.get("require");(!d||d.isDefault)&&this.hostFunctions.set("require",{...d,fn:(g,E)=>$u(g,E,b=>{this.recordedErrors.push(b),this.stderr?.(`error: ${b}`)}),arity:2,isDefault:!0});let u=e.get("error");(!u||u.isDefault)&&this.hostFunctions.set("error",{...u,fn:(...g)=>{let E=g.map(b=>typeof b=="object"?JSON.stringify(b):String(b)).join(" ");return this.stderr?this.stderr(`error: ${E}`):typeof process<"u"&&process.stderr?process.stderr.write(`error: ${E}
406
+ `):console.error(`error: ${E}`),this.recordedErrors.push(E),E},arity:{min:1},description:u?.description??"Prints error message to stderr and records it for execution error summary",isDefault:!0});let m=e.get("system");(!m||m.isDefault)&&this.hostFunctions.set("system",{fn:(g,E=6e4)=>{if(!Number.isSafeInteger(E)||E<0)throw new Error("system() timeout must be a non-negative safe integer in milliseconds");return this.isAsync?Bu(g,E):Hu(g,E)},arity:{min:1,max:2},description:"Executes shell command or argv array directly with shell:false and optional timeoutMs (default 60000), returning {stdout, stderr, code, signal, timed_out, duration_ms, pid}",isDefault:!0});let p=e.get("prompt_human_config");(!p||p.isDefault)&&this.hostFunctions.set("prompt_human_config",{fn:(g,E)=>{if(g===void 0)return{mode:this.promptHumanConfig.mode??"interactive",dir:this.promptHumanConfig.dir??null,timeout_ms:this.promptHumanConfig.timeoutMs??null,poll_interval_ms:this.promptHumanConfig.pollIntervalMs??200};if(typeof g=="string")g==="interactive"?this.promptHumanConfig.mode="interactive":g==="file"?(this.promptHumanConfig.mode="file",E&&(this.promptHumanConfig.dir=String(E))):(this.promptHumanConfig.mode="file",this.promptHumanConfig.dir=g);else if(g&&typeof g=="object"){let b=g.mode?String(g.mode):g.dir?"file":this.promptHumanConfig.mode??"interactive",C=g.dir!==void 0?String(g.dir):this.promptHumanConfig.dir,I=g.timeout_ms!==void 0?Number(g.timeout_ms):g.timeoutMs!==void 0?Number(g.timeoutMs):this.promptHumanConfig.timeoutMs,N=g.poll_ms!==void 0?Number(g.poll_ms):g.pollIntervalMs!==void 0?Number(g.pollIntervalMs):this.promptHumanConfig.pollIntervalMs;this.promptHumanConfig.mode=b==="file"?"file":"interactive",this.promptHumanConfig.dir=C,this.promptHumanConfig.timeoutMs=typeof I=="number"&&Number.isFinite(I)?I:void 0,this.promptHumanConfig.pollIntervalMs=typeof N=="number"&&Number.isFinite(N)&&N>0?N:200}return{mode:this.promptHumanConfig.mode,dir:this.promptHumanConfig.dir??null,timeout_ms:this.promptHumanConfig.timeoutMs??null,poll_interval_ms:this.promptHumanConfig.pollIntervalMs??200}},arity:{min:0,max:2},description:"Configures prompt_human mode ('interactive' or 'file' with dedicated directory, timeout_ms, poll_ms)",isDefault:!0});let h=e.get("prompt_human");(!h||h.isDefault)&&this.hostFunctions.set("prompt_human",{fn:(g,E)=>{if((E?.mode??(E?.dir?"file":this.promptHumanConfig.mode??"interactive"))==="file"){let C=E?.dir??this.promptHumanConfig.dir;if(!C)throw new Error("prompt_human: file mode requires a directory (configure via prompt_human_config({ dir }) or pass { dir })");if(!this.isAsync)throw new Error("prompt_human: file mode requires asynchronous execution (runAsync)");return Xu(g,{dir:C,sessionId:E?.sessionId??E?.sessionid??E?.id,timeoutMs:E?.timeout_ms??E?.timeoutMs??this.promptHumanConfig.timeoutMs,pollIntervalMs:E?.poll_ms??E?.pollIntervalMs??this.promptHumanConfig.pollIntervalMs,onWaiting:I=>this.stderr?this.stderr(I):typeof process<"u"&&process.stderr?process.stderr.write(I):void 0})}return this.isAsync?Vs(g):Wu(g)},arity:{min:0,max:2},description:"Prompts operator on stdin/terminal or dedicated directory, returning input string or null if closed/non-interactive",isDefault:!0});let _=e.get("shell_quote");(!_||_.isDefault)&&this.hostFunctions.set("shell_quote",{fn:g=>Uu(g),arity:1,description:"Quotes string safely for POSIX shell command execution",isDefault:!0});let y=e.get("run_script");(!y||y.isDefault)&&this.hostFunctions.set("run_script",{fn:(g,E=[])=>{let b=le.resolve(String(g));if(!$.existsSync(b))throw new Error(`run_script: file not found: '${b}'`);let C=$.readFileSync(b,"utf-8"),I=Array.isArray(E)?E.map(String):[],N=new Xt;for(let[A,S]of this.hostFunctions)N.hasFunction(A)?S.isDefault||N.registerFunction(A,S.fn,S.arity,{description:S.description,params:S.params,doc:S.doc,allowOverwrite:!0,isContainerMutation:S.isContainerMutation},!1,S.isContainerMutation):N.registerFunction(A,S.fn,S.arity,{description:S.description,params:S.params,doc:S.doc,isDefault:S.isDefault,isContainerMutation:S.isContainerMutation});if(N.setGlobal("args",[...I]),N.setGlobal("ARGV",[...I]),this.isAsync)return(async()=>{let A=await N.runAsync(C,{file:b}),S=A.output.join(`
407
407
  `)+(A.output.length>0?`
408
408
  `:""),v=A.exitCode!==void 0?A.exitCode:A.success?0:1,T={success:A.success&&v===0,stdout:S,output:[...A.output],value:A.value,exit_code:v,code:v,errors:A.errors??[]};return T.toString=()=>S,T})();{let A=N.run(C,{file:b}),S=A.output.join(`
409
409
  `)+(A.output.length>0?`
410
- `:""),v=A.exitCode!==void 0?A.exitCode:A.success?0:1,T={success:A.success&&v===0,stdout:S,output:[...A.output],value:A.value,exit_code:v,code:v,errors:A.errors??[]};return T.toString=()=>S,T}},arity:{min:1,max:2},description:"Executes another LMScript file in-process and returns execution result with .stdout, .output, .success, .exit_code",isDefault:!0});let f=e.get("http_get");(!f||f.isDefault)&&this.hostFunctions.set("http_get",{fn:g=>this.isAsync?Qv(g):Mu(g),arity:1,description:"Downloads UTF-8 text from a public HTTP(S) URL",isDefault:!0});let w=e.get("sleep_ms");(!w||w.isDefault)&&this.hostFunctions.set("sleep_ms",{fn:g=>{if(typeof g!="number"||!Number.isFinite(g)||g<0)throw new Error("sleep_ms() duration must be a non-negative finite number");if(g>2147483647)throw new Error("sleep_ms() duration exceeds maximum supported timeout (2147483647 ms)");if(this.isAsync)return new Promise(b=>setTimeout(b,g));let E=Date.now()+g;for(;Date.now()<E;);return null},arity:1,description:"Sleeps for the specified milliseconds",isDefault:!0})}evaluateProgram(e){if(this.globalEnv=new He,this.initialGlobals)for(let[r,s]of this.initialGlobals.entries())this.globalEnv.define(r,s);this.userFunctions.clear(),this.callDepth=0;for(let r of e.statements)r.kind==="FunctionDeclStmt"&&this.userFunctions.set(r.name,r);let n;for(let r of e.statements)r.kind!=="FunctionDeclStmt"&&(n=this.execStmt(r,this.globalEnv));return n}execStmt(e,n){switch(Fe(this.abortSignal),e.kind){case"PackageStmt":return;case"ImportStmt":return;case"BlockStmt":{let r=new He(n);for(let s of e.statements)this.execStmt(s,r);return}case"VarDeclStmt":{let r=null;return e.initializer&&(r=this.evalExpr(e.initializer,n)),n.define(e.name,r),r}case"TupleVarDeclStmt":{let r=this.evalExpr(e.initializer,n);if(!Array.isArray(r))throw new M(`Cannot destructure non-array value (got ${typeof r})`,e.line,e.column,"RUNTIME",e.file);for(let s=0;s<e.names.length;s++){let i=s<r.length?r[s]:null;n.define(e.names[s],i)}return r}case"IfStmt":{let r=this.evalExpr(e.condition,n);return this.isTruthy(r)?this.execStmt(e.thenBranch,n):e.elseBranch?this.execStmt(e.elseBranch,n):void 0}case"WhileStmt":{let r=0;for(;this.isTruthy(this.evalExpr(e.condition,n));){if(++r>1e6)throw new M("Execution fuel exhausted: while loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{this.execStmt(e.body,n)}catch(s){if(s instanceof dt)break;if(s instanceof ut)continue;throw s}}return}case"ForInStmt":{let r=xu(this.evalExpr(e.iterable,n),e),s=0;for(let i of r){if(++s>1e6)throw new M("Execution fuel exhausted: for-in loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME",e.file);let o=new He(n);o.define(e.name,i);try{if(e.body.kind==="BlockStmt")for(let a of e.body.statements)this.execStmt(a,o);else this.execStmt(e.body,o)}catch(a){if(a instanceof dt)break;if(a instanceof ut)continue;throw a}}return}case"ForStmt":{let r=new He(n);e.init&&this.execStmt(e.init,r);let s=0;for(;;){if(e.condition){let i=this.evalExpr(e.condition,r);if(!this.isTruthy(i))break}if(++s>1e6)throw new M("Execution fuel exhausted: for loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{this.execStmt(e.body,r)}catch(i){if(i instanceof dt)break;if(!(i instanceof ut))throw i}e.update&&this.evalExpr(e.update,r)}return}case"ReturnStmt":{let r=e.value?this.evalExpr(e.value,n):null;throw new Dn(r)}case"BreakStmt":throw new dt;case"ContinueStmt":throw new ut;case"SyncAssignStmt":case"SyncIndexAssignStmt":case"SyncCallStmt":throw new M("Synchronized statements require asynchronous execution via engine.runAsync()",e.line,e.column,"RUNTIME",e.file);case"ExprStmt":return this.evalExpr(e.expr,n);default:return}}evalExpr(e,n){switch(Fe(this.abortSignal),e.kind){case"InterpolatedStringExpr":{let r="";for(let s of e.parts)r+=typeof s=="string"?s:va(this.evalExpr(s.expression,n),s);return r}case"ParallelExpr":throw new M("'parallel(...)' requires asynchronous execution via engine.runAsync()",e.line,e.column,"RUNTIME",e.file);case"LiteralExpr":return e.value;case"IdentifierExpr":return this.resolveIdentifier(e.name,n,e);case"AssignExpr":{let r=this.evalExpr(e.value,n);return n.set(e.target,r),r}case"TupleAssignExpr":{let r=this.evalExpr(e.value,n);if(!Array.isArray(r))throw new M(`Cannot destructure non-array value (got ${typeof r})`,e.line,e.column,"RUNTIME",e.file);for(let s=0;s<e.targets.length;s++){let i=s<r.length?r[s]:null;n.set(e.targets[s],i)}return r}case"IndexAssignExpr":{let r=this.evalExpr(e.target,n),s=this.evalExpr(e.index,n),i=this.evalExpr(e.value,n);if(Array.isArray(r)||typeof r=="object"&&r!==null)return Array.isArray(r)&&typeof s=="number"&&s<0&&(s=r.length+s),Be(r,s,i),i;throw new M("Cannot index-assign to non-array / non-object",e.line,e.column,"RUNTIME",e.file)}case"GroupingExpr":return this.evalExpr(e.expression,n);case"TupleExpr":return e.elements.map(r=>this.evalExpr(r,n));case"ArrayExpr":return e.elements.map(r=>this.evalExpr(r,n));case"ObjectExpr":{let r={};for(let s of e.properties)Be(r,s.key,this.evalExpr(s.value,n));return r}case"IndexExpr":{let r=Ws(e);if(r)return De(this.resolveIdentifier("PROPS",n,e),r);let s=this.evalExpr(e.target,n),i=this.evalExpr(e.index,n);if(s==null)throw new M("Cannot read property of null or undefined",e.line,e.column,"RUNTIME",e.file);return Array.isArray(s)&&typeof i=="number"&&i<0?s[s.length+i]:De(s,i)}case"UnaryExpr":{let r=this.evalExpr(e.operand,n),s=e.operator;if(s==="!")return!this.isTruthy(r);if(s==="-")return-r;throw new M(`Unknown unary operator: ${s}`,e.line,e.column,"RUNTIME",e.file)}case"ConditionalExpr":{let r=this.evalExpr(e.condition,n);return this.isTruthy(r)?this.evalExpr(e.trueArm,n):this.evalExpr(e.falseArm,n)}case"BinaryExpr":{if(e.operator==="&&"){let o=this.evalExpr(e.left,n);return this.isTruthy(o)?this.evalExpr(e.right,n):o}if(e.operator==="||"){let o=this.evalExpr(e.left,n);return this.isTruthy(o)?o:this.evalExpr(e.right,n)}let r=this.evalExpr(e.left,n),s=this.evalExpr(e.right,n),i=e.operator;switch(i){case"+":return typeof r=="string"||typeof s=="string"?String(r)+String(s):r+s;case"-":return r-s;case"*":return r*s;case"/":if(s===0)throw new M("Division by zero",e.line,e.column,"RUNTIME",e.file);return r/s;case"%":return r%s;case"==":return r===s;case"!=":return r!==s;case"<":return r<s;case"<=":return r<=s;case">":return r>s;case">=":return r>=s;default:throw new M(`Unknown binary operator: ${i}`,e.line,e.column,"RUNTIME",e.file)}}case"CallExpr":{let r=e.args.map(s=>this.evalExpr(s,n));return this.invokeNamed(this.resolveCallTarget(e.callee,n),r,n,e.line,e.column,e.file)}}}resolveIdentifier(e,n,r){if(n.has(e)){let s=n.get(e);if(s&&typeof s=="object"&&Ta.has(s))try{let i=Ta.get(s)();return Ps(i)?i.catch(o=>{throw new M(String(o.message??o),r.line,r.column,"RUNTIME",r.file)}):i}catch(i){throw new M(String(i.message??i),r.line,r.column,"RUNTIME",r.file)}return s}if(this.userFunctions.has(e)||this.hostFunctions.has(e))return new Fn(e);throw new M(`Variable '${e}' was read before its binding was initialized`,r.line,r.column,"RUNTIME",r.file)}resolveCallTarget(e,n){if(this.userFunctions.has(e)||this.hostFunctions.has(e))return e;let r=n.get(e);return r instanceof Fn?r.name:e}invokeNamed(e,n,r,s,i,o){if(Fe(this.abortSignal),this.userFunctions.has(e)){let a=this.userFunctions.get(e);if(this.callDepth++,this.callDepth>Os)throw this.callDepth--,new M(`Execution fuel exhausted: maximum function call depth exceeded (${Os})`,s,i,"RUNTIME",o);let l=new He(this.globalEnv,!0);for(let c=0;c<a.params.length;c++)l.define(a.params[c],n[c]);try{for(let c of a.body.statements)this.execStmt(c,l)}catch(c){if(c instanceof Dn)return c.value;throw c}finally{this.callDepth--}return null}if(this.hostFunctions.has(e)){let a=this.hostFunctions.get(e);try{return Fe(this.abortSignal),a.fn(...n)}catch(l){throw l instanceof mt||l?.name==="LMScriptExit"||l?.isControlFlow?l:new M(`Error in host function '${e}': ${l?.message||String(l)}`,s,i,"RUNTIME",o)}}throw r.has(e)?new M(`'${e}' is not a function`,s,i,"RUNTIME",o):new M(vr(e,"Undefined function"),s,i,"RUNTIME",o)}isTruthy(e){return!(e==null||e===!1||e===0||e==="")}async evaluateProgramAsync(e){if(this.globalEnv=new He,this.initialGlobals)for(let[s,i]of this.initialGlobals.entries())this.globalEnv.define(s,i);this.userFunctions.clear(),this.asyncCallDepth.clear();for(let s of e.statements)s.kind==="FunctionDeclStmt"&&this.userFunctions.set(s.name,s);let n=this.nextTaskId++,r;for(let s of e.statements)s.kind!=="FunctionDeclStmt"&&(r=await this.execStmtAsync(s,this.globalEnv,n));return r}async execStmtAsync(e,n,r){switch(Fe(this.abortSignal),e.kind){case"PackageStmt":return;case"ImportStmt":return;case"BlockStmt":{let s=new He(n);for(let i of e.statements)await this.execStmtAsync(i,s,r);return}case"VarDeclStmt":{let s=null;return e.initializer&&(s=await this.evalExprAsync(e.initializer,n,r)),n.define(e.name,s),s}case"TupleVarDeclStmt":{let s=await this.evalExprAsync(e.initializer,n,r);if(!Array.isArray(s))throw new M(`Cannot destructure non-array value (got ${typeof s})`,e.line,e.column,"RUNTIME",e.file);for(let i=0;i<e.names.length;i++){let o=i<s.length?s[i]:null;n.define(e.names[i],o)}return s}case"IfStmt":{let s=await this.evalExprAsync(e.condition,n,r);return this.isTruthy(s)?await this.execStmtAsync(e.thenBranch,n,r):e.elseBranch?await this.execStmtAsync(e.elseBranch,n,r):void 0}case"WhileStmt":{let s=0;for(;this.isTruthy(await this.evalExprAsync(e.condition,n,r));){if(++s>1e6)throw new M("Execution fuel exhausted: while loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{await this.execStmtAsync(e.body,n,r)}catch(i){if(i instanceof dt)break;if(i instanceof ut)continue;throw i}}return}case"ForInStmt":{let s=xu(await this.evalExprAsync(e.iterable,n,r),e),i=0;for(let o of s){if(++i>1e6)throw new M("Execution fuel exhausted: for-in loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME",e.file);let a=new He(n);a.define(e.name,o);try{if(e.body.kind==="BlockStmt")for(let l of e.body.statements)await this.execStmtAsync(l,a,r);else await this.execStmtAsync(e.body,a,r)}catch(l){if(l instanceof dt)break;if(l instanceof ut)continue;throw l}}return}case"ForStmt":{let s=new He(n);e.init&&await this.execStmtAsync(e.init,s,r);let i=0;for(;;){if(e.condition){let o=await this.evalExprAsync(e.condition,s,r);if(!this.isTruthy(o))break}if(++i>1e6)throw new M("Execution fuel exhausted: for loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{await this.execStmtAsync(e.body,s,r)}catch(o){if(o instanceof dt)break;if(!(o instanceof ut))throw o}e.update&&await this.evalExprAsync(e.update,s,r)}return}case"ReturnStmt":{let s=e.value?await this.evalExprAsync(e.value,n,r):null;throw new Dn(s)}case"BreakStmt":throw new dt;case"ContinueStmt":throw new ut;case"SyncAssignStmt":{let s=n.resolveBinding(e.target);if(!s)throw new M(`Synchronized assignment target '${e.target}' is not defined`,e.line,e.column,"RUNTIME",e.file);let i=`bind:${s.env.id}:${s.name}`;await this.lockManager.getBindingLock(i).withLock(async()=>{let a=await this.evalExprAsync(e.value,n,r);s.env.set(s.name,a)},r);return}case"SyncIndexAssignStmt":{let s=await this.evalExprAsync(e.target,n,r);if(s==null||typeof s!="object"&&typeof s!="function")throw new M("Cannot perform synchronized assignment on non-object",e.line,e.column,"RUNTIME",e.file);await this.lockManager.getObjectLock(s).withLock(async()=>{let o=await this.evalExprAsync(e.index,n,r),a=await this.evalExprAsync(e.value,n,r);Array.isArray(s)&&typeof o=="number"&&o<0&&(o=s.length+o),Be(s,o,a)},r);return}case"SyncCallStmt":{let s=e.call;if(s.args.length===0)throw new M("Synchronized call requires at least one argument (the target container)",e.line,e.column,"RUNTIME",e.file);let i=this.hostFunctions.get(s.callee);if(!i||!i.isContainerMutation)throw new M(`Function '${s.callee}' is not an authorized container mutation operation`,e.line,e.column,"RUNTIME",e.file);let o=await this.evalExprAsync(s.args[0],n,r);if(o==null||typeof o!="object"&&typeof o!="function")throw new M("Target of synchronized call must be an array or map",e.line,e.column,"RUNTIME",e.file);await this.lockManager.getObjectLock(o).withLock(async()=>{let l=[];for(let c=1;c<s.args.length;c++)l.push(await this.evalExprAsync(s.args[c],n,r));await this.invokeCallAsync(s.callee,[o,...l],n,e.line,e.column,r,e.file)},r);return}case"ExprStmt":return await this.evalExprAsync(e.expr,n,r);default:return}}async evalExprAsync(e,n,r){switch(Fe(this.abortSignal),e.kind){case"InterpolatedStringExpr":{let s="";for(let i of e.parts)s+=typeof i=="string"?i:va(await this.evalExprAsync(i.expression,n,r),i);return s}case"LiteralExpr":return e.value;case"IdentifierExpr":return this.resolveIdentifier(e.name,n,e);case"AssignExpr":{let s=await this.evalExprAsync(e.value,n,r);return n.set(e.target,s),s}case"TupleAssignExpr":{let s=await this.evalExprAsync(e.value,n,r);if(!Array.isArray(s))throw new M(`Cannot destructure non-array value (got ${typeof s})`,e.line,e.column,"RUNTIME",e.file);for(let i=0;i<e.targets.length;i++){let o=i<s.length?s[i]:null;n.set(e.targets[i],o)}return s}case"IndexAssignExpr":{let s=await this.evalExprAsync(e.target,n,r),i=await this.evalExprAsync(e.index,n,r),o=await this.evalExprAsync(e.value,n,r);if(Array.isArray(s)||typeof s=="object"&&s!==null)return Array.isArray(s)&&typeof i=="number"&&i<0&&(i=s.length+i),Be(s,i,o),o;throw new M("Cannot index-assign to non-array / non-object",e.line,e.column,"RUNTIME",e.file)}case"GroupingExpr":return await this.evalExprAsync(e.expression,n,r);case"TupleExpr":{let s=[];for(let i of e.elements)s.push(await this.evalExprAsync(i,n,r));return s}case"ArrayExpr":{let s=[];for(let i of e.elements)s.push(await this.evalExprAsync(i,n,r));return s}case"ObjectExpr":{let s={};for(let i of e.properties)Be(s,i.key,await this.evalExprAsync(i.value,n,r));return s}case"ParallelExpr":{if(e.tasks.length===0)return[];let s=this.asyncCallDepth.get(r)??0,i=e.tasks.map(async c=>{let d=this.nextTaskId++;return this.asyncCallDepth.set(d,s),await this.evalExprAsync(c,n,d)}),o=await Promise.allSettled(i),a=[],l;for(let c of o)c.status==="fulfilled"?a.push(c.value):l||(l=c.reason);if(l)throw l;return a}case"IndexExpr":{let s=Ws(e);if(s)return De(await this.resolveIdentifier("PROPS",n,e),s);let i=await this.evalExprAsync(e.target,n,r),o=await this.evalExprAsync(e.index,n,r);if(i==null)throw new M("Cannot read property of null or undefined",e.line,e.column,"RUNTIME",e.file);return Array.isArray(i)&&typeof o=="number"&&o<0?i[i.length+o]:De(i,o)}case"UnaryExpr":{let s=await this.evalExprAsync(e.operand,n,r),i=e.operator;if(i==="!")return!this.isTruthy(s);if(i==="-")return-s;throw new M(`Unknown unary operator: ${i}`,e.line,e.column,"RUNTIME",e.file)}case"ConditionalExpr":{let s=await this.evalExprAsync(e.condition,n,r);return this.isTruthy(s)?await this.evalExprAsync(e.trueArm,n,r):await this.evalExprAsync(e.falseArm,n,r)}case"BinaryExpr":{if(e.operator==="&&"){let a=await this.evalExprAsync(e.left,n,r);return this.isTruthy(a)?await this.evalExprAsync(e.right,n,r):a}if(e.operator==="||"){let a=await this.evalExprAsync(e.left,n,r);return this.isTruthy(a)?a:await this.evalExprAsync(e.right,n,r)}let s=await this.evalExprAsync(e.left,n,r),i=await this.evalExprAsync(e.right,n,r),o=e.operator;switch(o){case"+":return typeof s=="string"||typeof i=="string"?String(s)+String(i):s+i;case"-":return s-i;case"*":return s*i;case"/":if(i===0)throw new M("Division by zero",e.line,e.column,"RUNTIME",e.file);return s/i;case"%":return s%i;case"==":return s===i;case"!=":return s!==i;case"<":return s<i;case"<=":return s<=i;case">":return s>i;case">=":return s>=i;default:throw new M(`Unknown binary operator: ${o}`,e.line,e.column,"RUNTIME",e.file)}}case"CallExpr":{let s=[];for(let i of e.args)s.push(await this.evalExprAsync(i,n,r));return await this.invokeCallAsync(e.callee,s,n,e.line,e.column,r,e.file)}}}async invokeCallAsync(e,n,r,s,i,o,a){let l=this.resolveCallTarget(e,r);if(Fe(this.abortSignal),this.userFunctions.has(l)){let c=this.userFunctions.get(l),d=(this.asyncCallDepth.get(o)??0)+1;if(this.asyncCallDepth.set(o,d),d>Os)throw this.asyncCallDepth.set(o,d-1),new M(`Execution fuel exhausted: maximum function call depth exceeded (${Os})`,s,i,"RUNTIME",a);let u=new He(this.globalEnv,!0);for(let m=0;m<c.params.length;m++)u.define(c.params[m],n[m]);try{for(let m of c.body.statements)await this.execStmtAsync(m,u,o)}catch(m){if(m instanceof Dn)return m.value;throw m}finally{this.asyncCallDepth.set(o,d-1)}return null}if(this.hostFunctions.has(l)){let c=this.hostFunctions.get(l);try{let d=c.fn(...n);return d instanceof Promise?await d:d}catch(d){throw d instanceof mt||d?.name==="LMScriptExit"||d?.isControlFlow?d:new M(`Error in host function '${l}': ${d?.message||String(d)}`,s,i,"RUNTIME",a)}}throw r.has(l)?new M(`'${l}' is not a function`,s,i,"RUNTIME",a):new M(vr(l,"Undefined function"),s,i,"RUNTIME",a)}getRecordedErrors(){return[...this.recordedErrors]}},lw=[{name:"if",category:"Language Constructs",signature:"if (condition) { ... } else { ... }",description:"Conditional branching flow control.",example:'if (x > 0) { print("yes"); } else { print("no"); }'},{name:"while",category:"Language Constructs",signature:"while (condition) { ... }",description:"Looping flow control that repeats while condition is true.",example:"while (i < 10) { i = i + 1; }"},{name:"for",category:"Language Constructs",signature:"for (x in expr) { ... }; for (init; condition; update) { ... }",description:"For-in visits a snapshot of list values, map keys or string Unicode code points with a fresh local binding. C-style loops remain supported; use let for an isolated counter.",example:"for (let i = 0; i < len(arr); i = i + 1) { print(arr[i]); }"},{name:"fn",category:"Language Constructs",signature:"fn name(arg1, arg2) { ... }",description:"Defines a custom function. Function bodies establish an isolated local variable scope for assignments, preventing accidental mutation of caller variables.",example:"fn add(a, b) { return a + b; }"},{name:"import",category:"Language Constructs",signature:'import "path"',description:"Imports and executes another script file.",example:'import "utils.lm"'},{name:"parallel",category:"Language Constructs",signature:"parallel([ call1(), call2() ])",description:"Executes an array of function calls concurrently, returning an array of results.",example:'(a,b) = parallel([ system("echo 1"), system("echo 2") ]);'},{name:"sync",category:"Language Constructs",signature:"sync expr",description:"Forces sequential execution of an assignment or container mutation inside a parallel block.",example:'sync push(results, "done");'},{name:"break",category:"Language Constructs",signature:"break",description:"Exits the innermost loop.",example:"while (true) { break; }"},{name:"continue",category:"Language Constructs",signature:"continue",description:"Skips to the next iteration of the innermost loop.",example:"for (let i = 0; i < 2; i = i + 1) { if (i == 0) { continue; } }"},{name:"return",category:"Language Constructs",signature:"return expr",description:"Returns a value from a function or script.",example:"return 42;"}],cw=[{name:"sha256",category:"Math & Utilities",signature:"sha256(text: string): string",description:"Lowercase SHA-256 hex of UTF-8 bytes; rejects non-string inputs.",example:'sha256("abc");'},{name:"read_file",category:"File I/O",signature:"read_file(path: string): string",description:"Reads the entire contents of a file as a UTF-8 string.",example:'content = read_file("config.json");'},{name:"read",category:"File I/O",signature:"read(path: string): string",description:"Reads the entire contents of a file as a UTF-8 string (alias for read_file).",example:'content = read("data.txt");'},{name:"read_lines",category:"File I/O",signature:"read_lines(path: string): array",description:"Reads a file and returns an array of string lines.",example:'lines = read_lines("items.txt");'},{name:"write_lines",category:"File I/O",signature:"write_lines(path: string, lines: array): boolean",description:"Writes an array of lines to a file with trailing newline, round-tripping with read_lines.",example:'write_lines("out.txt", ["a", "b"]);'},{name:"glob",category:"File I/O",signature:"glob(pattern: string): array",description:"Finds files matching a glob pattern and returns an array of matching paths.",example:'files = glob("teams/*.lmctl");'},{name:"list_dir",category:"File I/O",signature:"list_dir(path: string): array",description:"Lists filenames in a directory.",example:'entries = list_dir(".");'},{name:"write_file",category:"File I/O",signature:"write_file(path: string, content: any): boolean",description:"Writes content to a file, creating or overwriting it.",example:'write_file("out.txt", "hello");'},{name:"write",category:"File I/O",signature:"write(path: string, content: any): boolean",description:"Writes content to a file (alias for write_file).",example:'write("out.txt", "data");'},{name:"append_file",category:"File I/O",signature:"append_file(path: string, content: any): boolean",description:"Appends string content to the end of a file.",example:'append_file("log.txt", "step completed\\n");'},{name:"read_json",category:"File I/O",signature:"read_json(path: string): any",description:"Reads a JSON file from disk and parses it into an object or array.",example:'data = read_json("package.json");'},{name:"write_json",category:"File I/O",signature:"write_json(path: string, data: any, [indent: number = 2]): boolean",description:"Serializes data as formatted JSON and writes it to a file.",example:'write_json("out.json", { "status": "ok" }, 2);'},{name:"read_csv",category:"File I/O",signature:'read_csv(path: string, [hasHeader: boolean = true], [delimiter: string = ","]): array',description:"Reads an RFC 4180 CSV file and parses it into an array of objects or rows.",example:'rows = read_csv("data.csv");'},{name:"write_csv",category:"File I/O",signature:'write_csv(path: string, data: array, [delimiter: string = ","]): boolean',description:"Serializes an array of objects or rows to CSV and writes to a file.",example:'write_csv("out.csv", [{ name: "Alice", age: 30 }]);'},{name:"csv_parse",category:"File I/O",signature:'csv_parse(text: string, [hasHeader: boolean = true], [delimiter: string = ","]): array',description:"Parses inline CSV text into an array of objects or rows.",example:'records = csv_parse("name,score\\nBob,95");'},{name:"csv_stringify",category:"File I/O",signature:'csv_stringify(data: array, [delimiter: string = ","]): string',description:"Serializes an array of objects or rows into RFC 4180 CSV text.",example:"csv_text = csv_stringify(records);"},{name:"file_exists",category:"File I/O",signature:"file_exists(path: string): boolean",description:"Checks if a file exists at the given path.",example:'if (file_exists("log.txt")) { print("found"); }'},{name:"temp_file",category:"File I/O",signature:"temp_file(): string",description:"Creates an empty temporary file and returns its absolute path.",example:"tmp = temp_file();"},{name:"write_file_exclusive",category:"File I/O",signature:"write_file_exclusive(path: string, content: any): boolean",description:"Creates a new file exclusively; errors if it already exists.",example:'write_file_exclusive("new.txt", "hello");'},{name:"mkdir",category:"File I/O",signature:"mkdir(dirPath: string, [recursive: boolean = true]): boolean",description:"Creates a directory, recursively by default.",example:'mkdir("out/logs");'},{name:"rmdir",category:"File I/O",signature:"rmdir(dirPath: string, [recursive: boolean = false]): boolean",description:"Removes a directory; pass true to remove a non-empty directory recursively.",example:'rmdir("out/logs", true);'},{name:"copy_file",category:"File I/O",signature:"copy_file(src: string, dest: string): boolean",description:"Copies a file to a new path.",example:'copy_file("a.txt", "b.txt");'},{name:"move_file",category:"File I/O",signature:"move_file(src: string, dest: string): boolean",description:"Moves/renames a file.",example:'move_file("draft.txt", "final.txt");'},{name:"basename",category:"File I/O",signature:"basename(filePath: string, [ext: string]): string",description:"Returns the last path segment, optionally stripping a trailing extension.",example:'name = basename("/a/b/c.txt", ".txt");'},{name:"dirname",category:"File I/O",signature:"dirname(filePath: string): string",description:"Returns the directory portion of a path.",example:'dir = dirname("/a/b/c.txt");'},{name:"path_join",category:"File I/O",signature:"path_join(...parts: string): string",description:"Joins path segments using the OS-native separator; no arguments returns dot.",example:'p = path_join("a", "b", "c.txt");'},{name:"abs_path",category:"File I/O",signature:"abs_path(filePath: string): string",description:"Resolves a path to an absolute path.",example:'p = abs_path("relative/file.txt");'},{name:"env",category:"System & Process",signature:"env(name: string, [fallback: any = null]): any",description:"Reads an environment variable, or a fallback if unset.",example:'home = env("HOME");'},{name:"getenv",category:"System & Process",signature:"getenv(name: string, [fallback: any = null]): any",description:"Reads an environment variable, or a fallback if unset (alias for env).",example:'home = getenv("HOME");'},{name:"set_env",category:"System & Process",signature:"set_env(name: string, value: any): boolean",description:"Sets an environment variable for this process and its children.",example:'set_env("DEBUG", "1");'},{name:"enumerate",category:"Lists & Arrays",signature:"enumerate(arr: array): array",description:"Returns an array of [index, value] pairs, JS/Python-familiar alongside zip (Rule 1, operator 2026-09-29).",example:'pairs = enumerate(["a", "b"]);'},{name:"items",category:"Maps & Key-Value",signature:"items(obj: object): array",description:"Returns an array of [key, value] pairs for an object (alias for entries).",example:"pairs = items({ a: 1, b: 2 });"},{name:"getstr",category:"Maps & Key-Value",signature:'getstr(obj: any, path: string|array, [fallback: string = ""]): string',description:'Typed form of get(): reads a string field, fallback (default "") when missing or null. A present number/bool is stringified (str(null) would instead return the 4-char string "null" -- getstr never does that). Pass a non-"" fallback (e.g. "?") when "missing" needs to read differently from a real empty string.',example:'dir = getstr(req, "dir");'},{name:"getnum",category:"Maps & Key-Value",signature:"getnum(obj: any, path: string|array, [fallback: number = 0]): number",description:"Typed form of get(): reads a numeric field, coercing a present value with num(); fallback when missing or null.",example:'count = getnum(req, "count", 1);'},{name:"getbool",category:"Maps & Key-Value",signature:"getbool(obj: any, path: string|array, [fallback: boolean = false]): boolean",description:'Typed form of get(): reads a boolean field. The strings "true"/"false" (any case) parse as booleans; fallback when missing or null.',example:'seed = getbool(req, "seed", true);'},{name:"getlist",category:"Maps & Key-Value",signature:"getlist(obj: any, path: string|array, [fallback: array = []]): array",description:"Typed form of get(): reads an array field, fallback (default []) when missing, null, or not actually an array.",example:'reviewers = getlist(req, "reviewers");'},{name:"require",category:"System & Process",signature:"require(value: any, message: string): any",description:'Validates a request-form field in one line: if value is missing ("", null, [], or false), reports through injected diagnostics/captured errors and stops with exit 2; otherwise returns value unchanged so it composes with getstr/getnum/getbool/getlist.',example:'dir = require(getstr(req, "dir"), "missing required field: dir");'},{name:"regex_test",category:"Strings",signature:"regex_test(s: string, pattern: string, [flags: string]): boolean",description:"Tests a JavaScript regex against text.",example:'regex_test("abc", "a");'},{name:"regex_match",category:"Strings",signature:"regex_match(s: string, pattern: string, [flags: string]): array|null",description:"Returns first [full_match, group1, ...], including with g; missing optional groups become null. Rejects sticky y.",example:'regex_match("a1 b2", "([a-z])([0-9])", "g");'},{name:"regex_find_all",category:"Strings",signature:"regex_find_all(s: string, pattern: string, [flags: string]): array",description:"Returns capture arrays for matches; zero-width progress follows code points in u/v modes. Rejects sticky y.",example:'regex_find_all("a1 b2", "([a-z])([0-9])");'},{name:"regex_replace",category:"Strings",signature:"regex_replace(s: string, pattern: string, replacement: string, [flags: string]): string",description:"JavaScript regex replacement with $1 captures; use g for repeated replacement.",example:'regex_replace("a1", "([a-z])([0-9])", "$2$1");'},{name:"split_regex",category:"Strings",signature:"split_regex(s: string, pattern: string, [flags: string]): array",description:"Splits using JavaScript regex semantics.",example:'split_regex("a b", " +");'},{name:"split",category:"Strings",signature:"split(s: string, delimiter: string): array",description:"Splits a string by delimiter into an array of substrings.",example:'parts = split("a,b,c", ",");'},{name:"sprintf",category:"Strings",signature:"sprintf(template: string, ...args: any): string",description:"Formats %s, %d, %f and %% with optional decimal width and .precision, - left alignment and 0 numeric padding. String precision truncates; integer precision pads digits; float precision rounds (0..100). Bare %f keeps normal number text. Width/other precision limit: 10000. Unsupported directives and missing values are errors; extra arguments are ignored.",example:'s = sprintf("%05.2f|%s|%d", 3.14159, "x", 42);'},{name:"lines",category:"Strings",signature:"lines(s: string): array",description:"Splits a string into an array of lines.",example:'arr = lines("line1\\nline2");'},{name:"last_line_as_status",category:"Strings",signature:"last_line_as_status(s: string): string|null",description:"Returns the last non-blank line of a string if it is a valid state word (DONE, NOTHING_TO_DO, BLOCKED, OTHER), otherwise returns null.",example:"status = last_line_as_status(reply);"},{name:"words",category:"Strings",signature:"words(s: string): array",description:"Splits a string into non-whitespace words.",example:'w = words("hello world from lmscript");'},{name:"join",category:"Strings",signature:"join(arr: array, [separator: string]): string",description:"Joins array elements into a string separated by delimiter.",example:'s = join(["apple", "banana"], ", ");'},{name:"trim",category:"Strings",signature:"trim(s: string): string",description:"Trims whitespace from both ends of a string.",example:'clean = trim(" hello ");'},{name:"strip",category:"Strings",signature:"strip(s: string): string",description:"Trims whitespace from both ends of a string (alias for trim).",example:'clean = strip(" hello ");'},{name:"trim_start",category:"Strings",signature:"trim_start(s: string): string",description:"Trims whitespace from the beginning of a string.",example:'s = trim_start(" hello");'},{name:"lstrip",category:"Strings",signature:"lstrip(s: string): string",description:"Trims whitespace from the beginning of a string (alias for trim_start).",example:'s = lstrip(" hello");'},{name:"trim_end",category:"Strings",signature:"trim_end(s: string): string",description:"Trims whitespace from the end of a string.",example:'s = trim_end("hello ");'},{name:"rstrip",category:"Strings",signature:"rstrip(s: string): string",description:"Trims whitespace from the end of a string (alias for trim_end).",example:'s = rstrip("hello ");'},{name:"to_upper",category:"Strings",signature:"to_upper(s: string): string",description:"Converts all characters in string to uppercase.",example:'u = to_upper("hello");'},{name:"upper",category:"Strings",signature:"upper(s: string): string",description:"Converts all characters in string to uppercase (alias for to_upper).",example:'u = upper("hello");'},{name:"to_lower",category:"Strings",signature:"to_lower(s: string): string",description:"Converts all characters in string to lowercase.",example:'l = to_lower("HELLO");'},{name:"lower",category:"Strings",signature:"lower(s: string): string",description:"Converts all characters in string to lowercase (alias for to_lower).",example:'l = lower("HELLO");'},{name:"upper_first",category:"Strings",signature:"upper_first(s: string): string",description:"Capitalizes the first character of a string.",example:'c = upper_first("hello");'},{name:"title_case",category:"Strings",signature:"title_case(s: string): string",description:"Converts words in a string to Title Case.",example:'t = title_case("hello world");'},{name:"contains",category:"Strings",signature:"contains(haystack: string|array, needle: any): boolean",description:"Checks if a string or array contains an item or substring.",example:'if (contains("hello", "ell")) { print("matched"); }'},{name:"includes",category:"Strings",signature:"includes(haystack: string|array, needle: any): boolean",description:"Alias for contains.",example:'if (includes([1, 2, 3], 2)) { print("found"); }'},{name:"starts_with",category:"Strings",signature:"starts_with(s: string, prefix: string): boolean",description:"Checks if a string starts with the given prefix.",example:'if (starts_with("prefix_name", "prefix_")) { ... }'},{name:"startswith",category:"Strings",signature:"startswith(s: string, prefix: string): boolean",description:"Checks if a string starts with the given prefix (alias for starts_with).",example:'if (startswith("prefix_name", "prefix_")) { ... }'},{name:"ends_with",category:"Strings",signature:"ends_with(s: string, suffix: string): boolean",description:"Checks if a string ends with the given suffix.",example:'if (ends_with("file.txt", ".txt")) { ... }'},{name:"endswith",category:"Strings",signature:"endswith(s: string, suffix: string): boolean",description:"Checks if a string ends with the given suffix (alias for ends_with).",example:'if (endswith("file.txt", ".txt")) { ... }'},{name:"index_of",category:"Strings",signature:"index_of(haystack: string|array, needle: any, [fromIndex: number]): number",description:"Finds the first index of a substring or item, or -1 if not found.",example:'idx = index_of("banana", "a");'},{name:"last_index_of",category:"Strings",signature:"last_index_of(haystack: string|array, needle: any): number",description:"Finds the last index of a substring or item, or -1 if not found.",example:'idx = last_index_of("banana", "a");'},{name:"count_matches",category:"Strings",signature:"count_matches(s: string, sub: string): number",description:"Counts non-overlapping occurrences of a substring.",example:'n = count_matches("banana", "a");'},{name:"substr",category:"Strings",signature:"substr(s: string, start: number, [length: number]): string",description:"Returns a substring by start and optional length; negative starts count from the end and clamp at zero. Nonpositive lengths return empty text.",example:'sub = substr("hello", 1, 3);'},{name:"substring",category:"Strings",signature:"substring(s: string, start: number, [end: number]): string",description:"Returns a substring between start and end indices.",example:'sub = substring("hello", 1, 4);'},{name:"slice",category:"Strings",signature:"slice(target: string|array, start: number, [end: number]): string|array",description:"Extracts a section of a string or array.",example:"part = slice([1, 2, 3, 4], 1, 3);"},{name:"char_at",category:"Strings",signature:"char_at(s: string, index: number): string",description:"Returns the character at the specified index.",example:'c = char_at("hello", 0);'},{name:"char_code",category:"Strings",signature:"char_code(s: string, [index: number = 0]): number",description:"Returns the UTF-16 code unit at index.",example:'code = char_code("A");'},{name:"from_char_code",category:"Strings",signature:"from_char_code(...codes: number): string",description:"Returns string from character codes.",example:"s = from_char_code(65, 66, 67);"},{name:"replace",category:"Strings",signature:"replace(s: string, search: string, replacement: string): string",description:"Replaces the first occurrence of search substring.",example:'s = replace("hello world", "world", "lmscript");'},{name:"replace_all",category:"Strings",signature:"replace_all(s: string, search: string, replacement: string): string",description:"Replaces all occurrences of search substring.",example:'s = replace_all("foo bar foo", "foo", "baz");'},{name:"repeat",category:"Strings",signature:"repeat(s: string, count: number): string",description:"Repeats a string count times.",example:'stars = repeat("*", 10);'},{name:"pad_start",category:"Strings",signature:'pad_start(s: string, targetLength: number, [padChar: string = " "]): string',description:"Left-pads string to target length.",example:'num_str = pad_start("5", 3, "0");'},{name:"pad_end",category:"Strings",signature:'pad_end(s: string, targetLength: number, [padChar: string = " "]): string',description:"Right-pads string to target length.",example:'row = pad_end("title", 20, ".");'},{name:"reverse_str",category:"Strings",signature:"reverse_str(s: string): string",description:"Reverses characters in a string.",example:'rev = reverse_str("abc");'},{name:"is_empty",category:"Strings",signature:"is_empty(val: any): boolean",description:"Checks if a string, array, or object is empty or null.",example:'if (is_empty(arr)) { print("empty"); }'},{name:"is_digit",category:"Strings",signature:"is_digit(s: string): boolean",description:"Checks if a string contains only digits.",example:'if (is_digit("123")) { print("all digits"); }'},{name:"is_alpha",category:"Strings",signature:"is_alpha(s: string): boolean",description:"Checks if a string contains only alphabetic characters.",example:'if (is_alpha("abc")) { ... }'},{name:"is_alnum",category:"Strings",signature:"is_alnum(s: string): boolean",description:"Checks if a string contains only letters and digits.",example:'if (is_alnum("item42")) { ... }'},{name:"format",category:"Strings",signature:"format(template: string, ...args: any): string",description:"Formats a template string replacing {{}} brace escapes, positional {0}, auto {}, and {key} map placeholders.",example:'msg = format("Hello, {}! You have {} tasks.", "User", 3);'},{name:"shell_quote",category:"Strings",signature:"shell_quote(val: any): string",description:"Quotes string safely for POSIX shell command execution.",example:'escaped = shell_quote("arg with spaces");'},{name:"len",category:"Lists & Arrays",signature:"len(item: any): number",description:"Returns the length of a string, array, or number of object keys.",example:"n = len([10, 20, 30]);"},{name:"length",category:"Lists & Arrays",signature:"length(item: any): number",description:"Returns the length of a string, array, or object (alias for len).",example:"n = length([10, 20, 30]);"},{name:"push",category:"Lists & Arrays",signature:"push(arr: array, ...items: any): array",description:"Appends an element to the end of an array and returns the array.",example:'push(items, "new_item");'},{name:"pop",category:"Lists & Arrays",signature:"pop(arr: array): any",description:"Removes and returns the last element of an array.",example:"last = pop(items);"},{name:"shift",category:"Lists & Arrays",signature:"shift(arr: array): any",description:"Removes and returns the first element of an array.",example:"first = shift(items);"},{name:"unshift",category:"Lists & Arrays",signature:"unshift(arr: array, ...items: any): array",description:"Prepends an element to the beginning of an array.",example:'unshift(items, "header");'},{name:"insert",category:"Lists & Arrays",signature:"insert(arr: array, index: number, item: any): array",description:"Inserts an element at the specified index in an array.",example:'insert(items, 1, "inserted");'},{name:"remove_at",category:"Lists & Arrays",signature:"remove_at(arr: array, index: number): any",description:"Removes and returns the element at the specified index.",example:"removed = remove_at(items, 0);"},{name:"concat",category:"Lists & Arrays",signature:"concat(first: array, ...more: array): array",description:"Concatenates two or more arrays into a new array.",example:"all = concat(arr1, arr2);"},{name:"reverse",category:"Lists & Arrays",signature:"reverse(arr: array): array",description:"Reverses elements of an array in place.",example:"reverse(items);"},{name:"sort",category:"Lists & Arrays",signature:"sort(arr: array, [key: string]): array",description:"Sorts array elements numerically, alphabetically, or by object key.",example:'sorted = sort(users, "age");'},{name:"sorted",category:"Lists & Arrays",signature:"sorted(arr: array, [key: string]): array",description:"Sorts array elements numerically, alphabetically, or by object key (alias for sort).",example:'result = sorted(users, "age");'},{name:"unique",category:"Lists & Arrays",signature:"unique(arr: array): array",description:"Returns a new array with duplicate elements removed.",example:"deduped = unique([1, 2, 2, 3]);"},{name:"flatten",category:"Lists & Arrays",signature:"flatten(arr: array): array",description:"Flattens a nested array by one level.",example:"flat = flatten([[1, 2], [3, 4]]);"},{name:"first",category:"Lists & Arrays",signature:"first(arr: array): any",description:"Returns the first element of an array, or null if empty.",example:"top = first(items);"},{name:"last",category:"Lists & Arrays",signature:"last(arr: array): any",description:"Returns the last element of an array, or null if empty.",example:"tail = last(items);"},{name:"sum",category:"Lists & Arrays",signature:"sum(arr: array): number",description:"Computes the arithmetic sum of numeric elements in an array.",example:"total = sum([1, 2, 3, 4]);"},{name:"avg",category:"Lists & Arrays",signature:"avg(arr: array): number",description:"Computes the arithmetic mean of numeric elements in an array.",example:"mean = avg([10, 20, 30]);"},{name:"range",category:"Lists & Arrays",signature:"range(start: number, [end: number], [step: number = 1]): array",description:"Generates an array of numbers from start to end by step.",example:"nums = range(0, 5);"},{name:"keys",category:"Maps & Key-Value",signature:"keys(obj: object): array",description:"Returns an array of own property keys of an object.",example:"k = keys({ a: 1, b: 2 });"},{name:"values",category:"Maps & Key-Value",signature:"values(obj: object): array",description:"Returns an array of own property values of an object.",example:"v = values({ a: 1, b: 2 });"},{name:"entries",category:"Maps & Key-Value",signature:"entries(obj: object): array",description:"Returns an array of [key, value] pairs for an object.",example:"pairs = entries({ a: 1, b: 2 });"},{name:"from_entries",category:"Maps & Key-Value",signature:"from_entries(pairs: array): object",description:"Constructs an object from an array of [key, value] pairs.",example:'obj = from_entries([["name", "Bob"], ["age", 25]]);'},{name:"has_key",category:"Maps & Key-Value",signature:"has_key(obj: object, key: string): boolean",description:"Checks if an object has the specified own property key.",example:'if (has_key(config, "port")) { ... }'},{name:"get",category:"Maps & Key-Value",signature:"get(obj: any, path: string|array, [defaultVal: any]): any",description:"Retrieves a nested property safely using a dot or array path.",example:'val = get(config, "database.host", "localhost");'},{name:"set",category:"Maps & Key-Value",signature:"set(obj: object, path: string|array, value: any): object",description:"Sets a nested property on an object using a dot or array path.",example:'set(config, "server.port", 8080);'},{name:"delete_key",category:"Maps & Key-Value",signature:"delete_key(obj: object, key: string): object",description:"Deletes a key from an object.",example:'delete_key(data, "temp");'},{name:"merge",category:"Maps & Key-Value",signature:"merge(a: object, b: object): object",description:"Shallow merges two objects into a new object.",example:"combined = merge(defaults, overrides);"},{name:"clone",category:"Maps & Key-Value",signature:"clone(val: any): any",description:"Deep clones an object or array via JSON serialization.",example:"copy = clone(original);"},{name:"json_parse",category:"JSON & Data",signature:"json_parse(str: string): any",description:"Alias for json.",example:"data = json_parse(text);"},{name:"json_parse_safe",category:"JSON & Data",signature:"json_parse_safe(str: string, [fallback: any = null]): any",description:'Safely parses JSON with markdown fence and preamble tolerance, returning fallback on failure without throwing. Use a custom sentinel (e.g. "PARSE_FAILED") to distinguish parse failure from valid JSON null.',example:'data = json_parse_safe(llm_output, "PARSE_FAILED"); if (data == "PARSE_FAILED") { print("parse failed"); }'},{name:"json_stringify",category:"JSON & Data",signature:"json_stringify(val: any, [indent: number = 0]): string",description:"Serializes a value to compact JSON by default; optional indent formats the output.",example:"text = json_stringify(obj, 2);"},{name:"pluck",category:"JSON & Data",signature:"pluck(arr: array, key: string): array",description:"Extracts the specified key from each object in an array.",example:'names = pluck(users, "name");'},{name:"filter_by",category:"JSON & Data",signature:"filter_by(arr: array, key: string, value: any): array",description:"Filters an array of objects where item[key] == value.",example:'active = filter_by(users, "active", true);'},{name:"find_by",category:"JSON & Data",signature:"find_by(arr: array, key: string, value: any): any",description:"Finds the first object in an array where item[key] == value.",example:'user = find_by(users, "id", 42);'},{name:"num",category:"Math",signature:"num(val: any): number",description:"Converts a value to a numeric type.",example:'n = num("42.5");'},{name:"round",category:"Math",signature:"round(n: number): number",description:"Rounds a number to the nearest integer.",example:"r = round(3.7);"},{name:"floor",category:"Math",signature:"floor(n: number): number",description:"Returns the largest integer less than or equal to a number.",example:"f = floor(3.9);"},{name:"ceil",category:"Math",signature:"ceil(n: number): number",description:"Returns the smallest integer greater than or equal to a number.",example:"c = ceil(3.1);"},{name:"min",category:"Math",signature:"min(...nums: number|array): number",description:"Returns the minimum value from numbers or a number array.",example:"m = min(10, 5, 20);"},{name:"max",category:"Math",signature:"max(...nums: number|array): number",description:"Returns the maximum value from numbers or a number array.",example:"m = max([10, 5, 20]);"},{name:"abs",category:"Math",signature:"abs(n: number): number",description:"Returns the absolute value of a number.",example:"a = abs(-42);"},{name:"sqrt",category:"Math",signature:"sqrt(n: number): number",description:"Returns the square root of a number.",example:"s = sqrt(16);"},{name:"pow",category:"Math",signature:"pow(base: number, exp: number): number",description:"Calculates base raised to exponent.",example:"p = pow(2, 8);"},{name:"random",category:"Math",signature:"random(): number",description:"Returns a pseudo-random floating point number in [0, 1).",example:"r = random();"},{name:"system",category:"System & Process",signature:"system(command: string|array, [timeoutMs: number = 60000]): SystemResult",description:"Executes a shell command string or argv array directly with shell:false, returning a structured process execution record.",parameters:[{name:"command",type:"string|array",description:"Shell command string or argv array to execute"},{name:"timeoutMs",type:"number",description:"(optional) Execution timeout in milliseconds (default: 60000)"}],returns:{type:"SystemResult",description:"{ stdout: string, stderr: string, code: number|null, signal: string|null, timed_out: bool, duration_ms: number, pid: number|null }"},example:'res = system(["git", "log", "-n", "1"]); if (res.code == 0) { print(res.stdout); }'},{name:"prompt_human",category:"System & Process",signature:"prompt_human([question: string], [options: map]): string|null; prompt_human(session: map, [options: map]): map",description:"Pauses execution to prompt an operator on terminal stdin or dedicated directory, returning the entered input line or decision map, or null if stdin is closed/non-interactive.",example:'guidance = prompt_human("Enter instructions (or Enter to halt): "); if (guidance != null) { process(guidance); }'},{name:"prompt_human_config",category:"System & Process",signature:"prompt_human_config([config: map|string], [dir: string]): map",description:"Configures prompt_human mode ('interactive' or 'file' with dedicated directory, timeout_ms, poll_ms). Returns current configuration map.",example:'prompt_human_config({ dir: "/tmp/handoffs", timeout_ms: 60000 });'},{name:"error",category:"System & Process",signature:"error(value: any, ...args: any): string",description:"Formats and logs an error to stderr and records it for the execution error summary.",example:'error("Operation failed:", reason);'},{name:"exit",category:"System & Process",signature:"exit([code: number = 0]): never",description:"Terminates script execution immediately with exit code.",example:"exit(0);"},{name:"print",category:"System & Process",signature:"print(...args: any): string",description:"Formats values into an output-log entry rendered as a line by the CLI. Returns the formatted text without adding a newline.",example:'print("Result:", val);'},{name:"printf",category:"System & Process",signature:"printf(template: string, ...args: any): string",description:"Formats and prints %s, %d, %f and %% using the sprintf width and precision rules.",example:'printf("%s scored %d", "Alice", 95);'},{name:"println",category:"System & Process",signature:"println(...args: any): string",description:"Alias of print: both log formatted values rendered as a line by the CLI and return text without adding a newline.",example:'println("Done.");'},{name:"sleep_ms",category:"System & Process",signature:"sleep_ms(ms: number): void",description:"Pauses execution for specified milliseconds.",example:"sleep_ms(1000);"},{name:"now",category:"System & Process",signature:"now(): number",description:"Returns current epoch in milliseconds.",example:"t = now();"},{name:"timestamp",category:"System & Process",signature:"timestamp(): number",description:"Returns current Unix epoch in whole seconds.",example:"t = timestamp();"},{name:"date",category:"System & Process",signature:"date([epochMs: number]): string",description:"Returns an ISO 8601 date-time string for now or a supplied epoch-millisecond value.",example:"created = date(0);"},{name:"strftime",category:"System & Process",signature:"strftime(epochMs: number, fmt: string): string",description:"Takes epoch milliseconds first and format second, using local time. Supports %Y, %m, %d, %H, %M, %S and %% only; other tokens remain literal. Invalid dates or argument types are errors.",example:'s = strftime(clock(), "%Y-%m-%d");'},{name:"date_format",category:"System & Process",signature:"date_format(epochMs: number, fmt: string): string",description:"Alias for strftime: epoch milliseconds first, format second, using local time and the same supported tokens and validation.",example:'s = date_format(now(), "%Y-%m-%d");'},{name:"coalesce",category:"System & Process",signature:"coalesce(...values: any): any",description:"Returns the first non-null/non-undefined argument, else null (including no arguments).",example:'v = coalesce(a, b, "default");'},{name:"if_null",category:"System & Process",signature:"if_null(val: any, fallback: any): any",description:"Returns fallback if val is null/undefined, else val.",example:'v = if_null(maybe_null, "default");'},{name:"default_to",category:"System & Process",signature:"default_to(val: any, fallback: any): any",description:"Returns fallback if val is null/undefined, else val (alias for if_null).",example:'v = default_to(maybe_null, "default");'},{name:"if_else",category:"System & Process",signature:"if_else(cond: any, thenVal: any, elseVal: any): any",description:"Eager compatibility helper: returns thenVal if cond is truthy, else elseVal; all three arguments are evaluated. Use condition ? thenVal : elseVal for lazy selection.",example:'label = if_else(count > 0, "some", "none");'},{name:"str",category:"System & Process",signature:"str(val: any): string",description:"Converts lists and plain maps to compact JSON using the f-string collection rule; scalars retain normal text. Cyclic or lossy collections are errors. Does not change + coercion.",example:"s = str(123);"},{name:"to_string",category:"System & Process",signature:"to_string(val: any): string",description:"Alias for str; lists and plain maps become compact JSON, while scalar text and + coercion stay unchanged.",example:"s = to_string(123);"},{name:"is_array",category:"System & Process",signature:"is_array(val: any): boolean",description:"Checks if a value is an array (type-check alias over type()).",example:"if (is_array(val)) { ... }"},{name:"is_string",category:"System & Process",signature:"is_string(val: any): boolean",description:"Checks if a value is a string (type-check alias over type()).",example:"if (is_string(val)) { ... }"},{name:"is_number",category:"System & Process",signature:"is_number(val: any): boolean",description:"Checks if a value is a number (type-check alias over type()).",example:"if (is_number(val)) { ... }"},{name:"is_map",category:"System & Process",signature:"is_map(val: any): boolean",description:"Checks if a value is a map/object (type-check alias over type()).",example:"if (is_map(val)) { ... }"},{name:"is_function",category:"System & Process",signature:"is_function(val: any): boolean",description:"Checks if a value is a first-class function reference (type-check alias over type()).",example:"if (is_function(val)) { ... }"},{name:"type",category:"System & Process",signature:"type(val: any): string",description:"Returns the runtime type of a value ('string', 'number', 'boolean', 'array', 'object', 'null', 'function').",example:"t = type(data);"},{name:"assert",category:"System & Process",signature:"assert(condition: any, [message: string]): boolean",description:"Throws an error if condition is falsy.",example:'assert(len(items) > 0, "Items list must not be empty");'},{name:"http_get",category:"System & Process",signature:"http_get(url: string): string",description:"Performs HTTP(S) GET request and returns response body string.",example:'html = http_get("https://example.com");'}],dw=[{name:"is_blank",category:"Strings",signature:"is_blank(s: any): boolean",description:"Returns true if string is null, empty, or whitespace only.",example:'if (is_blank(user_input)) { println("input required"); }'},{name:"chunk",category:"Lists & Arrays",signature:"chunk(arr: array, size: number): array",description:"Splits an array into chunks of specified size.",example:"batches = chunk(items, 10);"},{name:"compact",category:"Lists & Arrays",signature:"compact(arr: array): array",description:"Returns a new array with all null elements removed.",example:"valid = compact([1, null, 2, null, 3]);"},{name:"zip",category:"Lists & Arrays",signature:"zip(arr1: array, arr2: array): array",description:"Combines two arrays into an array of pairs [[a1, b1], [a2, b2], ...].",example:'pairs = zip(["a", "b"], [1, 2]);'},{name:"take",category:"Lists & Arrays",signature:"take(arr: array, n: number): array",description:"Returns the first n elements of an array.",example:"first_three = take(items, 3);"},{name:"drop",category:"Lists & Arrays",signature:"drop(arr: array, n: number): array",description:"Returns a new array with the first n elements omitted.",example:"rest = drop(items, 3);"},{name:"clamp",category:"Math",signature:"clamp(val: number, low: number, high: number): number",description:"Restricts a numeric value to lie within [low, high] bounds.",example:"bounded = clamp(score, 0, 100);"}];Wt=class t{hostFunctions=new Map;functionDocs=new Map;registeredModules=new Map;functionOriginModule=new Map;currentRegisteringModule="core";outputLogs=[];isAsyncMode=!1;promptHumanConfig={mode:"interactive"};hostCatalog=new Map;builtinProviders=new Map;hostResolver;constructor(e={}){this.hostResolver=e.resolveHostModule,this.registeredModules.set("core",{name:"core",description:"LMScript core language built-ins and standard library"}),this.registerPredefinedFunctions();for(let[n,r]of[["get_property",{min:1,max:2}],["has_property",1],["get_properties",{min:0,max:1}],["set_property",2]])this.registerFunction(n,()=>{throw Error("Property store is not running")},r,"Read or overlay hierarchical run-local properties; no persistence");this.registerFunction("expand",()=>{throw Error("Template resolver is not running")},{min:1,max:2},"Expand simple references from explicit vars, PROPS paths and invocation ARGV; inserted text is opaque"),this.registerDefaultDocs();for(let[n,r,s]of[["get_property","get_property(key, [default])","Returns a copied property value; absent keys are errors unless a default is supplied."],["has_property","has_property(key)","Tests property presence; missing/invalid profile errors remain loud."],["get_properties","get_properties([prefix])","Returns a detached nested property table copy."],["set_property","set_property(key, value)","Returns the previous value and changes only the run-local overlay; invocation facts are read-only."]])this.functionDocs.set(n,{name:n,signature:r,description:s,module:"core",category:"Properties"});this.functionDocs.set("expand",{name:"expand",signature:"expand(text, [vars])",description:"Resolve ${name} from an explicit vars map, ${PROPS.path}, and ${ARGV[n]}; $${ escapes, no caller-local capture or recursive expansion.",module:"core",category:"Strings"})}registerDefaultDocs(){for(let e of lw)this.functionDocs.set(e.name,{...e,module:e.module??"core"});for(let e of cw)this.functionDocs.set(e.name,{...e,module:e.module??"core"});for(let e of dw)this.functionDocs.set(e.name,{...e,module:e.module??"core"})}registerFunctionDoc(e){return this.functionDocs.set(e.name,{...e,module:e.module??this.currentRegisteringModule}),this}registerModule(e,n){if(this.registeredModules.has(e.name))throw new Error(`Module '${e.name}' is already registered`);this.registeredModules.set(e.name,e);let r=this.currentRegisteringModule;this.currentRegisteringModule=e.name;try{if(e.docs)for(let s of e.docs)this.registerFunctionDoc({...s,module:s.module??e.name});typeof e.register=="function"&&e.register(this,n)}finally{this.currentRegisteringModule=r}return this}getModules(){return Array.from(this.registeredModules.values())}getModule(e){return this.registeredModules.get(e)}getFunctionsByModule(e){return Array.from(this.functionDocs.values()).filter(n=>(n.module??"core").toLowerCase()===e.toLowerCase())}getFunctionDocs(){return Array.from(this.functionDocs.values())}getFunctionDoc(e){return this.functionDocs.get(e)}getFunctionCategories(){let e=new Set;for(let n of this.functionDocs.values())e.add(n.category);return Array.from(e)}getFunctionsByCategory(e){return Array.from(this.functionDocs.values()).filter(n=>n.category.toLowerCase()===e.toLowerCase())}registerPredefinedFunctions(){this.registerFunction("read_file",e=>$.readFileSync(e,"utf-8"),1,"Reads entire file as UTF-8 string"),this.registerFunction("read",e=>$.readFileSync(e,"utf-8"),1,"Reads entire file as UTF-8 string"),this.registerFunction("read_lines",e=>{let n=$.readFileSync(e,"utf-8"),r=n.length>0;return n.endsWith(`\r
410
+ `:""),v=A.exitCode!==void 0?A.exitCode:A.success?0:1,T={success:A.success&&v===0,stdout:S,output:[...A.output],value:A.value,exit_code:v,code:v,errors:A.errors??[]};return T.toString=()=>S,T}},arity:{min:1,max:2},description:"Executes another LMScript file in-process and returns execution result with .stdout, .output, .success, .exit_code",isDefault:!0});let f=e.get("http_get");(!f||f.isDefault)&&this.hostFunctions.set("http_get",{fn:g=>this.isAsync?rw(g):ju(g),arity:1,description:"Downloads UTF-8 text from a public HTTP(S) URL",isDefault:!0});let w=e.get("sleep_ms");(!w||w.isDefault)&&this.hostFunctions.set("sleep_ms",{fn:g=>{if(typeof g!="number"||!Number.isFinite(g)||g<0)throw new Error("sleep_ms() duration must be a non-negative finite number");if(g>2147483647)throw new Error("sleep_ms() duration exceeds maximum supported timeout (2147483647 ms)");if(this.isAsync)return new Promise(b=>setTimeout(b,g));let E=Date.now()+g;for(;Date.now()<E;);return null},arity:1,description:"Sleeps for the specified milliseconds",isDefault:!0})}evaluateProgram(e){if(this.globalEnv=new He,this.initialGlobals)for(let[r,s]of this.initialGlobals.entries())this.globalEnv.define(r,s);this.userFunctions.clear(),this.callDepth=0;for(let r of e.statements)r.kind==="FunctionDeclStmt"&&this.userFunctions.set(r.name,r);let n;for(let r of e.statements)r.kind!=="FunctionDeclStmt"&&(n=this.execStmt(r,this.globalEnv));return n}execStmt(e,n){switch(Fe(this.abortSignal),e.kind){case"PackageStmt":return;case"ImportStmt":return;case"BlockStmt":{let r=new He(n);for(let s of e.statements)this.execStmt(s,r);return}case"VarDeclStmt":{let r=null;return e.initializer&&(r=this.evalExpr(e.initializer,n)),n.define(e.name,r),r}case"TupleVarDeclStmt":{let r=this.evalExpr(e.initializer,n);if(!Array.isArray(r))throw new M(`Cannot destructure non-array value (got ${typeof r})`,e.line,e.column,"RUNTIME",e.file);for(let s=0;s<e.names.length;s++){let i=s<r.length?r[s]:null;n.define(e.names[s],i)}return r}case"IfStmt":{let r=this.evalExpr(e.condition,n);return this.isTruthy(r)?this.execStmt(e.thenBranch,n):e.elseBranch?this.execStmt(e.elseBranch,n):void 0}case"WhileStmt":{let r=0;for(;this.isTruthy(this.evalExpr(e.condition,n));){if(++r>1e6)throw new M("Execution fuel exhausted: while loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{this.execStmt(e.body,n)}catch(s){if(s instanceof ut)break;if(s instanceof mt)continue;throw s}}return}case"ForInStmt":{let r=Ou(this.evalExpr(e.iterable,n),e),s=0;for(let i of r){if(++s>1e6)throw new M("Execution fuel exhausted: for-in loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME",e.file);let o=new He(n);o.define(e.name,i);try{if(e.body.kind==="BlockStmt")for(let a of e.body.statements)this.execStmt(a,o);else this.execStmt(e.body,o)}catch(a){if(a instanceof ut)break;if(a instanceof mt)continue;throw a}}return}case"ForStmt":{let r=new He(n);e.init&&this.execStmt(e.init,r);let s=0;for(;;){if(e.condition){let i=this.evalExpr(e.condition,r);if(!this.isTruthy(i))break}if(++s>1e6)throw new M("Execution fuel exhausted: for loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{this.execStmt(e.body,r)}catch(i){if(i instanceof ut)break;if(!(i instanceof mt))throw i}e.update&&this.evalExpr(e.update,r)}return}case"ReturnStmt":{let r=e.value?this.evalExpr(e.value,n):null;throw new $n(r)}case"BreakStmt":throw new ut;case"ContinueStmt":throw new mt;case"SyncAssignStmt":case"SyncIndexAssignStmt":case"SyncCallStmt":throw new M("Synchronized statements require asynchronous execution via engine.runAsync()",e.line,e.column,"RUNTIME",e.file);case"ExprStmt":return this.evalExpr(e.expr,n);default:return}}evalExpr(e,n){switch(Fe(this.abortSignal),e.kind){case"InterpolatedStringExpr":{let r="";for(let s of e.parts)r+=typeof s=="string"?s:ba(this.evalExpr(s.expression,n),s);return r}case"ParallelExpr":throw new M("'parallel(...)' requires asynchronous execution via engine.runAsync()",e.line,e.column,"RUNTIME",e.file);case"LiteralExpr":return e.value;case"IdentifierExpr":return this.resolveIdentifier(e.name,n,e);case"AssignExpr":{let r=this.evalExpr(e.value,n);return n.set(e.target,r),r}case"TupleAssignExpr":{let r=this.evalExpr(e.value,n);if(!Array.isArray(r))throw new M(`Cannot destructure non-array value (got ${typeof r})`,e.line,e.column,"RUNTIME",e.file);for(let s=0;s<e.targets.length;s++){let i=s<r.length?r[s]:null;n.set(e.targets[s],i)}return r}case"IndexAssignExpr":{let r=this.evalExpr(e.target,n),s=this.evalExpr(e.index,n),i=this.evalExpr(e.value,n);if(Array.isArray(r)||typeof r=="object"&&r!==null)return Array.isArray(r)&&typeof s=="number"&&s<0&&(s=r.length+s),Be(r,s,i),i;throw new M("Cannot index-assign to non-array / non-object",e.line,e.column,"RUNTIME",e.file)}case"GroupingExpr":return this.evalExpr(e.expression,n);case"TupleExpr":return e.elements.map(r=>this.evalExpr(r,n));case"ArrayExpr":return e.elements.map(r=>this.evalExpr(r,n));case"ObjectExpr":{let r={};for(let s of e.properties)Be(r,s.key,this.evalExpr(s.value,n));return r}case"IndexExpr":{let r=qs(e);if(r)return De(this.resolveIdentifier("PROPS",n,e),r);let s=this.evalExpr(e.target,n),i=this.evalExpr(e.index,n);if(s==null)throw new M("Cannot read property of null or undefined",e.line,e.column,"RUNTIME",e.file);return Array.isArray(s)&&typeof i=="number"&&i<0?s[s.length+i]:De(s,i)}case"UnaryExpr":{let r=this.evalExpr(e.operand,n),s=e.operator;if(s==="!")return!this.isTruthy(r);if(s==="-")return-r;throw new M(`Unknown unary operator: ${s}`,e.line,e.column,"RUNTIME",e.file)}case"ConditionalExpr":{let r=this.evalExpr(e.condition,n);return this.isTruthy(r)?this.evalExpr(e.trueArm,n):this.evalExpr(e.falseArm,n)}case"BinaryExpr":{if(e.operator==="&&"){let o=this.evalExpr(e.left,n);return this.isTruthy(o)?this.evalExpr(e.right,n):o}if(e.operator==="||"){let o=this.evalExpr(e.left,n);return this.isTruthy(o)?o:this.evalExpr(e.right,n)}let r=this.evalExpr(e.left,n),s=this.evalExpr(e.right,n),i=e.operator;switch(i){case"+":return typeof r=="string"||typeof s=="string"?String(r)+String(s):r+s;case"-":return r-s;case"*":return r*s;case"/":if(s===0)throw new M("Division by zero",e.line,e.column,"RUNTIME",e.file);return r/s;case"%":return r%s;case"==":return r===s;case"!=":return r!==s;case"<":return r<s;case"<=":return r<=s;case">":return r>s;case">=":return r>=s;default:throw new M(`Unknown binary operator: ${i}`,e.line,e.column,"RUNTIME",e.file)}}case"CallExpr":{let r=e.args.map(s=>this.evalExpr(s,n));return this.invokeNamed(this.resolveCallTarget(e.callee,n),r,n,e.line,e.column,e.file)}}}resolveIdentifier(e,n,r){if(n.has(e)){let s=n.get(e);if(s&&typeof s=="object"&&ka.has(s))try{let i=ka.get(s)();return jn(i)?i.catch(o=>{throw new M(String(o.message??o),r.line,r.column,"RUNTIME",r.file)}):i}catch(i){throw new M(String(i.message??i),r.line,r.column,"RUNTIME",r.file)}return s}if(this.userFunctions.has(e)||this.hostFunctions.has(e))return new Un(e);throw new M(`Variable '${e}' was read before its binding was initialized`,r.line,r.column,"RUNTIME",r.file)}resolveCallTarget(e,n){if(this.userFunctions.has(e)||this.hostFunctions.has(e))return e;let r=n.get(e);return r instanceof Un?r.name:e}invokeNamed(e,n,r,s,i,o){if(Fe(this.abortSignal),this.userFunctions.has(e)){let a=this.userFunctions.get(e);if(this.callDepth++,this.callDepth>Ps)throw this.callDepth--,new M(`Execution fuel exhausted: maximum function call depth exceeded (${Ps})`,s,i,"RUNTIME",o);let l=new He(this.globalEnv,!0);for(let c=0;c<a.params.length;c++)l.define(a.params[c],n[c]);try{for(let c of a.body.statements)this.execStmt(c,l)}catch(c){if(c instanceof $n)return c.value;throw c}finally{this.callDepth--}return null}if(this.hostFunctions.has(e)){let a=this.hostFunctions.get(e);if(a.returnsResource)throw new M(`'${e}' returns a resource and requires engine.runAsync(); the synchronous engine.run refuses to call it`,s,i,"RUNTIME",o);try{Fe(this.abortSignal);let l=a.fn(...n);if(a.returnsResource&&jn(l))throw l.then(c=>{try{c&&typeof c.finalizeSync=="function"?c.finalizeSync():c&&typeof c.close=="function"&&c.close()}catch{}},()=>{}),new Error("returns a resource asynchronously; use engine.runAsync()");return l}catch(l){throw l instanceof pt||l?.name==="LMScriptExit"||l?.isControlFlow?l:new M(`Error in host function '${e}': ${l?.message||String(l)}`,s,i,"RUNTIME",o)}}throw r.has(e)?new M(`'${e}' is not a function`,s,i,"RUNTIME",o):new M(br(e,"Undefined function"),s,i,"RUNTIME",o)}resourceError(e,n,r){return new M(`Resource ${this.resources.describe(e)} ${n}`,r.line,r.column,"RUNTIME",r.file)}refuseResource(e,n,r){if(gn(e))throw this.resourceError(e,n,r)}bindResource(e,n,r,s){let i=this.resources.bind(e,n,r);if(i)throw new M(i.charAt(0).toUpperCase()+i.slice(1),s.line,s.column,"RUNTIME",s.file)}async resourceCallArgs(e,n,r,s,i,o){if(!r.some(gn))return r;let a={line:s,column:i,file:o};if(!e.usesResource&&!e.closesResource)throw this.resourceError(r.find(gn),`cannot be passed to '${n}'`,a);let l=[];for(let c of r){if(!gn(c)){l.push(c);continue}let d=this.resources.lookup(c);if(!d)throw this.resourceError(c,`cannot be used by '${n}': it belongs to another run`,a);if(e.closesResource)this.resources.borrow(c),await this.resources.close(d);else if(d.state!=="open")throw this.resourceError(c,`is ${d.state==="closing"?"closing":"closed"}: '${n}' cannot use it`,a);this.resources.borrow(c),l.push(d.raw)}return l}registerHostResource(e,n,r,s,i,o){if(e==null)return e;if(typeof e!="object"||typeof e.close!="function"||typeof e.id!="string"&&typeof e.id!="number"||String(e.id)==="")throw new Error("a returnsResource host must return null or an object with a close method and a stable id");return this.resources.register(e,n,`${o??"<main>"}:${s}:${i}`,this.resources.scopeFor(r))}isTruthy(e){return!(e==null||e===!1||e===0||e==="")}async evaluateProgramAsync(e){if(this.globalEnv=new He,this.initialGlobals)for(let[s,i]of this.initialGlobals.entries())this.globalEnv.define(s,i);this.userFunctions.clear(),this.asyncCallDepth.clear();for(let s of e.statements)s.kind==="FunctionDeclStmt"&&this.userFunctions.set(s.name,s);let n=this.nextTaskId++,r;try{for(let s of e.statements)s.kind!=="FunctionDeclStmt"&&(r=await this.execStmtAsync(s,this.globalEnv,n))}finally{await this.resources.drain(this.resources.root)}return gn(r)&&(r=null),r}async execStmtAsync(e,n,r){switch(Fe(this.abortSignal),e.kind){case"PackageStmt":return;case"ImportStmt":return;case"BlockStmt":{let s=new He(n);for(let i of e.statements)await this.execStmtAsync(i,s,r);return}case"VarDeclStmt":{let s=null;return e.initializer&&(s=await this.evalExprAsync(e.initializer,n,r)),s instanceof Qe&&this.bindResource(s,n,e.name,e),n.define(e.name,s),s}case"TupleVarDeclStmt":{let s=await this.evalExprAsync(e.initializer,n,r);if(Array.isArray(s))for(let i=0;i<e.names.length&&i<s.length;i++)this.bindResource(s[i],n,e.names[i],e);if(!Array.isArray(s))throw new M(`Cannot destructure non-array value (got ${typeof s})`,e.line,e.column,"RUNTIME",e.file);for(let i=0;i<e.names.length;i++){let o=i<s.length?s[i]:null;n.define(e.names[i],o)}return s}case"IfStmt":{let s=await this.evalExprAsync(e.condition,n,r);return this.isTruthy(s)?await this.execStmtAsync(e.thenBranch,n,r):e.elseBranch?await this.execStmtAsync(e.elseBranch,n,r):void 0}case"WhileStmt":{let s=0;for(;this.isTruthy(await this.evalExprAsync(e.condition,n,r));){if(++s>1e6)throw new M("Execution fuel exhausted: while loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{await this.execStmtAsync(e.body,n,r)}catch(i){if(i instanceof ut)break;if(i instanceof mt)continue;throw i}}return}case"ForInStmt":{let s=Ou(await this.evalExprAsync(e.iterable,n,r),e),i=0;for(let o of s){if(++i>1e6)throw new M("Execution fuel exhausted: for-in loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME",e.file);let a=new He(n);a.define(e.name,o);try{if(e.body.kind==="BlockStmt")for(let l of e.body.statements)await this.execStmtAsync(l,a,r);else await this.execStmtAsync(e.body,a,r)}catch(l){if(l instanceof ut)break;if(l instanceof mt)continue;throw l}}return}case"ForStmt":{let s=new He(n);e.init&&await this.execStmtAsync(e.init,s,r);let i=0;for(;;){if(e.condition){let o=await this.evalExprAsync(e.condition,s,r);if(!this.isTruthy(o))break}if(++i>1e6)throw new M("Execution fuel exhausted: for loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{await this.execStmtAsync(e.body,s,r)}catch(o){if(o instanceof ut)break;if(!(o instanceof mt))throw o}e.update&&await this.evalExprAsync(e.update,s,r)}return}case"ReturnStmt":{let s=e.value?await this.evalExprAsync(e.value,n,r):null;throw s instanceof Qe&&this.refuseResource(s,"cannot be returned: a resource stays with its owner (return copied data instead)",e),new $n(s)}case"BreakStmt":throw new ut;case"ContinueStmt":throw new mt;case"SyncAssignStmt":{let s=n.resolveBinding(e.target);if(!s)throw new M(`Synchronized assignment target '${e.target}' is not defined`,e.line,e.column,"RUNTIME",e.file);let i=`bind:${s.env.id}:${s.name}`;await this.lockManager.getBindingLock(i).withLock(async()=>{let a=await this.evalExprAsync(e.value,n,r);this.bindResource(a,s.env,s.name,e),s.env.set(s.name,a)},r);return}case"SyncIndexAssignStmt":{let s=await this.evalExprAsync(e.target,n,r);if(s==null||typeof s!="object"&&typeof s!="function")throw new M("Cannot perform synchronized assignment on non-object",e.line,e.column,"RUNTIME",e.file);await this.lockManager.getObjectLock(s).withLock(async()=>{let o=await this.evalExprAsync(e.index,n,r),a=await this.evalExprAsync(e.value,n,r);this.refuseResource(s,"cannot be modified",e),this.refuseResource(o,"cannot be used as a map key",e),this.refuseResource(a,"cannot be stored in a container",e),Array.isArray(s)&&typeof o=="number"&&o<0&&(o=s.length+o),Be(s,o,a)},r);return}case"SyncCallStmt":{let s=e.call;if(s.args.length===0)throw new M("Synchronized call requires at least one argument (the target container)",e.line,e.column,"RUNTIME",e.file);let i=this.hostFunctions.get(s.callee);if(!i||!i.isContainerMutation)throw new M(`Function '${s.callee}' is not an authorized container mutation operation`,e.line,e.column,"RUNTIME",e.file);let o=await this.evalExprAsync(s.args[0],n,r);if(o==null||typeof o!="object"&&typeof o!="function")throw new M("Target of synchronized call must be an array or map",e.line,e.column,"RUNTIME",e.file);await this.lockManager.getObjectLock(o).withLock(async()=>{let l=[];for(let c=1;c<s.args.length;c++)l.push(await this.evalExprAsync(s.args[c],n,r));await this.invokeCallAsync(s.callee,[o,...l],n,e.line,e.column,r,e.file)},r);return}case"ExprStmt":return await this.evalExprAsync(e.expr,n,r);default:return}}async evalExprAsync(e,n,r){switch(Fe(this.abortSignal),e.kind){case"InterpolatedStringExpr":{let s="";for(let i of e.parts){if(typeof i=="string"){s+=i;continue}let o=await this.evalExprAsync(i.expression,n,r);this.refuseResource(o,"cannot be converted to text",i.expression),s+=ba(o,i)}return s}case"LiteralExpr":return e.value;case"IdentifierExpr":return this.resolveIdentifier(e.name,n,e);case"AssignExpr":{let s=await this.evalExprAsync(e.value,n,r);return s instanceof Qe&&this.bindResource(s,n.writeTarget(e.target),e.target,e),n.set(e.target,s),s}case"TupleAssignExpr":{let s=await this.evalExprAsync(e.value,n,r);if(!Array.isArray(s))throw new M(`Cannot destructure non-array value (got ${typeof s})`,e.line,e.column,"RUNTIME",e.file);for(let i=0;i<e.targets.length;i++){let o=i<s.length?s[i]:null;o instanceof Qe&&this.bindResource(o,n.writeTarget(e.targets[i]),e.targets[i],e),n.set(e.targets[i],o)}return s}case"IndexAssignExpr":{let s=await this.evalExprAsync(e.target,n,r),i=await this.evalExprAsync(e.index,n,r),o=await this.evalExprAsync(e.value,n,r);if(this.refuseResource(s,"cannot be modified",e),this.refuseResource(i,"cannot be used as a map key",e),this.refuseResource(o,"cannot be stored in a container",e),Array.isArray(s)||typeof s=="object"&&s!==null)return Array.isArray(s)&&typeof i=="number"&&i<0&&(i=s.length+i),Be(s,i,o),o;throw new M("Cannot index-assign to non-array / non-object",e.line,e.column,"RUNTIME",e.file)}case"GroupingExpr":return await this.evalExprAsync(e.expression,n,r);case"TupleExpr":{let s=[];for(let i of e.elements){let o=await this.evalExprAsync(i,n,r);this.refuseResource(o,"cannot be stored in a container",i),s.push(o)}return s}case"ArrayExpr":{let s=[];for(let i of e.elements){let o=await this.evalExprAsync(i,n,r);this.refuseResource(o,"cannot be stored in a container",i),s.push(o)}return s}case"ObjectExpr":{let s={};for(let i of e.properties){let o=await this.evalExprAsync(i.value,n,r);this.refuseResource(o,"cannot be stored in a container",i.value),Be(s,i.key,o)}return s}case"ParallelExpr":{if(e.tasks.length===0)return[];let s=this.asyncCallDepth.get(r)??0,i=e.tasks.map(async c=>{let d=this.nextTaskId++;return this.asyncCallDepth.set(d,s),await this.evalExprAsync(c,n,d)}),o=await Promise.allSettled(i),a=[],l;for(let c of o)c.status==="fulfilled"?a.push(c.value):l||(l=c.reason);if(l)throw l;return a}case"IndexExpr":{let s=qs(e);if(s)return De(await this.resolveIdentifier("PROPS",n,e),s);let i=await this.evalExprAsync(e.target,n,r),o=await this.evalExprAsync(e.index,n,r);if(this.refuseResource(o,"cannot be used as a map key",e),i instanceof Qe){if(o==="id")return i.id;throw this.resourceError(i,`has no readable field '${String(o)}' (only id)`,e)}if(i==null)throw new M("Cannot read property of null or undefined",e.line,e.column,"RUNTIME",e.file);return Array.isArray(i)&&typeof o=="number"&&o<0?i[i.length+o]:De(i,o)}case"UnaryExpr":{let s=await this.evalExprAsync(e.operand,n,r),i=e.operator;if(i==="!")return!this.isTruthy(s);if(this.refuseResource(s,"cannot be used in arithmetic",e),i==="-")return-s;throw new M(`Unknown unary operator: ${i}`,e.line,e.column,"RUNTIME",e.file)}case"ConditionalExpr":{let s=await this.evalExprAsync(e.condition,n,r);return this.isTruthy(s)?await this.evalExprAsync(e.trueArm,n,r):await this.evalExprAsync(e.falseArm,n,r)}case"BinaryExpr":{if(e.operator==="&&"){let a=await this.evalExprAsync(e.left,n,r);return this.isTruthy(a)?await this.evalExprAsync(e.right,n,r):a}if(e.operator==="||"){let a=await this.evalExprAsync(e.left,n,r);return this.isTruthy(a)?a:await this.evalExprAsync(e.right,n,r)}let s=await this.evalExprAsync(e.left,n,r),i=await this.evalExprAsync(e.right,n,r),o=e.operator;switch((s instanceof Qe||i instanceof Qe)&&o!=="=="&&o!=="!="&&(this.refuseResource(s,`cannot be used with '${o}' (only ==, != and truth tests)`,e),this.refuseResource(i,`cannot be used with '${o}' (only ==, != and truth tests)`,e)),o){case"+":return typeof s=="string"||typeof i=="string"?String(s)+String(i):s+i;case"-":return s-i;case"*":return s*i;case"/":if(i===0)throw new M("Division by zero",e.line,e.column,"RUNTIME",e.file);return s/i;case"%":return s%i;case"==":return s===i;case"!=":return s!==i;case"<":return s<i;case"<=":return s<=i;case">":return s>i;case">=":return s>=i;default:throw new M(`Unknown binary operator: ${o}`,e.line,e.column,"RUNTIME",e.file)}}case"CallExpr":{let s=[];for(let i of e.args)s.push(await this.evalExprAsync(i,n,r));return await this.invokeCallAsync(e.callee,s,n,e.line,e.column,r,e.file)}}}async invokeCallAsync(e,n,r,s,i,o,a){let l=this.resolveCallTarget(e,r);if(Fe(this.abortSignal),this.userFunctions.has(l)){let c=this.userFunctions.get(l),d=(this.asyncCallDepth.get(o)??0)+1;if(this.asyncCallDepth.set(o,d),d>Ps)throw this.asyncCallDepth.set(o,d-1),new M(`Execution fuel exhausted: maximum function call depth exceeded (${Ps})`,s,i,"RUNTIME",a);let u=new He(this.globalEnv,!0),m=this.resourcesEnabled?this.resources.enterFunction(u,r,`function ${l}`):void 0;for(let p=0;p<c.params.length;p++)m&&this.resources.borrow(n[p]),u.define(c.params[p],n[p]);try{for(let p of c.body.statements)await this.execStmtAsync(p,u,o)}catch(p){if(p instanceof $n)return p.value;throw p}finally{m&&m.records.length>0&&await this.resources.drain(m),this.asyncCallDepth.set(o,d-1)}return null}if(this.hostFunctions.has(l)){let c=this.hostFunctions.get(l),d=gw(n)?await this.resourceCallArgs(c,l,n,s,i,a):n;try{let u=c.fn(...d),m=u instanceof Promise?await u:u;return c.returnsResource?this.registerHostResource(m,l,r,s,i,a):m}catch(u){throw u instanceof pt||u?.name==="LMScriptExit"||u?.isControlFlow?u:new M(`Error in host function '${l}': ${u?.message||String(u)}`,s,i,"RUNTIME",a)}}throw r.has(l)?new M(`'${l}' is not a function`,s,i,"RUNTIME",a):new M(br(l,"Undefined function"),s,i,"RUNTIME",a)}getRecordedErrors(){return[...this.recordedErrors]}},hw=[{name:"if",category:"Language Constructs",signature:"if (condition) { ... } else { ... }",description:"Conditional branching flow control.",example:'if (x > 0) { print("yes"); } else { print("no"); }'},{name:"while",category:"Language Constructs",signature:"while (condition) { ... }",description:"Looping flow control that repeats while condition is true.",example:"while (i < 10) { i = i + 1; }"},{name:"for",category:"Language Constructs",signature:"for (x in expr) { ... }; for (init; condition; update) { ... }",description:"For-in visits a snapshot of list values, map keys or string Unicode code points with a fresh local binding. C-style loops remain supported; use let for an isolated counter.",example:"for (let i = 0; i < len(arr); i = i + 1) { print(arr[i]); }"},{name:"fn",category:"Language Constructs",signature:"fn name(arg1, arg2) { ... }",description:"Defines a custom function. Function bodies establish an isolated local variable scope for assignments, preventing accidental mutation of caller variables.",example:"fn add(a, b) { return a + b; }"},{name:"import",category:"Language Constructs",signature:'import "path"',description:"Imports and executes another script file.",example:'import "utils.lm"'},{name:"parallel",category:"Language Constructs",signature:"parallel([ call1(), call2() ])",description:"Executes an array of function calls concurrently, returning an array of results.",example:'(a,b) = parallel([ system("echo 1"), system("echo 2") ]);'},{name:"sync",category:"Language Constructs",signature:"sync expr",description:"Forces sequential execution of an assignment or container mutation inside a parallel block.",example:'sync push(results, "done");'},{name:"break",category:"Language Constructs",signature:"break",description:"Exits the innermost loop.",example:"while (true) { break; }"},{name:"continue",category:"Language Constructs",signature:"continue",description:"Skips to the next iteration of the innermost loop.",example:"for (let i = 0; i < 2; i = i + 1) { if (i == 0) { continue; } }"},{name:"return",category:"Language Constructs",signature:"return expr",description:"Returns a value from a function or script.",example:"return 42;"}],_w=[{name:"sha256",category:"Math & Utilities",signature:"sha256(text: string): string",description:"Lowercase SHA-256 hex of UTF-8 bytes; rejects non-string inputs.",example:'sha256("abc");'},{name:"read_file",category:"File I/O",signature:"read_file(path: string): string",description:"Reads the entire contents of a file as a UTF-8 string.",example:'content = read_file("config.json");'},{name:"read",category:"File I/O",signature:"read(path: string): string",description:"Reads the entire contents of a file as a UTF-8 string (alias for read_file).",example:'content = read("data.txt");'},{name:"read_lines",category:"File I/O",signature:"read_lines(path: string): array",description:"Reads a file and returns an array of string lines.",example:'lines = read_lines("items.txt");'},{name:"write_lines",category:"File I/O",signature:"write_lines(path: string, lines: array): boolean",description:"Writes an array of lines to a file with trailing newline, round-tripping with read_lines.",example:'write_lines("out.txt", ["a", "b"]);'},{name:"glob",category:"File I/O",signature:"glob(pattern: string): array",description:"Finds files matching a glob pattern and returns an array of matching paths.",example:'files = glob("teams/*.lmctl");'},{name:"list_dir",category:"File I/O",signature:"list_dir(path: string): array",description:"Lists filenames in a directory.",example:'entries = list_dir(".");'},{name:"write_file",category:"File I/O",signature:"write_file(path: string, content: any): boolean",description:"Writes content to a file, creating or overwriting it.",example:'write_file("out.txt", "hello");'},{name:"write",category:"File I/O",signature:"write(path: string, content: any): boolean",description:"Writes content to a file (alias for write_file).",example:'write("out.txt", "data");'},{name:"append_file",category:"File I/O",signature:"append_file(path: string, content: any): boolean",description:"Appends string content to the end of a file.",example:'append_file("log.txt", "step completed\\n");'},{name:"read_json",category:"File I/O",signature:"read_json(path: string): any",description:"Reads a JSON file from disk and parses it into an object or array.",example:'data = read_json("package.json");'},{name:"write_json",category:"File I/O",signature:"write_json(path: string, data: any, [indent: number = 2]): boolean",description:"Serializes data as formatted JSON and writes it to a file.",example:'write_json("out.json", { "status": "ok" }, 2);'},{name:"read_csv",category:"File I/O",signature:'read_csv(path: string, [hasHeader: boolean = true], [delimiter: string = ","]): array',description:"Reads an RFC 4180 CSV file and parses it into an array of objects or rows.",example:'rows = read_csv("data.csv");'},{name:"write_csv",category:"File I/O",signature:'write_csv(path: string, data: array, [delimiter: string = ","]): boolean',description:"Serializes an array of objects or rows to CSV and writes to a file.",example:'write_csv("out.csv", [{ name: "Alice", age: 30 }]);'},{name:"csv_parse",category:"File I/O",signature:'csv_parse(text: string, [hasHeader: boolean = true], [delimiter: string = ","]): array',description:"Parses inline CSV text into an array of objects or rows.",example:'records = csv_parse("name,score\\nBob,95");'},{name:"csv_stringify",category:"File I/O",signature:'csv_stringify(data: array, [delimiter: string = ","]): string',description:"Serializes an array of objects or rows into RFC 4180 CSV text.",example:"csv_text = csv_stringify(records);"},{name:"file_exists",category:"File I/O",signature:"file_exists(path: string): boolean",description:"Checks if a file exists at the given path.",example:'if (file_exists("log.txt")) { print("found"); }'},{name:"temp_file",category:"File I/O",signature:"temp_file(): string",description:"Creates an empty temporary file and returns its absolute path.",example:"tmp = temp_file();"},{name:"write_file_exclusive",category:"File I/O",signature:"write_file_exclusive(path: string, content: any): boolean",description:"Creates a new file exclusively; errors if it already exists.",example:'write_file_exclusive("new.txt", "hello");'},{name:"mkdir",category:"File I/O",signature:"mkdir(dirPath: string, [recursive: boolean = true]): boolean",description:"Creates a directory, recursively by default.",example:'mkdir("out/logs");'},{name:"rmdir",category:"File I/O",signature:"rmdir(dirPath: string, [recursive: boolean = false]): boolean",description:"Removes a directory; pass true to remove a non-empty directory recursively.",example:'rmdir("out/logs", true);'},{name:"copy_file",category:"File I/O",signature:"copy_file(src: string, dest: string): boolean",description:"Copies a file to a new path.",example:'copy_file("a.txt", "b.txt");'},{name:"move_file",category:"File I/O",signature:"move_file(src: string, dest: string): boolean",description:"Moves/renames a file.",example:'move_file("draft.txt", "final.txt");'},{name:"basename",category:"File I/O",signature:"basename(filePath: string, [ext: string]): string",description:"Returns the last path segment, optionally stripping a trailing extension.",example:'name = basename("/a/b/c.txt", ".txt");'},{name:"dirname",category:"File I/O",signature:"dirname(filePath: string): string",description:"Returns the directory portion of a path.",example:'dir = dirname("/a/b/c.txt");'},{name:"path_join",category:"File I/O",signature:"path_join(...parts: string): string",description:"Joins path segments using the OS-native separator; no arguments returns dot.",example:'p = path_join("a", "b", "c.txt");'},{name:"abs_path",category:"File I/O",signature:"abs_path(filePath: string): string",description:"Resolves a path to an absolute path.",example:'p = abs_path("relative/file.txt");'},{name:"env",category:"System & Process",signature:"env(name: string, [fallback: any = null]): any",description:"Reads an environment variable, or a fallback if unset.",example:'home = env("HOME");'},{name:"getenv",category:"System & Process",signature:"getenv(name: string, [fallback: any = null]): any",description:"Reads an environment variable, or a fallback if unset (alias for env).",example:'home = getenv("HOME");'},{name:"set_env",category:"System & Process",signature:"set_env(name: string, value: any): boolean",description:"Sets an environment variable for this process and its children.",example:'set_env("DEBUG", "1");'},{name:"enumerate",category:"Lists & Arrays",signature:"enumerate(arr: array): array",description:"Returns an array of [index, value] pairs, JS/Python-familiar alongside zip (Rule 1, operator 2026-09-29).",example:'pairs = enumerate(["a", "b"]);'},{name:"items",category:"Maps & Key-Value",signature:"items(obj: object): array",description:"Returns an array of [key, value] pairs for an object (alias for entries).",example:"pairs = items({ a: 1, b: 2 });"},{name:"getstr",category:"Maps & Key-Value",signature:'getstr(obj: any, path: string|array, [fallback: string = ""]): string',description:'Typed form of get(): reads a string field, fallback (default "") when missing or null. A present number/bool is stringified (str(null) would instead return the 4-char string "null" -- getstr never does that). Pass a non-"" fallback (e.g. "?") when "missing" needs to read differently from a real empty string.',example:'dir = getstr(req, "dir");'},{name:"getnum",category:"Maps & Key-Value",signature:"getnum(obj: any, path: string|array, [fallback: number = 0]): number",description:"Typed form of get(): reads a numeric field, coercing a present value with num(); fallback when missing or null.",example:'count = getnum(req, "count", 1);'},{name:"getbool",category:"Maps & Key-Value",signature:"getbool(obj: any, path: string|array, [fallback: boolean = false]): boolean",description:'Typed form of get(): reads a boolean field. The strings "true"/"false" (any case) parse as booleans; fallback when missing or null.',example:'seed = getbool(req, "seed", true);'},{name:"getlist",category:"Maps & Key-Value",signature:"getlist(obj: any, path: string|array, [fallback: array = []]): array",description:"Typed form of get(): reads an array field, fallback (default []) when missing, null, or not actually an array.",example:'reviewers = getlist(req, "reviewers");'},{name:"require",category:"System & Process",signature:"require(value: any, message: string): any",description:'Validates a request-form field in one line: if value is missing ("", null, [], or false), reports through injected diagnostics/captured errors and stops with exit 2; otherwise returns value unchanged so it composes with getstr/getnum/getbool/getlist.',example:'dir = require(getstr(req, "dir"), "missing required field: dir");'},{name:"regex_test",category:"Strings",signature:"regex_test(s: string, pattern: string, [flags: string]): boolean",description:"Tests a JavaScript regex against text.",example:'regex_test("abc", "a");'},{name:"regex_match",category:"Strings",signature:"regex_match(s: string, pattern: string, [flags: string]): array|null",description:"Returns first [full_match, group1, ...], including with g; missing optional groups become null. Rejects sticky y.",example:'regex_match("a1 b2", "([a-z])([0-9])", "g");'},{name:"regex_find_all",category:"Strings",signature:"regex_find_all(s: string, pattern: string, [flags: string]): array",description:"Returns capture arrays for matches; zero-width progress follows code points in u/v modes. Rejects sticky y.",example:'regex_find_all("a1 b2", "([a-z])([0-9])");'},{name:"regex_replace",category:"Strings",signature:"regex_replace(s: string, pattern: string, replacement: string, [flags: string]): string",description:"JavaScript regex replacement with $1 captures; use g for repeated replacement.",example:'regex_replace("a1", "([a-z])([0-9])", "$2$1");'},{name:"split_regex",category:"Strings",signature:"split_regex(s: string, pattern: string, [flags: string]): array",description:"Splits using JavaScript regex semantics.",example:'split_regex("a b", " +");'},{name:"split",category:"Strings",signature:"split(s: string, delimiter: string): array",description:"Splits a string by delimiter into an array of substrings.",example:'parts = split("a,b,c", ",");'},{name:"sprintf",category:"Strings",signature:"sprintf(template: string, ...args: any): string",description:"Formats %s, %d, %f and %% with optional decimal width and .precision, - left alignment and 0 numeric padding. String precision truncates; integer precision pads digits; float precision rounds (0..100). Bare %f keeps normal number text. Width/other precision limit: 10000. Unsupported directives and missing values are errors; extra arguments are ignored.",example:'s = sprintf("%05.2f|%s|%d", 3.14159, "x", 42);'},{name:"lines",category:"Strings",signature:"lines(s: string): array",description:"Splits a string into an array of lines.",example:'arr = lines("line1\\nline2");'},{name:"last_line_as_status",category:"Strings",signature:"last_line_as_status(s: string): string|null",description:"Returns the last non-blank line of a string if it is a valid state word (DONE, NOTHING_TO_DO, BLOCKED, OTHER), otherwise returns null.",example:"status = last_line_as_status(reply);"},{name:"words",category:"Strings",signature:"words(s: string): array",description:"Splits a string into non-whitespace words.",example:'w = words("hello world from lmscript");'},{name:"join",category:"Strings",signature:"join(arr: array, [separator: string]): string",description:"Joins array elements into a string separated by delimiter.",example:'s = join(["apple", "banana"], ", ");'},{name:"trim",category:"Strings",signature:"trim(s: string): string",description:"Trims whitespace from both ends of a string.",example:'clean = trim(" hello ");'},{name:"strip",category:"Strings",signature:"strip(s: string): string",description:"Trims whitespace from both ends of a string (alias for trim).",example:'clean = strip(" hello ");'},{name:"trim_start",category:"Strings",signature:"trim_start(s: string): string",description:"Trims whitespace from the beginning of a string.",example:'s = trim_start(" hello");'},{name:"lstrip",category:"Strings",signature:"lstrip(s: string): string",description:"Trims whitespace from the beginning of a string (alias for trim_start).",example:'s = lstrip(" hello");'},{name:"trim_end",category:"Strings",signature:"trim_end(s: string): string",description:"Trims whitespace from the end of a string.",example:'s = trim_end("hello ");'},{name:"rstrip",category:"Strings",signature:"rstrip(s: string): string",description:"Trims whitespace from the end of a string (alias for trim_end).",example:'s = rstrip("hello ");'},{name:"to_upper",category:"Strings",signature:"to_upper(s: string): string",description:"Converts all characters in string to uppercase.",example:'u = to_upper("hello");'},{name:"upper",category:"Strings",signature:"upper(s: string): string",description:"Converts all characters in string to uppercase (alias for to_upper).",example:'u = upper("hello");'},{name:"to_lower",category:"Strings",signature:"to_lower(s: string): string",description:"Converts all characters in string to lowercase.",example:'l = to_lower("HELLO");'},{name:"lower",category:"Strings",signature:"lower(s: string): string",description:"Converts all characters in string to lowercase (alias for to_lower).",example:'l = lower("HELLO");'},{name:"upper_first",category:"Strings",signature:"upper_first(s: string): string",description:"Capitalizes the first character of a string.",example:'c = upper_first("hello");'},{name:"title_case",category:"Strings",signature:"title_case(s: string): string",description:"Converts words in a string to Title Case.",example:'t = title_case("hello world");'},{name:"contains",category:"Strings",signature:"contains(haystack: string|array, needle: any): boolean",description:"Checks if a string or array contains an item or substring.",example:'if (contains("hello", "ell")) { print("matched"); }'},{name:"includes",category:"Strings",signature:"includes(haystack: string|array, needle: any): boolean",description:"Alias for contains.",example:'if (includes([1, 2, 3], 2)) { print("found"); }'},{name:"starts_with",category:"Strings",signature:"starts_with(s: string, prefix: string): boolean",description:"Checks if a string starts with the given prefix.",example:'if (starts_with("prefix_name", "prefix_")) { ... }'},{name:"startswith",category:"Strings",signature:"startswith(s: string, prefix: string): boolean",description:"Checks if a string starts with the given prefix (alias for starts_with).",example:'if (startswith("prefix_name", "prefix_")) { ... }'},{name:"ends_with",category:"Strings",signature:"ends_with(s: string, suffix: string): boolean",description:"Checks if a string ends with the given suffix.",example:'if (ends_with("file.txt", ".txt")) { ... }'},{name:"endswith",category:"Strings",signature:"endswith(s: string, suffix: string): boolean",description:"Checks if a string ends with the given suffix (alias for ends_with).",example:'if (endswith("file.txt", ".txt")) { ... }'},{name:"index_of",category:"Strings",signature:"index_of(haystack: string|array, needle: any, [fromIndex: number]): number",description:"Finds the first index of a substring or item, or -1 if not found.",example:'idx = index_of("banana", "a");'},{name:"last_index_of",category:"Strings",signature:"last_index_of(haystack: string|array, needle: any): number",description:"Finds the last index of a substring or item, or -1 if not found.",example:'idx = last_index_of("banana", "a");'},{name:"count_matches",category:"Strings",signature:"count_matches(s: string, sub: string): number",description:"Counts non-overlapping occurrences of a substring.",example:'n = count_matches("banana", "a");'},{name:"substr",category:"Strings",signature:"substr(s: string, start: number, [length: number]): string",description:"Returns a substring by start and optional length; negative starts count from the end and clamp at zero. Nonpositive lengths return empty text.",example:'sub = substr("hello", 1, 3);'},{name:"substring",category:"Strings",signature:"substring(s: string, start: number, [end: number]): string",description:"Returns a substring between start and end indices.",example:'sub = substring("hello", 1, 4);'},{name:"slice",category:"Strings",signature:"slice(target: string|array, start: number, [end: number]): string|array",description:"Extracts a section of a string or array.",example:"part = slice([1, 2, 3, 4], 1, 3);"},{name:"char_at",category:"Strings",signature:"char_at(s: string, index: number): string",description:"Returns the character at the specified index.",example:'c = char_at("hello", 0);'},{name:"char_code",category:"Strings",signature:"char_code(s: string, [index: number = 0]): number",description:"Returns the UTF-16 code unit at index.",example:'code = char_code("A");'},{name:"from_char_code",category:"Strings",signature:"from_char_code(...codes: number): string",description:"Returns string from character codes.",example:"s = from_char_code(65, 66, 67);"},{name:"replace",category:"Strings",signature:"replace(s: string, search: string, replacement: string): string",description:"Replaces the first occurrence of search substring.",example:'s = replace("hello world", "world", "lmscript");'},{name:"replace_all",category:"Strings",signature:"replace_all(s: string, search: string, replacement: string): string",description:"Replaces all occurrences of search substring.",example:'s = replace_all("foo bar foo", "foo", "baz");'},{name:"repeat",category:"Strings",signature:"repeat(s: string, count: number): string",description:"Repeats a string count times.",example:'stars = repeat("*", 10);'},{name:"pad_start",category:"Strings",signature:'pad_start(s: string, targetLength: number, [padChar: string = " "]): string',description:"Left-pads string to target length.",example:'num_str = pad_start("5", 3, "0");'},{name:"pad_end",category:"Strings",signature:'pad_end(s: string, targetLength: number, [padChar: string = " "]): string',description:"Right-pads string to target length.",example:'row = pad_end("title", 20, ".");'},{name:"reverse_str",category:"Strings",signature:"reverse_str(s: string): string",description:"Reverses characters in a string.",example:'rev = reverse_str("abc");'},{name:"is_empty",category:"Strings",signature:"is_empty(val: any): boolean",description:"Checks if a string, array, or object is empty or null.",example:'if (is_empty(arr)) { print("empty"); }'},{name:"is_digit",category:"Strings",signature:"is_digit(s: string): boolean",description:"Checks if a string contains only digits.",example:'if (is_digit("123")) { print("all digits"); }'},{name:"is_alpha",category:"Strings",signature:"is_alpha(s: string): boolean",description:"Checks if a string contains only alphabetic characters.",example:'if (is_alpha("abc")) { ... }'},{name:"is_alnum",category:"Strings",signature:"is_alnum(s: string): boolean",description:"Checks if a string contains only letters and digits.",example:'if (is_alnum("item42")) { ... }'},{name:"format",category:"Strings",signature:"format(template: string, ...args: any): string",description:"Formats a template string replacing {{}} brace escapes, positional {0}, auto {}, and {key} map placeholders.",example:'msg = format("Hello, {}! You have {} tasks.", "User", 3);'},{name:"shell_quote",category:"Strings",signature:"shell_quote(val: any): string",description:"Quotes string safely for POSIX shell command execution.",example:'escaped = shell_quote("arg with spaces");'},{name:"len",category:"Lists & Arrays",signature:"len(item: any): number",description:"Returns the length of a string, array, or number of object keys.",example:"n = len([10, 20, 30]);"},{name:"length",category:"Lists & Arrays",signature:"length(item: any): number",description:"Returns the length of a string, array, or object (alias for len).",example:"n = length([10, 20, 30]);"},{name:"push",category:"Lists & Arrays",signature:"push(arr: array, ...items: any): array",description:"Appends an element to the end of an array and returns the array.",example:'push(items, "new_item");'},{name:"pop",category:"Lists & Arrays",signature:"pop(arr: array): any",description:"Removes and returns the last element of an array.",example:"last = pop(items);"},{name:"shift",category:"Lists & Arrays",signature:"shift(arr: array): any",description:"Removes and returns the first element of an array.",example:"first = shift(items);"},{name:"unshift",category:"Lists & Arrays",signature:"unshift(arr: array, ...items: any): array",description:"Prepends an element to the beginning of an array.",example:'unshift(items, "header");'},{name:"insert",category:"Lists & Arrays",signature:"insert(arr: array, index: number, item: any): array",description:"Inserts an element at the specified index in an array.",example:'insert(items, 1, "inserted");'},{name:"remove_at",category:"Lists & Arrays",signature:"remove_at(arr: array, index: number): any",description:"Removes and returns the element at the specified index.",example:"removed = remove_at(items, 0);"},{name:"concat",category:"Lists & Arrays",signature:"concat(first: array, ...more: array): array",description:"Concatenates two or more arrays into a new array.",example:"all = concat(arr1, arr2);"},{name:"reverse",category:"Lists & Arrays",signature:"reverse(arr: array): array",description:"Reverses elements of an array in place.",example:"reverse(items);"},{name:"sort",category:"Lists & Arrays",signature:"sort(arr: array, [key: string]): array",description:"Sorts array elements numerically, alphabetically, or by object key.",example:'sorted = sort(users, "age");'},{name:"sorted",category:"Lists & Arrays",signature:"sorted(arr: array, [key: string]): array",description:"Sorts array elements numerically, alphabetically, or by object key (alias for sort).",example:'result = sorted(users, "age");'},{name:"unique",category:"Lists & Arrays",signature:"unique(arr: array): array",description:"Returns a new array with duplicate elements removed.",example:"deduped = unique([1, 2, 2, 3]);"},{name:"flatten",category:"Lists & Arrays",signature:"flatten(arr: array): array",description:"Flattens a nested array by one level.",example:"flat = flatten([[1, 2], [3, 4]]);"},{name:"first",category:"Lists & Arrays",signature:"first(arr: array): any",description:"Returns the first element of an array, or null if empty.",example:"top = first(items);"},{name:"last",category:"Lists & Arrays",signature:"last(arr: array): any",description:"Returns the last element of an array, or null if empty.",example:"tail = last(items);"},{name:"sum",category:"Lists & Arrays",signature:"sum(arr: array): number",description:"Computes the arithmetic sum of numeric elements in an array.",example:"total = sum([1, 2, 3, 4]);"},{name:"avg",category:"Lists & Arrays",signature:"avg(arr: array): number",description:"Computes the arithmetic mean of numeric elements in an array.",example:"mean = avg([10, 20, 30]);"},{name:"range",category:"Lists & Arrays",signature:"range(start: number, [end: number], [step: number = 1]): array",description:"Generates an array of numbers from start to end by step.",example:"nums = range(0, 5);"},{name:"keys",category:"Maps & Key-Value",signature:"keys(obj: object): array",description:"Returns an array of own property keys of an object.",example:"k = keys({ a: 1, b: 2 });"},{name:"values",category:"Maps & Key-Value",signature:"values(obj: object): array",description:"Returns an array of own property values of an object.",example:"v = values({ a: 1, b: 2 });"},{name:"entries",category:"Maps & Key-Value",signature:"entries(obj: object): array",description:"Returns an array of [key, value] pairs for an object.",example:"pairs = entries({ a: 1, b: 2 });"},{name:"from_entries",category:"Maps & Key-Value",signature:"from_entries(pairs: array): object",description:"Constructs an object from an array of [key, value] pairs.",example:'obj = from_entries([["name", "Bob"], ["age", 25]]);'},{name:"has_key",category:"Maps & Key-Value",signature:"has_key(obj: object, key: string): boolean",description:"Checks if an object has the specified own property key.",example:'if (has_key(config, "port")) { ... }'},{name:"get",category:"Maps & Key-Value",signature:"get(obj: any, path: string|array, [defaultVal: any]): any",description:"Retrieves a nested property safely using a dot or array path.",example:'val = get(config, "database.host", "localhost");'},{name:"set",category:"Maps & Key-Value",signature:"set(obj: object, path: string|array, value: any): object",description:"Sets a nested property on an object using a dot or array path.",example:'set(config, "server.port", 8080);'},{name:"delete_key",category:"Maps & Key-Value",signature:"delete_key(obj: object, key: string): object",description:"Deletes a key from an object.",example:'delete_key(data, "temp");'},{name:"merge",category:"Maps & Key-Value",signature:"merge(a: object, b: object): object",description:"Shallow merges two objects into a new object.",example:"combined = merge(defaults, overrides);"},{name:"clone",category:"Maps & Key-Value",signature:"clone(val: any): any",description:"Deep clones an object or array via JSON serialization.",example:"copy = clone(original);"},{name:"json_parse",category:"JSON & Data",signature:"json_parse(str: string): any",description:"Alias for json.",example:"data = json_parse(text);"},{name:"json_parse_safe",category:"JSON & Data",signature:"json_parse_safe(str: string, [fallback: any = null]): any",description:'Safely parses JSON with markdown fence and preamble tolerance, returning fallback on failure without throwing. Use a custom sentinel (e.g. "PARSE_FAILED") to distinguish parse failure from valid JSON null.',example:'data = json_parse_safe(llm_output, "PARSE_FAILED"); if (data == "PARSE_FAILED") { print("parse failed"); }'},{name:"json_stringify",category:"JSON & Data",signature:"json_stringify(val: any, [indent: number = 0]): string",description:"Serializes a value to compact JSON by default; optional indent formats the output.",example:"text = json_stringify(obj, 2);"},{name:"pluck",category:"JSON & Data",signature:"pluck(arr: array, key: string): array",description:"Extracts the specified key from each object in an array.",example:'names = pluck(users, "name");'},{name:"filter_by",category:"JSON & Data",signature:"filter_by(arr: array, key: string, value: any): array",description:"Filters an array of objects where item[key] == value.",example:'active = filter_by(users, "active", true);'},{name:"find_by",category:"JSON & Data",signature:"find_by(arr: array, key: string, value: any): any",description:"Finds the first object in an array where item[key] == value.",example:'user = find_by(users, "id", 42);'},{name:"num",category:"Math",signature:"num(val: any): number",description:"Converts a value to a numeric type.",example:'n = num("42.5");'},{name:"round",category:"Math",signature:"round(n: number): number",description:"Rounds a number to the nearest integer.",example:"r = round(3.7);"},{name:"floor",category:"Math",signature:"floor(n: number): number",description:"Returns the largest integer less than or equal to a number.",example:"f = floor(3.9);"},{name:"ceil",category:"Math",signature:"ceil(n: number): number",description:"Returns the smallest integer greater than or equal to a number.",example:"c = ceil(3.1);"},{name:"min",category:"Math",signature:"min(...nums: number|array): number",description:"Returns the minimum value from numbers or a number array.",example:"m = min(10, 5, 20);"},{name:"max",category:"Math",signature:"max(...nums: number|array): number",description:"Returns the maximum value from numbers or a number array.",example:"m = max([10, 5, 20]);"},{name:"abs",category:"Math",signature:"abs(n: number): number",description:"Returns the absolute value of a number.",example:"a = abs(-42);"},{name:"sqrt",category:"Math",signature:"sqrt(n: number): number",description:"Returns the square root of a number.",example:"s = sqrt(16);"},{name:"pow",category:"Math",signature:"pow(base: number, exp: number): number",description:"Calculates base raised to exponent.",example:"p = pow(2, 8);"},{name:"random",category:"Math",signature:"random(): number",description:"Returns a pseudo-random floating point number in [0, 1).",example:"r = random();"},{name:"system",category:"System & Process",signature:"system(command: string|array, [timeoutMs: number = 60000]): SystemResult",description:"Executes a shell command string or argv array directly with shell:false, returning a structured process execution record.",parameters:[{name:"command",type:"string|array",description:"Shell command string or argv array to execute"},{name:"timeoutMs",type:"number",description:"(optional) Execution timeout in milliseconds (default: 60000)"}],returns:{type:"SystemResult",description:"{ stdout: string, stderr: string, code: number|null, signal: string|null, timed_out: bool, duration_ms: number, pid: number|null }"},example:'res = system(["git", "log", "-n", "1"]); if (res.code == 0) { print(res.stdout); }'},{name:"prompt_human",category:"System & Process",signature:"prompt_human([question: string], [options: map]): string|null; prompt_human(session: map, [options: map]): map",description:"Pauses execution to prompt an operator on terminal stdin or dedicated directory, returning the entered input line or decision map, or null if stdin is closed/non-interactive.",example:'guidance = prompt_human("Enter instructions (or Enter to halt): "); if (guidance != null) { process(guidance); }'},{name:"prompt_human_config",category:"System & Process",signature:"prompt_human_config([config: map|string], [dir: string]): map",description:"Configures prompt_human mode ('interactive' or 'file' with dedicated directory, timeout_ms, poll_ms). Returns current configuration map.",example:'prompt_human_config({ dir: "/tmp/handoffs", timeout_ms: 60000 });'},{name:"error",category:"System & Process",signature:"error(value: any, ...args: any): string",description:"Formats and logs an error to stderr and records it for the execution error summary.",example:'error("Operation failed:", reason);'},{name:"exit",category:"System & Process",signature:"exit([code: number = 0]): never",description:"Terminates script execution immediately with exit code.",example:"exit(0);"},{name:"print",category:"System & Process",signature:"print(...args: any): string",description:"Formats values into an output-log entry rendered as a line by the CLI. Returns the formatted text without adding a newline.",example:'print("Result:", val);'},{name:"printf",category:"System & Process",signature:"printf(template: string, ...args: any): string",description:"Formats and prints %s, %d, %f and %% using the sprintf width and precision rules.",example:'printf("%s scored %d", "Alice", 95);'},{name:"println",category:"System & Process",signature:"println(...args: any): string",description:"Alias of print: both log formatted values rendered as a line by the CLI and return text without adding a newline.",example:'println("Done.");'},{name:"sleep_ms",category:"System & Process",signature:"sleep_ms(ms: number): void",description:"Pauses execution for specified milliseconds.",example:"sleep_ms(1000);"},{name:"now",category:"System & Process",signature:"now(): number",description:"Returns current epoch in milliseconds.",example:"t = now();"},{name:"timestamp",category:"System & Process",signature:"timestamp(): number",description:"Returns current Unix epoch in whole seconds.",example:"t = timestamp();"},{name:"date",category:"System & Process",signature:"date([epochMs: number]): string",description:"Returns an ISO 8601 date-time string for now or a supplied epoch-millisecond value.",example:"created = date(0);"},{name:"strftime",category:"System & Process",signature:"strftime(epochMs: number, fmt: string): string",description:"Takes epoch milliseconds first and format second, using local time. Supports %Y, %m, %d, %H, %M, %S and %% only; other tokens remain literal. Invalid dates or argument types are errors.",example:'s = strftime(clock(), "%Y-%m-%d");'},{name:"date_format",category:"System & Process",signature:"date_format(epochMs: number, fmt: string): string",description:"Alias for strftime: epoch milliseconds first, format second, using local time and the same supported tokens and validation.",example:'s = date_format(now(), "%Y-%m-%d");'},{name:"coalesce",category:"System & Process",signature:"coalesce(...values: any): any",description:"Returns the first non-null/non-undefined argument, else null (including no arguments).",example:'v = coalesce(a, b, "default");'},{name:"if_null",category:"System & Process",signature:"if_null(val: any, fallback: any): any",description:"Returns fallback if val is null/undefined, else val.",example:'v = if_null(maybe_null, "default");'},{name:"default_to",category:"System & Process",signature:"default_to(val: any, fallback: any): any",description:"Returns fallback if val is null/undefined, else val (alias for if_null).",example:'v = default_to(maybe_null, "default");'},{name:"if_else",category:"System & Process",signature:"if_else(cond: any, thenVal: any, elseVal: any): any",description:"Eager compatibility helper: returns thenVal if cond is truthy, else elseVal; all three arguments are evaluated. Use condition ? thenVal : elseVal for lazy selection.",example:'label = if_else(count > 0, "some", "none");'},{name:"str",category:"System & Process",signature:"str(val: any): string",description:"Converts lists and plain maps to compact JSON using the f-string collection rule; scalars retain normal text. Cyclic or lossy collections are errors. Does not change + coercion.",example:"s = str(123);"},{name:"to_string",category:"System & Process",signature:"to_string(val: any): string",description:"Alias for str; lists and plain maps become compact JSON, while scalar text and + coercion stay unchanged.",example:"s = to_string(123);"},{name:"is_array",category:"System & Process",signature:"is_array(val: any): boolean",description:"Checks if a value is an array (type-check alias over type()).",example:"if (is_array(val)) { ... }"},{name:"is_string",category:"System & Process",signature:"is_string(val: any): boolean",description:"Checks if a value is a string (type-check alias over type()).",example:"if (is_string(val)) { ... }"},{name:"is_number",category:"System & Process",signature:"is_number(val: any): boolean",description:"Checks if a value is a number (type-check alias over type()).",example:"if (is_number(val)) { ... }"},{name:"is_map",category:"System & Process",signature:"is_map(val: any): boolean",description:"Checks if a value is a map/object (type-check alias over type()).",example:"if (is_map(val)) { ... }"},{name:"is_function",category:"System & Process",signature:"is_function(val: any): boolean",description:"Checks if a value is a first-class function reference (type-check alias over type()).",example:"if (is_function(val)) { ... }"},{name:"type",category:"System & Process",signature:"type(val: any): string",description:"Returns the runtime type of a value ('string', 'number', 'boolean', 'array', 'object', 'null', 'function').",example:"t = type(data);"},{name:"assert",category:"System & Process",signature:"assert(condition: any, [message: string]): boolean",description:"Throws an error if condition is falsy.",example:'assert(len(items) > 0, "Items list must not be empty");'},{name:"http_get",category:"System & Process",signature:"http_get(url: string): string",description:"Performs HTTP(S) GET request and returns response body string.",example:'html = http_get("https://example.com");'}],yw=[{name:"is_blank",category:"Strings",signature:"is_blank(s: any): boolean",description:"Returns true if string is null, empty, or whitespace only.",example:'if (is_blank(user_input)) { println("input required"); }'},{name:"chunk",category:"Lists & Arrays",signature:"chunk(arr: array, size: number): array",description:"Splits an array into chunks of specified size.",example:"batches = chunk(items, 10);"},{name:"compact",category:"Lists & Arrays",signature:"compact(arr: array): array",description:"Returns a new array with all null elements removed.",example:"valid = compact([1, null, 2, null, 3]);"},{name:"zip",category:"Lists & Arrays",signature:"zip(arr1: array, arr2: array): array",description:"Combines two arrays into an array of pairs [[a1, b1], [a2, b2], ...].",example:'pairs = zip(["a", "b"], [1, 2]);'},{name:"take",category:"Lists & Arrays",signature:"take(arr: array, n: number): array",description:"Returns the first n elements of an array.",example:"first_three = take(items, 3);"},{name:"drop",category:"Lists & Arrays",signature:"drop(arr: array, n: number): array",description:"Returns a new array with the first n elements omitted.",example:"rest = drop(items, 3);"},{name:"clamp",category:"Math",signature:"clamp(val: number, low: number, high: number): number",description:"Restricts a numeric value to lie within [low, high] bounds.",example:"bounded = clamp(score, 0, 100);"}];Xt=class t{hostFunctions=new Map;functionDocs=new Map;registeredModules=new Map;functionOriginModule=new Map;currentRegisteringModule="core";outputLogs=[];isAsyncMode=!1;promptHumanConfig={mode:"interactive"};hostCatalog=new Map;builtinProviders=new Map;hostResolver;constructor(e={}){this.hostResolver=e.resolveHostModule,this.registeredModules.set("core",{name:"core",description:"LMScript core language built-ins and standard library"}),this.registerPredefinedFunctions();for(let[n,r]of[["get_property",{min:1,max:2}],["has_property",1],["get_properties",{min:0,max:1}],["set_property",2]])this.registerFunction(n,()=>{throw Error("Property store is not running")},r,"Read or overlay hierarchical run-local properties; no persistence");this.registerFunction("expand",()=>{throw Error("Template resolver is not running")},{min:1,max:2},"Expand simple references from explicit vars, PROPS paths and invocation ARGV; inserted text is opaque"),this.registerDefaultDocs();for(let[n,r,s]of[["get_property","get_property(key, [default])","Returns a copied property value; absent keys are errors unless a default is supplied."],["has_property","has_property(key)","Tests property presence; missing/invalid profile errors remain loud."],["get_properties","get_properties([prefix])","Returns a detached nested property table copy."],["set_property","set_property(key, value)","Returns the previous value and changes only the run-local overlay; invocation facts are read-only."]])this.functionDocs.set(n,{name:n,signature:r,description:s,module:"core",category:"Properties"});this.functionDocs.set("expand",{name:"expand",signature:"expand(text, [vars])",description:"Resolve ${name} from an explicit vars map, ${PROPS.path}, and ${ARGV[n]}; $${ escapes, no caller-local capture or recursive expansion.",module:"core",category:"Strings"})}registerDefaultDocs(){for(let e of hw)this.functionDocs.set(e.name,{...e,module:e.module??"core"});for(let e of _w)this.functionDocs.set(e.name,{...e,module:e.module??"core"});for(let e of yw)this.functionDocs.set(e.name,{...e,module:e.module??"core"})}registerFunctionDoc(e){return this.functionDocs.set(e.name,{...e,module:e.module??this.currentRegisteringModule}),this}registerModule(e,n){if(this.registeredModules.has(e.name))throw new Error(`Module '${e.name}' is already registered`);this.registeredModules.set(e.name,e);let r=this.currentRegisteringModule;this.currentRegisteringModule=e.name;try{if(e.docs)for(let s of e.docs)this.registerFunctionDoc({...s,module:s.module??e.name});typeof e.register=="function"&&e.register(this,n)}finally{this.currentRegisteringModule=r}return this}getModules(){return Array.from(this.registeredModules.values())}getModule(e){return this.registeredModules.get(e)}getFunctionsByModule(e){return Array.from(this.functionDocs.values()).filter(n=>(n.module??"core").toLowerCase()===e.toLowerCase())}getFunctionDocs(){return Array.from(this.functionDocs.values())}getFunctionDoc(e){return this.functionDocs.get(e)}getFunctionCategories(){let e=new Set;for(let n of this.functionDocs.values())e.add(n.category);return Array.from(e)}getFunctionsByCategory(e){return Array.from(this.functionDocs.values()).filter(n=>n.category.toLowerCase()===e.toLowerCase())}registerPredefinedFunctions(){this.registerFunction("read_file",e=>$.readFileSync(e,"utf-8"),1,"Reads entire file as UTF-8 string"),this.registerFunction("read",e=>$.readFileSync(e,"utf-8"),1,"Reads entire file as UTF-8 string"),this.registerFunction("read_lines",e=>{let n=$.readFileSync(e,"utf-8"),r=n.length>0;return n.endsWith(`\r
411
411
  `)?n=n.slice(0,-2):n.endsWith(`
412
412
  `)&&(n=n.slice(0,-1)),r?n.length===0?[""]:n.split(/\r?\n/):[]},1,"Reads file as an array of string lines"),this.registerFunction("write_lines",(e,n)=>{if(!Array.isArray(n))throw new Error("write_lines: second argument must be an array of lines");let r=n.length===0?"":n.map(String).join(`
413
413
  `)+`
414
- `;return $.writeFileSync(e,r,"utf-8"),!0},2,"Writes an array of lines to a file with trailing newline"),this.registerFunction("glob",e=>{try{return Array.from($.globSync(e))}catch{return[]}},1,"Finds files matching a glob pattern and returns an array of matching paths"),this.registerFunction("list_dir",e=>{try{return $.readdirSync(le.resolve(String(e)))}catch{return[]}},1,"Lists filenames in a directory"),this.registerFunction("write_file",(e,n)=>($.writeFileSync(e,String(n),"utf-8"),!0),2,"Writes string content to file"),this.registerFunction("write",(e,n)=>($.writeFileSync(e,String(n),"utf-8"),!0),2,"Writes string content to file"),this.registerFunction("write_file_exclusive",(e,n)=>($.writeFileSync(e,String(n),{encoding:"utf8",flag:"wx"}),!0),2,"Creates a new file; refuses to overwrite an existing path"),this.registerFunction("append_file",(e,n)=>($.appendFileSync(e,String(n),"utf-8"),!0),2,"Appends string content to file"),this.registerFunction("read_json",e=>{let n=$.readFileSync(e,"utf-8");return JSON.parse(n)},1,"Reads file and parses JSON content"),this.registerFunction("write_json",(e,n,r=2)=>($.writeFileSync(e,JSON.stringify(n,null,r),"utf-8"),!0),{min:2,max:3},"Serializes data and writes formatted JSON to file"),this.registerFunction("read_csv",(e,n=!0,r=",")=>{let s=$.readFileSync(e,"utf-8");return ku(s,n,r)},{min:1,max:3},"Reads CSV file and parses into array of objects or rows. Typed cells: a trimmed -?digits or -?digits.digits cell becomes a number (007 becomes 7), true/false/null in any case become those values; other cells stay text; a missing trailing column is null."),this.registerFunction("write_csv",(e,n,r=",")=>($.writeFileSync(e,Iu(n,r),"utf-8"),!0),{min:2,max:3},"Writes array of objects or rows to CSV file"),this.registerFunction("csv_parse",ku,{min:1,max:3},"Parses inline CSV text into records or rows. Typed cells: a trimmed -?digits or -?digits.digits cell becomes a number (007 becomes 7), true/false/null in any case become those values; other cells stay text; a missing trailing column is null."),this.registerFunction("csv_stringify",Iu,{min:1,max:2},"Serializes records or rows to CSV text");for(let e of["read","read_file","read_lines","read_json","read_csv","glob","list_dir"])this.hostFunctions.get(e).readsFile=!0;this.registerFunction("temp_file",()=>{let e=le.resolve(zv(),`lmscript-${Kv()}`),n=$.openSync(e,"wx",384);return $.closeSync(n),e},0,"Creates an empty temporary file and returns its absolute path; caller deletes it"),this.registerFunction("file_exists",e=>$.existsSync(e),1,"Checks if file exists"),this.registerFunction("exit",(e=0)=>{let n=Number(e);throw new mt(Number.isFinite(n)&&n>=0&&n<=255?Math.floor(n):1)},{min:0,max:1},"Terminates script execution with an optional exit code (default: 0)"),this.registerFunction("delete_file",e=>$.existsSync(e)?($.unlinkSync(e),!0):!1,1,"Deletes file if it exists"),this.registerFunction("remove_file",e=>$.existsSync(e)?($.unlinkSync(e),!0):!1,1,"Deletes file if it exists"),this.registerFunction("mkdir",(e,n=!0)=>($.mkdirSync(e,{recursive:!!n}),!0),{min:1,max:2},"Creates a directory (recursive by default)"),this.registerFunction("rmdir",(e,n=!1)=>$.existsSync(e)?(n?$.rmSync(e,{recursive:!0,force:!0}):$.rmdirSync(e),!0):!1,{min:1,max:2},"Removes a directory; pass true for recursive removal of a non-empty directory"),this.registerFunction("copy_file",(e,n)=>($.copyFileSync(e,n),!0),2,"Copies a file to a new path"),this.registerFunction("move_file",(e,n)=>($.renameSync(e,n),!0),2,"Moves/renames a file"),this.registerFunction("basename",(e,n)=>le.basename(e,n),{min:1,max:2},"Returns the last path segment, optionally stripping a trailing extension"),this.registerFunction("dirname",e=>le.dirname(e),1,"Returns the directory portion of a path"),this.registerFunction("path_join",(...e)=>le.join(...e),{min:0},"Joins path segments using the OS-native separator"),this.registerFunction("abs_path",e=>le.resolve(e),1,"Resolves a path to an absolute path"),this.registerFunction("env",(e,n=null)=>process.env[e]!==void 0?process.env[e]:n,{min:1,max:2},"Reads an environment variable, or a fallback if unset"),this.registerFunction("getenv",(e,n=null)=>process.env[e]!==void 0?process.env[e]:n,{min:1,max:2},"Reads an environment variable, or a fallback if unset (alias for env)"),this.registerFunction("set_env",(e,n)=>(process.env[e]=String(n),!0),2,"Sets an environment variable for this process and its children"),this.registerFunction("list",(...e)=>e,{min:0},"Creates a new list/array"),this.registerFunction("array",(...e)=>e,{min:0},"Creates a new list/array"),this.registerFunction("push",(e,...n)=>(e.push(...n),e),{min:1},"Pushes item(s) to end of array and returns the same array",!0,!0),this.registerFunction("pop",e=>e.pop(),1,"Pops item from end of array",!0,!0),this.registerFunction("shift",e=>e.shift(),1,"Removes and returns first element",!0,!0),this.registerFunction("unshift",(e,...n)=>(e.unshift(...n),e),{min:1},"Adds item(s) to front of array and returns the same array",!0,!0),this.registerFunction("insert",(e,n,r)=>{let s=n<0?e.length+n:n;return e.splice(s,0,r),e},3,"Inserts item at index and returns the same array",!0,!0),this.registerFunction("remove_at",(e,n)=>{let r=n<0?e.length+n:n,s=e.splice(r,1);return s.length>0?s[0]:null},2,"Removes element at index",!0,!0),this.registerFunction("concat",(e,...n)=>e.concat(...n),{min:1},"Concatenates arrays"),this.registerFunction("reverse",e=>Array.isArray(e)?[...e].reverse():e,1,"Returns reversed array"),this.registerFunction("sort",(e,n)=>{if(!Array.isArray(e))return e;let r=[...e];return n?r.sort((s,i)=>{let o=s?s[n]:void 0,a=i?i[n]:void 0;return o<a?-1:o>a?1:0}):r.sort((s,i)=>typeof s=="number"&&typeof i=="number"?s-i:String(s).localeCompare(String(i)))},{min:1,max:2},"Sorts array numerically, alphabetically, or by object key"),this.registerFunction("sorted",(e,n)=>this.hostFunctions.get("sort").fn(e,n),{min:1,max:2},"Sorts array numerically, alphabetically, or by object key (alias for sort)"),this.registerFunction("unique",e=>Array.isArray(e)?Array.from(new Set(e)):[],1,"Removes duplicate elements"),this.registerFunction("flatten",e=>Array.isArray(e)?e.flat():[],1,"Flattens array one level"),this.registerFunction("first",e=>Array.isArray(e)&&e.length>0?e[0]:null,1,"Returns first element"),this.registerFunction("last",e=>Array.isArray(e)&&e.length>0?e[e.length-1]:null,1,"Returns last element"),this.registerFunction("sum",e=>Array.isArray(e)?e.reduce((n,r)=>n+(typeof r=="number"?r:Number(r)||0),0):0,1,"Calculates sum of array"),this.registerFunction("avg",e=>!Array.isArray(e)||e.length===0?0:e.reduce((r,s)=>r+(typeof s=="number"?s:Number(s)||0),0)/e.length,1,"Calculates average of array"),this.registerFunction("map",()=>({}),0,"Creates a new empty map/hash"),this.registerFunction("hash",()=>({}),0,"Creates a new empty map/hash"),this.registerFunction("from_entries",e=>Array.isArray(e)?Object.fromEntries(e):{},1,"Creates map from [key, value] pairs"),this.registerFunction("clear",e=>{if(Array.isArray(e))return e.length=0,e;if(e&&typeof e=="object"){for(let n of Object.keys(e))delete e[n];return e}return e},1,"Clears array or map",!0,!0),this.registerFunction("size",e=>Array.isArray(e)||typeof e=="string"?e.length:e&&typeof e=="object"?Object.keys(e).length:0,1,"Returns number of elements in array, string, or map"),this.registerFunction("system",(e,n=6e4)=>{if(!Number.isSafeInteger(n)||n<0)throw new Error("system() timeout must be a non-negative safe integer in milliseconds");return this.isAsyncMode?Fu(e,n):Du(e,n)},{min:1,max:2},"Executes shell command or argv array directly with shell:false and optional timeoutMs (default 60000), returning {stdout, stderr, code, signal, timed_out, duration_ms, pid}",!0),this.registerFunction("run_script",(e,n=[])=>{let r=le.resolve(String(e));if(!$.existsSync(r))throw new Error(`run_script: file not found: '${r}'`);let s=$.readFileSync(r,"utf-8"),i=Array.isArray(n)?n.map(String):[],o=new t;for(let[a,l]of this.hostFunctions)o.hasFunction(a)?l.isDefault||o.registerFunction(a,l.fn,l.arity,{description:l.description,params:l.params,doc:l.doc,allowOverwrite:!0,isContainerMutation:l.isContainerMutation},!1,l.isContainerMutation):o.registerFunction(a,l.fn,l.arity,{description:l.description,params:l.params,doc:l.doc,isDefault:l.isDefault,isContainerMutation:l.isContainerMutation});if(o.setGlobal("args",[...i]),o.setGlobal("ARGV",[...i]),this.isAsyncMode)return(async()=>{let a=await o.runAsync(s,{file:r}),l=a.output.join(`
414
+ `;return $.writeFileSync(e,r,"utf-8"),!0},2,"Writes an array of lines to a file with trailing newline"),this.registerFunction("glob",e=>{try{return Array.from($.globSync(e))}catch{return[]}},1,"Finds files matching a glob pattern and returns an array of matching paths"),this.registerFunction("list_dir",e=>{try{return $.readdirSync(le.resolve(String(e)))}catch{return[]}},1,"Lists filenames in a directory"),this.registerFunction("write_file",(e,n)=>($.writeFileSync(e,String(n),"utf-8"),!0),2,"Writes string content to file"),this.registerFunction("write",(e,n)=>($.writeFileSync(e,String(n),"utf-8"),!0),2,"Writes string content to file"),this.registerFunction("write_file_exclusive",(e,n)=>($.writeFileSync(e,String(n),{encoding:"utf8",flag:"wx"}),!0),2,"Creates a new file; refuses to overwrite an existing path"),this.registerFunction("append_file",(e,n)=>($.appendFileSync(e,String(n),"utf-8"),!0),2,"Appends string content to file"),this.registerFunction("read_json",e=>{let n=$.readFileSync(e,"utf-8");return JSON.parse(n)},1,"Reads file and parses JSON content"),this.registerFunction("write_json",(e,n,r=2)=>($.writeFileSync(e,JSON.stringify(n,null,r),"utf-8"),!0),{min:2,max:3},"Serializes data and writes formatted JSON to file"),this.registerFunction("read_csv",(e,n=!0,r=",")=>{let s=$.readFileSync(e,"utf-8");return Au(s,n,r)},{min:1,max:3},"Reads CSV file and parses into array of objects or rows. Typed cells: a trimmed -?digits or -?digits.digits cell becomes a number (007 becomes 7), true/false/null in any case become those values; other cells stay text; a missing trailing column is null."),this.registerFunction("write_csv",(e,n,r=",")=>($.writeFileSync(e,Nu(n,r),"utf-8"),!0),{min:2,max:3},"Writes array of objects or rows to CSV file"),this.registerFunction("csv_parse",Au,{min:1,max:3},"Parses inline CSV text into records or rows. Typed cells: a trimmed -?digits or -?digits.digits cell becomes a number (007 becomes 7), true/false/null in any case become those values; other cells stay text; a missing trailing column is null."),this.registerFunction("csv_stringify",Nu,{min:1,max:2},"Serializes records or rows to CSV text");for(let e of["read","read_file","read_lines","read_json","read_csv","glob","list_dir"])this.hostFunctions.get(e).readsFile=!0;this.registerFunction("temp_file",()=>{let e=le.resolve(tw(),`lmscript-${Zv()}`),n=$.openSync(e,"wx",384);return $.closeSync(n),e},0,"Creates an empty temporary file and returns its absolute path; caller deletes it"),this.registerFunction("file_exists",e=>$.existsSync(e),1,"Checks if file exists"),this.registerFunction("exit",(e=0)=>{let n=Number(e);throw new pt(Number.isFinite(n)&&n>=0&&n<=255?Math.floor(n):1)},{min:0,max:1},"Terminates script execution with an optional exit code (default: 0)"),this.registerFunction("delete_file",e=>$.existsSync(e)?($.unlinkSync(e),!0):!1,1,"Deletes file if it exists"),this.registerFunction("remove_file",e=>$.existsSync(e)?($.unlinkSync(e),!0):!1,1,"Deletes file if it exists"),this.registerFunction("mkdir",(e,n=!0)=>($.mkdirSync(e,{recursive:!!n}),!0),{min:1,max:2},"Creates a directory (recursive by default)"),this.registerFunction("rmdir",(e,n=!1)=>$.existsSync(e)?(n?$.rmSync(e,{recursive:!0,force:!0}):$.rmdirSync(e),!0):!1,{min:1,max:2},"Removes a directory; pass true for recursive removal of a non-empty directory"),this.registerFunction("copy_file",(e,n)=>($.copyFileSync(e,n),!0),2,"Copies a file to a new path"),this.registerFunction("move_file",(e,n)=>($.renameSync(e,n),!0),2,"Moves/renames a file"),this.registerFunction("basename",(e,n)=>le.basename(e,n),{min:1,max:2},"Returns the last path segment, optionally stripping a trailing extension"),this.registerFunction("dirname",e=>le.dirname(e),1,"Returns the directory portion of a path"),this.registerFunction("path_join",(...e)=>le.join(...e),{min:0},"Joins path segments using the OS-native separator"),this.registerFunction("abs_path",e=>le.resolve(e),1,"Resolves a path to an absolute path"),this.registerFunction("env",(e,n=null)=>process.env[e]!==void 0?process.env[e]:n,{min:1,max:2},"Reads an environment variable, or a fallback if unset"),this.registerFunction("getenv",(e,n=null)=>process.env[e]!==void 0?process.env[e]:n,{min:1,max:2},"Reads an environment variable, or a fallback if unset (alias for env)"),this.registerFunction("set_env",(e,n)=>(process.env[e]=String(n),!0),2,"Sets an environment variable for this process and its children"),this.registerFunction("list",(...e)=>e,{min:0},"Creates a new list/array"),this.registerFunction("array",(...e)=>e,{min:0},"Creates a new list/array"),this.registerFunction("push",(e,...n)=>(e.push(...n),e),{min:1},"Pushes item(s) to end of array and returns the same array",!0,!0),this.registerFunction("pop",e=>e.pop(),1,"Pops item from end of array",!0,!0),this.registerFunction("shift",e=>e.shift(),1,"Removes and returns first element",!0,!0),this.registerFunction("unshift",(e,...n)=>(e.unshift(...n),e),{min:1},"Adds item(s) to front of array and returns the same array",!0,!0),this.registerFunction("insert",(e,n,r)=>{let s=n<0?e.length+n:n;return e.splice(s,0,r),e},3,"Inserts item at index and returns the same array",!0,!0),this.registerFunction("remove_at",(e,n)=>{let r=n<0?e.length+n:n,s=e.splice(r,1);return s.length>0?s[0]:null},2,"Removes element at index",!0,!0),this.registerFunction("concat",(e,...n)=>e.concat(...n),{min:1},"Concatenates arrays"),this.registerFunction("reverse",e=>Array.isArray(e)?[...e].reverse():e,1,"Returns reversed array"),this.registerFunction("sort",(e,n)=>{if(!Array.isArray(e))return e;let r=[...e];return n?r.sort((s,i)=>{let o=s?s[n]:void 0,a=i?i[n]:void 0;return o<a?-1:o>a?1:0}):r.sort((s,i)=>typeof s=="number"&&typeof i=="number"?s-i:String(s).localeCompare(String(i)))},{min:1,max:2},"Sorts array numerically, alphabetically, or by object key"),this.registerFunction("sorted",(e,n)=>this.hostFunctions.get("sort").fn(e,n),{min:1,max:2},"Sorts array numerically, alphabetically, or by object key (alias for sort)"),this.registerFunction("unique",e=>Array.isArray(e)?Array.from(new Set(e)):[],1,"Removes duplicate elements"),this.registerFunction("flatten",e=>Array.isArray(e)?e.flat():[],1,"Flattens array one level"),this.registerFunction("first",e=>Array.isArray(e)&&e.length>0?e[0]:null,1,"Returns first element"),this.registerFunction("last",e=>Array.isArray(e)&&e.length>0?e[e.length-1]:null,1,"Returns last element"),this.registerFunction("sum",e=>Array.isArray(e)?e.reduce((n,r)=>n+(typeof r=="number"?r:Number(r)||0),0):0,1,"Calculates sum of array"),this.registerFunction("avg",e=>!Array.isArray(e)||e.length===0?0:e.reduce((r,s)=>r+(typeof s=="number"?s:Number(s)||0),0)/e.length,1,"Calculates average of array"),this.registerFunction("map",()=>({}),0,"Creates a new empty map/hash"),this.registerFunction("hash",()=>({}),0,"Creates a new empty map/hash"),this.registerFunction("from_entries",e=>Array.isArray(e)?Object.fromEntries(e):{},1,"Creates map from [key, value] pairs"),this.registerFunction("clear",e=>{if(Array.isArray(e))return e.length=0,e;if(e&&typeof e=="object"){for(let n of Object.keys(e))delete e[n];return e}return e},1,"Clears array or map",!0,!0),this.registerFunction("size",e=>Array.isArray(e)||typeof e=="string"?e.length:e&&typeof e=="object"?Object.keys(e).length:0,1,"Returns number of elements in array, string, or map"),this.registerFunction("system",(e,n=6e4)=>{if(!Number.isSafeInteger(n)||n<0)throw new Error("system() timeout must be a non-negative safe integer in milliseconds");return this.isAsyncMode?Bu(e,n):Hu(e,n)},{min:1,max:2},"Executes shell command or argv array directly with shell:false and optional timeoutMs (default 60000), returning {stdout, stderr, code, signal, timed_out, duration_ms, pid}",!0),this.registerFunction("run_script",(e,n=[])=>{let r=le.resolve(String(e));if(!$.existsSync(r))throw new Error(`run_script: file not found: '${r}'`);let s=$.readFileSync(r,"utf-8"),i=Array.isArray(n)?n.map(String):[],o=new t;for(let[a,l]of this.hostFunctions)o.hasFunction(a)?l.isDefault||o.registerFunction(a,l.fn,l.arity,{description:l.description,params:l.params,doc:l.doc,allowOverwrite:!0,isContainerMutation:l.isContainerMutation},!1,l.isContainerMutation):o.registerFunction(a,l.fn,l.arity,{description:l.description,params:l.params,doc:l.doc,isDefault:l.isDefault,isContainerMutation:l.isContainerMutation});if(o.setGlobal("args",[...i]),o.setGlobal("ARGV",[...i]),this.isAsyncMode)return(async()=>{let a=await o.runAsync(s,{file:r}),l=a.output.join(`
415
415
  `)+(a.output.length>0?`
416
416
  `:""),c=a.exitCode!==void 0?a.exitCode:a.success?0:1,d={success:a.success&&c===0,stdout:l,output:[...a.output],value:a.value,exit_code:c,code:c,errors:a.errors??[]};return d.toString=()=>l,d})();{let a=o.run(s,{file:r}),l=a.output.join(`
417
417
  `)+(a.output.length>0?`
418
418
  `:""),c=a.exitCode!==void 0?a.exitCode:a.success?0:1,d={success:a.success&&c===0,stdout:l,output:[...a.output],value:a.value,exit_code:c,code:c,errors:a.errors??[]};return d.toString=()=>l,d}},{min:1,max:2},"Executes another LMScript file in-process and returns execution result with .stdout, .output, .success, .exit_code",!0),this.registerFunction("error",(...e)=>{let n=e.map(r=>typeof r=="object"?JSON.stringify(r):String(r)).join(" ");return typeof process<"u"&&process.stderr?process.stderr.write(`error: ${n}
419
- `):console.error(`error: ${n}`),n},{min:1},"Formats and logs an error to stderr and records it for the execution error summary",!0),this.registerFunction("http_get",e=>Mu(e),1,"Downloads UTF-8 text from a public HTTP(S) URL",!0),this.registerFunction("sleep_ms",e=>{if(typeof e!="number"||!Number.isFinite(e)||e<0)throw new Error("sleep_ms() duration must be a non-negative finite number");if(e>2147483647)throw new Error("sleep_ms() duration exceeds maximum supported timeout (2147483647 ms)");let n=Date.now()+e;for(;Date.now()<n;);return null},1,"Sleeps for the specified milliseconds",!0),this.registerFunction("prompt_human_config",(e,n)=>{if(e===void 0)return{mode:this.promptHumanConfig.mode??"interactive",dir:this.promptHumanConfig.dir??null,timeout_ms:this.promptHumanConfig.timeoutMs??null,poll_interval_ms:this.promptHumanConfig.pollIntervalMs??200};if(typeof e=="string")e==="interactive"?this.promptHumanConfig.mode="interactive":e==="file"?(this.promptHumanConfig.mode="file",n&&(this.promptHumanConfig.dir=String(n))):(this.promptHumanConfig.mode="file",this.promptHumanConfig.dir=e);else if(e&&typeof e=="object"){let r=e.mode?String(e.mode):e.dir?"file":this.promptHumanConfig.mode??"interactive",s=e.dir!==void 0?String(e.dir):this.promptHumanConfig.dir,i=e.timeout_ms!==void 0?Number(e.timeout_ms):e.timeoutMs!==void 0?Number(e.timeoutMs):this.promptHumanConfig.timeoutMs,o=e.poll_ms!==void 0?Number(e.poll_ms):e.pollIntervalMs!==void 0?Number(e.pollIntervalMs):this.promptHumanConfig.pollIntervalMs;this.promptHumanConfig.mode=r==="file"?"file":"interactive",this.promptHumanConfig.dir=s,this.promptHumanConfig.timeoutMs=typeof i=="number"&&Number.isFinite(i)?i:void 0,this.promptHumanConfig.pollIntervalMs=typeof o=="number"&&Number.isFinite(o)&&o>0?o:200}return{mode:this.promptHumanConfig.mode,dir:this.promptHumanConfig.dir??null,timeout_ms:this.promptHumanConfig.timeoutMs??null,poll_interval_ms:this.promptHumanConfig.pollIntervalMs??200}},{min:0,max:2},"Configures prompt_human mode ('interactive' or 'file' with dedicated directory, timeout_ms, poll_ms)",!0),this.registerFunction("prompt_human",(e,n)=>{if((n?.mode??(n?.dir?"file":this.promptHumanConfig.mode??"interactive"))==="file"){let s=n?.dir??this.promptHumanConfig.dir;if(!s)throw new Error("prompt_human: file mode requires a directory (configure via prompt_human_config({ dir }) or pass { dir })");if(!this.isAsyncMode)throw new Error("prompt_human: file mode requires asynchronous execution (runAsync)");return ju(e,{dir:s,sessionId:n?.sessionId??n?.sessionid??n?.id,timeoutMs:n?.timeout_ms??n?.timeoutMs??this.promptHumanConfig.timeoutMs,pollIntervalMs:n?.poll_ms??n?.pollIntervalMs??this.promptHumanConfig.pollIntervalMs})}return this.isAsyncMode?Gs(e):$u(e)},{min:0,max:2},"Prompts operator on stdin/terminal or dedicated directory, returning input string or null if closed/non-interactive",!0),this.registerFunction("json_parse",e=>{try{return JSON.parse(String(e))}catch(n){throw new Error(`JSON parse error: ${n.message}`)}},1,"Parses JSON string into object/array"),this.registerFunction("json_parse_safe",(e,n=null)=>Zv(e,n),{min:1,max:2},"Safely parses JSON string with preamble/fence recovery, returning fallback (default null) on failure without throwing",!0),this.registerFunction("json_stringify",(e,n)=>JSON.stringify(e,null,n),{min:1,max:2},"Serializes value into JSON string"),this.registerFunction("keys",e=>e&&typeof e=="object"?Object.keys(e):[],1,"Returns array of object keys"),this.registerFunction("values",e=>e&&typeof e=="object"?Object.values(yr(e)):[],1,"Returns array of object values"),this.registerFunction("entries",e=>e&&typeof e=="object"?Object.entries(yr(e)):[],1,"Returns array of [key, value] pairs"),this.registerFunction("has_key",(e,n)=>e&&typeof e=="object"?Object.hasOwn(e,n):!1,2,"Checks if object has key"),this.registerFunction("items",e=>e&&typeof e=="object"?Object.entries(yr(e)):[],1,"Returns array of [key, value] pairs (alias for entries)"),this.registerFunction("get",(e,n,r=null)=>{let s=_r(e,n);return s!==void 0?s:r},{min:2,max:3},"Safely extracts nested property by path (e.g. 'user.address.city')"),this.registerFunction("getstr",(e,n,r="")=>{let s=_r(e,n);return s==null?r:String(s)},{min:2,max:3},'Reads a string field from a map/request form; fallback (default "") when missing or null (never the string "null"). A distinguishable non-"" fallback (e.g. "?") tells "missing" apart from a real empty string.'),this.registerFunction("getnum",(e,n,r=0)=>{let s=_r(e,n);return s==null?r:Number(s)},{min:2,max:3},"Reads a numeric field from a map/request form; fallback (default 0) when missing or null"),this.registerFunction("getbool",(e,n,r=!1)=>{let s=_r(e,n);if(s==null)return r;if(typeof s=="boolean")return s;if(typeof s=="string"){let i=s.trim().toLowerCase();if(i==="true")return!0;if(i==="false")return!1}return!!s},{min:2,max:3},'Reads a boolean field from a map/request form ("true"/"false" strings included); fallback (default false) when missing or null'),this.registerFunction("getlist",(e,n,r=[])=>{let s=_r(e,n);return Array.isArray(s)?s:r},{min:2,max:3},"Reads an array field from a map/request form; fallback (default []) when missing, null, or not actually an array"),this.registerFunction("require",Lu,2,"Requires a present value; injected diagnostic/captured error and exit 2 on missing",!0),this.registerFunction("set",(e,n,r)=>{if(e==null||typeof e!="object")return e;let s=Array.isArray(n)?n:String(n).replace(/\[(\w+)\]/g,".$1").split(".").filter(Boolean),i=e;for(let o=0;o<s.length-1;o++){let a=s[o];(De(i,a)==null||typeof De(i,a)!="object")&&Be(i,a,{}),i=De(i,a)}return s.length>0&&Be(i,s[s.length-1],r),e},3,"Sets nested property by path",!0,!0),this.registerFunction("pluck",(e,n)=>Array.isArray(e)?e.map(r=>De(r,n)):[],2,"Extracts key from array of objects"),this.registerFunction("filter_by",(e,n,r)=>Array.isArray(e)?e.filter(s=>s!=null&&De(s,n)===r):[],3,"Filters array of objects where item[key] == value"),this.registerFunction("find_by",(e,n,r)=>{if(!Array.isArray(e))return null;let s=e.find(i=>i!=null&&De(i,n)===r);return s!==void 0?s:null},3,"Finds first object in array where item[key] == value"),this.registerFunction("merge",(e,n)=>({...yr(e),...yr(n)}),2,"Shallow merges two objects"),this.registerFunction("clone",e=>e==null||typeof e!="object"?e:JSON.parse(JSON.stringify(e)),1,"Deep clones an object or array"),this.registerFunction("delete_key",(e,n)=>(e&&typeof e=="object"&&delete e[n],e),2,"Deletes key from object",!0,!0),this.registerFunction("print",(...e)=>{let n=e.map(r=>typeof r=="object"?JSON.stringify(r):String(r)).join(" ");return this.outputLogs.push(n),n},{min:0},"Prints formatted values to output log",!0),this.registerFunction("println",(...e)=>{let n=e.map(r=>typeof r=="object"?JSON.stringify(r):String(r)).join(" ");return this.outputLogs.push(n),n},{min:0},"Prints line to output log",!0),this.registerFunction("split",(e,n)=>String(e).split(n),2,"Splits string by required delimiter; use explicit empty delimiter for characters"),this.registerFunction("lines",e=>String(e).split(/\r?\n/),1,"Splits string into array of lines"),this.registerFunction("last_line_as_status",e=>{if(typeof e!="string")return null;let n=e.split(/\r?\n/);for(let r=n.length-1;r>=0;r--){let s=n[r].trim();if(s.length>0)return s==="DONE"||s==="NOTHING_TO_DO"||s==="BLOCKED"||s==="OTHER"?s:null}return null},1,"Returns the last non-blank line of a string if it is a valid state word (DONE, NOTHING_TO_DO, BLOCKED, OTHER), else null"),this.registerFunction("words",e=>String(e).trim().split(/\s+/).filter(Boolean),1,"Splits string into words"),this.registerFunction("join",(e,n=", ")=>Array.isArray(e)?e.join(n):String(e),{min:1,max:2},"Joins array into string"),this.registerFunction("trim",e=>String(e).trim(),1,"Trims whitespace from both ends"),this.registerFunction("strip",e=>String(e).trim(),1,"Trims whitespace from both ends (alias for trim)"),this.registerFunction("trim_start",e=>String(e).trimStart(),1,"Trims leading whitespace"),this.registerFunction("lstrip",e=>String(e).trimStart(),1,"Trims leading whitespace (alias for trim_start)"),this.registerFunction("trim_end",e=>String(e).trimEnd(),1,"Trims trailing whitespace"),this.registerFunction("rstrip",e=>String(e).trimEnd(),1,"Trims trailing whitespace (alias for trim_end)"),this.registerFunction("to_upper",e=>String(e).toUpperCase(),1,"Converts string to uppercase"),this.registerFunction("upper",e=>String(e).toUpperCase(),1,"Converts string to uppercase"),this.registerFunction("to_lower",e=>String(e).toLowerCase(),1,"Converts string to lowercase"),this.registerFunction("lower",e=>String(e).toLowerCase(),1,"Converts string to lowercase"),this.registerFunction("upper_first",e=>{let n=String(e);return n.length===0?"":n.charAt(0).toUpperCase()+n.slice(1)},1,"Capitalizes first letter"),this.registerFunction("title_case",e=>String(e).replace(/\b\w/g,n=>n.toUpperCase()),1,"Converts string to Title Case"),this.registerFunction("contains",(e,n)=>Array.isArray(e)?e.includes(n):String(e).includes(String(n)),2,"Checks if string or array contains item"),this.registerFunction("includes",(e,n)=>Array.isArray(e)?e.includes(n):String(e).includes(String(n)),2,"Checks if string or array contains item"),this.registerFunction("starts_with",(e,n)=>String(e).startsWith(n),2,"Checks if string starts with prefix"),this.registerFunction("startswith",(e,n)=>String(e).startsWith(n),2,"Checks if string starts with prefix (alias for starts_with)"),this.registerFunction("ends_with",(e,n)=>String(e).endsWith(n),2,"Checks if string ends with suffix"),this.registerFunction("endswith",(e,n)=>String(e).endsWith(n),2,"Checks if string ends with suffix (alias for ends_with)"),this.registerFunction("index_of",(e,n,r)=>Array.isArray(e)?e.indexOf(n,r):String(e).indexOf(n,r),{min:2,max:3},"Finds substring or strictly equal array element index; -1 if absent"),this.registerFunction("last_index_of",(e,n)=>Array.isArray(e)?e.lastIndexOf(n):String(e).lastIndexOf(n),2,"Finds last substring or strictly equal array element index; -1 if absent"),this.registerFunction("count_matches",(e,n)=>n?String(e).split(n).length-1:0,2,"Counts occurrences of substring"),this.registerFunction("substr",(e,n,r)=>{let s=String(e),i=Math.trunc(Number(n))||0,o=i<0?Math.max(0,s.length+i):Math.min(s.length,i);if(r===void 0)return s.slice(o);let a=Math.max(0,Math.trunc(Number(r))||0);return s.slice(o,o+a)},{min:2,max:3},"Returns substring by end-relative start and optional length"),this.registerFunction("substring",(e,n,r)=>String(e).substring(n,r),{min:2,max:3},"Returns substring between indices"),this.registerFunction("slice",(e,n,r)=>e!=null?e.slice(n,r):"",{min:2,max:3},"Slices string or array"),this.registerFunction("char_at",(e,n)=>String(e).charAt(n),2,"Returns character at index"),this.registerFunction("char_code",(e,n=0)=>String(e).charCodeAt(n),{min:1,max:2},"Returns character code at index"),this.registerFunction("from_char_code",(...e)=>String.fromCharCode(...e),{min:0},"Returns string from character codes"),this.registerFunction("replace",(e,n,r)=>String(e).replace(n,r),3,"Replaces first occurrence"),this.registerFunction("replace_all",(e,n,r)=>String(e).replaceAll(n,r),3,"Replaces all occurrences"),this.registerFunction("repeat",(e,n)=>String(e).repeat(n),2,"Repeats string count times"),this.registerFunction("pad_start",(e,n,r=" ")=>String(e).padStart(n,r),{min:2,max:3},"Left-pads string"),this.registerFunction("pad_end",(e,n,r=" ")=>String(e).padEnd(n,r),{min:2,max:3},"Right-pads string"),this.registerFunction("reverse_str",e=>String(e).split("").reverse().join(""),1,"Reverses string"),this.registerFunction("is_empty",e=>e==null?!0:typeof e=="string"?e.trim().length===0:Array.isArray(e)?e.length===0:typeof e=="object"?Object.keys(e).length===0:!1,1,"Checks if string, array, or map is empty"),this.registerFunction("is_digit",e=>/^\d+$/.test(String(e)),1,"Checks if string contains only digits"),this.registerFunction("is_alpha",e=>/^[a-zA-Z]+$/.test(String(e)),1,"Checks if string contains only letters"),this.registerFunction("is_alnum",e=>/^[a-zA-Z0-9]+$/.test(String(e)),1,"Checks if string contains only letters and digits"),this.registerFunction("is_array",e=>Array.isArray(e),1,"Checks if value is an array"),this.registerFunction("is_string",e=>typeof e=="string",1,"Checks if value is a string"),this.registerFunction("is_number",e=>typeof e=="number",1,"Checks if value is a number"),this.registerFunction("is_map",e=>e!==null&&typeof e=="object"&&!Array.isArray(e),1,"Checks if value is a map/object"),this.registerFunction("is_function",e=>e instanceof Fn,1,"Checks if value is a first-class function reference"),this.registerFunction("shell_quote",e=>Pu(e),1,"Quotes string safely for POSIX shell command execution",!0),this.registerFunction("sprintf",(e,...n)=>Sa(e,n),{min:1},"Formats %s/%d/%f/%% with bounded width, alignment and precision; use format() for {} brace syntax"),this.registerFunction("printf",(e,...n)=>Sa(e,n,"printf"),{min:1},"Formats and prints %s, %d, %f and %% using the sprintf width and precision rules",!0),this.registerFunction("format",(e,...n)=>{let r=String(e),s=n.length===1&&typeof n[0]=="object"&&n[0]!==null&&!Array.isArray(n[0])?n[0]:void 0,i=0,o="",a=l=>typeof l=="object"&&l!==null?JSON.stringify(l):String(l);for(let l=0;l<r.length;){let c=r[l];if(c==="{"&&r[l+1]==="{"){o+="{",l+=2;continue}if(c==="}"&&r[l+1]==="}"){o+="}",l+=2;continue}if(c!=="{"){o+=c,l+=1;continue}let d=r.indexOf("}",l+1);if(d<0){o+=c,l+=1;continue}let u=r.slice(l+1,d);if(u==="")o+=i<n.length?a(n[i++]):"{}";else if(/^\d+$/.test(u)){let m=Number(u);o+=m<n.length?a(n[m]):`{${u}}`}else s&&/^[a-zA-Z0-9_]+$/.test(u)&&Object.hasOwn(s,u)?o+=a(s[u]):o+=`{${u}}`;l=d+1}return o},{min:1},"Formats string with arguments, supporting {{ and }} brace escapes, positional {0}, auto {}, and {key} map substitution"),this.registerFunction("regex_test",(e,n,r="")=>Er(n,r).test(String(e)),{min:2,max:3},"Tests a JavaScript regular expression against text"),this.registerFunction("regex_match",ew,{min:2,max:3},"Returns first full match and captures; g retains first-match shape, y is rejected"),this.registerFunction("regex_find_all",tw,{min:2,max:3},"Returns capture arrays with Unicode-aware zero-width progress; y is rejected"),this.registerFunction("regex_replace",(e,n,r,s="")=>String(e).replace(Er(n,s),r),{min:3,max:4},"Replaces matches using JavaScript regex replacement semantics"),this.registerFunction("split_regex",(e,n,r="")=>String(e).split(Er(n,r)),{min:2,max:3},"Splits text at regular expression matches"),this.registerFunction("len",e=>typeof e=="string"||Array.isArray(e)?e.length:e&&typeof e=="object"?Object.keys(e).length:0,1,"Returns length of string, array, or object"),this.registerFunction("length",e=>this.hostFunctions.get("len").fn(e),1,"Returns length of string, array, or object (alias for len)"),this.registerFunction("range",(e,n,r=1)=>{let s=n===void 0?0:e,i=n===void 0?e:n,o=[];if(r>0)for(let a=s;a<i;a+=r)o.push(a);else if(r<0)for(let a=s;a>i;a+=r)o.push(a);return o},{min:1,max:3},"Generates an array of numbers"),this.registerFunction("abs",e=>Math.abs(e),1,"Absolute value"),this.registerFunction("min",(...e)=>{let n=e.length===1&&Array.isArray(e[0])?e[0]:e;return Math.min(...n)},{min:0},"Minimum value"),this.registerFunction("max",(...e)=>{let n=e.length===1&&Array.isArray(e[0])?e[0]:e;return Math.max(...n)},{min:0},"Maximum value"),this.registerFunction("floor",e=>Math.floor(e),1,"Floor value"),this.registerFunction("ceil",e=>Math.ceil(e),1,"Ceil value"),this.registerFunction("round",e=>Math.round(e),1,"Round value"),this.registerFunction("sqrt",e=>Math.sqrt(e),1,"Square root"),this.registerFunction("pow",(e,n)=>Math.pow(e,n),2,"Power calculation"),this.registerFunction("random",()=>Math.random(),0,"Random float between 0 and 1"),this.registerFunction("sha256",e=>{if(typeof e!="string")throw new Error("sha256: expected a string");return Vv("sha256").update(e,"utf8").digest("hex")},1,"Returns lowercase SHA-256 of UTF-8 text; strings only"),this.registerFunction("now",()=>Date.now(),0,"Returns current epoch in ms"),this.registerFunction("timestamp",()=>Math.floor(Date.now()/1e3),0,"Returns current Unix epoch in whole seconds"),this.registerFunction("date",e=>new Date(e??Date.now()).toISOString(),{min:0,max:1},"Returns an ISO 8601 date-time string for now, or for a given epoch-ms timestamp"),this.registerFunction("strftime",(e,n)=>Cu(e,n),2,"Formats local time: epoch milliseconds first, format string second"),this.registerFunction("date_format",(e,n)=>Cu(e,n),2,"Alias for strftime with timestamp-first local-time formatting"),this.registerFunction("coalesce",(...e)=>{for(let n of e)if(n!=null)return n;return null},{min:0},"Returns the first non-null/non-undefined argument, else null"),this.registerFunction("if_null",(e,n)=>e??n,2,"Returns fallback if value is null/undefined, else value"),this.registerFunction("default_to",(e,n)=>e??n,2,"Returns fallback if value is null/undefined, else value (alias for if_null)"),this.registerFunction("if_else",(e,n,r)=>e?n:r,3,"Eager compatibility helper: arguments evaluate eagerly; use condition ? thenValue : elseValue for lazy selection"),this.registerFunction("str",e=>Ms(e),1,"Converts lists and maps to compact JSON; scalars to normal text"),this.registerFunction("to_string",e=>Ms(e),1,"Alias for str: converts lists and maps to compact JSON"),this.registerFunction("num",e=>Number(e),1,"Converts value to number"),this.registerFunction("type",e=>e===null?"null":Array.isArray(e)?"array":e instanceof Fn?"function":typeof e,1,"Returns runtime type of value"),this.registerFunction("assert",(e,n="Assertion failed")=>{if(!e)throw new Error(n);return!0},{min:1,max:2},"Throws error if condition is falsy")}registerFunction(e,n,r,s,i=!1,o=!1){let a=typeof s=="string"?s:s?.description,l=typeof s=="object"?!!s.isDefault:i,c=typeof s=="object"?!!s.isContainerMutation:o,d=typeof s=="object"?s.doc:void 0,u=typeof s=="object"?!!s.allowOverwrite:!1,m=typeof s=="object"&&s.module?s.module:this.currentRegisteringModule,p=this.functionOriginModule.get(e);if(p&&p!==m&&!u)throw new Error(`Cannot register function '${e}' from module '${m}': already registered by module '${p}'`);if(this.functionOriginModule.set(e,m),this.hostFunctions.set(e,{fn:n,arity:r,description:a,isDefault:l,isContainerMutation:c,doc:d,params:typeof s=="object"?s.params:void 0}),d)this.functionDocs.set(e,{...d,module:d.module??m});else if(!this.functionDocs.has(e)){let h=typeof r=="number"?r:r?.min??0,_=typeof r=="number"?r:r?.max,y=Array.from({length:_??h},(f,w)=>(w>=h?"[":"")+"arg"+(w+1)+(w>=h?"]":""));_===void 0&&y.push("...args"),this.functionDocs.set(e,{name:e,module:m,category:"Uncategorized",signature:e+"("+y.join(", ")+")",description:a??"Host function "+e})}return this}getFunctionOriginModule(e){return this.functionOriginModule.get(e)}initialGlobals=new Map;setGlobal(e,n){if(e==="PROPS")throw Error("PROPS is a reserved read-only map binding");return this.initialGlobals.set(e,n),this}getGlobal(e){return this.initialGlobals.get(e)}registerHostModule(e){return this.hostCatalog.set(e.name,e),this}getHostModule(e){return this.hostCatalog.get(e)}registerBuiltinProvider(e){if(this.builtinProviders.has(e.name))throw new Error(`Duplicate built-in provider '${e.name}'`);return this.builtinProviders.set(e.name,e),this}getBuiltinProviders(){return[...this.builtinProviders.values()]}async scanAndCheckAsync(e,n={}){try{let r=n.compiledSource??await aw(e,{...n,builtinProviderNames:[...this.builtinProviders.keys(),...n.builtinProviderNames??[]]});return{...this.scanAndCheck(e,{...n,compiledSource:r}),compiledSource:r}}catch(r){let s=r;return{ast:null,hasConcurrency:!1,diagnostics:[{severity:"error",message:s.message,line:s.line??1,column:s.column??1,file:s.file??n.file}]}}}scanAndCheck(e,n={}){try{let{program:r,diagnostics:s,hostImports:i,packages:o}=n.compiledSource??ow(e,{...n,builtinProviderNames:[...this.builtinProviders.keys(),...n.builtinProviderNames??[]]}),a=new Map(this.hostFunctions),l=[],c=new Map,d=new Map,u=new Set,m=[],p={known:[],closedTables:[],removedGlobals:{}};for(let f of[...[...this.builtinProviders.keys(),...this.hostCatalog.keys()].map(w=>({name:w,line:1,column:1,file:n.file})),...i]){if(l.some(E=>E.name===f.name))continue;let w;try{w=this.builtinProviders.get(f.name)??this.hostCatalog.get(f.name)??(n.resolveHostModule??this.hostResolver)?.(f.name)}catch(E){let b=sw(E);throw new M(`Cannot load module '${f.name}': ${b}. Install with npm install ${f.name} or set LMSCRIPT_MODULES.`,f.line,f.column,"CHECKER",f.file)}if(!w)throw new M(`Missing host module '${f.name}'. Install with npm install ${f.name} or set LMSCRIPT_MODULES; for a file use './${f.name}.lms'.`,f.line,f.column,"CHECKER",f.file);let g;try{let E=w.declarations,b=E?.functions,C=E?.globals;Array.isArray(b)&&Array.isArray(C)&&(g={functions:b.map(I=>({...I})),globals:C.map(I=>({...I})),properties:E.properties?{known:[...E.properties.known],closedTables:[...E.properties.closedTables??[]],removedGlobals:{...E.properties.removedGlobals}}:void 0})}catch{}if(w.name!==f.name||!g||typeof w.activate!="function")throw new M(`Invalid declarations for module '${f.name}'`,f.line,f.column,"CHECKER",f.file);for(let E of g.functions){let b=typeof E.arity=="number"?{min:E.arity,max:E.arity}:E.arity;if(typeof E.name!="string"||!/^[a-zA-Z_]\w*$/.test(E.name)||Object.hasOwn($s,E.name)||!b||!Number.isSafeInteger(b.min)||b.min<0||b.max!==void 0&&(!Number.isSafeInteger(b.max)||b.max<b.min))throw new M(`Invalid function declaration in module '${f.name}'`,f.line,f.column,"CHECKER",f.file);let C=d.get(E.name);if(E.override===!0&&a.has(E.name)&&!["prompt_human","run_script"].includes(E.name))throw new M(`Module '${f.name}' cannot override ${C===void 0?`core function '${E.name}'`:`function '${E.name}' declared by module '${C}'`}; permitted overrides: prompt_human, run_script`,f.line,f.column,"CHECKER",f.file);if(a.has(E.name)&&!(E.override===!0&&a.get(E.name)?.isDefault))throw new M(`Module function collision: '${E.name}' in module '${f.name}'${C===void 0?"":` is already declared by module '${C}'`}`,f.line,f.column,"CHECKER",f.file);a.set(E.name,{arity:E.arity,fn:()=>{throw new Error("Module not activated")},doc:E.doc,params:E.params}),d.set(E.name,f.name)}for(let E of g.globals){if(!/^[a-zA-Z_]\w*$/.test(E.name)||Object.hasOwn($s,E.name)||u.has(E.name)||["PROPS","Directory","NonInteractive"].includes(E.name)||this.initialGlobals.has(E.name)||n.globals?.includes(E.name))throw new M(`Module global collision or invalid name: '${E.name}'`,f.line,f.column,"CHECKER",f.file);u.add(E.name),this.builtinProviders.has(f.name)&&m.push(E.name)}g.properties&&(p.known=[...p.known,...g.properties.known],p.closedTables=[...p.closedTables??[],...g.properties.closedTables??[]],p.removedGlobals={...p.removedGlobals,...g.properties.removedGlobals}),l.push(w),c.set(w,g)}let h=[...this.initialGlobals.keys(),...n.globals||[],...u,"PROPS","Directory","NonInteractive"],_=new Ea(a,{...n,globals:h,builtinGlobals:m,propertyDeclarations:p,sourcePackages:o}),y=[...s,..._.check(r)];for(let f of y)if(f.message.startsWith("Call to undefined function"))for(let w of this.hostCatalog.values())for(let g of w.declarations.functions)f.message.includes(`'${g.name}'`)&&(f.message+=`; provided by module '${w.name}': add import "${w.name}";`);return{ast:r,diagnostics:y,hasConcurrency:_.hasConcurrency,hostModules:l,hostDeclarations:c,usedGlobals:[..._.usedGlobals],usedProperties:_.usedProperties}}catch(r){return r instanceof M?{ast:null,diagnostics:[{message:r.message,line:r.line,column:r.column,severity:"error",file:r.file||n.file}],hasConcurrency:!1}:{ast:null,diagnostics:[{message:r instanceof Error?r.message:String(r),line:1,column:1,severity:"error",file:n.file}],hasConcurrency:!1}}}installBuiltinStubs(e,n,r,s,i){let o=n.hostDeclarations.get(e);for(let a of o.globals)r.globals.set(a.name,new ba(()=>i(a.name)));for(let a of o.functions)r.functions.set(a.name,{fn:s(a.name),arity:a.arity,doc:a.doc,params:a.params})}activationContext(e,n,r){return{cwd:n.hostContext?.cwd??process.cwd(),env:Object.freeze({...n.hostContext?.env??process.env}),signal:n.signal,propertyStore:n.propertyStore,usedGlobals:(e.usedGlobals??[]).filter(s=>(e.hostDeclarations?.get(r)??r.declarations).globals.some(i=>i.name===s))}}bindModule(e,n,r,s){if(!n||typeof n.dispose!="function")throw new Error(`Module '${e.name}' did not return a disposable`);let i=r.hostDeclarations?.get(e)??e.declarations;if(i.properties){if(!n.loadProperties)throw Error(`Provider '${e.name}' did not supply properties`);s.properties?.addSource(e.name,()=>n.loadProperties(),i.properties.known)}for(let o of i.functions){if(typeof n.functions?.[o.name]!="function")throw new Error(`Module '${e.name}' did not bind '${o.name}'`);s.functions.set(o.name,{fn:n.functions[o.name],arity:o.arity,doc:o.doc,params:o.params})}for(let o of i.globals)if(Object.hasOwn(n.globals??{},o.name))s.globals.set(o.name,n.globals[o.name]);else if(r.usedGlobals?.includes(o.name))throw new Error(`Module '${e.name}' did not provide global '${o.name}'`)}moduleFailure(e,n,r){return{success:!1,output:[],diagnostics:[...n.diagnostics,{severity:"error",message:e instanceof Error?e.message:String(e),line:1,column:1,file:r.file}]}}collectModuleErrors(e,n){for(let r of e)if(r.getRecordedErrors!==void 0)try{let s=r.getRecordedErrors();if(!Array.isArray(s))throw new Error("getRecordedErrors must return an array");n.errors=[...n.errors??[],...s.map(i=>typeof i=="string"?i:JSON.stringify(i)??String(i))]}catch(s){n.diagnostics.push({severity:"warning",message:`Host module error collection failed: ${s instanceof Error?s.message:String(s)}`,line:1,column:1})}}cleanupWarning(e,n){n.diagnostics.push({severity:"warning",message:`Host module cleanup failed: ${e instanceof Error?e.message:String(e)}`,line:1,column:1})}run(e,n={}){this.outputLogs=[],this.lastRecordedErrors=[];let r=this.scanAndCheck(e,n);n={...n,propertyStore:n.propertyStore??new Bs(n.hostContext?.cwd??process.cwd(),n.hostContext?.env??process.env)};let s=n.propertyStore,i={functions:new Map(this.hostFunctions),globals:new Map(this.initialGlobals),properties:s};i.globals.set("PROPS",s.view()),i.globals.set("Directory",s.get("Directory")),i.globals.set("NonInteractive",s.get("NonInteractive"));let a={expand:(d,u={})=>{if(!u||typeof u!="object"||Array.isArray(u)||![Object.prototype,null].includes(Object.getPrototypeOf(u)))throw Error("expand: vars must be a map");let m=i.globals.get("ARGV")??[];return Ns(d,p=>p.kind==="property"?s.get(p.key):p.kind==="argument"?Array.isArray(m)&&Object.hasOwn(m,p.index)?m[p.index]:void 0:Object.hasOwn(u,p.name)?De(u,p.name):void 0,Ms)},get_property:(d,...u)=>s.get(d,...u),has_property:d=>s.has(d),get_properties:d=>s.copy(d),set_property:(d,u)=>s.set(d,u)};for(let[d,u]of Object.entries(a))i.functions.set(d,{...i.functions.get(d),fn:u});if(!r.ast||r.diagnostics.some(d=>d.severity==="error")||r.hasConcurrency)return this.executeSync(e,n,r,i);let l=[],c;try{Fe(n.signal);for(let d of r.hostModules??[]){if(this.builtinProviders.has(d.name)){let m,p=()=>{if(m)return m;Fe(n.signal);let h=d.activate(this.activationContext(r,n,d));if(Ps(h))throw h.then(_=>_.dispose()).catch(()=>{}),new Error(`Module '${d.name}' requires runAsync for activation`);if(!h||typeof h.dispose!="function")throw new Error(`Module '${d.name}' did not return a disposable`);return m=h,l.push(m),this.bindModule(d,m,r,i),m};this.installBuiltinStubs(d,r,i,h=>(..._)=>p().functions[h](..._),h=>(p(),i.globals.get(h))),r.usedProperties&&r.hostDeclarations?.get(d)?.properties&&p();continue}let u=d.activate(this.activationContext(r,n,d));if(Ps(u))throw u.then(m=>m.dispose()).catch(()=>{}),new Error(`Module '${d.name}' requires runAsync for activation`);l.push(u),this.bindModule(d,u,r,i),Fe(n.signal)}c=this.executeSync(e,n,r,i),n.signal?.aborted&&(c={...c,success:!1,diagnostics:c.diagnostics.some(d=>d.severity==="error"&&d.message==="Execution aborted")?c.diagnostics:[...c.diagnostics,{severity:"error",message:"Execution aborted",line:1,column:1}]})}catch(d){c=this.moduleFailure(d,r,n)}this.collectModuleErrors(l,c);for(let d of l.reverse())try{let u=d.dispose();if(Ps(u))throw u.catch(()=>{}),new Error("Async disposal requires runAsync")}catch(u){this.cleanupWarning(u,c)}return c}async runAsync(e,n={}){n={...n,importCache:n.importCache??new Map};let r=n.preparedCheck??await this.scanAndCheckAsync(e,n);this.outputLogs=[],this.lastRecordedErrors=[];let s=r;n={...n,propertyStore:n.propertyStore??new Bs(n.hostContext?.cwd??process.cwd(),n.hostContext?.env??process.env)};let i=n.propertyStore,o={functions:new Map(this.hostFunctions),globals:new Map(this.initialGlobals),properties:i};o.globals.set("PROPS",i.view()),o.globals.set("Directory",i.get("Directory")),o.globals.set("NonInteractive",i.get("NonInteractive"));let l={expand:(u,m={})=>{if(!m||typeof m!="object"||Array.isArray(m)||![Object.prototype,null].includes(Object.getPrototypeOf(m)))throw Error("expand: vars must be a map");let p=o.globals.get("ARGV")??[];return Ns(u,h=>h.kind==="property"?i.get(h.key):h.kind==="argument"?Array.isArray(p)&&Object.hasOwn(p,h.index)?p[h.index]:void 0:Object.hasOwn(m,h.name)?De(m,h.name):void 0,Ms)},get_property:(u,...m)=>i.get(u,...m),has_property:u=>i.has(u),get_properties:u=>i.copy(u),set_property:(u,m)=>i.set(u,m)};for(let[u,m]of Object.entries(l))o.functions.set(u,{...o.functions.get(u),fn:m});if(!s.ast||s.diagnostics.some(u=>u.severity==="error"))return this.executeAsync(e,n,s,o);let c=[],d;try{Fe(n.signal);for(let u of s.hostModules??[]){if(this.builtinProviders.has(u.name)){let p,h=()=>p??=Promise.resolve().then(async()=>{Fe(n.signal);let _=await u.activate(this.activationContext(s,n,u));if(!_||typeof _.dispose!="function")throw new Error(`Module '${u.name}' did not return a disposable`);return c.push(_),this.bindModule(u,_,s,o),Fe(n.signal),_});this.installBuiltinStubs(u,s,o,_=>async(...y)=>(await h()).functions[_](...y),async _=>(await h(),o.globals.get(_))),s.usedProperties&&s.hostDeclarations?.get(u)?.properties&&await h();continue}let m=await u.activate(this.activationContext(s,n,u));c.push(m),this.bindModule(u,m,s,o),Fe(n.signal)}d=await this.executeAsync(e,n,s,o),n.signal?.aborted&&(d={...d,success:!1,diagnostics:d.diagnostics.some(u=>u.severity==="error"&&u.message==="Execution aborted")?d.diagnostics:[...d.diagnostics,{severity:"error",message:"Execution aborted",line:1,column:1}]})}catch(u){d=this.moduleFailure(u,s,n)}this.collectModuleErrors(c,d);for(let u of c.reverse())try{await u.dispose()}catch(m){this.cleanupWarning(m,d)}return d}executeSync(e,n,r,s){let i=[],{ast:o,diagnostics:a,hasConcurrency:l}=r;if(a.filter(u=>u.severity==="error").length>0||!o)return this.outputLogs=i,{success:!1,diagnostics:a,output:i};if(l)return this.outputLogs=i,{success:!1,diagnostics:[...a,{message:"Concurrency constructs ('parallel', 'sync') require asynchronous execution via engine.runAsync()",line:1,column:1,severity:"error",file:n.file}],output:i};let d;try{d=new qs(s.functions,p=>{i.push(p),n.stdout?.(p)},!1,s.globals,n.stderr,this.promptHumanConfig),d.abortSignal=n.signal;let u=d.evaluateProgram(o);this.outputLogs=[...i];let m=d.getRecordedErrors();return this.lastRecordedErrors=m,{success:!0,value:u,diagnostics:a,output:i,errors:m}}catch(u){let m=d?d.getRecordedErrors():[];if(this.lastRecordedErrors=m,u instanceof mt||u?.name==="LMScriptExit"||u?.isControlFlow){this.outputLogs=[...i];let y=typeof u.exitCode=="number"?u.exitCode:0;return{success:y===0,value:y,exitCode:y,diagnostics:a,output:i,errors:m}}let p=u instanceof M?u.line:1,h=u instanceof M?u.column:1,_=u instanceof M&&u.file||n.file;return this.outputLogs=[...i],{success:!1,diagnostics:[...a,{message:u?.message||String(u),line:p,column:h,severity:"error",file:_}],output:i,errors:m}}}async executeAsync(e,n,r,s){let i=[],{ast:o,diagnostics:a}=r;if(a.filter(d=>d.severity==="error").length>0||!o)return this.outputLogs=i,this.lastRecordedErrors=[],{success:!1,diagnostics:a,output:i,errors:[]};let c;try{c=new qs(s.functions,m=>{i.push(m),n.stdout?.(m)},!0,s.globals,n.stderr,this.promptHumanConfig),c.abortSignal=n.signal;let d=await c.evaluateProgramAsync(o);this.outputLogs=[...i];let u=c.getRecordedErrors();return this.lastRecordedErrors=u,{success:!0,value:d,diagnostics:a,output:i,errors:u}}catch(d){let u=c?c.getRecordedErrors():[];if(this.lastRecordedErrors=u,d instanceof mt||d?.name==="LMScriptExit"||d?.isControlFlow){this.outputLogs=[...i];let _=typeof d.exitCode=="number"?d.exitCode:0;return{success:_===0,value:_,exitCode:_,diagnostics:a,output:i,errors:u}}let m=d instanceof M?d.line:1,p=d instanceof M?d.column:1,h=d instanceof M&&d.file||n.file;return this.outputLogs=[...i],{success:!1,diagnostics:[...a,{message:d?.message||String(d),line:m,column:p,severity:"error",file:h}],output:i,errors:u}}}lastRecordedErrors=[];getRecordedErrors(){return[...this.lastRecordedErrors]}hasFunction(e){return this.hostFunctions.has(e)}getFunctionMetadata(e){let n=this.hostFunctions.get(e);return n?{arity:n.arity,description:n.description}:void 0}getRegisteredFunctions(){return Array.from(this.hostFunctions.keys())}};da=le.basename(ka(import.meta.url));(da==="lmscript.ts"||da==="lmscript.js"||da==="lmscript")&&process.argv[1]&&$.existsSync(process.argv[1])&&$.realpathSync(ka(import.meta.url))===$.realpathSync(le.resolve(process.argv[1]))&&mw()});var NL,Xt,pw,fw,gw,Ca,Na,Oa,fe,xa,pt,Ks,Tr,Vs,zs,Aa,Gu,Ju,Ku,br,Vu,We,qt=O(()=>{"use strict";NL=1,Xt=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))Xt(e);Object.freeze(t)}return t},pw=Xt(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal"]),fw=Xt({status:"string",error:"string|null",code:"ErrorCode?"}),gw=Xt(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),Ca=Xt(["Provider1.Provider","Provider1.Model1","Provider1.Model2","Provider1.Model3","Provider2.Provider","Provider2.Model1","Provider2.Model2","Provider2.Model3","Provider3.Provider","Provider3.Model1","Provider3.Model2","Provider3.Model3"]),Na=Xt(["Provider1","Provider2","Provider3"]),Oa=Xt({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),fe={name:"ctx",type:"context"},xa={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},pt={name:"teamfile",type:"string"},Ks={name:"alias",type:"string"},Tr={name:"prompt",type:"string"},Vs={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"alias",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"},{name:"sessiondir",type:"string"},{name:"sessionid",type:"string"}]},zs=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],Aa={name:"options",type:"map",optional:!0,keys:zs},Gu={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},Ju={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},Ku={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},br={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},Vu={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},We=Xt([{name:"resolveProfilePath",implemented:!0,params:[fe,xa],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[fe,xa],statuses:["ok","error"],results:{error:"string|null",profile:"{path,raw,config}",values:"{Provider1..3,Model1..3,Directory,NonInteractive}",path:"string?",line:"number?",column:"number?"},effects:["file-read"],summary:"Read and validate the complete init profile without discovery or writes."},{name:"profileValues",implemented:!0,params:[{name:"config",type:"map"}],statuses:["ok","error"],results:{error:"string|null",Provider1:"string",Provider2:"string",Provider3:"string",Model1:"string",Model2:"string",Model3:"string"},effects:[],summary:"Validate and map slots to first-model environment values."},{name:"readPrompts",implemented:!0,params:[fe,{name:"path",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"single",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",prompts:"string[]"},effects:["file-read"],summary:"Read prompt records without exiting the caller.",scriptBinding:{name:"lm_read_prompts",params:[{name:"batchfile",type:"string"},{name:"single",type:"boolean",optional:!0}]}},{name:"listMembers",implemented:!0,params:[fe,pt],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[pt]}},{name:"resolveMember",implemented:!0,params:[fe,pt,Ks],statuses:["ok","not_found","error"],results:{error:"string|null",member:"Member",isLead:"boolean",teamfile:"string"},effects:["file-read","db"],summary:"Resolve a team member with an explicit missing outcome.",scriptBinding:{name:"lm_member",params:[pt,Ks]}},{name:"lintTeam",implemented:!0,params:[fe,pt],statuses:["ok","error"],results:{error:"string|null",errors:"list",warnings:"list",counts:"map"},effects:["file-read","db"],summary:"Return structured lint findings.",scriptBinding:{name:"lm_lint",params:[pt]}},{name:"seedTeam",implemented:!0,params:[fe,pt,Gu],statuses:["ok","error"],results:{error:"string|null",seeded:"SeededMember[]"},effects:["provider","db","file-write"],summary:"Seed a team with explicit optional preambles.",scriptBinding:{name:"lm_seed",params:[pt,Gu]}},{name:"promptAgent",implemented:!0,params:[fe,Vs,Tr,Aa],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...Vu,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[Vs,Tr,Aa]}},{name:"promptMember",implemented:!0,params:[fe,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"prompt",type:"string",required:!0},{name:"messageType",type:"string"},...zs]}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn a team member through native team admission.",scriptBinding:{name:"lm_prompt",params:[pt,Ks,Tr,{name:"options",type:"map",optional:!0,keys:[...zs,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[fe,{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"workspace",type:"string"},{name:"all",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",sessions:"Session[]"},effects:["file-read"],summary:"List native sessions in an explicit workspace.",scriptBinding:{name:"lm_session_list",params:[{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"sessiondir",type:"string"},{name:"all",type:"boolean"}]}]}},{name:"deleteSession",implemented:!0,params:[fe,br,Ku],statuses:["deleted","not_found","busy","error"],results:{error:"string|null"},effects:["provider","file-write"],summary:"Delete a session only with explicit force admission.",scriptBinding:{name:"lm_session_delete",params:[Vs,{...Ku,optional:!0}]}},{name:"getSession",implemented:!0,params:[fe,br],statuses:["ok","not_found","error"],results:{error:"string|null",messages:"{role,content}[]"},effects:["provider","file-read"],summary:"Read native session messages."},{name:"reserveSession",implemented:!0,params:[fe,br],statuses:["ok","busy","error"],results:{error:"string|null",reservation:"SessionReservation"},effects:[],summary:"Reserve context-local handoff admission and return a capability."},{name:"releaseSession",implemented:!0,params:[fe,br],statuses:["ok","error"],results:{error:"string|null"},effects:[],summary:"Release context-local handoff admission."},{name:"openTeamBatch",implemented:!0,params:[fe,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"label",type:"string",required:!0},{name:"promptCount",type:"number",required:!0},{name:"legacy",type:"boolean"},...zs]}],statuses:["ok","busy","error"],results:{error:"string|null",batch:"opaque context-bound BatchRef"},effects:["provider","db"],summary:"Open a managed team batch; member-map composition remains language-owned."},{name:"batchTurn",implemented:!0,params:[fe,{name:"batch",type:"BatchRef"},Tr,{name:"index",type:"number"},{name:"total",type:"number"}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn an owned live batch reference."},{name:"closeBatch",implemented:!0,params:[fe,{name:"batch",type:"BatchRef"},{name:"options",type:"map",keys:[{name:"status",type:"string",required:!0,values:["done","error","cancelled"]},{name:"error",type:"string"}]}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close an owned batch."},{name:"readRatelimits",implemented:!0,params:[fe,Ju],statuses:["ok","error"],results:{error:"string|null",readings:"list"},effects:["file-read","network"],summary:"Read provider rate-limit data.",scriptBinding:{name:"lm_ratelimit_readings",params:[Ju]}},{name:"openTerminal",implemented:!0,params:[fe,{name:"target",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0}]},{name:"streams",type:"map",keys:[{name:"stdin",type:"stream",required:!0},{name:"stdout",type:"stream",required:!0},{name:"stderr",type:"stream",required:!0}]}],statuses:["ok","error"],results:{error:"string|null",code:"number|null",signal:"string|null"},effects:["provider","db","tty"],summary:"Open a native terminal with caller-supplied streams.",scriptBinding:{name:"lm_terminal",params:[pt,Ks]}},{name:"sessionAdmission",implemented:!0,params:[fe,br],statuses:["ok","busy","error"],results:{error:"string|null",busyReason:"turn|handoff?"},effects:[],summary:"Query context-local session admission without exposing mutable sets."},{name:"promptReservedAgent",implemented:!0,params:[fe,{name:"reservation",type:"SessionReservation"},Vs,Tr,Aa],statuses:["ok","busy","stalled","empty","error"],results:{...Vu,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"inspectBatch",implemented:!0,params:[fe,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null",id:"string",closed:"boolean",member:"Member",rootId:"number|null"},effects:[],summary:"Read batch metadata without exposing native transports or lease capabilities."},{name:"loadProperties",implemented:!0,params:[fe,xa],statuses:["ok","error"],results:{error:"string|null",path:"string",properties:"map",flat:"map",line:"number?",column:"number?"},effects:["file-read"],summary:"Read the complete hierarchical init.toml properties document through the canonical reader."}])});var zu,Yu=O(()=>{"use strict";zu=[{name:"lm_batch_open",category:"lmctl Automation",signature:"lm_batch_open(teamfile, alias, batchfile, options = {}); lm_batch_open(member, options = {})",description:"Opens a managed teamfile batch, or a file-free member-map batch using sequential native agent turns. The map form retains session identity without team leases, bundle optimization, or team tracking.",parameters:[{name:"teamfile",type:"string|map",description:"Teamfile path for the legacy form, or a member map for the two-argument form"},{name:"alias",type:"string",description:"Team member alias to target"},{name:"batchfile",type:"string",description:"Legacy form only: source label for tracking; not read by this function"},{name:"options",type:"map",description:"(optional) Teamfile form: promptCount, legacy. Member-map form: permissionMode, idleTimeoutMs, as for lm_agent"}],returns:{type:"map",description:"Batch handle object or null on error"},example:'handle = lm_batch_open("team.lmctl", "reviewer", "prompts.txt", { promptCount: 5 });'},{name:"lm_batch_turn",category:"lmctl Automation",signature:"lm_batch_turn(handle, prompt, index, total)",description:"Executes a single prompt turn within an active batch session, handling heartbeats and status reporting.",parameters:[{name:"handle",type:"map",description:"Active batch handle returned from lm_batch_open"},{name:"prompt",type:"string",description:"Prompt text to execute"},{name:"index",type:"number",description:"1-based prompt index"},{name:"total",type:"number",description:"Total number of prompts in batch"}],returns:{type:"map",description:"{ status: 'ok'|'busy'|'stalled'|'error', reply: string, error: string|null }"},example:'turn = lm_batch_turn(handle, "Summarize this diff", 1, 5);'},{name:"lm_batch_close",category:"lmctl Automation",signature:'lm_batch_close(handle, status = "done", error = null)',description:"Closes an active batch session and finalizes tracked invocations and bundle leases.",parameters:[{name:"handle",type:"map",description:"Active batch handle to close"},{name:"status",type:"string",description:"(optional) Terminal status: 'done', 'cancelled', or 'error' (default: 'done')"},{name:"error",type:"string",description:"(optional) Error message if batch failed"}],returns:{type:"bool",description:"true if successfully closed, false otherwise"},example:'lm_batch_close(handle, "done");'},{name:"lm_prompt",category:"lmctl Automation",signature:"lm_prompt(teamfile, alias, prompt, options = {})",description:"Sends a direct one-shot prompt to a team member and returns the reply.",parameters:[{name:"teamfile",type:"string",description:"Path to team configuration file"},{name:"alias",type:"string",description:"Target team member alias"},{name:"prompt",type:"string",description:"Prompt text"},{name:"options",type:"map",description:"(optional) Execution options: permissionMode, idleTimeoutMs, messageType"}],returns:{type:"map",description:"{ status, reply, error, message_id, team_chat_log_id }"},example:'res = lm_prompt("team.lmctl", "coder", "Hello agent");'},{name:"lm_agent",category:"lmctl Automation",signature:"lm_agent(member, prompt, options = {})",description:"Prompts a provider directly without a teamfile. Creates a session when sessionid is absent and writes its ID back into member for subsequent turns or explicit persistence.",parameters:[{name:"member",type:"map",description:"Required provider; optional alias, model, effort, sessiondir (default cwd), sessionid. Updated in place with sessionid."},{name:"prompt",type:"string",description:"Prompt text"},{name:"options",type:"map",description:"(optional) permissionMode (yolo or plan), idleTimeoutMs. Fresh agy/pi/dsh sessions require a preliminary seed in yolo mode."}],returns:{type:"map",description:"{ status, reply, error, message_id: null, team_chat_log_id: null }; no team mailbox or log is created"},example:'agent = { provider: "codex" }; res = lm_agent(agent, "Summarize this repository");'},{name:"lm_session_list",category:"lmctl Automation",signature:"lm_session_list(options = {})",description:"Lists native sessions in the current workspace by default. Options: provider, sessiondir, all.",returns:{type:"array",description:"Session maps with provider, sessionid, sessiondir, and modifiedAt."},example:'sessions = lm_session_list({ provider: "codex" });'},{name:"lm_session_delete",category:"lmctl Automation",signature:"lm_session_delete(member, options = {})",description:"Deletes a native session by provider and sessionid. Requires force: true because another process may be using it; refuses active turns in this script engine. A forced cross-process deletion can disrupt that turn.",returns:{type:"map",description:'{ status: "deleted"|"not_found"|"busy"|"error", error: string|null }'},example:"lm_session_delete(agent, { force: true });"},{name:"lm_fanout",category:"lmctl Automation",signature:"lm_fanout(participants, prompts, options = {})",description:"Dispatches a prompt to every participant CONCURRENTLY, over the same path as lm_agent -- for a runtime-sized fan-out that parallel([...]) cannot express, since parallel is a language construct fixed to the call expressions written in the script. Each participant gets its own result in its own array slot; there is no shared accumulator to race on.",parameters:[{name:"participants",type:"array",description:"Array of member maps, each shaped like lm_agent's member argument"},{name:"prompts",type:"string|array",description:"A single string broadcast to every participant, or an array of strings (one per participant, must be the same length as participants)"},{name:"options",type:"map",description:"(optional) Same options as lm_agent (permissionMode, idleTimeoutMs), applied identically to every participant"}],returns:{type:"array",description:"Array of lm_agent-shaped result maps ({ status, reply, error, message_id, team_chat_log_id }), in the SAME order as participants (not first-to-finish order)"},example:'reviewers = [{provider:"codex"}, {provider:"claude"}, {provider:"agy"}]; results = lm_fanout(reviewers, "Review this diff for correctness issues.");'},{name:"lm_seed",category:"lmctl Automation",signature:"lm_seed(teamfile, options = {})",description:"Seeds a real teamfile over the exact same internal path `lmctl seed` takes: seeds only members that lack a sessionid, writes each new sessionid/sessiondir back into the teamfile file, and leaves an already-seeded member untouched. `lmctl seed` itself stays a minimal primitive (one-sentence Lead prompt); a workflow that wants a richer or role-specific preamble supplies it via options.preamble instead of lmctl growing that behavior.",parameters:[{name:"teamfile",type:"string",description:"Path to the team configuration file to seed"},{name:"options",type:"map",description:'(optional) preamble: a string (replaces the default prompt for whichever alias gets one today -- Lead) or a map keyed by alias, e.g. {"Lead": "...", "Reviewer": "..."} (replaces the default prompt entirely for each matched alias; a non-Lead alias gets no prompt at all unless keyed here)'}],returns:{type:"map",description:'{ status: "ok"|"error" }; progress, warnings and per-member errors are written to stderr, same as lmctl seed'},example:'lm_seed("team.lmctl", { preamble: { Lead: "Use `lmctl prompt` to send a message.", Reviewer: "Wait for a review request from Lead before doing anything." } });'},{name:"lm_terminal",category:"lmctl Automation",signature:"lm_terminal(teamfile, alias)",description:"Opens a tracked team member in its native provider TUI, preserving terminal ownership and inherited stdio. Refuses non-interactive mode.",parameters:[{name:"teamfile",type:"string",description:"Teamfile path"},{name:"alias",type:"string",description:"Member alias"}],returns:{type:"map",description:"{ status, code } after the TUI exits"},example:'lm_terminal("team.lmctl", "Lead");'},{name:"lm_lint",category:"lmctl Automation",signature:"lm_lint(teamfile)",description:'Validates a teamfile over the exact same internal path `lmctl lint` takes, returning structured findings instead of text a script would otherwise have to parse (operator, 2026-09-30: "lmscript does not use lmctl cli... expose lmctl internal working as api"). status is "error" ONLY for a genuine validation error (unparseable file, bad _MEMBER_ line, confirmed wrong-provider model) -- warnings never flip it to "error", matching the CLI\'s own exit-0-on-warnings contract. Progress/error/warning lines are also written to stderr, same as lmctl lint.',parameters:[{name:"teamfile",type:"string",description:"Path to the team configuration file to validate"}],returns:{type:"map",description:'{ status: "ok"|"error", errors: [{alias, message}], warnings: [{alias, message}], counts: {errors, warnings} }; alias is "" when a finding is about the file rather than a member. Both lists are always arrays, never null.'},example:'result = lm_lint("team.lmctl"); if (result.counts.warnings > 0) { lm_log(result.counts.warnings + " warning(s)"); }'},{name:"lm_ratelimit_readings",category:"lmctl Automation",signature:"lm_ratelimit_readings(options = {})",description:"Queries live provider quota readings using the existing ratelimit reader; preserves raw fields without cost aggregation or inferred availability.",parameters:[{name:"options",type:"map",description:"(optional) providers: string[] or provider: string (default all); timeoutSeconds: positive number (default 15)"}],returns:{type:"map",description:'{ status: "ok", readings: map[] } or { status: "error", error: string, readings: [] }. Provider-level failures remain reading data; inspect each reading.status and bucket flags.'},example:'quota = lm_ratelimit_readings({ providers: ["codex", "claude"] });'},{name:"lm_read_prompts",category:"lmctl Automation",signature:"lm_read_prompts(batchfile, single = false)",description:"Reads prompt file with BOM and CRLF normalization, splitting into paragraphs or reading entire file as single prompt.",parameters:[{name:"batchfile",type:"string",description:"Path to prompt file"},{name:"single",type:"bool",description:"(optional) If true, treats entire file as one prompt; if false, splits on blank lines"}],returns:{type:"string[]",description:"List of prompt strings"},example:'prompts = lm_read_prompts("prompts.txt");'},{name:"lm_read_paragraphs",category:"lmctl Automation",signature:"lm_read_paragraphs(batchfile)",description:"Reads a prompt file and splits it into blank-line-separated paragraphs.",parameters:[{name:"batchfile",type:"string",description:"Path to prompt file"}],returns:{type:"string[]",description:"List of paragraph strings"},example:'paragraphs = lm_read_paragraphs("spec.md");'},{name:"lm_members",category:"lmctl Automation",signature:"lm_members(teamfile)",description:"Resolves all team members declared in a team configuration file.",parameters:[{name:"teamfile",type:"string",description:"Path to team configuration file"}],returns:{type:"map[]",description:"List of member records { alias, provider, model, sessionid, sessiondir }"},example:'members = lm_members("team.lmctl");'},{name:"lm_member",category:"lmctl Automation",signature:"lm_member(teamfile, alias)",description:"Resolves a specific member in a team configuration file.",parameters:[{name:"teamfile",type:"string",description:"Path to team configuration file"},{name:"alias",type:"string",description:"Member alias to look up"}],returns:{type:"map|null",description:"Member record { alias, provider, model, sessionid, sessiondir, isLead, teamfile } or null"},example:'m = lm_member("team.lmctl", "reviewer");'},{name:"lm_log",category:"lmctl Automation",signature:"lm_log(value, ...args)",description:"Writes formatted log messages to standard error with trailing newline.",parameters:[{name:"value",type:"any",description:"Required first value or message"},{name:"args",type:"any[]",description:"Additional values or messages to log to stderr"}],returns:{type:"string",description:"The formatted text"},example:'lm_log("Step completed successfully");'},{name:"lm_error",category:"lmctl Automation",signature:"lm_error(value, ...args)",description:"Writes error messages to standard error prefixed with 'error: '.",parameters:[{name:"value",type:"any",description:"Required first error detail"},{name:"args",type:"any[]",description:"Additional error details to write to stderr"}],returns:{type:"string",description:"The formatted error text"},example:'lm_error("Failed to connect to team member");'},{name:"lm_exit",category:"lmctl Automation",signature:"lm_exit(code = 0)",description:"Immediately terminates script execution with the specified integer exit code (0-255).",parameters:[{name:"code",type:"number",description:"(optional) Exit status code between 0 and 255 (default: 0)"}],returns:{type:"never",description:"Raises LMScriptExit control flow"},example:"lm_exit(1);"}]});function G(t){try{if(t instanceof Error){let e=t.message;if(typeof e=="string")return e}return String(t)}catch{return"Unprintable error"}}function ce(t){return{...t,status:"ok",error:null}}function j(t,e,n){return{...n,status:"error",code:t,error:e}}var Xe=O(()=>{"use strict"});import{existsSync as hw}from"node:fs";import{createRequire as _w}from"node:module";function yw(){return La===null&&(La=_w(import.meta.url)("node:sqlite").DatabaseSync),La}function ww(t){let e=vw[t];if(e!==void 0)return e;let n=Ew[t&255];return n!==void 0?n:`SQLITE_UNKNOWN_${t}`}function fn(t){throw t&&typeof t=="object"&&"errcode"in t&&typeof t.errcode=="number"&&(t.code=ww(t.errcode)),t}function Tw(t){return t instanceof Error&&/cannot rollback - no transaction is active/i.test(t.message)}function bw(t){return t instanceof Error&&/no such savepoint:/i.test(t.message)}function Ma(t){return t.length===1&&Sw(t[0])?[t[0]]:t}function Sw(t){if(!Fa(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Fa(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var La,Ew,vw,Pa,Ys,Da,$a=O(()=>{"use strict";La=null;Ew={1:"SQLITE_ERROR",2:"SQLITE_INTERNAL",3:"SQLITE_PERM",4:"SQLITE_ABORT",5:"SQLITE_BUSY",6:"SQLITE_LOCKED",7:"SQLITE_NOMEM",8:"SQLITE_READONLY",9:"SQLITE_INTERRUPT",10:"SQLITE_IOERR",11:"SQLITE_CORRUPT",12:"SQLITE_NOTFOUND",13:"SQLITE_FULL",14:"SQLITE_CANTOPEN",15:"SQLITE_PROTOCOL",17:"SQLITE_SCHEMA",18:"SQLITE_TOOBIG",19:"SQLITE_CONSTRAINT",20:"SQLITE_MISMATCH",21:"SQLITE_MISUSE",23:"SQLITE_AUTH",25:"SQLITE_RANGE",26:"SQLITE_NOTADB"},vw={275:"SQLITE_CONSTRAINT_CHECK",531:"SQLITE_CONSTRAINT_COMMITHOOK",787:"SQLITE_CONSTRAINT_FOREIGNKEY",1043:"SQLITE_CONSTRAINT_FUNCTION",1299:"SQLITE_CONSTRAINT_NOTNULL",1555:"SQLITE_CONSTRAINT_PRIMARYKEY",1811:"SQLITE_CONSTRAINT_TRIGGER",2067:"SQLITE_CONSTRAINT_UNIQUE",2323:"SQLITE_CONSTRAINT_VTAB",2579:"SQLITE_CONSTRAINT_ROWID",2835:"SQLITE_CONSTRAINT_PINNED",3091:"SQLITE_CONSTRAINT_DATATYPE",261:"SQLITE_BUSY_RECOVERY",517:"SQLITE_BUSY_SNAPSHOT",773:"SQLITE_BUSY_TIMEOUT",262:"SQLITE_LOCKED_SHAREDCACHE",518:"SQLITE_LOCKED_VTAB"};Pa=class{name;handle;savepointId=0;constructor(e,n={}){if(n.fileMustExist===!0&&e!==":memory:"&&!hw(e))throw new Error("unable to open database file");this.name=e;try{this.handle=new(yw())(e,{readOnly:n.readonly===!0})}catch(r){fn(r)}this.exec("PRAGMA busy_timeout = 5000"),this.exec(`PRAGMA foreign_keys = ${n.foreignKeys===!0?"ON":"OFF"}`)}prepare(e){try{return new Da(this.handle.prepare(e))}catch(n){fn(n)}}exec(e){try{this.handle.exec(e)}catch(n){fn(n)}}pragma(e,n){let r=`PRAGMA ${e}`;if(e.includes("=")){this.exec(r);return}if(n?.simple===!0){let s=this.prepare(r).get();return s===void 0?void 0:Object.values(s)[0]}return this.prepare(r).all()}transaction(e){let n=(...r)=>this.runTransaction("BEGIN",e,r);return n.immediate=(...r)=>this.runTransaction("BEGIN IMMEDIATE",e,r),n}get inTransaction(){return this.handle.isTransaction}close(){try{this.handle.close()}catch(e){fn(e)}}runTransaction(e,n,r){if(!this.inTransaction){this.exec(e);try{let i=n(...r);return this.exec("COMMIT"),i}catch(i){if(this.inTransaction)try{this.exec("ROLLBACK")}catch(o){if(!Tw(o))throw o}throw i}}let s=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${s}`);try{let i=n(...r);return this.exec(`RELEASE ${s}`),i}catch(i){if(this.inTransaction)try{this.exec(`ROLLBACK TO ${s}`),this.exec(`RELEASE ${s}`)}catch(o){if(!bw(o))throw o}throw i}}};Ys=Pa,Da=class{constructor(e){this.handle=e;this.handle.setAllowBareNamedParameters(!0)}rawMode=!1;get(...e){try{let n=this.handle.get(...Ma(e));return this.normalizeRow(n)}catch(n){fn(n)}}all(...e){try{return this.handle.all(...Ma(e)).map(n=>this.normalizeRow(n))}catch(n){fn(n)}}run(...e){try{let n=this.handle.run(...Ma(e));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}catch(n){fn(n)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Fa(e)?Object.values(e):Fa(e)?{...e}:e}}});import{createHash as kw}from"node:crypto";function Rw(t,e,n){return kw("sha256").update(`${t}\0${e}\0${n}`).digest("hex")}function $e(t,e,n){let r=Rw(e.stream_id,e.intentKey??e.event_type,e.observedLastSeq),s=t.prepare(`INSERT INTO message_event (event_id, ts, stream_id, event_type, payload)
419
+ `):console.error(`error: ${n}`),n},{min:1},"Formats and logs an error to stderr and records it for the execution error summary",!0),this.registerFunction("http_get",e=>ju(e),1,"Downloads UTF-8 text from a public HTTP(S) URL",!0),this.registerFunction("sleep_ms",e=>{if(typeof e!="number"||!Number.isFinite(e)||e<0)throw new Error("sleep_ms() duration must be a non-negative finite number");if(e>2147483647)throw new Error("sleep_ms() duration exceeds maximum supported timeout (2147483647 ms)");let n=Date.now()+e;for(;Date.now()<n;);return null},1,"Sleeps for the specified milliseconds",!0),this.registerFunction("prompt_human_config",(e,n)=>{if(e===void 0)return{mode:this.promptHumanConfig.mode??"interactive",dir:this.promptHumanConfig.dir??null,timeout_ms:this.promptHumanConfig.timeoutMs??null,poll_interval_ms:this.promptHumanConfig.pollIntervalMs??200};if(typeof e=="string")e==="interactive"?this.promptHumanConfig.mode="interactive":e==="file"?(this.promptHumanConfig.mode="file",n&&(this.promptHumanConfig.dir=String(n))):(this.promptHumanConfig.mode="file",this.promptHumanConfig.dir=e);else if(e&&typeof e=="object"){let r=e.mode?String(e.mode):e.dir?"file":this.promptHumanConfig.mode??"interactive",s=e.dir!==void 0?String(e.dir):this.promptHumanConfig.dir,i=e.timeout_ms!==void 0?Number(e.timeout_ms):e.timeoutMs!==void 0?Number(e.timeoutMs):this.promptHumanConfig.timeoutMs,o=e.poll_ms!==void 0?Number(e.poll_ms):e.pollIntervalMs!==void 0?Number(e.pollIntervalMs):this.promptHumanConfig.pollIntervalMs;this.promptHumanConfig.mode=r==="file"?"file":"interactive",this.promptHumanConfig.dir=s,this.promptHumanConfig.timeoutMs=typeof i=="number"&&Number.isFinite(i)?i:void 0,this.promptHumanConfig.pollIntervalMs=typeof o=="number"&&Number.isFinite(o)&&o>0?o:200}return{mode:this.promptHumanConfig.mode,dir:this.promptHumanConfig.dir??null,timeout_ms:this.promptHumanConfig.timeoutMs??null,poll_interval_ms:this.promptHumanConfig.pollIntervalMs??200}},{min:0,max:2},"Configures prompt_human mode ('interactive' or 'file' with dedicated directory, timeout_ms, poll_ms)",!0),this.registerFunction("prompt_human",(e,n)=>{if((n?.mode??(n?.dir?"file":this.promptHumanConfig.mode??"interactive"))==="file"){let s=n?.dir??this.promptHumanConfig.dir;if(!s)throw new Error("prompt_human: file mode requires a directory (configure via prompt_human_config({ dir }) or pass { dir })");if(!this.isAsyncMode)throw new Error("prompt_human: file mode requires asynchronous execution (runAsync)");return Xu(e,{dir:s,sessionId:n?.sessionId??n?.sessionid??n?.id,timeoutMs:n?.timeout_ms??n?.timeoutMs??this.promptHumanConfig.timeoutMs,pollIntervalMs:n?.poll_ms??n?.pollIntervalMs??this.promptHumanConfig.pollIntervalMs})}return this.isAsyncMode?Vs(e):Wu(e)},{min:0,max:2},"Prompts operator on stdin/terminal or dedicated directory, returning input string or null if closed/non-interactive",!0),this.registerFunction("json_parse",e=>{try{return JSON.parse(String(e))}catch(n){throw new Error(`JSON parse error: ${n.message}`)}},1,"Parses JSON string into object/array"),this.registerFunction("json_parse_safe",(e,n=null)=>sw(e,n),{min:1,max:2},"Safely parses JSON string with preamble/fence recovery, returning fallback (default null) on failure without throwing",!0),this.registerFunction("json_stringify",(e,n)=>JSON.stringify(e,null,n),{min:1,max:2},"Serializes value into JSON string"),this.registerFunction("keys",e=>e&&typeof e=="object"?Object.keys(e):[],1,"Returns array of object keys"),this.registerFunction("values",e=>e&&typeof e=="object"?Object.values(wr(e)):[],1,"Returns array of object values"),this.registerFunction("entries",e=>e&&typeof e=="object"?Object.entries(wr(e)):[],1,"Returns array of [key, value] pairs"),this.registerFunction("has_key",(e,n)=>e&&typeof e=="object"?Object.hasOwn(e,n):!1,2,"Checks if object has key"),this.registerFunction("items",e=>e&&typeof e=="object"?Object.entries(wr(e)):[],1,"Returns array of [key, value] pairs (alias for entries)"),this.registerFunction("get",(e,n,r=null)=>{let s=vr(e,n);return s!==void 0?s:r},{min:2,max:3},"Safely extracts nested property by path (e.g. 'user.address.city')"),this.registerFunction("getstr",(e,n,r="")=>{let s=vr(e,n);return s==null?r:String(s)},{min:2,max:3},'Reads a string field from a map/request form; fallback (default "") when missing or null (never the string "null"). A distinguishable non-"" fallback (e.g. "?") tells "missing" apart from a real empty string.'),this.registerFunction("getnum",(e,n,r=0)=>{let s=vr(e,n);return s==null?r:Number(s)},{min:2,max:3},"Reads a numeric field from a map/request form; fallback (default 0) when missing or null"),this.registerFunction("getbool",(e,n,r=!1)=>{let s=vr(e,n);if(s==null)return r;if(typeof s=="boolean")return s;if(typeof s=="string"){let i=s.trim().toLowerCase();if(i==="true")return!0;if(i==="false")return!1}return!!s},{min:2,max:3},'Reads a boolean field from a map/request form ("true"/"false" strings included); fallback (default false) when missing or null'),this.registerFunction("getlist",(e,n,r=[])=>{let s=vr(e,n);return Array.isArray(s)?s:r},{min:2,max:3},"Reads an array field from a map/request form; fallback (default []) when missing, null, or not actually an array"),this.registerFunction("require",$u,2,"Requires a present value; injected diagnostic/captured error and exit 2 on missing",!0),this.registerFunction("set",(e,n,r)=>{if(e==null||typeof e!="object")return e;let s=Array.isArray(n)?n:String(n).replace(/\[(\w+)\]/g,".$1").split(".").filter(Boolean),i=e;for(let o=0;o<s.length-1;o++){let a=s[o];(De(i,a)==null||typeof De(i,a)!="object")&&Be(i,a,{}),i=De(i,a)}return s.length>0&&Be(i,s[s.length-1],r),e},3,"Sets nested property by path",!0,!0),this.registerFunction("pluck",(e,n)=>Array.isArray(e)?e.map(r=>De(r,n)):[],2,"Extracts key from array of objects"),this.registerFunction("filter_by",(e,n,r)=>Array.isArray(e)?e.filter(s=>s!=null&&De(s,n)===r):[],3,"Filters array of objects where item[key] == value"),this.registerFunction("find_by",(e,n,r)=>{if(!Array.isArray(e))return null;let s=e.find(i=>i!=null&&De(i,n)===r);return s!==void 0?s:null},3,"Finds first object in array where item[key] == value"),this.registerFunction("merge",(e,n)=>({...wr(e),...wr(n)}),2,"Shallow merges two objects"),this.registerFunction("clone",e=>e==null||typeof e!="object"?e:JSON.parse(JSON.stringify(e)),1,"Deep clones an object or array"),this.registerFunction("delete_key",(e,n)=>(e&&typeof e=="object"&&delete e[n],e),2,"Deletes key from object",!0,!0),this.registerFunction("print",(...e)=>{let n=e.map(r=>typeof r=="object"?JSON.stringify(r):String(r)).join(" ");return this.outputLogs.push(n),n},{min:0},"Prints formatted values to output log",!0),this.registerFunction("println",(...e)=>{let n=e.map(r=>typeof r=="object"?JSON.stringify(r):String(r)).join(" ");return this.outputLogs.push(n),n},{min:0},"Prints line to output log",!0),this.registerFunction("split",(e,n)=>String(e).split(n),2,"Splits string by required delimiter; use explicit empty delimiter for characters"),this.registerFunction("lines",e=>String(e).split(/\r?\n/),1,"Splits string into array of lines"),this.registerFunction("last_line_as_status",e=>{if(typeof e!="string")return null;let n=e.split(/\r?\n/);for(let r=n.length-1;r>=0;r--){let s=n[r].trim();if(s.length>0)return s==="DONE"||s==="NOTHING_TO_DO"||s==="BLOCKED"||s==="OTHER"?s:null}return null},1,"Returns the last non-blank line of a string if it is a valid state word (DONE, NOTHING_TO_DO, BLOCKED, OTHER), else null"),this.registerFunction("words",e=>String(e).trim().split(/\s+/).filter(Boolean),1,"Splits string into words"),this.registerFunction("join",(e,n=", ")=>Array.isArray(e)?e.join(n):String(e),{min:1,max:2},"Joins array into string"),this.registerFunction("trim",e=>String(e).trim(),1,"Trims whitespace from both ends"),this.registerFunction("strip",e=>String(e).trim(),1,"Trims whitespace from both ends (alias for trim)"),this.registerFunction("trim_start",e=>String(e).trimStart(),1,"Trims leading whitespace"),this.registerFunction("lstrip",e=>String(e).trimStart(),1,"Trims leading whitespace (alias for trim_start)"),this.registerFunction("trim_end",e=>String(e).trimEnd(),1,"Trims trailing whitespace"),this.registerFunction("rstrip",e=>String(e).trimEnd(),1,"Trims trailing whitespace (alias for trim_end)"),this.registerFunction("to_upper",e=>String(e).toUpperCase(),1,"Converts string to uppercase"),this.registerFunction("upper",e=>String(e).toUpperCase(),1,"Converts string to uppercase"),this.registerFunction("to_lower",e=>String(e).toLowerCase(),1,"Converts string to lowercase"),this.registerFunction("lower",e=>String(e).toLowerCase(),1,"Converts string to lowercase"),this.registerFunction("upper_first",e=>{let n=String(e);return n.length===0?"":n.charAt(0).toUpperCase()+n.slice(1)},1,"Capitalizes first letter"),this.registerFunction("title_case",e=>String(e).replace(/\b\w/g,n=>n.toUpperCase()),1,"Converts string to Title Case"),this.registerFunction("contains",(e,n)=>Array.isArray(e)?e.includes(n):String(e).includes(String(n)),2,"Checks if string or array contains item"),this.registerFunction("includes",(e,n)=>Array.isArray(e)?e.includes(n):String(e).includes(String(n)),2,"Checks if string or array contains item"),this.registerFunction("starts_with",(e,n)=>String(e).startsWith(n),2,"Checks if string starts with prefix"),this.registerFunction("startswith",(e,n)=>String(e).startsWith(n),2,"Checks if string starts with prefix (alias for starts_with)"),this.registerFunction("ends_with",(e,n)=>String(e).endsWith(n),2,"Checks if string ends with suffix"),this.registerFunction("endswith",(e,n)=>String(e).endsWith(n),2,"Checks if string ends with suffix (alias for ends_with)"),this.registerFunction("index_of",(e,n,r)=>Array.isArray(e)?e.indexOf(n,r):String(e).indexOf(n,r),{min:2,max:3},"Finds substring or strictly equal array element index; -1 if absent"),this.registerFunction("last_index_of",(e,n)=>Array.isArray(e)?e.lastIndexOf(n):String(e).lastIndexOf(n),2,"Finds last substring or strictly equal array element index; -1 if absent"),this.registerFunction("count_matches",(e,n)=>n?String(e).split(n).length-1:0,2,"Counts occurrences of substring"),this.registerFunction("substr",(e,n,r)=>{let s=String(e),i=Math.trunc(Number(n))||0,o=i<0?Math.max(0,s.length+i):Math.min(s.length,i);if(r===void 0)return s.slice(o);let a=Math.max(0,Math.trunc(Number(r))||0);return s.slice(o,o+a)},{min:2,max:3},"Returns substring by end-relative start and optional length"),this.registerFunction("substring",(e,n,r)=>String(e).substring(n,r),{min:2,max:3},"Returns substring between indices"),this.registerFunction("slice",(e,n,r)=>e!=null?e.slice(n,r):"",{min:2,max:3},"Slices string or array"),this.registerFunction("char_at",(e,n)=>String(e).charAt(n),2,"Returns character at index"),this.registerFunction("char_code",(e,n=0)=>String(e).charCodeAt(n),{min:1,max:2},"Returns character code at index"),this.registerFunction("from_char_code",(...e)=>String.fromCharCode(...e),{min:0},"Returns string from character codes"),this.registerFunction("replace",(e,n,r)=>String(e).replace(n,r),3,"Replaces first occurrence"),this.registerFunction("replace_all",(e,n,r)=>String(e).replaceAll(n,r),3,"Replaces all occurrences"),this.registerFunction("repeat",(e,n)=>String(e).repeat(n),2,"Repeats string count times"),this.registerFunction("pad_start",(e,n,r=" ")=>String(e).padStart(n,r),{min:2,max:3},"Left-pads string"),this.registerFunction("pad_end",(e,n,r=" ")=>String(e).padEnd(n,r),{min:2,max:3},"Right-pads string"),this.registerFunction("reverse_str",e=>String(e).split("").reverse().join(""),1,"Reverses string"),this.registerFunction("is_empty",e=>e==null?!0:typeof e=="string"?e.trim().length===0:Array.isArray(e)?e.length===0:typeof e=="object"?Object.keys(e).length===0:!1,1,"Checks if string, array, or map is empty"),this.registerFunction("is_digit",e=>/^\d+$/.test(String(e)),1,"Checks if string contains only digits"),this.registerFunction("is_alpha",e=>/^[a-zA-Z]+$/.test(String(e)),1,"Checks if string contains only letters"),this.registerFunction("is_alnum",e=>/^[a-zA-Z0-9]+$/.test(String(e)),1,"Checks if string contains only letters and digits"),this.registerFunction("is_array",e=>Array.isArray(e),1,"Checks if value is an array"),this.registerFunction("is_string",e=>typeof e=="string",1,"Checks if value is a string"),this.registerFunction("is_number",e=>typeof e=="number",1,"Checks if value is a number"),this.registerFunction("is_map",e=>e!==null&&typeof e=="object"&&!Array.isArray(e),1,"Checks if value is a map/object"),this.registerFunction("is_function",e=>e instanceof Un,1,"Checks if value is a first-class function reference"),this.registerFunction("shell_quote",e=>Uu(e),1,"Quotes string safely for POSIX shell command execution",!0),this.registerFunction("sprintf",(e,...n)=>xa(e,n),{min:1},"Formats %s/%d/%f/%% with bounded width, alignment and precision; use format() for {} brace syntax"),this.registerFunction("printf",(e,...n)=>xa(e,n,"printf"),{min:1},"Formats and prints %s, %d, %f and %% using the sprintf width and precision rules",!0),this.registerFunction("format",(e,...n)=>{let r=String(e),s=n.length===1&&typeof n[0]=="object"&&n[0]!==null&&!Array.isArray(n[0])?n[0]:void 0,i=0,o="",a=l=>typeof l=="object"&&l!==null?JSON.stringify(l):String(l);for(let l=0;l<r.length;){let c=r[l];if(c==="{"&&r[l+1]==="{"){o+="{",l+=2;continue}if(c==="}"&&r[l+1]==="}"){o+="}",l+=2;continue}if(c!=="{"){o+=c,l+=1;continue}let d=r.indexOf("}",l+1);if(d<0){o+=c,l+=1;continue}let u=r.slice(l+1,d);if(u==="")o+=i<n.length?a(n[i++]):"{}";else if(/^\d+$/.test(u)){let m=Number(u);o+=m<n.length?a(n[m]):`{${u}}`}else s&&/^[a-zA-Z0-9_]+$/.test(u)&&Object.hasOwn(s,u)?o+=a(s[u]):o+=`{${u}}`;l=d+1}return o},{min:1},"Formats string with arguments, supporting {{ and }} brace escapes, positional {0}, auto {}, and {key} map substitution"),this.registerFunction("regex_test",(e,n,r="")=>Tr(n,r).test(String(e)),{min:2,max:3},"Tests a JavaScript regular expression against text"),this.registerFunction("regex_match",iw,{min:2,max:3},"Returns first full match and captures; g retains first-match shape, y is rejected"),this.registerFunction("regex_find_all",ow,{min:2,max:3},"Returns capture arrays with Unicode-aware zero-width progress; y is rejected"),this.registerFunction("regex_replace",(e,n,r,s="")=>String(e).replace(Tr(n,s),r),{min:3,max:4},"Replaces matches using JavaScript regex replacement semantics"),this.registerFunction("split_regex",(e,n,r="")=>String(e).split(Tr(n,r)),{min:2,max:3},"Splits text at regular expression matches"),this.registerFunction("len",e=>typeof e=="string"||Array.isArray(e)?e.length:e&&typeof e=="object"?Object.keys(e).length:0,1,"Returns length of string, array, or object"),this.registerFunction("length",e=>this.hostFunctions.get("len").fn(e),1,"Returns length of string, array, or object (alias for len)"),this.registerFunction("range",(e,n,r=1)=>{let s=n===void 0?0:e,i=n===void 0?e:n,o=[];if(r>0)for(let a=s;a<i;a+=r)o.push(a);else if(r<0)for(let a=s;a>i;a+=r)o.push(a);return o},{min:1,max:3},"Generates an array of numbers"),this.registerFunction("abs",e=>Math.abs(e),1,"Absolute value"),this.registerFunction("min",(...e)=>{let n=e.length===1&&Array.isArray(e[0])?e[0]:e;return Math.min(...n)},{min:0},"Minimum value"),this.registerFunction("max",(...e)=>{let n=e.length===1&&Array.isArray(e[0])?e[0]:e;return Math.max(...n)},{min:0},"Maximum value"),this.registerFunction("floor",e=>Math.floor(e),1,"Floor value"),this.registerFunction("ceil",e=>Math.ceil(e),1,"Ceil value"),this.registerFunction("round",e=>Math.round(e),1,"Round value"),this.registerFunction("sqrt",e=>Math.sqrt(e),1,"Square root"),this.registerFunction("pow",(e,n)=>Math.pow(e,n),2,"Power calculation"),this.registerFunction("random",()=>Math.random(),0,"Random float between 0 and 1"),this.registerFunction("sha256",e=>{if(typeof e!="string")throw new Error("sha256: expected a string");return ew("sha256").update(e,"utf8").digest("hex")},1,"Returns lowercase SHA-256 of UTF-8 text; strings only"),this.registerFunction("now",()=>Date.now(),0,"Returns current epoch in ms"),this.registerFunction("timestamp",()=>Math.floor(Date.now()/1e3),0,"Returns current Unix epoch in whole seconds"),this.registerFunction("date",e=>new Date(e??Date.now()).toISOString(),{min:0,max:1},"Returns an ISO 8601 date-time string for now, or for a given epoch-ms timestamp"),this.registerFunction("strftime",(e,n)=>Pu(e,n),2,"Formats local time: epoch milliseconds first, format string second"),this.registerFunction("date_format",(e,n)=>Pu(e,n),2,"Alias for strftime with timestamp-first local-time formatting"),this.registerFunction("coalesce",(...e)=>{for(let n of e)if(n!=null)return n;return null},{min:0},"Returns the first non-null/non-undefined argument, else null"),this.registerFunction("if_null",(e,n)=>e??n,2,"Returns fallback if value is null/undefined, else value"),this.registerFunction("default_to",(e,n)=>e??n,2,"Returns fallback if value is null/undefined, else value (alias for if_null)"),this.registerFunction("if_else",(e,n,r)=>e?n:r,3,"Eager compatibility helper: arguments evaluate eagerly; use condition ? thenValue : elseValue for lazy selection"),this.registerFunction("str",e=>Fs(e),1,"Converts lists and maps to compact JSON; scalars to normal text"),this.registerFunction("to_string",e=>Fs(e),1,"Alias for str: converts lists and maps to compact JSON"),this.registerFunction("num",e=>Number(e),1,"Converts value to number"),this.registerFunction("type",e=>e===null?"null":Array.isArray(e)?"array":e instanceof Un?"function":typeof e,1,"Returns runtime type of value"),this.registerFunction("assert",(e,n="Assertion failed")=>{if(!e)throw new Error(n);return!0},{min:1,max:2},"Throws error if condition is falsy")}registerFunction(e,n,r,s,i=!1,o=!1){let a=typeof s=="string"?s:s?.description,l=typeof s=="object"?!!s.isDefault:i,c=typeof s=="object"?!!s.isContainerMutation:o,d=typeof s=="object"?s.doc:void 0,u=typeof s=="object"?!!s.allowOverwrite:!1,m=typeof s=="object"&&s.module?s.module:this.currentRegisteringModule,p=this.functionOriginModule.get(e);if(p&&p!==m&&!u)throw new Error(`Cannot register function '${e}' from module '${m}': already registered by module '${p}'`);this.functionOriginModule.set(e,m);let h=typeof s=="object"?{returnsResource:s.returnsResource===!0||void 0,usesResource:s.usesResource===!0||void 0,closesResource:s.closesResource===!0||void 0}:{};if(this.hostFunctions.set(e,{fn:n,arity:r,description:a,isDefault:l,isContainerMutation:c,doc:d,params:typeof s=="object"?s.params:void 0,...h}),d)this.functionDocs.set(e,{...d,module:d.module??m});else if(!this.functionDocs.has(e)){let _=typeof r=="number"?r:r?.min??0,y=typeof r=="number"?r:r?.max,f=Array.from({length:y??_},(w,g)=>(g>=_?"[":"")+"arg"+(g+1)+(g>=_?"]":""));y===void 0&&f.push("...args"),this.functionDocs.set(e,{name:e,module:m,category:"Uncategorized",signature:e+"("+f.join(", ")+")",description:a??"Host function "+e})}return this}getFunctionOriginModule(e){return this.functionOriginModule.get(e)}initialGlobals=new Map;setGlobal(e,n){if(e==="PROPS")throw Error("PROPS is a reserved read-only map binding");return this.initialGlobals.set(e,n),this}getGlobal(e){return this.initialGlobals.get(e)}registerHostModule(e){return this.hostCatalog.set(e.name,e),this}getHostModule(e){return this.hostCatalog.get(e)}registerBuiltinProvider(e){if(this.builtinProviders.has(e.name))throw new Error(`Duplicate built-in provider '${e.name}'`);return this.builtinProviders.set(e.name,e),this}getBuiltinProviders(){return[...this.builtinProviders.values()]}async scanAndCheckAsync(e,n={}){try{let r=n.compiledSource??await mw(e,{...n,builtinProviderNames:[...this.builtinProviders.keys(),...n.builtinProviderNames??[]]});return{...this.scanAndCheck(e,{...n,compiledSource:r}),compiledSource:r}}catch(r){let s=r;return{ast:null,hasConcurrency:!1,diagnostics:[{severity:"error",message:s.message,line:s.line??1,column:s.column??1,file:s.file??n.file}]}}}scanAndCheck(e,n={}){try{let{program:r,diagnostics:s,hostImports:i,packages:o}=n.compiledSource??uw(e,{...n,builtinProviderNames:[...this.builtinProviders.keys(),...n.builtinProviderNames??[]]}),a=new Map(this.hostFunctions),l=[],c=new Map,d=new Map,u=new Set,m=[],p={known:[],closedTables:[],removedGlobals:{}};for(let f of[...[...this.builtinProviders.keys(),...this.hostCatalog.keys()].map(w=>({name:w,line:1,column:1,file:n.file})),...i]){if(l.some(E=>E.name===f.name))continue;let w;try{w=this.builtinProviders.get(f.name)??this.hostCatalog.get(f.name)??(n.resolveHostModule??this.hostResolver)?.(f.name)}catch(E){let b=cw(E);throw new M(`Cannot load module '${f.name}': ${b}. Install with npm install ${f.name} or set LMSCRIPT_MODULES.`,f.line,f.column,"CHECKER",f.file)}if(!w)throw new M(`Missing host module '${f.name}'. Install with npm install ${f.name} or set LMSCRIPT_MODULES; for a file use './${f.name}.lms'.`,f.line,f.column,"CHECKER",f.file);let g;try{let E=w.declarations,b=E?.functions,C=E?.globals;Array.isArray(b)&&Array.isArray(C)&&(g={functions:b.map(I=>({...I})),globals:C.map(I=>({...I})),properties:E.properties?{known:[...E.properties.known],closedTables:[...E.properties.closedTables??[]],removedGlobals:{...E.properties.removedGlobals}}:void 0})}catch{}if(w.name!==f.name||!g||typeof w.activate!="function")throw new M(`Invalid declarations for module '${f.name}'`,f.line,f.column,"CHECKER",f.file);for(let E of g.functions){let b=typeof E.arity=="number"?{min:E.arity,max:E.arity}:E.arity;if(typeof E.name!="string"||!/^[a-zA-Z_]\w*$/.test(E.name)||Object.hasOwn(Us,E.name)||!b||!Number.isSafeInteger(b.min)||b.min<0||b.max!==void 0&&(!Number.isSafeInteger(b.max)||b.max<b.min))throw new M(`Invalid function declaration in module '${f.name}'`,f.line,f.column,"CHECKER",f.file);let C=d.get(E.name);if(E.override===!0&&a.has(E.name)&&!["prompt_human","run_script"].includes(E.name))throw new M(`Module '${f.name}' cannot override ${C===void 0?`core function '${E.name}'`:`function '${E.name}' declared by module '${C}'`}; permitted overrides: prompt_human, run_script`,f.line,f.column,"CHECKER",f.file);if(a.has(E.name)&&!(E.override===!0&&a.get(E.name)?.isDefault))throw new M(`Module function collision: '${E.name}' in module '${f.name}'${C===void 0?"":` is already declared by module '${C}'`}`,f.line,f.column,"CHECKER",f.file);a.set(E.name,{arity:E.arity,fn:()=>{throw new Error("Module not activated")},doc:E.doc,params:E.params,returnsResource:E.returnsResource===!0||void 0}),d.set(E.name,f.name)}for(let E of g.globals){if(!/^[a-zA-Z_]\w*$/.test(E.name)||Object.hasOwn(Us,E.name)||u.has(E.name)||["PROPS","Directory","NonInteractive"].includes(E.name)||this.initialGlobals.has(E.name)||n.globals?.includes(E.name))throw new M(`Module global collision or invalid name: '${E.name}'`,f.line,f.column,"CHECKER",f.file);u.add(E.name),this.builtinProviders.has(f.name)&&m.push(E.name)}g.properties&&(p.known=[...p.known,...g.properties.known],p.closedTables=[...p.closedTables??[],...g.properties.closedTables??[]],p.removedGlobals={...p.removedGlobals,...g.properties.removedGlobals}),l.push(w),c.set(w,g)}let h=[...this.initialGlobals.keys(),...n.globals||[],...u,"PROPS","Directory","NonInteractive"],_=new Ta(a,{...n,globals:h,builtinGlobals:m,propertyDeclarations:p,sourcePackages:o}),y=[...s,..._.check(r)];for(let f of y)if(f.message.startsWith("Call to undefined function"))for(let w of this.hostCatalog.values())for(let g of w.declarations.functions)f.message.includes(`'${g.name}'`)&&(f.message+=`; provided by module '${w.name}': add import "${w.name}";`);return{ast:r,diagnostics:y,hasConcurrency:_.hasConcurrency,hostModules:l,hostDeclarations:c,usedGlobals:[..._.usedGlobals],usedProperties:_.usedProperties}}catch(r){return r instanceof M?{ast:null,diagnostics:[{message:r.message,line:r.line,column:r.column,severity:"error",file:r.file||n.file}],hasConcurrency:!1}:{ast:null,diagnostics:[{message:r instanceof Error?r.message:String(r),line:1,column:1,severity:"error",file:n.file}],hasConcurrency:!1}}}installBuiltinStubs(e,n,r,s,i){let o=n.hostDeclarations.get(e);for(let a of o.globals)r.globals.set(a.name,new Ra(()=>i(a.name)));for(let a of o.functions)r.functions.set(a.name,{fn:s(a.name),arity:a.arity,doc:a.doc,params:a.params,...Mu(a)})}activationContext(e,n,r){return{cwd:n.hostContext?.cwd??process.cwd(),env:Object.freeze({...n.hostContext?.env??process.env}),signal:n.signal,propertyStore:n.propertyStore,usedGlobals:(e.usedGlobals??[]).filter(s=>(e.hostDeclarations?.get(r)??r.declarations).globals.some(i=>i.name===s))}}bindModule(e,n,r,s){if(!n||typeof n.dispose!="function")throw new Error(`Module '${e.name}' did not return a disposable`);let i=r.hostDeclarations?.get(e)??e.declarations;if(i.properties){if(!n.loadProperties)throw Error(`Provider '${e.name}' did not supply properties`);s.properties?.addSource(e.name,()=>n.loadProperties(),i.properties.known)}for(let o of i.functions){if(typeof n.functions?.[o.name]!="function")throw new Error(`Module '${e.name}' did not bind '${o.name}'`);s.functions.set(o.name,{fn:n.functions[o.name],arity:o.arity,doc:o.doc,params:o.params,...Mu(o)})}for(let o of i.globals)if(Object.hasOwn(n.globals??{},o.name))s.globals.set(o.name,n.globals[o.name]);else if(r.usedGlobals?.includes(o.name))throw new Error(`Module '${e.name}' did not provide global '${o.name}'`)}moduleFailure(e,n,r){return{success:!1,output:[],diagnostics:[...n.diagnostics,{severity:"error",message:e instanceof Error?e.message:String(e),line:1,column:1,file:r.file}]}}collectModuleErrors(e,n){for(let r of e)if(r.getRecordedErrors!==void 0)try{let s=r.getRecordedErrors();if(!Array.isArray(s))throw new Error("getRecordedErrors must return an array");n.errors=[...n.errors??[],...s.map(i=>typeof i=="string"?i:JSON.stringify(i)??String(i))]}catch(s){n.diagnostics.push({severity:"warning",message:`Host module error collection failed: ${s instanceof Error?s.message:String(s)}`,line:1,column:1})}}cleanupWarning(e,n){n.diagnostics.push({severity:"warning",message:`Host module cleanup failed: ${e instanceof Error?e.message:String(e)}`,line:1,column:1})}run(e,n={}){this.outputLogs=[],this.lastRecordedErrors=[];let r=this.scanAndCheck(e,n);n={...n,propertyStore:n.propertyStore??new Xs(n.hostContext?.cwd??process.cwd(),n.hostContext?.env??process.env)};let s=n.propertyStore,i={functions:new Map(this.hostFunctions),globals:new Map(this.initialGlobals),properties:s};i.globals.set("PROPS",s.view()),i.globals.set("Directory",s.get("Directory")),i.globals.set("NonInteractive",s.get("NonInteractive"));let a={expand:(d,u={})=>{if(!u||typeof u!="object"||Array.isArray(u)||![Object.prototype,null].includes(Object.getPrototypeOf(u)))throw Error("expand: vars must be a map");let m=i.globals.get("ARGV")??[];return Ms(d,p=>p.kind==="property"?s.get(p.key):p.kind==="argument"?Array.isArray(m)&&Object.hasOwn(m,p.index)?m[p.index]:void 0:Object.hasOwn(u,p.name)?De(u,p.name):void 0,Fs)},get_property:(d,...u)=>s.get(d,...u),has_property:d=>s.has(d),get_properties:d=>s.copy(d),set_property:(d,u)=>s.set(d,u)};for(let[d,u]of Object.entries(a))i.functions.set(d,{...i.functions.get(d),fn:u});if(!r.ast||r.diagnostics.some(d=>d.severity==="error")||r.hasConcurrency)return this.executeSync(e,n,r,i);let l=[],c;try{Fe(n.signal);for(let d of r.hostModules??[]){if(this.builtinProviders.has(d.name)){let m,p=()=>{if(m)return m;Fe(n.signal);let h=d.activate(this.activationContext(r,n,d));if(jn(h))throw h.then(_=>_.dispose()).catch(()=>{}),new Error(`Module '${d.name}' requires runAsync for activation`);if(!h||typeof h.dispose!="function")throw new Error(`Module '${d.name}' did not return a disposable`);return m=h,l.push(m),this.bindModule(d,m,r,i),m};this.installBuiltinStubs(d,r,i,h=>(..._)=>p().functions[h](..._),h=>(p(),i.globals.get(h))),r.usedProperties&&r.hostDeclarations?.get(d)?.properties&&p();continue}let u=d.activate(this.activationContext(r,n,d));if(jn(u))throw u.then(m=>m.dispose()).catch(()=>{}),new Error(`Module '${d.name}' requires runAsync for activation`);l.push(u),this.bindModule(d,u,r,i),Fe(n.signal)}c=this.executeSync(e,n,r,i),n.signal?.aborted&&(c={...c,success:!1,diagnostics:c.diagnostics.some(d=>d.severity==="error"&&d.message==="Execution aborted")?c.diagnostics:[...c.diagnostics,{severity:"error",message:"Execution aborted",line:1,column:1}]})}catch(d){c=this.moduleFailure(d,r,n)}this.collectModuleErrors(l,c);for(let d of l.reverse())try{let u=d.dispose();if(jn(u))throw u.catch(()=>{}),new Error("Async disposal requires runAsync")}catch(u){this.cleanupWarning(u,c)}return c}async runAsync(e,n={}){n={...n,importCache:n.importCache??new Map};let r=n.preparedCheck??await this.scanAndCheckAsync(e,n);this.outputLogs=[],this.lastRecordedErrors=[];let s=r;n={...n,propertyStore:n.propertyStore??new Xs(n.hostContext?.cwd??process.cwd(),n.hostContext?.env??process.env)};let i=n.propertyStore,o={functions:new Map(this.hostFunctions),globals:new Map(this.initialGlobals),properties:i};o.globals.set("PROPS",i.view()),o.globals.set("Directory",i.get("Directory")),o.globals.set("NonInteractive",i.get("NonInteractive"));let l={expand:(u,m={})=>{if(!m||typeof m!="object"||Array.isArray(m)||![Object.prototype,null].includes(Object.getPrototypeOf(m)))throw Error("expand: vars must be a map");let p=o.globals.get("ARGV")??[];return Ms(u,h=>h.kind==="property"?i.get(h.key):h.kind==="argument"?Array.isArray(p)&&Object.hasOwn(p,h.index)?p[h.index]:void 0:Object.hasOwn(m,h.name)?De(m,h.name):void 0,Fs)},get_property:(u,...m)=>i.get(u,...m),has_property:u=>i.has(u),get_properties:u=>i.copy(u),set_property:(u,m)=>i.set(u,m)};for(let[u,m]of Object.entries(l))o.functions.set(u,{...o.functions.get(u),fn:m});if(!s.ast||s.diagnostics.some(u=>u.severity==="error"))return this.executeAsync(e,n,s,o);let c=[],d;try{Fe(n.signal);for(let u of s.hostModules??[]){if(this.builtinProviders.has(u.name)){let p,h=()=>p??=Promise.resolve().then(async()=>{Fe(n.signal);let _=await u.activate(this.activationContext(s,n,u));if(!_||typeof _.dispose!="function")throw new Error(`Module '${u.name}' did not return a disposable`);return c.push(_),this.bindModule(u,_,s,o),Fe(n.signal),_});this.installBuiltinStubs(u,s,o,_=>async(...y)=>(await h()).functions[_](...y),async _=>(await h(),o.globals.get(_))),s.usedProperties&&s.hostDeclarations?.get(u)?.properties&&await h();continue}let m=await u.activate(this.activationContext(s,n,u));c.push(m),this.bindModule(u,m,s,o),Fe(n.signal)}d=await this.executeAsync(e,n,s,o),n.signal?.aborted&&(d={...d,success:!1,diagnostics:d.diagnostics.some(u=>u.severity==="error"&&u.message==="Execution aborted")?d.diagnostics:[...d.diagnostics,{severity:"error",message:"Execution aborted",line:1,column:1}]})}catch(u){d=this.moduleFailure(u,s,n)}this.collectModuleErrors(c,d);for(let u of c.reverse())try{await u.dispose()}catch(m){this.cleanupWarning(m,d)}return d}executeSync(e,n,r,s){let i=[],{ast:o,diagnostics:a,hasConcurrency:l}=r;if(a.filter(m=>m.severity==="error").length>0||!o)return this.outputLogs=i,{success:!1,diagnostics:a,output:i};if(l)return this.outputLogs=i,{success:!1,diagnostics:[...a,{message:"Concurrency constructs ('parallel', 'sync') require asynchronous execution via engine.runAsync()",line:1,column:1,severity:"error",file:n.file}],output:i};let d,u;try{d=new Ks(s.functions,h=>{i.push(h),n.stdout?.(h)},!1,s.globals,n.stderr,this.promptHumanConfig),d.abortSignal=n.signal,u=this.trackResourceRun(d.resources);let m=d.evaluateProgram(o);this.outputLogs=[...i];let p=d.getRecordedErrors();return this.lastRecordedErrors=p,{success:!0,value:m,diagnostics:a,output:i,errors:p,resourceRun:u}}catch(m){let p=d?d.getRecordedErrors():[];if(this.lastRecordedErrors=p,m instanceof pt||m?.name==="LMScriptExit"||m?.isControlFlow){this.outputLogs=[...i];let f=typeof m.exitCode=="number"?m.exitCode:0;return{success:f===0,value:f,exitCode:f,diagnostics:a,output:i,errors:p,resourceRun:u}}let h=m instanceof M?m.line:1,_=m instanceof M?m.column:1,y=m instanceof M&&m.file||n.file;return this.outputLogs=[...i],{success:!1,diagnostics:[...a,{message:m?.message||String(m),line:h,column:_,severity:"error",file:y}],output:i,errors:p,resourceRun:u}}}async executeAsync(e,n,r,s){let i=[],{ast:o,diagnostics:a}=r;if(a.filter(u=>u.severity==="error").length>0||!o)return this.outputLogs=i,this.lastRecordedErrors=[],{success:!1,diagnostics:a,output:i,errors:[]};let c,d;try{c=new Ks(s.functions,p=>{i.push(p),n.stdout?.(p)},!0,s.globals,n.stderr,this.promptHumanConfig),c.abortSignal=n.signal,d=this.trackResourceRun(c.resources);let u=await c.evaluateProgramAsync(o);this.outputLogs=[...i];let m=c.getRecordedErrors();return this.lastRecordedErrors=m,{success:!0,value:u,diagnostics:a,output:i,errors:m,resourceRun:d}}catch(u){let m=c?c.getRecordedErrors():[];if(this.lastRecordedErrors=m,u instanceof pt||u?.name==="LMScriptExit"||u?.isControlFlow){this.outputLogs=[...i];let y=typeof u.exitCode=="number"?u.exitCode:0;return{success:y===0,value:y,exitCode:y,diagnostics:a,output:i,errors:m,resourceRun:d}}let p=u instanceof M?u.line:1,h=u instanceof M?u.column:1,_=u instanceof M&&u.file||n.file;return this.outputLogs=[...i],{success:!1,diagnostics:[...a,{message:u?.message||String(u),line:p,column:h,severity:"error",file:_}],output:i,errors:m,resourceRun:d}}}lastRecordedErrors=[];resourceRuns=new Map;trackResourceRun(e){for(this.resourceRuns.set(e.token,e);this.resourceRuns.size>64;)this.resourceRuns.delete(this.resourceRuns.keys().next().value);return e.token}inspectResources(e){return this.resourceRuns.get(e)?.snapshot()??[]}getRecordedErrors(){return[...this.lastRecordedErrors]}hasFunction(e){return this.hostFunctions.has(e)}getFunctionMetadata(e){let n=this.hostFunctions.get(e);return n?{arity:n.arity,description:n.description}:void 0}getRegisteredFunctions(){return Array.from(this.hostFunctions.keys())}};pa=le.basename(Aa(import.meta.url));(pa==="lmscript.ts"||pa==="lmscript.js"||pa==="lmscript")&&process.argv[1]&&$.existsSync(process.argv[1])&&$.realpathSync(Aa(import.meta.url))===$.realpathSync(le.resolve(process.argv[1]))&&vw()});var jL,qt,ww,Tw,bw,Ma,Pa,Da,fe,Oa,ft,Ys,kr,Qs,Zs,La,Yu,Qu,Zu,Rr,em,We,Gt=O(()=>{"use strict";jL=1,qt=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))qt(e);Object.freeze(t)}return t},ww=qt(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal"]),Tw=qt({status:"string",error:"string|null",code:"ErrorCode?"}),bw=qt(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),Ma=qt(["Provider1.Provider","Provider1.Model1","Provider1.Model2","Provider1.Model3","Provider2.Provider","Provider2.Model1","Provider2.Model2","Provider2.Model3","Provider3.Provider","Provider3.Model1","Provider3.Model2","Provider3.Model3"]),Pa=qt(["Provider1","Provider2","Provider3"]),Da=qt({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),fe={name:"ctx",type:"context"},Oa={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},ft={name:"teamfile",type:"string"},Ys={name:"alias",type:"string"},kr={name:"prompt",type:"string"},Qs={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"alias",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"},{name:"sessiondir",type:"string"},{name:"sessionid",type:"string"}]},Zs=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],La={name:"options",type:"map",optional:!0,keys:Zs},Yu={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},Qu={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},Zu={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},Rr={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},em={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},We=qt([{name:"resolveProfilePath",implemented:!0,params:[fe,Oa],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[fe,Oa],statuses:["ok","error"],results:{error:"string|null",profile:"{path,raw,config}",values:"{Provider1..3,Model1..3,Directory,NonInteractive}",path:"string?",line:"number?",column:"number?"},effects:["file-read"],summary:"Read and validate the complete init profile without discovery or writes."},{name:"profileValues",implemented:!0,params:[{name:"config",type:"map"}],statuses:["ok","error"],results:{error:"string|null",Provider1:"string",Provider2:"string",Provider3:"string",Model1:"string",Model2:"string",Model3:"string"},effects:[],summary:"Validate and map slots to first-model environment values."},{name:"readPrompts",implemented:!0,params:[fe,{name:"path",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"single",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",prompts:"string[]"},effects:["file-read"],summary:"Read prompt records without exiting the caller.",scriptBinding:{name:"lm_read_prompts",params:[{name:"batchfile",type:"string"},{name:"single",type:"boolean",optional:!0}]}},{name:"listMembers",implemented:!0,params:[fe,ft],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[ft]}},{name:"resolveMember",implemented:!0,params:[fe,ft,Ys],statuses:["ok","not_found","error"],results:{error:"string|null",member:"Member",isLead:"boolean",teamfile:"string"},effects:["file-read","db"],summary:"Resolve a team member with an explicit missing outcome.",scriptBinding:{name:"lm_member",params:[ft,Ys]}},{name:"lintTeam",implemented:!0,params:[fe,ft],statuses:["ok","error"],results:{error:"string|null",errors:"list",warnings:"list",counts:"map"},effects:["file-read","db"],summary:"Return structured lint findings.",scriptBinding:{name:"lm_lint",params:[ft]}},{name:"seedTeam",implemented:!0,params:[fe,ft,Yu],statuses:["ok","error"],results:{error:"string|null",seeded:"SeededMember[]"},effects:["provider","db","file-write"],summary:"Seed a team with explicit optional preambles.",scriptBinding:{name:"lm_seed",params:[ft,Yu]}},{name:"promptAgent",implemented:!0,params:[fe,Qs,kr,La],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...em,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[Qs,kr,La]}},{name:"promptMember",implemented:!0,params:[fe,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"prompt",type:"string",required:!0},{name:"messageType",type:"string"},...Zs]}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn a team member through native team admission.",scriptBinding:{name:"lm_prompt",params:[ft,Ys,kr,{name:"options",type:"map",optional:!0,keys:[...Zs,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[fe,{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"workspace",type:"string"},{name:"all",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",sessions:"Session[]"},effects:["file-read"],summary:"List native sessions in an explicit workspace.",scriptBinding:{name:"lm_session_list",params:[{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"sessiondir",type:"string"},{name:"all",type:"boolean"}]}]}},{name:"deleteSession",implemented:!0,params:[fe,Rr,Zu],statuses:["deleted","not_found","busy","error"],results:{error:"string|null"},effects:["provider","file-write"],summary:"Delete a session only with explicit force admission.",scriptBinding:{name:"lm_session_delete",params:[Qs,{...Zu,optional:!0}]}},{name:"getSession",implemented:!0,params:[fe,Rr],statuses:["ok","not_found","error"],results:{error:"string|null",messages:"{role,content}[]"},effects:["provider","file-read"],summary:"Read native session messages."},{name:"reserveSession",implemented:!0,params:[fe,Rr],statuses:["ok","busy","error"],results:{error:"string|null",reservation:"SessionReservation"},effects:[],summary:"Reserve context-local handoff admission and return a capability."},{name:"releaseSession",implemented:!0,params:[fe,Rr],statuses:["ok","error"],results:{error:"string|null"},effects:[],summary:"Release context-local handoff admission."},{name:"openTeamBatch",implemented:!0,params:[fe,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"label",type:"string",required:!0},{name:"promptCount",type:"number",required:!0},{name:"legacy",type:"boolean"},...Zs]}],statuses:["ok","busy","error"],results:{error:"string|null",batch:"opaque context-bound BatchRef"},effects:["provider","db"],summary:"Open a managed team batch; member-map composition remains language-owned."},{name:"batchTurn",implemented:!0,params:[fe,{name:"batch",type:"BatchRef"},kr,{name:"index",type:"number"},{name:"total",type:"number"}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn an owned live batch reference."},{name:"closeBatch",implemented:!0,params:[fe,{name:"batch",type:"BatchRef"},{name:"options",type:"map",keys:[{name:"status",type:"string",required:!0,values:["done","error","cancelled"]},{name:"error",type:"string"}]}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close an owned batch."},{name:"readRatelimits",implemented:!0,params:[fe,Qu],statuses:["ok","error"],results:{error:"string|null",readings:"list"},effects:["file-read","network"],summary:"Read provider rate-limit data.",scriptBinding:{name:"lm_ratelimit_readings",params:[Qu]}},{name:"openTerminal",implemented:!0,params:[fe,{name:"target",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0}]},{name:"streams",type:"map",keys:[{name:"stdin",type:"stream",required:!0},{name:"stdout",type:"stream",required:!0},{name:"stderr",type:"stream",required:!0}]}],statuses:["ok","error"],results:{error:"string|null",code:"number|null",signal:"string|null"},effects:["provider","db","tty"],summary:"Open a native terminal with caller-supplied streams.",scriptBinding:{name:"lm_terminal",params:[ft,Ys]}},{name:"sessionAdmission",implemented:!0,params:[fe,Rr],statuses:["ok","busy","error"],results:{error:"string|null",busyReason:"turn|handoff?"},effects:[],summary:"Query context-local session admission without exposing mutable sets."},{name:"promptReservedAgent",implemented:!0,params:[fe,{name:"reservation",type:"SessionReservation"},Qs,kr,La],statuses:["ok","busy","stalled","empty","error"],results:{...em,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"inspectBatch",implemented:!0,params:[fe,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null",id:"string",closed:"boolean",member:"Member",rootId:"number|null"},effects:[],summary:"Read batch metadata without exposing native transports or lease capabilities."},{name:"loadProperties",implemented:!0,params:[fe,Oa],statuses:["ok","error"],results:{error:"string|null",path:"string",properties:"map",flat:"map",line:"number?",column:"number?"},effects:["file-read"],summary:"Read the complete hierarchical init.toml properties document through the canonical reader."}])});var tm,nm=O(()=>{"use strict";tm=[{name:"lm_batch_open",category:"lmctl Automation",signature:"lm_batch_open(teamfile, alias, batchfile, options = {}); lm_batch_open(member, options = {})",description:"Opens a managed teamfile batch, or a file-free member-map batch using sequential native agent turns. The map form retains session identity without team leases, bundle optimization, or team tracking.",parameters:[{name:"teamfile",type:"string|map",description:"Teamfile path for the legacy form, or a member map for the two-argument form"},{name:"alias",type:"string",description:"Team member alias to target"},{name:"batchfile",type:"string",description:"Legacy form only: source label for tracking; not read by this function"},{name:"options",type:"map",description:"(optional) Teamfile form: promptCount, legacy. Member-map form: permissionMode, idleTimeoutMs, as for lm_agent"}],returns:{type:"map",description:"Batch handle object or null on error"},example:'handle = lm_batch_open("team.lmctl", "reviewer", "prompts.txt", { promptCount: 5 });'},{name:"lm_batch_turn",category:"lmctl Automation",signature:"lm_batch_turn(handle, prompt, index, total)",description:"Executes a single prompt turn within an active batch session, handling heartbeats and status reporting.",parameters:[{name:"handle",type:"map",description:"Active batch handle returned from lm_batch_open"},{name:"prompt",type:"string",description:"Prompt text to execute"},{name:"index",type:"number",description:"1-based prompt index"},{name:"total",type:"number",description:"Total number of prompts in batch"}],returns:{type:"map",description:"{ status: 'ok'|'busy'|'stalled'|'error', reply: string, error: string|null }"},example:'turn = lm_batch_turn(handle, "Summarize this diff", 1, 5);'},{name:"lm_batch_close",category:"lmctl Automation",signature:'lm_batch_close(handle, status = "done", error = null)',description:"Closes an active batch session and finalizes tracked invocations and bundle leases.",parameters:[{name:"handle",type:"map",description:"Active batch handle to close"},{name:"status",type:"string",description:"(optional) Terminal status: 'done', 'cancelled', or 'error' (default: 'done')"},{name:"error",type:"string",description:"(optional) Error message if batch failed"}],returns:{type:"bool",description:"true if successfully closed, false otherwise"},example:'lm_batch_close(handle, "done");'},{name:"lm_prompt",category:"lmctl Automation",signature:"lm_prompt(teamfile, alias, prompt, options = {})",description:"Sends a direct one-shot prompt to a team member and returns the reply.",parameters:[{name:"teamfile",type:"string",description:"Path to team configuration file"},{name:"alias",type:"string",description:"Target team member alias"},{name:"prompt",type:"string",description:"Prompt text"},{name:"options",type:"map",description:"(optional) Execution options: permissionMode, idleTimeoutMs, messageType"}],returns:{type:"map",description:"{ status, reply, error, message_id, team_chat_log_id }"},example:'res = lm_prompt("team.lmctl", "coder", "Hello agent");'},{name:"lm_agent",category:"lmctl Automation",signature:"lm_agent(member, prompt, options = {})",description:"Prompts a provider directly without a teamfile. Creates a session when sessionid is absent and writes its ID back into member for subsequent turns or explicit persistence.",parameters:[{name:"member",type:"map",description:"Required provider; optional alias, model, effort, sessiondir (default cwd), sessionid. Updated in place with sessionid."},{name:"prompt",type:"string",description:"Prompt text"},{name:"options",type:"map",description:"(optional) permissionMode (yolo or plan), idleTimeoutMs. Fresh agy/pi/dsh sessions require a preliminary seed in yolo mode."}],returns:{type:"map",description:"{ status, reply, error, message_id: null, team_chat_log_id: null }; no team mailbox or log is created"},example:'agent = { provider: "codex" }; res = lm_agent(agent, "Summarize this repository");'},{name:"lm_session_list",category:"lmctl Automation",signature:"lm_session_list(options = {})",description:"Lists native sessions in the current workspace by default. Options: provider, sessiondir, all.",returns:{type:"array",description:"Session maps with provider, sessionid, sessiondir, and modifiedAt."},example:'sessions = lm_session_list({ provider: "codex" });'},{name:"lm_session_delete",category:"lmctl Automation",signature:"lm_session_delete(member, options = {})",description:"Deletes a native session by provider and sessionid. Requires force: true because another process may be using it; refuses active turns in this script engine. A forced cross-process deletion can disrupt that turn.",returns:{type:"map",description:'{ status: "deleted"|"not_found"|"busy"|"error", error: string|null }'},example:"lm_session_delete(agent, { force: true });"},{name:"lm_fanout",category:"lmctl Automation",signature:"lm_fanout(participants, prompts, options = {})",description:"Dispatches a prompt to every participant CONCURRENTLY, over the same path as lm_agent -- for a runtime-sized fan-out that parallel([...]) cannot express, since parallel is a language construct fixed to the call expressions written in the script. Each participant gets its own result in its own array slot; there is no shared accumulator to race on.",parameters:[{name:"participants",type:"array",description:"Array of member maps, each shaped like lm_agent's member argument"},{name:"prompts",type:"string|array",description:"A single string broadcast to every participant, or an array of strings (one per participant, must be the same length as participants)"},{name:"options",type:"map",description:"(optional) Same options as lm_agent (permissionMode, idleTimeoutMs), applied identically to every participant"}],returns:{type:"array",description:"Array of lm_agent-shaped result maps ({ status, reply, error, message_id, team_chat_log_id }), in the SAME order as participants (not first-to-finish order)"},example:'reviewers = [{provider:"codex"}, {provider:"claude"}, {provider:"agy"}]; results = lm_fanout(reviewers, "Review this diff for correctness issues.");'},{name:"lm_seed",category:"lmctl Automation",signature:"lm_seed(teamfile, options = {})",description:"Seeds a real teamfile over the exact same internal path `lmctl seed` takes: seeds only members that lack a sessionid, writes each new sessionid/sessiondir back into the teamfile file, and leaves an already-seeded member untouched. `lmctl seed` itself stays a minimal primitive (one-sentence Lead prompt); a workflow that wants a richer or role-specific preamble supplies it via options.preamble instead of lmctl growing that behavior.",parameters:[{name:"teamfile",type:"string",description:"Path to the team configuration file to seed"},{name:"options",type:"map",description:'(optional) preamble: a string (replaces the default prompt for whichever alias gets one today -- Lead) or a map keyed by alias, e.g. {"Lead": "...", "Reviewer": "..."} (replaces the default prompt entirely for each matched alias; a non-Lead alias gets no prompt at all unless keyed here)'}],returns:{type:"map",description:'{ status: "ok"|"error" }; progress, warnings and per-member errors are written to stderr, same as lmctl seed'},example:'lm_seed("team.lmctl", { preamble: { Lead: "Use `lmctl prompt` to send a message.", Reviewer: "Wait for a review request from Lead before doing anything." } });'},{name:"lm_terminal",category:"lmctl Automation",signature:"lm_terminal(teamfile, alias)",description:"Opens a tracked team member in its native provider TUI, preserving terminal ownership and inherited stdio. Refuses non-interactive mode.",parameters:[{name:"teamfile",type:"string",description:"Teamfile path"},{name:"alias",type:"string",description:"Member alias"}],returns:{type:"map",description:"{ status, code } after the TUI exits"},example:'lm_terminal("team.lmctl", "Lead");'},{name:"lm_lint",category:"lmctl Automation",signature:"lm_lint(teamfile)",description:'Validates a teamfile over the exact same internal path `lmctl lint` takes, returning structured findings instead of text a script would otherwise have to parse (operator, 2026-09-30: "lmscript does not use lmctl cli... expose lmctl internal working as api"). status is "error" ONLY for a genuine validation error (unparseable file, bad _MEMBER_ line, confirmed wrong-provider model) -- warnings never flip it to "error", matching the CLI\'s own exit-0-on-warnings contract. Progress/error/warning lines are also written to stderr, same as lmctl lint.',parameters:[{name:"teamfile",type:"string",description:"Path to the team configuration file to validate"}],returns:{type:"map",description:'{ status: "ok"|"error", errors: [{alias, message}], warnings: [{alias, message}], counts: {errors, warnings} }; alias is "" when a finding is about the file rather than a member. Both lists are always arrays, never null.'},example:'result = lm_lint("team.lmctl"); if (result.counts.warnings > 0) { lm_log(result.counts.warnings + " warning(s)"); }'},{name:"lm_ratelimit_readings",category:"lmctl Automation",signature:"lm_ratelimit_readings(options = {})",description:"Queries live provider quota readings using the existing ratelimit reader; preserves raw fields without cost aggregation or inferred availability.",parameters:[{name:"options",type:"map",description:"(optional) providers: string[] or provider: string (default all); timeoutSeconds: positive number (default 15)"}],returns:{type:"map",description:'{ status: "ok", readings: map[] } or { status: "error", error: string, readings: [] }. Provider-level failures remain reading data; inspect each reading.status and bucket flags.'},example:'quota = lm_ratelimit_readings({ providers: ["codex", "claude"] });'},{name:"lm_read_prompts",category:"lmctl Automation",signature:"lm_read_prompts(batchfile, single = false)",description:"Reads prompt file with BOM and CRLF normalization, splitting into paragraphs or reading entire file as single prompt.",parameters:[{name:"batchfile",type:"string",description:"Path to prompt file"},{name:"single",type:"bool",description:"(optional) If true, treats entire file as one prompt; if false, splits on blank lines"}],returns:{type:"string[]",description:"List of prompt strings"},example:'prompts = lm_read_prompts("prompts.txt");'},{name:"lm_read_paragraphs",category:"lmctl Automation",signature:"lm_read_paragraphs(batchfile)",description:"Reads a prompt file and splits it into blank-line-separated paragraphs.",parameters:[{name:"batchfile",type:"string",description:"Path to prompt file"}],returns:{type:"string[]",description:"List of paragraph strings"},example:'paragraphs = lm_read_paragraphs("spec.md");'},{name:"lm_members",category:"lmctl Automation",signature:"lm_members(teamfile)",description:"Resolves all team members declared in a team configuration file.",parameters:[{name:"teamfile",type:"string",description:"Path to team configuration file"}],returns:{type:"map[]",description:"List of member records { alias, provider, model, sessionid, sessiondir }"},example:'members = lm_members("team.lmctl");'},{name:"lm_member",category:"lmctl Automation",signature:"lm_member(teamfile, alias)",description:"Resolves a specific member in a team configuration file.",parameters:[{name:"teamfile",type:"string",description:"Path to team configuration file"},{name:"alias",type:"string",description:"Member alias to look up"}],returns:{type:"map|null",description:"Member record { alias, provider, model, sessionid, sessiondir, isLead, teamfile } or null"},example:'m = lm_member("team.lmctl", "reviewer");'},{name:"lm_log",category:"lmctl Automation",signature:"lm_log(value, ...args)",description:"Writes formatted log messages to standard error with trailing newline.",parameters:[{name:"value",type:"any",description:"Required first value or message"},{name:"args",type:"any[]",description:"Additional values or messages to log to stderr"}],returns:{type:"string",description:"The formatted text"},example:'lm_log("Step completed successfully");'},{name:"lm_error",category:"lmctl Automation",signature:"lm_error(value, ...args)",description:"Writes error messages to standard error prefixed with 'error: '.",parameters:[{name:"value",type:"any",description:"Required first error detail"},{name:"args",type:"any[]",description:"Additional error details to write to stderr"}],returns:{type:"string",description:"The formatted error text"},example:'lm_error("Failed to connect to team member");'},{name:"lm_exit",category:"lmctl Automation",signature:"lm_exit(code = 0)",description:"Immediately terminates script execution with the specified integer exit code (0-255).",parameters:[{name:"code",type:"number",description:"(optional) Exit status code between 0 and 255 (default: 0)"}],returns:{type:"never",description:"Raises LMScriptExit control flow"},example:"lm_exit(1);"}]});function G(t){try{if(t instanceof Error){let e=t.message;if(typeof e=="string")return e}return String(t)}catch{return"Unprintable error"}}function ce(t){return{...t,status:"ok",error:null}}function j(t,e,n){return{...n,status:"error",code:t,error:e}}var Xe=O(()=>{"use strict"});import{existsSync as Sw}from"node:fs";import{createRequire as kw}from"node:module";function Rw(){return Fa===null&&(Fa=kw(import.meta.url)("node:sqlite").DatabaseSync),Fa}function Aw(t){let e=xw[t];if(e!==void 0)return e;let n=Iw[t&255];return n!==void 0?n:`SQLITE_UNKNOWN_${t}`}function hn(t){throw t&&typeof t=="object"&&"errcode"in t&&typeof t.errcode=="number"&&(t.code=Aw(t.errcode)),t}function Cw(t){return t instanceof Error&&/cannot rollback - no transaction is active/i.test(t.message)}function Nw(t){return t instanceof Error&&/no such savepoint:/i.test(t.message)}function $a(t){return t.length===1&&Ow(t[0])?[t[0]]:t}function Ow(t){if(!Ha(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Ha(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Fa,Iw,xw,ja,ei,Ua,Ba=O(()=>{"use strict";Fa=null;Iw={1:"SQLITE_ERROR",2:"SQLITE_INTERNAL",3:"SQLITE_PERM",4:"SQLITE_ABORT",5:"SQLITE_BUSY",6:"SQLITE_LOCKED",7:"SQLITE_NOMEM",8:"SQLITE_READONLY",9:"SQLITE_INTERRUPT",10:"SQLITE_IOERR",11:"SQLITE_CORRUPT",12:"SQLITE_NOTFOUND",13:"SQLITE_FULL",14:"SQLITE_CANTOPEN",15:"SQLITE_PROTOCOL",17:"SQLITE_SCHEMA",18:"SQLITE_TOOBIG",19:"SQLITE_CONSTRAINT",20:"SQLITE_MISMATCH",21:"SQLITE_MISUSE",23:"SQLITE_AUTH",25:"SQLITE_RANGE",26:"SQLITE_NOTADB"},xw={275:"SQLITE_CONSTRAINT_CHECK",531:"SQLITE_CONSTRAINT_COMMITHOOK",787:"SQLITE_CONSTRAINT_FOREIGNKEY",1043:"SQLITE_CONSTRAINT_FUNCTION",1299:"SQLITE_CONSTRAINT_NOTNULL",1555:"SQLITE_CONSTRAINT_PRIMARYKEY",1811:"SQLITE_CONSTRAINT_TRIGGER",2067:"SQLITE_CONSTRAINT_UNIQUE",2323:"SQLITE_CONSTRAINT_VTAB",2579:"SQLITE_CONSTRAINT_ROWID",2835:"SQLITE_CONSTRAINT_PINNED",3091:"SQLITE_CONSTRAINT_DATATYPE",261:"SQLITE_BUSY_RECOVERY",517:"SQLITE_BUSY_SNAPSHOT",773:"SQLITE_BUSY_TIMEOUT",262:"SQLITE_LOCKED_SHAREDCACHE",518:"SQLITE_LOCKED_VTAB"};ja=class{name;handle;savepointId=0;constructor(e,n={}){if(n.fileMustExist===!0&&e!==":memory:"&&!Sw(e))throw new Error("unable to open database file");this.name=e;try{this.handle=new(Rw())(e,{readOnly:n.readonly===!0})}catch(r){hn(r)}this.exec("PRAGMA busy_timeout = 5000"),this.exec(`PRAGMA foreign_keys = ${n.foreignKeys===!0?"ON":"OFF"}`)}prepare(e){try{return new Ua(this.handle.prepare(e))}catch(n){hn(n)}}exec(e){try{this.handle.exec(e)}catch(n){hn(n)}}pragma(e,n){let r=`PRAGMA ${e}`;if(e.includes("=")){this.exec(r);return}if(n?.simple===!0){let s=this.prepare(r).get();return s===void 0?void 0:Object.values(s)[0]}return this.prepare(r).all()}transaction(e){let n=(...r)=>this.runTransaction("BEGIN",e,r);return n.immediate=(...r)=>this.runTransaction("BEGIN IMMEDIATE",e,r),n}get inTransaction(){return this.handle.isTransaction}close(){try{this.handle.close()}catch(e){hn(e)}}runTransaction(e,n,r){if(!this.inTransaction){this.exec(e);try{let i=n(...r);return this.exec("COMMIT"),i}catch(i){if(this.inTransaction)try{this.exec("ROLLBACK")}catch(o){if(!Cw(o))throw o}throw i}}let s=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${s}`);try{let i=n(...r);return this.exec(`RELEASE ${s}`),i}catch(i){if(this.inTransaction)try{this.exec(`ROLLBACK TO ${s}`),this.exec(`RELEASE ${s}`)}catch(o){if(!Nw(o))throw o}throw i}}};ei=ja,Ua=class{constructor(e){this.handle=e;this.handle.setAllowBareNamedParameters(!0)}rawMode=!1;get(...e){try{let n=this.handle.get(...$a(e));return this.normalizeRow(n)}catch(n){hn(n)}}all(...e){try{return this.handle.all(...$a(e)).map(n=>this.normalizeRow(n))}catch(n){hn(n)}}run(...e){try{let n=this.handle.run(...$a(e));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}catch(n){hn(n)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Ha(e)?Object.values(e):Ha(e)?{...e}:e}}});import{createHash as Lw}from"node:crypto";function Mw(t,e,n){return Lw("sha256").update(`${t}\0${e}\0${n}`).digest("hex")}function $e(t,e,n){let r=Mw(e.stream_id,e.intentKey??e.event_type,e.observedLastSeq),s=t.prepare(`INSERT INTO message_event (event_id, ts, stream_id, event_type, payload)
420
420
  VALUES (?, ?, ?, ?, ?)
421
- ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(r,e.ts??new Date().toISOString(),e.stream_id,e.event_type,JSON.stringify(e.payload));if(a.changes===0)return{appended:!1,seq:i.get(r).seq,event_id:r};let l=Number(a.lastInsertRowid);return n(l),{appended:!0,seq:l,event_id:r}})()}var Qs=O(()=>{"use strict"});import{createHash as Iw}from"node:crypto";function gn(t,e){return t==null?null:{teamfile:t,alias:e??""}}function xw(t,e,n){return`lease_${Iw("sha256").update(`${t}\0${e}\0${n}`).digest("hex").slice(0,16)}`}function Zs(t,e,n,r){n.forEach((s,i)=>{$e(t,{stream_id:e,event_type:s.event_type,payload:s.payload,observedLastSeq:i,ts:s.ts},()=>{}).appended?r.appended+=1:r.skipped+=1})}function Aw(t){let e=`msg_tcl_${t.id}`,n=gn(t.sender_teamfile,t.sender_alias),r=gn(t.receiver_teamfile,t.receiver_alias),s={table:"team_chat_log",id:t.id},i={message_id:e,sender:n,receiver:r,root_teamfile:t.root_teamfile,legacy:s},o=[{event_type:ee.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.message,origin:t.origin,correlation_status:"legacy-unavailable"}}];return t.status!=="running"&&o.push({event_type:ee.HANDLED,ts:t.created_at,payload:{...i,outcome:t.status,receipt:t.response,error:t.error_detail,truncated:t.truncated===1}}),{streamId:e,events:o}}function Cw(t){let e=`msg_mbx_${t.id}`,n=gn(t.sender_teamfile,t.sender_alias),r=gn(t.receiver_teamfile,t.receiver_alias),s={table:"agent_mailbox",id:t.id},i={message_id:e,sender:n,receiver:r,root_teamfile:t.root_teamfile,legacy:s},o=[];if(t.message_type==="response"){let a=t.request_mailbox_id!==null?`msg_mbx_${t.request_mailbox_id}`:null;return o.push({event_type:ee.RESPONSE_CREATE,ts:t.created_at,payload:{...i,message_type:"response",content:t.payload,in_reply_to_message_id:a,correlation_status:"legacy-unavailable"}}),o.push({event_type:ee.RESPONSE_ENQUEUE,ts:t.created_at,payload:{...i,message_type:"response",in_reply_to_message_id:a}}),t.delivered_at!==null&&o.push({event_type:ee.RESPONSE_DELIVERED,ts:t.delivered_at,payload:{...i,message_type:"response",receipt:t.receipt}}),{streamId:e,events:o}}return o.push({event_type:ee.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.payload,correlation_status:"legacy-unavailable"}}),o.push({event_type:ee.ENQUEUE,ts:t.created_at,payload:{...i,message_type:"request"}}),t.waited_at!==null&&o.push({event_type:ee.WAIT_REGISTER,ts:t.waited_at,payload:{...i,waited_by:t.waited_by}}),(t.delivering_at!==null||t.delivery_holder_pid!==null)&&o.push({event_type:ee.DELIVER_CLAIM,ts:t.delivering_at??t.created_at,payload:{...i,pid:t.delivery_holder_pid,host:t.delivery_holder_host}}),t.delivered_at!==null&&o.push({event_type:ee.DELIVERED,ts:t.delivered_at,payload:{...i,receipt:t.receipt}}),{streamId:e,events:o}}function Nw(t){let e=`inv_${t.id}`,n=gn(t.target_teamfile,t.target_alias),r={table:"tracked_invocation",id:t.id},s=[{event_type:ee.INVOCATION_START,ts:t.started_at,payload:{invocation_id:e,kind:t.kind,origin:t.origin,launch_source:t.launch_source,from_identity:t.from_identity,target:n,root_teamfile:t.root_teamfile,scope_teamfile:t.scope_teamfile,cwd:t.cwd,command:t.command,request_payload:t.request_payload,started_at:t.started_at,request_message_id:t.team_chat_log_id!==null?`msg_tcl_${t.team_chat_log_id}`:null,holder_pid:t.holder_pid,holder_host:t.holder_host,legacy:r}}];return t.notified_by!==null&&s.push({event_type:ee.INVOCATION_NOTIFY_CLAIM,ts:t.notified_at??t.started_at,payload:{invocation_id:e,notified_by:t.notified_by,notified_at:t.notified_at,legacy:r}}),t.status!=="running"&&s.push({event_type:ee.INVOCATION_FINISH,ts:t.ended_at??t.started_at,payload:{invocation_id:e,status:t.status,ended_at:t.ended_at,exit_code:t.exit_code,signal:t.signal,result_summary:t.result_summary,error:t.error,legacy:r}}),{streamId:e,events:s}}function Ow(t){let e=xw(t.receiver_teamfile,t.receiver_alias,t.started_at),n=gn(t.receiver_teamfile,t.receiver_alias),r=gn(t.sender_teamfile,t.sender_alias);return{streamId:e,events:[{event_type:ee.INFLIGHT_TAKE,ts:t.started_at,payload:{lease_id:e,receiver:n,sender:r,holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at,legacy:{table:"agent_inflight",receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias}}}]}}function ei(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Qu(t){let e={appended:0,skipped:0},n={team_chat_log:0,agent_mailbox:0,tracked_invocation:0,agent_inflight:0};t.transaction(()=>{if(ei(t,"team_chat_log"))for(let i of t.prepare("SELECT * FROM team_chat_log ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=Aw(i);Zs(t,a,l,e),n.team_chat_log+=e.appended+e.skipped-o}if(ei(t,"agent_mailbox"))for(let i of t.prepare("SELECT * FROM agent_mailbox ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=Cw(i);Zs(t,a,l,e),n.agent_mailbox+=e.appended+e.skipped-o}if(ei(t,"tracked_invocation"))for(let i of t.prepare("SELECT * FROM tracked_invocation ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=Nw(i);Zs(t,a,l,e),n.tracked_invocation+=e.appended+e.skipped-o}if(ei(t,"agent_inflight"))for(let i of t.prepare("SELECT * FROM agent_inflight ORDER BY receiver_teamfile, receiver_alias").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=Ow(i);Zs(t,a,l,e),n.agent_inflight+=e.appended+e.skipped-o}Lw(t)})();let s=i=>t.prepare(`SELECT count(*) AS n FROM ${i}`).get().n;return{appended:e.appended,skipped:e.skipped,bySource:n,projections:{agent_state:s("agent_state"),message_pending:s("message_pending"),invocation_state:s("invocation_state")}}}function Lw(t){t.exec("DELETE FROM agent_state"),t.exec("DELETE FROM message_pending"),t.exec("DELETE FROM invocation_state");let e=t.prepare("SELECT seq, stream_id, event_type, payload FROM message_event ORDER BY seq").all();for(let n of e){let r=JSON.parse(n.payload);Mw(t,n.seq,n.stream_id,n.event_type,r)}}function Ee(t,e,n){let r=t[e];return r!=null?r[n]??null:null}function Mw(t,e,n,r,s){switch(r){case ee.ENQUEUE:case ee.RESPONSE_ENQUEUE:{let i=r===ee.RESPONSE_ENQUEUE;t.prepare(`INSERT INTO message_pending
421
+ ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(r,e.ts??new Date().toISOString(),e.stream_id,e.event_type,JSON.stringify(e.payload));if(a.changes===0)return{appended:!1,seq:i.get(r).seq,event_id:r};let l=Number(a.lastInsertRowid);return n(l),{appended:!0,seq:l,event_id:r}})()}var ti=O(()=>{"use strict"});import{createHash as Pw}from"node:crypto";function _n(t,e){return t==null?null:{teamfile:t,alias:e??""}}function Dw(t,e,n){return`lease_${Pw("sha256").update(`${t}\0${e}\0${n}`).digest("hex").slice(0,16)}`}function ni(t,e,n,r){n.forEach((s,i)=>{$e(t,{stream_id:e,event_type:s.event_type,payload:s.payload,observedLastSeq:i,ts:s.ts},()=>{}).appended?r.appended+=1:r.skipped+=1})}function Fw(t){let e=`msg_tcl_${t.id}`,n=_n(t.sender_teamfile,t.sender_alias),r=_n(t.receiver_teamfile,t.receiver_alias),s={table:"team_chat_log",id:t.id},i={message_id:e,sender:n,receiver:r,root_teamfile:t.root_teamfile,legacy:s},o=[{event_type:ee.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.message,origin:t.origin,correlation_status:"legacy-unavailable"}}];return t.status!=="running"&&o.push({event_type:ee.HANDLED,ts:t.created_at,payload:{...i,outcome:t.status,receipt:t.response,error:t.error_detail,truncated:t.truncated===1}}),{streamId:e,events:o}}function $w(t){let e=`msg_mbx_${t.id}`,n=_n(t.sender_teamfile,t.sender_alias),r=_n(t.receiver_teamfile,t.receiver_alias),s={table:"agent_mailbox",id:t.id},i={message_id:e,sender:n,receiver:r,root_teamfile:t.root_teamfile,legacy:s},o=[];if(t.message_type==="response"){let a=t.request_mailbox_id!==null?`msg_mbx_${t.request_mailbox_id}`:null;return o.push({event_type:ee.RESPONSE_CREATE,ts:t.created_at,payload:{...i,message_type:"response",content:t.payload,in_reply_to_message_id:a,correlation_status:"legacy-unavailable"}}),o.push({event_type:ee.RESPONSE_ENQUEUE,ts:t.created_at,payload:{...i,message_type:"response",in_reply_to_message_id:a}}),t.delivered_at!==null&&o.push({event_type:ee.RESPONSE_DELIVERED,ts:t.delivered_at,payload:{...i,message_type:"response",receipt:t.receipt}}),{streamId:e,events:o}}return o.push({event_type:ee.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.payload,correlation_status:"legacy-unavailable"}}),o.push({event_type:ee.ENQUEUE,ts:t.created_at,payload:{...i,message_type:"request"}}),t.waited_at!==null&&o.push({event_type:ee.WAIT_REGISTER,ts:t.waited_at,payload:{...i,waited_by:t.waited_by}}),(t.delivering_at!==null||t.delivery_holder_pid!==null)&&o.push({event_type:ee.DELIVER_CLAIM,ts:t.delivering_at??t.created_at,payload:{...i,pid:t.delivery_holder_pid,host:t.delivery_holder_host}}),t.delivered_at!==null&&o.push({event_type:ee.DELIVERED,ts:t.delivered_at,payload:{...i,receipt:t.receipt}}),{streamId:e,events:o}}function jw(t){let e=`inv_${t.id}`,n=_n(t.target_teamfile,t.target_alias),r={table:"tracked_invocation",id:t.id},s=[{event_type:ee.INVOCATION_START,ts:t.started_at,payload:{invocation_id:e,kind:t.kind,origin:t.origin,launch_source:t.launch_source,from_identity:t.from_identity,target:n,root_teamfile:t.root_teamfile,scope_teamfile:t.scope_teamfile,cwd:t.cwd,command:t.command,request_payload:t.request_payload,started_at:t.started_at,request_message_id:t.team_chat_log_id!==null?`msg_tcl_${t.team_chat_log_id}`:null,holder_pid:t.holder_pid,holder_host:t.holder_host,legacy:r}}];return t.notified_by!==null&&s.push({event_type:ee.INVOCATION_NOTIFY_CLAIM,ts:t.notified_at??t.started_at,payload:{invocation_id:e,notified_by:t.notified_by,notified_at:t.notified_at,legacy:r}}),t.status!=="running"&&s.push({event_type:ee.INVOCATION_FINISH,ts:t.ended_at??t.started_at,payload:{invocation_id:e,status:t.status,ended_at:t.ended_at,exit_code:t.exit_code,signal:t.signal,result_summary:t.result_summary,error:t.error,legacy:r}}),{streamId:e,events:s}}function Uw(t){let e=Dw(t.receiver_teamfile,t.receiver_alias,t.started_at),n=_n(t.receiver_teamfile,t.receiver_alias),r=_n(t.sender_teamfile,t.sender_alias);return{streamId:e,events:[{event_type:ee.INFLIGHT_TAKE,ts:t.started_at,payload:{lease_id:e,receiver:n,sender:r,holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at,legacy:{table:"agent_inflight",receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias}}}]}}function ri(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function rm(t){let e={appended:0,skipped:0},n={team_chat_log:0,agent_mailbox:0,tracked_invocation:0,agent_inflight:0};t.transaction(()=>{if(ri(t,"team_chat_log"))for(let i of t.prepare("SELECT * FROM team_chat_log ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=Fw(i);ni(t,a,l,e),n.team_chat_log+=e.appended+e.skipped-o}if(ri(t,"agent_mailbox"))for(let i of t.prepare("SELECT * FROM agent_mailbox ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=$w(i);ni(t,a,l,e),n.agent_mailbox+=e.appended+e.skipped-o}if(ri(t,"tracked_invocation"))for(let i of t.prepare("SELECT * FROM tracked_invocation ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=jw(i);ni(t,a,l,e),n.tracked_invocation+=e.appended+e.skipped-o}if(ri(t,"agent_inflight"))for(let i of t.prepare("SELECT * FROM agent_inflight ORDER BY receiver_teamfile, receiver_alias").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=Uw(i);ni(t,a,l,e),n.agent_inflight+=e.appended+e.skipped-o}Hw(t)})();let s=i=>t.prepare(`SELECT count(*) AS n FROM ${i}`).get().n;return{appended:e.appended,skipped:e.skipped,bySource:n,projections:{agent_state:s("agent_state"),message_pending:s("message_pending"),invocation_state:s("invocation_state")}}}function Hw(t){t.exec("DELETE FROM agent_state"),t.exec("DELETE FROM message_pending"),t.exec("DELETE FROM invocation_state");let e=t.prepare("SELECT seq, stream_id, event_type, payload FROM message_event ORDER BY seq").all();for(let n of e){let r=JSON.parse(n.payload);Bw(t,n.seq,n.stream_id,n.event_type,r)}}function Ee(t,e,n){let r=t[e];return r!=null?r[n]??null:null}function Bw(t,e,n,r,s){switch(r){case ee.ENQUEUE:case ee.RESPONSE_ENQUEUE:{let i=r===ee.RESPONSE_ENQUEUE;t.prepare(`INSERT INTO message_pending
422
422
  (message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
423
423
  receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
424
424
  VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)
@@ -442,7 +442,7 @@ fn clamp(val, low, high) {
442
442
  cwd, command, request_message_id, request_payload, holder_pid, holder_host, status, started_at, last_seq)
443
443
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?)
444
444
  ON CONFLICT(invocation_id) DO NOTHING`).run(n,s.kind??"chat",s.origin??"unknown",s.launch_source??"",s.from_identity??"",Ee(s,"target","teamfile"),Ee(s,"target","alias"),s.root_teamfile??null,s.cwd??null,s.command??null,s.request_message_id??null,s.request_payload??null,s.holder_pid??null,s.holder_host??null,s.started_at??"",e);break;case ee.INVOCATION_FINISH:t.prepare(`UPDATE invocation_state SET status=?, ended_at=?, result_summary=?, error=?, last_seq=?
445
- WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,e,n);break;case ee.INVOCATION_NOTIFY_CLAIM:t.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,e,n);break;default:break}}var ee,Zu=O(()=>{"use strict";Qs();ee={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"}});import{existsSync as Pw,mkdirSync as Dw,readFileSync as nm}from"node:fs";import{randomUUID as Fw}from"node:crypto";import{homedir as $w}from"node:os";import{dirname as rm,join as jw,resolve as sm}from"node:path";import{fileURLToPath as Uw,pathToFileURL as Hw}from"node:url";function ti(t){t.dbPath!==":memory:"&&Dw(rm(t.dbPath),{recursive:!0});let e=new Ys(t.dbPath);try{e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let n=am(e),r=t.buildVersionForTests??Jt;if(n===0)e.exec(nm(om,"utf8")),e.pragma(`user_version = ${Jt}`);else if(n>r){let s=qw(e,n);if(Jw={dbVersion:n,buildVersion:r},s>r&&!t.allowSchemaSkew)throw e.close(),new Sr(t.dbPath,n,r);return Gw(t.dbPath,n,r),e}return Ww(e,n),Xw(e),e}catch(n){try{e.close()}catch{}throw n}}function Ww(t,e){let n=e;if(n<2&&n!==0&&(t.exec(`
445
+ WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,e,n);break;case ee.INVOCATION_NOTIFY_CLAIM:t.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,e,n);break;default:break}}var ee,sm=O(()=>{"use strict";ti();ee={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"}});import{existsSync as Ww,mkdirSync as Xw,readFileSync as am}from"node:fs";import{randomUUID as qw}from"node:crypto";import{homedir as Gw}from"node:os";import{dirname as lm,join as Jw,resolve as cm}from"node:path";import{fileURLToPath as Kw,pathToFileURL as Vw}from"node:url";function si(t){t.dbPath!==":memory:"&&Xw(lm(t.dbPath),{recursive:!0});let e=new ei(t.dbPath);try{e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let n=mm(e),r=t.buildVersionForTests??Kt;if(n===0)e.exec(am(um,"utf8")),e.pragma(`user_version = ${Kt}`);else if(n>r){let s=Zw(e,n);if(tT={dbVersion:n,buildVersion:r},s>r&&!t.allowSchemaSkew)throw e.close(),new Ir(t.dbPath,n,r);return eT(t.dbPath,n,r),e}return Yw(e,n),Qw(e),e}catch(n){try{e.close()}catch{}throw n}}function Yw(t,e){let n=e;if(n<2&&n!==0&&(t.exec(`
446
446
  CREATE TABLE IF NOT EXISTS session_size (
447
447
  id INTEGER PRIMARY KEY AUTOINCREMENT,
448
448
  team_name TEXT NOT NULL,
@@ -856,7 +856,7 @@ fn clamp(val, low, high) {
856
856
  updated_at TEXT NOT NULL,
857
857
  PRIMARY KEY(user_id, device_id, period)
858
858
  );
859
- `),t.pragma("user_version = 36"),n=36),n<37&&n!==0&&(nt(t,"team_connection")&&t.exec(`
859
+ `),t.pragma("user_version = 36"),n=36),n<37&&n!==0&&(rt(t,"team_connection")&&t.exec(`
860
860
  CREATE TABLE IF NOT EXISTS team_connection_v37 (
861
861
  id INTEGER PRIMARY KEY AUTOINCREMENT,
862
862
  source_teamfile TEXT NOT NULL,
@@ -981,7 +981,7 @@ fn clamp(val, low, high) {
981
981
  ON agent_mailbox(sender_teamfile, sender_alias, created_at);
982
982
  CREATE INDEX IF NOT EXISTS idx_agent_mailbox_created
983
983
  ON agent_mailbox(created_at);
984
- `),t.pragma("user_version = 45"),n=45),n<46&&n!==0&&(nt(t,"team_chat_log")?em(t):t.exec(`
984
+ `),t.pragma("user_version = 45"),n=45),n<46&&n!==0&&(rt(t,"team_chat_log")?im(t):t.exec(`
985
985
  CREATE TABLE IF NOT EXISTS team_chat_log (
986
986
  id INTEGER PRIMARY KEY AUTOINCREMENT,
987
987
  root_teamfile TEXT NOT NULL,
@@ -1000,18 +1000,18 @@ fn clamp(val, low, high) {
1000
1000
  `),t.exec(`
1001
1001
  CREATE INDEX IF NOT EXISTS idx_team_chat_log_root_time
1002
1002
  ON team_chat_log(root_teamfile, created_at);
1003
- `),t.pragma("user_version = 46"),n=46),n>=46&&nt(t,"team_chat_log")&&!Q(t,"team_chat_log").has("origin")&&em(t),n<47&&n!==0){if(Gt(t,"tracked_invocation"),nt(t,"agent_mailbox")){let s=Q(t,"agent_mailbox");s.has("delivered_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivered_at TEXT;"),s.has("receipt")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN receipt TEXT;")}let r=Q(t,"tracked_invocation");r.has("notified_by")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_by TEXT;"),r.has("notified_at")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_at TEXT;"),t.pragma("user_version = 47"),n=47}if(n<48&&n!==0){if(nt(t,"agent_mailbox")){let r=Q(t,"agent_mailbox");r.has("delivering_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivering_at TEXT;"),r.has("delivery_holder_pid")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_pid INTEGER;"),r.has("delivery_holder_host")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_host TEXT;"),r.has("waited_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_at TEXT;"),r.has("waited_by")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_by TEXT;"),t.exec(`
1003
+ `),t.pragma("user_version = 46"),n=46),n>=46&&rt(t,"team_chat_log")&&!Q(t,"team_chat_log").has("origin")&&im(t),n<47&&n!==0){if(Jt(t,"tracked_invocation"),rt(t,"agent_mailbox")){let s=Q(t,"agent_mailbox");s.has("delivered_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivered_at TEXT;"),s.has("receipt")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN receipt TEXT;")}let r=Q(t,"tracked_invocation");r.has("notified_by")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_by TEXT;"),r.has("notified_at")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_at TEXT;"),t.pragma("user_version = 47"),n=47}if(n<48&&n!==0){if(rt(t,"agent_mailbox")){let r=Q(t,"agent_mailbox");r.has("delivering_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivering_at TEXT;"),r.has("delivery_holder_pid")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_pid INTEGER;"),r.has("delivery_holder_host")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_host TEXT;"),r.has("waited_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_at TEXT;"),r.has("waited_by")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_by TEXT;"),t.exec(`
1004
1004
  CREATE INDEX IF NOT EXISTS idx_agent_mailbox_sender_delivery_wait
1005
1005
  ON agent_mailbox(sender_teamfile, sender_alias, delivered_at, waited_at, id);
1006
1006
  CREATE INDEX IF NOT EXISTS idx_agent_mailbox_lane_delivery
1007
1007
  ON agent_mailbox(sender_teamfile, sender_alias, receiver_teamfile, receiver_alias, delivered_at, delivering_at, id);
1008
- `)}t.pragma("user_version = 48"),n=48}if(n<49&&n!==0&&(Gt(t,"tracked_invocation"),t.exec(`
1008
+ `)}t.pragma("user_version = 48"),n=48}if(n<49&&n!==0&&(Jt(t,"tracked_invocation"),t.exec(`
1009
1009
  UPDATE tracked_invocation
1010
1010
  SET notified_by = 'migration-baseline',
1011
1011
  notified_at = COALESCE(ended_at, started_at)
1012
1012
  WHERE status IN ('done', 'error', 'busy', 'cancelled')
1013
1013
  AND notified_by IS NULL;
1014
- `),t.pragma("user_version = 49"),n=49),n<50&&n!==0&&(Gt(t,"tracked_invocation"),Q(t,"tracked_invocation").has("launch_source")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN launch_source TEXT;"),t.pragma("user_version = 50"),n=50),n<51&&n!==0){if(nt(t,"agent_mailbox")){let r=Q(t,"agent_mailbox");r.has("message_type")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN message_type TEXT NOT NULL DEFAULT 'request' CHECK(message_type IN ('request','response'));"),r.has("reply_mode")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN reply_mode TEXT NOT NULL DEFAULT 'pull' CHECK(reply_mode IN ('push','pull'));"),r.has("request_mailbox_id")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN request_mailbox_id INTEGER;"),t.exec(`
1014
+ `),t.pragma("user_version = 49"),n=49),n<50&&n!==0&&(Jt(t,"tracked_invocation"),Q(t,"tracked_invocation").has("launch_source")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN launch_source TEXT;"),t.pragma("user_version = 50"),n=50),n<51&&n!==0){if(rt(t,"agent_mailbox")){let r=Q(t,"agent_mailbox");r.has("message_type")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN message_type TEXT NOT NULL DEFAULT 'request' CHECK(message_type IN ('request','response'));"),r.has("reply_mode")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN reply_mode TEXT NOT NULL DEFAULT 'pull' CHECK(reply_mode IN ('push','pull'));"),r.has("request_mailbox_id")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN request_mailbox_id INTEGER;"),t.exec(`
1015
1015
  CREATE UNIQUE INDEX IF NOT EXISTS idx_agent_mailbox_response_request_unique
1016
1016
  ON agent_mailbox(request_mailbox_id)
1017
1017
  WHERE message_type = 'response' AND request_mailbox_id IS NOT NULL;
@@ -1027,7 +1027,7 @@ fn clamp(val, low, high) {
1027
1027
  BEGIN
1028
1028
  SELECT RAISE(ABORT, 'agent_mailbox response requires request_mailbox_id');
1029
1029
  END;
1030
- `)}t.pragma("user_version = 51"),n=51}if(n<52&&n!==0&&(Gt(t,"tracked_invocation"),Q(t,"tracked_invocation").has("request_payload")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN request_payload TEXT;"),t.pragma("user_version = 52"),n=52),n<53&&n!==0&&(t.exec(`
1030
+ `)}t.pragma("user_version = 51"),n=51}if(n<52&&n!==0&&(Jt(t,"tracked_invocation"),Q(t,"tracked_invocation").has("request_payload")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN request_payload TEXT;"),t.pragma("user_version = 52"),n=52),n<53&&n!==0&&(t.exec(`
1031
1031
  CREATE TABLE IF NOT EXISTS message_event (
1032
1032
  seq INTEGER PRIMARY KEY AUTOINCREMENT,
1033
1033
  event_id TEXT NOT NULL UNIQUE,
@@ -1109,7 +1109,7 @@ fn clamp(val, low, high) {
1109
1109
  ON invocation_state(target_teamfile, target_alias, status, launch_source);
1110
1110
  CREATE INDEX IF NOT EXISTS idx_invocation_state_from_time
1111
1111
  ON invocation_state(from_identity, started_at DESC);
1112
- `),t.pragma("user_version = 53"),n=53),n<54&&n!==0&&(Gt(t,"agent_state"),Q(t,"agent_state").has("currently_handling_message_id")||t.exec("ALTER TABLE agent_state ADD COLUMN currently_handling_message_id TEXT;"),t.pragma("user_version = 54"),n=54),n<55&&n!==0&&(Gt(t,"agent_state"),Q(t,"agent_state").has("currently_handling_since")||t.exec("ALTER TABLE agent_state ADD COLUMN currently_handling_since TEXT;"),t.pragma("user_version = 55"),n=55),n<56&&n!==0&&(nt(t,"tracked_invocation")&&t.exec(`
1112
+ `),t.pragma("user_version = 53"),n=53),n<54&&n!==0&&(Jt(t,"agent_state"),Q(t,"agent_state").has("currently_handling_message_id")||t.exec("ALTER TABLE agent_state ADD COLUMN currently_handling_message_id TEXT;"),t.pragma("user_version = 54"),n=54),n<55&&n!==0&&(Jt(t,"agent_state"),Q(t,"agent_state").has("currently_handling_since")||t.exec("ALTER TABLE agent_state ADD COLUMN currently_handling_since TEXT;"),t.pragma("user_version = 55"),n=55),n<56&&n!==0&&(rt(t,"tracked_invocation")&&t.exec(`
1113
1113
  CREATE TABLE tracked_invocation_v56 (
1114
1114
  id INTEGER PRIMARY KEY AUTOINCREMENT,
1115
1115
  kind TEXT NOT NULL CHECK(kind IN ('chat', 'exec')),
@@ -1163,13 +1163,13 @@ fn clamp(val, low, high) {
1163
1163
  ON tracked_invocation(scope_teamfile, status, started_at);
1164
1164
  CREATE INDEX IF NOT EXISTS idx_tracked_invocation_status_ended
1165
1165
  ON tracked_invocation(status, ended_at);
1166
- `),t.pragma("user_version = 56"),n=56),n<57&&n!==0&&(nt(t,"agent_mailbox")&&Qu(t),t.exec("DROP TABLE IF EXISTS agent_mailbox;"),t.pragma("user_version = 57"),n=57),n<58&&n!==0&&(Gt(t,"tracked_invocation"),Q(t,"tracked_invocation").has("parent_invocation_id")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN parent_invocation_id INTEGER;"),t.pragma("user_version = 58"),n=58),n<59&&n!==0&&(t.exec(`
1166
+ `),t.pragma("user_version = 56"),n=56),n<57&&n!==0&&(rt(t,"agent_mailbox")&&rm(t),t.exec("DROP TABLE IF EXISTS agent_mailbox;"),t.pragma("user_version = 57"),n=57),n<58&&n!==0&&(Jt(t,"tracked_invocation"),Q(t,"tracked_invocation").has("parent_invocation_id")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN parent_invocation_id INTEGER;"),t.pragma("user_version = 58"),n=58),n<59&&n!==0&&(t.exec(`
1167
1167
  CREATE TABLE IF NOT EXISTS state_ledger_identity (
1168
1168
  singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
1169
1169
  instance_id TEXT NOT NULL,
1170
1170
  created_at TEXT NOT NULL
1171
1171
  );
1172
- `),t.pragma("user_version = 59"),n=59),n<60&&n!==0&&(Gt(t,"tracked_invocation"),Q(t,"tracked_invocation").has("config_warnings")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN config_warnings TEXT;"),t.pragma("user_version = 60"),n=60),n<61&&n!==0){let r=Q(t,"team_chat_log");r.size>0&&!r.has("message_type")&&t.exec("ALTER TABLE team_chat_log ADD COLUMN message_type TEXT CHECK(message_type IN ('batch'));"),t.exec(`
1172
+ `),t.pragma("user_version = 59"),n=59),n<60&&n!==0&&(Jt(t,"tracked_invocation"),Q(t,"tracked_invocation").has("config_warnings")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN config_warnings TEXT;"),t.pragma("user_version = 60"),n=60),n<61&&n!==0){let r=Q(t,"team_chat_log");r.size>0&&!r.has("message_type")&&t.exec("ALTER TABLE team_chat_log ADD COLUMN message_type TEXT CHECK(message_type IN ('batch'));"),t.exec(`
1173
1173
  CREATE TABLE IF NOT EXISTS schema_meta (
1174
1174
  key TEXT PRIMARY KEY,
1175
1175
  value TEXT NOT NULL
@@ -1252,7 +1252,7 @@ CREATE TABLE IF NOT EXISTS prompt_task_reassignments(
1252
1252
  );
1253
1253
 
1254
1254
  CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_reassignments(prompt_id);
1255
- `),t.exec("INSERT OR IGNORE INTO schema_meta (key, value) VALUES ('min_reader_version', '61')"),t.pragma("user_version = 62"),n=62),Pw(Bw)}function Xw(t){t.prepare("SELECT instance_id FROM state_ledger_identity WHERE singleton = 1").get()===void 0&&t.prepare("INSERT OR IGNORE INTO state_ledger_identity (singleton, instance_id, created_at) VALUES (1, ?, ?)").run(Fw(),new Date().toISOString())}function Q(t,e){let n=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(n.map(r=>r.name))}function nt(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Gt(t,e){if(!nt(t,e)&&(t.exec(nm(om,"utf8")),!nt(t,e)))throw new Error(`schema.sql did not create expected table: ${e}`)}function em(t){let e=Q(t,"team_chat_log");t.pragma("foreign_keys = OFF");try{t.exec(`
1255
+ `),t.exec("INSERT OR IGNORE INTO schema_meta (key, value) VALUES ('min_reader_version', '61')"),t.pragma("user_version = 62"),n=62),Ww(zw)}function Qw(t){t.prepare("SELECT instance_id FROM state_ledger_identity WHERE singleton = 1").get()===void 0&&t.prepare("INSERT OR IGNORE INTO state_ledger_identity (singleton, instance_id, created_at) VALUES (1, ?, ?)").run(qw(),new Date().toISOString())}function Q(t,e){let n=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(n.map(r=>r.name))}function rt(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Jt(t,e){if(!rt(t,e)&&(t.exec(am(um,"utf8")),!rt(t,e)))throw new Error(`schema.sql did not create expected table: ${e}`)}function im(t){let e=Q(t,"team_chat_log");t.pragma("foreign_keys = OFF");try{t.exec(`
1256
1256
  DROP TABLE IF EXISTS team_chat_log_v46;
1257
1257
  CREATE TABLE team_chat_log_v46 (
1258
1258
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -1281,10 +1281,10 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1281
1281
  FROM team_chat_log;
1282
1282
  DROP TABLE team_chat_log;
1283
1283
  ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
1284
- `)}finally{t.pragma("foreign_keys = ON")}}function am(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function qw(t,e){try{if(!nt(t,"schema_meta"))return e;let n=t.prepare("SELECT value FROM schema_meta WHERE key = 'min_reader_version'").get();if(n===void 0)return e;let r=Number.parseInt(n.value,10);return Number.isInteger(r)&&r>0?r:e}catch{return e}}function Gw(t,e,n=Jt){tm||(tm=!0,process.stderr.write(`warning: ${t}: state.db is v${e}; this build understands v${n} -- some newer data or features may not be visible, proceeding best-effort. Update: npm install -g @lmctl-ai/lmctl@latest
1284
+ `)}finally{t.pragma("foreign_keys = ON")}}function mm(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function Zw(t,e){try{if(!rt(t,"schema_meta"))return e;let n=t.prepare("SELECT value FROM schema_meta WHERE key = 'min_reader_version'").get();if(n===void 0)return e;let r=Number.parseInt(n.value,10);return Number.isInteger(r)&&r>0?r:e}catch{return e}}function eT(t,e,n=Kt){om||(om=!0,process.stderr.write(`warning: ${t}: state.db is v${e}; this build understands v${n} -- some newer data or features may not be visible, proceeding best-effort. Update: npm install -g @lmctl-ai/lmctl@latest
1285
1285
  `),process.argv.includes("--json")&&process.stderr.write(`${JSON.stringify({schema_skew:{db_version:e,build_version:n,mode:"best_effort"}})}
1286
- `))}function Kw(){return process.env.LMCTL_DB??jw($w(),".lmctl","state.db")}var im,om,Bw,Jt,Sr,tm,Jw,lm=O(()=>{"use strict";$a();Zu();im=rm(Uw(import.meta.url)),om=sm(im,"schema.sql"),Bw=sm(im,"migrations"),Jt=62,Sr=class extends Error{dbPath;dbVersion;buildVersion;constructor(e,n,r=Jt){super(`${e}: state.db is v${n}; this build understands v${r} -- refusing to proceed rather than risk misreading newer data or corrupting it. Update: npm install -g @lmctl-ai/lmctl@latest -- or, only if you must run THIS exact build against this db right now, re-run with --allow-schema-skew (best-effort; newer data/features may be invisible).`),this.name="SchemaSkewError",this.dbPath=e,this.dbVersion=n,this.buildVersion=r}};tm=!1;Jw=null;if(process.argv[1]&&(process.argv[1].endsWith("migrate.ts")||process.argv[1].endsWith("migrate.js"))&&import.meta.url===Hw(process.argv[1]).href){let t=ti({dbPath:process.argv[2]??Kw()});try{process.stdout.write(`migrated user_version=${am(t)}
1287
- `)}finally{t.close()}}});function cm(t){return{getAgentInflight:t.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:t.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:t.prepare(`
1286
+ `))}function nT(){return process.env.LMCTL_DB??Jw(Gw(),".lmctl","state.db")}var dm,um,zw,Kt,Ir,om,tT,pm=O(()=>{"use strict";Ba();sm();dm=lm(Kw(import.meta.url)),um=cm(dm,"schema.sql"),zw=cm(dm,"migrations"),Kt=62,Ir=class extends Error{dbPath;dbVersion;buildVersion;constructor(e,n,r=Kt){super(`${e}: state.db is v${n}; this build understands v${r} -- refusing to proceed rather than risk misreading newer data or corrupting it. Update: npm install -g @lmctl-ai/lmctl@latest -- or, only if you must run THIS exact build against this db right now, re-run with --allow-schema-skew (best-effort; newer data/features may be invisible).`),this.name="SchemaSkewError",this.dbPath=e,this.dbVersion=n,this.buildVersion=r}};om=!1;tT=null;if(process.argv[1]&&(process.argv[1].endsWith("migrate.ts")||process.argv[1].endsWith("migrate.js"))&&import.meta.url===Vw(process.argv[1]).href){let t=si({dbPath:process.argv[2]??nT()});try{process.stdout.write(`migrated user_version=${mm(t)}
1287
+ `)}finally{t.close()}}});function fm(t){return{getAgentInflight:t.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:t.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:t.prepare(`
1288
1288
  INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
1289
1289
  VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
1290
1290
  ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
@@ -1420,7 +1420,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1420
1420
  AND sender_teamfile = ?
1421
1421
  AND sender_alias = ?
1422
1422
  AND active_count > 1
1423
- `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}var dm=O(()=>{"use strict"});function mm(t){return{insertTrackedInvocation:t.prepare(`
1423
+ `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}var gm=O(()=>{"use strict"});function _m(t){return{insertTrackedInvocation:t.prepare(`
1424
1424
  INSERT INTO tracked_invocation (
1425
1425
  kind, origin, scope_teamfile, from_identity, target_teamfile, target_alias,
1426
1426
  root_teamfile, cwd, command, status, started_at, holder_pid, holder_host,
@@ -1500,37 +1500,37 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1500
1500
  AND holder_host IS ?
1501
1501
  AND started_at = ?
1502
1502
  AND last_heartbeat_at IS ?
1503
- `)}}function Qe(t){if(t==null)return null;if(Buffer.byteLength(t,"utf8")<=65536)return t;let n=Buffer.byteLength(um,"utf8"),r=Math.max(0,65536-n),s=Buffer.from(t,"utf8"),i=r;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${um}`}var um,pm=O(()=>{"use strict";um=`
1504
- ...[truncated]`});function Ir(t,e){return JSON.stringify([t,e])}function fm(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(n=>typeof n=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var kr,Rr,gm=O(()=>{"use strict";kr="terminal_lock",Rr="member"});function Ne(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 hn=O(()=>{"use strict"});import{hostname as $n}from"node:os";function ym(t=process.env){let e=t.LMCTL_INFLIGHT_HEARTBEAT_MS;if(e===void 0||e.trim()==="")return ja;let n=Number(e);return!Number.isFinite(n)||n<=0?ja:Math.max(1,Math.trunc(n))}function ni(t,e={}){let n=setInterval(()=>{Promise.resolve().then(()=>t(new Date().toISOString())).then(r=>{r||clearInterval(n)}).catch(r=>e.onError?.(r))},e.intervalMs??ja);return n.unref?.(),n}function jn(t,e){let n=new Date().toISOString(),r=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:n},i=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),o=i===null||i.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...o?{stale_before:r}:{},force:e.force,reclaim_reason:e.reclaimReason});if(a.acquired){let c=i===null?null:e.force===!0?e.reclaimReason??"force":i.holder_pid===null&&i.started_at<r?"stale":null;return{acquired:!0,lease:a.current??s,leaseId:a.lease_id,previous:i,reclaimReason:c}}if(!si(a.current,r))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:r}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid},reclaim_reason:"dead-pid"});return l.acquired?{acquired:!0,lease:l.current??s,leaseId:l.lease_id,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function Em(t){return t.status!=="running"?null:t.holder_host===$n()&&t.holder_pid!==null&&t.holder_pid>0?Ne(t.holder_pid)?"live":"dead":"unknown"}function ri(t,e,n){let r,s=t.getTerminalLock(e,n);if(s!==null){if(Vw(s))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:s};r??={source:"terminal-lock",holder_pid:s.holder_pid,holder_host:s.holder_host,reason:s.holder_host===$n()?"dead-pid":"stale"}}let i=zw(t,e,n);if(i!==null){if(Yw(i))return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:i};r??={source:"terminal-invocation",holder_pid:i.holder_pid,holder_host:i.holder_host,reason:i.holder_pid!==null&&(i.holder_host===null||i.holder_host===$n())?"dead-pid":"stale"}}let o=t.getAgentInflight(e,n);if(o!==null){let a=new Date(Date.now()-Un()).toISOString();if(!si(o,a))return{busy:!0,reason:"in-flight",inFlight:o};r??={source:"in-flight",holder_pid:o.holder_pid,holder_host:o.holder_pid===null?null:$n(),reason:o.holder_pid===null?"stale":"dead-pid"}}return r===void 0?{busy:!1}:{busy:!1,reclaimable:r}}function Vw(t){if(t.holder_host===$n())return Ne(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=Zw():!1}function zw(t,e,n){return t.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
1503
+ `)}}function Ze(t){if(t==null)return null;if(Buffer.byteLength(t,"utf8")<=65536)return t;let n=Buffer.byteLength(hm,"utf8"),r=Math.max(0,65536-n),s=Buffer.from(t,"utf8"),i=r;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${hm}`}var hm,ym=O(()=>{"use strict";hm=`
1504
+ ...[truncated]`});function Cr(t,e){return JSON.stringify([t,e])}function Em(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(n=>typeof n=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var xr,Ar,vm=O(()=>{"use strict";xr="terminal_lock",Ar="member"});function Ne(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 yn=O(()=>{"use strict"});import{hostname as Hn}from"node:os";function bm(t=process.env){let e=t.LMCTL_INFLIGHT_HEARTBEAT_MS;if(e===void 0||e.trim()==="")return Wa;let n=Number(e);return!Number.isFinite(n)||n<=0?Wa:Math.max(1,Math.trunc(n))}function ii(t,e={}){let n=setInterval(()=>{Promise.resolve().then(()=>t(new Date().toISOString())).then(r=>{r||clearInterval(n)}).catch(r=>e.onError?.(r))},e.intervalMs??Wa);return n.unref?.(),n}function Bn(t,e){let n=new Date().toISOString(),r=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:n},i=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),o=i===null||i.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...o?{stale_before:r}:{},force:e.force,reclaim_reason:e.reclaimReason});if(a.acquired){let c=i===null?null:e.force===!0?e.reclaimReason??"force":i.holder_pid===null&&i.started_at<r?"stale":null;return{acquired:!0,lease:a.current??s,leaseId:a.lease_id,previous:i,reclaimReason:c}}if(!ai(a.current,r))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:r}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid},reclaim_reason:"dead-pid"});return l.acquired?{acquired:!0,lease:l.current??s,leaseId:l.lease_id,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function Sm(t){return t.status!=="running"?null:t.holder_host===Hn()&&t.holder_pid!==null&&t.holder_pid>0?Ne(t.holder_pid)?"live":"dead":"unknown"}function oi(t,e,n){let r,s=t.getTerminalLock(e,n);if(s!==null){if(rT(s))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:s};r??={source:"terminal-lock",holder_pid:s.holder_pid,holder_host:s.holder_host,reason:s.holder_host===Hn()?"dead-pid":"stale"}}let i=sT(t,e,n);if(i!==null){if(iT(i))return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:i};r??={source:"terminal-invocation",holder_pid:i.holder_pid,holder_host:i.holder_host,reason:i.holder_pid!==null&&(i.holder_host===null||i.holder_host===Hn())?"dead-pid":"stale"}}let o=t.getAgentInflight(e,n);if(o!==null){let a=new Date(Date.now()-Wn()).toISOString();if(!ai(o,a))return{busy:!0,reason:"in-flight",inFlight:o};r??={source:"in-flight",holder_pid:o.holder_pid,holder_host:o.holder_pid===null?null:Hn(),reason:o.holder_pid===null?"stale":"dead-pid"}}return r===void 0?{busy:!1}:{busy:!1,reclaimable:r}}function rT(t){if(t.holder_host===Hn())return Ne(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=aT():!1}function sT(t,e,n){return t.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
1505
1505
  FROM tracked_invocation
1506
1506
  WHERE target_teamfile = ?
1507
1507
  AND target_alias = ?
1508
1508
  AND status = 'running'
1509
1509
  AND launch_source = 'terminal'
1510
1510
  ORDER BY started_at DESC, id DESC
1511
- LIMIT 1`,e,n)[0]??null}function Yw(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===$n())?Ne(t.holder_pid):Qw(t)}function Qw(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=Un():!1}function si(t,e){return t.holder_pid===null?t.started_at<e:!Ne(t.holder_pid)}function Un(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return hm;let n=Number(e);return!Number.isFinite(n)||n<=0?hm:n}function Zw(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return _m;let n=Number(e);return!Number.isFinite(n)||n<=0?_m:n}var hm,_m,ja,_n=O(()=>{"use strict";hn();hm=8*60*60*1e3,_m=12e4,ja=3e4});import{randomUUID as eT}from"node:crypto";import{hostname as tT}from"node:os";function Kt(t,e){return{teamfile:t,alias:e}}function vm(t,e,n={}){return{teamfile:t,alias:e,...n.provider===void 0||n.provider===null?{}:{provider:n.provider},...n.sessionId===void 0||n.sessionId===null?{}:{session_id:n.sessionId}}}function Ua(t,e){return t===null?null:Kt(t,e??"")}function It(t){return`msg_tcl_${t}`}function yn(t){return`inv_${t}`}function Hn(t,e,n){return t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
1511
+ LIMIT 1`,e,n)[0]??null}function iT(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===Hn())?Ne(t.holder_pid):oT(t)}function oT(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=Wn():!1}function ai(t,e){return t.holder_pid===null?t.started_at<e:!Ne(t.holder_pid)}function Wn(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return wm;let n=Number(e);return!Number.isFinite(n)||n<=0?wm:n}function aT(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return Tm;let n=Number(e);return!Number.isFinite(n)||n<=0?Tm:n}var wm,Tm,Wa,En=O(()=>{"use strict";yn();wm=8*60*60*1e3,Tm=12e4,Wa=3e4});import{randomUUID as lT}from"node:crypto";import{hostname as cT}from"node:os";function Vt(t,e){return{teamfile:t,alias:e}}function km(t,e,n={}){return{teamfile:t,alias:e,...n.provider===void 0||n.provider===null?{}:{provider:n.provider},...n.sessionId===void 0||n.sessionId===null?{}:{session_id:n.sessionId}}}function Xa(t,e){return t===null?null:Vt(t,e??"")}function xt(t){return`msg_tcl_${t}`}function vn(t){return`inv_${t}`}function Xn(t,e,n){return t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
1512
1512
  holder_pid, holder_host, started_at, terminal_lock_id,
1513
1513
  terminal_invocation_id, currently_handling_message_id,
1514
1514
  currently_handling_since, last_seq
1515
1515
  FROM agent_state
1516
- WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,n)??null}function rT(t,e,n){if(e===null||n===null)return null;let r=t.prepare(`SELECT currently_handling_message_id, currently_handling_since
1516
+ WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,n)??null}function uT(t,e,n){if(e===null||n===null)return null;let r=t.prepare(`SELECT currently_handling_message_id, currently_handling_since
1517
1517
  FROM agent_state
1518
- WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,n);if(r?.currently_handling_message_id===null||r?.currently_handling_message_id===void 0||r.currently_handling_since===null)return null;let s=Date.parse(r.currently_handling_since);return!Number.isFinite(s)||Date.now()-s>nT?null:r.currently_handling_message_id}function sT(t,e,n){let r=rT(t,e,n);return r===null?{}:{causation:{request_message_id:r}}}function Ha(t,e,n,r,s=new Date().toISOString()){t.prepare(`INSERT INTO agent_state
1518
+ WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,n);if(r?.currently_handling_message_id===null||r?.currently_handling_message_id===void 0||r.currently_handling_since===null)return null;let s=Date.parse(r.currently_handling_since);return!Number.isFinite(s)||Date.now()-s>dT?null:r.currently_handling_message_id}function mT(t,e,n){let r=uT(t,e,n);return r===null?{}:{causation:{request_message_id:r}}}function qa(t,e,n,r,s=new Date().toISOString()){t.prepare(`INSERT INTO agent_state
1519
1519
  (receiver_teamfile, receiver_alias, currently_handling_message_id,
1520
1520
  currently_handling_since, last_seq)
1521
1521
  VALUES (?, ?, ?, ?, 0)
1522
1522
  ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
1523
1523
  currently_handling_message_id = excluded.currently_handling_message_id,
1524
- currently_handling_since = excluded.currently_handling_since`).run(e,n,r,s)}function Ba(t,e,n,r){return t.prepare(`UPDATE agent_state
1524
+ currently_handling_since = excluded.currently_handling_since`).run(e,n,r,s)}function Ga(t,e,n,r){return t.prepare(`UPDATE agent_state
1525
1525
  SET currently_handling_message_id = NULL,
1526
1526
  currently_handling_since = NULL
1527
1527
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1528
- AND currently_handling_message_id = ?`).run(e,n,r).changes===1}function iT(t,e){let n=e??new Date(Date.now()-Un()).toISOString();return si({holder_pid:t.holder_pid,started_at:t.started_at??""},n)}function oT(t,e,n){return e==="force"||e==="session-idle"?e:n?"force":t.holder_pid!==null&&!Ne(t.holder_pid)?"dead-pid":"stale"}function aT(t){return{sender:Ua(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at}}function Bn(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function Wa(t,e,n){let r=It(e),s=Ua(n.sender_teamfile,n.sender_alias),i=vm(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),o={message_id:r,message_type:"request",sender:s,receiver:i,root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:e}};return $e(t,{stream_id:r,event_type:"CREATE",observedLastSeq:0,ts:n.created_at,payload:{...o,content:n.message,provider_prompt:n.provider_prompt??n.message,origin:n.origin,...sT(t,n.sender_teamfile,n.sender_alias)}},()=>{Ha(t,n.receiver_teamfile,n.receiver_alias,r,n.created_at)}),r}function ii(t,e,n){let r=It(e),s={message_id:r,message_type:"request",sender:Ua(n.sender_teamfile,n.sender_alias),receiver:vm(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:e}};return $e(t,{stream_id:r,event_type:"HANDLED",observedLastSeq:1,ts:n.created_at,payload:{...s,outcome:n.status,receipt:n.response,error:n.error_detail,truncated:n.truncated===1}},()=>{Ba(t,n.receiver_teamfile,n.receiver_alias,r)}),r}function lT(t){return{sender:Kt(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at}}function wm(t,e,n,r){let s=t.prepare(`UPDATE agent_state
1528
+ AND currently_handling_message_id = ?`).run(e,n,r).changes===1}function pT(t,e){let n=e??new Date(Date.now()-Wn()).toISOString();return ai({holder_pid:t.holder_pid,started_at:t.started_at??""},n)}function fT(t,e,n){return e==="force"||e==="session-idle"?e:n?"force":t.holder_pid!==null&&!Ne(t.holder_pid)?"dead-pid":"stale"}function gT(t){return{sender:Xa(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at}}function qn(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function Ja(t,e,n){let r=xt(e),s=Xa(n.sender_teamfile,n.sender_alias),i=km(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),o={message_id:r,message_type:"request",sender:s,receiver:i,root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:e}};return $e(t,{stream_id:r,event_type:"CREATE",observedLastSeq:0,ts:n.created_at,payload:{...o,content:n.message,provider_prompt:n.provider_prompt??n.message,origin:n.origin,...mT(t,n.sender_teamfile,n.sender_alias)}},()=>{qa(t,n.receiver_teamfile,n.receiver_alias,r,n.created_at)}),r}function li(t,e,n){let r=xt(e),s={message_id:r,message_type:"request",sender:Xa(n.sender_teamfile,n.sender_alias),receiver:km(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:e}};return $e(t,{stream_id:r,event_type:"HANDLED",observedLastSeq:1,ts:n.created_at,payload:{...s,outcome:n.status,receipt:n.response,error:n.error_detail,truncated:n.truncated===1}},()=>{Ga(t,n.receiver_teamfile,n.receiver_alias,r)}),r}function hT(t){return{sender:Vt(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at}}function Rm(t,e,n,r){let s=t.prepare(`UPDATE agent_state
1529
1529
  SET lease_id = NULL, sender_teamfile = NULL, sender_alias = NULL,
1530
1530
  holder_pid = NULL, holder_host = NULL, started_at = NULL,
1531
1531
  last_heartbeat_at = NULL, last_seq = ?
1532
1532
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1533
- AND lease_id IS ? AND last_seq = ?`).run(n,e.receiver_teamfile,e.receiver_alias,e.lease_id,e.last_seq);Bn(s.changes,r)}function Tm(t,e,n,r,s=null,i=!1){let o=tT();if(n!==null&&r===null)throw new Error("agent inflight takeover is missing a reclaim reason");let a=Hn(t,e.receiver_teamfile,e.receiver_alias);if(a!==null&&a.lease_id!==null){if(!(i||iT(a,s)))throw new Error("event projection rejected INFLIGHT_TAKE: receiver already holds a live lease");let u=oT(a,r,i),m=aT(a),p=a.lease_id;$e(t,{stream_id:p,event_type:"INFLIGHT_RECLAIM",observedLastSeq:a.last_seq,ts:e.started_at,payload:{receiver:Kt(e.receiver_teamfile,e.receiver_alias),reason:u,previous_holder:m}},h=>wm(t,a,h,"INFLIGHT_RECLAIM")),a=Hn(t,e.receiver_teamfile,e.receiver_alias)}let l=a?.last_seq??0,c=`lease_${eT()}`;return $e(t,{stream_id:c,event_type:"INFLIGHT_TAKE",observedLastSeq:l,ts:e.started_at,payload:{lease_id:c,receiver:Kt(e.receiver_teamfile,e.receiver_alias),sender:Kt(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:o,started_at:e.started_at}},d=>{if(a===null){t.prepare(`INSERT INTO agent_state
1533
+ AND lease_id IS ? AND last_seq = ?`).run(n,e.receiver_teamfile,e.receiver_alias,e.lease_id,e.last_seq);qn(s.changes,r)}function Im(t,e,n,r,s=null,i=!1){let o=cT();if(n!==null&&r===null)throw new Error("agent inflight takeover is missing a reclaim reason");let a=Xn(t,e.receiver_teamfile,e.receiver_alias);if(a!==null&&a.lease_id!==null){if(!(i||pT(a,s)))throw new Error("event projection rejected INFLIGHT_TAKE: receiver already holds a live lease");let u=fT(a,r,i),m=gT(a),p=a.lease_id;$e(t,{stream_id:p,event_type:"INFLIGHT_RECLAIM",observedLastSeq:a.last_seq,ts:e.started_at,payload:{receiver:Vt(e.receiver_teamfile,e.receiver_alias),reason:u,previous_holder:m}},h=>Rm(t,a,h,"INFLIGHT_RECLAIM")),a=Xn(t,e.receiver_teamfile,e.receiver_alias)}let l=a?.last_seq??0,c=`lease_${lT()}`;return $e(t,{stream_id:c,event_type:"INFLIGHT_TAKE",observedLastSeq:l,ts:e.started_at,payload:{lease_id:c,receiver:Vt(e.receiver_teamfile,e.receiver_alias),sender:Vt(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:o,started_at:e.started_at}},d=>{if(a===null){t.prepare(`INSERT INTO agent_state
1534
1534
  (receiver_teamfile, receiver_alias, lease_id, sender_teamfile,
1535
1535
  sender_alias, holder_pid, holder_host, started_at,
1536
1536
  last_heartbeat_at, last_seq)
@@ -1539,18 +1539,18 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1539
1539
  holder_pid = ?, holder_host = ?, started_at = ?,
1540
1540
  last_heartbeat_at = ?, last_seq = ?
1541
1541
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1542
- AND lease_id IS NULL AND last_seq = ?`).run(c,e.sender_teamfile,e.sender_alias,e.holder_pid,o,e.started_at,e.started_at,d,e.receiver_teamfile,e.receiver_alias,a.last_seq);Bn(u.changes,"INFLIGHT_TAKE")}),c}function bm(t,e,n,r){return t.prepare(`UPDATE agent_state
1542
+ AND lease_id IS NULL AND last_seq = ?`).run(c,e.sender_teamfile,e.sender_alias,e.holder_pid,o,e.started_at,e.started_at,d,e.receiver_teamfile,e.receiver_alias,a.last_seq);qn(u.changes,"INFLIGHT_TAKE")}),c}function xm(t,e,n,r){return t.prepare(`UPDATE agent_state
1543
1543
  SET last_heartbeat_at = ?
1544
1544
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1545
1545
  AND lease_id = ?
1546
1546
  AND sender_teamfile = ? AND sender_alias = ?
1547
- AND started_at = ? AND holder_pid IS ?`).run(r,e.receiver_teamfile,e.receiver_alias,n,e.sender_teamfile,e.sender_alias,e.started_at,e.holder_pid).changes===1}function xr(t,e,n,r){let s=Hn(t,e.receiver_teamfile,e.receiver_alias);s===null||s.lease_id===null||$e(t,{stream_id:s.lease_id,event_type:n,observedLastSeq:s.last_seq,payload:{receiver:Kt(e.receiver_teamfile,e.receiver_alias),...n==="INFLIGHT_RECLAIM"?{reason:r??"stale",previous_holder:lT(e)}:{lease_id:s.lease_id}}},i=>wm(t,s,i,n))}function Sm(t,e){let n=Hn(t,e.teamfile,e.alias),r=n?.last_seq??0;$e(t,{stream_id:e.lock_id,event_type:"TERMINAL_LOCK_TAKE",observedLastSeq:r,ts:e.started_at,payload:{receiver:Kt(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at}},s=>{if(n===null){t.prepare(`INSERT INTO agent_state
1547
+ AND started_at = ? AND holder_pid IS ?`).run(r,e.receiver_teamfile,e.receiver_alias,n,e.sender_teamfile,e.sender_alias,e.started_at,e.holder_pid).changes===1}function Nr(t,e,n,r){let s=Xn(t,e.receiver_teamfile,e.receiver_alias);s===null||s.lease_id===null||$e(t,{stream_id:s.lease_id,event_type:n,observedLastSeq:s.last_seq,payload:{receiver:Vt(e.receiver_teamfile,e.receiver_alias),...n==="INFLIGHT_RECLAIM"?{reason:r??"stale",previous_holder:hT(e)}:{lease_id:s.lease_id}}},i=>Rm(t,s,i,n))}function Am(t,e){let n=Xn(t,e.teamfile,e.alias),r=n?.last_seq??0;$e(t,{stream_id:e.lock_id,event_type:"TERMINAL_LOCK_TAKE",observedLastSeq:r,ts:e.started_at,payload:{receiver:Vt(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at}},s=>{if(n===null){t.prepare(`INSERT INTO agent_state
1548
1548
  (receiver_teamfile, receiver_alias, terminal_lock_id, last_seq)
1549
1549
  VALUES (?, ?, ?, ?)`).run(e.teamfile,e.alias,e.lock_id,s);return}let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = ?, last_seq = ?
1550
1550
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1551
- AND terminal_lock_id IS NULL AND last_seq = ?`).run(e.lock_id,s,e.teamfile,e.alias,n.last_seq);Bn(i.changes,"TERMINAL_LOCK_TAKE")})}function Xa(t,e,n=!1){let r=Hn(t,e.teamfile,e.alias);r===null||r.terminal_lock_id!==e.lock_id||$e(t,{stream_id:e.lock_id,event_type:n?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE",observedLastSeq:r.last_seq,payload:{receiver:Kt(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host}},s=>{let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = NULL, last_seq = ?
1551
+ AND terminal_lock_id IS NULL AND last_seq = ?`).run(e.lock_id,s,e.teamfile,e.alias,n.last_seq);qn(i.changes,"TERMINAL_LOCK_TAKE")})}function Ka(t,e,n=!1){let r=Xn(t,e.teamfile,e.alias);r===null||r.terminal_lock_id!==e.lock_id||$e(t,{stream_id:e.lock_id,event_type:n?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE",observedLastSeq:r.last_seq,payload:{receiver:Vt(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host}},s=>{let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = NULL, last_seq = ?
1552
1552
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1553
- AND terminal_lock_id = ? AND last_seq = ?`).run(s,e.teamfile,e.alias,e.lock_id,r.last_seq);Bn(i.changes,n?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE")})}function km(t,e,n){let r=Hn(t,n.targetTeamfile,n.targetAlias);if(r===null){t.prepare(`INSERT INTO agent_state
1553
+ AND terminal_lock_id = ? AND last_seq = ?`).run(s,e.teamfile,e.alias,e.lock_id,r.last_seq);qn(i.changes,n?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE")})}function Cm(t,e,n){let r=Xn(t,n.targetTeamfile,n.targetAlias);if(r===null){t.prepare(`INSERT INTO agent_state
1554
1554
  (receiver_teamfile, receiver_alias, terminal_invocation_id,
1555
1555
  terminal_invocation_pid, terminal_invocation_host,
1556
1556
  terminal_invocation_heartbeat_at, last_seq)
@@ -1559,24 +1559,24 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1559
1559
  terminal_invocation_host = ?,
1560
1560
  terminal_invocation_heartbeat_at = ?, last_seq = ?
1561
1561
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1562
- AND terminal_invocation_id IS NULL AND last_seq = ?`).run(n.invocationId,n.holderPid,n.holderHost,n.heartbeatAt,e,n.targetTeamfile,n.targetAlias,r.last_seq);Bn(s.changes,"terminal INVOCATION_START")}function Rm(t,e,n){return t.prepare(`UPDATE agent_state
1562
+ AND terminal_invocation_id IS NULL AND last_seq = ?`).run(n.invocationId,n.holderPid,n.holderHost,n.heartbeatAt,e,n.targetTeamfile,n.targetAlias,r.last_seq);qn(s.changes,"terminal INVOCATION_START")}function Nm(t,e,n){return t.prepare(`UPDATE agent_state
1563
1563
  SET terminal_invocation_heartbeat_at = ?
1564
- WHERE terminal_invocation_id = ?`).run(n,e).changes===1}function Im(t,e,n){let r=t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, terminal_lock_id,
1564
+ WHERE terminal_invocation_id = ?`).run(n,e).changes===1}function Om(t,e,n){let r=t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, terminal_lock_id,
1565
1565
  terminal_invocation_id, last_seq
1566
1566
  FROM agent_state WHERE terminal_invocation_id = ?`).get(n);if(r===void 0)return;let s=t.prepare(`UPDATE agent_state
1567
1567
  SET terminal_invocation_id = NULL, terminal_invocation_pid = NULL,
1568
1568
  terminal_invocation_host = NULL,
1569
1569
  terminal_invocation_heartbeat_at = NULL, last_seq = ?
1570
1570
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1571
- AND terminal_invocation_id = ? AND last_seq = ?`).run(e,r.receiver_teamfile,r.receiver_alias,n,r.last_seq);Bn(s.changes,"terminal INVOCATION_FINISH")}var nT,oi=O(()=>{"use strict";Qs();_n();hn();nT=60*60*1e3});function xm(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function qa(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function Am(t,e){let n=yn(e.id),r=e.target_teamfile===null?null:{teamfile:e.target_teamfile,alias:e.target_alias??""},s=e.last_heartbeat_at??e.started_at;$e(t,{stream_id:n,event_type:cT,observedLastSeq:0,ts:e.started_at,payload:{invocation_id:n,kind:e.kind,origin:e.origin,launch_source:e.launch_source,from_identity:e.from_identity,target:r,root_teamfile:e.root_teamfile,scope_teamfile:e.scope_teamfile,cwd:e.cwd,command:e.command,request_payload:e.request_payload,request_message_id:e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,legacy:{table:"tracked_invocation",id:e.id}}},i=>{t.prepare(`INSERT INTO invocation_state
1571
+ AND terminal_invocation_id = ? AND last_seq = ?`).run(e,r.receiver_teamfile,r.receiver_alias,n,r.last_seq);qn(s.changes,"terminal INVOCATION_FINISH")}var dT,ci=O(()=>{"use strict";ti();En();yn();dT=60*60*1e3});function Lm(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function Va(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function Mm(t,e){let n=vn(e.id),r=e.target_teamfile===null?null:{teamfile:e.target_teamfile,alias:e.target_alias??""},s=e.last_heartbeat_at??e.started_at;$e(t,{stream_id:n,event_type:_T,observedLastSeq:0,ts:e.started_at,payload:{invocation_id:n,kind:e.kind,origin:e.origin,launch_source:e.launch_source,from_identity:e.from_identity,target:r,root_teamfile:e.root_teamfile,scope_teamfile:e.scope_teamfile,cwd:e.cwd,command:e.command,request_payload:e.request_payload,request_message_id:e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,legacy:{table:"tracked_invocation",id:e.id}}},i=>{t.prepare(`INSERT INTO invocation_state
1572
1572
  (invocation_id, kind, origin, launch_source, from_identity, target_teamfile, target_alias,
1573
1573
  root_teamfile, cwd, command, request_message_id, request_payload, holder_pid, holder_host,
1574
1574
  status, started_at, last_heartbeat_at, last_seq)
1575
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,i),qa(e)&&km(t,i,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function ai(t,e){let n=yn(e.id),r=xm(t,n);return r===null?!1:($e(t,{stream_id:n,event_type:dT,observedLastSeq:r.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:n,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
1575
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,i),Va(e)&&Cm(t,i,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function di(t,e){let n=vn(e.id),r=Lm(t,n);return r===null?!1:($e(t,{stream_id:n,event_type:yT,observedLastSeq:r.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:n,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
1576
1576
  SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
1577
- WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);qa(e)&&Im(t,s,n)}),!0)}function Cm(t,e,n,r){let s=yn(e.id),i=xm(t,s);return i===null?!1:($e(t,{stream_id:s,event_type:uT,observedLastSeq:i.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},o=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,o,s,i.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function Nm(t,e,n){let r=yn(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),qa(e)&&Rm(t,r,n)}function Om(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,yn(e))}function Lm(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,yn(e))}var cT,dT,uT,Mm=O(()=>{"use strict";Qs();oi();cT="INVOCATION_START",dT="INVOCATION_FINISH",uT="INVOCATION_NOTIFY_CLAIM"});var mT,pT,pM,Pm,Dm,Fm,$m=O(()=>{"use strict";mT="other",pT=["not_enough_information","dont_know","other_work"],pM=new Set([mT,...pT]),Pm="@abort",Dm="invalid_decision",Fm="workflow_escalation"});import{randomUUID as jm}from"node:crypto";import{existsSync as Xm,mkdirSync as fT,renameSync as gT,rmdirSync as hT}from"node:fs";import{hostname as Ga}from"node:os";function W(){return new Date().toISOString()}function _T(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!Xm(t))return e;let n;try{n=new Ys(t,{readonly:!0})}catch{return e}try{let r=[];try{r=n.prepare("SELECT teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at FROM root_team").all()}catch{}let s=[];try{s=n.prepare("SELECT key, value FROM lmctl_config").all()}catch{}return{rootTeams:r,config:s}}finally{n.close()}}function yT(t){if(t===":memory:"||!Xm(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{gT(r,`${e}${n}`)}catch{}}return e}function Um(t,e){let n=e instanceof Error?e.message:String(e);try{let r=_T(t),s=yT(t),i=new li(ti({dbPath:t}));for(let o of r.rootTeams)i.upsertRootTeam(o);for(let{key:o,value:a}of r.config)i.setConfig(o,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${Jt} (${n}); started a fresh database instead. Preserved ${r.rootTeams.length} team registration(s) and ${r.config.length} config value(s).`+(s!==null?` Old database backed up at ${s}.
1577
+ WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);Va(e)&&Om(t,s,n)}),!0)}function Pm(t,e,n,r){let s=vn(e.id),i=Lm(t,s);return i===null?!1:($e(t,{stream_id:s,event_type:ET,observedLastSeq:i.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},o=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,o,s,i.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function Dm(t,e,n){let r=vn(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),Va(e)&&Nm(t,r,n)}function Fm(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,vn(e))}function $m(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,vn(e))}var _T,yT,ET,jm=O(()=>{"use strict";ti();ci();_T="INVOCATION_START",yT="INVOCATION_FINISH",ET="INVOCATION_NOTIFY_CLAIM"});var vT,wT,wM,Um,Hm,Bm,Wm=O(()=>{"use strict";vT="other",wT=["not_enough_information","dont_know","other_work"],wM=new Set([vT,...wT]),Um="@abort",Hm="invalid_decision",Bm="workflow_escalation"});import{randomUUID as Xm}from"node:crypto";import{existsSync as Vm,mkdirSync as TT,renameSync as bT,rmdirSync as ST}from"node:fs";import{hostname as za}from"node:os";function W(){return new Date().toISOString()}function kT(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!Vm(t))return e;let n;try{n=new ei(t,{readonly:!0})}catch{return e}try{let r=[];try{r=n.prepare("SELECT teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at FROM root_team").all()}catch{}let s=[];try{s=n.prepare("SELECT key, value FROM lmctl_config").all()}catch{}return{rootTeams:r,config:s}}finally{n.close()}}function RT(t){if(t===":memory:"||!Vm(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{bT(r,`${e}${n}`)}catch{}}return e}function qm(t,e){let n=e instanceof Error?e.message:String(e);try{let r=kT(t),s=RT(t),i=new ui(si({dbPath:t}));for(let o of r.rootTeams)i.upsertRootTeam(o);for(let{key:o,value:a}of r.config)i.setConfig(o,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${Kt} (${n}); started a fresh database instead. Preserved ${r.rootTeams.length} team registration(s) and ${r.config.length} config value(s).`+(s!==null?` Old database backed up at ${s}.
1578
1578
  `:`
1579
- `)),i}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${t}: unusable (${n}), and recovery into a fresh database also failed (${s}). Check that the containing directory is writable, or move the file aside manually and retry.`)}}function Hm(t,e){let n;try{return n=ti({dbPath:t,allowSchemaSkew:e}),{dal:new li(n)}}catch(r){if(r instanceof Sr)throw r;let s;if(n!==void 0)try{s=n.pragma("user_version",{simple:!0})}catch{}try{n?.close()}catch{}return{cause:r,dbVersion:s}}}function TT(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function bT(t){if(t===":memory:")return!0;try{return fT(`${t}${qm}`),!0}catch{return!1}}function ST(t){if(t!==":memory:")try{hT(`${t}${qm}`)}catch{}}function Vt(t){let e=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1",n={};for(let r=0;r<ET;r+=1)if(n=Hm(t.path,e),n.dal!==void 0)return n.dal;if(n.dbVersion!==void 0&&n.dbVersion>Jt){let r=n.cause instanceof Error?n.cause.message:String(n.cause);throw new Error(`${t.path}: state.db schema is v${n.dbVersion}; this build (understands v${Jt}) can no longer operate on it (${r}). Update lmctl: npm install -g @lmctl-ai/lmctl@latest`)}for(let r=0;r<vT;r+=1){if(bT(t.path))try{return Um(t.path,n.cause)}finally{ST(t.path)}TT(wT);let s=Hm(t.path,e);if(s.dal!==void 0)return s.dal}return Um(t.path,n.cause)}function Bm(t,e,n){let r=Wm(e);if(r.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Wm(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(t)}function Wm(t){let e=kT(t),n=e===null?null:RT(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))ci(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function kT(t){try{let e=JSON.parse(t);return ci(e)?e:null}catch{return null}}function RT(t,e){let n=t[e];return ci(n)?n:null}function ci(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function IT(t){try{let e=JSON.parse(t);return!ci(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function xT(t,e){return t===null?!0:t.holder_host===Ga()?!Ne(t.holder_pid):t.last_heartbeat<e}function AT(t){return{getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
1579
+ `)),i}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${t}: unusable (${n}), and recovery into a fresh database also failed (${s}). Check that the containing directory is writable, or move the file aside manually and retry.`)}}function Gm(t,e){let n;try{return n=si({dbPath:t,allowSchemaSkew:e}),{dal:new ui(n)}}catch(r){if(r instanceof Ir)throw r;let s;if(n!==void 0)try{s=n.pragma("user_version",{simple:!0})}catch{}try{n?.close()}catch{}return{cause:r,dbVersion:s}}}function CT(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function NT(t){if(t===":memory:")return!0;try{return TT(`${t}${zm}`),!0}catch{return!1}}function OT(t){if(t!==":memory:")try{ST(`${t}${zm}`)}catch{}}function zt(t){let e=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1",n={};for(let r=0;r<IT;r+=1)if(n=Gm(t.path,e),n.dal!==void 0)return n.dal;if(n.dbVersion!==void 0&&n.dbVersion>Kt){let r=n.cause instanceof Error?n.cause.message:String(n.cause);throw new Error(`${t.path}: state.db schema is v${n.dbVersion}; this build (understands v${Kt}) can no longer operate on it (${r}). Update lmctl: npm install -g @lmctl-ai/lmctl@latest`)}for(let r=0;r<xT;r+=1){if(NT(t.path))try{return qm(t.path,n.cause)}finally{OT(t.path)}CT(AT);let s=Gm(t.path,e);if(s.dal!==void 0)return s.dal}return qm(t.path,n.cause)}function Jm(t,e,n){let r=Km(e);if(r.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Km(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(t)}function Km(t){let e=LT(t),n=e===null?null:MT(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))mi(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function LT(t){try{let e=JSON.parse(t);return mi(e)?e:null}catch{return null}}function MT(t,e){let n=t[e];return mi(n)?n:null}function mi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function PT(t){try{let e=JSON.parse(t);return!mi(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function DT(t,e){return t===null?!0:t.holder_host===za()?!Ne(t.holder_pid):t.last_heartbeat<e}function FT(t){return{getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
1580
1580
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
1581
1581
  VALUES (?, ?, ?, ?, ?)
1582
1582
  ON CONFLICT(scope, key, kind) DO UPDATE SET
@@ -1983,255 +1983,255 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1983
1983
  response = NULL
1984
1984
  WHERE id = ?
1985
1985
  AND status = 'running'
1986
- `),...mm(t),...cm(t)}}function CT(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var ET,qm,vT,wT,li,En=O(()=>{"use strict";$a();lm();dm();pm();gm();hn();oi();Mm();$m();ET=3,qm=".recovery.lock",vT=20,wT=50;li=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=AT(e),this.claimTxn=e.transaction((n,r,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(n,r,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((n,r,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(n,r,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((n,r,s,i,o)=>{let a=this.getJob(n);if(a===null)return{claimed:!1,reason:"not_found",job_id:n};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(r,s,i,a.id,i,i,i).changes!==1){let h=this.getJob(a.id);return{claimed:!1,reason:h?.locked_until!==null&&h?.locked_until!==void 0&&h.locked_until>=i?"locked":"not_claimable",job_id:n,status:h?.status??a.status,locked_by:h?.locked_by??a.locked_by,locked_until:h?.locked_until??a.locked_until}}let p=this.getJob(a.id);return p===null?{claimed:!1,reason:"not_found",job_id:n}:{claimed:!0,job:p}}),this.resumeRunTxn=e.transaction((n,r,s)=>CT("state_not_found")),this.resumeInteractiveTxn=e.transaction((n,r,s,i)=>{let o=this.getInteractiveSessionByStepId(n);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,r,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(n),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==Fm)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(r!==Pm&&!a.includes(r))return{resumed:!1,reason:Dm};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=r,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,n),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(n,r={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(n.receiver_teamfile,n.receiver_alias),i=r.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...n,holder_pid:process.pid,stale_before:r.stale_before??null,force:r.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:r.reclaim_reason??(r.force===!0?"force":r.reclaim_observed!==void 0?"dead-pid":"stale"),c=Tm(this.db,o,s,l,r.stale_before??null,r.force===!0);a={acquired:!0,current:o,lease_id:c}}else a={acquired:!1,current:this.getAgentInflight(n.receiver_teamfile,n.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...n){let r=e.trim().toLowerCase();if(!r.startsWith("select")&&!r.startsWith("with")&&!r.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...n)}insertWorkflow(e){Bm(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,W()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,e.definition,e.author??null,W());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,e.definition),i}upsertWorkflow(e){Bm(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(e.name);if(n===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,e.definition,e.author??null,W());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??n.definition_schema_version,s,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,e.definition),this.getWorkflow(n.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,W())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,n){return(n===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,n))??null}findWorkflowByName(e,n){return this.getWorkflowByName(e,n)}insertWorkflowVersion(e,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,n,r??null,W());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(r.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(n,r.definition,s,e),this.syncWorkflowTriggers(e,r.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,W()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,n){return this.stmts.setTriggerCursor.run(n,W(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,n){return this.stmts.setTriggerFailure.run(W(),n,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,n){let r;try{r=JSON.parse(n)}catch{return}if(r===null||typeof r!="object"||Array.isArray(r))return;let s=r.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let n=this.stmts.insertTeam.run(e.name,W());return this.stmts.getTeam.get(n.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let n=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,W());return this.stmts.getTeamMember.get(n.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,n){return this.stmts.findTeamMemberByAlias.get(e,n)??null}updateTeamMemberSession(e,n){return this.stmts.updateTeamMemberSession.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,n,r){return this.stmts.setMemberState.run(n,r??null,W(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,n){return this.stmts.setMemberPromptSnapshot.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,n){return this.stmts.setMemberProviderResolved.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,n){return this.stmts.setMemberRolePrompt.run(n,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,n){let r=this.stmts.getTeamMember.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"role_prompt"),i=Object.prototype.hasOwnProperty.call(n,"model"),o=Object.prototype.hasOwnProperty.call(n,"provider");return this.stmts.updateTeamMemberMeta.run(s?n.role_prompt??null:r.role_prompt,i?n.model??null:r.model,o?n.provider??r.provider:r.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let n=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,W());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(e){let n=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",W());return this.stmts.getProject.get(n.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,n){return this.stmts.setProjectIntakeConfig.run(n,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,n){let r=this.stmts.getProject.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"local_path"),i=Object.prototype.hasOwnProperty.call(n,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(n,"default_branch"),a=Object.prototype.hasOwnProperty.call(n,"intake_config");return this.stmts.updateProjectSettings.run(s?n.local_path:r.local_path,i?n.durable_memory_mode:r.durable_memory_mode,o?n.default_branch??null:r.default_branch,a?n.intake_config??null:r.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let n=JSON.parse(e.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let n=e.condition??null,r=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,n,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,W());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,n={}){return n.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let n=W(),r=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,n={}){return this.stmts.listIssuesForProject.all(e).filter(r=>!(n.status!==void 0&&!n.status.includes(r.status)||n.severity!==void 0&&!n.severity.includes(r.severity)||n.ai_test_path!==void 0&&r.ai_test_path!==n.ai_test_path))}claimNextIssue(e,n){return this.stmts.claimNextIssue.get(n,W(),e)??null}claimIssue(e,n){return this.stmts.claimIssue.get(n,W(),e)??null}closeIssue(e,n,r){let s=W(),i=this.stmts.closeIssue.get(n,r??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,n){let r=this.stmts.reopenIssue.get(n,W(),e);if(r===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return r}updateIssue(e,n){let r=this.getIssue(e);if(r===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(n,"labels"),i=Object.prototype.hasOwnProperty.call(n,"ai_test_path"),o=this.stmts.updateIssue.get(n.title??r.title,n.body??r.body,n.severity??r.severity,s?n.labels??null:r.labels,i?n.ai_test_path??null:r.ai_test_path,W(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,n){let r=this.stmts.getWebuiSession.get(e);if(r!==void 0)return r;let s=W();return this.stmts.insertWebuiSession.run(e,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,W(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,n){if(this.stmts.setWebuiSessionChatbot.run(n,W(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,n){let r=jm(),s=W();return this.stmts.insertChatbotSession.run(r,e,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,n,r,s){let i=W(),o=this.stmts.insertChatbotMessage.run(e,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,n){this.stmts.upsertConfig.run(e,n,W())}getConfigAll(){let e=this.stmts.listConfig.all(),n={};for(let r of e)n[r.key]=r.value;return n}enqueueJob(e){let n=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??W(),e.dedupe_key??null,e.concurrency_key??null,W());if(n.changes===1)return this.stmts.getJob.get(n.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let n=W(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,r,n)}claimNextJobWithConcurrency(e){let n=W(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,r,n,e.evaluator)}claimJobByIdWithConcurrency(e){let n=W(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,r,n,e.evaluator)}releaseJob(e,n,r){let s=n==="queued"||n==="running"?null:W();return this.stmts.releaseJob.run(n,r??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,n){return this.stmts.findJobByDedupe.get(e,n)??null}insertRun(e){let n=this.getWorkflow(e.workflow_id);if(n===null)throw new Error(`workflow not found: ${e.workflow_id}`);let r=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,n.active_version_id,e.parent_run_id??null,W()),s=this.stmts.getRun.get(r.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,n){return this.stmts.setJobRun.run(n,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,W()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,n){return this.stmts.setPromptDispatchCompleted.run(n??W(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let n=e.id??"default";this.stmts.ensureWorkspace.run(n,e.name??"Default workspace",e.idleThresholdMs??6e5,W());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let n=W(),r=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,n,n),s=Number(r.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let n=this.getWebProject(e.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??n.name,e.config_json===void 0?n.config_json:e.config_json,W(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(W(),e).changes===1}loadMailboxCursor(e,n){return this.stmts.loadMailboxCursor.get(e,n)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,n,r){return this.stmts.loadUsage.get(e,n,r)??null}sumUsageForPeriod(e,n){let r=this.stmts.sumUsageForPeriod.get(e,n);return{put:r?.put??0,get:r?.get??0,list:r?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.message_type??null,e.created_at),r=Number(n.lastInsertRowid);return Wa(this.db,r,e),ii(this.db,r,e),r})()}beginTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.message_type??null,e.created_at),r=Number(n.lastInsertRowid);return Wa(this.db,r,e),r})()}finishTeamChatLog(e,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);ii(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{Ha(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>Ba(this.db,e,n,r))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,n=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let n=e.started_at??W(),r=e.holder_host??Ga(),s=e.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Qe(e.command),n,e.holder_pid??null,r,s,Qe(e.meta),e.launch_source??e.kind,e.request_payload??null,e.parent_invocation_id??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return Am(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,n,r={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,n];r.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(r.sinceMs).toISOString())),r.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(r.untilMs).toISOString()));let o=Math.max(1,Math.trunc(r.limit??200));return this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${s.join(" AND ")} ORDER BY started_at DESC LIMIT ?`).all(...i,o)}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}listRecentlyFinishedTrackedInvocations(e){return this.stmts.listRecentlyFinishedTrackedInvocations.all(e)}listFinishedTrackedInvocationChildren(e,n){if(e.length===0)return[];let r=e.map(()=>"?").join(", ");return this.db.prepare(`
1986
+ `),..._m(t),...fm(t)}}function $T(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var IT,zm,xT,AT,ui,wn=O(()=>{"use strict";Ba();pm();gm();ym();vm();yn();ci();jm();Wm();IT=3,zm=".recovery.lock",xT=20,AT=50;ui=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=FT(e),this.claimTxn=e.transaction((n,r,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(n,r,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((n,r,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(n,r,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((n,r,s,i,o)=>{let a=this.getJob(n);if(a===null)return{claimed:!1,reason:"not_found",job_id:n};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(r,s,i,a.id,i,i,i).changes!==1){let h=this.getJob(a.id);return{claimed:!1,reason:h?.locked_until!==null&&h?.locked_until!==void 0&&h.locked_until>=i?"locked":"not_claimable",job_id:n,status:h?.status??a.status,locked_by:h?.locked_by??a.locked_by,locked_until:h?.locked_until??a.locked_until}}let p=this.getJob(a.id);return p===null?{claimed:!1,reason:"not_found",job_id:n}:{claimed:!0,job:p}}),this.resumeRunTxn=e.transaction((n,r,s)=>$T("state_not_found")),this.resumeInteractiveTxn=e.transaction((n,r,s,i)=>{let o=this.getInteractiveSessionByStepId(n);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,r,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(n),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==Bm)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(r!==Um&&!a.includes(r))return{resumed:!1,reason:Hm};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=r,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,n),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(n,r={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(n.receiver_teamfile,n.receiver_alias),i=r.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...n,holder_pid:process.pid,stale_before:r.stale_before??null,force:r.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:r.reclaim_reason??(r.force===!0?"force":r.reclaim_observed!==void 0?"dead-pid":"stale"),c=Im(this.db,o,s,l,r.stale_before??null,r.force===!0);a={acquired:!0,current:o,lease_id:c}}else a={acquired:!1,current:this.getAgentInflight(n.receiver_teamfile,n.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...n){let r=e.trim().toLowerCase();if(!r.startsWith("select")&&!r.startsWith("with")&&!r.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...n)}insertWorkflow(e){Jm(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,W()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,e.definition,e.author??null,W());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,e.definition),i}upsertWorkflow(e){Jm(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(e.name);if(n===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,e.definition,e.author??null,W());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??n.definition_schema_version,s,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,e.definition),this.getWorkflow(n.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,W())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,n){return(n===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,n))??null}findWorkflowByName(e,n){return this.getWorkflowByName(e,n)}insertWorkflowVersion(e,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,n,r??null,W());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(r.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(n,r.definition,s,e),this.syncWorkflowTriggers(e,r.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,W()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,n){return this.stmts.setTriggerCursor.run(n,W(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,n){return this.stmts.setTriggerFailure.run(W(),n,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,n){let r;try{r=JSON.parse(n)}catch{return}if(r===null||typeof r!="object"||Array.isArray(r))return;let s=r.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let n=this.stmts.insertTeam.run(e.name,W());return this.stmts.getTeam.get(n.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let n=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,W());return this.stmts.getTeamMember.get(n.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,n){return this.stmts.findTeamMemberByAlias.get(e,n)??null}updateTeamMemberSession(e,n){return this.stmts.updateTeamMemberSession.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,n,r){return this.stmts.setMemberState.run(n,r??null,W(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,n){return this.stmts.setMemberPromptSnapshot.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,n){return this.stmts.setMemberProviderResolved.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,n){return this.stmts.setMemberRolePrompt.run(n,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,n){let r=this.stmts.getTeamMember.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"role_prompt"),i=Object.prototype.hasOwnProperty.call(n,"model"),o=Object.prototype.hasOwnProperty.call(n,"provider");return this.stmts.updateTeamMemberMeta.run(s?n.role_prompt??null:r.role_prompt,i?n.model??null:r.model,o?n.provider??r.provider:r.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let n=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,W());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(e){let n=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",W());return this.stmts.getProject.get(n.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,n){return this.stmts.setProjectIntakeConfig.run(n,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,n){let r=this.stmts.getProject.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"local_path"),i=Object.prototype.hasOwnProperty.call(n,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(n,"default_branch"),a=Object.prototype.hasOwnProperty.call(n,"intake_config");return this.stmts.updateProjectSettings.run(s?n.local_path:r.local_path,i?n.durable_memory_mode:r.durable_memory_mode,o?n.default_branch??null:r.default_branch,a?n.intake_config??null:r.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let n=JSON.parse(e.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let n=e.condition??null,r=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,n,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,W());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,n={}){return n.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let n=W(),r=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,n={}){return this.stmts.listIssuesForProject.all(e).filter(r=>!(n.status!==void 0&&!n.status.includes(r.status)||n.severity!==void 0&&!n.severity.includes(r.severity)||n.ai_test_path!==void 0&&r.ai_test_path!==n.ai_test_path))}claimNextIssue(e,n){return this.stmts.claimNextIssue.get(n,W(),e)??null}claimIssue(e,n){return this.stmts.claimIssue.get(n,W(),e)??null}closeIssue(e,n,r){let s=W(),i=this.stmts.closeIssue.get(n,r??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,n){let r=this.stmts.reopenIssue.get(n,W(),e);if(r===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return r}updateIssue(e,n){let r=this.getIssue(e);if(r===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(n,"labels"),i=Object.prototype.hasOwnProperty.call(n,"ai_test_path"),o=this.stmts.updateIssue.get(n.title??r.title,n.body??r.body,n.severity??r.severity,s?n.labels??null:r.labels,i?n.ai_test_path??null:r.ai_test_path,W(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,n){let r=this.stmts.getWebuiSession.get(e);if(r!==void 0)return r;let s=W();return this.stmts.insertWebuiSession.run(e,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,W(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,n){if(this.stmts.setWebuiSessionChatbot.run(n,W(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,n){let r=Xm(),s=W();return this.stmts.insertChatbotSession.run(r,e,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,n,r,s){let i=W(),o=this.stmts.insertChatbotMessage.run(e,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,n){this.stmts.upsertConfig.run(e,n,W())}getConfigAll(){let e=this.stmts.listConfig.all(),n={};for(let r of e)n[r.key]=r.value;return n}enqueueJob(e){let n=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??W(),e.dedupe_key??null,e.concurrency_key??null,W());if(n.changes===1)return this.stmts.getJob.get(n.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let n=W(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,r,n)}claimNextJobWithConcurrency(e){let n=W(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,r,n,e.evaluator)}claimJobByIdWithConcurrency(e){let n=W(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,r,n,e.evaluator)}releaseJob(e,n,r){let s=n==="queued"||n==="running"?null:W();return this.stmts.releaseJob.run(n,r??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,n){return this.stmts.findJobByDedupe.get(e,n)??null}insertRun(e){let n=this.getWorkflow(e.workflow_id);if(n===null)throw new Error(`workflow not found: ${e.workflow_id}`);let r=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,n.active_version_id,e.parent_run_id??null,W()),s=this.stmts.getRun.get(r.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,n){return this.stmts.setJobRun.run(n,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,W()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,n){return this.stmts.setPromptDispatchCompleted.run(n??W(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let n=e.id??"default";this.stmts.ensureWorkspace.run(n,e.name??"Default workspace",e.idleThresholdMs??6e5,W());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let n=W(),r=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,n,n),s=Number(r.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let n=this.getWebProject(e.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??n.name,e.config_json===void 0?n.config_json:e.config_json,W(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(W(),e).changes===1}loadMailboxCursor(e,n){return this.stmts.loadMailboxCursor.get(e,n)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,n,r){return this.stmts.loadUsage.get(e,n,r)??null}sumUsageForPeriod(e,n){let r=this.stmts.sumUsageForPeriod.get(e,n);return{put:r?.put??0,get:r?.get??0,list:r?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.message_type??null,e.created_at),r=Number(n.lastInsertRowid);return Ja(this.db,r,e),li(this.db,r,e),r})()}beginTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.message_type??null,e.created_at),r=Number(n.lastInsertRowid);return Ja(this.db,r,e),r})()}finishTeamChatLog(e,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);li(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{qa(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>Ga(this.db,e,n,r))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,n=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let n=e.started_at??W(),r=e.holder_host??za(),s=e.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,Ze(e.command),n,e.holder_pid??null,r,s,Ze(e.meta),e.launch_source??e.kind,e.request_payload??null,e.parent_invocation_id??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return Mm(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,n,r={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,n];r.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(r.sinceMs).toISOString())),r.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(r.untilMs).toISOString()));let o=Math.max(1,Math.trunc(r.limit??200));return this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${s.join(" AND ")} ORDER BY started_at DESC LIMIT ?`).all(...i,o)}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}listRecentlyFinishedTrackedInvocations(e){return this.stmts.listRecentlyFinishedTrackedInvocations.all(e)}listFinishedTrackedInvocationChildren(e,n){if(e.length===0)return[];let r=e.map(()=>"?").join(", ");return this.db.prepare(`
1987
1987
  SELECT * FROM tracked_invocation
1988
1988
  WHERE parent_invocation_id IN (${r})
1989
1989
  AND ended_at IS NOT NULL
1990
1990
  AND ended_at >= ?
1991
1991
  ORDER BY started_at ASC, id ASC
1992
- `).all(...e,n)}finishTrackedInvocation(e,n){return this.db.transaction(()=>{let r=n.ended_at??W();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,Qe(n.result_summary),Qe(n.error),n.team_chat_log_id??null,Qe(n.meta),Qe(n.config_warnings),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return ai(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,n,r){return this.db.transaction(()=>{let s=r.ended_at??W();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,Qe(r.result_summary),Qe(r.error),r.team_chat_log_id??null,Qe(r.meta),Qe(r.config_warnings),s,e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return ai(this.db,o),o})()}heartbeatTrackedInvocation(e,n=W()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return Nm(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(Om(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:(Lm(this.db,e,It(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=W();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Qe(r),e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return ai(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(e,n){let r=this.stmts.getTeamChatLogById.get(e);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,e).changes!==1||ii(this.db,e,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:W()})}listClaimableTerminalTrackedInvocations(e){let n=["status IN ('done', 'error', 'busy', 'cancelled', 'aborted')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(e,n,r=W()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Cm(this.db,i,n,r),i})()}listTrackedInvocations(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status)),e.kind!==void 0&&(n.push("kind = ?"),r.push(e.kind)),e.origin!==void 0&&(n.push("origin = ?"),r.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));r.push(s);let i=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}updateTeamChatLogResponse(e,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e)}getAgentInflight(e,n){return this.stmts.getAgentInflight.get(e,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,n){return this.tryAcquireAgentInflightTxn(e,n)}heartbeatAgentInflight(e,n,r=W()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:bm(this.db,s,n,r)})()}clearAgentInflight(e,n){this.db.transaction(()=>{let s=this.getAgentInflight(e,n);if(s===null)return;this.stmts.clearAgentInflight.run(e,n).changes===1&&xr(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(e,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return o.changes===1&&i!==null&&xr(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
1993
- WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&xr(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(xr(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(kr,Ir(e,n),Rr);return r===void 0?null:fm(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&Xa(this.db,r,!0),this.stmts.upsertRuntimeState.run(kr,Ir(e.teamfile,e.alias),Rr,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&Sm(this.db,e)})()}heartbeatTerminalLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,n);if(i===null||i.lock_id!==r)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(kr,Ir(e,n),Rr,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(kr,Ir(e,n),Rr);return i.changes===1&&Xa(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,n,r){let s=this.stmts.getRuntimeState.get(e,n,r);return s===void 0?null:IT(s.data)}tryAcquireRuntimeProcessLock(e,n,r,s,i=W()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,n,r);if(o!==null&&!xT(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:jm(),holder_pid:process.pid,holder_host:Ga(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,n,r,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,n){return this.stmts.setRunCurrentState.run(n,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,n,r){return this.stmts.setRunPausedState.run(n,r,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,n){return this.stmts.setRunPendingEscalationDecision.run(n,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,n){return this.stmts.setRunTerminalState.run(n,W(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,n){return this.resumeRunTxn(e,n,W())}insertStep(e){let n=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,W());return this.stmts.getStep.get(n.lastInsertRowid)}finishStep(e,n,r){return this.stmts.finishStep.run(n??null,r??null,W(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let n=this.stmts.listLatestStepOutcomesByState.all(e),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(e){let n=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??W(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(n.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let n=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,W());return this.stmts.getStepArtifact.get(n.lastInsertRowid)}insertExternalObject(e){let r=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,W()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:r}}insertExternalSignal(e){let n=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,W()),r=n.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:r}}raiseAttention(e){let n=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,W());return this.stmts.getAttention.get(n.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(W(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let n=W();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,n,n),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,n){return this.stmts.getDurableMemoryByName.get(e,n)??null}deleteDurableMemory(e,n){return this.stmts.deleteDurableMemory.run(e,n).changes>0}listDurableMemory(e,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(e,n):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(e).filter(s=>n.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(e){let n=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??W());return this.stmts.getSessionSize.get(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,n,r=20){return this.stmts.sessionSizeHistory.all(e,n,r)}insertSessionEvent(e){let n=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(n.lastInsertRowid)}listSessionEvents(e,n){return n!==void 0?this.stmts.listSessionEventsSince.all(e,n):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,n=1e3){return this.stmts.listAllEventsSince.all(e,n)}latestAgentCall(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(n===void 0)return null;try{let r=JSON.parse(n.payload);return typeof r.alias!="string"||typeof r.provider!="string"?null:{alias:r.alias,provider:r.provider,...typeof r.model=="string"?{model:r.model}:{}}}catch{return null}}agentCallTokenTotals(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),r=0,s=0,i=0;for(let o of n)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(r+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:r,totalOutputTokens:s,agentCallCount:i}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let n=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(n.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,n,r){return this.stmts.findUnackedDrift.get(e,n??null,r)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let n=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,n,n),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,n){return this.stmts.getInteractiveSessionByRunAndState.get(e,n)??null}setInteractiveAgentOutput(e,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),e)}resumeInteractive(e,n,r){return this.resumeInteractiveTxn(e,n,r,W())}resumeEscalation(e,n){return this.resumeEscalationTxn(e,n,W())}}});import{homedir as NT}from"node:os";import{join as Gm}from"node:path";function MT(t=process.env){let e=t.LMCTL_HOME;return e!==void 0&&e.length>0?e:Gm(t.HOME||NT(),OT)}function Jm(t=process.env){return Gm(MT(t),LT)}function Wn(t,e=process.env){return t!==void 0&&t.length>0?t:e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0?e.LMCTL_DB:Jm(e)}function Km(t,e=process.env){return e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0&&e.LMCTL_DB!==Jm(e)?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}var OT,LT,di=O(()=>{"use strict";OT=".lmctl",LT="state.db"});import{isAbsolute as PT,resolve as Vm,join as zm}from"node:path";function ui(t,e){let n=Ja.get(t);if(!n||t.closed)throw Error("Context is closed");return n.resources.add(e),()=>n.resources.delete(e)}function mi(t){let e=Ja.get(t);if(!e)throw Error("Unknown context");return e.dal()}function xt(t){let e=Ym.get(t);if(!e)throw Error("Context state is unavailable");return e}function Xn(t){return t!==null&&typeof t=="object"&&Qm.has(t)}function Zm(t){try{if(!t||typeof t!="object"||Array.isArray(t))return j("invalid_argument","Context needs an explicit options map");let e={...t},n=["pid","env","cwd","dbPath","dal","onProgress","onWarning","clock","interactive"];if(Object.keys(e).some(h=>!n.includes(h)))return j("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!PT(e.cwd))return j("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...e.env});if(Object.values(r).some(h=>h!==void 0&&typeof h!="string"))return j("invalid_argument","Environment values must be strings or undefined");for(let h of["onProgress","onWarning","clock"])if(e[h]!==void 0&&typeof e[h]!="function")return j("invalid_argument",h+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return j("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return j("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return j("invalid_argument","pid must be a positive integer");let s=Vm(e.cwd),i=r.LMCTL_HOME||(r.HOME?zm(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(i?zm(i,"state.db"):void 0)))return j("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,c,d=new AbortController,u=new Set,m=h=>{if(l){try{l.close()}catch(_){h.push(G(_))}l=void 0}},p=Object.freeze({status:"ok",error:null,pid:e.pid,signal:d.signal,env:r,cwd:s,dbPath:Vm(s,Wn(e.dbPath,r)),dal:e.dal,interactive:e.interactive??r.LMCTL_NON_INTERACTIVE!=="1",onProgress:e.onProgress??(()=>{}),onWarning:e.onWarning??(()=>{}),clock:e.clock??Date.now,get closed(){return a},close(){return c||(a=!0,d.abort(),c=(async()=>{let h=[],_=0;for(let y of[...u])try{await y.close(),_++}catch(f){h.push(G(f))}finally{u.delete(y)}return m(h),{released:_,errors:h}})(),c)},finalizeSync(h){a=!0,d.abort(h);let _=[],y=0;for(let w of[...u])try{w.finalizeSync(h),y++}catch(g){_.push(G(g))}finally{u.delete(w)}m(_);let f={released:y,errors:_};return c??=Promise.resolve(f),f}});return Ja.set(p,{resources:u,dal(){if(e.dal)return e.dal;if(a)throw Error("Context is closed");return l??=Vt({path:p.dbPath})}}),Qm.add(p),Ym.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(e){return j("invalid_argument","Invalid context: "+G(e))}}var Ja,Ym,Qm,zt=O(()=>{"use strict";En();di();Xe();Ja=new WeakMap;Ym=new WeakMap;Qm=new WeakSet});function ep(t){let e=Object.create(null),n=Object.create(null),r=(s,i,o=!0)=>{if(Array.isArray(s)){let a=s.map((l,c)=>r(l,i+"."+c,!1));return o&&(n[i]=a),a}if(s&&typeof s=="object"&&!(s instanceof Date)){let a=Object.create(null);for(let[l,c]of Object.entries(s)){let u=/^Provider[123]$/.test(i)&&["provider","model1","model2","model3"].includes(l)?l[0].toUpperCase()+l.slice(1):l;if(Object.hasOwn(a,u))throw Error(`Ambiguous property '${i}.${u}'`);a[u]=r(c,i?i+"."+u:u,o&&/^[_a-zA-Z]\w*$/.test(u))}return a}return o&&(n[i]=s),s};for(let[s,i]of Object.entries(t))e[s]=r(i,s,/^[_a-zA-Z]\w*$/.test(s));return{properties:e,flat:n}}var tp=O(()=>{"use strict"});function pi(t){return{Provider1:t.provider1.provider,Provider2:t.provider2.provider,Provider3:t.provider3.provider,Model1:t.provider1.model1,Model2:t.provider2.model1,Model3:t.provider3.model1}}var Ka=O(()=>{"use strict"});function DT(t,e){let n=t.slice(0,e).split(/\r?\n/);return[n.length,n.pop().length+1]}function FT(t,e,n){let r=t.split(/\r?\n/),s="",i=(Math.log10(e+1)|0)+1;for(let o=e-1;o<=e+1;o++){let a=r[o-1];a&&(s+=o.toString().padEnd(i," "),s+=": ",s+=a,s+=`
1992
+ `).all(...e,n)}finishTrackedInvocation(e,n){return this.db.transaction(()=>{let r=n.ended_at??W();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,Ze(n.result_summary),Ze(n.error),n.team_chat_log_id??null,Ze(n.meta),Ze(n.config_warnings),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return di(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,n,r){return this.db.transaction(()=>{let s=r.ended_at??W();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,Ze(r.result_summary),Ze(r.error),r.team_chat_log_id??null,Ze(r.meta),Ze(r.config_warnings),s,e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return di(this.db,o),o})()}heartbeatTrackedInvocation(e,n=W()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return Dm(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(Fm(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:($m(this.db,e,xt(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=W();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Ze(r),e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return di(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(e,n){let r=this.stmts.getTeamChatLogById.get(e);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,e).changes!==1||li(this.db,e,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:W()})}listClaimableTerminalTrackedInvocations(e){let n=["status IN ('done', 'error', 'busy', 'cancelled', 'aborted')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(e,n,r=W()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Pm(this.db,i,n,r),i})()}listTrackedInvocations(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status)),e.kind!==void 0&&(n.push("kind = ?"),r.push(e.kind)),e.origin!==void 0&&(n.push("origin = ?"),r.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));r.push(s);let i=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}updateTeamChatLogResponse(e,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e)}getAgentInflight(e,n){return this.stmts.getAgentInflight.get(e,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,n){return this.tryAcquireAgentInflightTxn(e,n)}heartbeatAgentInflight(e,n,r=W()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:xm(this.db,s,n,r)})()}clearAgentInflight(e,n){this.db.transaction(()=>{let s=this.getAgentInflight(e,n);if(s===null)return;this.stmts.clearAgentInflight.run(e,n).changes===1&&Nr(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(e,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return o.changes===1&&i!==null&&Nr(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
1993
+ WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&Nr(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Nr(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(xr,Cr(e,n),Ar);return r===void 0?null:Em(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&Ka(this.db,r,!0),this.stmts.upsertRuntimeState.run(xr,Cr(e.teamfile,e.alias),Ar,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&Am(this.db,e)})()}heartbeatTerminalLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,n);if(i===null||i.lock_id!==r)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(xr,Cr(e,n),Ar,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(xr,Cr(e,n),Ar);return i.changes===1&&Ka(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,n,r){let s=this.stmts.getRuntimeState.get(e,n,r);return s===void 0?null:PT(s.data)}tryAcquireRuntimeProcessLock(e,n,r,s,i=W()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,n,r);if(o!==null&&!DT(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Xm(),holder_pid:process.pid,holder_host:za(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,n,r,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,n){return this.stmts.setRunCurrentState.run(n,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,n,r){return this.stmts.setRunPausedState.run(n,r,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,n){return this.stmts.setRunPendingEscalationDecision.run(n,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,n){return this.stmts.setRunTerminalState.run(n,W(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,n){return this.resumeRunTxn(e,n,W())}insertStep(e){let n=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,W());return this.stmts.getStep.get(n.lastInsertRowid)}finishStep(e,n,r){return this.stmts.finishStep.run(n??null,r??null,W(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let n=this.stmts.listLatestStepOutcomesByState.all(e),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(e){let n=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??W(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(n.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let n=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,W());return this.stmts.getStepArtifact.get(n.lastInsertRowid)}insertExternalObject(e){let r=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,W()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:r}}insertExternalSignal(e){let n=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,W()),r=n.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:r}}raiseAttention(e){let n=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,W());return this.stmts.getAttention.get(n.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(W(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let n=W();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,n,n),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,n){return this.stmts.getDurableMemoryByName.get(e,n)??null}deleteDurableMemory(e,n){return this.stmts.deleteDurableMemory.run(e,n).changes>0}listDurableMemory(e,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(e,n):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(e).filter(s=>n.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(e){let n=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??W());return this.stmts.getSessionSize.get(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,n,r=20){return this.stmts.sessionSizeHistory.all(e,n,r)}insertSessionEvent(e){let n=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(n.lastInsertRowid)}listSessionEvents(e,n){return n!==void 0?this.stmts.listSessionEventsSince.all(e,n):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,n=1e3){return this.stmts.listAllEventsSince.all(e,n)}latestAgentCall(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(n===void 0)return null;try{let r=JSON.parse(n.payload);return typeof r.alias!="string"||typeof r.provider!="string"?null:{alias:r.alias,provider:r.provider,...typeof r.model=="string"?{model:r.model}:{}}}catch{return null}}agentCallTokenTotals(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),r=0,s=0,i=0;for(let o of n)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(r+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:r,totalOutputTokens:s,agentCallCount:i}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let n=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(n.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,n,r){return this.stmts.findUnackedDrift.get(e,n??null,r)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let n=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,n,n),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,n){return this.stmts.getInteractiveSessionByRunAndState.get(e,n)??null}setInteractiveAgentOutput(e,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),e)}resumeInteractive(e,n,r){return this.resumeInteractiveTxn(e,n,r,W())}resumeEscalation(e,n){return this.resumeEscalationTxn(e,n,W())}}});import{homedir as jT}from"node:os";import{join as Ym}from"node:path";function BT(t=process.env){let e=t.LMCTL_HOME;return e!==void 0&&e.length>0?e:Ym(t.HOME||jT(),UT)}function Qm(t=process.env){return Ym(BT(t),HT)}function Gn(t,e=process.env){return t!==void 0&&t.length>0?t:e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0?e.LMCTL_DB:Qm(e)}function Zm(t,e=process.env){return e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0&&e.LMCTL_DB!==Qm(e)?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}var UT,HT,pi=O(()=>{"use strict";UT=".lmctl",HT="state.db"});import{isAbsolute as WT,resolve as ep,join as tp}from"node:path";function fi(t,e){let n=Ya.get(t);if(!n||t.closed)throw Error("Context is closed");return n.resources.add(e),()=>n.resources.delete(e)}function gi(t){let e=Ya.get(t);if(!e)throw Error("Unknown context");return e.dal()}function At(t){let e=np.get(t);if(!e)throw Error("Context state is unavailable");return e}function Jn(t){return t!==null&&typeof t=="object"&&rp.has(t)}function sp(t){try{if(!t||typeof t!="object"||Array.isArray(t))return j("invalid_argument","Context needs an explicit options map");let e={...t},n=["pid","env","cwd","dbPath","dal","onProgress","onWarning","clock","interactive"];if(Object.keys(e).some(h=>!n.includes(h)))return j("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!WT(e.cwd))return j("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...e.env});if(Object.values(r).some(h=>h!==void 0&&typeof h!="string"))return j("invalid_argument","Environment values must be strings or undefined");for(let h of["onProgress","onWarning","clock"])if(e[h]!==void 0&&typeof e[h]!="function")return j("invalid_argument",h+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return j("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return j("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return j("invalid_argument","pid must be a positive integer");let s=ep(e.cwd),i=r.LMCTL_HOME||(r.HOME?tp(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(i?tp(i,"state.db"):void 0)))return j("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,c,d=new AbortController,u=new Set,m=h=>{if(l){try{l.close()}catch(_){h.push(G(_))}l=void 0}},p=Object.freeze({status:"ok",error:null,pid:e.pid,signal:d.signal,env:r,cwd:s,dbPath:ep(s,Gn(e.dbPath,r)),dal:e.dal,interactive:e.interactive??r.LMCTL_NON_INTERACTIVE!=="1",onProgress:e.onProgress??(()=>{}),onWarning:e.onWarning??(()=>{}),clock:e.clock??Date.now,get closed(){return a},close(){return c||(a=!0,d.abort(),c=(async()=>{let h=[],_=0;for(let y of[...u])try{await y.close(),_++}catch(f){h.push(G(f))}finally{u.delete(y)}return m(h),{released:_,errors:h}})(),c)},finalizeSync(h){a=!0,d.abort(h);let _=[],y=0;for(let w of[...u])try{w.finalizeSync(h),y++}catch(g){_.push(G(g))}finally{u.delete(w)}m(_);let f={released:y,errors:_};return c??=Promise.resolve(f),f}});return Ya.set(p,{resources:u,dal(){if(e.dal)return e.dal;if(a)throw Error("Context is closed");return l??=zt({path:p.dbPath})}}),rp.add(p),np.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(e){return j("invalid_argument","Invalid context: "+G(e))}}var Ya,np,rp,Yt=O(()=>{"use strict";wn();pi();Xe();Ya=new WeakMap;np=new WeakMap;rp=new WeakSet});function ip(t){let e=Object.create(null),n=Object.create(null),r=(s,i,o=!0)=>{if(Array.isArray(s)){let a=s.map((l,c)=>r(l,i+"."+c,!1));return o&&(n[i]=a),a}if(s&&typeof s=="object"&&!(s instanceof Date)){let a=Object.create(null);for(let[l,c]of Object.entries(s)){let u=/^Provider[123]$/.test(i)&&["provider","model1","model2","model3"].includes(l)?l[0].toUpperCase()+l.slice(1):l;if(Object.hasOwn(a,u))throw Error(`Ambiguous property '${i}.${u}'`);a[u]=r(c,i?i+"."+u:u,o&&/^[_a-zA-Z]\w*$/.test(u))}return a}return o&&(n[i]=s),s};for(let[s,i]of Object.entries(t))e[s]=r(i,s,/^[_a-zA-Z]\w*$/.test(s));return{properties:e,flat:n}}var op=O(()=>{"use strict"});function hi(t){return{Provider1:t.provider1.provider,Provider2:t.provider2.provider,Provider3:t.provider3.provider,Model1:t.provider1.model1,Model2:t.provider2.model1,Model3:t.provider3.model1}}var Qa=O(()=>{"use strict"});function XT(t,e){let n=t.slice(0,e).split(/\r?\n/);return[n.length,n.pop().length+1]}function qT(t,e,n){let r=t.split(/\r?\n/),s="",i=(Math.log10(e+1)|0)+1;for(let o=e-1;o<=e+1;o++){let a=r[o-1];a&&(s+=o.toString().padEnd(i," "),s+=": ",s+=a,s+=`
1994
1994
  `,o===e&&(s+=" ".repeat(i+n+2),s+=`^
1995
- `))}return s}var J,vn=O(()=>{J=class t extends Error{line;column;codeblock;constructor(e,n){let[r,s]=DT(n.toml,n.ptr),i=FT(n.toml,r,s);super(`Invalid TOML document: ${e}
1996
-
1997
- ${i}`,n),this.line=r,this.column=s,this.codeblock=i}static x(e,n,r){throw new t(e,{toml:n.s,ptr:r??n.p})}}});function fi(t){let e=t.p,n=t.s.charCodeAt(t.p++),r=n,s=n===39,i=n===t.s.charCodeAt(t.p)&&n===t.s.charCodeAt(t.p+1);i&&((n=t.s.charCodeAt(t.p+=2))===10?t.p++:n===13&&t.s.charCodeAt(t.p+1)===10&&(t.p+=2));let o="",a=t.p,l=0;for(;t.p<t.s.length;t.p++)if(n=t.s.charCodeAt(t.p),i&&(n===10||n===13&&t.s.charCodeAt(t.p+1)===10))l=l&&3;else if(n<32&&n!==9||n===127)J.x("control characters are not allowed in strings",t);else if((!l||l===3)&&n===r&&(!i||t.s.charCodeAt(t.p+1)===r&&t.s.charCodeAt(t.p+2)===r)){if(i&&(t.s.charCodeAt(t.p+3)===r&&t.p++,t.s.charCodeAt(t.p+3)===r&&t.p++),!l){let c=t.s.slice(a,t.p);o=o?o+c:c}return t.p+=i?3:1,o}else if(!l)!s&&n===92&&(o+=t.s.slice(a,a=t.p),l=1);else if(l===1)if(n===120||n===117||n===85){let c=t.p++-1,d=0,u=n===120?2:n===117?4:8;for(let m=0;m<u;m++,t.p++){let p=t.s.charCodeAt(t.p),h=p>=48&&p<=57?p-48:p>=65&&p<=70?p-65+10:p>=97&&p<=102?p-97+10:-1;h<0&&J.x("invalid non-hex character in unicode escape",t),d=d<<4|h}(d<0||d>1114111||d>=55296&&d<=57343)&&J.x("invalid unicode escape",t,c),o+=String.fromCodePoint(d),a=t.p--,l=0}else i&&(n===32||n===9)?l=2:(n===98?o+="\b":n===116?o+=" ":n===110?o+=`
1998
- `:n===102?o+="\f":n===114?o+="\r":n===101?o+="\x1B":n===34?o+='"':n===92?o+="\\":J.x("unrecognised escape sequence",t),a=t.p+1,l=0);else n!==32&&n!==9&&(l===2&&J.x("invalid escape: only line-ending whitespace may be escaped",t,a),l=!s&&n===92?1:0,a=t.p);J.x("unfinished string",t,e)}var Va=O(()=>{vn();});var $T,Ar,za=O(()=>{$T=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,Ar=class t extends Date{#t=!1;#n=!1;#e=null;constructor(e,n,r){let s=!0,i=!0,o="Z",a;if(typeof e=="string")if(n)e:{if(n<3){if(+e.slice(11,13)>23){e="";break e}n===2?(o=null,e+="Z"):(a=e.charCodeAt(e.length-1))!==90&&a!==122&&(o=e.slice(e.length-6)),r&&(e=e.slice(0,10)+"T"+e.slice(11))}else n===4&&(e=+e.slice(0,2)>23?"":`0000-01-01T${e}Z`);s=n!==4,i=n!==3}else{let l=e.match($T);l?(l[1]||(s=!1,e=`0000-01-01T${e}`),i=!!l[2],i&&e[10]===" "&&(e=e.replace(" ","T")),l[2]&&+l[2]>23?e="":(o=l[3]||null,!o&&i&&(e+="Z"))):e=""}super(e),isNaN(this.getTime())||(this.#t=s,this.#n=i,this.#e=o)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let e=super.toISOString();if(this.isDate())return e.slice(0,10);if(this.isTime())return e.slice(11,23);if(this.#e===null)return e.slice(0,-1);if(this.#e==="Z"||this.#e==="z")return e;let n=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return n=this.#e[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(e,n="Z"){let r=new t(e);return r.#e=n,r}static wrapAsLocalDateTime(e){let n=new t(e);return n.#e=null,n}static wrapAsLocalDate(e){let n=new t(e);return n.#n=!1,n.#e=null,n}static wrapAsLocalTime(e){let n=new t(e);return n.#t=!1,n.#e=null,n}}});function qe(t,e=10){return e===16?t>47&&t<58||t>64&&t<71||t>96&&t<103:t>47&&t<48+e}function Qa(t,e){return t===32||t===9||t===10||t===13||e&&(t===e||t===44)||t===35}function Nr(t,e){let n=t.p,r=t.s.charCodeAt(t.p);if(r===91||r===123){t.d--||J.x("document contains excessively nested structures. aborting.",t);let s=r===91?sp(t):rp(t);return t.d++,s}return r===34||r===39?fi(t):r===116?((t.s.charCodeAt(++t.p)!==114||t.s.charCodeAt(++t.p)!==117||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!0):r===102?((t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==108||t.s.charCodeAt(++t.p)!==115||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!1):r===43||r===45?gi(t,t.p,t.s.charCodeAt(++t.p),44-r,e):t.s.charCodeAt(t.p+4)===45&&t.s.charCodeAt(t.p+7)===45?jT(t,r,e):t.s.charCodeAt(t.p+2)===58?UT(t,r,e):gi(t,t.p,r,0,e)}function gi(t,e,n,r,s){let i=n,o=0,a=!1;if(i===105)return(t.s.charCodeAt(++t.p)!==110||t.s.charCodeAt(++t.p)!==102)&&J.x("invalid value",t,e),t.p++,(r||1)/0;if(i===110)return(t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==110)&&J.x("invalid value",t,e),t.p++,NaN;if(i===48){if(++t.p>=t.s.length||Qa(i=t.s.charCodeAt(t.p),s))return t.bi===!0?0n:0;if(!r){if(i===120)return Ya(t,e,16,s);if(i===98)return Ya(t,e,2,s);if(i===111)return Ya(t,e,8,s)}i===46?o=2:i===101||i===69?o=4:J.x("illegal leading zero",t,e)}else qe(i)||J.x("invalid value",t,e);for(;++t.p<t.s.length&&(i=t.s.charCodeAt(t.p),!Qa(i,s));)o||(o=1),i===95?(o&1||J.x("illegal underscore",t),o+=11,a=!0):o===1&&i===46?o=2:(o===1||o===3)&&(i===101||i===69)?o=4:o===4&&(i===43||i===45)||(qe(i)?o>9?o-=11:o&1||o++:J.x("illegal character in numeric literal",t));if(!o){let c=(n-48)*(r||1);return t.bi===!0?BigInt(c):c}o&1||J.x("unfinished numeric value",t,e);let l=t.s.slice(e,t.p);return a&&(l=l.replaceAll("_","")),o>1?parseFloat(l):np(t,l,10,e)}function Ya(t,e,n,r){let s,i=1;for(;++t.p<t.s.length&&(s=t.s.charCodeAt(t.p),!Qa(s,r));)s===95?(i&1&&J.x("illegal underscore",t),i=3):qe(s,n)?i&1&&i--:J.x("illegal character in numeric literal",t);i&1&&J.x("unfinished numeric value",t);let o=t.s.slice(e+2,t.p);return i&&(o=o.replaceAll("_","")),np(t,o,n,e)}function np(t,e,n,r){if(t.bi!==!0)e:{let s=parseInt(e,n);if(!Number.isSafeInteger(s)){if(t.bi)break e;J.x("integer value cannot be represented losslessly",t,r)}return s}return BigInt(n===10?e:(n===2?"0b":n===8?"0o":"0x")+e)}function jT(t,e,n){let r=t.p++,s;if(!qe(e)||!qe(t.s.charCodeAt(t.p++))||!qe(t.s.charCodeAt(t.p++))||!qe(t.s.charCodeAt(t.p++)))return gi(t,t.p=r,e,0,n);if(t.p+=5,qe(t.s.charCodeAt(t.p++))||J.x("invalid date-time: date part is malformed",t,r),t.p>=t.s.length||((e=t.s.charCodeAt(t.p))!==32||(s=!0,!qe(t.s.charCodeAt(t.p+1))))&&e!==84&&e!==116){let o=t.s.slice(r,t.p);return Cr(t,o,3,!1,r)}if(t.s.charCodeAt(t.p+=3)!==58&&J.x("invalid date-time: time part is malformed",t,r),t.s.charCodeAt(t.p+=3)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;qe(t.s.charCodeAt(++t.p)););if(e=t.s.charCodeAt(t.p)){if(e===90||e===122){let o=t.s.slice(r,++t.p);return Cr(t,o,1,s,r,"[+00:00]")}if(e===43||e===45){let o=t.s.slice(r,t.p+=6);return Cr(t,o,1,s,r,!t.ld&&"["+t.s.slice(t.p-6,t.p)+"]")}}let i=t.s.slice(r,t.p);return Cr(t,i,2,s,r)}function UT(t,e,n){let r=t.p;if(!qe(e)||!qe(t.s.charCodeAt(++t.p)))return gi(t,--t.p,e,0,n);if(t.s.charCodeAt(t.p+=4)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;qe(t.s.charCodeAt(++t.p)););let s=t.s.slice(r,t.p);return Cr(t,s,4,!1,r)}function Cr(t,e,n,r,s,i){if(t.ld){let o=new Ar(e,n,r);return o.isValid()||J.x("invalid date",t,s),o}try{switch(i&&(e+=i),n){case 1:return Temporal.ZonedDateTime.from(e);case 2:return Temporal.PlainDateTime.from(e);case 3:return Temporal.PlainDate.from(e);case 4:return Temporal.PlainTime.from(e)}}catch(o){J.x(o instanceof Error?o.message:""+o,t,s)}}var Za=O(()=>{Va();el();vn();za();});function HT(t){for(;t.p<t.s.length;t.p++){let e=t.s.charCodeAt(t.p);if(e===10)break;if(e===13&&t.s.charCodeAt(t.p+1)===10){t.p++;break}(e<32&&e!==9||e===127)&&J.x("control characters are not allowed in comments",t)}}function rt(t,e,n){let r;for(;t.p<t.s.length;){for(;t.p<t.s.length&&((r=t.s.charCodeAt(t.p))===32||r===9||!e&&(r===10||r===13&&t.s.charCodeAt(t.p+1)===10));)t.p++;if(n||r!==35)break;HT(t)}}var tl=O(()=>{vn();});function hi(t,e=61){let n,r=0,s=[],i,o=t.s.charCodeAt(n=t.p);do{if(o===e)return r||J.x("unexpected end of key",t),r===1&&s.push(t.s.slice(i,t.p)),t.p++,s;o===46?(r||J.x("illegal empty bare key",t),r===1&&s.push(t.s.slice(i,t.p)),r=0):!r&&(o===34||o===39)?(o===t.s.charCodeAt(t.p+1)&&o===t.s.charCodeAt(t.p+2)&&J.x("illegal quoted key: multiline strings are not allowed",t),s.push(fi(t)),r=2,t.p--):o===32||o===9?r===1&&(s.push(t.s.slice(i,t.p)),r=2):r===2||o<48&&o!==45||o>57&&o<65||o>90&&o<97&&o!==95||o>122?J.x("illegal character in key",t):r||(r=1,i=t.p)}while(o=t.s.charCodeAt(++t.p));J.x("incomplete key-value: cannot find end of key",t,n)}function rp(t){let e=t.p++,n=Object.create(null),r=new Set,s;for(;t.p<t.s.length;){if(rt(t),(s=t.s.charCodeAt(t.p))===125)return t.p++,n;let i,o=n,a=!1,l=t.p,c=hi(t);for(let u=0;u<c.length;u++){u&&(o=a?o[i]:o[i]=Object.create(null)),i=c[u],(a=Object.hasOwn(o,i))&&(typeof o[i]!="object"||r.has(o[i]))&&J.x("trying to redefine an already defined value",t,l);let m=i==="__proto__";if(t.uk&&(m||i==="constructor")){o=t.uk!==1&&J.x("document contains an unsafe property",t,l);break}!a&&m&&Object.defineProperty(o,i,{enumerable:!0,configurable:!0,writable:!0})}a&&J.x("trying to redefine an already defined value",t,l),rt(t,!0,!0);let d=Nr(t,125);if(o&&typeof(o[i]=d)=="object"&&r.add(d),rt(t),(s=t.s.charCodeAt(t.p++))===125)return n;s!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished table",t,e)}function sp(t){let e=t.p++,n=[],r;for(;t.p<t.s.length;){if(rt(t),(r=t.s.charCodeAt(t.p))===93)return t.p++,n;if(n.push(Nr(t,93)),rt(t),(r=t.s.charCodeAt(t.p++))===93)return n;r!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished array",t,e)}var el=O(()=>{Va();Za();tl();vn();});function ip(t,e,n,r,s){let i=n,o=r,a,l=!1,c;for(let d=0;d<e.length;d++){if(d){if(i=l?i[a]:i[a]=Object.create(null),o=(c=o[a]).c,s===0&&(c.t===1||c.t===2))return null;if(c.t===2){let u=i.length-1;i=i[u],o=o[u].c}}if(a=e[d],(l=Object.hasOwn(i,a))&&o[a]?.t===0&&o[a]?.d)return null;if(!l){let u=a==="__proto__";if(t.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0})),o[a]={t:d<e.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(c=o[a],c.t!==s&&!(s===1&&c.t===3)||(s===2&&(c.d||(c.d=!0,i[a]=[]),i[a].push(i=Object.create(null)),c.c[c.i++]=c={t:1,d:!1,i:0,c:Object.create(null)}),c.d))return null;if(c.d=!0,s===1)i=l?i[a]:i[a]=Object.create(null);else if(s===0&&l)return null;return[a,i,c.c]}function op(t,e,n){(e===null||t.uk===2)&&J.x(e===null?"trying to redefine an already defined table or value":"document contains an unsafe property",t,n)}function _i(t,e={}){let n={s:t,p:0,d:e.maxDepth??1e3,bi:e.integersAsBigInt??!1,ld:e.useLegacyDate??!0,uk:e.unsafeKeyBehaviour==="throw"?2:e.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),i,o=!1,a=r,l=s;for(t.charCodeAt(0)===65279&&n.p++,rt(n);n.p<t.length;){if(t.charCodeAt(n.p)===91){let c=t.charCodeAt(++n.p)===91;i=n.p+=+c,o=!1;let d=hi(n,93);c&&(t.charCodeAt(n.p)!==93&&J.x("expected end of table array declaration",n),n.p++);let u=ip(n,d,r,s,c?2:1);u?(l=u[2],a=u[1]):(op(n,u,i),o=!0)}else{i=n.p;let c=hi(n),d=ip(n,c,a,l,0);!d&&!o&&op(n,d,i),rt(n,!0,!0);let u=Nr(n,void 0);d&&!o&&(d[1][d[0]]=u)}rt(n,!0),n.p<t.length&&(i=t.charCodeAt(n.p))!==10&&(i!==13||t.charCodeAt(n.p+1)!==10)&&J.x("each key-value declaration must be followed by an end-of-line",n),rt(n)}return r}var ap=O(()=>{el();Za();tl();vn();});var iP,lp=O(()=>{iP=!!"".isWellFormed});var nl=O(()=>{ap();lp();za();vn();});import{readFileSync as BT}from"node:fs";import{homedir as WT}from"node:os";import{join as cp,resolve as XT}from"node:path";function Or(t=process.env,e){let n=t.LMCTL_HOME||(t.HOME===void 0?process.env.LMCTL_HOME:void 0);return e!==void 0?XT(e):cp(n||cp(t.HOME||WT(),".lmctl"),"init.toml")}function yi(t,e="<init.toml>"){let n;try{n=_i(t.startsWith("\uFEFF")?t.slice(1):t,{integersAsBigInt:"asNeeded",useLegacyDate:!0})}catch(s){let i=s;throw new st(e,"syntax",i.message,i.line??1,(i.column??1)+(t.startsWith("\uFEFF")&&i.line===1?1:0))}let r={};for(let s of dp){let i=n[s];if(!i||typeof i!="object"||Array.isArray(i)||i instanceof Date)throw new st(e,"schema","missing or invalid table ["+s+"]");let o={};for(let a of up){let l=i[a];if(typeof l!="string"||!l.trim())throw new st(e,"schema",s+"."+a+" must be a nonempty string");o[a]=l}r[s.toLowerCase()]=o}return{raw:t,document:n,config:r,path:e}}function Lr(t=Or()){let e;try{e=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(BT(t))}catch(n){let r=n;throw new st(t,r.code==="ENOENT"?"missing":"read",r.message)}return yi(e,t)}var dp,up,st,Ei=O(()=>{"use strict";nl();dp=["Provider1","Provider2","Provider3"],up=["provider","model1","model2","model3"];st=class extends Error{constructor(n,r,s,i=1,o=1){super(r==="missing"?"Missing "+n+". Run lmctl init first.":(r==="read"?"Cannot read "+n+": "+s:"Invalid "+n+":"+i+":"+o+": "+s)+". Fix the file or run lmctl init.");this.path=n;this.kind=r;this.line=i;this.column=o}}});var mp=O(()=>{"use strict";nl();Ei()});var pp=O(()=>{"use strict";la();Ka();Ei();Ei();mp()});import{resolve as qT,join as fp}from"node:path";function rl(t,e={}){try{if(!Xn(t))return j("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return j("cancelled","Context is closed");if(!e||typeof e!="object"||Array.isArray(e))return j("invalid_argument","Profile options must be a map");let n=e.path;if(Object.keys(e).some(i=>!(We.find(o=>o.name==="loadProfile")?.params.find(o=>o.name==="options")?.keys??[]).some(o=>o.name===i))||n!==void 0&&(typeof n!="string"||!n))return j("invalid_argument","Profile options accept a nonempty path string only");let r=t.env.LMCTL_HOME||(t.env.HOME?fp(t.env.HOME,".lmctl"):void 0);if(!n&&!r)return j("invalid_argument","Profile path requires HOME, LMCTL_HOME or an explicit path");let s=qT(t.cwd,n??fp(r,"init.toml"));return ce({path:Or({...t.env,HOME:t.env.HOME??t.cwd},s)})}catch(n){return j("invalid_argument","Invalid profile arguments: "+G(n))}}function GT(t){try{if(!t||typeof t!="object"||Array.isArray(t))return j("invalid_argument","Expected a validated InitConfig");let e={};for(let n of["provider1","provider2","provider3"]){let r=t[n];if(!r||typeof r!="object"||Array.isArray(r))return j("invalid_argument",n+" must be a provider map");let s={};for(let i of["provider","model1","model2","model3"]){let o=r[i];if(typeof o!="string"||!o.trim())return j("invalid_argument",n+"."+i+" must be a nonempty string");s[i]=o}e[n]=s}return ce(pi(e))}catch(e){return j("invalid_argument","Invalid profile: "+G(e))}}function JT(t,e={}){let n=rl(t,e);if(n.status==="error")return n;try{let r=Lr(n.path);return ce({profile:{path:r.path,raw:r.raw,config:r.config},values:{...pi(r.config),Directory:t.cwd,NonInteractive:!t.interactive}})}catch(r){return r instanceof st?j(r.kind,r.message,{path:r.path,line:r.line,column:r.column}):j("read","Could not load profile: "+G(r),{path:n.path})}}function KT(t,e={}){let n=rl(t,e);if(n.status==="error")return n;try{let r=Lr(n.path),{properties:s,flat:i}=ep(r.document);return ce({path:r.path,properties:s,flat:i})}catch(r){return r instanceof st?j(r.kind,r.message,{path:r.path,line:r.line,column:r.column}):j("schema","Invalid properties in "+n.path+": "+G(r)+". Fix the file or run lmctl init.",{path:n.path})}}var gp=O(()=>{"use strict";tp();qt();pp();Ka();zt();Xe()});function At(t){return t!=="gemini"}function vi(t){if(!At(t))throw new Error(Yt)}var Yt,qn=O(()=>{"use strict";Yt="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model."});function hp(t){if(t.length===0||!t.startsWith("---"))throw new ft("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1999
- `);if(e[0]!=="---")throw new ft("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){r=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new ft(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!VT.has(c))throw new ft(`unknown frontmatter key "${c}" \u2014 allowed keys: ${wi.join(", ")}`);n[c]=d}if(r===-1)throw new ft("frontmatter not closed (missing trailing `---` on its own line)");for(let o of wi)if(n[o]===void 0)throw new ft(`missing required frontmatter key "${o}" \u2014 required: ${wi.join(", ")}`);let s=0;for(let o=0;o<=r;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=n.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:n.title,description:n.description,members:i,bodyOffset:s}}var wi,VT,ft,_p=O(()=>{"use strict";wi=["title","description","members"],VT=new Set(wi),ft=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as zT,writeFileSync as BP,renameSync as WP,existsSync as Ep}from"node:fs";import{basename as YT,resolve as Gn,dirname as sl}from"node:path";function ZT(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],i=r[2]!==void 0?r[2]:r[3];e[s]=i}return e}function eb(t){return/^\s*_MEMBER_\s+\S/.test(t)}function tb(t){return/^\s*_SESSION_\s+\S/.test(t)}function nb(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Mr(t){return/\.(?:lmctl|lmc)$/i.test(t)}function Pr(t){return YT(t).replace(/\.(?:lmctl|lmc)$/i,"")}function it(t){let e=zT(t,"utf-8"),n=sl(Gn(t)),r=ol(e,Pr(t),{baseDir:n,sourcePath:Gn(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Gn(n,s.sessiondir));return r}function ol(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2000
- `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=hp(i)}catch(l){if(l instanceof ft)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
2001
- `);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(tb(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(nb(c)||!eb(c))continue;let u=ZT(c);for(let p of Object.keys(u))if(!yp.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2002
- allowed keys: ${yp.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}if(!u.alias){s.push(`line ${d}: member line missing required alias: ${c.trim()}`);continue}let m={alias:u.alias,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),r.push(m)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:o}}function al(t,e){let n=[];for(let i of t.parseErrors)n.push({field:"session",message:i});let r=t.members.filter(i=>i.alias.toLowerCase()===il.toLowerCase());r.length>1&&n.push({field:il,message:`${r.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&n.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?Gn(e,i.teamfile):Gn(i.teamfile);if(!Ep(a))n.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=it(a),c=Ti(l);c?c.session||n.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else QT.has(i.provider)?At(i.provider)||n.push({field:i.alias,message:Yt}):n.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&n.push({field:i.alias,message:"sessiondir is empty"})}return n}function Ti(t){return t.members.find(e=>e.alias.toLowerCase()===il.toLowerCase())}function ll(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=Gn(e,t.teamfile),o=n??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!Ep(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=it(i),l=Ti(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return ll(l,sl(i),o,r);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||sl(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function vp(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var il,QT,yp,Ct=O(()=>{"use strict";qn();_p();il="Lead",QT=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"]);yp=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as rb}from"node:crypto";import{existsSync as wp,readFileSync as Tp,realpathSync as sb}from"node:fs";import{dirname as ib,resolve as bp}from"node:path";function gt(t,e){let n=bp(t);if(wp(n))return sb(n);if(e!==void 0){let r=ab(t,n,e);if(r!==null)return r}return n}function Si(t,e){let n=ib(e),r=ol(t,Pr(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=bp(n,s.sessiondir));return r}function ki(t,e,n=r=>{process.stderr.write(`warning: ${r}
2003
- `)}){let r=gt(t,ob(e)?e:void 0);if(wp(r)){let i=Tp(r,"utf8"),o=Si(i,r);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(r)===null&&lb(o)&&db(e,r,o,i,n),o}let s=e?.getRootTeam(r)??null;throw s!==null?new Error(`teamfile missing on disk: ${r} (registered ${s.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${t}`)}function ob(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function ab(t,e,n){let r=n.getRootTeam(t)??n.getRootTeam(e);return r===null?null:r.teamfile_path}function lb(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=cl)}function dl(t,e,n){let r=gt(e),s=n.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=cl);if(s.length!==0)for(let i of t.listRootTeams()){let o,a;try{if(o=gt(i.teamfile_path),o===r)continue;a=Tp(o,"utf8")}catch(c){if(cb(c))continue;throw c}let l=Si(a,o);for(let c of s){let d=l.members.find(u=>u.teamfile===void 0&&u.session===c.session&&(u.session?.length??0)>=cl);if(d!==void 0)throw new bi(`sessionid ownership conflict: ${r}:${c.alias} and ${o}:${d.alias} both use sessionid "${c.session}"`)}}}function cb(t){let e=t?.code;return e==="ENOENT"||e==="ENOTDIR"}function db(t,e,n,r,s){try{dl(t,e,n)}catch(o){if(!(o instanceof bi))throw o;s(`${o.message}; skipping automatic registration`);return}let i={teamfile_path:e,name:n.name,raw_text:r,raw_sha256:rb("sha256").update(r).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(i)}var cl,bi,Dr=O(()=>{"use strict";Ct();cl=5,bi=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}}});import{randomUUID as ub}from"node:crypto";import{closeSync as mb,openSync as pb,readFileSync as kp,statSync as fb,unlinkSync as ul,writeFileSync as gb}from"node:fs";function Rp(t,e){return`${t}.seed-${e.toLowerCase()}.lock`}function Ip(t){let e;try{e=JSON.parse(kp(t,"utf8"))}catch(r){return r.code==="ENOENT"?!1:Sp(t)}let n=typeof e=="object"&&e!==null&&"pid"in e?e.pid:void 0;if(typeof n!="number"||!Number.isInteger(n)||n<=0)return Sp(t);try{return process.kill(n,0),!0}catch(r){return r.code!=="ESRCH"}}function Sp(t){try{return Date.now()-fb(t).mtimeMs<3e5}catch{return!1}}function ml(t,e){return Ip(Rp(t,e))}function xp(t,e){let n=Rp(t,e),r=JSON.stringify({pid:process.pid,token:ub()});for(let s=0;s<2;s+=1)try{let i=pb(n,"wx");try{gb(i,r)}catch(o){throw ul(n),o}finally{mb(i)}return()=>{try{kp(n,"utf8")===r&&ul(n)}catch(o){if(o.code!=="ENOENT")throw o}}}catch(i){if(i.code!=="EEXIST")throw i;if(Ip(n))throw new Error(`${e}: seed already in progress; wait for it to finish`);try{ul(n)}catch(o){if(o.code!=="ENOENT")throw o}}throw new Error(`${e}: could not acquire seed marker`)}var pl=O(()=>{"use strict"});import{existsSync as hb}from"node:fs";import{dirname as Ap}from"node:path";function gl(t){return fl.test(t)}function hl(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),n=t.slice(0,e),r=t.slice(e+1);return!Mr(n)||!fl.test(r)?null:{teamfile:n,alias:r}}function ht(t,e,n){if(!Mr(t))throw new ve(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl or .lmc extension).`);if(!gl(e))throw new ve(`lmctl: "${e}" is not a valid alias (must match ${fl.source}).`);let r=gt(t,n);if(n===void 0&&!hb(r))throw new ve(`lmctl: teamfile not found: ${t}`,"not_found");let s;try{s=ki(r,n)}catch(o){throw new ve(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ve(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=vp(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ve(`lmctl: alias "${e}" not found in ${t}.
2004
- Known aliases: ${o}`,"not_found")}if(i.teamfile!==void 0){let o=ll(i,Ap(r));return{teamfile:r,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(ml(r,i.alias))throw new ve(`lmctl: alias "${i.alias}" is being seeded. Wait for the seed to finish, then retry this prompt.`);if(i.session===void 0)throw s.members.some(o=>ml(r,o.alias))?new ve(`lmctl: alias "${i.alias}" has no session ID yet, and a seed is currently in progress for this team. Wait for the seed to finish, then retry this prompt.`):new ve(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
2005
- Run: lmctl seed ${t}`);return{teamfile:r,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??Ap(r),isLead:Ti(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}var ve,fl,Qt=O(()=>{"use strict";Ct();Ct();Dr();pl();ve=class extends Error{constructor(e,n){super(e),this.name="ChatTargetError",n&&Object.defineProperty(this,"kind",{value:n})}},fl=/^[A-Za-z][A-Za-z0-9_-]*$/});import{mkdirSync as Fp,readFileSync as _b,renameSync as yb,writeFileSync as Eb,existsSync as $p}from"node:fs";import{homedir as vb}from"node:os";import{dirname as jp,join as Ri,resolve as Ii}from"node:path";import{fileURLToPath as wb}from"node:url";function Rb(){return Ri(vb(),".lmctl","cache","lmprice")}function Jn(t,e){return Ri(t,e)}function wn(t){try{return JSON.parse(_b(t,"utf-8"))}catch{return null}}function Hp(t,e){let n=`${t}.tmp-${process.pid}`;Eb(n,e),yb(n,t)}function _l(t){return t===null||typeof t=="number"}function xi(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.schema_version!==1||!Array.isArray(e.records)||e.records.length===0?!1:e.records.every(n=>{if(typeof n!="object"||n===null)return!1;let r=n;if(typeof r.source!="string"||typeof r.source_model_id!="string"||typeof r.pricing!="object"||r.pricing===null)return!1;let s=r.pricing;return _l(s.input_per_1m_tokens)&&_l(s.output_per_1m_tokens)&&_l(s.input_cache_read_per_1m_tokens)})}function Ai(t){if(typeof t!="object"||t===null)return!1;let e=t;if(e.schema_version!==1||!Array.isArray(e.standards)||!Array.isArray(e.aliases))return!1;let n=e.standards.every(s=>{if(typeof s!="object"||s===null)return!1;let i=s;return typeof i.standard_slug=="string"&&(i.catalog_record_id===null||typeof i.catalog_record_id=="string")}),r=e.aliases.every(s=>{if(typeof s!="object"||s===null)return!1;let i=s;return typeof i.alias=="string"&&(i.standard_slug===null||typeof i.standard_slug=="string")&&typeof i.evidence=="string"&&xb.has(i.evidence)});return n&&r}function Ab(t){let e=wn(Jn(t,Up)),n={etag:typeof e?.model_list?.etag=="string"?e.model_list.etag:null,last_checked:typeof e?.model_list?.last_checked=="string"?e.model_list.last_checked:null},r={etag:typeof e?.aliases?.etag=="string"?e.aliases.etag:null,last_checked:typeof e?.aliases?.last_checked=="string"?e.aliases.last_checked:null};if(e===null){let s=wn(Jn(t,Ib));s&&(n.etag=typeof s.etag=="string"?s.etag:null,n.last_checked=typeof s.fetchedAt=="string"?s.fetchedAt:null)}return{model_list:n,aliases:r}}function Cb(t){let e=Ab(t),n=wn(Jn(t,yl)),r=wn(Jn(t,El));return{catalog:xi(n)?n:null,aliases:Ai(r)?r:null,meta:e}}function Nb(t,e){try{Fp(t,{recursive:!0}),Hp(Jn(t,Up),JSON.stringify(e))}catch{}}function Np(t,e,n){try{Fp(t,{recursive:!0}),Hp(Jn(t,e),JSON.stringify(n))}catch{}}function Ob(t,e){let n=Lb(t),r=n?[Ii(n,"data",e)]:[Ii(t,"..","..","data",e)];for(let s of r)if($p(s))return s;return null}function Lb(t){let e=Ii(t);for(;;){if($p(Ii(e,"package.json")))return e;let n=jp(e);if(n===e)return null;e=n}}function Op(t,e,n){let r=n!==void 0?n:Ob(t,e);return r===null?null:wn(r)}function Mb(){let t=process.env.LMCTL_PRICE_TTL;if(t===void 0||t==="")return Cp;let e=Number(t);return!Number.isFinite(e)||e<0?Cp:e*1e3}function Pb(){let t=process.env.LMCTL_PRICE_DATA;return t!==void 0&&t!==""?t:null}async function Lp(t,e,n,r){try{let s=await t(e,{method:"HEAD",signal:AbortSignal.timeout(Sb)});if(!s.ok)return{kind:"failed"};let i=s.headers.get("etag");if(n!==null&&i!==null&&i===r)return{kind:"match"};let o=await t(e,{signal:AbortSignal.timeout(kb)});return o.ok?{kind:"payload",payload:await o.json(),etag:o.headers.get("etag")??i}:{kind:"failed"}}catch{return{kind:"failed"}}}function Bp(t={}){return Object.keys(t).length===0?(Mp??=Pp(t),Mp):Pp(t)}async function Pp(t){let e=jp(wb(import.meta.url)),n=t.pinDir!==void 0?t.pinDir:Pb();if(n!==null&&n!==""){let h=wn(Ri(n,yl)),_=wn(Ri(n,El));if(xi(h)&&Ai(_)){let y={catalog:h,aliases:_,source:"pinned",generatedAt:h.generated_at??null};return vl=y.generatedAt,y}return Dp(t,e)}let r=t.fetchImpl??fetch,s=t.cacheDir??Rb(),i=t.now??Date.now(),o=t.ttlMs??Mb(),a=Cb(s),l=(h,_)=>h!==null&&_.last_checked!==null&&i-Date.parse(_.last_checked)<o,c=a.catalog,d=a.aliases,u=!1,m={model_list:{...a.meta.model_list},aliases:{...a.meta.aliases}},p=!1;if(!l(c,a.meta.model_list)){let h=await Lp(r,Tb,c,a.meta.model_list.etag);h.kind==="match"?(m.model_list.last_checked=new Date(i).toISOString(),p=!0):h.kind==="payload"&&(m.model_list.last_checked=new Date(i).toISOString(),p=!0,xi(h.payload)&&(c=h.payload,h.etag!==null&&(m.model_list.etag=h.etag),Np(s,yl,c),u=!0))}if(!l(d,a.meta.aliases)){let h=await Lp(r,bb,d,a.meta.aliases.etag);h.kind==="match"?(m.aliases.last_checked=new Date(i).toISOString(),p=!0):h.kind==="payload"&&(m.aliases.last_checked=new Date(i).toISOString(),p=!0,Ai(h.payload)&&(d=h.payload,h.etag!==null&&(m.aliases.etag=h.etag),Np(s,El,d),u=!0))}if((p||u)&&Nb(s,m),c!==null||d!==null){let h={catalog:c,aliases:d,source:u?"network":"cache",generatedAt:c?.generated_at??null};return vl=h.generatedAt,h}return Dp(t,e)}function Dp(t,e){let n=Op(e,"price-data.json",t.bundledPath),r=Op(e,"price-aliases.json",t.bundledAliasesPath),s=xi(n)?n:null,i=Ai(r)?r:null,o={catalog:s,aliases:i,source:s!==null||i!==null?"bundled":"unavailable",generatedAt:s?.generated_at??null};return vl=o.generatedAt,o}var Tb,bb,Sb,kb,Cp,yl,El,Up,Ib,xb,vl,Mp,Wp=O(()=>{"use strict";Tb="https://lmctl.com/dataset/model_list.json",bb="https://lmctl.com/dataset/aliases.json",Sb=1e3,kb=1e4,Cp=6*60*60*1e3;yl="model_list.json",El="aliases.json",Up="meta.json",Ib="model_list.meta.json";xb=new Set(["established","asserted","unresolved"]);vl=null,Mp=null});function bn(t){return t.toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function Tn(t){let e=t.source_model_id.toLowerCase(),n=e.slice(e.lastIndexOf("/")+1);return bn(n)}function qp(t){let e=new Set,n=r=>{let s=r.toLowerCase().split("/");for(let i=0;i<s.length;i+=1)e.add(bn(s.slice(i).join("/")))};return n(t.source_model_id),t.gateway_id&&n(t.gateway_id),e}function Db(t,e){let n=new Set,r=l=>{n.add(bn(l))},s=t.trim().toLowerCase(),i=null,o=s.indexOf(":");o>0&&!s.slice(0,o).includes("/")&&(i=s.slice(0,o),r(s),s=s.slice(o+1)),r(s);let a=s.slice(s.lastIndexOf("/")+1);r(a);for(let l of e)r(`${l}/${a}`);return i!==null&&r(`${i}/${a}`),[...n]}function Kn(t){let e=r=>!(r.mode!==void 0&&r.mode!==null&&r.mode!=="chat"||t.nonChatName&&t.nonChatName.test(r.source_model_id.toLowerCase())),n=r=>e(r)&&t.family.test(r.source_model_id.toLowerCase());return{firstPartyProviders:t.firstPartyProviders,isChatModel:e,coversRecord:n,normalize:r=>Db(r,t.vendorPrefixes),matchRow(r,s){if(!n(r))return!1;let i=qp(r);return s.some(o=>i.has(o))}}}function $b(t){let e=t.trim(),n=Fb.exec(e);return n?{model:e.slice(0,n.index).trim(),effort:n[1].trim()}:{model:e,effort:null}}function Bb(t,e,n){let r=e.trim().toLowerCase(),s=bn(r);if(n.records.some(o=>o.source_model_id.toLowerCase()===r&&t.matchRow(o,[s])))return!0;let i=t.normalize(e);return i.length>0&&n.records.some(o=>t.matchRow(o,i))}function Wb(t,e,n){let r=[];for(let[s,i]of Object.entries(Fr))s!==n&&Bb(i,t,e)&&r.push(s);return r}function Ci(t){return t==="moonshot"?0:t==="litellm"?1:t==="openrouter"?2:t==="manual"?3:4}function Xb(t,e){return t.input_per_1m_tokens===e.input_per_1m_tokens&&t.output_per_1m_tokens===e.output_per_1m_tokens&&t.input_cache_read_per_1m_tokens===e.input_cache_read_per_1m_tokens&&(t.input_cache_write_per_1m_tokens??null)===(e.input_cache_write_per_1m_tokens??null)&&(t.source_cost_fields?.cache_creation_input_token_cost??null)===(e.source_cost_fields?.cache_creation_input_token_cost??null)&&(t.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)===(e.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)}function qb(t){let e=new Map,n=[];for(let r of t){let s=r.source_model_id.toLowerCase(),i=s.lastIndexOf("/"),o=i===-1?"":s.slice(0,i+1),a=i===-1?s:s.slice(i+1),l=`${r.source}:${o}${bn(a)}`,c=e.get(l);if(c===void 0){e.set(l,r);continue}if(!Xb(c.pricing,r.pricing)){n.push(r);continue}/\d\.\d/.test(c.source_model_id)&&!/\d\.\d/.test(r.source_model_id)&&e.set(l,r)}return[...e.values(),...n]}function Gb(t){return{route:t.record_id??`${t.source}:${t.source_model_id}`,source:t.source,sourceModelId:t.source_model_id,provider:t.provider??null,pricing:t.pricing,estimated:t.source==="manual"}}function Qp(t,e){return t.map(Gb).sort((n,r)=>{let s=Ci(n.source)-Ci(r.source);if(s!==0)return s;let i=n.provider!==null&&e.includes(n.provider)?0:1,o=r.provider!==null&&e.includes(r.provider)?0:1;return i!==o?i-o:n.sourceModelId.localeCompare(r.sourceModelId)})}function Jb(t){return t.pricing.input_per_1m_tokens!==null&&t.pricing.output_per_1m_tokens!==null}function Kb(t,e,n){let r=qb(t),s=Qp(r,n),o=r.find(a=>(a.record_id??`${a.source}:${a.source_model_id}`)===s[0].route)?.context_window?.input_tokens??void 0;return{id:s[0].sourceModelId,normalizedId:e,offers:s,...o!=null?{contextWindow:o}:{}}}function wl(t,e,n){if(t.length===0)return{kind:"known-unpriced",id:e};let r=Kb(t,e,n),s=r.offers.find(Jb);return s===void 0?{kind:"known-unpriced",id:e}:s.estimated?{kind:"estimated",model:r}:{kind:"priced",model:r}}function Vb(t,e){return t.standards.find(n=>n.standard_slug.toLowerCase()===e.toLowerCase())??null}function zb(t,e,n){let r=t.standard_slug;if(e===null||e.catalog_record_id===null)return{kind:"known-unpriced",id:r};let s=e.catalog_record_id.toLowerCase(),i=n.records.find(l=>(l.record_id??`${l.source}:${l.source_model_id}`).toLowerCase()===s);if(!i)return{kind:"known-unpriced",id:r};let o=Tn(i),a=n.records.filter(l=>Tn(l)!==o?!1:l.mode===void 0||l.mode===null||l.mode==="chat");return a.length===0?{kind:"known-unpriced",id:r}:wl(a,o,Tl)}function Yb(t,e,n,r){if(n===null||!Array.isArray(n.records))return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};if(r!==null){let _=[e.trim().toLowerCase()];_.push(`${t.toLowerCase()}/${_[0]}`);let y=r.aliases.find(f=>_.includes(f.alias.toLowerCase()));if(y){if(y.evidence==="unresolved"||y.standard_slug===null)return{state:{kind:"unresolved",alias:y.alias},viaAlias:!0,pinRoute:null};let f=Vb(r,y.standard_slug);return{state:zb(y,f,n),viaAlias:!0,pinRoute:f?.catalog_record_id?.toLowerCase()??null}}}let s=Fr[t];if(!s)return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};let i=e.trim().toLowerCase(),o=s.normalize(e),a=_=>({state:_,viaAlias:!1,pinRoute:null}),l=bn(i),c=n.records.filter(_=>_.source_model_id.toLowerCase()===i&&s.matchRow(_,[l]));if(c.length>0){let _=Tn(c[0]),y=n.records.filter(f=>s.matchRow(f,[_])&&Tn(f)===_);return a(wl(y.length>0?y:c,_,Xp[t]??Tl))}let d=n.records.filter(_=>s.matchRow(_,o));if(d.length===0){let _=Wb(e,n,t);return _.length>0?a({kind:"wrong-provider",declared:e,otherProviders:_}):a({kind:"unknown",declared:e})}let u=new Map;for(let _ of d){let y=Tn(_),f=u.get(y);f?f.push(_):u.set(y,[_])}let m=Xp[t]??Tl,p=null,h=null;for(let _ of u.values()){let y=Qp(_,m);(h===null||Qb(y[0],h[0],m)<0)&&(p=_,h=y)}return a(wl(p,Tn(p[0]),m))}function Zp(t,e,n,r){return Yb(t,e,n,r).state}function ef(t,e){let n=Fr[e];if(!n)return null;let r=new Set;for(let s of t.records)n.coversRecord(s)&&r.add(Tn(s));return r.size}function Qb(t,e,n){let r=Ci(t.source)-Ci(e.source);if(r!==0)return r;let s=t.provider!==null&&n.includes(t.provider)?0:1,i=e.provider!==null&&n.includes(e.provider)?0:1;return s!==i?s-i:t.sourceModelId.localeCompare(e.sourceModelId)}var Gp,Jp,Kp,Vp,zp,Yp,Fb,jb,Ub,Hb,Fr,Xp,Tl,tf=O(()=>{"use strict";Gp=Kn({vendorPrefixes:["anthropic"],family:/claude/,firstPartyProviders:["anthropic"]}),Jp=Kn({vendorPrefixes:["openai"],family:/(^|\/)(gpt-|o\d|chatgpt|ft:gpt)|openai\//,firstPartyProviders:["openai"],nonChatName:/(^|[-/])(tts|transcribe(?:-\w+)?|realtime(?:-\w+)?|search(?:-\w+)*|image(?:-\w+)?|audio(?:-\w+)?|whisper(?:-\w+)?|dall-e(?:-\w+)?|embedding|moderation)(-|$)/}),Kp=Kn({vendorPrefixes:["google","gemini"],family:/gemini|gemma/,firstPartyProviders:["gemini","google","vertex_ai-language-models"],nonChatName:/embedding|imagen|-image|tts|audio|veo|lyria|live|realtime|video/}),Vp=Kn({vendorPrefixes:["moonshot","moonshotai"],family:/kimi|moonshot/,firstPartyProviders:["moonshot"]}),zp=Kn({vendorPrefixes:["dashscope","qwen"],family:/qwen/,firstPartyProviders:["dashscope"]}),Yp=Kn({vendorPrefixes:["deepseek","nousresearch"],family:/deepseek|nous|hermes-\d/,firstPartyProviders:["deepseek","nousresearch"]}),Fb=/\s*\(([^()]+)\)\s*$/;jb={"gemini 3.8 flash":"gemini-3.8-flash","gemini 3.7 flash":"gemini-3.7-flash","gemini 3.6 flash":"gemini-3.6-flash","gemini 3.1 pro":"gemini/gemini-3.1-pro-preview","claude sonnet 4.6":"claude-sonnet-4-6"},Ub=["gemini","google","vertex_ai-language-models","anthropic"],Hb={normalize(t){let{model:e}=$b(t),n=jb[e.toLowerCase()];return n===void 0?[]:[bn(n)]},isChatModel(t){return t.mode===void 0||t.mode===null||t.mode==="chat"},coversRecord(t){return this.isChatModel(t)&&/gemini|claude/.test(t.source_model_id.toLowerCase())},matchRow(t,e){if(!this.coversRecord(t))return!1;let n=qp(t);return e.some(r=>n.has(r))}},Fr={claude:Gp,codex:Jp,gemini:Kp,agy:Hb,kimi:Vp,qwen:zp,hermes:Yp},Xp={claude:Gp.firstPartyProviders,codex:Jp.firstPartyProviders,gemini:Kp.firstPartyProviders,agy:Ub,kimi:Vp.firstPartyProviders,qwen:zp.firstPartyProviders,hermes:Yp.firstPartyProviders};Tl=[]});import{spawnSync as xl}from"node:child_process";import{existsSync as of,readFileSync as af}from"node:fs";import{homedir as lf}from"node:os";import{resolve as Rl}from"node:path";function Vn(t,e){return e.code==="ETIMEDOUT"?`${t} did not respond within lint's own spawn timeout (${e.message}) \u2014 this does not mean the provider itself is unreachable, only that this specific check didn't finish in time.`:`${t} could not be run: ${e.message}`}function tS(){let t=xl("agy",["models"],{encoding:"utf-8",timeout:eS});return{status:t.status,stdout:t.stdout??"",error:t.error}}function nS(t){let e=[];for(let n of t.split(/\r?\n/)){let r=n.trim(),s=r.indexOf(" ");if(s<0)continue;let i=r.slice(s+1).trim();i&&e.push(i)}return e}function rS(t){if(!t&&bl)return bl;let e=s=>(t||(bl=s),s),n;try{n=(t??tS)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?Vn("agy models",s):`agy models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:Vn("agy models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${n.status??"unknown"}`});let r=nS(n.stdout);return r.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:r})}function iS(){let t=xl("codex",["debug","models"],{encoding:"utf-8",timeout:sS});return{status:t.status,stdout:t.stdout??"",error:t.error}}function oS(t){let e;try{e=JSON.parse(t)}catch{return}let n=e.models;if(!Array.isArray(n))return;let r=[];for(let s of n){if(!s||typeof s!="object")continue;let{slug:i,visibility:o}=s;typeof i=="string"&&o==="list"&&r.push(i)}return r}function aS(t){if(!t&&Sl)return Sl;let e=s=>(t||(Sl=s),s),n;try{n=(t??iS)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?Vn("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:Vn("codex debug models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`codex debug models exited with status ${n.status??"unknown"}`});let r=oS(n.stdout);return r===void 0?e({available:!1,models:[],reason:"codex debug models did not return parseable JSON"}):r.length===0?e({available:!1,models:[],reason:"codex debug models returned no user-visible models"}):e({available:!0,models:r})}function cS(t){let e=xl("opencode",t?["models",t]:["models"],{encoding:"utf-8",timeout:lS});return{status:e.status,stdout:e.stdout??"",error:e.error}}function dS(t,e){if(!e&&kl.has(t))return kl.get(t);let n=o=>(e||kl.set(t,o),o),r=t?`opencode models ${t}`:"opencode models",s;try{s=(e??cS)(t)}catch(o){return n({available:!1,models:[],reason:o instanceof Error?Vn(r,o):`${r} could not be run: ${String(o)}`})}if(s.error)return n({available:!1,models:[],reason:Vn(r,s.error)});if(s.status!==0)return n({available:!1,models:[],reason:`${r} exited with status ${s.status??"unknown"}`});let i=s.stdout.split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0);return i.length===0?n({available:!1,models:[],reason:`${r} returned no models`}):n({available:!0,models:i})}function Al(t,e={}){let n=[];for(let r of t){let s=r.provider.trim().toLowerCase();if(r.effort&&s!=="opencode"&&s!=="lmplayer"&&s!=="qwen"&&s!=="muse"&&n.push(`[${r.alias}] effort="${r.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),s==="qwen"&&r.effort&&n.push(`[${r.alias}] effort="${r.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),s==="copilot"){if(!r.model)continue;n.push(`[${r.alias}] model="${r.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(s!=="lmplayer"){if(s==="opencode"){if(r.effort&&!r.model&&n.push(`[${r.alias}] effort="${r.effort}" has no effect without model= on an opencode member.`),!r.model)continue;let i=pS(e.opencodeConfigPath);if(!i.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for opencode: ${i.reason}.`);continue}if(i.models.includes(r.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(r.model))continue;if(!r.model.includes("/")){let l=i.models.filter(c=>c.endsWith(`/${r.model}`));n.push(l.length>0?`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${r.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}let o=r.model.slice(0,r.model.indexOf("/")),a=dS(o,e.opencodeModelsRunner);if(a.available&&a.models.includes(r.model))continue;if(a.available&&!a.models.includes(r.model)){n.push(`[${r.alias}] model="${r.model}" was not found in opencode's LOCALLY-VISIBLE live catalog for "${o}" (checked \`opencode models ${o}\`) -- this is unresolved, not a confirmed unavailability: it could mean opencode genuinely doesn't serve this model, OR that your local catalog/auth for "${o}" is stale/incomplete. Declaring it in opencode.json may or may not help; if it doesn't, check whether a non-opencode provider serves this model directly (e.g. \`lmctl lint\` with model= against provider=codex/claude/gemini/agy).`);continue}n.push(`[${r.alias}] model="${r.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(s==="kimi"){if(!r.model)continue;let i=uS(e.kimiConfigPath);i.available?i.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not declared in Kimi's [models] config. Valid configured models: ${$r(i.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for kimi: ${i.reason}.`);continue}if(s==="agy"){if(!r.model)continue;let i=rS(e.agyModelsRunner);i.available?i.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${$r(i.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for agy: ${i.reason}.`);continue}if(s==="dsh"){if(!r.model||rf.includes(r.model))continue;nf.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in dsh's built-in catalog. Valid pinned models: ${$r(nf)}. Valid server-resolved aliases (DeepSeek resolves these to its current model server-side -- pinning to a specific version instead is a DOWNGRADE, not a safer choice): ${$r(rf)}. The catalog is patchable via dsh profile overlays \u2014 a model added that way warns here even though it may resolve.`);continue}if(s==="hermes"){if(!r.model)continue;let i=r.model.indexOf(":");(i<=0||i===r.model.length-1)&&n.push(`[${r.alias}] model="${r.model}" should use <provider>:<model> from Hermes's ACP catalog. lmctl checks the shape only; provider and model availability are resolved by Hermes.`);continue}if(s!=="pi"){if(s==="codex"){if(!r.model)continue;r.model===sf&&n.push(`[${r.alias}] model="${sf}" is banned as a build model (operator, 2026-09-06) -- it's a fast/cheap classification model, not intended for build work, and there's no cost reason left to reach for it. Use model=gpt-5.6-sol (or leave model= unset) for build work; if this member genuinely does non-build/classification work, this warning can be ignored.`);let i=aS(e.codexModelsRunner);if(!i.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for codex: ${i.reason}.`);continue}i.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in codex's live model catalog (\`codex debug models\`). Valid models: ${$r(i.models)}`);continue}r.model&&(cf.has(s)||n.push(`[${r.alias}] model="${r.model}" cannot be verified for provider "${s}": no model validation path exists for this provider.`))}}}return n}async function df(t,e={}){let n=t.filter(o=>o.model!==void 0&&cf.has(o.provider.trim().toLowerCase()));if(n.length===0)return{warnings:[],errors:[]};let r=e.snapshot??await Bp();if(r.catalog===null)return{warnings:[],errors:[]};let s=[],i=[];for(let o of n){let a=o.provider.trim().toLowerCase(),l=o.model,c=Zp(a,l,r.catalog,r.aliases);if(c.kind==="unknown"){let d=ef(r.catalog,a)??0;s.push(`[${o.alias}] model "${l}" is unknown to the lmprice catalog for provider "${a}" (${d} known) -- not necessarily wrong: may be a model too new for lmprice to have published yet, or a typo. A matching lmprice catalog/alias entry would resolve this; lint cannot otherwise confirm whether ${a} accepts it.`)}else c.kind==="wrong-provider"?i.push({field:o.alias,message:`model "${l}" is not offered by provider "${a}" -- it is a recognized model, but only under: ${c.otherProviders.join(", ")}. Declare provider="${c.otherProviders[0]}" (or another listed provider), or use a model "${a}" actually offers.`}):c.kind==="known-unpriced"&&s.push(`[${o.alias}] model "${l}" is recognized in the lmprice catalog but has no price information \u2014 cost will be unavailable`);if(a==="claude"&&(c.kind==="priced"||c.kind==="known-unpriced"||c.kind==="estimated")&&Zb.test(l)){let d=l.replace(/(\d)\.(?=\d)/g,"$1-");s.push(`[${o.alias}] model="${l}" matches the lmprice catalog only through its OpenRouter-style spelling ("." between version numbers); claude's own CLI expects "-" there and does an exact match, so it may reject this string verbatim even though lint recognizes it. If seed/chat fails with "issue with the selected model," try model="${d}" instead.`)}}return{warnings:s,errors:i}}async function uf(t,e={}){return(await df(t,e)).warnings}async function mf(t,e={}){return(await df(t,e)).errors}function uS(t){let e=process.env.KIMI_CODE_HOME||Rl(lf(),".kimi-code"),n=t??Rl(e,"config.toml");if(!of(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=af(n,"utf-8")}catch(i){return{available:!1,models:[],reason:`${n} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of r.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=mS(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s].sort()}}function mS(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function pS(t){let e=t??Rl(lf(),".config","opencode","opencode.json");if(!of(e))return{available:!0,models:[]};let n;try{n=JSON.parse(af(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:fS(n)}}function fS(t){if(!Il(t))return[];let e=Ni(t.provider)??Ni(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!Il(s))continue;let i=Ni(s.models)??Ni(s.model);if(i)for(let o of Object.keys(i))n.add(o.startsWith(`${r}/`)?o:`${r}/${o}`)}return[...n].sort()}function Ni(t){return Il(t)?t:null}function Il(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function $r(t){return t.length>0?t.join(", "):"(none)"}var cf,Zb,nf,rf,sf,eS,bl,sS,Sl,lS,kl,pf=O(()=>{"use strict";Wp();tf();cf=new Set(Object.keys(Fr).filter(t=>t!=="codex"&&t!=="kimi")),Zb=/\d\.(?=\d)/,nf=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],rf=["deepseek-flash","deepseek-pro"],sf="gpt-5.3-codex-spark",eS=15e3;bl=null;sS=5e3;Sl=null;lS=5e3;kl=new Map});function Sn(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var Oi=O(()=>{"use strict"});import{randomUUID as gS}from"node:crypto";import{chmodSync as ff,mkdirSync as hS,readdirSync as _S,statSync as yS,unlinkSync as ES,writeFileSync as vS}from"node:fs";import{homedir as wS,tmpdir as TS}from"node:os";import{join as jr}from"node:path";function AS(t){return Sn(t.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\|$)/g,"")).replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g,"\uFFFD")}function Ur(t){return AS(t).replace(/-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z0-9 ]*PRIVATE KEY-----|$)/g,"[REDACTED_PRIVATE_KEY]").replace(/\b((?:set-)?cookie\s*:[ \t]*)[^\r\n]+/gi,"$1[REDACTED]").replace(/\b([a-z][a-z0-9+.-]*:\/\/[^\s/:@]*):[^\s/@]+@/gi,"$1:[REDACTED]@").replace(/\bBearer\s+(?=[A-Za-z0-9._~+/-]{12,}\b)(?=[A-Za-z0-9._~+/-]*[0-9._~+/-])[A-Za-z0-9._~+/-]{12,}/gi,"Bearer [REDACTED]").replace(xS,"$1[REDACTED]").replace(/\b((?:[A-Z0-9]+_)*(?:KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIALS?)(?:_[A-Z0-9]+)*=)(?!\[REDACTED\])(?:"[^"]*"|'[^']*'|[^\s,;]+)/g,"$1[REDACTED]").replace(/([?&](?:key|sig|signature)=)[^&\s'"]+/gi,"$1[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{12,}\b/g,"[REDACTED_SECRET]").replace(/\b(?:gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|glpat-[A-Za-z0-9_-]{16,}|xox[abeprs]-[A-Za-z0-9-]{10,})/g,"[REDACTED_SECRET]").replace(/\bAIza[0-9A-Za-z_-]{20,}\b/g,"[REDACTED_SECRET]").replace(/\bAKIA[0-9A-Z]{16}\b/g,"[REDACTED_SECRET]").replace(/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,"[REDACTED_JWT]")}function CS(){let t=process.env.LMCTL_HOME||(process.env.NODE_ENV==="test"?jr(TS(),`lmctl-test-${process.pid}`,".lmctl"):jr(process.env.HOME||wS(),".lmctl"));return jr(t,"provider-errors")}function NS(t,e,n){if(t.length<=e)return t;let r=Math.floor(e*.2),s=e-r,i=t.length-e;return`${t.slice(0,r)}
1995
+ `))}return s}var J,Tn=O(()=>{J=class t extends Error{line;column;codeblock;constructor(e,n){let[r,s]=XT(n.toml,n.ptr),i=qT(n.toml,r,s);super(`Invalid TOML document: ${e}
1996
+
1997
+ ${i}`,n),this.line=r,this.column=s,this.codeblock=i}static x(e,n,r){throw new t(e,{toml:n.s,ptr:r??n.p})}}});function _i(t){let e=t.p,n=t.s.charCodeAt(t.p++),r=n,s=n===39,i=n===t.s.charCodeAt(t.p)&&n===t.s.charCodeAt(t.p+1);i&&((n=t.s.charCodeAt(t.p+=2))===10?t.p++:n===13&&t.s.charCodeAt(t.p+1)===10&&(t.p+=2));let o="",a=t.p,l=0;for(;t.p<t.s.length;t.p++)if(n=t.s.charCodeAt(t.p),i&&(n===10||n===13&&t.s.charCodeAt(t.p+1)===10))l=l&&3;else if(n<32&&n!==9||n===127)J.x("control characters are not allowed in strings",t);else if((!l||l===3)&&n===r&&(!i||t.s.charCodeAt(t.p+1)===r&&t.s.charCodeAt(t.p+2)===r)){if(i&&(t.s.charCodeAt(t.p+3)===r&&t.p++,t.s.charCodeAt(t.p+3)===r&&t.p++),!l){let c=t.s.slice(a,t.p);o=o?o+c:c}return t.p+=i?3:1,o}else if(!l)!s&&n===92&&(o+=t.s.slice(a,a=t.p),l=1);else if(l===1)if(n===120||n===117||n===85){let c=t.p++-1,d=0,u=n===120?2:n===117?4:8;for(let m=0;m<u;m++,t.p++){let p=t.s.charCodeAt(t.p),h=p>=48&&p<=57?p-48:p>=65&&p<=70?p-65+10:p>=97&&p<=102?p-97+10:-1;h<0&&J.x("invalid non-hex character in unicode escape",t),d=d<<4|h}(d<0||d>1114111||d>=55296&&d<=57343)&&J.x("invalid unicode escape",t,c),o+=String.fromCodePoint(d),a=t.p--,l=0}else i&&(n===32||n===9)?l=2:(n===98?o+="\b":n===116?o+=" ":n===110?o+=`
1998
+ `:n===102?o+="\f":n===114?o+="\r":n===101?o+="\x1B":n===34?o+='"':n===92?o+="\\":J.x("unrecognised escape sequence",t),a=t.p+1,l=0);else n!==32&&n!==9&&(l===2&&J.x("invalid escape: only line-ending whitespace may be escaped",t,a),l=!s&&n===92?1:0,a=t.p);J.x("unfinished string",t,e)}var Za=O(()=>{Tn();});var GT,Or,el=O(()=>{GT=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,Or=class t extends Date{#t=!1;#n=!1;#e=null;constructor(e,n,r){let s=!0,i=!0,o="Z",a;if(typeof e=="string")if(n)e:{if(n<3){if(+e.slice(11,13)>23){e="";break e}n===2?(o=null,e+="Z"):(a=e.charCodeAt(e.length-1))!==90&&a!==122&&(o=e.slice(e.length-6)),r&&(e=e.slice(0,10)+"T"+e.slice(11))}else n===4&&(e=+e.slice(0,2)>23?"":`0000-01-01T${e}Z`);s=n!==4,i=n!==3}else{let l=e.match(GT);l?(l[1]||(s=!1,e=`0000-01-01T${e}`),i=!!l[2],i&&e[10]===" "&&(e=e.replace(" ","T")),l[2]&&+l[2]>23?e="":(o=l[3]||null,!o&&i&&(e+="Z"))):e=""}super(e),isNaN(this.getTime())||(this.#t=s,this.#n=i,this.#e=o)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let e=super.toISOString();if(this.isDate())return e.slice(0,10);if(this.isTime())return e.slice(11,23);if(this.#e===null)return e.slice(0,-1);if(this.#e==="Z"||this.#e==="z")return e;let n=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return n=this.#e[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(e,n="Z"){let r=new t(e);return r.#e=n,r}static wrapAsLocalDateTime(e){let n=new t(e);return n.#e=null,n}static wrapAsLocalDate(e){let n=new t(e);return n.#n=!1,n.#e=null,n}static wrapAsLocalTime(e){let n=new t(e);return n.#t=!1,n.#e=null,n}}});function qe(t,e=10){return e===16?t>47&&t<58||t>64&&t<71||t>96&&t<103:t>47&&t<48+e}function nl(t,e){return t===32||t===9||t===10||t===13||e&&(t===e||t===44)||t===35}function Mr(t,e){let n=t.p,r=t.s.charCodeAt(t.p);if(r===91||r===123){t.d--||J.x("document contains excessively nested structures. aborting.",t);let s=r===91?cp(t):lp(t);return t.d++,s}return r===34||r===39?_i(t):r===116?((t.s.charCodeAt(++t.p)!==114||t.s.charCodeAt(++t.p)!==117||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!0):r===102?((t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==108||t.s.charCodeAt(++t.p)!==115||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!1):r===43||r===45?yi(t,t.p,t.s.charCodeAt(++t.p),44-r,e):t.s.charCodeAt(t.p+4)===45&&t.s.charCodeAt(t.p+7)===45?JT(t,r,e):t.s.charCodeAt(t.p+2)===58?KT(t,r,e):yi(t,t.p,r,0,e)}function yi(t,e,n,r,s){let i=n,o=0,a=!1;if(i===105)return(t.s.charCodeAt(++t.p)!==110||t.s.charCodeAt(++t.p)!==102)&&J.x("invalid value",t,e),t.p++,(r||1)/0;if(i===110)return(t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==110)&&J.x("invalid value",t,e),t.p++,NaN;if(i===48){if(++t.p>=t.s.length||nl(i=t.s.charCodeAt(t.p),s))return t.bi===!0?0n:0;if(!r){if(i===120)return tl(t,e,16,s);if(i===98)return tl(t,e,2,s);if(i===111)return tl(t,e,8,s)}i===46?o=2:i===101||i===69?o=4:J.x("illegal leading zero",t,e)}else qe(i)||J.x("invalid value",t,e);for(;++t.p<t.s.length&&(i=t.s.charCodeAt(t.p),!nl(i,s));)o||(o=1),i===95?(o&1||J.x("illegal underscore",t),o+=11,a=!0):o===1&&i===46?o=2:(o===1||o===3)&&(i===101||i===69)?o=4:o===4&&(i===43||i===45)||(qe(i)?o>9?o-=11:o&1||o++:J.x("illegal character in numeric literal",t));if(!o){let c=(n-48)*(r||1);return t.bi===!0?BigInt(c):c}o&1||J.x("unfinished numeric value",t,e);let l=t.s.slice(e,t.p);return a&&(l=l.replaceAll("_","")),o>1?parseFloat(l):ap(t,l,10,e)}function tl(t,e,n,r){let s,i=1;for(;++t.p<t.s.length&&(s=t.s.charCodeAt(t.p),!nl(s,r));)s===95?(i&1&&J.x("illegal underscore",t),i=3):qe(s,n)?i&1&&i--:J.x("illegal character in numeric literal",t);i&1&&J.x("unfinished numeric value",t);let o=t.s.slice(e+2,t.p);return i&&(o=o.replaceAll("_","")),ap(t,o,n,e)}function ap(t,e,n,r){if(t.bi!==!0)e:{let s=parseInt(e,n);if(!Number.isSafeInteger(s)){if(t.bi)break e;J.x("integer value cannot be represented losslessly",t,r)}return s}return BigInt(n===10?e:(n===2?"0b":n===8?"0o":"0x")+e)}function JT(t,e,n){let r=t.p++,s;if(!qe(e)||!qe(t.s.charCodeAt(t.p++))||!qe(t.s.charCodeAt(t.p++))||!qe(t.s.charCodeAt(t.p++)))return yi(t,t.p=r,e,0,n);if(t.p+=5,qe(t.s.charCodeAt(t.p++))||J.x("invalid date-time: date part is malformed",t,r),t.p>=t.s.length||((e=t.s.charCodeAt(t.p))!==32||(s=!0,!qe(t.s.charCodeAt(t.p+1))))&&e!==84&&e!==116){let o=t.s.slice(r,t.p);return Lr(t,o,3,!1,r)}if(t.s.charCodeAt(t.p+=3)!==58&&J.x("invalid date-time: time part is malformed",t,r),t.s.charCodeAt(t.p+=3)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;qe(t.s.charCodeAt(++t.p)););if(e=t.s.charCodeAt(t.p)){if(e===90||e===122){let o=t.s.slice(r,++t.p);return Lr(t,o,1,s,r,"[+00:00]")}if(e===43||e===45){let o=t.s.slice(r,t.p+=6);return Lr(t,o,1,s,r,!t.ld&&"["+t.s.slice(t.p-6,t.p)+"]")}}let i=t.s.slice(r,t.p);return Lr(t,i,2,s,r)}function KT(t,e,n){let r=t.p;if(!qe(e)||!qe(t.s.charCodeAt(++t.p)))return yi(t,--t.p,e,0,n);if(t.s.charCodeAt(t.p+=4)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;qe(t.s.charCodeAt(++t.p)););let s=t.s.slice(r,t.p);return Lr(t,s,4,!1,r)}function Lr(t,e,n,r,s,i){if(t.ld){let o=new Or(e,n,r);return o.isValid()||J.x("invalid date",t,s),o}try{switch(i&&(e+=i),n){case 1:return Temporal.ZonedDateTime.from(e);case 2:return Temporal.PlainDateTime.from(e);case 3:return Temporal.PlainDate.from(e);case 4:return Temporal.PlainTime.from(e)}}catch(o){J.x(o instanceof Error?o.message:""+o,t,s)}}var rl=O(()=>{Za();sl();Tn();el();});function VT(t){for(;t.p<t.s.length;t.p++){let e=t.s.charCodeAt(t.p);if(e===10)break;if(e===13&&t.s.charCodeAt(t.p+1)===10){t.p++;break}(e<32&&e!==9||e===127)&&J.x("control characters are not allowed in comments",t)}}function st(t,e,n){let r;for(;t.p<t.s.length;){for(;t.p<t.s.length&&((r=t.s.charCodeAt(t.p))===32||r===9||!e&&(r===10||r===13&&t.s.charCodeAt(t.p+1)===10));)t.p++;if(n||r!==35)break;VT(t)}}var il=O(()=>{Tn();});function Ei(t,e=61){let n,r=0,s=[],i,o=t.s.charCodeAt(n=t.p);do{if(o===e)return r||J.x("unexpected end of key",t),r===1&&s.push(t.s.slice(i,t.p)),t.p++,s;o===46?(r||J.x("illegal empty bare key",t),r===1&&s.push(t.s.slice(i,t.p)),r=0):!r&&(o===34||o===39)?(o===t.s.charCodeAt(t.p+1)&&o===t.s.charCodeAt(t.p+2)&&J.x("illegal quoted key: multiline strings are not allowed",t),s.push(_i(t)),r=2,t.p--):o===32||o===9?r===1&&(s.push(t.s.slice(i,t.p)),r=2):r===2||o<48&&o!==45||o>57&&o<65||o>90&&o<97&&o!==95||o>122?J.x("illegal character in key",t):r||(r=1,i=t.p)}while(o=t.s.charCodeAt(++t.p));J.x("incomplete key-value: cannot find end of key",t,n)}function lp(t){let e=t.p++,n=Object.create(null),r=new Set,s;for(;t.p<t.s.length;){if(st(t),(s=t.s.charCodeAt(t.p))===125)return t.p++,n;let i,o=n,a=!1,l=t.p,c=Ei(t);for(let u=0;u<c.length;u++){u&&(o=a?o[i]:o[i]=Object.create(null)),i=c[u],(a=Object.hasOwn(o,i))&&(typeof o[i]!="object"||r.has(o[i]))&&J.x("trying to redefine an already defined value",t,l);let m=i==="__proto__";if(t.uk&&(m||i==="constructor")){o=t.uk!==1&&J.x("document contains an unsafe property",t,l);break}!a&&m&&Object.defineProperty(o,i,{enumerable:!0,configurable:!0,writable:!0})}a&&J.x("trying to redefine an already defined value",t,l),st(t,!0,!0);let d=Mr(t,125);if(o&&typeof(o[i]=d)=="object"&&r.add(d),st(t),(s=t.s.charCodeAt(t.p++))===125)return n;s!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished table",t,e)}function cp(t){let e=t.p++,n=[],r;for(;t.p<t.s.length;){if(st(t),(r=t.s.charCodeAt(t.p))===93)return t.p++,n;if(n.push(Mr(t,93)),st(t),(r=t.s.charCodeAt(t.p++))===93)return n;r!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished array",t,e)}var sl=O(()=>{Za();rl();il();Tn();});function dp(t,e,n,r,s){let i=n,o=r,a,l=!1,c;for(let d=0;d<e.length;d++){if(d){if(i=l?i[a]:i[a]=Object.create(null),o=(c=o[a]).c,s===0&&(c.t===1||c.t===2))return null;if(c.t===2){let u=i.length-1;i=i[u],o=o[u].c}}if(a=e[d],(l=Object.hasOwn(i,a))&&o[a]?.t===0&&o[a]?.d)return null;if(!l){let u=a==="__proto__";if(t.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0})),o[a]={t:d<e.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(c=o[a],c.t!==s&&!(s===1&&c.t===3)||(s===2&&(c.d||(c.d=!0,i[a]=[]),i[a].push(i=Object.create(null)),c.c[c.i++]=c={t:1,d:!1,i:0,c:Object.create(null)}),c.d))return null;if(c.d=!0,s===1)i=l?i[a]:i[a]=Object.create(null);else if(s===0&&l)return null;return[a,i,c.c]}function up(t,e,n){(e===null||t.uk===2)&&J.x(e===null?"trying to redefine an already defined table or value":"document contains an unsafe property",t,n)}function vi(t,e={}){let n={s:t,p:0,d:e.maxDepth??1e3,bi:e.integersAsBigInt??!1,ld:e.useLegacyDate??!0,uk:e.unsafeKeyBehaviour==="throw"?2:e.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),i,o=!1,a=r,l=s;for(t.charCodeAt(0)===65279&&n.p++,st(n);n.p<t.length;){if(t.charCodeAt(n.p)===91){let c=t.charCodeAt(++n.p)===91;i=n.p+=+c,o=!1;let d=Ei(n,93);c&&(t.charCodeAt(n.p)!==93&&J.x("expected end of table array declaration",n),n.p++);let u=dp(n,d,r,s,c?2:1);u?(l=u[2],a=u[1]):(up(n,u,i),o=!0)}else{i=n.p;let c=Ei(n),d=dp(n,c,a,l,0);!d&&!o&&up(n,d,i),st(n,!0,!0);let u=Mr(n,void 0);d&&!o&&(d[1][d[0]]=u)}st(n,!0),n.p<t.length&&(i=t.charCodeAt(n.p))!==10&&(i!==13||t.charCodeAt(n.p+1)!==10)&&J.x("each key-value declaration must be followed by an end-of-line",n),st(n)}return r}var mp=O(()=>{sl();rl();il();Tn();});var pP,pp=O(()=>{pP=!!"".isWellFormed});var ol=O(()=>{mp();pp();el();Tn();});import{readFileSync as zT}from"node:fs";import{homedir as YT}from"node:os";import{join as fp,resolve as QT}from"node:path";function Pr(t=process.env,e){let n=t.LMCTL_HOME||(t.HOME===void 0?process.env.LMCTL_HOME:void 0);return e!==void 0?QT(e):fp(n||fp(t.HOME||YT(),".lmctl"),"init.toml")}function wi(t,e="<init.toml>"){let n;try{n=vi(t.startsWith("\uFEFF")?t.slice(1):t,{integersAsBigInt:"asNeeded",useLegacyDate:!0})}catch(s){let i=s;throw new it(e,"syntax",i.message,i.line??1,(i.column??1)+(t.startsWith("\uFEFF")&&i.line===1?1:0))}let r={};for(let s of gp){let i=n[s];if(!i||typeof i!="object"||Array.isArray(i)||i instanceof Date)throw new it(e,"schema","missing or invalid table ["+s+"]");let o={};for(let a of hp){let l=i[a];if(typeof l!="string"||!l.trim())throw new it(e,"schema",s+"."+a+" must be a nonempty string");o[a]=l}r[s.toLowerCase()]=o}return{raw:t,document:n,config:r,path:e}}function Dr(t=Pr()){let e;try{e=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(zT(t))}catch(n){let r=n;throw new it(t,r.code==="ENOENT"?"missing":"read",r.message)}return wi(e,t)}var gp,hp,it,Ti=O(()=>{"use strict";ol();gp=["Provider1","Provider2","Provider3"],hp=["provider","model1","model2","model3"];it=class extends Error{constructor(n,r,s,i=1,o=1){super(r==="missing"?"Missing "+n+". Run lmctl init first.":(r==="read"?"Cannot read "+n+": "+s:"Invalid "+n+":"+i+":"+o+": "+s)+". Fix the file or run lmctl init.");this.path=n;this.kind=r;this.line=i;this.column=o}}});var _p=O(()=>{"use strict";ol();Ti()});var yp=O(()=>{"use strict";ua();Qa();Ti();Ti();_p()});import{resolve as ZT,join as Ep}from"node:path";function al(t,e={}){try{if(!Jn(t))return j("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return j("cancelled","Context is closed");if(!e||typeof e!="object"||Array.isArray(e))return j("invalid_argument","Profile options must be a map");let n=e.path;if(Object.keys(e).some(i=>!(We.find(o=>o.name==="loadProfile")?.params.find(o=>o.name==="options")?.keys??[]).some(o=>o.name===i))||n!==void 0&&(typeof n!="string"||!n))return j("invalid_argument","Profile options accept a nonempty path string only");let r=t.env.LMCTL_HOME||(t.env.HOME?Ep(t.env.HOME,".lmctl"):void 0);if(!n&&!r)return j("invalid_argument","Profile path requires HOME, LMCTL_HOME or an explicit path");let s=ZT(t.cwd,n??Ep(r,"init.toml"));return ce({path:Pr({...t.env,HOME:t.env.HOME??t.cwd},s)})}catch(n){return j("invalid_argument","Invalid profile arguments: "+G(n))}}function eb(t){try{if(!t||typeof t!="object"||Array.isArray(t))return j("invalid_argument","Expected a validated InitConfig");let e={};for(let n of["provider1","provider2","provider3"]){let r=t[n];if(!r||typeof r!="object"||Array.isArray(r))return j("invalid_argument",n+" must be a provider map");let s={};for(let i of["provider","model1","model2","model3"]){let o=r[i];if(typeof o!="string"||!o.trim())return j("invalid_argument",n+"."+i+" must be a nonempty string");s[i]=o}e[n]=s}return ce(hi(e))}catch(e){return j("invalid_argument","Invalid profile: "+G(e))}}function tb(t,e={}){let n=al(t,e);if(n.status==="error")return n;try{let r=Dr(n.path);return ce({profile:{path:r.path,raw:r.raw,config:r.config},values:{...hi(r.config),Directory:t.cwd,NonInteractive:!t.interactive}})}catch(r){return r instanceof it?j(r.kind,r.message,{path:r.path,line:r.line,column:r.column}):j("read","Could not load profile: "+G(r),{path:n.path})}}function nb(t,e={}){let n=al(t,e);if(n.status==="error")return n;try{let r=Dr(n.path),{properties:s,flat:i}=ip(r.document);return ce({path:r.path,properties:s,flat:i})}catch(r){return r instanceof it?j(r.kind,r.message,{path:r.path,line:r.line,column:r.column}):j("schema","Invalid properties in "+n.path+": "+G(r)+". Fix the file or run lmctl init.",{path:n.path})}}var vp=O(()=>{"use strict";op();Gt();yp();Qa();Yt();Xe()});function Ct(t){return t!=="gemini"}function bi(t){if(!Ct(t))throw new Error(Qt)}var Qt,Kn=O(()=>{"use strict";Qt="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model."});function wp(t){if(t.length===0||!t.startsWith("---"))throw new gt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1999
+ `);if(e[0]!=="---")throw new gt("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){r=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new gt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!rb.has(c))throw new gt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Si.join(", ")}`);n[c]=d}if(r===-1)throw new gt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of Si)if(n[o]===void 0)throw new gt(`missing required frontmatter key "${o}" \u2014 required: ${Si.join(", ")}`);let s=0;for(let o=0;o<=r;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=n.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:n.title,description:n.description,members:i,bodyOffset:s}}var Si,rb,gt,Tp=O(()=>{"use strict";Si=["title","description","members"],rb=new Set(Si),gt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as sb,writeFileSync as zP,renameSync as YP,existsSync as Sp}from"node:fs";import{basename as ib,resolve as Vn,dirname as ll}from"node:path";function ab(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],i=r[2]!==void 0?r[2]:r[3];e[s]=i}return e}function lb(t){return/^\s*_MEMBER_\s+\S/.test(t)}function cb(t){return/^\s*_SESSION_\s+\S/.test(t)}function db(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Fr(t){return/\.(?:lmctl|lmc)$/i.test(t)}function $r(t){return ib(t).replace(/\.(?:lmctl|lmc)$/i,"")}function ot(t){let e=sb(t,"utf-8"),n=ll(Vn(t)),r=dl(e,$r(t),{baseDir:n,sourcePath:Vn(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Vn(n,s.sessiondir));return r}function dl(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2000
+ `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=wp(i)}catch(l){if(l instanceof gt)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
2001
+ `);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(cb(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(db(c)||!lb(c))continue;let u=ab(c);for(let p of Object.keys(u))if(!bp.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2002
+ allowed keys: ${bp.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}if(!u.alias){s.push(`line ${d}: member line missing required alias: ${c.trim()}`);continue}let m={alias:u.alias,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),r.push(m)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:o}}function ul(t,e){let n=[];for(let i of t.parseErrors)n.push({field:"session",message:i});let r=t.members.filter(i=>i.alias.toLowerCase()===cl.toLowerCase());r.length>1&&n.push({field:cl,message:`${r.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&n.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?Vn(e,i.teamfile):Vn(i.teamfile);if(!Sp(a))n.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=ot(a),c=ki(l);c?c.session||n.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else ob.has(i.provider)?Ct(i.provider)||n.push({field:i.alias,message:Qt}):n.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&n.push({field:i.alias,message:"sessiondir is empty"})}return n}function ki(t){return t.members.find(e=>e.alias.toLowerCase()===cl.toLowerCase())}function ml(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=Vn(e,t.teamfile),o=n??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!Sp(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=ot(i),l=ki(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return ml(l,ll(i),o,r);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||ll(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function kp(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var cl,ob,bp,Nt=O(()=>{"use strict";Kn();Tp();cl="Lead",ob=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"]);bp=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as ub}from"node:crypto";import{existsSync as Rp,readFileSync as Ip,realpathSync as mb}from"node:fs";import{dirname as pb,resolve as xp}from"node:path";function ht(t,e){let n=xp(t);if(Rp(n))return mb(n);if(e!==void 0){let r=gb(t,n,e);if(r!==null)return r}return n}function Ii(t,e){let n=pb(e),r=dl(t,$r(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=xp(n,s.sessiondir));return r}function xi(t,e,n=r=>{process.stderr.write(`warning: ${r}
2003
+ `)}){let r=ht(t,fb(e)?e:void 0);if(Rp(r)){let i=Ip(r,"utf8"),o=Ii(i,r);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(r)===null&&hb(o)&&yb(e,r,o,i,n),o}let s=e?.getRootTeam(r)??null;throw s!==null?new Error(`teamfile missing on disk: ${r} (registered ${s.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${t}`)}function fb(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function gb(t,e,n){let r=n.getRootTeam(t)??n.getRootTeam(e);return r===null?null:r.teamfile_path}function hb(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=pl)}function fl(t,e,n){let r=ht(e),s=n.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=pl);if(s.length!==0)for(let i of t.listRootTeams()){let o,a;try{if(o=ht(i.teamfile_path),o===r)continue;a=Ip(o,"utf8")}catch(c){if(_b(c))continue;throw c}let l=Ii(a,o);for(let c of s){let d=l.members.find(u=>u.teamfile===void 0&&u.session===c.session&&(u.session?.length??0)>=pl);if(d!==void 0)throw new Ri(`sessionid ownership conflict: ${r}:${c.alias} and ${o}:${d.alias} both use sessionid "${c.session}"`)}}}function _b(t){let e=t?.code;return e==="ENOENT"||e==="ENOTDIR"}function yb(t,e,n,r,s){try{fl(t,e,n)}catch(o){if(!(o instanceof Ri))throw o;s(`${o.message}; skipping automatic registration`);return}let i={teamfile_path:e,name:n.name,raw_text:r,raw_sha256:ub("sha256").update(r).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(i)}var pl,Ri,jr=O(()=>{"use strict";Nt();pl=5,Ri=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}}});import{randomUUID as Eb}from"node:crypto";import{closeSync as vb,openSync as wb,readFileSync as Cp,statSync as Tb,unlinkSync as gl,writeFileSync as bb}from"node:fs";function Np(t,e){return`${t}.seed-${e.toLowerCase()}.lock`}function Op(t){let e;try{e=JSON.parse(Cp(t,"utf8"))}catch(r){return r.code==="ENOENT"?!1:Ap(t)}let n=typeof e=="object"&&e!==null&&"pid"in e?e.pid:void 0;if(typeof n!="number"||!Number.isInteger(n)||n<=0)return Ap(t);try{return process.kill(n,0),!0}catch(r){return r.code!=="ESRCH"}}function Ap(t){try{return Date.now()-Tb(t).mtimeMs<3e5}catch{return!1}}function hl(t,e){return Op(Np(t,e))}function Lp(t,e){let n=Np(t,e),r=JSON.stringify({pid:process.pid,token:Eb()});for(let s=0;s<2;s+=1)try{let i=wb(n,"wx");try{bb(i,r)}catch(o){throw gl(n),o}finally{vb(i)}return()=>{try{Cp(n,"utf8")===r&&gl(n)}catch(o){if(o.code!=="ENOENT")throw o}}}catch(i){if(i.code!=="EEXIST")throw i;if(Op(n))throw new Error(`${e}: seed already in progress; wait for it to finish`);try{gl(n)}catch(o){if(o.code!=="ENOENT")throw o}}throw new Error(`${e}: could not acquire seed marker`)}var _l=O(()=>{"use strict"});import{existsSync as Sb}from"node:fs";import{dirname as Mp}from"node:path";function El(t){return yl.test(t)}function vl(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),n=t.slice(0,e),r=t.slice(e+1);return!Fr(n)||!yl.test(r)?null:{teamfile:n,alias:r}}function _t(t,e,n){if(!Fr(t))throw new ve(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl or .lmc extension).`);if(!El(e))throw new ve(`lmctl: "${e}" is not a valid alias (must match ${yl.source}).`);let r=ht(t,n);if(n===void 0&&!Sb(r))throw new ve(`lmctl: teamfile not found: ${t}`,"not_found");let s;try{s=xi(r,n)}catch(o){throw new ve(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new ve(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=kp(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ve(`lmctl: alias "${e}" not found in ${t}.
2004
+ Known aliases: ${o}`,"not_found")}if(i.teamfile!==void 0){let o=ml(i,Mp(r));return{teamfile:r,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(hl(r,i.alias))throw new ve(`lmctl: alias "${i.alias}" is being seeded. Wait for the seed to finish, then retry this prompt.`);if(i.session===void 0)throw s.members.some(o=>hl(r,o.alias))?new ve(`lmctl: alias "${i.alias}" has no session ID yet, and a seed is currently in progress for this team. Wait for the seed to finish, then retry this prompt.`):new ve(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
2005
+ Run: lmctl seed ${t}`);return{teamfile:r,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??Mp(r),isLead:ki(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}var ve,yl,Zt=O(()=>{"use strict";Nt();Nt();jr();_l();ve=class extends Error{constructor(e,n){super(e),this.name="ChatTargetError",n&&Object.defineProperty(this,"kind",{value:n})}},yl=/^[A-Za-z][A-Za-z0-9_-]*$/});import{mkdirSync as Bp,readFileSync as kb,renameSync as Rb,writeFileSync as Ib,existsSync as Wp}from"node:fs";import{homedir as xb}from"node:os";import{dirname as Xp,join as Ai,resolve as Ci}from"node:path";import{fileURLToPath as Ab}from"node:url";function Mb(){return Ai(xb(),".lmctl","cache","lmprice")}function zn(t,e){return Ai(t,e)}function bn(t){try{return JSON.parse(kb(t,"utf-8"))}catch{return null}}function Gp(t,e){let n=`${t}.tmp-${process.pid}`;Ib(n,e),Rb(n,t)}function wl(t){return t===null||typeof t=="number"}function Ni(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.schema_version!==1||!Array.isArray(e.records)||e.records.length===0?!1:e.records.every(n=>{if(typeof n!="object"||n===null)return!1;let r=n;if(typeof r.source!="string"||typeof r.source_model_id!="string"||typeof r.pricing!="object"||r.pricing===null)return!1;let s=r.pricing;return wl(s.input_per_1m_tokens)&&wl(s.output_per_1m_tokens)&&wl(s.input_cache_read_per_1m_tokens)})}function Oi(t){if(typeof t!="object"||t===null)return!1;let e=t;if(e.schema_version!==1||!Array.isArray(e.standards)||!Array.isArray(e.aliases))return!1;let n=e.standards.every(s=>{if(typeof s!="object"||s===null)return!1;let i=s;return typeof i.standard_slug=="string"&&(i.catalog_record_id===null||typeof i.catalog_record_id=="string")}),r=e.aliases.every(s=>{if(typeof s!="object"||s===null)return!1;let i=s;return typeof i.alias=="string"&&(i.standard_slug===null||typeof i.standard_slug=="string")&&typeof i.evidence=="string"&&Db.has(i.evidence)});return n&&r}function Fb(t){let e=bn(zn(t,qp)),n={etag:typeof e?.model_list?.etag=="string"?e.model_list.etag:null,last_checked:typeof e?.model_list?.last_checked=="string"?e.model_list.last_checked:null},r={etag:typeof e?.aliases?.etag=="string"?e.aliases.etag:null,last_checked:typeof e?.aliases?.last_checked=="string"?e.aliases.last_checked:null};if(e===null){let s=bn(zn(t,Pb));s&&(n.etag=typeof s.etag=="string"?s.etag:null,n.last_checked=typeof s.fetchedAt=="string"?s.fetchedAt:null)}return{model_list:n,aliases:r}}function $b(t){let e=Fb(t),n=bn(zn(t,Tl)),r=bn(zn(t,bl));return{catalog:Ni(n)?n:null,aliases:Oi(r)?r:null,meta:e}}function jb(t,e){try{Bp(t,{recursive:!0}),Gp(zn(t,qp),JSON.stringify(e))}catch{}}function Dp(t,e,n){try{Bp(t,{recursive:!0}),Gp(zn(t,e),JSON.stringify(n))}catch{}}function Ub(t,e){let n=Hb(t),r=n?[Ci(n,"data",e)]:[Ci(t,"..","..","data",e)];for(let s of r)if(Wp(s))return s;return null}function Hb(t){let e=Ci(t);for(;;){if(Wp(Ci(e,"package.json")))return e;let n=Xp(e);if(n===e)return null;e=n}}function Fp(t,e,n){let r=n!==void 0?n:Ub(t,e);return r===null?null:bn(r)}function Bb(){let t=process.env.LMCTL_PRICE_TTL;if(t===void 0||t==="")return Pp;let e=Number(t);return!Number.isFinite(e)||e<0?Pp:e*1e3}function Wb(){let t=process.env.LMCTL_PRICE_DATA;return t!==void 0&&t!==""?t:null}async function $p(t,e,n,r){try{let s=await t(e,{method:"HEAD",signal:AbortSignal.timeout(Ob)});if(!s.ok)return{kind:"failed"};let i=s.headers.get("etag");if(n!==null&&i!==null&&i===r)return{kind:"match"};let o=await t(e,{signal:AbortSignal.timeout(Lb)});return o.ok?{kind:"payload",payload:await o.json(),etag:o.headers.get("etag")??i}:{kind:"failed"}}catch{return{kind:"failed"}}}function Jp(t={}){return Object.keys(t).length===0?(jp??=Up(t),jp):Up(t)}async function Up(t){let e=Xp(Ab(import.meta.url)),n=t.pinDir!==void 0?t.pinDir:Wb();if(n!==null&&n!==""){let h=bn(Ai(n,Tl)),_=bn(Ai(n,bl));if(Ni(h)&&Oi(_)){let y={catalog:h,aliases:_,source:"pinned",generatedAt:h.generated_at??null};return Sl=y.generatedAt,y}return Hp(t,e)}let r=t.fetchImpl??fetch,s=t.cacheDir??Mb(),i=t.now??Date.now(),o=t.ttlMs??Bb(),a=$b(s),l=(h,_)=>h!==null&&_.last_checked!==null&&i-Date.parse(_.last_checked)<o,c=a.catalog,d=a.aliases,u=!1,m={model_list:{...a.meta.model_list},aliases:{...a.meta.aliases}},p=!1;if(!l(c,a.meta.model_list)){let h=await $p(r,Cb,c,a.meta.model_list.etag);h.kind==="match"?(m.model_list.last_checked=new Date(i).toISOString(),p=!0):h.kind==="payload"&&(m.model_list.last_checked=new Date(i).toISOString(),p=!0,Ni(h.payload)&&(c=h.payload,h.etag!==null&&(m.model_list.etag=h.etag),Dp(s,Tl,c),u=!0))}if(!l(d,a.meta.aliases)){let h=await $p(r,Nb,d,a.meta.aliases.etag);h.kind==="match"?(m.aliases.last_checked=new Date(i).toISOString(),p=!0):h.kind==="payload"&&(m.aliases.last_checked=new Date(i).toISOString(),p=!0,Oi(h.payload)&&(d=h.payload,h.etag!==null&&(m.aliases.etag=h.etag),Dp(s,bl,d),u=!0))}if((p||u)&&jb(s,m),c!==null||d!==null){let h={catalog:c,aliases:d,source:u?"network":"cache",generatedAt:c?.generated_at??null};return Sl=h.generatedAt,h}return Hp(t,e)}function Hp(t,e){let n=Fp(e,"price-data.json",t.bundledPath),r=Fp(e,"price-aliases.json",t.bundledAliasesPath),s=Ni(n)?n:null,i=Oi(r)?r:null,o={catalog:s,aliases:i,source:s!==null||i!==null?"bundled":"unavailable",generatedAt:s?.generated_at??null};return Sl=o.generatedAt,o}var Cb,Nb,Ob,Lb,Pp,Tl,bl,qp,Pb,Db,Sl,jp,Kp=O(()=>{"use strict";Cb="https://lmctl.com/dataset/model_list.json",Nb="https://lmctl.com/dataset/aliases.json",Ob=1e3,Lb=1e4,Pp=6*60*60*1e3;Tl="model_list.json",bl="aliases.json",qp="meta.json",Pb="model_list.meta.json";Db=new Set(["established","asserted","unresolved"]);Sl=null,jp=null});function kn(t){return t.toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function Sn(t){let e=t.source_model_id.toLowerCase(),n=e.slice(e.lastIndexOf("/")+1);return kn(n)}function zp(t){let e=new Set,n=r=>{let s=r.toLowerCase().split("/");for(let i=0;i<s.length;i+=1)e.add(kn(s.slice(i).join("/")))};return n(t.source_model_id),t.gateway_id&&n(t.gateway_id),e}function Xb(t,e){let n=new Set,r=l=>{n.add(kn(l))},s=t.trim().toLowerCase(),i=null,o=s.indexOf(":");o>0&&!s.slice(0,o).includes("/")&&(i=s.slice(0,o),r(s),s=s.slice(o+1)),r(s);let a=s.slice(s.lastIndexOf("/")+1);r(a);for(let l of e)r(`${l}/${a}`);return i!==null&&r(`${i}/${a}`),[...n]}function Yn(t){let e=r=>!(r.mode!==void 0&&r.mode!==null&&r.mode!=="chat"||t.nonChatName&&t.nonChatName.test(r.source_model_id.toLowerCase())),n=r=>e(r)&&t.family.test(r.source_model_id.toLowerCase());return{firstPartyProviders:t.firstPartyProviders,isChatModel:e,coversRecord:n,normalize:r=>Xb(r,t.vendorPrefixes),matchRow(r,s){if(!n(r))return!1;let i=zp(r);return s.some(o=>i.has(o))}}}function Gb(t){let e=t.trim(),n=qb.exec(e);return n?{model:e.slice(0,n.index).trim(),effort:n[1].trim()}:{model:e,effort:null}}function zb(t,e,n){let r=e.trim().toLowerCase(),s=kn(r);if(n.records.some(o=>o.source_model_id.toLowerCase()===r&&t.matchRow(o,[s])))return!0;let i=t.normalize(e);return i.length>0&&n.records.some(o=>t.matchRow(o,i))}function Yb(t,e,n){let r=[];for(let[s,i]of Object.entries(Ur))s!==n&&zb(i,t,e)&&r.push(s);return r}function Li(t){return t==="moonshot"?0:t==="litellm"?1:t==="openrouter"?2:t==="manual"?3:4}function Qb(t,e){return t.input_per_1m_tokens===e.input_per_1m_tokens&&t.output_per_1m_tokens===e.output_per_1m_tokens&&t.input_cache_read_per_1m_tokens===e.input_cache_read_per_1m_tokens&&(t.input_cache_write_per_1m_tokens??null)===(e.input_cache_write_per_1m_tokens??null)&&(t.source_cost_fields?.cache_creation_input_token_cost??null)===(e.source_cost_fields?.cache_creation_input_token_cost??null)&&(t.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)===(e.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)}function Zb(t){let e=new Map,n=[];for(let r of t){let s=r.source_model_id.toLowerCase(),i=s.lastIndexOf("/"),o=i===-1?"":s.slice(0,i+1),a=i===-1?s:s.slice(i+1),l=`${r.source}:${o}${kn(a)}`,c=e.get(l);if(c===void 0){e.set(l,r);continue}if(!Qb(c.pricing,r.pricing)){n.push(r);continue}/\d\.\d/.test(c.source_model_id)&&!/\d\.\d/.test(r.source_model_id)&&e.set(l,r)}return[...e.values(),...n]}function eS(t){return{route:t.record_id??`${t.source}:${t.source_model_id}`,source:t.source,sourceModelId:t.source_model_id,provider:t.provider??null,pricing:t.pricing,estimated:t.source==="manual"}}function rf(t,e){return t.map(eS).sort((n,r)=>{let s=Li(n.source)-Li(r.source);if(s!==0)return s;let i=n.provider!==null&&e.includes(n.provider)?0:1,o=r.provider!==null&&e.includes(r.provider)?0:1;return i!==o?i-o:n.sourceModelId.localeCompare(r.sourceModelId)})}function tS(t){return t.pricing.input_per_1m_tokens!==null&&t.pricing.output_per_1m_tokens!==null}function nS(t,e,n){let r=Zb(t),s=rf(r,n),o=r.find(a=>(a.record_id??`${a.source}:${a.source_model_id}`)===s[0].route)?.context_window?.input_tokens??void 0;return{id:s[0].sourceModelId,normalizedId:e,offers:s,...o!=null?{contextWindow:o}:{}}}function kl(t,e,n){if(t.length===0)return{kind:"known-unpriced",id:e};let r=nS(t,e,n),s=r.offers.find(tS);return s===void 0?{kind:"known-unpriced",id:e}:s.estimated?{kind:"estimated",model:r}:{kind:"priced",model:r}}function rS(t,e){return t.standards.find(n=>n.standard_slug.toLowerCase()===e.toLowerCase())??null}function sS(t,e,n){let r=t.standard_slug;if(e===null||e.catalog_record_id===null)return{kind:"known-unpriced",id:r};let s=e.catalog_record_id.toLowerCase(),i=n.records.find(l=>(l.record_id??`${l.source}:${l.source_model_id}`).toLowerCase()===s);if(!i)return{kind:"known-unpriced",id:r};let o=Sn(i),a=n.records.filter(l=>Sn(l)!==o?!1:l.mode===void 0||l.mode===null||l.mode==="chat");return a.length===0?{kind:"known-unpriced",id:r}:kl(a,o,Rl)}function iS(t,e,n,r){if(n===null||!Array.isArray(n.records))return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};if(r!==null){let _=[e.trim().toLowerCase()];_.push(`${t.toLowerCase()}/${_[0]}`);let y=r.aliases.find(f=>_.includes(f.alias.toLowerCase()));if(y){if(y.evidence==="unresolved"||y.standard_slug===null)return{state:{kind:"unresolved",alias:y.alias},viaAlias:!0,pinRoute:null};let f=rS(r,y.standard_slug);return{state:sS(y,f,n),viaAlias:!0,pinRoute:f?.catalog_record_id?.toLowerCase()??null}}}let s=Ur[t];if(!s)return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};let i=e.trim().toLowerCase(),o=s.normalize(e),a=_=>({state:_,viaAlias:!1,pinRoute:null}),l=kn(i),c=n.records.filter(_=>_.source_model_id.toLowerCase()===i&&s.matchRow(_,[l]));if(c.length>0){let _=Sn(c[0]),y=n.records.filter(f=>s.matchRow(f,[_])&&Sn(f)===_);return a(kl(y.length>0?y:c,_,Vp[t]??Rl))}let d=n.records.filter(_=>s.matchRow(_,o));if(d.length===0){let _=Yb(e,n,t);return _.length>0?a({kind:"wrong-provider",declared:e,otherProviders:_}):a({kind:"unknown",declared:e})}let u=new Map;for(let _ of d){let y=Sn(_),f=u.get(y);f?f.push(_):u.set(y,[_])}let m=Vp[t]??Rl,p=null,h=null;for(let _ of u.values()){let y=rf(_,m);(h===null||oS(y[0],h[0],m)<0)&&(p=_,h=y)}return a(kl(p,Sn(p[0]),m))}function sf(t,e,n,r){return iS(t,e,n,r).state}function of(t,e){let n=Ur[e];if(!n)return null;let r=new Set;for(let s of t.records)n.coversRecord(s)&&r.add(Sn(s));return r.size}function oS(t,e,n){let r=Li(t.source)-Li(e.source);if(r!==0)return r;let s=t.provider!==null&&n.includes(t.provider)?0:1,i=e.provider!==null&&n.includes(e.provider)?0:1;return s!==i?s-i:t.sourceModelId.localeCompare(e.sourceModelId)}var Yp,Qp,Zp,ef,tf,nf,qb,Jb,Kb,Vb,Ur,Vp,Rl,af=O(()=>{"use strict";Yp=Yn({vendorPrefixes:["anthropic"],family:/claude/,firstPartyProviders:["anthropic"]}),Qp=Yn({vendorPrefixes:["openai"],family:/(^|\/)(gpt-|o\d|chatgpt|ft:gpt)|openai\//,firstPartyProviders:["openai"],nonChatName:/(^|[-/])(tts|transcribe(?:-\w+)?|realtime(?:-\w+)?|search(?:-\w+)*|image(?:-\w+)?|audio(?:-\w+)?|whisper(?:-\w+)?|dall-e(?:-\w+)?|embedding|moderation)(-|$)/}),Zp=Yn({vendorPrefixes:["google","gemini"],family:/gemini|gemma/,firstPartyProviders:["gemini","google","vertex_ai-language-models"],nonChatName:/embedding|imagen|-image|tts|audio|veo|lyria|live|realtime|video/}),ef=Yn({vendorPrefixes:["moonshot","moonshotai"],family:/kimi|moonshot/,firstPartyProviders:["moonshot"]}),tf=Yn({vendorPrefixes:["dashscope","qwen"],family:/qwen/,firstPartyProviders:["dashscope"]}),nf=Yn({vendorPrefixes:["deepseek","nousresearch"],family:/deepseek|nous|hermes-\d/,firstPartyProviders:["deepseek","nousresearch"]}),qb=/\s*\(([^()]+)\)\s*$/;Jb={"gemini 3.8 flash":"gemini-3.8-flash","gemini 3.7 flash":"gemini-3.7-flash","gemini 3.6 flash":"gemini-3.6-flash","gemini 3.1 pro":"gemini/gemini-3.1-pro-preview","claude sonnet 4.6":"claude-sonnet-4-6"},Kb=["gemini","google","vertex_ai-language-models","anthropic"],Vb={normalize(t){let{model:e}=Gb(t),n=Jb[e.toLowerCase()];return n===void 0?[]:[kn(n)]},isChatModel(t){return t.mode===void 0||t.mode===null||t.mode==="chat"},coversRecord(t){return this.isChatModel(t)&&/gemini|claude/.test(t.source_model_id.toLowerCase())},matchRow(t,e){if(!this.coversRecord(t))return!1;let n=zp(t);return e.some(r=>n.has(r))}},Ur={claude:Yp,codex:Qp,gemini:Zp,agy:Vb,kimi:ef,qwen:tf,hermes:nf},Vp={claude:Yp.firstPartyProviders,codex:Qp.firstPartyProviders,gemini:Zp.firstPartyProviders,agy:Kb,kimi:ef.firstPartyProviders,qwen:tf.firstPartyProviders,hermes:nf.firstPartyProviders};Rl=[]});import{spawnSync as Ol}from"node:child_process";import{existsSync as uf,readFileSync as mf}from"node:fs";import{homedir as pf}from"node:os";import{resolve as Cl}from"node:path";function Qn(t,e){return e.code==="ETIMEDOUT"?`${t} did not respond within lint's own spawn timeout (${e.message}) \u2014 this does not mean the provider itself is unreachable, only that this specific check didn't finish in time.`:`${t} could not be run: ${e.message}`}function cS(){let t=Ol("agy",["models"],{encoding:"utf-8",timeout:lS});return{status:t.status,stdout:t.stdout??"",error:t.error}}function dS(t){let e=[];for(let n of t.split(/\r?\n/)){let r=n.trim(),s=r.indexOf(" ");if(s<0)continue;let i=r.slice(s+1).trim();i&&e.push(i)}return e}function uS(t){if(!t&&Il)return Il;let e=s=>(t||(Il=s),s),n;try{n=(t??cS)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?Qn("agy models",s):`agy models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:Qn("agy models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${n.status??"unknown"}`});let r=dS(n.stdout);return r.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:r})}function pS(){let t=Ol("codex",["debug","models"],{encoding:"utf-8",timeout:mS});return{status:t.status,stdout:t.stdout??"",error:t.error}}function fS(t){let e;try{e=JSON.parse(t)}catch{return}let n=e.models;if(!Array.isArray(n))return;let r=[];for(let s of n){if(!s||typeof s!="object")continue;let{slug:i,visibility:o}=s;typeof i=="string"&&o==="list"&&r.push(i)}return r}function gS(t){if(!t&&xl)return xl;let e=s=>(t||(xl=s),s),n;try{n=(t??pS)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?Qn("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:Qn("codex debug models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`codex debug models exited with status ${n.status??"unknown"}`});let r=fS(n.stdout);return r===void 0?e({available:!1,models:[],reason:"codex debug models did not return parseable JSON"}):r.length===0?e({available:!1,models:[],reason:"codex debug models returned no user-visible models"}):e({available:!0,models:r})}function _S(t){let e=Ol("opencode",t?["models",t]:["models"],{encoding:"utf-8",timeout:hS});return{status:e.status,stdout:e.stdout??"",error:e.error}}function yS(t,e){if(!e&&Al.has(t))return Al.get(t);let n=o=>(e||Al.set(t,o),o),r=t?`opencode models ${t}`:"opencode models",s;try{s=(e??_S)(t)}catch(o){return n({available:!1,models:[],reason:o instanceof Error?Qn(r,o):`${r} could not be run: ${String(o)}`})}if(s.error)return n({available:!1,models:[],reason:Qn(r,s.error)});if(s.status!==0)return n({available:!1,models:[],reason:`${r} exited with status ${s.status??"unknown"}`});let i=s.stdout.split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0);return i.length===0?n({available:!1,models:[],reason:`${r} returned no models`}):n({available:!0,models:i})}function Ll(t,e={}){let n=[];for(let r of t){let s=r.provider.trim().toLowerCase();if(r.effort&&s!=="opencode"&&s!=="lmplayer"&&s!=="qwen"&&s!=="muse"&&n.push(`[${r.alias}] effort="${r.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),s==="qwen"&&r.effort&&n.push(`[${r.alias}] effort="${r.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),s==="copilot"){if(!r.model)continue;n.push(`[${r.alias}] model="${r.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(s!=="lmplayer"){if(s==="opencode"){if(r.effort&&!r.model&&n.push(`[${r.alias}] effort="${r.effort}" has no effect without model= on an opencode member.`),!r.model)continue;let i=wS(e.opencodeConfigPath);if(!i.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for opencode: ${i.reason}.`);continue}if(i.models.includes(r.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(r.model))continue;if(!r.model.includes("/")){let l=i.models.filter(c=>c.endsWith(`/${r.model}`));n.push(l.length>0?`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${r.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}let o=r.model.slice(0,r.model.indexOf("/")),a=yS(o,e.opencodeModelsRunner);if(a.available&&a.models.includes(r.model))continue;if(a.available&&!a.models.includes(r.model)){n.push(`[${r.alias}] model="${r.model}" was not found in opencode's LOCALLY-VISIBLE live catalog for "${o}" (checked \`opencode models ${o}\`) -- this is unresolved, not a confirmed unavailability: it could mean opencode genuinely doesn't serve this model, OR that your local catalog/auth for "${o}" is stale/incomplete. Declaring it in opencode.json may or may not help; if it doesn't, check whether a non-opencode provider serves this model directly (e.g. \`lmctl lint\` with model= against provider=codex/claude/gemini/agy).`);continue}n.push(`[${r.alias}] model="${r.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(s==="kimi"){if(!r.model)continue;let i=ES(e.kimiConfigPath);i.available?i.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not declared in Kimi's [models] config. Valid configured models: ${Hr(i.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for kimi: ${i.reason}.`);continue}if(s==="agy"){if(!r.model)continue;let i=uS(e.agyModelsRunner);i.available?i.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${Hr(i.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for agy: ${i.reason}.`);continue}if(s==="dsh"){if(!r.model||cf.includes(r.model))continue;lf.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in dsh's built-in catalog. Valid pinned models: ${Hr(lf)}. Valid server-resolved aliases (DeepSeek resolves these to its current model server-side -- pinning to a specific version instead is a DOWNGRADE, not a safer choice): ${Hr(cf)}. The catalog is patchable via dsh profile overlays \u2014 a model added that way warns here even though it may resolve.`);continue}if(s==="hermes"){if(!r.model)continue;let i=r.model.indexOf(":");(i<=0||i===r.model.length-1)&&n.push(`[${r.alias}] model="${r.model}" should use <provider>:<model> from Hermes's ACP catalog. lmctl checks the shape only; provider and model availability are resolved by Hermes.`);continue}if(s!=="pi"){if(s==="codex"){if(!r.model)continue;r.model===df&&n.push(`[${r.alias}] model="${df}" is banned as a build model (operator, 2026-09-06) -- it's a fast/cheap classification model, not intended for build work, and there's no cost reason left to reach for it. Use model=gpt-5.6-sol (or leave model= unset) for build work; if this member genuinely does non-build/classification work, this warning can be ignored.`);let i=gS(e.codexModelsRunner);if(!i.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for codex: ${i.reason}.`);continue}i.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in codex's live model catalog (\`codex debug models\`). Valid models: ${Hr(i.models)}`);continue}r.model&&(ff.has(s)||n.push(`[${r.alias}] model="${r.model}" cannot be verified for provider "${s}": no model validation path exists for this provider.`))}}}return n}async function gf(t,e={}){let n=t.filter(o=>o.model!==void 0&&ff.has(o.provider.trim().toLowerCase()));if(n.length===0)return{warnings:[],errors:[]};let r=e.snapshot??await Jp();if(r.catalog===null)return{warnings:[],errors:[]};let s=[],i=[];for(let o of n){let a=o.provider.trim().toLowerCase(),l=o.model,c=sf(a,l,r.catalog,r.aliases);if(c.kind==="unknown"){let d=of(r.catalog,a)??0;s.push(`[${o.alias}] model "${l}" is unknown to the lmprice catalog for provider "${a}" (${d} known) -- not necessarily wrong: may be a model too new for lmprice to have published yet, or a typo. A matching lmprice catalog/alias entry would resolve this; lint cannot otherwise confirm whether ${a} accepts it.`)}else c.kind==="wrong-provider"?i.push({field:o.alias,message:`model "${l}" is not offered by provider "${a}" -- it is a recognized model, but only under: ${c.otherProviders.join(", ")}. Declare provider="${c.otherProviders[0]}" (or another listed provider), or use a model "${a}" actually offers.`}):c.kind==="known-unpriced"&&s.push(`[${o.alias}] model "${l}" is recognized in the lmprice catalog but has no price information \u2014 cost will be unavailable`);if(a==="claude"&&(c.kind==="priced"||c.kind==="known-unpriced"||c.kind==="estimated")&&aS.test(l)){let d=l.replace(/(\d)\.(?=\d)/g,"$1-");s.push(`[${o.alias}] model="${l}" matches the lmprice catalog only through its OpenRouter-style spelling ("." between version numbers); claude's own CLI expects "-" there and does an exact match, so it may reject this string verbatim even though lint recognizes it. If seed/chat fails with "issue with the selected model," try model="${d}" instead.`)}}return{warnings:s,errors:i}}async function hf(t,e={}){return(await gf(t,e)).warnings}async function _f(t,e={}){return(await gf(t,e)).errors}function ES(t){let e=process.env.KIMI_CODE_HOME||Cl(pf(),".kimi-code"),n=t??Cl(e,"config.toml");if(!uf(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=mf(n,"utf-8")}catch(i){return{available:!1,models:[],reason:`${n} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of r.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=vS(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s].sort()}}function vS(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function wS(t){let e=t??Cl(pf(),".config","opencode","opencode.json");if(!uf(e))return{available:!0,models:[]};let n;try{n=JSON.parse(mf(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:TS(n)}}function TS(t){if(!Nl(t))return[];let e=Mi(t.provider)??Mi(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!Nl(s))continue;let i=Mi(s.models)??Mi(s.model);if(i)for(let o of Object.keys(i))n.add(o.startsWith(`${r}/`)?o:`${r}/${o}`)}return[...n].sort()}function Mi(t){return Nl(t)?t:null}function Nl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Hr(t){return t.length>0?t.join(", "):"(none)"}var ff,aS,lf,cf,df,lS,Il,mS,xl,hS,Al,yf=O(()=>{"use strict";Kp();af();ff=new Set(Object.keys(Ur).filter(t=>t!=="codex"&&t!=="kimi")),aS=/\d\.(?=\d)/,lf=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],cf=["deepseek-flash","deepseek-pro"],df="gpt-5.3-codex-spark",lS=15e3;Il=null;mS=5e3;xl=null;hS=5e3;Al=new Map});function Rn(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var Pi=O(()=>{"use strict"});import{randomUUID as bS}from"node:crypto";import{chmodSync as Ef,mkdirSync as SS,readdirSync as kS,statSync as RS,unlinkSync as IS,writeFileSync as xS}from"node:fs";import{homedir as AS,tmpdir as CS}from"node:os";import{join as Br}from"node:path";function FS(t){return Rn(t.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\|$)/g,"")).replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g,"\uFFFD")}function Wr(t){return FS(t).replace(/-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z0-9 ]*PRIVATE KEY-----|$)/g,"[REDACTED_PRIVATE_KEY]").replace(/\b((?:set-)?cookie\s*:[ \t]*)[^\r\n]+/gi,"$1[REDACTED]").replace(/\b([a-z][a-z0-9+.-]*:\/\/[^\s/:@]*):[^\s/@]+@/gi,"$1:[REDACTED]@").replace(/\bBearer\s+(?=[A-Za-z0-9._~+/-]{12,}\b)(?=[A-Za-z0-9._~+/-]*[0-9._~+/-])[A-Za-z0-9._~+/-]{12,}/gi,"Bearer [REDACTED]").replace(DS,"$1[REDACTED]").replace(/\b((?:[A-Z0-9]+_)*(?:KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIALS?)(?:_[A-Z0-9]+)*=)(?!\[REDACTED\])(?:"[^"]*"|'[^']*'|[^\s,;]+)/g,"$1[REDACTED]").replace(/([?&](?:key|sig|signature)=)[^&\s'"]+/gi,"$1[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{12,}\b/g,"[REDACTED_SECRET]").replace(/\b(?:gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|glpat-[A-Za-z0-9_-]{16,}|xox[abeprs]-[A-Za-z0-9-]{10,})/g,"[REDACTED_SECRET]").replace(/\bAIza[0-9A-Za-z_-]{20,}\b/g,"[REDACTED_SECRET]").replace(/\bAKIA[0-9A-Z]{16}\b/g,"[REDACTED_SECRET]").replace(/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,"[REDACTED_JWT]")}function $S(){let t=process.env.LMCTL_HOME||(process.env.NODE_ENV==="test"?Br(CS(),`lmctl-test-${process.pid}`,".lmctl"):Br(process.env.HOME||AS(),".lmctl"));return Br(t,"provider-errors")}function jS(t,e,n){if(t.length<=e)return t;let r=Math.floor(e*.2),s=e-r,i=t.length-e;return`${t.slice(0,r)}
2006
2006
  \u2026 ${i} characters of ${n} \u2026
2007
- ${t.slice(-s)}`}function OS(t,e){try{let n=_S(t).filter(s=>IS.test(s)).sort().map(s=>{let i=jr(t,s);return{path:i,size:yS(i).size}}),r=n.reduce((s,i)=>s+i.size,0);for(let s=0;s<n.length&&(n.length-s>kS||r>RS);s++){let i=n[s];i.path!==e&&(ES(i.path),r-=i.size)}}catch{}}function LS(t,e){let n=CS(),r=jr(n,`stderr-${Date.now()}-${process.pid}-${gS()}.log`);try{hS(n,{recursive:!0,mode:448}),ff(n,448);let s=`[${new Date().toISOString()}] provider=${e}
2008
- ${NS(t,SS,"provider output not saved")}
2009
- `;return vS(r,s,{encoding:"utf8",flag:"wx",mode:384}),ff(r,384),OS(n,r),{path:r,saved:!0}}catch{return{path:r,saved:!1}}}function MS(t){let e=new Map,n=new Map;t.forEach((i,o)=>{i.trim()!==""&&(e.set(i,(e.get(i)??0)+1),n.set(i,o))});let r=[],s=0;return t.forEach((i,o)=>{let a=e.get(i);if(a===void 0||a===1){r.push(i);return}n.get(i)===o&&(s+=a-1,r.push(`${i} (repeated ${a} times)`))}),{lines:r,duplicates:s}}function Nt(t){return Array.from(t)}function PS(t,e){let n=Nt(t),r=`\u2026[${n.length} characters clipped]\u2026`,s=Math.max(2,e-Nt(r).length),i=Math.max(1,Math.floor(s*.4)),o=Math.max(1,s-i),a=n.slice(0,i).join("").replace(/[\u200d\ufe0f\u0300-\u036f]+$/u,""),l=n.slice(-o).join("").replace(/^[\u200d\ufe0f\u0300-\u036f]+/u,""),c=n.length-Nt(a).length-Nt(l).length;return`${a}\u2026[${c} characters clipped]\u2026${l}`}function DS(t,e){let n=t.join(`
2010
- `);if(Nt(n).length<=e)return{text:n,omittedLines:0,truncatedLine:!1};let r=Math.max(24,Math.floor(e*.68)),s=[],i=0,o=!1;for(let u=t.length-1;u>=0;u--){let m=t[u],p=Nt(m).length+(s.length>0?1:0);if(i+p<=r){s.unshift({index:u,line:m}),i+=p;continue}s.length===0&&(s.unshift({index:u,line:PS(m,t.length===1?e:r)}),o=!0);break}let a=s[0]?.index??t.length,l=[],c="",d=u=>{let m=t.length-u.length-s.length,p=[...u];return m>0&&p.push(`\u2026 ${m} lines omitted \u2026`),p.push(...s.map(h=>h.line)),p.join(`
2011
- `)};for(let u=0;u<a;u++){let m=[...l,t[u]],p=d(m);if(Nt(p).length>e)break;l=m,c=p}return l.length===0&&(c=d(l)),Nt(c).length>e&&(c=Nt(c).slice(-e).join(""),o=!0),{text:c,omittedLines:Math.max(0,t.length-l.length-s.length),truncatedLine:o}}function ge(t,e){let n=Ur(t),r=e.fullOutput===void 0?n:Ur(e.fullOutput),{lines:s,duplicates:i}=MS(n.trim().split(/\r\n|\r|\n/)),o=DS(s,Math.max(64,e.maxChars??bS)),a=[];if(o.omittedLines>0&&a.push(`${o.omittedLines} lines omitted from summary`),o.truncatedLine&&a.push("a long line was clipped"),i>0&&a.push(`${i} duplicate lines collapsed`),e.fullOutput!==void 0&&r.trim()!==n.trim()&&a.push("filtered provider output is retained in the full log"),a.length===0)return o.text;let l=LS(r,e.provider),c=l.saved?`full redacted output: ${l.path}`:`full redacted output could not be written; attempted path: ${l.path}`;return`${o.text}
2007
+ ${t.slice(-s)}`}function US(t,e){try{let n=kS(t).filter(s=>PS.test(s)).sort().map(s=>{let i=Br(t,s);return{path:i,size:RS(i).size}}),r=n.reduce((s,i)=>s+i.size,0);for(let s=0;s<n.length&&(n.length-s>LS||r>MS);s++){let i=n[s];i.path!==e&&(IS(i.path),r-=i.size)}}catch{}}function HS(t,e){let n=$S(),r=Br(n,`stderr-${Date.now()}-${process.pid}-${bS()}.log`);try{SS(n,{recursive:!0,mode:448}),Ef(n,448);let s=`[${new Date().toISOString()}] provider=${e}
2008
+ ${jS(t,OS,"provider output not saved")}
2009
+ `;return xS(r,s,{encoding:"utf8",flag:"wx",mode:384}),Ef(r,384),US(n,r),{path:r,saved:!0}}catch{return{path:r,saved:!1}}}function BS(t){let e=new Map,n=new Map;t.forEach((i,o)=>{i.trim()!==""&&(e.set(i,(e.get(i)??0)+1),n.set(i,o))});let r=[],s=0;return t.forEach((i,o)=>{let a=e.get(i);if(a===void 0||a===1){r.push(i);return}n.get(i)===o&&(s+=a-1,r.push(`${i} (repeated ${a} times)`))}),{lines:r,duplicates:s}}function Ot(t){return Array.from(t)}function WS(t,e){let n=Ot(t),r=`\u2026[${n.length} characters clipped]\u2026`,s=Math.max(2,e-Ot(r).length),i=Math.max(1,Math.floor(s*.4)),o=Math.max(1,s-i),a=n.slice(0,i).join("").replace(/[\u200d\ufe0f\u0300-\u036f]+$/u,""),l=n.slice(-o).join("").replace(/^[\u200d\ufe0f\u0300-\u036f]+/u,""),c=n.length-Ot(a).length-Ot(l).length;return`${a}\u2026[${c} characters clipped]\u2026${l}`}function XS(t,e){let n=t.join(`
2010
+ `);if(Ot(n).length<=e)return{text:n,omittedLines:0,truncatedLine:!1};let r=Math.max(24,Math.floor(e*.68)),s=[],i=0,o=!1;for(let u=t.length-1;u>=0;u--){let m=t[u],p=Ot(m).length+(s.length>0?1:0);if(i+p<=r){s.unshift({index:u,line:m}),i+=p;continue}s.length===0&&(s.unshift({index:u,line:WS(m,t.length===1?e:r)}),o=!0);break}let a=s[0]?.index??t.length,l=[],c="",d=u=>{let m=t.length-u.length-s.length,p=[...u];return m>0&&p.push(`\u2026 ${m} lines omitted \u2026`),p.push(...s.map(h=>h.line)),p.join(`
2011
+ `)};for(let u=0;u<a;u++){let m=[...l,t[u]],p=d(m);if(Ot(p).length>e)break;l=m,c=p}return l.length===0&&(c=d(l)),Ot(c).length>e&&(c=Ot(c).slice(-e).join(""),o=!0),{text:c,omittedLines:Math.max(0,t.length-l.length-s.length),truncatedLine:o}}function ge(t,e){let n=Wr(t),r=e.fullOutput===void 0?n:Wr(e.fullOutput),{lines:s,duplicates:i}=BS(n.trim().split(/\r\n|\r|\n/)),o=XS(s,Math.max(64,e.maxChars??NS)),a=[];if(o.omittedLines>0&&a.push(`${o.omittedLines} lines omitted from summary`),o.truncatedLine&&a.push("a long line was clipped"),i>0&&a.push(`${i} duplicate lines collapsed`),e.fullOutput!==void 0&&r.trim()!==n.trim()&&a.push("filtered provider output is retained in the full log"),a.length===0)return o.text;let l=HS(r,e.provider),c=l.saved?`full redacted output: ${l.path}`:`full redacted output could not be written; attempted path: ${l.path}`;return`${o.text}
2012
2012
 
2013
- [provider stderr: ${a.join("; ")}; ${c}]`}function gf(t,e=500){let n=t.indexOf(`
2013
+ [provider stderr: ${a.join("; ")}; ${c}]`}function vf(t,e=500){let n=t.indexOf(`
2014
2014
 
2015
- [provider stderr:`),r=a=>a.replace(/\s+/gu," ").trim(),s=r(t),i=Array.from(s);if(i.length<=e)return s;if(n<0)return`${i.slice(0,e-3).join("")}...`;let o=Array.from(r(t.slice(0,n)));return o.length<=e?o.join(""):`...${o.slice(-(e-3)).join("")}`}function hf(t=1e6){let e=Math.floor(t*.1),n="",r="",s=0;return{append(i){if(n.length<e&&s===0&&r===""){let a=i.slice(0,e-n.length);if(n+=a,i=i.slice(a.length),i==="")return}r+=i;let o=r.length-(t-e);o>0&&(r=r.slice(o),s+=o)},text(){return s===0?n+r:`${n}
2015
+ [provider stderr:`),r=a=>a.replace(/\s+/gu," ").trim(),s=r(t),i=Array.from(s);if(i.length<=e)return s;if(n<0)return`${i.slice(0,e-3).join("")}...`;let o=Array.from(r(t.slice(0,n)));return o.length<=e?o.join(""):`...${o.slice(-(e-3)).join("")}`}function wf(t=1e6){let e=Math.floor(t*.1),n="",r="",s=0;return{append(i){if(n.length<e&&s===0&&r===""){let a=i.slice(0,e-n.length);if(n+=a,i=i.slice(a.length),i==="")return}r+=i;let o=r.length-(t-e);o>0&&(r=r.slice(o),s+=o)},text(){return s===0?n+r:`${n}
2016
2016
  \u2026 ${s} characters of provider stderr dropped \u2026
2017
- ${r}`}}}function zn(t,e){return e===""?t:`${t}:${e.includes(`
2017
+ ${r}`}}}function Zn(t,e){return e===""?t:`${t}:${e.includes(`
2018
2018
  `)?`
2019
- `:" "}${e}`}var bS,SS,kS,RS,IS,xS,ot=O(()=>{"use strict";Oi();bS=500,SS=1e6,kS=50,RS=20*1024*1024,IS=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,xS=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi});import{readFileSync as Ef,appendFileSync as FS,mkdirSync as $S,existsSync as C0,readdirSync as N0,unlinkSync as O0}from"node:fs";import{join as Mi,dirname as jS}from"node:path";import{homedir as US}from"node:os";function Nl(){return Mi(US(),".lmctl")}function he(){if(vf||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-yf>=HS&&(_f=qS(),yf=t),_f}function BS(){let t=new Date,e=t.getTimezoneOffset(),n=e<=0?"+":"-",r=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${n}${r}:${s}`)}function Cl(t,e="",n=new WeakSet){if(/(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|credential|token|secret)/i.test(e)&&typeof t=="string")return"[REDACTED]";if(typeof t=="string")return Ur(t);if(Array.isArray(t))return t.map(r=>Cl(r,"",n));if(t&&typeof t=="object"){if(n.has(t))return"[Circular]";n.add(t);let r={};for(let[s,i]of Object.entries(t))r[s]=Cl(i,s,n);return n.delete(t),r}return t}function WS(t){return Cl(t)}function Oe(t,e){if(e?.verbose){if(!vf)return}else if(!e?.always&&!he())return;try{XS();let n={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...WS(t)};FS(Li,JSON.stringify(n)+`
2020
- `)}catch{}}function XS(){if(!Li){let e=BS().slice(0,13).replace("T","-");Li=Mi(Nl(),`debug-${e}.log`)}$S(jS(Li),{recursive:!0})}function Ge(...t){Oe({event:"legacy",msg:t.join(" ")})}function Se(...t){Oe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function U(t){Oe(t,{always:!0})}function qS(){return GS()||JS()}function GS(){try{let t=Ef(Mi(Nl(),"config.toml"),"utf-8");for(let e of t.split(`
2021
- `)){let n=e.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function JS(){try{let t=Ef(Mi(Nl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var vf,_f,yf,HS,Li,oe=O(()=>{"use strict";ot();vf=!1,_f=!1,yf=0,HS=5e3;Li=null});import{existsSync as bf,mkdirSync as KS,readFileSync as Sf,writeFileSync as wf}from"node:fs";import{join as Hr,resolve as VS}from"node:path";function kf(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 Ol(t,e,n={existsSync:bf,readFileSync:Sf}){let r=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=VS(e,s.sessiondir??e);for(let o of zS(i)){let a=YS(o,n);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(kf(a.permission)||r.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return r}function zS(t){return[Hr(t,".opencode","opencode.jsonc"),Hr(t,"opencode.jsonc"),Hr(t,"opencode.json")]}function YS(t,e){try{if(!e.existsSync(t))return;let n=e.readFileSync(t,"utf-8"),r=JSON.parse(QS(n));return r===null||typeof r!="object"||Array.isArray(r)?void 0:r}catch{return}}function QS(t){let e="",n=!1,r="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(n){e+=o,s?s=!1:o==="\\"?s=!0:o===r&&(n=!1,r="");continue}if(o==='"'||o==="'"){n=!0,r=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
2022
- `;)i+=1;i<t.length&&(e+=t[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<t.length&&!(t[i]==="*"&&t[i+1]==="/");)i+=1;i+=1;continue}e+=o}return e.replace(/,\s*([}\]])/g,"$1")}function Rf(t,e={}){let n=Hr(t,".opencode"),r=Hr(n,"opencode.json");if(!bf(r)){KS(n,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return wf(r,o+`
2023
- `,"utf-8"),!0}let s;try{s=JSON.parse(Sf(r,"utf-8"))}catch{return console.log(Tf.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Tf.yellow(` .opencode/opencode.json at ${r} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),kf(s.permission)||U({event:"opencode_yolo_override",provider:"opencode",config_path:r,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&wf(r,JSON.stringify(s,null,2)+`
2024
- `,"utf-8"),i}var Tf,Ll=O(()=>{"use strict";oe();Tf={yellow:t=>t}});function Xr(t,e){let n;if(e&&typeof e=="object"){let r=e.code;typeof r=="number"&&(n=r)}return new Wr(t,n,e)}var Zt,de,Br,Pi,Wr,kn=O(()=>{"use strict";Zt=class extends Error{constructor(e,n){super(e,n),this.name=this.constructor.name}},de=class extends Zt{},Br=class extends Zt{constructor(n,r,s=null,i){super(n);this.exitCode=r;this.signal=s;this.stderr=i}},Pi=class extends Zt{line;constructor(e,n,r){super(e,{cause:r}),this.line=n}},Wr=class extends Zt{rpcCode;rpcData;constructor(e,n,r){super(e),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as Pl from"node:child_process";function ek(t){if(typeof Pl.spawnSync=="function")try{Pl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function If(t){return t.exitCode!==null||t.signalCode!==null}function Ml(t,e){return If(t)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,t.removeListener("exit",s),n(!1))},e);t.once("exit",s)})}async function te(t,e={}){let n=Date.now(),r=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??ek;if(If(t))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Ml(t,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await Ml(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await Ml(t,ZS)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var ZS,Rn=O(()=>{"use strict";ZS=1e3});async function Fi(t,e,n){if(typeof t=="boolean")return t;let r,s;try{return await Promise.race([t,new Promise(i=>{r=setTimeout(()=>i(Dl),e),r.unref?.(),n!==void 0&&(s=()=>i(Dl),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function _t(t,e){if(t===void 0){e.closeStdin();return}let n=!1,r=i=>{if(!n){n=!0;try{t.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}e.closeStdin()},s=Date.now();ik(t,e,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function ik(t,e,n,r){let s=t.pollMs??tk,i=t.maxHoldMs??Di,o=t.settleMs??nk,a=t.backgroundGraceMs??rk,l=!1,c=null,d=u=>r({startedMs:n,held:l,reason:u});for(;;){if(e.isAborted())return d("aborted");if(e.hasChildExited())return d("child-exited");let u=i-(Date.now()-n);if(u<=0)return d("max-hold");let m;try{m=await Fi(t.hasOutstandingWork(),u,e.signal)}catch{return d("check-error")}if(m===Dl)return d(e.isAborted()||e.signal?.aborted===!0?"aborted":"max-hold");if(m)c=null;else{if(!l&&e.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let _=a-(Date.now()-n);await new Promise(y=>setTimeout(y,Math.max(0,Math.min(s,sk,_))).unref?.());continue}if(!l||o<=0)return d("cleared");c===null&&(c=Date.now(),Se(`${e.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let h=Math.max(c,e.lastEventAtMs());if(!e.isTurnInFlight()&&Date.now()-h>=o)return d("cleared")}if(l||(l=!0,t.onHold?.(),Se(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return U({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-n}),d("max-hold");let p=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(h=>setTimeout(h,p).unref?.())}}var tk,Di,nk,rk,sk,Dl,qr=O(()=>{"use strict";oe();tk=2e3,Di=8*60*60*1e3,nk=5e3,rk=1e3,sk=50,Dl=Symbol("check-timed-out")});function xf(t){he()&&Oe({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function en(t,e){let n=ak[t];if(n)return n[e]??n.yolo}function ck(t,e){if(e.length===0)return!0;for(let n=0;n+e.length<=t.length;n++){let r=!0;for(let s=0;s<e.length;s++)if(t[n+s]!==e[s]){r=!1;break}if(r)return!0}return!1}function Te(t,e,n="yolo"){if(lk.has(t)){xf(`YOLO ${t} [mode=${n}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:t==="dsh"?"DSH_PERMISSION_MODE=danger-full-access env var on the sidecar spawn \u2014 no argv flag":t==="hermes"?"HERMES_YOLO_MODE=1 shell gate + ACP session/set_mode (modeId=dont_ask) edit gate":t==="pi"?"no tool-permission prompts exist in pi by design \u2014 nothing to bypass":t==="muse"?"MSP approval mode plus fixed host sandbox/write/shell posture":t==="miniplayer"?"native tools always granted; no permission mode":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?en(t,"plan"):ok[t];if(!r){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw U({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new de(s)}if(!ck(e,r)){let s=r.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw U({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:n,args:e.join(" "),message:i}),new de(i)}xf(`YOLO ${t} [mode=${n}]: argv flag '${r.join(" ")}'`)}var ok,ak,lk,yt=O(()=>{"use strict";kn();oe();ok={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},ak={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};lk=new Set(["codex","opencode","kimi","dsh","hermes","pi","miniplayer","muse"])});import{existsSync as dk}from"node:fs";function Af(t){let e=t.CLAUDE_CODE_EXECPATH;if(e===void 0||e.length===0)return t;let n=process.platform!=="win32"&&e.toLowerCase().endsWith(".exe"),r=!n&&!dk(e);if(!n&&!r)return t;U({event:"claude_execpath_sanitized",reason:n?"wrong_platform_exe":"missing_file",value:e,platform:process.platform});let s={...t};return delete s.CLAUDE_CODE_EXECPATH,s}function Yn(t,e){let n={...t??process.env,PWD:e};return delete n.OLDPWD,n}function mk(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Fl]:e}}function we(t,e,n,r="chat"){return{...mk(Yn(t,e),n),[uk]:r}}var Fl,uk,at=O(()=>{"use strict";oe();Fl="LMCTL_SELF_SESSIONID",uk="LMCTL_LAUNCH_SOURCE"});function $i(t){let e=[...t.matchAll(pk)];if(e.length>0){let n=e[e.length-1],r=(n.index??0)+n[0].length;return Cf(t.slice(r).trimStart())}return Cf(yk(t.replace(fk,"")))}function yk(t){let e=gk.exec(t);if(e===null)return t;let n=t.slice(e[0].length),r=[...n.matchAll(hk)];if(r.length<2)return t;let s=r[0],i=(s.index??0)+s[0].length;return n.slice(i).trimStart()}function Cf(t){let e=[...t.matchAll(_k)];if(e.length===0)return t;let n=e[e.length-1],r=(n.index??0)+n[0].length;return t.slice(r).trimStart()}function Ot(t,e=""){let n=t.result;return typeof n?.sessionId=="string"&&n.sessionId.length>0?n.sessionId:e}function Of(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function ji(t={}){let e="",n="",r="",s=!1,i=!1,o=!1,a=t.isolateResult??(t.tool==="gemini"?$i:void 0),l=()=>({result:a?a(n):n,sessionId:e,stopReason:r,sawActivity:o});return{setSessionId(c){e=c},beginTurn(){n="",r="",s=!1,i=!0,o=!1},completeTurn(c){return r=Of(c),s=!0,i=!1,l()},cancelTurn(){n="",r="",i=!1},processMessage(c){if(c.method!=="session/update")return!1;let u=c.params?.update,m=u?.sessionUpdate;if(typeof m!="string"||(i&&Ek.has(m)&&(o=!0),m!=="agent_message_chunk"))return!1;let p=u?.content,h=typeof p?.text=="string"?p.text:"";return h&&i&&(n+=h,t.onDelta?.(h)),!0},finalize(){return s?l():null}}}var Nf,pk,fk,gk,hk,_k,Ek,Gr=O(()=>{"use strict";Nf="(?:png|jpe?g|webp|heic|pdf)",pk=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Nf}\\s*`,"gi"),fk=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Nf}\\s*`,"i"),gk=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,hk=/^STANCE:\s+\S+\s*$/gim,_k=/\[Thought:\s*true\]\s*/gi;Ek=new Set(["agent_message_chunk","agent_thought_chunk","tool_call","tool_call_update","plan"])});import{createInterface as vk}from"node:readline";function tn(t,e){let n=e.protocol??"acp",r=vk({input:t.stdout}),s=new Map,i=(a,l={},c)=>new Promise((d,u)=>{let m=wk++;s.set(m,{resolve:d,reject:u,onResponse:c});let p=JSON.stringify({jsonrpc:"2.0",id:m,method:a,params:l});Oe({event:`${n}_send`,direction:"SEND",provider:e.provider,method:a,id:m,params:l}),t.stdin?.write(`${p}
2019
+ `:" "}${e}`}var NS,OS,LS,MS,PS,DS,at=O(()=>{"use strict";Pi();NS=500,OS=1e6,LS=50,MS=20*1024*1024,PS=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,DS=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi});import{readFileSync as Sf,appendFileSync as qS,mkdirSync as GS,existsSync as $0,readdirSync as j0,unlinkSync as U0}from"node:fs";import{join as Fi,dirname as JS}from"node:path";import{homedir as KS}from"node:os";function Pl(){return Fi(KS(),".lmctl")}function he(){if(kf||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-bf>=VS&&(Tf=ZS(),bf=t),Tf}function zS(){let t=new Date,e=t.getTimezoneOffset(),n=e<=0?"+":"-",r=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${n}${r}:${s}`)}function Ml(t,e="",n=new WeakSet){if(/(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|credential|token|secret)/i.test(e)&&typeof t=="string")return"[REDACTED]";if(typeof t=="string")return Wr(t);if(Array.isArray(t))return t.map(r=>Ml(r,"",n));if(t&&typeof t=="object"){if(n.has(t))return"[Circular]";n.add(t);let r={};for(let[s,i]of Object.entries(t))r[s]=Ml(i,s,n);return n.delete(t),r}return t}function YS(t){return Ml(t)}function Oe(t,e){if(e?.verbose){if(!kf)return}else if(!e?.always&&!he())return;try{QS();let n={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...YS(t)};qS(Di,JSON.stringify(n)+`
2020
+ `)}catch{}}function QS(){if(!Di){let e=zS().slice(0,13).replace("T","-");Di=Fi(Pl(),`debug-${e}.log`)}GS(JS(Di),{recursive:!0})}function Ge(...t){Oe({event:"legacy",msg:t.join(" ")})}function Se(...t){Oe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function U(t){Oe(t,{always:!0})}function ZS(){return ek()||tk()}function ek(){try{let t=Sf(Fi(Pl(),"config.toml"),"utf-8");for(let e of t.split(`
2021
+ `)){let n=e.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function tk(){try{let t=Sf(Fi(Pl(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var kf,Tf,bf,VS,Di,oe=O(()=>{"use strict";at();kf=!1,Tf=!1,bf=0,VS=5e3;Di=null});import{existsSync as xf,mkdirSync as nk,readFileSync as Af,writeFileSync as Rf}from"node:fs";import{join as Xr,resolve as rk}from"node:path";function Cf(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 Dl(t,e,n={existsSync:xf,readFileSync:Af}){let r=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=rk(e,s.sessiondir??e);for(let o of sk(i)){let a=ik(o,n);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Cf(a.permission)||r.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return r}function sk(t){return[Xr(t,".opencode","opencode.jsonc"),Xr(t,"opencode.jsonc"),Xr(t,"opencode.json")]}function ik(t,e){try{if(!e.existsSync(t))return;let n=e.readFileSync(t,"utf-8"),r=JSON.parse(ok(n));return r===null||typeof r!="object"||Array.isArray(r)?void 0:r}catch{return}}function ok(t){let e="",n=!1,r="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(n){e+=o,s?s=!1:o==="\\"?s=!0:o===r&&(n=!1,r="");continue}if(o==='"'||o==="'"){n=!0,r=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
2022
+ `;)i+=1;i<t.length&&(e+=t[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<t.length&&!(t[i]==="*"&&t[i+1]==="/");)i+=1;i+=1;continue}e+=o}return e.replace(/,\s*([}\]])/g,"$1")}function Nf(t,e={}){let n=Xr(t,".opencode"),r=Xr(n,"opencode.json");if(!xf(r)){nk(n,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return Rf(r,o+`
2023
+ `,"utf-8"),!0}let s;try{s=JSON.parse(Af(r,"utf-8"))}catch{return console.log(If.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(If.yellow(` .opencode/opencode.json at ${r} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),Cf(s.permission)||U({event:"opencode_yolo_override",provider:"opencode",config_path:r,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&Rf(r,JSON.stringify(s,null,2)+`
2024
+ `,"utf-8"),i}var If,Fl=O(()=>{"use strict";oe();If={yellow:t=>t}});function Jr(t,e){let n;if(e&&typeof e=="object"){let r=e.code;typeof r=="number"&&(n=r)}return new Gr(t,n,e)}var en,de,qr,$i,Gr,In=O(()=>{"use strict";en=class extends Error{constructor(e,n){super(e,n),this.name=this.constructor.name}},de=class extends en{},qr=class extends en{constructor(n,r,s=null,i){super(n);this.exitCode=r;this.signal=s;this.stderr=i}},$i=class extends en{line;constructor(e,n,r){super(e,{cause:r}),this.line=n}},Gr=class extends en{rpcCode;rpcData;constructor(e,n,r){super(e),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as jl from"node:child_process";function lk(t){if(typeof jl.spawnSync=="function")try{jl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Of(t){return t.exitCode!==null||t.signalCode!==null}function $l(t,e){return Of(t)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,t.removeListener("exit",s),n(!1))},e);t.once("exit",s)})}async function te(t,e={}){let n=Date.now(),r=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??lk;if(Of(t))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await $l(t,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await $l(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await $l(t,ak)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var ak,xn=O(()=>{"use strict";ak=1e3});async function Ui(t,e,n){if(typeof t=="boolean")return t;let r,s;try{return await Promise.race([t,new Promise(i=>{r=setTimeout(()=>i(Ul),e),r.unref?.(),n!==void 0&&(s=()=>i(Ul),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function yt(t,e){if(t===void 0){e.closeStdin();return}let n=!1,r=i=>{if(!n){n=!0;try{t.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}e.closeStdin()},s=Date.now();pk(t,e,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function pk(t,e,n,r){let s=t.pollMs??ck,i=t.maxHoldMs??ji,o=t.settleMs??dk,a=t.backgroundGraceMs??uk,l=!1,c=null,d=u=>r({startedMs:n,held:l,reason:u});for(;;){if(e.isAborted())return d("aborted");if(e.hasChildExited())return d("child-exited");let u=i-(Date.now()-n);if(u<=0)return d("max-hold");let m;try{m=await Ui(t.hasOutstandingWork(),u,e.signal)}catch{return d("check-error")}if(m===Ul)return d(e.isAborted()||e.signal?.aborted===!0?"aborted":"max-hold");if(m)c=null;else{if(!l&&e.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let _=a-(Date.now()-n);await new Promise(y=>setTimeout(y,Math.max(0,Math.min(s,mk,_))).unref?.());continue}if(!l||o<=0)return d("cleared");c===null&&(c=Date.now(),Se(`${e.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let h=Math.max(c,e.lastEventAtMs());if(!e.isTurnInFlight()&&Date.now()-h>=o)return d("cleared")}if(l||(l=!0,t.onHold?.(),Se(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return U({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-n}),d("max-hold");let p=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(h=>setTimeout(h,p).unref?.())}}var ck,ji,dk,uk,mk,Ul,Kr=O(()=>{"use strict";oe();ck=2e3,ji=8*60*60*1e3,dk=5e3,uk=1e3,mk=50,Ul=Symbol("check-timed-out")});function Lf(t){he()&&Oe({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function tn(t,e){let n=gk[t];if(n)return n[e]??n.yolo}function _k(t,e){if(e.length===0)return!0;for(let n=0;n+e.length<=t.length;n++){let r=!0;for(let s=0;s<e.length;s++)if(t[n+s]!==e[s]){r=!1;break}if(r)return!0}return!1}function Te(t,e,n="yolo"){if(hk.has(t)){Lf(`YOLO ${t} [mode=${n}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:t==="dsh"?"DSH_PERMISSION_MODE=danger-full-access env var on the sidecar spawn \u2014 no argv flag":t==="hermes"?"HERMES_YOLO_MODE=1 shell gate + ACP session/set_mode (modeId=dont_ask) edit gate":t==="pi"?"no tool-permission prompts exist in pi by design \u2014 nothing to bypass":t==="muse"?"MSP approval mode plus fixed host sandbox/write/shell posture":t==="miniplayer"?"native tools always granted; no permission mode":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?tn(t,"plan"):fk[t];if(!r){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw U({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new de(s)}if(!_k(e,r)){let s=r.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw U({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:n,args:e.join(" "),message:i}),new de(i)}Lf(`YOLO ${t} [mode=${n}]: argv flag '${r.join(" ")}'`)}var fk,gk,hk,Et=O(()=>{"use strict";In();oe();fk={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},gk={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};hk=new Set(["codex","opencode","kimi","dsh","hermes","pi","miniplayer","muse"])});import{existsSync as yk}from"node:fs";function Mf(t){let e=t.CLAUDE_CODE_EXECPATH;if(e===void 0||e.length===0)return t;let n=process.platform!=="win32"&&e.toLowerCase().endsWith(".exe"),r=!n&&!yk(e);if(!n&&!r)return t;U({event:"claude_execpath_sanitized",reason:n?"wrong_platform_exe":"missing_file",value:e,platform:process.platform});let s={...t};return delete s.CLAUDE_CODE_EXECPATH,s}function er(t,e){let n={...t??process.env,PWD:e};return delete n.OLDPWD,n}function vk(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Hl]:e}}function we(t,e,n,r="chat"){return{...vk(er(t,e),n),[Ek]:r}}var Hl,Ek,lt=O(()=>{"use strict";oe();Hl="LMCTL_SELF_SESSIONID",Ek="LMCTL_LAUNCH_SOURCE"});function Hi(t){let e=[...t.matchAll(wk)];if(e.length>0){let n=e[e.length-1],r=(n.index??0)+n[0].length;return Pf(t.slice(r).trimStart())}return Pf(Rk(t.replace(Tk,"")))}function Rk(t){let e=bk.exec(t);if(e===null)return t;let n=t.slice(e[0].length),r=[...n.matchAll(Sk)];if(r.length<2)return t;let s=r[0],i=(s.index??0)+s[0].length;return n.slice(i).trimStart()}function Pf(t){let e=[...t.matchAll(kk)];if(e.length===0)return t;let n=e[e.length-1],r=(n.index??0)+n[0].length;return t.slice(r).trimStart()}function Lt(t,e=""){let n=t.result;return typeof n?.sessionId=="string"&&n.sessionId.length>0?n.sessionId:e}function Ff(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function Bi(t={}){let e="",n="",r="",s=!1,i=!1,o=!1,a=t.isolateResult??(t.tool==="gemini"?Hi:void 0),l=()=>({result:a?a(n):n,sessionId:e,stopReason:r,sawActivity:o});return{setSessionId(c){e=c},beginTurn(){n="",r="",s=!1,i=!0,o=!1},completeTurn(c){return r=Ff(c),s=!0,i=!1,l()},cancelTurn(){n="",r="",i=!1},processMessage(c){if(c.method!=="session/update")return!1;let u=c.params?.update,m=u?.sessionUpdate;if(typeof m!="string"||(i&&Ik.has(m)&&(o=!0),m!=="agent_message_chunk"))return!1;let p=u?.content,h=typeof p?.text=="string"?p.text:"";return h&&i&&(n+=h,t.onDelta?.(h)),!0},finalize(){return s?l():null}}}var Df,wk,Tk,bk,Sk,kk,Ik,Vr=O(()=>{"use strict";Df="(?:png|jpe?g|webp|heic|pdf)",wk=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Df}\\s*`,"gi"),Tk=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Df}\\s*`,"i"),bk=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,Sk=/^STANCE:\s+\S+\s*$/gim,kk=/\[Thought:\s*true\]\s*/gi;Ik=new Set(["agent_message_chunk","agent_thought_chunk","tool_call","tool_call_update","plan"])});import{createInterface as xk}from"node:readline";function nn(t,e){let n=e.protocol??"acp",r=xk({input:t.stdout}),s=new Map,i=(a,l={},c)=>new Promise((d,u)=>{let m=Ak++;s.set(m,{resolve:d,reject:u,onResponse:c});let p=JSON.stringify({jsonrpc:"2.0",id:m,method:a,params:l});Oe({event:`${n}_send`,direction:"SEND",provider:e.provider,method:a,id:m,params:l}),t.stdin?.write(`${p}
2025
2025
  `)}),o=(a,l={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:a,params:l})}
2026
- `)};return r.on("line",a=>{let l=u=>{if(!e.onProtocolError)return;let m=a.slice(0,512);U({event:`${n}_protocol_error`,provider:e.provider,reason:u,raw_preview:m,truncated:a.length>512}),e.onProtocolError(new Error(`${n.toUpperCase()} ${u}: ${JSON.stringify(m)}${a.length>512?" (truncated)":""}`))},c;try{c=JSON.parse(a)}catch{l("returned malformed JSON");return}if(!c||typeof c!="object"||Array.isArray(c)){l("returned an invalid message");return}if(Oe({event:`${n}_recv`,direction:"RECV",provider:e.provider,id:typeof c.id=="number"?c.id:void 0,method:typeof c.method=="string"?c.method:void 0,preview:JSON.stringify(c).slice(0,300)}),e.onEvent?.(c),typeof c.method!="string"&&typeof c.id=="number"&&s.has(c.id)){let u=s.get(c.id);s.delete(c.id);try{u.onResponse?.(c)}catch(m){u.reject(m instanceof Error?m:new Error(String(m)));return}if(c.error){let m=c.error,p=typeof m?.message=="string"&&m.message.length>0?m.message:JSON.stringify(c.error);u.reject(Xr(`${n.toUpperCase()} RPC error: ${p}`,m))}else u.resolve(c);return}let d=c.method;if(!d){l("returned an uncorrelated response");return}if(typeof c.id=="number"||typeof c.id=="string"){U({event:`${n}_unhandled_request`,provider:e.provider,method:d,id:c.id,params:c.params});let u=JSON.stringify({jsonrpc:"2.0",id:c.id,error:{code:-32601,message:`Method not found: ${d} (lmctl does not implement server-side ${n.toUpperCase()} methods)`}});Oe({event:`${n}_send`,direction:"SEND",provider:e.provider,replyTo:c.id,error:"method not found"}),t.stdin?.write(`${u}
2027
- `);return}e.onNotification?.(c)}),{sendRpc:i,sendNotification:o,close(a=new de(`${n.toUpperCase()} RPC channel closed`)){r.close();for(let l of s.values())l.reject(a);s.clear()}}}var wk,$l=O(()=>{"use strict";oe();kn();wk=1});var jl=O(()=>{"use strict";$l()});var Ui,Lf=O(()=>{"use strict";Ui={name:"miniplayer",binary:"miniplayer",baseArgs:["acp"],argv:t=>{if(t.permissionMode==="plan")throw new Error("miniplayer has no plan mode; its native tools always have full permissions");return["acp",...t.model?["-m",t.model]:[]]}}});import{createReadStream as Mf}from"node:fs";import{createInterface as Pf}from"node:readline";import{stat as Tk}from"node:fs/promises";import{homedir as bk}from"node:os";function Df(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*me(t,e){let n=Mf(t,{encoding:"utf-8"}),r=Pf({input:n,crlfDelay:1/0});try{for await(let s of r){let i=s.trim();if(!i)continue;let o=Df(i);o!==void 0?yield o:e?.()}}finally{n.destroy()}}async function Je(t,e){let n=[],r=Mf(t,{encoding:"utf-8"}),s=Pf({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=Df(o);if(a!==void 0&&n.push(a),n.length>=e)break}}finally{s.close(),r.destroy()}return n}async function ye(t){let e=await Tk(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function ae(t){return t.replace(/\\n/g,`
2028
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function q(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function Ze(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var K,be=O(()=>{"use strict";K=bk()});import{readFileSync as Sk,readdirSync as Ff}from"node:fs";import{join as Hi}from"node:path";function $f(t,e){let n=e.GEMINI_DIR??process.env.GEMINI_DIR??Hi(K,".gemini"),r=Hi(n,"tmp"),s;try{s=Ff(r)}catch{throw new Error(`gemini bundle: cannot read the gemini session store at ${r} \u2014 cannot verify session "${t}"`)}let i=`"sessionId": "${t}"`,o=`"sessionId":"${t}"`;for(let a of s){let l=Hi(r,a,"chats"),c;try{c=Ff(l)}catch{continue}for(let d of c){if(!d.endsWith(".json"))continue;let u;try{u=Sk(Hi(l,d),"utf8").slice(0,8192)}catch{continue}if(u.includes(i)||u.includes(o))return}}throw new Error(`gemini bundle: no session "${t}" in the gemini chats store (${r}) \u2014 the session must exist on disk before a bundle can resume it`)}var Jr,jf=O(()=>{"use strict";Gr();be();yt();Jr={name:"gemini",binary:"gemini",baseArgs:["--acp","-y","--skip-trust"],argv(t){let e=[...Jr.baseArgs];if(t.permissionMode==="plan"){let n=en("gemini","plan"),r=en("gemini","yolo");e=e.filter(s=>!(r??[]).includes(s)),n&&e.push(...n)}return t.model&&e.push("--model",t.model),e},isolateResult:$i,sessionIdentity:{verifyLoadedSession:t=>{$f(t.requestedSessionId,t.env)},recheckSession:t=>{$f(t.requestedSessionId,t.env)}}}});import{existsSync as kk,readFileSync as Rk}from"node:fs";import{join as Ul}from"node:path";function Uf(t,e){let n=e.COPILOT_HOME??process.env.COPILOT_HOME??Ul(K,".copilot"),r=Ul(n,"session-state",t),s=Ul(r,"workspace.yaml");if(!kk(s))throw new Error(`copilot bundle: no session "${t}" in the copilot session store (${r}) \u2014 the session must exist on disk before a bundle can resume it`);let i;try{i=Rk(s,"utf8").slice(0,4096)}catch(a){throw new Error(`copilot bundle: cannot read ${s} \u2014 cannot verify session "${t}": `+(a instanceof Error?a.message:String(a)))}let o=/^id:\s*(\S+)\s*$/m.exec(i);if(o===null||o[1]!==t)throw new Error(`copilot bundle: session store entry ${s} belongs to ${o?.[1]??"no recorded id"}, not "${t}"`)}var Kr,Hf=O(()=>{"use strict";oe();be();Kr={name:"copilot",binary:"copilot",baseArgs:["--acp","--yolo"],argv(t){return t.permissionMode==="plan"&&(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.
2026
+ `)};return r.on("line",a=>{let l=u=>{if(!e.onProtocolError)return;let m=a.slice(0,512);U({event:`${n}_protocol_error`,provider:e.provider,reason:u,raw_preview:m,truncated:a.length>512}),e.onProtocolError(new Error(`${n.toUpperCase()} ${u}: ${JSON.stringify(m)}${a.length>512?" (truncated)":""}`))},c;try{c=JSON.parse(a)}catch{l("returned malformed JSON");return}if(!c||typeof c!="object"||Array.isArray(c)){l("returned an invalid message");return}if(Oe({event:`${n}_recv`,direction:"RECV",provider:e.provider,id:typeof c.id=="number"?c.id:void 0,method:typeof c.method=="string"?c.method:void 0,preview:JSON.stringify(c).slice(0,300)}),e.onEvent?.(c),typeof c.method!="string"&&typeof c.id=="number"&&s.has(c.id)){let u=s.get(c.id);s.delete(c.id);try{u.onResponse?.(c)}catch(m){u.reject(m instanceof Error?m:new Error(String(m)));return}if(c.error){let m=c.error,p=typeof m?.message=="string"&&m.message.length>0?m.message:JSON.stringify(c.error);u.reject(Jr(`${n.toUpperCase()} RPC error: ${p}`,m))}else u.resolve(c);return}let d=c.method;if(!d){l("returned an uncorrelated response");return}if(typeof c.id=="number"||typeof c.id=="string"){U({event:`${n}_unhandled_request`,provider:e.provider,method:d,id:c.id,params:c.params});let u=JSON.stringify({jsonrpc:"2.0",id:c.id,error:{code:-32601,message:`Method not found: ${d} (lmctl does not implement server-side ${n.toUpperCase()} methods)`}});Oe({event:`${n}_send`,direction:"SEND",provider:e.provider,replyTo:c.id,error:"method not found"}),t.stdin?.write(`${u}
2027
+ `);return}e.onNotification?.(c)}),{sendRpc:i,sendNotification:o,close(a=new de(`${n.toUpperCase()} RPC channel closed`)){r.close();for(let l of s.values())l.reject(a);s.clear()}}}var Ak,Bl=O(()=>{"use strict";oe();In();Ak=1});var Wl=O(()=>{"use strict";Bl()});var Wi,$f=O(()=>{"use strict";Wi={name:"miniplayer",binary:"miniplayer",baseArgs:["acp"],argv:t=>{if(t.permissionMode==="plan")throw new Error("miniplayer has no plan mode; its native tools always have full permissions");return["acp",...t.model?["-m",t.model]:[]]}}});import{createReadStream as jf}from"node:fs";import{createInterface as Uf}from"node:readline";import{stat as Ck}from"node:fs/promises";import{homedir as Nk}from"node:os";function Hf(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*me(t,e){let n=jf(t,{encoding:"utf-8"}),r=Uf({input:n,crlfDelay:1/0});try{for await(let s of r){let i=s.trim();if(!i)continue;let o=Hf(i);o!==void 0?yield o:e?.()}}finally{n.destroy()}}async function Je(t,e){let n=[],r=jf(t,{encoding:"utf-8"}),s=Uf({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=Hf(o);if(a!==void 0&&n.push(a),n.length>=e)break}}finally{s.close(),r.destroy()}return n}async function ye(t){let e=await Ck(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function ae(t){return t.replace(/\\n/g,`
2028
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function q(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function et(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var K,be=O(()=>{"use strict";K=Nk()});import{readFileSync as Ok,readdirSync as Bf}from"node:fs";import{join as Xi}from"node:path";function Wf(t,e){let n=e.GEMINI_DIR??process.env.GEMINI_DIR??Xi(K,".gemini"),r=Xi(n,"tmp"),s;try{s=Bf(r)}catch{throw new Error(`gemini bundle: cannot read the gemini session store at ${r} \u2014 cannot verify session "${t}"`)}let i=`"sessionId": "${t}"`,o=`"sessionId":"${t}"`;for(let a of s){let l=Xi(r,a,"chats"),c;try{c=Bf(l)}catch{continue}for(let d of c){if(!d.endsWith(".json"))continue;let u;try{u=Ok(Xi(l,d),"utf8").slice(0,8192)}catch{continue}if(u.includes(i)||u.includes(o))return}}throw new Error(`gemini bundle: no session "${t}" in the gemini chats store (${r}) \u2014 the session must exist on disk before a bundle can resume it`)}var zr,Xf=O(()=>{"use strict";Vr();be();Et();zr={name:"gemini",binary:"gemini",baseArgs:["--acp","-y","--skip-trust"],argv(t){let e=[...zr.baseArgs];if(t.permissionMode==="plan"){let n=tn("gemini","plan"),r=tn("gemini","yolo");e=e.filter(s=>!(r??[]).includes(s)),n&&e.push(...n)}return t.model&&e.push("--model",t.model),e},isolateResult:Hi,sessionIdentity:{verifyLoadedSession:t=>{Wf(t.requestedSessionId,t.env)},recheckSession:t=>{Wf(t.requestedSessionId,t.env)}}}});import{existsSync as Lk,readFileSync as Mk}from"node:fs";import{join as Xl}from"node:path";function qf(t,e){let n=e.COPILOT_HOME??process.env.COPILOT_HOME??Xl(K,".copilot"),r=Xl(n,"session-state",t),s=Xl(r,"workspace.yaml");if(!Lk(s))throw new Error(`copilot bundle: no session "${t}" in the copilot session store (${r}) \u2014 the session must exist on disk before a bundle can resume it`);let i;try{i=Mk(s,"utf8").slice(0,4096)}catch(a){throw new Error(`copilot bundle: cannot read ${s} \u2014 cannot verify session "${t}": `+(a instanceof Error?a.message:String(a)))}let o=/^id:\s*(\S+)\s*$/m.exec(i);if(o===null||o[1]!==t)throw new Error(`copilot bundle: session store entry ${s} belongs to ${o?.[1]??"no recorded id"}, not "${t}"`)}var Yr,Gf=O(()=>{"use strict";oe();be();Yr={name:"copilot",binary:"copilot",baseArgs:["--acp","--yolo"],argv(t){return t.permissionMode==="plan"&&(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.
2029
2029
  `),U({event:"acp_plan_mode_unsupported",provider:"copilot",requested_mode:"plan",effective_mode:"yolo"})),t.model&&(process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${t.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
2030
- `),U({event:"acp_model_unsupported",provider:"copilot",model:t.model})),[...Kr.baseArgs]},yoloAssertion:"always-yolo",sessionIdentity:{verifyLoadedSession:t=>{Uf(t.requestedSessionId,t.env)},recheckSession:t=>{Uf(t.requestedSessionId,t.env)}}}});import{existsSync as Bl,readdirSync as Ik,statSync as Bf}from"node:fs";import{join as nn}from"node:path";import{createRequire as xk}from"node:module";function Wl(){return Hl===null&&(Hl=xk(import.meta.url)("node:sqlite").DatabaseSync),Hl}function Wf(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Xf(t,e){if(!e)return;t.observed=!0;let n=e.input??0,r=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=n,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=r,t.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function qf(t){return t.observed?{totalInputTokens:t.totalInputTokens,totalCachedInputTokens:t.totalCachedInputTokens,totalCacheWriteInputTokens:t.totalCacheWriteInputTokens,totalOutputTokens:t.totalOutputTokens,totalReasoningOutputTokens:t.totalReasoningOutputTokens,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}:{}}function Gf(){let t=process.env.XDG_DATA_HOME||nn(K,".local","share"),e=process.env.XDG_CONFIG_HOME||nn(K,".config");return[nn(t,"opencode","opencode.db"),nn(e,"opencode","opencode.db")]}function Ak(){return Xl(process.env,K)}function Xl(t,e){if(t.OPENCODE_DB)return[t.OPENCODE_DB];let n=t.XDG_DATA_HOME||nn(e,".local","share"),r=nn(n,"lmplayer"),s=nn(r,"opencode-local.db"),i=[s];try{let o=Ik(r).filter(a=>/^opencode.*\.db$/u.test(a)).map(a=>nn(r,a)).filter(a=>a!==s).sort((a,l)=>{try{return Bf(l).mtimeMs-Bf(a).mtimeMs}catch{return 0}});i.push(...o)}catch{}return i}function Ck(t){return t==="lmplayer"?Ak():Gf()}function ql(t,e){let n=e?.dbPath!==void 0?[e.dbPath]:Gf();for(let r of n){if(!Bl(r))continue;let s=new(Wl())(r,{open:!0,readOnly:!0});try{s.exec("PRAGMA busy_timeout = 5000");let i=s.prepare("SELECT directory FROM session WHERE id = ?").get(t);if(i!==void 0)return{directory:typeof i.directory=="string"?i.directory:""}}finally{s.close()}}return null}var Hl,Qn,Vr=O(()=>{"use strict";be();oe();Hl=null;Qn=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,this.busyTimeoutMs=e?.busyTimeoutMs??5e3,e?.dbPaths?this.dbPaths=[...e.dbPaths]:e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=Ck(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Bl(e))}openDb(e){if(!Bl(e))return null;let n=new(Wl())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let e=[];for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=new Map,i=r.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=r.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
2030
+ `),U({event:"acp_model_unsupported",provider:"copilot",model:t.model})),[...Yr.baseArgs]},yoloAssertion:"always-yolo",sessionIdentity:{verifyLoadedSession:t=>{qf(t.requestedSessionId,t.env)},recheckSession:t=>{qf(t.requestedSessionId,t.env)}}}});import{existsSync as Gl,readdirSync as Pk,statSync as Jf}from"node:fs";import{join as rn}from"node:path";import{createRequire as Dk}from"node:module";function Jl(){return ql===null&&(ql=Dk(import.meta.url)("node:sqlite").DatabaseSync),ql}function Kf(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Vf(t,e){if(!e)return;t.observed=!0;let n=e.input??0,r=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=n,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=r,t.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function zf(t){return t.observed?{totalInputTokens:t.totalInputTokens,totalCachedInputTokens:t.totalCachedInputTokens,totalCacheWriteInputTokens:t.totalCacheWriteInputTokens,totalOutputTokens:t.totalOutputTokens,totalReasoningOutputTokens:t.totalReasoningOutputTokens,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}:{}}function Yf(){let t=process.env.XDG_DATA_HOME||rn(K,".local","share"),e=process.env.XDG_CONFIG_HOME||rn(K,".config");return[rn(t,"opencode","opencode.db"),rn(e,"opencode","opencode.db")]}function Fk(){return Kl(process.env,K)}function Kl(t,e){if(t.OPENCODE_DB)return[t.OPENCODE_DB];let n=t.XDG_DATA_HOME||rn(e,".local","share"),r=rn(n,"lmplayer"),s=rn(r,"opencode-local.db"),i=[s];try{let o=Pk(r).filter(a=>/^opencode.*\.db$/u.test(a)).map(a=>rn(r,a)).filter(a=>a!==s).sort((a,l)=>{try{return Jf(l).mtimeMs-Jf(a).mtimeMs}catch{return 0}});i.push(...o)}catch{}return i}function $k(t){return t==="lmplayer"?Fk():Yf()}function Vl(t,e){let n=e?.dbPath!==void 0?[e.dbPath]:Yf();for(let r of n){if(!Gl(r))continue;let s=new(Jl())(r,{open:!0,readOnly:!0});try{s.exec("PRAGMA busy_timeout = 5000");let i=s.prepare("SELECT directory FROM session WHERE id = ?").get(t);if(i!==void 0)return{directory:typeof i.directory=="string"?i.directory:""}}finally{s.close()}}return null}var ql,tr,Qr=O(()=>{"use strict";be();oe();ql=null;tr=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,this.busyTimeoutMs=e?.busyTimeoutMs??5e3,e?.dbPaths?this.dbPaths=[...e.dbPaths]:e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=$k(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>Gl(e))}openDb(e){if(!Gl(e))return null;let n=new(Jl())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let e=[];for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=new Map,i=r.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=r.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
2031
2031
  s.time_created, s.time_updated
2032
2032
  FROM session s
2033
2033
  ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",d=r.prepare(`SELECT m.id, m.data, m.time_created FROM message m
2034
- WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,m,p,h,_=Wf(),y=[];for(let w of d){let g;try{g=JSON.parse(w.data)}catch{continue}h||(h=g.model?.modelID||g.modelID),(g.role==="user"||g.role==="assistant")&&u++,g.role==="user"&&y.push(w.id),g.role==="assistant"&&Xf(_,g.tokens)}let f=[...y.length>0?[y[0]]:[],...y.length>1?[y[y.length-1]]:[]];for(let w of f){let g=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(w),E=this.extractText(g);E&&(m||(m=q(E,80)),p=q(E,80))}e.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:h,startCommand:this.startCommand,firstUserMessage:m,lastUserMessage:p,messageCount:u,filePath:n,...qf(_)})}}catch(s){U({event:"opencode_discover_sessions_failed",provider:this.name,db_path:n,error_message:s instanceof Error?s.message:String(s)})}finally{r.close()}}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,e);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(e,n,r){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
2035
- FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=[],c=0,d,u,m,p=Wf();for(let h of o){let _;try{_=JSON.parse(h.data)}catch{continue}d||(d=_.model?.modelID||_.modelID);let y=_.model?.modelID||_.modelID,f=new Date(_.time?.created||h.time_created),w=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(h.id);if(_.role==="user"){let g=this.extractText(w),E=this.extractText(w,!0);E&&l.push(E),g&&(u||(u=q(g,80)),m=q(g,80)),a.push({role:"user",timestamp:f,content:g||"(empty)"}),c++}else if(_.role==="assistant"){Xf(p,_.tokens);for(let g of w){let E;try{E=JSON.parse(g.data)}catch{continue}E.type==="text"&&E.text?a.push({role:"assistant",timestamp:f,content:E.text,model:y}):E.type==="reasoning"&&E.text?a.push({role:"thinking",timestamp:f,content:E.text}):E.type==="tool"&&E.tool&&(a.push({role:"tool_use",timestamp:f,content:`${E.tool}`,toolName:E.tool,toolCallId:E.callID,toolInput:E.state?.input?JSON.stringify(E.state.input):void 0,toolInputData:Ze(E.state?.input)}),E.state&&(E.state.status==="completed"||E.state.status==="error"||E.state.output!==void 0||E.state.error!==void 0)&&a.push({role:"tool_result",timestamp:f,content:E.state.error??E.state.output??"",toolCallId:E.callID}))}c++}}return{provider:this.name,sessionId:n.id,slug:n.slug,cwd:i,createdAt:new Date(n.time_created),modifiedAt:new Date(n.time_updated),model:d,startCommand:this.startCommand,firstUserMessage:u,lastUserMessage:m,messageCount:c,filePath:r,...qf(p),messages:a,userPrompts:l}}extractText(e,n=!1){let r=[];for(let s of e){let i;try{i=JSON.parse(s.data)}catch{continue}n&&(i.synthetic===!0||i.ignored===!0)||i.type==="text"&&i.text&&r.push(i.text)}return r.join(`
2036
- `).trim()}async resolveSessionPath(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{if(this.findSessionRow(r,e))return n}catch{}finally{r.close()}}return null}async deleteSession(e){for(let n of this.existingDbPaths()){let r=new(Wl())(n,{open:!0});try{let s=this.findSessionRow(r,e);if(!s)continue;return r.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{r.close()}}return!1}findSessionRow(e,n){let r=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
2034
+ WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,m,p,h,_=Kf(),y=[];for(let w of d){let g;try{g=JSON.parse(w.data)}catch{continue}h||(h=g.model?.modelID||g.modelID),(g.role==="user"||g.role==="assistant")&&u++,g.role==="user"&&y.push(w.id),g.role==="assistant"&&Vf(_,g.tokens)}let f=[...y.length>0?[y[0]]:[],...y.length>1?[y[y.length-1]]:[]];for(let w of f){let g=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(w),E=this.extractText(g);E&&(m||(m=q(E,80)),p=q(E,80))}e.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:h,startCommand:this.startCommand,firstUserMessage:m,lastUserMessage:p,messageCount:u,filePath:n,...zf(_)})}}catch(s){U({event:"opencode_discover_sessions_failed",provider:this.name,db_path:n,error_message:s instanceof Error?s.message:String(s)})}finally{r.close()}}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,e);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(e,n,r){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
2035
+ FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=[],c=0,d,u,m,p=Kf();for(let h of o){let _;try{_=JSON.parse(h.data)}catch{continue}d||(d=_.model?.modelID||_.modelID);let y=_.model?.modelID||_.modelID,f=new Date(_.time?.created||h.time_created),w=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(h.id);if(_.role==="user"){let g=this.extractText(w),E=this.extractText(w,!0);E&&l.push(E),g&&(u||(u=q(g,80)),m=q(g,80)),a.push({role:"user",timestamp:f,content:g||"(empty)"}),c++}else if(_.role==="assistant"){Vf(p,_.tokens);for(let g of w){let E;try{E=JSON.parse(g.data)}catch{continue}E.type==="text"&&E.text?a.push({role:"assistant",timestamp:f,content:E.text,model:y}):E.type==="reasoning"&&E.text?a.push({role:"thinking",timestamp:f,content:E.text}):E.type==="tool"&&E.tool&&(a.push({role:"tool_use",timestamp:f,content:`${E.tool}`,toolName:E.tool,toolCallId:E.callID,toolInput:E.state?.input?JSON.stringify(E.state.input):void 0,toolInputData:et(E.state?.input)}),E.state&&(E.state.status==="completed"||E.state.status==="error"||E.state.output!==void 0||E.state.error!==void 0)&&a.push({role:"tool_result",timestamp:f,content:E.state.error??E.state.output??"",toolCallId:E.callID}))}c++}}return{provider:this.name,sessionId:n.id,slug:n.slug,cwd:i,createdAt:new Date(n.time_created),modifiedAt:new Date(n.time_updated),model:d,startCommand:this.startCommand,firstUserMessage:u,lastUserMessage:m,messageCount:c,filePath:r,...zf(p),messages:a,userPrompts:l}}extractText(e,n=!1){let r=[];for(let s of e){let i;try{i=JSON.parse(s.data)}catch{continue}n&&(i.synthetic===!0||i.ignored===!0)||i.type==="text"&&i.text&&r.push(i.text)}return r.join(`
2036
+ `).trim()}async resolveSessionPath(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{if(this.findSessionRow(r,e))return n}catch{}finally{r.close()}}return null}async deleteSession(e){for(let n of this.existingDbPaths()){let r=new(Jl())(n,{open:!0});try{let s=this.findSessionRow(r,e);if(!s)continue;return r.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{r.close()}}return!1}findSessionRow(e,n){let r=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
2037
2037
  s.time_created, s.time_updated
2038
2038
  FROM session s WHERE s.id = ?`).get(n);if(r)return r;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
2039
2039
  s.time_created, s.time_updated
2040
2040
  FROM session s
2041
2041
  WHERE s.id LIKE ?
2042
2042
  ORDER BY s.time_updated DESC
2043
- LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}}});function zr(t){return{id:t.id,onFailure:"non-fatal",applies:e=>t.value(e)!==void 0,run:async e=>{await e.sendRpc("session/set_config_option",{sessionId:e.sessionId,configId:t.configId,value:t.value(e)})},describeFailure:(e,n)=>{let r=t.value(e),s=n instanceof Error?n.message:String(n);return{event:"acp_config_option_failed",fields:{config_id:t.configId,value:r,error_message:s},stderrLine:`[acp] set_config_option(${t.configId}=${r}) failed: ${s}
2044
- `,warning:`${t.provider} ignored ${t.configId}=${r}: ${s}`,message:s}},successLog:e=>`acp: set_config_option(${t.configId}=${t.value(e)}) ok`}}var Gl=O(()=>{"use strict"});import{spawn as Nk}from"node:child_process";import{resolve as Jf}from"node:path";function Bi(t){let e;try{e=Nk(t.binaryPath??In.binary,[...In.baseArgs],{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:we(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=tn(e,{provider:"opencode"}),r=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(d,u=!0)=>{if(!i){if(i=!0,clearTimeout(c),e.removeListener("error",a),e.removeListener("exit",l),n.close(),!u){s(d);return}te(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{o({status:"unavailable",reason:"spawn",error:d.message},!1)},l=(d,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let d=await n.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=Ot(d);try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:t.model})}catch(m){o({status:"rejected",option:"model",value:t.model,error:m instanceof Error?m.message:String(m)});return}if(t.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:t.effort})}catch(m){o({status:"rejected",option:"effort",value:t.effort,error:m instanceof Error?m.message:String(m)});return}o({status:"verified"})}catch(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}var In,Jl=O(()=>{"use strict";oe();Ll();Vr();Gr();at();Rn();jl();Gl();In={name:"opencode",binary:"opencode",baseArgs:["acp"],argv:()=>[...In.baseArgs],preSpawn(t){try{Rf(t.cwd)}catch(e){U({event:"opencode_config_install_failed",cwd:t.cwd,error_message:e instanceof Error?e.message:String(e)})}},sessionSetup:[zr({id:"model",provider:"opencode",configId:"model",value:t=>t.model}),zr({id:"effort",provider:"opencode",configId:"effort",value:t=>t.effort})],probe:Bi,sessionIdentity:{verifyLoadedSession:t=>{let e=ql(t.requestedSessionId,{...t.env.OPENCODE_DB!==void 0?{dbPath:t.env.OPENCODE_DB}:{}});if(e===null)throw new Error(`opencode bundle: no session "${t.requestedSessionId}" in the opencode session store \u2014 the session must exist on disk before a bundle can resume it`);if(Jf(e.directory)!==Jf(t.cwd))throw new Error(`opencode bundle: session "${t.requestedSessionId}" belongs to ${e.directory}, not ${t.cwd} \u2014 refusing to resume another workspace's session`)},recheckSession:t=>{if(ql(t.requestedSessionId,{...t.env.OPENCODE_DB!==void 0?{dbPath:t.env.OPENCODE_DB}:{}})===null)throw new Error(`opencode bundle: session "${t.requestedSessionId}" disappeared from the session store mid-bundle`)}}}});import{existsSync as Ok}from"node:fs";import{readdir as Lk}from"node:fs/promises";import{join as Kl,resolve as Mk}from"node:path";function Vf(t){let e=Pk.exec(t);return e?e[0]:null}function Dk(t){if(!t.includes("notifications/initialized"))return t;let e=t.split(/\r?\n/),n=[];for(let r=0;r<e.length;r++){let s=e[r];if(s.includes("Error handling notification")&&s.includes("notifications/initialized")){let i=[s],o=r;for(;o+1<e.length&&i.length<8&&(o++,i.push(e[o]),e[o].trim()!=="}"););let a=i.join(`
2043
+ LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}}});function Zr(t){return{id:t.id,onFailure:"non-fatal",applies:e=>t.value(e)!==void 0,run:async e=>{await e.sendRpc("session/set_config_option",{sessionId:e.sessionId,configId:t.configId,value:t.value(e)})},describeFailure:(e,n)=>{let r=t.value(e),s=n instanceof Error?n.message:String(n);return{event:"acp_config_option_failed",fields:{config_id:t.configId,value:r,error_message:s},stderrLine:`[acp] set_config_option(${t.configId}=${r}) failed: ${s}
2044
+ `,warning:`${t.provider} ignored ${t.configId}=${r}: ${s}`,message:s}},successLog:e=>`acp: set_config_option(${t.configId}=${t.value(e)}) ok`}}var zl=O(()=>{"use strict"});import{spawn as jk}from"node:child_process";import{resolve as Qf}from"node:path";function qi(t){let e;try{e=jk(t.binaryPath??An.binary,[...An.baseArgs],{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:we(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=nn(e,{provider:"opencode"}),r=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(d,u=!0)=>{if(!i){if(i=!0,clearTimeout(c),e.removeListener("error",a),e.removeListener("exit",l),n.close(),!u){s(d);return}te(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{o({status:"unavailable",reason:"spawn",error:d.message},!1)},l=(d,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};e.once("error",a),e.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let d=await n.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),u=Lt(d);try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:t.model})}catch(m){o({status:"rejected",option:"model",value:t.model,error:m instanceof Error?m.message:String(m)});return}if(t.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:t.effort})}catch(m){o({status:"rejected",option:"effort",value:t.effort,error:m instanceof Error?m.message:String(m)});return}o({status:"verified"})}catch(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}var An,Yl=O(()=>{"use strict";oe();Fl();Qr();Vr();lt();xn();Wl();zl();An={name:"opencode",binary:"opencode",baseArgs:["acp"],argv:()=>[...An.baseArgs],preSpawn(t){try{Nf(t.cwd)}catch(e){U({event:"opencode_config_install_failed",cwd:t.cwd,error_message:e instanceof Error?e.message:String(e)})}},sessionSetup:[Zr({id:"model",provider:"opencode",configId:"model",value:t=>t.model}),Zr({id:"effort",provider:"opencode",configId:"effort",value:t=>t.effort})],probe:qi,sessionIdentity:{verifyLoadedSession:t=>{let e=Vl(t.requestedSessionId,{...t.env.OPENCODE_DB!==void 0?{dbPath:t.env.OPENCODE_DB}:{}});if(e===null)throw new Error(`opencode bundle: no session "${t.requestedSessionId}" in the opencode session store \u2014 the session must exist on disk before a bundle can resume it`);if(Qf(e.directory)!==Qf(t.cwd))throw new Error(`opencode bundle: session "${t.requestedSessionId}" belongs to ${e.directory}, not ${t.cwd} \u2014 refusing to resume another workspace's session`)},recheckSession:t=>{if(Vl(t.requestedSessionId,{...t.env.OPENCODE_DB!==void 0?{dbPath:t.env.OPENCODE_DB}:{}})===null)throw new Error(`opencode bundle: session "${t.requestedSessionId}" disappeared from the session store mid-bundle`)}}}});import{existsSync as Uk}from"node:fs";import{readdir as Hk}from"node:fs/promises";import{join as Ql,resolve as Bk}from"node:path";function eg(t){let e=Wk.exec(t);return e?e[0]:null}function Xk(t){if(!t.includes("notifications/initialized"))return t;let e=t.split(/\r?\n/),n=[];for(let r=0;r<e.length;r++){let s=e[r];if(s.includes("Error handling notification")&&s.includes("notifications/initialized")){let i=[s],o=r;for(;o+1<e.length&&i.length<8&&(o++,i.push(e[o]),e[o].trim()!=="}"););let a=i.join(`
2045
2045
  `);if(/\bcode:\s*-32601\b/.test(a)&&/Method not found[^]*notifications\/initialized/.test(a)){r=o;continue}}n.push(s)}return n.join(`
2046
- `)}async function Kf(t,e){let n=Mk(e.KIMI_CODE_HOME??process.env.KIMI_CODE_HOME??Kl(K,".kimi-code")),r=Kl(n,"sessions"),s;try{s=await Lk(r,{withFileTypes:!0})}catch{throw new Error(`kimi bundle: cannot read the kimi session store at ${r} \u2014 cannot verify session "${t}"`)}for(let i of s)if(i.isDirectory()&&Ok(Kl(r,i.name,t,"agents","main","wire.jsonl")))return;throw new Error(`kimi bundle: no session "${t}" in the kimi session store (${r}) \u2014 the session must exist on disk before a bundle can resume it`)}var Pk,Vl,Yr,zl=O(()=>{"use strict";oe();be();Gl();Pk=/runtime\s+\S+\s+does not exist in workspace\s+\S+/;Vl=t=>t.permissionMode==="plan"?"plan":"auto";Yr={name:"kimi",binary:"kimi",baseArgs:["acp"],argv:()=>[...Yr.baseArgs],sessionSetup:[{id:"permission-mode",onFailure:"fail-closed",applies:()=>!0,run:async t=>{await t.sendRpc("session/set_config_option",{sessionId:t.sessionId,configId:"mode",value:Vl(t)})},describeFailure:(t,e)=>{let n=Vl(t),r=e instanceof Error?e.message:String(e);return{event:"acp_permission_mode_failed",fields:{config_id:"mode",value:n,error_message:r},message:`Cannot set Kimi ACP permission mode to ${n}: ${r}`}},successLog:t=>`acp: set_config_option(mode=${Vl(t)}) ok`},zr({id:"model",provider:"kimi",configId:"model",value:t=>t.model})],onExitFinalization(t){let e=Vf(t.result);e!==null&&U({event:"kimi_runtime_dead",provider:"kimi",session_id:t.sessionId,matched_text:e})},filterExpectedStderr:Dk,sessionIdentity:{verifyLoadedSession:async t=>{await Kf(t.requestedSessionId,t.env)},recheckSession:async t=>{await Kf(t.requestedSessionId,t.env)}}}});var Qr,zf=O(()=>{"use strict";Qr={name:"hermes",binary:"hermes",baseArgs:["acp"],argv(t){if(t.permissionMode==="plan")throw new Error('provider "hermes" does not support --permission-mode plan');return[...Qr.baseArgs]},preSpawn(t){t.permissionMode==="yolo"&&(t.env.HERMES_YOLO_MODE="1")},modeVocabulary:{known:["default","accept_edits","dont_ask"],selectable:["accept_edits","dont_ask"]},sessionSetup:[{id:"session-mode",onFailure:"fail-closed",applies:t=>t.acpMode!==void 0,run:async t=>{await t.sendRpc("session/set_mode",{sessionId:t.sessionId,modeId:t.acpMode})},describeFailure:(t,e)=>{let n=e instanceof Error?e.message:String(e);return{event:"acp_session_mode_failed",fields:{mode_id:t.acpMode,error_message:n},message:`Cannot set hermes ACP session mode to ${String(t.acpMode)}: ${n}`}},successLog:t=>`acp: set_mode(modeId=${String(t.acpMode)}) ok`},{id:"model",onFailure:"fail-closed",applies:t=>{if(t.model===void 0)return!1;let e=t.response.result?.models?.currentModelId;return t.model!==e},run:async t=>{await t.sendRpc("session/set_model",{sessionId:t.sessionId,modelId:t.model})},describeFailure:(t,e)=>{let n=e instanceof Error?e.message:String(e);return{event:"acp_config_option_failed",fields:{config_id:"model",value:t.model,error_message:n},stderrLine:`[acp] set_model(modelId=${String(t.model)}) failed: ${n}
2047
- `,message:`Cannot set Hermes ACP model to ${String(t.model)}: ${n}`}},successLog:t=>`acp: set_model(modelId=${String(t.model)}) ok`}],sessionIdentity:{verifyLoadedSession:()=>{}}}});function Zr(t){return Fk[t]}var Fk,$k,Yf=O(()=>{"use strict";Lf();jf();Hf();Jl();zl();zf();Fk={miniplayer:Ui,gemini:Jr,copilot:Kr,opencode:In,kimi:Yr,hermes:Qr};$k={miniplayer:{binary:Ui.binary,args:Ui.baseArgs},gemini:{binary:Jr.binary,args:Jr.baseArgs},copilot:{binary:Kr.binary,args:Kr.baseArgs},opencode:{binary:In.binary,args:In.baseArgs},kimi:{binary:Yr.binary,args:Yr.baseArgs},hermes:{binary:Qr.binary,args:Qr.baseArgs}}});import{spawn as Qf}from"node:child_process";import{existsSync as jk}from"node:fs";function Zf(t,e){let n=Zr(t)?.modeVocabulary;if(!n)throw new de(`ACP mode "${e}" requested for provider "${t}", which declares no ACP mode vocabulary. Add the provider's mode ids to its AcpProviderProfile modeVocabulary before setting a mode.`);if(!n.known.includes(e))throw new de(`provider "${t}" has no ACP mode "${e}" (known: ${n.known.join(", ")}).`);if(!n.selectable.includes(e))throw new de(`provider "${t}" ACP mode "${e}" is not selectable by lmctl (selectable: ${n.selectable.join(", ")}).`)}function Uk(t){let e=t.stderr.trim(),n=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
2046
+ `)}async function Zf(t,e){let n=Bk(e.KIMI_CODE_HOME??process.env.KIMI_CODE_HOME??Ql(K,".kimi-code")),r=Ql(n,"sessions"),s;try{s=await Hk(r,{withFileTypes:!0})}catch{throw new Error(`kimi bundle: cannot read the kimi session store at ${r} \u2014 cannot verify session "${t}"`)}for(let i of s)if(i.isDirectory()&&Uk(Ql(r,i.name,t,"agents","main","wire.jsonl")))return;throw new Error(`kimi bundle: no session "${t}" in the kimi session store (${r}) \u2014 the session must exist on disk before a bundle can resume it`)}var Wk,Zl,es,ec=O(()=>{"use strict";oe();be();zl();Wk=/runtime\s+\S+\s+does not exist in workspace\s+\S+/;Zl=t=>t.permissionMode==="plan"?"plan":"auto";es={name:"kimi",binary:"kimi",baseArgs:["acp"],argv:()=>[...es.baseArgs],sessionSetup:[{id:"permission-mode",onFailure:"fail-closed",applies:()=>!0,run:async t=>{await t.sendRpc("session/set_config_option",{sessionId:t.sessionId,configId:"mode",value:Zl(t)})},describeFailure:(t,e)=>{let n=Zl(t),r=e instanceof Error?e.message:String(e);return{event:"acp_permission_mode_failed",fields:{config_id:"mode",value:n,error_message:r},message:`Cannot set Kimi ACP permission mode to ${n}: ${r}`}},successLog:t=>`acp: set_config_option(mode=${Zl(t)}) ok`},Zr({id:"model",provider:"kimi",configId:"model",value:t=>t.model})],onExitFinalization(t){let e=eg(t.result);e!==null&&U({event:"kimi_runtime_dead",provider:"kimi",session_id:t.sessionId,matched_text:e})},filterExpectedStderr:Xk,sessionIdentity:{verifyLoadedSession:async t=>{await Zf(t.requestedSessionId,t.env)},recheckSession:async t=>{await Zf(t.requestedSessionId,t.env)}}}});var ts,tg=O(()=>{"use strict";ts={name:"hermes",binary:"hermes",baseArgs:["acp"],argv(t){if(t.permissionMode==="plan")throw new Error('provider "hermes" does not support --permission-mode plan');return[...ts.baseArgs]},preSpawn(t){t.permissionMode==="yolo"&&(t.env.HERMES_YOLO_MODE="1")},modeVocabulary:{known:["default","accept_edits","dont_ask"],selectable:["accept_edits","dont_ask"]},sessionSetup:[{id:"session-mode",onFailure:"fail-closed",applies:t=>t.acpMode!==void 0,run:async t=>{await t.sendRpc("session/set_mode",{sessionId:t.sessionId,modeId:t.acpMode})},describeFailure:(t,e)=>{let n=e instanceof Error?e.message:String(e);return{event:"acp_session_mode_failed",fields:{mode_id:t.acpMode,error_message:n},message:`Cannot set hermes ACP session mode to ${String(t.acpMode)}: ${n}`}},successLog:t=>`acp: set_mode(modeId=${String(t.acpMode)}) ok`},{id:"model",onFailure:"fail-closed",applies:t=>{if(t.model===void 0)return!1;let e=t.response.result?.models?.currentModelId;return t.model!==e},run:async t=>{await t.sendRpc("session/set_model",{sessionId:t.sessionId,modelId:t.model})},describeFailure:(t,e)=>{let n=e instanceof Error?e.message:String(e);return{event:"acp_config_option_failed",fields:{config_id:"model",value:t.model,error_message:n},stderrLine:`[acp] set_model(modelId=${String(t.model)}) failed: ${n}
2047
+ `,message:`Cannot set Hermes ACP model to ${String(t.model)}: ${n}`}},successLog:t=>`acp: set_model(modelId=${String(t.model)}) ok`}],sessionIdentity:{verifyLoadedSession:()=>{}}}});function ns(t){return qk[t]}var qk,Gk,ng=O(()=>{"use strict";$f();Xf();Gf();Yl();ec();tg();qk={miniplayer:Wi,gemini:zr,copilot:Yr,opencode:An,kimi:es,hermes:ts};Gk={miniplayer:{binary:Wi.binary,args:Wi.baseArgs},gemini:{binary:zr.binary,args:zr.baseArgs},copilot:{binary:Yr.binary,args:Yr.baseArgs},opencode:{binary:An.binary,args:An.baseArgs},kimi:{binary:es.binary,args:es.baseArgs},hermes:{binary:ts.binary,args:ts.baseArgs}}});import{spawn as rg}from"node:child_process";import{existsSync as Jk}from"node:fs";function sg(t,e){let n=ns(t)?.modeVocabulary;if(!n)throw new de(`ACP mode "${e}" requested for provider "${t}", which declares no ACP mode vocabulary. Add the provider's mode ids to its AcpProviderProfile modeVocabulary before setting a mode.`);if(!n.known.includes(e))throw new de(`provider "${t}" has no ACP mode "${e}" (known: ${n.known.join(", ")}).`);if(!n.selectable.includes(e))throw new de(`provider "${t}" ACP mode "${e}" is not selectable by lmctl (selectable: ${n.selectable.join(", ")}).`)}function Kk(t){let e=t.stderr.trim(),n=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
2048
2048
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
2049
2049
  ${ge(e,{provider:t.tool,...t.fullOutput===void 0?{}:{fullOutput:t.fullOutput}})}
2050
2050
 
2051
- ${n}`:n}function Hk(t,e){return Zr(t)?.filterExpectedStderr?.(e)??e}function eg(t){if(t.method!=="session/update")return!1;let n=t.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}async function tg(t,e,n,r){for(let s of t.sessionSetup??[]){let i={...e,sessionId:n.sessionId,response:n.response,sendRpc:r};if(s.applies(i))try{await s.run(i),s.successLog&&Se(s.successLog(i))}catch(o){let a=s.describeFailure(i,o);if(U({event:a.event,provider:t.name,...a.fields}),a.stderrLine&&process.stderr.write(a.stderrLine),a.warning&&e.warnings.push(a.warning),s.onFailure==="fail-closed")throw new Error(a.message)}}}function ng(t,e,n){let r=we(e.env,e.cwd,e.sessionId);t.preSpawn?.({...n,cwd:e.cwd,env:r});let s=e.binaryPath||t.binary,i=t.argv(n),o=t.yoloAssertion==="always-yolo"?"yolo":n.permissionMode;if(Te(e.tool,i,o),e.cwd&&!jk(e.cwd))throw U({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),new de(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:s,spawnArgs:i,spawnEnv:r}}async function rg(t){let{sendRpc:e,sendNotification:n,opts:r,outputProcessor:s}=t,i=t.strictSessionIdentity===!0,o=await e("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}});n("notifications/initialized");let a=r.sessionId||"",l;if(r.sessionId){let c;try{if(o.result?.agentCapabilities?.loadSession===!1)throw new Error("provider advertises loadSession=false");c=await e("session/load",{sessionId:r.sessionId,cwd:r.cwd,mcpServers:[]})}catch(u){if(i||r.requireResume)throw new Error(`Cannot resume session ${r.sessionId} via ACP: ${u instanceof Error?u.message:String(u)}`);process.stderr.write(`[acp] session/load failed for ${r.sessionId}, creating new session
2052
- `),U({event:"acp_session_resume_fallback",provider:r.tool,session_id:r.sessionId,error_message:u instanceof Error?u.message:String(u)});let m=await e("session/new",{cwd:r.cwd,mcpServers:[]});return a=Ot(m),s.setSessionId(a),{sessionId:a,sessionResponse:m}}let d=Ot(c);if(r.requireResume&&d!==""&&d!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${d}"`);if(i){let u=Ot(c);if(u!==""&&u!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${u}"`);if(u===""){if(t.verifyLoadResponse===void 0)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received none`);await t.verifyLoadResponse(c)}a=r.sessionId}else a=Ot(c,r.sessionId);l=c,s.setSessionId(a)}else{let c=await e("session/new",{cwd:r.cwd,mcpServers:[]});a=Ot(c),l=c,s.setSessionId(a)}return{sessionId:a,sessionResponse:l}}function sg(t,e){let n=Zr(e.tool);if(!n)return Promise.reject(new Error(`No ACP config for tool "${e.tool}"`));if(e.acpMode!==void 0)try{Zf(e.tool,e.acpMode)}catch(r){return Promise.reject(r)}return new Promise((r,s)=>{let i=e.permissionMode??"yolo",o=[],a={permissionMode:i,...e.model!==void 0?{model:e.model}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.acpMode!==void 0?{acpMode:e.acpMode}:{},purpose:"chat",warnings:{push:N=>{o.push(N)}}},l,c,d;try{({binary:l,spawnArgs:c,spawnEnv:d}=ng(n,e,a))}catch(N){return s(N instanceof Error?N:new Error(String(N)))}let u=Qf(l,c,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:d}),m=Date.now(),p=!1,h=!1,_=0,y=!1,f=!1;if(e.signal){if(e.signal.aborted)return p=!0,U({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),te(u).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{p=!0,U({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-m}),te(u).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let w=e.sessionId||"",g=ji({tool:e.tool,onDelta:e.onDelta,...n.isolateResult?{isolateResult:n.isolateResult}:{}});g.setSessionId(w);let E=tn(u,{provider:e.tool,onEvent:N=>{_=Date.now(),eg(N)&&(f=!0),e.onEvent?.(N)},onNotification:N=>{_=Date.now(),g.processMessage(N)}}),{sendRpc:b,sendNotification:C}=E,I="";u.stderr?.on("data",N=>{I+=N.toString()}),u.on("error",N=>{E.close(N),U({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:N.message,elapsed_ms:Date.now()-m}),s(new de(`Failed to spawn ${n.binary} ${n.baseArgs.join(" ")}: ${N.message}`,{cause:N}))}),u.on("exit",N=>{if(h=!0,E.close(new de(`ACP process exited with code ${String(N)}`)),p)return;let A=g.finalize();if(A!==null)n.onExitFinalization?.({...a,sessionId:A.sessionId,result:A.result,stopReason:A.stopReason,exitCode:N}),r({result:A.result,sessionId:A.sessionId,durationMs:Date.now()-m,stopReason:A.stopReason,exitCode:N,sawActivity:A.sawActivity,...o.length>0?{warnings:o}:{}});else{let S=Hk(e.tool,I),v=Uk({tool:e.tool,exitCode:N,stderr:S,fullOutput:I});U({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:N,stderr_summary:v,elapsed_ms:Date.now()-m}),s(new Error(v))}}),(async()=>{try{let N=await rg({sendRpc:b,sendNotification:C,opts:e,outputProcessor:g});w=N.sessionId,e.onSessionId?.(w);let A=N.sessionResponse;await tg(n,a,{sessionId:w,response:A},b),g.beginTurn(),y=!0,Se(`acp: prompt sent (${t.length} chars)`);let S;if(await b("session/prompt",{sessionId:w,prompt:[{type:"text",text:t}]},v=>{v.error?g.cancelTurn():S=g.completeTurn(v)}),!S)throw new Error("ACP prompt completed without a result boundary");y=!1,Se(`acp: result received (${S.result.length} chars, stopReason=${S.stopReason})`),_t(e.holdOpen,{isAborted:()=>p,hasChildExited:()=>h,isTurnInFlight:()=>y,lastEventAtMs:()=>_,closeStdin:()=>{u.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>f})}catch(N){te(u).catch(()=>{}),s(N instanceof Error?N:new Error(String(N)))}})()})}async function ig(t){let e=Zr(t.tool);if(!e)throw new Error(`No ACP config for tool "${t.tool}"`);t.acpMode!==void 0&&Zf(t.tool,t.acpMode);let n=t.permissionMode??"yolo",r=[],s=!0,i={permissionMode:n,...t.model!==void 0?{model:t.model}:{},...t.effort!==void 0?{effort:t.effort}:{},...t.acpMode!==void 0?{acpMode:t.acpMode}:{},purpose:"chat",warnings:{push:A=>{r.push(A)}}},{binary:o,spawnArgs:a,spawnEnv:l}=ng(e,t,i),c=Qf(o,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:l}),d=Date.now(),u={exited:!1,exitCode:null,lastEventAtMs:0,turnInFlight:!1,backgroundJobLaunched:!1,completedTurns:0,closed:!1,closing:null,telemetryFired:!1},m,p=t.sessionId||"",h=null,_="";c.stderr?.on("data",A=>{_+=A.toString()});let y,f,w=ji({tool:t.tool,onDelta:A=>y?.(A),...e.isolateResult?{isolateResult:e.isolateResult}:{}});w.setSessionId(p);let g=tn(c,{provider:t.tool,onEvent:A=>{u.lastEventAtMs=Date.now(),eg(A)&&(u.backgroundJobLaunched=!0),f?.(A)},onNotification:A=>{u.lastEventAtMs=Date.now(),w.processMessage(A)}}),E=()=>new Error(`ACP bundle process (${t.tool}) exited${u.exitCode!==null?` with code ${u.exitCode}`:""} after ${u.completedTurns} completed prompt(s); the bundle cannot continue`),b=[],C=()=>u.exited?Promise.resolve():new Promise(A=>{b.push(A)}),I=null;c.on("error",A=>{h=new de(`Failed to spawn ${e.binary} ${e.baseArgs.join(" ")}: ${A.message}`,{cause:A}),U({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:A.message,elapsed_ms:Date.now()-d}),g.close(A)}),c.on("exit",A=>{if(u.exited=!0,u.exitCode=A,g.close(new de(`ACP process exited with code ${String(A)}`)),!u.telemetryFired){u.telemetryFired=!0;let S=w.finalize();S!==null&&e.onExitFinalization?.({...i,sessionId:S.sessionId,result:S.result,stopReason:S.stopReason,exitCode:A})}if(I!==null){let S=I;I=null,S(E())}for(let S of b.splice(0))S()});try{let A=await rg({sendRpc:g.sendRpc,sendNotification:g.sendNotification,opts:t,outputProcessor:w,strictSessionIdentity:!0,verifyLoadResponse:e.sessionIdentity===void 0?void 0:async S=>e.sessionIdentity.verifyLoadedSession({...i,requestedSessionId:t.sessionId,loadResponse:S,cwd:t.cwd,env:l})});p=A.sessionId,t.onSessionId?.(p),await tg(e,i,{sessionId:A.sessionId,response:A.sessionResponse},g.sendRpc)}catch(A){let S=h??(A instanceof Error?A:new Error(String(A)));throw te(c).catch(()=>{}),S}let N=A=>new Promise(S=>{setTimeout(S,A).unref?.()});return{tool:t.tool,get sessionId(){return p},get completedTurns(){return u.completedTurns},async sendTurn(A,S={}){if(m&&await m,u.closed||u.closing!==null)throw new Error(`ACP bundle session (${t.tool}) is closed`);if(u.exited)throw E();if(u.turnInFlight)throw new Error(`ACP bundle session (${t.tool}) has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending`);if(S.signal?.aborted)throw new Error("Aborted");if(e.sessionIdentity?.recheckSession!==void 0){if(await e.sessionIdentity.recheckSession({requestedSessionId:p,cwd:t.cwd,env:l}),u.exited)throw E();if(S.signal?.aborted)throw new Error("Aborted")}u.turnInFlight=!0,y=S.onDelta,f=S.onEvent;let v=Date.now();try{w.beginTurn(),Se(`acp: bundle prompt sent (${A.length} chars)`);let T,R=!1;if(await new Promise((k,L)=>{I=L;let F,D=()=>{R=!0,m=Promise.resolve().then(()=>F).catch(()=>{}),w.cancelTurn(),g.sendNotification("session/cancel",{sessionId:p}),L(new Error("Aborted"))},V=S.signal;V?.addEventListener("abort",D,{once:!0}),F=g.sendRpc("session/prompt",{sessionId:p,prompt:[{type:"text",text:A}]},B=>{R||(B.error?w.cancelTurn():T=w.completeTurn(B),y=void 0,f=void 0)}),F.then(B=>{V?.removeEventListener("abort",D),k(B)},B=>{V?.removeEventListener("abort",D),L(B instanceof Error?B:new Error(String(B)))})}),I=null,!T)throw new Error("ACP prompt completed without a result boundary");u.turnInFlight=!1,u.completedTurns+=1,Se(`acp: bundle result received (${T.result.length} chars, stopReason=${T.stopReason})`);let x=s&&r.length>0?[...r]:void 0;return s=!1,{result:T.result,sessionId:T.sessionId,stopReason:T.stopReason,durationMs:Date.now()-v,sawActivity:T.sawActivity,...x!==void 0?{warnings:x}:{}}}catch(T){throw I=null,w.cancelTurn(),u.turnInFlight=!1,u.exited?E():T}finally{y=void 0,f=void 0}},close(){return u.closing!==null||(u.closing=(async()=>{if(u.closed=!0,u.exited||(t.holdOpen!==void 0?await new Promise(S=>{_t(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>u.exited,isTurnInFlight:()=>u.turnInFlight,lastEventAtMs:()=>u.lastEventAtMs,closeStdin:()=>{c.stdin?.end(),S()},label:t.tool,wasBackgroundJobLaunched:()=>u.backgroundJobLaunched})}):c.stdin?.end(),u.exited))return;let A=t.closeTimeoutMs??2e3;await Promise.race([C(),N(A)]),u.exited||await te(c,{stdinEnd:!1,softDelayMs:Math.min(1e3,A),killDelayMs:Math.min(1e3,A)}).catch(()=>{})})()),u.closing}}}var Yl=O(()=>{"use strict";oe();kn();Rn();qr();yt();oe();at();ot();Gr();jl();Yf();zl();Jl();Gr()});function Wi(t,e,n){return At(t)&&e.tools[t]?.agent===void 0&&n.includes(t)}async function Lt(t,e,n,r,s){if(t.provider!==e)throw new Error(`bundle session provider mismatch: session serves "${t.provider}", turn targets "${e}"`);if(t.sessionId!==n)throw new Zn(`session identity mismatch: expected "${n}", got "${t.sessionId}"`);let i=await t.sendTurn(r,s);if(i.sessionId!==n)throw new Zn(`session identity mismatch: expected "${n}", got "${i.sessionId}"`);return{...i,...i.text===""&&i.sawActivity===!1?{status:"empty"}:{}}}async function Xi(t,e){vi(t.name);let n=e.requireResume??!0;if(n&&!e.sessionId.trim())throw new Error("conversation requires an existing session ID");let r=e.userConfig?.tools[t.name]?.agent!==void 0,s=e.execution!=="per-turn"&&t.openSession!==void 0&&!r;if(e.execution==="persistent"&&!s)throw new Error(`provider "${t.name}" does not support persistent sessions with this configuration`);let i=s?await t.openSession(e):void 0,o=!n&&e.sessionId==="";if(i&&(i.provider!==t.name||typeof i.sessionId!="string"||!i.sessionId.trim()||!o&&i.sessionId!==e.sessionId))throw await i.close(),new Error(`session identity mismatch opening ${t.name}: expected "${e.sessionId}", got "${i.sessionId}" (${i.provider})`);let a=i?.sessionId??e.sessionId,l=0,c=!1,d,u;return{provider:t.name,sessionId:a,execution:s?"persistent":"per-turn",transport:r?"custom":t.protocol?.transport??"unknown",cancellation:r?"unknown":s?t.protocol?.persistentCancellation??"unknown":t.protocol?.perTurnCancellation??"unknown",get completedTurns(){return l},async sendTurn(m,p={}){if(c)throw new Error("conversation is closed");if(d)throw new Error("conversation already has an active turn");if(p.signal?.aborted)throw new Error("Aborted");let h=new AbortController;d=h;let _=()=>h.abort();p.signal?.addEventListener("abort",_,{once:!0});try{let y=i?await Lt(i,t.name,a,m,{...p,signal:h.signal}):await t.sendTurn(m,{...e,...p,signal:h.signal,requireResume:n,timeoutMs:e.timeoutMs??0});if(h.signal.aborted)throw new Error("Aborted");if(n&&y.sessionId!==e.sessionId)throw c=!0,new Zn(`session identity mismatch: expected "${e.sessionId}", got "${y.sessionId}"`);return y.status!=="empty"&&y.status!=="stalled"&&l++,y}catch(y){throw h.signal.aborted&&i&&t.protocol?.persistentCancellation==="session"&&(c=!0),y instanceof Zn&&(c=!0,await i?.close()),y}finally{p.signal?.removeEventListener("abort",_),d=void 0}},close(){return u||(c=!0,d?.abort(),u=i?i.close():Promise.resolve()),u}}}var Zn,er=O(()=>{"use strict";qn();Zn=class extends Error{}});import{realpathSync as Bk}from"node:fs";import{resolve as Wk}from"node:path";function Ql(t){let e=Wk(t);try{return Bk(e)}catch{return e}}var og=O(()=>{"use strict"});import{platform as ag}from"node:os";function Mt(t){let e=new es;for(let n of t)e.registerAdapter(n);return e}var es,Zl=O(()=>{"use strict";og();es=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(e?.workspace){let o=Ql(e.workspace);i=i.filter(a=>Ql(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=ag()==="darwin"||ag()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{readFileSync as Xk,writeFileSync as xF,mkdirSync as AF}from"node:fs";import{join as qk,dirname as NF}from"node:path";import{homedir as Gk}from"node:os";function Kk(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function Vk(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=Kk(t.slice(e+1).trim());return n?{key:n,value:r}:null}function zk(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function qi(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function Yk(){return qk(Gk(),".lmctl","config.toml")}function cg(t){let e=t??Yk(),n;try{n=Xk(e,"utf-8")}catch{return{tools:{}}}return Qk(n)}function lg(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function Qk(t){let e={},n={},r=t.split(`
2053
- `),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let u=e[s.tool]??{};if(s.profile){let m=u.profiles?.[s.profile]??{};i.description&&(m.description=i.description),i.flags!==void 0&&(m.flags=i.flags),u.profiles||(u.profiles={}),u.profiles[s.profile]=m}else i.start&&(u.start=i.start),i.resume&&(u.resume=i.resume),i.agent&&(u.agent=i.agent),i.profile_flag!==void 0&&(u.profile_flag=i.profile_flag);e[s.tool]=u}else if(s.kind==="compact"){let u=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let m=lg(i.min);m!==null&&(u.min=m)}if(i.max!==void 0){let m=lg(i.max);m!==null&&(u.max=m)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=u):n.global=u}i={}}for(let u of r){let m=u.trim();if(!m||m.startsWith("#"))continue;let p=zk(m);if(p!==null){if(o=!0,l(),p.startsWith("tool.")){let _=".profile.",y=p.indexOf(_);y!==-1?s={kind:"tool",tool:p.slice(5,y),profile:p.slice(y+_.length)}:s={kind:"tool",tool:p.slice(5),profile:null}}else p==="compact"?s={kind:"compact",provider:null}:p.startsWith("compact.")?s={kind:"compact",provider:p.slice(8)}:s={kind:"none"};continue}let h=Vk(m);h&&s.kind!=="none"?i[h.key]=h.value:h&&!o&&(a[h.key]=h.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let d=a.site_name;return d!==void 0&&d.length>0&&(c.site_name=d),c}function Zk(t,e,n){if(!n)return"";let r=t.tools[e]??ec[e],s=r?.profiles?.[n]?.flags??ec[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function dg(t,e){return!!t.tools[e]}function ug(t,e,n,r,s){let i=t.tools[e]??ec[e],o;if(i?.agent){let l=qi(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=Jk[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let d=c.map(qi).join(" ");o=`printf '%s\\n' ${qi(r)} | ${d}`}else o=c.map(qi).join(" ")}let a=Zk(t,e,s);return a&&(o+=" "+a),o}var ec,Jk,tc=O(()=>{"use strict";ec={muse:{start:"muse",resume:"muse resume {{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}},hermes:{start:"hermes",resume:"hermes --yolo --resume {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}}},Jk={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]},hermes:{mode:"argv",argv:["hermes","--yolo","-z","{{prompt}}","--resume","{{session_id}}"]}}});function mg(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var pg=O(()=>{"use strict"});var eR,Y,Gi,xe=O(()=>{"use strict";eR="ACK: waiting for explicit lmctl task.",Y=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, or edit. Reply exactly: ${eR}`,Gi=`send this exact lmctl seed instruction: "${Y}"`});import{spawn as fg}from"node:child_process";import{mkdirSync as tR}from"node:fs";var tr,ne,Ae=O(()=>{"use strict";tc();pg();xe();at();Oi();ot();tr=class t extends Error{cancelReason;constructor(e,n){super(e),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,t.prototype)}},ne=class t{name;capabilities;injection;protocol;provider;binary;seedArgs;seedTimeoutMs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.protocol=e.protocol,this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedTimeoutMs=e.seedTimeoutMs??6e4,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let n=e?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===Y?n:r)}turnOptsFor(e){return e}get seedBinary(){return this.binary}seed(e,n){return tR(e,{recursive:!0}),new Promise(r=>{let s;try{s=fg(this.binary,this.seedArgsFor(n),{cwd:e,env:Yn(n?.env,e),signal:n?.signal,stdio:["pipe","pipe","pipe"],timeout:this.seedTimeoutMs})}catch(l){return r({success:!1,error:l instanceof Error?l.message:String(l)})}let i="",o="";s.stdout?.on("data",l=>{i+=l.toString()}),s.stderr?.on("data",l=>{o+=l.toString()});let a=n?.prompt!==void 0&&this.seedStdin!==void 0?`${n.prompt}
2054
- `:this.seedStdin;a&&s.stdin?.write(a),s.stdin?.end(),s.on("exit",(l,c)=>{if(l===0&&!c)r({success:!0});else{let d=Sn(o).trim(),u=Sn(i).trim(),m=d||u;r({success:!1,error:m?ge(m,{provider:this.name}):c?`terminated by ${c}`:`exit code ${l}`})}}),s.on("error",l=>{r({success:!1,error:l.message,errorCode:l.code})})})}resumeCommand(e,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:Gi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,n){let r=this.turnOptsFor(n);if(r.userConfig&&dg(r.userConfig,this.name)){let i=r.userConfig.tools[this.name];if(i?.agent)return this.runOneShotAgent(e,r,i.agent)}let s=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return s<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(s,e,r)}withTimeouts(e,n,r){let s=new AbortController,i,o,a="",l=r.sessionId,c,d=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(e),u(),s.abort(),c&&c({text:a,sessionId:l,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),d();let m={...r,binary:this.binary,signal:s.signal,onSessionId:_=>{_&&(l=_),r.onSessionId?.(_)},onDelta:_=>{a+=_,d(),r.onDelta?.(_)},onProgress:_=>{_.kind!=="api_retry"&&d(),r.onProgress?.(_)}},p=this.transportFn(n,m).then(_=>(u(),{..._,status:_.status??"ok"})).catch(_=>{throw u(),o==="external"?new tr("Turn cancelled","external"):_}),h=new Promise(_=>{c=_});return Promise.race([p,h])}runOneShotAgent(e,n,r){let s=ug(n.userConfig,this.name,n.sessionId,e,n.profile),i=Date.now();return new Promise((o,a)=>{let l=n.timeoutMs!==void 0&&n.timeoutMs<=0?0:mg(n.env),c=fg(s,{shell:!0,cwd:n.cwd,env:we(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,m=l>0?setTimeout(()=>{u=!0,c.kill()},l):void 0,p="",h="";if(c.stdout?.on("data",_=>{let y=_.toString();p+=y,n.onDelta?.(y)}),c.stderr?.on("data",_=>{h+=_.toString()}),n.signal){if(n.signal.aborted)return clearTimeout(m),c.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(m);let y=Date.now()-i;if(u)a(new Error(`Agent command timed out after ${l}ms`));else if(_===0||_===null)o({text:p.trim(),sessionId:n.sessionId,durationMs:y});else{let f=h.trim();a(new Error(f?ge(f,{provider:this.name}):`Agent command exited with code ${_}`))}}),c.on("error",_=>{d||(d=!0,clearTimeout(m),a(_))})})}}});function Ji(t,e=!0){let n={input_uncached:null,input_cached:null,input_cache_write:null,output:null};if(!e||!t.length||new Set(t.map(r=>r.response_id)).size!==t.length)return n;for(let r of Object.keys(n)){let s=t.map(o=>o.tokens[r]);if(s.some(o=>o===null||!Number.isSafeInteger(o)||o<0))continue;let i=s.reduce((o,a)=>o+a,0);Number.isSafeInteger(i)&&(n[r]=i)}return n}var nc=O(()=>{"use strict"});import{readdir as nR}from"node:fs/promises";import{join as ts,resolve as rR}from"node:path";function rc(t){return rR(t||process.env.XDG_DATA_HOME||ts(K,".local","share"))}function sR(t,e,n,r){let s=r?.input_uncached_tokens,i=r?.cache_read_tokens??r?.input_cache_read_tokens,o=r?.cache_write_tokens??r?.input_cache_write_tokens;return{response_id:t,timestamp:e.toISOString(),model:typeof n=="string"&&n.length>0?n:null,tokens:{input_uncached:typeof s=="number"?s:null,input_cached:typeof i=="number"?i:null,input_cache_write:typeof o=="number"?o:null,output:typeof r?.output_tokens=="number"?r.output_tokens:null},files_read:null,files_written:null}}function iR(t,e){let n,r,s,i,o,a=[],l=new Map,c=new Map,d=new Set,u,m,p=()=>{m="partial"},h=f=>{if(typeof f!="string"||f.length===0){p();return}let w=l.get(f);return w||(w={id:f,turn:{id:f,status:"unknown"},responseIds:[]},l.set(f,w)),w},_=f=>{if(f.retained_frame&&Array.isArray(f.children)){for(let I of f.children)try{if(typeof I?.record_json!="string")throw new Error("missing record_json");_(JSON.parse(I.record_json))}catch{p()}return}if(f.stream?.kind!=="session"||f.stream?.id!==t)return;if(f.schema_version!==1){p();return}if(f.payload_type?.startsWith("runtime.session")&&f.payload_schema_version!==1){p();return}let w=f.payload?.source_run_record_id;for(let I of[f.id,w])if(!(typeof I!="string"||I.length===0)&&d.has(I))return;for(let I of[f.id,w])typeof I=="string"&&I.length>0&&d.add(I);let g=typeof f.recorded_at=="number"&&Number.isFinite(f.recorded_at)?new Date(f.recorded_at/1e3):void 0;if(f.recorded_at!==void 0&&(!g||!Number.isFinite(g.getTime()))){p();return}g&&Number.isFinite(g.getTime())&&((!s||g<s)&&(s=g),(!i||g>i)&&(i=g));let E=f.payload;if(f.payload_type==="runtime.session.metadata"&&(typeof E?.record?.workspace_root=="string"&&(n=E.record.workspace_root),typeof E?.record?.model_id=="string"&&(r=E.record.model_id)),f.payload_type!=="runtime.session"||E?.kind!=="run")return;let b=E.event,C=h(E.run_id);if(!b||!g||!C){b||p();return}if(b.kind==="started"&&typeof b.prompt=="string")a.push({role:"user",content:b.prompt,timestamp:g}),C.turn.startedAt=g,C.turn.prompt=b.prompt,C.turn.status="in_progress",o="in_progress";else if(b.kind==="assistant_message_committed"&&typeof b.text=="string")a.push({role:"assistant",content:b.text,timestamp:g});else if(b.kind==="terminal")C.turn.completedAt=g,C.turn.status=b.terminal==="completed"?"complete":"aborted",o=C.turn.status;else if(b.kind==="model_completed"){typeof b.model=="string"&&b.model.length>0&&(r=b.model,C.turn.model=b.model);let I=typeof w=="string"&&w.length>0?w:typeof f.id=="string"&&f.id.length>0?f.id:void 0;if(!I)p();else{C.responseIds.push(I);let x={};if(b.usage&&typeof b.usage=="object")for(let k of["input_tokens","output_tokens","cached_tokens","reasoning_tokens","input_uncached_tokens","cache_read_tokens","input_cache_read_tokens","cache_write_tokens","input_cache_write_tokens"]){let L=b.usage[k];typeof L=="number"&&Number.isSafeInteger(L)&&L>=0&&(x[k]=L)}Object.keys(x).length>0&&(C.turn.rawUsage=[...C.turn.rawUsage??[],{responseId:I,values:x}]),c.set(I,sR(I,g,b.model,x))}if(!b.usage)return;let N={},A=b.usage.input_uncached_tokens,S=b.usage.cache_read_tokens??b.usage.input_cache_read_tokens,v=b.usage.cache_write_tokens??b.usage.input_cache_write_tokens,T=b.usage.output_tokens,R=b.usage.reasoning_tokens;typeof A=="number"&&Number.isSafeInteger(A)&&A>=0&&(N.inputTokens=A),typeof S=="number"&&Number.isSafeInteger(S)&&S>=0&&(N.cachedInputTokens=S),typeof v=="number"&&Number.isSafeInteger(v)&&v>=0&&(N.cacheWriteInputTokens=v),typeof T=="number"&&Number.isSafeInteger(T)&&T>=0&&(N.outputTokens=T),typeof R=="number"&&Number.isSafeInteger(R)&&R>=0&&(N.reasoningOutputTokens=R),u=N}};return{visit:_,finish:()=>{if(!n||!s||!i)return null;let f=a.filter(b=>b.role==="user").map(b=>b.content),w=[...l.values()].map(b=>({...b.turn,...b.responseIds.length>0?{responseIds:[...b.responseIds]}:{}})),g=[...c.values()],E=Ji(g,m!=="partial");return{provider:"muse",sessionId:t,filePath:e,cwd:n,createdAt:s,modifiedAt:i,model:r,messages:a,messageCount:a.length,firstUserMessage:f[0],lastUserMessage:f.at(-1),userPrompts:f,turnStatus:o,totalInputTokens:E.input_uncached??void 0,totalCachedInputTokens:E.input_cached??void 0,totalCacheWriteInputTokens:E.input_cache_write??void 0,totalOutputTokens:E.output??void 0,lastTokenUsage:u,turns:w,responses:g,...m?{captureStatus:m}:{}}},markPartial:p}}async function hg(t,e){let n=iR(t,e);for await(let r of me(e,n.markPartial))n.visit(r);return n.finish()}var gg,Ki,_g=O(()=>{"use strict";nc();be();gg=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Ki=class{name="muse";dataHome;constructor(e={}){this.dataHome=rc(e.museDataHome)}get root(){return ts(this.dataHome,"muse","sessions")}getWatchPaths(){return[{directory:this.root,filePattern:/session\.jsonl$/}]}async files(e=this.root,n=0){let r;try{r=await nR(e,{withFileTypes:!0})}catch{return[]}let s=[];for(let i of r)i.isFile()&&i.name==="session.jsonl"?s.push(ts(e,i.name)):i.isDirectory()&&n<4&&s.push(...await this.files(ts(e,i.name),n+1));return s}async resolveSessionPath(e){return gg.test(e)?(await this.files()).find(n=>n.endsWith(ts(e,"session.jsonl")))??null:null}async loadSession(e){let n=await this.resolveSessionPath(e);return n?hg(e,n):null}async discoverSessions(){let e=[];for(let n of await this.files())try{let r=n.split(/[\\/]/).at(-2);if(!gg.test(r))continue;let s=await hg(r,n);s&&e.push(s)}catch{}return e}async deleteSession(){return!1}}});import{spawn as oR}from"node:child_process";import{randomBytes as aR}from"node:crypto";import{realpath as Vi}from"node:fs/promises";function ns(){let t=aR(16);t.writeUIntBE(Date.now(),0,6),t[6]=t[6]&15|112,t[8]=t[8]&63|128;let e=t.toString("hex");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`}async function zi(t){if(t.signal?.aborted)throw new Error("Aborted");if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t.sessionId))throw new Error("Muse requires a native session UUID");let e=t.permissionMode==="plan",n=["serve",...e?["--disable-write","--disable-shell"]:["--disable-sandbox","--trust-workspace"],...t.model?["--model",t.model]:[]];Te("muse",n,t.permissionMode??"yolo");let r=oR(t.progPath??"muse",n,{cwd:t.cwd,env:we(t.env,t.cwd,t.sessionId),stdio:["pipe","pipe","pipe"]}),s,i,o,a=!1,l=!1,c=!1,d=!1,u=0,m=hf(),p=Date.now(),h=t.sessionId;r.stderr.setEncoding("utf8"),r.stderr.on("data",S=>{m.append(S)});let _=(S,v,T)=>{s===S&&(s=void 0,S.cleanup(),S.drained(),S.settled||(S.settled=!0,v?S.reject(v):(u++,S.resolve(T))))},y=S=>{i||(i=S,s&&_(s,i),w.close(i),!d&&!a&&te(r,{softDelayMs:t.closeTimeoutMs??2e3,killDelayMs:t.closeTimeoutMs??2e3}).catch(()=>{}))},f=(S,v)=>{let T=v.params;if(!T||T.sessionId!==h)return;let R=v.method;if(R==="view/gap"||R==="session/closed"){y(new Error(`Muse ${R}: the conversation cannot continue without reopening`));return}if(R==="turn/unqueued"&&T.turnId===S.id){_(S,new tr("Muse queued turn cancelled","external"));return}R==="turn/started"&&T.turnId===S.id&&(S.queued=!1);let x=T.item,k=T.turnId??x?.turnId;if(k&&k!==S.id)return;S.opts.onEvent?.(v);let L={kind:"other",raw:v};if(["item/started","item/updated","item/completed"].includes(R)&&x?.turnId===S.id&&typeof x.itemId=="string"){let D=S.items.get(x.itemId);if(D&&typeof x.revision=="number"&&x.revision<=D.revision)return;S.items.set(x.itemId,{...x}),(x.kind==="toolCall"||x.kind==="userShell")&&R!=="item/updated"?L={kind:R==="item/completed"?"tool_result":"tool_use",id:x.itemId,tool:x.tool??x.kind,summary:x.failureReason??x.fallbackText,...R==="item/completed"?{status:x.status==="completed"?"ok":"error"}:{},...x.durationMs!==void 0?{elapsedMs:x.durationMs}:{},raw:v}:x.kind==="reasoning"?L={kind:"thinking",raw:v}:x.kind==="agentMessage"&&(L={kind:"text",raw:v})}else if(R==="item/delta"&&typeof T.itemId=="string"&&typeof T.delta=="string"){let D=S.items.get(T.itemId);if(!D)return;D.kind==="agentMessage"&&(T.field===void 0||T.field==="text")?(D.text=(D.text??"")+T.delta,S.cancelled||S.opts.onDelta?.(T.delta),L={kind:"text",raw:v}):D.kind==="reasoning"&&(L={kind:"thinking",raw:v})}if(S.cancelled||S.opts.onProgress?.(L),R!=="turn/completed"||T.turnId!==S.id)return;if(!["completed","failed","cancelled"].includes(T.terminal)){y(new Error(`Muse returned an unknown turn terminal: ${String(T.terminal)}`));return}if(S.cancelled||T.terminal==="cancelled"){_(S,new tr("Muse turn cancelled",S.cancelled?"external":"provider"));return}if(T.terminal!=="completed"){_(S,new Error(T.error?.message??T.reason??`Muse turn ended with ${String(T.terminal)}`));return}let F=[...S.items.values()].filter(D=>D.kind==="agentMessage");_(S,void 0,{text:F.map(D=>typeof D.text=="string"?D.text:"").join(`
2055
- `),sessionId:h,durationMs:typeof T.durationMs=="number"?T.durationMs:Date.now()-S.started,stopReason:T.terminal,...F.some(D=>D.truncated)?{warnings:["Muse reported a truncated response; inspect the native transcript for complete content"]}:{}})},w=tn(r,{provider:"muse",protocol:"msp",onProtocolError:y,onNotification:S=>{if(p=Date.now(),S.method==="view/gap"||S.method==="session/closed"){S.params?.sessionId===h&&!a&&y(new Error(`Muse ${S.method}: session must be reopened`));return}let v=s;v&&(v.id?f(v,S):v.events.push(S))}}),g=async(S,v,T=ns())=>(await w.sendRpc(S,{...v,commandId:T})).result,E=S=>{!S.id||S.interruptSent||s!==S||(S.interruptSent=!0,g("turn/interrupt",{sessionId:h,turnId:S.id}).catch(v=>{s===S&&y(v instanceof Error?v:new Error(String(v)))}))},b=S=>{!S.id||S.unqueueSent||s!==S||(S.unqueueSent=!0,g("turn/unqueue",{sessionId:h,turnId:S.id}).catch(v=>{let T=v instanceof Error?v.message:String(v);/already started|not queued|launch boundary|turn is running/i.test(T)?(S.queued=!1,E(S)):s===S&&y(v instanceof Error?v:new Error(T))}))},C=S=>{S.queued?b(S):E(S)};r.on("error",S=>y(new Error(`Unable to start Muse: ${S.message}`)));let I=()=>{a||d||i||c||(c=!0,te(r,{softDelayMs:t.closeTimeoutMs??2e3,killDelayMs:t.closeTimeoutMs??2e3}).catch(S=>y(S instanceof Error?S:new Error(String(S)))))};r.stdin.on("error",I),r.stdout.on("end",I),r.on("exit",()=>{d=!0}),r.on("close",(S,v)=>{d=!0,a?w.close(new Error("Muse session closed")):y(new Error(zn(`Muse exited (${v??S}) after ${u} completed prompt(s)`,m.text().trim()?ge(m.text(),{provider:"muse"}):""))),s&&_(s,new Error("Muse session closed"))});let N=()=>{if(o)return o;a=!0;let S=!!s;return s&&(s.cancelled=!0,C(s)),o=(async()=>{d||(await new Promise(v=>_t(l?t.holdOpen:void 0,{isAborted:()=>S,hasChildExited:()=>d,isTurnInFlight:()=>!!s,lastEventAtMs:()=>p,closeStdin:()=>{r.stdin.end(),v()},label:"muse"})),await te(r,{stdinEnd:!1,softDelayMs:t.closeTimeoutMs??2e3,killDelayMs:t.closeTimeoutMs??2e3}).catch(()=>{})),s&&_(s,new Error("Muse session closed")),w.close(new Error("Muse session closed"))})(),o},A=()=>{y(new Error("Aborted")),N()};t.signal?.addEventListener("abort",A,{once:!0});try{if(t.signal?.aborted)throw new Error("Aborted");let S=(await w.sendRpc("initialize",{clientInfo:{name:"lmctl",version:"1"}})).result;if(S?.schema?.version!==1)throw new Error("Muse MSP schema version is unsupported");if(t.expectedHome&&(typeof S.museHome!="string"||await Vi(S.museHome)!==await Vi(t.expectedHome)))throw new Error("Muse data home does not match the configured session reader");if(S.sessionDurability!==void 0&&S.sessionDurability!=="durable")throw new Error("Muse did not provide durable sessions");w.sendNotification("initialized");let v=e?"denyUnmatched":"allowAll",R=(t.create?await g("session/start",{sessionId:h,workspaceRoot:t.cwd,approvalMode:v,...t.model?{modelId:t.model}:{}}):await g("session/resume",{sessionId:h,excludeItems:!0}))?.session;if(R?.sessionId!==h)throw new Error(`Muse did not return requested session "${h}"`);if(typeof R.workspaceRoot!="string"||await Vi(R.workspaceRoot)!==await Vi(t.cwd))throw new Error("Muse session belongs to a different working directory");if(R.activeTurnId||R.status!=="idle")throw new Error(`Muse session is not idle (${String(R.status)})`);if((await g("session/setApprovalMode",{sessionId:h,mode:v}))?.effectiveMode?.mode!==v)throw new Error("Muse did not apply the requested approval mode");if(!t.create&&t.model&&R.modelId!==t.model&&(await g("session/setModel",{sessionId:h,model:{modelId:t.model,...R.providerId?{providerId:R.providerId}:{}}}))?.status!=="accepted")throw new Error("Muse did not accept the requested model");l=!0}catch(S){throw await N(),i??S}finally{t.signal?.removeEventListener("abort",A)}return{provider:"muse",sessionId:h,get completedTurns(){return u},close:N,async sendTurn(S,v={}){if(s?.cancelled&&await s.drain,i)throw i;if(a)throw new Error("Muse session is closed");if(s)throw new Error("Muse already has an active turn");if(v.signal?.aborted)throw new Error("Aborted");return new Promise((T,R)=>{let x,k=new Promise(D=>{x=D}),L={commandId:ns(),events:[],items:new Map,opts:v,started:Date.now(),cancelled:!1,interruptSent:!1,unqueueSent:!1,queued:!1,settled:!1,resolve:T,reject:R,drain:k,drained:x,cleanup:()=>{}};s=L;let F=()=>{L.cancelled=!0,L.settled=!0,R(new Error("Aborted")),C(L)};L.cleanup=()=>v.signal?.removeEventListener("abort",F),v.signal?.addEventListener("abort",F,{once:!0}),g("turn/start",{sessionId:h,input:[{type:"text",text:S}],...t.effort?{reasoningEffort:t.effort}:{}},L.commandId).then(D=>{if(s===L){if(D?.commandId!==L.commandId||D.status!=="accepted"||!["started","queued"].includes(D.disposition)||typeof D.turnId!="string"||D.turnId.length===0){y(new Error("Muse did not admit a fresh turn; refusing ambiguous dispatch"));return}L.id=D.turnId,L.queued=D.disposition==="queued",L.cancelled&&C(L);for(let V of L.events)s===L&&f(L,V);L.events=[]}},D=>{s===L&&_(L,D instanceof Error?D:new Error(String(D)))})})}}}var yg=O(()=>{"use strict";Ae();$l();Rn();at();qr();yt();ot()});import{join as sc}from"node:path";import{mkdir as lR}from"node:fs/promises";function ic(t={}){let e=rc(t.museDataHome),n=s=>({...s??process.env,XDG_DATA_HOME:e}),r=async(s,i)=>{if(i.bundleSession)return Lt(i.bundleSession,"muse",i.sessionId,s,i);let o=i.sessionId||ns(),a=await zi({...i,sessionId:o,create:i.sessionId==="",env:n(i.env),expectedHome:sc(e,"muse")});try{return await a.sendTurn(s,i)}finally{await a.close()}};return new class extends ne{constructor(){super({provider:new Ki({museDataHome:e}),protocol:{transport:"muse-msp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"muse",seedArgs:[],startTemplate:"muse",resumeTemplate:"muse resume {{session_id}}",transport:r})}openSession(s){return zi({...s,env:n(s.env),expectedHome:sc(e,"muse")})}async seed(s,i){await lR(s,{recursive:!0});let o=ns(),a;try{if(a=await zi({sessionId:o,cwd:s,create:!0,env:n(),expectedHome:sc(e,"muse"),model:i?.model,effort:i?.effort}),await a.sendTurn(i?.prompt??Y),await a.close(),!await this.load(o))throw new Error("Muse seed did not persist a readable native session");return{success:!0,sessionId:o}}catch(l){return{success:!1,error:`Muse seed failed: ${l instanceof Error?l.message:String(l)}`}}finally{await a?.close()}}}}var oc=O(()=>{"use strict";Ae();_g();yg();er();xe()});function Pt(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}var Eg=O(()=>{"use strict"});import{readFile as vg,readdir as cR,rm as dR,stat as wg}from"node:fs/promises";import{basename as w$,join as rs,resolve as uR}from"node:path";function lc(t){return uR(t||process.env.MINIPLAYER_HOME||rs(process.env.XDG_DATA_HOME||rs(K,".local","share"),"miniplayer"))}function Yi(t){if(typeof t=="string")return t;try{return JSON.stringify(t)??String(t)}catch{return String(t)}}function ac(t){return!t||typeof t!="object"?"tool":typeof t.toolName=="string"?t.toolName:typeof t.name=="string"?t.name:"tool"}function Tg(t){if(!t||typeof t!="object")return null;let e=t.toolCallId??t.id;return typeof e=="string"&&e.length>0?e:null}function bg(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Sg(t){if(typeof t!="string")return null;try{let e=new URL(t);return e.username="",e.password="",e.search="",e.hash="",e.toString()}catch{return null}}function kg(t){let e=t.usage&&typeof t.usage=="object"&&!Array.isArray(t.usage)?t.usage:{},n={};for(let[l,c]of Object.entries(e))Pt(c)!==null&&(n[l]=c);let r=Pt(e.inputTokens),s=Pt(e.cachedInputTokens),i=Pt(t.cacheWriteInputTokens??e.cacheWriteInputTokens),o=Pt(e.outputTokens),a=null;return t.usageConvention==="input-includes-cache"&&r!==null&&s!==null&&s<=r&&(a=r-s),t.usageConvention==="input-excludes-cache"&&r!==null&&i!==null&&(a=r+i),t.usageConvention==="synthetic"&&r===0&&s===0&&i===0&&o===0&&(a=0),{tokens:{input_uncached:a,input_cached:s,input_cache_write:i,output:o},rawUsage:n,pricingFacts:Pt(e.reasoningTokens)===null?null:{reasoning_output_tokens:Pt(e.reasoningTokens)}}}function pR(t,e,n){if(!t||typeof t!="object")return null;let r=t;if(![1,2].includes(r.version)||r.id!==e||typeof r.cwd!="string")return null;let s=h=>{if(typeof h!="string")return;let _=new Date(h);return Number.isFinite(_.getTime())?_:void 0},i=s(r.createdAt),o=s(r.updatedAt);if(!i||!o)return null;let a=[],l=[],c=[],d=r.version===1,u="complete";if(r.version===1){if(!Array.isArray(r.messages))return null;for(let h of r.messages){if(!h||!["user","assistant"].includes(h.role)||typeof h.content!="string")return null;a.push({role:h.role,content:h.content,timestamp:s(h.timestamp)??o})}}else{if(!Array.isArray(r.turns))return null;let h=new Set,_=new Set;for(let y of r.turns){if(!y||typeof y.responseId!="string"||!y.responseId||typeof y.input?.text!="string")return null;if(h.has(y.responseId)){d=!0;continue}h.add(y.responseId);let f=s(y.startedAt),w=s(y.completedAt??y.endedAt);if(!f)return null;let g=typeof y.model=="string"?y.model:void 0;["complete","running","failed","aborted"].includes(y.status)||(d=!0);let E=y.status==="complete"?"complete":y.status==="running"?"in_progress":y.status==="failed"?"failed":y.status==="aborted"?"aborted":"unknown";u=E==="failed"||E==="unknown"?"aborted":E,(E!=="complete"||y.partial===!0)&&(d=!0);let b=Array.isArray(y.modelResponses),C=b?y.modelResponses:[],I=[];l.push({id:y.responseId,startedAt:f,completedAt:w,model:g,prompt:y.input.text,status:E,responseIds:I}),a.push({role:"user",timestamp:f,content:y.input.text});let N=Array.isArray(y.toolEvents)&&y.toolEvents.length>0;if(!b&&!N){let R=y.usage??{},x=kg({...y,usage:R});Object.keys(x.rawUsage).length&&(l.at(-1).rawUsage=[{responseId:y.responseId,values:x.rawUsage}]),I.push(y.responseId),c.push({response_id:y.responseId,timestamp:(w??f).toISOString(),model:g??null,model_provider:typeof y.provider=="string"?y.provider:null,tokens:x.tokens,files_read:[],files_written:[],read_bytes:Buffer.byteLength(y.input.text,"utf8"),write_bytes:0,external_io:[{direction:"read",kind:"prompt",id:y.responseId,ref:null,bytes:Buffer.byteLength(y.input.text,"utf8"),basis:"input_text"}],pricing_facts:x.pricingFacts}),E!=="complete"&&!y.usage&&(d=!0),typeof y.output?.text=="string"&&a.push({role:"assistant",timestamp:w??f,content:y.output.text,model:g});continue}let A=new Map,S=new Map,v=new Set,T=[];for(let R of C){if(!R||typeof R!="object"||typeof R.responseId!="string"||!R.responseId){d=!0;continue}if(I.includes(R.responseId)){d=!0;continue}let x=R,k=T.length;T.push({response:x,index:k,filesRead:[],filesWritten:[],io:[]}),I.push(R.responseId),_.has(R.responseId)&&(d=!0),_.add(R.responseId),x.toolCalls!==void 0&&!Array.isArray(x.toolCalls)&&(d=!0,T[k].io.push({direction:"read",kind:"unattributed",id:R.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:R.responseId,ref:null,bytes:null,basis:"unknown"}));for(let L of Array.isArray(x.toolCalls)?x.toolCalls:[]){let F=Tg(L),D=ac(L);if(F)A.set(F,k),S.set(F,D);else{d=!0;let V=D==="list_directory"||D==="read_file"||D==="webget"||D==="shell"||D==="tool",B=D==="write_file"||D==="shell"||D==="tool";V&&T[k].io.push({direction:"read",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"}),B&&T[k].io.push({direction:"write",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"})}}}I.length===0&&C.length>0&&(d=!0);for(let R of Array.isArray(y.toolEvents)?y.toolEvents:[]){let x=R&&typeof R=="object"?R:{},k=Tg(x),L=k?A.get(k):void 0,F=ac(x),D=bg(x.result),V=x.status==="failed"||x.error!==void 0;if(x.type==="tool_call"?a.push({role:"tool_use",timestamp:s(x?.timestamp)??f,content:Yi(x?.input??x?.args),toolName:F,toolInput:Yi(x?.input??x?.args),toolInputData:bg(x?.input??x?.args)??void 0,...k?{toolCallId:k}:{}}):a.push({role:"tool_result",timestamp:s(x?.timestamp)??w??f,content:Yi(V?x?.error:x?.result),toolName:F,...k?{toolCallId:k}:{}}),L===void 0){d=!0;continue}let B=T[L];(x.type==="tool_result"||V||x.result!==void 0)&&v.add(k);let Z=D?.path,H=Pt(D?.bytesRead??D?.bytesWritten);x.type!=="tool_call"&&(F==="read_file"&&!V&&typeof Z=="string"&&H!==null?B.filesRead.push({path:Z,bytes:H}):F==="write_file"&&!V&&typeof Z=="string"&&H!==null?B.filesWritten.push({path:Z,bytes:H}):F==="webget"&&!V&&H!==null?B.io.push({direction:"read",kind:"web",id:k,ref:Sg(D?.finalUrl??D?.url),bytes:H,basis:"certified_counter"}):F==="shell"||V?(F!=="write_file"&&B.io.push({direction:"read",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}),(F==="shell"||F==="write_file")&&B.io.push({direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"})):F==="list_directory"||F==="read_file"||F==="webget"?B.io.push({direction:"read",kind:F==="webget"?"web":"unattributed",id:k,ref:F==="webget"?Sg(D?.finalUrl??D?.url):null,bytes:null,basis:"unknown"}):F==="write_file"?B.io.push({direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}):B.io.push({direction:"read",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}))}for(let[R,x]of S)if(!v.has(R)){let k=T[A.get(R)],L=x==="list_directory"||x==="read_file"||x==="webget"||x==="shell",F=x==="write_file"||x==="shell";L&&k.io.push({direction:"read",kind:"unattributed",id:R,ref:null,bytes:null,basis:"unknown"}),F&&k.io.push({direction:"write",kind:"unattributed",id:R,ref:null,bytes:null,basis:"unknown"}),d=!0}for(let R of T){let x=R.response,k=kg(x),L=s(x.completedAt??x.startedAt)??w??f;new Set((Array.isArray(x.toolCalls)?x.toolCalls:[]).map(B=>ac(B))).has("shell")&&!R.io.some(B=>B.kind==="unattributed"&&B.direction==="read")&&R.io.push({direction:"read",kind:"unattributed",id:x.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:x.responseId,ref:null,bytes:null,basis:"unknown"}),R.index===0&&R.io.unshift({direction:"read",kind:"prompt",id:y.responseId,ref:null,bytes:Buffer.byteLength(y.input.text,"utf8"),basis:"input_text"});let D=R.io.some(B=>B.direction==="read"&&B.bytes===null),V=R.io.some(B=>B.direction==="write"&&B.bytes===null);if(c.push({response_id:x.responseId,timestamp:L.toISOString(),model:typeof x.model=="string"?x.model:null,model_provider:typeof x.provider=="string"?x.provider:typeof y.provider=="string"?y.provider:null,tokens:k.tokens,files_read:D?null:R.filesRead,files_written:V?null:R.filesWritten,read_bytes:D?null:R.filesRead.reduce((B,Z)=>B+(Z.bytes??0),0)+R.io.filter(B=>B.direction==="read").reduce((B,Z)=>B+(Z.bytes??0),0),write_bytes:V?null:R.filesWritten.reduce((B,Z)=>B+(Z.bytes??0),0)+R.io.filter(B=>B.direction==="write").reduce((B,Z)=>B+(Z.bytes??0),0),external_io:R.io,pricing_facts:k.pricingFacts}),Object.keys(k.rawUsage).length){let B=l.at(-1);B.rawUsage=[...B.rawUsage??[],{responseId:x.responseId,values:k.rawUsage}]}}l.at(-1).responseIds=I,I.length!==C.length&&(d=!0),typeof y.output?.text=="string"&&a.push({role:"assistant",timestamp:w??f,content:y.output.text,model:g})}}let m=a.filter(h=>h.role==="user").map(h=>h.content),p=Ji(c,!d);return{provider:"miniplayer",sessionId:e,cwd:r.cwd,filePath:n,createdAt:i,modifiedAt:o,model:typeof r.model=="string"?r.model:void 0,messages:a,messageCount:a.length,userPrompts:m,firstUserMessage:m[0],lastUserMessage:m.at(-1),turns:l,responses:c,turnStatus:u,...d?{captureStatus:"partial"}:{},totalInputTokens:p.input_uncached??void 0,totalCachedInputTokens:p.input_cached??void 0,totalCacheWriteInputTokens:p.input_cache_write??void 0,totalOutputTokens:p.output??void 0}}var mR,Qi,Rg=O(()=>{"use strict";nc();be();Eg();mR=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;Qi=class{name="miniplayer";home;constructor(e={}){this.home=lc(e.miniplayerHome)}getWatchPaths(){return[{directory:rs(this.home,"sessions"),filePattern:/\.json$/}]}async discoverSessions(){let e;try{e=await cR(rs(this.home,"sessions"))}catch{return[]}return(await Promise.all(e.filter(r=>r.endsWith(".json")).map(r=>this.loadSession(r.slice(0,-5))))).filter(r=>r!==null)}async resolveSessionPath(e){if(!mR.test(e))return null;let n=rs(this.home,"sessions",`${e}.json`);try{return(await wg(n)).isFile()?n:null}catch{return null}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;try{let r=pR(JSON.parse(await vg(n,"utf8")),e,n);if(!r)return null;let s="complete";try{let i=JSON.parse(await vg(`${n}.lock`,"utf8"));if(Number.isInteger(i.pid)&&i.pid>0)try{process.kill(i.pid,0),s="in_progress"}catch{s="aborted"}}catch{}return{...r,...s!=="complete"?{turnStatus:s}:{}}}catch{return null}}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{throw await wg(`${n}.lock`),new Error("Cannot delete a locked miniplayer session")}catch(r){if(r.code!=="ENOENT")throw r}return await dR(n),!0}}});function Ig(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let n=0;n<t.length;n++)n===0?e.push(t[n]):e.push(`
2051
+ ${n}`:n}function Vk(t,e){return ns(t)?.filterExpectedStderr?.(e)??e}function ig(t){if(t.method!=="session/update")return!1;let n=t.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}async function og(t,e,n,r){for(let s of t.sessionSetup??[]){let i={...e,sessionId:n.sessionId,response:n.response,sendRpc:r};if(s.applies(i))try{await s.run(i),s.successLog&&Se(s.successLog(i))}catch(o){let a=s.describeFailure(i,o);if(U({event:a.event,provider:t.name,...a.fields}),a.stderrLine&&process.stderr.write(a.stderrLine),a.warning&&e.warnings.push(a.warning),s.onFailure==="fail-closed")throw new Error(a.message)}}}function ag(t,e,n){let r=we(e.env,e.cwd,e.sessionId);t.preSpawn?.({...n,cwd:e.cwd,env:r});let s=e.binaryPath||t.binary,i=t.argv(n),o=t.yoloAssertion==="always-yolo"?"yolo":n.permissionMode;if(Te(e.tool,i,o),e.cwd&&!Jk(e.cwd))throw U({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),new de(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:s,spawnArgs:i,spawnEnv:r}}async function lg(t){let{sendRpc:e,sendNotification:n,opts:r,outputProcessor:s}=t,i=t.strictSessionIdentity===!0,o=await e("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}});n("notifications/initialized");let a=r.sessionId||"",l;if(r.sessionId){let c;try{if(o.result?.agentCapabilities?.loadSession===!1)throw new Error("provider advertises loadSession=false");c=await e("session/load",{sessionId:r.sessionId,cwd:r.cwd,mcpServers:[]})}catch(u){if(i||r.requireResume)throw new Error(`Cannot resume session ${r.sessionId} via ACP: ${u instanceof Error?u.message:String(u)}`);process.stderr.write(`[acp] session/load failed for ${r.sessionId}, creating new session
2052
+ `),U({event:"acp_session_resume_fallback",provider:r.tool,session_id:r.sessionId,error_message:u instanceof Error?u.message:String(u)});let m=await e("session/new",{cwd:r.cwd,mcpServers:[]});return a=Lt(m),s.setSessionId(a),{sessionId:a,sessionResponse:m}}let d=Lt(c);if(r.requireResume&&d!==""&&d!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${d}"`);if(i){let u=Lt(c);if(u!==""&&u!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${u}"`);if(u===""){if(t.verifyLoadResponse===void 0)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received none`);await t.verifyLoadResponse(c)}a=r.sessionId}else a=Lt(c,r.sessionId);l=c,s.setSessionId(a)}else{let c=await e("session/new",{cwd:r.cwd,mcpServers:[]});a=Lt(c),l=c,s.setSessionId(a)}return{sessionId:a,sessionResponse:l}}function cg(t,e){let n=ns(e.tool);if(!n)return Promise.reject(new Error(`No ACP config for tool "${e.tool}"`));if(e.acpMode!==void 0)try{sg(e.tool,e.acpMode)}catch(r){return Promise.reject(r)}return new Promise((r,s)=>{let i=e.permissionMode??"yolo",o=[],a={permissionMode:i,...e.model!==void 0?{model:e.model}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.acpMode!==void 0?{acpMode:e.acpMode}:{},purpose:"chat",warnings:{push:N=>{o.push(N)}}},l,c,d;try{({binary:l,spawnArgs:c,spawnEnv:d}=ag(n,e,a))}catch(N){return s(N instanceof Error?N:new Error(String(N)))}let u=rg(l,c,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:d}),m=Date.now(),p=!1,h=!1,_=0,y=!1,f=!1;if(e.signal){if(e.signal.aborted)return p=!0,U({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),te(u).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{p=!0,U({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-m}),te(u).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let w=e.sessionId||"",g=Bi({tool:e.tool,onDelta:e.onDelta,...n.isolateResult?{isolateResult:n.isolateResult}:{}});g.setSessionId(w);let E=nn(u,{provider:e.tool,onEvent:N=>{_=Date.now(),ig(N)&&(f=!0),e.onEvent?.(N)},onNotification:N=>{_=Date.now(),g.processMessage(N)}}),{sendRpc:b,sendNotification:C}=E,I="";u.stderr?.on("data",N=>{I+=N.toString()}),u.on("error",N=>{E.close(N),U({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:N.message,elapsed_ms:Date.now()-m}),s(new de(`Failed to spawn ${n.binary} ${n.baseArgs.join(" ")}: ${N.message}`,{cause:N}))}),u.on("exit",N=>{if(h=!0,E.close(new de(`ACP process exited with code ${String(N)}`)),p)return;let A=g.finalize();if(A!==null)n.onExitFinalization?.({...a,sessionId:A.sessionId,result:A.result,stopReason:A.stopReason,exitCode:N}),r({result:A.result,sessionId:A.sessionId,durationMs:Date.now()-m,stopReason:A.stopReason,exitCode:N,sawActivity:A.sawActivity,...o.length>0?{warnings:o}:{}});else{let S=Vk(e.tool,I),v=Kk({tool:e.tool,exitCode:N,stderr:S,fullOutput:I});U({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:N,stderr_summary:v,elapsed_ms:Date.now()-m}),s(new Error(v))}}),(async()=>{try{let N=await lg({sendRpc:b,sendNotification:C,opts:e,outputProcessor:g});w=N.sessionId,e.onSessionId?.(w);let A=N.sessionResponse;await og(n,a,{sessionId:w,response:A},b),g.beginTurn(),y=!0,Se(`acp: prompt sent (${t.length} chars)`);let S;if(await b("session/prompt",{sessionId:w,prompt:[{type:"text",text:t}]},v=>{v.error?g.cancelTurn():S=g.completeTurn(v)}),!S)throw new Error("ACP prompt completed without a result boundary");y=!1,Se(`acp: result received (${S.result.length} chars, stopReason=${S.stopReason})`),yt(e.holdOpen,{isAborted:()=>p,hasChildExited:()=>h,isTurnInFlight:()=>y,lastEventAtMs:()=>_,closeStdin:()=>{u.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>f})}catch(N){te(u).catch(()=>{}),s(N instanceof Error?N:new Error(String(N)))}})()})}async function dg(t){let e=ns(t.tool);if(!e)throw new Error(`No ACP config for tool "${t.tool}"`);t.acpMode!==void 0&&sg(t.tool,t.acpMode);let n=t.permissionMode??"yolo",r=[],s=!0,i={permissionMode:n,...t.model!==void 0?{model:t.model}:{},...t.effort!==void 0?{effort:t.effort}:{},...t.acpMode!==void 0?{acpMode:t.acpMode}:{},purpose:"chat",warnings:{push:A=>{r.push(A)}}},{binary:o,spawnArgs:a,spawnEnv:l}=ag(e,t,i),c=rg(o,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:l}),d=Date.now(),u={exited:!1,exitCode:null,lastEventAtMs:0,turnInFlight:!1,backgroundJobLaunched:!1,completedTurns:0,closed:!1,closing:null,telemetryFired:!1},m,p=t.sessionId||"",h=null,_="";c.stderr?.on("data",A=>{_+=A.toString()});let y,f,w=Bi({tool:t.tool,onDelta:A=>y?.(A),...e.isolateResult?{isolateResult:e.isolateResult}:{}});w.setSessionId(p);let g=nn(c,{provider:t.tool,onEvent:A=>{u.lastEventAtMs=Date.now(),ig(A)&&(u.backgroundJobLaunched=!0),f?.(A)},onNotification:A=>{u.lastEventAtMs=Date.now(),w.processMessage(A)}}),E=()=>new Error(`ACP bundle process (${t.tool}) exited${u.exitCode!==null?` with code ${u.exitCode}`:""} after ${u.completedTurns} completed prompt(s); the bundle cannot continue`),b=[],C=()=>u.exited?Promise.resolve():new Promise(A=>{b.push(A)}),I=null;c.on("error",A=>{h=new de(`Failed to spawn ${e.binary} ${e.baseArgs.join(" ")}: ${A.message}`,{cause:A}),U({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:A.message,elapsed_ms:Date.now()-d}),g.close(A)}),c.on("exit",A=>{if(u.exited=!0,u.exitCode=A,g.close(new de(`ACP process exited with code ${String(A)}`)),!u.telemetryFired){u.telemetryFired=!0;let S=w.finalize();S!==null&&e.onExitFinalization?.({...i,sessionId:S.sessionId,result:S.result,stopReason:S.stopReason,exitCode:A})}if(I!==null){let S=I;I=null,S(E())}for(let S of b.splice(0))S()});try{let A=await lg({sendRpc:g.sendRpc,sendNotification:g.sendNotification,opts:t,outputProcessor:w,strictSessionIdentity:!0,verifyLoadResponse:e.sessionIdentity===void 0?void 0:async S=>e.sessionIdentity.verifyLoadedSession({...i,requestedSessionId:t.sessionId,loadResponse:S,cwd:t.cwd,env:l})});p=A.sessionId,t.onSessionId?.(p),await og(e,i,{sessionId:A.sessionId,response:A.sessionResponse},g.sendRpc)}catch(A){let S=h??(A instanceof Error?A:new Error(String(A)));throw te(c).catch(()=>{}),S}let N=A=>new Promise(S=>{setTimeout(S,A).unref?.()});return{tool:t.tool,get sessionId(){return p},get completedTurns(){return u.completedTurns},async sendTurn(A,S={}){if(m&&await m,u.closed||u.closing!==null)throw new Error(`ACP bundle session (${t.tool}) is closed`);if(u.exited)throw E();if(u.turnInFlight)throw new Error(`ACP bundle session (${t.tool}) has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending`);if(S.signal?.aborted)throw new Error("Aborted");if(e.sessionIdentity?.recheckSession!==void 0){if(await e.sessionIdentity.recheckSession({requestedSessionId:p,cwd:t.cwd,env:l}),u.exited)throw E();if(S.signal?.aborted)throw new Error("Aborted")}u.turnInFlight=!0,y=S.onDelta,f=S.onEvent;let v=Date.now();try{w.beginTurn(),Se(`acp: bundle prompt sent (${A.length} chars)`);let T,R=!1;if(await new Promise((k,L)=>{I=L;let F,D=()=>{R=!0,m=Promise.resolve().then(()=>F).catch(()=>{}),w.cancelTurn(),g.sendNotification("session/cancel",{sessionId:p}),L(new Error("Aborted"))},V=S.signal;V?.addEventListener("abort",D,{once:!0}),F=g.sendRpc("session/prompt",{sessionId:p,prompt:[{type:"text",text:A}]},B=>{R||(B.error?w.cancelTurn():T=w.completeTurn(B),y=void 0,f=void 0)}),F.then(B=>{V?.removeEventListener("abort",D),k(B)},B=>{V?.removeEventListener("abort",D),L(B instanceof Error?B:new Error(String(B)))})}),I=null,!T)throw new Error("ACP prompt completed without a result boundary");u.turnInFlight=!1,u.completedTurns+=1,Se(`acp: bundle result received (${T.result.length} chars, stopReason=${T.stopReason})`);let x=s&&r.length>0?[...r]:void 0;return s=!1,{result:T.result,sessionId:T.sessionId,stopReason:T.stopReason,durationMs:Date.now()-v,sawActivity:T.sawActivity,...x!==void 0?{warnings:x}:{}}}catch(T){throw I=null,w.cancelTurn(),u.turnInFlight=!1,u.exited?E():T}finally{y=void 0,f=void 0}},close(){return u.closing!==null||(u.closing=(async()=>{if(u.closed=!0,u.exited||(t.holdOpen!==void 0?await new Promise(S=>{yt(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>u.exited,isTurnInFlight:()=>u.turnInFlight,lastEventAtMs:()=>u.lastEventAtMs,closeStdin:()=>{c.stdin?.end(),S()},label:t.tool,wasBackgroundJobLaunched:()=>u.backgroundJobLaunched})}):c.stdin?.end(),u.exited))return;let A=t.closeTimeoutMs??2e3;await Promise.race([C(),N(A)]),u.exited||await te(c,{stdinEnd:!1,softDelayMs:Math.min(1e3,A),killDelayMs:Math.min(1e3,A)}).catch(()=>{})})()),u.closing}}}var tc=O(()=>{"use strict";oe();In();xn();Kr();Et();oe();lt();at();Vr();Wl();ng();ec();Yl();Vr()});function Gi(t,e,n){return Ct(t)&&e.tools[t]?.agent===void 0&&n.includes(t)}async function Mt(t,e,n,r,s){if(t.provider!==e)throw new Error(`bundle session provider mismatch: session serves "${t.provider}", turn targets "${e}"`);if(t.sessionId!==n)throw new nr(`session identity mismatch: expected "${n}", got "${t.sessionId}"`);let i=await t.sendTurn(r,s);if(i.sessionId!==n)throw new nr(`session identity mismatch: expected "${n}", got "${i.sessionId}"`);return{...i,...i.text===""&&i.sawActivity===!1?{status:"empty"}:{}}}async function Ji(t,e){bi(t.name);let n=e.requireResume??!0;if(n&&!e.sessionId.trim())throw new Error("conversation requires an existing session ID");let r=e.userConfig?.tools[t.name]?.agent!==void 0,s=e.execution!=="per-turn"&&t.openSession!==void 0&&!r;if(e.execution==="persistent"&&!s)throw new Error(`provider "${t.name}" does not support persistent sessions with this configuration`);let i=s?await t.openSession(e):void 0,o=!n&&e.sessionId==="";if(i&&(i.provider!==t.name||typeof i.sessionId!="string"||!i.sessionId.trim()||!o&&i.sessionId!==e.sessionId))throw await i.close(),new Error(`session identity mismatch opening ${t.name}: expected "${e.sessionId}", got "${i.sessionId}" (${i.provider})`);let a=i?.sessionId??e.sessionId,l=0,c=!1,d,u;return{provider:t.name,sessionId:a,execution:s?"persistent":"per-turn",transport:r?"custom":t.protocol?.transport??"unknown",cancellation:r?"unknown":s?t.protocol?.persistentCancellation??"unknown":t.protocol?.perTurnCancellation??"unknown",get completedTurns(){return l},async sendTurn(m,p={}){if(c)throw new Error("conversation is closed");if(d)throw new Error("conversation already has an active turn");if(p.signal?.aborted)throw new Error("Aborted");let h=new AbortController;d=h;let _=()=>h.abort();p.signal?.addEventListener("abort",_,{once:!0});try{let y=i?await Mt(i,t.name,a,m,{...p,signal:h.signal}):await t.sendTurn(m,{...e,...p,signal:h.signal,requireResume:n,timeoutMs:e.timeoutMs??0});if(h.signal.aborted)throw new Error("Aborted");if(n&&y.sessionId!==e.sessionId)throw c=!0,new nr(`session identity mismatch: expected "${e.sessionId}", got "${y.sessionId}"`);return y.status!=="empty"&&y.status!=="stalled"&&l++,y}catch(y){throw h.signal.aborted&&i&&t.protocol?.persistentCancellation==="session"&&(c=!0),y instanceof nr&&(c=!0,await i?.close()),y}finally{p.signal?.removeEventListener("abort",_),d=void 0}},close(){return u||(c=!0,d?.abort(),u=i?i.close():Promise.resolve()),u}}}var nr,rr=O(()=>{"use strict";Kn();nr=class extends Error{}});import{realpathSync as zk}from"node:fs";import{resolve as Yk}from"node:path";function nc(t){let e=Yk(t);try{return zk(e)}catch{return e}}var ug=O(()=>{"use strict"});import{platform as mg}from"node:os";function Pt(t){let e=new rs;for(let n of t)e.registerAdapter(n);return e}var rs,rc=O(()=>{"use strict";ug();rs=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(e?.workspace){let o=nc(e.workspace);i=i.filter(a=>nc(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=mg()==="darwin"||mg()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{readFileSync as Qk,writeFileSync as DF,mkdirSync as FF}from"node:fs";import{join as Zk,dirname as jF}from"node:path";import{homedir as eR}from"node:os";function nR(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function rR(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=nR(t.slice(e+1).trim());return n?{key:n,value:r}:null}function sR(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function Ki(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function iR(){return Zk(eR(),".lmctl","config.toml")}function fg(t){let e=t??iR(),n;try{n=Qk(e,"utf-8")}catch{return{tools:{}}}return oR(n)}function pg(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function oR(t){let e={},n={},r=t.split(`
2053
+ `),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let u=e[s.tool]??{};if(s.profile){let m=u.profiles?.[s.profile]??{};i.description&&(m.description=i.description),i.flags!==void 0&&(m.flags=i.flags),u.profiles||(u.profiles={}),u.profiles[s.profile]=m}else i.start&&(u.start=i.start),i.resume&&(u.resume=i.resume),i.agent&&(u.agent=i.agent),i.profile_flag!==void 0&&(u.profile_flag=i.profile_flag);e[s.tool]=u}else if(s.kind==="compact"){let u=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let m=pg(i.min);m!==null&&(u.min=m)}if(i.max!==void 0){let m=pg(i.max);m!==null&&(u.max=m)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=u):n.global=u}i={}}for(let u of r){let m=u.trim();if(!m||m.startsWith("#"))continue;let p=sR(m);if(p!==null){if(o=!0,l(),p.startsWith("tool.")){let _=".profile.",y=p.indexOf(_);y!==-1?s={kind:"tool",tool:p.slice(5,y),profile:p.slice(y+_.length)}:s={kind:"tool",tool:p.slice(5),profile:null}}else p==="compact"?s={kind:"compact",provider:null}:p.startsWith("compact.")?s={kind:"compact",provider:p.slice(8)}:s={kind:"none"};continue}let h=rR(m);h&&s.kind!=="none"?i[h.key]=h.value:h&&!o&&(a[h.key]=h.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let d=a.site_name;return d!==void 0&&d.length>0&&(c.site_name=d),c}function aR(t,e,n){if(!n)return"";let r=t.tools[e]??sc[e],s=r?.profiles?.[n]?.flags??sc[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function gg(t,e){return!!t.tools[e]}function hg(t,e,n,r,s){let i=t.tools[e]??sc[e],o;if(i?.agent){let l=Ki(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=tR[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let d=c.map(Ki).join(" ");o=`printf '%s\\n' ${Ki(r)} | ${d}`}else o=c.map(Ki).join(" ")}let a=aR(t,e,s);return a&&(o+=" "+a),o}var sc,tR,ic=O(()=>{"use strict";sc={muse:{start:"muse",resume:"muse resume {{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}},hermes:{start:"hermes",resume:"hermes --yolo --resume {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}}},tR={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]},hermes:{mode:"argv",argv:["hermes","--yolo","-z","{{prompt}}","--resume","{{session_id}}"]}}});function _g(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var yg=O(()=>{"use strict"});var lR,Y,Vi,xe=O(()=>{"use strict";lR="ACK: waiting for explicit lmctl task.",Y=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, or edit. Reply exactly: ${lR}`,Vi=`send this exact lmctl seed instruction: "${Y}"`});import{spawn as Eg}from"node:child_process";import{mkdirSync as cR}from"node:fs";var sr,ne,Ae=O(()=>{"use strict";ic();yg();xe();lt();Pi();at();sr=class t extends Error{cancelReason;constructor(e,n){super(e),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,t.prototype)}},ne=class t{name;capabilities;injection;protocol;provider;binary;seedArgs;seedTimeoutMs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.protocol=e.protocol,this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedTimeoutMs=e.seedTimeoutMs??6e4,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let n=e?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===Y?n:r)}turnOptsFor(e){return e}get seedBinary(){return this.binary}seed(e,n){return cR(e,{recursive:!0}),new Promise(r=>{let s;try{s=Eg(this.binary,this.seedArgsFor(n),{cwd:e,env:er(n?.env,e),signal:n?.signal,stdio:["pipe","pipe","pipe"],timeout:this.seedTimeoutMs})}catch(l){return r({success:!1,error:l instanceof Error?l.message:String(l)})}let i="",o="";s.stdout?.on("data",l=>{i+=l.toString()}),s.stderr?.on("data",l=>{o+=l.toString()});let a=n?.prompt!==void 0&&this.seedStdin!==void 0?`${n.prompt}
2054
+ `:this.seedStdin;a&&s.stdin?.write(a),s.stdin?.end(),s.on("exit",(l,c)=>{if(l===0&&!c)r({success:!0});else{let d=Rn(o).trim(),u=Rn(i).trim(),m=d||u;r({success:!1,error:m?ge(m,{provider:this.name}):c?`terminated by ${c}`:`exit code ${l}`})}}),s.on("error",l=>{r({success:!1,error:l.message,errorCode:l.code})})})}resumeCommand(e,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:Vi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,n){let r=this.turnOptsFor(n);if(r.userConfig&&gg(r.userConfig,this.name)){let i=r.userConfig.tools[this.name];if(i?.agent)return this.runOneShotAgent(e,r,i.agent)}let s=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return s<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(s,e,r)}withTimeouts(e,n,r){let s=new AbortController,i,o,a="",l=r.sessionId,c,d=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(e),u(),s.abort(),c&&c({text:a,sessionId:l,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),d();let m={...r,binary:this.binary,signal:s.signal,onSessionId:_=>{_&&(l=_),r.onSessionId?.(_)},onDelta:_=>{a+=_,d(),r.onDelta?.(_)},onProgress:_=>{_.kind!=="api_retry"&&d(),r.onProgress?.(_)}},p=this.transportFn(n,m).then(_=>(u(),{..._,status:_.status??"ok"})).catch(_=>{throw u(),o==="external"?new sr("Turn cancelled","external"):_}),h=new Promise(_=>{c=_});return Promise.race([p,h])}runOneShotAgent(e,n,r){let s=hg(n.userConfig,this.name,n.sessionId,e,n.profile),i=Date.now();return new Promise((o,a)=>{let l=n.timeoutMs!==void 0&&n.timeoutMs<=0?0:_g(n.env),c=Eg(s,{shell:!0,cwd:n.cwd,env:we(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,m=l>0?setTimeout(()=>{u=!0,c.kill()},l):void 0,p="",h="";if(c.stdout?.on("data",_=>{let y=_.toString();p+=y,n.onDelta?.(y)}),c.stderr?.on("data",_=>{h+=_.toString()}),n.signal){if(n.signal.aborted)return clearTimeout(m),c.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(m);let y=Date.now()-i;if(u)a(new Error(`Agent command timed out after ${l}ms`));else if(_===0||_===null)o({text:p.trim(),sessionId:n.sessionId,durationMs:y});else{let f=h.trim();a(new Error(f?ge(f,{provider:this.name}):`Agent command exited with code ${_}`))}}),c.on("error",_=>{d||(d=!0,clearTimeout(m),a(_))})})}}});function zi(t,e=!0){let n={input_uncached:null,input_cached:null,input_cache_write:null,output:null};if(!e||!t.length||new Set(t.map(r=>r.response_id)).size!==t.length)return n;for(let r of Object.keys(n)){let s=t.map(o=>o.tokens[r]);if(s.some(o=>o===null||!Number.isSafeInteger(o)||o<0))continue;let i=s.reduce((o,a)=>o+a,0);Number.isSafeInteger(i)&&(n[r]=i)}return n}var oc=O(()=>{"use strict"});import{readdir as dR}from"node:fs/promises";import{join as ss,resolve as uR}from"node:path";function ac(t){return uR(t||process.env.XDG_DATA_HOME||ss(K,".local","share"))}function mR(t,e,n,r){let s=r?.input_uncached_tokens,i=r?.cache_read_tokens??r?.input_cache_read_tokens,o=r?.cache_write_tokens??r?.input_cache_write_tokens;return{response_id:t,timestamp:e.toISOString(),model:typeof n=="string"&&n.length>0?n:null,tokens:{input_uncached:typeof s=="number"?s:null,input_cached:typeof i=="number"?i:null,input_cache_write:typeof o=="number"?o:null,output:typeof r?.output_tokens=="number"?r.output_tokens:null},files_read:null,files_written:null}}function pR(t,e){let n,r,s,i,o,a=[],l=new Map,c=new Map,d=new Set,u,m,p=()=>{m="partial"},h=f=>{if(typeof f!="string"||f.length===0){p();return}let w=l.get(f);return w||(w={id:f,turn:{id:f,status:"unknown"},responseIds:[]},l.set(f,w)),w},_=f=>{if(f.retained_frame&&Array.isArray(f.children)){for(let I of f.children)try{if(typeof I?.record_json!="string")throw new Error("missing record_json");_(JSON.parse(I.record_json))}catch{p()}return}if(f.stream?.kind!=="session"||f.stream?.id!==t)return;if(f.schema_version!==1){p();return}if(f.payload_type?.startsWith("runtime.session")&&f.payload_schema_version!==1){p();return}let w=f.payload?.source_run_record_id;for(let I of[f.id,w])if(!(typeof I!="string"||I.length===0)&&d.has(I))return;for(let I of[f.id,w])typeof I=="string"&&I.length>0&&d.add(I);let g=typeof f.recorded_at=="number"&&Number.isFinite(f.recorded_at)?new Date(f.recorded_at/1e3):void 0;if(f.recorded_at!==void 0&&(!g||!Number.isFinite(g.getTime()))){p();return}g&&Number.isFinite(g.getTime())&&((!s||g<s)&&(s=g),(!i||g>i)&&(i=g));let E=f.payload;if(f.payload_type==="runtime.session.metadata"&&(typeof E?.record?.workspace_root=="string"&&(n=E.record.workspace_root),typeof E?.record?.model_id=="string"&&(r=E.record.model_id)),f.payload_type!=="runtime.session"||E?.kind!=="run")return;let b=E.event,C=h(E.run_id);if(!b||!g||!C){b||p();return}if(b.kind==="started"&&typeof b.prompt=="string")a.push({role:"user",content:b.prompt,timestamp:g}),C.turn.startedAt=g,C.turn.prompt=b.prompt,C.turn.status="in_progress",o="in_progress";else if(b.kind==="assistant_message_committed"&&typeof b.text=="string")a.push({role:"assistant",content:b.text,timestamp:g});else if(b.kind==="terminal")C.turn.completedAt=g,C.turn.status=b.terminal==="completed"?"complete":"aborted",o=C.turn.status;else if(b.kind==="model_completed"){typeof b.model=="string"&&b.model.length>0&&(r=b.model,C.turn.model=b.model);let I=typeof w=="string"&&w.length>0?w:typeof f.id=="string"&&f.id.length>0?f.id:void 0;if(!I)p();else{C.responseIds.push(I);let x={};if(b.usage&&typeof b.usage=="object")for(let k of["input_tokens","output_tokens","cached_tokens","reasoning_tokens","input_uncached_tokens","cache_read_tokens","input_cache_read_tokens","cache_write_tokens","input_cache_write_tokens"]){let L=b.usage[k];typeof L=="number"&&Number.isSafeInteger(L)&&L>=0&&(x[k]=L)}Object.keys(x).length>0&&(C.turn.rawUsage=[...C.turn.rawUsage??[],{responseId:I,values:x}]),c.set(I,mR(I,g,b.model,x))}if(!b.usage)return;let N={},A=b.usage.input_uncached_tokens,S=b.usage.cache_read_tokens??b.usage.input_cache_read_tokens,v=b.usage.cache_write_tokens??b.usage.input_cache_write_tokens,T=b.usage.output_tokens,R=b.usage.reasoning_tokens;typeof A=="number"&&Number.isSafeInteger(A)&&A>=0&&(N.inputTokens=A),typeof S=="number"&&Number.isSafeInteger(S)&&S>=0&&(N.cachedInputTokens=S),typeof v=="number"&&Number.isSafeInteger(v)&&v>=0&&(N.cacheWriteInputTokens=v),typeof T=="number"&&Number.isSafeInteger(T)&&T>=0&&(N.outputTokens=T),typeof R=="number"&&Number.isSafeInteger(R)&&R>=0&&(N.reasoningOutputTokens=R),u=N}};return{visit:_,finish:()=>{if(!n||!s||!i)return null;let f=a.filter(b=>b.role==="user").map(b=>b.content),w=[...l.values()].map(b=>({...b.turn,...b.responseIds.length>0?{responseIds:[...b.responseIds]}:{}})),g=[...c.values()],E=zi(g,m!=="partial");return{provider:"muse",sessionId:t,filePath:e,cwd:n,createdAt:s,modifiedAt:i,model:r,messages:a,messageCount:a.length,firstUserMessage:f[0],lastUserMessage:f.at(-1),userPrompts:f,turnStatus:o,totalInputTokens:E.input_uncached??void 0,totalCachedInputTokens:E.input_cached??void 0,totalCacheWriteInputTokens:E.input_cache_write??void 0,totalOutputTokens:E.output??void 0,lastTokenUsage:u,turns:w,responses:g,...m?{captureStatus:m}:{}}},markPartial:p}}async function wg(t,e){let n=pR(t,e);for await(let r of me(e,n.markPartial))n.visit(r);return n.finish()}var vg,Yi,Tg=O(()=>{"use strict";oc();be();vg=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Yi=class{name="muse";dataHome;constructor(e={}){this.dataHome=ac(e.museDataHome)}get root(){return ss(this.dataHome,"muse","sessions")}getWatchPaths(){return[{directory:this.root,filePattern:/session\.jsonl$/}]}async files(e=this.root,n=0){let r;try{r=await dR(e,{withFileTypes:!0})}catch{return[]}let s=[];for(let i of r)i.isFile()&&i.name==="session.jsonl"?s.push(ss(e,i.name)):i.isDirectory()&&n<4&&s.push(...await this.files(ss(e,i.name),n+1));return s}async resolveSessionPath(e){return vg.test(e)?(await this.files()).find(n=>n.endsWith(ss(e,"session.jsonl")))??null:null}async loadSession(e){let n=await this.resolveSessionPath(e);return n?wg(e,n):null}async discoverSessions(){let e=[];for(let n of await this.files())try{let r=n.split(/[\\/]/).at(-2);if(!vg.test(r))continue;let s=await wg(r,n);s&&e.push(s)}catch{}return e}async deleteSession(){return!1}}});import{spawn as fR}from"node:child_process";import{randomBytes as gR}from"node:crypto";import{realpath as Qi}from"node:fs/promises";function is(){let t=gR(16);t.writeUIntBE(Date.now(),0,6),t[6]=t[6]&15|112,t[8]=t[8]&63|128;let e=t.toString("hex");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`}async function Zi(t){if(t.signal?.aborted)throw new Error("Aborted");if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t.sessionId))throw new Error("Muse requires a native session UUID");let e=t.permissionMode==="plan",n=["serve",...e?["--disable-write","--disable-shell"]:["--disable-sandbox","--trust-workspace"],...t.model?["--model",t.model]:[]];Te("muse",n,t.permissionMode??"yolo");let r=fR(t.progPath??"muse",n,{cwd:t.cwd,env:we(t.env,t.cwd,t.sessionId),stdio:["pipe","pipe","pipe"]}),s,i,o,a=!1,l=!1,c=!1,d=!1,u=0,m=wf(),p=Date.now(),h=t.sessionId;r.stderr.setEncoding("utf8"),r.stderr.on("data",S=>{m.append(S)});let _=(S,v,T)=>{s===S&&(s=void 0,S.cleanup(),S.drained(),S.settled||(S.settled=!0,v?S.reject(v):(u++,S.resolve(T))))},y=S=>{i||(i=S,s&&_(s,i),w.close(i),!d&&!a&&te(r,{softDelayMs:t.closeTimeoutMs??2e3,killDelayMs:t.closeTimeoutMs??2e3}).catch(()=>{}))},f=(S,v)=>{let T=v.params;if(!T||T.sessionId!==h)return;let R=v.method;if(R==="view/gap"||R==="session/closed"){y(new Error(`Muse ${R}: the conversation cannot continue without reopening`));return}if(R==="turn/unqueued"&&T.turnId===S.id){_(S,new sr("Muse queued turn cancelled","external"));return}R==="turn/started"&&T.turnId===S.id&&(S.queued=!1);let x=T.item,k=T.turnId??x?.turnId;if(k&&k!==S.id)return;S.opts.onEvent?.(v);let L={kind:"other",raw:v};if(["item/started","item/updated","item/completed"].includes(R)&&x?.turnId===S.id&&typeof x.itemId=="string"){let D=S.items.get(x.itemId);if(D&&typeof x.revision=="number"&&x.revision<=D.revision)return;S.items.set(x.itemId,{...x}),(x.kind==="toolCall"||x.kind==="userShell")&&R!=="item/updated"?L={kind:R==="item/completed"?"tool_result":"tool_use",id:x.itemId,tool:x.tool??x.kind,summary:x.failureReason??x.fallbackText,...R==="item/completed"?{status:x.status==="completed"?"ok":"error"}:{},...x.durationMs!==void 0?{elapsedMs:x.durationMs}:{},raw:v}:x.kind==="reasoning"?L={kind:"thinking",raw:v}:x.kind==="agentMessage"&&(L={kind:"text",raw:v})}else if(R==="item/delta"&&typeof T.itemId=="string"&&typeof T.delta=="string"){let D=S.items.get(T.itemId);if(!D)return;D.kind==="agentMessage"&&(T.field===void 0||T.field==="text")?(D.text=(D.text??"")+T.delta,S.cancelled||S.opts.onDelta?.(T.delta),L={kind:"text",raw:v}):D.kind==="reasoning"&&(L={kind:"thinking",raw:v})}if(S.cancelled||S.opts.onProgress?.(L),R!=="turn/completed"||T.turnId!==S.id)return;if(!["completed","failed","cancelled"].includes(T.terminal)){y(new Error(`Muse returned an unknown turn terminal: ${String(T.terminal)}`));return}if(S.cancelled||T.terminal==="cancelled"){_(S,new sr("Muse turn cancelled",S.cancelled?"external":"provider"));return}if(T.terminal!=="completed"){_(S,new Error(T.error?.message??T.reason??`Muse turn ended with ${String(T.terminal)}`));return}let F=[...S.items.values()].filter(D=>D.kind==="agentMessage");_(S,void 0,{text:F.map(D=>typeof D.text=="string"?D.text:"").join(`
2055
+ `),sessionId:h,durationMs:typeof T.durationMs=="number"?T.durationMs:Date.now()-S.started,stopReason:T.terminal,...F.some(D=>D.truncated)?{warnings:["Muse reported a truncated response; inspect the native transcript for complete content"]}:{}})},w=nn(r,{provider:"muse",protocol:"msp",onProtocolError:y,onNotification:S=>{if(p=Date.now(),S.method==="view/gap"||S.method==="session/closed"){S.params?.sessionId===h&&!a&&y(new Error(`Muse ${S.method}: session must be reopened`));return}let v=s;v&&(v.id?f(v,S):v.events.push(S))}}),g=async(S,v,T=is())=>(await w.sendRpc(S,{...v,commandId:T})).result,E=S=>{!S.id||S.interruptSent||s!==S||(S.interruptSent=!0,g("turn/interrupt",{sessionId:h,turnId:S.id}).catch(v=>{s===S&&y(v instanceof Error?v:new Error(String(v)))}))},b=S=>{!S.id||S.unqueueSent||s!==S||(S.unqueueSent=!0,g("turn/unqueue",{sessionId:h,turnId:S.id}).catch(v=>{let T=v instanceof Error?v.message:String(v);/already started|not queued|launch boundary|turn is running/i.test(T)?(S.queued=!1,E(S)):s===S&&y(v instanceof Error?v:new Error(T))}))},C=S=>{S.queued?b(S):E(S)};r.on("error",S=>y(new Error(`Unable to start Muse: ${S.message}`)));let I=()=>{a||d||i||c||(c=!0,te(r,{softDelayMs:t.closeTimeoutMs??2e3,killDelayMs:t.closeTimeoutMs??2e3}).catch(S=>y(S instanceof Error?S:new Error(String(S)))))};r.stdin.on("error",I),r.stdout.on("end",I),r.on("exit",()=>{d=!0}),r.on("close",(S,v)=>{d=!0,a?w.close(new Error("Muse session closed")):y(new Error(Zn(`Muse exited (${v??S}) after ${u} completed prompt(s)`,m.text().trim()?ge(m.text(),{provider:"muse"}):""))),s&&_(s,new Error("Muse session closed"))});let N=()=>{if(o)return o;a=!0;let S=!!s;return s&&(s.cancelled=!0,C(s)),o=(async()=>{d||(await new Promise(v=>yt(l?t.holdOpen:void 0,{isAborted:()=>S,hasChildExited:()=>d,isTurnInFlight:()=>!!s,lastEventAtMs:()=>p,closeStdin:()=>{r.stdin.end(),v()},label:"muse"})),await te(r,{stdinEnd:!1,softDelayMs:t.closeTimeoutMs??2e3,killDelayMs:t.closeTimeoutMs??2e3}).catch(()=>{})),s&&_(s,new Error("Muse session closed")),w.close(new Error("Muse session closed"))})(),o},A=()=>{y(new Error("Aborted")),N()};t.signal?.addEventListener("abort",A,{once:!0});try{if(t.signal?.aborted)throw new Error("Aborted");let S=(await w.sendRpc("initialize",{clientInfo:{name:"lmctl",version:"1"}})).result;if(S?.schema?.version!==1)throw new Error("Muse MSP schema version is unsupported");if(t.expectedHome&&(typeof S.museHome!="string"||await Qi(S.museHome)!==await Qi(t.expectedHome)))throw new Error("Muse data home does not match the configured session reader");if(S.sessionDurability!==void 0&&S.sessionDurability!=="durable")throw new Error("Muse did not provide durable sessions");w.sendNotification("initialized");let v=e?"denyUnmatched":"allowAll",R=(t.create?await g("session/start",{sessionId:h,workspaceRoot:t.cwd,approvalMode:v,...t.model?{modelId:t.model}:{}}):await g("session/resume",{sessionId:h,excludeItems:!0}))?.session;if(R?.sessionId!==h)throw new Error(`Muse did not return requested session "${h}"`);if(typeof R.workspaceRoot!="string"||await Qi(R.workspaceRoot)!==await Qi(t.cwd))throw new Error("Muse session belongs to a different working directory");if(R.activeTurnId||R.status!=="idle")throw new Error(`Muse session is not idle (${String(R.status)})`);if((await g("session/setApprovalMode",{sessionId:h,mode:v}))?.effectiveMode?.mode!==v)throw new Error("Muse did not apply the requested approval mode");if(!t.create&&t.model&&R.modelId!==t.model&&(await g("session/setModel",{sessionId:h,model:{modelId:t.model,...R.providerId?{providerId:R.providerId}:{}}}))?.status!=="accepted")throw new Error("Muse did not accept the requested model");l=!0}catch(S){throw await N(),i??S}finally{t.signal?.removeEventListener("abort",A)}return{provider:"muse",sessionId:h,get completedTurns(){return u},close:N,async sendTurn(S,v={}){if(s?.cancelled&&await s.drain,i)throw i;if(a)throw new Error("Muse session is closed");if(s)throw new Error("Muse already has an active turn");if(v.signal?.aborted)throw new Error("Aborted");return new Promise((T,R)=>{let x,k=new Promise(D=>{x=D}),L={commandId:is(),events:[],items:new Map,opts:v,started:Date.now(),cancelled:!1,interruptSent:!1,unqueueSent:!1,queued:!1,settled:!1,resolve:T,reject:R,drain:k,drained:x,cleanup:()=>{}};s=L;let F=()=>{L.cancelled=!0,L.settled=!0,R(new Error("Aborted")),C(L)};L.cleanup=()=>v.signal?.removeEventListener("abort",F),v.signal?.addEventListener("abort",F,{once:!0}),g("turn/start",{sessionId:h,input:[{type:"text",text:S}],...t.effort?{reasoningEffort:t.effort}:{}},L.commandId).then(D=>{if(s===L){if(D?.commandId!==L.commandId||D.status!=="accepted"||!["started","queued"].includes(D.disposition)||typeof D.turnId!="string"||D.turnId.length===0){y(new Error("Muse did not admit a fresh turn; refusing ambiguous dispatch"));return}L.id=D.turnId,L.queued=D.disposition==="queued",L.cancelled&&C(L);for(let V of L.events)s===L&&f(L,V);L.events=[]}},D=>{s===L&&_(L,D instanceof Error?D:new Error(String(D)))})})}}}var bg=O(()=>{"use strict";Ae();Bl();xn();lt();Kr();Et();at()});import{join as lc}from"node:path";import{mkdir as hR}from"node:fs/promises";function cc(t={}){let e=ac(t.museDataHome),n=s=>({...s??process.env,XDG_DATA_HOME:e}),r=async(s,i)=>{if(i.bundleSession)return Mt(i.bundleSession,"muse",i.sessionId,s,i);let o=i.sessionId||is(),a=await Zi({...i,sessionId:o,create:i.sessionId==="",env:n(i.env),expectedHome:lc(e,"muse")});try{return await a.sendTurn(s,i)}finally{await a.close()}};return new class extends ne{constructor(){super({provider:new Yi({museDataHome:e}),protocol:{transport:"muse-msp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"muse",seedArgs:[],startTemplate:"muse",resumeTemplate:"muse resume {{session_id}}",transport:r})}openSession(s){return Zi({...s,env:n(s.env),expectedHome:lc(e,"muse")})}async seed(s,i){await hR(s,{recursive:!0});let o=is(),a;try{if(a=await Zi({sessionId:o,cwd:s,create:!0,env:n(),expectedHome:lc(e,"muse"),model:i?.model,effort:i?.effort}),await a.sendTurn(i?.prompt??Y),await a.close(),!await this.load(o))throw new Error("Muse seed did not persist a readable native session");return{success:!0,sessionId:o}}catch(l){return{success:!1,error:`Muse seed failed: ${l instanceof Error?l.message:String(l)}`}}finally{await a?.close()}}}}var dc=O(()=>{"use strict";Ae();Tg();bg();rr();xe()});function Dt(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}var Sg=O(()=>{"use strict"});import{readFile as kg,readdir as _R,rm as yR,stat as Rg}from"node:fs/promises";import{basename as A$,join as os,resolve as ER}from"node:path";function mc(t){return ER(t||process.env.MINIPLAYER_HOME||os(process.env.XDG_DATA_HOME||os(K,".local","share"),"miniplayer"))}function eo(t){if(typeof t=="string")return t;try{return JSON.stringify(t)??String(t)}catch{return String(t)}}function uc(t){return!t||typeof t!="object"?"tool":typeof t.toolName=="string"?t.toolName:typeof t.name=="string"?t.name:"tool"}function Ig(t){if(!t||typeof t!="object")return null;let e=t.toolCallId??t.id;return typeof e=="string"&&e.length>0?e:null}function xg(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Ag(t){if(typeof t!="string")return null;try{let e=new URL(t);return e.username="",e.password="",e.search="",e.hash="",e.toString()}catch{return null}}function Cg(t){let e=t.usage&&typeof t.usage=="object"&&!Array.isArray(t.usage)?t.usage:{},n={};for(let[l,c]of Object.entries(e))Dt(c)!==null&&(n[l]=c);let r=Dt(e.inputTokens),s=Dt(e.cachedInputTokens),i=Dt(t.cacheWriteInputTokens??e.cacheWriteInputTokens),o=Dt(e.outputTokens),a=null;return t.usageConvention==="input-includes-cache"&&r!==null&&s!==null&&s<=r&&(a=r-s),t.usageConvention==="input-excludes-cache"&&r!==null&&i!==null&&(a=r+i),t.usageConvention==="synthetic"&&r===0&&s===0&&i===0&&o===0&&(a=0),{tokens:{input_uncached:a,input_cached:s,input_cache_write:i,output:o},rawUsage:n,pricingFacts:Dt(e.reasoningTokens)===null?null:{reasoning_output_tokens:Dt(e.reasoningTokens)}}}function wR(t,e,n){if(!t||typeof t!="object")return null;let r=t;if(![1,2].includes(r.version)||r.id!==e||typeof r.cwd!="string")return null;let s=h=>{if(typeof h!="string")return;let _=new Date(h);return Number.isFinite(_.getTime())?_:void 0},i=s(r.createdAt),o=s(r.updatedAt);if(!i||!o)return null;let a=[],l=[],c=[],d=r.version===1,u="complete";if(r.version===1){if(!Array.isArray(r.messages))return null;for(let h of r.messages){if(!h||!["user","assistant"].includes(h.role)||typeof h.content!="string")return null;a.push({role:h.role,content:h.content,timestamp:s(h.timestamp)??o})}}else{if(!Array.isArray(r.turns))return null;let h=new Set,_=new Set;for(let y of r.turns){if(!y||typeof y.responseId!="string"||!y.responseId||typeof y.input?.text!="string")return null;if(h.has(y.responseId)){d=!0;continue}h.add(y.responseId);let f=s(y.startedAt),w=s(y.completedAt??y.endedAt);if(!f)return null;let g=typeof y.model=="string"?y.model:void 0;["complete","running","failed","aborted"].includes(y.status)||(d=!0);let E=y.status==="complete"?"complete":y.status==="running"?"in_progress":y.status==="failed"?"failed":y.status==="aborted"?"aborted":"unknown";u=E==="failed"||E==="unknown"?"aborted":E,(E!=="complete"||y.partial===!0)&&(d=!0);let b=Array.isArray(y.modelResponses),C=b?y.modelResponses:[],I=[];l.push({id:y.responseId,startedAt:f,completedAt:w,model:g,prompt:y.input.text,status:E,responseIds:I}),a.push({role:"user",timestamp:f,content:y.input.text});let N=Array.isArray(y.toolEvents)&&y.toolEvents.length>0;if(!b&&!N){let R=y.usage??{},x=Cg({...y,usage:R});Object.keys(x.rawUsage).length&&(l.at(-1).rawUsage=[{responseId:y.responseId,values:x.rawUsage}]),I.push(y.responseId),c.push({response_id:y.responseId,timestamp:(w??f).toISOString(),model:g??null,model_provider:typeof y.provider=="string"?y.provider:null,tokens:x.tokens,files_read:[],files_written:[],read_bytes:Buffer.byteLength(y.input.text,"utf8"),write_bytes:0,external_io:[{direction:"read",kind:"prompt",id:y.responseId,ref:null,bytes:Buffer.byteLength(y.input.text,"utf8"),basis:"input_text"}],pricing_facts:x.pricingFacts}),E!=="complete"&&!y.usage&&(d=!0),typeof y.output?.text=="string"&&a.push({role:"assistant",timestamp:w??f,content:y.output.text,model:g});continue}let A=new Map,S=new Map,v=new Set,T=[];for(let R of C){if(!R||typeof R!="object"||typeof R.responseId!="string"||!R.responseId){d=!0;continue}if(I.includes(R.responseId)){d=!0;continue}let x=R,k=T.length;T.push({response:x,index:k,filesRead:[],filesWritten:[],io:[]}),I.push(R.responseId),_.has(R.responseId)&&(d=!0),_.add(R.responseId),x.toolCalls!==void 0&&!Array.isArray(x.toolCalls)&&(d=!0,T[k].io.push({direction:"read",kind:"unattributed",id:R.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:R.responseId,ref:null,bytes:null,basis:"unknown"}));for(let L of Array.isArray(x.toolCalls)?x.toolCalls:[]){let F=Ig(L),D=uc(L);if(F)A.set(F,k),S.set(F,D);else{d=!0;let V=D==="list_directory"||D==="read_file"||D==="webget"||D==="shell"||D==="tool",B=D==="write_file"||D==="shell"||D==="tool";V&&T[k].io.push({direction:"read",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"}),B&&T[k].io.push({direction:"write",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"})}}}I.length===0&&C.length>0&&(d=!0);for(let R of Array.isArray(y.toolEvents)?y.toolEvents:[]){let x=R&&typeof R=="object"?R:{},k=Ig(x),L=k?A.get(k):void 0,F=uc(x),D=xg(x.result),V=x.status==="failed"||x.error!==void 0;if(x.type==="tool_call"?a.push({role:"tool_use",timestamp:s(x?.timestamp)??f,content:eo(x?.input??x?.args),toolName:F,toolInput:eo(x?.input??x?.args),toolInputData:xg(x?.input??x?.args)??void 0,...k?{toolCallId:k}:{}}):a.push({role:"tool_result",timestamp:s(x?.timestamp)??w??f,content:eo(V?x?.error:x?.result),toolName:F,...k?{toolCallId:k}:{}}),L===void 0){d=!0;continue}let B=T[L];(x.type==="tool_result"||V||x.result!==void 0)&&v.add(k);let Z=D?.path,H=Dt(D?.bytesRead??D?.bytesWritten);x.type!=="tool_call"&&(F==="read_file"&&!V&&typeof Z=="string"&&H!==null?B.filesRead.push({path:Z,bytes:H}):F==="write_file"&&!V&&typeof Z=="string"&&H!==null?B.filesWritten.push({path:Z,bytes:H}):F==="webget"&&!V&&H!==null?B.io.push({direction:"read",kind:"web",id:k,ref:Ag(D?.finalUrl??D?.url),bytes:H,basis:"certified_counter"}):F==="shell"||V?(F!=="write_file"&&B.io.push({direction:"read",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}),(F==="shell"||F==="write_file")&&B.io.push({direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"})):F==="list_directory"||F==="read_file"||F==="webget"?B.io.push({direction:"read",kind:F==="webget"?"web":"unattributed",id:k,ref:F==="webget"?Ag(D?.finalUrl??D?.url):null,bytes:null,basis:"unknown"}):F==="write_file"?B.io.push({direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}):B.io.push({direction:"read",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}))}for(let[R,x]of S)if(!v.has(R)){let k=T[A.get(R)],L=x==="list_directory"||x==="read_file"||x==="webget"||x==="shell",F=x==="write_file"||x==="shell";L&&k.io.push({direction:"read",kind:"unattributed",id:R,ref:null,bytes:null,basis:"unknown"}),F&&k.io.push({direction:"write",kind:"unattributed",id:R,ref:null,bytes:null,basis:"unknown"}),d=!0}for(let R of T){let x=R.response,k=Cg(x),L=s(x.completedAt??x.startedAt)??w??f;new Set((Array.isArray(x.toolCalls)?x.toolCalls:[]).map(B=>uc(B))).has("shell")&&!R.io.some(B=>B.kind==="unattributed"&&B.direction==="read")&&R.io.push({direction:"read",kind:"unattributed",id:x.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:x.responseId,ref:null,bytes:null,basis:"unknown"}),R.index===0&&R.io.unshift({direction:"read",kind:"prompt",id:y.responseId,ref:null,bytes:Buffer.byteLength(y.input.text,"utf8"),basis:"input_text"});let D=R.io.some(B=>B.direction==="read"&&B.bytes===null),V=R.io.some(B=>B.direction==="write"&&B.bytes===null);if(c.push({response_id:x.responseId,timestamp:L.toISOString(),model:typeof x.model=="string"?x.model:null,model_provider:typeof x.provider=="string"?x.provider:typeof y.provider=="string"?y.provider:null,tokens:k.tokens,files_read:D?null:R.filesRead,files_written:V?null:R.filesWritten,read_bytes:D?null:R.filesRead.reduce((B,Z)=>B+(Z.bytes??0),0)+R.io.filter(B=>B.direction==="read").reduce((B,Z)=>B+(Z.bytes??0),0),write_bytes:V?null:R.filesWritten.reduce((B,Z)=>B+(Z.bytes??0),0)+R.io.filter(B=>B.direction==="write").reduce((B,Z)=>B+(Z.bytes??0),0),external_io:R.io,pricing_facts:k.pricingFacts}),Object.keys(k.rawUsage).length){let B=l.at(-1);B.rawUsage=[...B.rawUsage??[],{responseId:x.responseId,values:k.rawUsage}]}}l.at(-1).responseIds=I,I.length!==C.length&&(d=!0),typeof y.output?.text=="string"&&a.push({role:"assistant",timestamp:w??f,content:y.output.text,model:g})}}let m=a.filter(h=>h.role==="user").map(h=>h.content),p=zi(c,!d);return{provider:"miniplayer",sessionId:e,cwd:r.cwd,filePath:n,createdAt:i,modifiedAt:o,model:typeof r.model=="string"?r.model:void 0,messages:a,messageCount:a.length,userPrompts:m,firstUserMessage:m[0],lastUserMessage:m.at(-1),turns:l,responses:c,turnStatus:u,...d?{captureStatus:"partial"}:{},totalInputTokens:p.input_uncached??void 0,totalCachedInputTokens:p.input_cached??void 0,totalCacheWriteInputTokens:p.input_cache_write??void 0,totalOutputTokens:p.output??void 0}}var vR,to,Ng=O(()=>{"use strict";oc();be();Sg();vR=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;to=class{name="miniplayer";home;constructor(e={}){this.home=mc(e.miniplayerHome)}getWatchPaths(){return[{directory:os(this.home,"sessions"),filePattern:/\.json$/}]}async discoverSessions(){let e;try{e=await _R(os(this.home,"sessions"))}catch{return[]}return(await Promise.all(e.filter(r=>r.endsWith(".json")).map(r=>this.loadSession(r.slice(0,-5))))).filter(r=>r!==null)}async resolveSessionPath(e){if(!vR.test(e))return null;let n=os(this.home,"sessions",`${e}.json`);try{return(await Rg(n)).isFile()?n:null}catch{return null}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;try{let r=wR(JSON.parse(await kg(n,"utf8")),e,n);if(!r)return null;let s="complete";try{let i=JSON.parse(await kg(`${n}.lock`,"utf8"));if(Number.isInteger(i.pid)&&i.pid>0)try{process.kill(i.pid,0),s="in_progress"}catch{s="aborted"}}catch{}return{...r,...s!=="complete"?{turnStatus:s}:{}}}catch{return null}}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{throw await Rg(`${n}.lock`),new Error("Cannot delete a locked miniplayer session")}catch(r){if(r.code!=="ENOENT")throw r}return await yR(n),!0}}});function Og(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let n=0;n<t.length;n++)n===0?e.push(t[n]):e.push(`
2056
2056
 
2057
2057
  --- additional response (turn ${n+1} of ${t.length}; likely an injected mid-call notification) ---
2058
2058
 
2059
- `+t[n]);return e.join("")}function Zi(t={}){let e=[],n="",r=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}t.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(n=i.session_id||n),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&t.onText?.(c.text)}o==="result"&&(r=!0,e.push(i))},sawResult(){return r},finalize(){if(!r)return null;let s=xg(e),i=Ig(s.resultTexts);return{result:i,sessionId:s.sessionId||n,durationMs:s.durationMs,numTurns:s.numTurns,isError:s.isError&&i.trim().length===0,errorMessage:s.errorMessage}}}}function xg(t){let e=[],n=0,r=0,s="",i=!1,o;for(let a of t){e.push(a.result||"");let l=a.duration_ms;typeof l=="number"&&Number.isFinite(l)&&(n+=l);let c=a.num_turns;typeof c=="number"&&Number.isFinite(c)&&(r=c);let d=a.session_id;if(typeof d=="string"&&d&&(s=d),a.is_error===!0){i=!0;let u=a.errors,m=Array.isArray(u)?u.filter(h=>typeof h=="string").join("; "):void 0,p=typeof a.subtype=="string"?a.subtype:"unknown";o=m&&m.length>0?m:`result subtype=${p} (no error detail provided)`}}return{resultTexts:e,durationMs:n,numTurns:r,sessionId:s,isError:i,errorMessage:o}}var cc=O(()=>{"use strict"});import{spawn as Cg}from"node:child_process";import{existsSync as Ng}from"node:fs";import{join as eo}from"node:path";import{readdir as fR}from"node:fs/promises";function Og(){let t=process.env.LMCTL_RESULT_GRACE_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return 72e5;let e=Number(t);return Number.isFinite(e)&&e>0?e:72e5}function Lg(){let t=process.env.LMCTL_TOOL_USE_GRACE_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return 27e5;let e=Number(t);return Number.isFinite(e)&&e>0?e:27e5}function Mg(t){let n=t.message?.content;return Array.isArray(n)?n.some(r=>r?.type==="tool_use"):!1}function hR(t){let e=t.stderr.trim(),n=`lmctl: ${t.tool} exited with code ${t.exitCode} before returning a final result event.
2059
+ `+t[n]);return e.join("")}function no(t={}){let e=[],n="",r=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}t.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(n=i.session_id||n),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&t.onText?.(c.text)}o==="result"&&(r=!0,e.push(i))},sawResult(){return r},finalize(){if(!r)return null;let s=Lg(e),i=Og(s.resultTexts);return{result:i,sessionId:s.sessionId||n,durationMs:s.durationMs,numTurns:s.numTurns,isError:s.isError&&i.trim().length===0,errorMessage:s.errorMessage}}}}function Lg(t){let e=[],n=0,r=0,s="",i=!1,o;for(let a of t){e.push(a.result||"");let l=a.duration_ms;typeof l=="number"&&Number.isFinite(l)&&(n+=l);let c=a.num_turns;typeof c=="number"&&Number.isFinite(c)&&(r=c);let d=a.session_id;if(typeof d=="string"&&d&&(s=d),a.is_error===!0){i=!0;let u=a.errors,m=Array.isArray(u)?u.filter(h=>typeof h=="string").join("; "):void 0,p=typeof a.subtype=="string"?a.subtype:"unknown";o=m&&m.length>0?m:`result subtype=${p} (no error detail provided)`}}return{resultTexts:e,durationMs:n,numTurns:r,sessionId:s,isError:i,errorMessage:o}}var pc=O(()=>{"use strict"});import{spawn as Pg}from"node:child_process";import{existsSync as Dg}from"node:fs";import{join as ro}from"node:path";import{readdir as TR}from"node:fs/promises";function Fg(){let t=process.env.LMCTL_RESULT_GRACE_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return 72e5;let e=Number(t);return Number.isFinite(e)&&e>0?e:72e5}function $g(){let t=process.env.LMCTL_TOOL_USE_GRACE_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return 27e5;let e=Number(t);return Number.isFinite(e)&&e>0?e:27e5}function jg(t){let n=t.message?.content;return Array.isArray(n)?n.some(r=>r?.type==="tool_use"):!1}function SR(t){let e=t.stderr.trim(),n=`lmctl: ${t.tool} exited with code ${t.exitCode} before returning a final result event.
2060
2060
  One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return e?`Original provider error:
2061
2061
  ${ge(e,{provider:t.tool})}
2062
2062
 
2063
- ${n}`:n}function Pg(t){let e=t.tool||"claude",n=t.binaryPath||gR[e]||"claude",r=["-p","","--output-format","stream-json","--input-format","stream-json"];e==="claude"&&r.push("--verbose"),t.sessionId&&r.push("--resume",t.sessionId),t.model&&r.push("--model",t.model);let s=t.permissionMode??"yolo",i=en(e,s)??_R[e]??["--dangerously-skip-permissions"];if(r.push(...i),Te(e,r,s),t.cwd&&!Ng(t.cwd))throw U({event:"transport_error",provider:e,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),new de(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});let o=we(t.env,t.cwd,t.sessionId);return{tool:e,binary:n,args:r,spawnEnv:e==="claude"?Af(o):o}}function Dg(t,e){return new Promise((n,r)=>{let s=Date.now(),i,o,a,l;try{({tool:i,binary:o,args:a,spawnEnv:l}=Pg(e))}catch(H){return r(H instanceof Error?H:new Error(String(H)))}let c=Cg(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:l});c.stdin?.on("error",H=>{Se(`stream-json: stdin pipe error, ignored (exit handler reports): ${H.message}`)});let d=!1;if(e.signal){if(e.signal.aborted)return d=!0,U({event:"transport_abort",provider:i,phase:"pre_spawn"}),te(c).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,U({event:"transport_abort",provider:i}),te(c).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let u="",m=!1,p=!1,h=0,_=!1,y="",f="",w,g,E=null,b=null,C=!1,I=!1,N=Og(),A=Lg();function S(){w!==void 0&&(clearTimeout(w),w=void 0)}function v(){g!==void 0&&(clearTimeout(g),g=void 0)}let T=null;function R(){return m||d||F.sawResult()}function x(H){return H==="text_done"?N:A}async function k(H){if(H==="text_done"?w=void 0:g=void 0,R()||E!==null)return;T??=Date.now();let z=x(H);if(e.holdOpen){let pe=(e.holdOpen.maxHoldMs??Di)-(Date.now()-T),Ie=pe>0?await Fi(Promise.resolve(e.holdOpen.hasOutstandingWork()).catch(()=>!1),pe,e.signal):!1;if(R()||(H==="text_done"?w!==void 0:g!==void 0))return;if(Ie===!0){U({event:"transport_stall_grace_deferred",provider:i,grace_kind:H,grace_ms:z,reason:"outstanding_dispatched_work"}),L(H);return}}b=H,E=H==="text_done"?`${i} finished responding but never emitted its closing result event (${z}ms of silence after its last message)`:`${i} went silent mid-turn and never emitted its closing result event (${z}ms of silence)`,U({event:"transport_stall_grace_fired",provider:i,grace_kind:H,grace_ms:z}),te(c).catch(()=>{})}function L(H){let z=setTimeout(()=>{k(H)},x(H));z.unref?.(),H==="text_done"?(S(),w=z):(v(),g=z)}let F=Zi({onEvent:H=>{h=Date.now(),_=H.type!=="result",H.type==="system"&&H.subtype==="init"&&(f=H.session_id||f),H.type==="assistant"?(C=!Mg(H),I=C&&H.message?.stop_reason==="pause_turn"):(H.type==="result"||H.type==="user")&&(C=!1,I=!1),S(),i==="claude"&&C&&!I&&!F.sawResult()&&L("text_done"),v(),i==="claude"&&!F.sawResult()&&L("tool_use_silence"),e.onEvent?.(H)},onText:H=>{y+=H,e.onText?.(H)}});function D(){p||(p=!0,_t(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>m,isTurnInFlight:()=>_,lastEventAtMs:()=>h,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function V(H){let z=F.sawResult();F.processLine(H),!z&&F.sawResult()&&D()}c.stdout?.on("data",H=>{u+=H.toString();let z=u.split(`
2063
+ ${n}`:n}function Ug(t){let e=t.tool||"claude",n=t.binaryPath||bR[e]||"claude",r=["-p","","--output-format","stream-json","--input-format","stream-json"];e==="claude"&&r.push("--verbose"),t.sessionId&&r.push("--resume",t.sessionId),t.model&&r.push("--model",t.model);let s=t.permissionMode??"yolo",i=tn(e,s)??kR[e]??["--dangerously-skip-permissions"];if(r.push(...i),Te(e,r,s),t.cwd&&!Dg(t.cwd))throw U({event:"transport_error",provider:e,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),new de(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});let o=we(t.env,t.cwd,t.sessionId);return{tool:e,binary:n,args:r,spawnEnv:e==="claude"?Mf(o):o}}function Hg(t,e){return new Promise((n,r)=>{let s=Date.now(),i,o,a,l;try{({tool:i,binary:o,args:a,spawnEnv:l}=Ug(e))}catch(H){return r(H instanceof Error?H:new Error(String(H)))}let c=Pg(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:l});c.stdin?.on("error",H=>{Se(`stream-json: stdin pipe error, ignored (exit handler reports): ${H.message}`)});let d=!1;if(e.signal){if(e.signal.aborted)return d=!0,U({event:"transport_abort",provider:i,phase:"pre_spawn"}),te(c).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,U({event:"transport_abort",provider:i}),te(c).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let u="",m=!1,p=!1,h=0,_=!1,y="",f="",w,g,E=null,b=null,C=!1,I=!1,N=Fg(),A=$g();function S(){w!==void 0&&(clearTimeout(w),w=void 0)}function v(){g!==void 0&&(clearTimeout(g),g=void 0)}let T=null;function R(){return m||d||F.sawResult()}function x(H){return H==="text_done"?N:A}async function k(H){if(H==="text_done"?w=void 0:g=void 0,R()||E!==null)return;T??=Date.now();let z=x(H);if(e.holdOpen){let pe=(e.holdOpen.maxHoldMs??ji)-(Date.now()-T),Ie=pe>0?await Ui(Promise.resolve(e.holdOpen.hasOutstandingWork()).catch(()=>!1),pe,e.signal):!1;if(R()||(H==="text_done"?w!==void 0:g!==void 0))return;if(Ie===!0){U({event:"transport_stall_grace_deferred",provider:i,grace_kind:H,grace_ms:z,reason:"outstanding_dispatched_work"}),L(H);return}}b=H,E=H==="text_done"?`${i} finished responding but never emitted its closing result event (${z}ms of silence after its last message)`:`${i} went silent mid-turn and never emitted its closing result event (${z}ms of silence)`,U({event:"transport_stall_grace_fired",provider:i,grace_kind:H,grace_ms:z}),te(c).catch(()=>{})}function L(H){let z=setTimeout(()=>{k(H)},x(H));z.unref?.(),H==="text_done"?(S(),w=z):(v(),g=z)}let F=no({onEvent:H=>{h=Date.now(),_=H.type!=="result",H.type==="system"&&H.subtype==="init"&&(f=H.session_id||f),H.type==="assistant"?(C=!jg(H),I=C&&H.message?.stop_reason==="pause_turn"):(H.type==="result"||H.type==="user")&&(C=!1,I=!1),S(),i==="claude"&&C&&!I&&!F.sawResult()&&L("text_done"),v(),i==="claude"&&!F.sawResult()&&L("tool_use_silence"),e.onEvent?.(H)},onText:H=>{y+=H,e.onText?.(H)}});function D(){p||(p=!0,yt(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>m,isTurnInFlight:()=>_,lastEventAtMs:()=>h,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function V(H){let z=F.sawResult();F.processLine(H),!z&&F.sawResult()&&D()}c.stdout?.on("data",H=>{u+=H.toString();let z=u.split(`
2064
2064
  `);u=z.pop()||"";for(let se of z)V(se)});let B="";c.stderr?.on("data",H=>{B+=H.toString()}),c.on("error",H=>{U({event:"transport_error",provider:i,error_class:"TransportConnectionError",error_message:H.message}),r(new de(`Failed to spawn ${o}: ${H.message}`,{cause:H}))}),c.on("exit",H=>{if(m=!0,S(),v(),d)return;u.trim()&&V(u);let z=F.finalize();if(z?.isError)U({event:"transport_error",provider:i,error_class:"Error",reason:"provider_result_error",error_message:z.errorMessage}),r(new Error(`${i} reported an error for this turn (no assistant output)`+(e.sessionId?` \u2014 session=${e.sessionId}`:"")+`: ${z.errorMessage??"unknown error"}`));else if(z)Se(`stream-json: result ${z.result.slice(0,80)}${z.result.length>80?"...":""} (${z.durationMs}ms)`),n({result:z.result,sessionId:z.sessionId,durationMs:z.durationMs,numTurns:z.numTurns,exitCode:H});else if(E!==null&&b==="text_done"&&y.trim().length>0)U({event:"transport_stall_finalized",provider:i,reason:E,text_len:y.length}),n({result:y,sessionId:f||e.sessionId||"",durationMs:Date.now()-s,numTurns:1,exitCode:H,warnings:[E]});else if(E!==null&&b==="tool_use_silence"){let se=B.trim()?`
2065
2065
  ${ge(B,{provider:i})}`:"",pe=`${E} \u2014 a tool call was still in flight, so any streamed text is incomplete mid-turn narration, not a real answer`+(e.sessionId?` (session=${e.sessionId})`:"")+se;U({event:"transport_error",provider:i,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:H,stderr_summary:pe}),r(new Error(pe))}else{let se=E!==null?`${E} \u2014 and produced no usable content to fall back on`+(e.sessionId?` (session=${e.sessionId})`:"")+(B.trim()?`
2066
- ${ge(B,{provider:i})}`:""):hR({tool:i,exitCode:H,stderr:B});U({event:"transport_error",provider:i,error_class:"Error",reason:E!==null?"provider_stalled_no_content":"provider_no_result",exit_code:H,stderr_summary:se}),r(new Error(se))}});let Z=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(Z+`
2067
- `),Se(`stream-json: prompt sent (${t.length} chars)`)})}function yR(t){return t==="qwen"?[eo(K,".qwen","projects")]:[eo(K,".claude","projects")]}async function Ag(t,e,n){let r=n??yR(t),s=null;for(let a of r){let l;try{l=await fR(a)}catch{continue}for(let c of l){for(let d of[eo(a,c,`${e}.jsonl`),eo(a,c,"chats",`${e}.jsonl`)])if(Ng(d)){s=d;break}if(s!==null)break}if(s!==null)break}if(s===null)throw new Error(`stream-json bundle: no session file for session "${e}" under ${r.join(", ")} \u2014 the session must exist on disk before a bundle can resume it`);let o=(await Je(s,5).catch(()=>[])).map(a=>a?.sessionId).find(a=>typeof a=="string"&&a.length>0);if(o!==e)throw new Error(`stream-json bundle: session file ${s} header does not match the requested session (expected "${e}", header carries ${o??"no sessionId"}) \u2014 the session was likely re-seeded externally; aborting instead of writing into the wrong session`)}async function Fg(t){let{tool:e,binary:n,args:r,spawnEnv:s}=Pg(t),i=Cg(n,r,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:s}),o=Date.now();i.stdin?.on("error",P=>{Se(`stream-json bundle: stdin pipe error, ignored (exit handler reports): ${P.message}`)});let a={exited:!1,exitCode:null,lastEventAtMs:0,turnActive:!1,completedTurns:0,closed:!1,closing:null},l=t.sessionId||"",c=null,d="";i.stderr?.on("data",P=>{d+=P.toString()});let u="",m="",p=!1,h=!1,_=null,y=null,f=null,w,g,E=Og(),b=Lg(),C=null,I=[],N=()=>a.exited?Promise.resolve():new Promise(P=>{I.push(P)}),A=()=>new Error(`stream-json bundle process (${e}) exited${a.exitCode!==null?` with code ${a.exitCode}`:""} after ${a.completedTurns} completed prompt(s); the bundle cannot continue`);function S(){w!==void 0&&(clearTimeout(w),w=void 0)}function v(){g!==void 0&&(clearTimeout(g),g=void 0)}function T(){return a.exited||C===null||C.aborted||C.processor.sawResult()}function R(P){return P==="text_done"?E:b}async function x(P){if(P==="text_done"?w=void 0:g=void 0,T()||_!==null)return;f??=Date.now();let X=R(P);if(t.holdOpen){let tt=(t.holdOpen.maxHoldMs??Di)-(Date.now()-f),As=tt>0?await Fi(Promise.resolve(t.holdOpen.hasOutstandingWork()).catch(()=>!1),tt,void 0):!1;if(T()||(P==="text_done"?w!==void 0:g!==void 0))return;if(As===!0){U({event:"transport_stall_grace_deferred",provider:e,grace_kind:P,grace_ms:X,reason:"outstanding_dispatched_work"}),k(P);return}}y=P,_=P==="text_done"?`${e} finished responding but never emitted its closing result event (${X}ms of silence after its last message)`:`${e} went silent mid-turn and never emitted its closing result event (${X}ms of silence)`,U({event:"transport_stall_grace_fired",provider:e,grace_kind:P,grace_ms:X}),te(i).catch(()=>{})}function k(P){let X=setTimeout(()=>{x(P)},R(P));X.unref?.(),P==="text_done"?(S(),w=X):(v(),g=X)}let L=!1,F,D,V=new Promise((P,X)=>{F=P,D=X});V.catch(()=>{});let B=setTimeout(()=>{L||(L=!0,D(new Error(`stream-json bundle: ${e} emitted no init event within the open timeout \u2014 cannot verify the resumed session identity`)))},t.closeTimeoutMs!==void 0?Math.max(t.closeTimeoutMs,5e3):3e4);B.unref?.();function Z(P){L||(L=!0,clearTimeout(B),P?D(P):F())}let H="";function z(P){if(a.lastEventAtMs=Date.now(),P.type==="system"&&P.subtype==="init"){if(m=P.session_id||m,t.sessionId&&typeof P.session_id=="string"&&P.session_id.length>0&&P.session_id!==t.sessionId){let ie=new Error(`stream-json bundle: provider resumed a different session (init reported "${P.session_id}", expected "${t.sessionId}")`);Z(ie),te(i).catch(()=>{});return}Z()}let X=C?.processor.sawResult()??!0;P.type==="assistant"?(p=!Mg(P),h=p&&P.message?.stop_reason==="pause_turn"):(P.type==="result"||P.type==="user")&&(p=!1,h=!1),S(),e==="claude"&&a.turnActive&&p&&!h&&!X&&k("text_done"),v(),e==="claude"&&a.turnActive&&!X&&k("tool_use_silence")}function se(){let P=C;if(P===null)return;let X=P.processor.finalize();if(X!==null){if(C=null,a.turnActive=!1,S(),v(),X.isError){U({event:"transport_error",provider:e,error_class:"Error",reason:"provider_result_error",error_message:X.errorMessage}),P.reject(new Error(`${e} reported an error for this turn (no assistant output)`+(t.sessionId?` \u2014 session=${t.sessionId}`:"")+`: ${X.errorMessage??"unknown error"}`));return}a.completedTurns+=1,l=X.sessionId||l,Se(`stream-json bundle: result ${X.result.slice(0,80)}${X.result.length>80?"...":""} (${X.durationMs}ms)`),P.resolve({result:X.result,sessionId:X.sessionId||l,durationMs:X.durationMs,numTurns:X.numTurns})}}function pe(P){if(!P.trim())return;let X;try{X=JSON.parse(P)}catch{return}z(X);let ie=C;if(ie!==null){let tt=ie.processor.sawResult();ie.processor.processLine(P),ie.onEventForward?.(X),!tt&&ie.processor.sawResult()&&se()}}i.stdout?.on("data",P=>{H+=P.toString();let X=H.split(`
2066
+ ${ge(B,{provider:i})}`:""):SR({tool:i,exitCode:H,stderr:B});U({event:"transport_error",provider:i,error_class:"Error",reason:E!==null?"provider_stalled_no_content":"provider_no_result",exit_code:H,stderr_summary:se}),r(new Error(se))}});let Z=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(Z+`
2067
+ `),Se(`stream-json: prompt sent (${t.length} chars)`)})}function RR(t){return t==="qwen"?[ro(K,".qwen","projects")]:[ro(K,".claude","projects")]}async function Mg(t,e,n){let r=n??RR(t),s=null;for(let a of r){let l;try{l=await TR(a)}catch{continue}for(let c of l){for(let d of[ro(a,c,`${e}.jsonl`),ro(a,c,"chats",`${e}.jsonl`)])if(Dg(d)){s=d;break}if(s!==null)break}if(s!==null)break}if(s===null)throw new Error(`stream-json bundle: no session file for session "${e}" under ${r.join(", ")} \u2014 the session must exist on disk before a bundle can resume it`);let o=(await Je(s,5).catch(()=>[])).map(a=>a?.sessionId).find(a=>typeof a=="string"&&a.length>0);if(o!==e)throw new Error(`stream-json bundle: session file ${s} header does not match the requested session (expected "${e}", header carries ${o??"no sessionId"}) \u2014 the session was likely re-seeded externally; aborting instead of writing into the wrong session`)}async function Bg(t){let{tool:e,binary:n,args:r,spawnEnv:s}=Ug(t),i=Pg(n,r,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:s}),o=Date.now();i.stdin?.on("error",P=>{Se(`stream-json bundle: stdin pipe error, ignored (exit handler reports): ${P.message}`)});let a={exited:!1,exitCode:null,lastEventAtMs:0,turnActive:!1,completedTurns:0,closed:!1,closing:null},l=t.sessionId||"",c=null,d="";i.stderr?.on("data",P=>{d+=P.toString()});let u="",m="",p=!1,h=!1,_=null,y=null,f=null,w,g,E=Fg(),b=$g(),C=null,I=[],N=()=>a.exited?Promise.resolve():new Promise(P=>{I.push(P)}),A=()=>new Error(`stream-json bundle process (${e}) exited${a.exitCode!==null?` with code ${a.exitCode}`:""} after ${a.completedTurns} completed prompt(s); the bundle cannot continue`);function S(){w!==void 0&&(clearTimeout(w),w=void 0)}function v(){g!==void 0&&(clearTimeout(g),g=void 0)}function T(){return a.exited||C===null||C.aborted||C.processor.sawResult()}function R(P){return P==="text_done"?E:b}async function x(P){if(P==="text_done"?w=void 0:g=void 0,T()||_!==null)return;f??=Date.now();let X=R(P);if(t.holdOpen){let nt=(t.holdOpen.maxHoldMs??ji)-(Date.now()-f),Os=nt>0?await Ui(Promise.resolve(t.holdOpen.hasOutstandingWork()).catch(()=>!1),nt,void 0):!1;if(T()||(P==="text_done"?w!==void 0:g!==void 0))return;if(Os===!0){U({event:"transport_stall_grace_deferred",provider:e,grace_kind:P,grace_ms:X,reason:"outstanding_dispatched_work"}),k(P);return}}y=P,_=P==="text_done"?`${e} finished responding but never emitted its closing result event (${X}ms of silence after its last message)`:`${e} went silent mid-turn and never emitted its closing result event (${X}ms of silence)`,U({event:"transport_stall_grace_fired",provider:e,grace_kind:P,grace_ms:X}),te(i).catch(()=>{})}function k(P){let X=setTimeout(()=>{x(P)},R(P));X.unref?.(),P==="text_done"?(S(),w=X):(v(),g=X)}let L=!1,F,D,V=new Promise((P,X)=>{F=P,D=X});V.catch(()=>{});let B=setTimeout(()=>{L||(L=!0,D(new Error(`stream-json bundle: ${e} emitted no init event within the open timeout \u2014 cannot verify the resumed session identity`)))},t.closeTimeoutMs!==void 0?Math.max(t.closeTimeoutMs,5e3):3e4);B.unref?.();function Z(P){L||(L=!0,clearTimeout(B),P?D(P):F())}let H="";function z(P){if(a.lastEventAtMs=Date.now(),P.type==="system"&&P.subtype==="init"){if(m=P.session_id||m,t.sessionId&&typeof P.session_id=="string"&&P.session_id.length>0&&P.session_id!==t.sessionId){let ie=new Error(`stream-json bundle: provider resumed a different session (init reported "${P.session_id}", expected "${t.sessionId}")`);Z(ie),te(i).catch(()=>{});return}Z()}let X=C?.processor.sawResult()??!0;P.type==="assistant"?(p=!jg(P),h=p&&P.message?.stop_reason==="pause_turn"):(P.type==="result"||P.type==="user")&&(p=!1,h=!1),S(),e==="claude"&&a.turnActive&&p&&!h&&!X&&k("text_done"),v(),e==="claude"&&a.turnActive&&!X&&k("tool_use_silence")}function se(){let P=C;if(P===null)return;let X=P.processor.finalize();if(X!==null){if(C=null,a.turnActive=!1,S(),v(),X.isError){U({event:"transport_error",provider:e,error_class:"Error",reason:"provider_result_error",error_message:X.errorMessage}),P.reject(new Error(`${e} reported an error for this turn (no assistant output)`+(t.sessionId?` \u2014 session=${t.sessionId}`:"")+`: ${X.errorMessage??"unknown error"}`));return}a.completedTurns+=1,l=X.sessionId||l,Se(`stream-json bundle: result ${X.result.slice(0,80)}${X.result.length>80?"...":""} (${X.durationMs}ms)`),P.resolve({result:X.result,sessionId:X.sessionId||l,durationMs:X.durationMs,numTurns:X.numTurns})}}function pe(P){if(!P.trim())return;let X;try{X=JSON.parse(P)}catch{return}z(X);let ie=C;if(ie!==null){let nt=ie.processor.sawResult();ie.processor.processLine(P),ie.onEventForward?.(X),!nt&&ie.processor.sawResult()&&se()}}i.stdout?.on("data",P=>{H+=P.toString();let X=H.split(`
2068
2068
  `);H=X.pop()||"";for(let ie of X)pe(ie)}),i.on("error",P=>{if(c=new de(`Failed to spawn ${n}: ${P.message}`,{cause:P}),U({event:"transport_error",provider:e,error_class:"TransportConnectionError",error_message:P.message}),Z(c),C!==null){let X=C;C=null,a.turnActive=!1,X.reject(c)}}),i.on("exit",P=>{a.exited=!0,a.exitCode=P,S(),v(),H.trim()&&pe(H),Z(a.exited&&!L?new Error(`stream-json bundle: ${e} exited (code ${String(P)}) before its init event`):void 0);let X=C;if(X!==null&&(C=null,a.turnActive=!1,!X.aborted))if(_!==null&&y==="text_done"&&u.trim().length>0)U({event:"transport_stall_finalized",provider:e,reason:_,text_len:u.length}),X.resolve({result:u,sessionId:m||t.sessionId||"",durationMs:Date.now()-X.startMs,numTurns:1,warnings:[_]});else if(_!==null&&y==="tool_use_silence"){let ie=d.trim()?ge(d,{provider:e}):"";U({event:"transport_error",provider:e,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:P,...ie?{stderr_summary:ie}:{}}),X.reject(new Error(`${_} \u2014 a tool call was still in flight, so any streamed text is incomplete mid-turn narration, not a real answer`+(t.sessionId?` (session=${t.sessionId})`:"")+(ie?`
2069
- ${ie}`:"")))}else{let ie=A(),tt=d.trim()?ge(d,{provider:e}):"";U({event:"transport_error",provider:e,error_class:"Error",reason:_!==null?"provider_stalled_no_content":"provider_no_result",exit_code:P,...tt?{stderr_summary:tt}:{}}),X.reject(tt?new Error(`${ie.message}
2070
- ${tt}`):ie)}for(let ie of I.splice(0))ie()});try{t.sessionId&&await Ag(e,t.sessionId,t.sessionFileRoots),await V}catch(P){let X=c??(P instanceof Error?P:new Error(String(P))),ie=t.closeTimeoutMs??2e3;throw await te(i,{softDelayMs:Math.min(1e3,ie),killDelayMs:Math.min(1e3,ie)}).catch(()=>{}),X}let Ie=P=>new Promise(X=>{setTimeout(X,P).unref?.()});return{tool:e,get sessionId(){return l},get completedTurns(){return a.completedTurns},async sendTurn(P,X={}){if(a.closed||a.closing!==null)throw new Error(`stream-json bundle session (${e}) is closed`);if(a.exited)throw A();if(C!==null)throw new Error(`stream-json bundle session (${e}) has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending`);let ie=()=>(a.closed=!0,te(i).catch(()=>{}),new Error("Aborted"));if(X.signal?.aborted)throw ie();if(t.sessionId&&(await Ag(e,t.sessionId,t.sessionFileRoots),a.exited))throw A();if(X.signal?.aborted)throw ie();return u="",p=!1,h=!1,_=null,y=null,f=null,new Promise((tt,As)=>{let sa={processor:Zi({onText:Eu=>{u+=Eu,X.onText?.(Eu)}}),resolve:tt,reject:As,startMs:Date.now(),aborted:!1,onEventForward:X.onEvent};C=sa,a.turnActive=!0;let Dv=()=>{sa.aborted=!0,U({event:"transport_abort",provider:e}),a.closed=!0,te(i).catch(()=>{}),C===sa&&(C=null,a.turnActive=!1),As(new Error("Aborted"))};X.signal?.addEventListener("abort",Dv,{once:!0});let Fv=JSON.stringify({type:"user",message:{role:"user",content:P}});i.stdin?.write(`${Fv}
2071
- `),Se(`stream-json bundle: prompt sent (${P.length} chars)`)})},close(){return a.closing!==null||(a.closing=(async()=>{if(a.closed=!0,!a.exited&&(t.holdOpen!==void 0?await new Promise(P=>{_t(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>a.exited,isTurnInFlight:()=>a.turnActive,lastEventAtMs:()=>a.lastEventAtMs,closeStdin:()=>{i.stdin?.end(),P()},label:e})}):i.stdin?.end(),!a.exited)){let P=t.closeTimeoutMs??2e3;await Promise.race([N(),Ie(P)]),a.exited||await te(i,{stdinEnd:!1,softDelayMs:Math.min(1e3,P),killDelayMs:Math.min(1e3,P)}).catch(()=>{})}})()),a.closing}}}var gR,_R,dc=O(()=>{"use strict";kn();Rn();yt();oe();qr();at();cc();be();ot();cc();gR={claude:"claude",qwen:"qwen"};_R={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function to(t={}){return[]}var uc=O(()=>{"use strict"});function mc(t){return t==="plan"?"read-only":"danger-full-access"}function $g(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function no(){return{agentItems:new Map,resultText:""}}function nr(t,e,n,r){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),n?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,n?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(r&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;r({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function ro(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function jg(t){let e=t.params,n=e?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function so(){return{pendingCodexError:null}}function io(t,e){let n=jg(t);return n.willRetry||(e.pendingCodexError=n.turnError),n}function oo(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let r=t.params?.turn;if((typeof r?.status=="string"?r.status:void 0)==="failed"){let i=r?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var pc=O(()=>{"use strict"});import{spawn as Ug}from"node:child_process";import{createInterface as Hg}from"node:readline";import{existsSync as ER,readFileSync as vR}from"node:fs";import{fileURLToPath as wR}from"node:url";function Bg(){return $g(TR)}function rn(t,e){Se(`[codex:${t}] ${JSON.stringify(e)}`)}function bR(t){let e=t.stderr.trim(),n=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
2069
+ ${ie}`:"")))}else{let ie=A(),nt=d.trim()?ge(d,{provider:e}):"";U({event:"transport_error",provider:e,error_class:"Error",reason:_!==null?"provider_stalled_no_content":"provider_no_result",exit_code:P,...nt?{stderr_summary:nt}:{}}),X.reject(nt?new Error(`${ie.message}
2070
+ ${nt}`):ie)}for(let ie of I.splice(0))ie()});try{t.sessionId&&await Mg(e,t.sessionId,t.sessionFileRoots),await V}catch(P){let X=c??(P instanceof Error?P:new Error(String(P))),ie=t.closeTimeoutMs??2e3;throw await te(i,{softDelayMs:Math.min(1e3,ie),killDelayMs:Math.min(1e3,ie)}).catch(()=>{}),X}let Ie=P=>new Promise(X=>{setTimeout(X,P).unref?.()});return{tool:e,get sessionId(){return l},get completedTurns(){return a.completedTurns},async sendTurn(P,X={}){if(a.closed||a.closing!==null)throw new Error(`stream-json bundle session (${e}) is closed`);if(a.exited)throw A();if(C!==null)throw new Error(`stream-json bundle session (${e}) has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending`);let ie=()=>(a.closed=!0,te(i).catch(()=>{}),new Error("Aborted"));if(X.signal?.aborted)throw ie();if(t.sessionId&&(await Mg(e,t.sessionId,t.sessionFileRoots),a.exited))throw A();if(X.signal?.aborted)throw ie();return u="",p=!1,h=!1,_=null,y=null,f=null,new Promise((nt,Os)=>{let aa={processor:no({onText:bu=>{u+=bu,X.onText?.(bu)}}),resolve:nt,reject:Os,startMs:Date.now(),aborted:!1,onEventForward:X.onEvent};C=aa,a.turnActive=!0;let Hv=()=>{aa.aborted=!0,U({event:"transport_abort",provider:e}),a.closed=!0,te(i).catch(()=>{}),C===aa&&(C=null,a.turnActive=!1),Os(new Error("Aborted"))};X.signal?.addEventListener("abort",Hv,{once:!0});let Bv=JSON.stringify({type:"user",message:{role:"user",content:P}});i.stdin?.write(`${Bv}
2071
+ `),Se(`stream-json bundle: prompt sent (${P.length} chars)`)})},close(){return a.closing!==null||(a.closing=(async()=>{if(a.closed=!0,!a.exited&&(t.holdOpen!==void 0?await new Promise(P=>{yt(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>a.exited,isTurnInFlight:()=>a.turnActive,lastEventAtMs:()=>a.lastEventAtMs,closeStdin:()=>{i.stdin?.end(),P()},label:e})}):i.stdin?.end(),!a.exited)){let P=t.closeTimeoutMs??2e3;await Promise.race([N(),Ie(P)]),a.exited||await te(i,{stdinEnd:!1,softDelayMs:Math.min(1e3,P),killDelayMs:Math.min(1e3,P)}).catch(()=>{})}})()),a.closing}}}var bR,kR,fc=O(()=>{"use strict";In();xn();Et();oe();Kr();lt();pc();be();at();pc();bR={claude:"claude",qwen:"qwen"};kR={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function so(t={}){return[]}var gc=O(()=>{"use strict"});function hc(t){return t==="plan"?"read-only":"danger-full-access"}function Wg(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function io(){return{agentItems:new Map,resultText:""}}function ir(t,e,n,r){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),n?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,n?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(r&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;r({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function oo(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function Xg(t){let e=t.params,n=e?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function ao(){return{pendingCodexError:null}}function lo(t,e){let n=Xg(t);return n.willRetry||(e.pendingCodexError=n.turnError),n}function co(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let r=t.params?.turn;if((typeof r?.status=="string"?r.status:void 0)==="failed"){let i=r?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var _c=O(()=>{"use strict"});import{spawn as qg}from"node:child_process";import{createInterface as Gg}from"node:readline";import{existsSync as IR,readFileSync as xR}from"node:fs";import{fileURLToPath as AR}from"node:url";function Jg(){return Wg(CR)}function sn(t,e){Se(`[codex:${t}] ${JSON.stringify(e)}`)}function NR(t){let e=t.stderr.trim(),n=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
2072
2072
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
2073
2073
  ${ge(e,{provider:"codex"})}
2074
2074
 
2075
- ${n}`:n}function Wg(t){let e=t.binaryPath||"codex",n=["app-server","--listen","stdio://"];t.model&&n.push("-c",`model=${JSON.stringify(t.model)}`);let r=t.isLead??t.alias?.toLowerCase()==="lead",s=r?to():[];n.push(...s),he()&&Ge(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:r,injected:s.length>0}));let i=t.permissionMode??"yolo",o=mc(i);if(Te("codex",n,i),t.cwd&&!ER(t.cwd))throw U({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),new de(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:e,codexArgs:n,sandbox:o,permissionMode:i,spawnEnv:we(t.env,t.cwd,t.threadId)}}function Xg(t,e){return new Promise((n,r)=>{let s,i,o;try{({binary:s,codexArgs:i,sandbox:o}=Wg(e))}catch(I){return r(I instanceof Error?I:new Error(String(I)))}let a=Ug(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:we(e.env,e.cwd,e.threadId)}),l=!1;if(e.signal){if(e.signal.aborted)return l=!0,U({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),te(a).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{l=!0,U({event:"transport_abort",provider:"codex"}),te(a).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let c=Hg({input:a.stdout}),d=new Map,u=1,m=e.threadId||"",p="",h=!1,_=!1,y=Date.now(),f=no(),w=so();function g(I,N={}){return new Promise((A,S)=>{let v=u++;d.set(v,{resolve:A,reject:S});let T=JSON.stringify({jsonrpc:"2.0",id:v,method:I,params:N});a.stdin?.write(T+`
2075
+ ${n}`:n}function Kg(t){let e=t.binaryPath||"codex",n=["app-server","--listen","stdio://"];t.model&&n.push("-c",`model=${JSON.stringify(t.model)}`);let r=t.isLead??t.alias?.toLowerCase()==="lead",s=r?so():[];n.push(...s),he()&&Ge(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:r,injected:s.length>0}));let i=t.permissionMode??"yolo",o=hc(i);if(Te("codex",n,i),t.cwd&&!IR(t.cwd))throw U({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),new de(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:e,codexArgs:n,sandbox:o,permissionMode:i,spawnEnv:we(t.env,t.cwd,t.threadId)}}function Vg(t,e){return new Promise((n,r)=>{let s,i,o;try{({binary:s,codexArgs:i,sandbox:o}=Kg(e))}catch(I){return r(I instanceof Error?I:new Error(String(I)))}let a=qg(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:we(e.env,e.cwd,e.threadId)}),l=!1;if(e.signal){if(e.signal.aborted)return l=!0,U({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),te(a).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{l=!0,U({event:"transport_abort",provider:"codex"}),te(a).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let c=Gg({input:a.stdout}),d=new Map,u=1,m=e.threadId||"",p="",h=!1,_=!1,y=Date.now(),f=io(),w=ao();function g(I,N={}){return new Promise((A,S)=>{let v=u++;d.set(v,{resolve:A,reject:S});let T=JSON.stringify({jsonrpc:"2.0",id:v,method:I,params:N});a.stdin?.write(T+`
2076
2076
  `)})}function E(I,N={}){let A=JSON.stringify({jsonrpc:"2.0",method:I,params:N});a.stdin?.write(A+`
2077
- `)}c.on("line",I=>{let N;try{N=JSON.parse(I)}catch{return}if(typeof N.id=="number"&&d.has(N.id)){let v=d.get(N.id);if(d.delete(N.id),N.error){let T=N.error,R=typeof T?.message=="string"&&T.message.length>0?T.message:JSON.stringify(N.error);v.reject(Xr(`codex app-server error: ${R}`,T))}else v.resolve(N);e.onEvent?.(N);return}let A=N.method;if(!A){e.onEvent?.(N);return}if(A==="thread/started"){let T=N.params?.thread;T?.id&&(m=T.id,e.onSessionId?.(m))}let S=he()?v=>{rn("item.text/buffer-mismatch",{itemId:v.itemId,threadId:v.threadId??null,turnId:v.turnId??null,expectedFromItemText:v.expectedFromItemText,gotFromBuffer:v.gotFromBuffer,expectedLen:v.expectedFromItemText.length,gotLen:v.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let v=N.params,T=v?.turn;T?.id&&(p=T.id),nr(N,f,e.onDelta,S),he()&&rn("turn/started",{params:v??null})}if(he()&&(A==="item/started"||A==="item/completed")){let v=N.params;v?.item?.type==="agentMessage"&&rn(A,{params:v??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let v=N.params;he()&&rn("agentMessage/delta",{params:v??null})}nr(N,f,e.onDelta,S)}if(A==="turn/completed"){let v=N.params;if(he())for(let[R,x]of f.agentItems.entries())x.buffer&&rn("turn/completed/unflushed-item",{itemId:R,phase:x.phase,bufferLen:x.buffer.length});ro(f),he()&&rn("turn/completed",{params:v??null});let T=oo(N,w);T.shouldReject?(he()&&rn("turn/completed/terminal-reject",{message:T.turnError.message}),_=!0,h=!0,a.stdin?.end(),r(T.turnError)):(h=!0,a.stdin?.end())}if(A==="error"){let v=io(N,w);if(he()){let T=N.params,R=T?.error,x=typeof R?.message=="string"?R.message:"(no message)";rn(v.willRetry?"error/retry":"error/terminal-deferred",{message:x,willRetry:v.willRetry,params:T??null})}}e.onEvent?.(N)});let b="";a.stderr?.on("data",I=>{b+=I.toString()});let C=I=>{U({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:I.message});let N=new de(`Failed to spawn codex app-server: ${I.message}`,{cause:I});for(let A of d.values())A.reject(N);d.clear(),r(N)};a.on("error",C),a.stdin?.on("error",C),a.on("exit",I=>{if(l||_)return;if(h){n({result:f.resultText,threadId:m,turnId:p,durationMs:Date.now()-y,exitCode:I});return}if(w.pendingCodexError){r(w.pendingCodexError);return}let N=bR({exitCode:I,stderr:b});U({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:I,stderr_summary:N}),r(new Error(N))}),(async()=>{try{if(await g("initialize",Bg()),E("initialized",{}),e.threadId)try{let I=g("thread/resume",{threadId:e.threadId,sandbox:o,approvalPolicy:"never",...e.model?{model:e.model}:{}}),N,A=new Promise((S,v)=>{N=setTimeout(()=>v(new Error("resume timeout")),3e4)});try{let v=(await Promise.race([I,A])).result?.thread?.id;if(e.requireResume&&v!==e.threadId)throw new Error(`thread/resume did not return the requested thread "${e.threadId}" (got "${v??"unknown"}")`)}finally{clearTimeout(N)}m=e.threadId,e.onSessionId?.(m)}catch(I){if(e.requireResume)throw I;process.stderr.write(`[codex] thread/resume failed, creating new thread
2078
- `),U({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:I instanceof Error?I.message:String(I)});let A=(await g("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:o,...e.model?{model:e.model}:{}})).result?.thread;A?.id&&(m=A.id,e.onSessionId?.(m))}else{let N=(await g("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:o,...e.model?{model:e.model}:{}})).result?.thread;N?.id&&(m=N.id,e.onSessionId?.(m))}await g("turn/start",{threadId:m,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(I){te(a).catch(()=>{}),r(I instanceof Error?I:new Error(String(I)))}})()})}async function qg(t){let{binary:e,codexArgs:n,sandbox:r}=Wg(t),s=Ug(e,n,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:we(t.env,t.cwd,t.threadId)}),i=Date.now(),o={exited:!1,exitCode:null,completedTurns:0,closed:!1,closing:null},a=t.threadId||"",l=null,c="";s.stderr?.on("data",S=>{c+=S.toString()});let d=Hg({input:s.stdout}),u=new Map,m=1;function p(S,v={}){return new Promise((T,R)=>{let x=m++;u.set(x,{resolve:T,reject:R});let k=JSON.stringify({jsonrpc:"2.0",id:x,method:S,params:v});s.stdin?.write(k+`
2077
+ `)}c.on("line",I=>{let N;try{N=JSON.parse(I)}catch{return}if(typeof N.id=="number"&&d.has(N.id)){let v=d.get(N.id);if(d.delete(N.id),N.error){let T=N.error,R=typeof T?.message=="string"&&T.message.length>0?T.message:JSON.stringify(N.error);v.reject(Jr(`codex app-server error: ${R}`,T))}else v.resolve(N);e.onEvent?.(N);return}let A=N.method;if(!A){e.onEvent?.(N);return}if(A==="thread/started"){let T=N.params?.thread;T?.id&&(m=T.id,e.onSessionId?.(m))}let S=he()?v=>{sn("item.text/buffer-mismatch",{itemId:v.itemId,threadId:v.threadId??null,turnId:v.turnId??null,expectedFromItemText:v.expectedFromItemText,gotFromBuffer:v.gotFromBuffer,expectedLen:v.expectedFromItemText.length,gotLen:v.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let v=N.params,T=v?.turn;T?.id&&(p=T.id),ir(N,f,e.onDelta,S),he()&&sn("turn/started",{params:v??null})}if(he()&&(A==="item/started"||A==="item/completed")){let v=N.params;v?.item?.type==="agentMessage"&&sn(A,{params:v??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let v=N.params;he()&&sn("agentMessage/delta",{params:v??null})}ir(N,f,e.onDelta,S)}if(A==="turn/completed"){let v=N.params;if(he())for(let[R,x]of f.agentItems.entries())x.buffer&&sn("turn/completed/unflushed-item",{itemId:R,phase:x.phase,bufferLen:x.buffer.length});oo(f),he()&&sn("turn/completed",{params:v??null});let T=co(N,w);T.shouldReject?(he()&&sn("turn/completed/terminal-reject",{message:T.turnError.message}),_=!0,h=!0,a.stdin?.end(),r(T.turnError)):(h=!0,a.stdin?.end())}if(A==="error"){let v=lo(N,w);if(he()){let T=N.params,R=T?.error,x=typeof R?.message=="string"?R.message:"(no message)";sn(v.willRetry?"error/retry":"error/terminal-deferred",{message:x,willRetry:v.willRetry,params:T??null})}}e.onEvent?.(N)});let b="";a.stderr?.on("data",I=>{b+=I.toString()});let C=I=>{U({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:I.message});let N=new de(`Failed to spawn codex app-server: ${I.message}`,{cause:I});for(let A of d.values())A.reject(N);d.clear(),r(N)};a.on("error",C),a.stdin?.on("error",C),a.on("exit",I=>{if(l||_)return;if(h){n({result:f.resultText,threadId:m,turnId:p,durationMs:Date.now()-y,exitCode:I});return}if(w.pendingCodexError){r(w.pendingCodexError);return}let N=NR({exitCode:I,stderr:b});U({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:I,stderr_summary:N}),r(new Error(N))}),(async()=>{try{if(await g("initialize",Jg()),E("initialized",{}),e.threadId)try{let I=g("thread/resume",{threadId:e.threadId,sandbox:o,approvalPolicy:"never",...e.model?{model:e.model}:{}}),N,A=new Promise((S,v)=>{N=setTimeout(()=>v(new Error("resume timeout")),3e4)});try{let v=(await Promise.race([I,A])).result?.thread?.id;if(e.requireResume&&v!==e.threadId)throw new Error(`thread/resume did not return the requested thread "${e.threadId}" (got "${v??"unknown"}")`)}finally{clearTimeout(N)}m=e.threadId,e.onSessionId?.(m)}catch(I){if(e.requireResume)throw I;process.stderr.write(`[codex] thread/resume failed, creating new thread
2078
+ `),U({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:I instanceof Error?I.message:String(I)});let A=(await g("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:o,...e.model?{model:e.model}:{}})).result?.thread;A?.id&&(m=A.id,e.onSessionId?.(m))}else{let N=(await g("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:o,...e.model?{model:e.model}:{}})).result?.thread;N?.id&&(m=N.id,e.onSessionId?.(m))}await g("turn/start",{threadId:m,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(I){te(a).catch(()=>{}),r(I instanceof Error?I:new Error(String(I)))}})()})}async function zg(t){let{binary:e,codexArgs:n,sandbox:r}=Kg(t),s=qg(e,n,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:we(t.env,t.cwd,t.threadId)}),i=Date.now(),o={exited:!1,exitCode:null,completedTurns:0,closed:!1,closing:null},a=t.threadId||"",l=null,c="";s.stderr?.on("data",S=>{c+=S.toString()});let d=Gg({input:s.stdout}),u=new Map,m=1;function p(S,v={}){return new Promise((T,R)=>{let x=m++;u.set(x,{resolve:T,reject:R});let k=JSON.stringify({jsonrpc:"2.0",id:x,method:S,params:v});s.stdin?.write(k+`
2079
2079
  `)})}function h(S,v={}){let T=JSON.stringify({jsonrpc:"2.0",method:S,params:v});s.stdin?.write(T+`
2080
- `)}let _=[],y=()=>o.exited?Promise.resolve():new Promise(S=>{_.push(S)}),f=()=>new Error(`codex bundle process exited${o.exitCode!==null?` with code ${o.exitCode}`:""} after ${o.completedTurns} completed prompt(s); the bundle cannot continue`),w=null,g=null,E,b,C=S=>{S.turnId&&p("turn/interrupt",{threadId:a,turnId:S.turnId}).catch(()=>{})};function I(S){let v=w;v===null||v.settled||(v.settled=!0,w=null,S&&v.reject(S))}d.on("line",S=>{let v;try{v=JSON.parse(S)}catch{return}if(typeof v.id=="number"&&u.has(v.id)){let L=u.get(v.id);if(u.delete(v.id),v.error){let F=v.error,D=typeof F?.message=="string"&&F.message.length>0?F.message:JSON.stringify(v.error);L.reject(Xr(`codex app-server error: ${D}`,F))}else L.resolve(v);w?.onEvent?.(v);return}let T=v.method;if(!T){w?.onEvent?.(v);return}if(T==="thread/started"){let F=v.params?.thread;F?.id&&(a=F.id,t.onSessionId?.(a))}let R=v.params,x=R?.turnId??R?.turn?.id;if(g&&(T==="turn/started"&&!g.turnId&&x&&(g.turnId=x,C(g)),T==="turn/completed"&&x===g.turnId&&(g=null,b?.()),T.startsWith("turn/")||T.startsWith("item/")||T==="error"))return;let k=w;if(!(x&&k?.turnId&&x!==k.turnId)){if(T==="turn/started"&&k!==null){let F=v.params?.turn;F?.id&&(k.turnId=F.id),nr(v,k.agentState,k.onDelta,void 0)}if(k!==null&&(T==="item/started"||T==="item/agentMessage/delta"||T==="item/completed")&&nr(v,k.agentState,k.onDelta,void 0),T==="turn/completed"&&k!==null&&!k.settled){ro(k.agentState);let L=oo(v,k.turnState);k.settled=!0,w=null,L.shouldReject?k.reject(L.turnError):(o.completedTurns+=1,k.resolve({text:k.agentState.resultText,sessionId:a,turnId:k.turnId,durationMs:Date.now()-k.startMs}))}T==="error"&&k!==null&&io(v,k.turnState),k?.onEvent?.(v)}});let N=S=>{l=new de(`Failed to spawn codex app-server: ${S.message}`,{cause:S}),U({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:S.message});for(let v of u.values())v.reject(l);u.clear(),I(l)};s.on("error",N),s.stdin?.on("error",N),s.on("exit",S=>{o.exited=!0,b?.(),o.exitCode=S;let v=f();for(let R of u.values())R.reject(v);u.clear();let T=w;if(T!==null&&!T.settled)if(T.settled=!0,w=null,T.turnState.pendingCodexError)T.reject(T.turnState.pendingCodexError);else{let R=c.trim()?ge(c,{provider:"codex"}):"";U({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:S,...R?{stderr_summary:R}:{}}),T.reject(R?new Error(`${v.message}
2081
- ${R}`):v)}for(let R of _.splice(0))R()});try{if(await p("initialize",Bg()),h("initialized",{}),t.threadId){let S;try{S=await p("thread/resume",{threadId:t.threadId,sandbox:r,approvalPolicy:"never",...t.model?{model:t.model}:{}})}catch(T){throw new Error(`Cannot resume codex thread ${t.threadId} for a bundle: ${T instanceof Error?T.message:String(T)} (the thread/start fallback is disabled in bundle mode)`)}let v=S.result?.thread;if(v?.id!==t.threadId)throw new Error(`codex thread/resume did not return the requested thread id: expected "${t.threadId}", received "${v?.id??"unknown"}"`);a=t.threadId,t.onSessionId?.(a)}else{let v=(await p("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:r,...t.model?{model:t.model}:{}})).result?.thread;v?.id&&(a=v.id,t.onSessionId?.(a))}}catch(S){let v=l??(S instanceof Error?S:new Error(String(S))),T=t.closeTimeoutMs??2e3;throw await te(s,{softDelayMs:Math.min(1e3,T),killDelayMs:Math.min(1e3,T)}).catch(()=>{}),v}let A=S=>new Promise(v=>{setTimeout(v,S).unref?.()});return{provider:"codex",get sessionId(){return a},get completedTurns(){return o.completedTurns},async sendTurn(S,v={}){if(E&&await E,o.closed||o.closing!==null)throw new Error("codex bundle session is closed");if(o.exited)throw f();if(w!==null)throw new Error("codex bundle session has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending");if(v.signal?.aborted)throw new Error("Aborted");return new Promise((T,R)=>{let x={agentState:no(),turnState:so(),resolve:T,reject:R,startMs:Date.now(),turnId:"",onDelta:v.onDelta,onEvent:v.onEvent,settled:!1};w=x;let k=()=>{x.settled||(x.settled=!0,w=null,g=x,E=new Promise(L=>{b=L}),C(x),v.signal?.removeEventListener("abort",k),R(new Error("Aborted")))};v.signal?.addEventListener("abort",k,{once:!0}),p("turn/start",{threadId:a,input:[{type:"text",text:S}],...t.model?{model:t.model}:{}}).catch(L=>{if(x.settled){g===x&&(g=null,b?.());return}x.settled=!0,w=null,v.signal?.removeEventListener("abort",k),R(o.exited?f():L instanceof Error?L:new Error(String(L)))})})},close(){return o.closing!==null||(o.closing=(async()=>{if(o.closed=!0,b?.(),!o.exited&&(t.holdOpen!==void 0?await new Promise(S=>{_t(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>o.exited,isTurnInFlight:()=>w!==null,lastEventAtMs:()=>i,closeStdin:()=>{s.stdin?.end(),S()},label:"codex"})}):s.stdin?.end(),!o.exited)){let S=t.closeTimeoutMs??2e3;await Promise.race([y(),A(S)]),o.exited||await te(s,{stdinEnd:!1,softDelayMs:Math.min(1e3,S),killDelayMs:Math.min(1e3,S)}).catch(()=>{})}})()),o.closing}}}var TR,Gg=O(()=>{"use strict";oe();oe();kn();Rn();qr();yt();uc();oe();at();ot();pc();pc();TR=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(vR(wR(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function _e(t,e=120){let n=t.replace(/\s+/g," ").trim();return n.length>e?n.slice(0,e-1)+"\u2026":n}function Jg(t,e){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(t.size>=SR){let r=t.keys().next().value;r!==void 0&&t.delete(r)}t.set(n.id,Date.now()),e(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=t.get(n.id);if(r!==void 0){e({...n,elapsedMs:Date.now()-r}),t.delete(n.id);return}}e(n)}}function Kg(){let t=new Map;return(e,n)=>{kR(e,Jg(t,n))}}function kR(t,e){let n=t.type;if(n==="system"){let r=t.subtype;if(r==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(_e(a,60));let d=c.length>0?c.join(", "):r;e({kind:"api_retry",summary:d});return}if(r==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(_e(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:r||"system",raw:t});return}if(n==="assistant"||n==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:_e(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=_e(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:_e(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:_e(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
2080
+ `)}let _=[],y=()=>o.exited?Promise.resolve():new Promise(S=>{_.push(S)}),f=()=>new Error(`codex bundle process exited${o.exitCode!==null?` with code ${o.exitCode}`:""} after ${o.completedTurns} completed prompt(s); the bundle cannot continue`),w=null,g=null,E,b,C=S=>{S.turnId&&p("turn/interrupt",{threadId:a,turnId:S.turnId}).catch(()=>{})};function I(S){let v=w;v===null||v.settled||(v.settled=!0,w=null,S&&v.reject(S))}d.on("line",S=>{let v;try{v=JSON.parse(S)}catch{return}if(typeof v.id=="number"&&u.has(v.id)){let L=u.get(v.id);if(u.delete(v.id),v.error){let F=v.error,D=typeof F?.message=="string"&&F.message.length>0?F.message:JSON.stringify(v.error);L.reject(Jr(`codex app-server error: ${D}`,F))}else L.resolve(v);w?.onEvent?.(v);return}let T=v.method;if(!T){w?.onEvent?.(v);return}if(T==="thread/started"){let F=v.params?.thread;F?.id&&(a=F.id,t.onSessionId?.(a))}let R=v.params,x=R?.turnId??R?.turn?.id;if(g&&(T==="turn/started"&&!g.turnId&&x&&(g.turnId=x,C(g)),T==="turn/completed"&&x===g.turnId&&(g=null,b?.()),T.startsWith("turn/")||T.startsWith("item/")||T==="error"))return;let k=w;if(!(x&&k?.turnId&&x!==k.turnId)){if(T==="turn/started"&&k!==null){let F=v.params?.turn;F?.id&&(k.turnId=F.id),ir(v,k.agentState,k.onDelta,void 0)}if(k!==null&&(T==="item/started"||T==="item/agentMessage/delta"||T==="item/completed")&&ir(v,k.agentState,k.onDelta,void 0),T==="turn/completed"&&k!==null&&!k.settled){oo(k.agentState);let L=co(v,k.turnState);k.settled=!0,w=null,L.shouldReject?k.reject(L.turnError):(o.completedTurns+=1,k.resolve({text:k.agentState.resultText,sessionId:a,turnId:k.turnId,durationMs:Date.now()-k.startMs}))}T==="error"&&k!==null&&lo(v,k.turnState),k?.onEvent?.(v)}});let N=S=>{l=new de(`Failed to spawn codex app-server: ${S.message}`,{cause:S}),U({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:S.message});for(let v of u.values())v.reject(l);u.clear(),I(l)};s.on("error",N),s.stdin?.on("error",N),s.on("exit",S=>{o.exited=!0,b?.(),o.exitCode=S;let v=f();for(let R of u.values())R.reject(v);u.clear();let T=w;if(T!==null&&!T.settled)if(T.settled=!0,w=null,T.turnState.pendingCodexError)T.reject(T.turnState.pendingCodexError);else{let R=c.trim()?ge(c,{provider:"codex"}):"";U({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:S,...R?{stderr_summary:R}:{}}),T.reject(R?new Error(`${v.message}
2081
+ ${R}`):v)}for(let R of _.splice(0))R()});try{if(await p("initialize",Jg()),h("initialized",{}),t.threadId){let S;try{S=await p("thread/resume",{threadId:t.threadId,sandbox:r,approvalPolicy:"never",...t.model?{model:t.model}:{}})}catch(T){throw new Error(`Cannot resume codex thread ${t.threadId} for a bundle: ${T instanceof Error?T.message:String(T)} (the thread/start fallback is disabled in bundle mode)`)}let v=S.result?.thread;if(v?.id!==t.threadId)throw new Error(`codex thread/resume did not return the requested thread id: expected "${t.threadId}", received "${v?.id??"unknown"}"`);a=t.threadId,t.onSessionId?.(a)}else{let v=(await p("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:r,...t.model?{model:t.model}:{}})).result?.thread;v?.id&&(a=v.id,t.onSessionId?.(a))}}catch(S){let v=l??(S instanceof Error?S:new Error(String(S))),T=t.closeTimeoutMs??2e3;throw await te(s,{softDelayMs:Math.min(1e3,T),killDelayMs:Math.min(1e3,T)}).catch(()=>{}),v}let A=S=>new Promise(v=>{setTimeout(v,S).unref?.()});return{provider:"codex",get sessionId(){return a},get completedTurns(){return o.completedTurns},async sendTurn(S,v={}){if(E&&await E,o.closed||o.closing!==null)throw new Error("codex bundle session is closed");if(o.exited)throw f();if(w!==null)throw new Error("codex bundle session has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending");if(v.signal?.aborted)throw new Error("Aborted");return new Promise((T,R)=>{let x={agentState:io(),turnState:ao(),resolve:T,reject:R,startMs:Date.now(),turnId:"",onDelta:v.onDelta,onEvent:v.onEvent,settled:!1};w=x;let k=()=>{x.settled||(x.settled=!0,w=null,g=x,E=new Promise(L=>{b=L}),C(x),v.signal?.removeEventListener("abort",k),R(new Error("Aborted")))};v.signal?.addEventListener("abort",k,{once:!0}),p("turn/start",{threadId:a,input:[{type:"text",text:S}],...t.model?{model:t.model}:{}}).catch(L=>{if(x.settled){g===x&&(g=null,b?.());return}x.settled=!0,w=null,v.signal?.removeEventListener("abort",k),R(o.exited?f():L instanceof Error?L:new Error(String(L)))})})},close(){return o.closing!==null||(o.closing=(async()=>{if(o.closed=!0,b?.(),!o.exited&&(t.holdOpen!==void 0?await new Promise(S=>{yt(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>o.exited,isTurnInFlight:()=>w!==null,lastEventAtMs:()=>i,closeStdin:()=>{s.stdin?.end(),S()},label:"codex"})}):s.stdin?.end(),!o.exited)){let S=t.closeTimeoutMs??2e3;await Promise.race([y(),A(S)]),o.exited||await te(s,{stdinEnd:!1,softDelayMs:Math.min(1e3,S),killDelayMs:Math.min(1e3,S)}).catch(()=>{})}})()),o.closing}}}var CR,Yg=O(()=>{"use strict";oe();oe();In();xn();Kr();Et();gc();oe();lt();at();_c();_c();CR=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(xR(AR(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function _e(t,e=120){let n=t.replace(/\s+/g," ").trim();return n.length>e?n.slice(0,e-1)+"\u2026":n}function Qg(t,e){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(t.size>=OR){let r=t.keys().next().value;r!==void 0&&t.delete(r)}t.set(n.id,Date.now()),e(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=t.get(n.id);if(r!==void 0){e({...n,elapsedMs:Date.now()-r}),t.delete(n.id);return}}e(n)}}function Zg(){let t=new Map;return(e,n)=>{LR(e,Qg(t,n))}}function LR(t,e){let n=t.type;if(n==="system"){let r=t.subtype;if(r==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(_e(a,60));let d=c.length>0?c.join(", "):r;e({kind:"api_retry",summary:d});return}if(r==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(_e(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:r||"system",raw:t});return}if(n==="assistant"||n==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:_e(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=_e(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:_e(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:_e(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
2082
2082
  `).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let m=u.map(p=>typeof p=="object"&&p&&"text"in p?p.text:"").filter(Boolean).join("");m&&(d=`${m.split(`
2083
- `).length} lines, ${m.length} chars`)}e({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(n==="result"){e({kind:"system",summary:"result",raw:t});return}}async function ao(t,e){let n=e.binary==="qwen"?"qwen":"claude",r=e.onProgress?Kg():void 0;if(e.bundleSession!==void 0)return Lt(e.bundleSession,n,e.sessionId,t,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal});let s=await Dg(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:n,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:i=>{typeof i.session_id=="string"&&i.session_id&&e.onSessionId?.(i.session_id),r&&r(i,e.onProgress)},signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns,...s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{}}}async function lo(t){let e=t.binary==="qwen"?"qwen":"claude",n=await Fg({tool:e,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,holdOpen:t.holdOpen,closeTimeoutMs:t.closeTimeoutMs,sessionFileRoots:t.sessionFileRoots});return{provider:e,get sessionId(){return n.sessionId},get completedTurns(){return n.completedTurns},async sendTurn(r,s={}){let i=Kg(),o=await n.sendTurn(r,{onText:s.onDelta,onEvent:a=>{s.onEvent?.(a),s.onProgress&&i(a,s.onProgress)},signal:s.signal});return{text:o.result,sessionId:o.sessionId,durationMs:o.durationMs,...o.warnings!==void 0?{warnings:o.warnings}:{}}},close:()=>n.close()}}function Vg(){let t=new Map;return(e,n)=>{RR(e,Jg(t,n))}}function RR(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:_e(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:_e(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=_e(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:_e(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")e({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${_e(c,80)}`:"running\u2026";e({kind:"other",summary:d,id:a})}return}e({kind:"other",summary:i})}}function zg(t,e){if(e!==void 0)return t===""&&!e?"empty":void 0}async function Et(t,e){let n=e.acpTool||e.binary,r=e.onProgress?Vg():void 0;if(e.bundleSession!==void 0)return Lt(e.bundleSession,n,e.sessionId,t,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal});let s=[];if(e.model&&n==="copilot"){let a="copilot --acp does not implement per-session model selection";Oe({event:"model_ignored",provider:n,model:e.model,reason:a}),s.push(`copilot ignored model=${e.model}: ${a}`)}let i=await sg(t,{tool:n,sessionId:e.sessionId,onSessionId:e.onSessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,acpMode:e.acpMode,requireResume:e.requireResume,onDelta:e.onDelta,onEvent:r?a=>r(a,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen}),o=[...s,...i.warnings??[]];return{text:i.result,sessionId:i.sessionId,durationMs:i.durationMs,stopReason:i.stopReason,...zg(i.result,i.sawActivity)!==void 0?{status:"empty"}:{},...o.length>0?{warnings:o}:{}}}async function vt(t){let e=t.acpTool||t.binary,n=await ig({tool:e,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,effort:t.effort,alias:t.alias,permissionMode:t.permissionMode,acpMode:t.acpMode,requireResume:!0,holdOpen:t.holdOpen,closeTimeoutMs:t.closeTimeoutMs});return{provider:e,get sessionId(){return n.sessionId},get completedTurns(){return n.completedTurns},async sendTurn(r,s={}){let i=Vg(),o=await n.sendTurn(r,{...s,onEvent:a=>{s.onEvent?.(a),s.onProgress&&i(a,s.onProgress)}});return{text:o.result,sessionId:o.sessionId,durationMs:o.durationMs,stopReason:o.stopReason,sawActivity:o.sawActivity,...zg(o.result,o.sawActivity)?{status:"empty"}:{},...o.warnings!==void 0?{warnings:o.warnings}:{}}},close:()=>n.close()}}function Yg(t,e){let n=t.method;if(!n)return;let r=t.params;if(n==="turn/started"){e({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(n==="error"){let s=r?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=r?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${_e(o,120)}`}:{kind:"other",summary:`codex error: ${_e(o,120)}`});return}if(n==="item/started"||n==="item/completed"){let s=r?.item;if(!s)return;let i=s.type,o=n==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:_e(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",m=typeof s.durationMs=="number"?s.durationMs:void 0,p=typeof d=="number"?`exit ${d}`:u||"done",h=[];typeof d=="number"?h.push(`exit ${d}`):u&&h.push(u),typeof m=="number"&&h.push(`${Math.round(m/1e3)}s`),e({kind:"tool_result",summary:h.join(", ")||"done",status:p,elapsedMs:m,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:_e(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";e({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(o?{kind:"tool_use",tool:"WebSearch",summary:_e(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(n==="item/agentMessage/delta"){let s=r?.delta||"";if(s){let i=typeof r?._lmctlItemPhase=="string"?r._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:_e(s)}:{kind:"text",summary:_e(s)})}return}if(n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=r?.delta||"";s&&e({kind:"thinking",summary:_e(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let i=s.split(`
2083
+ `).length} lines, ${m.length} chars`)}e({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(n==="result"){e({kind:"system",summary:"result",raw:t});return}}async function uo(t,e){let n=e.binary==="qwen"?"qwen":"claude",r=e.onProgress?Zg():void 0;if(e.bundleSession!==void 0)return Mt(e.bundleSession,n,e.sessionId,t,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal});let s=await Hg(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:n,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:i=>{typeof i.session_id=="string"&&i.session_id&&e.onSessionId?.(i.session_id),r&&r(i,e.onProgress)},signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns,...s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{}}}async function mo(t){let e=t.binary==="qwen"?"qwen":"claude",n=await Bg({tool:e,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,holdOpen:t.holdOpen,closeTimeoutMs:t.closeTimeoutMs,sessionFileRoots:t.sessionFileRoots});return{provider:e,get sessionId(){return n.sessionId},get completedTurns(){return n.completedTurns},async sendTurn(r,s={}){let i=Zg(),o=await n.sendTurn(r,{onText:s.onDelta,onEvent:a=>{s.onEvent?.(a),s.onProgress&&i(a,s.onProgress)},signal:s.signal});return{text:o.result,sessionId:o.sessionId,durationMs:o.durationMs,...o.warnings!==void 0?{warnings:o.warnings}:{}}},close:()=>n.close()}}function eh(){let t=new Map;return(e,n)=>{MR(e,Qg(t,n))}}function MR(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:_e(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:_e(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=_e(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:_e(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")e({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${_e(c,80)}`:"running\u2026";e({kind:"other",summary:d,id:a})}return}e({kind:"other",summary:i})}}function th(t,e){if(e!==void 0)return t===""&&!e?"empty":void 0}async function vt(t,e){let n=e.acpTool||e.binary,r=e.onProgress?eh():void 0;if(e.bundleSession!==void 0)return Mt(e.bundleSession,n,e.sessionId,t,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal});let s=[];if(e.model&&n==="copilot"){let a="copilot --acp does not implement per-session model selection";Oe({event:"model_ignored",provider:n,model:e.model,reason:a}),s.push(`copilot ignored model=${e.model}: ${a}`)}let i=await cg(t,{tool:n,sessionId:e.sessionId,onSessionId:e.onSessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,acpMode:e.acpMode,requireResume:e.requireResume,onDelta:e.onDelta,onEvent:r?a=>r(a,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen}),o=[...s,...i.warnings??[]];return{text:i.result,sessionId:i.sessionId,durationMs:i.durationMs,stopReason:i.stopReason,...th(i.result,i.sawActivity)!==void 0?{status:"empty"}:{},...o.length>0?{warnings:o}:{}}}async function wt(t){let e=t.acpTool||t.binary,n=await dg({tool:e,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,effort:t.effort,alias:t.alias,permissionMode:t.permissionMode,acpMode:t.acpMode,requireResume:!0,holdOpen:t.holdOpen,closeTimeoutMs:t.closeTimeoutMs});return{provider:e,get sessionId(){return n.sessionId},get completedTurns(){return n.completedTurns},async sendTurn(r,s={}){let i=eh(),o=await n.sendTurn(r,{...s,onEvent:a=>{s.onEvent?.(a),s.onProgress&&i(a,s.onProgress)}});return{text:o.result,sessionId:o.sessionId,durationMs:o.durationMs,stopReason:o.stopReason,sawActivity:o.sawActivity,...th(o.result,o.sawActivity)?{status:"empty"}:{},...o.warnings!==void 0?{warnings:o.warnings}:{}}},close:()=>n.close()}}function nh(t,e){let n=t.method;if(!n)return;let r=t.params;if(n==="turn/started"){e({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(n==="error"){let s=r?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=r?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${_e(o,120)}`}:{kind:"other",summary:`codex error: ${_e(o,120)}`});return}if(n==="item/started"||n==="item/completed"){let s=r?.item;if(!s)return;let i=s.type,o=n==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:_e(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",m=typeof s.durationMs=="number"?s.durationMs:void 0,p=typeof d=="number"?`exit ${d}`:u||"done",h=[];typeof d=="number"?h.push(`exit ${d}`):u&&h.push(u),typeof m=="number"&&h.push(`${Math.round(m/1e3)}s`),e({kind:"tool_result",summary:h.join(", ")||"done",status:p,elapsedMs:m,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:_e(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";e({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(o?{kind:"tool_use",tool:"WebSearch",summary:_e(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(n==="item/agentMessage/delta"){let s=r?.delta||"";if(s){let i=typeof r?._lmctlItemPhase=="string"?r._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:_e(s)}:{kind:"text",summary:_e(s)})}return}if(n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=r?.delta||"";s&&e({kind:"thinking",summary:_e(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let i=s.split(`
2084
2084
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${_e(o,60)}`:_e(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n==="item/commandExecution/terminalInteraction"||n==="item/commandExecution/outputChunk"||n==="item/commandExecution/output"){let s=(typeof r?.stdin=="string"?r.stdin:"")||(typeof r?.delta=="string"?r.delta:"")||(typeof r?.output=="string"?r.output:"")||(typeof r?.text=="string"?r.text:"")||(typeof r?.content=="string"?r.content:"")||(typeof r?.chunk=="string"?r.chunk:"")||"";if(s){let i=s.split(`
2085
- `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${_e(o,60)}`:_e(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){e({kind:"other",summary:n.slice(5)});return}}async function Qg(t,e){if(e.bundleSession!==void 0)return Lt(e.bundleSession,"codex",e.sessionId,t,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal});let n=await Xg(t,{threadId:e.sessionId,requireResume:e.requireResume,onSessionId:e.onSessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?r=>Yg(r,e.onProgress):void 0,signal:e.signal});return{text:n.result,sessionId:n.threadId,durationMs:n.durationMs}}async function Zg(t){let e=await qg({threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen,closeTimeoutMs:t.closeTimeoutMs});return{provider:"codex",get sessionId(){return e.sessionId},get completedTurns(){return e.completedTurns},async sendTurn(n,r={}){let s=await e.sendTurn(n,{...r,onEvent:i=>{r.onEvent?.(i),r.onProgress&&Yg(i,r.onProgress)}});return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs}},close:()=>e.close()}}var SR,Dt=O(()=>{"use strict";dc();dc();Gg();Yl();er();oe();SR=256});function fc(t={}){let e=lc(t.miniplayerHome),n=r=>({...r??process.env,MINIPLAYER_HOME:e});return new class extends ne{constructor(){super({provider:new Qi({miniplayerHome:e}),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeSession:!1,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none",leaderSetupHint:"Miniplayer provides native file, shell and web tools. Live ACP sessions cannot be resumed after exit."},binary:"miniplayer",seedArgs:[],resumeTemplate:"",startTemplate:"miniplayer run",transport:(r,s)=>{if(s.sessionId||s.requireResume)throw new Error('miniplayer does not support resume; use lmctl prompt --provider miniplayer --model <model> "<prompt>"');return Et(r,{...s,env:n(s.env),acpTool:"miniplayer",requireResume:!1})}})}openSession(r){if(r.sessionId)throw new Error("miniplayer cannot reopen a closed ACP session; start a fresh conversation");return vt({...r,env:n(r.env),binary:"miniplayer",acpTool:"miniplayer"})}manualSeedHint(){return{launchCommand:"miniplayer --help",postLaunchNote:'Use lmctl prompt --provider miniplayer --model <model> "<prompt>". Each invocation creates a fresh run.',lsCommand:"lmctl ls --provider miniplayer"}}resumeCommand(){throw new Error("miniplayer has no interactive terminal or session resume")}async seed(){return{success:!1,error:'miniplayer does not support team session resume; use lmctl prompt --provider miniplayer --model <model> "<prompt>"'}}}}var gc=O(()=>{"use strict";Ae();Rg();Dt()});import{readdir as co,stat as eh,unlink as IR}from"node:fs/promises";import{join as rr,basename as th}from"node:path";function xR(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function AR(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return ae(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}function CR(t,e){t.input=Math.max(t.input,e.input),t.cacheRead=Math.max(t.cacheRead,e.cacheRead),t.cacheWrite=Math.max(t.cacheWrite,e.cacheWrite),t.output=Math.max(t.output,e.output),t.cacheWriteSplitExposed||=e.cacheWriteSplitExposed,e.cacheWrite5m!==void 0&&(t.cacheWrite5m=Math.max(t.cacheWrite5m??0,e.cacheWrite5m)),e.cacheWrite1h!==void 0&&(t.cacheWrite1h=Math.max(t.cacheWrite1h??0,e.cacheWrite1h))}function NR(t){let e=t?.cache_creation?.ephemeral_5m_input_tokens,n=t?.cache_creation?.ephemeral_1h_input_tokens,r=typeof e=="number"||typeof n=="number",s=(e??0)+(n??0);return{input:t?.input_tokens??0,cacheRead:t?.cache_read_input_tokens??0,cacheWrite:Math.max(t?.cache_creation_input_tokens??0,s),...typeof e=="number"?{cacheWrite5m:e}:{},...typeof n=="number"?{cacheWrite1h:n}:{},cacheWriteSplitExposed:r,output:t?.output_tokens??0}}function OR(t){let e=t.cacheWrite1h??0;if(!t.cacheWriteSplitExposed)return{total:t.cacheWrite,fiveMinute:t.cacheWrite,oneHour:0};let n=t.cacheWrite5m??Math.max(0,t.cacheWrite-e),r=n+e;return{total:Math.max(t.cacheWrite,r),fiveMinute:r>t.cacheWrite?n:n+(t.cacheWrite-r),oneHour:e}}async function nh(t){let e=0,n=0,r=0,s=0,i=0,o=0,a,l,c=new Map,d=[];for await(let h of me(t))if(!h.isSidechain){if(h.type==="user"&&!h.isMeta&&h.message){let _=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;e++,l=q(_.trim(),80)}}else if(h.type==="assistant"&&h.message){let _=h.message.content;if(Array.isArray(_))for(let f of _)f.type==="text"&&e++;let y=h.message.usage;if(y){let f=NR(y),w=h.message.id?.trim();if(w){let E=c.get(w);E?CR(E,f):c.set(w,f)}else d.push(f);let g=f.input+f.cacheWrite+f.cacheRead;g&&(o=g),a={inputTokens:f.input,cacheWriteInputTokens:f.cacheWrite,cachedInputTokens:f.cacheRead,outputTokens:f.output}}}}let u=0,m=0,p=h=>{let _=OR(h);n+=h.input+h.cacheRead+_.total,r+=h.cacheRead,s+=_.total,u+=_.fiveMinute,m+=_.oneHour,i+=h.output};for(let h of c.values())p(h);for(let h of d)p(h);return{messageCount:e,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalCacheWrite5mInputTokens:u,totalCacheWrite1hInputTokens:m,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a,lastUserMessage:l}}function LR(t){let e=MR(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/Command running in background with ID:\s*([A-Za-z0-9_-]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function MR(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var uo,rh=O(()=>{"use strict";be();uo=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||rr(K,".claude"),this.projectsDir=rr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await co(this.projectsDir)}catch{return e}for(let r of n){let s=rr(this.projectsDir,r);if(!(await eh(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await co(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=th(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=rr(s,a);try{let d=await this.extractSummary(c,l);d&&e.push(d)}catch{}}}return e}async extractSummary(e,n){let r=await Je(e,50),s=await ye(e),i="",o,a,l,c,d,u;for(let p of r)if(!xR(p.type)&&(!i&&p.cwd&&(i=p.cwd),!o&&p.slug&&(o=p.slug),!a&&p.version&&(a=p.version),!u&&p.timestamp&&(u=new Date(p.timestamp)),p.type==="assistant"&&p.message?.model&&(l=p.message.model),p.type==="user"&&!p.isMeta&&p.message)){let h=p.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;c||(c=q(h.trim(),80)),d=q(h.trim(),80)}}if(!i)return null;let m=await nh(e);return{provider:"claude",sessionId:n,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:m.lastUserMessage??d,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:m.totalCacheWriteInputTokens||void 0,totalCacheWrite5mInputTokens:m.totalCacheWrite5mInputTokens||void 0,totalCacheWrite1hInputTokens:m.totalCacheWrite1hInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await ye(n),s=[],i="",o,a,l,c,d,u,m,p=e,h,_=[];for await(let f of me(n))if(f.type!=="file-history-snapshot"&&!f.isSidechain){if(!i&&f.cwd&&(i=f.cwd),!o&&f.slug&&(o=f.slug),!a&&f.version&&(a=f.version),!c&&f.gitBranch&&(c=f.gitBranch),!m&&f.timestamp&&(m=new Date(f.timestamp)),f.sessionId&&(p=f.sessionId),f.type==="system"||f.type==="progress"||f.type==="queue-operation"){s.push({role:"system",timestamp:new Date(f.timestamp||0),content:AR(f)});continue}if(f.type==="user"&&f.message){if(f.isMeta)continue;let w=new Date(f.timestamp||0),g=f.message.content;if(f.isCompactSummary!==!0&&f.isVisibleInTranscriptOnly!==!0&&f.promptSource!=="system"&&f.toolUseResult===void 0&&f.origin?.kind!=="task-notification"&&f.interruptedMessageId===void 0&&f.interruptedByShutdown!==!0&&f.scheduledTaskId===void 0&&f.scheduledFireId===void 0&&!(Array.isArray(g)&&g.some(E=>E.type==="tool_result"))){let E=typeof g=="string"?g:Array.isArray(g)?g.filter(b=>b.type==="text"&&typeof b.text=="string").map(b=>b.text).join(`
2086
- `):"";E&&!/^<(?:command-name>|local-command-|task-notification>\s*<|system-reminder>)/u.test(E.trimStart())&&!E.trimStart().startsWith("lmctl seed initial connection only.")&&_.push(E)}if(typeof g=="string"){let E=g.trim();if(E.includes("<command-name>")||E.includes("<local-command-")||/^<task-notification>\s*</u.test(E)||E.startsWith("lmctl seed initial connection only.")||/^<system-reminder>[\s\S]*<\/system-reminder>$/u.test(E))continue;d||(d=q(g.trim(),80)),u=q(g.trim(),80),h=void 0,s.push({role:"user",timestamp:w,content:ae(g.trim())})}else if(Array.isArray(g)){for(let E of g)if(E.type==="tool_result"){let b=typeof E.content=="string"?ae(E.content):JSON.stringify(E.content);s.push({role:"tool_result",timestamp:w,content:b,toolCallId:E.tool_use_id})}}}if(f.type==="assistant"&&f.message){f.message.stop_reason===null||f.message.stop_reason==="tool_use"?h="in_progress":typeof f.message.stop_reason=="string"&&(h="complete"),f.message.model&&(l=f.message.model);let w=new Date(f.timestamp||0),g=f.message.content;if(Array.isArray(g))for(let E of g)E.type==="text"&&E.text?s.push({role:"assistant",timestamp:w,content:ae(E.text),model:f.message.model,...typeof f.message.stop_reason=="string"?{stopReason:f.message.stop_reason}:{}}):E.type==="tool_use"?s.push({role:"tool_use",timestamp:w,content:E.name||"unknown tool",toolName:E.name,toolInput:JSON.stringify(E.input,null,2),toolInputData:E.input,toolCallId:E.id,model:f.message.model,...typeof f.message.stop_reason=="string"?{stopReason:f.message.stop_reason}:{}}):E.type==="thinking"&&E.thinking&&s.push({role:"thinking",timestamp:w,content:E.thinking})}}if(!i)return null;LR(s);let y=await nh(n);return{provider:"claude",sessionId:p,slug:o,cwd:i,createdAt:m||r.createdAt,modifiedAt:r.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,turnStatus:h,firstUserMessage:d,lastUserMessage:u,messageCount:y.messageCount,filePath:n,totalInputTokens:y.totalInputTokens||void 0,totalCachedInputTokens:y.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:y.totalCacheWriteInputTokens||void 0,totalCacheWrite5mInputTokens:y.totalCacheWrite5mInputTokens||void 0,totalCacheWrite1hInputTokens:y.totalCacheWrite1hInputTokens||void 0,totalOutputTokens:y.totalOutputTokens||void 0,lastInputTokens:y.lastInputTokens||void 0,lastTokenUsage:y.lastTokenUsage,messages:s,userPrompts:_}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await IR(n),!0):!1}async resolveSessionFile(e){let n;try{n=await co(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=rr(this.projectsDir,o);if(!(await eh(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await co(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=th(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&r.push({filePath:rr(a,d),fileSessionId:u})}}let s=r.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of r){let a=await Je(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{join as sh}from"node:path";function _c(t){return new hc(t)}var hc,yc=O(()=>{"use strict";rh();Ae();be();Dt();xe();hc=class extends ne{claudeDir;constructor(e){super({provider:new uo(e),protocol:{transport:"stream-json",perTurnCancellation:"process",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Y,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:ao}),this.claudeDir=e?.claudeDir??sh(K,".claude")}openSession(e){return lo({...e,binary:"claude",sessionFileRoots:e.sessionFileRoots??[sh(this.claudeDir,"projects")]})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as PR,stat as ih,unlink as DR}from"node:fs/promises";import{join as ss,basename as FR}from"node:path";function $R(t,e,n){return`${t}|${e.toISOString()}|${n}`}function is(t,e,n){let r=$R(n.role,n.timestamp,n.content);e.has(r)||(e.add(r),t.push(n))}function oh(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function jR(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function sr(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(n=>{if(typeof n=="string")return n;if(n&&typeof n=="object"){let r=n;if(typeof r.text=="string")return r.text;if(typeof r.image_url=="string")return"[input_image]";if(typeof r.type=="string")return`[${r.type}]`}return sr(n)}).filter(n=>n.length>0).join(`
2087
- `);try{return JSON.stringify(t)}catch{return String(t)}}function UR(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function HR(t,e){if(e===void 0)return;let n={input:e};if(t!=="apply_patch"||typeof e!="string")return n;let r=[...e.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return r.length>0&&(n.path=r[0].path,n.paths=r.map(s=>s.path),n.kinds=r.map(s=>s.kind)),n}async function ah(t){let e=0,n=0,r=0,s=0,i=0,o,a,l;for await(let c of me(t)){if(c.type==="event_msg"&&c.payload?.type==="user_message"){let d=c.payload.message||c.payload.text;d&&(l=q(d.trim(),80))}if(c.type==="response_item"&&c.payload){let d=c.payload;if(d.type==="message"&&d.role==="user"&&d.content)for(let u of d.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&(e++,l=q(u.text.trim(),80));else if(d.type==="message"&&d.role==="assistant"&&d.content)for(let u of d.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(c.payload&&typeof c.payload.model_context_window=="number"&&(a=c.payload.model_context_window),c.type==="event_msg"&&c.payload?.type==="token_count"&&c.payload.info?.total_token_usage){let d=c.payload.info.total_token_usage;n=d.input_tokens??n,r=d.cached_input_tokens??d.cache_read_input_tokens??r,s=d.output_tokens??s,i=d.reasoning_output_tokens??i;let u=jR(c.payload.info.last_token_usage);u&&(o=u),typeof c.payload.info.model_context_window=="number"&&(a=c.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a,lastUserMessage:l}}var mo,lh=O(()=>{"use strict";be();mo=class{name="codex";codexDirs;constructor(e={}){let n=[ss(K,".codex"),ss(K,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let r=[e.codexDir||n[0],e.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:ss(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let n of this.codexDirs){let r=ss(n,"sessions");try{await ih(r),e.push(r)}catch{}}return e}async discoverSessions(){let e=[],n=await this.getSessionsDirs();for(let r of n){let s=await this.findSessionFiles(r);for(let i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let n=[],r;try{r=await PR(e)}catch{return n}for(let s of r){let i=ss(e,s),o=await ih(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);n.push(...a)}else s.endsWith(".jsonl")&&n.push(i)}return n}extractSessionIdFromFilename(e){let n=FR(e,".jsonl"),r=n.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async extractSummary(e){let n=await Je(e,30),r=await ye(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,d,u,m;for(let h of n){if(h.type==="session_meta"&&h.payload&&(h.payload.id&&(s=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),h.payload.originator&&(u=h.payload.originator),h.payload.source&&(m=h.payload.source)),h.type==="turn_context"&&h.payload&&(h.payload.model&&(a=h.payload.model),!i&&h.payload.cwd&&(i=h.payload.cwd)),h.type==="event_msg"&&h.payload?.type==="user_message"){let _=h.payload.message||h.payload.text;_&&(c||(c=q(_.trim(),80)),d=q(_.trim(),80))}if(h.type==="response_item"&&h.payload?.type==="message"&&h.payload.role==="user"&&h.payload.content){let _=h.payload.content.find(y=>y.type==="input_text"&&typeof y.text=="string"&&y.text);typeof _?.text=="string"&&(c||(c=q(_.text.trim(),80)),d=q(_.text.trim(),80))}}if(!i)return null;let p=await ah(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:oh(u,m),firstUserMessage:c,lastUserMessage:p.lastUserMessage??d,messageCount:p.messageCount,filePath:e,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow}}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await ye(n),s=[],i="",o,a,l,c,d,u=e,m,p,h=new Set,_=[],y=new Set,f=[],w=(b,C)=>{let I=f.find(N=>!N.mirrored&&N.source!==C&&N.text===b);I?I.mirrored=!0:f.push({text:b,source:C,mirrored:!1})},g=()=>{_.push(...f.map(b=>b.text)),f=[]};for await(let b of me(n)){let C=b.timestamp?new Date(b.timestamp):new Date;if(b.type==="session_meta"&&b.payload){b.payload.id&&(u=b.payload.id),b.payload.cwd&&(i=b.payload.cwd),b.payload.cli_version&&(o=b.payload.cli_version),b.payload.timestamp&&(l=new Date(b.payload.timestamp)),m=oh(b.payload.originator,b.payload.source);continue}if(b.type==="turn_context"&&b.payload){b.payload.model&&(a=b.payload.model),!i&&b.payload.cwd&&(i=b.payload.cwd);continue}if(b.type==="response_item"&&b.payload){let I=b.payload;if(I.type==="message"){if(I.role==="user"&&I.content){let N=I.internal_chat_message_metadata_passthrough?.content_item_kinds;if(Array.isArray(N)){let A=I.content.filter((S,v)=>N[v]==="user.text"&&typeof S.text=="string").map(S=>S.text).join(`
2088
- `);N.includes("user.text")&&A&&(!I.id||!y.has(I.id))&&(w(A,"metadata"),I.id&&y.add(I.id))}for(let A of I.content)if(A.type==="input_text"&&typeof A.text=="string"&&A.text){let S=A.text.trim();c||(c=q(S,80)),d=q(S,80),is(s,h,{role:"user",timestamp:C,content:ae(S)})}continue}if(I.role==="assistant"&&I.content){for(let N of I.content)N.type==="output_text"&&typeof N.text=="string"&&N.text&&is(s,h,{role:"assistant",timestamp:C,content:ae(N.text),model:a});continue}if(I.role!=="user"&&I.role!=="assistant"&&I.content){for(let N of I.content)(N.type==="input_text"||N.type==="output_text")&&typeof N.text=="string"&&N.text&&is(s,h,{role:"system",timestamp:C,content:ae(N.text.trim())});continue}}if(I.type==="function_call"){s.push({role:"tool_use",timestamp:C,content:I.name||"unknown tool",toolName:I.name,toolInput:I.arguments!==void 0?ae(sr(I.arguments)):void 0,toolInputData:UR(I.arguments),toolCallId:I.call_id});continue}if(I.type==="function_call_output"){s.push({role:"tool_result",timestamp:C,content:ae(sr(I.output)),toolCallId:I.call_id});continue}if(I.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:C,content:I.name||"unknown tool",toolName:I.name,toolInput:I.input!==void 0?ae(sr(I.input)):void 0,toolInputData:HR(I.name,I.input),toolCallId:I.call_id});continue}if(I.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:C,content:ae(sr(I.output)),toolCallId:I.call_id});continue}if(I.type==="reasoning"&&I.summary){let N=I.summary.map(A=>sr(A.text)).join(`
2089
- `);N.trim()&&is(s,h,{role:"thinking",timestamp:C,content:ae(N)});continue}}if(b.type==="event_msg"&&b.payload&&(b.payload.type==="task_started"?(g(),p="in_progress"):b.payload.type==="task_complete"?p="complete":b.payload.type==="turn_aborted"&&(p="aborted"),b.payload.type==="user_message"&&typeof b.payload.message=="string"&&w(b.payload.message,"event"),b.payload.type==="agent_reasoning")){let I=b.payload.message||b.payload.text;I&&is(s,h,{role:"thinking",timestamp:C,content:ae(I)})}}if(!i)return null;g();let E=await ah(n);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:m,turnStatus:p,firstUserMessage:c,lastUserMessage:d,messageCount:E.messageCount,filePath:n,totalInputTokens:E.totalInputTokens||void 0,totalCachedInputTokens:E.totalCachedInputTokens||void 0,totalOutputTokens:E.totalOutputTokens||void 0,totalReasoningOutputTokens:E.totalReasoningOutputTokens||void 0,lastInputTokens:E.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:E.lastTokenUsage,modelContextWindow:E.modelContextWindow,messages:s,userPrompts:_}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await DR(n),!0):!1}async resolveSessionFile(e){let n=await this.getSessionsDirs(),r=[];for(let i of n){let o=await this.findSessionFiles(i);r.push(...o)}for(let i of r)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await Je(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function wc(t){return new vc(t)}var Ec,vc,Tc=O(()=>{"use strict";lh();Ae();Dt();xe();Ec="gpt-5.6-sol",vc=class extends ne{constructor(e){super({provider:new mo(e),protocol:{transport:"codex-app-server",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${Y}
2090
- `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Qg})}openSession(e){return Zg({...e,model:e.model??Ec})}seedArgsFor(e){let n=super.seedArgsFor(e),r=e?.model??Ec;return[...n.slice(0,-1),"--model",r,n[n.length-1]]}turnOptsFor(e){return e.model?e:{...e,model:Ec}}}});function os(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);if(e.length>1)try{let r=JSON.parse(e[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(t)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function po(t){let e=os(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let n=t.split(`
2091
- `).map(a=>a).filter(a=>a.trim().length>0);if(n.length===0)throw new Error("gemini session file is empty");let r=n[0],s;try{s=JSON.parse(r)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<n.length;a++){let l;try{l=JSON.parse(n[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let d=c;if(typeof d.id=="string"){let u=o.get(d.id);u?BR(u,d):(i.push(d),o.set(d.id,d))}else i.push(d)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:i}}function BR(t,e){for(let[n,r]of Object.entries(e))if(r!==void 0){if(n==="tokens"&&ch(t.tokens)&&ch(r)){t.tokens={...t.tokens,...r};continue}t[n]=r}}function ch(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function dh(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:n,...r}=t,s=[JSON.stringify(r)];for(let i of n)s.push(JSON.stringify(i));return s.join(`
2085
+ `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${_e(o,60)}`:_e(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){e({kind:"other",summary:n.slice(5)});return}}async function rh(t,e){if(e.bundleSession!==void 0)return Mt(e.bundleSession,"codex",e.sessionId,t,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal});let n=await Vg(t,{threadId:e.sessionId,requireResume:e.requireResume,onSessionId:e.onSessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?r=>nh(r,e.onProgress):void 0,signal:e.signal});return{text:n.result,sessionId:n.threadId,durationMs:n.durationMs}}async function sh(t){let e=await zg({threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen,closeTimeoutMs:t.closeTimeoutMs});return{provider:"codex",get sessionId(){return e.sessionId},get completedTurns(){return e.completedTurns},async sendTurn(n,r={}){let s=await e.sendTurn(n,{...r,onEvent:i=>{r.onEvent?.(i),r.onProgress&&nh(i,r.onProgress)}});return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs}},close:()=>e.close()}}var OR,Ft=O(()=>{"use strict";fc();fc();Yg();tc();rr();oe();OR=256});function yc(t={}){let e=mc(t.miniplayerHome),n=r=>({...r??process.env,MINIPLAYER_HOME:e});return new class extends ne{constructor(){super({provider:new to({miniplayerHome:e}),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeSession:!1,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none",leaderSetupHint:"Miniplayer provides native file, shell and web tools. Live ACP sessions cannot be resumed after exit."},binary:"miniplayer",seedArgs:[],resumeTemplate:"",startTemplate:"miniplayer run",transport:(r,s)=>{if(s.sessionId||s.requireResume)throw new Error('miniplayer does not support resume; use lmctl prompt --provider miniplayer --model <model> "<prompt>"');return vt(r,{...s,env:n(s.env),acpTool:"miniplayer",requireResume:!1})}})}openSession(r){if(r.sessionId)throw new Error("miniplayer cannot reopen a closed ACP session; start a fresh conversation");return wt({...r,env:n(r.env),binary:"miniplayer",acpTool:"miniplayer"})}manualSeedHint(){return{launchCommand:"miniplayer --help",postLaunchNote:'Use lmctl prompt --provider miniplayer --model <model> "<prompt>". Each invocation creates a fresh run.',lsCommand:"lmctl ls --provider miniplayer"}}resumeCommand(){throw new Error("miniplayer has no interactive terminal or session resume")}async seed(){return{success:!1,error:'miniplayer does not support team session resume; use lmctl prompt --provider miniplayer --model <model> "<prompt>"'}}}}var Ec=O(()=>{"use strict";Ae();Ng();Ft()});import{readdir as po,stat as ih,unlink as PR}from"node:fs/promises";import{join as or,basename as oh}from"node:path";function DR(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function FR(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return ae(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}function $R(t,e){t.input=Math.max(t.input,e.input),t.cacheRead=Math.max(t.cacheRead,e.cacheRead),t.cacheWrite=Math.max(t.cacheWrite,e.cacheWrite),t.output=Math.max(t.output,e.output),t.cacheWriteSplitExposed||=e.cacheWriteSplitExposed,e.cacheWrite5m!==void 0&&(t.cacheWrite5m=Math.max(t.cacheWrite5m??0,e.cacheWrite5m)),e.cacheWrite1h!==void 0&&(t.cacheWrite1h=Math.max(t.cacheWrite1h??0,e.cacheWrite1h))}function jR(t){let e=t?.cache_creation?.ephemeral_5m_input_tokens,n=t?.cache_creation?.ephemeral_1h_input_tokens,r=typeof e=="number"||typeof n=="number",s=(e??0)+(n??0);return{input:t?.input_tokens??0,cacheRead:t?.cache_read_input_tokens??0,cacheWrite:Math.max(t?.cache_creation_input_tokens??0,s),...typeof e=="number"?{cacheWrite5m:e}:{},...typeof n=="number"?{cacheWrite1h:n}:{},cacheWriteSplitExposed:r,output:t?.output_tokens??0}}function UR(t){let e=t.cacheWrite1h??0;if(!t.cacheWriteSplitExposed)return{total:t.cacheWrite,fiveMinute:t.cacheWrite,oneHour:0};let n=t.cacheWrite5m??Math.max(0,t.cacheWrite-e),r=n+e;return{total:Math.max(t.cacheWrite,r),fiveMinute:r>t.cacheWrite?n:n+(t.cacheWrite-r),oneHour:e}}async function ah(t){let e=0,n=0,r=0,s=0,i=0,o=0,a,l,c=new Map,d=[];for await(let h of me(t))if(!h.isSidechain){if(h.type==="user"&&!h.isMeta&&h.message){let _=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;e++,l=q(_.trim(),80)}}else if(h.type==="assistant"&&h.message){let _=h.message.content;if(Array.isArray(_))for(let f of _)f.type==="text"&&e++;let y=h.message.usage;if(y){let f=jR(y),w=h.message.id?.trim();if(w){let E=c.get(w);E?$R(E,f):c.set(w,f)}else d.push(f);let g=f.input+f.cacheWrite+f.cacheRead;g&&(o=g),a={inputTokens:f.input,cacheWriteInputTokens:f.cacheWrite,cachedInputTokens:f.cacheRead,outputTokens:f.output}}}}let u=0,m=0,p=h=>{let _=UR(h);n+=h.input+h.cacheRead+_.total,r+=h.cacheRead,s+=_.total,u+=_.fiveMinute,m+=_.oneHour,i+=h.output};for(let h of c.values())p(h);for(let h of d)p(h);return{messageCount:e,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalCacheWrite5mInputTokens:u,totalCacheWrite1hInputTokens:m,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a,lastUserMessage:l}}function HR(t){let e=BR(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/Command running in background with ID:\s*([A-Za-z0-9_-]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function BR(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var fo,lh=O(()=>{"use strict";be();fo=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||or(K,".claude"),this.projectsDir=or(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await po(this.projectsDir)}catch{return e}for(let r of n){let s=or(this.projectsDir,r);if(!(await ih(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await po(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=oh(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=or(s,a);try{let d=await this.extractSummary(c,l);d&&e.push(d)}catch{}}}return e}async extractSummary(e,n){let r=await Je(e,50),s=await ye(e),i="",o,a,l,c,d,u;for(let p of r)if(!DR(p.type)&&(!i&&p.cwd&&(i=p.cwd),!o&&p.slug&&(o=p.slug),!a&&p.version&&(a=p.version),!u&&p.timestamp&&(u=new Date(p.timestamp)),p.type==="assistant"&&p.message?.model&&(l=p.message.model),p.type==="user"&&!p.isMeta&&p.message)){let h=p.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;c||(c=q(h.trim(),80)),d=q(h.trim(),80)}}if(!i)return null;let m=await ah(e);return{provider:"claude",sessionId:n,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:m.lastUserMessage??d,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:m.totalCacheWriteInputTokens||void 0,totalCacheWrite5mInputTokens:m.totalCacheWrite5mInputTokens||void 0,totalCacheWrite1hInputTokens:m.totalCacheWrite1hInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await ye(n),s=[],i="",o,a,l,c,d,u,m,p=e,h,_=[];for await(let f of me(n))if(f.type!=="file-history-snapshot"&&!f.isSidechain){if(!i&&f.cwd&&(i=f.cwd),!o&&f.slug&&(o=f.slug),!a&&f.version&&(a=f.version),!c&&f.gitBranch&&(c=f.gitBranch),!m&&f.timestamp&&(m=new Date(f.timestamp)),f.sessionId&&(p=f.sessionId),f.type==="system"||f.type==="progress"||f.type==="queue-operation"){s.push({role:"system",timestamp:new Date(f.timestamp||0),content:FR(f)});continue}if(f.type==="user"&&f.message){if(f.isMeta)continue;let w=new Date(f.timestamp||0),g=f.message.content;if(f.isCompactSummary!==!0&&f.isVisibleInTranscriptOnly!==!0&&f.promptSource!=="system"&&f.toolUseResult===void 0&&f.origin?.kind!=="task-notification"&&f.interruptedMessageId===void 0&&f.interruptedByShutdown!==!0&&f.scheduledTaskId===void 0&&f.scheduledFireId===void 0&&!(Array.isArray(g)&&g.some(E=>E.type==="tool_result"))){let E=typeof g=="string"?g:Array.isArray(g)?g.filter(b=>b.type==="text"&&typeof b.text=="string").map(b=>b.text).join(`
2086
+ `):"";E&&!/^<(?:command-name>|local-command-|task-notification>\s*<|system-reminder>)/u.test(E.trimStart())&&!E.trimStart().startsWith("lmctl seed initial connection only.")&&_.push(E)}if(typeof g=="string"){let E=g.trim();if(E.includes("<command-name>")||E.includes("<local-command-")||/^<task-notification>\s*</u.test(E)||E.startsWith("lmctl seed initial connection only.")||/^<system-reminder>[\s\S]*<\/system-reminder>$/u.test(E))continue;d||(d=q(g.trim(),80)),u=q(g.trim(),80),h=void 0,s.push({role:"user",timestamp:w,content:ae(g.trim())})}else if(Array.isArray(g)){for(let E of g)if(E.type==="tool_result"){let b=typeof E.content=="string"?ae(E.content):JSON.stringify(E.content);s.push({role:"tool_result",timestamp:w,content:b,toolCallId:E.tool_use_id})}}}if(f.type==="assistant"&&f.message){f.message.stop_reason===null||f.message.stop_reason==="tool_use"?h="in_progress":typeof f.message.stop_reason=="string"&&(h="complete"),f.message.model&&(l=f.message.model);let w=new Date(f.timestamp||0),g=f.message.content;if(Array.isArray(g))for(let E of g)E.type==="text"&&E.text?s.push({role:"assistant",timestamp:w,content:ae(E.text),model:f.message.model,...typeof f.message.stop_reason=="string"?{stopReason:f.message.stop_reason}:{}}):E.type==="tool_use"?s.push({role:"tool_use",timestamp:w,content:E.name||"unknown tool",toolName:E.name,toolInput:JSON.stringify(E.input,null,2),toolInputData:E.input,toolCallId:E.id,model:f.message.model,...typeof f.message.stop_reason=="string"?{stopReason:f.message.stop_reason}:{}}):E.type==="thinking"&&E.thinking&&s.push({role:"thinking",timestamp:w,content:E.thinking})}}if(!i)return null;HR(s);let y=await ah(n);return{provider:"claude",sessionId:p,slug:o,cwd:i,createdAt:m||r.createdAt,modifiedAt:r.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,turnStatus:h,firstUserMessage:d,lastUserMessage:u,messageCount:y.messageCount,filePath:n,totalInputTokens:y.totalInputTokens||void 0,totalCachedInputTokens:y.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:y.totalCacheWriteInputTokens||void 0,totalCacheWrite5mInputTokens:y.totalCacheWrite5mInputTokens||void 0,totalCacheWrite1hInputTokens:y.totalCacheWrite1hInputTokens||void 0,totalOutputTokens:y.totalOutputTokens||void 0,lastInputTokens:y.lastInputTokens||void 0,lastTokenUsage:y.lastTokenUsage,messages:s,userPrompts:_}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await PR(n),!0):!1}async resolveSessionFile(e){let n;try{n=await po(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=or(this.projectsDir,o);if(!(await ih(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await po(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=oh(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&r.push({filePath:or(a,d),fileSessionId:u})}}let s=r.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of r){let a=await Je(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{join as ch}from"node:path";function wc(t){return new vc(t)}var vc,Tc=O(()=>{"use strict";lh();Ae();be();Ft();xe();vc=class extends ne{claudeDir;constructor(e){super({provider:new fo(e),protocol:{transport:"stream-json",perTurnCancellation:"process",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Y,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:uo}),this.claudeDir=e?.claudeDir??ch(K,".claude")}openSession(e){return mo({...e,binary:"claude",sessionFileRoots:e.sessionFileRoots??[ch(this.claudeDir,"projects")]})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as WR,stat as dh,unlink as XR}from"node:fs/promises";import{join as as,basename as qR}from"node:path";function GR(t,e,n){return`${t}|${e.toISOString()}|${n}`}function ls(t,e,n){let r=GR(n.role,n.timestamp,n.content);e.has(r)||(e.add(r),t.push(n))}function uh(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function JR(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function ar(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(n=>{if(typeof n=="string")return n;if(n&&typeof n=="object"){let r=n;if(typeof r.text=="string")return r.text;if(typeof r.image_url=="string")return"[input_image]";if(typeof r.type=="string")return`[${r.type}]`}return ar(n)}).filter(n=>n.length>0).join(`
2087
+ `);try{return JSON.stringify(t)}catch{return String(t)}}function KR(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function VR(t,e){if(e===void 0)return;let n={input:e};if(t!=="apply_patch"||typeof e!="string")return n;let r=[...e.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return r.length>0&&(n.path=r[0].path,n.paths=r.map(s=>s.path),n.kinds=r.map(s=>s.kind)),n}async function mh(t){let e=0,n=0,r=0,s=0,i=0,o,a,l;for await(let c of me(t)){if(c.type==="event_msg"&&c.payload?.type==="user_message"){let d=c.payload.message||c.payload.text;d&&(l=q(d.trim(),80))}if(c.type==="response_item"&&c.payload){let d=c.payload;if(d.type==="message"&&d.role==="user"&&d.content)for(let u of d.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&(e++,l=q(u.text.trim(),80));else if(d.type==="message"&&d.role==="assistant"&&d.content)for(let u of d.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(c.payload&&typeof c.payload.model_context_window=="number"&&(a=c.payload.model_context_window),c.type==="event_msg"&&c.payload?.type==="token_count"&&c.payload.info?.total_token_usage){let d=c.payload.info.total_token_usage;n=d.input_tokens??n,r=d.cached_input_tokens??d.cache_read_input_tokens??r,s=d.output_tokens??s,i=d.reasoning_output_tokens??i;let u=JR(c.payload.info.last_token_usage);u&&(o=u),typeof c.payload.info.model_context_window=="number"&&(a=c.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a,lastUserMessage:l}}var go,ph=O(()=>{"use strict";be();go=class{name="codex";codexDirs;constructor(e={}){let n=[as(K,".codex"),as(K,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let r=[e.codexDir||n[0],e.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:as(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let n of this.codexDirs){let r=as(n,"sessions");try{await dh(r),e.push(r)}catch{}}return e}async discoverSessions(){let e=[],n=await this.getSessionsDirs();for(let r of n){let s=await this.findSessionFiles(r);for(let i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let n=[],r;try{r=await WR(e)}catch{return n}for(let s of r){let i=as(e,s),o=await dh(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);n.push(...a)}else s.endsWith(".jsonl")&&n.push(i)}return n}extractSessionIdFromFilename(e){let n=qR(e,".jsonl"),r=n.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async extractSummary(e){let n=await Je(e,30),r=await ye(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,d,u,m;for(let h of n){if(h.type==="session_meta"&&h.payload&&(h.payload.id&&(s=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),h.payload.originator&&(u=h.payload.originator),h.payload.source&&(m=h.payload.source)),h.type==="turn_context"&&h.payload&&(h.payload.model&&(a=h.payload.model),!i&&h.payload.cwd&&(i=h.payload.cwd)),h.type==="event_msg"&&h.payload?.type==="user_message"){let _=h.payload.message||h.payload.text;_&&(c||(c=q(_.trim(),80)),d=q(_.trim(),80))}if(h.type==="response_item"&&h.payload?.type==="message"&&h.payload.role==="user"&&h.payload.content){let _=h.payload.content.find(y=>y.type==="input_text"&&typeof y.text=="string"&&y.text);typeof _?.text=="string"&&(c||(c=q(_.text.trim(),80)),d=q(_.text.trim(),80))}}if(!i)return null;let p=await mh(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:uh(u,m),firstUserMessage:c,lastUserMessage:p.lastUserMessage??d,messageCount:p.messageCount,filePath:e,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow}}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await ye(n),s=[],i="",o,a,l,c,d,u=e,m,p,h=new Set,_=[],y=new Set,f=[],w=(b,C)=>{let I=f.find(N=>!N.mirrored&&N.source!==C&&N.text===b);I?I.mirrored=!0:f.push({text:b,source:C,mirrored:!1})},g=()=>{_.push(...f.map(b=>b.text)),f=[]};for await(let b of me(n)){let C=b.timestamp?new Date(b.timestamp):new Date;if(b.type==="session_meta"&&b.payload){b.payload.id&&(u=b.payload.id),b.payload.cwd&&(i=b.payload.cwd),b.payload.cli_version&&(o=b.payload.cli_version),b.payload.timestamp&&(l=new Date(b.payload.timestamp)),m=uh(b.payload.originator,b.payload.source);continue}if(b.type==="turn_context"&&b.payload){b.payload.model&&(a=b.payload.model),!i&&b.payload.cwd&&(i=b.payload.cwd);continue}if(b.type==="response_item"&&b.payload){let I=b.payload;if(I.type==="message"){if(I.role==="user"&&I.content){let N=I.internal_chat_message_metadata_passthrough?.content_item_kinds;if(Array.isArray(N)){let A=I.content.filter((S,v)=>N[v]==="user.text"&&typeof S.text=="string").map(S=>S.text).join(`
2088
+ `);N.includes("user.text")&&A&&(!I.id||!y.has(I.id))&&(w(A,"metadata"),I.id&&y.add(I.id))}for(let A of I.content)if(A.type==="input_text"&&typeof A.text=="string"&&A.text){let S=A.text.trim();c||(c=q(S,80)),d=q(S,80),ls(s,h,{role:"user",timestamp:C,content:ae(S)})}continue}if(I.role==="assistant"&&I.content){for(let N of I.content)N.type==="output_text"&&typeof N.text=="string"&&N.text&&ls(s,h,{role:"assistant",timestamp:C,content:ae(N.text),model:a});continue}if(I.role!=="user"&&I.role!=="assistant"&&I.content){for(let N of I.content)(N.type==="input_text"||N.type==="output_text")&&typeof N.text=="string"&&N.text&&ls(s,h,{role:"system",timestamp:C,content:ae(N.text.trim())});continue}}if(I.type==="function_call"){s.push({role:"tool_use",timestamp:C,content:I.name||"unknown tool",toolName:I.name,toolInput:I.arguments!==void 0?ae(ar(I.arguments)):void 0,toolInputData:KR(I.arguments),toolCallId:I.call_id});continue}if(I.type==="function_call_output"){s.push({role:"tool_result",timestamp:C,content:ae(ar(I.output)),toolCallId:I.call_id});continue}if(I.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:C,content:I.name||"unknown tool",toolName:I.name,toolInput:I.input!==void 0?ae(ar(I.input)):void 0,toolInputData:VR(I.name,I.input),toolCallId:I.call_id});continue}if(I.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:C,content:ae(ar(I.output)),toolCallId:I.call_id});continue}if(I.type==="reasoning"&&I.summary){let N=I.summary.map(A=>ar(A.text)).join(`
2089
+ `);N.trim()&&ls(s,h,{role:"thinking",timestamp:C,content:ae(N)});continue}}if(b.type==="event_msg"&&b.payload&&(b.payload.type==="task_started"?(g(),p="in_progress"):b.payload.type==="task_complete"?p="complete":b.payload.type==="turn_aborted"&&(p="aborted"),b.payload.type==="user_message"&&typeof b.payload.message=="string"&&w(b.payload.message,"event"),b.payload.type==="agent_reasoning")){let I=b.payload.message||b.payload.text;I&&ls(s,h,{role:"thinking",timestamp:C,content:ae(I)})}}if(!i)return null;g();let E=await mh(n);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:m,turnStatus:p,firstUserMessage:c,lastUserMessage:d,messageCount:E.messageCount,filePath:n,totalInputTokens:E.totalInputTokens||void 0,totalCachedInputTokens:E.totalCachedInputTokens||void 0,totalOutputTokens:E.totalOutputTokens||void 0,totalReasoningOutputTokens:E.totalReasoningOutputTokens||void 0,lastInputTokens:E.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:E.lastTokenUsage,modelContextWindow:E.modelContextWindow,messages:s,userPrompts:_}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await XR(n),!0):!1}async resolveSessionFile(e){let n=await this.getSessionsDirs(),r=[];for(let i of n){let o=await this.findSessionFiles(i);r.push(...o)}for(let i of r)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await Je(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function kc(t){return new Sc(t)}var bc,Sc,Rc=O(()=>{"use strict";ph();Ae();Ft();xe();bc="gpt-5.6-sol",Sc=class extends ne{constructor(e){super({provider:new go(e),protocol:{transport:"codex-app-server",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${Y}
2090
+ `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:rh})}openSession(e){return sh({...e,model:e.model??bc})}seedArgsFor(e){let n=super.seedArgsFor(e),r=e?.model??bc;return[...n.slice(0,-1),"--model",r,n[n.length-1]]}turnOptsFor(e){return e.model?e:{...e,model:bc}}}});function cs(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);if(e.length>1)try{let r=JSON.parse(e[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(t)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function ho(t){let e=cs(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let n=t.split(`
2091
+ `).map(a=>a).filter(a=>a.trim().length>0);if(n.length===0)throw new Error("gemini session file is empty");let r=n[0],s;try{s=JSON.parse(r)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<n.length;a++){let l;try{l=JSON.parse(n[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let d=c;if(typeof d.id=="string"){let u=o.get(d.id);u?zR(u,d):(i.push(d),o.set(d.id,d))}else i.push(d)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:i}}function zR(t,e){for(let[n,r]of Object.entries(e))if(r!==void 0){if(n==="tokens"&&fh(t.tokens)&&fh(r)){t.tokens={...t.tokens,...r};continue}t[n]=r}}function fh(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function gh(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:n,...r}=t,s=[JSON.stringify(r)];for(let i of n)s.push(JSON.stringify(i));return s.join(`
2092
2092
  `)+`
2093
- `}var bc=O(()=>{"use strict"});import{createHash as WR}from"node:crypto";import{readdir as as,readFile as uh,stat as fo,unlink as XR}from"node:fs/promises";import{join as Ke,basename as qR,dirname as GR}from"node:path";import{cwd as JR}from"node:process";function Sc(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function mh(t){return t==="user"}function kc(t){return t==="gemini"||t==="assistant"}function xn(t,e=new Date(0)){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function KR(t){return`${t.sessionId}\0${t.cwd}`}function VR(t,e){let n=t.filePaths??[t.filePath],r=e.filePaths??[e.filePath],s=[...new Set([...n,...r])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function go(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function ph(t){let e=0,n=0,r=0,s=0,i=0,o;for(let a of t){if(!kc(a.type)||!a.tokens)continue;let l=go(a.tokens.input),c=go(a.tokens.cached),d=Math.max(l-c,0),u=go(a.tokens.output),m=go(a.tokens.thoughts);e+=l,n+=c,r+=u,s+=m,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:m,totalTokens:l+u+m}}return{totalInputTokens:e,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function zR(t){return WR("sha256").update(t).digest("hex")}function ls(t,e){let n=e;for(;n&&!t.has(n);){t.add(n);let r=GR(n);if(r===n)break;n=r}}var ho,fh=O(()=>{"use strict";be();bc();oe();ho=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let n=e.geminiDir||Ke(K,".gemini");this.geminiProjectsFile=Ke(n,"projects.json"),this.geminiTmpDir=Ke(n,"tmp");let r=e.claudeDir||Ke(K,".claude");this.claudeProjectsDir=Ke(r,"projects");let s=[Ke(K,".codex"),Ke(K,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Ke(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),n=new Map;for(let r of e)try{let s=await this.extractSummary(r);if(!s)continue;let i=KR(s),o=n.get(i);n.set(i,o?VR(o,s):s)}catch{}return[...n.values()]}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await ye(n),i=[],o=[],a=r.messages||[],l=r.sessionId||this.extractSessionIdFromFilename(n),c=r.projectHash||"",d=await this.resolveWorkspace(c),u,m,p;for(let f of a){let w=xn(f.timestamp),g=f.type,E=ae(Sc(f.content));if(mh(g)){let C=Sc(f.content);C&&o.push(C);let I=E.trim();I&&(u||(u=q(I,80)),m=q(I,80)),i.push({role:"user",timestamp:w,content:I||E});continue}if(kc(g)){f.model&&(p=f.model);for(let C of f.thoughts||[]){let I=[C.subject,C.description].filter(Boolean).join(`
2094
- `).trim();I&&i.push({role:"thinking",timestamp:xn(C.timestamp,w),content:ae(I)})}i.push({role:"assistant",timestamp:w,content:E,model:f.model});continue}let b=g?`[${g}] `:"";i.push({role:"system",timestamp:w,content:`${b}${E}`.trim()})}let h=xn(r.startTime,s.createdAt),_=xn(r.lastUpdated,s.modifiedAt),y=ph(a);return{provider:"gemini",sessionId:l,cwd:d,createdAt:h,modifiedAt:_,model:p,startCommand:"gemini",firstUserMessage:u,lastUserMessage:m,messageCount:i.filter(f=>f.role==="user"||f.role==="assistant").length,filePath:n,totalInputTokens:y.totalInputTokens||void 0,totalCachedInputTokens:y.totalCachedInputTokens||void 0,totalOutputTokens:y.totalOutputTokens||void 0,totalReasoningOutputTokens:y.totalReasoningOutputTokens||void 0,lastInputTokens:y.lastInputTokens||void 0,lastTokenUsage:y.lastTokenUsage,messages:i,userPrompts:o}}async extractSummary(e){let n=await this.readSessionFile(e);if(!n)return null;let r=await ye(e),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(e),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let p of s)if(mh(p.type)){u++;let h=Sc(p.content).trim();h&&(l||(l=q(ae(h),80)),c=q(ae(h),80))}else kc(p.type)&&(u++,p.model&&(d=p.model));let m=ph(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:xn(n.startTime,r.createdAt),modifiedAt:xn(n.lastUpdated,r.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async readSessionFile(e){let n=await uh(e,"utf-8");if(os(n)==="unknown")return U({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:n.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return po(n)}catch{return null}}extractSessionIdFromFilename(e){let n=qR(e).replace(/\.jsonl?$/,""),r=n.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async findSessionFiles(){let e=[],n;try{n=await as(this.geminiTmpDir)}catch{return e}for(let r of n){let s=Ke(this.geminiTmpDir,r,"chats");if(!(await fo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await as(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ke(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await XR(n),!0):!1}async resolveSessionFile(e){let n=await this.findSessionFiles(),r=[];for(let s of n){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),c=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!c)continue;let d=await ye(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:xn(i?.lastUpdated,d.modifiedAt)})}return r.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),r[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;ls(e,JR());for(let r of this.extraWorkspacePaths)ls(e,r);for(let r of await this.collectGeminiProjectPaths())ls(e,r);for(let r of await this.collectCodexCwds())ls(e,r);for(let r of await this.collectClaudeCwds())ls(e,r);let n=new Map;for(let r of e)n.set(zR(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let e;try{e=await uh(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(e).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await Je(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,n;try{n=await as(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=Ke(this.claudeProjectsDir,r);if(!(await fo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await as(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ke(s,a),d=(await Je(l,1).catch(()=>[]))[0]?.cwd;d&&e.add(d)}}return[...e]}async findJsonlFiles(e){let n=[];if(!(await fo(e).catch(()=>null))?.isDirectory())return n;let s;try{s=await as(e)}catch{return n}for(let i of s){let o=Ke(e,i),a=await fo(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);n.push(...l)}else i.endsWith(".jsonl")&&n.push(o)}return n}}});import{readFileSync as YR,writeFileSync as QR,mkdirSync as ZR}from"node:fs";import{join as eI,dirname as tI}from"node:path";import{randomUUID as nI}from"node:crypto";function Ic(t){return new Rc(t)}var Rc,xc=O(()=>{"use strict";qn();fh();Ae();xe();bc();Rc=class extends ne{constructor(e){super({provider:new ho(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!1,canResumeInteractive:!1,canFork:!0,forkSupport:"automatic",canStructuredTurn:!1,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",Y,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:()=>Promise.reject(new Error(Yt))})}seed(e,n){return Promise.resolve({success:!1,error:Yt})}sendTurn(e,n){return Promise.reject(new Error(Yt))}openSession(e){return Promise.reject(new Error(Yt))}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
2095
- `)}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Gi,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,n){let r=await this.resolvePath(e);if(!r)return{success:!1,error:`Session file not found for ${e}`};try{let s=YR(r,"utf-8"),i=os(s),o=po(s),a=nI();o.sessionId=a,o.kind="main";let l=tI(r),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,m=eI(l,u);return ZR(l,{recursive:!0}),QR(m,dh(o,i),"utf-8"),{success:!0,sessionId:a,filePath:m}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as gh,readFile as rI,rm as sI,stat as ir}from"node:fs/promises";import{basename as iI,join as lt}from"node:path";function oI(t){if(!t)return null;let e={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},n=!1;for(let r of Object.values(t))r?.usage&&(n=!0,e.inputTokens+=r.usage.inputTokens??0,e.outputTokens+=r.usage.outputTokens??0,e.cacheReadTokens+=r.usage.cacheReadTokens??0,e.cacheWriteTokens+=r.usage.cacheWriteTokens??0,e.reasoningTokens+=r.usage.reasoningTokens??0);return n?e:null}function Ac(){return{shutdownTotals:null,assistantOutputSum:0}}function _h(t,e){if(e.type==="assistant.message"){let n=e.data?.outputTokens;typeof n=="number"&&(t.assistantOutputSum+=n,t.lastAssistantOutputTokens=n)}else if(e.type==="session.shutdown"){let n=oI(e.data?.modelMetrics);n&&(t.shutdownTotals=n)}}function hh(t){let e=t.shutdownTotals,n=t.lastAssistantOutputTokens!==void 0?{outputTokens:t.lastAssistantOutputTokens}:void 0;return{totalInputTokens:e?.inputTokens,totalCachedInputTokens:e?.cacheReadTokens,totalCacheWriteInputTokens:e?.cacheWriteTokens,totalOutputTokens:e?.outputTokens??(t.lastAssistantOutputTokens===void 0?void 0:t.assistantOutputSum),totalReasoningOutputTokens:e?.reasoningTokens,lastTokenUsage:n}}function aI(t){let e={};for(let n of t.split(`
2096
- `)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(e[r[1]]=r[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function An(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function lI(t){let e=0,n=Ac(),r;for await(let s of me(t)){if(s.type==="user.message"){e++;let i=(s.data?.content||"").trim();i&&(r=q(i,80))}else s.type==="assistant.message"&&(s.data?.content||"").trim()&&e++;_h(n,s)}return{messageCount:e,tokens:n,lastUserMessage:r}}function cI(t){let e=dI(t),n=new Map;for(let r of t){if(r.role!=="tool_use"||r.toolCallId===void 0)continue;if(r.toolName==="bash"){let l=e.get(r.toolCallId),d=[l?.content,l?.toolDetailedContent].filter(m=>typeof m=="string").join(`
2097
- `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(d===void 0)continue;let u=`copilot-shell:${d}:${r.toolCallId}`;n.set(d,u),r.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=n.get(i);if(o===void 0)continue;r.backgroundTaskId=o;let a=e.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function dI(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var _o,yh=O(()=>{"use strict";be();_o=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||lt(K,".copilot");this.sessionStateDir=lt(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await gh(this.sessionStateDir)}catch{return e}for(let r of n){let s=lt(this.sessionStateDir,r);if((await ir(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.resolveSessionDir(e);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=lt(n,"events.jsonl"),i=await ir(s).catch(()=>null),o=i?s:lt(n,"workspace.yaml"),a=await ye(i?s:n),l=[],c=[],d=r?.cwd||"(unknown workspace)",u,m,p,h,_,y,f=r?.id||iI(n)||e,w=Ac();if(i)for await(let g of me(s)){let E=An(g.timestamp)||a.modifiedAt;if(_h(w,g),g.type==="session.start"&&g.data){g.data.sessionId&&(f=g.data.sessionId),g.data.copilotVersion&&(m=g.data.copilotVersion),g.data.startTime&&(y=An(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context&&(g.data.context.cwd&&(d=g.data.context.cwd),g.data.context.branch&&(p=g.data.context.branch));continue}if(g.type==="session.model_change"&&g.data?.newModel){u=g.data.newModel;continue}if(g.type==="user.message"&&g.data){let b=g.data.content||"";b&&c.push(b);let C=b.trim();C&&(h||(h=q(C,80)),_=q(C,80)),l.push({role:"user",timestamp:E,content:ae(C||b)});continue}if(g.type==="assistant.message"&&g.data){let b=(g.data.content||"").trim();if(b&&l.push({role:"assistant",timestamp:E,content:ae(b),model:u}),g.data.toolRequests)for(let C of g.data.toolRequests)l.push({role:"tool_use",timestamp:E,content:C.name||"unknown tool",toolName:C.name,toolInput:C.arguments?JSON.stringify(C.arguments,null,2):void 0,toolInputData:Ze(C.arguments),toolCallId:C.toolCallId});continue}if(g.type==="tool.execution_complete"&&g.data){let b=g.data.result?.content||"",C=g.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:E,content:ae(b),toolDetailedContent:C?ae(C):void 0,toolCallId:g.data.toolCallId});continue}if(g.type==="assistant.reasoning"&&g.data?.content){l.push({role:"thinking",timestamp:E,content:ae(g.data.content)});continue}if(g.type==="session.error"||g.type==="session.warning"||g.type==="session.info"||g.type==="system.message"){let b=g.data?.message||"";b.trim()&&l.push({role:"system",timestamp:E,content:ae(b)});continue}}if(!h){let g=(r?.summary||"").trim();g&&(h=q(g,80))}return cI(l),{provider:"copilot",sessionId:f,cwd:d,createdAt:y??An(r?.created_at)??a.createdAt,modifiedAt:An(r?.updated_at)??a.modifiedAt,model:u,cliVersion:m,startCommand:"copilot",gitBranch:p,firstUserMessage:h,lastUserMessage:_,messageCount:l.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:o,...hh(w),messages:l,userPrompts:c}}async extractSummary(e,n){let r=await this.readWorkspaceYaml(e),s=lt(e,"events.jsonl"),i=await ir(s).catch(()=>null),o=i?s:lt(e,"workspace.yaml"),a=await ye(i?s:e),l=i?await Je(s,20):[],c=r?.id||n,d=r?.cwd||"(unknown workspace)",u,m,p,h,_;for(let f of l)if(f.type==="session.start"&&f.data&&(f.data.sessionId&&(c=f.data.sessionId),f.data.copilotVersion&&(m=f.data.copilotVersion),f.data.startTime&&(p=An(f.data.startTime)),f.data.selectedModel&&(u=f.data.selectedModel),f.data.context?.cwd&&(d=f.data.context.cwd)),f.type==="session.model_change"&&f.data?.newModel&&(u||(u=f.data.newModel)),f.type==="user.message"&&f.data){let w=(f.data.content||"").trim();w&&(h||(h=q(w,80)),_=q(w,80))}if(!h){let f=(r?.summary||"").trim();f&&(h=q(f,80))}let y=i?await lI(s):{messageCount:0,tokens:Ac()};return{provider:"copilot",sessionId:c,cwd:d,createdAt:p??An(r?.created_at)??a.createdAt,modifiedAt:An(r?.updated_at)??a.modifiedAt,model:u,cliVersion:m,startCommand:"copilot",firstUserMessage:h,lastUserMessage:y.lastUserMessage??_,messageCount:y.messageCount,filePath:o,...hh(y.tokens)}}async readWorkspaceYaml(e){let n=lt(e,"workspace.yaml");try{let r=await rI(n,"utf-8");return aI(r)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let n=await this.resolveSessionDir(e);return n?(await sI(n,{recursive:!0}),!0):!1}async resolveSessionDir(e){let n;try{n=await gh(this.sessionStateDir)}catch{return null}if(n.includes(e)){let s=lt(this.sessionStateDir,e);if((await ir(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(e)){let i=lt(this.sessionStateDir,s);(await ir(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=lt(this.sessionStateDir,s);if(!(await ir(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function Nc(t){return new Cc(t)}var Cc,Oc=O(()=>{"use strict";yh();Ae();Dt();oe();xe();Cc=class extends ne{copilotDir;constructor(e){super({provider:new _o(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Y,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>Et(n,{...r,acpTool:"copilot"})}),this.copilotDir=e?.copilotDir}openSession(e){return vt({...e,env:this.copilotDir!==void 0?{...e.env??process.env,COPILOT_HOME:this.copilotDir}:e.env,binary:"copilot",acpTool:"copilot"})}async seed(e,n){let r=await super.seed(e,n);if(n?.model===void 0||n.model.trim().length===0)return r;let s="copilot seed does not implement per-session model selection";return Oe({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}}});function Mc(t){return new Lc(t)}var Lc,Pc=O(()=>{"use strict";Vr();Ae();Dt();xe();Lc=class extends ne{constructor(e){super({provider:new Qn(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",Y],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(n,r)=>Et(n,{...r,acpTool:"opencode"})})}openSession(e){return vt({...e,binary:"opencode",acpTool:"opencode"})}seedArgsFor(e){let n=["run"];return e?.model&&n.push("--model",e.model),e?.effort&&n.push("--variant",e.effort),n.push(e?.prompt??Y),n}}});import{appendFile as uI,mkdir as mI,readFile as Eh,readdir as vh,rm as pI,stat as wh}from"node:fs/promises";import{basename as fI,dirname as gI,isAbsolute as Th,join as Cn,relative as hI,resolve as Dc}from"node:path";function Fc(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function vI(t){return typeof t=="number"?new Date(t):Fc(t)??new Date(0)}function bh(t){return typeof t=="string"?t.trim():Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e&&typeof e.text=="string"?e.text:"").filter(Boolean).join(`
2098
- `).trim():""}function Sh(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function wI(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:Sh(t)??""}function TI(t){let e=bI(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function bI(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var _I,yI,EI,yo,kh=O(()=>{"use strict";be();_I="1.4",yI="1.5",EI=new Set([_I,yI]),yo=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=Dc(e?.kimiHome??process.env.KIMI_CODE_HOME??Cn(K,".kimi-code")),this.sessionsDir=Cn(this.homeDir,"sessions")}async discoverSessions(){let e=[];for(let n of await this.sessionFiles())try{let r=await this.summary(n);r&&e.push(r)}catch{}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){let n=await this.findSession(e);if(!n)return null;let r=await this.summary(n);if(!r)return null;let s=await this.parseWire(n.wirePath);return{...r,messages:s.messages,userPrompts:s.userPrompts}}async resolveSessionPath(e){return(await this.findSession(e))?.wirePath??null}async deleteSession(e){let n=await this.findSession(e);return n?(await pI(n.sessionDir,{recursive:!0,force:!0}),await mI(gI(this.indexPath()),{recursive:!0,mode:448}),await uI(this.indexPath(),`${JSON.stringify({sessionId:n.sessionId,deleted:!0})}
2099
- `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return Cn(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await vh(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=Cn(this.sessionsDir,s.name),o;try{o=await vh(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=Cn(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await Eh(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:Dc(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:Cn(n,"state.json"),wirePath:Cn(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!Th(e)||fI(e)!==n)return!1;let r=hI(this.sessionsDir,Dc(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Th(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await Eh(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await wh(e.wirePath)}catch{return null}let s=await wh(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=Fc(n.createdAt)??s.birthtime,a=Fc(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?q(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let n=[],r=[],s=new Set,i=!0,o,a,l,c=0,d=0,u=0,m=0,p=!1,h=0,_,y;for await(let f of me(e)){let w=vI(f.time??f.created_at);if(i&&(i=!1,f.type==="metadata"&&!EI.has(f.protocol_version))){let E=`Kimi transcript wire protocol version ${JSON.stringify(f.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:w,content:E}],userPrompts:[],messageCount:1,firstUserMessage:E,lastUserMessage:E}}if((f.type==="config.update"||f.type==="profile.bind")&&f.modelAlias&&(o=f.modelAlias),f.type==="usage.record"){f.model&&(o=f.model),p||=f.usage!==void 0;let E=f.usage?.inputOther??0,b=f.usage?.inputCacheRead??0,C=f.usage?.inputCacheCreation??0,I=f.usage?.output??0;c+=E,d+=b,u+=C,m+=I,f.usageScope==="turn"&&(_=E+b+C,y={inputTokens:E,cachedInputTokens:b,cacheWriteInputTokens:C,outputTokens:I,totalTokens:_+I});continue}if(f.type==="turn.prompt"&&f.origin?.kind==="user"){let E=bh(f.input);E&&((!f.promptId||!s.has(f.promptId))&&(r.push(E),f.promptId&&s.add(f.promptId)),a??=q(E,80),l=q(E,80),n.push({role:"user",timestamp:w,content:E}),h++);continue}if(f.type==="turn.steer"){let E=bh(f.input);E&&(n.push({role:"system",timestamp:w,content:E}),h++);continue}if(f.type!=="context.append_loop_event"||!f.event)continue;let g=f.event;g.type==="content.part"&&g.part?.type==="text"&&g.part.text?(n.push({role:"assistant",timestamp:w,content:g.part.text,model:o}),h++):g.type==="content.part"&&g.part?.type==="think"&&g.part.think?n.push({role:"thinking",timestamp:w,content:g.part.think,model:o}):g.type==="tool.call"?n.push({role:"tool_use",timestamp:w,content:g.name??"tool",toolName:g.name,toolInput:Sh(g.args),toolInputData:Ze(g.args),toolCallId:g.toolCallId,model:o}):g.type==="tool.result"&&n.push({role:"tool_result",timestamp:w,content:wI(g.result),toolCallId:g.toolCallId,model:o})}return TI(n),{messages:n,userPrompts:r,messageCount:h,model:o,firstUserMessage:a,lastUserMessage:l,totalInputTokens:p?c:void 0,totalCachedInputTokens:p?d:void 0,totalCacheWriteInputTokens:p?u:void 0,totalOutputTokens:p?m:void 0,lastInputTokens:_,lastTokenUsage:y}}}});function jc(t){return new $c(t)}var $c,Uc=O(()=>{"use strict";kh();Ae();Dt();xe();$c=class extends ne{kimiHome;constructor(e){super({provider:new yo(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",Y,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>Et(n,{...r,acpTool:"kimi"})}),this.kimiHome=e?.kimiHome}openSession(e){return vt({...e,env:this.kimiHome!==void 0?{...e.env??process.env,KIMI_CODE_HOME:this.kimiHome}:e.env,binary:"kimi",acpTool:"kimi"})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??Y,"--output-format","stream-json"),n}}});import{spawn as SI}from"node:child_process";import{mkdirSync as kI}from"node:fs";function Bc(t){return new Hc(t)}async function RI(t,e){let n=Date.now(),r=Rh({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});Te("lmplayer",r,e.permissionMode??"yolo");let s=await xh(e.binary,r,{cwd:e.cwd,env:we(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(Ih(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function Rh(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...en("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function Ih(t){let n=[Sn(t.stderr).trim(),t.error].filter(Boolean).join(`
2100
- `);return n?ge(n,{provider:"lmplayer"}):`exit code ${t.code}`}function xh(t,e,n){return new Promise((r,s)=>{let i;try{i=SI(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(_){s(_);return}let o="",a="",l="",c,d,u,m=[],p=!1,h=_=>{let y=_.trim();if(!y)return;let f;try{f=JSON.parse(y)}catch{m.push(_),n.onText?.(_);return}if(!or(f))return;let w=Eo(f,!1);c===void 0&&w!==void 0&&(c=w),d=Eo(f,!0)??d;let g=II(f);g!==void 0&&(u=g);let E=Ah(f);E&&(m.push(E),n.onText?.(E))};i.stdout?.on("data",_=>{let y=_.toString("utf8");o+=y,l+=y;let f=l.indexOf(`
2093
+ `}var Ic=O(()=>{"use strict"});import{createHash as YR}from"node:crypto";import{readdir as ds,readFile as hh,stat as _o,unlink as QR}from"node:fs/promises";import{join as Ke,basename as ZR,dirname as eI}from"node:path";import{cwd as tI}from"node:process";function xc(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function _h(t){return t==="user"}function Ac(t){return t==="gemini"||t==="assistant"}function Cn(t,e=new Date(0)){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function nI(t){return`${t.sessionId}\0${t.cwd}`}function rI(t,e){let n=t.filePaths??[t.filePath],r=e.filePaths??[e.filePath],s=[...new Set([...n,...r])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function yo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function yh(t){let e=0,n=0,r=0,s=0,i=0,o;for(let a of t){if(!Ac(a.type)||!a.tokens)continue;let l=yo(a.tokens.input),c=yo(a.tokens.cached),d=Math.max(l-c,0),u=yo(a.tokens.output),m=yo(a.tokens.thoughts);e+=l,n+=c,r+=u,s+=m,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:m,totalTokens:l+u+m}}return{totalInputTokens:e,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function sI(t){return YR("sha256").update(t).digest("hex")}function us(t,e){let n=e;for(;n&&!t.has(n);){t.add(n);let r=eI(n);if(r===n)break;n=r}}var Eo,Eh=O(()=>{"use strict";be();Ic();oe();Eo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let n=e.geminiDir||Ke(K,".gemini");this.geminiProjectsFile=Ke(n,"projects.json"),this.geminiTmpDir=Ke(n,"tmp");let r=e.claudeDir||Ke(K,".claude");this.claudeProjectsDir=Ke(r,"projects");let s=[Ke(K,".codex"),Ke(K,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Ke(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),n=new Map;for(let r of e)try{let s=await this.extractSummary(r);if(!s)continue;let i=nI(s),o=n.get(i);n.set(i,o?rI(o,s):s)}catch{}return[...n.values()]}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await ye(n),i=[],o=[],a=r.messages||[],l=r.sessionId||this.extractSessionIdFromFilename(n),c=r.projectHash||"",d=await this.resolveWorkspace(c),u,m,p;for(let f of a){let w=Cn(f.timestamp),g=f.type,E=ae(xc(f.content));if(_h(g)){let C=xc(f.content);C&&o.push(C);let I=E.trim();I&&(u||(u=q(I,80)),m=q(I,80)),i.push({role:"user",timestamp:w,content:I||E});continue}if(Ac(g)){f.model&&(p=f.model);for(let C of f.thoughts||[]){let I=[C.subject,C.description].filter(Boolean).join(`
2094
+ `).trim();I&&i.push({role:"thinking",timestamp:Cn(C.timestamp,w),content:ae(I)})}i.push({role:"assistant",timestamp:w,content:E,model:f.model});continue}let b=g?`[${g}] `:"";i.push({role:"system",timestamp:w,content:`${b}${E}`.trim()})}let h=Cn(r.startTime,s.createdAt),_=Cn(r.lastUpdated,s.modifiedAt),y=yh(a);return{provider:"gemini",sessionId:l,cwd:d,createdAt:h,modifiedAt:_,model:p,startCommand:"gemini",firstUserMessage:u,lastUserMessage:m,messageCount:i.filter(f=>f.role==="user"||f.role==="assistant").length,filePath:n,totalInputTokens:y.totalInputTokens||void 0,totalCachedInputTokens:y.totalCachedInputTokens||void 0,totalOutputTokens:y.totalOutputTokens||void 0,totalReasoningOutputTokens:y.totalReasoningOutputTokens||void 0,lastInputTokens:y.lastInputTokens||void 0,lastTokenUsage:y.lastTokenUsage,messages:i,userPrompts:o}}async extractSummary(e){let n=await this.readSessionFile(e);if(!n)return null;let r=await ye(e),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(e),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let p of s)if(_h(p.type)){u++;let h=xc(p.content).trim();h&&(l||(l=q(ae(h),80)),c=q(ae(h),80))}else Ac(p.type)&&(u++,p.model&&(d=p.model));let m=yh(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Cn(n.startTime,r.createdAt),modifiedAt:Cn(n.lastUpdated,r.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async readSessionFile(e){let n=await hh(e,"utf-8");if(cs(n)==="unknown")return U({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:n.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return ho(n)}catch{return null}}extractSessionIdFromFilename(e){let n=ZR(e).replace(/\.jsonl?$/,""),r=n.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async findSessionFiles(){let e=[],n;try{n=await ds(this.geminiTmpDir)}catch{return e}for(let r of n){let s=Ke(this.geminiTmpDir,r,"chats");if(!(await _o(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ds(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Ke(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await QR(n),!0):!1}async resolveSessionFile(e){let n=await this.findSessionFiles(),r=[];for(let s of n){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),c=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!c)continue;let d=await ye(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:Cn(i?.lastUpdated,d.modifiedAt)})}return r.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),r[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;us(e,tI());for(let r of this.extraWorkspacePaths)us(e,r);for(let r of await this.collectGeminiProjectPaths())us(e,r);for(let r of await this.collectCodexCwds())us(e,r);for(let r of await this.collectClaudeCwds())us(e,r);let n=new Map;for(let r of e)n.set(sI(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let e;try{e=await hh(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(e).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await Je(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,n;try{n=await ds(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=Ke(this.claudeProjectsDir,r);if(!(await _o(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ds(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Ke(s,a),d=(await Je(l,1).catch(()=>[]))[0]?.cwd;d&&e.add(d)}}return[...e]}async findJsonlFiles(e){let n=[];if(!(await _o(e).catch(()=>null))?.isDirectory())return n;let s;try{s=await ds(e)}catch{return n}for(let i of s){let o=Ke(e,i),a=await _o(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);n.push(...l)}else i.endsWith(".jsonl")&&n.push(o)}return n}}});import{readFileSync as iI,writeFileSync as oI,mkdirSync as aI}from"node:fs";import{join as lI,dirname as cI}from"node:path";import{randomUUID as dI}from"node:crypto";function Nc(t){return new Cc(t)}var Cc,Oc=O(()=>{"use strict";Kn();Eh();Ae();xe();Ic();Cc=class extends ne{constructor(e){super({provider:new Eo(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!1,canResumeInteractive:!1,canFork:!0,forkSupport:"automatic",canStructuredTurn:!1,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",Y,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:()=>Promise.reject(new Error(Qt))})}seed(e,n){return Promise.resolve({success:!1,error:Qt})}sendTurn(e,n){return Promise.reject(new Error(Qt))}openSession(e){return Promise.reject(new Error(Qt))}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
2095
+ `)}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Vi,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,n){let r=await this.resolvePath(e);if(!r)return{success:!1,error:`Session file not found for ${e}`};try{let s=iI(r,"utf-8"),i=cs(s),o=ho(s),a=dI();o.sessionId=a,o.kind="main";let l=cI(r),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,m=lI(l,u);return aI(l,{recursive:!0}),oI(m,gh(o,i),"utf-8"),{success:!0,sessionId:a,filePath:m}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as vh,readFile as uI,rm as mI,stat as lr}from"node:fs/promises";import{basename as pI,join as ct}from"node:path";function fI(t){if(!t)return null;let e={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},n=!1;for(let r of Object.values(t))r?.usage&&(n=!0,e.inputTokens+=r.usage.inputTokens??0,e.outputTokens+=r.usage.outputTokens??0,e.cacheReadTokens+=r.usage.cacheReadTokens??0,e.cacheWriteTokens+=r.usage.cacheWriteTokens??0,e.reasoningTokens+=r.usage.reasoningTokens??0);return n?e:null}function Lc(){return{shutdownTotals:null,assistantOutputSum:0}}function Th(t,e){if(e.type==="assistant.message"){let n=e.data?.outputTokens;typeof n=="number"&&(t.assistantOutputSum+=n,t.lastAssistantOutputTokens=n)}else if(e.type==="session.shutdown"){let n=fI(e.data?.modelMetrics);n&&(t.shutdownTotals=n)}}function wh(t){let e=t.shutdownTotals,n=t.lastAssistantOutputTokens!==void 0?{outputTokens:t.lastAssistantOutputTokens}:void 0;return{totalInputTokens:e?.inputTokens,totalCachedInputTokens:e?.cacheReadTokens,totalCacheWriteInputTokens:e?.cacheWriteTokens,totalOutputTokens:e?.outputTokens??(t.lastAssistantOutputTokens===void 0?void 0:t.assistantOutputSum),totalReasoningOutputTokens:e?.reasoningTokens,lastTokenUsage:n}}function gI(t){let e={};for(let n of t.split(`
2096
+ `)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(e[r[1]]=r[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function Nn(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function hI(t){let e=0,n=Lc(),r;for await(let s of me(t)){if(s.type==="user.message"){e++;let i=(s.data?.content||"").trim();i&&(r=q(i,80))}else s.type==="assistant.message"&&(s.data?.content||"").trim()&&e++;Th(n,s)}return{messageCount:e,tokens:n,lastUserMessage:r}}function _I(t){let e=yI(t),n=new Map;for(let r of t){if(r.role!=="tool_use"||r.toolCallId===void 0)continue;if(r.toolName==="bash"){let l=e.get(r.toolCallId),d=[l?.content,l?.toolDetailedContent].filter(m=>typeof m=="string").join(`
2097
+ `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(d===void 0)continue;let u=`copilot-shell:${d}:${r.toolCallId}`;n.set(d,u),r.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=n.get(i);if(o===void 0)continue;r.backgroundTaskId=o;let a=e.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function yI(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var vo,bh=O(()=>{"use strict";be();vo=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||ct(K,".copilot");this.sessionStateDir=ct(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await vh(this.sessionStateDir)}catch{return e}for(let r of n){let s=ct(this.sessionStateDir,r);if((await lr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.resolveSessionDir(e);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=ct(n,"events.jsonl"),i=await lr(s).catch(()=>null),o=i?s:ct(n,"workspace.yaml"),a=await ye(i?s:n),l=[],c=[],d=r?.cwd||"(unknown workspace)",u,m,p,h,_,y,f=r?.id||pI(n)||e,w=Lc();if(i)for await(let g of me(s)){let E=Nn(g.timestamp)||a.modifiedAt;if(Th(w,g),g.type==="session.start"&&g.data){g.data.sessionId&&(f=g.data.sessionId),g.data.copilotVersion&&(m=g.data.copilotVersion),g.data.startTime&&(y=Nn(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context&&(g.data.context.cwd&&(d=g.data.context.cwd),g.data.context.branch&&(p=g.data.context.branch));continue}if(g.type==="session.model_change"&&g.data?.newModel){u=g.data.newModel;continue}if(g.type==="user.message"&&g.data){let b=g.data.content||"";b&&c.push(b);let C=b.trim();C&&(h||(h=q(C,80)),_=q(C,80)),l.push({role:"user",timestamp:E,content:ae(C||b)});continue}if(g.type==="assistant.message"&&g.data){let b=(g.data.content||"").trim();if(b&&l.push({role:"assistant",timestamp:E,content:ae(b),model:u}),g.data.toolRequests)for(let C of g.data.toolRequests)l.push({role:"tool_use",timestamp:E,content:C.name||"unknown tool",toolName:C.name,toolInput:C.arguments?JSON.stringify(C.arguments,null,2):void 0,toolInputData:et(C.arguments),toolCallId:C.toolCallId});continue}if(g.type==="tool.execution_complete"&&g.data){let b=g.data.result?.content||"",C=g.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:E,content:ae(b),toolDetailedContent:C?ae(C):void 0,toolCallId:g.data.toolCallId});continue}if(g.type==="assistant.reasoning"&&g.data?.content){l.push({role:"thinking",timestamp:E,content:ae(g.data.content)});continue}if(g.type==="session.error"||g.type==="session.warning"||g.type==="session.info"||g.type==="system.message"){let b=g.data?.message||"";b.trim()&&l.push({role:"system",timestamp:E,content:ae(b)});continue}}if(!h){let g=(r?.summary||"").trim();g&&(h=q(g,80))}return _I(l),{provider:"copilot",sessionId:f,cwd:d,createdAt:y??Nn(r?.created_at)??a.createdAt,modifiedAt:Nn(r?.updated_at)??a.modifiedAt,model:u,cliVersion:m,startCommand:"copilot",gitBranch:p,firstUserMessage:h,lastUserMessage:_,messageCount:l.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:o,...wh(w),messages:l,userPrompts:c}}async extractSummary(e,n){let r=await this.readWorkspaceYaml(e),s=ct(e,"events.jsonl"),i=await lr(s).catch(()=>null),o=i?s:ct(e,"workspace.yaml"),a=await ye(i?s:e),l=i?await Je(s,20):[],c=r?.id||n,d=r?.cwd||"(unknown workspace)",u,m,p,h,_;for(let f of l)if(f.type==="session.start"&&f.data&&(f.data.sessionId&&(c=f.data.sessionId),f.data.copilotVersion&&(m=f.data.copilotVersion),f.data.startTime&&(p=Nn(f.data.startTime)),f.data.selectedModel&&(u=f.data.selectedModel),f.data.context?.cwd&&(d=f.data.context.cwd)),f.type==="session.model_change"&&f.data?.newModel&&(u||(u=f.data.newModel)),f.type==="user.message"&&f.data){let w=(f.data.content||"").trim();w&&(h||(h=q(w,80)),_=q(w,80))}if(!h){let f=(r?.summary||"").trim();f&&(h=q(f,80))}let y=i?await hI(s):{messageCount:0,tokens:Lc()};return{provider:"copilot",sessionId:c,cwd:d,createdAt:p??Nn(r?.created_at)??a.createdAt,modifiedAt:Nn(r?.updated_at)??a.modifiedAt,model:u,cliVersion:m,startCommand:"copilot",firstUserMessage:h,lastUserMessage:y.lastUserMessage??_,messageCount:y.messageCount,filePath:o,...wh(y.tokens)}}async readWorkspaceYaml(e){let n=ct(e,"workspace.yaml");try{let r=await uI(n,"utf-8");return gI(r)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let n=await this.resolveSessionDir(e);return n?(await mI(n,{recursive:!0}),!0):!1}async resolveSessionDir(e){let n;try{n=await vh(this.sessionStateDir)}catch{return null}if(n.includes(e)){let s=ct(this.sessionStateDir,e);if((await lr(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(e)){let i=ct(this.sessionStateDir,s);(await lr(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=ct(this.sessionStateDir,s);if(!(await lr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function Pc(t){return new Mc(t)}var Mc,Dc=O(()=>{"use strict";bh();Ae();Ft();oe();xe();Mc=class extends ne{copilotDir;constructor(e){super({provider:new vo(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Y,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>vt(n,{...r,acpTool:"copilot"})}),this.copilotDir=e?.copilotDir}openSession(e){return wt({...e,env:this.copilotDir!==void 0?{...e.env??process.env,COPILOT_HOME:this.copilotDir}:e.env,binary:"copilot",acpTool:"copilot"})}async seed(e,n){let r=await super.seed(e,n);if(n?.model===void 0||n.model.trim().length===0)return r;let s="copilot seed does not implement per-session model selection";return Oe({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}}});function $c(t){return new Fc(t)}var Fc,jc=O(()=>{"use strict";Qr();Ae();Ft();xe();Fc=class extends ne{constructor(e){super({provider:new tr(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",Y],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(n,r)=>vt(n,{...r,acpTool:"opencode"})})}openSession(e){return wt({...e,binary:"opencode",acpTool:"opencode"})}seedArgsFor(e){let n=["run"];return e?.model&&n.push("--model",e.model),e?.effort&&n.push("--variant",e.effort),n.push(e?.prompt??Y),n}}});import{appendFile as EI,mkdir as vI,readFile as Sh,readdir as kh,rm as wI,stat as Rh}from"node:fs/promises";import{basename as TI,dirname as bI,isAbsolute as Ih,join as On,relative as SI,resolve as Uc}from"node:path";function Hc(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function xI(t){return typeof t=="number"?new Date(t):Hc(t)??new Date(0)}function xh(t){return typeof t=="string"?t.trim():Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e&&typeof e.text=="string"?e.text:"").filter(Boolean).join(`
2098
+ `).trim():""}function Ah(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function AI(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:Ah(t)??""}function CI(t){let e=NI(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function NI(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var kI,RI,II,wo,Ch=O(()=>{"use strict";be();kI="1.4",RI="1.5",II=new Set([kI,RI]),wo=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=Uc(e?.kimiHome??process.env.KIMI_CODE_HOME??On(K,".kimi-code")),this.sessionsDir=On(this.homeDir,"sessions")}async discoverSessions(){let e=[];for(let n of await this.sessionFiles())try{let r=await this.summary(n);r&&e.push(r)}catch{}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){let n=await this.findSession(e);if(!n)return null;let r=await this.summary(n);if(!r)return null;let s=await this.parseWire(n.wirePath);return{...r,messages:s.messages,userPrompts:s.userPrompts}}async resolveSessionPath(e){return(await this.findSession(e))?.wirePath??null}async deleteSession(e){let n=await this.findSession(e);return n?(await wI(n.sessionDir,{recursive:!0,force:!0}),await vI(bI(this.indexPath()),{recursive:!0,mode:448}),await EI(this.indexPath(),`${JSON.stringify({sessionId:n.sessionId,deleted:!0})}
2099
+ `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return On(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await kh(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=On(this.sessionsDir,s.name),o;try{o=await kh(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=On(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await Sh(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:Uc(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:On(n,"state.json"),wirePath:On(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!Ih(e)||TI(e)!==n)return!1;let r=SI(this.sessionsDir,Uc(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Ih(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await Sh(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await Rh(e.wirePath)}catch{return null}let s=await Rh(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=Hc(n.createdAt)??s.birthtime,a=Hc(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?q(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let n=[],r=[],s=new Set,i=!0,o,a,l,c=0,d=0,u=0,m=0,p=!1,h=0,_,y;for await(let f of me(e)){let w=xI(f.time??f.created_at);if(i&&(i=!1,f.type==="metadata"&&!II.has(f.protocol_version))){let E=`Kimi transcript wire protocol version ${JSON.stringify(f.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:w,content:E}],userPrompts:[],messageCount:1,firstUserMessage:E,lastUserMessage:E}}if((f.type==="config.update"||f.type==="profile.bind")&&f.modelAlias&&(o=f.modelAlias),f.type==="usage.record"){f.model&&(o=f.model),p||=f.usage!==void 0;let E=f.usage?.inputOther??0,b=f.usage?.inputCacheRead??0,C=f.usage?.inputCacheCreation??0,I=f.usage?.output??0;c+=E,d+=b,u+=C,m+=I,f.usageScope==="turn"&&(_=E+b+C,y={inputTokens:E,cachedInputTokens:b,cacheWriteInputTokens:C,outputTokens:I,totalTokens:_+I});continue}if(f.type==="turn.prompt"&&f.origin?.kind==="user"){let E=xh(f.input);E&&((!f.promptId||!s.has(f.promptId))&&(r.push(E),f.promptId&&s.add(f.promptId)),a??=q(E,80),l=q(E,80),n.push({role:"user",timestamp:w,content:E}),h++);continue}if(f.type==="turn.steer"){let E=xh(f.input);E&&(n.push({role:"system",timestamp:w,content:E}),h++);continue}if(f.type!=="context.append_loop_event"||!f.event)continue;let g=f.event;g.type==="content.part"&&g.part?.type==="text"&&g.part.text?(n.push({role:"assistant",timestamp:w,content:g.part.text,model:o}),h++):g.type==="content.part"&&g.part?.type==="think"&&g.part.think?n.push({role:"thinking",timestamp:w,content:g.part.think,model:o}):g.type==="tool.call"?n.push({role:"tool_use",timestamp:w,content:g.name??"tool",toolName:g.name,toolInput:Ah(g.args),toolInputData:et(g.args),toolCallId:g.toolCallId,model:o}):g.type==="tool.result"&&n.push({role:"tool_result",timestamp:w,content:AI(g.result),toolCallId:g.toolCallId,model:o})}return CI(n),{messages:n,userPrompts:r,messageCount:h,model:o,firstUserMessage:a,lastUserMessage:l,totalInputTokens:p?c:void 0,totalCachedInputTokens:p?d:void 0,totalCacheWriteInputTokens:p?u:void 0,totalOutputTokens:p?m:void 0,lastInputTokens:_,lastTokenUsage:y}}}});function Wc(t){return new Bc(t)}var Bc,Xc=O(()=>{"use strict";Ch();Ae();Ft();xe();Bc=class extends ne{kimiHome;constructor(e){super({provider:new wo(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",Y,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>vt(n,{...r,acpTool:"kimi"})}),this.kimiHome=e?.kimiHome}openSession(e){return wt({...e,env:this.kimiHome!==void 0?{...e.env??process.env,KIMI_CODE_HOME:this.kimiHome}:e.env,binary:"kimi",acpTool:"kimi"})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??Y,"--output-format","stream-json"),n}}});import{spawn as OI}from"node:child_process";import{mkdirSync as LI}from"node:fs";function Gc(t){return new qc(t)}async function MI(t,e){let n=Date.now(),r=Nh({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});Te("lmplayer",r,e.permissionMode??"yolo");let s=await Lh(e.binary,r,{cwd:e.cwd,env:we(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(Oh(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function Nh(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...tn("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function Oh(t){let n=[Rn(t.stderr).trim(),t.error].filter(Boolean).join(`
2100
+ `);return n?ge(n,{provider:"lmplayer"}):`exit code ${t.code}`}function Lh(t,e,n){return new Promise((r,s)=>{let i;try{i=OI(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(_){s(_);return}let o="",a="",l="",c,d,u,m=[],p=!1,h=_=>{let y=_.trim();if(!y)return;let f;try{f=JSON.parse(y)}catch{m.push(_),n.onText?.(_);return}if(!cr(f))return;let w=To(f,!1);c===void 0&&w!==void 0&&(c=w),d=To(f,!0)??d;let g=PI(f);g!==void 0&&(u=g);let E=Mh(f);E&&(m.push(E),n.onText?.(E))};i.stdout?.on("data",_=>{let y=_.toString("utf8");o+=y,l+=y;let f=l.indexOf(`
2101
2101
  `);for(;f>=0;){let w=l.slice(0,f);l=l.slice(f+1),h(w),f=l.indexOf(`
2102
- `)}}),i.stderr?.on("data",_=>{a+=_.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",_=>{p||(p=!0,l.length>0&&h(l),r({code:_,stdout:o,stderr:a,sessionId:c??d,text:m.join(""),error:u}))}),i.on("error",_=>{p||(p=!0,s(_))})})}function II(t){let e=t.error;if(typeof e=="string"&&e.length>0)return e;if(or(e)){let n=e.data;if(or(n)&&typeof n.message=="string"&&n.message.length>0)return typeof e.name=="string"?`${e.name}: ${n.message}`:n.message;if(typeof e.message=="string"&&e.message.length>0)return e.message}}function Ah(t){for(let e of["text","content","delta","output","message"]){let n=t[e];if(typeof n=="string")return n}for(let e of["data","event","payload","part"]){let n=t[e];if(or(n)){let r=Ah(n);if(r)return r}}}function Eo(t,e){for(let r of["sessionID","sessionId","session_id"]){let s=t[r];if(typeof s=="string"&&s.length>0)return s}let n=t.session;if(typeof n=="string"&&n.length>0)return n;if(or(n)){let r=Eo(n,e);if(r!==void 0)return r}if(e){let r=t.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=t[r];if(or(s)){let i=Eo(s,e);if(i!==void 0)return i}}}function or(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Hc,Wc=O(()=>{"use strict";Vr();Ae();xe();yt();at();Oi();ot();Hc=class extends ne{constructor(e){super({provider:new Qn({providerName:"lmplayer",startCommand:"lmplayer",dbPaths:e?.lmplayerDbPaths,dbPath:e?.lmplayerDbPath}),protocol:{transport:"lmplayer",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",Y],resumeTemplate:"lmplayer tui --session {{session_id}}",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:RI})}async sendTurn(e,n){let r=await super.sendTurn(e,n);return n.permissionMode==="plan"?{...r,warnings:[...r.warnings??[],"lmplayer does not enforce plan mode; this turn used full permissions"]}:r}seedArgsFor(e){return Rh({prompt:e?.prompt??Y,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,n){kI(e,{recursive:!0});let r=this.seedArgsFor(n);Te("lmplayer",r);try{let s=await xh(this.binary,r,{cwd:e,env:Yn(void 0,e)});return s.code!==0&&s.code!==null?{success:!1,error:Ih(s)}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${Y}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as vo,readFile as xI,rm as AI}from"node:fs/promises";import{basename as Ch,join as sn}from"node:path";function CI(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function cs(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function NI(t,e){if(!e)return;t.observed=!0;let n=cs(e.promptTokenCount),r=cs(e.cachedContentTokenCount),s=cs(e.candidatesTokenCount),i=cs(e.thoughtsTokenCount);t.totalInputTokens+=n,t.totalCachedInputTokens+=r,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=n,t.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:i,totalTokens:cs(e.totalTokenCount)||n+s}}function OI(t){return{totalInputTokens:t.observed?t.totalInputTokens:void 0,totalCachedInputTokens:t.observed?t.totalCachedInputTokens:void 0,totalOutputTokens:t.observed?t.totalOutputTokens:void 0,totalReasoningOutputTokens:t.observed?t.totalReasoningOutputTokens:void 0,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}}function Nh(t){return t.type==="user"||t.message?.role==="user"}function Oh(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Lh(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
2102
+ `)}}),i.stderr?.on("data",_=>{a+=_.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",_=>{p||(p=!0,l.length>0&&h(l),r({code:_,stdout:o,stderr:a,sessionId:c??d,text:m.join(""),error:u}))}),i.on("error",_=>{p||(p=!0,s(_))})})}function PI(t){let e=t.error;if(typeof e=="string"&&e.length>0)return e;if(cr(e)){let n=e.data;if(cr(n)&&typeof n.message=="string"&&n.message.length>0)return typeof e.name=="string"?`${e.name}: ${n.message}`:n.message;if(typeof e.message=="string"&&e.message.length>0)return e.message}}function Mh(t){for(let e of["text","content","delta","output","message"]){let n=t[e];if(typeof n=="string")return n}for(let e of["data","event","payload","part"]){let n=t[e];if(cr(n)){let r=Mh(n);if(r)return r}}}function To(t,e){for(let r of["sessionID","sessionId","session_id"]){let s=t[r];if(typeof s=="string"&&s.length>0)return s}let n=t.session;if(typeof n=="string"&&n.length>0)return n;if(cr(n)){let r=To(n,e);if(r!==void 0)return r}if(e){let r=t.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=t[r];if(cr(s)){let i=To(s,e);if(i!==void 0)return i}}}function cr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var qc,Jc=O(()=>{"use strict";Qr();Ae();xe();Et();lt();Pi();at();qc=class extends ne{constructor(e){super({provider:new tr({providerName:"lmplayer",startCommand:"lmplayer",dbPaths:e?.lmplayerDbPaths,dbPath:e?.lmplayerDbPath}),protocol:{transport:"lmplayer",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",Y],resumeTemplate:"lmplayer tui --session {{session_id}}",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:MI})}async sendTurn(e,n){let r=await super.sendTurn(e,n);return n.permissionMode==="plan"?{...r,warnings:[...r.warnings??[],"lmplayer does not enforce plan mode; this turn used full permissions"]}:r}seedArgsFor(e){return Nh({prompt:e?.prompt??Y,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,n){LI(e,{recursive:!0});let r=this.seedArgsFor(n);Te("lmplayer",r);try{let s=await Lh(this.binary,r,{cwd:e,env:er(void 0,e)});return s.code!==0&&s.code!==null?{success:!1,error:Oh(s)}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${Y}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as bo,readFile as DI,rm as FI}from"node:fs/promises";import{basename as Ph,join as on}from"node:path";function $I(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function ms(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function jI(t,e){if(!e)return;t.observed=!0;let n=ms(e.promptTokenCount),r=ms(e.cachedContentTokenCount),s=ms(e.candidatesTokenCount),i=ms(e.thoughtsTokenCount);t.totalInputTokens+=n,t.totalCachedInputTokens+=r,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=n,t.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:i,totalTokens:ms(e.totalTokenCount)||n+s}}function UI(t){return{totalInputTokens:t.observed?t.totalInputTokens:void 0,totalCachedInputTokens:t.observed?t.totalCachedInputTokens:void 0,totalOutputTokens:t.observed?t.totalOutputTokens:void 0,totalReasoningOutputTokens:t.observed?t.totalReasoningOutputTokens:void 0,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}}function Dh(t){return t.type==="user"||t.message?.role==="user"}function Fh(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function $h(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
2103
2103
  `):Array.isArray(e.parts)?e.parts.filter(n=>!n.thought&&n.type!=="thinking").map(n=>n.text||"").join(`
2104
- `):"":""}function Mh(t){return t.model||t.message?.model}function LI(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:Dh(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function ds(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function MI(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return ds(e.output??e.error??t)}return ds(t)}function Dh(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Ph(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:ds(t.args,!0),toolInputData:Ze(t.args),toolCallId:t.id,model:n}}var wo,Fh=O(()=>{"use strict";be();wo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||sn(K,".qwen")}async discoverSessions(){let e=sn(this.baseDir,"projects"),n;try{n=await vo(e)}catch{return[]}let r=[];for(let s of n){let i=sn(e,s,"chats"),o;try{o=await vo(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=sn(i,a);try{let d=await this.extractSummary(c,l);d&&r.push(d)}catch{}}}return r}async extractSummary(e,n){let r=!1,s=await ye(e),i="(unknown)",o,a,l,c,d=0;for await(let u of me(e)){if(r=!0,u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Nh(u)){let m=Lh(u).trim();m&&(l||(l=q(m,80)),c=q(m,80),d++)}if(Oh(u)){let m=Mh(u);m&&(o=m),d+=LI(u)}}return r?{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e}:null}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Ch(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await ye(e),s="(unknown)",i,o,a,l,c,d,u=[],m=CI();for await(let p of me(e)){if(NI(m,p.usageMetadata),p.cwd&&(s=p.cwd,p.version&&(o=p.version),p.gitBranch&&(a=p.gitBranch)),p.type==="system"&&p.cwd&&(s=p.cwd,p.version&&(o=p.version),p.model&&(i=p.model),p.gitBranch&&(a=p.gitBranch)),!p.message)continue;let h=p.message,_=p.timestamp?new Date(p.timestamp):r.modifiedAt;if(p.type==="tool_result"){let y=Dh(p).filter(f=>f.functionResponse!==void 0);y.length===0&&p.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:_,content:ds(p.toolCallResult.resultDisplay??p.toolCallResult.error??p.toolCallResult.status)??"tool result",toolCallId:p.toolCallResult.callId});for(let f of y){let w=f.functionResponse,g=MI(w.response),E=ds(p.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:_,content:E??g??p.toolCallResult?.status??"tool result",toolName:w.name,toolCallId:p.toolCallResult?.callId??w.id,...g!==void 0?{toolDetailedContent:g}:{}})}}else if(Nh(p)){let y=Lh(p);y.trim()&&(c||(c=q(y.trim(),80)),d=q(y.trim(),80)),u.push({role:"user",timestamp:_,content:y})}else if(Oh(p)){let y=Mh(p);if(y&&(i=y),Array.isArray(h.content))for(let f of h.content)f.type==="text"&&f.text?u.push({role:"assistant",timestamp:_,content:f.text,model:y}):f.type==="thinking"&&f.thinking?u.push({role:"thinking",timestamp:_,content:f.thinking}):f.functionCall&&u.push(Ph(f.functionCall,_,y));else if(typeof h.content=="string")u.push({role:"assistant",timestamp:_,content:h.content,model:y});else if(Array.isArray(h.parts))for(let f of h.parts)if(f.thought||f.type==="thinking"){let w=f.thinking||f.text;w&&u.push({role:"thinking",timestamp:_,content:w})}else f.functionCall?u.push(Ph(f.functionCall,_,y)):f.text&&u.push({role:"assistant",timestamp:_,content:f.text,model:y})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.filter(p=>p.role==="user"||p.role==="assistant").length,filePath:e,...OI(m),messages:u}}async resolveSessionPath(e){let n=sn(this.baseDir,"projects");try{let r=await vo(n),s=[];for(let i of r){let o=sn(n,i,"chats",`${e}.jsonl`);try{return await xI(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=sn(n,i,"chats"),a;try{a=await vo(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Ch(l,".jsonl").startsWith(e)&&s.push(sn(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await AI(n),!0}catch{return!1}}}});function qc(t){return new Xc(t)}var Xc,Gc=O(()=>{"use strict";Fh();Ae();Dt();xe();Xc=class extends ne{constructor(e){super({provider:new wo(e),protocol:{transport:"stream-json",perTurnCancellation:"process",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Y,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:ao})}openSession(e){return lo({...e,binary:"qwen"})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as $h,readFile as jh,rm as Uh,stat as Hh}from"node:fs/promises";import{basename as Jc,join as wt}from"node:path";import{fileURLToPath as PI}from"node:url";async function DI(t){let e=await Promise.all(t.map(n=>ye(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function FI(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function Bh(t){return t.type==="USER_INPUT"}function Wh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function $I(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Xh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function qh(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function jI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function UI(t){for await(let e of me(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=HI(s);if(i)return i}let r=BI(e.content);if(r)return r}return null}function HI(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function BI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function WI(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function XI(t,e){let n=new Set;for(let r of e){let s=qI(t,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function qI(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:VI(n.event.content);if(r!==void 0)return Gh(t.filter(i=>!e.has(i)&&zI(i)===r),n.event.step_index);let s=KI(n.event);if(s!==void 0)return Gh(t.filter(i=>!e.has(i)&&GI(i.name,n.event.type)&&Kh(JI(i))===s),n.event.step_index)}function Gh(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function GI(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function JI(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function KI(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),Kh(e)}function Kh(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return PI(e)}catch{return}}function VI(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function zI(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function Jh(t){if(t.endsWith(".db"))return Jc(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}var To,Vh=O(()=>{"use strict";be();To=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||wt(K,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:wt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=wt(this.baseDir,"conversations"),n;try{n=await $h(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Jc(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return wt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return wt(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Hh(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await DI([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,c,d=0;if(r)for await(let u of me(r)){let m=qh(u.content);if(m&&(a=m),Bh(u)){let p=Xh(u.content).trim();p&&(l||(l=q(p,80)),c=q(p,80)),d++}else Wh(u)&&u.content&&d++}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Jh(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,d=[],u=[];if(i)for await(let m of me(i)){let p=FI(m.created_at,s.modifiedAt),h=qh(m.content);if(h&&(a=h),Bh(m)){let _=Xh(m.content),y=_.trim();y&&(l||(l=q(y,80)),c=q(y,80)),o.push({role:"user",timestamp:p,content:_});continue}if(Array.isArray(m.tool_calls))for(let _ of m.tool_calls){let y=_.name||"tool",f=jI(_.args),w=Ze(_.args),g={role:"tool_use",timestamp:p,content:f,toolName:y,toolInput:f,toolInputData:w};o.push(g),d.push({name:y,stepIndex:m.step_index,input:w,message:g})}if(Wh(m)&&m.content)o.push({role:"assistant",timestamp:p,content:m.content,model:a});else if($I(m)&&m.content){let _=WI(m,r),y=_===void 0?null:await this.readTaskLog(r,_),f={role:"tool_result",timestamp:y?.modifiedAt??p,content:m.content,toolName:m.type?.toLowerCase(),backgroundTaskId:_,...y===null?{}:{toolDetailedContent:y.content}};o.push(f),u.push({event:m,message:f})}m.thinking&&o.push({role:"thinking",timestamp:p,content:m.thinking})}return XI(d,u),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(m=>m.role==="user"||m.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await Hh(n),n}catch{}let r=wt(this.baseDir,"conversations");try{let s=[];for(let i of await $h(r)){if(!i.endsWith(".db"))continue;Jc(i,".db").startsWith(e)&&s.push(wt(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=Jh(n);return r?(await Uh(this.conversationPath(r),{force:!0}),await Uh(wt(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await UI(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=wt(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await jh(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=wt(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([jh(r,"utf8"),ye(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as YI}from"node:child_process";import{StringDecoder as zh}from"node:string_decoder";function bo(t){return async(e,n)=>{let r=Date.now(),s=t.buildArgs(e,n);t.assertArgs?.(s,n),n.onProgress?.({kind:"system",summary:`${t.label} -p one-shot started (no streaming events)`});let{stdout:i}=await QI(t.label,n.binary,s,{cwd:n.cwd,env:we(n.env,n.cwd,n.sessionId),signal:n.signal});return n.onProgress?.({kind:"system",summary:`${t.label} -p one-shot completed`}),{text:i.trimEnd(),sessionId:n.sessionId,durationMs:Date.now()-r}}}function QI(t,e,n,r){return new Promise((s,i)=>{if(r.signal?.aborted){i(new Error(`${t} turn aborted`));return}let o;try{o=YI(e,n,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(m){i(m);return}let a="",l="",c=new zh("utf8"),d=new zh("utf8");o.stdout?.on("data",m=>{a+=c.write(m)}),o.stderr?.on("data",m=>{l+=d.write(m)});let u=()=>{o.kill("SIGTERM"),i(new Error(`${t} turn aborted`))};o.on("error",m=>{r.signal?.removeEventListener("abort",u),i(m)}),o.on("close",(m,p)=>{if(r.signal?.removeEventListener("abort",u),a+=c.end(),l+=d.end(),m===0){s({stdout:a,stderr:l});return}let h=p?`signal ${p}`:`exit code ${m}`,_=l.trim()||a.trim();i(new Error(zn(`${t} failed (${h})`,_?ge(_,{provider:t}):"")))}),r.signal?.aborted?u():r.signal?.addEventListener("abort",u,{once:!0})})}var Kc=O(()=>{"use strict";at();ot()});import{basename as ZI}from"node:path";import{randomUUID as ex}from"node:crypto";function zc(t){return new Vc(t)}function nx(t){return t!==void 0&&t<=0?"0":t===void 0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Vc,tx,Yc=O(()=>{"use strict";Vh();Ae();xe();yt();Kc();Vc=class extends ne{constructor(e){super({provider:new To(e),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",Y,"--dangerously-skip-permissions","--print-timeout","2m"],seedTimeoutMs:13e4,resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:tx})}async sendTurn(e,n){if(n.requireResume){let s=await this.resolvePath(n.sessionId);if(s===null||ZI(s)!==`${n.sessionId}.db`)throw new Error(`agy cannot resume missing conversation "${n.sessionId}"`)}let r=await super.sendTurn(e,n);return n.permissionMode==="plan"?{...r,warnings:[...r.warnings??[],"agy does not enforce plan mode; this turn used full permissions"]}:r}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}async seed(e,n){let r=`[lmctl-seed:${ex()}]`,s=await super.seed(e,{...n,prompt:`${r}
2105
- ${n?.prompt??Y}`});if(!s.success&&(s.errorCode==="ENOENT"||s.errorCode==="ABORT_ERR"))return s;let i=(await this.provider.discoverSessions()).filter(o=>o.firstUserMessage?.startsWith(r));if(s.success&&i.length===1)return{...s,sessionId:i[0].sessionId};for(let o of i)await this.provider.deleteSession(o.sessionId);return{...s,success:!1,error:s.error??`agy seed created ${i.length} identifiable sessions; expected one`}}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}},tx=bo({label:"agy",buildArgs:(t,e)=>{let n=[...e.sessionId?["--conversation",e.sessionId]:[],"-p",t,"--dangerously-skip-permissions","--print-timeout",nx(e.timeoutMs)];return e.model&&n.push("--model",e.model),n},assertArgs:(t,e)=>Te("agy",t,e.permissionMode??"yolo")})});import rx from"node:zlib";function mx(t,e){return t[e]===ix&&t[e+1]===ox&&t[e+2]===ax&&t[e+3]===lx}function Yh(t,e){return(t[e]&240)===80&&t[e+1]===cx&&t[e+2]===dx&&t[e+3]===ux}function px(t,e){if(Yh(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!mx(t,e))return;let n=e+4;if(n+1>t.length)return;let r=t[n];n+=1;let s=r>>6,i=(r&32)!==0,o=(r&4)!==0,a=r&3;i||(n+=1),n+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(n+=l,!(n>t.length)){for(;;){if(n+3>t.length)return;let c=t[n]|t[n+1]<<8|t[n+2]<<16,d=(c&1)!==0,u=c>>1&3,m=c>>3;if(n+=3,u===3||(n+=u===1?1:m,n>t.length))return;if(d)break}if(o&&(n+=4),!(n>t.length))return n-e}}function fx(t){let e=[],n=0;for(;n+4<=t.length;){let r=px(t,n);if(r===void 0||r<=0)break;e.push(t.subarray(n,n+r)),n+=r}return e}function So(t){let e=[];for(let n of fx(t))Yh(n,0)||e.push(sx(n).toString("utf8"));return e.join("")}var sx,ix,ox,ax,lx,cx,dx,ux,Qc=O(()=>{"use strict";sx=rx.zstdDecompressSync,ix=40,ox=181,ax=47,lx=253,cx=42,dx=77,ux=24});import{readdir as Zc,rm as gx,stat as hx}from"node:fs/promises";import{join as on}from"node:path";function _x(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function ed(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join("")}function yx(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&e.push(n.text);return e}function Qh(t){let e=[];for(let n of t){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let i=r;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:ed(i.content)})}else if(n.type==="assistant/message"){let i=r.message;for(let o of yx(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:ed(i?.content),model:i?.source?.model})}else if(n.type==="tool/call"){let i=r,o;if(typeof i.arguments=="string")try{o=JSON.parse(i.arguments)}catch{}else i.arguments&&typeof i.arguments=="object"&&(o=i.arguments);e.push({role:"tool_use",timestamp:s,content:typeof i.arguments=="string"?i.arguments:JSON.stringify(i.arguments??{}),toolName:i.name,toolCallId:i.callId,toolInputData:o})}else if(n.type==="tool/result"){let i=r,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:ed(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function Ex(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function Zh(t,e,n){let r=t.find(p=>p.type==="session");if(!r)return null;let s=r,i=r.data,o=s.id??i?.id;if(!o)return null;let a;for(let p of t)if(p.type==="request/header"){let h=p.data?.header;h?.config?.model&&(a=h.config.model)}let l=t.map(p=>p.time).filter(p=>typeof p=="number"),c=s.createdAt??i?.createdAt,d=c?new Date(c):new Date(0),u=l.length>0?new Date(Math.max(...l)):d,m=n.filter(p=>p.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:d,modifiedAt:u,model:a,firstUserMessage:m[0]?.content,lastUserMessage:m.at(-1)?.content,messageCount:n.filter(p=>p.role==="user"||p.role==="assistant").length,filePath:e,...vx(t)}}function vx(t){let e=!1,n=0,r=0,s=0,i=0,o,a;for(let l of t){if(l.type!=="assistant/message")continue;let c=l.data?.usage;if(!c)continue;e=!0;let d=ko(c.inputTokens),u=ko(c.cacheReadTokens),m=ko(c.outputTokens),p=ko(c.reasoningTokens);n+=d,r+=u,s+=m,i+=p,o=d+u,a={inputTokens:d,cachedInputTokens:u,outputTokens:m,reasoningOutputTokens:p,totalTokens:d+u+m}}return{totalInputTokens:e?n:void 0,totalCachedInputTokens:e?r:void 0,totalOutputTokens:e?s:void 0,totalReasoningOutputTokens:e?i:void 0,lastInputTokens:o,lastTokenUsage:a}}function ko(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}var Ro,e_=O(()=>{"use strict";be();Qc();Ro=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||on(K,".dsh");this.sessionsDir=on(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await Zc(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await Zc(on(this.sessionsDir,r))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(r,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.findSessionDir(e);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=Qh(r),i=Zh(r,n.filePath,s);return i?{...i,turnStatus:Ex(r),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let n=await this.findSessionDir(e);return n?(await gx(on(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,n){return on(this.sessionsDir,_x(e),n,"session.jsonl.zstd")}async findSessionDir(e){let n;try{n=await Zc(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=on(this.sessionsDir,r,s,"session.jsonl.zstd");try{return await hx(i),{cwdDir:r,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=on(this.sessionsDir,e,n,"session.jsonl.zstd"),i=await r(s),o=So(i),a=[];for(let l of o.split(`
2106
- `))if(l.trim())try{let c=JSON.parse(l);if(c.type?.endsWith("-chunks")||c.type==="assistant/chunk")continue;a.push(c)}catch{}return a}async readSummary(e,n){let r=await this.readRecords(e,n);if(r.length===0)return null;let s=on(this.sessionsDir,e,n,"session.jsonl.zstd");return Zh(r,s,Qh(r))}}});import{spawn as wx}from"node:child_process";async function Io(t,e=n=>td.spawn(n)){if(an){let n=await an.catch(()=>{});if(n?.alive)return n;an=void 0}return an=e(t),an}async function us(){if(!an)return;(await an.catch(()=>{}))?.shutdown(),an=void 0}var Tx,t_,ar,td,an,n_=O(()=>{"use strict";ot();Tx=/dsh web:\s*(https?:\/\/\S+)/,t_=2e4,ar=class t extends Error{method;detail;constructor(e,n){super(`dsh RPC ${e} failed: ${JSON.stringify(n)}`),this.name="DshRpcCallError",this.method=e,this.detail=n,Object.setPrototypeOf(this,t.prototype)}},td=class t{constructor(e,n){this.baseUrl=e;this.child=n}static forTesting(e){return new t(e,void 0)}async rpc(e,n){let r=`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s;try{s=await fetch(`${this.baseUrl}/api/${e}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({type:"client-request",rpcId:r,method:e,payload:n})})}catch(a){throw new ar(e,`transport error: ${a instanceof Error?a.message:String(a)}`)}let i;try{i=await s.json()}catch{i=void 0}if(!s.ok)throw new ar(e,i??s.statusText);let o=i&&typeof i=="object"?i.result:void 0;if(!o||typeof o!="object"||typeof o.ok!="boolean")throw new ar(e,"malformed response: HTTP 200 but body is not a well-formed {result:{ok,\u2026}} envelope");if(o.ok===!1)throw new ar(e,o.error??o);return"value"in o?o.value:void 0}get alive(){return this.child!==void 0&&this.child.exitCode===null&&this.child.signalCode===null}shutdown(){this.child!==void 0&&this.alive&&this.child.kill("SIGTERM")}static spawn(e){return new Promise((n,r)=>{let s=wx("dsh",["web","--no-open","--port","0"],{env:e,stdio:["ignore","pipe","pipe"]}),i=!1,o="",a="",l=setTimeout(()=>{if(i)return;i=!0,s.kill("SIGTERM");let c=[o?`stdout:
2104
+ `):"":""}function jh(t){return t.model||t.message?.model}function HI(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:Hh(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function ps(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function BI(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return ps(e.output??e.error??t)}return ps(t)}function Hh(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Uh(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:ps(t.args,!0),toolInputData:et(t.args),toolCallId:t.id,model:n}}var So,Bh=O(()=>{"use strict";be();So=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||on(K,".qwen")}async discoverSessions(){let e=on(this.baseDir,"projects"),n;try{n=await bo(e)}catch{return[]}let r=[];for(let s of n){let i=on(e,s,"chats"),o;try{o=await bo(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=on(i,a);try{let d=await this.extractSummary(c,l);d&&r.push(d)}catch{}}}return r}async extractSummary(e,n){let r=!1,s=await ye(e),i="(unknown)",o,a,l,c,d=0;for await(let u of me(e)){if(r=!0,u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Dh(u)){let m=$h(u).trim();m&&(l||(l=q(m,80)),c=q(m,80),d++)}if(Fh(u)){let m=jh(u);m&&(o=m),d+=HI(u)}}return r?{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e}:null}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Ph(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await ye(e),s="(unknown)",i,o,a,l,c,d,u=[],m=$I();for await(let p of me(e)){if(jI(m,p.usageMetadata),p.cwd&&(s=p.cwd,p.version&&(o=p.version),p.gitBranch&&(a=p.gitBranch)),p.type==="system"&&p.cwd&&(s=p.cwd,p.version&&(o=p.version),p.model&&(i=p.model),p.gitBranch&&(a=p.gitBranch)),!p.message)continue;let h=p.message,_=p.timestamp?new Date(p.timestamp):r.modifiedAt;if(p.type==="tool_result"){let y=Hh(p).filter(f=>f.functionResponse!==void 0);y.length===0&&p.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:_,content:ps(p.toolCallResult.resultDisplay??p.toolCallResult.error??p.toolCallResult.status)??"tool result",toolCallId:p.toolCallResult.callId});for(let f of y){let w=f.functionResponse,g=BI(w.response),E=ps(p.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:_,content:E??g??p.toolCallResult?.status??"tool result",toolName:w.name,toolCallId:p.toolCallResult?.callId??w.id,...g!==void 0?{toolDetailedContent:g}:{}})}}else if(Dh(p)){let y=$h(p);y.trim()&&(c||(c=q(y.trim(),80)),d=q(y.trim(),80)),u.push({role:"user",timestamp:_,content:y})}else if(Fh(p)){let y=jh(p);if(y&&(i=y),Array.isArray(h.content))for(let f of h.content)f.type==="text"&&f.text?u.push({role:"assistant",timestamp:_,content:f.text,model:y}):f.type==="thinking"&&f.thinking?u.push({role:"thinking",timestamp:_,content:f.thinking}):f.functionCall&&u.push(Uh(f.functionCall,_,y));else if(typeof h.content=="string")u.push({role:"assistant",timestamp:_,content:h.content,model:y});else if(Array.isArray(h.parts))for(let f of h.parts)if(f.thought||f.type==="thinking"){let w=f.thinking||f.text;w&&u.push({role:"thinking",timestamp:_,content:w})}else f.functionCall?u.push(Uh(f.functionCall,_,y)):f.text&&u.push({role:"assistant",timestamp:_,content:f.text,model:y})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.filter(p=>p.role==="user"||p.role==="assistant").length,filePath:e,...UI(m),messages:u}}async resolveSessionPath(e){let n=on(this.baseDir,"projects");try{let r=await bo(n),s=[];for(let i of r){let o=on(n,i,"chats",`${e}.jsonl`);try{return await DI(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=on(n,i,"chats"),a;try{a=await bo(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Ph(l,".jsonl").startsWith(e)&&s.push(on(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await FI(n),!0}catch{return!1}}}});function Vc(t){return new Kc(t)}var Kc,zc=O(()=>{"use strict";Bh();Ae();Ft();xe();Kc=class extends ne{constructor(e){super({provider:new So(e),protocol:{transport:"stream-json",perTurnCancellation:"process",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Y,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:uo})}openSession(e){return mo({...e,binary:"qwen"})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as Wh,readFile as Xh,rm as qh,stat as Gh}from"node:fs/promises";import{basename as Yc,join as Tt}from"node:path";import{fileURLToPath as WI}from"node:url";async function XI(t){let e=await Promise.all(t.map(n=>ye(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function qI(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function Jh(t){return t.type==="USER_INPUT"}function Kh(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function GI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Vh(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function zh(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function JI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function KI(t){for await(let e of me(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=VI(s);if(i)return i}let r=zI(e.content);if(r)return r}return null}function VI(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function zI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function YI(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function QI(t,e){let n=new Set;for(let r of e){let s=ZI(t,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function ZI(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:rx(n.event.content);if(r!==void 0)return Yh(t.filter(i=>!e.has(i)&&sx(i)===r),n.event.step_index);let s=nx(n.event);if(s!==void 0)return Yh(t.filter(i=>!e.has(i)&&ex(i.name,n.event.type)&&Zh(tx(i))===s),n.event.step_index)}function Yh(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function ex(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function tx(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function nx(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),Zh(e)}function Zh(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return WI(e)}catch{return}}function rx(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function sx(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function Qh(t){if(t.endsWith(".db"))return Yc(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}var ko,e_=O(()=>{"use strict";be();ko=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Tt(K,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Tt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Tt(this.baseDir,"conversations"),n;try{n=await Wh(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Yc(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return Tt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return Tt(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Gh(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await XI([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,c,d=0;if(r)for await(let u of me(r)){let m=zh(u.content);if(m&&(a=m),Jh(u)){let p=Vh(u.content).trim();p&&(l||(l=q(p,80)),c=q(p,80)),d++}else Kh(u)&&u.content&&d++}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Qh(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,d=[],u=[];if(i)for await(let m of me(i)){let p=qI(m.created_at,s.modifiedAt),h=zh(m.content);if(h&&(a=h),Jh(m)){let _=Vh(m.content),y=_.trim();y&&(l||(l=q(y,80)),c=q(y,80)),o.push({role:"user",timestamp:p,content:_});continue}if(Array.isArray(m.tool_calls))for(let _ of m.tool_calls){let y=_.name||"tool",f=JI(_.args),w=et(_.args),g={role:"tool_use",timestamp:p,content:f,toolName:y,toolInput:f,toolInputData:w};o.push(g),d.push({name:y,stepIndex:m.step_index,input:w,message:g})}if(Kh(m)&&m.content)o.push({role:"assistant",timestamp:p,content:m.content,model:a});else if(GI(m)&&m.content){let _=YI(m,r),y=_===void 0?null:await this.readTaskLog(r,_),f={role:"tool_result",timestamp:y?.modifiedAt??p,content:m.content,toolName:m.type?.toLowerCase(),backgroundTaskId:_,...y===null?{}:{toolDetailedContent:y.content}};o.push(f),u.push({event:m,message:f})}m.thinking&&o.push({role:"thinking",timestamp:p,content:m.thinking})}return QI(d,u),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(m=>m.role==="user"||m.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await Gh(n),n}catch{}let r=Tt(this.baseDir,"conversations");try{let s=[];for(let i of await Wh(r)){if(!i.endsWith(".db"))continue;Yc(i,".db").startsWith(e)&&s.push(Tt(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=Qh(n);return r?(await qh(this.conversationPath(r),{force:!0}),await qh(Tt(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await KI(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=Tt(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await Xh(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=Tt(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([Xh(r,"utf8"),ye(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as ix}from"node:child_process";import{StringDecoder as t_}from"node:string_decoder";function Ro(t){return async(e,n)=>{let r=Date.now(),s=t.buildArgs(e,n);t.assertArgs?.(s,n),n.onProgress?.({kind:"system",summary:`${t.label} -p one-shot started (no streaming events)`});let{stdout:i}=await ox(t.label,n.binary,s,{cwd:n.cwd,env:we(n.env,n.cwd,n.sessionId),signal:n.signal});return n.onProgress?.({kind:"system",summary:`${t.label} -p one-shot completed`}),{text:i.trimEnd(),sessionId:n.sessionId,durationMs:Date.now()-r}}}function ox(t,e,n,r){return new Promise((s,i)=>{if(r.signal?.aborted){i(new Error(`${t} turn aborted`));return}let o;try{o=ix(e,n,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(m){i(m);return}let a="",l="",c=new t_("utf8"),d=new t_("utf8");o.stdout?.on("data",m=>{a+=c.write(m)}),o.stderr?.on("data",m=>{l+=d.write(m)});let u=()=>{o.kill("SIGTERM"),i(new Error(`${t} turn aborted`))};o.on("error",m=>{r.signal?.removeEventListener("abort",u),i(m)}),o.on("close",(m,p)=>{if(r.signal?.removeEventListener("abort",u),a+=c.end(),l+=d.end(),m===0){s({stdout:a,stderr:l});return}let h=p?`signal ${p}`:`exit code ${m}`,_=l.trim()||a.trim();i(new Error(Zn(`${t} failed (${h})`,_?ge(_,{provider:t}):"")))}),r.signal?.aborted?u():r.signal?.addEventListener("abort",u,{once:!0})})}var Qc=O(()=>{"use strict";lt();at()});import{basename as ax}from"node:path";import{randomUUID as lx}from"node:crypto";function ed(t){return new Zc(t)}function dx(t){return t!==void 0&&t<=0?"0":t===void 0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Zc,cx,td=O(()=>{"use strict";e_();Ae();xe();Et();Qc();Zc=class extends ne{constructor(e){super({provider:new ko(e),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",Y,"--dangerously-skip-permissions","--print-timeout","2m"],seedTimeoutMs:13e4,resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:cx})}async sendTurn(e,n){if(n.requireResume){let s=await this.resolvePath(n.sessionId);if(s===null||ax(s)!==`${n.sessionId}.db`)throw new Error(`agy cannot resume missing conversation "${n.sessionId}"`)}let r=await super.sendTurn(e,n);return n.permissionMode==="plan"?{...r,warnings:[...r.warnings??[],"agy does not enforce plan mode; this turn used full permissions"]}:r}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}async seed(e,n){let r=`[lmctl-seed:${lx()}]`,s=await super.seed(e,{...n,prompt:`${r}
2105
+ ${n?.prompt??Y}`});if(!s.success&&(s.errorCode==="ENOENT"||s.errorCode==="ABORT_ERR"))return s;let i=(await this.provider.discoverSessions()).filter(o=>o.firstUserMessage?.startsWith(r));if(s.success&&i.length===1)return{...s,sessionId:i[0].sessionId};for(let o of i)await this.provider.deleteSession(o.sessionId);return{...s,success:!1,error:s.error??`agy seed created ${i.length} identifiable sessions; expected one`}}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}},cx=Ro({label:"agy",buildArgs:(t,e)=>{let n=[...e.sessionId?["--conversation",e.sessionId]:[],"-p",t,"--dangerously-skip-permissions","--print-timeout",dx(e.timeoutMs)];return e.model&&n.push("--model",e.model),n},assertArgs:(t,e)=>Te("agy",t,e.permissionMode??"yolo")})});import ux from"node:zlib";function vx(t,e){return t[e]===px&&t[e+1]===fx&&t[e+2]===gx&&t[e+3]===hx}function n_(t,e){return(t[e]&240)===80&&t[e+1]===_x&&t[e+2]===yx&&t[e+3]===Ex}function wx(t,e){if(n_(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!vx(t,e))return;let n=e+4;if(n+1>t.length)return;let r=t[n];n+=1;let s=r>>6,i=(r&32)!==0,o=(r&4)!==0,a=r&3;i||(n+=1),n+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(n+=l,!(n>t.length)){for(;;){if(n+3>t.length)return;let c=t[n]|t[n+1]<<8|t[n+2]<<16,d=(c&1)!==0,u=c>>1&3,m=c>>3;if(n+=3,u===3||(n+=u===1?1:m,n>t.length))return;if(d)break}if(o&&(n+=4),!(n>t.length))return n-e}}function Tx(t){let e=[],n=0;for(;n+4<=t.length;){let r=wx(t,n);if(r===void 0||r<=0)break;e.push(t.subarray(n,n+r)),n+=r}return e}function Io(t){let e=[];for(let n of Tx(t))n_(n,0)||e.push(mx(n).toString("utf8"));return e.join("")}var mx,px,fx,gx,hx,_x,yx,Ex,nd=O(()=>{"use strict";mx=ux.zstdDecompressSync,px=40,fx=181,gx=47,hx=253,_x=42,yx=77,Ex=24});import{readdir as rd,rm as bx,stat as Sx}from"node:fs/promises";import{join as an}from"node:path";function kx(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function sd(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join("")}function Rx(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&e.push(n.text);return e}function r_(t){let e=[];for(let n of t){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let i=r;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:sd(i.content)})}else if(n.type==="assistant/message"){let i=r.message;for(let o of Rx(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:sd(i?.content),model:i?.source?.model})}else if(n.type==="tool/call"){let i=r,o;if(typeof i.arguments=="string")try{o=JSON.parse(i.arguments)}catch{}else i.arguments&&typeof i.arguments=="object"&&(o=i.arguments);e.push({role:"tool_use",timestamp:s,content:typeof i.arguments=="string"?i.arguments:JSON.stringify(i.arguments??{}),toolName:i.name,toolCallId:i.callId,toolInputData:o})}else if(n.type==="tool/result"){let i=r,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:sd(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function Ix(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function s_(t,e,n){let r=t.find(p=>p.type==="session");if(!r)return null;let s=r,i=r.data,o=s.id??i?.id;if(!o)return null;let a;for(let p of t)if(p.type==="request/header"){let h=p.data?.header;h?.config?.model&&(a=h.config.model)}let l=t.map(p=>p.time).filter(p=>typeof p=="number"),c=s.createdAt??i?.createdAt,d=c?new Date(c):new Date(0),u=l.length>0?new Date(Math.max(...l)):d,m=n.filter(p=>p.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:d,modifiedAt:u,model:a,firstUserMessage:m[0]?.content,lastUserMessage:m.at(-1)?.content,messageCount:n.filter(p=>p.role==="user"||p.role==="assistant").length,filePath:e,...xx(t)}}function xx(t){let e=!1,n=0,r=0,s=0,i=0,o,a;for(let l of t){if(l.type!=="assistant/message")continue;let c=l.data?.usage;if(!c)continue;e=!0;let d=xo(c.inputTokens),u=xo(c.cacheReadTokens),m=xo(c.outputTokens),p=xo(c.reasoningTokens);n+=d,r+=u,s+=m,i+=p,o=d+u,a={inputTokens:d,cachedInputTokens:u,outputTokens:m,reasoningOutputTokens:p,totalTokens:d+u+m}}return{totalInputTokens:e?n:void 0,totalCachedInputTokens:e?r:void 0,totalOutputTokens:e?s:void 0,totalReasoningOutputTokens:e?i:void 0,lastInputTokens:o,lastTokenUsage:a}}function xo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}var Ao,i_=O(()=>{"use strict";be();nd();Ao=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||an(K,".dsh");this.sessionsDir=an(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await rd(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await rd(an(this.sessionsDir,r))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(r,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.findSessionDir(e);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=r_(r),i=s_(r,n.filePath,s);return i?{...i,turnStatus:Ix(r),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let n=await this.findSessionDir(e);return n?(await bx(an(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,n){return an(this.sessionsDir,kx(e),n,"session.jsonl.zstd")}async findSessionDir(e){let n;try{n=await rd(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=an(this.sessionsDir,r,s,"session.jsonl.zstd");try{return await Sx(i),{cwdDir:r,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=an(this.sessionsDir,e,n,"session.jsonl.zstd"),i=await r(s),o=Io(i),a=[];for(let l of o.split(`
2106
+ `))if(l.trim())try{let c=JSON.parse(l);if(c.type?.endsWith("-chunks")||c.type==="assistant/chunk")continue;a.push(c)}catch{}return a}async readSummary(e,n){let r=await this.readRecords(e,n);if(r.length===0)return null;let s=an(this.sessionsDir,e,n,"session.jsonl.zstd");return s_(r,s,r_(r))}}});import{spawn as Ax}from"node:child_process";async function Co(t,e=n=>id.spawn(n)){if(ln){let n=await ln.catch(()=>{});if(n?.alive)return n;ln=void 0}return ln=e(t),ln}async function fs(){if(!ln)return;(await ln.catch(()=>{}))?.shutdown(),ln=void 0}var Cx,o_,dr,id,ln,a_=O(()=>{"use strict";at();Cx=/dsh web:\s*(https?:\/\/\S+)/,o_=2e4,dr=class t extends Error{method;detail;constructor(e,n){super(`dsh RPC ${e} failed: ${JSON.stringify(n)}`),this.name="DshRpcCallError",this.method=e,this.detail=n,Object.setPrototypeOf(this,t.prototype)}},id=class t{constructor(e,n){this.baseUrl=e;this.child=n}static forTesting(e){return new t(e,void 0)}async rpc(e,n){let r=`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s;try{s=await fetch(`${this.baseUrl}/api/${e}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({type:"client-request",rpcId:r,method:e,payload:n})})}catch(a){throw new dr(e,`transport error: ${a instanceof Error?a.message:String(a)}`)}let i;try{i=await s.json()}catch{i=void 0}if(!s.ok)throw new dr(e,i??s.statusText);let o=i&&typeof i=="object"?i.result:void 0;if(!o||typeof o!="object"||typeof o.ok!="boolean")throw new dr(e,"malformed response: HTTP 200 but body is not a well-formed {result:{ok,\u2026}} envelope");if(o.ok===!1)throw new dr(e,o.error??o);return"value"in o?o.value:void 0}get alive(){return this.child!==void 0&&this.child.exitCode===null&&this.child.signalCode===null}shutdown(){this.child!==void 0&&this.alive&&this.child.kill("SIGTERM")}static spawn(e){return new Promise((n,r)=>{let s=Ax("dsh",["web","--no-open","--port","0"],{env:e,stdio:["ignore","pipe","pipe"]}),i=!1,o="",a="",l=setTimeout(()=>{if(i)return;i=!0,s.kill("SIGTERM");let c=[o?`stdout:
2107
2107
  ${o}`:"",a?`stderr:
2108
2108
  ${a}`:""].filter(Boolean).join(`
2109
- `);r(new Error(`dsh web sidecar did not report a boot URL within ${t_}ms `+(c?`
2110
- ${ge(c,{provider:"dsh"})}`:"(no output captured)")))},t_);s.stdout?.on("data",c=>{if(o+=c.toString(),i)return;let d=Tx.exec(o);d&&(i=!0,clearTimeout(l),n(new t(d[1],s)))}),s.stderr?.on("data",c=>{a+=c.toString()}),s.on("error",c=>{i||(i=!0,clearTimeout(l),r(c))}),s.on("exit",(c,d)=>{if(i)return;i=!0,clearTimeout(l);let u=d?`signal ${d}`:`exit code ${c}`;r(new Error(zn(`dsh web exited before reporting a boot URL (${u})`,a.trim()?ge(a,{provider:"dsh"}):"")))})})}}});import{randomUUID as r_}from"node:crypto";import{existsSync as s_}from"node:fs";import{readFile as bx,mkdir as Sx}from"node:fs/promises";function id(t){return new sd(t)}function rd(t){return{...t,DSH_PERMISSION_MODE:t.DSH_PERMISSION_MODE??"danger-full-access"}}function Rx(t){let e=t?.kind??"unknown",n=t?.error?.message;return n?`dsh turn ended with reason=${e}: ${n}`:`dsh turn ended with reason=${e} and no assistant text`}function xo(t){return t instanceof Error?t.message:String(t)}async function Ix(t){let e=await i_(t),n=-1;for(let r of e)r.type==="turn/end"&&typeof r.seq=="number"&&r.seq>n&&(n=r.seq);return n}async function i_(t){let e;try{e=await bx(t)}catch{return[]}let n=So(e),r=[];for(let s of n.split(`
2111
- `))if(s.trim())try{let i=JSON.parse(s);i!==null&&typeof i=="object"&&!Array.isArray(i)&&r.push(i)}catch{}return r}function xx(t){let n=t.data?.message?.content;if(typeof n=="string")return n;if(!Array.isArray(n))return"";let r=[];for(let s of n)s&&typeof s=="object"&&s.type==="text"&&typeof s.text=="string"&&r.push(s.text);return r.join("")}var kx,nd,sd,od=O(()=>{"use strict";er();Ae();e_();Qc();n_();xe();yt();kx=500,nd=8*60*60*1e3;sd=class extends ne{dshProvider;constructor(e){let n=new Ro(e);super({provider:n,protocol:{transport:"dsh-rpc",perTurnCancellation:"unsupported",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"dsh has no in-session leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"dsh",seedArgs:[],resumeTemplate:"dsh web --no-open --port 0 # continuity is via the RPC sidecar, not a resume flag",startTemplate:"dsh web --no-open --port 0",transport:(r,s)=>this.dshPromptTurn(r,s)}),this.dshProvider=n}manualSeedHint(e){return{launchCommand:`cd ${e} && dsh web`,postLaunchNote:"dsh has no interactive terminal session to seed into \u2014 continuity lives in the web profile's session store, not a TTY. Boot the sidecar with the command above, open the printed http:// URL, and start a session rooted at this directory in the web UI; lmctl's managed sidecar can then cold-resume it by id (cross-profile session sharing is verified). Send lmctl's seed instruction there, wait for the reply, then find the new session id with the ls command below and register it manually.",lsCommand:`lmctl ls --provider dsh --sessiondir ${e}`}}async seed(e,n){await Sx(e,{recursive:!0});let r=`session-${r_()}`,s=rd(process.env);Te("dsh",[],"yolo");try{let i;try{i=await Io(s)}catch(a){return{success:!1,error:`dsh sidecar failed to start: ${xo(a)}`}}try{await i.rpc("session.create",{sessionId:r,cwd:e})}catch(a){return{success:!1,error:`session.create failed: ${xo(a)}`}}if(n?.model)try{await i.rpc("session.selectModel",{sessionId:r,provider:"deepseek-official",model:n.model})}catch(a){return{success:!1,error:`session.selectModel("${n.model}") failed: ${xo(a)}`}}let o=n?.prompt??Y;try{await this.promptAndWait(i,e,r,o,nd)}catch(a){return{success:!1,error:`seed turn failed: ${xo(a)}`}}return{success:!0,sessionId:r}}finally{await us()}}async dshPromptTurn(e,n){let r=Date.now();if(n.bundleSession!==void 0)return Lt(n.bundleSession,"dsh",n.sessionId,e,{onDelta:n.onDelta,onProgress:n.onProgress,signal:n.signal});let s=rd(n.env??process.env);Te("dsh",[],n.permissionMode??"yolo");let i=!n.sessionId,o=i?`session-${r_()}`:n.sessionId,a;try{let l=await Io(s);i&&await l.rpc("session.create",{sessionId:o,cwd:n.cwd}),n.model&&(await l.rpc("session.selectModel",{sessionId:o,provider:"deepseek-official",model:n.model}),n.onProgress?.({kind:"system",summary:`dsh model set to ${n.model}`})),n.onProgress?.({kind:"system",summary:"dsh session.prompt sent"}),a=await this.promptAndWait(l,n.cwd,o,e,n.timeoutMs??nd,n.signal)}finally{await us()}return n.onProgress?.({kind:"system",summary:"dsh turn completed"}),{text:a,sessionId:o,durationMs:Date.now()-r}}async openSession(e){let n=rd(e.env??process.env);Te("dsh",[],e.permissionMode??"yolo");let r=await Io(n),s=this.dshProvider.sessionFilePath(e.cwd,e.sessionId);if(!s_(s))throw await us(),new Error(`dsh bundle: session file does not exist for session "${e.sessionId}" (${s}) \u2014 the session must exist before a bundle can resume it`);e.model&&await r.rpc("session.selectModel",{sessionId:e.sessionId,provider:"deepseek-official",model:e.model});let i=e.sessionId,o=this,a=0,l=!1,c=null,d=!1,u=!1,m=async()=>{u||(u=!0,await us())};return{provider:"dsh",sessionId:i,get completedTurns(){return a},async sendTurn(p,h={}){if(l||c!==null)throw new Error("dsh bundle session is closed");if(d)throw new Error("dsh bundle session has a turn still in flight");if(h.signal?.aborted)throw new Error("Aborted");if(!s_(s))throw new Error(`dsh bundle: session file for session "${i}" disappeared mid-bundle \u2014 identity re-check failed (external re-seed?)`);d=!0;let _=Date.now();try{let y=o.promptAndWait(r,e.cwd,i,p,nd,h.signal);y.catch(()=>{});let f=await Promise.race([y,new Promise((w,g)=>{h.signal?.addEventListener("abort",()=>{(async()=>{l=!0,await m()})().finally(()=>g(new Error("Aborted")))},{once:!0})})]);return a+=1,{text:f,sessionId:i,durationMs:Date.now()-_}}finally{d=!1}},close(){return c!==null||(c=(async()=>{l=!0,await m()})()),c}}}async promptAndWait(e,n,r,s,i,o){let a=this.dshProvider.sessionFilePath(n,r),l=await Ix(a);await e.rpc("session.prompt",{sessionId:r,mode:"queue",content:[{type:"text",text:s}]});let c=i>0?Date.now()+i:1/0;for(;;){if(o?.aborted)throw new Error("Aborted");let d=await i_(a),u=d.find(m=>m.type==="turn/end"&&(m.seq??-1)>l);if(u){let m=u.data?.reason,p=[...d].reverse().find(_=>_.type==="assistant/message"),h=p?xx(p):"";if(m?.kind!=="completed"&&!h)throw new Error(Rx(m));return h}if(Date.now()>c)throw new Error(`dsh turn timed out after ${i}ms waiting for turn/end`);await new Promise(m=>setTimeout(m,kx))}}}});import{existsSync as Ax}from"node:fs";import{join as d_,resolve as Cx}from"node:path";import{createRequire as Nx}from"node:module";function Ox(){return ad===null&&(ad=Nx(import.meta.url)("node:sqlite").DatabaseSync),ad}function ld(t={}){return Cx(t.hermesHome?.trim()||process.env.HERMES_HOME?.trim()||d_(K,".hermes"))}function Lx(t={}){return d_(ld(t),"state.db")}function ms(t){let e=typeof t=="number"&&Number.isFinite(t)?t:0;return new Date(e*1e3)}function je(t){return typeof t=="string"&&t.length>0?t:void 0}function Mx(t){if(!t)return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function l_(t){return je(t.cwd)??je(Mx(t.model_config).cwd)??"(unknown)"}function Px(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function Dx(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t;if(typeof t!="string")return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function c_(t){let e=t.input_tokens??0,n=t.output_tokens??0,r=t.cache_read_tokens??0,s=t.cache_write_tokens??0,i=t.reasoning_tokens??0;return(t.message_count??0)>0&&e+n+r+s+i>0?{totalInputTokens:e,totalCachedInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:n,totalReasoningOutputTokens:i}:{}}var ad,o_,a_,Ao,u_=O(()=>{"use strict";be();oe();ad=null;o_="acp";a_=`id, source, model, model_config, started_at,
2109
+ `);r(new Error(`dsh web sidecar did not report a boot URL within ${o_}ms `+(c?`
2110
+ ${ge(c,{provider:"dsh"})}`:"(no output captured)")))},o_);s.stdout?.on("data",c=>{if(o+=c.toString(),i)return;let d=Cx.exec(o);d&&(i=!0,clearTimeout(l),n(new t(d[1],s)))}),s.stderr?.on("data",c=>{a+=c.toString()}),s.on("error",c=>{i||(i=!0,clearTimeout(l),r(c))}),s.on("exit",(c,d)=>{if(i)return;i=!0,clearTimeout(l);let u=d?`signal ${d}`:`exit code ${c}`;r(new Error(Zn(`dsh web exited before reporting a boot URL (${u})`,a.trim()?ge(a,{provider:"dsh"}):"")))})})}}});import{randomUUID as l_}from"node:crypto";import{existsSync as c_}from"node:fs";import{readFile as Nx,mkdir as Ox}from"node:fs/promises";function cd(t){return new ld(t)}function ad(t){return{...t,DSH_PERMISSION_MODE:t.DSH_PERMISSION_MODE??"danger-full-access"}}function Mx(t){let e=t?.kind??"unknown",n=t?.error?.message;return n?`dsh turn ended with reason=${e}: ${n}`:`dsh turn ended with reason=${e} and no assistant text`}function No(t){return t instanceof Error?t.message:String(t)}async function Px(t){let e=await d_(t),n=-1;for(let r of e)r.type==="turn/end"&&typeof r.seq=="number"&&r.seq>n&&(n=r.seq);return n}async function d_(t){let e;try{e=await Nx(t)}catch{return[]}let n=Io(e),r=[];for(let s of n.split(`
2111
+ `))if(s.trim())try{let i=JSON.parse(s);i!==null&&typeof i=="object"&&!Array.isArray(i)&&r.push(i)}catch{}return r}function Dx(t){let n=t.data?.message?.content;if(typeof n=="string")return n;if(!Array.isArray(n))return"";let r=[];for(let s of n)s&&typeof s=="object"&&s.type==="text"&&typeof s.text=="string"&&r.push(s.text);return r.join("")}var Lx,od,ld,dd=O(()=>{"use strict";rr();Ae();i_();nd();a_();xe();Et();Lx=500,od=8*60*60*1e3;ld=class extends ne{dshProvider;constructor(e){let n=new Ao(e);super({provider:n,protocol:{transport:"dsh-rpc",perTurnCancellation:"unsupported",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"dsh has no in-session leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"dsh",seedArgs:[],resumeTemplate:"dsh web --no-open --port 0 # continuity is via the RPC sidecar, not a resume flag",startTemplate:"dsh web --no-open --port 0",transport:(r,s)=>this.dshPromptTurn(r,s)}),this.dshProvider=n}manualSeedHint(e){return{launchCommand:`cd ${e} && dsh web`,postLaunchNote:"dsh has no interactive terminal session to seed into \u2014 continuity lives in the web profile's session store, not a TTY. Boot the sidecar with the command above, open the printed http:// URL, and start a session rooted at this directory in the web UI; lmctl's managed sidecar can then cold-resume it by id (cross-profile session sharing is verified). Send lmctl's seed instruction there, wait for the reply, then find the new session id with the ls command below and register it manually.",lsCommand:`lmctl ls --provider dsh --sessiondir ${e}`}}async seed(e,n){await Ox(e,{recursive:!0});let r=`session-${l_()}`,s=ad(process.env);Te("dsh",[],"yolo");try{let i;try{i=await Co(s)}catch(a){return{success:!1,error:`dsh sidecar failed to start: ${No(a)}`}}try{await i.rpc("session.create",{sessionId:r,cwd:e})}catch(a){return{success:!1,error:`session.create failed: ${No(a)}`}}if(n?.model)try{await i.rpc("session.selectModel",{sessionId:r,provider:"deepseek-official",model:n.model})}catch(a){return{success:!1,error:`session.selectModel("${n.model}") failed: ${No(a)}`}}let o=n?.prompt??Y;try{await this.promptAndWait(i,e,r,o,od)}catch(a){return{success:!1,error:`seed turn failed: ${No(a)}`}}return{success:!0,sessionId:r}}finally{await fs()}}async dshPromptTurn(e,n){let r=Date.now();if(n.bundleSession!==void 0)return Mt(n.bundleSession,"dsh",n.sessionId,e,{onDelta:n.onDelta,onProgress:n.onProgress,signal:n.signal});let s=ad(n.env??process.env);Te("dsh",[],n.permissionMode??"yolo");let i=!n.sessionId,o=i?`session-${l_()}`:n.sessionId,a;try{let l=await Co(s);i&&await l.rpc("session.create",{sessionId:o,cwd:n.cwd}),n.model&&(await l.rpc("session.selectModel",{sessionId:o,provider:"deepseek-official",model:n.model}),n.onProgress?.({kind:"system",summary:`dsh model set to ${n.model}`})),n.onProgress?.({kind:"system",summary:"dsh session.prompt sent"}),a=await this.promptAndWait(l,n.cwd,o,e,n.timeoutMs??od,n.signal)}finally{await fs()}return n.onProgress?.({kind:"system",summary:"dsh turn completed"}),{text:a,sessionId:o,durationMs:Date.now()-r}}async openSession(e){let n=ad(e.env??process.env);Te("dsh",[],e.permissionMode??"yolo");let r=await Co(n),s=this.dshProvider.sessionFilePath(e.cwd,e.sessionId);if(!c_(s))throw await fs(),new Error(`dsh bundle: session file does not exist for session "${e.sessionId}" (${s}) \u2014 the session must exist before a bundle can resume it`);e.model&&await r.rpc("session.selectModel",{sessionId:e.sessionId,provider:"deepseek-official",model:e.model});let i=e.sessionId,o=this,a=0,l=!1,c=null,d=!1,u=!1,m=async()=>{u||(u=!0,await fs())};return{provider:"dsh",sessionId:i,get completedTurns(){return a},async sendTurn(p,h={}){if(l||c!==null)throw new Error("dsh bundle session is closed");if(d)throw new Error("dsh bundle session has a turn still in flight");if(h.signal?.aborted)throw new Error("Aborted");if(!c_(s))throw new Error(`dsh bundle: session file for session "${i}" disappeared mid-bundle \u2014 identity re-check failed (external re-seed?)`);d=!0;let _=Date.now();try{let y=o.promptAndWait(r,e.cwd,i,p,od,h.signal);y.catch(()=>{});let f=await Promise.race([y,new Promise((w,g)=>{h.signal?.addEventListener("abort",()=>{(async()=>{l=!0,await m()})().finally(()=>g(new Error("Aborted")))},{once:!0})})]);return a+=1,{text:f,sessionId:i,durationMs:Date.now()-_}}finally{d=!1}},close(){return c!==null||(c=(async()=>{l=!0,await m()})()),c}}}async promptAndWait(e,n,r,s,i,o){let a=this.dshProvider.sessionFilePath(n,r),l=await Px(a);await e.rpc("session.prompt",{sessionId:r,mode:"queue",content:[{type:"text",text:s}]});let c=i>0?Date.now()+i:1/0;for(;;){if(o?.aborted)throw new Error("Aborted");let d=await d_(a),u=d.find(m=>m.type==="turn/end"&&(m.seq??-1)>l);if(u){let m=u.data?.reason,p=[...d].reverse().find(_=>_.type==="assistant/message"),h=p?Dx(p):"";if(m?.kind!=="completed"&&!h)throw new Error(Mx(m));return h}if(Date.now()>c)throw new Error(`dsh turn timed out after ${i}ms waiting for turn/end`);await new Promise(m=>setTimeout(m,Lx))}}}});import{existsSync as Fx}from"node:fs";import{join as g_,resolve as $x}from"node:path";import{createRequire as jx}from"node:module";function Ux(){return ud===null&&(ud=jx(import.meta.url)("node:sqlite").DatabaseSync),ud}function md(t={}){return $x(t.hermesHome?.trim()||process.env.HERMES_HOME?.trim()||g_(K,".hermes"))}function Hx(t={}){return g_(md(t),"state.db")}function gs(t){let e=typeof t=="number"&&Number.isFinite(t)?t:0;return new Date(e*1e3)}function je(t){return typeof t=="string"&&t.length>0?t:void 0}function Bx(t){if(!t)return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function p_(t){return je(t.cwd)??je(Bx(t.model_config).cwd)??"(unknown)"}function Wx(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function Xx(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t;if(typeof t!="string")return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function f_(t){let e=t.input_tokens??0,n=t.output_tokens??0,r=t.cache_read_tokens??0,s=t.cache_write_tokens??0,i=t.reasoning_tokens??0;return(t.message_count??0)>0&&e+n+r+s+i>0?{totalInputTokens:e,totalCachedInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:n,totalReasoningOutputTokens:i}:{}}var ud,u_,m_,Oo,h_=O(()=>{"use strict";be();oe();ud=null;u_="acp";m_=`id, source, model, model_config, started_at,
2112
2112
  last_activity_at, message_count, input_tokens, output_tokens,
2113
- cache_read_tokens, cache_write_tokens, reasoning_tokens, cwd, title`;Ao=class{name="hermes";dbPath;busyTimeoutMs;discoverLimit;constructor(e){this.dbPath=Lx(e),this.busyTimeoutMs=e?.busyTimeoutMs??5e3,this.discoverLimit=e?.discoverLimit??200}get stateDbPath(){return this.dbPath}openDb(){if(!Ax(this.dbPath))return null;let e=null;try{return e=new(Ox())(this.dbPath,{open:!0,readOnly:!0}),e.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),e}catch(n){return e?.close(),U({event:"hermes_store_unavailable",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),null}}selectSessionRow(e,n){return e.prepare(`SELECT ${a_} FROM sessions WHERE id = ? AND source = ?`).get(n,o_)??null}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let n=e.prepare(`SELECT ${a_} FROM sessions
2113
+ cache_read_tokens, cache_write_tokens, reasoning_tokens, cwd, title`;Oo=class{name="hermes";dbPath;busyTimeoutMs;discoverLimit;constructor(e){this.dbPath=Hx(e),this.busyTimeoutMs=e?.busyTimeoutMs??5e3,this.discoverLimit=e?.discoverLimit??200}get stateDbPath(){return this.dbPath}openDb(){if(!Fx(this.dbPath))return null;let e=null;try{return e=new(Ux())(this.dbPath,{open:!0,readOnly:!0}),e.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),e}catch(n){return e?.close(),U({event:"hermes_store_unavailable",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),null}}selectSessionRow(e,n){return e.prepare(`SELECT ${m_} FROM sessions WHERE id = ? AND source = ?`).get(n,u_)??null}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let n=e.prepare(`SELECT ${m_} FROM sessions
2114
2114
  WHERE source = ?
2115
2115
  ORDER BY COALESCE(last_activity_at, started_at) DESC
2116
- LIMIT ?`).all(o_,this.discoverLimit),r=[];for(let s of n){let i=this.previewTexts(e,s.id);r.push({provider:this.name,sessionId:s.id,slug:je(s.title),cwd:l_(s),createdAt:ms(s.started_at),modifiedAt:ms(s.last_activity_at??s.started_at),model:je(s.model),startCommand:this.name,firstUserMessage:i.first,lastUserMessage:i.last,messageCount:s.message_count??0,filePath:this.dbPath,...c_(s)})}return r}catch(n){return U({event:"hermes_discover_sessions_failed",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),[]}finally{e.close()}}activeMessageRows(e,n){let r=new Set(e.prepare("PRAGMA table_info(messages)").all().map(a=>a.name)),i=`id, session_id, role, content, tool_call_id, tool_calls, tool_name,
2116
+ LIMIT ?`).all(u_,this.discoverLimit),r=[];for(let s of n){let i=this.previewTexts(e,s.id);r.push({provider:this.name,sessionId:s.id,slug:je(s.title),cwd:p_(s),createdAt:gs(s.started_at),modifiedAt:gs(s.last_activity_at??s.started_at),model:je(s.model),startCommand:this.name,firstUserMessage:i.first,lastUserMessage:i.last,messageCount:s.message_count??0,filePath:this.dbPath,...f_(s)})}return r}catch(n){return U({event:"hermes_discover_sessions_failed",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),[]}finally{e.close()}}activeMessageRows(e,n){let r=new Set(e.prepare("PRAGMA table_info(messages)").all().map(a=>a.name)),i=`id, session_id, role, content, tool_call_id, tool_calls, tool_name,
2117
2117
  timestamp, finish_reason${["_compressed_summary","display_kind"].filter(a=>r.has(a)).map(a=>`, ${a}`).join("")}`,o="WHERE session_id = ? AND role IN ('user', 'assistant', 'tool')";try{return e.prepare(`SELECT ${i} FROM messages ${o} AND active = 1 ORDER BY id ASC`).all(n)}catch(a){if(!/no such column/i.test(a instanceof Error?a.message:String(a)))throw a;return e.prepare(`SELECT ${i} FROM messages ${o} ORDER BY id ASC`).all(n)}}previewTexts(e,n){try{let[r,s]=["ASC","DESC"].map(i=>{let o=`SELECT content FROM messages WHERE session_id = ?
2118
- AND role = 'user' AND content != ''`,a;try{a=e.prepare(`${o} AND active = 1 ORDER BY id ${i} LIMIT 1`).get(n)}catch(l){if(!/no such column: active/i.test(String(l)))throw l;a=e.prepare(`${o} ORDER BY id ${i} LIMIT 1`).get(n)}return a?q(a.content,80):void 0});return{first:r,last:s}}catch{return{}}}async loadSession(e){let n=this.openDb();if(!n)return null;try{let r=this.selectSessionRow(n,e);if(!r)return null;let s=this.activeMessageRows(n,e),i=[],o=[],a,l;for(let c of s){let d=ms(c.timestamp),u=c.content??"";if(c.role==="user"){u&&c._compressed_summary!==1&&c.display_kind!=="hidden"&&o.push(u),u.length>0&&(a||(a=q(u,80)),l=q(u,80)),i.push({role:"user",timestamp:d,content:u||"(empty)"});continue}if(c.role==="tool"){i.push({role:"tool_result",timestamp:d,content:u,toolCallId:je(c.tool_call_id),toolName:je(c.tool_name)});continue}u.length>0&&i.push({role:"assistant",timestamp:d,content:u,model:je(r.model),stopReason:je(c.finish_reason)});for(let m of Px(c.tool_calls)){let p=Dx(m.function?.arguments);i.push({role:"tool_use",timestamp:d,content:je(m.function?.name)??"tool_call",toolName:je(m.function?.name),toolCallId:je(m.call_id)??je(m.id),toolInput:typeof m.function?.arguments=="string"?m.function.arguments:JSON.stringify(m.function?.arguments??{}),toolInputData:Ze(p)})}}return{provider:this.name,sessionId:r.id,slug:je(r.title),cwd:l_(r),createdAt:ms(r.started_at),modifiedAt:ms(r.last_activity_at??r.started_at),model:je(r.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:l,messageCount:r.message_count??i.length,filePath:this.dbPath,...c_(r),messages:i,userPrompts:o}}catch(r){return U({event:"hermes_load_session_failed",provider:this.name,session_id:e,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),null}finally{n.close()}}async resolveSessionPath(e){let n=this.openDb();if(!n)return null;try{return this.selectSessionRow(n,e)?this.dbPath:null}catch{return null}finally{n.close()}}async deleteSession(e){return!1}}});import{mkdir as Fx}from"node:fs/promises";function jx(t){return $x.test(t)}function m_(t){if(t==="plan")throw new Error(`provider "hermes" does not support --permission-mode plan: Hermes's ACP mode ladder (default/accept_edits/dont_ask) governs file edits only and has no plan-equivalent, so lmctl refuses rather than silently running the member with edit auto-approval.`);return Ux}function dd(t){return new cd(t)}var $x,Ux,cd,ud=O(()=>{"use strict";Ae();u_();Dt();xe();oe();$x=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Ux="dont_ask";cd=class extends ne{hermesProvider;hermesHome;constructor(e){let n=new Ao(e);super({provider:n,protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Hermes has no provider-side leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"hermes",seedArgs:[],resumeTemplate:"hermes --yolo --resume {{session_id}}",startTemplate:"hermes",transport:async(r,s)=>Et(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:m_(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=ld(e)}async openSession(e){return vt({...e,env:{...e.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:m_(e.permissionMode)})}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(e,n){await Fx(e,{recursive:!0});let r=[];if(n?.effort){let i="hermes has no ACP-level effort surface";U({event:"hermes_effort_ignored",provider:this.name,effort:n.effort,reason:i}),r.push(`hermes seed ignored effort=${n.effort}: ${i}`)}let s;try{s=await this.sendTurn(n?.prompt??Y,{sessionId:"",cwd:e,model:n?.model})}catch(i){return{success:!1,error:`hermes ACP seed failed: ${i instanceof Error?i.message:String(i)}`}}return jx(s.sessionId)?(r.push(...s.warnings??[]),{success:!0,sessionId:s.sessionId,...r.length>0?{warnings:r}:{}}):(U({event:"hermes_seed_contract_violation",provider:this.name,session_id:s.sessionId,reason:"session/new did not return a UUID session id"}),{success:!1,error:`hermes ACP session/new did not return a UUID session id (got ${JSON.stringify(s.sessionId)})`})}}});import{readdir as p_,rm as Hx,stat as Bx}from"node:fs/promises";import{join as md}from"node:path";function pd(t){return typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(e=>e.type==="text"&&e.text).map(e=>e.text).join(" "):""}function f_(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}var Co,g_=O(()=>{"use strict";be();Co=class{name="pi";baseDir;constructor(e={}){this.baseDir=e.piDir||md(K,".pi","agent","sessions")}getWatchPaths(){return[{directory:this.baseDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[];for(let n of await this.listSessionFiles())try{let r=await this.extractSummary(n);r&&e.push(r)}catch{}return e}async listSessionFiles(){let e;try{e=await p_(this.baseDir)}catch{return[]}let n=[];for(let r of e){let s=md(this.baseDir,r);try{if(!(await Bx(s)).isDirectory())continue;for(let i of await p_(s))i.endsWith(".jsonl")&&n.push(md(s,i))}catch{}}return n}async readHeader(e){for await(let n of me(e))return n.type==="session"?n:null;return null}async extractSummary(e){let n=await this.readHeader(e);if(!n)return null;let r=await ye(e),s,i,o,a=0,l=0,c=0,d=0,u=0,m=0,p=0,h;for await(let _ of me(e)){if(_.type==="model_change"&&_.provider&&_.modelId){s=`${_.provider}/${_.modelId}`;continue}if(_.type!=="message"||!_.message)continue;let y=_.message;if(y.provider&&y.model&&(s=`${y.provider}/${y.model}`),y.role==="user"){let f=pd(y).trim();f&&(i||(i=q(f,80)),o=q(f,80)),a++}else if(y.role==="assistant"){a++;let f=y.usage;f&&(l+=f.input??0,c+=f.cacheRead??0,d+=f.cacheWrite??0,u+=f.output??0,m+=f.reasoning??0,p=f.input??0,h={inputTokens:f.input,cachedInputTokens:f.cacheRead,cacheWriteInputTokens:f.cacheWrite,outputTokens:f.output,reasoningOutputTokens:f.reasoning,totalTokens:f.totalTokens})}}return{provider:"pi",sessionId:n.id,cwd:n.cwd??"(unknown)",createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:s,startCommand:"pi",firstUserMessage:i,lastUserMessage:o,messageCount:a,filePath:e,totalInputTokens:l,totalCachedInputTokens:c,totalCacheWriteInputTokens:d,totalOutputTokens:u,totalReasoningOutputTokens:m,lastInputTokens:p,lastTokenUsage:h}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=await this.extractSummary(n);if(!r)return null;let s=[],i=r.model;for await(let o of me(n)){if(o.type==="model_change"&&o.provider&&o.modelId){i=`${o.provider}/${o.modelId}`;continue}if(o.type!=="message"||!o.message)continue;let a=o.message;a.provider&&a.model&&(i=`${a.provider}/${a.model}`);let l=a.timestamp?new Date(a.timestamp):r.modifiedAt;if(a.role==="user")s.push({role:"user",timestamp:l,content:pd(a)});else if(a.role==="assistant"&&Array.isArray(a.content))for(let c of a.content)c.type==="text"&&c.text?s.push({role:"assistant",timestamp:l,content:c.text,model:i}):c.type==="thinking"&&c.thinking?s.push({role:"thinking",timestamp:l,content:c.thinking}):c.type==="toolCall"&&s.push({role:"tool_use",timestamp:l,content:f_(c.arguments),toolName:c.name??"tool",toolInput:f_(c.arguments),toolInputData:c.arguments,toolCallId:c.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:l,content:pd(a),toolName:a.toolName,toolCallId:a.toolCallId})}return{...r,model:i,messages:s}}async resolveSessionPath(e){let n=`_${e}.jsonl`,r=[];for(let s of await this.listSessionFiles()){if(s.endsWith(n))return s;s.split("_").pop()?.replace(/\.jsonl$/,"")?.startsWith(e)&&r.push(s)}return r.length===1?r[0]:null}async deleteSession(e){let n=await this.resolveSessionPath(e);return n?(await Hx(n,{force:!0}),!0):!1}}});function gd(t){return new fd(t)}var fd,Wx,hd=O(()=>{"use strict";g_();Ae();xe();yt();Kc();fd=class extends ne{constructor(e){super({provider:new Co(e),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"pi uses one-shot print turns; no streaming events are available."},binary:"pi",seedArgs:["-p",Y],resumeTemplate:"pi --session {{session_id}}",startTemplate:"pi",transport:Wx})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}manualSeedHint(e){return{launchCommand:`cd ${e} && pi`,postLaunchNote:"Send the lmctl seed instruction, wait for the session file to write, then exit.",lsCommand:`lmctl ls --provider pi --sessiondir ${e}`}}},Wx=bo({label:"pi",buildArgs:(t,e)=>{let n=[...e.sessionId?["--session",e.sessionId]:[],"-p",t];return e.model&&n.push("--model",e.model),n},assertArgs:(t,e)=>Te("pi",t,e.permissionMode??"yolo")})});import{createHash as Xx}from"node:crypto";import{existsSync as qx,mkdirSync as yd,readFileSync as Gx,renameSync as Jx,rmdirSync as b_,statSync as Kx,writeFileSync as Vx}from"node:fs";import{dirname as Td,join as h_,resolve as _d}from"node:path";function zx(t){return Xx("sha256").update(t).digest("hex").slice(0,8)}function Yx(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function Qx(t,e){let n=e?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function S_(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function No(t){return Math.max(1,Math.ceil(t.length/4))}function cr(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return _d(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?h_(Td(_d(n)),".lmctl-claude-mock","sessions.json"):h_(_d(t),".lmctl-claude-mock","sessions.json")}function __(){return{schemaVersion:1,sessions:{}}}function ps(t){if(!qx(t))return __();try{let e=JSON.parse(Gx(t,"utf8")),n=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},r=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=Ed(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return __()}}function k_(t,e){yd(Td(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;Vx(n,`${JSON.stringify(e,null,2)}
2119
- `,"utf8"),Jx(n,t)}function tA(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function nA(t){let e=`${t}.lock`;yd(Td(t),{recursive:!0});let n=Date.now()+y_;for(;;)try{return yd(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-Kx(e).mtimeMs>Zx){try{b_(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${y_}ms: ${e}`);tA(eA)}}function rA(t){try{b_(t)}catch{}}function R_(t,e){let n=nA(t);try{return e()}finally{rA(n)}}function sA(t){return{...t,timestamp:t.timestamp.toISOString()}}function iA(t){return{...t,timestamp:new Date(t.timestamp)}}function oA(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(sA)}}function I_(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(iA)}}function Oo(t,e=process.cwd()){let n=lr.get(t);if(n!==void 0)return n;let s=ps(cr(e)).sessions[t];if(s===void 0)return;let i=I_(s);return lr.set(i.sessionId,i),i}function E_(t){lr.set(t.sessionId,t);let e=cr(t.cwd);R_(e,()=>{let n=ps(e);n.sessions[t.sessionId]=oA({...t,filePath:e}),k_(e,n)})}function aA(t,e=process.cwd()){let n=cr(e);return R_(n,()=>{let r=ps(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],k_(n,r)),s})}function lA(){let t=ps(cr()),e=Object.values(t.sessions).map(I_);for(let n of e)lr.set(n.sessionId,n);return e}function Ed(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function v_(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=Ed(t.delayMs);return{kind:"success",text:t.text,...e!==void 0?{delayMs:e}:{}}}if(t!==void 0&&typeof t.error=="string"&&typeof t.text!="string"){let e=Ed(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function w_(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function cA(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=v_(n[t]??n[S_(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let i=v_(r[s]);if(i!==void 0)return i}}}function T_(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function bd(){return new wd}var lr,Zx,eA,y_,vd,wd,Sd=O(()=>{"use strict";lr=new Map;Zx=5e3,eA=15,y_=1e4;vd=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of lA())e.set(n.sessionId,n);for(let n of lr.values())e.set(n.sessionId,n);return[...e.values()].map(T_)}async loadSession(e){let n=Oo(e);return n===void 0?null:{...T_(n),messages:n.messages.slice()}}async resolveSessionPath(e){return Oo(e)?.filePath??null}async deleteSession(e){let n=lr.delete(e),r=aA(e);return n||r}},wd=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new vd;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,n){let r=Yx(Qx(e,n)),s=`mock-${r}-${zx(`${e}:${r}`)}`,i=new Date,o=cr(e),a=Oo(s,e),l=n?.prompt??"ClaudeMock seed",c=No(l),d={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=No("ACK: ClaudeMock seeded"),E_(d),{success:!0,sessionId:s}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,n){let r=Date.now(),s=Oo(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=ps(cr(n.cwd)),a=cA(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await w_(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${S_(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:c,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=No(e),s.totalOutputTokens+=No(c),E_(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await w_(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Ft(t){let e=[ic({museDataHome:t?.museDataHome}),fc({miniplayerHome:t?.miniplayerHome}),_c({claudeDir:t?.claudeDir}),wc({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ic({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Nc({copilotDir:t?.copilotDir}),Mc({dbPaths:t?.opencodeDbPaths}),jc({kimiHome:t?.kimiHome}),Bc({lmplayerDbPath:t?.lmplayerDbPath,lmplayerDbPaths:t?.lmplayerDbPaths}),qc({qwenDir:t?.qwenDir}),zc({agyDir:t?.agyDir}),id({dshHome:t?.dshHome}),dd({hermesHome:t?.hermesHome}),gd({piDir:t?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(bd()),e}var kd=O(()=>{"use strict";oc();oc();gc();gc();yc();Tc();xc();Oc();Pc();Uc();Wc();Gc();Yc();od();ud();hd();Sd();yc();Tc();xc();Oc();Pc();Uc();Wc();Gc();Yc();od();ud();hd();Sd()});var x_,A_,C_=O(()=>{"use strict";x_=["claude","qwen","codex","dsh","miniplayer","muse","gemini","copilot","opencode","kimi","hermes"],A_=["agy","pi","lmplayer"]});var L_={};Cs(L_,{BUNDLE_CAPABLE_PROVIDERS:()=>x_,BUNDLE_NEVER_CAPABLE_PROVIDERS:()=>A_,ProviderRegistry:()=>es,TransportConnectionError:()=>de,TransportError:()=>Zt,TransportJsonError:()=>Pi,TransportProcessError:()=>Br,TransportRpcError:()=>Wr,_resetDefaultRegistryForTests:()=>fA,bundleSupportedProviders:()=>Po,canUsePersistentSession:()=>Wi,chat:()=>fs,countTokens:()=>_A,createAdapterRegistry:()=>Mt,createAllAdapters:()=>Ft,deleteSession:()=>Ad,listSessions:()=>xd,openBundleSession:()=>Rd,openConversation:()=>gA,seed:()=>Id});import{accessSync as dA,constants as uA,statSync as mA}from"node:fs";import{join as pA,delimiter as N_}from"node:path";function ln(){return Lo===null&&(Lo=Mt(Ft())),Lo}function fA(){Lo=null}function Mo(t,e){vi(e);let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function fs(t){let e=t.registry??ln(),n=Mo(e,t.provider),r={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen,requireResume:t.requireResume,bundleSession:t.bundleSession},s=t.bundleSession===void 0?await Xi(n,{...r,execution:"per-turn",requireResume:t.requireResume??!1}):void 0,i;try{i=s?await s.sendTurn(t.prompt,{onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal}):await n.sendTurn(t.prompt,r)}finally{await s?.close()}return{text:i.text,sessionId:i.sessionId,durationMs:i.durationMs,stopReason:i.stopReason,numTurns:i.numTurns,status:i.status,stalledAfterMs:i.stalledAfterMs,...i.warnings!==void 0?{warnings:i.warnings}:{}}}function Po(t){return(t??ln()).getAllAdapters().filter(n=>At(n.name)&&n.openSession!==void 0).map(n=>n.name)}async function Rd(t){let e=t.registry??ln(),n=Mo(e,t.provider);if(n.openSession===void 0)throw new Error(`provider "${t.provider}" does not support bundle sessions in this version (supported: ${Po(e).join(", ")})`);return Xi(n,{...t,execution:"persistent"})}async function gA(t){return Xi(Mo(t.registry??ln(),t.provider),t)}async function Id(t){let e=t.registry??ln(),n=Mo(e,t.provider);if(n.seedBinary==="agy"){let l=t.env??process.env,c=l.PATH??l.Path??"/usr/bin:/bin",d=N_===";"?["",...(l.PATHEXT??".EXE;.CMD;.BAT").split(";")]:[""];if(!c.split(N_).some(m=>{try{return d.some(p=>{try{let h=pA(m||t.cwd,"agy"+p);return dA(h,uA.X_OK),mA(h).isFile()}catch{return!1}})}catch{return!1}}))return{success:!1,error:"Failed to spawn agy: executable not found on PATH",errorCode:"ENOENT"}}let r=await O_(e,t.provider,t.cwd),s=await n.seed(t.cwd,{...t.env?{env:t.env}:{},...t.signal?{signal:t.signal}:{},model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(s.success&&s.sessionId)return{success:!0,sessionId:s.sessionId,...i};if(!s.success&&(s.errorCode==="ENOENT"||s.errorCode==="ABORT_ERR"))return{success:!1,error:s.error,errorCode:s.errorCode,...i};let o=await O_(e,t.provider,t.cwd),a=hA(r,o);return s.success?a?{success:!0,sessionId:a,...i}:{success:!0,...i}:(a&&await n.delete?.(a).catch(()=>{}),{success:!1,error:s.error,...i})}async function O_(t,e,n){let r=await t.listAll({provider:e,workspace:n}),s=new Map;for(let i of r)s.set(i.sessionId,i.modifiedAt);return s}function hA(t,e){let n=[];for(let r of e.keys())t.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function xd(t={}){return(t.registry??ln()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Ad(t,e,n=ln()){return n.deleteSession(e,t)}async function _A(t){let n=await(t.registry??ln()).getSession(t.sessionId,t.provider);if(!n)throw new Error(`session "${t.sessionId}" not found`);let r=n.totalInputTokens??0,s=n.totalCachedInputTokens??0,i=n.totalCacheWriteInputTokens??0,o=n.totalOutputTokens??0,a=n.totalReasoningOutputTokens??0;return{provider:n.provider,sessionId:n.sessionId,input:r,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:r+s+i+o+a,lastTurn:n.lastTokenUsage}}var Lo,cn=O(()=>{"use strict";er();qn();Zl();kd();er();Zl();kd();C_();kn();Lo=null});function Nd(t){return At(t)&&EA.has(t)}function Od(){return Cd===null&&(Cd=Mt(Ft())),Cd}function D_(t,e,n={}){if(!Nd(t))return null;try{let r=Od().getAdapter?.(t);if(r===void 0)return null;let s=r.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&n.isLead===!0?to({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?yA[t]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:t,model:n.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...M_[t]??[]]}catch{return null}}function gs(t,e){return Od().getSession(t,e)}async function F_(t){return(await Od().resolveSessions(t)).map(n=>n.provider.name)}var M_,yA,EA,P_,Cd,Do=O(()=>{"use strict";qn();cn();uc();M_={muse:["--yolo"],claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],pi:[],lmplayer:["--auto"],kimi:[],hermes:[]},yA={muse:t=>["--model",t],claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t],kimi:t=>["--model",t],hermes:t=>["--model",t],pi:t=>["--model",t]},EA=new Set(Object.keys(M_)),P_=/^[\w.:-]+$/;Cd=null});var Pd=Wv(Le=>{"use strict";function dr(t){if(!Array.isArray(t))throw new TypeError("Each row and headers must be an array of cells");return Array.from(t,e=>{let n=e==null?"":String(e);if(/[\x00-\x1f\x7f-\x9f]/u.test(n))throw new TypeError("Cells must be single-line text without terminal control characters");return n})}function j_(t){if(t===void 0)return[];if(!Array.isArray(t))throw new TypeError('align must be an array of "left", "right", or "decimal" per column');return t.map(e=>{if(e!=="left"&&e!=="right"&&e!=="decimal")throw new TypeError('align entries must be "left", "right", or "decimal"');return e})}function $t(t){let e=0;for(let n of t){let r=n.codePointAt(0);if(!(r>=768&&r<=879||r>=6832&&r<=6911||r>=7616&&r<=7679||r>=8400&&r<=8447||r>=65024&&r<=65039||r>=65056&&r<=65071||r===8203||r>=917760&&r<=917999)){if(r>=4352&&r<=4447||r>=11904&&r<=12350||r>=12353&&r<=13311||r>=13312&&r<=19903||r>=19968&&r<=40959||r>=40960&&r<=42191||r>=44032&&r<=55203||r>=63744&&r<=64255||r>=65072&&r<=65135||r>=65280&&r<=65376||r>=65504&&r<=65510||r>=9728&&r<=10175||r>=126976&&r<=129791||r>=131072&&r<=262141){e+=2;continue}e+=1}}return e}function Ld(t,e,n){let r=" ".repeat(Math.max(0,e-$t(t)));return n?r+t:t+r}function U_(t){if(Array.isArray(t))return{rows:t};if(t!==null&&typeof t=="object"&&Array.isArray(t.rows))return t;throw new TypeError("each grid must be a rows array or { rows, headers }")}function vA(t){if(t===void 0)return"\u2026";if(typeof t!="string"||/[\x00-\x1f\x7f-\x9f]/u.test(t))throw new TypeError("ellipsis must be a single-line string without terminal control characters");return t}function wA(t,e,n="\u2026"){if($t(t)<=e)return t;let r=$t(n)>e?"\u2026":n,s=$t(r);if(e<=s)return r;let i="",o=0;for(let a of t){let l=$t(a);if(o+l>e-s)break;i+=a,o+=l}return`${i}${r}`}function TA(t){if(t===void 0)return[];if(!Array.isArray(t))throw new TypeError("max must be an array of per-column width caps");return t.map(e=>{if(e!=null){if(typeof e!="number"||!Number.isInteger(e)||e<1)throw new TypeError("max entries must be positive integers, null, or undefined");return e}})}function H_(t){let e=/^(?:[+-]?\$?|\$[+-]?)(?:\d+|\d{1,3}(?:,\d{3})+|(?=\.))(?:\.(\d+))?$/.exec(t);return!e||!/\d/.test(t)?null:{places:e[1]?.length??0}}function bA(t){if(t!==void 0){if(!Array.isArray(t)||t.some(e=>!Number.isInteger(e)||e<0))throw new TypeError("decimalPlaces must be an array of nonnegative integers");return t}}function B_(t){if(!Array.isArray(t))throw new TypeError("grids must be an array of grids");let e=[];for(let n of t){let r=U_(n);r.headers!==void 0&&dr(r.headers);for(let s of r.rows.map(dr))s.forEach((i,o)=>{e[o]=Math.max(e[o]??0,H_(i)?.places??0)})}return e}Le.measureDecimalPlaces=B_;function W_(t,e,n){let r=bA(n)??[],s=e.includes("decimal")?B_(t):[];return Array.from({length:Math.max(r.length,s.length)},(i,o)=>Math.max(r[o]??0,s[o]??0))}function X_(t,e){let n=H_(t);if(!n)return null;let r=n.places?n.places+1:0,s=e?e+1:0;return t+" ".repeat(Math.max(0,s-r))}function q_(t,{max:e,align:n,decimalPlaces:r}={}){if(!Array.isArray(t))throw new TypeError("grids must be an array of grids");let s=TA(e),i=j_(n),o=W_(t,i,r),a=[],l=(c,d)=>{a[c]=Math.max(a[c]??0,d)};for(let c of t){let d=U_(c);d.headers!==void 0&&dr(d.headers).forEach((u,m)=>{l(m,$t(u))});for(let u of d.rows.map(dr))u.forEach((m,p)=>{let h=i[p]==="decimal"?X_(m,o[p]??0)??m:m;l(p,$t(h))})}return a.map((c,d)=>{let u=s[d];return u===void 0?c:Math.min(c,u)})}Le.measureColumns=q_;function SA(t){if(t===void 0)return"";if(typeof t=="number"&&Number.isInteger(t)&&t>=0)return" ".repeat(t);if(typeof t=="string"&&!/[\x00-\x1f\x7f-\x9f]/u.test(t))return t;throw new TypeError("margin must be a number of spaces or a single-line string")}function G_(t,{widths:e,headers:n,align:r,truncate:s=!0,truncateTrailing:i=!1,margin:o,max:a,ellipsis:l,decimalPlaces:c}={}){if(!Array.isArray(t))throw new TypeError("rows must be an array of row arrays");if(e!==void 0&&!Array.isArray(e))throw new TypeError("widths must be an array of column widths");if(e!==void 0&&a!==void 0)throw new TypeError("pass widths or max, not both (max caps a measurement)");let d=SA(o),u=j_(r),m=vA(l),p=W_([t],u,c),h=e??q_([{rows:t,headers:n}],{max:a,align:u,decimalPlaces:p}),_=t.map(dr);n!==void 0&&_.unshift(dr(n));let y=_.map((f,w)=>{let g=f.length-1;for(;g>=0&&f[g]==="";)g--;return f.slice(0,g+1).map((E,b)=>{let C=h[b]||0,I=s&&C>0&&(b!==g||i)?wA(E,C,m):E;if(u[b]==="decimal"){let N=n!==void 0&&w===0?null:X_(E,p[b]??0),A=Ld(N!==null&&$t(N)<=C?N:I,C,!0);return b===g&&N!==null?A.trimEnd():A}return u[b]==="right"?Ld(I,C,!0):b===g?I:Ld(I,C,!1)}).join(" ")}).join(`
2118
+ AND role = 'user' AND content != ''`,a;try{a=e.prepare(`${o} AND active = 1 ORDER BY id ${i} LIMIT 1`).get(n)}catch(l){if(!/no such column: active/i.test(String(l)))throw l;a=e.prepare(`${o} ORDER BY id ${i} LIMIT 1`).get(n)}return a?q(a.content,80):void 0});return{first:r,last:s}}catch{return{}}}async loadSession(e){let n=this.openDb();if(!n)return null;try{let r=this.selectSessionRow(n,e);if(!r)return null;let s=this.activeMessageRows(n,e),i=[],o=[],a,l;for(let c of s){let d=gs(c.timestamp),u=c.content??"";if(c.role==="user"){u&&c._compressed_summary!==1&&c.display_kind!=="hidden"&&o.push(u),u.length>0&&(a||(a=q(u,80)),l=q(u,80)),i.push({role:"user",timestamp:d,content:u||"(empty)"});continue}if(c.role==="tool"){i.push({role:"tool_result",timestamp:d,content:u,toolCallId:je(c.tool_call_id),toolName:je(c.tool_name)});continue}u.length>0&&i.push({role:"assistant",timestamp:d,content:u,model:je(r.model),stopReason:je(c.finish_reason)});for(let m of Wx(c.tool_calls)){let p=Xx(m.function?.arguments);i.push({role:"tool_use",timestamp:d,content:je(m.function?.name)??"tool_call",toolName:je(m.function?.name),toolCallId:je(m.call_id)??je(m.id),toolInput:typeof m.function?.arguments=="string"?m.function.arguments:JSON.stringify(m.function?.arguments??{}),toolInputData:et(p)})}}return{provider:this.name,sessionId:r.id,slug:je(r.title),cwd:p_(r),createdAt:gs(r.started_at),modifiedAt:gs(r.last_activity_at??r.started_at),model:je(r.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:l,messageCount:r.message_count??i.length,filePath:this.dbPath,...f_(r),messages:i,userPrompts:o}}catch(r){return U({event:"hermes_load_session_failed",provider:this.name,session_id:e,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),null}finally{n.close()}}async resolveSessionPath(e){let n=this.openDb();if(!n)return null;try{return this.selectSessionRow(n,e)?this.dbPath:null}catch{return null}finally{n.close()}}async deleteSession(e){return!1}}});import{mkdir as qx}from"node:fs/promises";function Jx(t){return Gx.test(t)}function __(t){if(t==="plan")throw new Error(`provider "hermes" does not support --permission-mode plan: Hermes's ACP mode ladder (default/accept_edits/dont_ask) governs file edits only and has no plan-equivalent, so lmctl refuses rather than silently running the member with edit auto-approval.`);return Kx}function fd(t){return new pd(t)}var Gx,Kx,pd,gd=O(()=>{"use strict";Ae();h_();Ft();xe();oe();Gx=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Kx="dont_ask";pd=class extends ne{hermesProvider;hermesHome;constructor(e){let n=new Oo(e);super({provider:n,protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Hermes has no provider-side leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"hermes",seedArgs:[],resumeTemplate:"hermes --yolo --resume {{session_id}}",startTemplate:"hermes",transport:async(r,s)=>vt(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:__(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=md(e)}async openSession(e){return wt({...e,env:{...e.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:__(e.permissionMode)})}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(e,n){await qx(e,{recursive:!0});let r=[];if(n?.effort){let i="hermes has no ACP-level effort surface";U({event:"hermes_effort_ignored",provider:this.name,effort:n.effort,reason:i}),r.push(`hermes seed ignored effort=${n.effort}: ${i}`)}let s;try{s=await this.sendTurn(n?.prompt??Y,{sessionId:"",cwd:e,model:n?.model})}catch(i){return{success:!1,error:`hermes ACP seed failed: ${i instanceof Error?i.message:String(i)}`}}return Jx(s.sessionId)?(r.push(...s.warnings??[]),{success:!0,sessionId:s.sessionId,...r.length>0?{warnings:r}:{}}):(U({event:"hermes_seed_contract_violation",provider:this.name,session_id:s.sessionId,reason:"session/new did not return a UUID session id"}),{success:!1,error:`hermes ACP session/new did not return a UUID session id (got ${JSON.stringify(s.sessionId)})`})}}});import{readdir as y_,rm as Vx,stat as zx}from"node:fs/promises";import{join as hd}from"node:path";function _d(t){return typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(e=>e.type==="text"&&e.text).map(e=>e.text).join(" "):""}function E_(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}var Lo,v_=O(()=>{"use strict";be();Lo=class{name="pi";baseDir;constructor(e={}){this.baseDir=e.piDir||hd(K,".pi","agent","sessions")}getWatchPaths(){return[{directory:this.baseDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[];for(let n of await this.listSessionFiles())try{let r=await this.extractSummary(n);r&&e.push(r)}catch{}return e}async listSessionFiles(){let e;try{e=await y_(this.baseDir)}catch{return[]}let n=[];for(let r of e){let s=hd(this.baseDir,r);try{if(!(await zx(s)).isDirectory())continue;for(let i of await y_(s))i.endsWith(".jsonl")&&n.push(hd(s,i))}catch{}}return n}async readHeader(e){for await(let n of me(e))return n.type==="session"?n:null;return null}async extractSummary(e){let n=await this.readHeader(e);if(!n)return null;let r=await ye(e),s,i,o,a=0,l=0,c=0,d=0,u=0,m=0,p=0,h;for await(let _ of me(e)){if(_.type==="model_change"&&_.provider&&_.modelId){s=`${_.provider}/${_.modelId}`;continue}if(_.type!=="message"||!_.message)continue;let y=_.message;if(y.provider&&y.model&&(s=`${y.provider}/${y.model}`),y.role==="user"){let f=_d(y).trim();f&&(i||(i=q(f,80)),o=q(f,80)),a++}else if(y.role==="assistant"){a++;let f=y.usage;f&&(l+=f.input??0,c+=f.cacheRead??0,d+=f.cacheWrite??0,u+=f.output??0,m+=f.reasoning??0,p=f.input??0,h={inputTokens:f.input,cachedInputTokens:f.cacheRead,cacheWriteInputTokens:f.cacheWrite,outputTokens:f.output,reasoningOutputTokens:f.reasoning,totalTokens:f.totalTokens})}}return{provider:"pi",sessionId:n.id,cwd:n.cwd??"(unknown)",createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:s,startCommand:"pi",firstUserMessage:i,lastUserMessage:o,messageCount:a,filePath:e,totalInputTokens:l,totalCachedInputTokens:c,totalCacheWriteInputTokens:d,totalOutputTokens:u,totalReasoningOutputTokens:m,lastInputTokens:p,lastTokenUsage:h}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=await this.extractSummary(n);if(!r)return null;let s=[],i=r.model;for await(let o of me(n)){if(o.type==="model_change"&&o.provider&&o.modelId){i=`${o.provider}/${o.modelId}`;continue}if(o.type!=="message"||!o.message)continue;let a=o.message;a.provider&&a.model&&(i=`${a.provider}/${a.model}`);let l=a.timestamp?new Date(a.timestamp):r.modifiedAt;if(a.role==="user")s.push({role:"user",timestamp:l,content:_d(a)});else if(a.role==="assistant"&&Array.isArray(a.content))for(let c of a.content)c.type==="text"&&c.text?s.push({role:"assistant",timestamp:l,content:c.text,model:i}):c.type==="thinking"&&c.thinking?s.push({role:"thinking",timestamp:l,content:c.thinking}):c.type==="toolCall"&&s.push({role:"tool_use",timestamp:l,content:E_(c.arguments),toolName:c.name??"tool",toolInput:E_(c.arguments),toolInputData:c.arguments,toolCallId:c.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:l,content:_d(a),toolName:a.toolName,toolCallId:a.toolCallId})}return{...r,model:i,messages:s}}async resolveSessionPath(e){let n=`_${e}.jsonl`,r=[];for(let s of await this.listSessionFiles()){if(s.endsWith(n))return s;s.split("_").pop()?.replace(/\.jsonl$/,"")?.startsWith(e)&&r.push(s)}return r.length===1?r[0]:null}async deleteSession(e){let n=await this.resolveSessionPath(e);return n?(await Vx(n,{force:!0}),!0):!1}}});function Ed(t){return new yd(t)}var yd,Yx,vd=O(()=>{"use strict";v_();Ae();xe();Et();Qc();yd=class extends ne{constructor(e){super({provider:new Lo(e),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"pi uses one-shot print turns; no streaming events are available."},binary:"pi",seedArgs:["-p",Y],resumeTemplate:"pi --session {{session_id}}",startTemplate:"pi",transport:Yx})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}manualSeedHint(e){return{launchCommand:`cd ${e} && pi`,postLaunchNote:"Send the lmctl seed instruction, wait for the session file to write, then exit.",lsCommand:`lmctl ls --provider pi --sessiondir ${e}`}}},Yx=Ro({label:"pi",buildArgs:(t,e)=>{let n=[...e.sessionId?["--session",e.sessionId]:[],"-p",t];return e.model&&n.push("--model",e.model),n},assertArgs:(t,e)=>Te("pi",t,e.permissionMode??"yolo")})});import{createHash as Qx}from"node:crypto";import{existsSync as Zx,mkdirSync as Td,readFileSync as eA,renameSync as tA,rmdirSync as x_,statSync as nA,writeFileSync as rA}from"node:fs";import{dirname as Rd,join as w_,resolve as wd}from"node:path";function sA(t){return Qx("sha256").update(t).digest("hex").slice(0,8)}function iA(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function oA(t,e){let n=e?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function A_(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Mo(t){return Math.max(1,Math.ceil(t.length/4))}function mr(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return wd(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?w_(Rd(wd(n)),".lmctl-claude-mock","sessions.json"):w_(wd(t),".lmctl-claude-mock","sessions.json")}function T_(){return{schemaVersion:1,sessions:{}}}function hs(t){if(!Zx(t))return T_();try{let e=JSON.parse(eA(t,"utf8")),n=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},r=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=bd(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return T_()}}function C_(t,e){Td(Rd(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;rA(n,`${JSON.stringify(e,null,2)}
2119
+ `,"utf8"),tA(n,t)}function cA(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function dA(t){let e=`${t}.lock`;Td(Rd(t),{recursive:!0});let n=Date.now()+b_;for(;;)try{return Td(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-nA(e).mtimeMs>aA){try{x_(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${b_}ms: ${e}`);cA(lA)}}function uA(t){try{x_(t)}catch{}}function N_(t,e){let n=dA(t);try{return e()}finally{uA(n)}}function mA(t){return{...t,timestamp:t.timestamp.toISOString()}}function pA(t){return{...t,timestamp:new Date(t.timestamp)}}function fA(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(mA)}}function O_(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(pA)}}function Po(t,e=process.cwd()){let n=ur.get(t);if(n!==void 0)return n;let s=hs(mr(e)).sessions[t];if(s===void 0)return;let i=O_(s);return ur.set(i.sessionId,i),i}function S_(t){ur.set(t.sessionId,t);let e=mr(t.cwd);N_(e,()=>{let n=hs(e);n.sessions[t.sessionId]=fA({...t,filePath:e}),C_(e,n)})}function gA(t,e=process.cwd()){let n=mr(e);return N_(n,()=>{let r=hs(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],C_(n,r)),s})}function hA(){let t=hs(mr()),e=Object.values(t.sessions).map(O_);for(let n of e)ur.set(n.sessionId,n);return e}function bd(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function k_(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=bd(t.delayMs);return{kind:"success",text:t.text,...e!==void 0?{delayMs:e}:{}}}if(t!==void 0&&typeof t.error=="string"&&typeof t.text!="string"){let e=bd(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function R_(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function _A(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=k_(n[t]??n[A_(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let i=k_(r[s]);if(i!==void 0)return i}}}function I_(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function Id(){return new kd}var ur,aA,lA,b_,Sd,kd,xd=O(()=>{"use strict";ur=new Map;aA=5e3,lA=15,b_=1e4;Sd=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of hA())e.set(n.sessionId,n);for(let n of ur.values())e.set(n.sessionId,n);return[...e.values()].map(I_)}async loadSession(e){let n=Po(e);return n===void 0?null:{...I_(n),messages:n.messages.slice()}}async resolveSessionPath(e){return Po(e)?.filePath??null}async deleteSession(e){let n=ur.delete(e),r=gA(e);return n||r}},kd=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Sd;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,n){let r=iA(oA(e,n)),s=`mock-${r}-${sA(`${e}:${r}`)}`,i=new Date,o=mr(e),a=Po(s,e),l=n?.prompt??"ClaudeMock seed",c=Mo(l),d={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Mo("ACK: ClaudeMock seeded"),S_(d),{success:!0,sessionId:s}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,n){let r=Date.now(),s=Po(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=hs(mr(n.cwd)),a=_A(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await R_(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${A_(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:c,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Mo(e),s.totalOutputTokens+=Mo(c),S_(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await R_(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function $t(t){let e=[cc({museDataHome:t?.museDataHome}),yc({miniplayerHome:t?.miniplayerHome}),wc({claudeDir:t?.claudeDir}),kc({codexDir:t?.codexDir,codeDir:t?.codeDir}),Nc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Pc({copilotDir:t?.copilotDir}),$c({dbPaths:t?.opencodeDbPaths}),Wc({kimiHome:t?.kimiHome}),Gc({lmplayerDbPath:t?.lmplayerDbPath,lmplayerDbPaths:t?.lmplayerDbPaths}),Vc({qwenDir:t?.qwenDir}),ed({agyDir:t?.agyDir}),cd({dshHome:t?.dshHome}),fd({hermesHome:t?.hermesHome}),Ed({piDir:t?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Id()),e}var Ad=O(()=>{"use strict";dc();dc();Ec();Ec();Tc();Rc();Oc();Dc();jc();Xc();Jc();zc();td();dd();gd();vd();xd();Tc();Rc();Oc();Dc();jc();Xc();Jc();zc();td();dd();gd();vd();xd()});var L_,M_,P_=O(()=>{"use strict";L_=["claude","qwen","codex","dsh","miniplayer","muse","gemini","copilot","opencode","kimi","hermes"],M_=["agy","pi","lmplayer"]});var $_={};Ls($_,{BUNDLE_CAPABLE_PROVIDERS:()=>L_,BUNDLE_NEVER_CAPABLE_PROVIDERS:()=>M_,ProviderRegistry:()=>rs,TransportConnectionError:()=>de,TransportError:()=>en,TransportJsonError:()=>$i,TransportProcessError:()=>qr,TransportRpcError:()=>Gr,_resetDefaultRegistryForTests:()=>TA,bundleSupportedProviders:()=>$o,canUsePersistentSession:()=>Gi,chat:()=>_s,countTokens:()=>kA,createAdapterRegistry:()=>Pt,createAllAdapters:()=>$t,deleteSession:()=>Ld,listSessions:()=>Od,openBundleSession:()=>Cd,openConversation:()=>bA,seed:()=>Nd});import{accessSync as yA,constants as EA,statSync as vA}from"node:fs";import{join as wA,delimiter as D_}from"node:path";function cn(){return Do===null&&(Do=Pt($t())),Do}function TA(){Do=null}function Fo(t,e){bi(e);let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function _s(t){let e=t.registry??cn(),n=Fo(e,t.provider),r={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen,requireResume:t.requireResume,bundleSession:t.bundleSession},s=t.bundleSession===void 0?await Ji(n,{...r,execution:"per-turn",requireResume:t.requireResume??!1}):void 0,i;try{i=s?await s.sendTurn(t.prompt,{onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal}):await n.sendTurn(t.prompt,r)}finally{await s?.close()}return{text:i.text,sessionId:i.sessionId,durationMs:i.durationMs,stopReason:i.stopReason,numTurns:i.numTurns,status:i.status,stalledAfterMs:i.stalledAfterMs,...i.warnings!==void 0?{warnings:i.warnings}:{}}}function $o(t){return(t??cn()).getAllAdapters().filter(n=>Ct(n.name)&&n.openSession!==void 0).map(n=>n.name)}async function Cd(t){let e=t.registry??cn(),n=Fo(e,t.provider);if(n.openSession===void 0)throw new Error(`provider "${t.provider}" does not support bundle sessions in this version (supported: ${$o(e).join(", ")})`);return Ji(n,{...t,execution:"persistent"})}async function bA(t){return Ji(Fo(t.registry??cn(),t.provider),t)}async function Nd(t){let e=t.registry??cn(),n=Fo(e,t.provider);if(n.seedBinary==="agy"){let l=t.env??process.env,c=l.PATH??l.Path??"/usr/bin:/bin",d=D_===";"?["",...(l.PATHEXT??".EXE;.CMD;.BAT").split(";")]:[""];if(!c.split(D_).some(m=>{try{return d.some(p=>{try{let h=wA(m||t.cwd,"agy"+p);return yA(h,EA.X_OK),vA(h).isFile()}catch{return!1}})}catch{return!1}}))return{success:!1,error:"Failed to spawn agy: executable not found on PATH",errorCode:"ENOENT"}}let r=await F_(e,t.provider,t.cwd),s=await n.seed(t.cwd,{...t.env?{env:t.env}:{},...t.signal?{signal:t.signal}:{},model:t.model,effort:t.effort,prompt:t.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(s.success&&s.sessionId)return{success:!0,sessionId:s.sessionId,...i};if(!s.success&&(s.errorCode==="ENOENT"||s.errorCode==="ABORT_ERR"))return{success:!1,error:s.error,errorCode:s.errorCode,...i};let o=await F_(e,t.provider,t.cwd),a=SA(r,o);return s.success?a?{success:!0,sessionId:a,...i}:{success:!0,...i}:(a&&await n.delete?.(a).catch(()=>{}),{success:!1,error:s.error,...i})}async function F_(t,e,n){let r=await t.listAll({provider:e,workspace:n}),s=new Map;for(let i of r)s.set(i.sessionId,i.modifiedAt);return s}function SA(t,e){let n=[];for(let r of e.keys())t.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function Od(t={}){return(t.registry??cn()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function Ld(t,e,n=cn()){return n.deleteSession(e,t)}async function kA(t){let n=await(t.registry??cn()).getSession(t.sessionId,t.provider);if(!n)throw new Error(`session "${t.sessionId}" not found`);let r=n.totalInputTokens??0,s=n.totalCachedInputTokens??0,i=n.totalCacheWriteInputTokens??0,o=n.totalOutputTokens??0,a=n.totalReasoningOutputTokens??0;return{provider:n.provider,sessionId:n.sessionId,input:r,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:r+s+i+o+a,lastTurn:n.lastTokenUsage}}var Do,dn=O(()=>{"use strict";rr();Kn();rc();Ad();rr();rc();Ad();P_();In();Do=null});function Pd(t){return Ct(t)&&IA.has(t)}function Dd(){return Md===null&&(Md=Pt($t())),Md}function H_(t,e,n={}){if(!Pd(t))return null;try{let r=Dd().getAdapter?.(t);if(r===void 0)return null;let s=r.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&n.isLead===!0?so({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?RA[t]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:t,model:n.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...j_[t]??[]]}catch{return null}}function ys(t,e){return Dd().getSession(t,e)}async function B_(t){return(await Dd().resolveSessions(t)).map(n=>n.provider.name)}var j_,RA,IA,U_,Md,jo=O(()=>{"use strict";Kn();dn();gc();j_={muse:["--yolo"],claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],pi:[],lmplayer:["--auto"],kimi:[],hermes:[]},RA={muse:t=>["--model",t],claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t],kimi:t=>["--model",t],hermes:t=>["--model",t],pi:t=>["--model",t]},IA=new Set(Object.keys(j_)),U_=/^[\w.:-]+$/;Md=null});var jd=Kv(Le=>{"use strict";function pr(t){if(!Array.isArray(t))throw new TypeError("Each row and headers must be an array of cells");return Array.from(t,e=>{let n=e==null?"":String(e);if(/[\x00-\x1f\x7f-\x9f]/u.test(n))throw new TypeError("Cells must be single-line text without terminal control characters");return n})}function X_(t){if(t===void 0)return[];if(!Array.isArray(t))throw new TypeError('align must be an array of "left", "right", or "decimal" per column');return t.map(e=>{if(e!=="left"&&e!=="right"&&e!=="decimal")throw new TypeError('align entries must be "left", "right", or "decimal"');return e})}function jt(t){let e=0;for(let n of t){let r=n.codePointAt(0);if(!(r>=768&&r<=879||r>=6832&&r<=6911||r>=7616&&r<=7679||r>=8400&&r<=8447||r>=65024&&r<=65039||r>=65056&&r<=65071||r===8203||r>=917760&&r<=917999)){if(r>=4352&&r<=4447||r>=11904&&r<=12350||r>=12353&&r<=13311||r>=13312&&r<=19903||r>=19968&&r<=40959||r>=40960&&r<=42191||r>=44032&&r<=55203||r>=63744&&r<=64255||r>=65072&&r<=65135||r>=65280&&r<=65376||r>=65504&&r<=65510||r>=9728&&r<=10175||r>=126976&&r<=129791||r>=131072&&r<=262141){e+=2;continue}e+=1}}return e}function Fd(t,e,n){let r=" ".repeat(Math.max(0,e-jt(t)));return n?r+t:t+r}function q_(t){if(Array.isArray(t))return{rows:t};if(t!==null&&typeof t=="object"&&Array.isArray(t.rows))return t;throw new TypeError("each grid must be a rows array or { rows, headers }")}function xA(t){if(t===void 0)return"\u2026";if(typeof t!="string"||/[\x00-\x1f\x7f-\x9f]/u.test(t))throw new TypeError("ellipsis must be a single-line string without terminal control characters");return t}function AA(t,e,n="\u2026"){if(jt(t)<=e)return t;let r=jt(n)>e?"\u2026":n,s=jt(r);if(e<=s)return r;let i="",o=0;for(let a of t){let l=jt(a);if(o+l>e-s)break;i+=a,o+=l}return`${i}${r}`}function CA(t){if(t===void 0)return[];if(!Array.isArray(t))throw new TypeError("max must be an array of per-column width caps");return t.map(e=>{if(e!=null){if(typeof e!="number"||!Number.isInteger(e)||e<1)throw new TypeError("max entries must be positive integers, null, or undefined");return e}})}function G_(t){let e=/^(?:[+-]?\$?|\$[+-]?)(?:\d+|\d{1,3}(?:,\d{3})+|(?=\.))(?:\.(\d+))?$/.exec(t);return!e||!/\d/.test(t)?null:{places:e[1]?.length??0}}function NA(t){if(t!==void 0){if(!Array.isArray(t)||t.some(e=>!Number.isInteger(e)||e<0))throw new TypeError("decimalPlaces must be an array of nonnegative integers");return t}}function J_(t){if(!Array.isArray(t))throw new TypeError("grids must be an array of grids");let e=[];for(let n of t){let r=q_(n);r.headers!==void 0&&pr(r.headers);for(let s of r.rows.map(pr))s.forEach((i,o)=>{e[o]=Math.max(e[o]??0,G_(i)?.places??0)})}return e}Le.measureDecimalPlaces=J_;function K_(t,e,n){let r=NA(n)??[],s=e.includes("decimal")?J_(t):[];return Array.from({length:Math.max(r.length,s.length)},(i,o)=>Math.max(r[o]??0,s[o]??0))}function V_(t,e){let n=G_(t);if(!n)return null;let r=n.places?n.places+1:0,s=e?e+1:0;return t+" ".repeat(Math.max(0,s-r))}function z_(t,{max:e,align:n,decimalPlaces:r}={}){if(!Array.isArray(t))throw new TypeError("grids must be an array of grids");let s=CA(e),i=X_(n),o=K_(t,i,r),a=[],l=(c,d)=>{a[c]=Math.max(a[c]??0,d)};for(let c of t){let d=q_(c);d.headers!==void 0&&pr(d.headers).forEach((u,m)=>{l(m,jt(u))});for(let u of d.rows.map(pr))u.forEach((m,p)=>{let h=i[p]==="decimal"?V_(m,o[p]??0)??m:m;l(p,jt(h))})}return a.map((c,d)=>{let u=s[d];return u===void 0?c:Math.min(c,u)})}Le.measureColumns=z_;function OA(t){if(t===void 0)return"";if(typeof t=="number"&&Number.isInteger(t)&&t>=0)return" ".repeat(t);if(typeof t=="string"&&!/[\x00-\x1f\x7f-\x9f]/u.test(t))return t;throw new TypeError("margin must be a number of spaces or a single-line string")}function Y_(t,{widths:e,headers:n,align:r,truncate:s=!0,truncateTrailing:i=!1,margin:o,max:a,ellipsis:l,decimalPlaces:c}={}){if(!Array.isArray(t))throw new TypeError("rows must be an array of row arrays");if(e!==void 0&&!Array.isArray(e))throw new TypeError("widths must be an array of column widths");if(e!==void 0&&a!==void 0)throw new TypeError("pass widths or max, not both (max caps a measurement)");let d=OA(o),u=X_(r),m=xA(l),p=K_([t],u,c),h=e??z_([{rows:t,headers:n}],{max:a,align:u,decimalPlaces:p}),_=t.map(pr);n!==void 0&&_.unshift(pr(n));let y=_.map((f,w)=>{let g=f.length-1;for(;g>=0&&f[g]==="";)g--;return f.slice(0,g+1).map((E,b)=>{let C=h[b]||0,I=s&&C>0&&(b!==g||i)?AA(E,C,m):E;if(u[b]==="decimal"){let N=n!==void 0&&w===0?null:V_(E,p[b]??0),A=Fd(N!==null&&jt(N)<=C?N:I,C,!0);return b===g&&N!==null?A.trimEnd():A}return u[b]==="right"?Fd(I,C,!0):b===g?I:Fd(I,C,!1)}).join(" ")}).join(`
2120
2120
  `);return y===""||d===""?y:`${d}${y.split(`
2121
2121
  `).join(`
2122
- ${d}`)}`}Le.renderGrid=G_;function J_(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l}={}){return G_(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l})}function kA(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l,stream:c=process.stdout}={}){let d=J_(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l});d&&c.write(`${d}
2123
- `)}Le.formatTable=J_;Le.printTable=kA;function $_(t){return t instanceof Date?t.getTime():typeof t=="number"?t:typeof t=="string"&&t.trim()?Date.parse(t):NaN}function RA(t,{now:e=Date.now()}={}){let n=$_(e);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=$_(t);if(!Number.isFinite(r))return"unknown";let s=r-n,i=Math.floor(Math.abs(s)/1e3);if(i===0)return"now";for(let[o,a]of[["w",604800],["d",86400],["h",3600],["m",60],["s",1]])if(i>=a)return`${Math.floor(i/a)}${o}${s<0?" ago":""}`}Le.formatRelativeTime=RA;function IA(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=t<0?"-":"",n=Math.abs(t);if(n<1e3)return String(t);let r=Math.round(n/1e3);return r<1e3?`${e}${r}K`:`${e}${(n/1e6).toFixed(1)}M`}Le.formatCount=IA;var Md=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function xA(t,{maxUnit:e="w",style:n="spaced"}={}){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let r=Md.findIndex(([a])=>a===e);if(r===-1)throw new TypeError('maxUnit must be one of "w", "d", "h", "m", "s"');if(n!=="spaced"&&n!=="compact")throw new TypeError('style must be "spaced" or "compact"');let s=Math.floor(Math.max(0,t)/1e3);if(n==="compact"){let a=Md.slice(r).filter(([u])=>u!=="s");if(a.length===0||s<60)return"<1m";let l=[],c=s,d=!1;for(let[u,m]of a){let p=Math.floor(c/m);if(c-=p*m,p>0&&!d){let h=u==="d"||u==="w"?`${p}${u}`:`${Tt(p)}${u}`;l.push({text:h,zero:!1}),d=!0}else d&&l.push({text:`${Tt(p)}${u}`,zero:p===0})}for(;l.length>0&&l[l.length-1].zero;)l.pop();return l.map(u=>u.text).join("")}let i=s,o=[];for(let[a,l]of Md.slice(r))if(i>=l||a==="s"&&o.length===0){let c=Math.floor(i/l);if(i-=c*l,o.push(`${c}${a}`),o.length===2)break}return o.join(" ")}Le.formatDuration=xA;function K_(t){return t===void 0?new Date:t instanceof Date?t:typeof t=="number"||typeof t=="string"?new Date(t):new Date(NaN)}function Tt(t){return String(t).padStart(2,"0")}function V_(t){let e=K_(t);return Number.isNaN(e.getTime())?"unknown":`${Tt(e.getHours())}:${Tt(e.getMinutes())}:${Tt(e.getSeconds())}`}Le.formatClock=V_;function AA(t){let e=K_(t);return Number.isNaN(e.getTime())?"unknown":`${`${e.getFullYear()}-${Tt(e.getMonth()+1)}-${Tt(e.getDate())}`} ${V_(e)}`}Le.formatLocalTimestamp=AA;function CA(t){return typeof t=="number"&&Number.isFinite(t)?`${Math.round(t*100)}%`:"?%"}Le.formatPercent=CA;function NA(t,{width:e=10,fill:n="#",empty:r=" ",unknown:s="?"}={}){if(typeof e!="number"||!Number.isInteger(e)||e<1)throw new TypeError("width must be a positive integer");for(let[o,a]of[["fill",n],["empty",r],["unknown",s]])if(typeof a!="string"||[...a].length!==1||/[\x00-\x1f\x7f-\x9f]/u.test(a)||$t(a)!==1)throw new TypeError(`${o} must be a single character with terminal display width 1`);if(typeof t!="number"||!Number.isFinite(t))return s.repeat(e);let i=Math.min(e,Math.max(0,Math.round(t*e)));return`${n.repeat(i)}${r.repeat(e-i)}`}Le.formatBar=NA;function OA(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=Math.floor(Math.max(0,t)/1e3),n=Math.floor(e/86400);e-=n*86400;let r=Math.floor(e/3600);e-=r*3600;let s=Math.floor(e/60);e-=s*60;let i=`${Tt(r)}:${Tt(s)}:${Tt(e)}`;return n>0?`${n}d ${i}`:i}Le.formatTimer=OA;function LA(t){return(t==null?"":String(t)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
2124
- `?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}Le.escapeCell=LA});function Dd(t){let e=t.env?.LMCTL_DB;return e!==void 0&&e.length>0?e:Wn(void 0,{...process.env,...t.env})}async function re(t,e){if(t.dal!==void 0)return e(t.dal);let n=Vt({path:Dd(t)});try{return await e(n)}finally{n.close()}}function z_(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
2125
- `)}function dn(t,e){return t.stderr.write(`error: ${e}
2126
- `),1}function Y_(t,e,n=5e3){let r=Date.now(),s=r,i=setInterval(()=>{let o=Date.now();o-s<n||t.stderr.write(e(Math.round((o-r)/1e3)))},n);return i.unref(),{poke:()=>{s=Date.now()},stop:()=>clearInterval(i)}}function Q_(t,e){let n=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${n}
2127
- `),2}function Fo(t){if(t===void 0)return null;let e=Number.parseInt(t,10);return Number.isInteger(e)&&e>0?e:null}var MA,ur=O(()=>{"use strict";En();MA=vu(Pd(),1);di()});import{homedir as PA}from"node:os";function Z_(t,e){let n=new Set;return{text:t.replace(FA,(s,i)=>{let o=i.trim(),a=DA[o];return a===void 0?(n.add(o),s):a(e)}),unknownNames:[...n].sort()}}function ey(t){return{workdir:t.workdir,teamfile:t.teamfile,date:$A(t.date)}}function $A(t){return t.toISOString().slice(0,10)}var DA,FA,ty=O(()=>{"use strict";Ct();DA={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>Pr(t.teamfile),home:()=>PA(),date:t=>t.date},FA=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});import{existsSync as jA,mkdirSync as UA,readFileSync as HA,renameSync as BA,unlinkSync as WA,writeFileSync as XA}from"node:fs";import{homedir as ry}from"node:os";import{dirname as hs,join as Me,resolve as qA}from"node:path";function pr(t,e,n){let r=hs(qA(n)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??r,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())bt(Me(o,".mcp.json"),"mcpServers",[un(),mn()]),a.has("opencode")&&bt(Me(o,".opencode","opencode.json"),"mcp",[sy(),iy()]),a.has("kimi")&&bt(Me(o,".kimi-code","mcp.json"),"mcpServers",[un(),mn()]);for(let o of s)zA(o)}function JA(t=Fd??ry()){return Me(t,".copilot","mcp-config.json")}function KA(t,e){et.mkdirSync(hs(t),{recursive:!0});let n=Me(hs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{et.writeFileSync(n,`${JSON.stringify(e,null,2)}
2128
- `,"utf8"),et.renameSync(n,t)}catch(r){try{et.unlinkSync(n)}catch{}throw r}}function VA(t,e){et.mkdirSync(hs(t),{recursive:!0});let n=Me(hs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{et.writeFileSync(n,e,"utf8"),et.renameSync(n,t)}catch(r){try{et.unlinkSync(n)}catch{}throw r}}function bt(t,e,n){try{if(!et.existsSync(t))return;let r=JSON.parse(et.readFileSync(t,"utf8"));if(!mr(r)||!mr(r[e]))return;let s={...r[e]},i=[];for(let{name:o,shouldRemove:a}of n)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;r[e]=s,KA(t,r),U({event:"mcp_cleanup",path:t,removed:i})}catch{}}function un(){return{name:jo,shouldRemove:sC}}function sy(){return{name:jo,shouldRemove:iC}}function mn(){return{name:$o,shouldRemove:nC}}function iy(){return{name:$o,shouldRemove:rC}}function zA(t){let e=Fd??ry();switch(t){case"copilot":bt(JA(e),"mcpServers",[un(),mn()]);return;case"claude":bt(Me(e,".claude.json"),"mcpServers",[un(),mn()]);return;case"gemini":bt(Me(e,".gemini","settings.json"),"mcpServers",[un(),mn()]);return;case"qwen":bt(Me(e,".qwen","settings.json"),"mcpServers",[un(),mn()]);return;case"agy":bt(Me(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[un(),mn()]);return;case"opencode":bt(Me(e,".config","opencode","opencode.json"),"mcp",[sy(),iy()]);return;case"kimi":bt(Me(Fd===void 0?process.env.KIMI_CODE_HOME??Me(e,".kimi-code"):Me(e,".kimi-code"),"mcp.json"),"mcpServers",[un(),mn()]);return;case"codex":YA(Me(e,".codex","config.toml"));return;default:return}}function YA(t){try{if(!et.existsSync(t))return;let e=et.readFileSync(t,"utf8"),n=QA(e);if(n===null)return;let r=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of r){let c=oy(l);if(c===null)return;if(c!==void 0){if(ny(c,n)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=eC(l);if(d===null)return;if(d!==void 0&&ny(d,n)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;VA(t,s.join(`
2129
- `)),U({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function ny(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function QA(t){let e=new Map,n;for(let s of t.split(/\n/)){let i=oy(s);if(i===null)return null;if(i!==void 0){n=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=ZA(a,n);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==$o&&c[1]!==jo)continue;let d=e.get(c[1])??{};if(c[2]==="command"){let u=ay(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=tC(l);if(u===null)return null;d.args=u}e.set(c[1],d)}let r=new Set;for(let[s,i]of e.entries())s===$o&&cy(i.command,i.args)&&r.add(s),s===jo&&dy(i.command,i.args)&&r.add(s);return r}function ZA(t,e){if(t.startsWith("mcp_servers"))return Uo(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=Uo(t);return n===null?null:[...e,...n]}function oy(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Uo(e[1])}function eC(t){let e=t.indexOf("=");if(e<0)return;let n=t.slice(0,e).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return Uo(n)}function Uo(t){let e=[],n=0,r=()=>{for(;n<t.length&&/\s/.test(t[n]);)n+=1};for(;n<t.length;){if(r(),n>=t.length)return null;if(t[n]==='"'){n+=1;let s="",i=!1;for(;n<t.length;){let o=t[n];if(o==="\\"){if(n+1>=t.length)return null;s+=t[n+1],n+=2;continue}if(o==='"'){n+=1,i=!0;break}s+=o,n+=1}if(!i)return null;e.push(s)}else{let s=n;for(;n<t.length&&/[A-Za-z0-9_-]/.test(t[n]);)n+=1;if(n===s)return null;e.push(t.slice(s,n))}if(r(),n>=t.length)break;if(t[n]!==".")return null;n+=1}return e.length>0?e:null}function ay(t){let e=ly(t).trim();if(e.startsWith('"'))try{let n=JSON.parse(e);return typeof n=="string"?n:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function tC(t){let e=ly(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let n=e.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>ay(s.trim()));return r.some(s=>s===null)?null:r}function ly(t){let e;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==void 0){if(e==='"'&&r==="\\"){n+=1;continue}r===e&&(e=void 0);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function nC(t){return mr(t)?t.type==="stdio"&&typeof t.command=="string"&&cy(t.command,t.args):!1}function rC(t){return!mr(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&my(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&uy(t.command[0],[t.command[1],t.command[2]])}function sC(t){return mr(t)?t.type==="stdio"&&dy(t.command,t.args):!1}function iC(t){return!mr(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&py(t.command[0])&&t.command[1]==="mcp"}function cy(t,e){return my(t)&&fy(e)||uy(t,e)}function dy(t,e){return py(t)&&fy(e)}function uy(t,e){return oC(t)&&Array.isArray(e)&&e.length===2&&aC(e[0])&&e[1]==="mcp"}function my(t){return typeof t=="string"&&$d(t)==="lmctl"}function py(t){return typeof t=="string"&&$d(t)==="lmctl0"}function oC(t){if(typeof t!="string")return!1;let e=$d(t).toLowerCase();return e==="node"||e==="node.exe"}function aC(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function $d(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function fy(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function mr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var $o,jo,GA,et,Fd,Ho=O(()=>{"use strict";oe();$o="lmctl",jo="lmctl0",GA={existsSync:jA,mkdirSync:UA,readFileSync:HA,writeFileSync:XA,renameSync:BA,unlinkSync:WA},et=GA});import{createHash as cC}from"node:crypto";import{accessSync as dC,constants as gy,existsSync as uC,readFileSync as Ud,realpathSync as Hd,statSync as mC,writeFileSync as hy}from"node:fs";import{dirname as On,resolve as _y}from"node:path";function vy(t){return uf(t,Bo!==void 0?{snapshot:Bo}:{})}function wy(t){return mf(t,Bo!==void 0?{snapshot:Bo}:{})}async function hC(t,e,n){let r=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(r.map(async i=>({member:i,result:await gC({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function _C(t,e){let n=On(e),r=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??n,a=_y(o);if(r.has(a))continue;let l=yC(a);l!==void 0&&(r.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function yC(t){try{if(fr.existsSync(t)){if(!fr.statSync(t).isDirectory())return"ENOTDIR";fr.accessSync(t,gy.W_OK);return}let e=vC(t);if(e===void 0)return;if(!fr.statSync(e).isDirectory())return"ENOTDIR";fr.accessSync(e,gy.W_OK);return}catch(e){return wC(e)??"permission check failed"}}function EC(t){let e=_y(t);try{return Hd(e)}catch{return e}}function vC(t){let e=t;for(;;){try{if(fr.existsSync(e))return e}catch{return}let n=On(e);if(n===e)return;e=n}}function wC(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function TC(t,e){let n;try{n=await re(e,l=>gt(t,l))}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let r;try{r=it(n)}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let s=al(r,On(n));e.stderr.write(`notice: checking teamfile and models ...
2130
- `);let i=Al(r.members,{agyModelsRunner:yy,codexModelsRunner:Ey});i.push(...await vy(r.members)),s.push(...await wy(r.members));let o=Ud(n,"utf8"),a=Z_(o,ey({workdir:On(n),teamfile:n,date:new Date})).unknownNames;a.length>0&&i.push(`unknown template placeholder${a.length===1?"":"s"}: ${a.map(l=>`{{${l}}}`).join(", ")}`),i.push(...Ol(r.members,On(n))),i.push(..._C(r.members,n)),i.push(...await hC(r.members,On(n),e.env));for(let l of s)e.stderr.write(`error: ${l.field}: ${l.message}
2131
- `);for(let l of r.members)Bd([l],e),l.session!==void 0&&l.session.length<_s&&i.push(`${l.alias}: sessionid is shorter than ${_s} chars; run lmctl seed to refresh it`);return{ok:!0,result:{config:r,absTeamfile:n,errors:s,warnings:i}}}function kC(t,e){let n=bC.exec(t);if(n){let s=e.get(n[1].toLowerCase());if(s!==void 0)return{alias:s,message:n[2]}}let r=SC.exec(t);if(r){let s=e.get(r[1].toLowerCase());if(s!==void 0)return{alias:s,message:r[2]}}return{alias:"",message:t}}async function Ty(t,e){let n=await TC(t,e);if(!n.ok)return{status:"error",errors:[{alias:"",message:n.message}],warnings:[],counts:{errors:1,warnings:0}};let{config:r,errors:s,warnings:i}=n.result,o=new Map(r.members.map(c=>[c.alias.toLowerCase(),c.alias])),a=s.map(c=>({alias:o.get(c.field.toLowerCase())??"",message:c.message})),l=i.map(c=>kC(c,o));for(let c of l)e.stderr.write(`warning: ${c.alias?`${c.alias}: `:""}${c.message}
2122
+ ${d}`)}`}Le.renderGrid=Y_;function Q_(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l}={}){return Y_(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l})}function LA(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l,stream:c=process.stdout}={}){let d=Q_(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l});d&&c.write(`${d}
2123
+ `)}Le.formatTable=Q_;Le.printTable=LA;function W_(t){return t instanceof Date?t.getTime():typeof t=="number"?t:typeof t=="string"&&t.trim()?Date.parse(t):NaN}function MA(t,{now:e=Date.now()}={}){let n=W_(e);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=W_(t);if(!Number.isFinite(r))return"unknown";let s=r-n,i=Math.floor(Math.abs(s)/1e3);if(i===0)return"now";for(let[o,a]of[["w",604800],["d",86400],["h",3600],["m",60],["s",1]])if(i>=a)return`${Math.floor(i/a)}${o}${s<0?" ago":""}`}Le.formatRelativeTime=MA;function PA(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=t<0?"-":"",n=Math.abs(t);if(n<1e3)return String(t);let r=Math.round(n/1e3);return r<1e3?`${e}${r}K`:`${e}${(n/1e6).toFixed(1)}M`}Le.formatCount=PA;var $d=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function DA(t,{maxUnit:e="w",style:n="spaced"}={}){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let r=$d.findIndex(([a])=>a===e);if(r===-1)throw new TypeError('maxUnit must be one of "w", "d", "h", "m", "s"');if(n!=="spaced"&&n!=="compact")throw new TypeError('style must be "spaced" or "compact"');let s=Math.floor(Math.max(0,t)/1e3);if(n==="compact"){let a=$d.slice(r).filter(([u])=>u!=="s");if(a.length===0||s<60)return"<1m";let l=[],c=s,d=!1;for(let[u,m]of a){let p=Math.floor(c/m);if(c-=p*m,p>0&&!d){let h=u==="d"||u==="w"?`${p}${u}`:`${bt(p)}${u}`;l.push({text:h,zero:!1}),d=!0}else d&&l.push({text:`${bt(p)}${u}`,zero:p===0})}for(;l.length>0&&l[l.length-1].zero;)l.pop();return l.map(u=>u.text).join("")}let i=s,o=[];for(let[a,l]of $d.slice(r))if(i>=l||a==="s"&&o.length===0){let c=Math.floor(i/l);if(i-=c*l,o.push(`${c}${a}`),o.length===2)break}return o.join(" ")}Le.formatDuration=DA;function Z_(t){return t===void 0?new Date:t instanceof Date?t:typeof t=="number"||typeof t=="string"?new Date(t):new Date(NaN)}function bt(t){return String(t).padStart(2,"0")}function ey(t){let e=Z_(t);return Number.isNaN(e.getTime())?"unknown":`${bt(e.getHours())}:${bt(e.getMinutes())}:${bt(e.getSeconds())}`}Le.formatClock=ey;function FA(t){let e=Z_(t);return Number.isNaN(e.getTime())?"unknown":`${`${e.getFullYear()}-${bt(e.getMonth()+1)}-${bt(e.getDate())}`} ${ey(e)}`}Le.formatLocalTimestamp=FA;function $A(t){return typeof t=="number"&&Number.isFinite(t)?`${Math.round(t*100)}%`:"?%"}Le.formatPercent=$A;function jA(t,{width:e=10,fill:n="#",empty:r=" ",unknown:s="?"}={}){if(typeof e!="number"||!Number.isInteger(e)||e<1)throw new TypeError("width must be a positive integer");for(let[o,a]of[["fill",n],["empty",r],["unknown",s]])if(typeof a!="string"||[...a].length!==1||/[\x00-\x1f\x7f-\x9f]/u.test(a)||jt(a)!==1)throw new TypeError(`${o} must be a single character with terminal display width 1`);if(typeof t!="number"||!Number.isFinite(t))return s.repeat(e);let i=Math.min(e,Math.max(0,Math.round(t*e)));return`${n.repeat(i)}${r.repeat(e-i)}`}Le.formatBar=jA;function UA(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=Math.floor(Math.max(0,t)/1e3),n=Math.floor(e/86400);e-=n*86400;let r=Math.floor(e/3600);e-=r*3600;let s=Math.floor(e/60);e-=s*60;let i=`${bt(r)}:${bt(s)}:${bt(e)}`;return n>0?`${n}d ${i}`:i}Le.formatTimer=UA;function HA(t){return(t==null?"":String(t)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
2124
+ `?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}Le.escapeCell=HA});function Ud(t){let e=t.env?.LMCTL_DB;return e!==void 0&&e.length>0?e:Gn(void 0,{...process.env,...t.env})}async function re(t,e){if(t.dal!==void 0)return e(t.dal);let n=zt({path:Ud(t)});try{return await e(n)}finally{n.close()}}function ty(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
2125
+ `)}function un(t,e){return t.stderr.write(`error: ${e}
2126
+ `),1}function ny(t,e,n=5e3){let r=Date.now(),s=r,i=setInterval(()=>{let o=Date.now();o-s<n||t.stderr.write(e(Math.round((o-r)/1e3)))},n);return i.unref(),{poke:()=>{s=Date.now()},stop:()=>clearInterval(i)}}function ry(t,e){let n=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${n}
2127
+ `),2}function Uo(t){if(t===void 0)return null;let e=Number.parseInt(t,10);return Number.isInteger(e)&&e>0?e:null}var BA,fr=O(()=>{"use strict";wn();BA=Su(jd(),1);pi()});import{homedir as WA}from"node:os";function sy(t,e){let n=new Set;return{text:t.replace(qA,(s,i)=>{let o=i.trim(),a=XA[o];return a===void 0?(n.add(o),s):a(e)}),unknownNames:[...n].sort()}}function iy(t){return{workdir:t.workdir,teamfile:t.teamfile,date:GA(t.date)}}function GA(t){return t.toISOString().slice(0,10)}var XA,qA,oy=O(()=>{"use strict";Nt();XA={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>$r(t.teamfile),home:()=>WA(),date:t=>t.date},qA=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});import{existsSync as JA,mkdirSync as KA,readFileSync as VA,renameSync as zA,unlinkSync as YA,writeFileSync as QA}from"node:fs";import{homedir as ly}from"node:os";import{dirname as Es,join as Me,resolve as ZA}from"node:path";function hr(t,e,n){let r=Es(ZA(n)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??r,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())St(Me(o,".mcp.json"),"mcpServers",[mn(),pn()]),a.has("opencode")&&St(Me(o,".opencode","opencode.json"),"mcp",[cy(),dy()]),a.has("kimi")&&St(Me(o,".kimi-code","mcp.json"),"mcpServers",[mn(),pn()]);for(let o of s)sC(o)}function tC(t=Hd??ly()){return Me(t,".copilot","mcp-config.json")}function nC(t,e){tt.mkdirSync(Es(t),{recursive:!0});let n=Me(Es(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{tt.writeFileSync(n,`${JSON.stringify(e,null,2)}
2128
+ `,"utf8"),tt.renameSync(n,t)}catch(r){try{tt.unlinkSync(n)}catch{}throw r}}function rC(t,e){tt.mkdirSync(Es(t),{recursive:!0});let n=Me(Es(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{tt.writeFileSync(n,e,"utf8"),tt.renameSync(n,t)}catch(r){try{tt.unlinkSync(n)}catch{}throw r}}function St(t,e,n){try{if(!tt.existsSync(t))return;let r=JSON.parse(tt.readFileSync(t,"utf8"));if(!gr(r)||!gr(r[e]))return;let s={...r[e]},i=[];for(let{name:o,shouldRemove:a}of n)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;r[e]=s,nC(t,r),U({event:"mcp_cleanup",path:t,removed:i})}catch{}}function mn(){return{name:Bo,shouldRemove:mC}}function cy(){return{name:Bo,shouldRemove:pC}}function pn(){return{name:Ho,shouldRemove:dC}}function dy(){return{name:Ho,shouldRemove:uC}}function sC(t){let e=Hd??ly();switch(t){case"copilot":St(tC(e),"mcpServers",[mn(),pn()]);return;case"claude":St(Me(e,".claude.json"),"mcpServers",[mn(),pn()]);return;case"gemini":St(Me(e,".gemini","settings.json"),"mcpServers",[mn(),pn()]);return;case"qwen":St(Me(e,".qwen","settings.json"),"mcpServers",[mn(),pn()]);return;case"agy":St(Me(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[mn(),pn()]);return;case"opencode":St(Me(e,".config","opencode","opencode.json"),"mcp",[cy(),dy()]);return;case"kimi":St(Me(Hd===void 0?process.env.KIMI_CODE_HOME??Me(e,".kimi-code"):Me(e,".kimi-code"),"mcp.json"),"mcpServers",[mn(),pn()]);return;case"codex":iC(Me(e,".codex","config.toml"));return;default:return}}function iC(t){try{if(!tt.existsSync(t))return;let e=tt.readFileSync(t,"utf8"),n=oC(e);if(n===null)return;let r=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of r){let c=uy(l);if(c===null)return;if(c!==void 0){if(ay(c,n)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=lC(l);if(d===null)return;if(d!==void 0&&ay(d,n)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;rC(t,s.join(`
2129
+ `)),U({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function ay(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function oC(t){let e=new Map,n;for(let s of t.split(/\n/)){let i=uy(s);if(i===null)return null;if(i!==void 0){n=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=aC(a,n);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Ho&&c[1]!==Bo)continue;let d=e.get(c[1])??{};if(c[2]==="command"){let u=my(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=cC(l);if(u===null)return null;d.args=u}e.set(c[1],d)}let r=new Set;for(let[s,i]of e.entries())s===Ho&&fy(i.command,i.args)&&r.add(s),s===Bo&&gy(i.command,i.args)&&r.add(s);return r}function aC(t,e){if(t.startsWith("mcp_servers"))return Wo(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=Wo(t);return n===null?null:[...e,...n]}function uy(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Wo(e[1])}function lC(t){let e=t.indexOf("=");if(e<0)return;let n=t.slice(0,e).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return Wo(n)}function Wo(t){let e=[],n=0,r=()=>{for(;n<t.length&&/\s/.test(t[n]);)n+=1};for(;n<t.length;){if(r(),n>=t.length)return null;if(t[n]==='"'){n+=1;let s="",i=!1;for(;n<t.length;){let o=t[n];if(o==="\\"){if(n+1>=t.length)return null;s+=t[n+1],n+=2;continue}if(o==='"'){n+=1,i=!0;break}s+=o,n+=1}if(!i)return null;e.push(s)}else{let s=n;for(;n<t.length&&/[A-Za-z0-9_-]/.test(t[n]);)n+=1;if(n===s)return null;e.push(t.slice(s,n))}if(r(),n>=t.length)break;if(t[n]!==".")return null;n+=1}return e.length>0?e:null}function my(t){let e=py(t).trim();if(e.startsWith('"'))try{let n=JSON.parse(e);return typeof n=="string"?n:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function cC(t){let e=py(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let n=e.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>my(s.trim()));return r.some(s=>s===null)?null:r}function py(t){let e;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==void 0){if(e==='"'&&r==="\\"){n+=1;continue}r===e&&(e=void 0);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function dC(t){return gr(t)?t.type==="stdio"&&typeof t.command=="string"&&fy(t.command,t.args):!1}function uC(t){return!gr(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&_y(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&hy(t.command[0],[t.command[1],t.command[2]])}function mC(t){return gr(t)?t.type==="stdio"&&gy(t.command,t.args):!1}function pC(t){return!gr(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&yy(t.command[0])&&t.command[1]==="mcp"}function fy(t,e){return _y(t)&&Ey(e)||hy(t,e)}function gy(t,e){return yy(t)&&Ey(e)}function hy(t,e){return fC(t)&&Array.isArray(e)&&e.length===2&&gC(e[0])&&e[1]==="mcp"}function _y(t){return typeof t=="string"&&Bd(t)==="lmctl"}function yy(t){return typeof t=="string"&&Bd(t)==="lmctl0"}function fC(t){if(typeof t!="string")return!1;let e=Bd(t).toLowerCase();return e==="node"||e==="node.exe"}function gC(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Bd(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function Ey(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function gr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ho,Bo,eC,tt,Hd,Xo=O(()=>{"use strict";oe();Ho="lmctl",Bo="lmctl0",eC={existsSync:JA,mkdirSync:KA,readFileSync:VA,writeFileSync:QA,renameSync:zA,unlinkSync:YA},tt=eC});import{createHash as _C}from"node:crypto";import{accessSync as yC,constants as vy,existsSync as EC,readFileSync as Xd,realpathSync as qd,statSync as vC,writeFileSync as wy}from"node:fs";import{dirname as Mn,resolve as Ty}from"node:path";function ky(t){return hf(t,qo!==void 0?{snapshot:qo}:{})}function Ry(t){return _f(t,qo!==void 0?{snapshot:qo}:{})}async function SC(t,e,n){let r=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(r.map(async i=>({member:i,result:await bC({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function kC(t,e){let n=Mn(e),r=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??n,a=Ty(o);if(r.has(a))continue;let l=RC(a);l!==void 0&&(r.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function RC(t){try{if(_r.existsSync(t)){if(!_r.statSync(t).isDirectory())return"ENOTDIR";_r.accessSync(t,vy.W_OK);return}let e=xC(t);if(e===void 0)return;if(!_r.statSync(e).isDirectory())return"ENOTDIR";_r.accessSync(e,vy.W_OK);return}catch(e){return AC(e)??"permission check failed"}}function IC(t){let e=Ty(t);try{return qd(e)}catch{return e}}function xC(t){let e=t;for(;;){try{if(_r.existsSync(e))return e}catch{return}let n=Mn(e);if(n===e)return;e=n}}function AC(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function CC(t,e){let n;try{n=await re(e,l=>ht(t,l))}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let r;try{r=ot(n)}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let s=ul(r,Mn(n));e.stderr.write(`notice: checking teamfile and models ...
2130
+ `);let i=Ll(r.members,{agyModelsRunner:by,codexModelsRunner:Sy});i.push(...await ky(r.members)),s.push(...await Ry(r.members));let o=Xd(n,"utf8"),a=sy(o,iy({workdir:Mn(n),teamfile:n,date:new Date})).unknownNames;a.length>0&&i.push(`unknown template placeholder${a.length===1?"":"s"}: ${a.map(l=>`{{${l}}}`).join(", ")}`),i.push(...Dl(r.members,Mn(n))),i.push(...kC(r.members,n)),i.push(...await SC(r.members,Mn(n),e.env));for(let l of s)e.stderr.write(`error: ${l.field}: ${l.message}
2131
+ `);for(let l of r.members)Gd([l],e),l.session!==void 0&&l.session.length<vs&&i.push(`${l.alias}: sessionid is shorter than ${vs} chars; run lmctl seed to refresh it`);return{ok:!0,result:{config:r,absTeamfile:n,errors:s,warnings:i}}}function LC(t,e){let n=NC.exec(t);if(n){let s=e.get(n[1].toLowerCase());if(s!==void 0)return{alias:s,message:n[2]}}let r=OC.exec(t);if(r){let s=e.get(r[1].toLowerCase());if(s!==void 0)return{alias:s,message:r[2]}}return{alias:"",message:t}}async function Iy(t,e){let n=await CC(t,e);if(!n.ok)return{status:"error",errors:[{alias:"",message:n.message}],warnings:[],counts:{errors:1,warnings:0}};let{config:r,errors:s,warnings:i}=n.result,o=new Map(r.members.map(c=>[c.alias.toLowerCase(),c.alias])),a=s.map(c=>({alias:o.get(c.field.toLowerCase())??"",message:c.message})),l=i.map(c=>LC(c,o));for(let c of l)e.stderr.write(`warning: ${c.alias?`${c.alias}: `:""}${c.message}
2132
2132
  `);return e.stderr.write(`notice: ${a.length} error${a.length===1?"":"s"}, ${l.length} warning${l.length===1?"":"s"}
2133
- `),{status:a.length>0?"error":"ok",errors:a,warnings:l,counts:{errors:a.length,warnings:l.length}}}function RC(t,e,n,r){if(e.preamble===void 0)return t.toLowerCase()!=="lead"?void 0:`${Y}
2133
+ `),{status:a.length>0?"error":"ok",errors:a,warnings:l,counts:{errors:a.length,warnings:l.length}}}function MC(t,e,n,r){if(e.preamble===void 0)return t.toLowerCase()!=="lead"?void 0:`${Y}
2134
2134
 
2135
2135
  Teamfile ${n}:
2136
2136
  ${r}
2137
2137
 
2138
- After this seed finishes, use \`lmctl prompt ${JSON.stringify(n)} <alias> "<message>"\` to send a message. Do not run or use lmctl prompt during this seed. Reply only with the ACK above and wait.`;if(typeof e.preamble=="string")return e.preamble;for(let[s,i]of Object.entries(e.preamble))if(s.toLowerCase()===t.toLowerCase())return i}async function by(t,e,n={}){let r;try{r=await re(e,g=>gt(t,g))}catch(g){return Nn(e,`${t}: ${g instanceof Error?g.message:String(g)}`)}let s;try{s=Hd(r)}catch(g){return Nn(e,`${t}: ${g instanceof Error?g.message:String(g)}`)}let i=On(r),o;try{o=it(r)}catch(g){return Nn(e,`${t}: ${g instanceof Error?g.message:String(g)}`)}let a=Ud(r,"utf8"),l=a.split(`
2139
- `),c=a,d=CC(l),u=al(o,i);if(u.length>0){Bd(o.members,e);for(let g of u)e.stderr.write(`error: ${g.field}: ${g.message}
2140
- `);return 1}try{pr(e,o,r)}catch{}Bd(o.members,e),e.stderr.write(`notice: checking teamfile and models ...
2141
- `);for(let g of Al(o.members,{agyModelsRunner:yy,codexModelsRunner:Ey}))e.stderr.write(`warning: ${g}
2142
- `);for(let g of await vy(o.members))e.stderr.write(`warning: ${g}
2143
- `);for(let g of Ol(o.members,i))e.stderr.write(`warning: ${g}
2144
- `);let m=await wy(o.members);if(m.length>0){for(let g of m)e.stderr.write(`error: ${g.field}: ${g.message}
2145
- `);return 1}let p=n.replaceSession;if(p){let g=o.members.find(E=>E.alias.toLowerCase()===p.alias.toLowerCase());if(!g||g.teamfile||g.session!==p.sessionid)return Nn(e,"Session binding changed; refresh cancelled.")}let h=0,_=o.members.filter(g=>g.teamfile!==void 0?!1:p?g.alias.toLowerCase()===p.alias.toLowerCase():g.session===void 0||g.session.length<_s);for(let g of _)if(!MC(g.provider))return e.stderr.write(`error: ${g.alias}: invalid provider "${g.provider}"
2146
- `),1;for(let g of o.members){if(g.teamfile!==void 0||p&&g.alias.toLowerCase()!==p.alias.toLowerCase())continue;if(!p&&g.session!==void 0&&g.session.length>=_s){e.stderr.write(`warning: ${g.alias}: existing sessionid preserved; skipping
2138
+ After this seed finishes, use \`lmctl prompt ${JSON.stringify(n)} <alias> "<message>"\` to send a message. Do not run or use lmctl prompt during this seed. Reply only with the ACK above and wait.`;if(typeof e.preamble=="string")return e.preamble;for(let[s,i]of Object.entries(e.preamble))if(s.toLowerCase()===t.toLowerCase())return i}async function xy(t,e,n={}){let r;try{r=await re(e,g=>ht(t,g))}catch(g){return Ln(e,`${t}: ${g instanceof Error?g.message:String(g)}`)}let s;try{s=qd(r)}catch(g){return Ln(e,`${t}: ${g instanceof Error?g.message:String(g)}`)}let i=Mn(r),o;try{o=ot(r)}catch(g){return Ln(e,`${t}: ${g instanceof Error?g.message:String(g)}`)}let a=Xd(r,"utf8"),l=a.split(`
2139
+ `),c=a,d=$C(l),u=ul(o,i);if(u.length>0){Gd(o.members,e);for(let g of u)e.stderr.write(`error: ${g.field}: ${g.message}
2140
+ `);return 1}try{hr(e,o,r)}catch{}Gd(o.members,e),e.stderr.write(`notice: checking teamfile and models ...
2141
+ `);for(let g of Ll(o.members,{agyModelsRunner:by,codexModelsRunner:Sy}))e.stderr.write(`warning: ${g}
2142
+ `);for(let g of await ky(o.members))e.stderr.write(`warning: ${g}
2143
+ `);for(let g of Dl(o.members,i))e.stderr.write(`warning: ${g}
2144
+ `);let m=await Ry(o.members);if(m.length>0){for(let g of m)e.stderr.write(`error: ${g.field}: ${g.message}
2145
+ `);return 1}let p=n.replaceSession;if(p){let g=o.members.find(E=>E.alias.toLowerCase()===p.alias.toLowerCase());if(!g||g.teamfile||g.session!==p.sessionid)return Ln(e,"Session binding changed; refresh cancelled.")}let h=0,_=o.members.filter(g=>g.teamfile!==void 0?!1:p?g.alias.toLowerCase()===p.alias.toLowerCase():g.session===void 0||g.session.length<vs);for(let g of _)if(!BC(g.provider))return e.stderr.write(`error: ${g.alias}: invalid provider "${g.provider}"
2146
+ `),1;for(let g of o.members){if(g.teamfile!==void 0||p&&g.alias.toLowerCase()!==p.alias.toLowerCase())continue;if(!p&&g.session!==void 0&&g.session.length>=vs){e.stderr.write(`warning: ${g.alias}: existing sessionid preserved; skipping
2147
2147
  `);continue}let E=g.sessiondir??i;e.stderr.write(`${g.alias}: launching ${g.provider} seed session; this can take several seconds
2148
- `);let b=Y_(e,A=>`${g.alias}: still launching (${A}s elapsed)
2148
+ `);let b=ny(e,A=>`${g.alias}: still launching (${A}s elapsed)
2149
2149
  `),C=p?l.map((A,S)=>S===d.get(g.alias.toLowerCase())?A.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,""):A).join(`
2150
2150
  `):l.join(`
2151
- `),I=RC(g.alias,n,r,C),N;try{N=xp(r,g.alias)}catch(A){return b.stop(),Nn(e,A instanceof Error?A.message:String(A))}try{let A;try{A=await fC({provider:g.provider,cwd:E,...g.model!==void 0?{model:g.model}:{},...g.effort!==void 0?{effort:g.effort}:{},...I!==void 0?{prompt:I}:{}})}finally{b.stop()}for(let x of A.warnings??[])e.stderr.write(`warning: ${g.alias}: ${x}
2152
- `);if(A.error!==void 0||A.sessionId===void 0||A.sessionId.length<_s){let x=`provider did not report a sessionid; no new session was found for ${E} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${g.alias}: seed failed${A.error!==void 0?`: ${A.error}`:`; ${x}`}
2151
+ `),I=MC(g.alias,n,r,C),N;try{N=Lp(r,g.alias)}catch(A){return b.stop(),Ln(e,A instanceof Error?A.message:String(A))}try{let A;try{A=await TC({provider:g.provider,cwd:E,...g.model!==void 0?{model:g.model}:{},...g.effort!==void 0?{effort:g.effort}:{},...I!==void 0?{prompt:I}:{}})}finally{b.stop()}for(let x of A.warnings??[])e.stderr.write(`warning: ${g.alias}: ${x}
2152
+ `);if(A.error!==void 0||A.sessionId===void 0||A.sessionId.length<vs){let x=`provider did not report a sessionid; no new session was found for ${E} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${g.alias}: seed failed${A.error!==void 0?`: ${A.error}`:`; ${x}`}
2153
2153
  `),1}let S=d.get(g.alias.toLowerCase());if(S===void 0)return e.stderr.write(`error: ${g.alias}: could not find matching _MEMBER_ line to update
2154
- `),1;let v=EC(E),T=jd(l[S],"sessionid",A.sessionId);T=jd(T,"sessiondir",v);let R=g.model;if(g.model===void 0){let x;try{x=(await gs(A.sessionId,g.provider))?.model}catch{x=void 0}x!==void 0&&x.length>0&&(T=jd(T,"model",x),R=x)}if((p||n.guardFile)&&Ud(r,"utf8")!==c)return Nn(e,`Teamfile changed during seeding; new session ${A.sessionId} was not attached. Existing bindings preserved.`);l[S]=T,h+=1,c=l.join(`
2155
- `),hy(r,c,"utf8"),n.onSeeded?.({alias:g.alias,provider:g.provider,sessionid:A.sessionId,sessiondir:v,...R!==void 0?{model:R}:{}}),e.stdout.write(`${g.alias}: seeded ${A.sessionId} provider=${g.provider} sessiondir=${v} model=${R?JSON.stringify(R):"default (not reported)"}
2154
+ `),1;let v=IC(E),T=Wd(l[S],"sessionid",A.sessionId);T=Wd(T,"sessiondir",v);let R=g.model;if(g.model===void 0){let x;try{x=(await ys(A.sessionId,g.provider))?.model}catch{x=void 0}x!==void 0&&x.length>0&&(T=Wd(T,"model",x),R=x)}if((p||n.guardFile)&&Xd(r,"utf8")!==c)return Ln(e,`Teamfile changed during seeding; new session ${A.sessionId} was not attached. Existing bindings preserved.`);l[S]=T,h+=1,c=l.join(`
2155
+ `),wy(r,c,"utf8"),n.onSeeded?.({alias:g.alias,provider:g.provider,sessionid:A.sessionId,sessiondir:v,...R!==void 0?{model:R}:{}}),e.stdout.write(`${g.alias}: seeded ${A.sessionId} provider=${g.provider} sessiondir=${v} model=${R?JSON.stringify(R):"default (not reported)"}
2156
2156
  `)}finally{N()}}let y=l.join(`
2157
- `),f=LC(y,Hd(r));f!==y&&hy(r,f,"utf8"),h===0&&e.stdout.write(`no members needed seeding
2158
- `);let w=new Date().toISOString();try{await re(e,g=>{AC(g,{teamfilePath:s,name:o.name,rawText:f,now:w})})}catch(g){return Nn(e,g instanceof Error?g.message:String(g))}return 0}function IC(t){return cC("sha256").update(t).digest("hex")}function xC(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:IC(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function AC(t,e){let n=Si(e.rawText,e.teamfilePath);dl(t,e.teamfilePath,n);let r=xC(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function CC(t){let e=new Map;for(let n=0;n<t.length;n+=1){let r=t[n];if(!/^\s*_MEMBER_\s+\S/.test(r))continue;let s=NC(r,"alias");s!==void 0&&e.set(s.toLowerCase(),n)}return e}function NC(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function jd(t,e,n){let r=`${e}=${OC(n)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(i,o)=>`${o}${r}`):`${t.trimEnd()} ${r}`}function OC(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function LC(t,e){let n=`#teamfile: ${e}`,r=t.indexOf(`
2157
+ `),f=HC(y,qd(r));f!==y&&wy(r,f,"utf8"),h===0&&e.stdout.write(`no members needed seeding
2158
+ `);let w=new Date().toISOString();try{await re(e,g=>{FC(g,{teamfilePath:s,name:o.name,rawText:f,now:w})})}catch(g){return Ln(e,g instanceof Error?g.message:String(g))}return 0}function PC(t){return _C("sha256").update(t).digest("hex")}function DC(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:PC(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function FC(t,e){let n=Ii(e.rawText,e.teamfilePath);fl(t,e.teamfilePath,n);let r=DC(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function $C(t){let e=new Map;for(let n=0;n<t.length;n+=1){let r=t[n];if(!/^\s*_MEMBER_\s+\S/.test(r))continue;let s=jC(r,"alias");s!==void 0&&e.set(s.toLowerCase(),n)}return e}function jC(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function Wd(t,e,n){let r=`${e}=${UC(n)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(i,o)=>`${o}${r}`):`${t.trimEnd()} ${r}`}function UC(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function HC(t,e){let n=`#teamfile: ${e}`,r=t.indexOf(`
2159
2159
  `),s=r>=0?t.slice(0,r):t,i=r>=0?t.slice(r+1):"";return s===n?t:s.startsWith("#teamfile:")?i.length>0?`${n}
2160
2160
  ${i}`:`${n}
2161
2161
  `:t.length>0?`${n}
2162
2162
  ${t}`:`${n}
2163
- `}function MC(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="lmplayer"||t==="qwen"||t==="agy"||t==="kimi"||t==="dsh"||t==="hermes"||t==="pi"||t==="ClaudeMock"}function Nn(t,e){return t.stderr.write(`error: ${e}
2164
- `),1}function Bd(t,e){for(let n of t)n.teamfile!==void 0&&e.stderr.write(`warning: member "${n.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
2165
- `)}var _s,pC,fC,fr,gC,yy,Ey,Bo,bC,SC,Sy=O(()=>{"use strict";Ct();pf();Ll();Yl();Do();ur();Dr();ty();Ho();pl();xe();_s=5,pC={existsSync:uC,statSync:mC,accessSync:dC},fC=async t=>{let{seed:e}=await Promise.resolve().then(()=>(cn(),L_)),n=await e(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}},fr=pC,gC=Bi;bC=/^\[([^\]]+)\]\s+(.*)$/s,SC=/^([^:\s][^:]*):\s+(.*)$/s});function ue(t){if(!Xn(t))return j("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return j("cancelled","Context is closed")}function St(t){try{let e=t?.code;return e==="ENOENT"?"missing":e==="EACCES"||e==="EPERM"||e==="EISDIR"?"read":"schema"}catch{return"read"}}function Ue(t,e){let n=r=>s=>{e?.(s,r),r==="stderr"&&s.startsWith("warning:")?t.onWarning(s):t.onProgress(s,r)};return{cwd:t.cwd,env:{...t.env,LMCTL_DB:t.dbPath},dal:t.dal,stdout:{write:n("stdout")},stderr:{write:n("stderr")}}}function Ln(t){return We.find(e=>e.name===t)?.params.find(e=>e.name==="options")?.keys?.map(e=>e.name)??[]}var jt=O(()=>{"use strict";qt();zt();Xe()});import{resolve as Wo}from"node:path";function PC(t,e){try{let n=ue(t);if(n)return n;if(typeof e!="string"||!e)return j("invalid_argument","Teamfile must be a nonempty string");let r=it(Wo(t.cwd,e));return ce({members:r.members.map(s=>({alias:s.alias,provider:s.provider,model:s.model,sessionid:s.session,sessiondir:s.sessiondir}))})}catch(n){return j(St(n),G(n))}}function DC(t,e,n){try{let r=ue(t);if(r)return r;if(typeof e!="string"||!Mr(e)||typeof n!="string"||!gl(n))return j("invalid_argument","Expected a teamfile path and valid alias");let s=ht(Wo(t.cwd,e),n,t.dal);return ce({member:{alias:s.alias,provider:s.provider,model:s.model,sessionid:s.sessionid,sessiondir:s.sessiondir},isLead:s.isLead,teamfile:s.teamfile})}catch(r){let s;try{s=r instanceof ve?r.kind:void 0}catch{}return s==="not_found"?{status:"not_found",code:"not_found",error:G(r)}:j(s??St(r),G(r))}}async function FC(t,e){try{let n=ue(t);if(n)return n;if(typeof e!="string"||!e)return j("invalid_argument","Teamfile must be a nonempty string");let r=await Ty(Wo(t.cwd,e),Ue(t)),s={errors:r.errors,warnings:r.warnings,counts:r.counts};return r.status==="ok"?ce(s):j("schema",r.errors.map(i=>i.message).join("; "),s)}catch(n){let r=G(n);return j(St(n),r,{errors:[{alias:"",message:r}],warnings:[],counts:{errors:1,warnings:0}})}}async function $C(t,e,n={}){let r=[],s=!1;try{let i=ue(t);if(i)return i;if(typeof e!="string"||!e)return j("invalid_argument","Teamfile must be a nonempty string");if(!n||typeof n!="object"||Array.isArray(n))return j("invalid_argument","Seed options must be a map");let o=We.find(p=>p.name==="seedTeam").params.find(p=>p.name==="options").keys,a=n.preamble;if(Object.keys(n).some(p=>!o.some(h=>h.name===p))||a!==void 0&&typeof a!="string"&&(typeof a!="object"||a===null||Array.isArray(a)))return j("invalid_argument","Seed options accept a string or alias map preamble only");let l=typeof a=="object"&&a!==null?{...a}:a,c=[],d=ky(c),u=Ue(t,(p,h)=>{h==="stderr"&&d(p)});s=!0;let m=await by(Wo(t.cwd,e),u,{...l===void 0?{}:{preamble:l},onSeeded:p=>{r.push({...p})}});return m===0?ce({seeded:r}):j("provider",c.join(`
2166
- `)||`Seed failed with exit code ${m}`,{seeded:r})}catch(i){return s?j(St(i),G(i),{seeded:r}):j(St(i),G(i))}}function ky(t){return e=>{let n=!1;for(let r of e.split(/\r?\n/))r.startsWith("error:")?(t.push(r.replace(/^error:\s*/,"")),n=!0):n&&r.length>0&&t.push(r)}}var Ry=O(()=>{"use strict";qt();Ct();Qt();Sy();jt();Xe()});import{readFileSync as jC}from"node:fs";import{resolve as UC}from"node:path";function HC(t,e,n={}){try{let r=ue(t);if(r)return r;if(typeof e!="string"||!e)return j("invalid_argument","Prompt path must be a nonempty string");if(!n||typeof n!="object"||Array.isArray(n))return j("invalid_argument","Prompt options must be a map");let s=n.single,i=We.find(a=>a.name==="readPrompts").params.find(a=>a.name==="options").keys;if(Object.keys(n).some(a=>!i.some(l=>l.name===a))||s!==void 0&&typeof s!="boolean")return j("invalid_argument","Prompt options accept a boolean single only");let o=jC(UC(t.cwd,e),"utf8").replace(/^\uFEFF/u,"").replace(/\r\n?/gu,`
2167
- `);return ce({prompts:s?[o.trim()].filter(a=>a.length>0):o.split(/\n\s*\n/u).map(a=>a.trim()).filter(Boolean)})}catch(r){return j(St(r),G(r))}}var Iy=O(()=>{"use strict";qt();jt();Xe()});import{join as Ce}from"node:path";function Xo(t){let e=xy.get(t);if(e)return e;let n=t.env.HOME;if(!n)return Mt(Ft());let r=t.env.XDG_DATA_HOME||Ce(n,".local/share"),s=t.env.XDG_CONFIG_HOME||Ce(n,".config");return e=Mt(Ft({museDataHome:r,miniplayerHome:t.env.MINIPLAYER_HOME||Ce(r,"miniplayer"),claudeDir:Ce(n,".claude"),codexDir:Ce(n,".codex"),codeDir:Ce(n,".code"),geminiDir:Ce(n,".gemini"),copilotDir:Ce(n,".copilot"),qwenDir:Ce(n,".qwen"),opencodeDbPaths:[Ce(r,"opencode/opencode.db"),Ce(s,"opencode/opencode.db")],agyDir:Ce(n,".gemini/antigravity-cli"),dshHome:Ce(n,".dsh"),hermesHome:t.env.HERMES_HOME??Ce(n,".hermes"),kimiHome:t.env.KIMI_CODE_HOME??Ce(n,".kimi-code"),piDir:Ce(n,".pi/agent/sessions"),lmplayerDbPaths:Xl(t.env,n)})),xy.set(t,e),e}var xy,Ay=O(()=>{"use strict";cn();Vr();xy=new WeakMap});import{resolve as BC}from"node:path";function Cy(t){let e=new Date(t.clock());return[e.getHours(),e.getMinutes(),e.getSeconds()].map(n=>String(n).padStart(2,"0")).join(":")}async function Ny(t,e,n,r,s,i){let o=null,a=!1,l="invalid_argument",c,d,u=new Set,m=(h,_="",y=null,f)=>({status:h,reply:_,error:y,sessionid:o,messageId:null,teamChatLogId:null,...f?{code:f}:{}}),p;try{let h=ue(t);if(h)return m("error","",h.error,h.code);if(!e||typeof e!="object"||Array.isArray(e))throw Error("promptAgent: member must be a map");let _={};for(let v of["provider","alias","model","effort","sessiondir","sessionid"]){let T=e[v];if(T!=null&&(typeof T!="string"||!T.trim()))throw Error(`promptAgent: ${v} must be a nonempty string when supplied`);T!=null&&(_[v]=T)}if(!_.provider)throw Error("promptAgent: provider is required");if(o=_.sessionid??null,typeof n!="string")throw Error("promptAgent: prompt must be a string");if(!r||typeof r!="object"||Array.isArray(r))throw Error("promptAgent: options must be a map");let{permissionMode:y="yolo",idleTimeoutMs:f}=r;if(Object.keys(r).some(v=>!Ln("promptAgent").includes(v)))throw Error("promptAgent: unknown option");if(y!=="yolo"&&y!=="plan")throw Error("promptAgent: permissionMode must be yolo or plan");if(f!=null&&(typeof f!="number"||!Number.isFinite(f)||f<0))throw Error("promptAgent: idleTimeoutMs must be a finite nonnegative number");p=xt(t);let w=o?JSON.stringify([_.provider,o]):void 0;if(s&&(w!==i||!p.handoffSessions.has(w)))return m("error","","Reservation target does not match member","invalid_argument");if(p.activeAgents.has(e)||w!==void 0&&(p.activeSessions.has(w)||!s&&p.handoffSessions.has(w)))return m("busy","","promptAgent: session already has an active turn in this context","busy");p.activeAgents.add(e),a=!0,w&&(p.activeSessions.add(w),u.add(w));let g=Ue(t);l="provider",g.stderr.write(`agent ${Cy(t)}: prompting ${_.alias??_.provider}
2168
- `);let E=t.clock(),b=E,C=setInterval(()=>{try{let v=t.clock();v-b>=5e3&&g.stderr.write(`agent ${Cy(t)}: still running (${Math.round((v-E)/1e3)}s elapsed)
2169
- `)}catch(v){d=v,clearInterval(C)}},5e3);C.unref(),c={poke(){try{b=t.clock()}catch(v){d=v}},stop(){clearInterval(C)}};let I=_.provider,N=BC(t.cwd,_.sessiondir??t.cwd);if(!o&&["agy","pi","dsh"].includes(I)){if(y!=="yolo")throw Error(`promptAgent: fresh ${I} sessions require yolo seed; supply sessionid for resume`);let v=await Id({provider:I,cwd:N,model:_.model,effort:_.effort,env:{...t.env},signal:t.signal});for(let R of v.warnings??[])g.stderr.write(`warning: ${R}
2170
- `);if(!v.success||!v.sessionId)throw Error(v.error??"promptAgent: provider did not identify the seeded session");o=v.sessionId;let T=JSON.stringify([I,o]);if(p.activeSessions.has(T)||!s&&p.handoffSessions.has(T))return m("busy","","promptAgent: seeded session is already active","busy");p.activeSessions.add(T),u.add(T)}let A=o??"",S=await fs({provider:I,cwd:N,sessionId:A,prompt:n,model:_.model,effort:_.effort,alias:_.alias,isLead:!1,permissionMode:y,timeoutMs:f,requireResume:!!A,env:{...t.env},signal:t.signal,onDelta:()=>c?.poke(),onProgress:()=>c?.poke()});if(d!==void 0)throw d;for(let v of S.warnings??[])g.stderr.write(`warning: ${v}
2171
- `);return A&&S.sessionId!==A?m("error","","promptAgent: provider changed session identity during resume","provider"):(S.sessionId&&(o=S.sessionId),S.status==="stalled"?m("stalled",S.text,"provider stalled"):S.status==="empty"?m("empty","","promptAgent: provider reported a normal completion but returned no content and no observed activity -- often an upstream failure (rate limit, quota, auth) the provider did not report as an error"):S.sessionId?m("ok",S.text):m("error",S.text,"promptAgent: provider did not return a session ID","provider"))}catch(h){return m("error","",G(h),l)}finally{if(c?.stop(),a&&p){p.activeAgents.delete(e);for(let h of u)p.activeSessions.delete(h)}}}async function Oy(t,e,n,r={}){return Ny(t,e,n,r,!1)}async function Ly(t,e,n,r={},s){return Ny(t,e,n,r,!0,s)}var Wd=O(()=>{"use strict";cn();zt();jt();Xe()});import{randomUUID as WC}from"node:crypto";import{resolve as XC}from"node:path";function Es(t){try{if(!t||typeof t!="object"||Array.isArray(t))return j("invalid_argument","Session target requires provider and sessionid");let e=t.provider,n=t.sessionid;return typeof e!="string"||!e.trim()||typeof n!="string"||!n.trim()?j("invalid_argument","Session target requires provider and sessionid"):{provider:e,sessionid:n}}catch(e){return j("invalid_argument",G(e))}}function ys(t){return JSON.stringify([t.provider,t.sessionid])}function Py(t,e){try{let n=ue(t);if(n)return n;let r=Es(e);if("status"in r)return r;let s=xt(t),i=ys(r);return s.activeAgents.has(e)||s.activeSessions.has(i)?{status:"busy",error:"Session has an active turn in this context",busyReason:"turn"}:s.handoffSessions.has(i)?{status:"busy",error:"Session is reserved for handoff",busyReason:"handoff"}:ce({})}catch(n){return j("invalid_argument",G(n))}}async function Dy(t,e,n,r,s={}){let i=e&&typeof e=="object"?My.get(e):void 0;return!i||i.ctx!==t||xt(t).reservations.get(i.key)!==e?{status:"error",error:"Invalid or released session reservation",code:"invalid_argument",reply:"",sessionid:null,messageId:null,teamChatLogId:null}:Ly(t,n,r,s,i.key)}function Fy(t,e){try{let n=ue(t);if(n)return n;let r=Es(e);if("status"in r)return r;let s=xt(t),i=ys(r);if(s.activeSessions.has(i)||s.handoffSessions.has(i))return{status:"busy",error:"Session is already active in this context"};s.handoffSessions.add(i);let o=Object.freeze({id:WC()});return My.set(o,{ctx:t,key:i}),s.reservations.set(i,o),ce({reservation:o})}catch(n){return j("invalid_argument",G(n))}}function $y(t,e){try{let n=ue(t);if(n)return n;let r=Es(e);return"status"in r?r:(xt(t).handoffSessions.delete(ys(r)),xt(t).reservations.delete(ys(r)),ce({}))}catch(n){return j("invalid_argument",G(n))}}async function jy(t,e={}){try{let n=ue(t);if(n)return n;if(!e||typeof e!="object"||Array.isArray(e))return j("invalid_argument","Session options must be a map");let{provider:r,workspace:s,all:i}=e;if(Object.keys(e).some(a=>!Ln("listSessions").includes(a))||r!==void 0&&(typeof r!="string"||!r.trim())||s!==void 0&&(typeof s!="string"||!s.trim())||i!==void 0&&typeof i!="boolean")return j("invalid_argument","Expected provider, workspace and all session options");let o=await xd({registry:Xo(t),provider:r,workspace:i?void 0:XC(t.cwd,s??t.cwd)});return ce({sessions:o.map(a=>({provider:a.provider,sessionid:a.sessionId,sessiondir:a.cwd,modifiedAt:a.modifiedAt.toISOString()}))})}catch(n){return j("provider",G(n))}}async function Uy(t,e){try{let n=ue(t);if(n)return n;let r=Es(e);if("status"in r)return r;let s=await Xo(t).getSession(r.sessionid,r.provider);return s?ce({messages:s.messages.map(i=>({role:i.role,content:i.content}))}):{status:"not_found",error:null}}catch(n){return j("provider",G(n))}}async function Hy(t,e,n){try{let r=ue(t);if(r)return r;let s=Es(e);if("status"in s)return s;if(!n||typeof n!="object"||Array.isArray(n)||n.force!==!0||Object.keys(n).some(a=>!Ln("deleteSession").includes(a)))return j("invalid_argument","force: true is required because cross-process turns cannot be detected");let i=xt(t),o=ys(s);if(i.activeAgents.has(e)||i.activeSessions.has(o)||i.handoffSessions.has(o))return{status:"busy",error:"Session has an active turn in this context"};i.activeSessions.add(o);try{return{status:await Ad(s.provider,s.sessionid,Xo(t))?"deleted":"not_found",error:null}}finally{i.activeSessions.delete(o)}}catch(r){return j("provider",G(r))}}var My,By=O(()=>{"use strict";Ay();Wd();cn();zt();jt();Xe();My=new WeakMap});function Pe(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);return Number.isFinite(e)?Math.round(Math.min(1,Math.max(0,e))*1e6)/1e6:null}function kt(t,e){if(t==null||typeof t=="boolean")return null;let n=Number(t);return Pe(e==="percent"?n/100:n)}function Wy(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);if(!Number.isFinite(e))return null;try{return new Date(Math.trunc(e)*1e3).toISOString().replace(".000Z","Z")}catch{return null}}function Xy(t){if(typeof t!="string"||t.trim()==="")return null;let e=Date.parse(t);return Number.isFinite(e)?Math.floor(e/1e3):null}function qy(t){let e=Number(t);return Number.isFinite(e)?e===300||e>=240&&e<=360?"five_hour":e===10080||e>=9e3&&e<=11500?"weekly":e===43200||e===44640||e>=38e3&&e<=46e3?"monthly":"unknown":"unknown"}function Gy(t){let e=String(t??"").trim().toLowerCase().replace(/-/g,"_").split("_").filter(Boolean);for(let n of[e[0],e.at(-1)]){if(n?.startsWith("5h")||n?.startsWith("five")||n==="session")return"five_hour";if(n?.startsWith("7d")||n?.startsWith("seven")||n?.startsWith("week"))return"weekly";if(n?.startsWith("30d")||n?.startsWith("month"))return"monthly"}return"unknown"}function gr(t,e=[]){let n=t==null?"":String(t);for(let r of e)typeof r=="string"&&r.length>=4&&(n=n.replaceAll(r,"***REDACTED***"));for(let r of GC)n=n.replace(r,"***REDACTED***");return n}function Ve(t){let e=Pe(t.used_fraction),n=Pe(t.remaining_fraction),r=t.resets_at==null?Xy(t.resets_at_iso):Number(t.resets_at),s=t.resets_at_iso==null?Wy(r):Wy(Xy(t.resets_at_iso)),i={bucket_id:t.bucket_id,...t.group_name!=null?{group_name:t.group_name}:{},window_type:t.window_type??"unknown",used_fraction:e??(n===null?null:Pe(1-n)),remaining_fraction:n??(e===null?null:Pe(1-e)),resets_at:r==null||!Number.isFinite(r)?null:Math.trunc(r),resets_at_iso:s,is_exhausted:t.is_exhausted??(n!==null?n<=0:e!==null?e>=1:null)};for(let o of["raw_value","raw_scale","limit_name","metered_feature","allowed","limit_reached"])t[o]!=null&&(i[o]=t[o]);return i}function ke(t,e,n={}){let r={$schema:qC,provider:t,status:e,source:n.source??null,read_at:n.read_at??Math.floor(Date.now()/1e3),account_id:n.account_id??null,plan_type:n.plan_type??null,ordinary_usage_allowed:n.ordinary_usage_allowed??null,buckets:n.buckets??[]};for(let s of["credits","spend_control","characteristics","reason","detail","retry_after_seconds"])n[s]!=null&&(r[s]=n[s]);return r}function ze(t,e,n,r,s,i=[],o){return ke(t,e,{source:s??null,reason:n,...r==null?{}:{detail:gr(r,i)},...o==null?{}:{retry_after_seconds:o}})}function Jy(t){let e=t.get("retry-after");if(e===null)return null;let n=Number.parseFloat(e);return Number.isFinite(n)&&n>=0?Math.trunc(n):null}function Ye(t,e,n,r=[],s){if(!t.debug&&!t.onRawResponse)return;let i=gr(n,[...r].filter(o=>typeof o=="string")).replace(/("(?:access[_-]?token|refresh[_-]?token|authorization|api[_-]?key|password)"\s*:\s*")[^"\r\n]*(")/gi,"$1***REDACTED***$2");t.onRawResponse?.({source:e,...s===void 0?{}:{http_status:s},text:i}),t.debug?.(`[debug] ${e}${s===void 0?"":` HTTP ${s}`} raw response:
2172
- ${i}`)}function hr(t,e,n=[]){let r;try{let i=JSON.parse(e);r=typeof i?.error=="string"?i.error:i?.error?.message??i?.message??i?.detail}catch{/^\s*[<{[]/.test(e)||(r=e.trim())}if(typeof r!="string"||!r.trim())return t;let s=gr(r,n);return{...t,detail:s,provider_message:s}}var qC,GC,Ut=O(()=>{"use strict";qC="https://lmctl.com/schemas/lmratelimit-v1.json";GC=[/sk-ant-[A-Za-z0-9_-]{4,}/g,/sk-[A-Za-z0-9_-]{16,}/g,/\bbearer\s+[A-Za-z0-9._-]{8,}/gi,/\boat01[-_][A-Za-z0-9_-]{8,}/g,/\bcsrf[-_][A-Za-z0-9_-]{4,}/gi,/\b(?:csrf[-_]?token|x-codeium-csrf-token)\s*[:=]\s*['"]?[A-Za-z0-9._-]{4,}/gi]});import{spawnSync as JC}from"node:child_process";import{readdirSync as KC,readFileSync as VC}from"node:fs";import{join as zC}from"node:path";function rN(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("ANTIGRAVITY")))}function sN(t){let e=t.trim().toLowerCase(),n={"gemini models":"gemini","claude and gpt models":"3p",gemini:"gemini","3p models":"3p","3p":"3p"};return n[e]?n[e]:e.replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function iN(t){let e=t.toLowerCase();return e.includes("weekly")?"weekly":e.includes("five hour")||e.includes("5-hour")||e.includes("5 hour")?"five_hour":e.includes("monthly")||e.includes("month")?"monthly":null}function oN(t){let e={weekly:"weekly",five_hour:"5h",monthly:"monthly"},n=[];for(let r of t.split(/\r?\n/)){let s=r.trim().split(" ").map(l=>l.trim());if(s.length<3||!s[0]||!s[1])continue;let i=iN(s[1]);if(!i)continue;let o=Number(s[2].replace(/%$/,"").trim());if(!Number.isFinite(o))continue;let a=Pe(o/100);n.push(Ve({bucket_id:`${sN(s[0])}-${e[i]}`,group_name:s[0],window_type:i,used_fraction:a===null?null:Pe(1-a),remaining_fraction:a,resets_at_iso:s[3]||null,raw_value:o,raw_scale:"remaining_percent"}))}return n.sort((r,s)=>String(r.group_name??"").localeCompare(String(s.group_name??""))||String(r.bucket_id??"").localeCompare(String(s.bucket_id??"")))}function vs(t,e,n){return ze("agy","provider_unavailable",t,e,"agy_cli_print")}function aN(t,e,n={}){try{let r=tN(Math.max(t,60)*1e3,rN(e));if(Ye(n,"agy_cli_print",r.stdout??"",[e.ANTIGRAVITY_CSRF_TOKEN]),r.error?.code==="ENOENT")return vs("agy_not_found","the agy CLI is not on PATH",t);if(r.error?.code==="ETIMEDOUT")return vs("cli_timeout","agy -p /usage did not finish in time",t);if(r.error)return vs("cli_failed",r.error.message,t);let s=oN(r.stdout??"");return s.length===0?vs("cli_unparseable",`exit ${r.status??1}; no buckets parsed from CLI output`,t):ke("agy","ok",{source:"agy_cli_print",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:s})}catch(r){return vs("cli_failed",r instanceof Error?r.message:String(r),t)}}function lN(t){let e=[],n=new Set,r=(s,i,o)=>{!s||!i||n.has(`${s}\0${i}`)||(n.add(`${s}\0${i}`),e.push([s,i,o]))};r(t[Ky],t[Vy],-1);try{for(let s of KC("/proc"))if(/^\d+$/.test(s))try{let i={};for(let o of VC(zC("/proc",s,"environ")).toString("utf8").split("\0")){let a=o.indexOf("=");a>0&&(i[o.slice(0,a)]=o.slice(a+1))}r(i[Ky],i[Vy],Number(s))}catch{}}catch{}return e}function cN(t){if(typeof t!="object"||t===null)return null;let e=t.response;if(typeof e!="object"||e===null)return null;let n=e.groups;if(!Array.isArray(n))return null;let r=[];for(let s of n){if(typeof s!="object"||s===null)continue;let i=s,o=typeof i.displayName=="string"?i.displayName:null;if(Array.isArray(i.buckets))for(let a of i.buckets){if(typeof a!="object"||a===null)continue;let l=a,c=kt(l.remainingFraction,"fraction");r.push(Ve({bucket_id:l.bucketId??l.displayName??"unknown",group_name:o,window_type:Gy(l.window),used_fraction:c===null?null:Pe(1-c),remaining_fraction:c,resets_at_iso:l.resetTime??null,raw_value:l.remainingFraction??null,raw_scale:"remaining_fraction"}))}}return r.length===0?null:(r.sort((s,i)=>String(s.group_name??"").localeCompare(String(i.group_name??""))||String(s.bucket_id??"").localeCompare(String(i.bucket_id??""))),ke("agy","ok",{source:"agy_connect_rpc",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:r}))}async function dN(t,e,n={}){let r=lN(e);if(r.length===0)return ze("agy","provider_unavailable","no_active_session","no live agy process exposed ANTIGRAVITY_LS_ADDRESS/ANTIGRAVITY_CSRF_TOKEN","agy_connect_rpc");let s=[];for(let[i,o,a]of r)try{let l=await nN(`http://${i}${YC}`,{"Content-Type":"application/json","Connect-Protocol-Version":"1","x-codeium-csrf-token":o},t*1e3);if(Ye(n,"agy_connect_rpc",l.body,[o],l.status),l.status===200){let c;try{c=JSON.parse(l.body)}catch{s.push(`pid=${a}: unparseable response`);continue}let d=cN(c);if(d)return d;s.push(`pid=${a}: response had no quota groups`)}else l.status===401||l.status===403?s.push(`pid=${a}: HTTP ${l.status} unauthorized`):s.push(`pid=${a}: HTTP ${l.status}`)}catch(l){s.push(`pid=${a}: ${l instanceof Error?l.message:String(l)}`)}return ze("agy","provider_unavailable","no_active_session",`all candidate language servers failed: ${s.slice(0,5).join("; ")}`,"agy_connect_rpc",r.map(([,i])=>i))}async function zy(t){let e=aN(t.timeoutSeconds,t.env,t);if(e.status==="ok")return e;let n=await dN(t.timeoutSeconds,t.env,t);return n.status==="ok"?n:ze("agy","provider_unavailable","cli_and_language_server_unavailable",`cli: ${String(e.reason??e.status)} (${String(e.detail??"no detail")}); connect: ${String(n.reason??n.status)} (${String(n.detail??"no detail")})`,"agy_cli_print")}var Ky,Vy,YC,QC,ZC,eN,tN,nN,Yy=O(()=>{"use strict";Ut();Ut();Ky="ANTIGRAVITY_LS_ADDRESS",Vy="ANTIGRAVITY_CSRF_TOKEN",YC="/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary",QC=["-p","/usage"],ZC=(t,e)=>{let n=JC("agy",QC,{encoding:"utf8",timeout:t,maxBuffer:16777216,env:e,stdio:["ignore","pipe","ignore"]});return{status:n.status,stdout:typeof n.stdout=="string"?n.stdout:"",error:n.error}},eN=async(t,e,n)=>{let r=await fetch(t,{method:"POST",headers:e,body:"{}",signal:AbortSignal.timeout(n)});return{status:r.status,body:await r.text()}},tN=ZC,nN=eN});import{randomUUID as eE}from"node:crypto";import{mkdirSync as uN,readFileSync as Xd,realpathSync as mN,renameSync as pN,rmSync as qd,statSync as Qy,writeFileSync as tE}from"node:fs";import{homedir as fN}from"node:os";import{join as Gd}from"node:path";import{setTimeout as gN}from"node:timers/promises";function Vd(t){return Gd(t.CLAUDE_CONFIG_DIR??Gd(t.HOME??fN(),".claude"),".credentials.json")}function Jd(t){let e=JSON.parse(Xd(t,"utf8"));if(!e||typeof e!="object"||Array.isArray(e))throw new Error("invalid credential document");return e}function Kd(t){let e=t.claudeAiOauth;return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function nE(t){if(t.CLAUDE_CODE_OAUTH_TOKEN)return{oauth:{accessToken:t.CLAUDE_CODE_OAUTH_TOKEN}};let e=Vd(t);try{let n=Kd(Jd(e));return typeof n?.accessToken=="string"&&n.accessToken?{oauth:n,path:mN(e)}:{error:"not_claude_ai_subscriber"}}catch(n){return n.code==="ENOENT"?{error:t.ANTHROPIC_API_KEY?"not_claude_ai_subscriber":"no_credentials_found"}:{error:"credentials_unreadable"}}}function qo(t){return typeof t.expiresAt=="number"&&Date.now()+yN>=t.expiresAt}function Zy(t,e){return t.accessToken===e.accessToken&&t.refreshToken===e.refreshToken}async function EN(t,e){let n=`${t}.lmctl-refresh.lock`,r=Gd(n,"owner.json"),s=eE();for(;;){e.throwIfAborted();try{uN(n,{mode:448});try{tE(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(i){throw qd(n,{recursive:!0,force:!0}),i}return()=>{try{JSON.parse(Xd(r,"utf8")).token===s&&qd(n,{recursive:!0,force:!0})}catch{}}}catch(i){if(i.code!=="EEXIST")throw i;let o=!1;try{let a=JSON.parse(Xd(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){o=l.code==="ESRCH"}else o=Date.now()-Qy(n).mtimeMs>6e4}catch{try{o=Date.now()-Qy(n).mtimeMs>6e4}catch{continue}}if(o)throw new Error("refresh_lock_stale");await gN(50,void 0,{signal:e})}}}async function rE(t,e){if(!t.path||typeof t.oauth?.refreshToken!="string"||!t.oauth.refreshToken)throw new Error("no_refresh_token");let n=await EN(t.path,e);try{let r=Kd(Jd(t.path));if(!r||typeof r.accessToken!="string")throw new Error("credentials_changed");if(!Zy(r,t.oauth)&&!qo(r))return r;if(typeof r.refreshToken!="string"||!r.refreshToken)throw new Error("no_refresh_token");let s=await fetch(_N,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:r.refreshToken,client_id:hN})});if(!s.ok)throw new Error(`refresh_http_${s.status}`);let i=await s.json();if(!i||typeof i.access_token!="string"||!/^\S+$/.test(i.access_token)||typeof i.expires_in!="number"||!Number.isFinite(i.expires_in)||i.expires_in<=0||i.refresh_token!==void 0&&(typeof i.refresh_token!="string"||!/^\S+$/.test(i.refresh_token)))throw new Error("invalid_refresh_response");let o=Math.floor(Date.now()+i.expires_in*1e3);if(!Number.isSafeInteger(o)||o<=Date.now())throw new Error("invalid_refresh_response");let a=Jd(t.path),l=Kd(a);if(!l||!Zy(r,l)){if(l&&typeof l.accessToken=="string"&&!qo(l))return l;throw new Error("credentials_changed")}let c={...l,accessToken:i.access_token,refreshToken:i.refresh_token??r.refreshToken,expiresAt:o,...typeof i.scope=="string"?{scopes:i.scope.split(/\s+/).filter(Boolean)}:{}},d=`${t.path}.${eE()}.tmp`;try{tE(d,JSON.stringify({...a,claudeAiOauth:c}),{flag:"wx",mode:384}),pN(d,t.path)}finally{qd(d,{force:!0})}return c}finally{n()}}var hN,_N,yN,sE=O(()=>{"use strict";hN="9d1c250a-e61b-44d9-88ed-5944d1962f5e",_N="https://console.anthropic.com/v1/oauth/token",yN=3e5});import{spawnSync as aE}from"node:child_process";function TN(t){let e=String(t??"").toLowerCase();return e.includes("session")||e.includes("five")||e.includes("5h")?"five_hour":e.includes("week")||e.includes("seven")||e.includes("7d")?"weekly":e.includes("month")||e.includes("30d")?"monthly":"unknown"}function lE(t){return Object.fromEntries(Object.entries(t).filter(([e])=>e!=="CLAUDECODE"))}function bN(t){try{let e=aE("claude",["--version"],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],env:lE(t)}),n=typeof e.stdout=="string"?e.stdout.trim().split(/\s+/)[0]:"";if(n)return`claude-code/${n}`}catch{}return"claude-code/unknown"}function ct(t,e,n,r="claude_oauth_api",s){return ze("claude",t,e,n,r,void 0,s)}function SN(t){let e=t.get("retry-after");if(!e)return;let n=Number.parseInt(e,10);return Number.isFinite(n)?n:void 0}function kN(t){if(!t)return;let e=/^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)?(?:\s*\(([^)]+)\))?$/i.exec(t.trim());if(!e)return;let n=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"].indexOf(e[1].slice(0,3).toLowerCase());if(n<0)return;let r=Number(e[3]),s=Number(e[4]??0);(e[5]??"").toLowerCase()==="pm"&&r!==12&&(r+=12),(e[5]??"").toLowerCase()==="am"&&r===12&&(r=0);let i=new Date(Date.UTC(new Date().getUTCFullYear(),n,Number(e[2]),r,s));return Number.isFinite(i.getTime())?Math.floor(i.getTime()/1e3):void 0}function IN(t){let e=[];for(let n of t.split(/\r?\n/)){let r=RN.exec(n.trim());if(!r)continue;let s=r[1].trim(),o=s.toLowerCase()==="session",a=/\(([^)]+)\)/.exec(s)?.[1]?.trim()??s,l=o?"session":a.toLowerCase()==="all models"?"week-all-models":`week-scoped-${a}`,c=o?"five_hour":"weekly";e.push(Ve({bucket_id:l,group_name:o?"session":"weekly",window_type:c,used_fraction:kt(Number(r[2]),"percent"),raw_value:Number(r[2]),raw_scale:"used_percent",resets_at:kN(r[3])}))}return e.sort((n,r)=>String(n.window_type).localeCompare(String(r.window_type))||String(n.bucket_id).localeCompare(String(r.bucket_id)))}function xN(t){let e={},n;for(let r of t.split(/\r?\n/)){let s=/^Last\s+(\S+)\s*[·-]\s*(\d+)\s+requests?\s*[·-]\s*(\d+)\s+sessions?\s*$/.exec(r.trim());if(s){n={requests:Number(s[2]),sessions:Number(s[3])},e[`window_${s[1].toLowerCase()}`]=n;continue}let i=/^\s+(\d+)%\s+of your usage\s+(.+?)\s*$/.exec(r);if(!i||!n)continue;let o=i[2].toLowerCase(),a=o.includes(">150k context")?"pct_high_context":o.includes("active for 8+ hours")?"pct_long_sessions":o.includes("subagent-heavy")?"pct_subagent_heavy":o.includes("ran in parallel")?"pct_parallel_sessions":void 0;a&&(n[a]=Number(i[1]))}return e}function AN(t,e){let n=t&&typeof t=="object"?t:void 0,r=e&&typeof e=="object"?e:void 0,s=!!(n?.limit||n?.used||n?.percent!==void 0);if(!s&&(!r||r.is_enabled===!1))return;let i=s&&n?.limit&&typeof n.limit=="object"?n.limit:{},o=s&&n?.used&&typeof n.used=="object"?n.used:{},a=f=>{let w=typeof f=="number"?f:typeof f=="string"&&f.trim()!==""?Number(f):NaN;return Number.isSafeInteger(w)&&w>=0&&w<=9?w:void 0},l=f=>{let w=typeof f=="number"?f:typeof f=="string"&&f.trim()!==""?Number(f):NaN;return Number.isFinite(w)?w:void 0},c=a(i.exponent??r?.decimal_places??2),d=a(o.exponent??r?.decimal_places??2),u=s?i.amount_minor:r?.monthly_limit,m=s?o.amount_minor:r?.used_credits,p=(f,w,g)=>w===void 0||g!==void 0&&g!=="USD"||l(f)===void 0?void 0:(l(f)/10**w).toFixed(2),h=kt(s?n?.percent:r?.utilization,"percent"),_=s?n?.spend_limit_reached??r?.spend_limit_reached:r?.spend_limit_reached,y={limit_usd:p(u,c,i.currency??r?.currency),used_usd:p(m,d,o.currency??r?.currency),remaining_fraction:h==null?void 0:Math.max(0,1-h),resets_at_iso:s?n?.resets_at:void 0,...typeof _=="boolean"?{reached:_}:{}};return Object.values(y).every(f=>f==null)?void 0:y}async function oE(t,e,n,r={}){try{let s=aE("claude",["-p","/usage"],{encoding:"utf8",timeout:Math.max(n,60)*1e3,input:"",env:lE(e),maxBuffer:16777216}),i=typeof s.stdout=="string"?s.stdout:"";Ye(r,"claude_cli_print",i,[t.accessToken,t.refreshToken]);let o=IN(i);if(!o.length)return;let a=xN(i);return ke("claude",Re.ok,{source:"claude_cli_print",account_id:null,plan_type:t.subscriptionType??t.rateLimitTier??null,ordinary_usage_allowed:null,buckets:o,...Object.keys(a).length?{characteristics:a}:{}})}catch{return}}async function cE({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s=nE(e);if(s.error==="not_claude_ai_subscriber")return ct(Re.notApplicable,s.error,"no OAuth subscription credentials; API-key accounts have no subscription quota endpoint");if(s.error==="no_credentials_found")return ct(Re.unavailable,"credentials_missing",`credentials file not found: ${Vd(e)}`);if(s.error)return ct(Re.expired,"oauth_token_expired_or_invalid",s.error);let i=s.oauth,o=Array.isArray(i.scopes)?i.scopes:[];if(o.length&&!o.includes(iE))return ct(Re.notApplicable,"not_claude_ai_subscriber",`credential lacks the ${iE} scope required by the usage endpoint`);let a=new AbortController,l=setTimeout(()=>a.abort(),t*1e3),c,d;try{let f=!1,w=async()=>{try{i=await rE({...s,oauth:i},a.signal),f=!0}catch(E){let b=E instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(E.message)?E.message:"refresh_failed";if(b==="refresh_http_429")return ct(Re.throttled,"rate_limited","Claude OAuth refresh was rate limited; try again later");if(b==="refresh_lock_stale")return ct(Re.expired,"oauth_refresh_locked","a previous Claude credential refresh exited without releasing its lock; remove the stale .credentials.json.lmctl-refresh.lock directory before retrying");let C=b==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(b);return ct(C?Re.expired:Re.unavailable,C?"oauth_token_expired_or_invalid":"oauth_refresh_failed",`Claude OAuth refresh failed (${b})${C?"; renew Claude login":"; try again later"}`)}};if(qo(i)){let E=await w();if(E)return E}let g=()=>fetch(`${vN}/api/oauth/usage`,{headers:{Authorization:`Bearer ${i.accessToken}`,"anthropic-beta":wN,"Content-Type":"application/json","User-Agent":bN(e)},signal:a.signal});if(c=await g(),d=await c.text(),Ye({debug:n,onRawResponse:r},"claude_oauth_api",d,[i.accessToken,i.refreshToken],c.status),c.status===401&&!f&&s.path&&i.refreshToken){let E=await w();if(E)return E;c=await g(),d=await c.text(),Ye({debug:n,onRawResponse:r},"claude_oauth_api",d,[i.accessToken,i.refreshToken],c.status)}}catch(f){let w=await oE(i,e,t,{debug:n,onRawResponse:r});return w||ct(Re.unavailable,"request_failed",`${f instanceof Error?f.name:"request failed"} (CLI fallback also unavailable)`)}finally{clearTimeout(l)}let u=(...f)=>hr(ct(...f),d,[String(i.accessToken??""),String(i.refreshToken??"")]);if(c.status===401)return u(Re.expired,"oauth_token_expired_or_invalid","HTTP 401 from usage endpoint");if(c.status===403)return u(Re.notApplicable,"not_claude_ai_subscriber","HTTP 403 from usage endpoint (account is not usage-eligible)");if(c.status===429){let f=SN(c.headers),w=await oE(i,e,t,{debug:n,onRawResponse:r});return w||u(Re.throttled,"rate_limited",`usage endpoint rate limited${f==null?"":`; retry after ${f}s`}`,"claude_oauth_api",f)}if(c.status!==200)return u(Re.unavailable,`http_${c.status}`,"usage endpoint returned an unexpected status");let m;try{m=JSON.parse(d)}catch{return ct(Re.unavailable,"malformed_response","SyntaxError: malformed JSON")}if(!m||typeof m!="object"||Array.isArray(m))return ct(Re.unavailable,"malformed_response","response was not an object");let p=m,h=Array.isArray(p.limits)?p.limits:[],_=h.length?h.flatMap(f=>{if(!f||typeof f!="object")return[];let w=f.kind,g=TN(w==="session"?"session":w),E=f.scope?.model?.display_name,b=w==="session"?"session":w==="weekly_all"?"week-all-models":`week-scoped-${E||w}`;return[Ve({bucket_id:b,group_name:w==="session"?"session":"weekly",window_type:g,used_fraction:kt(f.percent,"percent"),resets_at_iso:f.resets_at,raw_value:f.percent,raw_scale:"used_percent"})]}):["five_hour","seven_day"].flatMap(f=>{let w=p[f];return!w||typeof w!="object"?[]:[Ve({bucket_id:f==="five_hour"?"session":"week-all-models",group_name:f==="five_hour"?"session":"weekly",window_type:f==="five_hour"?"five_hour":"weekly",used_fraction:kt(w.utilization,"percent"),resets_at_iso:w.resets_at,raw_value:w.utilization,raw_scale:"used_percent"})]}),y=AN(p.spend,p.extra_usage);return ke("claude",Re.ok,{source:"claude_oauth_api",account_id:null,plan_type:i.subscriptionType??i.rateLimitTier??null,ordinary_usage_allowed:null,buckets:_.sort((f,w)=>String(f.window_type).localeCompare(String(w.window_type))||String(f.bucket_id).localeCompare(String(w.bucket_id))),...y?{spend_control:y}:{}})}var vN,wN,iE,Re,RN,dE=O(()=>{"use strict";Ut();sE();Ut();vN="https://api.anthropic.com",wN="oauth-2025-04-20",iE="user:profile";Re={ok:"ok",unavailable:"provider_unavailable",expired:"auth_expired",notApplicable:"not_applicable",throttled:"reader_throttled"};RN=/^Current\s+(.+?):\s*(\d+(?:\.\d+)?)\s*%\s*used(?:\s*[·-]\s*resets\s*(.+?))?$/});import{randomUUID as pE}from"node:crypto";import{mkdirSync as CN,readFileSync as zd,realpathSync as NN,renameSync as ON,rmSync as Yd,statSync as uE,writeFileSync as fE}from"node:fs";import{homedir as LN}from"node:os";import{join as Qd}from"node:path";import{setTimeout as MN}from"node:timers/promises";function ws(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function eu(t){if(t.CODEX_AUTH_PATH)return t.CODEX_AUTH_PATH;let e=t.CODEX_HOME||Qd(t.HOME||LN(),".codex");return Qd(e,"auth.json")}function Zd(t){let e=ws(JSON.parse(zd(t,"utf8")));if(!e)throw new Error("invalid credential document");return e}function gE(t){if(t.CODEX_ACCESS_TOKEN)return{tokens:{access_token:t.CODEX_ACCESS_TOKEN,account_id:t.CODEX_ACCOUNT_ID}};let e=eu(t);try{let n=ws(Zd(e).tokens);return typeof n?.access_token=="string"&&n.access_token?{tokens:n,path:NN(e)}:{error:"credentials_missing"}}catch(n){return{error:n.code==="ENOENT"?"credentials_missing":"credentials_unreadable"}}}function mE(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.id_token===e.id_token&&t.account_id===e.account_id}async function FN(t,e){let n=`${t}.lmctl-refresh.lock`,r=Qd(n,"owner.json"),s=pE();for(;;){e.throwIfAborted();try{CN(n,{mode:448});try{fE(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(i){throw Yd(n,{recursive:!0,force:!0}),i}return()=>{try{JSON.parse(zd(r,"utf8")).token===s&&Yd(n,{recursive:!0,force:!0})}catch{}}}catch(i){if(i.code!=="EEXIST")throw i;let o=!1;try{let a=JSON.parse(zd(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){o=l.code==="ESRCH"}else o=Date.now()-uE(n).mtimeMs>6e4}catch{try{o=Date.now()-uE(n).mtimeMs>6e4}catch{continue}}if(o)throw new Error("refresh_lock_stale");await MN(50,void 0,{signal:e})}}}async function hE(t,e){if(!t.path||typeof t.tokens?.refresh_token!="string"||!t.tokens.refresh_token)throw new Error("no_refresh_token");let n=await FN(t.path,e);try{let r=Zd(t.path),s=ws(r.tokens);if(!s||typeof s.access_token!="string")throw new Error("credentials_changed");if(!mE(s,t.tokens)&&typeof s.access_token=="string")return s;if(typeof s.refresh_token!="string"||!s.refresh_token)throw new Error("no_refresh_token");let i=await fetch(PN,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:s.refresh_token,client_id:DN})});if(!i.ok)throw new Error(`refresh_http_${i.status}`);let o=ws(await i.json());if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||o.refresh_token!==void 0&&(typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token))||o.id_token!==void 0&&(typeof o.id_token!="string"||!/^\S+$/.test(o.id_token)))throw new Error("invalid_refresh_response");let a=Zd(t.path),l=ws(a.tokens);if(!l||!mE(s,l)){if(l&&typeof l.access_token=="string")return l;throw new Error("credentials_changed")}let c={...l,access_token:o.access_token,...o.refresh_token===void 0?{}:{refresh_token:o.refresh_token},...o.id_token===void 0?{}:{id_token:o.id_token}},d={...a,tokens:c,last_refresh:new Date().toISOString()},u=`${t.path}.${pE()}.tmp`;try{fE(u,JSON.stringify(d),{flag:"wx",mode:384}),ON(u,t.path)}finally{Yd(u,{force:!0})}return c}finally{n()}}var PN,DN,_E=O(()=>{"use strict";PN="https://auth.openai.com/oauth/token",DN="app_EMoamEEZ73f0CkXaXp7hrann"});function Rt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function yE(t){let e=typeof t=="number"?t:Number(t);if(!Number.isFinite(e)||e<=0)return"unknown";let n=e/60;return n>=240&&n<=360?"five_hour":n>=9e3&&n<=11500?"weekly":n>=38e3&&n<=46e3?"monthly":"unknown"}function EE(t){return t==="five_hour"?"5h":t==="weekly"?"weekly":t==="monthly"?"monthly":"window"}function UN(t){if(Rt(t))return{has_credits:t.has_credits,unlimited:t.unlimited,balance:t.balance}}function HN(t){let e=[],n=Rt(t.rate_limit)?t.rate_limit:{},r=typeof n.allowed=="boolean"?n.allowed:void 0,s=typeof n.limit_reached=="boolean"?n.limit_reached:void 0;for(let o of["primary_window","secondary_window"]){let a=Rt(n[o])?n[o]:void 0;if(!a)continue;let l=yE(a.limit_window_seconds);e.push(Ve({bucket_id:`codex-${EE(l)}`,group_name:"codex",window_type:l,used_fraction:kt(a.used_percent,"percent"),resets_at:a.reset_at,raw_value:a.used_percent,raw_scale:"used_percent",...r===void 0?{}:{allowed:r},...s===void 0?{}:{limit_reached:s}}))}let i=Array.isArray(t.additional_rate_limits)?t.additional_rate_limits:[];for(let o of i){if(!Rt(o))continue;let a=Rt(o.rate_limit)?o.rate_limit:{},l=typeof o.limit_name=="string"?o.limit_name:void 0,c=typeof o.metered_feature=="string"?o.metered_feature:void 0,d=c||l||"additional",u=typeof a.allowed=="boolean"?a.allowed:void 0,m=typeof a.limit_reached=="boolean"?a.limit_reached:void 0;for(let p of["primary_window","secondary_window"]){let h=Rt(a[p])?a[p]:void 0;if(!h)continue;let _=yE(h.limit_window_seconds);e.push(Ve({bucket_id:`${d}-${EE(_)}`,group_name:l||d,window_type:_,used_fraction:kt(h.used_percent,"percent"),resets_at:h.reset_at,raw_value:h.used_percent,raw_scale:"used_percent",...l===void 0?{}:{limit_name:l},...c===void 0?{}:{metered_feature:c},...u===void 0?{}:{allowed:u},...m===void 0?{}:{limit_reached:m}}))}}return e.sort((o,a)=>String(o.group_name??"").localeCompare(String(a.group_name??""))||String(o.bucket_id).localeCompare(String(a.bucket_id)))}function BN(t){let e=Rt(t.rate_limit)?t.rate_limit:{},n=typeof e.allowed=="boolean"?e.allowed:void 0,r=Rt(t.spend_control)?t.spend_control:void 0,s=Rt(t.credits)?t.credits:void 0;return ke("codex","ok",{source:"codex_http",account_id:t.account_id,plan_type:t.plan_type,...n===void 0?{}:{ordinary_usage_allowed:n},buckets:HN(t),...s?{credits:UN(s)}:{},...r?{spend_control:r}:{}})}async function vE(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s}=t,i=gE(n),o=i.tokens;if(!o||typeof o.access_token!="string")return ke("codex","provider_unavailable",{source:"codex_http",reason:"credentials_missing",detail:`no access_token in ${eu(n)} (or $CODEX_ACCESS_TOKEN)`});let a=new AbortController,l=setTimeout(()=>a.abort(),Math.ceil(e*1e3)),c=o.access_token,d=new Set([o.access_token,o.refresh_token,o.id_token].filter(u=>typeof u=="string"&&!!u));try{let u=typeof o.account_id=="string"?o.account_id:void 0,m=typeof o.refresh_token=="string"?o.refresh_token:void 0,p=typeof o.id_token=="string"?o.id_token:void 0,h="",_=()=>[...d],y=(C,I)=>hr(ke("codex",C,I),h,_()),f=!1,w=async()=>{if(!(f||!i.path||typeof o.refresh_token!="string"))try{let C=await hE({...i,tokens:{...o,refresh_token:m}},a.signal);typeof C.access_token=="string"&&(d.add(C.access_token),c=C.access_token),u=typeof C.account_id=="string"?C.account_id:u,typeof C.refresh_token=="string"&&(d.add(C.refresh_token),m=C.refresh_token),typeof C.id_token=="string"&&(d.add(C.id_token),p=C.id_token),f=!0;return}catch(C){let I=C instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(C.message)?C.message:"refresh_failed",N=I==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(I);return ke("codex",N?"auth_expired":"provider_unavailable",{source:"codex_http",reason:N?"oauth_token_expired_or_invalid":"oauth_refresh_failed",detail:`Codex OAuth refresh failed (${I})${N?"; renew Codex login":"; try again later"}`})}},g=()=>{let C={Authorization:`Bearer ${c}`,"User-Agent":jN,"Content-Type":"application/json",Accept:"application/json"};u&&(C["ChatGPT-Account-Id"]=u);let I=(n.CODEX_BASE_URL||$N).replace(/\/$/,"");return fetch(`${I}/wham/usage`,{headers:C,signal:a.signal})},E=await g();if(h=await E.text(),Ye({debug:r,onRawResponse:s},"codex_http",h,_(),E.status),E.status===401&&i.path&&m){let C=await w();if(C)return C;E=await g(),h=await E.text(),Ye({debug:r,onRawResponse:s},"codex_http",h,_(),E.status)}if(E.status===401)return y("auth_expired",{source:"codex_http",reason:"oauth_token_expired_or_invalid",detail:"HTTP 401 from the codex usage endpoint"});if(E.status===429){let C=E.headers.get("retry-after"),I=C===null?void 0:Number.parseInt(C,10);return y("reader_throttled",{source:"codex_http",reason:"throttled",detail:"HTTP 429 from codex usage endpoint",...I!==void 0&&Number.isFinite(I)&&I>=0?{retry_after_seconds:I}:{}})}if(!E.ok)return y("provider_unavailable",{source:"codex_http",reason:`http_${E.status}`,detail:"codex usage endpoint returned an unexpected status"});let b;try{b=JSON.parse(h)}catch(C){return ke("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:gr(String(C),d)})}return Rt(b)?BN(b):ke("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:"response was not an object"})}catch(u){let m=u instanceof Error?`${u.name}: ${u.message}`:String(u);return ke("codex","provider_unavailable",{source:"codex_http",reason:"http_request_failed",detail:gr(m,d)})}finally{clearTimeout(l)}}var $N,jN,wE=O(()=>{"use strict";Ut();_E();Ut();$N="https://chatgpt.com/backend-api",jN="codex-cli"});import{createHash as WN,randomUUID as XN}from"node:crypto";import{readFileSync as RE,openSync as qN,fsyncSync as GN,closeSync as JN,mkdirSync as TE,writeFileSync as IE,renameSync as KN,rmSync as VN,rmdirSync as zN,statSync as tu,utimesSync as YN}from"node:fs";import{homedir as QN}from"node:os";import{basename as ZN,dirname as eO,join as Go}from"node:path";import{setTimeout as xE}from"node:timers/promises";function nO(t){let e;try{e=RE(t,"utf8")}catch(s){if(s.code==="ENOENT")return{};throw new Error("config_unreadable")}let n={},r="other";for(let s of e.split(/\r?\n/)){let i=/^\s*\[providers\.(?:"managed:kimi-code"|'managed:kimi-code')(\.oauth)?\]\s*(?:#.*)?$/.exec(s);if(i){r=i[1]?"oauth.":"";continue}if(/^\s*\[/.test(s)){if(s.includes("managed:kimi-code"))throw new Error("config_format_unsupported");r="other";continue}if(r==="other")continue;if(/^\s*oauth\s*=/.test(s))throw new Error("config_format_unsupported");let o=/^\s*(base_url|oauth_host|storage|key)\s*=\s*("(?:[^"\\]|\\.)*"|'[^']*')\s*(?:#.*)?$/.exec(s);if(!o&&/^\s*(base_url|oauth_host|storage|key)\s*=/.test(s))throw new Error("config_malformed");if(o)try{n[r+o[1]]=o[2].startsWith('"')?JSON.parse(o[2]):o[2].slice(1,-1)}catch{throw new Error("config_malformed")}}return n}function Jo(t){let e;try{e=JSON.parse(RE(t,"utf8"))}catch(n){throw new Error(n.code==="ENOENT"?"credentials_missing":"credentials_malformed")}if(e&&typeof e=="object"&&e.access_token===""&&e.refresh_token==="")throw new Error("credentials_revoked");if(!e||typeof e!="object"||Array.isArray(e)||typeof e.access_token!="string"||!e.access_token.trim())throw new Error("credentials_malformed");return e}function AE(t){let e=t.KIMI_CODE_HOME??Go(t.HOME??QN(),".kimi-code"),n=nO(t.KIMI_CODE_CONFIG_PATH??Go(e,"config.toml")),r=t.KIMI_CODE_BASE_URL!==void 0||t.KIMI_CODE_OAUTH_HOST!==void 0||t.KIMI_OAUTH_HOST!==void 0,s=SE(t.KIMI_CODE_BASE_URL??n.base_url??bE),i=SE(t.KIMI_CODE_OAUTH_HOST??t.KIMI_OAUTH_HOST??(r?nu:n["oauth.oauth_host"]??nu)),o=s===bE&&i===nu?"kimi-code":`kimi-code-env-${WN("sha256").update(JSON.stringify({oauthHost:i,baseUrl:s})).digest("hex").slice(0,16)}`;if(!t.KIMI_CREDENTIALS_PATH&&!r&&n["oauth.key"]===`oauth/${o}`&&n["oauth.storage"]&&n["oauth.storage"]!=="file")throw new Error("credential_storage_unsupported");let a=t.KIMI_CREDENTIALS_PATH??Go(e,"credentials",`${o}.json`),l=Jo(a),c=a,d=ZN(a,".json");return{home:e,path:c,lockTarget:Go(e,"oauth",d),baseUrl:s,oauthHost:i,token:l}}function Ko(t){if(typeof t.expires_at!="number")return!1;let e=typeof t.expires_in=="number"?t.expires_in:0;return t.expires_at-Date.now()/1e3<Math.max(300,e*.5)}function kE(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.expires_at===e.expires_at&&t.expires_in===e.expires_in}async function rO(t,e){TE(eO(t),{recursive:!0}),IE(t,"",{flag:"a",mode:384});let n=`${t}.lock`;for(;;){if(e.aborted)throw new Error("refresh_locked");try{TE(n);break}catch(o){if(o.code!=="EEXIST")throw new Error("refresh_lock_failed");try{if(Date.now()-tu(n).mtimeMs>5e3)throw new Error("refresh_lock_stale")}catch(a){if(a.message==="refresh_lock_stale")throw a}try{await xE(50,void 0,{signal:e})}catch{throw new Error("refresh_locked")}}}let r=tu(n),s=()=>{let o;try{o=tu(n)}catch{throw new Error("refresh_lock_lost")}if(o.ino!==r.ino||o.dev!==r.dev)throw new Error("refresh_lock_lost")},i=setInterval(()=>{try{s();let o=new Date;YN(n,o,o)}catch{}},1e3);return i.unref(),{assertOwned:s,release(){clearInterval(i);try{s(),zN(n)}catch{}}}}async function CE(t,e){if(typeof t.token.refresh_token!="string"||!t.token.refresh_token)throw new Error("no_refresh_token");let n=await rO(t.lockTarget,e);try{let r=Jo(t.path);if(!kE(r,t.token)&&!Ko(r))return r;if(typeof r.refresh_token!="string"||!r.refresh_token)throw new Error("no_refresh_token");let s;for(let u=0;u<3;u++){try{if(s=await fetch(`${t.oauthHost}/api/oauth/token`,{method:"POST",signal:e,headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json","User-Agent":"lmctl"},body:new URLSearchParams({client_id:tO,grant_type:"refresh_token",refresh_token:r.refresh_token})}),![429,500,502,503,504].includes(s.status)||u===2)break;await s.body?.cancel()}catch{if(e.aborted||u===2)throw new Error("refresh_request_failed")}await xE(1e3*2**u,void 0,{signal:e})}if(!s)throw new Error("refresh_request_failed");if(!s.ok){try{let u=Jo(t.path);if(u.refresh_token!==r.refresh_token)return u}catch{}throw new Error(`refresh_http_${s.status}`)}let i=await s.json(),o=Number(i?.expires_in);if(!i||typeof i.access_token!="string"||!/^\S+$/.test(i.access_token)||typeof i.refresh_token!="string"||!/^\S+$/.test(i.refresh_token)||!Number.isFinite(o)||o<=0)throw new Error("invalid_refresh_response");let a=Math.floor(Date.now()/1e3)+o;if(!Number.isSafeInteger(a))throw new Error("invalid_refresh_response");n.assertOwned();let l=Jo(t.path);if(!kE(l,r)){if(!Ko(l))return l;throw new Error("credentials_changed")}let c={...l,access_token:i.access_token,refresh_token:i.refresh_token,expires_at:a,expires_in:o,...typeof i.scope=="string"?{scope:i.scope}:{},...typeof i.token_type=="string"?{token_type:i.token_type}:{}},d=`${t.path}.${XN()}.tmp`;try{let u=qN(d,"wx",384);try{IE(u,JSON.stringify(c,null,2)+`
2173
- `),GN(u)}finally{JN(u)}n.assertOwned(),KN(d,t.path)}finally{VN(d,{force:!0})}return c}finally{n.release()}}var bE,nu,tO,SE,NE=O(()=>{"use strict";bE="https://api.kimi.com/coding/v1",nu="https://auth.kimi.com",tO="17e5f671-d194-4dfb-9706-5516cb48c098",SE=t=>t.trim().replace(/\/+$/,"")});function OE(t){let e=o=>{if(typeof o!="number"&&typeof o!="string"||typeof o=="string"&&o.trim()==="")return;let a=Number(o);return Number.isFinite(a)&&a>=0?a:void 0},n=e(t.limit),r=e(t.used),s=e(t.remaining);if(n===void 0||n<=0||r===void 0&&(s===void 0||s>n))return;let i=r??n-s;return{used:i,limit:n,remaining:Math.max(0,n-i)}}async function LE({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s;try{s=AE(e)}catch(_){let y=_ instanceof Error&&/^(credentials_missing|credentials_malformed|credentials_revoked|config_unreadable|config_malformed|config_format_unsupported|credential_storage_unsupported)$/.test(_.message)?_.message:"credentials_unreadable";return ze("kimi",y==="credentials_revoked"?"auth_expired":"provider_unavailable",y,y==="credentials_revoked"?"Kimi login was revoked; run kimi login":y.replaceAll("_"," "),"kimi_http")}let i=s.token,o=new AbortController,a=setTimeout(()=>o.abort(),t*1e3),l,c;try{let _=!1,y=async()=>{i=await CE({...s,token:i},o.signal),_=!0};Ko(i)&&await y();let f=()=>fetch(`${s.baseUrl}/usages`,{headers:{Authorization:`Bearer ${i.access_token}`,Accept:"application/json"},signal:o.signal});l=await f(),c=await l.text(),Ye({debug:n,onRawResponse:r},"kimi_http",c,[i.access_token,i.refresh_token],l.status),l.status===401&&!_&&i.refresh_token&&(await y(),l=await f(),c=await l.text(),Ye({debug:n,onRawResponse:r},"kimi_http",c,[i.access_token,i.refresh_token],l.status))}catch(_){let y=_ instanceof Error&&/^(no_refresh_token|credentials_changed|credentials_revoked|invalid_refresh_response|refresh_locked|refresh_lock_stale|refresh_lock_failed|refresh_lock_lost|refresh_request_failed|refresh_http_\d+)$/.test(_.message)?_.message:"request_failed",f=y==="credentials_revoked"||y==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(y),w=y==="refresh_lock_stale"?"Kimi refresh lock is stale; run the native Kimi CLI to recover its lock, or verify no refresh is active before removing the .lock directory":f?`Kimi credential renewal failed (${y}); run kimi login`:`Kimi quota request failed (${y})`;return ze("kimi",f?"auth_expired":"provider_unavailable",y,w,"kimi_http")}finally{clearTimeout(a)}let d=(_,y,f)=>hr(ze("kimi",_,y,y,"kimi_http",[],f),c,[i.access_token]);if(l.status===401)return d("auth_expired","HTTP 401 from Kimi usage endpoint");if(l.status===403)return d("not_applicable","HTTP 403 from Kimi usage endpoint");if(l.status===429){let _=Jy(l.headers);return d("reader_throttled","HTTP 429 from Kimi usage endpoint",_)}if(l.status!==200)return d("provider_unavailable",`HTTP ${l.status} from Kimi usage endpoint`);let u;try{u=JSON.parse(c)}catch{return ze("kimi","provider_unavailable","malformed_response","SyntaxError: malformed JSON")}if(!u||typeof u!="object")return ze("kimi","provider_unavailable","malformed_response","response was not an object");let m=[],p=new Set;function h(_){let y=String(_.bucket_id),f=y,w=2;for(;p.has(y);)y=`${f}-${w}`,w++;p.add(y),_.bucket_id=y,m.push(Ve(_))}if(Array.isArray(u.limits))for(let _ of u.limits){if(!_||typeof _!="object")continue;let y=_.window,f=_.detail;if(!y||typeof y!="object"||!f||typeof f!="object")continue;let w=0;if(y.timeUnit==="TIME_UNIT_MINUTE")w=Number(y.duration);else if(y.timeUnit==="TIME_UNIT_HOUR")w=Number(y.duration)*60;else if(y.timeUnit==="TIME_UNIT_DAY")w=Number(y.duration)*1440;else if(y.timeUnit==="TIME_UNIT_WEEK")w=Number(y.duration)*10080;else if(y.timeUnit==="TIME_UNIT_MONTH")w=Number(y.duration)*43200;else continue;let g=qy(w),E="window";g==="five_hour"&&(E="5h"),g==="weekly"&&(E="weekly"),g==="monthly"&&(E="monthly");let b=OE(f);if(!b)continue;let{used:C,limit:I,remaining:N}=b;h({bucket_id:`kimi-${E}`,window_type:g,used_fraction:Pe(C/I),remaining_fraction:Pe(N/I),resets_at_iso:f.resetTime,raw_value:C,raw_scale:"count"})}if(u.usage&&typeof u.usage=="object"){let _=OE(u.usage);_&&h({bucket_id:"kimi-weekly",window_type:"weekly",used_fraction:Pe(_.used/_.limit),remaining_fraction:Pe(_.remaining/_.limit),resets_at_iso:u.usage.resetTime,raw_value:_.used,raw_scale:"count"})}if(u.usages&&typeof u.usages=="object"){let _=[{key:"limit_5h",id:"kimi-5h",type:"five_hour"},{key:"limit_7d",id:"kimi-weekly",type:"weekly"},{key:"limit_month_total",id:"kimi-monthly",type:"monthly"},{key:"limit_month_code",id:"kimi-monthly-code",type:"monthly"}];for(let{key:y,id:f,type:w}of _){let g=u.usages[y];if(!g||typeof g!="object"||g.used_ratio==null||g.used_ratio===""||typeof g.used_ratio=="boolean")continue;let E=Number(g.used_ratio);!Number.isFinite(E)||E<0||p.has(f)||(p.add(f),m.push(Ve({bucket_id:f,window_type:w,used_fraction:Pe(E),resets_at_iso:typeof g.reset_time=="string"&&g.reset_time?g.reset_time:null,raw_value:E,raw_scale:"ratio"})))}}return ke("kimi","ok",{source:"kimi_http",buckets:m})}var ME=O(()=>{"use strict";Ut();NE();Ut()});async function DE(t={}){let e=t.targets??t.providers??["all"];if(!Array.isArray(e)||e.length===0||e.some(a=>typeof a!="string"))return{status:"error",error:"providers must be a non-empty list of provider names",readings:[]};for(let a of e)if(!PE.includes(a))return{status:"error",error:`unknown provider: ${a} (valid targets: ${PE.join(", ")})`,readings:[]};let n=t.timeoutSeconds??sO;if(!Number.isFinite(n)||n<=0)return{status:"error",error:"timeoutSeconds must be a positive finite number",readings:[]};let r=t.env??process.env,s=new Set(e.includes("all")?["codex","agy","claude","kimi"]:e);t.progress?.(`querying ${e.join(" ")} live (timeout ${n}s per provider) ...`);let o=Object.entries({codex:vE,agy:zy,claude:cE,kimi:LE}).filter(([a])=>s.has(a)).map(async([,a])=>{let l=[],c=await a({timeoutSeconds:n,env:r,...t.debug?{debug:t.debug}:{},...t.includeRaw?{onRawResponse:d=>l.push(d)}:{}});return t.includeRaw?{...c,raw_responses:l}:c});try{return{status:"ok",readings:(await Promise.all(o)).filter(Boolean)}}catch(a){return{status:"error",error:String(a),readings:[]}}}var PE,sO,FE=O(()=>{"use strict";Yy();dE();wE();ME();PE=["all","codex","agy","claude","kimi"],sO=15});async function iO(t,e={}){try{let n=ue(t);if(n)return n;if(!e||typeof e!="object"||Array.isArray(e))return j("invalid_argument","Ratelimit options must be a map");let{providers:r,provider:s,timeoutSeconds:i=15}=e,o=r??(s===void 0?["all"]:[s]);if(Object.keys(e).some(l=>!Ln("readRatelimits").includes(l))||!Array.isArray(o)||o.some(l=>typeof l!="string"||!l||l.startsWith("-")))return j("invalid_argument","providers must be a list of provider names");if(typeof i!="number"||!Number.isFinite(i)||i<=0)return j("invalid_argument","timeoutSeconds must be a positive finite number");let a=await DE({providers:o.length?[...o]:["all"],timeoutSeconds:i,env:{...t.env},progress:l=>t.onProgress(l+`
2174
- `,"stderr")});return a.status==="ok"?ce({readings:a.readings}):j("provider",a.error,{readings:[]})}catch(n){return j("provider",G(n),{readings:[]})}}var $E=O(()=>{"use strict";FE();jt();Xe()});import{basename as oO}from"node:path";function HE(t,e){let n=new Date(e.now.getTime()-pn()).toISOString(),r=XE(t,n).filter(p=>!p.sender.teamfile.startsWith("prompt:")),s=dO(e.sender,r),i=uO(e.sender,r);i!==null&&i.teamfile===e.root&&!UE(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(p=>UE(p,o)),c=l.map(p=>p.at).filter(p=>p!==null).sort((p,h)=>h-p)[0]??null,d=c!==null&&e.now.getTime()-c<aO,u=ru(e.sender,r).length;return{stop:l.length>=1&&d&&u>=lO,chain:mO(a)}}function BE(t,e){let n=new Date(e.now.getTime()-pn()).toISOString(),r=XE(t,n),s=ru(e.sender,r);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function pn(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return jE;let n=Number(e);return!Number.isFinite(n)||n<=0?jE:n}function WE(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function cO(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function XE(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(cO).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=e).sort((n,r)=>n.at-r.at)}function dO(t,e,n={}){let r=new Map;for(let a of e)r.set(Mn(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([Mn(t)]);for(let a=0;a<64;a+=1){let l=r.get(Mn(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&n.includePromptSender!==!0)break;let d=Mn(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function ru(t,e){let n=Mn(t),r=new Set([n]),s=[n],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let c=Mn(l.sender),d=Mn(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),r.has(c)||(r.add(c),s.push(c)),r.has(d)||(r.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function uO(t,e){let n=ru(t,e);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function UE(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Mn(t){return`${t.teamfile}\0${t.alias}`}function mO(t){return t.map(e=>`${oO(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var aO,lO,jE,Vo=O(()=>{"use strict";aO=6e4,lO=2,jE=8*60*60*1e3});function pO(t,e){if(Em(e)!=="dead")return null;let n=`holder process verified not alive; reconciled to aborted (invocation #${e.id}, holder pid ${e.holder_pid??"unknown"} on ${e.holder_host??"unknown"})`;return t.abortTrackedInvocationAndTerminalizeMessage(e.id,{holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat_at:e.last_heartbeat_at},n)}function zo(t,e,n){let r=t.query(`SELECT id, status, holder_pid, holder_host, started_at, last_heartbeat_at
2163
+ `}function BC(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="lmplayer"||t==="qwen"||t==="agy"||t==="kimi"||t==="dsh"||t==="hermes"||t==="pi"||t==="ClaudeMock"}function Ln(t,e){return t.stderr.write(`error: ${e}
2164
+ `),1}function Gd(t,e){for(let n of t)n.teamfile!==void 0&&e.stderr.write(`warning: member "${n.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
2165
+ `)}var vs,wC,TC,_r,bC,by,Sy,qo,NC,OC,Ay=O(()=>{"use strict";Nt();yf();Fl();tc();jo();fr();jr();oy();Xo();_l();xe();vs=5,wC={existsSync:EC,statSync:vC,accessSync:yC},TC=async t=>{let{seed:e}=await Promise.resolve().then(()=>(dn(),$_)),n=await e(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}},_r=wC,bC=qi;NC=/^\[([^\]]+)\]\s+(.*)$/s,OC=/^([^:\s][^:]*):\s+(.*)$/s});function ue(t){if(!Jn(t))return j("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return j("cancelled","Context is closed")}function kt(t){try{let e=t?.code;return e==="ENOENT"?"missing":e==="EACCES"||e==="EPERM"||e==="EISDIR"?"read":"schema"}catch{return"read"}}function Ue(t,e){let n=r=>s=>{e?.(s,r),r==="stderr"&&s.startsWith("warning:")?t.onWarning(s):t.onProgress(s,r)};return{cwd:t.cwd,env:{...t.env,LMCTL_DB:t.dbPath},dal:t.dal,stdout:{write:n("stdout")},stderr:{write:n("stderr")}}}function Pn(t){return We.find(e=>e.name===t)?.params.find(e=>e.name==="options")?.keys?.map(e=>e.name)??[]}var Ut=O(()=>{"use strict";Gt();Yt();Xe()});import{resolve as Go}from"node:path";function WC(t,e){try{let n=ue(t);if(n)return n;if(typeof e!="string"||!e)return j("invalid_argument","Teamfile must be a nonempty string");let r=ot(Go(t.cwd,e));return ce({members:r.members.map(s=>({alias:s.alias,provider:s.provider,model:s.model,sessionid:s.session,sessiondir:s.sessiondir}))})}catch(n){return j(kt(n),G(n))}}function XC(t,e,n){try{let r=ue(t);if(r)return r;if(typeof e!="string"||!Fr(e)||typeof n!="string"||!El(n))return j("invalid_argument","Expected a teamfile path and valid alias");let s=_t(Go(t.cwd,e),n,t.dal);return ce({member:{alias:s.alias,provider:s.provider,model:s.model,sessionid:s.sessionid,sessiondir:s.sessiondir},isLead:s.isLead,teamfile:s.teamfile})}catch(r){let s;try{s=r instanceof ve?r.kind:void 0}catch{}return s==="not_found"?{status:"not_found",code:"not_found",error:G(r)}:j(s??kt(r),G(r))}}async function qC(t,e){try{let n=ue(t);if(n)return n;if(typeof e!="string"||!e)return j("invalid_argument","Teamfile must be a nonempty string");let r=await Iy(Go(t.cwd,e),Ue(t)),s={errors:r.errors,warnings:r.warnings,counts:r.counts};return r.status==="ok"?ce(s):j("schema",r.errors.map(i=>i.message).join("; "),s)}catch(n){let r=G(n);return j(kt(n),r,{errors:[{alias:"",message:r}],warnings:[],counts:{errors:1,warnings:0}})}}async function GC(t,e,n={}){let r=[],s=!1;try{let i=ue(t);if(i)return i;if(typeof e!="string"||!e)return j("invalid_argument","Teamfile must be a nonempty string");if(!n||typeof n!="object"||Array.isArray(n))return j("invalid_argument","Seed options must be a map");let o=We.find(p=>p.name==="seedTeam").params.find(p=>p.name==="options").keys,a=n.preamble;if(Object.keys(n).some(p=>!o.some(h=>h.name===p))||a!==void 0&&typeof a!="string"&&(typeof a!="object"||a===null||Array.isArray(a)))return j("invalid_argument","Seed options accept a string or alias map preamble only");let l=typeof a=="object"&&a!==null?{...a}:a,c=[],d=Cy(c),u=Ue(t,(p,h)=>{h==="stderr"&&d(p)});s=!0;let m=await xy(Go(t.cwd,e),u,{...l===void 0?{}:{preamble:l},onSeeded:p=>{r.push({...p})}});return m===0?ce({seeded:r}):j("provider",c.join(`
2166
+ `)||`Seed failed with exit code ${m}`,{seeded:r})}catch(i){return s?j(kt(i),G(i),{seeded:r}):j(kt(i),G(i))}}function Cy(t){return e=>{let n=!1;for(let r of e.split(/\r?\n/))r.startsWith("error:")?(t.push(r.replace(/^error:\s*/,"")),n=!0):n&&r.length>0&&t.push(r)}}var Ny=O(()=>{"use strict";Gt();Nt();Zt();Ay();Ut();Xe()});import{readFileSync as JC}from"node:fs";import{resolve as KC}from"node:path";function VC(t,e,n={}){try{let r=ue(t);if(r)return r;if(typeof e!="string"||!e)return j("invalid_argument","Prompt path must be a nonempty string");if(!n||typeof n!="object"||Array.isArray(n))return j("invalid_argument","Prompt options must be a map");let s=n.single,i=We.find(a=>a.name==="readPrompts").params.find(a=>a.name==="options").keys;if(Object.keys(n).some(a=>!i.some(l=>l.name===a))||s!==void 0&&typeof s!="boolean")return j("invalid_argument","Prompt options accept a boolean single only");let o=JC(KC(t.cwd,e),"utf8").replace(/^\uFEFF/u,"").replace(/\r\n?/gu,`
2167
+ `);return ce({prompts:s?[o.trim()].filter(a=>a.length>0):o.split(/\n\s*\n/u).map(a=>a.trim()).filter(Boolean)})}catch(r){return j(kt(r),G(r))}}var Oy=O(()=>{"use strict";Gt();Ut();Xe()});import{join as Ce}from"node:path";function Jo(t){let e=Ly.get(t);if(e)return e;let n=t.env.HOME;if(!n)return Pt($t());let r=t.env.XDG_DATA_HOME||Ce(n,".local/share"),s=t.env.XDG_CONFIG_HOME||Ce(n,".config");return e=Pt($t({museDataHome:r,miniplayerHome:t.env.MINIPLAYER_HOME||Ce(r,"miniplayer"),claudeDir:Ce(n,".claude"),codexDir:Ce(n,".codex"),codeDir:Ce(n,".code"),geminiDir:Ce(n,".gemini"),copilotDir:Ce(n,".copilot"),qwenDir:Ce(n,".qwen"),opencodeDbPaths:[Ce(r,"opencode/opencode.db"),Ce(s,"opencode/opencode.db")],agyDir:Ce(n,".gemini/antigravity-cli"),dshHome:Ce(n,".dsh"),hermesHome:t.env.HERMES_HOME??Ce(n,".hermes"),kimiHome:t.env.KIMI_CODE_HOME??Ce(n,".kimi-code"),piDir:Ce(n,".pi/agent/sessions"),lmplayerDbPaths:Kl(t.env,n)})),Ly.set(t,e),e}var Ly,My=O(()=>{"use strict";dn();Qr();Ly=new WeakMap});import{resolve as zC}from"node:path";function Py(t){let e=new Date(t.clock());return[e.getHours(),e.getMinutes(),e.getSeconds()].map(n=>String(n).padStart(2,"0")).join(":")}async function Dy(t,e,n,r,s,i){let o=null,a=!1,l="invalid_argument",c,d,u=new Set,m=(h,_="",y=null,f)=>({status:h,reply:_,error:y,sessionid:o,messageId:null,teamChatLogId:null,...f?{code:f}:{}}),p;try{let h=ue(t);if(h)return m("error","",h.error,h.code);if(!e||typeof e!="object"||Array.isArray(e))throw Error("promptAgent: member must be a map");let _={};for(let v of["provider","alias","model","effort","sessiondir","sessionid"]){let T=e[v];if(T!=null&&(typeof T!="string"||!T.trim()))throw Error(`promptAgent: ${v} must be a nonempty string when supplied`);T!=null&&(_[v]=T)}if(!_.provider)throw Error("promptAgent: provider is required");if(o=_.sessionid??null,typeof n!="string")throw Error("promptAgent: prompt must be a string");if(!r||typeof r!="object"||Array.isArray(r))throw Error("promptAgent: options must be a map");let{permissionMode:y="yolo",idleTimeoutMs:f}=r;if(Object.keys(r).some(v=>!Pn("promptAgent").includes(v)))throw Error("promptAgent: unknown option");if(y!=="yolo"&&y!=="plan")throw Error("promptAgent: permissionMode must be yolo or plan");if(f!=null&&(typeof f!="number"||!Number.isFinite(f)||f<0))throw Error("promptAgent: idleTimeoutMs must be a finite nonnegative number");p=At(t);let w=o?JSON.stringify([_.provider,o]):void 0;if(s&&(w!==i||!p.handoffSessions.has(w)))return m("error","","Reservation target does not match member","invalid_argument");if(p.activeAgents.has(e)||w!==void 0&&(p.activeSessions.has(w)||!s&&p.handoffSessions.has(w)))return m("busy","","promptAgent: session already has an active turn in this context","busy");p.activeAgents.add(e),a=!0,w&&(p.activeSessions.add(w),u.add(w));let g=Ue(t);l="provider",g.stderr.write(`agent ${Py(t)}: prompting ${_.alias??_.provider}
2168
+ `);let E=t.clock(),b=E,C=setInterval(()=>{try{let v=t.clock();v-b>=5e3&&g.stderr.write(`agent ${Py(t)}: still running (${Math.round((v-E)/1e3)}s elapsed)
2169
+ `)}catch(v){d=v,clearInterval(C)}},5e3);C.unref(),c={poke(){try{b=t.clock()}catch(v){d=v}},stop(){clearInterval(C)}};let I=_.provider,N=zC(t.cwd,_.sessiondir??t.cwd);if(!o&&["agy","pi","dsh"].includes(I)){if(y!=="yolo")throw Error(`promptAgent: fresh ${I} sessions require yolo seed; supply sessionid for resume`);let v=await Nd({provider:I,cwd:N,model:_.model,effort:_.effort,env:{...t.env},signal:t.signal});for(let R of v.warnings??[])g.stderr.write(`warning: ${R}
2170
+ `);if(!v.success||!v.sessionId)throw Error(v.error??"promptAgent: provider did not identify the seeded session");o=v.sessionId;let T=JSON.stringify([I,o]);if(p.activeSessions.has(T)||!s&&p.handoffSessions.has(T))return m("busy","","promptAgent: seeded session is already active","busy");p.activeSessions.add(T),u.add(T)}let A=o??"",S=await _s({provider:I,cwd:N,sessionId:A,prompt:n,model:_.model,effort:_.effort,alias:_.alias,isLead:!1,permissionMode:y,timeoutMs:f,requireResume:!!A,env:{...t.env},signal:t.signal,onDelta:()=>c?.poke(),onProgress:()=>c?.poke()});if(d!==void 0)throw d;for(let v of S.warnings??[])g.stderr.write(`warning: ${v}
2171
+ `);return A&&S.sessionId!==A?m("error","","promptAgent: provider changed session identity during resume","provider"):(S.sessionId&&(o=S.sessionId),S.status==="stalled"?m("stalled",S.text,"provider stalled"):S.status==="empty"?m("empty","","promptAgent: provider reported a normal completion but returned no content and no observed activity -- often an upstream failure (rate limit, quota, auth) the provider did not report as an error"):S.sessionId?m("ok",S.text):m("error",S.text,"promptAgent: provider did not return a session ID","provider"))}catch(h){return m("error","",G(h),l)}finally{if(c?.stop(),a&&p){p.activeAgents.delete(e);for(let h of u)p.activeSessions.delete(h)}}}async function Fy(t,e,n,r={}){return Dy(t,e,n,r,!1)}async function $y(t,e,n,r={},s){return Dy(t,e,n,r,!0,s)}var Jd=O(()=>{"use strict";dn();Yt();Ut();Xe()});import{randomUUID as YC}from"node:crypto";import{resolve as QC}from"node:path";function Ts(t){try{if(!t||typeof t!="object"||Array.isArray(t))return j("invalid_argument","Session target requires provider and sessionid");let e=t.provider,n=t.sessionid;return typeof e!="string"||!e.trim()||typeof n!="string"||!n.trim()?j("invalid_argument","Session target requires provider and sessionid"):{provider:e,sessionid:n}}catch(e){return j("invalid_argument",G(e))}}function ws(t){return JSON.stringify([t.provider,t.sessionid])}function Uy(t,e){try{let n=ue(t);if(n)return n;let r=Ts(e);if("status"in r)return r;let s=At(t),i=ws(r);return s.activeAgents.has(e)||s.activeSessions.has(i)?{status:"busy",error:"Session has an active turn in this context",busyReason:"turn"}:s.handoffSessions.has(i)?{status:"busy",error:"Session is reserved for handoff",busyReason:"handoff"}:ce({})}catch(n){return j("invalid_argument",G(n))}}async function Hy(t,e,n,r,s={}){let i=e&&typeof e=="object"?jy.get(e):void 0;return!i||i.ctx!==t||At(t).reservations.get(i.key)!==e?{status:"error",error:"Invalid or released session reservation",code:"invalid_argument",reply:"",sessionid:null,messageId:null,teamChatLogId:null}:$y(t,n,r,s,i.key)}function By(t,e){try{let n=ue(t);if(n)return n;let r=Ts(e);if("status"in r)return r;let s=At(t),i=ws(r);if(s.activeSessions.has(i)||s.handoffSessions.has(i))return{status:"busy",error:"Session is already active in this context"};s.handoffSessions.add(i);let o=Object.freeze({id:YC()});return jy.set(o,{ctx:t,key:i}),s.reservations.set(i,o),ce({reservation:o})}catch(n){return j("invalid_argument",G(n))}}function Wy(t,e){try{let n=ue(t);if(n)return n;let r=Ts(e);return"status"in r?r:(At(t).handoffSessions.delete(ws(r)),At(t).reservations.delete(ws(r)),ce({}))}catch(n){return j("invalid_argument",G(n))}}async function Xy(t,e={}){try{let n=ue(t);if(n)return n;if(!e||typeof e!="object"||Array.isArray(e))return j("invalid_argument","Session options must be a map");let{provider:r,workspace:s,all:i}=e;if(Object.keys(e).some(a=>!Pn("listSessions").includes(a))||r!==void 0&&(typeof r!="string"||!r.trim())||s!==void 0&&(typeof s!="string"||!s.trim())||i!==void 0&&typeof i!="boolean")return j("invalid_argument","Expected provider, workspace and all session options");let o=await Od({registry:Jo(t),provider:r,workspace:i?void 0:QC(t.cwd,s??t.cwd)});return ce({sessions:o.map(a=>({provider:a.provider,sessionid:a.sessionId,sessiondir:a.cwd,modifiedAt:a.modifiedAt.toISOString()}))})}catch(n){return j("provider",G(n))}}async function qy(t,e){try{let n=ue(t);if(n)return n;let r=Ts(e);if("status"in r)return r;let s=await Jo(t).getSession(r.sessionid,r.provider);return s?ce({messages:s.messages.map(i=>({role:i.role,content:i.content}))}):{status:"not_found",error:null}}catch(n){return j("provider",G(n))}}async function Gy(t,e,n){try{let r=ue(t);if(r)return r;let s=Ts(e);if("status"in s)return s;if(!n||typeof n!="object"||Array.isArray(n)||n.force!==!0||Object.keys(n).some(a=>!Pn("deleteSession").includes(a)))return j("invalid_argument","force: true is required because cross-process turns cannot be detected");let i=At(t),o=ws(s);if(i.activeAgents.has(e)||i.activeSessions.has(o)||i.handoffSessions.has(o))return{status:"busy",error:"Session has an active turn in this context"};i.activeSessions.add(o);try{return{status:await Ld(s.provider,s.sessionid,Jo(t))?"deleted":"not_found",error:null}}finally{i.activeSessions.delete(o)}}catch(r){return j("provider",G(r))}}var jy,Jy=O(()=>{"use strict";My();Jd();dn();Yt();Ut();Xe();jy=new WeakMap});function Pe(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);return Number.isFinite(e)?Math.round(Math.min(1,Math.max(0,e))*1e6)/1e6:null}function Rt(t,e){if(t==null||typeof t=="boolean")return null;let n=Number(t);return Pe(e==="percent"?n/100:n)}function Ky(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);if(!Number.isFinite(e))return null;try{return new Date(Math.trunc(e)*1e3).toISOString().replace(".000Z","Z")}catch{return null}}function Vy(t){if(typeof t!="string"||t.trim()==="")return null;let e=Date.parse(t);return Number.isFinite(e)?Math.floor(e/1e3):null}function zy(t){let e=Number(t);return Number.isFinite(e)?e===300||e>=240&&e<=360?"five_hour":e===10080||e>=9e3&&e<=11500?"weekly":e===43200||e===44640||e>=38e3&&e<=46e3?"monthly":"unknown":"unknown"}function Yy(t){let e=String(t??"").trim().toLowerCase().replace(/-/g,"_").split("_").filter(Boolean);for(let n of[e[0],e.at(-1)]){if(n?.startsWith("5h")||n?.startsWith("five")||n==="session")return"five_hour";if(n?.startsWith("7d")||n?.startsWith("seven")||n?.startsWith("week"))return"weekly";if(n?.startsWith("30d")||n?.startsWith("month"))return"monthly"}return"unknown"}function yr(t,e=[]){let n=t==null?"":String(t);for(let r of e)typeof r=="string"&&r.length>=4&&(n=n.replaceAll(r,"***REDACTED***"));for(let r of eN)n=n.replace(r,"***REDACTED***");return n}function Ve(t){let e=Pe(t.used_fraction),n=Pe(t.remaining_fraction),r=t.resets_at==null?Vy(t.resets_at_iso):Number(t.resets_at),s=t.resets_at_iso==null?Ky(r):Ky(Vy(t.resets_at_iso)),i={bucket_id:t.bucket_id,...t.group_name!=null?{group_name:t.group_name}:{},window_type:t.window_type??"unknown",used_fraction:e??(n===null?null:Pe(1-n)),remaining_fraction:n??(e===null?null:Pe(1-e)),resets_at:r==null||!Number.isFinite(r)?null:Math.trunc(r),resets_at_iso:s,is_exhausted:t.is_exhausted??(n!==null?n<=0:e!==null?e>=1:null)};for(let o of["raw_value","raw_scale","limit_name","metered_feature","allowed","limit_reached"])t[o]!=null&&(i[o]=t[o]);return i}function ke(t,e,n={}){let r={$schema:ZC,provider:t,status:e,source:n.source??null,read_at:n.read_at??Math.floor(Date.now()/1e3),account_id:n.account_id??null,plan_type:n.plan_type??null,ordinary_usage_allowed:n.ordinary_usage_allowed??null,buckets:n.buckets??[]};for(let s of["credits","spend_control","characteristics","reason","detail","retry_after_seconds"])n[s]!=null&&(r[s]=n[s]);return r}function ze(t,e,n,r,s,i=[],o){return ke(t,e,{source:s??null,reason:n,...r==null?{}:{detail:yr(r,i)},...o==null?{}:{retry_after_seconds:o}})}function Qy(t){let e=t.get("retry-after");if(e===null)return null;let n=Number.parseFloat(e);return Number.isFinite(n)&&n>=0?Math.trunc(n):null}function Ye(t,e,n,r=[],s){if(!t.debug&&!t.onRawResponse)return;let i=yr(n,[...r].filter(o=>typeof o=="string")).replace(/("(?:access[_-]?token|refresh[_-]?token|authorization|api[_-]?key|password)"\s*:\s*")[^"\r\n]*(")/gi,"$1***REDACTED***$2");t.onRawResponse?.({source:e,...s===void 0?{}:{http_status:s},text:i}),t.debug?.(`[debug] ${e}${s===void 0?"":` HTTP ${s}`} raw response:
2172
+ ${i}`)}function Er(t,e,n=[]){let r;try{let i=JSON.parse(e);r=typeof i?.error=="string"?i.error:i?.error?.message??i?.message??i?.detail}catch{/^\s*[<{[]/.test(e)||(r=e.trim())}if(typeof r!="string"||!r.trim())return t;let s=yr(r,n);return{...t,detail:s,provider_message:s}}var ZC,eN,Ht=O(()=>{"use strict";ZC="https://lmctl.com/schemas/lmratelimit-v1.json";eN=[/sk-ant-[A-Za-z0-9_-]{4,}/g,/sk-[A-Za-z0-9_-]{16,}/g,/\bbearer\s+[A-Za-z0-9._-]{8,}/gi,/\boat01[-_][A-Za-z0-9_-]{8,}/g,/\bcsrf[-_][A-Za-z0-9_-]{4,}/gi,/\b(?:csrf[-_]?token|x-codeium-csrf-token)\s*[:=]\s*['"]?[A-Za-z0-9._-]{4,}/gi]});import{spawnSync as tN}from"node:child_process";import{readdirSync as nN,readFileSync as rN}from"node:fs";import{join as sN}from"node:path";function uN(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("ANTIGRAVITY")))}function mN(t){let e=t.trim().toLowerCase(),n={"gemini models":"gemini","claude and gpt models":"3p",gemini:"gemini","3p models":"3p","3p":"3p"};return n[e]?n[e]:e.replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function pN(t){let e=t.toLowerCase();return e.includes("weekly")?"weekly":e.includes("five hour")||e.includes("5-hour")||e.includes("5 hour")?"five_hour":e.includes("monthly")||e.includes("month")?"monthly":null}function fN(t){let e={weekly:"weekly",five_hour:"5h",monthly:"monthly"},n=[];for(let r of t.split(/\r?\n/)){let s=r.trim().split(" ").map(l=>l.trim());if(s.length<3||!s[0]||!s[1])continue;let i=pN(s[1]);if(!i)continue;let o=Number(s[2].replace(/%$/,"").trim());if(!Number.isFinite(o))continue;let a=Pe(o/100);n.push(Ve({bucket_id:`${mN(s[0])}-${e[i]}`,group_name:s[0],window_type:i,used_fraction:a===null?null:Pe(1-a),remaining_fraction:a,resets_at_iso:s[3]||null,raw_value:o,raw_scale:"remaining_percent"}))}return n.sort((r,s)=>String(r.group_name??"").localeCompare(String(s.group_name??""))||String(r.bucket_id??"").localeCompare(String(s.bucket_id??"")))}function bs(t,e,n){return ze("agy","provider_unavailable",t,e,"agy_cli_print")}function gN(t,e,n={}){try{let r=cN(Math.max(t,60)*1e3,uN(e));if(Ye(n,"agy_cli_print",r.stdout??"",[e.ANTIGRAVITY_CSRF_TOKEN]),r.error?.code==="ENOENT")return bs("agy_not_found","the agy CLI is not on PATH",t);if(r.error?.code==="ETIMEDOUT")return bs("cli_timeout","agy -p /usage did not finish in time",t);if(r.error)return bs("cli_failed",r.error.message,t);let s=fN(r.stdout??"");return s.length===0?bs("cli_unparseable",`exit ${r.status??1}; no buckets parsed from CLI output`,t):ke("agy","ok",{source:"agy_cli_print",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:s})}catch(r){return bs("cli_failed",r instanceof Error?r.message:String(r),t)}}function hN(t){let e=[],n=new Set,r=(s,i,o)=>{!s||!i||n.has(`${s}\0${i}`)||(n.add(`${s}\0${i}`),e.push([s,i,o]))};r(t[Zy],t[eE],-1);try{for(let s of nN("/proc"))if(/^\d+$/.test(s))try{let i={};for(let o of rN(sN("/proc",s,"environ")).toString("utf8").split("\0")){let a=o.indexOf("=");a>0&&(i[o.slice(0,a)]=o.slice(a+1))}r(i[Zy],i[eE],Number(s))}catch{}}catch{}return e}function _N(t){if(typeof t!="object"||t===null)return null;let e=t.response;if(typeof e!="object"||e===null)return null;let n=e.groups;if(!Array.isArray(n))return null;let r=[];for(let s of n){if(typeof s!="object"||s===null)continue;let i=s,o=typeof i.displayName=="string"?i.displayName:null;if(Array.isArray(i.buckets))for(let a of i.buckets){if(typeof a!="object"||a===null)continue;let l=a,c=Rt(l.remainingFraction,"fraction");r.push(Ve({bucket_id:l.bucketId??l.displayName??"unknown",group_name:o,window_type:Yy(l.window),used_fraction:c===null?null:Pe(1-c),remaining_fraction:c,resets_at_iso:l.resetTime??null,raw_value:l.remainingFraction??null,raw_scale:"remaining_fraction"}))}}return r.length===0?null:(r.sort((s,i)=>String(s.group_name??"").localeCompare(String(i.group_name??""))||String(s.bucket_id??"").localeCompare(String(i.bucket_id??""))),ke("agy","ok",{source:"agy_connect_rpc",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:r}))}async function yN(t,e,n={}){let r=hN(e);if(r.length===0)return ze("agy","provider_unavailable","no_active_session","no live agy process exposed ANTIGRAVITY_LS_ADDRESS/ANTIGRAVITY_CSRF_TOKEN","agy_connect_rpc");let s=[];for(let[i,o,a]of r)try{let l=await dN(`http://${i}${iN}`,{"Content-Type":"application/json","Connect-Protocol-Version":"1","x-codeium-csrf-token":o},t*1e3);if(Ye(n,"agy_connect_rpc",l.body,[o],l.status),l.status===200){let c;try{c=JSON.parse(l.body)}catch{s.push(`pid=${a}: unparseable response`);continue}let d=_N(c);if(d)return d;s.push(`pid=${a}: response had no quota groups`)}else l.status===401||l.status===403?s.push(`pid=${a}: HTTP ${l.status} unauthorized`):s.push(`pid=${a}: HTTP ${l.status}`)}catch(l){s.push(`pid=${a}: ${l instanceof Error?l.message:String(l)}`)}return ze("agy","provider_unavailable","no_active_session",`all candidate language servers failed: ${s.slice(0,5).join("; ")}`,"agy_connect_rpc",r.map(([,i])=>i))}async function tE(t){let e=gN(t.timeoutSeconds,t.env,t);if(e.status==="ok")return e;let n=await yN(t.timeoutSeconds,t.env,t);return n.status==="ok"?n:ze("agy","provider_unavailable","cli_and_language_server_unavailable",`cli: ${String(e.reason??e.status)} (${String(e.detail??"no detail")}); connect: ${String(n.reason??n.status)} (${String(n.detail??"no detail")})`,"agy_cli_print")}var Zy,eE,iN,oN,aN,lN,cN,dN,nE=O(()=>{"use strict";Ht();Ht();Zy="ANTIGRAVITY_LS_ADDRESS",eE="ANTIGRAVITY_CSRF_TOKEN",iN="/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary",oN=["-p","/usage"],aN=(t,e)=>{let n=tN("agy",oN,{encoding:"utf8",timeout:t,maxBuffer:16777216,env:e,stdio:["ignore","pipe","ignore"]});return{status:n.status,stdout:typeof n.stdout=="string"?n.stdout:"",error:n.error}},lN=async(t,e,n)=>{let r=await fetch(t,{method:"POST",headers:e,body:"{}",signal:AbortSignal.timeout(n)});return{status:r.status,body:await r.text()}},cN=aN,dN=lN});import{randomUUID as iE}from"node:crypto";import{mkdirSync as EN,readFileSync as Kd,realpathSync as vN,renameSync as wN,rmSync as Vd,statSync as rE,writeFileSync as oE}from"node:fs";import{homedir as TN}from"node:os";import{join as zd}from"node:path";import{setTimeout as bN}from"node:timers/promises";function Zd(t){return zd(t.CLAUDE_CONFIG_DIR??zd(t.HOME??TN(),".claude"),".credentials.json")}function Yd(t){let e=JSON.parse(Kd(t,"utf8"));if(!e||typeof e!="object"||Array.isArray(e))throw new Error("invalid credential document");return e}function Qd(t){let e=t.claudeAiOauth;return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function aE(t){if(t.CLAUDE_CODE_OAUTH_TOKEN)return{oauth:{accessToken:t.CLAUDE_CODE_OAUTH_TOKEN}};let e=Zd(t);try{let n=Qd(Yd(e));return typeof n?.accessToken=="string"&&n.accessToken?{oauth:n,path:vN(e)}:{error:"not_claude_ai_subscriber"}}catch(n){return n.code==="ENOENT"?{error:t.ANTHROPIC_API_KEY?"not_claude_ai_subscriber":"no_credentials_found"}:{error:"credentials_unreadable"}}}function Ko(t){return typeof t.expiresAt=="number"&&Date.now()+RN>=t.expiresAt}function sE(t,e){return t.accessToken===e.accessToken&&t.refreshToken===e.refreshToken}async function IN(t,e){let n=`${t}.lmctl-refresh.lock`,r=zd(n,"owner.json"),s=iE();for(;;){e.throwIfAborted();try{EN(n,{mode:448});try{oE(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(i){throw Vd(n,{recursive:!0,force:!0}),i}return()=>{try{JSON.parse(Kd(r,"utf8")).token===s&&Vd(n,{recursive:!0,force:!0})}catch{}}}catch(i){if(i.code!=="EEXIST")throw i;let o=!1;try{let a=JSON.parse(Kd(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){o=l.code==="ESRCH"}else o=Date.now()-rE(n).mtimeMs>6e4}catch{try{o=Date.now()-rE(n).mtimeMs>6e4}catch{continue}}if(o)throw new Error("refresh_lock_stale");await bN(50,void 0,{signal:e})}}}async function lE(t,e){if(!t.path||typeof t.oauth?.refreshToken!="string"||!t.oauth.refreshToken)throw new Error("no_refresh_token");let n=await IN(t.path,e);try{let r=Qd(Yd(t.path));if(!r||typeof r.accessToken!="string")throw new Error("credentials_changed");if(!sE(r,t.oauth)&&!Ko(r))return r;if(typeof r.refreshToken!="string"||!r.refreshToken)throw new Error("no_refresh_token");let s=await fetch(kN,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:r.refreshToken,client_id:SN})});if(!s.ok)throw new Error(`refresh_http_${s.status}`);let i=await s.json();if(!i||typeof i.access_token!="string"||!/^\S+$/.test(i.access_token)||typeof i.expires_in!="number"||!Number.isFinite(i.expires_in)||i.expires_in<=0||i.refresh_token!==void 0&&(typeof i.refresh_token!="string"||!/^\S+$/.test(i.refresh_token)))throw new Error("invalid_refresh_response");let o=Math.floor(Date.now()+i.expires_in*1e3);if(!Number.isSafeInteger(o)||o<=Date.now())throw new Error("invalid_refresh_response");let a=Yd(t.path),l=Qd(a);if(!l||!sE(r,l)){if(l&&typeof l.accessToken=="string"&&!Ko(l))return l;throw new Error("credentials_changed")}let c={...l,accessToken:i.access_token,refreshToken:i.refresh_token??r.refreshToken,expiresAt:o,...typeof i.scope=="string"?{scopes:i.scope.split(/\s+/).filter(Boolean)}:{}},d=`${t.path}.${iE()}.tmp`;try{oE(d,JSON.stringify({...a,claudeAiOauth:c}),{flag:"wx",mode:384}),wN(d,t.path)}finally{Vd(d,{force:!0})}return c}finally{n()}}var SN,kN,RN,cE=O(()=>{"use strict";SN="9d1c250a-e61b-44d9-88ed-5944d1962f5e",kN="https://console.anthropic.com/v1/oauth/token",RN=3e5});import{spawnSync as mE}from"node:child_process";function CN(t){let e=String(t??"").toLowerCase();return e.includes("session")||e.includes("five")||e.includes("5h")?"five_hour":e.includes("week")||e.includes("seven")||e.includes("7d")?"weekly":e.includes("month")||e.includes("30d")?"monthly":"unknown"}function pE(t){return Object.fromEntries(Object.entries(t).filter(([e])=>e!=="CLAUDECODE"))}function NN(t){try{let e=mE("claude",["--version"],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],env:pE(t)}),n=typeof e.stdout=="string"?e.stdout.trim().split(/\s+/)[0]:"";if(n)return`claude-code/${n}`}catch{}return"claude-code/unknown"}function dt(t,e,n,r="claude_oauth_api",s){return ze("claude",t,e,n,r,void 0,s)}function ON(t){let e=t.get("retry-after");if(!e)return;let n=Number.parseInt(e,10);return Number.isFinite(n)?n:void 0}function LN(t){if(!t)return;let e=/^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)?(?:\s*\(([^)]+)\))?$/i.exec(t.trim());if(!e)return;let n=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"].indexOf(e[1].slice(0,3).toLowerCase());if(n<0)return;let r=Number(e[3]),s=Number(e[4]??0);(e[5]??"").toLowerCase()==="pm"&&r!==12&&(r+=12),(e[5]??"").toLowerCase()==="am"&&r===12&&(r=0);let i=new Date(Date.UTC(new Date().getUTCFullYear(),n,Number(e[2]),r,s));return Number.isFinite(i.getTime())?Math.floor(i.getTime()/1e3):void 0}function PN(t){let e=[];for(let n of t.split(/\r?\n/)){let r=MN.exec(n.trim());if(!r)continue;let s=r[1].trim(),o=s.toLowerCase()==="session",a=/\(([^)]+)\)/.exec(s)?.[1]?.trim()??s,l=o?"session":a.toLowerCase()==="all models"?"week-all-models":`week-scoped-${a}`,c=o?"five_hour":"weekly";e.push(Ve({bucket_id:l,group_name:o?"session":"weekly",window_type:c,used_fraction:Rt(Number(r[2]),"percent"),raw_value:Number(r[2]),raw_scale:"used_percent",resets_at:LN(r[3])}))}return e.sort((n,r)=>String(n.window_type).localeCompare(String(r.window_type))||String(n.bucket_id).localeCompare(String(r.bucket_id)))}function DN(t){let e={},n;for(let r of t.split(/\r?\n/)){let s=/^Last\s+(\S+)\s*[·-]\s*(\d+)\s+requests?\s*[·-]\s*(\d+)\s+sessions?\s*$/.exec(r.trim());if(s){n={requests:Number(s[2]),sessions:Number(s[3])},e[`window_${s[1].toLowerCase()}`]=n;continue}let i=/^\s+(\d+)%\s+of your usage\s+(.+?)\s*$/.exec(r);if(!i||!n)continue;let o=i[2].toLowerCase(),a=o.includes(">150k context")?"pct_high_context":o.includes("active for 8+ hours")?"pct_long_sessions":o.includes("subagent-heavy")?"pct_subagent_heavy":o.includes("ran in parallel")?"pct_parallel_sessions":void 0;a&&(n[a]=Number(i[1]))}return e}function FN(t,e){let n=t&&typeof t=="object"?t:void 0,r=e&&typeof e=="object"?e:void 0,s=!!(n?.limit||n?.used||n?.percent!==void 0);if(!s&&(!r||r.is_enabled===!1))return;let i=s&&n?.limit&&typeof n.limit=="object"?n.limit:{},o=s&&n?.used&&typeof n.used=="object"?n.used:{},a=f=>{let w=typeof f=="number"?f:typeof f=="string"&&f.trim()!==""?Number(f):NaN;return Number.isSafeInteger(w)&&w>=0&&w<=9?w:void 0},l=f=>{let w=typeof f=="number"?f:typeof f=="string"&&f.trim()!==""?Number(f):NaN;return Number.isFinite(w)?w:void 0},c=a(i.exponent??r?.decimal_places??2),d=a(o.exponent??r?.decimal_places??2),u=s?i.amount_minor:r?.monthly_limit,m=s?o.amount_minor:r?.used_credits,p=(f,w,g)=>w===void 0||g!==void 0&&g!=="USD"||l(f)===void 0?void 0:(l(f)/10**w).toFixed(2),h=Rt(s?n?.percent:r?.utilization,"percent"),_=s?n?.spend_limit_reached??r?.spend_limit_reached:r?.spend_limit_reached,y={limit_usd:p(u,c,i.currency??r?.currency),used_usd:p(m,d,o.currency??r?.currency),remaining_fraction:h==null?void 0:Math.max(0,1-h),resets_at_iso:s?n?.resets_at:void 0,...typeof _=="boolean"?{reached:_}:{}};return Object.values(y).every(f=>f==null)?void 0:y}async function uE(t,e,n,r={}){try{let s=mE("claude",["-p","/usage"],{encoding:"utf8",timeout:Math.max(n,60)*1e3,input:"",env:pE(e),maxBuffer:16777216}),i=typeof s.stdout=="string"?s.stdout:"";Ye(r,"claude_cli_print",i,[t.accessToken,t.refreshToken]);let o=PN(i);if(!o.length)return;let a=DN(i);return ke("claude",Re.ok,{source:"claude_cli_print",account_id:null,plan_type:t.subscriptionType??t.rateLimitTier??null,ordinary_usage_allowed:null,buckets:o,...Object.keys(a).length?{characteristics:a}:{}})}catch{return}}async function fE({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s=aE(e);if(s.error==="not_claude_ai_subscriber")return dt(Re.notApplicable,s.error,"no OAuth subscription credentials; API-key accounts have no subscription quota endpoint");if(s.error==="no_credentials_found")return dt(Re.unavailable,"credentials_missing",`credentials file not found: ${Zd(e)}`);if(s.error)return dt(Re.expired,"oauth_token_expired_or_invalid",s.error);let i=s.oauth,o=Array.isArray(i.scopes)?i.scopes:[];if(o.length&&!o.includes(dE))return dt(Re.notApplicable,"not_claude_ai_subscriber",`credential lacks the ${dE} scope required by the usage endpoint`);let a=new AbortController,l=setTimeout(()=>a.abort(),t*1e3),c,d;try{let f=!1,w=async()=>{try{i=await lE({...s,oauth:i},a.signal),f=!0}catch(E){let b=E instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(E.message)?E.message:"refresh_failed";if(b==="refresh_http_429")return dt(Re.throttled,"rate_limited","Claude OAuth refresh was rate limited; try again later");if(b==="refresh_lock_stale")return dt(Re.expired,"oauth_refresh_locked","a previous Claude credential refresh exited without releasing its lock; remove the stale .credentials.json.lmctl-refresh.lock directory before retrying");let C=b==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(b);return dt(C?Re.expired:Re.unavailable,C?"oauth_token_expired_or_invalid":"oauth_refresh_failed",`Claude OAuth refresh failed (${b})${C?"; renew Claude login":"; try again later"}`)}};if(Ko(i)){let E=await w();if(E)return E}let g=()=>fetch(`${xN}/api/oauth/usage`,{headers:{Authorization:`Bearer ${i.accessToken}`,"anthropic-beta":AN,"Content-Type":"application/json","User-Agent":NN(e)},signal:a.signal});if(c=await g(),d=await c.text(),Ye({debug:n,onRawResponse:r},"claude_oauth_api",d,[i.accessToken,i.refreshToken],c.status),c.status===401&&!f&&s.path&&i.refreshToken){let E=await w();if(E)return E;c=await g(),d=await c.text(),Ye({debug:n,onRawResponse:r},"claude_oauth_api",d,[i.accessToken,i.refreshToken],c.status)}}catch(f){let w=await uE(i,e,t,{debug:n,onRawResponse:r});return w||dt(Re.unavailable,"request_failed",`${f instanceof Error?f.name:"request failed"} (CLI fallback also unavailable)`)}finally{clearTimeout(l)}let u=(...f)=>Er(dt(...f),d,[String(i.accessToken??""),String(i.refreshToken??"")]);if(c.status===401)return u(Re.expired,"oauth_token_expired_or_invalid","HTTP 401 from usage endpoint");if(c.status===403)return u(Re.notApplicable,"not_claude_ai_subscriber","HTTP 403 from usage endpoint (account is not usage-eligible)");if(c.status===429){let f=ON(c.headers),w=await uE(i,e,t,{debug:n,onRawResponse:r});return w||u(Re.throttled,"rate_limited",`usage endpoint rate limited${f==null?"":`; retry after ${f}s`}`,"claude_oauth_api",f)}if(c.status!==200)return u(Re.unavailable,`http_${c.status}`,"usage endpoint returned an unexpected status");let m;try{m=JSON.parse(d)}catch{return dt(Re.unavailable,"malformed_response","SyntaxError: malformed JSON")}if(!m||typeof m!="object"||Array.isArray(m))return dt(Re.unavailable,"malformed_response","response was not an object");let p=m,h=Array.isArray(p.limits)?p.limits:[],_=h.length?h.flatMap(f=>{if(!f||typeof f!="object")return[];let w=f.kind,g=CN(w==="session"?"session":w),E=f.scope?.model?.display_name,b=w==="session"?"session":w==="weekly_all"?"week-all-models":`week-scoped-${E||w}`;return[Ve({bucket_id:b,group_name:w==="session"?"session":"weekly",window_type:g,used_fraction:Rt(f.percent,"percent"),resets_at_iso:f.resets_at,raw_value:f.percent,raw_scale:"used_percent"})]}):["five_hour","seven_day"].flatMap(f=>{let w=p[f];return!w||typeof w!="object"?[]:[Ve({bucket_id:f==="five_hour"?"session":"week-all-models",group_name:f==="five_hour"?"session":"weekly",window_type:f==="five_hour"?"five_hour":"weekly",used_fraction:Rt(w.utilization,"percent"),resets_at_iso:w.resets_at,raw_value:w.utilization,raw_scale:"used_percent"})]}),y=FN(p.spend,p.extra_usage);return ke("claude",Re.ok,{source:"claude_oauth_api",account_id:null,plan_type:i.subscriptionType??i.rateLimitTier??null,ordinary_usage_allowed:null,buckets:_.sort((f,w)=>String(f.window_type).localeCompare(String(w.window_type))||String(f.bucket_id).localeCompare(String(w.bucket_id))),...y?{spend_control:y}:{}})}var xN,AN,dE,Re,MN,gE=O(()=>{"use strict";Ht();cE();Ht();xN="https://api.anthropic.com",AN="oauth-2025-04-20",dE="user:profile";Re={ok:"ok",unavailable:"provider_unavailable",expired:"auth_expired",notApplicable:"not_applicable",throttled:"reader_throttled"};MN=/^Current\s+(.+?):\s*(\d+(?:\.\d+)?)\s*%\s*used(?:\s*[·-]\s*resets\s*(.+?))?$/});import{randomUUID as yE}from"node:crypto";import{mkdirSync as $N,readFileSync as eu,realpathSync as jN,renameSync as UN,rmSync as tu,statSync as hE,writeFileSync as EE}from"node:fs";import{homedir as HN}from"node:os";import{join as nu}from"node:path";import{setTimeout as BN}from"node:timers/promises";function Ss(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function su(t){if(t.CODEX_AUTH_PATH)return t.CODEX_AUTH_PATH;let e=t.CODEX_HOME||nu(t.HOME||HN(),".codex");return nu(e,"auth.json")}function ru(t){let e=Ss(JSON.parse(eu(t,"utf8")));if(!e)throw new Error("invalid credential document");return e}function vE(t){if(t.CODEX_ACCESS_TOKEN)return{tokens:{access_token:t.CODEX_ACCESS_TOKEN,account_id:t.CODEX_ACCOUNT_ID}};let e=su(t);try{let n=Ss(ru(e).tokens);return typeof n?.access_token=="string"&&n.access_token?{tokens:n,path:jN(e)}:{error:"credentials_missing"}}catch(n){return{error:n.code==="ENOENT"?"credentials_missing":"credentials_unreadable"}}}function _E(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.id_token===e.id_token&&t.account_id===e.account_id}async function qN(t,e){let n=`${t}.lmctl-refresh.lock`,r=nu(n,"owner.json"),s=yE();for(;;){e.throwIfAborted();try{$N(n,{mode:448});try{EE(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(i){throw tu(n,{recursive:!0,force:!0}),i}return()=>{try{JSON.parse(eu(r,"utf8")).token===s&&tu(n,{recursive:!0,force:!0})}catch{}}}catch(i){if(i.code!=="EEXIST")throw i;let o=!1;try{let a=JSON.parse(eu(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){o=l.code==="ESRCH"}else o=Date.now()-hE(n).mtimeMs>6e4}catch{try{o=Date.now()-hE(n).mtimeMs>6e4}catch{continue}}if(o)throw new Error("refresh_lock_stale");await BN(50,void 0,{signal:e})}}}async function wE(t,e){if(!t.path||typeof t.tokens?.refresh_token!="string"||!t.tokens.refresh_token)throw new Error("no_refresh_token");let n=await qN(t.path,e);try{let r=ru(t.path),s=Ss(r.tokens);if(!s||typeof s.access_token!="string")throw new Error("credentials_changed");if(!_E(s,t.tokens)&&typeof s.access_token=="string")return s;if(typeof s.refresh_token!="string"||!s.refresh_token)throw new Error("no_refresh_token");let i=await fetch(WN,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:s.refresh_token,client_id:XN})});if(!i.ok)throw new Error(`refresh_http_${i.status}`);let o=Ss(await i.json());if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||o.refresh_token!==void 0&&(typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token))||o.id_token!==void 0&&(typeof o.id_token!="string"||!/^\S+$/.test(o.id_token)))throw new Error("invalid_refresh_response");let a=ru(t.path),l=Ss(a.tokens);if(!l||!_E(s,l)){if(l&&typeof l.access_token=="string")return l;throw new Error("credentials_changed")}let c={...l,access_token:o.access_token,...o.refresh_token===void 0?{}:{refresh_token:o.refresh_token},...o.id_token===void 0?{}:{id_token:o.id_token}},d={...a,tokens:c,last_refresh:new Date().toISOString()},u=`${t.path}.${yE()}.tmp`;try{EE(u,JSON.stringify(d),{flag:"wx",mode:384}),UN(u,t.path)}finally{tu(u,{force:!0})}return c}finally{n()}}var WN,XN,TE=O(()=>{"use strict";WN="https://auth.openai.com/oauth/token",XN="app_EMoamEEZ73f0CkXaXp7hrann"});function It(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function bE(t){let e=typeof t=="number"?t:Number(t);if(!Number.isFinite(e)||e<=0)return"unknown";let n=e/60;return n>=240&&n<=360?"five_hour":n>=9e3&&n<=11500?"weekly":n>=38e3&&n<=46e3?"monthly":"unknown"}function SE(t){return t==="five_hour"?"5h":t==="weekly"?"weekly":t==="monthly"?"monthly":"window"}function KN(t){if(It(t))return{has_credits:t.has_credits,unlimited:t.unlimited,balance:t.balance}}function VN(t){let e=[],n=It(t.rate_limit)?t.rate_limit:{},r=typeof n.allowed=="boolean"?n.allowed:void 0,s=typeof n.limit_reached=="boolean"?n.limit_reached:void 0;for(let o of["primary_window","secondary_window"]){let a=It(n[o])?n[o]:void 0;if(!a)continue;let l=bE(a.limit_window_seconds);e.push(Ve({bucket_id:`codex-${SE(l)}`,group_name:"codex",window_type:l,used_fraction:Rt(a.used_percent,"percent"),resets_at:a.reset_at,raw_value:a.used_percent,raw_scale:"used_percent",...r===void 0?{}:{allowed:r},...s===void 0?{}:{limit_reached:s}}))}let i=Array.isArray(t.additional_rate_limits)?t.additional_rate_limits:[];for(let o of i){if(!It(o))continue;let a=It(o.rate_limit)?o.rate_limit:{},l=typeof o.limit_name=="string"?o.limit_name:void 0,c=typeof o.metered_feature=="string"?o.metered_feature:void 0,d=c||l||"additional",u=typeof a.allowed=="boolean"?a.allowed:void 0,m=typeof a.limit_reached=="boolean"?a.limit_reached:void 0;for(let p of["primary_window","secondary_window"]){let h=It(a[p])?a[p]:void 0;if(!h)continue;let _=bE(h.limit_window_seconds);e.push(Ve({bucket_id:`${d}-${SE(_)}`,group_name:l||d,window_type:_,used_fraction:Rt(h.used_percent,"percent"),resets_at:h.reset_at,raw_value:h.used_percent,raw_scale:"used_percent",...l===void 0?{}:{limit_name:l},...c===void 0?{}:{metered_feature:c},...u===void 0?{}:{allowed:u},...m===void 0?{}:{limit_reached:m}}))}}return e.sort((o,a)=>String(o.group_name??"").localeCompare(String(a.group_name??""))||String(o.bucket_id).localeCompare(String(a.bucket_id)))}function zN(t){let e=It(t.rate_limit)?t.rate_limit:{},n=typeof e.allowed=="boolean"?e.allowed:void 0,r=It(t.spend_control)?t.spend_control:void 0,s=It(t.credits)?t.credits:void 0;return ke("codex","ok",{source:"codex_http",account_id:t.account_id,plan_type:t.plan_type,...n===void 0?{}:{ordinary_usage_allowed:n},buckets:VN(t),...s?{credits:KN(s)}:{},...r?{spend_control:r}:{}})}async function kE(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s}=t,i=vE(n),o=i.tokens;if(!o||typeof o.access_token!="string")return ke("codex","provider_unavailable",{source:"codex_http",reason:"credentials_missing",detail:`no access_token in ${su(n)} (or $CODEX_ACCESS_TOKEN)`});let a=new AbortController,l=setTimeout(()=>a.abort(),Math.ceil(e*1e3)),c=o.access_token,d=new Set([o.access_token,o.refresh_token,o.id_token].filter(u=>typeof u=="string"&&!!u));try{let u=typeof o.account_id=="string"?o.account_id:void 0,m=typeof o.refresh_token=="string"?o.refresh_token:void 0,p=typeof o.id_token=="string"?o.id_token:void 0,h="",_=()=>[...d],y=(C,I)=>Er(ke("codex",C,I),h,_()),f=!1,w=async()=>{if(!(f||!i.path||typeof o.refresh_token!="string"))try{let C=await wE({...i,tokens:{...o,refresh_token:m}},a.signal);typeof C.access_token=="string"&&(d.add(C.access_token),c=C.access_token),u=typeof C.account_id=="string"?C.account_id:u,typeof C.refresh_token=="string"&&(d.add(C.refresh_token),m=C.refresh_token),typeof C.id_token=="string"&&(d.add(C.id_token),p=C.id_token),f=!0;return}catch(C){let I=C instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(C.message)?C.message:"refresh_failed",N=I==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(I);return ke("codex",N?"auth_expired":"provider_unavailable",{source:"codex_http",reason:N?"oauth_token_expired_or_invalid":"oauth_refresh_failed",detail:`Codex OAuth refresh failed (${I})${N?"; renew Codex login":"; try again later"}`})}},g=()=>{let C={Authorization:`Bearer ${c}`,"User-Agent":JN,"Content-Type":"application/json",Accept:"application/json"};u&&(C["ChatGPT-Account-Id"]=u);let I=(n.CODEX_BASE_URL||GN).replace(/\/$/,"");return fetch(`${I}/wham/usage`,{headers:C,signal:a.signal})},E=await g();if(h=await E.text(),Ye({debug:r,onRawResponse:s},"codex_http",h,_(),E.status),E.status===401&&i.path&&m){let C=await w();if(C)return C;E=await g(),h=await E.text(),Ye({debug:r,onRawResponse:s},"codex_http",h,_(),E.status)}if(E.status===401)return y("auth_expired",{source:"codex_http",reason:"oauth_token_expired_or_invalid",detail:"HTTP 401 from the codex usage endpoint"});if(E.status===429){let C=E.headers.get("retry-after"),I=C===null?void 0:Number.parseInt(C,10);return y("reader_throttled",{source:"codex_http",reason:"throttled",detail:"HTTP 429 from codex usage endpoint",...I!==void 0&&Number.isFinite(I)&&I>=0?{retry_after_seconds:I}:{}})}if(!E.ok)return y("provider_unavailable",{source:"codex_http",reason:`http_${E.status}`,detail:"codex usage endpoint returned an unexpected status"});let b;try{b=JSON.parse(h)}catch(C){return ke("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:yr(String(C),d)})}return It(b)?zN(b):ke("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:"response was not an object"})}catch(u){let m=u instanceof Error?`${u.name}: ${u.message}`:String(u);return ke("codex","provider_unavailable",{source:"codex_http",reason:"http_request_failed",detail:yr(m,d)})}finally{clearTimeout(l)}}var GN,JN,RE=O(()=>{"use strict";Ht();TE();Ht();GN="https://chatgpt.com/backend-api",JN="codex-cli"});import{createHash as YN,randomUUID as QN}from"node:crypto";import{readFileSync as NE,openSync as ZN,fsyncSync as eO,closeSync as tO,mkdirSync as IE,writeFileSync as OE,renameSync as nO,rmSync as rO,rmdirSync as sO,statSync as iu,utimesSync as iO}from"node:fs";import{homedir as oO}from"node:os";import{basename as aO,dirname as lO,join as Vo}from"node:path";import{setTimeout as LE}from"node:timers/promises";function dO(t){let e;try{e=NE(t,"utf8")}catch(s){if(s.code==="ENOENT")return{};throw new Error("config_unreadable")}let n={},r="other";for(let s of e.split(/\r?\n/)){let i=/^\s*\[providers\.(?:"managed:kimi-code"|'managed:kimi-code')(\.oauth)?\]\s*(?:#.*)?$/.exec(s);if(i){r=i[1]?"oauth.":"";continue}if(/^\s*\[/.test(s)){if(s.includes("managed:kimi-code"))throw new Error("config_format_unsupported");r="other";continue}if(r==="other")continue;if(/^\s*oauth\s*=/.test(s))throw new Error("config_format_unsupported");let o=/^\s*(base_url|oauth_host|storage|key)\s*=\s*("(?:[^"\\]|\\.)*"|'[^']*')\s*(?:#.*)?$/.exec(s);if(!o&&/^\s*(base_url|oauth_host|storage|key)\s*=/.test(s))throw new Error("config_malformed");if(o)try{n[r+o[1]]=o[2].startsWith('"')?JSON.parse(o[2]):o[2].slice(1,-1)}catch{throw new Error("config_malformed")}}return n}function zo(t){let e;try{e=JSON.parse(NE(t,"utf8"))}catch(n){throw new Error(n.code==="ENOENT"?"credentials_missing":"credentials_malformed")}if(e&&typeof e=="object"&&e.access_token===""&&e.refresh_token==="")throw new Error("credentials_revoked");if(!e||typeof e!="object"||Array.isArray(e)||typeof e.access_token!="string"||!e.access_token.trim())throw new Error("credentials_malformed");return e}function ME(t){let e=t.KIMI_CODE_HOME??Vo(t.HOME??oO(),".kimi-code"),n=dO(t.KIMI_CODE_CONFIG_PATH??Vo(e,"config.toml")),r=t.KIMI_CODE_BASE_URL!==void 0||t.KIMI_CODE_OAUTH_HOST!==void 0||t.KIMI_OAUTH_HOST!==void 0,s=AE(t.KIMI_CODE_BASE_URL??n.base_url??xE),i=AE(t.KIMI_CODE_OAUTH_HOST??t.KIMI_OAUTH_HOST??(r?ou:n["oauth.oauth_host"]??ou)),o=s===xE&&i===ou?"kimi-code":`kimi-code-env-${YN("sha256").update(JSON.stringify({oauthHost:i,baseUrl:s})).digest("hex").slice(0,16)}`;if(!t.KIMI_CREDENTIALS_PATH&&!r&&n["oauth.key"]===`oauth/${o}`&&n["oauth.storage"]&&n["oauth.storage"]!=="file")throw new Error("credential_storage_unsupported");let a=t.KIMI_CREDENTIALS_PATH??Vo(e,"credentials",`${o}.json`),l=zo(a),c=a,d=aO(a,".json");return{home:e,path:c,lockTarget:Vo(e,"oauth",d),baseUrl:s,oauthHost:i,token:l}}function Yo(t){if(typeof t.expires_at!="number")return!1;let e=typeof t.expires_in=="number"?t.expires_in:0;return t.expires_at-Date.now()/1e3<Math.max(300,e*.5)}function CE(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.expires_at===e.expires_at&&t.expires_in===e.expires_in}async function uO(t,e){IE(lO(t),{recursive:!0}),OE(t,"",{flag:"a",mode:384});let n=`${t}.lock`;for(;;){if(e.aborted)throw new Error("refresh_locked");try{IE(n);break}catch(o){if(o.code!=="EEXIST")throw new Error("refresh_lock_failed");try{if(Date.now()-iu(n).mtimeMs>5e3)throw new Error("refresh_lock_stale")}catch(a){if(a.message==="refresh_lock_stale")throw a}try{await LE(50,void 0,{signal:e})}catch{throw new Error("refresh_locked")}}}let r=iu(n),s=()=>{let o;try{o=iu(n)}catch{throw new Error("refresh_lock_lost")}if(o.ino!==r.ino||o.dev!==r.dev)throw new Error("refresh_lock_lost")},i=setInterval(()=>{try{s();let o=new Date;iO(n,o,o)}catch{}},1e3);return i.unref(),{assertOwned:s,release(){clearInterval(i);try{s(),sO(n)}catch{}}}}async function PE(t,e){if(typeof t.token.refresh_token!="string"||!t.token.refresh_token)throw new Error("no_refresh_token");let n=await uO(t.lockTarget,e);try{let r=zo(t.path);if(!CE(r,t.token)&&!Yo(r))return r;if(typeof r.refresh_token!="string"||!r.refresh_token)throw new Error("no_refresh_token");let s;for(let u=0;u<3;u++){try{if(s=await fetch(`${t.oauthHost}/api/oauth/token`,{method:"POST",signal:e,headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json","User-Agent":"lmctl"},body:new URLSearchParams({client_id:cO,grant_type:"refresh_token",refresh_token:r.refresh_token})}),![429,500,502,503,504].includes(s.status)||u===2)break;await s.body?.cancel()}catch{if(e.aborted||u===2)throw new Error("refresh_request_failed")}await LE(1e3*2**u,void 0,{signal:e})}if(!s)throw new Error("refresh_request_failed");if(!s.ok){try{let u=zo(t.path);if(u.refresh_token!==r.refresh_token)return u}catch{}throw new Error(`refresh_http_${s.status}`)}let i=await s.json(),o=Number(i?.expires_in);if(!i||typeof i.access_token!="string"||!/^\S+$/.test(i.access_token)||typeof i.refresh_token!="string"||!/^\S+$/.test(i.refresh_token)||!Number.isFinite(o)||o<=0)throw new Error("invalid_refresh_response");let a=Math.floor(Date.now()/1e3)+o;if(!Number.isSafeInteger(a))throw new Error("invalid_refresh_response");n.assertOwned();let l=zo(t.path);if(!CE(l,r)){if(!Yo(l))return l;throw new Error("credentials_changed")}let c={...l,access_token:i.access_token,refresh_token:i.refresh_token,expires_at:a,expires_in:o,...typeof i.scope=="string"?{scope:i.scope}:{},...typeof i.token_type=="string"?{token_type:i.token_type}:{}},d=`${t.path}.${QN()}.tmp`;try{let u=ZN(d,"wx",384);try{OE(u,JSON.stringify(c,null,2)+`
2173
+ `),eO(u)}finally{tO(u)}n.assertOwned(),nO(d,t.path)}finally{rO(d,{force:!0})}return c}finally{n.release()}}var xE,ou,cO,AE,DE=O(()=>{"use strict";xE="https://api.kimi.com/coding/v1",ou="https://auth.kimi.com",cO="17e5f671-d194-4dfb-9706-5516cb48c098",AE=t=>t.trim().replace(/\/+$/,"")});function FE(t){let e=o=>{if(typeof o!="number"&&typeof o!="string"||typeof o=="string"&&o.trim()==="")return;let a=Number(o);return Number.isFinite(a)&&a>=0?a:void 0},n=e(t.limit),r=e(t.used),s=e(t.remaining);if(n===void 0||n<=0||r===void 0&&(s===void 0||s>n))return;let i=r??n-s;return{used:i,limit:n,remaining:Math.max(0,n-i)}}async function $E({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s;try{s=ME(e)}catch(_){let y=_ instanceof Error&&/^(credentials_missing|credentials_malformed|credentials_revoked|config_unreadable|config_malformed|config_format_unsupported|credential_storage_unsupported)$/.test(_.message)?_.message:"credentials_unreadable";return ze("kimi",y==="credentials_revoked"?"auth_expired":"provider_unavailable",y,y==="credentials_revoked"?"Kimi login was revoked; run kimi login":y.replaceAll("_"," "),"kimi_http")}let i=s.token,o=new AbortController,a=setTimeout(()=>o.abort(),t*1e3),l,c;try{let _=!1,y=async()=>{i=await PE({...s,token:i},o.signal),_=!0};Yo(i)&&await y();let f=()=>fetch(`${s.baseUrl}/usages`,{headers:{Authorization:`Bearer ${i.access_token}`,Accept:"application/json"},signal:o.signal});l=await f(),c=await l.text(),Ye({debug:n,onRawResponse:r},"kimi_http",c,[i.access_token,i.refresh_token],l.status),l.status===401&&!_&&i.refresh_token&&(await y(),l=await f(),c=await l.text(),Ye({debug:n,onRawResponse:r},"kimi_http",c,[i.access_token,i.refresh_token],l.status))}catch(_){let y=_ instanceof Error&&/^(no_refresh_token|credentials_changed|credentials_revoked|invalid_refresh_response|refresh_locked|refresh_lock_stale|refresh_lock_failed|refresh_lock_lost|refresh_request_failed|refresh_http_\d+)$/.test(_.message)?_.message:"request_failed",f=y==="credentials_revoked"||y==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(y),w=y==="refresh_lock_stale"?"Kimi refresh lock is stale; run the native Kimi CLI to recover its lock, or verify no refresh is active before removing the .lock directory":f?`Kimi credential renewal failed (${y}); run kimi login`:`Kimi quota request failed (${y})`;return ze("kimi",f?"auth_expired":"provider_unavailable",y,w,"kimi_http")}finally{clearTimeout(a)}let d=(_,y,f)=>Er(ze("kimi",_,y,y,"kimi_http",[],f),c,[i.access_token]);if(l.status===401)return d("auth_expired","HTTP 401 from Kimi usage endpoint");if(l.status===403)return d("not_applicable","HTTP 403 from Kimi usage endpoint");if(l.status===429){let _=Qy(l.headers);return d("reader_throttled","HTTP 429 from Kimi usage endpoint",_)}if(l.status!==200)return d("provider_unavailable",`HTTP ${l.status} from Kimi usage endpoint`);let u;try{u=JSON.parse(c)}catch{return ze("kimi","provider_unavailable","malformed_response","SyntaxError: malformed JSON")}if(!u||typeof u!="object")return ze("kimi","provider_unavailable","malformed_response","response was not an object");let m=[],p=new Set;function h(_){let y=String(_.bucket_id),f=y,w=2;for(;p.has(y);)y=`${f}-${w}`,w++;p.add(y),_.bucket_id=y,m.push(Ve(_))}if(Array.isArray(u.limits))for(let _ of u.limits){if(!_||typeof _!="object")continue;let y=_.window,f=_.detail;if(!y||typeof y!="object"||!f||typeof f!="object")continue;let w=0;if(y.timeUnit==="TIME_UNIT_MINUTE")w=Number(y.duration);else if(y.timeUnit==="TIME_UNIT_HOUR")w=Number(y.duration)*60;else if(y.timeUnit==="TIME_UNIT_DAY")w=Number(y.duration)*1440;else if(y.timeUnit==="TIME_UNIT_WEEK")w=Number(y.duration)*10080;else if(y.timeUnit==="TIME_UNIT_MONTH")w=Number(y.duration)*43200;else continue;let g=zy(w),E="window";g==="five_hour"&&(E="5h"),g==="weekly"&&(E="weekly"),g==="monthly"&&(E="monthly");let b=FE(f);if(!b)continue;let{used:C,limit:I,remaining:N}=b;h({bucket_id:`kimi-${E}`,window_type:g,used_fraction:Pe(C/I),remaining_fraction:Pe(N/I),resets_at_iso:f.resetTime,raw_value:C,raw_scale:"count"})}if(u.usage&&typeof u.usage=="object"){let _=FE(u.usage);_&&h({bucket_id:"kimi-weekly",window_type:"weekly",used_fraction:Pe(_.used/_.limit),remaining_fraction:Pe(_.remaining/_.limit),resets_at_iso:u.usage.resetTime,raw_value:_.used,raw_scale:"count"})}if(u.usages&&typeof u.usages=="object"){let _=[{key:"limit_5h",id:"kimi-5h",type:"five_hour"},{key:"limit_7d",id:"kimi-weekly",type:"weekly"},{key:"limit_month_total",id:"kimi-monthly",type:"monthly"},{key:"limit_month_code",id:"kimi-monthly-code",type:"monthly"}];for(let{key:y,id:f,type:w}of _){let g=u.usages[y];if(!g||typeof g!="object"||g.used_ratio==null||g.used_ratio===""||typeof g.used_ratio=="boolean")continue;let E=Number(g.used_ratio);!Number.isFinite(E)||E<0||p.has(f)||(p.add(f),m.push(Ve({bucket_id:f,window_type:w,used_fraction:Pe(E),resets_at_iso:typeof g.reset_time=="string"&&g.reset_time?g.reset_time:null,raw_value:E,raw_scale:"ratio"})))}}return ke("kimi","ok",{source:"kimi_http",buckets:m})}var jE=O(()=>{"use strict";Ht();DE();Ht()});async function HE(t={}){let e=t.targets??t.providers??["all"];if(!Array.isArray(e)||e.length===0||e.some(a=>typeof a!="string"))return{status:"error",error:"providers must be a non-empty list of provider names",readings:[]};for(let a of e)if(!UE.includes(a))return{status:"error",error:`unknown provider: ${a} (valid targets: ${UE.join(", ")})`,readings:[]};let n=t.timeoutSeconds??mO;if(!Number.isFinite(n)||n<=0)return{status:"error",error:"timeoutSeconds must be a positive finite number",readings:[]};let r=t.env??process.env,s=new Set(e.includes("all")?["codex","agy","claude","kimi"]:e);t.progress?.(`querying ${e.join(" ")} live (timeout ${n}s per provider) ...`);let o=Object.entries({codex:kE,agy:tE,claude:fE,kimi:$E}).filter(([a])=>s.has(a)).map(async([,a])=>{let l=[],c=await a({timeoutSeconds:n,env:r,...t.debug?{debug:t.debug}:{},...t.includeRaw?{onRawResponse:d=>l.push(d)}:{}});return t.includeRaw?{...c,raw_responses:l}:c});try{return{status:"ok",readings:(await Promise.all(o)).filter(Boolean)}}catch(a){return{status:"error",error:String(a),readings:[]}}}var UE,mO,BE=O(()=>{"use strict";nE();gE();RE();jE();UE=["all","codex","agy","claude","kimi"],mO=15});async function pO(t,e={}){try{let n=ue(t);if(n)return n;if(!e||typeof e!="object"||Array.isArray(e))return j("invalid_argument","Ratelimit options must be a map");let{providers:r,provider:s,timeoutSeconds:i=15}=e,o=r??(s===void 0?["all"]:[s]);if(Object.keys(e).some(l=>!Pn("readRatelimits").includes(l))||!Array.isArray(o)||o.some(l=>typeof l!="string"||!l||l.startsWith("-")))return j("invalid_argument","providers must be a list of provider names");if(typeof i!="number"||!Number.isFinite(i)||i<=0)return j("invalid_argument","timeoutSeconds must be a positive finite number");let a=await HE({providers:o.length?[...o]:["all"],timeoutSeconds:i,env:{...t.env},progress:l=>t.onProgress(l+`
2174
+ `,"stderr")});return a.status==="ok"?ce({readings:a.readings}):j("provider",a.error,{readings:[]})}catch(n){return j("provider",G(n),{readings:[]})}}var WE=O(()=>{"use strict";BE();Ut();Xe()});import{basename as fO}from"node:path";function GE(t,e){let n=new Date(e.now.getTime()-fn()).toISOString(),r=VE(t,n).filter(p=>!p.sender.teamfile.startsWith("prompt:")),s=yO(e.sender,r),i=EO(e.sender,r);i!==null&&i.teamfile===e.root&&!qE(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(p=>qE(p,o)),c=l.map(p=>p.at).filter(p=>p!==null).sort((p,h)=>h-p)[0]??null,d=c!==null&&e.now.getTime()-c<gO,u=au(e.sender,r).length;return{stop:l.length>=1&&d&&u>=hO,chain:vO(a)}}function JE(t,e){let n=new Date(e.now.getTime()-fn()).toISOString(),r=VE(t,n),s=au(e.sender,r);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function fn(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return XE;let n=Number(e);return!Number.isFinite(n)||n<=0?XE:n}function KE(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function _O(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function VE(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(_O).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=e).sort((n,r)=>n.at-r.at)}function yO(t,e,n={}){let r=new Map;for(let a of e)r.set(Dn(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([Dn(t)]);for(let a=0;a<64;a+=1){let l=r.get(Dn(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&n.includePromptSender!==!0)break;let d=Dn(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function au(t,e){let n=Dn(t),r=new Set([n]),s=[n],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let c=Dn(l.sender),d=Dn(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),r.has(c)||(r.add(c),s.push(c)),r.has(d)||(r.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function EO(t,e){let n=au(t,e);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function qE(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Dn(t){return`${t.teamfile}\0${t.alias}`}function vO(t){return t.map(e=>`${fO(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var gO,hO,XE,Qo=O(()=>{"use strict";gO=6e4,hO=2,XE=8*60*60*1e3});function wO(t,e){if(Sm(e)!=="dead")return null;let n=`holder process verified not alive; reconciled to aborted (invocation #${e.id}, holder pid ${e.holder_pid??"unknown"} on ${e.holder_host??"unknown"})`;return t.abortTrackedInvocationAndTerminalizeMessage(e.id,{holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat_at:e.last_heartbeat_at},n)}function Zo(t,e,n){let r=t.query(`SELECT id, status, holder_pid, holder_host, started_at, last_heartbeat_at
2175
2175
  FROM tracked_invocation
2176
2176
  WHERE target_teamfile = ?
2177
2177
  AND target_alias = ?
2178
- AND status = 'running'`,e,n),s=0;for(let i of r)pO(t,i)!==null&&(s+=1);return s}var su=O(()=>{"use strict";Qt();En();_n()});function fO(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return qE;let n=Number(e);return!Number.isFinite(n)||n<=0?qE:n}async function gO(t,e,n){try{let r=ht(e,n,t),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof r.provider=="string"&&r.provider.trim()!=="")i=r.provider;else{let c=await F_(s);if(c.length!==1)return null;i=c[0]}let o=await gs(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function GE(t,e,n,r,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??fO(),o=await gO(t,n,r),a=o!==null&&o>=i;return a&&U({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var qE,JE=O(()=>{"use strict";oe();Do();Qt();qE=36e5});function hO(t){return t===null?null:Ne(t)?"live":"dead"}function iu(t){let e=t.nowMs??Date.now(),n=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:hO(t.holderPid),since:t.since,idle_ms:Number.isFinite(n)?Math.max(0,e-n):null}}function _O(t){return(0,KE.formatDuration)(t)}function ou(t){let e=[];return t.idle_ms!==null&&e.push(`active ${_O(t.idle_ms)}`),e.push(`since ${t.since}`),e.push(t.holder_pid===null?"holder_pid=unavailable":`holder_pid=${t.holder_pid}, ${t.holder_liveness}`),`(${e.join("; ")})`}var KE,VE=O(()=>{"use strict";hn();KE=vu(Pd(),1)});import{randomUUID as yO}from"node:crypto";import{hostname as zE,networkInterfaces as EO}from"node:os";function YE(t){let e=(t.now??new Date).toISOString();return{lock_id:yO(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??zE(),holder_ips:t.ips??SO(),started_at:e,last_heartbeat:e}}function QE(t=process.env){return ZE(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,vO)}function TO(t=process.env){return ZE(t.LMCTL_TERMINAL_LOCK_STALE_MS,wO)}function au(t,e={}){let n=e.now??new Date,r=e.localHost??zE(),s=e.staleMs??TO();if(t.holder_host===r)return(e.isProcessAlive??bO)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?n.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Ts(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function ZE(t,e){if(t===void 0||t.trim()==="")return e;let n=t.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?e:r}function bO(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function SO(){let t=new Set;for(let e of Object.values(EO()))for(let n of e??[])n.internal||t.add(n.address);return[...t].sort()}var vO,wO,Yo=O(()=>{"use strict";vO=15e3,wO=12e4});function Qo(t,e=process.env,n){let r=n?.db?.name??Wn(void 0,e),s=e.LMCTL_DB===r?e:{...e,LMCTL_DB:void 0};return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2178
+ AND status = 'running'`,e,n),s=0;for(let i of r)wO(t,i)!==null&&(s+=1);return s}var lu=O(()=>{"use strict";Zt();wn();En()});function TO(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return zE;let n=Number(e);return!Number.isFinite(n)||n<=0?zE:n}async function bO(t,e,n){try{let r=_t(e,n,t),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof r.provider=="string"&&r.provider.trim()!=="")i=r.provider;else{let c=await B_(s);if(c.length!==1)return null;i=c[0]}let o=await ys(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function YE(t,e,n,r,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??TO(),o=await bO(t,n,r),a=o!==null&&o>=i;return a&&U({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var zE,QE=O(()=>{"use strict";oe();jo();Zt();zE=36e5});function SO(t){return t===null?null:Ne(t)?"live":"dead"}function cu(t){let e=t.nowMs??Date.now(),n=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:SO(t.holderPid),since:t.since,idle_ms:Number.isFinite(n)?Math.max(0,e-n):null}}function kO(t){return(0,ZE.formatDuration)(t)}function du(t){let e=[];return t.idle_ms!==null&&e.push(`active ${kO(t.idle_ms)}`),e.push(`since ${t.since}`),e.push(t.holder_pid===null?"holder_pid=unavailable":`holder_pid=${t.holder_pid}, ${t.holder_liveness}`),`(${e.join("; ")})`}var ZE,ev=O(()=>{"use strict";yn();ZE=Su(jd(),1)});import{randomUUID as RO}from"node:crypto";import{hostname as tv,networkInterfaces as IO}from"node:os";function nv(t){let e=(t.now??new Date).toISOString();return{lock_id:RO(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??tv(),holder_ips:t.ips??OO(),started_at:e,last_heartbeat:e}}function rv(t=process.env){return sv(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,xO)}function CO(t=process.env){return sv(t.LMCTL_TERMINAL_LOCK_STALE_MS,AO)}function uu(t,e={}){let n=e.now??new Date,r=e.localHost??tv(),s=e.staleMs??CO();if(t.holder_host===r)return(e.isProcessAlive??NO)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?n.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function ks(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function sv(t,e){if(t===void 0||t.trim()==="")return e;let n=t.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?e:r}function NO(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function OO(){let t=new Set;for(let e of Object.values(IO()))for(let n of e??[])n.internal||t.add(n.address);return[...t].sort()}var xO,AO,ea=O(()=>{"use strict";xO=15e3,AO=12e4});function ta(t,e=process.env,n){let r=n?.db?.name??Gn(void 0,e),s=e.LMCTL_DB===r?e:{...e,LMCTL_DB:void 0};return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2179
2179
  The session marker may be stale or the team may not be registered in this lmctl database.
2180
- Consulted ${Km(r,s)}
2181
- To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function Zo(t,e){let n=kO(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function kO(t,e){let n=t[Fl];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let i of e.listRootTeams()){let o;try{o=ki(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===n&&r.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var lu=O(()=>{"use strict";at();di();Dr()});function ea(t){let e=hl(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var cu=O(()=>{"use strict";Qt()});function du(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=Vt({path:Dd(t)})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&Ne(a.holder_pid)),pollMs:RO,settleMs:IO,maxHoldMs:Un(n),onHold:()=>U({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&U({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function ev(t){let e=xO(t.newMessage,{newMessageFrom:t.newMessageFrom??AO(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=he(),s=0,i=0,o=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,o=Buffer.byteLength(c,"utf8"),i+=o),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};t.signal&&(a.signal=t.signal),t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),t.requireResume!==void 0&&(a.requireResume=t.requireResume),t.bundleSession!==void 0&&(a.bundleSession=t.bundleSession),a.holdOpen=du(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await fs(a);if(t.requireResume&&l.sessionId!==t.receiver.sessionId)throw new Error(`provider session changed: expected ${t.receiver.sessionId}, received ${l.sessionId??"(missing)"}`);return r&&Ge(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:i,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:o,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:l.status==="empty"?{status:"empty",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:{status:"ok",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}}function xO(t,e={}){return[`--- new prompt (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
2182
- `)}function AO(t){return`${t.teamfile}:${t.alias}`}var F2,RO,IO,uu=O(()=>{"use strict";cn();oe();ur();En();hn();_n();F2=60*60*1e3,RO=2e3,IO=5e3});async function ta(t){let e=t.onEvent??(()=>{}),n=CO(t.io,e),r=null,s=null,i=null,o,a,l=null,c=!1,d=null,u=t.prompt;try{let m=await re(n,T=>ht(t.teamfile,t.alias,T));if(t.expectedSession!==void 0&&(m.provider!==t.expectedSession.provider||m.sessionid!==t.expectedSession.sessionid))throw new ve(`session changed for ${m.alias}; expected ${t.expectedSession.provider}:${t.expectedSession.sessionid}, found ${m.provider}:${m.sessionid}`);let p=m.teamfile,h=await re(n,T=>HO(T,t.env??process.env)),_=h.sender,y=await BO(n,{explicitRoot:t.rootFlag,sender:_,receiverTeamfile:p,operatorOrigin:h.origin==="operator"}),f=t.env??process.env,w=await re(n,T=>T.getRootTeam(y)?.name??null);w!==null&&(f.LMBEE_TEAM_NAME=w),i=await MO(n,{receiverTeamfile:p,receiverAlias:m.alias,sender:_,rootTeamfile:y,provider:m.provider,model:m.model,sessionId:m.sessionid,cwd:m.sessiondir,prompt:t.prompt,origin:h.origin,parentInvocationId:Fo(f.LMCTL_INVOCATION_ID)}),o=$O(n,i),i!==null&&(f.LMCTL_INVOCATION_ID=String(i));try{pr(n,it(p),p)}catch{}r={root_teamfile:y,sender_teamfile:_?.teamfile??null,sender_alias:_?.alias??null,receiver_teamfile:p,receiver_alias:m.alias,receiver_provider:m.provider,receiver_session_id:m.sessionid,origin:h.origin,message_type:t.messageType??null};let g=await ov(n,p,m.alias);if(g!==null){let T=Ts(g);return Pn(i,r,t.prompt,T,"unavailable"),d=mu(T,null),{status:"busy",message:T,teamChatLogId:null}}let E=!1;if(t.heldLease!==void 0){let T=t.heldLease;if(!await re(n,x=>{let k=x.getAgentInflight(p,m.alias);return k===null||k.sender_teamfile!==T.row.sender_teamfile||k.sender_alias!==T.row.sender_alias||k.started_at!==T.row.started_at||k.holder_pid!==process.pid?!1:x.heartbeatAgentInflight(T.row,T.leaseId,new Date().toISOString())})){let x=`bundle lease lost for ${m.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return Pn(i,r,t.prompt,x,"unavailable"),d=bs(x,null),{status:"error",errorKind:"provider",message:x,teamChatLogId:null,messageId:null}}}else{let T=await NO(n,p,m.alias);if(T.busy){let R=await OO(n,p,m.alias);return R+=await LO(n,p,m.alias),Pn(i,r,t.prompt,R,"unavailable"),d=mu(R,null),{status:"busy",message:R,teamChatLogId:null}}E=T.idleReclaim}if(_!==null&&_.teamfile!==p){let T=await re(n,R=>HE(R,{root:y,sender:_,receiverTeamfile:p,receiverAlias:m.alias,now:new Date}));if(T.stop){let R=WE(T.chain);return Pn(i,r,t.prompt,R,"cycle"),d=bs(R,null),{status:"error",errorKind:"cycle",message:R,teamChatLogId:null,messageId:null}}}if(t.heldLease===void 0){let T=await WO(n,{receiver_teamfile:p,receiver_alias:m.alias,sender_teamfile:_?.teamfile??p,sender_alias:_?.alias??"operator",...E?{force:!0,reclaimReason:"session-idle"}:{}});if(!T.acquired){let R=av(p,m.alias,T.current);return R+=` ${ou(iu({holderPid:T.current.holder_pid,since:T.current.started_at}))}`,Pn(i,r,t.prompt,R,"unavailable"),d=mu(R,null),{status:"busy",message:R,teamChatLogId:null}}s={row:T.lease,leaseId:T.leaseId},a=ni(R=>re(n,x=>x.heartbeatAgentInflight(s.row,s.leaseId,R)),{intervalMs:sv,onError:R=>{he()&&Ge(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:R instanceof Error?R.message:String(R)}))}})}let b=await ev({sender:_??{teamfile:p,alias:"operator"},receiver:{teamfile:p,alias:m.alias,provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir,...m.model!==void 0?{model:m.model}:{},...m.effort!==void 0?{effort:m.effort}:{},...m.isLead!==void 0?{isLead:m.isLead}:{}},signal:t.signal,newMessage:t.prompt,newMessageFrom:_===null?"operator":`${_.teamfile}:${_.alias}`,io:n,permissionMode:t.permissionMode,...t.expectedSession!==void 0?{requireResume:!0}:{},...t.bundleSession!==void 0?{bundleSession:t.bundleSession}:{},env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:T=>e({kind:"delta",chunk:T}),onProgress:T=>e({kind:"progress",alias:m.alias,event:T}),onPromptBuilt:async T=>{u=T,l===null&&(l=await qO(n,{...r,message:T}),l!==null&&(t.onAccepted?.(It(l)),i!==null&&await FO(n,i,l))),i!==null&&await DO(n,i,T)}});u=b.prompt;let C=b.status==="stalled",I=b.status==="empty",N=null,A=C?`provider stalled${b.stalledAfterMs!==void 0?` after ${b.stalledAfterMs}ms`:""}`:I?"provider returned no content and no observed activity for this turn -- often an upstream failure (rate limit, quota, auth) the provider did not report as an error":b.status==="error"?b.error??b.receipt:null,S=C||I||b.status==="error"?"error":"ok";l!==null?(await rv(n,l,{...r,message:u,response:b.receipt,status:S,error_detail:A}),c=!0,N=l):N=await JO(n,{...r,message:u,response:b.receipt,status:S,error_detail:A});let v=b.status!=="error"?b.warnings:void 0;if(C||I){let T=A;Pn(i,r,u,T,"error"),d=bs(T,N,b.receipt,v)}else d=jO(b.receipt,N,v);return{status:C?"stalled":I?"empty":"ok",replyText:b.receipt,wroteDelta:b.wroteDelta,teamChatLogId:N,messageId:N===null?null:It(N),durationMs:b.durationMs}}catch(m){let p=m instanceof Error?m.message:String(m);return l!==null&&!c&&r!==null&&(await rv(n,l,{...r,message:u,response:null,status:"error",error_detail:p}),c=!0),Pn(i,r,u,p,"error"),d=bs(p,l),{status:"error",errorKind:m instanceof ve?"target":"provider",message:p,teamChatLogId:l,messageId:l===null?null:It(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await GO(n,r,It(l)),s!==null&&await XO(n,s.row,s.leaseId),i!==null&&await PO(n,i,d??bs("chat turn exited without a terminal outcome",null))}}function CO(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function NO(t,e,n){let r=await re(t,i=>(zo(i,e,n),ri(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await re(t,i=>GE(i,r,e,n));return{busy:!s,idleReclaim:s}}async function OO(t,e,n){let r=await ov(t,e,n);if(r!==null)return Ts(r);let s=await re(t,i=>i.getAgentInflight(e,n));return s!==null?av(e,n,s):`${n} is busy; wait and retry`}async function LO(t,e,n){let r=await re(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${ou(iu({holderPid:r.holder_pid,since:r.started_at}))}`}async function MO(t,e){try{return(await re(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:UO(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return he()&&Ge(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function PO(t,e,n){try{await re(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){he()&&Ge(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function DO(t,e,n){try{await re(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){he()&&Ge(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function FO(t,e,n){try{await re(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){he()&&Ge(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function $O(t,e){if(e===null)return;let n=setInterval(()=>{re(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{he()&&Ge(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},sv);return n.unref?.(),n}function iv(t){return t!==void 0&&t.length>0?{config_warnings:JSON.stringify(t)}:{}}function jO(t,e,n){return{status:"done",result_summary:na(t),error:null,team_chat_log_id:e,...iv(n)}}function mu(t,e){return{status:"busy",result_summary:na(t),error:t,team_chat_log_id:e}}function bs(t,e,n,r){return{status:"error",result_summary:n===void 0?gf(t,500):na(n),error:t,team_chat_log_id:e,...iv(r)}}function na(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function UO(t,e,n){return`lmctl prompt ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function HO(t,e){let n=Zo(e,t);if(n.ok)return{sender:ea(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Qo("chat",e,t))}async function BO(t,e){if(e.explicitRoot!==void 0)return await re(t,r=>gt(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await re(t,r=>BE(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function WO(t,e){return await re(t,n=>{let r=he(),s=jn(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:pn(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&Ge(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:nv(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&Ge(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:nv(s.current)})),{acquired:!1,current:s.current})})}async function ov(t,e,n){return await re(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(au(o).live)return o;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:au(s).live?s:null})}function nv(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function XO(t,e,n){try{await re(t,r=>{r.releaseAgentInflight(e,n)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2183
- `)}}function av(t,e,n){return`${e} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function qO(t,e){let n=Ss(e.message);try{return await re(t,r=>r.beginTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,message_type:e.message_type??null,created_at:new Date().toISOString()}))}catch(r){return t.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
2184
- `),null}}async function rv(t,e,n){let r=Ss(n.message),s=n.response===null?null:Ss(n.response);try{await re(t,i=>i.finishTeamChatLog(e,{root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,receiver_provider:n.receiver_provider,receiver_session_id:n.receiver_session_id,provider_prompt:n.message,message:r.text,response:s?.text??null,origin:n.origin,status:n.status,error_detail:n.error_detail,truncated:r.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(i){t.stderr.write(`warning: failed to finish chat log ${e}: ${i instanceof Error?i.message:String(i)}
2185
- `)}}async function GO(t,e,n){if(e!==null)try{await re(t,r=>{r.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,n)})}catch(r){t.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
2186
- `)}}async function JO(t,e){let n=Ss(e.message),r=e.response===null?null:Ss(e.response);try{return await re(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:r?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,message_type:e.message_type??null,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2187
- `),null}}function Pn(t,e,n,r,s){t!==null||e===null||U({event:"chat_attempt_error",reason:s,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,origin:e.origin,error_detail:r,message_preview:na(n)})}function Ss(t){return t.length<=tv?{text:t,truncated:!1}:{text:t.slice(0,tv),truncated:!0}}var tv,sv,pu=O(()=>{"use strict";ot();Qt();Ct();Ho();Dr();Vo();oe();ur();_n();su();JE();VE();Yo();lu();cu();uu();oi();tv=256*1024,sv=3e4});import{resolve as KO}from"node:path";async function lv(t,e){let n=(s,i)=>({status:"error",error:s,code:i,reply:"",messageId:null,teamChatLogId:null}),r="invalid_argument";try{let s=ue(t);if(s)return n(s.error,s.code);if(!e||typeof e!="object"||Array.isArray(e))return n("promptMember: request must be a map","invalid_argument");let i={...e},o=We.find(d=>d.name==="promptMember").params.find(d=>d.name==="request").keys;if(Object.keys(i).some(d=>!o.some(u=>u.name===d)))return n("promptMember: unknown request key","invalid_argument");if(typeof i.teamfile!="string"||typeof i.alias!="string"||typeof i.prompt!="string")return n("promptMember: teamfile, alias and prompt must be strings","invalid_argument");let a=i.permissionMode??"yolo";if(a!=="yolo"&&a!=="plan")return n("promptMember: permissionMode must be yolo or plan","invalid_argument");if(i.idleTimeoutMs!=null&&(typeof i.idleTimeoutMs!="number"||!Number.isFinite(i.idleTimeoutMs)||i.idleTimeoutMs<0))return n("promptMember: idleTimeoutMs must be finite and nonnegative","invalid_argument");if(i.messageType!==void 0&&typeof i.messageType!="string")return n("promptMember: messageType must be a string","invalid_argument");r="provider";let l=Ue(t),c=await ta({signal:t.signal,teamfile:KO(t.cwd,i.teamfile),alias:i.alias,prompt:i.prompt,permissionMode:a,idleTimeoutMs:i.idleTimeoutMs,messageType:i.messageType,env:l.env,io:l});return{status:c.status,reply:"replyText"in c?c.replyText:"",error:"message"in c?c.message:null,messageId:"messageId"in c?c.messageId:null,teamChatLogId:c.teamChatLogId}}catch(s){return n(G(s),r)}}var cv=O(()=>{"use strict";pu();jt();qt();Xe()});import{randomUUID as VO}from"node:crypto";import{resolve as zO,join as YO}from"node:path";function fu(t){let e=dv.get(t);if(e)return e;let n,r,s=new Promise((i,o)=>{n=i,r=o});dv.set(t,s);try{Promise.resolve(t.close()).then(n,r)}catch(i){r(i)}return s}async function uv(t){let e;try{await Promise.race([t,new Promise((n,r)=>{e=setTimeout(()=>r(Error("Provider cleanup exceeded 5 seconds")),5e3)})])}finally{clearTimeout(e)}}function Rs(t){let e=new Date(t.clock());return[e.getHours(),e.getMinutes(),e.getSeconds()].map(n=>String(n).padStart(2,"0")).join(":")}function pv(t,e){let n=Ue(t),r=t.clock(),s=r,i=setInterval(()=>{try{t.clock()-s>=5e3&&n.stderr.write(e(Math.round((t.clock()-r)/1e3)))}catch{}},5e3);return i.unref(),{poke(){s=t.clock()},stop(){clearInterval(i)}}}async function QO(t,e){let n=e.provider.trim().toLowerCase(),r=cg(t.env.HOME?YO(t.env.HOME,".lmctl/config.toml"):void 0);return Wi(n,r,Po())}function ZO(t,e){let n=Zo(t,e);if(n.ok)return ea(n.identity);if(n.reason==="unset")return null;throw Error(Qo("batch",t,e))}function fv(t,e){let n=t.ctx.dal,r=n??Vt({path:t.ctx.dbPath});try{e(r)}finally{n||r.close()}}function ra(t,e){if(t.rootId===null||t.rootFinished)return;let n=t.rootId;fv(t,r=>r.finishTrackedInvocation(n,e)),t.rootFinished=!0}function gu(t){if(t.timer?.stop(),t.timer=void 0,t.lease){let e=t.lease;fv(t,n=>n.releaseAgentInflight(e.row,e.leaseId)),t.lease=void 0}}async function ks(t,e,n){return t.closing||(t.closed=!0,t.controller.abort(),t.closing=(async()=>{let r=[];try{t.bundle&&await uv(fu(t.bundle))}catch(s){r.push(G(s))}finally{t.bundle=void 0}if(t.turnDone)try{await uv(t.turnDone)}catch(s){r.push(G(s))}try{gu(t)}catch(s){r.push(G(s))}try{ra(t,e==="done"?{status:"done",exit_code:0,result_summary:`batch completed ${t.request.promptCount}/${t.request.promptCount} prompts`}:{...t.rootFinish,status:e==="cancelled"?"cancelled":t.rootFinish.status??"error",exit_code:1,error:n??t.rootFinish.error})}catch(s){r.push(G(s))}if(t.untrack(),e==="done"&&Ue(t.ctx).stderr.write(`batch ${Rs(t.ctx)}: completed ${t.request.promptCount}/${t.request.promptCount} prompts
2180
+ Consulted ${Zm(r,s)}
2181
+ To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function na(t,e){let n=LO(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function LO(t,e){let n=t[Hl];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let i of e.listRootTeams()){let o;try{o=xi(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===n&&r.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var mu=O(()=>{"use strict";lt();pi();jr()});function ra(t){let e=vl(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var pu=O(()=>{"use strict";Zt()});function fu(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=zt({path:Ud(t)})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&Ne(a.holder_pid)),pollMs:MO,settleMs:PO,maxHoldMs:Wn(n),onHold:()=>U({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&U({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function iv(t){let e=DO(t.newMessage,{newMessageFrom:t.newMessageFrom??FO(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=he(),s=0,i=0,o=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,o=Buffer.byteLength(c,"utf8"),i+=o),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};t.signal&&(a.signal=t.signal),t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),t.requireResume!==void 0&&(a.requireResume=t.requireResume),t.bundleSession!==void 0&&(a.bundleSession=t.bundleSession),a.holdOpen=fu(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await _s(a);if(t.requireResume&&l.sessionId!==t.receiver.sessionId)throw new Error(`provider session changed: expected ${t.receiver.sessionId}, received ${l.sessionId??"(missing)"}`);return r&&Ge(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:i,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:o,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:l.status==="empty"?{status:"empty",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:{status:"ok",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}}function DO(t,e={}){return[`--- new prompt (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
2182
+ `)}function FO(t){return`${t.teamfile}:${t.alias}`}var q2,MO,PO,gu=O(()=>{"use strict";dn();oe();fr();wn();yn();En();q2=60*60*1e3,MO=2e3,PO=5e3});async function sa(t){let e=t.onEvent??(()=>{}),n=$O(t.io,e),r=null,s=null,i=null,o,a,l=null,c=!1,d=null,u=t.prompt;try{let m=await re(n,T=>_t(t.teamfile,t.alias,T));if(t.expectedSession!==void 0&&(m.provider!==t.expectedSession.provider||m.sessionid!==t.expectedSession.sessionid))throw new ve(`session changed for ${m.alias}; expected ${t.expectedSession.provider}:${t.expectedSession.sessionid}, found ${m.provider}:${m.sessionid}`);let p=m.teamfile,h=await re(n,T=>VO(T,t.env??process.env)),_=h.sender,y=await zO(n,{explicitRoot:t.rootFlag,sender:_,receiverTeamfile:p,operatorOrigin:h.origin==="operator"}),f=t.env??process.env,w=await re(n,T=>T.getRootTeam(y)?.name??null);w!==null&&(f.LMBEE_TEAM_NAME=w),i=await BO(n,{receiverTeamfile:p,receiverAlias:m.alias,sender:_,rootTeamfile:y,provider:m.provider,model:m.model,sessionId:m.sessionid,cwd:m.sessiondir,prompt:t.prompt,origin:h.origin,parentInvocationId:Uo(f.LMCTL_INVOCATION_ID)}),o=GO(n,i),i!==null&&(f.LMCTL_INVOCATION_ID=String(i));try{hr(n,ot(p),p)}catch{}r={root_teamfile:y,sender_teamfile:_?.teamfile??null,sender_alias:_?.alias??null,receiver_teamfile:p,receiver_alias:m.alias,receiver_provider:m.provider,receiver_session_id:m.sessionid,origin:h.origin,message_type:t.messageType??null};let g=await uv(n,p,m.alias);if(g!==null){let T=ks(g);return Fn(i,r,t.prompt,T,"unavailable"),d=hu(T,null),{status:"busy",message:T,teamChatLogId:null}}let E=!1;if(t.heldLease!==void 0){let T=t.heldLease;if(!await re(n,x=>{let k=x.getAgentInflight(p,m.alias);return k===null||k.sender_teamfile!==T.row.sender_teamfile||k.sender_alias!==T.row.sender_alias||k.started_at!==T.row.started_at||k.holder_pid!==process.pid?!1:x.heartbeatAgentInflight(T.row,T.leaseId,new Date().toISOString())})){let x=`bundle lease lost for ${m.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return Fn(i,r,t.prompt,x,"unavailable"),d=Rs(x,null),{status:"error",errorKind:"provider",message:x,teamChatLogId:null,messageId:null}}}else{let T=await jO(n,p,m.alias);if(T.busy){let R=await UO(n,p,m.alias);return R+=await HO(n,p,m.alias),Fn(i,r,t.prompt,R,"unavailable"),d=hu(R,null),{status:"busy",message:R,teamChatLogId:null}}E=T.idleReclaim}if(_!==null&&_.teamfile!==p){let T=await re(n,R=>GE(R,{root:y,sender:_,receiverTeamfile:p,receiverAlias:m.alias,now:new Date}));if(T.stop){let R=KE(T.chain);return Fn(i,r,t.prompt,R,"cycle"),d=Rs(R,null),{status:"error",errorKind:"cycle",message:R,teamChatLogId:null,messageId:null}}}if(t.heldLease===void 0){let T=await YO(n,{receiver_teamfile:p,receiver_alias:m.alias,sender_teamfile:_?.teamfile??p,sender_alias:_?.alias??"operator",...E?{force:!0,reclaimReason:"session-idle"}:{}});if(!T.acquired){let R=mv(p,m.alias,T.current);return R+=` ${du(cu({holderPid:T.current.holder_pid,since:T.current.started_at}))}`,Fn(i,r,t.prompt,R,"unavailable"),d=hu(R,null),{status:"busy",message:R,teamChatLogId:null}}s={row:T.lease,leaseId:T.leaseId},a=ii(R=>re(n,x=>x.heartbeatAgentInflight(s.row,s.leaseId,R)),{intervalMs:cv,onError:R=>{he()&&Ge(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:R instanceof Error?R.message:String(R)}))}})}let b=await iv({sender:_??{teamfile:p,alias:"operator"},receiver:{teamfile:p,alias:m.alias,provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir,...m.model!==void 0?{model:m.model}:{},...m.effort!==void 0?{effort:m.effort}:{},...m.isLead!==void 0?{isLead:m.isLead}:{}},signal:t.signal,newMessage:t.prompt,newMessageFrom:_===null?"operator":`${_.teamfile}:${_.alias}`,io:n,permissionMode:t.permissionMode,...t.expectedSession!==void 0?{requireResume:!0}:{},...t.bundleSession!==void 0?{bundleSession:t.bundleSession}:{},env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:T=>e({kind:"delta",chunk:T}),onProgress:T=>e({kind:"progress",alias:m.alias,event:T}),onPromptBuilt:async T=>{u=T,l===null&&(l=await ZO(n,{...r,message:T}),l!==null&&(t.onAccepted?.(xt(l)),i!==null&&await qO(n,i,l))),i!==null&&await XO(n,i,T)}});u=b.prompt;let C=b.status==="stalled",I=b.status==="empty",N=null,A=C?`provider stalled${b.stalledAfterMs!==void 0?` after ${b.stalledAfterMs}ms`:""}`:I?"provider returned no content and no observed activity for this turn -- often an upstream failure (rate limit, quota, auth) the provider did not report as an error":b.status==="error"?b.error??b.receipt:null,S=C||I||b.status==="error"?"error":"ok";l!==null?(await lv(n,l,{...r,message:u,response:b.receipt,status:S,error_detail:A}),c=!0,N=l):N=await tL(n,{...r,message:u,response:b.receipt,status:S,error_detail:A});let v=b.status!=="error"?b.warnings:void 0;if(C||I){let T=A;Fn(i,r,u,T,"error"),d=Rs(T,N,b.receipt,v)}else d=JO(b.receipt,N,v);return{status:C?"stalled":I?"empty":"ok",replyText:b.receipt,wroteDelta:b.wroteDelta,teamChatLogId:N,messageId:N===null?null:xt(N),durationMs:b.durationMs}}catch(m){let p=m instanceof Error?m.message:String(m);return l!==null&&!c&&r!==null&&(await lv(n,l,{...r,message:u,response:null,status:"error",error_detail:p}),c=!0),Fn(i,r,u,p,"error"),d=Rs(p,l),{status:"error",errorKind:m instanceof ve?"target":"provider",message:p,teamChatLogId:l,messageId:l===null?null:xt(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await eL(n,r,xt(l)),s!==null&&await QO(n,s.row,s.leaseId),i!==null&&await WO(n,i,d??Rs("chat turn exited without a terminal outcome",null))}}function $O(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function jO(t,e,n){let r=await re(t,i=>(Zo(i,e,n),oi(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await re(t,i=>YE(i,r,e,n));return{busy:!s,idleReclaim:s}}async function UO(t,e,n){let r=await uv(t,e,n);if(r!==null)return ks(r);let s=await re(t,i=>i.getAgentInflight(e,n));return s!==null?mv(e,n,s):`${n} is busy; wait and retry`}async function HO(t,e,n){let r=await re(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${du(cu({holderPid:r.holder_pid,since:r.started_at}))}`}async function BO(t,e){try{return(await re(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:KO(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return he()&&Ge(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function WO(t,e,n){try{await re(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){he()&&Ge(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function XO(t,e,n){try{await re(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){he()&&Ge(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function qO(t,e,n){try{await re(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){he()&&Ge(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function GO(t,e){if(e===null)return;let n=setInterval(()=>{re(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{he()&&Ge(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},cv);return n.unref?.(),n}function dv(t){return t!==void 0&&t.length>0?{config_warnings:JSON.stringify(t)}:{}}function JO(t,e,n){return{status:"done",result_summary:ia(t),error:null,team_chat_log_id:e,...dv(n)}}function hu(t,e){return{status:"busy",result_summary:ia(t),error:t,team_chat_log_id:e}}function Rs(t,e,n,r){return{status:"error",result_summary:n===void 0?vf(t,500):ia(n),error:t,team_chat_log_id:e,...dv(r)}}function ia(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function KO(t,e,n){return`lmctl prompt ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function VO(t,e){let n=na(e,t);if(n.ok)return{sender:ra(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(ta("chat",e,t))}async function zO(t,e){if(e.explicitRoot!==void 0)return await re(t,r=>ht(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await re(t,r=>JE(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function YO(t,e){return await re(t,n=>{let r=he(),s=Bn(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:fn(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&Ge(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:av(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&Ge(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:av(s.current)})),{acquired:!1,current:s.current})})}async function uv(t,e,n){return await re(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(uu(o).live)return o;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:uu(s).live?s:null})}function av(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function QO(t,e,n){try{await re(t,r=>{r.releaseAgentInflight(e,n)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2183
+ `)}}function mv(t,e,n){return`${e} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function ZO(t,e){let n=Is(e.message);try{return await re(t,r=>r.beginTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,message_type:e.message_type??null,created_at:new Date().toISOString()}))}catch(r){return t.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
2184
+ `),null}}async function lv(t,e,n){let r=Is(n.message),s=n.response===null?null:Is(n.response);try{await re(t,i=>i.finishTeamChatLog(e,{root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,receiver_provider:n.receiver_provider,receiver_session_id:n.receiver_session_id,provider_prompt:n.message,message:r.text,response:s?.text??null,origin:n.origin,status:n.status,error_detail:n.error_detail,truncated:r.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(i){t.stderr.write(`warning: failed to finish chat log ${e}: ${i instanceof Error?i.message:String(i)}
2185
+ `)}}async function eL(t,e,n){if(e!==null)try{await re(t,r=>{r.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,n)})}catch(r){t.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
2186
+ `)}}async function tL(t,e){let n=Is(e.message),r=e.response===null?null:Is(e.response);try{return await re(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:r?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,message_type:e.message_type??null,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2187
+ `),null}}function Fn(t,e,n,r,s){t!==null||e===null||U({event:"chat_attempt_error",reason:s,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,origin:e.origin,error_detail:r,message_preview:ia(n)})}function Is(t){return t.length<=ov?{text:t,truncated:!1}:{text:t.slice(0,ov),truncated:!0}}var ov,cv,_u=O(()=>{"use strict";at();Zt();Nt();Xo();jr();Qo();oe();fr();En();lu();QE();ev();ea();mu();pu();gu();ci();ov=256*1024,cv=3e4});import{resolve as nL}from"node:path";async function pv(t,e){let n=(s,i)=>({status:"error",error:s,code:i,reply:"",messageId:null,teamChatLogId:null}),r="invalid_argument";try{let s=ue(t);if(s)return n(s.error,s.code);if(!e||typeof e!="object"||Array.isArray(e))return n("promptMember: request must be a map","invalid_argument");let i={...e},o=We.find(d=>d.name==="promptMember").params.find(d=>d.name==="request").keys;if(Object.keys(i).some(d=>!o.some(u=>u.name===d)))return n("promptMember: unknown request key","invalid_argument");if(typeof i.teamfile!="string"||typeof i.alias!="string"||typeof i.prompt!="string")return n("promptMember: teamfile, alias and prompt must be strings","invalid_argument");let a=i.permissionMode??"yolo";if(a!=="yolo"&&a!=="plan")return n("promptMember: permissionMode must be yolo or plan","invalid_argument");if(i.idleTimeoutMs!=null&&(typeof i.idleTimeoutMs!="number"||!Number.isFinite(i.idleTimeoutMs)||i.idleTimeoutMs<0))return n("promptMember: idleTimeoutMs must be finite and nonnegative","invalid_argument");if(i.messageType!==void 0&&typeof i.messageType!="string")return n("promptMember: messageType must be a string","invalid_argument");r="provider";let l=Ue(t),c=await sa({signal:t.signal,teamfile:nL(t.cwd,i.teamfile),alias:i.alias,prompt:i.prompt,permissionMode:a,idleTimeoutMs:i.idleTimeoutMs,messageType:i.messageType,env:l.env,io:l});return{status:c.status,reply:"replyText"in c?c.replyText:"",error:"message"in c?c.message:null,messageId:"messageId"in c?c.messageId:null,teamChatLogId:c.teamChatLogId}}catch(s){return n(G(s),r)}}var fv=O(()=>{"use strict";_u();Ut();Gt();Xe()});import{randomUUID as rL}from"node:crypto";import{resolve as sL,join as iL}from"node:path";function yu(t){let e=gv.get(t);if(e)return e;let n,r,s=new Promise((i,o)=>{n=i,r=o});gv.set(t,s);try{Promise.resolve(t.close()).then(n,r)}catch(i){r(i)}return s}async function hv(t){let e;try{await Promise.race([t,new Promise((n,r)=>{e=setTimeout(()=>r(Error("Provider cleanup exceeded 5 seconds")),5e3)})])}finally{clearTimeout(e)}}function As(t){let e=new Date(t.clock());return[e.getHours(),e.getMinutes(),e.getSeconds()].map(n=>String(n).padStart(2,"0")).join(":")}function yv(t,e){let n=Ue(t),r=t.clock(),s=r,i=setInterval(()=>{try{t.clock()-s>=5e3&&n.stderr.write(e(Math.round((t.clock()-r)/1e3)))}catch{}},5e3);return i.unref(),{poke(){s=t.clock()},stop(){clearInterval(i)}}}async function oL(t,e){let n=e.provider.trim().toLowerCase(),r=fg(t.env.HOME?iL(t.env.HOME,".lmctl/config.toml"):void 0);return Gi(n,r,$o())}function aL(t,e){let n=na(t,e);if(n.ok)return ra(n.identity);if(n.reason==="unset")return null;throw Error(ta("batch",t,e))}function Ev(t,e){let n=t.ctx.dal,r=n??zt({path:t.ctx.dbPath});try{e(r)}finally{n||r.close()}}function oa(t,e){if(t.rootId===null||t.rootFinished)return;let n=t.rootId;Ev(t,r=>r.finishTrackedInvocation(n,e)),t.rootFinished=!0}function Eu(t){if(t.timer?.stop(),t.timer=void 0,t.lease){let e=t.lease;Ev(t,n=>n.releaseAgentInflight(e.row,e.leaseId)),t.lease=void 0}}async function xs(t,e,n){return t.closing||(t.closed=!0,t.controller.abort(),t.closing=(async()=>{let r=[];try{t.bundle&&await hv(yu(t.bundle))}catch(s){r.push(G(s))}finally{t.bundle=void 0}if(t.turnDone)try{await hv(t.turnDone)}catch(s){r.push(G(s))}try{Eu(t)}catch(s){r.push(G(s))}try{oa(t,e==="done"?{status:"done",exit_code:0,result_summary:`batch completed ${t.request.promptCount}/${t.request.promptCount} prompts`}:{...t.rootFinish,status:e==="cancelled"?"cancelled":t.rootFinish.status??"error",exit_code:1,error:n??t.rootFinish.error})}catch(s){r.push(G(s))}if(t.untrack(),e==="done"&&Ue(t.ctx).stderr.write(`batch ${As(t.ctx)}: completed ${t.request.promptCount}/${t.request.promptCount} prompts
2188
2188
  `),r.length)throw Error(r.join(`
2189
- `))})()),t.closing}function eL(t,e){t.closed=!0,t.controller.abort();let n=[];try{gu(t)}catch(r){n.push(G(r))}try{ra(t,{status:"cancelled",signal:e,error:`batch interrupted by ${e}`})}catch(r){n.push(G(r))}if(t.bundle&&fu(t.bundle).catch(()=>{}),t.bundle=void 0,t.untrack(),n.length)throw Error(n.join(`
2190
- `))}function hu(t,e){if(!e||typeof e!="object")return;let n=mv.get(e);return n?.ctx===t?n:void 0}function gv(t,e){let n=hu(t,e);return!n||!n.member?j("invalid_argument","Invalid or unmanaged batch handle"):ce({id:n.ref.id,teamfile:n.request.teamfile,alias:n.request.alias,batchfile:n.request.label,member:{...n.member},promptCount:n.request.promptCount,useBundle:!!n.bundleActive,rootId:n.rootId,rootFinish:{...n.rootFinish},closed:n.closed,env:{...n.env}})}async function hv(t,e){let n;try{let r=ue(t);if(r)return r;if(!e||typeof e!="object"||Array.isArray(e))return j("invalid_argument","Batch request must be a map");let s={...e};if(typeof s.teamfile!="string"||typeof s.alias!="string"||typeof s.label!="string"||!Number.isFinite(s.promptCount)||s.promptCount<0)return j("invalid_argument","Batch requires teamfile, alias, label and nonnegative promptCount");if(s.permissionMode!==void 0&&s.permissionMode!=="yolo"&&s.permissionMode!=="plan")return j("invalid_argument","permissionMode must be yolo or plan");if(s.idleTimeoutMs!==void 0&&(!Number.isFinite(s.idleTimeoutMs)||s.idleTimeoutMs<0))return j("invalid_argument","idleTimeoutMs must be nonnegative");let i;try{i=ht(zO(t.cwd,s.teamfile),s.alias,t.dal)}catch(m){let p;try{p=m instanceof ve?m.kind:void 0}catch{}return j(p??St(m),G(m))}let o=Object.freeze({id:`batch-${t.clock()}-${VO().slice(0,6)}`});n={ctx:t,controller:new AbortController,ref:o,request:s,rootId:null,rootFinish:{status:"error",error:"batch exited without a terminal outcome"},closed:!1,inFlight:!1,env:{...t.env,LMCTL_DB:t.dbPath},untrack(){}};let a=n;mv.set(o,a),a.untrack=ui(t,{close:()=>ks(a,"error","script execution interrupted or terminated without orderly close"),finalizeSync:m=>eL(a,m)}),a.member=i;let l=mi(t),c=Ue(t),d=a.member,u=!s.legacy&&s.promptCount>1&&await QO(t,d);if(t.closed)throw Error("Context is closed");try{a.rootId=l.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:d.teamfile,from_identity:`${d.teamfile}:batch`,target_teamfile:d.teamfile,target_alias:d.alias,root_teamfile:d.teamfile,cwd:d.sessiondir,command:`lmctl batch ${d.teamfile} ${d.alias} ${s.label}`,holder_pid:t.pid??null,launch_source:"exec",parent_invocation_id:a.env.LMCTL_INVOCATION_ID?Number(a.env.LMCTL_INVOCATION_ID):null,meta:JSON.stringify({batchfile:s.label,prompt_count:s.promptCount,provider:d.provider,sessionid:d.sessionid,...d.model!==void 0?{model:d.model}:{}})}).id}catch(m){c.stderr.write(`warning: failed to start batch root invocation: ${G(m)}
2191
- `)}if(a.rootId!==null&&(a.env.LMCTL_INVOCATION_ID=String(a.rootId)),c.stderr.write(`batch ${Rs(t)}: starting ${s.promptCount} prompt${s.promptCount===1?"":"s"} -> ${d.alias} (teamfile=${s.teamfile} input=${s.label})
2192
- `),u){zo(l,d.teamfile,d.alias);let m=ri(l,d.teamfile,d.alias);if(m.busy){let w=m.reason==="in-flight"?`${d.alias} is servicing ${m.inFlight.sender_alias} (${m.inFlight.sender_teamfile}) since ${m.inFlight.started_at} \u2014 wait and retry`:m.source==="terminal-lock"?Ts(m.terminalLock):`${d.alias} is busy (interactive terminal); wait and retry`;return ra(a,{status:"busy",exit_code:1,error:w,result_summary:"0 prompts completed"}),await ks(a,"error"),{status:"busy",error:`cannot start bundle: ${w}`}}let p=ZO(a.env,l),h=jn(l,{receiver_teamfile:d.teamfile,receiver_alias:d.alias,sender_teamfile:p?.teamfile??d.teamfile,sender_alias:p?.alias??"operator",ttlMs:pn(a.env)});if(!h.acquired){let w=`${d.alias} is servicing ${h.current.sender_alias} (${h.current.sender_teamfile}) since ${h.current.started_at} \u2014 wait and retry`;return ra(a,{status:"busy",exit_code:1,error:w,result_summary:"0 prompts completed"}),await ks(a,"error"),{status:"busy",error:`cannot start bundle: ${w}`}}a.lease={row:h.lease,leaseId:h.leaseId};let _=a.lease,y=ni(w=>l.heartbeatAgentInflight(_.row,_.leaseId,w),{intervalMs:ym(a.env)});a.timer={stop:()=>clearInterval(y)};let f=pv(t,w=>`batch ${Rs(t)}: opening provider session (${w}s elapsed)
2193
- `);try{let w={...a.env},g=l.getRootTeam(d.teamfile)?.name;g&&(w.LMBEE_TEAM_NAME=g);let E=Rd({provider:d.provider,sessionId:d.sessionid,cwd:d.sessiondir,env:w,model:d.model,effort:d.effort,alias:d.alias,isLead:d.isLead,permissionMode:s.permissionMode??"yolo",holdOpen:du(c,{teamfile:d.teamfile,alias:d.alias},w)});E.then(I=>{a.closed&&fu(I).catch(()=>{})}).catch(()=>{});let b,C=new Promise((I,N)=>{b=()=>N(Error("Context is closed")),t.signal.addEventListener("abort",b,{once:!0}),t.signal.aborted&&b()});try{a.bundle=await Promise.race([E,C])}finally{t.signal.removeEventListener("abort",b)}}catch(w){if(t.closed)throw w;U({event:"persistent_session_open_failed",provider:d.provider,session_id:d.sessionid,error_message:G(w)}),gu(a)}finally{f.stop()}}if(t.closed)throw Error("Context is closed");return a.bundleActive=a.bundle!==void 0,ce({batch:o})}catch(r){if(n){n.rootFinish={...n.rootFinish,result_summary:"0 prompts completed"};try{await ks(n,"error",G(r))}catch{}}return j(t?.closed?"cancelled":"provider",G(r))}}async function _v(t,e,n,r,s){let i=(d,u="invalid_argument")=>({status:"error",error:d,code:u,reply:"",messageId:null,teamChatLogId:null}),o=ue(t);if(o)return i(o.error,o.code);let a=hu(t,e);if(!a||a.closed||!a.member)return i("Invalid or closed batch handle");if(typeof n!="string"||!Number.isFinite(r)||!Number.isFinite(s))return i("prompt, index and total must be valid");if(a.inFlight)return{status:"busy",error:"Batch already has an active turn",reply:"",messageId:null,teamChatLogId:null};a.inFlight=!0,a.turnDone=new Promise(d=>{a.turnFinished=d});let l=Ue(t),c;try{l.stderr.write(`batch ${Rs(t)}: prompt ${r}/${s} -> ${a.member.alias}
2194
- `),c=pv(t,m=>`batch ${Rs(t)}: prompt ${r}/${s} still running (${m}s elapsed)
2195
- `);let d=await ta({signal:AbortSignal.any([t.signal,a.controller.signal]),teamfile:a.member.teamfile,alias:a.member.alias,prompt:n,expectedSession:{provider:a.member.provider,sessionid:a.member.sessionid},permissionMode:a.request.permissionMode??"yolo",idleTimeoutMs:a.request.idleTimeoutMs,env:{...a.env},messageType:"batch",heldLease:a.lease,bundleSession:a.bundle,io:l,onEvent:m=>{c?.poke(),m.kind==="warning"&&l.stderr.write(m.message)}}),u="replyText"in d?d.replyText.replace(/\n+$/u,""):"";if(d.status!=="ok"){let m=d.status==="stalled"?"provider stalled":d.status==="empty"?"provider returned no content and no observed activity for this turn":d.message,p=`batch: stopped at prompt ${r}/${s} (${r-1} completed): ${m}; later prompts were not sent`;return a.rootFinish={status:d.status==="busy"?"busy":"error",exit_code:1,error:p,result_summary:`${r-1}/${s} prompts completed`},l.stderr.write(`error: ${p}
2189
+ `))})()),t.closing}function lL(t,e){t.closed=!0,t.controller.abort();let n=[];try{Eu(t)}catch(r){n.push(G(r))}try{oa(t,{status:"cancelled",signal:e,error:`batch interrupted by ${e}`})}catch(r){n.push(G(r))}if(t.bundle&&yu(t.bundle).catch(()=>{}),t.bundle=void 0,t.untrack(),n.length)throw Error(n.join(`
2190
+ `))}function vu(t,e){if(!e||typeof e!="object")return;let n=_v.get(e);return n?.ctx===t?n:void 0}function vv(t,e){let n=vu(t,e);return!n||!n.member?j("invalid_argument","Invalid or unmanaged batch handle"):ce({id:n.ref.id,teamfile:n.request.teamfile,alias:n.request.alias,batchfile:n.request.label,member:{...n.member},promptCount:n.request.promptCount,useBundle:!!n.bundleActive,rootId:n.rootId,rootFinish:{...n.rootFinish},closed:n.closed,env:{...n.env}})}async function wv(t,e){let n;try{let r=ue(t);if(r)return r;if(!e||typeof e!="object"||Array.isArray(e))return j("invalid_argument","Batch request must be a map");let s={...e};if(typeof s.teamfile!="string"||typeof s.alias!="string"||typeof s.label!="string"||!Number.isFinite(s.promptCount)||s.promptCount<0)return j("invalid_argument","Batch requires teamfile, alias, label and nonnegative promptCount");if(s.permissionMode!==void 0&&s.permissionMode!=="yolo"&&s.permissionMode!=="plan")return j("invalid_argument","permissionMode must be yolo or plan");if(s.idleTimeoutMs!==void 0&&(!Number.isFinite(s.idleTimeoutMs)||s.idleTimeoutMs<0))return j("invalid_argument","idleTimeoutMs must be nonnegative");let i;try{i=_t(sL(t.cwd,s.teamfile),s.alias,t.dal)}catch(m){let p;try{p=m instanceof ve?m.kind:void 0}catch{}return j(p??kt(m),G(m))}let o=Object.freeze({id:`batch-${t.clock()}-${rL().slice(0,6)}`});n={ctx:t,controller:new AbortController,ref:o,request:s,rootId:null,rootFinish:{status:"error",error:"batch exited without a terminal outcome"},closed:!1,inFlight:!1,env:{...t.env,LMCTL_DB:t.dbPath},untrack(){}};let a=n;_v.set(o,a),a.untrack=fi(t,{close:()=>xs(a,"error","script execution interrupted or terminated without orderly close"),finalizeSync:m=>lL(a,m)}),a.member=i;let l=gi(t),c=Ue(t),d=a.member,u=!s.legacy&&s.promptCount>1&&await oL(t,d);if(t.closed)throw Error("Context is closed");try{a.rootId=l.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:d.teamfile,from_identity:`${d.teamfile}:batch`,target_teamfile:d.teamfile,target_alias:d.alias,root_teamfile:d.teamfile,cwd:d.sessiondir,command:`lmctl batch ${d.teamfile} ${d.alias} ${s.label}`,holder_pid:t.pid??null,launch_source:"exec",parent_invocation_id:a.env.LMCTL_INVOCATION_ID?Number(a.env.LMCTL_INVOCATION_ID):null,meta:JSON.stringify({batchfile:s.label,prompt_count:s.promptCount,provider:d.provider,sessionid:d.sessionid,...d.model!==void 0?{model:d.model}:{}})}).id}catch(m){c.stderr.write(`warning: failed to start batch root invocation: ${G(m)}
2191
+ `)}if(a.rootId!==null&&(a.env.LMCTL_INVOCATION_ID=String(a.rootId)),c.stderr.write(`batch ${As(t)}: starting ${s.promptCount} prompt${s.promptCount===1?"":"s"} -> ${d.alias} (teamfile=${s.teamfile} input=${s.label})
2192
+ `),u){Zo(l,d.teamfile,d.alias);let m=oi(l,d.teamfile,d.alias);if(m.busy){let w=m.reason==="in-flight"?`${d.alias} is servicing ${m.inFlight.sender_alias} (${m.inFlight.sender_teamfile}) since ${m.inFlight.started_at} \u2014 wait and retry`:m.source==="terminal-lock"?ks(m.terminalLock):`${d.alias} is busy (interactive terminal); wait and retry`;return oa(a,{status:"busy",exit_code:1,error:w,result_summary:"0 prompts completed"}),await xs(a,"error"),{status:"busy",error:`cannot start bundle: ${w}`}}let p=aL(a.env,l),h=Bn(l,{receiver_teamfile:d.teamfile,receiver_alias:d.alias,sender_teamfile:p?.teamfile??d.teamfile,sender_alias:p?.alias??"operator",ttlMs:fn(a.env)});if(!h.acquired){let w=`${d.alias} is servicing ${h.current.sender_alias} (${h.current.sender_teamfile}) since ${h.current.started_at} \u2014 wait and retry`;return oa(a,{status:"busy",exit_code:1,error:w,result_summary:"0 prompts completed"}),await xs(a,"error"),{status:"busy",error:`cannot start bundle: ${w}`}}a.lease={row:h.lease,leaseId:h.leaseId};let _=a.lease,y=ii(w=>l.heartbeatAgentInflight(_.row,_.leaseId,w),{intervalMs:bm(a.env)});a.timer={stop:()=>clearInterval(y)};let f=yv(t,w=>`batch ${As(t)}: opening provider session (${w}s elapsed)
2193
+ `);try{let w={...a.env},g=l.getRootTeam(d.teamfile)?.name;g&&(w.LMBEE_TEAM_NAME=g);let E=Cd({provider:d.provider,sessionId:d.sessionid,cwd:d.sessiondir,env:w,model:d.model,effort:d.effort,alias:d.alias,isLead:d.isLead,permissionMode:s.permissionMode??"yolo",holdOpen:fu(c,{teamfile:d.teamfile,alias:d.alias},w)});E.then(I=>{a.closed&&yu(I).catch(()=>{})}).catch(()=>{});let b,C=new Promise((I,N)=>{b=()=>N(Error("Context is closed")),t.signal.addEventListener("abort",b,{once:!0}),t.signal.aborted&&b()});try{a.bundle=await Promise.race([E,C])}finally{t.signal.removeEventListener("abort",b)}}catch(w){if(t.closed)throw w;U({event:"persistent_session_open_failed",provider:d.provider,session_id:d.sessionid,error_message:G(w)}),Eu(a)}finally{f.stop()}}if(t.closed)throw Error("Context is closed");return a.bundleActive=a.bundle!==void 0,ce({batch:o})}catch(r){if(n){n.rootFinish={...n.rootFinish,result_summary:"0 prompts completed"};try{await xs(n,"error",G(r))}catch{}}return j(t?.closed?"cancelled":"provider",G(r))}}async function Tv(t,e,n,r,s){let i=(d,u="invalid_argument")=>({status:"error",error:d,code:u,reply:"",messageId:null,teamChatLogId:null}),o=ue(t);if(o)return i(o.error,o.code);let a=vu(t,e);if(!a||a.closed||!a.member)return i("Invalid or closed batch handle");if(typeof n!="string"||!Number.isFinite(r)||!Number.isFinite(s))return i("prompt, index and total must be valid");if(a.inFlight)return{status:"busy",error:"Batch already has an active turn",reply:"",messageId:null,teamChatLogId:null};a.inFlight=!0,a.turnDone=new Promise(d=>{a.turnFinished=d});let l=Ue(t),c;try{l.stderr.write(`batch ${As(t)}: prompt ${r}/${s} -> ${a.member.alias}
2194
+ `),c=yv(t,m=>`batch ${As(t)}: prompt ${r}/${s} still running (${m}s elapsed)
2195
+ `);let d=await sa({signal:AbortSignal.any([t.signal,a.controller.signal]),teamfile:a.member.teamfile,alias:a.member.alias,prompt:n,expectedSession:{provider:a.member.provider,sessionid:a.member.sessionid},permissionMode:a.request.permissionMode??"yolo",idleTimeoutMs:a.request.idleTimeoutMs,env:{...a.env},messageType:"batch",heldLease:a.lease,bundleSession:a.bundle,io:l,onEvent:m=>{c?.poke(),m.kind==="warning"&&l.stderr.write(m.message)}}),u="replyText"in d?d.replyText.replace(/\n+$/u,""):"";if(d.status!=="ok"){let m=d.status==="stalled"?"provider stalled":d.status==="empty"?"provider returned no content and no observed activity for this turn":d.message,p=`batch: stopped at prompt ${r}/${s} (${r-1} completed): ${m}; later prompts were not sent`;return a.rootFinish={status:d.status==="busy"?"busy":"error",exit_code:1,error:p,result_summary:`${r-1}/${s} prompts completed`},l.stderr.write(`error: ${p}
2196
2196
  `),{status:d.status,error:p,reply:u,messageId:"messageId"in d?d.messageId:null,teamChatLogId:d.teamChatLogId}}return{status:"ok",error:null,reply:u,messageId:d.messageId,teamChatLogId:d.teamChatLogId}}catch(d){let u=`batch: stopped at prompt ${r}/${s} (${r-1} completed): ${G(d)}; later prompts were not sent`;a.rootFinish={status:"error",exit_code:1,error:u,result_summary:`${r-1}/${s} prompts completed`};try{l.stderr.write(`error: ${u}
2197
- `)}catch{}return i(u,"provider")}finally{c?.stop(),a.inFlight=!1,a.turnFinished?.(),a.turnDone=void 0}}async function yv(t,e,n){try{let r=hu(t,e);return r?!n||!["done","error","cancelled"].includes(n.status)?j("invalid_argument","Invalid batch close status"):(await ks(r,n.status,n.error),ce({})):j("invalid_argument","Invalid or unmanaged batch handle")}catch(r){return j("provider",G(r))}}var dv,mv,Ev=O(()=>{"use strict";En();_n();su();cn();oe();tc();pu();Qt();uu();Yo();Vo();lu();cu();zt();jt();Xe();dv=new WeakMap;mv=new WeakMap});var vv=O(()=>{"use strict";ur()});var wv=O(()=>{"use strict"});import{constants as tL}from"node:os";import{spawn as nL}from"node:child_process";async function Tv(t,e,n,r,s){let i=await rL(t,e,n,r,!1,s);return{code:s.signalObserved?null:i,signal:s.signalObserved??null}}async function rL(t,e,n,r,s,i){let o;try{o=ht(e,n,r)}catch(w){return w instanceof ve?dn(t,w.message):Q_(t,w)}let a=jn(r,{receiver_teamfile:o.teamfile,receiver_alias:o.alias,sender_teamfile:o.teamfile,sender_alias:"terminal",ttlMs:pn(i?.env??t.env)});if(!a.acquired){let w=a.current.holder_pid,g=w===null?null:Ne(w)?"live":"dead",E=`${o.alias} is busy/held by ${a.current.sender_alias} (${a.current.sender_teamfile}) since ${a.current.started_at} `+(w===null?"(holder_pid=unavailable)":`(holder_pid=${w}, ${g})`);return s?(z_(t,{status:"error",errorKind:"busy",message:E,holder_pid:w,holder_liveness:g}),1):dn(t,E)}let l=YE({teamfile:o.teamfile,alias:o.alias,pid:i?.pid}),c=null,d=null,u=null,m=[],p={...i?.env??t.env??process.env},h=!1,_,y=()=>{h||(h=!0,c!==null&&clearInterval(c),r.clearTerminalLock(l.teamfile,l.alias,l.lock_id),r.releaseAgentInflight(a.lease,a.leaseId))},f=w=>{y(),d!==null&&(r.finishTrackedInvocation(d,{status:"cancelled",signal:w,exit_code:w==="SIGINT"?130:143,error:`terminal interrupted by ${w}`}),d=null)};i&&(i.cancel=f,i.onResource?.({async close(){f("SIGTERM"),await _},finalizeSync:f}));try{r.setTerminalLock(l),d=sL(r,o,p,i?.pid),d!==null&&(p.LMCTL_INVOCATION_ID=String(d));let w=r.getRootTeam(o.teamfile)?.name??null;w!==null&&(p.LMBEE_TEAM_NAME=w),c=setInterval(()=>{try{let E=new Date().toISOString(),b=r.heartbeatTerminalLock(l.teamfile,l.alias,l.lock_id,E);b&&r.heartbeatAgentInflight(a.lease,a.leaseId,E),!b&&c!==null&&(clearInterval(c),c=null)}catch{}},QE(p)),c.unref?.();try{pr(t,it(o.teamfile),o.teamfile)}catch{}let g=i??{env:p};return g.env=p,_=oL(t,{provider:o.provider,sessionid:o.sessionid,sessiondir:o.sessiondir,...o.model!==void 0?{model:o.model}:{},isLead:o.isLead},E=>{m.push(`${E.provider} terminal ignored model=${E.model}: ${E.reason}`)},g),u=await _,u}finally{y(),iL(r,d,u,m)}}function sL(t,e,n=process.env,r=process.pid){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:r,launch_source:"terminal",parent_invocation_id:Fo(n.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function iL(t,e,n,r=[]){if(e!==null)try{t.finishTrackedInvocation(e,{status:n===0?"done":"error",exit_code:n,result_summary:n===0?"terminal session ended":null,error:n===0?null:`terminal exited with code ${n??"unknown"}`,...r.length>0?{config_warnings:JSON.stringify(r)}:{}})}catch{}}async function oL(t,e,n,r){let{provider:s,sessionid:i,sessiondir:o,model:a}=e;if(!Nd(s))return dn(t,`no resume incantation for provider "${s}"`);if(!P_.test(i))return dn(t,"refusing to resume: malformed sessionid");let l=D_(s,i,{isLead:e.isLead,model:a,onModelIgnored:u=>{let m=`warning: ${u.provider} terminal ignored model=${u.model}: ${u.reason}`;t.stderr.write(`${m}
2198
- `),Oe({event:"model_ignored",provider:u.provider,model:u.model,reason:u.reason}),n?.(u)}});if(l===null||l.length===0)return dn(t,`no resume incantation for provider "${s}"`);let[c,...d]=l;return await new Promise(u=>{if(r?.signal?.aborted)return r.cancel?.("SIGTERM"),u(143);let m=r?.streams,p=m?[m.stdin,m.stdout,m.stderr].map(g=>g.fd):void 0,h=p?.every(g=>typeof g=="number"),_=nL(c,d,{stdio:m?h?p:["pipe","pipe","pipe"]:"inherit",cwd:o,env:we(r?.env??t.env??process.env,o,i,"terminal")}),y=m?.stdin?.readableFlowing;m&&!h&&(m.stdin.pipe(_.stdin),_.stdout?.pipe(m.stdout,{end:!1}),_.stderr?.pipe(m.stderr,{end:!1}));let f=()=>{let g=r?.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM";r?.cancel?.(g),te(_).catch(()=>{})},w=()=>{r?.signal?.removeEventListener("abort",f),m&&!h&&(m.stdin.unpipe(_.stdin),y||m.stdin.pause(),_.stdout?.unpipe(m.stdout),_.stderr?.unpipe(m.stderr))};r?.signal?.addEventListener("abort",f,{once:!0}),r?.signal?.aborted&&f(),_.stdin?.on("error",()=>{}),_.on("error",g=>{w(),u(dn(t,`failed to launch ${c}: ${g.message}`))}),_.on("exit",(g,E)=>{w(),r&&(r.signalObserved=E),u(g??(E?128+(tL.signals[E]??1):1))})})}var bv=O(()=>{"use strict";Rn();En();Do();ur();vv();Qt();Ct();at();Ho();_n();Vo();Yo();wv();oe();hn()});import{resolve as aL}from"node:path";async function Sv(t,e,n){let r=(o,a)=>({status:"error",error:o,errorCode:a,code:null,signal:null}),s,i;try{let o=ue(t);if(o)return r(o.error,o.code);if(!t.interactive||t.env.LMCTL_NON_INTERACTIVE==="1")return r("terminal opens an interactive TUI; non-interactive mode is enabled","noninteractive");if(!e||typeof e.teamfile!="string"||typeof e.alias!="string"||!n||typeof n.stdin?.pipe!="function"||typeof n.stdout?.write!="function"||typeof n.stderr?.write!="function")return r("Terminal requires teamfile, alias and caller streams","invalid_argument");let a={...e},l={env:{...t.env,LMCTL_DB:t.dbPath},pid:t.pid,signal:t.signal,streams:n,onResource(m){i=m,t.closed&&m.finalizeSync("SIGTERM")}};s=ui(t,{async close(){await i?.close()},finalizeSync(m){i?.finalizeSync(m)}});let c=[],d=Ue(t,(m,p)=>{p==="stderr"&&m.startsWith("error:")&&c.push(m.replace(/^error:\s*/,"").trim())}),u=await Tv({...d,stdin:n.stdin},aL(t.cwd,a.teamfile),a.alias,mi(t),l);return{status:u.code===0&&!u.signal?"ok":"error",error:u.signal?`terminal terminated by ${u.signal}`:u.code===0?null:c.join(`
2199
- `)||`terminal exited with code ${u.code}`,code:u.code,signal:u.signal}}catch(o){return r(G(o),"provider")}finally{s?.()}}var kv=O(()=>{"use strict";bv();zt();jt();Xe()});var Rv={};Cs(Rv,{LMCTL_API_VERSION:()=>NL,LMCTL_ERROR_CODES:()=>pw,LMCTL_OPERATIONS:()=>We,LMCTL_PROFILE_VALUE_NAMES:()=>gw,LMCTL_PROPERTY_KEYS:()=>Ca,LMCTL_PROPERTY_TABLES:()=>Na,LMCTL_REMOVED_GLOBALS:()=>Oa,LMCTL_RESULT_FIELDS:()=>fw,batchTurn:()=>_v,closeBatch:()=>yv,createLmctlContext:()=>Zm,deleteSession:()=>Hy,fail:()=>j,getSession:()=>Uy,inspectBatch:()=>gv,isLmctlContext:()=>Xn,lintTeam:()=>FC,listMembers:()=>PC,listSessions:()=>jy,loadProfile:()=>JT,loadProperties:()=>KT,ok:()=>ce,openTeamBatch:()=>hv,openTerminal:()=>Sv,profileValues:()=>GT,promptAgent:()=>Oy,promptMember:()=>lv,promptReservedAgent:()=>Dy,readPrompts:()=>HC,readRatelimits:()=>iO,releaseSession:()=>$y,reserveSession:()=>Fy,resolveMember:()=>DC,resolveProfilePath:()=>rl,seedErrorCollector:()=>ky,seedTeam:()=>$C,sessionAdmission:()=>Py});var Iv=O(()=>{"use strict";Xe();zt();gp();qt();Ry();Iy();By();$E();Wd();cv();Ev();kv()});var Cv={};Cs(Cv,{createLmctlHostModule:()=>Av,default:()=>_L});import{AsyncLocalStorage as lL}from"node:async_hooks";import{createInterface as cL}from"node:readline";import{Writable as dL}from"node:stream";import{readFileSync as uL}from"node:fs";import{resolve as mL}from"node:path";import{homedir as pL}from"node:os";function Av(t={}){let e={stdout:t.stdout??(r=>process.stdout.write(r)),stderr:t.stderr??(r=>process.stderr.write(r))},n={name:"lmctl",declarations:hL,async activate(r){let s=t.api??await Promise.resolve().then(()=>(Iv(),Rv)),i,o=[],a=new lL,l=()=>a.getStore()??e,c=new WeakMap,d=new WeakMap,u=new Map,m=new Map,p=!1,h=()=>{if(i)return i;let v={...r.env};!v.HOME&&!v.LMCTL_HOME&&!v.LMCTL_DB&&(v.HOME=pL());let T=s.createLmctlContext({env:v,cwd:r.cwd,pid:process.pid,onProgress:(R,x)=>l()[x??"stderr"](R),onWarning:R=>l().stderr(R)});if(T.status!=="ok")throw Error(T.error);return i=T,t.onContext?.(i),i},_={},y=()=>{let v=s.loadProperties(h());if(v.status!=="ok")throw Error(v.error);return{path:v.path,properties:v.properties,hint:"Define it in "+v.path+" or run lmctl init"}},f=()=>i?.finalizeSync(r.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM");r.signal?.addEventListener("abort",f,{once:!0}),r.signal?.aborted&&f();let w=async(v,T,R={},x)=>{let k=R&&typeof R=="object"&&!Array.isArray(R)?{permissionMode:R.permissionMode??"yolo",idleTimeoutMs:R.idleTimeoutMs??void 0}:R,L=x?await s.promptReservedAgent(h(),x,v,T,k):await s.promptAgent(h(),v,T,k);if(v&&typeof v=="object"&&L.sessionid&&L.status!=="busy"&&(v.sessionid=L.sessionid),v?.sessionid&&L.status!=="busy"){let F=JSON.stringify([v.provider,v.sessionid]),D=m.get(F)??{lines:[],options:{}};D.lines.push(`You: ${T}`),L.reply&&D.lines.push(`Agent: ${L.reply}`),L.error&&D.lines.push(`${L.status}: ${L.error}`),D.options={...R},m.set(F,D)}return{status:L.status,reply:L.reply,error:L.error?`lm_agent: ${L.error}`:null,message_id:null,team_chat_log_id:null}},g=(v,T)=>new Error(`${v}: ${T.error??"operation failed"}`),E=(v,T)=>{if(T.status!=="ok")throw g(v,T);return T},b=v=>typeof v=="string"?u.get(v):v,C=v=>v&&typeof v=="object"?d.get(v):void 0,I=v=>{let T=C(v);if(T){let R=E("lm_batch_open",s.inspectBatch(h(),T)),{status:x,error:k,...L}=R;Object.assign(v,L)}},A={lm_exit:(v=0)=>{let T=Number(v);throw new mt(Number.isFinite(T)&&T>=0&&T<=255?Math.floor(T):1)},lm_log:(...v)=>{let T=xv(v);return l().stderr(T.endsWith(`
2197
+ `)}catch{}return i(u,"provider")}finally{c?.stop(),a.inFlight=!1,a.turnFinished?.(),a.turnDone=void 0}}async function bv(t,e,n){try{let r=vu(t,e);return r?!n||!["done","error","cancelled"].includes(n.status)?j("invalid_argument","Invalid batch close status"):(await xs(r,n.status,n.error),ce({})):j("invalid_argument","Invalid or unmanaged batch handle")}catch(r){return j("provider",G(r))}}var gv,_v,Sv=O(()=>{"use strict";wn();En();lu();dn();oe();ic();_u();Zt();gu();ea();Qo();mu();pu();Yt();Ut();Xe();gv=new WeakMap;_v=new WeakMap});var kv=O(()=>{"use strict";fr()});var Rv=O(()=>{"use strict"});import{constants as cL}from"node:os";import{spawn as dL}from"node:child_process";async function Iv(t,e,n,r,s){let i=await uL(t,e,n,r,!1,s);return{code:s.signalObserved?null:i,signal:s.signalObserved??null}}async function uL(t,e,n,r,s,i){let o;try{o=_t(e,n,r)}catch(w){return w instanceof ve?un(t,w.message):ry(t,w)}let a=Bn(r,{receiver_teamfile:o.teamfile,receiver_alias:o.alias,sender_teamfile:o.teamfile,sender_alias:"terminal",ttlMs:fn(i?.env??t.env)});if(!a.acquired){let w=a.current.holder_pid,g=w===null?null:Ne(w)?"live":"dead",E=`${o.alias} is busy/held by ${a.current.sender_alias} (${a.current.sender_teamfile}) since ${a.current.started_at} `+(w===null?"(holder_pid=unavailable)":`(holder_pid=${w}, ${g})`);return s?(ty(t,{status:"error",errorKind:"busy",message:E,holder_pid:w,holder_liveness:g}),1):un(t,E)}let l=nv({teamfile:o.teamfile,alias:o.alias,pid:i?.pid}),c=null,d=null,u=null,m=[],p={...i?.env??t.env??process.env},h=!1,_,y=()=>{h||(h=!0,c!==null&&clearInterval(c),r.clearTerminalLock(l.teamfile,l.alias,l.lock_id),r.releaseAgentInflight(a.lease,a.leaseId))},f=w=>{y(),d!==null&&(r.finishTrackedInvocation(d,{status:"cancelled",signal:w,exit_code:w==="SIGINT"?130:143,error:`terminal interrupted by ${w}`}),d=null)};i&&(i.cancel=f,i.onResource?.({async close(){f("SIGTERM"),await _},finalizeSync:f}));try{r.setTerminalLock(l),d=mL(r,o,p,i?.pid),d!==null&&(p.LMCTL_INVOCATION_ID=String(d));let w=r.getRootTeam(o.teamfile)?.name??null;w!==null&&(p.LMBEE_TEAM_NAME=w),c=setInterval(()=>{try{let E=new Date().toISOString(),b=r.heartbeatTerminalLock(l.teamfile,l.alias,l.lock_id,E);b&&r.heartbeatAgentInflight(a.lease,a.leaseId,E),!b&&c!==null&&(clearInterval(c),c=null)}catch{}},rv(p)),c.unref?.();try{hr(t,ot(o.teamfile),o.teamfile)}catch{}let g=i??{env:p};return g.env=p,_=fL(t,{provider:o.provider,sessionid:o.sessionid,sessiondir:o.sessiondir,...o.model!==void 0?{model:o.model}:{},isLead:o.isLead},E=>{m.push(`${E.provider} terminal ignored model=${E.model}: ${E.reason}`)},g),u=await _,u}finally{y(),pL(r,d,u,m)}}function mL(t,e,n=process.env,r=process.pid){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:r,launch_source:"terminal",parent_invocation_id:Uo(n.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function pL(t,e,n,r=[]){if(e!==null)try{t.finishTrackedInvocation(e,{status:n===0?"done":"error",exit_code:n,result_summary:n===0?"terminal session ended":null,error:n===0?null:`terminal exited with code ${n??"unknown"}`,...r.length>0?{config_warnings:JSON.stringify(r)}:{}})}catch{}}async function fL(t,e,n,r){let{provider:s,sessionid:i,sessiondir:o,model:a}=e;if(!Pd(s))return un(t,`no resume incantation for provider "${s}"`);if(!U_.test(i))return un(t,"refusing to resume: malformed sessionid");let l=H_(s,i,{isLead:e.isLead,model:a,onModelIgnored:u=>{let m=`warning: ${u.provider} terminal ignored model=${u.model}: ${u.reason}`;t.stderr.write(`${m}
2198
+ `),Oe({event:"model_ignored",provider:u.provider,model:u.model,reason:u.reason}),n?.(u)}});if(l===null||l.length===0)return un(t,`no resume incantation for provider "${s}"`);let[c,...d]=l;return await new Promise(u=>{if(r?.signal?.aborted)return r.cancel?.("SIGTERM"),u(143);let m=r?.streams,p=m?[m.stdin,m.stdout,m.stderr].map(g=>g.fd):void 0,h=p?.every(g=>typeof g=="number"),_=dL(c,d,{stdio:m?h?p:["pipe","pipe","pipe"]:"inherit",cwd:o,env:we(r?.env??t.env??process.env,o,i,"terminal")}),y=m?.stdin?.readableFlowing;m&&!h&&(m.stdin.pipe(_.stdin),_.stdout?.pipe(m.stdout,{end:!1}),_.stderr?.pipe(m.stderr,{end:!1}));let f=()=>{let g=r?.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM";r?.cancel?.(g),te(_).catch(()=>{})},w=()=>{r?.signal?.removeEventListener("abort",f),m&&!h&&(m.stdin.unpipe(_.stdin),y||m.stdin.pause(),_.stdout?.unpipe(m.stdout),_.stderr?.unpipe(m.stderr))};r?.signal?.addEventListener("abort",f,{once:!0}),r?.signal?.aborted&&f(),_.stdin?.on("error",()=>{}),_.on("error",g=>{w(),u(un(t,`failed to launch ${c}: ${g.message}`))}),_.on("exit",(g,E)=>{w(),r&&(r.signalObserved=E),u(g??(E?128+(cL.signals[E]??1):1))})})}var xv=O(()=>{"use strict";xn();wn();jo();fr();kv();Zt();Nt();lt();Xo();En();Qo();ea();Rv();oe();yn()});import{resolve as gL}from"node:path";async function Av(t,e,n){let r=(o,a)=>({status:"error",error:o,errorCode:a,code:null,signal:null}),s,i;try{let o=ue(t);if(o)return r(o.error,o.code);if(!t.interactive||t.env.LMCTL_NON_INTERACTIVE==="1")return r("terminal opens an interactive TUI; non-interactive mode is enabled","noninteractive");if(!e||typeof e.teamfile!="string"||typeof e.alias!="string"||!n||typeof n.stdin?.pipe!="function"||typeof n.stdout?.write!="function"||typeof n.stderr?.write!="function")return r("Terminal requires teamfile, alias and caller streams","invalid_argument");let a={...e},l={env:{...t.env,LMCTL_DB:t.dbPath},pid:t.pid,signal:t.signal,streams:n,onResource(m){i=m,t.closed&&m.finalizeSync("SIGTERM")}};s=fi(t,{async close(){await i?.close()},finalizeSync(m){i?.finalizeSync(m)}});let c=[],d=Ue(t,(m,p)=>{p==="stderr"&&m.startsWith("error:")&&c.push(m.replace(/^error:\s*/,"").trim())}),u=await Iv({...d,stdin:n.stdin},gL(t.cwd,a.teamfile),a.alias,gi(t),l);return{status:u.code===0&&!u.signal?"ok":"error",error:u.signal?`terminal terminated by ${u.signal}`:u.code===0?null:c.join(`
2199
+ `)||`terminal exited with code ${u.code}`,code:u.code,signal:u.signal}}catch(o){return r(G(o),"provider")}finally{s?.()}}var Cv=O(()=>{"use strict";xv();Yt();Ut();Xe()});var Nv={};Ls(Nv,{LMCTL_API_VERSION:()=>jL,LMCTL_ERROR_CODES:()=>ww,LMCTL_OPERATIONS:()=>We,LMCTL_PROFILE_VALUE_NAMES:()=>bw,LMCTL_PROPERTY_KEYS:()=>Ma,LMCTL_PROPERTY_TABLES:()=>Pa,LMCTL_REMOVED_GLOBALS:()=>Da,LMCTL_RESULT_FIELDS:()=>Tw,batchTurn:()=>Tv,closeBatch:()=>bv,createLmctlContext:()=>sp,deleteSession:()=>Gy,fail:()=>j,getSession:()=>qy,inspectBatch:()=>vv,isLmctlContext:()=>Jn,lintTeam:()=>qC,listMembers:()=>WC,listSessions:()=>Xy,loadProfile:()=>tb,loadProperties:()=>nb,ok:()=>ce,openTeamBatch:()=>wv,openTerminal:()=>Av,profileValues:()=>eb,promptAgent:()=>Fy,promptMember:()=>pv,promptReservedAgent:()=>Hy,readPrompts:()=>VC,readRatelimits:()=>pO,releaseSession:()=>Wy,reserveSession:()=>By,resolveMember:()=>XC,resolveProfilePath:()=>al,seedErrorCollector:()=>Cy,seedTeam:()=>GC,sessionAdmission:()=>Uy});var Ov=O(()=>{"use strict";Xe();Yt();vp();Gt();Ny();Oy();Jy();WE();Jd();fv();Sv();Cv()});var Pv={};Ls(Pv,{createLmctlHostModule:()=>Mv,default:()=>kL});import{AsyncLocalStorage as hL}from"node:async_hooks";import{createInterface as _L}from"node:readline";import{Writable as yL}from"node:stream";import{readFileSync as EL}from"node:fs";import{resolve as vL}from"node:path";import{homedir as wL}from"node:os";function Mv(t={}){let e={stdout:t.stdout??(r=>process.stdout.write(r)),stderr:t.stderr??(r=>process.stderr.write(r))},n={name:"lmctl",declarations:SL,async activate(r){let s=t.api??await Promise.resolve().then(()=>(Ov(),Nv)),i,o=[],a=new hL,l=()=>a.getStore()??e,c=new WeakMap,d=new WeakMap,u=new Map,m=new Map,p=!1,h=()=>{if(i)return i;let v={...r.env};!v.HOME&&!v.LMCTL_HOME&&!v.LMCTL_DB&&(v.HOME=wL());let T=s.createLmctlContext({env:v,cwd:r.cwd,pid:process.pid,onProgress:(R,x)=>l()[x??"stderr"](R),onWarning:R=>l().stderr(R)});if(T.status!=="ok")throw Error(T.error);return i=T,t.onContext?.(i),i},_={},y=()=>{let v=s.loadProperties(h());if(v.status!=="ok")throw Error(v.error);return{path:v.path,properties:v.properties,hint:"Define it in "+v.path+" or run lmctl init"}},f=()=>i?.finalizeSync(r.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM");r.signal?.addEventListener("abort",f,{once:!0}),r.signal?.aborted&&f();let w=async(v,T,R={},x)=>{let k=R&&typeof R=="object"&&!Array.isArray(R)?{permissionMode:R.permissionMode??"yolo",idleTimeoutMs:R.idleTimeoutMs??void 0}:R,L=x?await s.promptReservedAgent(h(),x,v,T,k):await s.promptAgent(h(),v,T,k);if(v&&typeof v=="object"&&L.sessionid&&L.status!=="busy"&&(v.sessionid=L.sessionid),v?.sessionid&&L.status!=="busy"){let F=JSON.stringify([v.provider,v.sessionid]),D=m.get(F)??{lines:[],options:{}};D.lines.push(`You: ${T}`),L.reply&&D.lines.push(`Agent: ${L.reply}`),L.error&&D.lines.push(`${L.status}: ${L.error}`),D.options={...R},m.set(F,D)}return{status:L.status,reply:L.reply,error:L.error?`lm_agent: ${L.error}`:null,message_id:null,team_chat_log_id:null}},g=(v,T)=>new Error(`${v}: ${T.error??"operation failed"}`),E=(v,T)=>{if(T.status!=="ok")throw g(v,T);return T},b=v=>typeof v=="string"?u.get(v):v,C=v=>v&&typeof v=="object"?d.get(v):void 0,I=v=>{let T=C(v);if(T){let R=E("lm_batch_open",s.inspectBatch(h(),T)),{status:x,error:k,...L}=R;Object.assign(v,L)}},A={lm_exit:(v=0)=>{let T=Number(v);throw new pt(Number.isFinite(T)&&T>=0&&T<=255?Math.floor(T):1)},lm_log:(...v)=>{let T=Lv(v);return l().stderr(T.endsWith(`
2200
2200
  `)?T:T+`
2201
- `),T},lm_error:(...v)=>{let T=xv(v);return(a.getStore()?.errors??o).push(T),l().stderr("error: "+T+`
2201
+ `),T},lm_error:(...v)=>{let T=Lv(v);return(a.getStore()?.errors??o).push(T),l().stderr("error: "+T+`
2202
2202
  `),T},lm_read_prompts:async(v,T=!1)=>E("lm_read_prompts",await s.readPrompts(h(),v,{single:T})).prompts,lm_read_paragraphs:async v=>E("lm_read_paragraphs",await s.readPrompts(h(),v,{single:!1})).prompts,lm_members:async v=>E("lm_members",await s.listMembers(h(),v)).members,lm_member:async(v,T)=>{try{let R=await s.resolveMember(h(),v,T);return R.status!=="ok"?(l().stderr(`error: lm_member: ${R.error}
2203
2203
  `),null):{...R.member,isLead:R.isLead,teamfile:R.teamfile}}catch(R){return l().stderr(`error: lm_member: ${R instanceof Error?R.message:String(R)}
2204
- `),null}},lm_lint:async v=>{if(typeof v!="string"||!v)throw Error("lm_lint: teamfile must be nonempty");let T=await s.lintTeam(h(),v);return{status:T.status==="ok"?"ok":"error",errors:"errors"in T?T.errors:[{alias:"",message:`lm_lint: ${T.error}`}],warnings:"warnings"in T?T.warnings:[],counts:"counts"in T?T.counts:{errors:1,warnings:0}}},lm_seed:async(v,T={})=>{if(typeof v!="string"||!v)throw Error("lm_seed: teamfile must be nonempty");if(!Is(T))throw Error("lm_seed: options must be a map");let R=l(),x=await a.run({...R,stderr:k=>{k.startsWith("error:")||R.stderr(k)}},()=>s.seedTeam(h(),v,Is(T)?{preamble:T.preamble}:T));if(x.status==="ok")return{status:"ok"};if(x.code==="provider")return R.stderr(`error: lm_seed: ${x.error}
2205
- `),{status:"error"};throw g("lm_seed",x)},lm_agent:w,lm_prompt:async(v,T,R,x={})=>{try{let k=await s.promptMember(h(),{teamfile:v,alias:T,prompt:R,permissionMode:x?.permissionMode??"yolo",idleTimeoutMs:x?.idleTimeoutMs,messageType:x?.messageType});return{status:k.status,reply:k.reply,error:k.error?`lm_prompt: ${k.error}`:null,message_id:k.messageId,team_chat_log_id:k.teamChatLogId}}catch(k){return{status:"error",reply:"",error:`lm_prompt: ${k instanceof Error?k.message:String(k)}`,message_id:null,team_chat_log_id:null}}},lm_session_list:async(v={})=>E("lm_session_list",await s.listSessions(h(),Is(v)?{provider:v.provider,workspace:v.sessiondir,all:v.all}:v)).sessions,lm_session_delete:async(v,T={})=>{let R=await s.deleteSession(h(),v,{force:T?.force});return R.status==="deleted"&&(m.delete(JSON.stringify([v.provider,v.sessionid])),v.sessionid=null),{status:R.status,error:R.error?`lm_session_delete: ${R.error}`:null}},lm_ratelimit_readings:async(v={})=>{let T=await s.readRatelimits(h(),v);return T.status==="ok"?{status:"ok",readings:T.readings}:{status:"error",error:`lm_ratelimit_readings: ${T.error}`,readings:[]}},lm_terminal:async(v,T)=>{let R=E("lm_terminal",await s.openTerminal(h(),{teamfile:v,alias:T},{stdin:t.stdin??process.stdin,stdout:process.stdout,stderr:process.stderr}));return{status:R.status,code:R.code??1}},lm_fanout:(v,T,R={})=>{if(!Array.isArray(v))throw Error("lm_fanout: participants must be an array");if(v.length===0)return[];if(!Is(R))throw Error("lm_fanout: options must be a map");let x=typeof T=="string"?v.map(()=>T):T;if(!Array.isArray(x)||x.length!==v.length||x.some(k=>typeof k!="string"))throw Error("lm_fanout: prompts must match participants");return Promise.all(v.map((k,L)=>w(k,x[L],R)))},lm_batch_open:async(v,T,R,x={})=>{if(typeof v!="string"){if(!v||typeof v!="object"||Array.isArray(v)||typeof v.provider!="string"||!v.provider.trim())throw Error("lm_batch_open: member map requires provider");if(R!==void 0||T!=null&&!Is(T))throw Error("lm_batch_open: options must be a map");let F={id:`member-batch-${Date.now()}-${Math.random()}`,kind:"agent"};u.set(F.id,F);let D={member:{...v},source:v,options:{...T??{}},closed:!1,failed:!1,busy:!1};return c.set(F,D),Object.defineProperties(F,{member:{enumerable:!0,get:()=>D.member},sourceMember:{enumerable:!0,get:()=>D.source},options:{enumerable:!0,get:()=>D.options},closed:{enumerable:!0,get:()=>D.closed},failed:{enumerable:!0,get:()=>D.failed},inFlight:{enumerable:!0,get:()=>D.busy}}),F}if(typeof T!="string"||typeof R!="string")throw Error("lm_batch_open(teamfile, alias, batchfile, options): alias and batchfile are required");let k=await s.openTeamBatch(h(),{teamfile:v,alias:T,label:R,promptCount:Number(x?.promptCount??1),legacy:!!x?.legacy});if(k.status!=="ok"){if("code"in k&&(k.code==="provider"||k.code==="cancelled"))throw g("lm_batch_open",k);return l().stderr(`error: lm_batch_open: ${k.error}
2206
- `),null}let L={};return d.set(L,k.batch),I(L),u.set(L.id,L),L},lm_batch_turn:async(v,T,R,x)=>{v=b(v);let k=v&&typeof v=="object"?c.get(v):void 0;if(!k){let L=C(v);if(!L)throw Error("lm_batch_turn: invalid or unmanaged handle");let F=await s.batchTurn(h(),L,T,R,x);return I(v),{status:F.status,reply:F.reply,error:F.error?`lm_batch_turn: ${F.error}`:null}}if(k.closed||k.failed)return{status:"error",error:"Batch is closed or stopped after a failed turn",reply:""};if(k.busy)return{status:"busy",error:"Batch already has an active turn",reply:""};k.busy=!0;try{let L=k.member.sessionid,F=await w(k.member,T,k.options);return k.member.sessionid&&k.source.provider===k.member.provider&&k.source.sessionid===L&&(k.source.sessionid=k.member.sessionid),F.status!=="ok"&&(k.failed=!0),{status:F.status,reply:F.reply.replace(/\n+$/u,""),error:F.error}}finally{k.busy=!1}},lm_batch_close:async(v,T="done",R)=>{v=b(v&&typeof v=="object"&&v.id?u.get(v.id)??v:v);let x=v&&typeof v=="object"?c.get(v):void 0;if(x)return x.closed=!0,!0;let k=C(v);return k?(E("lm_batch_close",await s.closeBatch(h(),k,{status:T==="done"?"done":T==="cancelled"?"cancelled":"error",error:R})),I(v),!0):!1}};return A.prompt_human=async v=>{if(r.env.LMCTL_NON_INTERACTIVE==="1")throw Error("prompt_human is disabled in non-interactive mode");if(p)throw Error("prompt_human: another operator prompt is active");p=!0;let T=v!==null&&typeof v=="object",R=l().stdout,x=t.stdin??process.stdin,k,L,F;try{let D=new dL({write(pe,Ie,P){R(String(pe)),P()}});if(!T)return await Gs(v,x,D);if(L={...v},Array.isArray(v)||typeof L.provider!="string"||!L.provider.trim()||typeof L.sessionid!="string"||!L.sessionid.trim())return{command:"error",args:["prompt_human: session map requires provider and sessionid; call lm_agent first"]};let V=JSON.stringify([L.provider,L.sessionid]),B=s.sessionAdmission(h(),L);if(B.status==="busy"&&B.busyReason==="turn")return{command:"busy",args:["Agent turn is still running"]};let Z=s.reserveSession(h(),L);if(Z.status!=="ok")return{command:Z.status,args:[Z.error??"Session admission failed"]};if(k=Z.reservation,x.destroyed||x.readableEnded)return{command:"eof",args:[]};F=cL({input:x,output:x.isTTY?D:void 0,terminal:!!x.isTTY,crlfDelay:1/0});let H=F[Symbol.asyncIterator](),z=!1;F.on("SIGINT",()=>{z=!0,F?.close()}),R(`Session ${L.alias??L.provider} (${L.sessionid})
2204
+ `),null}},lm_lint:async v=>{if(typeof v!="string"||!v)throw Error("lm_lint: teamfile must be nonempty");let T=await s.lintTeam(h(),v);return{status:T.status==="ok"?"ok":"error",errors:"errors"in T?T.errors:[{alias:"",message:`lm_lint: ${T.error}`}],warnings:"warnings"in T?T.warnings:[],counts:"counts"in T?T.counts:{errors:1,warnings:0}}},lm_seed:async(v,T={})=>{if(typeof v!="string"||!v)throw Error("lm_seed: teamfile must be nonempty");if(!Cs(T))throw Error("lm_seed: options must be a map");let R=l(),x=await a.run({...R,stderr:k=>{k.startsWith("error:")||R.stderr(k)}},()=>s.seedTeam(h(),v,Cs(T)?{preamble:T.preamble}:T));if(x.status==="ok")return{status:"ok"};if(x.code==="provider")return R.stderr(`error: lm_seed: ${x.error}
2205
+ `),{status:"error"};throw g("lm_seed",x)},lm_agent:w,lm_prompt:async(v,T,R,x={})=>{try{let k=await s.promptMember(h(),{teamfile:v,alias:T,prompt:R,permissionMode:x?.permissionMode??"yolo",idleTimeoutMs:x?.idleTimeoutMs,messageType:x?.messageType});return{status:k.status,reply:k.reply,error:k.error?`lm_prompt: ${k.error}`:null,message_id:k.messageId,team_chat_log_id:k.teamChatLogId}}catch(k){return{status:"error",reply:"",error:`lm_prompt: ${k instanceof Error?k.message:String(k)}`,message_id:null,team_chat_log_id:null}}},lm_session_list:async(v={})=>E("lm_session_list",await s.listSessions(h(),Cs(v)?{provider:v.provider,workspace:v.sessiondir,all:v.all}:v)).sessions,lm_session_delete:async(v,T={})=>{let R=await s.deleteSession(h(),v,{force:T?.force});return R.status==="deleted"&&(m.delete(JSON.stringify([v.provider,v.sessionid])),v.sessionid=null),{status:R.status,error:R.error?`lm_session_delete: ${R.error}`:null}},lm_ratelimit_readings:async(v={})=>{let T=await s.readRatelimits(h(),v);return T.status==="ok"?{status:"ok",readings:T.readings}:{status:"error",error:`lm_ratelimit_readings: ${T.error}`,readings:[]}},lm_terminal:async(v,T)=>{let R=E("lm_terminal",await s.openTerminal(h(),{teamfile:v,alias:T},{stdin:t.stdin??process.stdin,stdout:process.stdout,stderr:process.stderr}));return{status:R.status,code:R.code??1}},lm_fanout:(v,T,R={})=>{if(!Array.isArray(v))throw Error("lm_fanout: participants must be an array");if(v.length===0)return[];if(!Cs(R))throw Error("lm_fanout: options must be a map");let x=typeof T=="string"?v.map(()=>T):T;if(!Array.isArray(x)||x.length!==v.length||x.some(k=>typeof k!="string"))throw Error("lm_fanout: prompts must match participants");return Promise.all(v.map((k,L)=>w(k,x[L],R)))},lm_batch_open:async(v,T,R,x={})=>{if(typeof v!="string"){if(!v||typeof v!="object"||Array.isArray(v)||typeof v.provider!="string"||!v.provider.trim())throw Error("lm_batch_open: member map requires provider");if(R!==void 0||T!=null&&!Cs(T))throw Error("lm_batch_open: options must be a map");let F={id:`member-batch-${Date.now()}-${Math.random()}`,kind:"agent"};u.set(F.id,F);let D={member:{...v},source:v,options:{...T??{}},closed:!1,failed:!1,busy:!1};return c.set(F,D),Object.defineProperties(F,{member:{enumerable:!0,get:()=>D.member},sourceMember:{enumerable:!0,get:()=>D.source},options:{enumerable:!0,get:()=>D.options},closed:{enumerable:!0,get:()=>D.closed},failed:{enumerable:!0,get:()=>D.failed},inFlight:{enumerable:!0,get:()=>D.busy}}),F}if(typeof T!="string"||typeof R!="string")throw Error("lm_batch_open(teamfile, alias, batchfile, options): alias and batchfile are required");let k=await s.openTeamBatch(h(),{teamfile:v,alias:T,label:R,promptCount:Number(x?.promptCount??1),legacy:!!x?.legacy});if(k.status!=="ok"){if("code"in k&&(k.code==="provider"||k.code==="cancelled"))throw g("lm_batch_open",k);return l().stderr(`error: lm_batch_open: ${k.error}
2206
+ `),null}let L={};return d.set(L,k.batch),I(L),u.set(L.id,L),L},lm_batch_turn:async(v,T,R,x)=>{v=b(v);let k=v&&typeof v=="object"?c.get(v):void 0;if(!k){let L=C(v);if(!L)throw Error("lm_batch_turn: invalid or unmanaged handle");let F=await s.batchTurn(h(),L,T,R,x);return I(v),{status:F.status,reply:F.reply,error:F.error?`lm_batch_turn: ${F.error}`:null}}if(k.closed||k.failed)return{status:"error",error:"Batch is closed or stopped after a failed turn",reply:""};if(k.busy)return{status:"busy",error:"Batch already has an active turn",reply:""};k.busy=!0;try{let L=k.member.sessionid,F=await w(k.member,T,k.options);return k.member.sessionid&&k.source.provider===k.member.provider&&k.source.sessionid===L&&(k.source.sessionid=k.member.sessionid),F.status!=="ok"&&(k.failed=!0),{status:F.status,reply:F.reply.replace(/\n+$/u,""),error:F.error}}finally{k.busy=!1}},lm_batch_close:async(v,T="done",R)=>{v=b(v&&typeof v=="object"&&v.id?u.get(v.id)??v:v);let x=v&&typeof v=="object"?c.get(v):void 0;if(x)return x.closed=!0,!0;let k=C(v);return k?(E("lm_batch_close",await s.closeBatch(h(),k,{status:T==="done"?"done":T==="cancelled"?"cancelled":"error",error:R})),I(v),!0):!1}};return A.prompt_human=async v=>{if(r.env.LMCTL_NON_INTERACTIVE==="1")throw Error("prompt_human is disabled in non-interactive mode");if(p)throw Error("prompt_human: another operator prompt is active");p=!0;let T=v!==null&&typeof v=="object",R=l().stdout,x=t.stdin??process.stdin,k,L,F;try{let D=new yL({write(pe,Ie,P){R(String(pe)),P()}});if(!T)return await Vs(v,x,D);if(L={...v},Array.isArray(v)||typeof L.provider!="string"||!L.provider.trim()||typeof L.sessionid!="string"||!L.sessionid.trim())return{command:"error",args:["prompt_human: session map requires provider and sessionid; call lm_agent first"]};let V=JSON.stringify([L.provider,L.sessionid]),B=s.sessionAdmission(h(),L);if(B.status==="busy"&&B.busyReason==="turn")return{command:"busy",args:["Agent turn is still running"]};let Z=s.reserveSession(h(),L);if(Z.status!=="ok")return{command:Z.status,args:[Z.error??"Session admission failed"]};if(k=Z.reservation,x.destroyed||x.readableEnded)return{command:"eof",args:[]};F=_L({input:x,output:x.isTTY?D:void 0,terminal:!!x.isTTY,crlfDelay:1/0});let H=F[Symbol.asyncIterator](),z=!1;F.on("SIGINT",()=>{z=!0,F?.close()}),R(`Session ${L.alias??L.provider} (${L.sessionid})
2207
2207
  `);let se=m.get(V);if(se)for(let pe of se.lines)R(pe+`
2208
2208
  `);else{let pe=await s.getSession(h(),L);if(pe.status!=="ok")return{command:"error",args:["Could not load session history"]};for(let Ie of pe.messages)(Ie.role==="user"||Ie.role==="assistant")&&R(`${Ie.role==="user"?"You":"Agent"}: ${Ie.content}
2209
2209
  `)}for(R(`Talk to the agent. Return to the script with /exit [command] [args...].
2210
2210
  `);;){R("You> ");let pe=await H.next();if(z)return{command:"cancelled",args:[]};if(pe.done)return{command:"eof",args:[]};let Ie=pe.value.trim();if(!Ie)continue;if(/^\/exit(?:\s|$)/u.test(Ie)){let X=Ie.split(/\s+/u).slice(1);return{command:X.shift()??"exit",args:X}}let P=await w(L,pe.value,se?.options??{},k);if(P.reply&&R(`Agent: ${P.reply}
2211
2211
  `),P.status!=="ok")return R(`${P.status}: ${P.error}
2212
- `),{command:P.status,args:[P.error??"Agent turn failed"]}}}catch(D){if(!T)throw D;return{command:"error",args:[D instanceof Error?D.message:String(D)]}}finally{F?.close(),k&&s.releaseSession(h(),{provider:L.provider,sessionid:L.sessionid}),p=!1}},A.run_script=async(v,T=[],R={})=>{let x=mL(r.cwd,String(v)),k=uL(x,"utf8"),L=Array.isArray(T)?T.map(String):[],F=R?.output??"capture";if(F!=="capture"&&F!=="stream")throw Error("run_script output must be capture or stream");let D="",V=l(),B=a.getStore()?.errors??o,Z=[],H={errors:Z,stdout:se=>{D+=se,F==="stream"&&V.stdout(se)},stderr:se=>V.stderr(se)},z=new Wt;return z.setGlobal("args",L),z.setGlobal("ARGV",[...L]),z.registerBuiltinProvider({...n,activate:se=>({functions:A,globals:{},loadProperties:y,getRecordedErrors:()=>[...Z],dispose(){}})}),a.run(H,async()=>{let se=await z.runAsync(k,{file:x,propertyStore:r.propertyStore,reservedFunctionPrefixes:["lm_","lmbee_"],hostContext:{cwd:r.cwd,env:r.env},signal:r.signal,stdout:P=>H.stdout(P+`
2212
+ `),{command:P.status,args:[P.error??"Agent turn failed"]}}}catch(D){if(!T)throw D;return{command:"error",args:[D instanceof Error?D.message:String(D)]}}finally{F?.close(),k&&s.releaseSession(h(),{provider:L.provider,sessionid:L.sessionid}),p=!1}},A.run_script=async(v,T=[],R={})=>{let x=vL(r.cwd,String(v)),k=EL(x,"utf8"),L=Array.isArray(T)?T.map(String):[],F=R?.output??"capture";if(F!=="capture"&&F!=="stream")throw Error("run_script output must be capture or stream");let D="",V=l(),B=a.getStore()?.errors??o,Z=[],H={errors:Z,stdout:se=>{D+=se,F==="stream"&&V.stdout(se)},stderr:se=>V.stderr(se)},z=new Xt;return z.setGlobal("args",L),z.setGlobal("ARGV",[...L]),z.registerBuiltinProvider({...n,activate:se=>({functions:A,globals:{},loadProperties:y,getRecordedErrors:()=>[...Z],dispose(){}})}),a.run(H,async()=>{let se=await z.runAsync(k,{file:x,propertyStore:r.propertyStore,reservedFunctionPrefixes:["lm_","lmbee_"],hostContext:{cwd:r.cwd,env:r.env},signal:r.signal,stdout:P=>H.stdout(P+`
2213
2213
  `),stderr:P=>H.stderr(P.endsWith(`
2214
2214
  `)?P:P+`
2215
2215
  `)});B.push(...se.errors??[]);let pe=se.exitCode??(se.success&&(se.errors?.length??0)===0?0:1),Ie=(se.diagnostics??[]).filter(P=>P.severity==="error"&&!(se.errors??[]).includes(P.message));for(let P of Ie)H.stderr(`error:${P.file&&P.file!=="<main>"?P.file:x}:${P.line}:${P.column}: ${P.message}
2216
2216
  `);return{success:pe===0,stdout:D,output:se.output,exit_code:pe,code:pe,value:se.value,errors:[...se.errors??[],...Ie.map(P=>P.message)]}})},{functions:A,globals:_,loadProperties:y,getRecordedErrors:()=>[...o],async dispose(){r.signal?.removeEventListener("abort",f);for(let v of u.values()){let T=c.get(v);T?T.closed=!0:v.closed=!0}if(i){let v=await i.close();for(let T of u.values())if(C(T))try{I(T),T.closed=!0}catch(R){v.errors.push(R instanceof Error?R.message:String(R))}if(v.errors.length)throw Error(v.errors.join(`
2217
- `))}}}}};return n}var fL,gL,hL,Is,xv,_L,Nv=O(()=>{"use strict";qt();Ra();Yu();fL=[{name:"lm_exit",arity:{min:0,max:1}},{name:"lm_log",arity:{min:1}},{name:"lm_error",arity:{min:1}},{name:"lm_read_paragraphs",arity:1},{name:"lm_fanout",arity:{min:2,max:3}},{name:"lm_batch_open",arity:{min:1,max:4}},{name:"lm_batch_turn",arity:4},{name:"lm_batch_close",arity:{min:1,max:3}},{name:"prompt_human",arity:{min:0,max:2},override:!0},{name:"run_script",arity:{min:1,max:3},override:!0}],gL=We.filter(t=>"scriptBinding"in t).map(t=>{let e=t.scriptBinding;return{name:e.name,arity:{min:e.params.filter(n=>!n.optional).length,max:e.params.length},params:e.params,doc:{name:e.name,description:t.summary,module:"lmctl",category:"lmctl Automation",signature:e.name+"("+e.params.map(n=>n.name).join(", ")+")"}}}),hL={functions:[...gL,...fL].map(t=>({...t,doc:(()=>{let e=zu.find(n=>n.name===t.name)??("doc"in t?t.doc:void 0);return e?{...e,module:"lmctl"}:void 0})()})),globals:[],properties:{known:Ca,closedTables:Na,removedGlobals:Oa}},Is=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),xv=t=>t.map(e=>e!==null&&typeof e=="object"?JSON.stringify(e):String(e)).join(" ");_L=Av()});var qu={};Cs(qu,{runCli:()=>yu,stableDiagnostic:()=>_u});import{readFileSync as Ov,fstatSync as Lv}from"node:fs";import{Socket as yL}from"node:net";import{resolve as Mv,dirname as EL}from"node:path";function _u(t,e="<inline>"){return`${t.severity}:${t.file&&t.file!=="<main>"?t.file:e}:${t.line}:${t.column}: ${t.message}
2218
- `}async function yu(t,e={}){if(t.length===1&&["--version","-v"].includes(t[0]))return(e.stdout??(k=>process.stdout.write(k)))("lmscript "+Xu()+`
2219
- `),0;let n=[...t],r=e.cwd??process.cwd(),s={...e.env??process.env},i=e.stdout??(k=>process.stdout.write(k)),o=e.stderr??(k=>process.stderr.write(k)),a=[],l=k=>{k.startsWith("error: ")&&a.push(k),o(k)},c=!1,d=!1,u,m,p=[];for(;n.length&&["--check","--dry-run","--lint","--check-files","--module","--base-dir","--source-name"].includes(n[0]);){let k=n.shift();if(k==="--base-dir"||k==="--source-name"){let L=n.shift();if(!L)return l(xs+`
2220
- `),1;k==="--base-dir"?u=Mv(r,L):m=L}else if(k==="--module"){let L=n.shift();return!L||!Js(L)?(l(xs+`
2217
+ `))}}}}};return n}var TL,bL,SL,Cs,Lv,kL,Dv=O(()=>{"use strict";Gt();Ca();nm();TL=[{name:"lm_exit",arity:{min:0,max:1}},{name:"lm_log",arity:{min:1}},{name:"lm_error",arity:{min:1}},{name:"lm_read_paragraphs",arity:1},{name:"lm_fanout",arity:{min:2,max:3}},{name:"lm_batch_open",arity:{min:1,max:4}},{name:"lm_batch_turn",arity:4},{name:"lm_batch_close",arity:{min:1,max:3}},{name:"prompt_human",arity:{min:0,max:2},override:!0},{name:"run_script",arity:{min:1,max:3},override:!0}],bL=We.filter(t=>"scriptBinding"in t).map(t=>{let e=t.scriptBinding;return{name:e.name,arity:{min:e.params.filter(n=>!n.optional).length,max:e.params.length},params:e.params,doc:{name:e.name,description:t.summary,module:"lmctl",category:"lmctl Automation",signature:e.name+"("+e.params.map(n=>n.name).join(", ")+")"}}}),SL={functions:[...bL,...TL].map(t=>({...t,doc:(()=>{let e=tm.find(n=>n.name===t.name)??("doc"in t?t.doc:void 0);return e?{...e,module:"lmctl"}:void 0})()})),globals:[],properties:{known:Ma,closedTables:Pa,removedGlobals:Da}},Cs=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),Lv=t=>t.map(e=>e!==null&&typeof e=="object"?JSON.stringify(e):String(e)).join(" ");kL=Mv()});var zu={};Ls(zu,{runCli:()=>Tu,stableDiagnostic:()=>wu});import{readFileSync as Fv,fstatSync as $v}from"node:fs";import{Socket as RL}from"node:net";import{resolve as jv,dirname as IL}from"node:path";function wu(t,e="<inline>"){return`${t.severity}:${t.file&&t.file!=="<main>"?t.file:e}:${t.line}:${t.column}: ${t.message}
2218
+ `}async function Tu(t,e={}){if(t.length===1&&["--version","-v"].includes(t[0]))return(e.stdout??(k=>process.stdout.write(k)))("lmscript "+Vu()+`
2219
+ `),0;let n=[...t],r=e.cwd??process.cwd(),s={...e.env??process.env},i=e.stdout??(k=>process.stdout.write(k)),o=e.stderr??(k=>process.stderr.write(k)),a=[],l=k=>{k.startsWith("error: ")&&a.push(k),o(k)},c=!1,d=!1,u,m,p=[];for(;n.length&&["--check","--dry-run","--lint","--check-files","--module","--base-dir","--source-name"].includes(n[0]);){let k=n.shift();if(k==="--base-dir"||k==="--source-name"){let L=n.shift();if(!L)return l(Ns+`
2220
+ `),1;k==="--base-dir"?u=jv(r,L):m=L}else if(k==="--module"){let L=n.shift();return!L||!zs(L)?(l(Ns+`
2221
2221
  `),1):["lmctl","lmbee"].includes(L)?(l(`error:<inline>:1:1: ${L} functions are built in; remove this line (--module ${L})
2222
2222
  `),2):(l(`error:<inline>:1:1: External JavaScript host modules are not supported; use import with a disk path or URL
2223
- `),2)}else c=!0,k==="--check-files"&&(d=!0)}let h=n.shift(),_=h==="help"||h==="--help"||h==="-h";if(!h||h.startsWith("-")&&!["-e","-","--help","-h"].includes(h))return l(xs+`
2224
- `),1;let y,f;try{if(_)y="";else if(h==="-e"){let k=n.shift();if(k===void 0)return l(xs+`
2225
- `),1;y=k}else if(h==="-")if(e.stdin){y="";for await(let k of e.stdin)y+=String(k)}else y=Ov(0,"utf8");else f=Mv(r,h),y=Ov(f,"utf8")}catch(k){return l(`error:${f??h}:1:1: ${k instanceof Error?k.message:String(k)}
2226
- `),1}let w=new Wt;w.setGlobal("args",[...n]),w.setGlobal("ARGV",[...n]);let g=new AbortController,E=new Set,b=new Map,C=new Map;try{let{createLmctlHostModule:k}=await Promise.resolve().then(()=>(Nv(),Cv)),L=k({stdout:i,stderr:l,stdin:e.stdin,onContext:F=>E.add(F)});w.registerBuiltinProvider(L),b.set("lmctl",L)}catch(k){if(!["ERR_MODULE_NOT_FOUND","ERR_PACKAGE_PATH_NOT_EXPORTED"].includes(k?.code??""))throw k;C.set("lmctl",k)}for(let k of e.builtinProviders??[])w.registerBuiltinProvider(k);let I={file:m??f,entryLocation:f,baseDir:u??(f?EL(f):r),modules:p,builtinProviderNames:["lmctl","lmbee",...(e.builtinProviders??[]).map(k=>k.name)],reservedFunctionPrefixes:["lm_","lmbee_"],checkFiles:d,hostContext:{cwd:r,env:s},stdout:k=>i(k+`
2223
+ `),2)}else c=!0,k==="--check-files"&&(d=!0)}let h=n.shift(),_=h==="help"||h==="--help"||h==="-h";if(!h||h.startsWith("-")&&!["-e","-","--help","-h"].includes(h))return l(Ns+`
2224
+ `),1;let y,f;try{if(_)y="";else if(h==="-e"){let k=n.shift();if(k===void 0)return l(Ns+`
2225
+ `),1;y=k}else if(h==="-")if(e.stdin){y="";for await(let k of e.stdin)y+=String(k)}else y=Fv(0,"utf8");else f=jv(r,h),y=Fv(f,"utf8")}catch(k){return l(`error:${f??h}:1:1: ${k instanceof Error?k.message:String(k)}
2226
+ `),1}let w=new Xt;w.setGlobal("args",[...n]),w.setGlobal("ARGV",[...n]);let g=new AbortController,E=new Set,b=new Map,C=new Map;try{let{createLmctlHostModule:k}=await Promise.resolve().then(()=>(Dv(),Pv)),L=k({stdout:i,stderr:l,stdin:e.stdin,onContext:F=>E.add(F)});w.registerBuiltinProvider(L),b.set("lmctl",L)}catch(k){if(!["ERR_MODULE_NOT_FOUND","ERR_PACKAGE_PATH_NOT_EXPORTED"].includes(k?.code??""))throw k;C.set("lmctl",k)}for(let k of e.builtinProviders??[])w.registerBuiltinProvider(k);let I={file:m??f,entryLocation:f,baseDir:u??(f?IL(f):r),modules:p,builtinProviderNames:["lmctl","lmbee",...(e.builtinProviders??[]).map(k=>k.name)],reservedFunctionPrefixes:["lm_","lmbee_"],checkFiles:d,hostContext:{cwd:r,env:s},stdout:k=>i(k+`
2227
2227
  `),stderr:k=>l(k.endsWith(`
2228
2228
  `)?k:k+`
2229
- `)},N=await w.scanAndCheckAsync(y,I);if(I.preparedCheck=N,_&&!N.diagnostics.some(k=>k.severity==="error")){let k=wu(w,[...new Map([...b.values(),...N.hostModules??[]].map(L=>[L.name,L])).values()],n[0]);return k===void 0?(l("error: unknown help target "+n[0]+`
2230
- `),1):(i(xs+`
2231
- `+k),0)}for(let k of N.diagnostics)l(_u(k,m??f??(h==="-"?"<stdin>":"<inline>")));if(N.diagnostics.some(k=>k.severity==="error"))return 2;if(c)return 0;let A,S,v=(k,L=k==="SIGINT"?130:143)=>{if(A===void 0){A=L;for(let F of E)F.finalizeSync(k);g.abort(k),S=setTimeout(()=>process.exit(A),250)}},T=()=>v("SIGINT"),R=()=>v("SIGTERM"),x=()=>v("SIGTERM",129);if(e.installSignals!==!1&&!e.stdout&&!Pv&&(Pv=!0,process.stdout.on("error",k=>{if(k.code!=="EPIPE")throw k;for(let L of E)L.finalizeSync("SIGTERM");process.exit(0)})),e.installSignals!==!1){process.once("SIGINT",T),process.once("SIGTERM",R),process.once("SIGHUP",x);let k=Number(s.LMSCRIPT_LIFELINE_FD);if(delete s.LMSCRIPT_LIFELINE_FD,e.env||delete process.env.LMSCRIPT_LIFELINE_FD,Number.isInteger(k)&&k>2)try{if(Lv(k).isFIFO()||Lv(k).isSocket()){let L=new yL({fd:k,readable:!0,writable:!1});L.on("error",()=>{}),L.on("end",R),L.on("close",R),L.resume(),L.unref()}}catch{}}I.signal=g.signal;try{let k=await w.runAsync(y,I),L=new Set(N.diagnostics.map(V=>JSON.stringify(V)));for(let V of k.diagnostics)L.has(JSON.stringify(V))||l(_u(V,m??f??"<inline>"));let F=V=>{let B=a.findIndex(Z=>Z==="error: "+V||Z==="error: "+V+`
2229
+ `)},N=await w.scanAndCheckAsync(y,I);if(I.preparedCheck=N,_&&!N.diagnostics.some(k=>k.severity==="error")){let k=ku(w,[...new Map([...b.values(),...N.hostModules??[]].map(L=>[L.name,L])).values()],n[0]);return k===void 0?(l("error: unknown help target "+n[0]+`
2230
+ `),1):(i(Ns+`
2231
+ `+k),0)}for(let k of N.diagnostics)l(wu(k,m??f??(h==="-"?"<stdin>":"<inline>")));if(N.diagnostics.some(k=>k.severity==="error"))return 2;if(c)return 0;let A,S,v=(k,L=k==="SIGINT"?130:143)=>{if(A===void 0){A=L;for(let F of E)F.finalizeSync(k);g.abort(k),S=setTimeout(()=>process.exit(A),250)}},T=()=>v("SIGINT"),R=()=>v("SIGTERM"),x=()=>v("SIGTERM",129);if(e.installSignals!==!1&&!e.stdout&&!Uv&&(Uv=!0,process.stdout.on("error",k=>{if(k.code!=="EPIPE")throw k;for(let L of E)L.finalizeSync("SIGTERM");process.exit(0)})),e.installSignals!==!1){process.once("SIGINT",T),process.once("SIGTERM",R),process.once("SIGHUP",x);let k=Number(s.LMSCRIPT_LIFELINE_FD);if(delete s.LMSCRIPT_LIFELINE_FD,e.env||delete process.env.LMSCRIPT_LIFELINE_FD,Number.isInteger(k)&&k>2)try{if($v(k).isFIFO()||$v(k).isSocket()){let L=new RL({fd:k,readable:!0,writable:!1});L.on("error",()=>{}),L.on("end",R),L.on("close",R),L.resume(),L.unref()}}catch{}}I.signal=g.signal;try{let k=await w.runAsync(y,I),L=new Set(N.diagnostics.map(V=>JSON.stringify(V)));for(let V of k.diagnostics)L.has(JSON.stringify(V))||l(wu(V,m??f??"<inline>"));let F=V=>{let B=a.findIndex(Z=>Z==="error: "+V||Z==="error: "+V+`
2232
2232
  `);return B<0?Number.MAX_SAFE_INTEGER:B},D=[...new Set(k.errors??[])].sort((V,B)=>F(V)-F(B));if(D.length){l(`
2233
2233
  === LMScript Error Summary (${D.length} error${D.length===1?"":"s"}) ===
2234
2234
  `);for(let[V,B]of D.entries())l(` ${V+1}. ${B}
2235
2235
  `);l(`==========================================
2236
2236
  `)}return A!==void 0?A:k.exitCode!==void 0?k.exitCode:k.success&&!k.errors?.length?0:1}catch(k){return l(`error:${f??"<inline>"}:1:1: ${k instanceof Error?k.message:String(k)}
2237
- `),1}finally{A===void 0&&clearTimeout(S),process.removeListener("SIGINT",T),process.removeListener("SIGTERM",R),process.removeListener("SIGHUP",x);for(let k of E)await k.close()}}var Pv,xs,Ia=O(()=>{"use strict";Tu();Ra();Pv=!1,xs="Usage: lmscript [--check|--dry-run|--lint] [--check-files] [--base-dir dir] [--source-name label] <file>|-| -e <code> [args...]"});Ia();async function Uq(){process.exitCode=await yu(process.argv.slice(2))}export{Uq as main};
2237
+ `),1}finally{A===void 0&&clearTimeout(S),process.removeListener("SIGINT",T),process.removeListener("SIGTERM",R),process.removeListener("SIGHUP",x);for(let k of E)await k.close()}}var Uv,Ns,Na=O(()=>{"use strict";Ru();Ca();Uv=!1,Ns="Usage: lmscript [--check|--dry-run|--lint] [--check-files] [--base-dir dir] [--source-name label] <file>|-| -e <code> [args...]"});Na();async function Kq(){process.exitCode=await Tu(process.argv.slice(2))}export{Kq as main};