@lmctl-ai/lmctl 0.2.82 → 0.2.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/build-info.json +1 -1
- package/dist/cli/lmscript.js +120 -120
- package/package.json +1 -1
package/dist/cli/lmscript.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
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
|
|
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
|
|
2
2
|
Precedence below || and above assignment; only the selected arm is evaluated.
|
|
3
|
-
`;if(n==="topics")return`Topics: regex
|
|
3
|
+
`;if(n==="topics")return`Topics: conditional, regex
|
|
4
4
|
`;if(n==="regex")return`Topic: Regular expressions
|
|
5
5
|
JavaScript RegExp patterns; use regex_test, regex_match, regex_find_all, regex_replace and split_regex.
|
|
6
6
|
Use raw strings for backslashes; g means global matching; y is rejected by matching helpers.
|
|
@@ -19,9 +19,9 @@ ${l.parameters?.length?`Parameters:
|
|
|
19
19
|
`;let c=o.filter(d=>(d.module??"core")===l);for(let d of[...new Set(c.map(u=>u.category))].sort()){a+=" "+d+`:
|
|
20
20
|
`;for(let u of c.filter(m=>m.category===d).sort((m,p)=>m.name.localeCompare(p.name)))a+=" "+(u.signature??u.name)+`
|
|
21
21
|
`}}return a+`
|
|
22
|
-
Topics: regex
|
|
22
|
+
Topics: conditional, regex
|
|
23
23
|
Use help <function|built-in|topic> for details.
|
|
24
|
-
`}var
|
|
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(`
|
|
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}
|
|
@@ -53,9 +53,9 @@ 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
|
|
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(`
|
|
57
57
|
`)?`
|
|
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>
|
|
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
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
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()})+`
|
|
@@ -68,7 +68,7 @@ try {
|
|
|
68
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
69
|
`)}return t.map(r=>Ls(r,e)).join(`
|
|
70
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 eT(t,e,n=""){let r=Er(e,n,"first").exec(String(t));return r===null?null:Uu(r)}function tT(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 rT(){if(!ca){let e=new js(nT,"<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"&&Tr.has(t)?Tr.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 sT(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 iT(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),T=f.tokenize();return s.push(...f.diagnostics),new Hs(T,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)}),_=iT(_,f.name)}let T=[];for(let g of _.statements){if(g.kind!=="ImportStmt"){T.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),T.push(...yield*d(c(b.source,E),E)),i.set(E,"loaded"))}return T}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,T]of Object.entries(_))Array.isArray(T)?y[f]=T.map(p):T&&typeof T=="object"&&(y[f]=p(T));return y};return{program:{kind:"Program",statements:[...e.noStdlib?[]:rT().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 oT(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 aT(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"&&Tr.has(t)&&(t=Tr.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 uT(){console.log("================================================="),console.log(" LMScript Verification & Full Feature Test Suite "),console.log(`=================================================
|
|
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
72
|
`);let t=new Wt,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) {
|
|
@@ -90,9 +90,9 @@ try {
|
|
|
90
90
|
}
|
|
91
91
|
print("sum skipping 3 =", sumVal);
|
|
92
92
|
assert(sumVal == 12, "sum must be 12");
|
|
93
|
-
`);r.success?(console.log(r.output.map(
|
|
93
|
+
`);r.success?(console.log(r.output.map(w=>" [out] "+w).join(`
|
|
94
94
|
`)),console.log(` -> Passed!
|
|
95
|
-
`)):(console.error(" -> Failed:",r.diagnostics),e=!1),console.log("Test Suite 2: TS Predefined Builtins & Host Registration"),t.registerFunction("base64Encode",
|
|
95
|
+
`)):(console.error(" -> Failed:",r.diagnostics),e=!1),console.log("Test Suite 2: TS Predefined Builtins & Host Registration"),t.registerFunction("base64Encode",w=>Buffer.from(w).toString("base64"),1,"Base64 encodes a string"),t.registerFunction("addVectors",(w,g)=>w.map((E,b)=>E+(g[b]||0)),2,"Adds two numeric arrays element-wise");let i=t.run(`
|
|
96
96
|
let text = "TypeScript Engine";
|
|
97
97
|
let encoded = base64Encode(text);
|
|
98
98
|
print("Encoded base64:", encoded);
|
|
@@ -107,7 +107,7 @@ try {
|
|
|
107
107
|
|
|
108
108
|
print("sqrt(16) =", sqrt(16));
|
|
109
109
|
print("min(5, 2, 9) =", min(5, 2, 9));
|
|
110
|
-
`);i.success?(console.log(i.output.map(
|
|
110
|
+
`);i.success?(console.log(i.output.map(w=>" [out] "+w).join(`
|
|
111
111
|
`)),console.log(` -> Passed!
|
|
112
112
|
`)):(console.error(" -> Failed:",i.diagnostics),e=!1),console.log("Test Suite 3: Static Analysis Validation (Zero Execution on Error)");let o=`
|
|
113
113
|
let x = 10;
|
|
@@ -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
|
|
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(`
|
|
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(`
|
|
@@ -141,7 +141,7 @@ try {
|
|
|
141
141
|
if (n == 0) { return false; }
|
|
142
142
|
return even(n - 1);
|
|
143
143
|
}
|
|
144
|
-
`);c.success?(console.log(c.output.map(
|
|
144
|
+
`);c.success?(console.log(c.output.map(w=>" [out] "+w).join(`
|
|
145
145
|
`)),console.log(` -> Passed!
|
|
146
146
|
`)):(console.error(" -> Failed:",c.diagnostics),e=!1),console.log("Test Suite 5: Perl-style system() & String Operations");let u=t.run(`
|
|
147
147
|
res = system("ls -ltr");
|
|
@@ -163,7 +163,7 @@ try {
|
|
|
163
163
|
print("Split fruits array:", fruits);
|
|
164
164
|
print("Joined fruits:", join(fruits, " | "));
|
|
165
165
|
print("Title Case:", title_case("hello world of scripts"));
|
|
166
|
-
`);u.success?(console.log(u.output.map(
|
|
166
|
+
`);u.success?(console.log(u.output.map(w=>" [out] "+w).join(`
|
|
167
167
|
`)),console.log(` -> Passed!
|
|
168
168
|
`)):(console.error(" -> Failed:",u.diagnostics),e=!1),console.log("Test Suite 6: JSON Parsing & Object Primitive Methods");let p=t.run(`
|
|
169
169
|
res = system("echo '{\\"status\\": \\"ok\\", \\"code\\": 200, \\"users\\": [{\\"id\\": 1, \\"name\\": \\"Alice\\", \\"active\\": true}, {\\"id\\": 2, \\"name\\": \\"Bob\\", \\"active\\": false}], \\"server\\": {\\"host\\": \\"localhost\\", \\"port\\": 8080}}'");
|
|
@@ -204,7 +204,7 @@ try {
|
|
|
204
204
|
tags: ["json", "compiler"]
|
|
205
205
|
};
|
|
206
206
|
print("Local config dot access:", localConfig.app, "tags:", localConfig.tags[0]);
|
|
207
|
-
`);p.success?(console.log(p.output.map(
|
|
207
|
+
`);p.success?(console.log(p.output.map(w=>" [out] "+w).join(`
|
|
208
208
|
`)),console.log(` -> Passed!
|
|
209
209
|
`)):(console.error(" -> Failed:",p.diagnostics),e=!1),console.log("Test Suite 7: File I/O & Advanced Data Structures");let _=t.run(`
|
|
210
210
|
// 1. Raw file write and read
|
|
@@ -268,7 +268,7 @@ try {
|
|
|
268
268
|
print("Has department?", has_key(userMap, "department"));
|
|
269
269
|
delete_key(userMap, "department");
|
|
270
270
|
print("After delete_key has department?", has_key(userMap, "department"));
|
|
271
|
-
`);_.success?(console.log(_.output.map(
|
|
271
|
+
`);_.success?(console.log(_.output.map(w=>" [out] "+w).join(`
|
|
272
272
|
`)),console.log(` -> Passed!
|
|
273
273
|
`)):(console.error(" -> Failed:",_.diagnostics),e=!1),console.log("Test Suite 8: Concurrency & Synchronized State Access");let f=await t.runAsync(`
|
|
274
274
|
let counter = 0;
|
|
@@ -293,9 +293,9 @@ try {
|
|
|
293
293
|
assert(len(list) == 3, "list length must be 3");
|
|
294
294
|
assert(state.a == 100, "state.a must be 100");
|
|
295
295
|
assert(res1 == "a" && res2 == "b" && res3 == "c", "parallel results must match return values");
|
|
296
|
-
`);return f.success?(console.log(f.output.map(
|
|
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
|
|
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===`
|
|
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",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);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()}},nT=`# 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($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)
|
|
311
311
|
|
|
312
312
|
# String Utilities
|
|
313
313
|
fn is_blank(s) {
|
|
@@ -402,12 +402,12 @@ fn clamp(val, low, high) {
|
|
|
402
402
|
}
|
|
403
403
|
return val;
|
|
404
404
|
}
|
|
405
|
-
`,ca=null;fa=new WeakMap,Tr=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),Tr.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{for(let o of aa(i.value))typeof o!="string"&&o.kind==="property"&&(this.usedProperties=!0,this.checkPropertyPath(o.key,i))}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()}}},Ta=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}},wa=new WeakMap,ba=class{constructor(e){wa.set(this,e)}},qs=class{abortSignal;globalEnv;userFunctions=new Map;hostFunctions;stdout;stderr;lockManager=new Ta;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}
|
|
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
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(`
|
|
407
407
|
`)+(A.output.length>0?`
|
|
408
|
-
`:""),v=A.exitCode!==void 0?A.exitCode:A.success?0:1,
|
|
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,w={success:A.success&&v===0,stdout:S,output:[...A.output],value:A.value,exit_code:v,code:v,errors:A.errors??[]};return w.toString=()=>S,w}},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 T=e.get("sleep_ms");(!T||T.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"&&wa.has(s))try{let i=wa.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]}},lT=[{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;"}],cT=[{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");'}],dT=[{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 lT)this.functionDocs.set(e.name,{...e,module:e.module??"core"});for(let e of cT)this.functionDocs.set(e.name,{...e,module:e.module??"core"});for(let e of dT)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?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
|
|
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
|
`)+`
|
|
@@ -416,9 +416,9 @@ fn clamp(val, low, high) {
|
|
|
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",eT,{min:2,max:3},"Returns first full match and captures; g retains first-match shape, y is rejected"),this.registerFunction("regex_find_all",tT,{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,T)=>(T>=h?"[":"")+"arg"+(T+1)+(T>=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 aT(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??oT(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(T=>({name:T,line:1,column:1,file:n.file})),...i]){if(l.some(E=>E.name===f.name))continue;let T;try{T=this.builtinProviders.get(f.name)??this.hostCatalog.get(f.name)??(n.resolveHostModule??this.hostResolver)?.(f.name)}catch(E){let b=sT(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(!T)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=T.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(T.name!==f.name||!g||typeof T.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(T),c.set(T,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 T of this.hostCatalog.values())for(let g of T.declarations.functions)f.message.includes(`'${g.name}'`)&&(f.message+=`; provided by module '${T.name}': add import "${T.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]))&&mT()});var NL,Xt,pT,fT,gT,Ca,Na,Oa,fe,xa,pt,Ks,wr,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},pT=Xt(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal"]),fT=Xt({status:"string",error:"string|null",code:"ErrorCode?"}),gT=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"},wr={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,wr,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,wr,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,wr,{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"},wr,{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,wr,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 hT}from"node:fs";import{createRequire as _T}from"node:module";function yT(){return La===null&&(La=_T(import.meta.url)("node:sqlite").DatabaseSync),La}function TT(t){let e=vT[t];if(e!==void 0)return e;let n=ET[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=TT(t.errcode)),t}function wT(t){return t instanceof Error&&/cannot rollback - no transaction is active/i.test(t.message)}function bT(t){return t instanceof Error&&/no such savepoint:/i.test(t.message)}function Ma(t){return t.length===1&&ST(t[0])?[t[0]]:t}function ST(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,ET,vT,Pa,Ys,Da,$a=O(()=>{"use strict";La=null;ET={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"},vT={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:"&&!hT(e))throw new Error("unable to open database file");this.name=e;try{this.handle=new(yT())(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(!wT(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(!bT(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 kT}from"node:crypto";function RT(t,e,n){return kT("sha256").update(`${t}\0${e}\0${n}`).digest("hex")}function $e(t,e,n){let r=RT(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=>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)
|
|
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
|
|
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
|
|
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
|
|
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(`
|
|
446
446
|
CREATE TABLE IF NOT EXISTS session_size (
|
|
447
447
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
448
448
|
team_name 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),
|
|
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(`
|
|
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,9 +1281,9 @@ 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
|
|
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
|
|
1285
1285
|
`),process.argv.includes("--json")&&process.stderr.write(`${JSON.stringify({schema_skew:{db_version:e,build_version:n,mode:"best_effort"}})}
|
|
1286
|
-
`))}function
|
|
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
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(`
|
|
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)
|
|
@@ -1501,21 +1501,21 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1501
1501
|
AND started_at = ?
|
|
1502
1502
|
AND last_heartbeat_at IS ?
|
|
1503
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(
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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>
|
|
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
|
|
1519
1519
|
(receiver_teamfile, receiver_alias, currently_handling_message_id,
|
|
1520
1520
|
currently_handling_since, last_seq)
|
|
1521
1521
|
VALUES (?, ?, ?, ?, 0)
|
|
@@ -1525,12 +1525,12 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
@@ -1544,7 +1544,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
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:
|
|
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
|
|
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 = ?
|
|
@@ -1568,15 +1568,15 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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}.
|
|
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
|
|
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(`
|
|
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,26 +1983,26 @@ 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 Cw(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Ew,qm,vw,Tw,li,En=O(()=>{"use strict";$a();lm();dm();pm();gm();hn();oi();Mm();$m();Ew=3,qm=".recovery.lock",vw=20,Tw=50;li=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Aw(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)=>Cw("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=wm(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
|
+
`),...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(`
|
|
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
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:Iw(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&&!xw(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 Nw}from"node:os";import{join as Gm}from"node:path";function Mw(t=process.env){let e=t.LMCTL_HOME;return e!==void 0&&e.length>0?e:Gm(t.HOME||Nw(),Ow)}function Jm(t=process.env){return Gm(Mw(t),Lw)}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 Ow,Lw,di=O(()=>{"use strict";Ow=".lmctl",Lw="state.db"});import{isAbsolute as Pw,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"||!Pw(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 T of[...u])try{T.finalizeSync(h),y++}catch(g){_.push(G(g))}finally{u.delete(T)}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 Dw(t,e){let n=t.slice(0,e).split(/\r?\n/);return[n.length,n.pop().length+1]}function Fw(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+=`
|
|
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+=`
|
|
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]=
|
|
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
1996
|
|
|
1997
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 $w,Ar,za=O(()=>{$w=/^(\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($w);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?jw(t,r,e):t.s.charCodeAt(t.p+2)===58?Uw(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 jw(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 Uw(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 Hw(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;Hw(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 Bw}from"node:fs";import{homedir as Ww}from"node:os";import{join as cp,resolve as Xw}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?Xw(e):cp(n||cp(t.HOME||Ww(),".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(Bw(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 qw,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=qw(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 Gw(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 Jw(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 Kw(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(!
|
|
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
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=
|
|
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=
|
|
2003
|
-
`)}){let r=gt(t,ob(e)?e:void 0);if(
|
|
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
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:wi(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 Tb}from"node:url";function Rb(){return Ri(vb(),".lmctl","cache","lmprice")}function Jn(t,e){return Ri(t,e)}function Tn(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=Tn(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=Tn(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=Tn(Jn(t,yl)),r=Tn(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:Tn(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(Tb(import.meta.url)),n=t.pinDir!==void 0?t.pinDir:Pb();if(n!==null&&n!==""){let h=Tn(Ri(n,yl)),_=Tn(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,wb,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 wb,bb,Sb,kb,Cp,yl,El,Up,Ib,xb,vl,Mp,Wp=O(()=>{"use strict";wb="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 wn(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 Tl(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=wn(i),a=n.records.filter(l=>wn(l)!==o?!1:l.mode===void 0||l.mode===null||l.mode==="chat");return a.length===0?{kind:"known-unpriced",id:r}:Tl(a,o,wl)}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 _=wn(c[0]),y=n.records.filter(f=>s.matchRow(f,[_])&&wn(f)===_);return a(Tl(y.length>0?y:c,_,Xp[t]??wl))}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=wn(_),f=u.get(y);f?f.push(_):u.set(y,[_])}let m=Xp[t]??wl,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(Tl(p,wn(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(wn(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,wl,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};wl=[]});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 TS,tmpdir as wS}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(wS(),`lmctl-test-${process.pid}`,".lmctl"):jr(process.env.HOME||TS(),".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)}
|
|
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)}
|
|
2006
2006
|
\u2026 ${i} characters of ${n} \u2026
|
|
2007
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
2008
|
${NS(t,SS,"provider output not saved")}
|
|
@@ -2018,21 +2018,21 @@ ${r}`}}}function zn(t,e){return e===""?t:`${t}:${e.includes(`
|
|
|
2018
2018
|
`)?`
|
|
2019
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
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
|
|
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
|
|
2023
|
-
`,"utf-8"),!0}let s;try{s=JSON.parse(Sf(r,"utf-8"))}catch{return console.log(
|
|
2024
|
-
`,"utf-8"),i}var
|
|
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}
|
|
2025
2025
|
`)}),o=(a,l={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:a,params:l})}
|
|
2026
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
|
|
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
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.
|
|
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
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,
|
|
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
|
|
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),
|
|
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
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,
|
|
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,
|
|
@@ -2041,18 +2041,18 @@ ${r}`}}}function zn(t,e){return e===""?t:`${t}:${e.includes(`
|
|
|
2041
2041
|
WHERE s.id LIKE ?
|
|
2042
2042
|
ORDER BY s.time_updated DESC
|
|
2043
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:
|
|
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(`
|
|
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
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
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.
|
|
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=
|
|
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 T=e.sessionId||"",g=ji({tool:e.tool,onDelta:e.onDelta,...n.isolateResult?{isolateResult:n.isolateResult}:{}});g.setSessionId(T);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});T=N.sessionId,e.onSessionId?.(T);let A=N.sessionResponse;await tg(n,a,{sessionId:T,response:A},b),g.beginTurn(),y=!0,Se(`acp: prompt sent (${t.length} chars)`);let S;if(await b("session/prompt",{sessionId:T,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,T=ji({tool:t.tool,onDelta:A=>y?.(A),...e.isolateResult?{isolateResult:e.isolateResult}:{}});T.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(),T.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=T.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:T,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{T.beginTurn(),Se(`acp: bundle prompt sent (${A.length} chars)`);let w,R=!1;if(await new Promise((k,L)=>{I=L;let F,D=()=>{R=!0,m=Promise.resolve().then(()=>F).catch(()=>{}),T.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?T.cancelTurn():w=T.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,!w)throw new Error("ACP prompt completed without a result boundary");u.turnInFlight=!1,u.completedTurns+=1,Se(`acp: bundle result received (${w.result.length} chars, stopReason=${w.stopReason})`);let x=s&&r.length>0?[...r]:void 0;return s=!1,{result:w.result,sessionId:w.sessionId,stopReason:w.stopReason,durationMs:Date.now()-v,sawActivity:w.sawActivity,...x!==void 0?{warnings:x}:{}}}catch(w){throw I=null,T.cancelTurn(),u.turnInFlight=!1,u.exited?E():w}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(`
|
|
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
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:Te(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 T=l.get(f);return T||(T={id:f,turn:{id:f,status:"unknown"},responseIds:[]},l.set(f,T)),T},_=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 T=f.payload?.source_run_record_id;for(let I of[f.id,T])if(!(typeof I!="string"||I.length===0)&&d.has(I))return;for(let I of[f.id,T])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 T=="string"&&T.length>0?T: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,w=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 w=="number"&&Number.isSafeInteger(w)&&w>=0&&(N.outputTokens=w),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),T=[...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:T,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]:[]];we("muse",n,t.permissionMode??"yolo");let r=oR(t.progPath??"muse",n,{cwd:t.cwd,env:Te(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,w)=>{s===S&&(s=void 0,S.cleanup(),S.drained(),S.settled||(S.settled=!0,v?S.reject(v):(u++,S.resolve(w))))},y=S=>{i||(i=S,s&&_(s,i),T.close(i),!d&&!a&&te(r,{softDelayMs:t.closeTimeoutMs??2e3,killDelayMs:t.closeTimeoutMs??2e3}).catch(()=>{}))},f=(S,v)=>{let w=v.params;if(!w||w.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"&&w.turnId===S.id){_(S,new tr("Muse queued turn cancelled","external"));return}R==="turn/started"&&w.turnId===S.id&&(S.queued=!1);let x=w.item,k=w.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 w.itemId=="string"&&typeof w.delta=="string"){let D=S.items.get(w.itemId);if(!D)return;D.kind==="agentMessage"&&(w.field===void 0||w.field==="text")?(D.text=(D.text??"")+w.delta,S.cancelled||S.opts.onDelta?.(w.delta),L={kind:"text",raw:v}):D.kind==="reasoning"&&(L={kind:"thinking",raw:v})}if(S.cancelled||S.opts.onProgress?.(L),R!=="turn/completed"||w.turnId!==S.id)return;if(!["completed","failed","cancelled"].includes(w.terminal)){y(new Error(`Muse returned an unknown turn terminal: ${String(w.terminal)}`));return}if(S.cancelled||w.terminal==="cancelled"){_(S,new tr("Muse turn cancelled",S.cancelled?"external":"provider"));return}if(w.terminal!=="completed"){_(S,new Error(w.error?.message??w.reason??`Muse turn ended with ${String(w.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 w.durationMs=="number"?w.durationMs:Date.now()-S.started,stopReason:w.terminal,...F.some(D=>D.truncated)?{warnings:["Muse reported a truncated response; inspect the native transcript for complete content"]}:{}})},T=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,w=ns())=>(await T.sendRpc(S,{...v,commandId:w})).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 w=v instanceof Error?v.message:String(v);/already started|not queued|launch boundary|turn is running/i.test(w)?(S.queued=!1,E(S)):s===S&&y(v instanceof Error?v:new Error(w))}))},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?T.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")),T.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 T.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");T.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((w,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:w,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 Tg}from"node:fs/promises";import{basename as T$,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 wg(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),T=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:T,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:(T??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:T??f,content:y.output.text,model:g});continue}let A=new Map,S=new Map,v=new Set,w=[];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=w.length;w.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,w[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=wg(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&&w[k].io.push({direction:"read",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"}),B&&w[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=wg(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)??T??f,content:Yi(V?x?.error:x?.result),toolName:F,...k?{toolCallId:k}:{}}),L===void 0){d=!0;continue}let B=w[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=w[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 w){let x=R.response,k=kg(x),L=s(x.completedAt??x.startedAt)??T??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:T??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 Tg(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 Tg(`${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(`
|
|
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(`
|
|
2056
2056
|
|
|
2057
2057
|
--- additional response (turn ${n+1} of ${t.length}; likely an injected mid-call notification) ---
|
|
2058
2058
|
|
|
@@ -2060,75 +2060,75 @@ ${n}`:n}function Hk(t,e){return Zr(t)?.filterExpectedStderr?.(e)??e}function eg(
|
|
|
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),
|
|
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(`
|
|
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
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,
|
|
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(`
|
|
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
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
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
|
|
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.
|
|
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(
|
|
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+`
|
|
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
|
|
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:
|
|
2079
|
-
`)})}function h(S,v={}){let
|
|
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`),
|
|
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(
|
|
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+`
|
|
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(`
|
|
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
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(`
|
|
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),
|
|
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:
|
|
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=[],
|
|
2088
|
-
`);N.includes("user.text")&&A&&(!I.id||!y.has(I.id))&&(
|
|
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"&&
|
|
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
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
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(`
|
|
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
|
|
2094
|
-
`).trim();I&&i.push({role:"thinking",timestamp:xn(C.timestamp,
|
|
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
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
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,
|
|
2098
|
-
`).trim():""}function Sh(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function
|
|
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(!
|
|
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
|
|
2101
|
-
`);for(;f>=0;){let
|
|
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);
|
|
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(`
|
|
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(`
|
|
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 To,Fh=O(()=>{"use strict";be();To=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 T=f.functionResponse,g=MI(T.response),E=ds(p.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:_,content:E??g??p.toolCallResult?.status??"tool result",toolName:T.name,toolCallId:p.toolCallResult?.callId??T.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 T=f.thinking||f.text;T&&u.push({role:"thinking",timestamp:_,content:T})}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 To(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 Tt}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 wo,Vh=O(()=>{"use strict";be();wo=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 $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 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 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),T=Ze(_.args),g={role:"tool_use",timestamp:p,content:f,toolName:y,toolInput:f,toolInputData:T};o.push(g),d.push({name:y,stepIndex:m.step_index,input:T,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=Tt(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(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=Jh(n);return r?(await Uh(this.conversationPath(r),{force:!0}),await Uh(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 UI(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 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=Tt(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:Te(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 wo(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)=>
|
|
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
|
|
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:
|
|
2107
2107
|
${o}`:"",a?`stderr:
|
|
2108
2108
|
${a}`:""].filter(Boolean).join(`
|
|
2109
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=
|
|
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);
|
|
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,
|
|
2112
2112
|
last_activity_at, message_count, input_tokens, output_tokens,
|
|
2113
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
|
|
2114
2114
|
WHERE source = ?
|
|
2115
2115
|
ORDER BY COALESCE(last_activity_at, started_at) DESC
|
|
2116
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,
|
|
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)=>we("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 wd,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_(wd(_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(wd(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(wd(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 T_(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 w_(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 Td}var lr,Zx,eA,y_,vd,Td,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(w_)}async loadSession(e){let n=Oo(e);return n===void 0?null:{...w_(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}},Td=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 T_(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 T_(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}),Tc({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();wc();xc();Oc();Pc();Uc();Wc();Gc();Yc();od();ud();hd();Sd();yc();wc();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 TA(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 wA(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=wA(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,T)=>{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)?TA(E,C,m):E;if(u[b]==="decimal"){let N=n!==void 0&&T===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=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(`
|
|
2120
2120
|
`);return y===""||d===""?y:`${d}${y.split(`
|
|
2121
2121
|
`).join(`
|
|
2122
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}`:`${
|
|
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
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
2125
|
`)}function dn(t,e){return t.stderr.write(`error: ${e}
|
|
2126
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
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
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
|
|
2130
|
-
`);let i=Al(r.members,{agyModelsRunner:yy,codexModelsRunner:Ey});i.push(...await vy(r.members)),s.push(...await
|
|
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
|
|
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}
|
|
2132
2132
|
`);return e.stderr.write(`notice: ${a.length} error${a.length===1?"":"s"}, ${l.length} warning${l.length===1?"":"s"}
|
|
2133
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}
|
|
2134
2134
|
|
|
@@ -2141,7 +2141,7 @@ After this seed finishes, use \`lmctl prompt ${JSON.stringify(n)} <alias> "<mess
|
|
|
2141
2141
|
`);for(let g of Al(o.members,{agyModelsRunner:yy,codexModelsRunner:Ey}))e.stderr.write(`warning: ${g}
|
|
2142
2142
|
`);for(let g of await vy(o.members))e.stderr.write(`warning: ${g}
|
|
2143
2143
|
`);for(let g of Ol(o.members,i))e.stderr.write(`warning: ${g}
|
|
2144
|
-
`);let m=await
|
|
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
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
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
|
|
2147
2147
|
`);continue}let E=g.sessiondir??i;e.stderr.write(`${g.alias}: launching ${g.provider} seed session; this can take several seconds
|
|
@@ -2151,35 +2151,35 @@ After this seed finishes, use \`lmctl prompt ${JSON.stringify(n)} <alias> "<mess
|
|
|
2151
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
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}`}
|
|
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),
|
|
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
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)"}
|
|
2156
2156
|
`)}finally{N()}}let y=l.join(`
|
|
2157
2157
|
`),f=LC(y,Hd(r));f!==y&&hy(r,f,"utf8"),h===0&&e.stdout.write(`no members needed seeding
|
|
2158
|
-
`);let
|
|
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(`
|
|
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
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
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
|
|
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
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
|
|
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
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
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
|
|
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
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 wN(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 T=typeof f=="number"?f:typeof f=="string"&&f.trim()!==""?Number(f):NaN;return Number.isSafeInteger(T)&&T>=0&&T<=9?T:void 0},l=f=>{let T=typeof f=="number"?f:typeof f=="string"&&f.trim()!==""?Number(f):NaN;return Number.isFinite(T)?T: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,T,g)=>T===void 0||g!==void 0&&g!=="USD"||l(f)===void 0?void 0:(l(f)/10**T).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,T=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 T();if(E)return E}let g=()=>fetch(`${vN}/api/oauth/usage`,{headers:{Authorization:`Bearer ${i.accessToken}`,"anthropic-beta":TN,"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 T();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 T=await oE(i,e,t,{debug:n,onRawResponse:r});return T||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),T=await oE(i,e,t,{debug:n,onRawResponse:r});return T||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 T=f.kind,g=wN(T==="session"?"session":T),E=f.scope?.model?.display_name,b=T==="session"?"session":T==="weekly_all"?"week-all-models":`week-scoped-${E||T}`;return[Ve({bucket_id:b,group_name:T==="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 T=p[f];return!T||typeof T!="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(T.utilization,"percent"),resets_at_iso:T.resets_at,raw_value:T.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,T)=>String(f.window_type).localeCompare(String(T.window_type))||String(f.bucket_id).localeCompare(String(T.bucket_id))),...y?{spend_control:y}:{}})}var vN,TN,iE,Re,RN,dE=O(()=>{"use strict";Ut();sE();Ut();vN="https://api.anthropic.com",TN="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 Ts(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=Ts(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=Ts(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=Ts(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=Ts(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=Ts(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,T=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 T();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,TE=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 wE,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){wE(eO(t),{recursive:!0}),IE(t,"",{flag:"a",mode:384});let n=`${t}.lock`;for(;;){if(e.aborted)throw new Error("refresh_locked");try{wE(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),
|
|
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
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
|
|
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
|
|
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.
|
|
2179
2179
|
The session marker may be stale or the team may not be registered in this lmctl database.
|
|
2180
2180
|
Consulted ${Km(r,s)}
|
|
2181
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,w=>ht(t.teamfile,t.alias,w));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,w=>HO(w,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,T=await re(n,w=>w.getRootTeam(y)?.name??null);T!==null&&(f.LMBEE_TEAM_NAME=T),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 w=ws(g);return Pn(i,r,t.prompt,w,"unavailable"),d=mu(w,null),{status:"busy",message:w,teamChatLogId:null}}let E=!1;if(t.heldLease!==void 0){let w=t.heldLease;if(!await re(n,x=>{let k=x.getAgentInflight(p,m.alias);return k===null||k.sender_teamfile!==w.row.sender_teamfile||k.sender_alias!==w.row.sender_alias||k.started_at!==w.row.started_at||k.holder_pid!==process.pid?!1:x.heartbeatAgentInflight(w.row,w.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 w=await NO(n,p,m.alias);if(w.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=w.idleReclaim}if(_!==null&&_.teamfile!==p){let w=await re(n,R=>HE(R,{root:y,sender:_,receiverTeamfile:p,receiverAlias:m.alias,now:new Date}));if(w.stop){let R=WE(w.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 w=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(!w.acquired){let R=av(p,m.alias,w.current);return R+=` ${ou(iu({holderPid:w.current.holder_pid,since:w.current.started_at}))}`,Pn(i,r,t.prompt,R,"unavailable"),d=mu(R,null),{status:"busy",message:R,teamChatLogId:null}}s={row:w.lease,leaseId:w.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:w=>e({kind:"delta",chunk:w}),onProgress:w=>e({kind:"progress",alias:m.alias,event:w}),onPromptBuilt:async w=>{u=w,l===null&&(l=await qO(n,{...r,message:w}),l!==null&&(t.onAccepted?.(It(l)),i!==null&&await FO(n,i,l))),i!==null&&await DO(n,i,w)}});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 w=A;Pn(i,r,u,w,"error"),d=bs(w,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 ws(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)}
|
|
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
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
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
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)}
|
|
@@ -2189,31 +2189,31 @@ To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}
|
|
|
2189
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
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
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
|
|
2193
|
-
`);try{let
|
|
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
2194
|
`),c=pv(t,m=>`batch ${Rs(t)}: prompt ${r}/${s} still running (${m}s elapsed)
|
|
2195
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}
|
|
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
|
|
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:
|
|
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:()=>
|
|
2200
|
-
`)?
|
|
2201
|
-
`),
|
|
2202
|
-
`),
|
|
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(`
|
|
2200
|
+
`)?T:T+`
|
|
2201
|
+
`),T},lm_error:(...v)=>{let T=xv(v);return(a.getStore()?.errors??o).push(T),l().stderr("error: "+T+`
|
|
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
|
|
2205
|
-
`),{status:"error"};throw g("lm_seed",x)},lm_agent:
|
|
2206
|
-
`),null}let L={};return d.set(L,k.batch),I(L),u.set(L.id,L),L},lm_batch_turn:async(v,
|
|
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})
|
|
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
|
-
`);;){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
|
|
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(!
|
|
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+`
|
|
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
|
-
`);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
|
|
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
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
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
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+`
|
|
@@ -2223,15 +2223,15 @@ To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}
|
|
|
2223
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
2224
|
`),1;let y,f;try{if(_)y="";else if(h==="-e"){let k=n.shift();if(k===void 0)return l(xs+`
|
|
2225
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
|
|
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+`
|
|
2227
2227
|
`),stderr:k=>l(k.endsWith(`
|
|
2228
2228
|
`)?k:k+`
|
|
2229
|
-
`)},N=await
|
|
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
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)}},
|
|
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+`
|
|
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",
|
|
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};
|