@lmctl-ai/lmctl 0.2.26 → 0.2.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli/index.js +129 -129
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -884,7 +884,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
884
884
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${t.name}: a target is required.
885
885
  Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ie,KS,YS,zS,Ai,Oe=k(()=>{"use strict";Ae();Ae();Et();cl();ie=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},KS=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,YS=/^ses_[A-Za-z0-9_-]+$/,zS=/^session_[A-Za-z0-9_-]+$/,Ai=/^[A-Za-z][A-Za-z0-9_-]*$/});import{existsSync as QS,mkdirSync as ZS,readFileSync as eb,renameSync as tb,unlinkSync as rb,writeFileSync as nb}from"node:fs";import{homedir as tf}from"node:os";import{dirname as Jn,join as Me,resolve as sb}from"node:path";function sn(t,e,r){let n=Jn(sb(r)),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??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())Tt(Me(o,".mcp.json"),"mcpServers",[zt(),Qt()]),a.has("opencode")&&Tt(Me(o,".opencode","opencode.json"),"mcp",[rf(),nf()]),a.has("kimi")&&Tt(Me(o,".kimi-code","mcp.json"),"mcpServers",[zt(),Qt()]);for(let o of s)cb(o)}function ob(t=dl??tf()){return Me(t,".copilot","mcp-config.json")}function ab(t,e){ze.mkdirSync(Jn(t),{recursive:!0});let r=Me(Jn(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{ze.writeFileSync(r,`${JSON.stringify(e,null,2)}
886
886
  `,"utf8"),ze.renameSync(r,t)}catch(n){try{ze.unlinkSync(r)}catch{}throw n}}function lb(t,e){ze.mkdirSync(Jn(t),{recursive:!0});let r=Me(Jn(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{ze.writeFileSync(r,e,"utf8"),ze.renameSync(r,t)}catch(n){try{ze.unlinkSync(r)}catch{}throw n}}function Tt(t,e,r){try{if(!ze.existsSync(t))return;let n=JSON.parse(ze.readFileSync(t,"utf8"));if(!nn(n)||!nn(n[e]))return;let s={...n[e]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[e]=s,ab(t,n),C({event:"mcp_cleanup",path:t,removed:i})}catch{}}function zt(){return{name:Ni,shouldRemove:_b}}function rf(){return{name:Ni,shouldRemove:yb}}function Qt(){return{name:Ri,shouldRemove:hb}}function nf(){return{name:Ri,shouldRemove:gb}}function cb(t){let e=dl??tf();switch(t){case"copilot":Tt(ob(e),"mcpServers",[zt(),Qt()]);return;case"claude":Tt(Me(e,".claude.json"),"mcpServers",[zt(),Qt()]);return;case"gemini":Tt(Me(e,".gemini","settings.json"),"mcpServers",[zt(),Qt()]);return;case"qwen":Tt(Me(e,".qwen","settings.json"),"mcpServers",[zt(),Qt()]);return;case"agy":Tt(Me(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[zt(),Qt()]);return;case"opencode":Tt(Me(e,".config","opencode","opencode.json"),"mcp",[rf(),nf()]);return;case"kimi":Tt(Me(dl===void 0?process.env.KIMI_CODE_HOME??Me(e,".kimi-code"):Me(e,".kimi-code"),"mcp.json"),"mcpServers",[zt(),Qt()]);return;case"codex":db(Me(e,".codex","config.toml"));return;default:return}}function db(t){try{if(!ze.existsSync(t))return;let e=ze.readFileSync(t,"utf8"),r=ub(e);if(r===null)return;let n=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=sf(l);if(c===null)return;if(c!==void 0){if(ef(c,r)){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 u=fb(l);if(u===null)return;if(u!==void 0&&ef(u,r)){i.add(u[1]);continue}s.push(l)}if(i.size===0)return;lb(t,s.join(`
887
- `)),C({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function ef(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function ub(t){let e=new Map,r;for(let s of t.split(/\n/)){let i=sf(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=mb(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Ri&&c[1]!==Ni)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let f=of(l);if(f===null)return null;u.command=f}else if(c[2]==="args"){let f=pb(l);if(f===null)return null;u.args=f}e.set(c[1],u)}let n=new Set;for(let[s,i]of e.entries())s===Ri&&lf(i.command,i.args)&&n.add(s),s===Ni&&cf(i.command,i.args)&&n.add(s);return n}function mb(t,e){if(t.startsWith("mcp_servers"))return Li(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=Li(t);return r===null?null:[...e,...r]}function sf(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Li(e[1])}function fb(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Li(r)}function Li(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",i=!1;for(;r<t.length;){let o=t[r];if(o==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function of(t){let e=af(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function pb(t){let e=af(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>of(s.trim()));return n.some(s=>s===null)?null:n}function af(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function hb(t){return nn(t)?t.type==="stdio"&&typeof t.command=="string"&&lf(t.command,t.args):!1}function gb(t){return!nn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&uf(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"&&df(t.command[0],[t.command[1],t.command[2]])}function _b(t){return nn(t)?t.type==="stdio"&&cf(t.command,t.args):!1}function yb(t){return!nn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&mf(t.command[0])&&t.command[1]==="mcp"}function lf(t,e){return uf(t)&&ff(e)||df(t,e)}function cf(t,e){return mf(t)&&ff(e)}function df(t,e){return Eb(t)&&Array.isArray(e)&&e.length===2&&wb(e[0])&&e[1]==="mcp"}function uf(t){return typeof t=="string"&&ul(t)==="lmctl"}function mf(t){return typeof t=="string"&&ul(t)==="lmctl0"}function Eb(t){if(typeof t!="string")return!1;let e=ul(t).toLowerCase();return e==="node"||e==="node.exe"}function wb(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 ul(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function ff(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function nn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ri,Ni,ib,ze,dl,Ci=k(()=>{"use strict";K();Ri="lmctl",Ni="lmctl0",ib={existsSync:QS,mkdirSync:ZS,readFileSync:eb,writeFileSync:nb,renameSync:tb,unlinkSync:rb},ze=ib});function gf(t){let e=pf(t.registry,t.fromTeamfile);if(e===void 0)return on(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!hf(e,t.fromAlias))return on(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=pf(t.registry,t.toTeamfile);return r===void 0?on(`target team is not registered in policy graph: ${t.toTeamfile}`):hf(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?on(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?on(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:on(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function pf(t,e){return t.teams.find(r=>r.teamfile===e)}function hf(t,e){return t.aliases.some(r=>r===e)}function on(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var _f=k(()=>{"use strict"});import{basename as Tb}from"node:path";function wf(t,e){let r=new Date(e.now.getTime()-vt()).toISOString(),n=Sf(t,r).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=Ib(e.sender,n),i=xb(e.sender,n);i!==null&&i.teamfile===e.root&&!Ef(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(m=>Ef(m,o)),c=l.map(m=>m.at).filter(m=>m!==null).sort((m,h)=>h-m)[0]??null,u=c!==null&&e.now.getTime()-c<vb,f=ml(e.sender,n).length;return{stop:l.length>=1&&u&&f>=Sb,chain:kb(a)}}function Tf(t,e){let r=new Date(e.now.getTime()-vt()).toISOString(),n=Sf(t,r),s=ml(e.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function vt(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return yf;let r=Number(e);return!Number.isFinite(r)||r<=0?yf:r}function vf(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function bb(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 Sf(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(bb).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function Ib(t,e,r={}){let n=new Map;for(let a of e)n.set(xr(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([xr(t)]);for(let a=0;a<64;a+=1){let l=n.get(xr(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:")&&r.includePromptSender!==!0)break;let u=xr(l.sender);if(o.has(u))break;s.unshift(c),o.add(u),i=l.sender}return s}function ml(t,e){let r=xr(t),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let c=xr(l.sender),u=xr(l.receiver);c!==a&&u!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return i.sort((o,a)=>o.at-a.at)}function xb(t,e){let r=ml(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function Ef(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function xr(t){return`${t.teamfile}\0${t.alias}`}function kb(t){return t.map(e=>`${Tb(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var vb,Sb,yf,Vn=k(()=>{"use strict";vb=6e4,Sb=2,yf=8*60*60*1e3});function bf(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(`
887
+ `)),C({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function ef(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function ub(t){let e=new Map,r;for(let s of t.split(/\n/)){let i=sf(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=mb(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Ri&&c[1]!==Ni)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let f=of(l);if(f===null)return null;u.command=f}else if(c[2]==="args"){let f=pb(l);if(f===null)return null;u.args=f}e.set(c[1],u)}let n=new Set;for(let[s,i]of e.entries())s===Ri&&lf(i.command,i.args)&&n.add(s),s===Ni&&cf(i.command,i.args)&&n.add(s);return n}function mb(t,e){if(t.startsWith("mcp_servers"))return Li(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let r=Li(t);return r===null?null:[...e,...r]}function sf(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Li(e[1])}function fb(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Li(r)}function Li(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",i=!1;for(;r<t.length;){let o=t[r];if(o==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function of(t){let e=af(t).trim();if(e.startsWith('"'))try{let r=JSON.parse(e);return typeof r=="string"?r:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function pb(t){let e=af(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>of(s.trim()));return n.some(s=>s===null)?null:n}function af(t){let e;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==void 0){if(e==='"'&&n==="\\"){r+=1;continue}n===e&&(e=void 0);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function hb(t){return nn(t)?t.type==="stdio"&&typeof t.command=="string"&&lf(t.command,t.args):!1}function gb(t){return!nn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&uf(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"&&df(t.command[0],[t.command[1],t.command[2]])}function _b(t){return nn(t)?t.type==="stdio"&&cf(t.command,t.args):!1}function yb(t){return!nn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&mf(t.command[0])&&t.command[1]==="mcp"}function lf(t,e){return uf(t)&&ff(e)||df(t,e)}function cf(t,e){return mf(t)&&ff(e)}function df(t,e){return Eb(t)&&Array.isArray(e)&&e.length===2&&wb(e[0])&&e[1]==="mcp"}function uf(t){return typeof t=="string"&&ul(t)==="lmctl"}function mf(t){return typeof t=="string"&&ul(t)==="lmctl0"}function Eb(t){if(typeof t!="string")return!1;let e=ul(t).toLowerCase();return e==="node"||e==="node.exe"}function wb(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 ul(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(n=>n.length>0).at(-1)??e}function ff(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function nn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ri,Ni,ib,ze,dl,Ci=k(()=>{"use strict";K();Ri="lmctl",Ni="lmctl0",ib={existsSync:QS,mkdirSync:ZS,readFileSync:eb,writeFileSync:nb,renameSync:tb,unlinkSync:rb},ze=ib});function gf(t){let e=pf(t.registry,t.fromTeamfile);if(e===void 0)return on(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!hf(e,t.fromAlias))return on(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=pf(t.registry,t.toTeamfile);return r===void 0?on(`target team is not registered in policy graph: ${t.toTeamfile}`):hf(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?on(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?on(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:on(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function pf(t,e){return t.teams.find(r=>r.teamfile===e)}function hf(t,e){return t.aliases.some(r=>r===e)}function on(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var _f=k(()=>{"use strict"});import{basename as Tb}from"node:path";function wf(t,e){let r=new Date(e.now.getTime()-vt()).toISOString(),n=Sf(t,r).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=Ib(e.sender,n),i=xb(e.sender,n);i!==null&&i.teamfile===e.root&&!Ef(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(m=>Ef(m,o)),c=l.map(m=>m.at).filter(m=>m!==null).sort((m,g)=>g-m)[0]??null,u=c!==null&&e.now.getTime()-c<vb,f=ml(e.sender,n).length;return{stop:l.length>=1&&u&&f>=Sb,chain:kb(a)}}function Tf(t,e){let r=new Date(e.now.getTime()-vt()).toISOString(),n=Sf(t,r),s=ml(e.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function vt(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return yf;let r=Number(e);return!Number.isFinite(r)||r<=0?yf:r}function vf(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function bb(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 Sf(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(bb).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function Ib(t,e,r={}){let n=new Map;for(let a of e)n.set(xr(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([xr(t)]);for(let a=0;a<64;a+=1){let l=n.get(xr(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:")&&r.includePromptSender!==!0)break;let u=xr(l.sender);if(o.has(u))break;s.unshift(c),o.add(u),i=l.sender}return s}function ml(t,e){let r=xr(t),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let c=xr(l.sender),u=xr(l.receiver);c!==a&&u!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return i.sort((o,a)=>o.at-a.at)}function xb(t,e){let r=ml(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function Ef(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function xr(t){return`${t.teamfile}\0${t.alias}`}function kb(t){return t.map(e=>`${Tb(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var vb,Sb,yf,Vn=k(()=>{"use strict";vb=6e4,Sb=2,yf=8*60*60*1e3});function bf(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(`
888
888
  INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
889
889
  VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
890
890
  ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
@@ -1130,7 +1130,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1130
1130
  holder_pid = NULL, holder_host = NULL, started_at = NULL,
1131
1131
  last_heartbeat_at = NULL, last_seq = ?
1132
1132
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1133
- AND lease_id IS ? AND last_seq = ?`).run(r,e.receiver_teamfile,e.receiver_alias,e.lease_id,e.last_seq);un(s.changes,n)}function Df(t,e,r,n,s=null,i=!1){let o=Db();if(r!==null&&n===null)throw new Error("agent inflight takeover is missing a reclaim reason");let a=dn(t,e.receiver_teamfile,e.receiver_alias);if(a!==null&&a.lease_id!==null){if(!(i||Ub(a,s)))throw new Error("event projection rejected INFLIGHT_TAKE: receiver already holds a live lease");let f=jb(a,n,i),d=Bb(a),m=a.lease_id;je(t,{stream_id:m,event_type:"INFLIGHT_RECLAIM",observedLastSeq:a.last_seq,ts:e.started_at,payload:{receiver:er(e.receiver_teamfile,e.receiver_alias),reason:f,previous_holder:d}},h=>Mf(t,a,h,"INFLIGHT_RECLAIM")),a=dn(t,e.receiver_teamfile,e.receiver_alias)}let l=a?.last_seq??0,c=`lease_${Mb()}`;return je(t,{stream_id:c,event_type:"INFLIGHT_TAKE",observedLastSeq:l,ts:e.started_at,payload:{lease_id:c,receiver:er(e.receiver_teamfile,e.receiver_alias),sender:er(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:o,started_at:e.started_at}},u=>{if(a===null){t.prepare(`INSERT INTO agent_state
1133
+ AND lease_id IS ? AND last_seq = ?`).run(r,e.receiver_teamfile,e.receiver_alias,e.lease_id,e.last_seq);un(s.changes,n)}function Df(t,e,r,n,s=null,i=!1){let o=Db();if(r!==null&&n===null)throw new Error("agent inflight takeover is missing a reclaim reason");let a=dn(t,e.receiver_teamfile,e.receiver_alias);if(a!==null&&a.lease_id!==null){if(!(i||Ub(a,s)))throw new Error("event projection rejected INFLIGHT_TAKE: receiver already holds a live lease");let f=jb(a,n,i),d=Bb(a),m=a.lease_id;je(t,{stream_id:m,event_type:"INFLIGHT_RECLAIM",observedLastSeq:a.last_seq,ts:e.started_at,payload:{receiver:er(e.receiver_teamfile,e.receiver_alias),reason:f,previous_holder:d}},g=>Mf(t,a,g,"INFLIGHT_RECLAIM")),a=dn(t,e.receiver_teamfile,e.receiver_alias)}let l=a?.last_seq??0,c=`lease_${Mb()}`;return je(t,{stream_id:c,event_type:"INFLIGHT_TAKE",observedLastSeq:l,ts:e.started_at,payload:{lease_id:c,receiver:er(e.receiver_teamfile,e.receiver_alias),sender:er(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:o,started_at:e.started_at}},u=>{if(a===null){t.prepare(`INSERT INTO agent_state
1134
1134
  (receiver_teamfile, receiver_alias, lease_id, sender_teamfile,
1135
1135
  sender_alias, holder_pid, holder_host, started_at,
1136
1136
  last_heartbeat_at, last_seq)
@@ -1583,18 +1583,18 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1583
1583
  response = NULL
1584
1584
  WHERE id = ?
1585
1585
  AND status = 'running'
1586
- `),...kf(t),...bf(t)}}function dI(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Zb,sp,eI,tI,Fi,tr=k(()=>{"use strict";Ei();Si();If();Af();Nf();kr();Di();Jf();zf();Zb=3,sp=".recovery.lock",eI=20,tI=50;Fi=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=cI(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,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(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let f=o(a);if(f.concurrency_key!==null&&(a.concurrency_key_resolved!==f.concurrency_key&&this.stmts.setJobConcurrencyKey.run(f.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(f.concurrency_key,i,a.id)?.count??0)>=Math.max(1,f.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,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:r,status:h?.status??a.status,locked_by:h?.locked_by??a.locked_by,locked_until:h?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>dI("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);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,n,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(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==Yf)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 u=JSON.parse(i.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(o=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(f=>typeof f=="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(n!==Vf&&!a.includes(n))return{resumed:!1,reason:Kf};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[o]=n,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,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(r.receiver_teamfile,r.receiver_alias),i=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.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:n.reclaim_reason??(n.force===!0?"force":n.reclaim_observed!==void 0?"dead-pid":"stale"),c=Df(this.db,o,s,l,n.stale_before??null,n.force===!0);a={acquired:!0,current:o,lease_id:c}}else a={acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.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,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){tp(e.name,e.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,$()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,$());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),i}upsertWorkflow(e){tp(e.name,e.definition,o=>this.getWorkflowByName(o));let r=this.getWorkflowByName(e.name);if(r===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(r.id)?.version??r.version)+1,i=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,$());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,$())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,r,n??null,$());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.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,$()),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,r){return this.stmts.setTriggerCursor.run(r,$(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run($(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.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 r=this.stmts.insertTeam.run(e.name,$());return this.stmts.getTeam.get(r.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 r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,$());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,$(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,$());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=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",$());return this.stmts.getProject.get(r.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,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.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 r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,$());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.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,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=$(),n=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,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,$(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,$(),e)??null}closeIssue(e,r,n){let s=$(),i=this.stmts.closeIssue.get(r,n??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,$(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,$(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=$();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,$(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,$(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Qf(),s=$();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let i=$(),o=this.stmts.insertChatbotMessage.run(e,r,n,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,r){this.stmts.upsertConfig.run(e,r,$())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=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??$(),e.dedupe_key??null,e.concurrency_key??null,$());if(r.changes===1)return this.stmts.getJob.get(r.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 r=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:$();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,$()),s=this.stmts.getRun.get(n.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,r){return this.stmts.setJobRun.run(r,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,$()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??$(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,$());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=$(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,$(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run($(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??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,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.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 r=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),n=Number(r.lastInsertRowid);return gl(this.db,n,e),Mi(this.db,n,e),n})()}beginTeamChatLog(e){return this.db.transaction(()=>{let r=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),n=Number(r.lastInsertRowid);return gl(this.db,n,e),n})()}finishTeamChatLog(e,r){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);Mi(this.db,e,r)})()}setCurrentlyHandlingMessage(e,r,n){this.db.transaction(()=>{pl(this.db,e,r,n)})()}clearCurrentlyHandlingMessage(e,r,n){return this.db.transaction(()=>hl(this.db,e,r,n))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}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 r=e.started_at??$(),n=e.holder_host??El(),s=e.last_heartbeat_at??r,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),r,e.holder_pid??null,n,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 Wf(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,r,n={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,r];n.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(n.sinceMs).toISOString())),n.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(n.untilMs).toISOString()));let o=Math.max(1,Math.trunc(n.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,r){if(e.length===0)return[];let n=e.map(()=>"?").join(", ");return this.db.prepare(`
1586
+ `),...kf(t),...bf(t)}}function dI(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var Zb,sp,eI,tI,Fi,tr=k(()=>{"use strict";Ei();Si();If();Af();Nf();kr();Di();Jf();zf();Zb=3,sp=".recovery.lock",eI=20,tI=50;Fi=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=cI(e),this.claimTxn=e.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,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(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let f=o(a);if(f.concurrency_key!==null&&(a.concurrency_key_resolved!==f.concurrency_key&&this.stmts.setJobConcurrencyKey.run(f.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(f.concurrency_key,i,a.id)?.count??0)>=Math.max(1,f.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,s,i,a.id,i,i,i).changes!==1){let g=this.getJob(a.id);return{claimed:!1,reason:g?.locked_until!==null&&g?.locked_until!==void 0&&g.locked_until>=i?"locked":"not_claimable",job_id:r,status:g?.status??a.status,locked_by:g?.locked_by??a.locked_by,locked_until:g?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:r}:{claimed:!0,job:m}}),this.resumeRunTxn=e.transaction((r,n,s)=>dI("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);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,n,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(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==Yf)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 u=JSON.parse(i.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(o=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(f=>typeof f=="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(n!==Vf&&!a.includes(n))return{resumed:!1,reason:Kf};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[o]=n,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,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(r.receiver_teamfile,r.receiver_alias),i=n.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.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:n.reclaim_reason??(n.force===!0?"force":n.reclaim_observed!==void 0?"dead-pid":"stale"),c=Df(this.db,o,s,l,n.stale_before??null,n.force===!0);a={acquired:!0,current:o,lease_id:c}}else a={acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.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,...r){let n=e.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...r)}insertWorkflow(e){tp(e.name,e.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,$()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,$());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),i}upsertWorkflow(e){tp(e.name,e.definition,o=>this.getWorkflowByName(o));let r=this.getWorkflowByName(e.name);if(r===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(r.id)?.version??r.version)+1,i=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,$());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,$())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,r,n??null,$());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.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,$()),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,r){return this.stmts.setTriggerCursor.run(r,$(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run($(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.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 r=this.stmts.insertTeam.run(e.name,$());return this.stmts.getTeam.get(r.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 r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,$());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,$(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,$());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=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",$());return this.stmts.getProject.get(r.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,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.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 r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,$());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.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,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=$(),n=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,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(e,r){return this.stmts.claimNextIssue.get(r,$(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,$(),e)??null}closeIssue(e,r,n){let s=$(),i=this.stmts.closeIssue.get(r,n??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,$(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,$(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=$();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,$(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,$(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=Qf(),s=$();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let i=$(),o=this.stmts.insertChatbotMessage.run(e,r,n,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,r){this.stmts.upsertConfig.run(e,r,$())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=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??$(),e.dedupe_key??null,e.concurrency_key??null,$());if(r.changes===1)return this.stmts.getJob.get(r.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 r=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=$(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:$();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,$()),s=this.stmts.getRun.get(n.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,r){return this.stmts.setJobRun.run(r,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,$()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??$(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,$());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=$(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,$(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run($(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??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,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.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 r=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),n=Number(r.lastInsertRowid);return gl(this.db,n,e),Mi(this.db,n,e),n})()}beginTeamChatLog(e){return this.db.transaction(()=>{let r=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),n=Number(r.lastInsertRowid);return gl(this.db,n,e),n})()}finishTeamChatLog(e,r){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);Mi(this.db,e,r)})()}setCurrentlyHandlingMessage(e,r,n){this.db.transaction(()=>{pl(this.db,e,r,n)})()}clearCurrentlyHandlingMessage(e,r,n){return this.db.transaction(()=>hl(this.db,e,r,n))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}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 r=e.started_at??$(),n=e.holder_host??El(),s=e.last_heartbeat_at??r,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),r,e.holder_pid??null,n,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 Wf(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,r,n={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,r];n.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(n.sinceMs).toISOString())),n.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(n.untilMs).toISOString()));let o=Math.max(1,Math.trunc(n.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,r){if(e.length===0)return[];let n=e.map(()=>"?").join(", ");return this.db.prepare(`
1587
1587
  SELECT * FROM tracked_invocation
1588
1588
  WHERE parent_invocation_id IN (${n})
1589
1589
  AND ended_at IS NOT NULL
1590
1590
  AND ended_at >= ?
1591
1591
  ORDER BY started_at ASC, id ASC
1592
1592
  `).all(...e,r)}finishTrackedInvocation(e,r){return this.db.transaction(()=>{let n=r.ended_at??$();if(this.stmts.finishTrackedInvocation.run(r.status,n,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),n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return $i(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,r,n){return this.db.transaction(()=>{let s=n.ended_at??$();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,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),s,e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return $i(this.db,o),o})()}heartbeatTrackedInvocation(e,r=$()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(r,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return Xf(this.db,s,r),s})()}updateTrackedInvocationRequestPayload(e,r){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(r,e).changes!==1?null:(qf(this.db,e,r),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,r){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(r,e).changes!==1?null:(Gf(this.db,e,Ft(r)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,r,n){return this.db.transaction(()=>{let s=$();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Qe(n),e,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return $i(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,n),o})()}terminalizeLinkedChatMessage(e,r){let n=this.stmts.getTeamChatLogById.get(e);n===void 0||n.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",r,e).changes!==1||Mi(this.db,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,message:n.message,response:null,origin:n.origin,status:"error",error_detail:r,truncated:n.truncated,created_at:$()})}listClaimableTerminalTrackedInvocations(e){let r=["status IN ('done', 'error', 'busy', 'cancelled', 'aborted')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(e,r,n=$()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(r,n,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Hf(this.db,i,r,n),i})()}listTrackedInvocations(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile)),e.status!==void 0&&(r.push("status = ?"),n.push(e.status)),e.kind!==void 0&&(r.push("kind = ?"),n.push(e.kind)),e.origin!==void 0&&(r.push("origin = ?"),n.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(e={}){let r=[],n=[];e.from!==void 0&&(r.push("from_identity = ?"),n.push(e.from)),e.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(e.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}heartbeatAgentInflight(e,r,n=$()){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:$f(this.db,s,r,n)})()}clearAgentInflight(e,r){this.db.transaction(()=>{let s=this.getAgentInflight(e,r);if(s===null)return;this.stmts.clearAgentInflight.run(e,r).changes===1&&Qn(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,r,n){return this.db.transaction(()=>{let i=this.getAgentInflight(e,r),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid});return o.changes===1&&i!==null&&Qn(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,r){this.db.exec("BEGIN IMMEDIATE");try{let n=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(n===null||n.sender_teamfile!==e.sender_teamfile||n.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
1593
- WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==r)return this.db.exec("COMMIT"),!1;if(n.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&&Qn(this.db,n,"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(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let n=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of n)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Qn(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(Kn,zn(e,r),Yn);return n===void 0?null:Rf(n.data)}setTerminalLock(e){this.db.transaction(()=>{let n=this.getTerminalLock(e.teamfile,e.alias);n!==null&&n.lock_id!==e.lock_id&&_l(this.db,n,!0),this.stmts.upsertRuntimeState.run(Kn,zn(e.teamfile,e.alias),Yn,JSON.stringify(e),e.last_heartbeat),n?.lock_id!==e.lock_id&&Ff(this.db,e)})()}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Kn,zn(e,r),Yn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Kn,zn(e,r),Yn);return i.changes===1&&_l(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:aI(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,i=$()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o!==null&&!lI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Qf(),holder_pid:process.pid,holder_host:El(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,r,n,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,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,r,n);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,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,$(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,$())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,$());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,$(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=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??$(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.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 r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,$());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=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,$()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,$()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=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,$());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run($(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=$();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.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:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(e){let r=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??$());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=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(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,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 r=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(r.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,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,$())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,$())}}});var tt=mv(Be=>{"use strict";function Ui(t){if(!Array.isArray(t))throw new TypeError("Each row and headers must be an array of cells");return Array.from(t,e=>{let r=e==null?"":String(e);if(/[\x00-\x1f\x7f-\x9f]/u.test(r))throw new TypeError("Cells must be single-line text without terminal control characters");return r})}function uI(t){if(t===void 0)return[];if(!Array.isArray(t))throw new TypeError('align must be an array of "left" or "right" per column');return t.map(e=>{if(e!=="left"&&e!=="right")throw new TypeError('align entries must be "left" or "right"');return e})}function rr(t){let e=0;for(let r of t){let n=r.codePointAt(0);if(!(n>=768&&n<=879||n>=6832&&n<=6911||n>=7616&&n<=7679||n>=8400&&n<=8447||n>=65024&&n<=65039||n>=65056&&n<=65071||n===8203||n>=917760&&n<=917999)){if(n>=4352&&n<=4447||n>=11904&&n<=12350||n>=12353&&n<=13311||n>=13312&&n<=19903||n>=19968&&n<=40959||n>=40960&&n<=42191||n>=44032&&n<=55203||n>=63744&&n<=64255||n>=65072&&n<=65135||n>=65280&&n<=65376||n>=65504&&n<=65510||n>=9728&&n<=10175||n>=126976&&n<=129791||n>=131072&&n<=262141){e+=2;continue}e+=1}}return e}function ip(t,e,r){let n=" ".repeat(Math.max(0,e-rr(t)));return r?n+t:t+n}function mI(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 fI(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 pI(t,e,r="\u2026"){if(rr(t)<=e)return t;let n=rr(r)>e?"\u2026":r,s=rr(n);if(e<=s)return n;let i="",o=0;for(let a of t){let l=rr(a);if(o+l>e-s)break;i+=a,o+=l}return`${i}${n}`}function hI(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 ap(t,{max:e}={}){if(!Array.isArray(t))throw new TypeError("grids must be an array of grids");let r=hI(e),n=[],s=(i,o)=>{n[i]=Math.max(n[i]??0,o)};for(let i of t){let o=mI(i);o.headers!==void 0&&Ui(o.headers).forEach((a,l)=>{s(l,rr(a))});for(let a of o.rows.map(Ui))a.forEach((l,c)=>{s(c,rr(l))})}return n.map((i,o)=>{let a=r[o];return a===void 0?i:Math.min(i,a)})}Be.measureColumns=ap;function gI(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 lp(t,{widths:e,headers:r,align:n,truncate:s=!0,truncateTrailing:i=!1,margin:o,max:a,ellipsis:l}={}){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 c=gI(o),u=uI(n),f=fI(l),d=e??ap([{rows:t,headers:r}],{max:a}),m=t.map(Ui);r!==void 0&&m.unshift(Ui(r));let h=m.map(y=>{let g=y.length-1;for(;g>=0&&y[g]==="";)g--;return y.slice(0,g+1).map((p,_)=>{let E=d[_]||0,w=s&&E>0&&(_!==g||i)?pI(p,E,f):p;return u[_]==="right"?ip(w,E,!0):_===g?w:ip(w,E,!1)}).join(" ")}).join(`
1594
- `);return h===""||c===""?h:`${c}${h.split(`
1593
+ WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==r)return this.db.exec("COMMIT"),!1;if(n.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&&Qn(this.db,n,"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(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let n=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of n)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Qn(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,r){let n=this.stmts.getRuntimeState.get(Kn,zn(e,r),Yn);return n===void 0?null:Rf(n.data)}setTerminalLock(e){this.db.transaction(()=>{let n=this.getTerminalLock(e.teamfile,e.alias);n!==null&&n.lock_id!==e.lock_id&&_l(this.db,n,!0),this.stmts.upsertRuntimeState.run(Kn,zn(e.teamfile,e.alias),Yn,JSON.stringify(e),e.last_heartbeat),n?.lock_id!==e.lock_id&&Ff(this.db,e)})()}heartbeatTerminalLock(e,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Kn,zn(e,r),Yn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Kn,zn(e,r),Yn);return i.changes===1&&_l(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,r,n){let s=this.stmts.getRuntimeState.get(e,r,n);return s===void 0?null:aI(s.data)}tryAcquireRuntimeProcessLock(e,r,n,s,i=$()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,r,n);if(o!==null&&!lI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Qf(),holder_pid:process.pid,holder_host:El(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,r,n,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,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,r,n);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,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,$(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,$())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,$());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,$(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=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??$(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.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 r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,$());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=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,$()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,$()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=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,$());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run($(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=$();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.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:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(e){let r=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??$());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=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(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,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 r=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(r.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,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,$())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,$())}}});var tt=mv(Be=>{"use strict";function Ui(t){if(!Array.isArray(t))throw new TypeError("Each row and headers must be an array of cells");return Array.from(t,e=>{let r=e==null?"":String(e);if(/[\x00-\x1f\x7f-\x9f]/u.test(r))throw new TypeError("Cells must be single-line text without terminal control characters");return r})}function uI(t){if(t===void 0)return[];if(!Array.isArray(t))throw new TypeError('align must be an array of "left" or "right" per column');return t.map(e=>{if(e!=="left"&&e!=="right")throw new TypeError('align entries must be "left" or "right"');return e})}function rr(t){let e=0;for(let r of t){let n=r.codePointAt(0);if(!(n>=768&&n<=879||n>=6832&&n<=6911||n>=7616&&n<=7679||n>=8400&&n<=8447||n>=65024&&n<=65039||n>=65056&&n<=65071||n===8203||n>=917760&&n<=917999)){if(n>=4352&&n<=4447||n>=11904&&n<=12350||n>=12353&&n<=13311||n>=13312&&n<=19903||n>=19968&&n<=40959||n>=40960&&n<=42191||n>=44032&&n<=55203||n>=63744&&n<=64255||n>=65072&&n<=65135||n>=65280&&n<=65376||n>=65504&&n<=65510||n>=9728&&n<=10175||n>=126976&&n<=129791||n>=131072&&n<=262141){e+=2;continue}e+=1}}return e}function ip(t,e,r){let n=" ".repeat(Math.max(0,e-rr(t)));return r?n+t:t+n}function mI(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 fI(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 pI(t,e,r="\u2026"){if(rr(t)<=e)return t;let n=rr(r)>e?"\u2026":r,s=rr(n);if(e<=s)return n;let i="",o=0;for(let a of t){let l=rr(a);if(o+l>e-s)break;i+=a,o+=l}return`${i}${n}`}function hI(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 ap(t,{max:e}={}){if(!Array.isArray(t))throw new TypeError("grids must be an array of grids");let r=hI(e),n=[],s=(i,o)=>{n[i]=Math.max(n[i]??0,o)};for(let i of t){let o=mI(i);o.headers!==void 0&&Ui(o.headers).forEach((a,l)=>{s(l,rr(a))});for(let a of o.rows.map(Ui))a.forEach((l,c)=>{s(c,rr(l))})}return n.map((i,o)=>{let a=r[o];return a===void 0?i:Math.min(i,a)})}Be.measureColumns=ap;function gI(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 lp(t,{widths:e,headers:r,align:n,truncate:s=!0,truncateTrailing:i=!1,margin:o,max:a,ellipsis:l}={}){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 c=gI(o),u=uI(n),f=fI(l),d=e??ap([{rows:t,headers:r}],{max:a}),m=t.map(Ui);r!==void 0&&m.unshift(Ui(r));let g=m.map(y=>{let h=y.length-1;for(;h>=0&&y[h]==="";)h--;return y.slice(0,h+1).map((p,_)=>{let E=d[_]||0,w=s&&E>0&&(_!==h||i)?pI(p,E,f):p;return u[_]==="right"?ip(w,E,!0):_===h?w:ip(w,E,!1)}).join(" ")}).join(`
1594
+ `);return g===""||c===""?g:`${c}${g.split(`
1595
1595
  `).join(`
1596
1596
  ${c}`)}`}Be.renderGrid=lp;function cp(t,{headers:e,align:r,truncate:n,truncateTrailing:s,margin:i,max:o,ellipsis:a}={}){return lp(t,{headers:e,align:r,truncate:n,truncateTrailing:s,margin:i,max:o,ellipsis:a})}function _I(t,{headers:e,align:r,truncate:n,truncateTrailing:s,margin:i,max:o,ellipsis:a,stream:l=process.stdout}={}){let c=cp(t,{headers:e,align:r,truncate:n,truncateTrailing:s,margin:i,max:o,ellipsis:a});c&&l.write(`${c}
1597
- `)}Be.formatTable=cp;Be.printTable=_I;function op(t){return t instanceof Date?t.getTime():typeof t=="number"?t:typeof t=="string"&&t.trim()?Date.parse(t):NaN}function yI(t,{now:e=Date.now()}={}){let r=op(e);if(!Number.isFinite(r))throw new TypeError("now must be a valid timestamp");let n=op(t);if(!Number.isFinite(n))return"unknown";let s=n-r,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":""}`}Be.formatRelativeTime=yI;function EI(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=t<0?"-":"",r=Math.abs(t);if(r<1e3)return String(t);let n=Math.round(r/1e3);return n<1e3?`${e}${n}K`:`${e}${(r/1e6).toFixed(1)}M`}Be.formatCount=EI;var Tl=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function wI(t,{maxUnit:e="w",style:r="spaced"}={}){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let n=Tl.findIndex(([a])=>a===e);if(n===-1)throw new TypeError('maxUnit must be one of "w", "d", "h", "m", "s"');if(r!=="spaced"&&r!=="compact")throw new TypeError('style must be "spaced" or "compact"');let s=Math.floor(Math.max(0,t)/1e3);if(r==="compact"){let a=Tl.slice(n).filter(([f])=>f!=="s");if(a.length===0||s<60)return"<1m";let l=[],c=s,u=!1;for(let[f,d]of a){let m=Math.floor(c/d);if(c-=m*d,m>0&&!u){let h=f==="d"||f==="w"?`${m}${f}`:`${bt(m)}${f}`;l.push({text:h,zero:!1}),u=!0}else u&&l.push({text:`${bt(m)}${f}`,zero:m===0})}for(;l.length>0&&l[l.length-1].zero;)l.pop();return l.map(f=>f.text).join("")}let i=s,o=[];for(let[a,l]of Tl.slice(n))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(" ")}Be.formatDuration=wI;function dp(t){return t===void 0?new Date:t instanceof Date?t:typeof t=="number"||typeof t=="string"?new Date(t):new Date(NaN)}function bt(t){return String(t).padStart(2,"0")}function up(t){let e=dp(t);return Number.isNaN(e.getTime())?"unknown":`${bt(e.getHours())}:${bt(e.getMinutes())}:${bt(e.getSeconds())}`}Be.formatClock=up;function TI(t){let e=dp(t);return Number.isNaN(e.getTime())?"unknown":`${`${e.getFullYear()}-${bt(e.getMonth()+1)}-${bt(e.getDate())}`} ${up(e)}`}Be.formatLocalTimestamp=TI;function vI(t){return typeof t=="number"&&Number.isFinite(t)?`${Math.round(t*100)}%`:"?%"}Be.formatPercent=vI;function SI(t,{width:e=10,fill:r="#",empty:n=" ",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",r],["empty",n],["unknown",s]])if(typeof a!="string"||[...a].length!==1||/[\x00-\x1f\x7f-\x9f]/u.test(a)||rr(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`${r.repeat(i)}${n.repeat(e-i)}`}Be.formatBar=SI;function bI(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=Math.floor(Math.max(0,t)/1e3),r=Math.floor(e/86400);e-=r*86400;let n=Math.floor(e/3600);e-=n*3600;let s=Math.floor(e/60);e-=s*60;let i=`${bt(n)}:${bt(s)}:${bt(e)}`;return r>0?`${r}d ${i}`:i}Be.formatTimer=bI;function II(t){return(t==null?"":String(t)).replace(/[\x00-\x1f\x7f-\x9f]/gu,r=>r===`
1597
+ `)}Be.formatTable=cp;Be.printTable=_I;function op(t){return t instanceof Date?t.getTime():typeof t=="number"?t:typeof t=="string"&&t.trim()?Date.parse(t):NaN}function yI(t,{now:e=Date.now()}={}){let r=op(e);if(!Number.isFinite(r))throw new TypeError("now must be a valid timestamp");let n=op(t);if(!Number.isFinite(n))return"unknown";let s=n-r,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":""}`}Be.formatRelativeTime=yI;function EI(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=t<0?"-":"",r=Math.abs(t);if(r<1e3)return String(t);let n=Math.round(r/1e3);return n<1e3?`${e}${n}K`:`${e}${(r/1e6).toFixed(1)}M`}Be.formatCount=EI;var Tl=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function wI(t,{maxUnit:e="w",style:r="spaced"}={}){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let n=Tl.findIndex(([a])=>a===e);if(n===-1)throw new TypeError('maxUnit must be one of "w", "d", "h", "m", "s"');if(r!=="spaced"&&r!=="compact")throw new TypeError('style must be "spaced" or "compact"');let s=Math.floor(Math.max(0,t)/1e3);if(r==="compact"){let a=Tl.slice(n).filter(([f])=>f!=="s");if(a.length===0||s<60)return"<1m";let l=[],c=s,u=!1;for(let[f,d]of a){let m=Math.floor(c/d);if(c-=m*d,m>0&&!u){let g=f==="d"||f==="w"?`${m}${f}`:`${bt(m)}${f}`;l.push({text:g,zero:!1}),u=!0}else u&&l.push({text:`${bt(m)}${f}`,zero:m===0})}for(;l.length>0&&l[l.length-1].zero;)l.pop();return l.map(f=>f.text).join("")}let i=s,o=[];for(let[a,l]of Tl.slice(n))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(" ")}Be.formatDuration=wI;function dp(t){return t===void 0?new Date:t instanceof Date?t:typeof t=="number"||typeof t=="string"?new Date(t):new Date(NaN)}function bt(t){return String(t).padStart(2,"0")}function up(t){let e=dp(t);return Number.isNaN(e.getTime())?"unknown":`${bt(e.getHours())}:${bt(e.getMinutes())}:${bt(e.getSeconds())}`}Be.formatClock=up;function TI(t){let e=dp(t);return Number.isNaN(e.getTime())?"unknown":`${`${e.getFullYear()}-${bt(e.getMonth()+1)}-${bt(e.getDate())}`} ${up(e)}`}Be.formatLocalTimestamp=TI;function vI(t){return typeof t=="number"&&Number.isFinite(t)?`${Math.round(t*100)}%`:"?%"}Be.formatPercent=vI;function SI(t,{width:e=10,fill:r="#",empty:n=" ",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",r],["empty",n],["unknown",s]])if(typeof a!="string"||[...a].length!==1||/[\x00-\x1f\x7f-\x9f]/u.test(a)||rr(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`${r.repeat(i)}${n.repeat(e-i)}`}Be.formatBar=SI;function bI(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=Math.floor(Math.max(0,t)/1e3),r=Math.floor(e/86400);e-=r*86400;let n=Math.floor(e/3600);e-=n*3600;let s=Math.floor(e/60);e-=s*60;let i=`${bt(n)}:${bt(s)}:${bt(e)}`;return r>0?`${r}d ${i}`:i}Be.formatTimer=bI;function II(t){return(t==null?"":String(t)).replace(/[\x00-\x1f\x7f-\x9f]/gu,r=>r===`
1598
1598
  `?"\\n":r===" "?"\\t":r==="\r"?"\\r":`\\x${r.codePointAt(0).toString(16).padStart(2,"0")}`)}Be.escapeCell=II});async function L(t,e){if(t.dal!==void 0)return e(t.dal);let r=ut({path:Ee()});try{return await e(r)}finally{r.close()}}function oe(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),i=[],o={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function W(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function H(t,e){return t.flags[e]===!0}function ee(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1599
1599
  `)}function A(t,e){return t.stderr.write(`error: ${e}
1600
1600
  `),1}function We(){return(0,fp.formatClock)()}function mt(t,e,r=5e3){let n=Date.now(),s=n,i=setInterval(()=>{let o=Date.now();o-s<r||t.stderr.write(e(Math.round((o-n)/1e3)))},r);return i.unref(),{poke:()=>{s=Date.now()},stop:()=>clearInterval(i)}}function rt(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
@@ -1603,31 +1603,31 @@ ${c}`)}`}Be.renderGrid=lp;function cp(t,{headers:e,align:r,truncate:n,truncateTr
1603
1603
  WHERE target_teamfile = ?
1604
1604
  AND target_alias = ?
1605
1605
  AND status = 'running'`,e,r),s=0;for(let i of n)vl(t,i)!==null&&(s+=1);return s}var Zn=k(()=>{"use strict";Oe();tr();et()});import{realpathSync as xI}from"node:fs";import{resolve as kI}from"node:path";function Sl(t){let e=kI(t);try{return xI(e)}catch{return e}}var pp=k(()=>{"use strict"});import{platform as hp}from"node:os";function sr(t){let e=new es;for(let r of t)e.registerAdapter(r);return e}var es,bl=k(()=>{"use strict";pp();es=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(e?.workspace){let o=Sl(e.workspace);i=i.filter(a=>Sl(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,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=hp()==="darwin"||hp()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as gp}from"node:fs";import{createInterface as _p}from"node:readline";import{stat as AI}from"node:fs/promises";import{homedir as RI}from"node:os";function yp(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*ue(t){let e=gp(t,{encoding:"utf-8"}),r=_p({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(!s)continue;let i=yp(s);i!==void 0&&(yield i)}}finally{e.destroy()}}async function qe(t,e){let r=[],n=gp(t,{encoding:"utf-8"}),s=_p({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=yp(o);if(a!==void 0&&r.push(a),r.length>=e)break}}finally{s.close(),n.destroy()}return r}async function fe(t){let e=await AI(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function te(t){return t.replace(/\\n/g,`
1606
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function j(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function nt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var X,Re=k(()=>{"use strict";X=RI()});import{readdir as Bi,stat as Ep,unlink as NI}from"node:fs/promises";import{join as fn,basename as wp}from"node:path";function LI(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function CI(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return te(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)}async function Tp(t){let e=0,r=0,n=0,s=0,i=0,o=0,a,l;for await(let c of ue(t))if(!c.isSidechain){if(c.type==="user"&&!c.isMeta&&c.message){let u=c.message.content;if(typeof u=="string"){if(u.includes("<command-name>")||u.includes("<local-command-"))continue;e++,l=j(u.trim(),80)}}else if(c.type==="assistant"&&c.message){let u=c.message.content;if(Array.isArray(u))for(let d of u)d.type==="text"&&e++;let f=c.message.usage;if(f){let d=f.input_tokens||0,m=f.cache_creation_input_tokens||0,h=f.cache_read_input_tokens||0,y=f.output_tokens||0;r+=d+m+h,n+=h,s+=m,i+=y;let g=d+m+h;g&&(o=g),a={inputTokens:d,cacheWriteInputTokens:m,cachedInputTokens:h,outputTokens:y}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a,lastUserMessage:l}}function OI(t){let e=MI(t),r=new Set;for(let n of t){if(n.role!=="tool_use"||n.toolName!=="Bash"||n.toolInputData?.run_in_background!==!0||n.toolCallId===void 0)continue;let s=e.get(n.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&&(r.add(i),n.backgroundTaskId=i,s.backgroundTaskId=i)}for(let n of t){if(n.role!=="tool_use"||n.toolName!=="TaskOutput"&&n.toolName!=="TaskStop"||n.toolCallId===void 0)continue;let s=n.toolInputData?.task_id;if(typeof s!="string"||!r.has(s))continue;n.backgroundTaskId=s;let i=e.get(n.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function MI(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var Wi,vp=k(()=>{"use strict";Re();Wi=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||fn(X,".claude"),this.projectsDir=fn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Bi(this.projectsDir)}catch{return e}for(let n of r){let s=fn(this.projectsDir,n);if(!(await Ep(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Bi(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=wp(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=fn(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await qe(e,50),s=await fe(e),i="",o,a,l,c,u,f;for(let m of n)if(!LI(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!f&&m.timestamp&&(f=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let h=m.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;c||(c=j(h.trim(),80)),u=j(h.trim(),80)}}if(!i)return null;let d=await Tp(e);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:f||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d.lastUserMessage??u,messageCount:d.messageCount,filePath:e,totalInputTokens:d.totalInputTokens||void 0,totalCachedInputTokens:d.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:d.totalCacheWriteInputTokens||void 0,totalOutputTokens:d.totalOutputTokens||void 0,lastInputTokens:d.lastInputTokens||void 0,lastTokenUsage:d.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await fe(r),s=[],i="",o,a,l,c,u,f,d,m=e,h,y=[];for await(let p of ue(r))if(p.type!=="file-history-snapshot"&&!p.isSidechain){if(!i&&p.cwd&&(i=p.cwd),!o&&p.slug&&(o=p.slug),!a&&p.version&&(a=p.version),!c&&p.gitBranch&&(c=p.gitBranch),!d&&p.timestamp&&(d=new Date(p.timestamp)),p.sessionId&&(m=p.sessionId),p.type==="system"||p.type==="progress"||p.type==="queue-operation"){s.push({role:"system",timestamp:new Date(p.timestamp||0),content:CI(p)});continue}if(p.type==="user"&&p.message){if(p.isMeta)continue;let _=new Date(p.timestamp||0),E=p.message.content;if(p.isCompactSummary!==!0&&p.isVisibleInTranscriptOnly!==!0&&p.promptSource!=="system"&&p.toolUseResult===void 0&&p.origin?.kind!=="task-notification"&&p.interruptedMessageId===void 0&&p.interruptedByShutdown!==!0&&p.scheduledTaskId===void 0&&p.scheduledFireId===void 0&&!(Array.isArray(E)&&E.some(w=>w.type==="tool_result"))){let w=typeof E=="string"?E:Array.isArray(E)?E.filter(S=>S.type==="text"&&typeof S.text=="string").map(S=>S.text).join(`
1607
- `):"";w&&!/^<(?:command-name>|local-command-|task-notification>\s*<|system-reminder>)/u.test(w.trimStart())&&!w.trimStart().startsWith("lmctl seed initial connection only.")&&y.push(w)}if(typeof E=="string"){let w=E.trim();if(w.includes("<command-name>")||w.includes("<local-command-")||/^<task-notification>\s*</u.test(w)||w.startsWith("lmctl seed initial connection only.")||/^<system-reminder>[\s\S]*<\/system-reminder>$/u.test(w))continue;u||(u=j(E.trim(),80)),f=j(E.trim(),80),h=void 0,s.push({role:"user",timestamp:_,content:te(E.trim())})}else if(Array.isArray(E)){for(let w of E)if(w.type==="tool_result"){let S=typeof w.content=="string"?te(w.content):JSON.stringify(w.content);s.push({role:"tool_result",timestamp:_,content:S,toolCallId:w.tool_use_id})}}}if(p.type==="assistant"&&p.message){p.message.stop_reason===null||p.message.stop_reason==="tool_use"?h="in_progress":typeof p.message.stop_reason=="string"&&(h="complete"),p.message.model&&(l=p.message.model);let _=new Date(p.timestamp||0),E=p.message.content;if(Array.isArray(E))for(let w of E)w.type==="text"&&w.text?s.push({role:"assistant",timestamp:_,content:te(w.text),model:p.message.model,...typeof p.message.stop_reason=="string"?{stopReason:p.message.stop_reason}:{}}):w.type==="tool_use"?s.push({role:"tool_use",timestamp:_,content:w.name||"unknown tool",toolName:w.name,toolInput:JSON.stringify(w.input,null,2),toolInputData:w.input,toolCallId:w.id,model:p.message.model,...typeof p.message.stop_reason=="string"?{stopReason:p.message.stop_reason}:{}}):w.type==="thinking"&&w.thinking&&s.push({role:"thinking",timestamp:_,content:w.thinking})}}if(!i)return null;OI(s);let g=await Tp(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:d||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,turnStatus:h,firstUserMessage:u,lastUserMessage:f,messageCount:g.messageCount,filePath:r,totalInputTokens:g.totalInputTokens||void 0,totalCachedInputTokens:g.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:g.totalCacheWriteInputTokens||void 0,totalOutputTokens:g.totalOutputTokens||void 0,lastInputTokens:g.lastInputTokens||void 0,lastTokenUsage:g.lastTokenUsage,messages:s,userPrompts:y}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await NI(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Bi(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=fn(this.projectsDir,o);if(!(await Ep(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Bi(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let f=wp(u,".jsonl");/^[0-9a-f]{8}-/.test(f)&&n.push({filePath:fn(a,u),fileSessionId:f})}}let s=n.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of n){let a=await qe(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{readFileSync as DI,writeFileSync as UP,mkdirSync as jP}from"node:fs";import{join as $I,dirname as WP}from"node:path";import{homedir as FI}from"node:os";function UI(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function jI(t){let e=t.indexOf("=");if(e===-1)return null;let r=t.slice(0,e).trim(),n=UI(t.slice(e+1).trim());return r?{key:r,value:n}:null}function BI(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function Hi(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function WI(){return $I(FI(),".lmctl","config.toml")}function pn(t){let e=t??WI(),r;try{r=DI(e,"utf-8")}catch{return{tools:{}}}return HI(r)}function Sp(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let r=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!r)return null;let n=parseFloat(r[1]);if(!Number.isFinite(n))return null;switch(r[2]){case"K":case"k":return Math.round(n*1e3);case"M":case"m":return Math.round(n*1e6);default:return Math.round(n)}}function HI(t){let e={},r={},n=t.split(`
1608
- `),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let f=e[s.tool]??{};if(s.profile){let d=f.profiles?.[s.profile]??{};i.description&&(d.description=i.description),i.flags!==void 0&&(d.flags=i.flags),f.profiles||(f.profiles={}),f.profiles[s.profile]=d}else i.start&&(f.start=i.start),i.resume&&(f.resume=i.resume),i.agent&&(f.agent=i.agent),i.profile_flag!==void 0&&(f.profile_flag=i.profile_flag);e[s.tool]=f}else if(s.kind==="compact"){let f=s.provider?r.providers?.[s.provider]??{}:r.global??{};if(i.min!==void 0){let d=Sp(i.min);d!==null&&(f.min=d)}if(i.max!==void 0){let d=Sp(i.max);d!==null&&(f.max=d)}s.provider?(r.providers||(r.providers={}),r.providers[s.provider]=f):r.global=f}i={}}for(let f of n){let d=f.trim();if(!d||d.startsWith("#"))continue;let m=BI(d);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let y=".profile.",g=m.indexOf(y);g!==-1?s={kind:"tool",tool:m.slice(5,g),profile:m.slice(g+y.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let h=jI(d);h&&s.kind!=="none"?i[h.key]=h.value:h&&!o&&(a[h.key]=h.value)}l();let c={tools:e};(r.global||r.providers)&&(c.compact=r);let u=a.site_name;return u!==void 0&&u.length>0&&(c.site_name=u),c}function bp(t){return t.site_name??null}function XI(t,e,r){if(!r)return"";let n=t.tools[e]??Il[e],s=n?.profiles?.[r]?.flags??Il[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function Ip(t,e){return!!t.tools[e]}function xp(t,e,r,n,s){let i=t.tools[e]??Il[e],o;if(i?.agent){let l=Hi(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=PI[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(Hi).join(" ");o=`printf '%s\\n' ${Hi(n)} | ${u}`}else o=c.map(Hi).join(" ")}let a=XI(t,e,s);return a&&(o+=" "+a),o}var Il,PI,ts=k(()=>{"use strict";Il={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:""}}}},PI={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 kp(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var Ap=k(()=>{"use strict"});var qI,J,Xi,$e=k(()=>{"use strict";qI="ACK: waiting for explicit lmctl task.",J=`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: ${qI}`,Xi=`send this exact lmctl seed instruction: "${J}"`});import{existsSync as GI}from"node:fs";function Rp(t){let e=t.CLAUDE_CODE_EXECPATH;if(e===void 0||e.length===0)return t;let r=process.platform!=="win32"&&e.toLowerCase().endsWith(".exe"),n=!r&&!GI(e);if(!r&&!n)return t;C({event:"claude_execpath_sanitized",reason:r?"wrong_platform_exe":"missing_file",value:e,platform:process.platform});let s={...t};return delete s.CLAUDE_CODE_EXECPATH,s}function hn(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function VI(t,e){return e===void 0||e.length===0?t:{...t??process.env,[xl]:e}}function be(t,e,r,n="chat"){return{...VI(hn(t,e),r),[JI]:n}}var xl,JI,It=k(()=>{"use strict";K();xl="LMCTL_SELF_SESSIONID",JI="LMCTL_LAUNCH_SOURCE"});function rs(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var kl=k(()=>{"use strict"});import{spawn as Np}from"node:child_process";import{mkdirSync as KI}from"node:fs";var Al,re,Ge=k(()=>{"use strict";ts();Ap();$e();It();kl();Al=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},re=class t{name;capabilities;injection;provider;binary;seedArgs;seedTimeoutMs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){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 r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===J?r:n)}turnOptsFor(e){return e}seed(e,r){return KI(e,{recursive:!0}),new Promise(n=>{let s;try{s=Np(this.binary,this.seedArgsFor(r),{cwd:e,env:hn(void 0,e),stdio:["pipe","pipe","pipe"],timeout:this.seedTimeoutMs})}catch(l){return n({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=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1609
- `:this.seedStdin;a&&s.stdin?.write(a),s.stdin?.end(),s.on("exit",(l,c)=>{if(l===0&&!c)n({success:!0});else{let u=rs(o).trim(),f=rs(i).trim();n({success:!1,error:(u||f).slice(0,500)||(c?`terminated by ${c}`:`exit code ${l}`)})}}),s.on("error",l=>{n({success:!1,error:l.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:Xi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){let n=this.turnOptsFor(r);if(n.userConfig&&Ip(n.userConfig,this.name)){let i=n.userConfig.tools[this.name];if(i?.agent)return this.runOneShotAgent(e,n,i.agent)}let s=n.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return s<=0&&!n.signal?this.transportFn(e,{...n,binary:this.binary}):this.withTimeouts(s,e,n)}withTimeouts(e,r,n){let s=new AbortController,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let f={...n,binary:this.binary,signal:s.signal,onDelta:h=>{a+=h,c(),n.onDelta?.(h)},onProgress:h=>{h.kind!=="api_retry"&&c(),n.onProgress?.(h)}},d=this.transportFn(r,f).then(h=>(u(),{...h,status:h.status??"ok"})).catch(h=>{throw u(),o==="external"?new Al("Turn cancelled","external"):h}),m=new Promise(h=>{l=h});return Promise.race([d,m])}runOneShotAgent(e,r,n){let s=xp(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=kp(r.env),c=Np(s,{shell:!0,cwd:r.cwd,env:be(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,f=!1,d=setTimeout(()=>{f=!0,c.kill()},l),m="",h="";if(c.stdout?.on("data",y=>{let g=y.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",y=>{h+=y.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(d),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",y=>{if(u)return;u=!0,clearTimeout(d);let g=Date.now()-i;f?a(new Error(`Agent command timed out after ${l}ms`)):y===0||y===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(h.trim().slice(0,200)||`Agent command exited with code ${y}`))}),c.on("error",y=>{u||(u=!0,clearTimeout(d),a(y))})})}}});function is(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new ss(t,r,e)}var ir,ne,ns,qi,ss,Rr=k(()=>{"use strict";ir=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ne=class extends ir{},ns=class extends ir{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},qi=class extends ir{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},ss=class extends ir{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Nl from"node:child_process";function zI(t){if(typeof Nl.spawnSync=="function")try{Nl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Lp(t){return t.exitCode!==null||t.signalCode!==null}function Rl(t,e){return Lp(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function le(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??zI;if(Lp(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Rl(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await Rl(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await Rl(t,YI)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var YI,os=k(()=>{"use strict";YI=1e3});function Cp(t){Q()&&ke({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function or(t,e){let r=ZI[t];if(r)return r[e]??r.yolo}function tx(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function Ne(t,e,r="yolo"){if(ex.has(t)){Cp(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${r==="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":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?or(t,"plan"):QI[t];if(!n){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 C({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ne(s)}if(!tx(e,n)){let s=n.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 C({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:i}),new ne(i)}Cp(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var QI,ZI,ex,Pt=k(()=>{"use strict";Rr();K();QI={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},ZI={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"]}};ex=new Set(["codex","opencode","kimi","dsh","hermes","pi"])});async function Ji(t,e,r){if(typeof t=="boolean")return t;let n,s;try{return await Promise.race([t,new Promise(i=>{n=setTimeout(()=>i(Ll),e),n.unref?.(),r!==void 0&&(s=()=>i(Ll),r.addEventListener("abort",s,{once:!0}))})])}finally{n!==void 0&&clearTimeout(n),s!==void 0&&r?.removeEventListener("abort",s)}}function ar(t,e){if(t===void 0){e.closeStdin();return}let r=!1,n=i=>{if(!r){r=!0;try{t.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}e.closeStdin()},s=Date.now();ox(t,e,s,n).catch(()=>{n({startedMs:s,held:!1,reason:"check-error"})})}async function ox(t,e,r,n){let s=t.pollMs??rx,i=t.maxHoldMs??Gi,o=t.settleMs??nx,a=t.backgroundGraceMs??sx,l=!1,c=null,u=f=>n({startedMs:r,held:l,reason:f});for(;;){if(e.isAborted())return u("aborted");if(e.hasChildExited())return u("child-exited");let f=i-(Date.now()-r);if(f<=0)return u("max-hold");let d;try{d=await Ji(t.hasOutstandingWork(),f,e.signal)}catch{return u("check-error")}if(d===Ll)return u(e.isAborted()||e.signal?.aborted===!0?"aborted":"max-hold");if(d)c=null;else{if(!l&&e.wasBackgroundJobLaunched?.()===!0&&Date.now()-r<a){let y=a-(Date.now()-r);await new Promise(g=>setTimeout(g,Math.max(0,Math.min(s,ix,y))).unref?.());continue}if(!l||o<=0)return u("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 u("cleared")}if(l||(l=!0,t.onHold?.(),Se(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-r>=i)return C({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-r}),u("max-hold");let m=Math.max(0,Math.min(s,i-(Date.now()-r)));await new Promise(h=>setTimeout(h,m).unref?.())}}var rx,Gi,nx,sx,ix,Ll,Vi=k(()=>{"use strict";K();rx=2e3,Gi=8*60*60*1e3,nx=5e3,sx=1e3,ix=50,Ll=Symbol("check-timed-out")});function Op(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
1606
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function j(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function nt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var X,Re=k(()=>{"use strict";X=RI()});import{readdir as Bi,stat as Ep,unlink as NI}from"node:fs/promises";import{join as fn,basename as wp}from"node:path";function LI(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function CI(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return te(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)}async function Tp(t){let e=0,r=0,n=0,s=0,i=0,o=0,a,l;for await(let c of ue(t))if(!c.isSidechain){if(c.type==="user"&&!c.isMeta&&c.message){let u=c.message.content;if(typeof u=="string"){if(u.includes("<command-name>")||u.includes("<local-command-"))continue;e++,l=j(u.trim(),80)}}else if(c.type==="assistant"&&c.message){let u=c.message.content;if(Array.isArray(u))for(let d of u)d.type==="text"&&e++;let f=c.message.usage;if(f){let d=f.input_tokens||0,m=f.cache_creation_input_tokens||0,g=f.cache_read_input_tokens||0,y=f.output_tokens||0;r+=d+m+g,n+=g,s+=m,i+=y;let h=d+m+g;h&&(o=h),a={inputTokens:d,cacheWriteInputTokens:m,cachedInputTokens:g,outputTokens:y}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a,lastUserMessage:l}}function OI(t){let e=MI(t),r=new Set;for(let n of t){if(n.role!=="tool_use"||n.toolName!=="Bash"||n.toolInputData?.run_in_background!==!0||n.toolCallId===void 0)continue;let s=e.get(n.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&&(r.add(i),n.backgroundTaskId=i,s.backgroundTaskId=i)}for(let n of t){if(n.role!=="tool_use"||n.toolName!=="TaskOutput"&&n.toolName!=="TaskStop"||n.toolCallId===void 0)continue;let s=n.toolInputData?.task_id;if(typeof s!="string"||!r.has(s))continue;n.backgroundTaskId=s;let i=e.get(n.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function MI(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var Wi,vp=k(()=>{"use strict";Re();Wi=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||fn(X,".claude"),this.projectsDir=fn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Bi(this.projectsDir)}catch{return e}for(let n of r){let s=fn(this.projectsDir,n);if(!(await Ep(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Bi(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=wp(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=fn(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await qe(e,50),s=await fe(e),i="",o,a,l,c,u,f;for(let m of n)if(!LI(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!f&&m.timestamp&&(f=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let g=m.message.content;if(typeof g=="string"){if(g.includes("<command-name>")||g.includes("<local-command-"))continue;c||(c=j(g.trim(),80)),u=j(g.trim(),80)}}if(!i)return null;let d=await Tp(e);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:f||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d.lastUserMessage??u,messageCount:d.messageCount,filePath:e,totalInputTokens:d.totalInputTokens||void 0,totalCachedInputTokens:d.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:d.totalCacheWriteInputTokens||void 0,totalOutputTokens:d.totalOutputTokens||void 0,lastInputTokens:d.lastInputTokens||void 0,lastTokenUsage:d.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await fe(r),s=[],i="",o,a,l,c,u,f,d,m=e,g,y=[];for await(let p of ue(r))if(p.type!=="file-history-snapshot"&&!p.isSidechain){if(!i&&p.cwd&&(i=p.cwd),!o&&p.slug&&(o=p.slug),!a&&p.version&&(a=p.version),!c&&p.gitBranch&&(c=p.gitBranch),!d&&p.timestamp&&(d=new Date(p.timestamp)),p.sessionId&&(m=p.sessionId),p.type==="system"||p.type==="progress"||p.type==="queue-operation"){s.push({role:"system",timestamp:new Date(p.timestamp||0),content:CI(p)});continue}if(p.type==="user"&&p.message){if(p.isMeta)continue;let _=new Date(p.timestamp||0),E=p.message.content;if(p.isCompactSummary!==!0&&p.isVisibleInTranscriptOnly!==!0&&p.promptSource!=="system"&&p.toolUseResult===void 0&&p.origin?.kind!=="task-notification"&&p.interruptedMessageId===void 0&&p.interruptedByShutdown!==!0&&p.scheduledTaskId===void 0&&p.scheduledFireId===void 0&&!(Array.isArray(E)&&E.some(w=>w.type==="tool_result"))){let w=typeof E=="string"?E:Array.isArray(E)?E.filter(S=>S.type==="text"&&typeof S.text=="string").map(S=>S.text).join(`
1607
+ `):"";w&&!/^<(?:command-name>|local-command-|task-notification>\s*<|system-reminder>)/u.test(w.trimStart())&&!w.trimStart().startsWith("lmctl seed initial connection only.")&&y.push(w)}if(typeof E=="string"){let w=E.trim();if(w.includes("<command-name>")||w.includes("<local-command-")||/^<task-notification>\s*</u.test(w)||w.startsWith("lmctl seed initial connection only.")||/^<system-reminder>[\s\S]*<\/system-reminder>$/u.test(w))continue;u||(u=j(E.trim(),80)),f=j(E.trim(),80),g=void 0,s.push({role:"user",timestamp:_,content:te(E.trim())})}else if(Array.isArray(E)){for(let w of E)if(w.type==="tool_result"){let S=typeof w.content=="string"?te(w.content):JSON.stringify(w.content);s.push({role:"tool_result",timestamp:_,content:S,toolCallId:w.tool_use_id})}}}if(p.type==="assistant"&&p.message){p.message.stop_reason===null||p.message.stop_reason==="tool_use"?g="in_progress":typeof p.message.stop_reason=="string"&&(g="complete"),p.message.model&&(l=p.message.model);let _=new Date(p.timestamp||0),E=p.message.content;if(Array.isArray(E))for(let w of E)w.type==="text"&&w.text?s.push({role:"assistant",timestamp:_,content:te(w.text),model:p.message.model,...typeof p.message.stop_reason=="string"?{stopReason:p.message.stop_reason}:{}}):w.type==="tool_use"?s.push({role:"tool_use",timestamp:_,content:w.name||"unknown tool",toolName:w.name,toolInput:JSON.stringify(w.input,null,2),toolInputData:w.input,toolCallId:w.id,model:p.message.model,...typeof p.message.stop_reason=="string"?{stopReason:p.message.stop_reason}:{}}):w.type==="thinking"&&w.thinking&&s.push({role:"thinking",timestamp:_,content:w.thinking})}}if(!i)return null;OI(s);let h=await Tp(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:d||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,turnStatus:g,firstUserMessage:u,lastUserMessage:f,messageCount:h.messageCount,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:h.totalCacheWriteInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:s,userPrompts:y}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await NI(r),!0):!1}async resolveSessionFile(e){let r;try{r=await Bi(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=fn(this.projectsDir,o);if(!(await Ep(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await Bi(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let f=wp(u,".jsonl");/^[0-9a-f]{8}-/.test(f)&&n.push({filePath:fn(a,u),fileSessionId:f})}}let s=n.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of n){let a=await qe(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{readFileSync as DI,writeFileSync as UP,mkdirSync as jP}from"node:fs";import{join as $I,dirname as WP}from"node:path";import{homedir as FI}from"node:os";function UI(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function jI(t){let e=t.indexOf("=");if(e===-1)return null;let r=t.slice(0,e).trim(),n=UI(t.slice(e+1).trim());return r?{key:r,value:n}:null}function BI(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function Hi(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function WI(){return $I(FI(),".lmctl","config.toml")}function pn(t){let e=t??WI(),r;try{r=DI(e,"utf-8")}catch{return{tools:{}}}return HI(r)}function Sp(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let r=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!r)return null;let n=parseFloat(r[1]);if(!Number.isFinite(n))return null;switch(r[2]){case"K":case"k":return Math.round(n*1e3);case"M":case"m":return Math.round(n*1e6);default:return Math.round(n)}}function HI(t){let e={},r={},n=t.split(`
1608
+ `),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let f=e[s.tool]??{};if(s.profile){let d=f.profiles?.[s.profile]??{};i.description&&(d.description=i.description),i.flags!==void 0&&(d.flags=i.flags),f.profiles||(f.profiles={}),f.profiles[s.profile]=d}else i.start&&(f.start=i.start),i.resume&&(f.resume=i.resume),i.agent&&(f.agent=i.agent),i.profile_flag!==void 0&&(f.profile_flag=i.profile_flag);e[s.tool]=f}else if(s.kind==="compact"){let f=s.provider?r.providers?.[s.provider]??{}:r.global??{};if(i.min!==void 0){let d=Sp(i.min);d!==null&&(f.min=d)}if(i.max!==void 0){let d=Sp(i.max);d!==null&&(f.max=d)}s.provider?(r.providers||(r.providers={}),r.providers[s.provider]=f):r.global=f}i={}}for(let f of n){let d=f.trim();if(!d||d.startsWith("#"))continue;let m=BI(d);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let y=".profile.",h=m.indexOf(y);h!==-1?s={kind:"tool",tool:m.slice(5,h),profile:m.slice(h+y.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let g=jI(d);g&&s.kind!=="none"?i[g.key]=g.value:g&&!o&&(a[g.key]=g.value)}l();let c={tools:e};(r.global||r.providers)&&(c.compact=r);let u=a.site_name;return u!==void 0&&u.length>0&&(c.site_name=u),c}function bp(t){return t.site_name??null}function XI(t,e,r){if(!r)return"";let n=t.tools[e]??Il[e],s=n?.profiles?.[r]?.flags??Il[e]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${e}"`)}function Ip(t,e){return!!t.tools[e]}function xp(t,e,r,n,s){let i=t.tools[e]??Il[e],o;if(i?.agent){let l=Hi(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=PI[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(Hi).join(" ");o=`printf '%s\\n' ${Hi(n)} | ${u}`}else o=c.map(Hi).join(" ")}let a=XI(t,e,s);return a&&(o+=" "+a),o}var Il,PI,ts=k(()=>{"use strict";Il={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:""}}}},PI={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 kp(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var Ap=k(()=>{"use strict"});var qI,J,Xi,$e=k(()=>{"use strict";qI="ACK: waiting for explicit lmctl task.",J=`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: ${qI}`,Xi=`send this exact lmctl seed instruction: "${J}"`});import{existsSync as GI}from"node:fs";function Rp(t){let e=t.CLAUDE_CODE_EXECPATH;if(e===void 0||e.length===0)return t;let r=process.platform!=="win32"&&e.toLowerCase().endsWith(".exe"),n=!r&&!GI(e);if(!r&&!n)return t;C({event:"claude_execpath_sanitized",reason:r?"wrong_platform_exe":"missing_file",value:e,platform:process.platform});let s={...t};return delete s.CLAUDE_CODE_EXECPATH,s}function hn(t,e){let r={...t??process.env,PWD:e};return delete r.OLDPWD,r}function VI(t,e){return e===void 0||e.length===0?t:{...t??process.env,[xl]:e}}function be(t,e,r,n="chat"){return{...VI(hn(t,e),r),[JI]:n}}var xl,JI,It=k(()=>{"use strict";K();xl="LMCTL_SELF_SESSIONID",JI="LMCTL_LAUNCH_SOURCE"});function rs(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var kl=k(()=>{"use strict"});import{spawn as Np}from"node:child_process";import{mkdirSync as KI}from"node:fs";var Al,re,Ge=k(()=>{"use strict";ts();Ap();$e();It();kl();Al=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},re=class t{name;capabilities;injection;provider;binary;seedArgs;seedTimeoutMs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){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 r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===J?r:n)}turnOptsFor(e){return e}seed(e,r){return KI(e,{recursive:!0}),new Promise(n=>{let s;try{s=Np(this.binary,this.seedArgsFor(r),{cwd:e,env:hn(void 0,e),stdio:["pipe","pipe","pipe"],timeout:this.seedTimeoutMs})}catch(l){return n({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=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1609
+ `:this.seedStdin;a&&s.stdin?.write(a),s.stdin?.end(),s.on("exit",(l,c)=>{if(l===0&&!c)n({success:!0});else{let u=rs(o).trim(),f=rs(i).trim();n({success:!1,error:(u||f).slice(0,500)||(c?`terminated by ${c}`:`exit code ${l}`)})}}),s.on("error",l=>{n({success:!1,error:l.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:Xi,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){let n=this.turnOptsFor(r);if(n.userConfig&&Ip(n.userConfig,this.name)){let i=n.userConfig.tools[this.name];if(i?.agent)return this.runOneShotAgent(e,n,i.agent)}let s=n.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return s<=0&&!n.signal?this.transportFn(e,{...n,binary:this.binary}):this.withTimeouts(s,e,n)}withTimeouts(e,r,n){let s=new AbortController,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let f={...n,binary:this.binary,signal:s.signal,onDelta:g=>{a+=g,c(),n.onDelta?.(g)},onProgress:g=>{g.kind!=="api_retry"&&c(),n.onProgress?.(g)}},d=this.transportFn(r,f).then(g=>(u(),{...g,status:g.status??"ok"})).catch(g=>{throw u(),o==="external"?new Al("Turn cancelled","external"):g}),m=new Promise(g=>{l=g});return Promise.race([d,m])}runOneShotAgent(e,r,n){let s=xp(r.userConfig,this.name,r.sessionId,e,r.profile),i=Date.now();return new Promise((o,a)=>{let l=kp(r.env),c=Np(s,{shell:!0,cwd:r.cwd,env:be(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,f=!1,d=setTimeout(()=>{f=!0,c.kill()},l),m="",g="";if(c.stdout?.on("data",y=>{let h=y.toString();m+=h,r.onDelta?.(h)}),c.stderr?.on("data",y=>{g+=y.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(d),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",y=>{if(u)return;u=!0,clearTimeout(d);let h=Date.now()-i;f?a(new Error(`Agent command timed out after ${l}ms`)):y===0||y===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:h}):a(new Error(g.trim().slice(0,200)||`Agent command exited with code ${y}`))}),c.on("error",y=>{u||(u=!0,clearTimeout(d),a(y))})})}}});function is(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new ss(t,r,e)}var ir,ne,ns,qi,ss,Rr=k(()=>{"use strict";ir=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ne=class extends ir{},ns=class extends ir{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},qi=class extends ir{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},ss=class extends ir{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as Nl from"node:child_process";function zI(t){if(typeof Nl.spawnSync=="function")try{Nl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Lp(t){return t.exitCode!==null||t.signalCode!==null}function Rl(t,e){return Lp(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function le(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??zI;if(Lp(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Rl(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await Rl(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await Rl(t,YI)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var YI,os=k(()=>{"use strict";YI=1e3});function Cp(t){Q()&&ke({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function or(t,e){let r=ZI[t];if(r)return r[e]??r.yolo}function tx(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function Ne(t,e,r="yolo"){if(ex.has(t)){Cp(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${r==="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":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?or(t,"plan"):QI[t];if(!n){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 C({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ne(s)}if(!tx(e,n)){let s=n.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 C({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:i}),new ne(i)}Cp(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var QI,ZI,ex,Pt=k(()=>{"use strict";Rr();K();QI={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},ZI={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"]}};ex=new Set(["codex","opencode","kimi","dsh","hermes","pi"])});async function Ji(t,e,r){if(typeof t=="boolean")return t;let n,s;try{return await Promise.race([t,new Promise(i=>{n=setTimeout(()=>i(Ll),e),n.unref?.(),r!==void 0&&(s=()=>i(Ll),r.addEventListener("abort",s,{once:!0}))})])}finally{n!==void 0&&clearTimeout(n),s!==void 0&&r?.removeEventListener("abort",s)}}function ar(t,e){if(t===void 0){e.closeStdin();return}let r=!1,n=i=>{if(!r){r=!0;try{t.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}e.closeStdin()},s=Date.now();ox(t,e,s,n).catch(()=>{n({startedMs:s,held:!1,reason:"check-error"})})}async function ox(t,e,r,n){let s=t.pollMs??rx,i=t.maxHoldMs??Gi,o=t.settleMs??nx,a=t.backgroundGraceMs??sx,l=!1,c=null,u=f=>n({startedMs:r,held:l,reason:f});for(;;){if(e.isAborted())return u("aborted");if(e.hasChildExited())return u("child-exited");let f=i-(Date.now()-r);if(f<=0)return u("max-hold");let d;try{d=await Ji(t.hasOutstandingWork(),f,e.signal)}catch{return u("check-error")}if(d===Ll)return u(e.isAborted()||e.signal?.aborted===!0?"aborted":"max-hold");if(d)c=null;else{if(!l&&e.wasBackgroundJobLaunched?.()===!0&&Date.now()-r<a){let y=a-(Date.now()-r);await new Promise(h=>setTimeout(h,Math.max(0,Math.min(s,ix,y))).unref?.());continue}if(!l||o<=0)return u("cleared");c===null&&(c=Date.now(),Se(`${e.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let g=Math.max(c,e.lastEventAtMs());if(!e.isTurnInFlight()&&Date.now()-g>=o)return u("cleared")}if(l||(l=!0,t.onHold?.(),Se(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-r>=i)return C({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-r}),u("max-hold");let m=Math.max(0,Math.min(s,i-(Date.now()-r)));await new Promise(g=>setTimeout(g,m).unref?.())}}var rx,Gi,nx,sx,ix,Ll,Vi=k(()=>{"use strict";K();rx=2e3,Gi=8*60*60*1e3,nx=5e3,sx=1e3,ix=50,Ll=Symbol("check-timed-out")});function Op(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
1610
1610
 
1611
1611
  --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
1612
1612
 
1613
- `+t[r]);return e.join("")}function Ki(t={}){let e=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}t.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(r=i.session_id||r),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&t.onText?.(c.text)}o==="result"&&(n=!0,e.push(i))},sawResult(){return n},finalize(){if(!n)return null;let s=Mp(e),i=Op(s.resultTexts);return{result:i,sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns,isError:s.isError&&i.trim().length===0,errorMessage:s.errorMessage}}}}function Mp(t){let e=[],r=0,n=0,s="",i=!1,o;for(let a of t){e.push(a.result||"");let l=a.duration_ms;typeof l=="number"&&Number.isFinite(l)&&(r+=l);let c=a.num_turns;typeof c=="number"&&Number.isFinite(c)&&(n=c);let u=a.session_id;if(typeof u=="string"&&u&&(s=u),a.is_error===!0){i=!0;let f=a.errors,d=Array.isArray(f)?f.filter(h=>typeof h=="string").join("; "):void 0,m=typeof a.subtype=="string"?a.subtype:"unknown";o=d&&d.length>0?d:`result subtype=${m} (no error detail provided)`}}return{resultTexts:e,durationMs:r,numTurns:n,sessionId:s,isError:i,errorMessage:o}}var Cl=k(()=>{"use strict"});import{spawn as $p}from"node:child_process";import{existsSync as Fp}from"node:fs";import{join as Yi}from"node:path";import{readdir as ax}from"node:fs/promises";function Pp(){let t=process.env.LMCTL_RESULT_GRACE_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return 12e4;let e=Number(t);return Number.isFinite(e)&&e>0?e:12e4}function Up(){let t=process.env.LMCTL_TOOL_USE_GRACE_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return 27e5;let e=Number(t);return Number.isFinite(e)&&e>0?e:27e5}function jp(t){let r=t.message?.content;return Array.isArray(r)?r.some(n=>n?.type==="tool_use"):!1}function cx(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} exited with code ${t.exitCode} before returning a final result event.
1613
+ `+t[r]);return e.join("")}function Ki(t={}){let e=[],r="",n=!1;return{processLine(s){if(!s.trim())return;let i;try{i=JSON.parse(s)}catch{return}t.onEvent?.(i);let o=i.type;if(o==="system"&&i.subtype==="init"&&(r=i.session_id||r),o==="assistant"){let l=i.message?.content;if(Array.isArray(l))for(let c of l)c.type==="text"&&c.text&&t.onText?.(c.text)}o==="result"&&(n=!0,e.push(i))},sawResult(){return n},finalize(){if(!n)return null;let s=Mp(e),i=Op(s.resultTexts);return{result:i,sessionId:s.sessionId||r,durationMs:s.durationMs,numTurns:s.numTurns,isError:s.isError&&i.trim().length===0,errorMessage:s.errorMessage}}}}function Mp(t){let e=[],r=0,n=0,s="",i=!1,o;for(let a of t){e.push(a.result||"");let l=a.duration_ms;typeof l=="number"&&Number.isFinite(l)&&(r+=l);let c=a.num_turns;typeof c=="number"&&Number.isFinite(c)&&(n=c);let u=a.session_id;if(typeof u=="string"&&u&&(s=u),a.is_error===!0){i=!0;let f=a.errors,d=Array.isArray(f)?f.filter(g=>typeof g=="string").join("; "):void 0,m=typeof a.subtype=="string"?a.subtype:"unknown";o=d&&d.length>0?d:`result subtype=${m} (no error detail provided)`}}return{resultTexts:e,durationMs:r,numTurns:n,sessionId:s,isError:i,errorMessage:o}}var Cl=k(()=>{"use strict"});import{spawn as $p}from"node:child_process";import{existsSync as Fp}from"node:fs";import{join as Yi}from"node:path";import{readdir as ax}from"node:fs/promises";function Pp(){let t=process.env.LMCTL_RESULT_GRACE_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return 12e4;let e=Number(t);return Number.isFinite(e)&&e>0?e:12e4}function Up(){let t=process.env.LMCTL_TOOL_USE_GRACE_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return 27e5;let e=Number(t);return Number.isFinite(e)&&e>0?e:27e5}function jp(t){let r=t.message?.content;return Array.isArray(r)?r.some(n=>n?.type==="tool_use"):!1}function cx(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} exited with code ${t.exitCode} before returning a final result event.
1614
1614
  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:
1615
1615
  ${e}
1616
1616
 
1617
- ${r}`:r}function Bp(t){let e=t.tool||"claude",r=t.binaryPath||lx[e]||"claude",n=["-p","","--output-format","stream-json","--input-format","stream-json"];e==="claude"&&n.push("--verbose"),t.sessionId&&n.push("--resume",t.sessionId),t.model&&n.push("--model",t.model);let s=t.permissionMode??"yolo",i=or(e,s)??dx[e]??["--dangerously-skip-permissions"];if(n.push(...i),Ne(e,n,s),t.cwd&&!Fp(t.cwd))throw C({event:"transport_error",provider:e,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),new ne(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});let o=be(t.env,t.cwd,t.sessionId);return{tool:e,binary:r,args:n,spawnEnv:e==="claude"?Rp(o):o}}function Wp(t,e){return new Promise((r,n)=>{let s=Date.now(),i,o,a,l;try{({tool:i,binary:o,args:a,spawnEnv:l}=Bp(e))}catch(D){return n(D instanceof Error?D:new Error(String(D)))}let c=$p(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:l});c.stdin?.on("error",D=>{Se(`stream-json: stdin pipe error, ignored (exit handler reports): ${D.message}`)});let u=!1;if(e.signal){if(e.signal.aborted)return u=!0,C({event:"transport_abort",provider:i,phase:"pre_spawn"}),le(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,C({event:"transport_abort",provider:i}),le(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f="",d=!1,m=!1,h=0,y=!1,g="",p="",_,E,w=null,S=null,T=!1,b=!1,v=Pp(),x=Up();function I(){_!==void 0&&(clearTimeout(_),_=void 0)}function R(){E!==void 0&&(clearTimeout(E),E=void 0)}let M=null;function N(){return d||u||_e.sawResult()}function P(D){return D==="text_done"?v:x}async function q(D){if(D==="text_done"?_=void 0:E=void 0,N()||w!==null)return;M??=Date.now();let z=P(D);if(e.holdOpen){let Pn=(e.holdOpen.maxHoldMs??Gi)-(Date.now()-M),Fa=Pn>0?await Ji(Promise.resolve(e.holdOpen.hasOutstandingWork()).catch(()=>!1),Pn,e.signal):!1;if(N()||(D==="text_done"?_!==void 0:E!==void 0))return;if(Fa===!0){C({event:"transport_stall_grace_deferred",provider:i,grace_kind:D,grace_ms:z,reason:"outstanding_dispatched_work"}),V(D);return}}S=D,w=D==="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)`,C({event:"transport_stall_grace_fired",provider:i,grace_kind:D,grace_ms:z}),le(c).catch(()=>{})}function V(D){let z=setTimeout(()=>{q(D)},P(D));z.unref?.(),D==="text_done"?(I(),_=z):(R(),E=z)}let _e=Ki({onEvent:D=>{h=Date.now(),y=D.type!=="result",D.type==="system"&&D.subtype==="init"&&(p=D.session_id||p),D.type==="assistant"?(T=!jp(D),b=T&&D.message?.stop_reason==="pause_turn"):(D.type==="result"||D.type==="user")&&(T=!1,b=!1),I(),i==="claude"&&T&&!b&&!_e.sawResult()&&V("text_done"),R(),i==="claude"&&!_e.sawResult()&&V("tool_use_silence"),e.onEvent?.(D)},onText:D=>{g+=D,e.onText?.(D)}});function Te(){m||(m=!0,ar(e.holdOpen,{isAborted:()=>u,hasChildExited:()=>d,isTurnInFlight:()=>y,lastEventAtMs:()=>h,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function br(D){let z=_e.sawResult();_e.processLine(D),!z&&_e.sawResult()&&Te()}c.stdout?.on("data",D=>{f+=D.toString();let z=f.split(`
1618
- `);f=z.pop()||"";for(let pi of z)br(pi)});let Dt="";c.stderr?.on("data",D=>{Dt+=D.toString()}),c.on("error",D=>{C({event:"transport_error",provider:i,error_class:"TransportConnectionError",error_message:D.message}),n(new ne(`Failed to spawn ${o}: ${D.message}`,{cause:D}))}),c.on("exit",D=>{if(d=!0,I(),R(),u)return;f.trim()&&br(f);let z=_e.finalize();z?.isError?(C({event:"transport_error",provider:i,error_class:"Error",reason:"provider_result_error",error_message:z.errorMessage}),n(new Error(`${i} reported an error for this turn (no assistant output)`+(e.sessionId?` \u2014 session=${e.sessionId}`:"")+`: ${z.errorMessage??"unknown error"}`))):z?(Se(`stream-json: result ${z.result.slice(0,80)}${z.result.length>80?"...":""} (${z.durationMs}ms)`),r({result:z.result,sessionId:z.sessionId,durationMs:z.durationMs,numTurns:z.numTurns,exitCode:D})):w!==null&&S==="text_done"&&g.trim().length>0?(C({event:"transport_stall_finalized",provider:i,reason:w,text_len:g.length}),r({result:g,sessionId:p||e.sessionId||"",durationMs:Date.now()-s,numTurns:1,exitCode:D,warnings:[w]})):w!==null&&S==="tool_use_silence"?(C({event:"transport_error",provider:i,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:D,stderr_tail:Dt.slice(0,500)}),n(new Error(`${w} \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})`:"")))):(C({event:"transport_error",provider:i,error_class:"Error",reason:w!==null?"provider_stalled_no_content":"provider_no_result",exit_code:D,stderr_tail:Dt.slice(0,500)}),n(new Error(w!==null?`${w} \u2014 and produced no usable content to fall back on`+(e.sessionId?` (session=${e.sessionId})`:""):cx({tool:i,exitCode:D,stderr:Dt}))))});let Z=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(Z+`
1619
- `),Se(`stream-json: prompt sent (${t.length} chars)`)})}function ux(t){return t==="qwen"?[Yi(X,".qwen","projects")]:[Yi(X,".claude","projects")]}async function Dp(t,e,r){let n=r??ux(t),s=null;for(let a of n){let l;try{l=await ax(a)}catch{continue}for(let c of l){for(let u of[Yi(a,c,`${e}.jsonl`),Yi(a,c,"chats",`${e}.jsonl`)])if(Fp(u)){s=u;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 ${n.join(", ")} \u2014 the session must exist on disk before a bundle can resume it`);let o=(await qe(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 Hp(t){let{tool:e,binary:r,args:n,spawnEnv:s}=Bp(t),i=$p(r,n,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:s}),o=Date.now();i.stdin?.on("error",O=>{Se(`stream-json bundle: stdin pipe error, ignored (exit handler reports): ${O.message}`)});let a={exited:!1,exitCode:null,lastEventAtMs:0,turnActive:!1,completedTurns:0,closed:!1,closing:null},l=t.sessionId||"",c=null,u="";i.stderr?.on("data",O=>{u+=O.toString()});let f="",d="",m=!1,h=!1,y=null,g=null,p=null,_,E,w=Pp(),S=Up(),T=null,b=[],v=()=>a.exited?Promise.resolve():new Promise(O=>{b.push(O)}),x=()=>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 I(){_!==void 0&&(clearTimeout(_),_=void 0)}function R(){E!==void 0&&(clearTimeout(E),E=void 0)}function M(){return a.exited||T===null||T.aborted||T.processor.sawResult()}function N(O){return O==="text_done"?w:S}async function P(O){if(O==="text_done"?_=void 0:E=void 0,M()||y!==null)return;p??=Date.now();let B=N(O);if(t.holdOpen){let Qr=(t.holdOpen.maxHoldMs??Gi)-(Date.now()-p),hi=Qr>0?await Ji(Promise.resolve(t.holdOpen.hasOutstandingWork()).catch(()=>!1),Qr,void 0):!1;if(M()||(O==="text_done"?_!==void 0:E!==void 0))return;if(hi===!0){C({event:"transport_stall_grace_deferred",provider:e,grace_kind:O,grace_ms:B,reason:"outstanding_dispatched_work"}),q(O);return}}g=O,y=O==="text_done"?`${e} finished responding but never emitted its closing result event (${B}ms of silence after its last message)`:`${e} went silent mid-turn and never emitted its closing result event (${B}ms of silence)`,C({event:"transport_stall_grace_fired",provider:e,grace_kind:O,grace_ms:B}),le(i).catch(()=>{})}function q(O){let B=setTimeout(()=>{P(O)},N(O));B.unref?.(),O==="text_done"?(I(),_=B):(R(),E=B)}let V=!1,_e,Te,br=new Promise((O,B)=>{_e=O,Te=B});br.catch(()=>{});let Dt=setTimeout(()=>{V||(V=!0,Te(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);Dt.unref?.();function Z(O){V||(V=!0,clearTimeout(Dt),O?Te(O):_e())}let D="";function z(O){if(a.lastEventAtMs=Date.now(),O.type==="system"&&O.subtype==="init"){if(d=O.session_id||d,t.sessionId&&typeof O.session_id=="string"&&O.session_id.length>0&&O.session_id!==t.sessionId){let ye=new Error(`stream-json bundle: provider resumed a different session (init reported "${O.session_id}", expected "${t.sessionId}")`);Z(ye),le(i).catch(()=>{});return}Z()}let B=T?.processor.sawResult()??!0;O.type==="assistant"?(m=!jp(O),h=m&&O.message?.stop_reason==="pause_turn"):(O.type==="result"||O.type==="user")&&(m=!1,h=!1),I(),e==="claude"&&a.turnActive&&m&&!h&&!B&&q("text_done"),R(),e==="claude"&&a.turnActive&&!B&&q("tool_use_silence")}function pi(){let O=T;if(O===null)return;let B=O.processor.finalize();if(B!==null){if(T=null,a.turnActive=!1,I(),R(),B.isError){C({event:"transport_error",provider:e,error_class:"Error",reason:"provider_result_error",error_message:B.errorMessage}),O.reject(new Error(`${e} reported an error for this turn (no assistant output)`+(t.sessionId?` \u2014 session=${t.sessionId}`:"")+`: ${B.errorMessage??"unknown error"}`));return}a.completedTurns+=1,l=B.sessionId||l,Se(`stream-json bundle: result ${B.result.slice(0,80)}${B.result.length>80?"...":""} (${B.durationMs}ms)`),O.resolve({result:B.result,sessionId:B.sessionId||l,durationMs:B.durationMs,numTurns:B.numTurns})}}function Pn(O){if(!O.trim())return;let B;try{B=JSON.parse(O)}catch{return}z(B);let ye=T;if(ye!==null){let Qr=ye.processor.sawResult();ye.processor.processLine(O),ye.onEventForward?.(B),!Qr&&ye.processor.sawResult()&&pi()}}i.stdout?.on("data",O=>{D+=O.toString();let B=D.split(`
1620
- `);D=B.pop()||"";for(let ye of B)Pn(ye)}),i.on("error",O=>{if(c=new ne(`Failed to spawn ${r}: ${O.message}`,{cause:O}),C({event:"transport_error",provider:e,error_class:"TransportConnectionError",error_message:O.message}),Z(c),T!==null){let B=T;T=null,a.turnActive=!1,B.reject(c)}}),i.on("exit",O=>{a.exited=!0,a.exitCode=O,I(),R(),D.trim()&&Pn(D),Z(a.exited&&!V?new Error(`stream-json bundle: ${e} exited (code ${String(O)}) before its init event`):void 0);let B=T;B!==null&&(T=null,a.turnActive=!1,B.aborted||(y!==null&&g==="text_done"&&f.trim().length>0?(C({event:"transport_stall_finalized",provider:e,reason:y,text_len:f.length}),B.resolve({result:f,sessionId:d||t.sessionId||"",durationMs:Date.now()-B.startMs,numTurns:1,warnings:[y]})):y!==null&&g==="tool_use_silence"?(C({event:"transport_error",provider:e,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:O,stderr_tail:u.slice(0,500)}),B.reject(new Error(`${y} \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})`:"")))):(C({event:"transport_error",provider:e,error_class:"Error",reason:y!==null?"provider_stalled_no_content":"provider_no_result",exit_code:O,stderr_tail:u.slice(0,500)}),B.reject(x()))));for(let ye of b.splice(0))ye()});try{t.sessionId&&await Dp(e,t.sessionId,t.sessionFileRoots),await br}catch(O){let B=c??(O instanceof Error?O:new Error(String(O))),ye=t.closeTimeoutMs??2e3;throw await le(i,{softDelayMs:Math.min(1e3,ye),killDelayMs:Math.min(1e3,ye)}).catch(()=>{}),B}let Fa=O=>new Promise(B=>{setTimeout(B,O).unref?.()});return{tool:e,get sessionId(){return l},get completedTurns(){return a.completedTurns},async sendTurn(O,B={}){if(a.closed||a.closing!==null)throw new Error(`stream-json bundle session (${e}) is closed`);if(a.exited)throw x();if(T!==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 ye=()=>(a.closed=!0,le(i).catch(()=>{}),new Error("Aborted"));if(B.signal?.aborted)throw ye();if(t.sessionId&&(await Dp(e,t.sessionId,t.sessionFileRoots),a.exited))throw x();if(B.signal?.aborted)throw ye();return f="",m=!1,h=!1,y=null,g=null,p=null,new Promise((Qr,hi)=>{let Pa={processor:Ki({onText:cm=>{f+=cm,B.onText?.(cm)}}),resolve:Qr,reject:hi,startMs:Date.now(),aborted:!1,onEventForward:B.onEvent};T=Pa,a.turnActive=!0;let iv=()=>{Pa.aborted=!0,C({event:"transport_abort",provider:e}),a.closed=!0,le(i).catch(()=>{}),T===Pa&&(T=null,a.turnActive=!1),hi(new Error("Aborted"))};B.signal?.addEventListener("abort",iv,{once:!0});let ov=JSON.stringify({type:"user",message:{role:"user",content:O}});i.stdin?.write(`${ov}
1617
+ ${r}`:r}function Bp(t){let e=t.tool||"claude",r=t.binaryPath||lx[e]||"claude",n=["-p","","--output-format","stream-json","--input-format","stream-json"];e==="claude"&&n.push("--verbose"),t.sessionId&&n.push("--resume",t.sessionId),t.model&&n.push("--model",t.model);let s=t.permissionMode??"yolo",i=or(e,s)??dx[e]??["--dangerously-skip-permissions"];if(n.push(...i),Ne(e,n,s),t.cwd&&!Fp(t.cwd))throw C({event:"transport_error",provider:e,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),new ne(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});let o=be(t.env,t.cwd,t.sessionId);return{tool:e,binary:r,args:n,spawnEnv:e==="claude"?Rp(o):o}}function Wp(t,e){return new Promise((r,n)=>{let s=Date.now(),i,o,a,l;try{({tool:i,binary:o,args:a,spawnEnv:l}=Bp(e))}catch(D){return n(D instanceof Error?D:new Error(String(D)))}let c=$p(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:l});c.stdin?.on("error",D=>{Se(`stream-json: stdin pipe error, ignored (exit handler reports): ${D.message}`)});let u=!1;if(e.signal){if(e.signal.aborted)return u=!0,C({event:"transport_abort",provider:i,phase:"pre_spawn"}),le(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,C({event:"transport_abort",provider:i}),le(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f="",d=!1,m=!1,g=0,y=!1,h="",p="",_,E,w=null,S=null,T=!1,b=!1,v=Pp(),x=Up();function I(){_!==void 0&&(clearTimeout(_),_=void 0)}function R(){E!==void 0&&(clearTimeout(E),E=void 0)}let M=null;function N(){return d||u||_e.sawResult()}function P(D){return D==="text_done"?v:x}async function q(D){if(D==="text_done"?_=void 0:E=void 0,N()||w!==null)return;M??=Date.now();let z=P(D);if(e.holdOpen){let Pn=(e.holdOpen.maxHoldMs??Gi)-(Date.now()-M),Fa=Pn>0?await Ji(Promise.resolve(e.holdOpen.hasOutstandingWork()).catch(()=>!1),Pn,e.signal):!1;if(N()||(D==="text_done"?_!==void 0:E!==void 0))return;if(Fa===!0){C({event:"transport_stall_grace_deferred",provider:i,grace_kind:D,grace_ms:z,reason:"outstanding_dispatched_work"}),V(D);return}}S=D,w=D==="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)`,C({event:"transport_stall_grace_fired",provider:i,grace_kind:D,grace_ms:z}),le(c).catch(()=>{})}function V(D){let z=setTimeout(()=>{q(D)},P(D));z.unref?.(),D==="text_done"?(I(),_=z):(R(),E=z)}let _e=Ki({onEvent:D=>{g=Date.now(),y=D.type!=="result",D.type==="system"&&D.subtype==="init"&&(p=D.session_id||p),D.type==="assistant"?(T=!jp(D),b=T&&D.message?.stop_reason==="pause_turn"):(D.type==="result"||D.type==="user")&&(T=!1,b=!1),I(),i==="claude"&&T&&!b&&!_e.sawResult()&&V("text_done"),R(),i==="claude"&&!_e.sawResult()&&V("tool_use_silence"),e.onEvent?.(D)},onText:D=>{h+=D,e.onText?.(D)}});function Te(){m||(m=!0,ar(e.holdOpen,{isAborted:()=>u,hasChildExited:()=>d,isTurnInFlight:()=>y,lastEventAtMs:()=>g,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function br(D){let z=_e.sawResult();_e.processLine(D),!z&&_e.sawResult()&&Te()}c.stdout?.on("data",D=>{f+=D.toString();let z=f.split(`
1618
+ `);f=z.pop()||"";for(let pi of z)br(pi)});let Dt="";c.stderr?.on("data",D=>{Dt+=D.toString()}),c.on("error",D=>{C({event:"transport_error",provider:i,error_class:"TransportConnectionError",error_message:D.message}),n(new ne(`Failed to spawn ${o}: ${D.message}`,{cause:D}))}),c.on("exit",D=>{if(d=!0,I(),R(),u)return;f.trim()&&br(f);let z=_e.finalize();z?.isError?(C({event:"transport_error",provider:i,error_class:"Error",reason:"provider_result_error",error_message:z.errorMessage}),n(new Error(`${i} reported an error for this turn (no assistant output)`+(e.sessionId?` \u2014 session=${e.sessionId}`:"")+`: ${z.errorMessage??"unknown error"}`))):z?(Se(`stream-json: result ${z.result.slice(0,80)}${z.result.length>80?"...":""} (${z.durationMs}ms)`),r({result:z.result,sessionId:z.sessionId,durationMs:z.durationMs,numTurns:z.numTurns,exitCode:D})):w!==null&&S==="text_done"&&h.trim().length>0?(C({event:"transport_stall_finalized",provider:i,reason:w,text_len:h.length}),r({result:h,sessionId:p||e.sessionId||"",durationMs:Date.now()-s,numTurns:1,exitCode:D,warnings:[w]})):w!==null&&S==="tool_use_silence"?(C({event:"transport_error",provider:i,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:D,stderr_tail:Dt.slice(0,500)}),n(new Error(`${w} \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})`:"")))):(C({event:"transport_error",provider:i,error_class:"Error",reason:w!==null?"provider_stalled_no_content":"provider_no_result",exit_code:D,stderr_tail:Dt.slice(0,500)}),n(new Error(w!==null?`${w} \u2014 and produced no usable content to fall back on`+(e.sessionId?` (session=${e.sessionId})`:""):cx({tool:i,exitCode:D,stderr:Dt}))))});let Z=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(Z+`
1619
+ `),Se(`stream-json: prompt sent (${t.length} chars)`)})}function ux(t){return t==="qwen"?[Yi(X,".qwen","projects")]:[Yi(X,".claude","projects")]}async function Dp(t,e,r){let n=r??ux(t),s=null;for(let a of n){let l;try{l=await ax(a)}catch{continue}for(let c of l){for(let u of[Yi(a,c,`${e}.jsonl`),Yi(a,c,"chats",`${e}.jsonl`)])if(Fp(u)){s=u;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 ${n.join(", ")} \u2014 the session must exist on disk before a bundle can resume it`);let o=(await qe(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 Hp(t){let{tool:e,binary:r,args:n,spawnEnv:s}=Bp(t),i=$p(r,n,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:s}),o=Date.now();i.stdin?.on("error",O=>{Se(`stream-json bundle: stdin pipe error, ignored (exit handler reports): ${O.message}`)});let a={exited:!1,exitCode:null,lastEventAtMs:0,turnActive:!1,completedTurns:0,closed:!1,closing:null},l=t.sessionId||"",c=null,u="";i.stderr?.on("data",O=>{u+=O.toString()});let f="",d="",m=!1,g=!1,y=null,h=null,p=null,_,E,w=Pp(),S=Up(),T=null,b=[],v=()=>a.exited?Promise.resolve():new Promise(O=>{b.push(O)}),x=()=>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 I(){_!==void 0&&(clearTimeout(_),_=void 0)}function R(){E!==void 0&&(clearTimeout(E),E=void 0)}function M(){return a.exited||T===null||T.aborted||T.processor.sawResult()}function N(O){return O==="text_done"?w:S}async function P(O){if(O==="text_done"?_=void 0:E=void 0,M()||y!==null)return;p??=Date.now();let B=N(O);if(t.holdOpen){let Qr=(t.holdOpen.maxHoldMs??Gi)-(Date.now()-p),hi=Qr>0?await Ji(Promise.resolve(t.holdOpen.hasOutstandingWork()).catch(()=>!1),Qr,void 0):!1;if(M()||(O==="text_done"?_!==void 0:E!==void 0))return;if(hi===!0){C({event:"transport_stall_grace_deferred",provider:e,grace_kind:O,grace_ms:B,reason:"outstanding_dispatched_work"}),q(O);return}}h=O,y=O==="text_done"?`${e} finished responding but never emitted its closing result event (${B}ms of silence after its last message)`:`${e} went silent mid-turn and never emitted its closing result event (${B}ms of silence)`,C({event:"transport_stall_grace_fired",provider:e,grace_kind:O,grace_ms:B}),le(i).catch(()=>{})}function q(O){let B=setTimeout(()=>{P(O)},N(O));B.unref?.(),O==="text_done"?(I(),_=B):(R(),E=B)}let V=!1,_e,Te,br=new Promise((O,B)=>{_e=O,Te=B});br.catch(()=>{});let Dt=setTimeout(()=>{V||(V=!0,Te(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);Dt.unref?.();function Z(O){V||(V=!0,clearTimeout(Dt),O?Te(O):_e())}let D="";function z(O){if(a.lastEventAtMs=Date.now(),O.type==="system"&&O.subtype==="init"){if(d=O.session_id||d,t.sessionId&&typeof O.session_id=="string"&&O.session_id.length>0&&O.session_id!==t.sessionId){let ye=new Error(`stream-json bundle: provider resumed a different session (init reported "${O.session_id}", expected "${t.sessionId}")`);Z(ye),le(i).catch(()=>{});return}Z()}let B=T?.processor.sawResult()??!0;O.type==="assistant"?(m=!jp(O),g=m&&O.message?.stop_reason==="pause_turn"):(O.type==="result"||O.type==="user")&&(m=!1,g=!1),I(),e==="claude"&&a.turnActive&&m&&!g&&!B&&q("text_done"),R(),e==="claude"&&a.turnActive&&!B&&q("tool_use_silence")}function pi(){let O=T;if(O===null)return;let B=O.processor.finalize();if(B!==null){if(T=null,a.turnActive=!1,I(),R(),B.isError){C({event:"transport_error",provider:e,error_class:"Error",reason:"provider_result_error",error_message:B.errorMessage}),O.reject(new Error(`${e} reported an error for this turn (no assistant output)`+(t.sessionId?` \u2014 session=${t.sessionId}`:"")+`: ${B.errorMessage??"unknown error"}`));return}a.completedTurns+=1,l=B.sessionId||l,Se(`stream-json bundle: result ${B.result.slice(0,80)}${B.result.length>80?"...":""} (${B.durationMs}ms)`),O.resolve({result:B.result,sessionId:B.sessionId||l,durationMs:B.durationMs,numTurns:B.numTurns})}}function Pn(O){if(!O.trim())return;let B;try{B=JSON.parse(O)}catch{return}z(B);let ye=T;if(ye!==null){let Qr=ye.processor.sawResult();ye.processor.processLine(O),ye.onEventForward?.(B),!Qr&&ye.processor.sawResult()&&pi()}}i.stdout?.on("data",O=>{D+=O.toString();let B=D.split(`
1620
+ `);D=B.pop()||"";for(let ye of B)Pn(ye)}),i.on("error",O=>{if(c=new ne(`Failed to spawn ${r}: ${O.message}`,{cause:O}),C({event:"transport_error",provider:e,error_class:"TransportConnectionError",error_message:O.message}),Z(c),T!==null){let B=T;T=null,a.turnActive=!1,B.reject(c)}}),i.on("exit",O=>{a.exited=!0,a.exitCode=O,I(),R(),D.trim()&&Pn(D),Z(a.exited&&!V?new Error(`stream-json bundle: ${e} exited (code ${String(O)}) before its init event`):void 0);let B=T;B!==null&&(T=null,a.turnActive=!1,B.aborted||(y!==null&&h==="text_done"&&f.trim().length>0?(C({event:"transport_stall_finalized",provider:e,reason:y,text_len:f.length}),B.resolve({result:f,sessionId:d||t.sessionId||"",durationMs:Date.now()-B.startMs,numTurns:1,warnings:[y]})):y!==null&&h==="tool_use_silence"?(C({event:"transport_error",provider:e,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:O,stderr_tail:u.slice(0,500)}),B.reject(new Error(`${y} \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})`:"")))):(C({event:"transport_error",provider:e,error_class:"Error",reason:y!==null?"provider_stalled_no_content":"provider_no_result",exit_code:O,stderr_tail:u.slice(0,500)}),B.reject(x()))));for(let ye of b.splice(0))ye()});try{t.sessionId&&await Dp(e,t.sessionId,t.sessionFileRoots),await br}catch(O){let B=c??(O instanceof Error?O:new Error(String(O))),ye=t.closeTimeoutMs??2e3;throw await le(i,{softDelayMs:Math.min(1e3,ye),killDelayMs:Math.min(1e3,ye)}).catch(()=>{}),B}let Fa=O=>new Promise(B=>{setTimeout(B,O).unref?.()});return{tool:e,get sessionId(){return l},get completedTurns(){return a.completedTurns},async sendTurn(O,B={}){if(a.closed||a.closing!==null)throw new Error(`stream-json bundle session (${e}) is closed`);if(a.exited)throw x();if(T!==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 ye=()=>(a.closed=!0,le(i).catch(()=>{}),new Error("Aborted"));if(B.signal?.aborted)throw ye();if(t.sessionId&&(await Dp(e,t.sessionId,t.sessionFileRoots),a.exited))throw x();if(B.signal?.aborted)throw ye();return f="",m=!1,g=!1,y=null,h=null,p=null,new Promise((Qr,hi)=>{let Pa={processor:Ki({onText:cm=>{f+=cm,B.onText?.(cm)}}),resolve:Qr,reject:hi,startMs:Date.now(),aborted:!1,onEventForward:B.onEvent};T=Pa,a.turnActive=!0;let iv=()=>{Pa.aborted=!0,C({event:"transport_abort",provider:e}),a.closed=!0,le(i).catch(()=>{}),T===Pa&&(T=null,a.turnActive=!1),hi(new Error("Aborted"))};B.signal?.addEventListener("abort",iv,{once:!0});let ov=JSON.stringify({type:"user",message:{role:"user",content:O}});i.stdin?.write(`${ov}
1621
1621
  `),Se(`stream-json bundle: prompt sent (${O.length} chars)`)})},close(){return a.closing!==null||(a.closing=(async()=>{if(a.closed=!0,!a.exited&&(t.holdOpen!==void 0?await new Promise(O=>{ar(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>a.exited,isTurnInFlight:()=>a.turnActive,lastEventAtMs:()=>a.lastEventAtMs,closeStdin:()=>{i.stdin?.end(),O()},label:e})}):i.stdin?.end(),!a.exited)){let O=t.closeTimeoutMs??2e3;await Promise.race([v(),Fa(O)]),a.exited||await le(i,{stdinEnd:!1,softDelayMs:Math.min(1e3,O),killDelayMs:Math.min(1e3,O)}).catch(()=>{})}})()),a.closing}}}var lx,dx,Ol=k(()=>{"use strict";Rr();os();Pt();K();Vi();It();Cl();Re();Cl();lx={claude:"claude",qwen:"qwen"};dx={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function zi(t={}){return[]}var Ml=k(()=>{"use strict"});function Dl(t){return t==="plan"?"read-only":"danger-full-access"}function Xp(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function Qi(){return{agentItems:new Map,resultText:""}}function gn(t,e,r,n){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),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,r?.(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(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,u=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:c,turnId:u,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function Zi(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function qp(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function eo(){return{pendingCodexError:null}}function to(t,e){let r=qp(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function ro(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.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 $l=k(()=>{"use strict"});import{spawn as Gp}from"node:child_process";import{createInterface as Jp}from"node:readline";import{existsSync as mx,readFileSync as fx}from"node:fs";import{fileURLToPath as px}from"node:url";function Vp(){return Xp(hx)}function lr(t,e){Se(`[codex:${t}] ${JSON.stringify(e)}`)}function gx(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1622
1622
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
1623
1623
  ${e}
1624
1624
 
1625
- ${r}`:r}function Kp(t){let e=t.binaryPath||"codex",r=["app-server","--listen","stdio://"];t.model&&r.push("-c",`model=${JSON.stringify(t.model)}`);let n=t.isLead??t.alias?.toLowerCase()==="lead",s=n?zi():[];r.push(...s),Q()&&ve(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:n,injected:s.length>0}));let i=t.permissionMode??"yolo",o=Dl(i);if(Ne("codex",r,i),t.cwd&&!mx(t.cwd))throw C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),new ne(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:e,codexArgs:r,sandbox:o,permissionMode:i,spawnEnv:be(t.env,t.cwd,t.threadId)}}function Yp(t,e){return new Promise((r,n)=>{let s,i,o;try{({binary:s,codexArgs:i,sandbox:o}=Kp(e))}catch(T){return n(T instanceof Error?T:new Error(String(T)))}let a=Gp(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:be(e.env,e.cwd,e.threadId)}),l=!1;if(e.signal){if(e.signal.aborted)return l=!0,C({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),le(a).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{l=!0,C({event:"transport_abort",provider:"codex"}),le(a).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let c=Jp({input:a.stdout}),u=new Map,f=1,d=e.threadId||"",m="",h=!1,y=!1,g=Date.now(),p=Qi(),_=eo();function E(T,b={}){return new Promise((v,x)=>{let I=f++;u.set(I,{resolve:v,reject:x});let R=JSON.stringify({jsonrpc:"2.0",id:I,method:T,params:b});a.stdin?.write(R+`
1625
+ ${r}`:r}function Kp(t){let e=t.binaryPath||"codex",r=["app-server","--listen","stdio://"];t.model&&r.push("-c",`model=${JSON.stringify(t.model)}`);let n=t.isLead??t.alias?.toLowerCase()==="lead",s=n?zi():[];r.push(...s),Q()&&ve(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:n,injected:s.length>0}));let i=t.permissionMode??"yolo",o=Dl(i);if(Ne("codex",r,i),t.cwd&&!mx(t.cwd))throw C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),new ne(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:e,codexArgs:r,sandbox:o,permissionMode:i,spawnEnv:be(t.env,t.cwd,t.threadId)}}function Yp(t,e){return new Promise((r,n)=>{let s,i,o;try{({binary:s,codexArgs:i,sandbox:o}=Kp(e))}catch(T){return n(T instanceof Error?T:new Error(String(T)))}let a=Gp(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:be(e.env,e.cwd,e.threadId)}),l=!1;if(e.signal){if(e.signal.aborted)return l=!0,C({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),le(a).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{l=!0,C({event:"transport_abort",provider:"codex"}),le(a).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let c=Jp({input:a.stdout}),u=new Map,f=1,d=e.threadId||"",m="",g=!1,y=!1,h=Date.now(),p=Qi(),_=eo();function E(T,b={}){return new Promise((v,x)=>{let I=f++;u.set(I,{resolve:v,reject:x});let R=JSON.stringify({jsonrpc:"2.0",id:I,method:T,params:b});a.stdin?.write(R+`
1626
1626
  `)})}function w(T,b={}){let v=JSON.stringify({jsonrpc:"2.0",method:T,params:b});a.stdin?.write(v+`
1627
- `)}c.on("line",T=>{let b;try{b=JSON.parse(T)}catch{return}if(typeof b.id=="number"&&u.has(b.id)){let I=u.get(b.id);if(u.delete(b.id),b.error){let R=b.error,M=typeof R?.message=="string"&&R.message.length>0?R.message:JSON.stringify(b.error);I.reject(is(`codex app-server error: ${M}`,R))}else I.resolve(b);e.onEvent?.(b);return}let v=b.method;if(!v){e.onEvent?.(b);return}if(v==="thread/started"){let R=b.params?.thread;R?.id&&(d=R.id)}let x=Q()?I=>{lr("item.text/buffer-mismatch",{itemId:I.itemId,threadId:I.threadId??null,turnId:I.turnId??null,expectedFromItemText:I.expectedFromItemText,gotFromBuffer:I.gotFromBuffer,expectedLen:I.expectedFromItemText.length,gotLen:I.gotFromBuffer.length})}:void 0;if(v==="turn/started"){let I=b.params,R=I?.turn;R?.id&&(m=R.id),gn(b,p,e.onDelta,x),Q()&&lr("turn/started",{params:I??null})}if(Q()&&(v==="item/started"||v==="item/completed")){let I=b.params;I?.item?.type==="agentMessage"&&lr(v,{params:I??null})}if(v==="item/started"||v==="item/agentMessage/delta"||v==="item/completed"){if(v==="item/agentMessage/delta"){let I=b.params;Q()&&lr("agentMessage/delta",{params:I??null})}gn(b,p,e.onDelta,x)}if(v==="turn/completed"){let I=b.params;if(Q())for(let[M,N]of p.agentItems.entries())N.buffer&&lr("turn/completed/unflushed-item",{itemId:M,phase:N.phase,bufferLen:N.buffer.length});Zi(p),Q()&&lr("turn/completed",{params:I??null});let R=ro(b,_);R.shouldReject?(Q()&&lr("turn/completed/terminal-reject",{message:R.turnError.message}),y=!0,h=!0,a.stdin?.end(),n(R.turnError)):(h=!0,a.stdin?.end())}if(v==="error"){let I=to(b,_);if(Q()){let R=b.params,M=R?.error,N=typeof M?.message=="string"?M.message:"(no message)";lr(I.willRetry?"error/retry":"error/terminal-deferred",{message:N,willRetry:I.willRetry,params:R??null})}}e.onEvent?.(b)});let S="";a.stderr?.on("data",T=>{S+=T.toString()}),a.on("error",T=>{C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:T.message}),n(new ne(`Failed to spawn codex app-server: ${T.message}`,{cause:T}))}),a.on("exit",T=>{if(!l&&!y){if(h){r({result:p.resultText,threadId:d,turnId:m,durationMs:Date.now()-g,exitCode:T});return}if(_.pendingCodexError){n(_.pendingCodexError);return}C({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:T,stderr_tail:S.slice(0,500)}),n(new Error(gx({exitCode:T,stderr:S})))}}),(async()=>{try{if(await E("initialize",Vp()),w("initialized",{}),e.threadId)try{let T=E("thread/resume",{threadId:e.threadId,sandbox:o,approvalPolicy:"never",...e.model?{model:e.model}:{}}),b=new Promise((v,x)=>setTimeout(()=>x(new Error("resume timeout")),3e4));await Promise.race([T,b]),d=e.threadId}catch(T){process.stderr.write(`[codex] thread/resume failed, creating new thread
1627
+ `)}c.on("line",T=>{let b;try{b=JSON.parse(T)}catch{return}if(typeof b.id=="number"&&u.has(b.id)){let I=u.get(b.id);if(u.delete(b.id),b.error){let R=b.error,M=typeof R?.message=="string"&&R.message.length>0?R.message:JSON.stringify(b.error);I.reject(is(`codex app-server error: ${M}`,R))}else I.resolve(b);e.onEvent?.(b);return}let v=b.method;if(!v){e.onEvent?.(b);return}if(v==="thread/started"){let R=b.params?.thread;R?.id&&(d=R.id)}let x=Q()?I=>{lr("item.text/buffer-mismatch",{itemId:I.itemId,threadId:I.threadId??null,turnId:I.turnId??null,expectedFromItemText:I.expectedFromItemText,gotFromBuffer:I.gotFromBuffer,expectedLen:I.expectedFromItemText.length,gotLen:I.gotFromBuffer.length})}:void 0;if(v==="turn/started"){let I=b.params,R=I?.turn;R?.id&&(m=R.id),gn(b,p,e.onDelta,x),Q()&&lr("turn/started",{params:I??null})}if(Q()&&(v==="item/started"||v==="item/completed")){let I=b.params;I?.item?.type==="agentMessage"&&lr(v,{params:I??null})}if(v==="item/started"||v==="item/agentMessage/delta"||v==="item/completed"){if(v==="item/agentMessage/delta"){let I=b.params;Q()&&lr("agentMessage/delta",{params:I??null})}gn(b,p,e.onDelta,x)}if(v==="turn/completed"){let I=b.params;if(Q())for(let[M,N]of p.agentItems.entries())N.buffer&&lr("turn/completed/unflushed-item",{itemId:M,phase:N.phase,bufferLen:N.buffer.length});Zi(p),Q()&&lr("turn/completed",{params:I??null});let R=ro(b,_);R.shouldReject?(Q()&&lr("turn/completed/terminal-reject",{message:R.turnError.message}),y=!0,g=!0,a.stdin?.end(),n(R.turnError)):(g=!0,a.stdin?.end())}if(v==="error"){let I=to(b,_);if(Q()){let R=b.params,M=R?.error,N=typeof M?.message=="string"?M.message:"(no message)";lr(I.willRetry?"error/retry":"error/terminal-deferred",{message:N,willRetry:I.willRetry,params:R??null})}}e.onEvent?.(b)});let S="";a.stderr?.on("data",T=>{S+=T.toString()}),a.on("error",T=>{C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:T.message}),n(new ne(`Failed to spawn codex app-server: ${T.message}`,{cause:T}))}),a.on("exit",T=>{if(!l&&!y){if(g){r({result:p.resultText,threadId:d,turnId:m,durationMs:Date.now()-h,exitCode:T});return}if(_.pendingCodexError){n(_.pendingCodexError);return}C({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:T,stderr_tail:S.slice(0,500)}),n(new Error(gx({exitCode:T,stderr:S})))}}),(async()=>{try{if(await E("initialize",Vp()),w("initialized",{}),e.threadId)try{let T=E("thread/resume",{threadId:e.threadId,sandbox:o,approvalPolicy:"never",...e.model?{model:e.model}:{}}),b=new Promise((v,x)=>setTimeout(()=>x(new Error("resume timeout")),3e4));await Promise.race([T,b]),d=e.threadId}catch(T){process.stderr.write(`[codex] thread/resume failed, creating new thread
1628
1628
  `),C({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:T instanceof Error?T.message:String(T)});let v=(await E("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:o,...e.model?{model:e.model}:{}})).result?.thread;v?.id&&(d=v.id)}else{let b=(await E("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:o,...e.model?{model:e.model}:{}})).result?.thread;b?.id&&(d=b.id)}await E("turn/start",{threadId:d,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(T){le(a).catch(()=>{}),n(T instanceof Error?T:new Error(String(T)))}})()})}async function zp(t){let{binary:e,codexArgs:r,sandbox:n}=Kp(t),s=Gp(e,r,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:be(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 u=Jp({input:s.stdout}),f=new Map,d=1;function m(S,T={}){return new Promise((b,v)=>{let x=d++;f.set(x,{resolve:b,reject:v});let I=JSON.stringify({jsonrpc:"2.0",id:x,method:S,params:T});s.stdin?.write(I+`
1629
- `)})}function h(S,T={}){let b=JSON.stringify({jsonrpc:"2.0",method:S,params:T});s.stdin?.write(b+`
1630
- `)}let y=[],g=()=>o.exited?Promise.resolve():new Promise(S=>{y.push(S)}),p=()=>new Error(`codex bundle process exited${o.exitCode!==null?` with code ${o.exitCode}`:""} after ${o.completedTurns} completed prompt(s); the bundle cannot continue`),_=null;function E(S){let T=_;T===null||T.settled||(T.settled=!0,_=null,S&&T.reject(S))}u.on("line",S=>{let T;try{T=JSON.parse(S)}catch{return}if(typeof T.id=="number"&&f.has(T.id)){let x=f.get(T.id);if(f.delete(T.id),T.error){let I=T.error,R=typeof I?.message=="string"&&I.message.length>0?I.message:JSON.stringify(T.error);x.reject(is(`codex app-server error: ${R}`,I))}else x.resolve(T);_?.onEvent?.(T);return}let b=T.method;if(!b){_?.onEvent?.(T);return}if(b==="thread/started"){let I=T.params?.thread;I?.id&&(a=I.id)}let v=_;if(b==="turn/started"&&v!==null){let I=T.params?.turn;I?.id&&(v.turnId=I.id),gn(T,v.agentState,v.onDelta,void 0)}if(v!==null&&(b==="item/started"||b==="item/agentMessage/delta"||b==="item/completed")&&gn(T,v.agentState,v.onDelta,void 0),b==="turn/completed"&&v!==null&&!v.settled){Zi(v.agentState);let x=ro(T,v.turnState);v.settled=!0,_=null,x.shouldReject?v.reject(x.turnError):(o.completedTurns+=1,v.resolve({text:v.agentState.resultText,sessionId:a,turnId:v.turnId,durationMs:Date.now()-v.startMs}))}b==="error"&&v!==null&&to(T,v.turnState),v?.onEvent?.(T)}),s.on("error",S=>{l=new ne(`Failed to spawn codex app-server: ${S.message}`,{cause:S}),C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:S.message});for(let T of f.values())T.reject(l);f.clear(),E(l)}),s.on("exit",S=>{o.exited=!0,o.exitCode=S;let T=p();for(let v of f.values())v.reject(T);f.clear();let b=_;b!==null&&!b.settled&&(b.settled=!0,_=null,b.turnState.pendingCodexError?b.reject(b.turnState.pendingCodexError):(C({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:S,stderr_tail:c.slice(0,500)}),b.reject(T)));for(let v of y.splice(0))v()});try{if(await m("initialize",Vp()),h("initialized",{}),t.threadId){let S;try{S=await m("thread/resume",{threadId:t.threadId,sandbox:n,approvalPolicy:"never",...t.model?{model:t.model}:{}})}catch(b){throw new Error(`Cannot resume codex thread ${t.threadId} for a bundle: ${b instanceof Error?b.message:String(b)} (the thread/start fallback is disabled in bundle mode)`)}let T=S.result?.thread;if(typeof T?.id=="string"&&T.id.length>0){if(T.id!==t.threadId)throw new Error(`codex thread/resume did not return the requested thread id: expected "${t.threadId}", received "${T.id}"`);a=T.id}}else{let T=(await m("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:n,...t.model?{model:t.model}:{}})).result?.thread;T?.id&&(a=T.id)}}catch(S){let T=l??(S instanceof Error?S:new Error(String(S))),b=t.closeTimeoutMs??2e3;throw await le(s,{softDelayMs:Math.min(1e3,b),killDelayMs:Math.min(1e3,b)}).catch(()=>{}),T}let w=S=>new Promise(T=>{setTimeout(T,S).unref?.()});return{provider:"codex",get sessionId(){return a},get completedTurns(){return o.completedTurns},async sendTurn(S,T={}){if(o.closed||o.closing!==null)throw new Error("codex bundle session is closed");if(o.exited)throw p();if(_!==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(T.signal?.aborted)throw new Error("Aborted");return new Promise((b,v)=>{let x={agentState:Qi(),turnState:eo(),resolve:b,reject:v,startMs:Date.now(),turnId:"",onDelta:T.onDelta,onEvent:T.onEvent,settled:!1};_=x;let I=()=>{x.settled||(x.settled=!0,_=null,x.turnId&&m("turn/interrupt",{threadId:a,turnId:x.turnId}).catch(()=>{}),v(new Error("Aborted")))};T.signal?.addEventListener("abort",I,{once:!0}),m("turn/start",{threadId:a,input:[{type:"text",text:S}],...t.model?{model:t.model}:{}}).catch(R=>{x.settled||(x.settled=!0,_=null,T.signal?.removeEventListener("abort",I),v(o.exited?p():R instanceof Error?R:new Error(String(R))))})})},close(){return o.closing!==null||(o.closing=(async()=>{if(o.closed=!0,!o.exited&&(t.holdOpen!==void 0?await new Promise(S=>{ar(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>o.exited,isTurnInFlight:()=>_!==null,lastEventAtMs:()=>i,closeStdin:()=>{s.stdin?.end(),S()},label:"codex"})}):s.stdin?.end(),!o.exited)){let S=t.closeTimeoutMs??2e3;await Promise.race([g(),w(S)]),o.exited||await le(s,{stdinEnd:!1,softDelayMs:Math.min(1e3,S),killDelayMs:Math.min(1e3,S)}).catch(()=>{})}})()),o.closing}}}var hx,Qp=k(()=>{"use strict";K();K();Rr();os();Vi();Pt();Ml();K();It();$l();$l();hx=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(fx(px(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function no(t){let e=[...t.matchAll(_x)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Zp(t.slice(n).trimStart())}return Zp(vx(t.replace(yx,"")))}function vx(t){let e=Ex.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(wx)];if(n.length<2)return t;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function Zp(t){let e=[...t.matchAll(Tx)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function cr(t,e=""){let r=t.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:e}function th(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function so(t={}){let e="",r="",n="",s=!1,i=!1,o=!1,a=t.isolateResult??(t.tool==="gemini"?no:void 0),l=()=>({result:a?a(r):r,sessionId:e,stopReason:n,sawActivity:o});return{setSessionId(c){e=c},beginTurn(){r="",n="",s=!1,i=!0,o=!1},completeTurn(c){return n=th(c),s=!0,i=!1,l()},cancelTurn(){r="",n="",i=!1},processMessage(c){if(c.method!=="session/update")return!1;let f=c.params?.update,d=f?.sessionUpdate;if(typeof d!="string"||(i&&Sx.has(d)&&(o=!0),d!=="agent_message_chunk"))return!1;let m=f?.content,h=typeof m?.text=="string"?m.text:"";return h&&i&&(r+=h,t.onDelta?.(h)),!0},finalize(){return s?l():null}}}var eh,_x,yx,Ex,wx,Tx,Sx,as=k(()=>{"use strict";eh="(?:png|jpe?g|webp|heic|pdf)",_x=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${eh}\\s*`,"gi"),yx=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${eh}\\s*`,"i"),Ex=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,wx=/^STANCE:\s+\S+\s*$/gim,Tx=/\[Thought:\s*true\]\s*/gi;Sx=new Set(["agent_message_chunk","agent_thought_chunk","tool_call","tool_call_update","plan"])});import{createInterface as bx}from"node:readline";function ls(t,e){let r=bx({input:t.stdout}),n=new Map,s=(o,a={})=>new Promise((l,c)=>{let u=Ix++;n.set(u,{resolve:l,reject:c});let f=JSON.stringify({jsonrpc:"2.0",id:u,method:o,params:a});ke({event:"acp_send",direction:"SEND",provider:e.provider,method:o,id:u,params:a}),t.stdin?.write(`${f}
1629
+ `)})}function g(S,T={}){let b=JSON.stringify({jsonrpc:"2.0",method:S,params:T});s.stdin?.write(b+`
1630
+ `)}let y=[],h=()=>o.exited?Promise.resolve():new Promise(S=>{y.push(S)}),p=()=>new Error(`codex bundle process exited${o.exitCode!==null?` with code ${o.exitCode}`:""} after ${o.completedTurns} completed prompt(s); the bundle cannot continue`),_=null;function E(S){let T=_;T===null||T.settled||(T.settled=!0,_=null,S&&T.reject(S))}u.on("line",S=>{let T;try{T=JSON.parse(S)}catch{return}if(typeof T.id=="number"&&f.has(T.id)){let x=f.get(T.id);if(f.delete(T.id),T.error){let I=T.error,R=typeof I?.message=="string"&&I.message.length>0?I.message:JSON.stringify(T.error);x.reject(is(`codex app-server error: ${R}`,I))}else x.resolve(T);_?.onEvent?.(T);return}let b=T.method;if(!b){_?.onEvent?.(T);return}if(b==="thread/started"){let I=T.params?.thread;I?.id&&(a=I.id)}let v=_;if(b==="turn/started"&&v!==null){let I=T.params?.turn;I?.id&&(v.turnId=I.id),gn(T,v.agentState,v.onDelta,void 0)}if(v!==null&&(b==="item/started"||b==="item/agentMessage/delta"||b==="item/completed")&&gn(T,v.agentState,v.onDelta,void 0),b==="turn/completed"&&v!==null&&!v.settled){Zi(v.agentState);let x=ro(T,v.turnState);v.settled=!0,_=null,x.shouldReject?v.reject(x.turnError):(o.completedTurns+=1,v.resolve({text:v.agentState.resultText,sessionId:a,turnId:v.turnId,durationMs:Date.now()-v.startMs}))}b==="error"&&v!==null&&to(T,v.turnState),v?.onEvent?.(T)}),s.on("error",S=>{l=new ne(`Failed to spawn codex app-server: ${S.message}`,{cause:S}),C({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:S.message});for(let T of f.values())T.reject(l);f.clear(),E(l)}),s.on("exit",S=>{o.exited=!0,o.exitCode=S;let T=p();for(let v of f.values())v.reject(T);f.clear();let b=_;b!==null&&!b.settled&&(b.settled=!0,_=null,b.turnState.pendingCodexError?b.reject(b.turnState.pendingCodexError):(C({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:S,stderr_tail:c.slice(0,500)}),b.reject(T)));for(let v of y.splice(0))v()});try{if(await m("initialize",Vp()),g("initialized",{}),t.threadId){let S;try{S=await m("thread/resume",{threadId:t.threadId,sandbox:n,approvalPolicy:"never",...t.model?{model:t.model}:{}})}catch(b){throw new Error(`Cannot resume codex thread ${t.threadId} for a bundle: ${b instanceof Error?b.message:String(b)} (the thread/start fallback is disabled in bundle mode)`)}let T=S.result?.thread;if(typeof T?.id=="string"&&T.id.length>0){if(T.id!==t.threadId)throw new Error(`codex thread/resume did not return the requested thread id: expected "${t.threadId}", received "${T.id}"`);a=T.id}}else{let T=(await m("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:n,...t.model?{model:t.model}:{}})).result?.thread;T?.id&&(a=T.id)}}catch(S){let T=l??(S instanceof Error?S:new Error(String(S))),b=t.closeTimeoutMs??2e3;throw await le(s,{softDelayMs:Math.min(1e3,b),killDelayMs:Math.min(1e3,b)}).catch(()=>{}),T}let w=S=>new Promise(T=>{setTimeout(T,S).unref?.()});return{provider:"codex",get sessionId(){return a},get completedTurns(){return o.completedTurns},async sendTurn(S,T={}){if(o.closed||o.closing!==null)throw new Error("codex bundle session is closed");if(o.exited)throw p();if(_!==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(T.signal?.aborted)throw new Error("Aborted");return new Promise((b,v)=>{let x={agentState:Qi(),turnState:eo(),resolve:b,reject:v,startMs:Date.now(),turnId:"",onDelta:T.onDelta,onEvent:T.onEvent,settled:!1};_=x;let I=()=>{x.settled||(x.settled=!0,_=null,x.turnId&&m("turn/interrupt",{threadId:a,turnId:x.turnId}).catch(()=>{}),v(new Error("Aborted")))};T.signal?.addEventListener("abort",I,{once:!0}),m("turn/start",{threadId:a,input:[{type:"text",text:S}],...t.model?{model:t.model}:{}}).catch(R=>{x.settled||(x.settled=!0,_=null,T.signal?.removeEventListener("abort",I),v(o.exited?p():R instanceof Error?R:new Error(String(R))))})})},close(){return o.closing!==null||(o.closing=(async()=>{if(o.closed=!0,!o.exited&&(t.holdOpen!==void 0?await new Promise(S=>{ar(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>o.exited,isTurnInFlight:()=>_!==null,lastEventAtMs:()=>i,closeStdin:()=>{s.stdin?.end(),S()},label:"codex"})}):s.stdin?.end(),!o.exited)){let S=t.closeTimeoutMs??2e3;await Promise.race([h(),w(S)]),o.exited||await le(s,{stdinEnd:!1,softDelayMs:Math.min(1e3,S),killDelayMs:Math.min(1e3,S)}).catch(()=>{})}})()),o.closing}}}var hx,Qp=k(()=>{"use strict";K();K();Rr();os();Vi();Pt();Ml();K();It();$l();$l();hx=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(fx(px(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function no(t){let e=[...t.matchAll(_x)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Zp(t.slice(n).trimStart())}return Zp(vx(t.replace(yx,"")))}function vx(t){let e=Ex.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(wx)];if(n.length<2)return t;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function Zp(t){let e=[...t.matchAll(Tx)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function cr(t,e=""){let r=t.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:e}function th(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function so(t={}){let e="",r="",n="",s=!1,i=!1,o=!1,a=t.isolateResult??(t.tool==="gemini"?no:void 0),l=()=>({result:a?a(r):r,sessionId:e,stopReason:n,sawActivity:o});return{setSessionId(c){e=c},beginTurn(){r="",n="",s=!1,i=!0,o=!1},completeTurn(c){return n=th(c),s=!0,i=!1,l()},cancelTurn(){r="",n="",i=!1},processMessage(c){if(c.method!=="session/update")return!1;let f=c.params?.update,d=f?.sessionUpdate;if(typeof d!="string"||(i&&Sx.has(d)&&(o=!0),d!=="agent_message_chunk"))return!1;let m=f?.content,g=typeof m?.text=="string"?m.text:"";return g&&i&&(r+=g,t.onDelta?.(g)),!0},finalize(){return s?l():null}}}var eh,_x,yx,Ex,wx,Tx,Sx,as=k(()=>{"use strict";eh="(?:png|jpe?g|webp|heic|pdf)",_x=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${eh}\\s*`,"gi"),yx=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${eh}\\s*`,"i"),Ex=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,wx=/^STANCE:\s+\S+\s*$/gim,Tx=/\[Thought:\s*true\]\s*/gi;Sx=new Set(["agent_message_chunk","agent_thought_chunk","tool_call","tool_call_update","plan"])});import{createInterface as bx}from"node:readline";function ls(t,e){let r=bx({input:t.stdout}),n=new Map,s=(o,a={})=>new Promise((l,c)=>{let u=Ix++;n.set(u,{resolve:l,reject:c});let f=JSON.stringify({jsonrpc:"2.0",id:u,method:o,params:a});ke({event:"acp_send",direction:"SEND",provider:e.provider,method:o,id:u,params:a}),t.stdin?.write(`${f}
1631
1631
  `)}),i=(o,a={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:o,params:a})}
1632
1632
  `)};return r.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(ke({event:"acp_recv",direction:"RECV",provider:e.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),e.onEvent?.(a),typeof a.id=="number"&&n.has(a.id)){let c=n.get(a.id);if(n.delete(a.id),a.error){let u=a.error,f=typeof u?.message=="string"&&u.message.length>0?u.message:JSON.stringify(a.error);c.reject(is(`ACP RPC error: ${f}`,u))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){C({event:"acp_unhandled_request",provider:e.provider,method:l,id:a.id,params:a.params});let c=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});ke({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${c}
1633
1633
  `);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new ne("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}var Ix,Fl=k(()=>{"use strict";K();Rr();Ix=1});import{readFileSync as xx,readdirSync as rh}from"node:fs";import{join as io}from"node:path";function nh(t,e){let r=e.GEMINI_DIR??process.env.GEMINI_DIR??io(X,".gemini"),n=io(r,"tmp"),s;try{s=rh(n)}catch{throw new Error(`gemini bundle: cannot read the gemini session store at ${n} \u2014 cannot verify session "${t}"`)}let i=`"sessionId": "${t}"`,o=`"sessionId":"${t}"`;for(let a of s){let l=io(n,a,"chats"),c;try{c=rh(l)}catch{continue}for(let u of c){if(!u.endsWith(".json"))continue;let f;try{f=xx(io(l,u),"utf8").slice(0,8192)}catch{continue}if(f.includes(i)||f.includes(o))return}}throw new Error(`gemini bundle: no session "${t}" in the gemini chats store (${n}) \u2014 the session must exist on disk before a bundle can resume it`)}var cs,sh=k(()=>{"use strict";as();Re();Pt();cs={name:"gemini",binary:"gemini",baseArgs:["--acp","-y","--skip-trust"],argv(t){let e=[...cs.baseArgs];if(t.permissionMode==="plan"){let r=or("gemini","plan"),n=or("gemini","yolo");e=e.filter(s=>!(n??[]).includes(s)),r&&e.push(...r)}return t.model&&e.push("--model",t.model),e},isolateResult:no,sessionIdentity:{verifyLoadedSession:t=>{nh(t.requestedSessionId,t.env)},recheckSession:t=>{nh(t.requestedSessionId,t.env)}}}});import{existsSync as kx,readFileSync as Ax}from"node:fs";import{join as Pl}from"node:path";function ih(t,e){let r=e.COPILOT_HOME??process.env.COPILOT_HOME??Pl(X,".copilot"),n=Pl(r,"session-state",t),s=Pl(n,"workspace.yaml");if(!kx(s))throw new Error(`copilot bundle: no session "${t}" in the copilot session store (${n}) \u2014 the session must exist on disk before a bundle can resume it`);let i;try{i=Ax(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 ds,oh=k(()=>{"use strict";K();Re();ds={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.
@@ -1639,8 +1639,8 @@ ${r}`:r}function Kp(t){let e=t.binaryPath||"codex",r=["app-server","--listen","s
1639
1639
  s.time_created, s.time_updated
1640
1640
  FROM session s
1641
1641
  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)",u=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
1642
- WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),f=0,d,m,h,y=ph(),g=[];for(let _ of u){let E;try{E=JSON.parse(_.data)}catch{continue}h||(h=E.model?.modelID||E.modelID),(E.role==="user"||E.role==="assistant")&&f++,E.role==="user"&&g.push(_.id),E.role==="assistant"&&hh(y,E.tokens)}let p=[...g.length>0?[g[0]]:[],...g.length>1?[g[g.length-1]]:[]];for(let _ of p){let E=n.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(_),w=this.extractText(E);w&&(d||(d=j(w,80)),m=j(w,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:d,lastUserMessage:m,messageCount:f,filePath:r,...gh(y)})}}catch(s){C({event:"opencode_discover_sessions_failed",provider:this.name,db_path:r,error_message:s instanceof Error?s.message:String(s)})}finally{n.close()}}return e.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(e){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=this.findSessionRow(n,e);if(!s)continue;return this.buildSessionDetail(n,s,r)}catch{}finally{n.close()}}return null}buildSessionDetail(e,r,n){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),i=r.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1643
- FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),a=[],l=[],c=0,u,f,d,m=ph();for(let h of o){let y;try{y=JSON.parse(h.data)}catch{continue}u||(u=y.model?.modelID||y.modelID);let g=y.model?.modelID||y.modelID,p=new Date(y.time?.created||h.time_created),_=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(h.id);if(y.role==="user"){let E=this.extractText(_),w=this.extractText(_,!0);w&&l.push(w),E&&(f||(f=j(E,80)),d=j(E,80)),a.push({role:"user",timestamp:p,content:E||"(empty)"}),c++}else if(y.role==="assistant"){hh(m,y.tokens);for(let E of _){let w;try{w=JSON.parse(E.data)}catch{continue}w.type==="text"&&w.text?a.push({role:"assistant",timestamp:p,content:w.text,model:g}):w.type==="reasoning"&&w.text?a.push({role:"thinking",timestamp:p,content:w.text}):w.type==="tool"&&w.tool&&(a.push({role:"tool_use",timestamp:p,content:`${w.tool}`,toolName:w.tool,toolCallId:w.callID,toolInput:w.state?.input?JSON.stringify(w.state.input):void 0,toolInputData:nt(w.state?.input)}),w.state&&(w.state.status==="completed"||w.state.status==="error"||w.state.output!==void 0||w.state.error!==void 0)&&a.push({role:"tool_result",timestamp:p,content:w.state.error??w.state.output??"",toolCallId:w.callID}))}c++}}return{provider:this.name,sessionId:r.id,slug:r.slug,cwd:i,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:u,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:d,messageCount:c,filePath:n,...gh(m),messages:a,userPrompts:l}}extractText(e,r=!1){let n=[];for(let s of e){let i;try{i=JSON.parse(s.data)}catch{continue}r&&(i.synthetic===!0||i.ignored===!0)||i.type==="text"&&i.text&&n.push(i.text)}return n.join(`
1642
+ WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),f=0,d,m,g,y=ph(),h=[];for(let _ of u){let E;try{E=JSON.parse(_.data)}catch{continue}g||(g=E.model?.modelID||E.modelID),(E.role==="user"||E.role==="assistant")&&f++,E.role==="user"&&h.push(_.id),E.role==="assistant"&&hh(y,E.tokens)}let p=[...h.length>0?[h[0]]:[],...h.length>1?[h[h.length-1]]:[]];for(let _ of p){let E=n.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(_),w=this.extractText(E);w&&(d||(d=j(w,80)),m=j(w,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:g,startCommand:this.startCommand,firstUserMessage:d,lastUserMessage:m,messageCount:f,filePath:r,...gh(y)})}}catch(s){C({event:"opencode_discover_sessions_failed",provider:this.name,db_path:r,error_message:s instanceof Error?s.message:String(s)})}finally{n.close()}}return e.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(e){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=this.findSessionRow(n,e);if(!s)continue;return this.buildSessionDetail(n,s,r)}catch{}finally{n.close()}}return null}buildSessionDetail(e,r,n){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),i=r.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1643
+ FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),a=[],l=[],c=0,u,f,d,m=ph();for(let g of o){let y;try{y=JSON.parse(g.data)}catch{continue}u||(u=y.model?.modelID||y.modelID);let h=y.model?.modelID||y.modelID,p=new Date(y.time?.created||g.time_created),_=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g.id);if(y.role==="user"){let E=this.extractText(_),w=this.extractText(_,!0);w&&l.push(w),E&&(f||(f=j(E,80)),d=j(E,80)),a.push({role:"user",timestamp:p,content:E||"(empty)"}),c++}else if(y.role==="assistant"){hh(m,y.tokens);for(let E of _){let w;try{w=JSON.parse(E.data)}catch{continue}w.type==="text"&&w.text?a.push({role:"assistant",timestamp:p,content:w.text,model:h}):w.type==="reasoning"&&w.text?a.push({role:"thinking",timestamp:p,content:w.text}):w.type==="tool"&&w.tool&&(a.push({role:"tool_use",timestamp:p,content:`${w.tool}`,toolName:w.tool,toolCallId:w.callID,toolInput:w.state?.input?JSON.stringify(w.state.input):void 0,toolInputData:nt(w.state?.input)}),w.state&&(w.state.status==="completed"||w.state.status==="error"||w.state.output!==void 0||w.state.error!==void 0)&&a.push({role:"tool_result",timestamp:p,content:w.state.error??w.state.output??"",toolCallId:w.callID}))}c++}}return{provider:this.name,sessionId:r.id,slug:r.slug,cwd:i,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:u,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:d,messageCount:c,filePath:n,...gh(m),messages:a,userPrompts:l}}extractText(e,r=!1){let n=[];for(let s of e){let i;try{i=JSON.parse(s.data)}catch{continue}r&&(i.synthetic===!0||i.ignored===!0)||i.type==="text"&&i.text&&n.push(i.text)}return n.join(`
1644
1644
  `).trim()}async resolveSessionPath(e){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{if(this.findSessionRow(n,e))return r}catch{}finally{n.close()}}return null}async deleteSession(e){for(let r of this.existingDbPaths()){let n=new(Hl())(r,{open:!0});try{let s=this.findSessionRow(n,e);if(!s)continue;return n.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{n.close()}}return!1}findSessionRow(e,r){let n=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1645
1645
  s.time_created, s.time_updated
1646
1646
  FROM session s WHERE s.id = ?`).get(r);if(n)return n;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
@@ -1657,38 +1657,38 @@ One possible cause: the provider process failed before a complete ACP response w
1657
1657
  ${e}
1658
1658
 
1659
1659
  ${r}`:r}function Vx(t,e){return gs(t)?.filterExpectedStderr?.(e)??e}function Ih(t){if(t.method!=="session/update")return!1;let r=t.params?.update;if(r===void 0)return!1;let n=r.sessionUpdate;if(n!=="tool_call"&&n!=="tool_call_update")return!1;let s=r.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:r.rawInput?.background===!0}async function xh(t,e,r,n){for(let s of t.sessionSetup??[]){let i={...e,sessionId:r.sessionId,response:r.response,sendRpc:n};if(s.applies(i))try{await s.run(i),s.successLog&&Se(s.successLog(i))}catch(o){let a=s.describeFailure(i,o);if(C({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 kh(t,e,r){let n=be(e.env,e.cwd,e.sessionId);t.preSpawn?.({...r,cwd:e.cwd,env:n});let s=e.binaryPath||t.binary,i=t.argv(r),o=t.yoloAssertion==="always-yolo"?"yolo":r.permissionMode;if(Ne(e.tool,i,o),e.cwd&&!Gx(e.cwd))throw C({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),new ne(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:s,spawnArgs:i,spawnEnv:n}}async function Ah(t){let{sendRpc:e,sendNotification:r,opts:n,outputProcessor:s}=t,i=t.strictSessionIdentity===!0;await e("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r("notifications/initialized");let o=n.sessionId||"",a;if(n.sessionId){let l;try{l=await e("session/load",{sessionId:n.sessionId,cwd:n.cwd,mcpServers:[]})}catch(c){if(i||n.requireResume)throw new Error(`Cannot resume session ${n.sessionId} via ACP: ${c instanceof Error?c.message:String(c)}`);process.stderr.write(`[acp] session/load failed for ${n.sessionId}, creating new session
1660
- `),C({event:"acp_session_resume_fallback",provider:n.tool,session_id:n.sessionId,error_message:c instanceof Error?c.message:String(c)});let u=await e("session/new",{cwd:n.cwd,mcpServers:[]});return o=cr(u),s.setSessionId(o),{sessionId:o,sessionResponse:u}}if(i){let c=cr(l);if(c!==""&&c!==n.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${n.sessionId}", received "${c}"`);if(c===""){if(t.verifyLoadResponse===void 0)throw new Error(`ACP session/load did not return the requested session id: expected "${n.sessionId}", received none`);await t.verifyLoadResponse(l)}o=n.sessionId}else o=cr(l,n.sessionId);a=l,s.setSessionId(o)}else{let l=await e("session/new",{cwd:n.cwd,mcpServers:[]});o=cr(l),a=l,s.setSessionId(o)}return{sessionId:o,sessionResponse:a}}function Rh(t,e){let r=gs(e.tool);if(!r)return Promise.reject(new Error(`No ACP config for tool "${e.tool}"`));if(e.acpMode!==void 0)try{bh(e.tool,e.acpMode)}catch(n){return Promise.reject(n)}return new Promise((n,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:v=>{o.push(v)}}},l,c,u;try{({binary:l,spawnArgs:c,spawnEnv:u}=kh(r,e,a))}catch(v){return s(v instanceof Error?v:new Error(String(v)))}let f=Sh(l,c,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:u}),d=Date.now(),m=!1,h=!1,y=0,g=!1,p=!1;if(e.signal){if(e.signal.aborted)return m=!0,C({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),le(f).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{m=!0,C({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-d}),le(f).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let _=e.sessionId||"",E=so({tool:e.tool,onDelta:e.onDelta,...r.isolateResult?{isolateResult:r.isolateResult}:{}});E.setSessionId(_);let w=ls(f,{provider:e.tool,onEvent:v=>{y=Date.now(),Ih(v)&&(p=!0),e.onEvent?.(v)},onNotification:v=>{y=Date.now(),E.processMessage(v)}}),{sendRpc:S,sendNotification:T}=w,b="";f.stderr?.on("data",v=>{b+=v.toString()}),f.on("error",v=>{w.close(v),C({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:v.message,elapsed_ms:Date.now()-d}),s(new ne(`Failed to spawn ${r.binary} ${r.baseArgs.join(" ")}: ${v.message}`,{cause:v}))}),f.on("exit",v=>{if(h=!0,w.close(new ne(`ACP process exited with code ${String(v)}`)),m)return;let x=E.finalize();if(x!==null)r.onExitFinalization?.({...a,sessionId:x.sessionId,result:x.result,stopReason:x.stopReason,exitCode:v}),n({result:x.result,sessionId:x.sessionId,durationMs:Date.now()-d,stopReason:x.stopReason,exitCode:v,sawActivity:x.sawActivity,...o.length>0?{warnings:o}:{}});else{let I=Vx(e.tool,b);C({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:v,stderr_tail:I.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(Jx({tool:e.tool,exitCode:v,stderr:I})))}}),(async()=>{try{let v=await Ah({sendRpc:S,sendNotification:T,opts:e,outputProcessor:E});_=v.sessionId;let x=v.sessionResponse;await xh(r,a,{sessionId:_,response:x},S),E.beginTurn(),g=!0,Se(`acp: prompt sent (${t.length} chars)`);let I=await S("session/prompt",{sessionId:_,prompt:[{type:"text",text:t}]}),R=E.completeTurn(I);g=!1,Se(`acp: result received (${R.result.length} chars, stopReason=${R.stopReason})`),ar(e.holdOpen,{isAborted:()=>m,hasChildExited:()=>h,isTurnInFlight:()=>g,lastEventAtMs:()=>y,closeStdin:()=>{f.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>p})}catch(v){le(f).catch(()=>{}),s(v instanceof Error?v:new Error(String(v)))}})()})}async function Nh(t){let e=gs(t.tool);if(!e)throw new Error(`No ACP config for tool "${t.tool}"`);t.acpMode!==void 0&&bh(t.tool,t.acpMode);let r=t.permissionMode??"yolo",n=[],s=!0,i={permissionMode:r,...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:v=>{n.push(v)}}},{binary:o,spawnArgs:a,spawnEnv:l}=kh(e,t,i),c=Sh(o,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:l}),u=Date.now(),f={exited:!1,exitCode:null,lastEventAtMs:0,turnInFlight:!1,backgroundJobLaunched:!1,completedTurns:0,closed:!1,closing:null,telemetryFired:!1},d=t.sessionId||"",m=null,h="";c.stderr?.on("data",v=>{h+=v.toString()});let y,g,p=so({tool:t.tool,onDelta:v=>y?.(v),...e.isolateResult?{isolateResult:e.isolateResult}:{}});p.setSessionId(d);let _=ls(c,{provider:t.tool,onEvent:v=>{f.lastEventAtMs=Date.now(),Ih(v)&&(f.backgroundJobLaunched=!0),g?.(v)},onNotification:v=>{f.lastEventAtMs=Date.now(),p.processMessage(v)}}),E=()=>new Error(`ACP bundle process (${t.tool}) exited${f.exitCode!==null?` with code ${f.exitCode}`:""} after ${f.completedTurns} completed prompt(s); the bundle cannot continue`),w=[],S=()=>f.exited?Promise.resolve():new Promise(v=>{w.push(v)}),T=null;c.on("error",v=>{m=new ne(`Failed to spawn ${e.binary} ${e.baseArgs.join(" ")}: ${v.message}`,{cause:v}),C({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:v.message,elapsed_ms:Date.now()-u}),_.close(v)}),c.on("exit",v=>{if(f.exited=!0,f.exitCode=v,_.close(new ne(`ACP process exited with code ${String(v)}`)),!f.telemetryFired){f.telemetryFired=!0;let x=p.finalize();x!==null&&e.onExitFinalization?.({...i,sessionId:x.sessionId,result:x.result,stopReason:x.stopReason,exitCode:v})}if(T!==null){let x=T;T=null,x(E())}for(let x of w.splice(0))x()});try{let v=await Ah({sendRpc:_.sendRpc,sendNotification:_.sendNotification,opts:t,outputProcessor:p,strictSessionIdentity:!0,verifyLoadResponse:e.sessionIdentity===void 0?void 0:async x=>e.sessionIdentity.verifyLoadedSession({...i,requestedSessionId:t.sessionId,loadResponse:x,cwd:t.cwd,env:l})});d=v.sessionId,await xh(e,i,{sessionId:v.sessionId,response:v.sessionResponse},_.sendRpc)}catch(v){let x=m??(v instanceof Error?v:new Error(String(v)));throw le(c).catch(()=>{}),x}let b=v=>new Promise(x=>{setTimeout(x,v).unref?.()});return{tool:t.tool,get sessionId(){return d},get completedTurns(){return f.completedTurns},async sendTurn(v,x={}){if(f.closed||f.closing!==null)throw new Error(`ACP bundle session (${t.tool}) is closed`);if(f.exited)throw E();if(f.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(x.signal?.aborted)throw new Error("Aborted");if(e.sessionIdentity?.recheckSession!==void 0){if(await e.sessionIdentity.recheckSession({requestedSessionId:d,cwd:t.cwd,env:l}),f.exited)throw E();if(x.signal?.aborted)throw new Error("Aborted")}f.turnInFlight=!0,y=x.onDelta,g=x.onEvent;let I=Date.now();try{p.beginTurn(),Se(`acp: bundle prompt sent (${v.length} chars)`);let R=await new Promise((P,q)=>{T=q;let V=()=>{p.cancelTurn(),_.sendNotification("session/cancel",{sessionId:d}),q(new Error("Aborted"))},_e=x.signal;_e?.addEventListener("abort",V,{once:!0}),_.sendRpc("session/prompt",{sessionId:d,prompt:[{type:"text",text:v}]}).then(Te=>{_e?.removeEventListener("abort",V),P(Te)},Te=>{_e?.removeEventListener("abort",V),q(Te instanceof Error?Te:new Error(String(Te)))})});T=null;let M=p.completeTurn(R);f.turnInFlight=!1,f.completedTurns+=1,Se(`acp: bundle result received (${M.result.length} chars, stopReason=${M.stopReason})`);let N=s&&n.length>0?[...n]:void 0;return s=!1,{result:M.result,sessionId:M.sessionId,stopReason:M.stopReason,durationMs:Date.now()-I,sawActivity:M.sawActivity,...N!==void 0?{warnings:N}:{}}}catch(R){throw T=null,p.cancelTurn(),f.turnInFlight=!1,f.exited?E():R}finally{y=void 0,g=void 0}},close(){return f.closing!==null||(f.closing=(async()=>{if(f.closed=!0,f.exited||(t.holdOpen!==void 0?await new Promise(x=>{ar(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>f.exited,isTurnInFlight:()=>f.turnInFlight,lastEventAtMs:()=>f.lastEventAtMs,closeStdin:()=>{c.stdin?.end(),x()},label:t.tool,wasBackgroundJobLaunched:()=>f.backgroundJobLaunched})}):c.stdin?.end(),f.exited))return;let v=t.closeTimeoutMs??2e3;await Promise.race([S(),b(v)]),f.exited||await le(c,{stdinEnd:!1,softDelayMs:Math.min(1e3,v),killDelayMs:Math.min(1e3,v)}).catch(()=>{})})()),f.closing}}}var Yl=k(()=>{"use strict";K();Rr();os();Vi();Pt();K();It();as();Fl();vh();Kl();Gl();as()});function ce(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Oh(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=Kx){let n=t.keys().next().value;n!==void 0&&t.delete(n)}t.set(r.id,Date.now()),e(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=t.get(r.id);if(n!==void 0){e({...r,elapsedMs:Date.now()-n}),t.delete(r.id);return}}e(r)}}function Yx(){let t=new Map;return(e,r)=>{zx(e,Oh(t,r))}}function zx(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="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(ce(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="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(ce(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="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:ce(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,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=ce(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:ce(u),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:ce(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,u,f=i.content;if(typeof f=="string")u=`${f.split(`
1660
+ `),C({event:"acp_session_resume_fallback",provider:n.tool,session_id:n.sessionId,error_message:c instanceof Error?c.message:String(c)});let u=await e("session/new",{cwd:n.cwd,mcpServers:[]});return o=cr(u),s.setSessionId(o),{sessionId:o,sessionResponse:u}}if(i){let c=cr(l);if(c!==""&&c!==n.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${n.sessionId}", received "${c}"`);if(c===""){if(t.verifyLoadResponse===void 0)throw new Error(`ACP session/load did not return the requested session id: expected "${n.sessionId}", received none`);await t.verifyLoadResponse(l)}o=n.sessionId}else o=cr(l,n.sessionId);a=l,s.setSessionId(o)}else{let l=await e("session/new",{cwd:n.cwd,mcpServers:[]});o=cr(l),a=l,s.setSessionId(o)}return{sessionId:o,sessionResponse:a}}function Rh(t,e){let r=gs(e.tool);if(!r)return Promise.reject(new Error(`No ACP config for tool "${e.tool}"`));if(e.acpMode!==void 0)try{bh(e.tool,e.acpMode)}catch(n){return Promise.reject(n)}return new Promise((n,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:v=>{o.push(v)}}},l,c,u;try{({binary:l,spawnArgs:c,spawnEnv:u}=kh(r,e,a))}catch(v){return s(v instanceof Error?v:new Error(String(v)))}let f=Sh(l,c,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:u}),d=Date.now(),m=!1,g=!1,y=0,h=!1,p=!1;if(e.signal){if(e.signal.aborted)return m=!0,C({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),le(f).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{m=!0,C({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-d}),le(f).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let _=e.sessionId||"",E=so({tool:e.tool,onDelta:e.onDelta,...r.isolateResult?{isolateResult:r.isolateResult}:{}});E.setSessionId(_);let w=ls(f,{provider:e.tool,onEvent:v=>{y=Date.now(),Ih(v)&&(p=!0),e.onEvent?.(v)},onNotification:v=>{y=Date.now(),E.processMessage(v)}}),{sendRpc:S,sendNotification:T}=w,b="";f.stderr?.on("data",v=>{b+=v.toString()}),f.on("error",v=>{w.close(v),C({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:v.message,elapsed_ms:Date.now()-d}),s(new ne(`Failed to spawn ${r.binary} ${r.baseArgs.join(" ")}: ${v.message}`,{cause:v}))}),f.on("exit",v=>{if(g=!0,w.close(new ne(`ACP process exited with code ${String(v)}`)),m)return;let x=E.finalize();if(x!==null)r.onExitFinalization?.({...a,sessionId:x.sessionId,result:x.result,stopReason:x.stopReason,exitCode:v}),n({result:x.result,sessionId:x.sessionId,durationMs:Date.now()-d,stopReason:x.stopReason,exitCode:v,sawActivity:x.sawActivity,...o.length>0?{warnings:o}:{}});else{let I=Vx(e.tool,b);C({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:v,stderr_tail:I.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(Jx({tool:e.tool,exitCode:v,stderr:I})))}}),(async()=>{try{let v=await Ah({sendRpc:S,sendNotification:T,opts:e,outputProcessor:E});_=v.sessionId;let x=v.sessionResponse;await xh(r,a,{sessionId:_,response:x},S),E.beginTurn(),h=!0,Se(`acp: prompt sent (${t.length} chars)`);let I=await S("session/prompt",{sessionId:_,prompt:[{type:"text",text:t}]}),R=E.completeTurn(I);h=!1,Se(`acp: result received (${R.result.length} chars, stopReason=${R.stopReason})`),ar(e.holdOpen,{isAborted:()=>m,hasChildExited:()=>g,isTurnInFlight:()=>h,lastEventAtMs:()=>y,closeStdin:()=>{f.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>p})}catch(v){le(f).catch(()=>{}),s(v instanceof Error?v:new Error(String(v)))}})()})}async function Nh(t){let e=gs(t.tool);if(!e)throw new Error(`No ACP config for tool "${t.tool}"`);t.acpMode!==void 0&&bh(t.tool,t.acpMode);let r=t.permissionMode??"yolo",n=[],s=!0,i={permissionMode:r,...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:v=>{n.push(v)}}},{binary:o,spawnArgs:a,spawnEnv:l}=kh(e,t,i),c=Sh(o,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:l}),u=Date.now(),f={exited:!1,exitCode:null,lastEventAtMs:0,turnInFlight:!1,backgroundJobLaunched:!1,completedTurns:0,closed:!1,closing:null,telemetryFired:!1},d=t.sessionId||"",m=null,g="";c.stderr?.on("data",v=>{g+=v.toString()});let y,h,p=so({tool:t.tool,onDelta:v=>y?.(v),...e.isolateResult?{isolateResult:e.isolateResult}:{}});p.setSessionId(d);let _=ls(c,{provider:t.tool,onEvent:v=>{f.lastEventAtMs=Date.now(),Ih(v)&&(f.backgroundJobLaunched=!0),h?.(v)},onNotification:v=>{f.lastEventAtMs=Date.now(),p.processMessage(v)}}),E=()=>new Error(`ACP bundle process (${t.tool}) exited${f.exitCode!==null?` with code ${f.exitCode}`:""} after ${f.completedTurns} completed prompt(s); the bundle cannot continue`),w=[],S=()=>f.exited?Promise.resolve():new Promise(v=>{w.push(v)}),T=null;c.on("error",v=>{m=new ne(`Failed to spawn ${e.binary} ${e.baseArgs.join(" ")}: ${v.message}`,{cause:v}),C({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:v.message,elapsed_ms:Date.now()-u}),_.close(v)}),c.on("exit",v=>{if(f.exited=!0,f.exitCode=v,_.close(new ne(`ACP process exited with code ${String(v)}`)),!f.telemetryFired){f.telemetryFired=!0;let x=p.finalize();x!==null&&e.onExitFinalization?.({...i,sessionId:x.sessionId,result:x.result,stopReason:x.stopReason,exitCode:v})}if(T!==null){let x=T;T=null,x(E())}for(let x of w.splice(0))x()});try{let v=await Ah({sendRpc:_.sendRpc,sendNotification:_.sendNotification,opts:t,outputProcessor:p,strictSessionIdentity:!0,verifyLoadResponse:e.sessionIdentity===void 0?void 0:async x=>e.sessionIdentity.verifyLoadedSession({...i,requestedSessionId:t.sessionId,loadResponse:x,cwd:t.cwd,env:l})});d=v.sessionId,await xh(e,i,{sessionId:v.sessionId,response:v.sessionResponse},_.sendRpc)}catch(v){let x=m??(v instanceof Error?v:new Error(String(v)));throw le(c).catch(()=>{}),x}let b=v=>new Promise(x=>{setTimeout(x,v).unref?.()});return{tool:t.tool,get sessionId(){return d},get completedTurns(){return f.completedTurns},async sendTurn(v,x={}){if(f.closed||f.closing!==null)throw new Error(`ACP bundle session (${t.tool}) is closed`);if(f.exited)throw E();if(f.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(x.signal?.aborted)throw new Error("Aborted");if(e.sessionIdentity?.recheckSession!==void 0){if(await e.sessionIdentity.recheckSession({requestedSessionId:d,cwd:t.cwd,env:l}),f.exited)throw E();if(x.signal?.aborted)throw new Error("Aborted")}f.turnInFlight=!0,y=x.onDelta,h=x.onEvent;let I=Date.now();try{p.beginTurn(),Se(`acp: bundle prompt sent (${v.length} chars)`);let R=await new Promise((P,q)=>{T=q;let V=()=>{p.cancelTurn(),_.sendNotification("session/cancel",{sessionId:d}),q(new Error("Aborted"))},_e=x.signal;_e?.addEventListener("abort",V,{once:!0}),_.sendRpc("session/prompt",{sessionId:d,prompt:[{type:"text",text:v}]}).then(Te=>{_e?.removeEventListener("abort",V),P(Te)},Te=>{_e?.removeEventListener("abort",V),q(Te instanceof Error?Te:new Error(String(Te)))})});T=null;let M=p.completeTurn(R);f.turnInFlight=!1,f.completedTurns+=1,Se(`acp: bundle result received (${M.result.length} chars, stopReason=${M.stopReason})`);let N=s&&n.length>0?[...n]:void 0;return s=!1,{result:M.result,sessionId:M.sessionId,stopReason:M.stopReason,durationMs:Date.now()-I,sawActivity:M.sawActivity,...N!==void 0?{warnings:N}:{}}}catch(R){throw T=null,p.cancelTurn(),f.turnInFlight=!1,f.exited?E():R}finally{y=void 0,h=void 0}},close(){return f.closing!==null||(f.closing=(async()=>{if(f.closed=!0,f.exited||(t.holdOpen!==void 0?await new Promise(x=>{ar(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>f.exited,isTurnInFlight:()=>f.turnInFlight,lastEventAtMs:()=>f.lastEventAtMs,closeStdin:()=>{c.stdin?.end(),x()},label:t.tool,wasBackgroundJobLaunched:()=>f.backgroundJobLaunched})}):c.stdin?.end(),f.exited))return;let v=t.closeTimeoutMs??2e3;await Promise.race([S(),b(v)]),f.exited||await le(c,{stdinEnd:!1,softDelayMs:Math.min(1e3,v),killDelayMs:Math.min(1e3,v)}).catch(()=>{})})()),f.closing}}}var Yl=k(()=>{"use strict";K();Rr();os();Vi();Pt();K();It();as();Fl();vh();Kl();Gl();as()});function ce(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Oh(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=Kx){let n=t.keys().next().value;n!==void 0&&t.delete(n)}t.set(r.id,Date.now()),e(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=t.get(r.id);if(n!==void 0){e({...r,elapsedMs:Date.now()-n}),t.delete(r.id);return}}e(r)}}function Yx(){let t=new Map;return(e,r)=>{zx(e,Oh(t,r))}}function zx(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="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(ce(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="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(ce(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="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:ce(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,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=ce(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:ce(u),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:ce(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,u,f=i.content;if(typeof f=="string")u=`${f.split(`
1661
1661
  `).length} lines, ${f.length} chars`;else if(Array.isArray(f)){let d=f.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");d&&(u=`${d.split(`
1662
- `).length} lines, ${d.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function ao(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?Yx():void 0;if(e.bundleSession!==void 0){let i=e.bundleSession;if(i.provider!==r)throw new Error(`bundle session provider mismatch: session serves "${i.provider}", turn targets "${r}"`);let o=await i.sendTurn(t,{onDelta:e.onDelta,onEvent:n?a=>n(a,e.onProgress):void 0,signal:e.signal});return{text:o.text,sessionId:o.sessionId,durationMs:o.durationMs,...o.warnings!==void 0&&o.warnings.length>0?{warnings:o.warnings}:{}}}let s=await Wp(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?i=>n(i,e.onProgress):void 0,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",r=await Hp({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 r.sessionId},get completedTurns(){return r.completedTurns},async sendTurn(n,s={}){let i=await r.sendTurn(n,{onText:s.onDelta,onEvent:s.onEvent,signal:s.signal});return{text:i.result,sessionId:i.sessionId,durationMs:i.durationMs,...i.warnings!==void 0?{warnings:i.warnings}:{}}},close:()=>r.close()}}function Qx(){let t=new Map;return(e,r)=>{Zx(e,Oh(t,r))}}function Zx(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:ce(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:ce(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=ce(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:ce(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:"",u=c?`running\u2026 ${ce(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:i})}}function Lh(t,e){if(e!==void 0)return t===""&&!e?"empty":void 0}async function xt(t,e){let r=e.acpTool||e.binary,n=e.onProgress?Qx():void 0;if(e.bundleSession!==void 0){let a=e.bundleSession;if(a.provider!==r)throw new Error(`bundle session provider mismatch: session serves "${a.provider}", turn targets "${r}"`);let l=await a.sendTurn(t,{onDelta:e.onDelta,onEvent:n?c=>n(c,e.onProgress):void 0,signal:e.signal});return{text:l.text,sessionId:l.sessionId,durationMs:l.durationMs,stopReason:l.stopReason,...Lh(l.text,l.sawActivity)!==void 0?{status:"empty"}:{},...l.warnings!==void 0?{warnings:l.warnings}:{}}}let s=[];if(e.model&&r==="copilot"){let a="copilot --acp does not implement per-session model selection";ke({event:"model_ignored",provider:r,model:e.model,reason:a}),s.push(`copilot ignored model=${e.model}: ${a}`)}let i=await Rh(t,{tool:r,sessionId:e.sessionId,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:n?a=>n(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,...Lh(i.result,i.sawActivity)!==void 0?{status:"empty"}:{},...o.length>0?{warnings:o}:{}}}async function kt(t){let e=t.acpTool||t.binary,r=await Nh({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 r.sessionId},get completedTurns(){return r.completedTurns},async sendTurn(n,s){let i=await r.sendTurn(n,s);return{text:i.result,sessionId:i.sessionId,durationMs:i.durationMs,stopReason:i.stopReason,...i.warnings!==void 0?{warnings:i.warnings}:{}}},close:()=>r.close()}}function Ch(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${ce(o,120)}`}:{kind:"other",summary:`codex error: ${ce(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="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:ce(c||"(command)"),id:a});else{let u=s.exitCode,f=s.status||"",d=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:f||"done",h=[];typeof u=="number"?h.push(`exit ${u}`):f&&h.push(f),typeof d=="number"&&h.push(`${Math.round(d/1e3)}s`),e({kind:"tool_result",summary:h.join(", ")||"done",status:m,elapsedMs:d,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(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:ce(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 u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(o?{kind:"tool_use",tool:"WebSearch",summary:ce(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(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:ce(s)}:{kind:"text",summary:ce(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:ce(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
1662
+ `).length} lines, ${d.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function ao(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?Yx():void 0;if(e.bundleSession!==void 0){let i=e.bundleSession;if(i.provider!==r)throw new Error(`bundle session provider mismatch: session serves "${i.provider}", turn targets "${r}"`);let o=await i.sendTurn(t,{onDelta:e.onDelta,onEvent:n?a=>n(a,e.onProgress):void 0,signal:e.signal});return{text:o.text,sessionId:o.sessionId,durationMs:o.durationMs,...o.warnings!==void 0&&o.warnings.length>0?{warnings:o.warnings}:{}}}let s=await Wp(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?i=>n(i,e.onProgress):void 0,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",r=await Hp({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 r.sessionId},get completedTurns(){return r.completedTurns},async sendTurn(n,s={}){let i=await r.sendTurn(n,{onText:s.onDelta,onEvent:s.onEvent,signal:s.signal});return{text:i.result,sessionId:i.sessionId,durationMs:i.durationMs,...i.warnings!==void 0?{warnings:i.warnings}:{}}},close:()=>r.close()}}function Qx(){let t=new Map;return(e,r)=>{Zx(e,Oh(t,r))}}function Zx(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:ce(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:ce(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=ce(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:ce(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:"",u=c?`running\u2026 ${ce(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:i})}}function Lh(t,e){if(e!==void 0)return t===""&&!e?"empty":void 0}async function xt(t,e){let r=e.acpTool||e.binary,n=e.onProgress?Qx():void 0;if(e.bundleSession!==void 0){let a=e.bundleSession;if(a.provider!==r)throw new Error(`bundle session provider mismatch: session serves "${a.provider}", turn targets "${r}"`);let l=await a.sendTurn(t,{onDelta:e.onDelta,onEvent:n?c=>n(c,e.onProgress):void 0,signal:e.signal});return{text:l.text,sessionId:l.sessionId,durationMs:l.durationMs,stopReason:l.stopReason,...Lh(l.text,l.sawActivity)!==void 0?{status:"empty"}:{},...l.warnings!==void 0?{warnings:l.warnings}:{}}}let s=[];if(e.model&&r==="copilot"){let a="copilot --acp does not implement per-session model selection";ke({event:"model_ignored",provider:r,model:e.model,reason:a}),s.push(`copilot ignored model=${e.model}: ${a}`)}let i=await Rh(t,{tool:r,sessionId:e.sessionId,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:n?a=>n(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,...Lh(i.result,i.sawActivity)!==void 0?{status:"empty"}:{},...o.length>0?{warnings:o}:{}}}async function kt(t){let e=t.acpTool||t.binary,r=await Nh({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 r.sessionId},get completedTurns(){return r.completedTurns},async sendTurn(n,s){let i=await r.sendTurn(n,s);return{text:i.result,sessionId:i.sessionId,durationMs:i.durationMs,stopReason:i.stopReason,...i.warnings!==void 0?{warnings:i.warnings}:{}}},close:()=>r.close()}}function Ch(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${ce(o,120)}`}:{kind:"other",summary:`codex error: ${ce(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="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:ce(c||"(command)"),id:a});else{let u=s.exitCode,f=s.status||"",d=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:f||"done",g=[];typeof u=="number"?g.push(`exit ${u}`):f&&g.push(f),typeof d=="number"&&g.push(`${Math.round(d/1e3)}s`),e({kind:"tool_result",summary:g.join(", ")||"done",status:m,elapsedMs:d,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(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:ce(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 u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(o?{kind:"tool_use",tool:"WebSearch",summary:ce(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(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:ce(s)}:{kind:"text",summary:ce(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&e({kind:"thinking",summary:ce(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
1663
1663
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${ce(o,60)}`:ce(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let i=s.split(`
1664
1664
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${ce(o,60)}`:ce(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Mh(t,e){if(e.bundleSession!==void 0){let n=e.bundleSession;if(n.provider!=="codex")throw new Error(`bundle session provider mismatch: session serves "${n.provider}", turn targets "codex"`);let s=await n.sendTurn(t,{onDelta:e.onDelta,onEvent:e.onProgress?i=>Ch(i,e.onProgress):void 0,signal:e.signal});return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs}}let r=await Yp(t,{threadId:e.sessionId,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?n=>Ch(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}async function Dh(t){let e=await zp({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(r,n){let s=await e.sendTurn(r,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs}},close:()=>e.close()}}var Kx,Ut=k(()=>{"use strict";Ol();Ol();Qp();Yl();K();Kx=256});import{join as $h}from"node:path";function Ql(t){return new zl(t)}var zl,Zl=k(()=>{"use strict";vp();Ge();Re();Ut();$e();zl=class extends re{claudeDir;constructor(e){super({provider:new Wi(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",J,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:ao}),this.claudeDir=e?.claudeDir??$h(X,".claude")}openSession(e){return lo({...e,binary:"claude",sessionFileRoots:e.sessionFileRoots??[$h(this.claudeDir,"projects")]})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as ek,stat as Fh,unlink as tk}from"node:fs/promises";import{join as _s,basename as rk}from"node:path";function nk(t,e,r){return`${t}|${e.toISOString()}|${r}`}function ys(t,e,r){let n=nk(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function Ph(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function sk(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 yn(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(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return yn(r)}).filter(r=>r.length>0).join(`
1665
- `);try{return JSON.stringify(t)}catch{return String(t)}}function ik(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 ok(t,e){if(e===void 0)return;let r={input:e};if(t!=="apply_patch"||typeof e!="string")return r;let n=[...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 n.length>0&&(r.path=n[0].path,r.paths=n.map(s=>s.path),r.kinds=n.map(s=>s.kind)),r}async function Uh(t){let e=0,r=0,n=0,s=0,i=0,o,a,l;for await(let c of ue(t)){if(c.type==="event_msg"&&c.payload?.type==="user_message"){let u=c.payload.message||c.payload.text;u&&(l=j(u.trim(),80))}if(c.type==="response_item"&&c.payload){let u=c.payload;if(u.type==="message"&&u.role==="user"&&u.content)for(let f of u.content)f.type==="input_text"&&typeof f.text=="string"&&f.text&&(e++,l=j(f.text.trim(),80));else if(u.type==="message"&&u.role==="assistant"&&u.content)for(let f of u.content)f.type==="output_text"&&typeof f.text=="string"&&f.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 u=c.payload.info.total_token_usage;r=u.input_tokens??r,n=u.cached_input_tokens??u.cache_read_input_tokens??n,s=u.output_tokens??s,i=u.reasoning_output_tokens??i;let f=sk(c.payload.info.last_token_usage);f&&(o=f),typeof c.payload.info.model_context_window=="number"&&(a=c.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a,lastUserMessage:l}}var co,jh=k(()=>{"use strict";Re();co=class{name="codex";codexDirs;constructor(e={}){let r=[_s(X,".codex"),_s(X,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:_s(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=_s(r,"sessions");try{await Fh(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await ek(e)}catch{return r}for(let s of n){let i=_s(e,s),o=await Fh(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(e){let r=rk(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await qe(e,30),n=await fe(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,u,f,d;for(let h of r){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&&(f=h.payload.originator),h.payload.source&&(d=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 y=h.payload.message||h.payload.text;y&&(c||(c=j(y.trim(),80)),u=j(y.trim(),80))}if(h.type==="response_item"&&h.payload?.type==="message"&&h.payload.role==="user"&&h.payload.content){let y=h.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof y?.text=="string"&&(c||(c=j(y.text.trim(),80)),u=j(y.text.trim(),80))}}if(!i)return null;let m=await Uh(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:Ph(f,d),firstUserMessage:c,lastUserMessage:m.lastUserMessage??u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await fe(r),s=[],i="",o,a,l,c,u,f=e,d,m,h=new Set,y=[],g=new Set,p=[],_=(S,T)=>{let b=p.find(v=>!v.mirrored&&v.source!==T&&v.text===S);b?b.mirrored=!0:p.push({text:S,source:T,mirrored:!1})},E=()=>{y.push(...p.map(S=>S.text)),p=[]};for await(let S of ue(r)){let T=S.timestamp?new Date(S.timestamp):new Date;if(S.type==="session_meta"&&S.payload){S.payload.id&&(f=S.payload.id),S.payload.cwd&&(i=S.payload.cwd),S.payload.cli_version&&(o=S.payload.cli_version),S.payload.timestamp&&(l=new Date(S.payload.timestamp)),d=Ph(S.payload.originator,S.payload.source);continue}if(S.type==="turn_context"&&S.payload){S.payload.model&&(a=S.payload.model),!i&&S.payload.cwd&&(i=S.payload.cwd);continue}if(S.type==="response_item"&&S.payload){let b=S.payload;if(b.type==="message"){if(b.role==="user"&&b.content){let v=b.internal_chat_message_metadata_passthrough?.content_item_kinds;if(Array.isArray(v)){let x=b.content.filter((I,R)=>v[R]==="user.text"&&typeof I.text=="string").map(I=>I.text).join(`
1666
- `);v.includes("user.text")&&x&&(!b.id||!g.has(b.id))&&(_(x,"metadata"),b.id&&g.add(b.id))}for(let x of b.content)if(x.type==="input_text"&&typeof x.text=="string"&&x.text){let I=x.text.trim();c||(c=j(I,80)),u=j(I,80),ys(s,h,{role:"user",timestamp:T,content:te(I)})}continue}if(b.role==="assistant"&&b.content){for(let v of b.content)v.type==="output_text"&&typeof v.text=="string"&&v.text&&ys(s,h,{role:"assistant",timestamp:T,content:te(v.text),model:a});continue}if(b.role!=="user"&&b.role!=="assistant"&&b.content){for(let v of b.content)(v.type==="input_text"||v.type==="output_text")&&typeof v.text=="string"&&v.text&&ys(s,h,{role:"system",timestamp:T,content:te(v.text.trim())});continue}}if(b.type==="function_call"){s.push({role:"tool_use",timestamp:T,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments!==void 0?te(yn(b.arguments)):void 0,toolInputData:ik(b.arguments),toolCallId:b.call_id});continue}if(b.type==="function_call_output"){s.push({role:"tool_result",timestamp:T,content:te(yn(b.output)),toolCallId:b.call_id});continue}if(b.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:T,content:b.name||"unknown tool",toolName:b.name,toolInput:b.input!==void 0?te(yn(b.input)):void 0,toolInputData:ok(b.name,b.input),toolCallId:b.call_id});continue}if(b.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:T,content:te(yn(b.output)),toolCallId:b.call_id});continue}if(b.type==="reasoning"&&b.summary){let v=b.summary.map(x=>yn(x.text)).join(`
1667
- `);v.trim()&&ys(s,h,{role:"thinking",timestamp:T,content:te(v)});continue}}if(S.type==="event_msg"&&S.payload&&(S.payload.type==="task_started"?(E(),m="in_progress"):S.payload.type==="task_complete"?m="complete":S.payload.type==="turn_aborted"&&(m="aborted"),S.payload.type==="user_message"&&typeof S.payload.message=="string"&&_(S.payload.message,"event"),S.payload.type==="agent_reasoning")){let b=S.payload.message||S.payload.text;b&&ys(s,h,{role:"thinking",timestamp:T,content:te(b)})}}if(!i)return null;E();let w=await Uh(r);return{provider:"codex",sessionId:f,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:d,turnStatus:m,firstUserMessage:c,lastUserMessage:u,messageCount:w.messageCount,filePath:r,totalInputTokens:w.totalInputTokens||void 0,totalCachedInputTokens:w.totalCachedInputTokens||void 0,totalOutputTokens:w.totalOutputTokens||void 0,totalReasoningOutputTokens:w.totalReasoningOutputTokens||void 0,lastInputTokens:w.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:w.lastTokenUsage,modelContextWindow:w.modelContextWindow,messages:s,userPrompts:y}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await tk(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await qe(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 rc(t){return new tc(t)}var ec,tc,nc=k(()=>{"use strict";jh();Ge();Ut();$e();ec="gpt-5.6-sol",tc=class extends re{constructor(e){super({provider:new co(e),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:`${J}
1665
+ `);try{return JSON.stringify(t)}catch{return String(t)}}function ik(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 ok(t,e){if(e===void 0)return;let r={input:e};if(t!=="apply_patch"||typeof e!="string")return r;let n=[...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 n.length>0&&(r.path=n[0].path,r.paths=n.map(s=>s.path),r.kinds=n.map(s=>s.kind)),r}async function Uh(t){let e=0,r=0,n=0,s=0,i=0,o,a,l;for await(let c of ue(t)){if(c.type==="event_msg"&&c.payload?.type==="user_message"){let u=c.payload.message||c.payload.text;u&&(l=j(u.trim(),80))}if(c.type==="response_item"&&c.payload){let u=c.payload;if(u.type==="message"&&u.role==="user"&&u.content)for(let f of u.content)f.type==="input_text"&&typeof f.text=="string"&&f.text&&(e++,l=j(f.text.trim(),80));else if(u.type==="message"&&u.role==="assistant"&&u.content)for(let f of u.content)f.type==="output_text"&&typeof f.text=="string"&&f.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 u=c.payload.info.total_token_usage;r=u.input_tokens??r,n=u.cached_input_tokens??u.cache_read_input_tokens??n,s=u.output_tokens??s,i=u.reasoning_output_tokens??i;let f=sk(c.payload.info.last_token_usage);f&&(o=f),typeof c.payload.info.model_context_window=="number"&&(a=c.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a,lastUserMessage:l}}var co,jh=k(()=>{"use strict";Re();co=class{name="codex";codexDirs;constructor(e={}){let r=[_s(X,".codex"),_s(X,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:_s(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=_s(r,"sessions");try{await Fh(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await ek(e)}catch{return r}for(let s of n){let i=_s(e,s),o=await Fh(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(e){let r=rk(e,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(e){let r=await qe(e,30),n=await fe(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,u,f,d;for(let g of r){if(g.type==="session_meta"&&g.payload&&(g.payload.id&&(s=g.payload.id),g.payload.cwd&&(i=g.payload.cwd),g.payload.cli_version&&(o=g.payload.cli_version),g.payload.timestamp&&(l=new Date(g.payload.timestamp)),g.payload.originator&&(f=g.payload.originator),g.payload.source&&(d=g.payload.source)),g.type==="turn_context"&&g.payload&&(g.payload.model&&(a=g.payload.model),!i&&g.payload.cwd&&(i=g.payload.cwd)),g.type==="event_msg"&&g.payload?.type==="user_message"){let y=g.payload.message||g.payload.text;y&&(c||(c=j(y.trim(),80)),u=j(y.trim(),80))}if(g.type==="response_item"&&g.payload?.type==="message"&&g.payload.role==="user"&&g.payload.content){let y=g.payload.content.find(h=>h.type==="input_text"&&typeof h.text=="string"&&h.text);typeof y?.text=="string"&&(c||(c=j(y.text.trim(),80)),u=j(y.text.trim(),80))}}if(!i)return null;let m=await Uh(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:Ph(f,d),firstUserMessage:c,lastUserMessage:m.lastUserMessage??u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await fe(r),s=[],i="",o,a,l,c,u,f=e,d,m,g=new Set,y=[],h=new Set,p=[],_=(S,T)=>{let b=p.find(v=>!v.mirrored&&v.source!==T&&v.text===S);b?b.mirrored=!0:p.push({text:S,source:T,mirrored:!1})},E=()=>{y.push(...p.map(S=>S.text)),p=[]};for await(let S of ue(r)){let T=S.timestamp?new Date(S.timestamp):new Date;if(S.type==="session_meta"&&S.payload){S.payload.id&&(f=S.payload.id),S.payload.cwd&&(i=S.payload.cwd),S.payload.cli_version&&(o=S.payload.cli_version),S.payload.timestamp&&(l=new Date(S.payload.timestamp)),d=Ph(S.payload.originator,S.payload.source);continue}if(S.type==="turn_context"&&S.payload){S.payload.model&&(a=S.payload.model),!i&&S.payload.cwd&&(i=S.payload.cwd);continue}if(S.type==="response_item"&&S.payload){let b=S.payload;if(b.type==="message"){if(b.role==="user"&&b.content){let v=b.internal_chat_message_metadata_passthrough?.content_item_kinds;if(Array.isArray(v)){let x=b.content.filter((I,R)=>v[R]==="user.text"&&typeof I.text=="string").map(I=>I.text).join(`
1666
+ `);v.includes("user.text")&&x&&(!b.id||!h.has(b.id))&&(_(x,"metadata"),b.id&&h.add(b.id))}for(let x of b.content)if(x.type==="input_text"&&typeof x.text=="string"&&x.text){let I=x.text.trim();c||(c=j(I,80)),u=j(I,80),ys(s,g,{role:"user",timestamp:T,content:te(I)})}continue}if(b.role==="assistant"&&b.content){for(let v of b.content)v.type==="output_text"&&typeof v.text=="string"&&v.text&&ys(s,g,{role:"assistant",timestamp:T,content:te(v.text),model:a});continue}if(b.role!=="user"&&b.role!=="assistant"&&b.content){for(let v of b.content)(v.type==="input_text"||v.type==="output_text")&&typeof v.text=="string"&&v.text&&ys(s,g,{role:"system",timestamp:T,content:te(v.text.trim())});continue}}if(b.type==="function_call"){s.push({role:"tool_use",timestamp:T,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments!==void 0?te(yn(b.arguments)):void 0,toolInputData:ik(b.arguments),toolCallId:b.call_id});continue}if(b.type==="function_call_output"){s.push({role:"tool_result",timestamp:T,content:te(yn(b.output)),toolCallId:b.call_id});continue}if(b.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:T,content:b.name||"unknown tool",toolName:b.name,toolInput:b.input!==void 0?te(yn(b.input)):void 0,toolInputData:ok(b.name,b.input),toolCallId:b.call_id});continue}if(b.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:T,content:te(yn(b.output)),toolCallId:b.call_id});continue}if(b.type==="reasoning"&&b.summary){let v=b.summary.map(x=>yn(x.text)).join(`
1667
+ `);v.trim()&&ys(s,g,{role:"thinking",timestamp:T,content:te(v)});continue}}if(S.type==="event_msg"&&S.payload&&(S.payload.type==="task_started"?(E(),m="in_progress"):S.payload.type==="task_complete"?m="complete":S.payload.type==="turn_aborted"&&(m="aborted"),S.payload.type==="user_message"&&typeof S.payload.message=="string"&&_(S.payload.message,"event"),S.payload.type==="agent_reasoning")){let b=S.payload.message||S.payload.text;b&&ys(s,g,{role:"thinking",timestamp:T,content:te(b)})}}if(!i)return null;E();let w=await Uh(r);return{provider:"codex",sessionId:f,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:d,turnStatus:m,firstUserMessage:c,lastUserMessage:u,messageCount:w.messageCount,filePath:r,totalInputTokens:w.totalInputTokens||void 0,totalCachedInputTokens:w.totalCachedInputTokens||void 0,totalOutputTokens:w.totalOutputTokens||void 0,totalReasoningOutputTokens:w.totalReasoningOutputTokens||void 0,lastInputTokens:w.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:w.lastTokenUsage,modelContextWindow:w.modelContextWindow,messages:s,userPrompts:y}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await tk(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await qe(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 rc(t){return new tc(t)}var ec,tc,nc=k(()=>{"use strict";jh();Ge();Ut();$e();ec="gpt-5.6-sol",tc=class extends re{constructor(e){super({provider:new co(e),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:`${J}
1668
1668
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Mh})}openSession(e){return Dh({...e,model:e.model??ec})}seedArgsFor(e){let r=super.seedArgsFor(e),n=e?.model??ec;return[...r.slice(0,-1),"--model",n,r[r.length-1]]}turnOptsFor(e){return e.model?e:{...e,model:ec}}}});function Es(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);if(e.length>1)try{let n=JSON.parse(e[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(t)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function uo(t){let e=Es(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 r=t.split(`
1669
1669
  `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}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<r.length;a++){let l;try{l=JSON.parse(r[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 u=c;if(typeof u.id=="string"){let f=o.get(u.id);f?ak(f,u):(i.push(u),o.set(u.id,u))}else i.push(u)}}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 ak(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&Bh(t.tokens)&&Bh(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function Bh(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Wh(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let i of r)s.push(JSON.stringify(i));return s.join(`
1670
1670
  `)+`
1671
1671
  `}var sc=k(()=>{"use strict"});import{createHash as lk}from"node:crypto";import{readdir as ws,readFile as Hh,stat as mo,unlink as ck}from"node:fs/promises";import{join as Je,basename as dk,dirname as uk}from"node:path";import{cwd as mk}from"node:process";function ic(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Xh(t){return t==="user"}function oc(t){return t==="gemini"||t==="assistant"}function Lr(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function fk(t){return`${t.sessionId}\0${t.cwd}`}function pk(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],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 fo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function qh(t){let e=0,r=0,n=0,s=0,i=0,o;for(let a of t){if(!oc(a.type)||!a.tokens)continue;let l=fo(a.tokens.input),c=fo(a.tokens.cached),u=Math.max(l-c,0),f=fo(a.tokens.output),d=fo(a.tokens.thoughts);e+=l,r+=c,n+=f,s+=d,i=l,o={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:f,reasoningOutputTokens:d,totalTokens:l+f+d}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function hk(t){return lk("sha256").update(t).digest("hex")}function Ts(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=uk(r);if(n===r)break;r=n}}var po,Gh=k(()=>{"use strict";Re();sc();K();po=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||Je(X,".gemini");this.geminiProjectsFile=Je(r,"projects.json"),this.geminiTmpDir=Je(r,"tmp");let n=e.claudeDir||Je(X,".claude");this.claudeProjectsDir=Je(n,"projects");let s=[Je(X,".codex"),Je(X,".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=>Je(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let i=fk(s),o=r.get(i);r.set(i,o?pk(o,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await fe(r),i=[],o=[],a=n.messages||[],l=n.sessionId||this.extractSessionIdFromFilename(r),c=n.projectHash||"",u=await this.resolveWorkspace(c),f,d,m;for(let p of a){let _=Lr(p.timestamp),E=p.type,w=te(ic(p.content));if(Xh(E)){let T=ic(p.content);T&&o.push(T);let b=w.trim();b&&(f||(f=j(b,80)),d=j(b,80)),i.push({role:"user",timestamp:_,content:b||w});continue}if(oc(E)){p.model&&(m=p.model);for(let T of p.thoughts||[]){let b=[T.subject,T.description].filter(Boolean).join(`
1672
- `).trim();b&&i.push({role:"thinking",timestamp:Lr(T.timestamp,_),content:te(b)})}i.push({role:"assistant",timestamp:_,content:w,model:p.model});continue}let S=E?`[${E}] `:"";i.push({role:"system",timestamp:_,content:`${S}${w}`.trim()})}let h=Lr(n.startTime,s.createdAt),y=Lr(n.lastUpdated,s.modifiedAt),g=qh(a);return{provider:"gemini",sessionId:l,cwd:u,createdAt:h,modifiedAt:y,model:m,startCommand:"gemini",firstUserMessage:f,lastUserMessage:d,messageCount:i.filter(p=>p.role==="user"||p.role==="assistant").length,filePath:r,totalInputTokens:g.totalInputTokens||void 0,totalCachedInputTokens:g.totalCachedInputTokens||void 0,totalOutputTokens:g.totalOutputTokens||void 0,totalReasoningOutputTokens:g.totalReasoningOutputTokens||void 0,lastInputTokens:g.lastInputTokens||void 0,lastTokenUsage:g.lastTokenUsage,messages:i,userPrompts:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await fe(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,u,f=0;for(let m of s)if(Xh(m.type)){f++;let h=ic(m.content).trim();h&&(l||(l=j(te(h),80)),c=j(te(h),80))}else oc(m.type)&&(f++,m.model&&(u=m.model));let d=qh(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Lr(r.startTime,n.createdAt),modifiedAt:Lr(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:f,filePath:e,totalInputTokens:d.totalInputTokens||void 0,totalCachedInputTokens:d.totalCachedInputTokens||void 0,totalOutputTokens:d.totalOutputTokens||void 0,totalReasoningOutputTokens:d.totalReasoningOutputTokens||void 0,lastInputTokens:d.lastInputTokens||void 0,lastTokenUsage:d.lastTokenUsage}}async readSessionFile(e){let r=await Hh(e,"utf-8");if(Es(r)==="unknown")return C({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.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 uo(r)}catch{return null}}extractSessionIdFromFilename(e){let r=dk(e).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let e=[],r;try{r=await ws(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Je(this.geminiTmpDir,n,"chats");if(!(await mo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ws(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Je(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await ck(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){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 u=await fe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Lr(i?.lastUpdated,u.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[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;Ts(e,mk());for(let n of this.extraWorkspacePaths)Ts(e,n);for(let n of await this.collectGeminiProjectPaths())Ts(e,n);for(let n of await this.collectCodexCwds())Ts(e,n);for(let n of await this.collectClaudeCwds())Ts(e,n);let r=new Map;for(let n of e)r.set(hk(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Hh(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await qe(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await ws(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Je(this.claudeProjectsDir,n);if(!(await mo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ws(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Je(s,a),u=(await qe(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await mo(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await ws(e)}catch{return r}for(let i of s){let o=Je(e,i),a=await mo(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as gk,writeFileSync as _k,mkdirSync as yk}from"node:fs";import{join as Ek,dirname as wk}from"node:path";import{randomUUID as Tk}from"node:crypto";function lc(t){return new ac(t)}var ac,cc=k(()=>{"use strict";Gh();Ge();Ut();$e();sc();ac=class extends re{geminiDir;constructor(e){super({provider:new po(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",J,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>xt(r,{...n,acpTool:"gemini"})}),this.geminiDir=e?.geminiDir}openSession(e){return kt({...e,env:this.geminiDir!==void 0?{...e.env??process.env,GEMINI_DIR:this.geminiDir}:e.env,binary:"gemini",acpTool:"gemini"})}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(`
1672
+ `).trim();b&&i.push({role:"thinking",timestamp:Lr(T.timestamp,_),content:te(b)})}i.push({role:"assistant",timestamp:_,content:w,model:p.model});continue}let S=E?`[${E}] `:"";i.push({role:"system",timestamp:_,content:`${S}${w}`.trim()})}let g=Lr(n.startTime,s.createdAt),y=Lr(n.lastUpdated,s.modifiedAt),h=qh(a);return{provider:"gemini",sessionId:l,cwd:u,createdAt:g,modifiedAt:y,model:m,startCommand:"gemini",firstUserMessage:f,lastUserMessage:d,messageCount:i.filter(p=>p.role==="user"||p.role==="assistant").length,filePath:r,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:i,userPrompts:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await fe(e),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(e),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,u,f=0;for(let m of s)if(Xh(m.type)){f++;let g=ic(m.content).trim();g&&(l||(l=j(te(g),80)),c=j(te(g),80))}else oc(m.type)&&(f++,m.model&&(u=m.model));let d=qh(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Lr(r.startTime,n.createdAt),modifiedAt:Lr(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:f,filePath:e,totalInputTokens:d.totalInputTokens||void 0,totalCachedInputTokens:d.totalCachedInputTokens||void 0,totalOutputTokens:d.totalOutputTokens||void 0,totalReasoningOutputTokens:d.totalReasoningOutputTokens||void 0,lastInputTokens:d.lastInputTokens||void 0,lastTokenUsage:d.lastTokenUsage}}async readSessionFile(e){let r=await Hh(e,"utf-8");if(Es(r)==="unknown")return C({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.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 uo(r)}catch{return null}}extractSessionIdFromFilename(e){let r=dk(e).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let e=[],r;try{r=await ws(this.geminiTmpDir)}catch{return e}for(let n of r){let s=Je(this.geminiTmpDir,n,"chats");if(!(await mo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ws(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Je(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await ck(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){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 u=await fe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Lr(i?.lastUpdated,u.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[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;Ts(e,mk());for(let n of this.extraWorkspacePaths)Ts(e,n);for(let n of await this.collectGeminiProjectPaths())Ts(e,n);for(let n of await this.collectCodexCwds())Ts(e,n);for(let n of await this.collectClaudeCwds())Ts(e,n);let r=new Map;for(let n of e)r.set(hk(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Hh(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await qe(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await ws(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Je(this.claudeProjectsDir,n);if(!(await mo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ws(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Je(s,a),u=(await qe(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await mo(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await ws(e)}catch{return r}for(let i of s){let o=Je(e,i),a=await mo(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as gk,writeFileSync as _k,mkdirSync as yk}from"node:fs";import{join as Ek,dirname as wk}from"node:path";import{randomUUID as Tk}from"node:crypto";function lc(t){return new ac(t)}var ac,cc=k(()=>{"use strict";Gh();Ge();Ut();$e();sc();ac=class extends re{geminiDir;constructor(e){super({provider:new po(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",J,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>xt(r,{...n,acpTool:"gemini"})}),this.geminiDir=e?.geminiDir}openSession(e){return kt({...e,env:this.geminiDir!==void 0?{...e.env??process.env,GEMINI_DIR:this.geminiDir}:e.env,binary:"gemini",acpTool:"gemini"})}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(`
1673
1673
  `)}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Xi,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,r){let n=await this.resolvePath(e);if(!n)return{success:!1,error:`Session file not found for ${e}`};try{let s=gk(n,"utf-8"),i=Es(s),o=uo(s),a=Tk();o.sessionId=a,o.kind="main";let l=wk(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=i==="jsonl"?".jsonl":".json",f=`session-${c}-${a.slice(0,8)}${u}`,d=Ek(l,f);return yk(l,{recursive:!0}),_k(d,Wh(o,i),"utf-8"),{success:!0,sessionId:a,filePath:d}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Jh,readFile as vk,rm as Sk,stat as En}from"node:fs/promises";import{basename as bk,join as ft}from"node:path";function Ik(t){if(!t)return null;let e={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},r=!1;for(let n of Object.values(t))n?.usage&&(r=!0,e.inputTokens+=n.usage.inputTokens??0,e.outputTokens+=n.usage.outputTokens??0,e.cacheReadTokens+=n.usage.cacheReadTokens??0,e.cacheWriteTokens+=n.usage.cacheWriteTokens??0,e.reasoningTokens+=n.usage.reasoningTokens??0);return r?e:null}function dc(){return{shutdownTotals:null,assistantOutputSum:0}}function Kh(t,e){if(e.type==="assistant.message"){let r=e.data?.outputTokens;typeof r=="number"&&(t.assistantOutputSum+=r,t.lastAssistantOutputTokens=r)}else if(e.type==="session.shutdown"){let r=Ik(e.data?.modelMetrics);r&&(t.shutdownTotals=r)}}function Vh(t){let e=t.shutdownTotals,r=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:r}}function xk(t){let e={};for(let r of t.split(`
1674
1674
  `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[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 Cr(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function kk(t){let e=0,r=dc(),n;for await(let s of ue(t)){if(s.type==="user.message"){e++;let i=(s.data?.content||"").trim();i&&(n=j(i,80))}else s.type==="assistant.message"&&(s.data?.content||"").trim()&&e++;Kh(r,s)}return{messageCount:e,tokens:r,lastUserMessage:n}}function Ak(t){let e=Rk(t),r=new Map;for(let n of t){if(n.role!=="tool_use"||n.toolCallId===void 0)continue;if(n.toolName==="bash"){let l=e.get(n.toolCallId),u=[l?.content,l?.toolDetailedContent].filter(d=>typeof d=="string").join(`
1675
- `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(u===void 0)continue;let f=`copilot-shell:${u}:${n.toolCallId}`;r.set(u,f),n.backgroundTaskId=f,l!==void 0&&(l.backgroundTaskId=f);continue}if(!["read_bash","write_bash","stop_bash"].includes(n.toolName??""))continue;let s=n.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=r.get(i);if(o===void 0)continue;n.backgroundTaskId=o;let a=e.get(n.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function Rk(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var ho,Yh=k(()=>{"use strict";Re();ho=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||ft(X,".copilot");this.sessionStateDir=ft(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Jh(this.sessionStateDir)}catch{return e}for(let n of r){let s=ft(this.sessionStateDir,n);if((await En(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&e.push(o)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=ft(r,"events.jsonl"),i=await En(s).catch(()=>null),o=i?s:ft(r,"workspace.yaml"),a=await fe(i?s:r),l=[],c=[],u=n?.cwd||"(unknown workspace)",f,d,m,h,y,g,p=n?.id||bk(r)||e,_=dc();if(i)for await(let E of ue(s)){let w=Cr(E.timestamp)||a.modifiedAt;if(Kh(_,E),E.type==="session.start"&&E.data){E.data.sessionId&&(p=E.data.sessionId),E.data.copilotVersion&&(d=E.data.copilotVersion),E.data.startTime&&(g=Cr(E.data.startTime)),E.data.selectedModel&&(f=E.data.selectedModel),E.data.context&&(E.data.context.cwd&&(u=E.data.context.cwd),E.data.context.branch&&(m=E.data.context.branch));continue}if(E.type==="session.model_change"&&E.data?.newModel){f=E.data.newModel;continue}if(E.type==="user.message"&&E.data){let S=E.data.content||"";S&&c.push(S);let T=S.trim();T&&(h||(h=j(T,80)),y=j(T,80)),l.push({role:"user",timestamp:w,content:te(T||S)});continue}if(E.type==="assistant.message"&&E.data){let S=(E.data.content||"").trim();if(S&&l.push({role:"assistant",timestamp:w,content:te(S),model:f}),E.data.toolRequests)for(let T of E.data.toolRequests)l.push({role:"tool_use",timestamp:w,content:T.name||"unknown tool",toolName:T.name,toolInput:T.arguments?JSON.stringify(T.arguments,null,2):void 0,toolInputData:nt(T.arguments),toolCallId:T.toolCallId});continue}if(E.type==="tool.execution_complete"&&E.data){let S=E.data.result?.content||"",T=E.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:w,content:te(S),toolDetailedContent:T?te(T):void 0,toolCallId:E.data.toolCallId});continue}if(E.type==="assistant.reasoning"&&E.data?.content){l.push({role:"thinking",timestamp:w,content:te(E.data.content)});continue}if(E.type==="session.error"||E.type==="session.warning"||E.type==="session.info"||E.type==="system.message"){let S=E.data?.message||"";S.trim()&&l.push({role:"system",timestamp:w,content:te(S)});continue}}if(!h){let E=(n?.summary||"").trim();E&&(h=j(E,80))}return Ak(l),{provider:"copilot",sessionId:p,cwd:u,createdAt:g??Cr(n?.created_at)??a.createdAt,modifiedAt:Cr(n?.updated_at)??a.modifiedAt,model:f,cliVersion:d,startCommand:"copilot",gitBranch:m,firstUserMessage:h,lastUserMessage:y,messageCount:l.filter(E=>E.role==="user"||E.role==="assistant").length,filePath:o,...Vh(_),messages:l,userPrompts:c}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=ft(e,"events.jsonl"),i=await En(s).catch(()=>null),o=i?s:ft(e,"workspace.yaml"),a=await fe(i?s:e),l=i?await qe(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",f,d,m,h,y;for(let p of l)if(p.type==="session.start"&&p.data&&(p.data.sessionId&&(c=p.data.sessionId),p.data.copilotVersion&&(d=p.data.copilotVersion),p.data.startTime&&(m=Cr(p.data.startTime)),p.data.selectedModel&&(f=p.data.selectedModel),p.data.context?.cwd&&(u=p.data.context.cwd)),p.type==="session.model_change"&&p.data?.newModel&&(f||(f=p.data.newModel)),p.type==="user.message"&&p.data){let _=(p.data.content||"").trim();_&&(h||(h=j(_,80)),y=j(_,80))}if(!h){let p=(n?.summary||"").trim();p&&(h=j(p,80))}let g=i?await kk(s):{messageCount:0,tokens:dc()};return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Cr(n?.created_at)??a.createdAt,modifiedAt:Cr(n?.updated_at)??a.modifiedAt,model:f,cliVersion:d,startCommand:"copilot",firstUserMessage:h,lastUserMessage:g.lastUserMessage??y,messageCount:g.messageCount,filePath:o,...Vh(g.tokens)}}async readWorkspaceYaml(e){let r=ft(e,"workspace.yaml");try{let n=await vk(r,"utf-8");return xk(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await Sk(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Jh(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=ft(this.sessionStateDir,e);if((await En(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let i=ft(this.sessionStateDir,s);(await En(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=ft(this.sessionStateDir,s);if(!(await En(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 mc(t){return new uc(t)}var uc,fc=k(()=>{"use strict";Yh();Ge();Ut();K();$e();uc=class extends re{copilotDir;constructor(e){super({provider:new ho(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",J,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>xt(r,{...n,acpTool:"copilot"})}),this.copilotDir=e?.copilotDir}openSession(e){return kt({...e,env:this.copilotDir!==void 0?{...e.env??process.env,COPILOT_HOME:this.copilotDir}:e.env,binary:"copilot",acpTool:"copilot"})}async seed(e,r){let n=await super.seed(e,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return ke({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});function hc(){return new pc}var pc,gc=k(()=>{"use strict";oo();Ge();Ut();$e();pc=class extends re{constructor(){super({provider:new _n,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",J],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>xt(e,{...r,acpTool:"opencode"})})}openSession(e){return kt({...e,binary:"opencode",acpTool:"opencode"})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??J),r}}});import{appendFile as Nk,mkdir as Lk,readFile as zh,readdir as Qh,rm as Ck,stat as Zh}from"node:fs/promises";import{basename as Ok,dirname as Mk,isAbsolute as eg,join as Or,relative as Dk,resolve as _c}from"node:path";function yc(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function Uk(t){return typeof t=="number"?new Date(t):yc(t)??new Date(0)}function tg(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(`
1675
+ `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(u===void 0)continue;let f=`copilot-shell:${u}:${n.toolCallId}`;r.set(u,f),n.backgroundTaskId=f,l!==void 0&&(l.backgroundTaskId=f);continue}if(!["read_bash","write_bash","stop_bash"].includes(n.toolName??""))continue;let s=n.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=r.get(i);if(o===void 0)continue;n.backgroundTaskId=o;let a=e.get(n.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function Rk(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var ho,Yh=k(()=>{"use strict";Re();ho=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||ft(X,".copilot");this.sessionStateDir=ft(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Jh(this.sessionStateDir)}catch{return e}for(let n of r){let s=ft(this.sessionStateDir,n);if((await En(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&e.push(o)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=ft(r,"events.jsonl"),i=await En(s).catch(()=>null),o=i?s:ft(r,"workspace.yaml"),a=await fe(i?s:r),l=[],c=[],u=n?.cwd||"(unknown workspace)",f,d,m,g,y,h,p=n?.id||bk(r)||e,_=dc();if(i)for await(let E of ue(s)){let w=Cr(E.timestamp)||a.modifiedAt;if(Kh(_,E),E.type==="session.start"&&E.data){E.data.sessionId&&(p=E.data.sessionId),E.data.copilotVersion&&(d=E.data.copilotVersion),E.data.startTime&&(h=Cr(E.data.startTime)),E.data.selectedModel&&(f=E.data.selectedModel),E.data.context&&(E.data.context.cwd&&(u=E.data.context.cwd),E.data.context.branch&&(m=E.data.context.branch));continue}if(E.type==="session.model_change"&&E.data?.newModel){f=E.data.newModel;continue}if(E.type==="user.message"&&E.data){let S=E.data.content||"";S&&c.push(S);let T=S.trim();T&&(g||(g=j(T,80)),y=j(T,80)),l.push({role:"user",timestamp:w,content:te(T||S)});continue}if(E.type==="assistant.message"&&E.data){let S=(E.data.content||"").trim();if(S&&l.push({role:"assistant",timestamp:w,content:te(S),model:f}),E.data.toolRequests)for(let T of E.data.toolRequests)l.push({role:"tool_use",timestamp:w,content:T.name||"unknown tool",toolName:T.name,toolInput:T.arguments?JSON.stringify(T.arguments,null,2):void 0,toolInputData:nt(T.arguments),toolCallId:T.toolCallId});continue}if(E.type==="tool.execution_complete"&&E.data){let S=E.data.result?.content||"",T=E.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:w,content:te(S),toolDetailedContent:T?te(T):void 0,toolCallId:E.data.toolCallId});continue}if(E.type==="assistant.reasoning"&&E.data?.content){l.push({role:"thinking",timestamp:w,content:te(E.data.content)});continue}if(E.type==="session.error"||E.type==="session.warning"||E.type==="session.info"||E.type==="system.message"){let S=E.data?.message||"";S.trim()&&l.push({role:"system",timestamp:w,content:te(S)});continue}}if(!g){let E=(n?.summary||"").trim();E&&(g=j(E,80))}return Ak(l),{provider:"copilot",sessionId:p,cwd:u,createdAt:h??Cr(n?.created_at)??a.createdAt,modifiedAt:Cr(n?.updated_at)??a.modifiedAt,model:f,cliVersion:d,startCommand:"copilot",gitBranch:m,firstUserMessage:g,lastUserMessage:y,messageCount:l.filter(E=>E.role==="user"||E.role==="assistant").length,filePath:o,...Vh(_),messages:l,userPrompts:c}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=ft(e,"events.jsonl"),i=await En(s).catch(()=>null),o=i?s:ft(e,"workspace.yaml"),a=await fe(i?s:e),l=i?await qe(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",f,d,m,g,y;for(let p of l)if(p.type==="session.start"&&p.data&&(p.data.sessionId&&(c=p.data.sessionId),p.data.copilotVersion&&(d=p.data.copilotVersion),p.data.startTime&&(m=Cr(p.data.startTime)),p.data.selectedModel&&(f=p.data.selectedModel),p.data.context?.cwd&&(u=p.data.context.cwd)),p.type==="session.model_change"&&p.data?.newModel&&(f||(f=p.data.newModel)),p.type==="user.message"&&p.data){let _=(p.data.content||"").trim();_&&(g||(g=j(_,80)),y=j(_,80))}if(!g){let p=(n?.summary||"").trim();p&&(g=j(p,80))}let h=i?await kk(s):{messageCount:0,tokens:dc()};return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Cr(n?.created_at)??a.createdAt,modifiedAt:Cr(n?.updated_at)??a.modifiedAt,model:f,cliVersion:d,startCommand:"copilot",firstUserMessage:g,lastUserMessage:h.lastUserMessage??y,messageCount:h.messageCount,filePath:o,...Vh(h.tokens)}}async readWorkspaceYaml(e){let r=ft(e,"workspace.yaml");try{let n=await vk(r,"utf-8");return xk(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await Sk(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Jh(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=ft(this.sessionStateDir,e);if((await En(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let i=ft(this.sessionStateDir,s);(await En(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=ft(this.sessionStateDir,s);if(!(await En(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 mc(t){return new uc(t)}var uc,fc=k(()=>{"use strict";Yh();Ge();Ut();K();$e();uc=class extends re{copilotDir;constructor(e){super({provider:new ho(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",J,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>xt(r,{...n,acpTool:"copilot"})}),this.copilotDir=e?.copilotDir}openSession(e){return kt({...e,env:this.copilotDir!==void 0?{...e.env??process.env,COPILOT_HOME:this.copilotDir}:e.env,binary:"copilot",acpTool:"copilot"})}async seed(e,r){let n=await super.seed(e,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return ke({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});function hc(){return new pc}var pc,gc=k(()=>{"use strict";oo();Ge();Ut();$e();pc=class extends re{constructor(){super({provider:new _n,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",J],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>xt(e,{...r,acpTool:"opencode"})})}openSession(e){return kt({...e,binary:"opencode",acpTool:"opencode"})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??J),r}}});import{appendFile as Nk,mkdir as Lk,readFile as zh,readdir as Qh,rm as Ck,stat as Zh}from"node:fs/promises";import{basename as Ok,dirname as Mk,isAbsolute as eg,join as Or,relative as Dk,resolve as _c}from"node:path";function yc(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function Uk(t){return typeof t=="number"?new Date(t):yc(t)??new Date(0)}function tg(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(`
1676
1676
  `).trim():""}function rg(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function jk(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:rg(t)??""}function Bk(t){let e=Wk(t),r=new Set;for(let n of t){if(n.role!=="tool_use"||n.toolName!=="Bash"||n.toolInputData?.run_in_background!==!0||n.toolCallId===void 0)continue;let s=e.get(n.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(r.add(i),n.backgroundTaskId=i,s.backgroundTaskId=i)}for(let n of t){if(n.role!=="tool_use"||n.toolName!=="TaskOutput"&&n.toolName!=="TaskStop"||n.toolCallId===void 0)continue;let s=n.toolInputData?.task_id;if(typeof s!="string"||!r.has(s))continue;n.backgroundTaskId=s;let i=e.get(n.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function Wk(t){let e=new Map;for(let r of t)r.role==="tool_result"&&r.toolCallId!==void 0&&e.set(r.toolCallId,r);return e}var $k,Fk,Pk,go,ng=k(()=>{"use strict";Re();$k="1.4",Fk="1.5",Pk=new Set([$k,Fk]),go=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=_c(e?.kimiHome??process.env.KIMI_CODE_HOME??Or(X,".kimi-code")),this.sessionsDir=Or(this.homeDir,"sessions")}async discoverSessions(){let e=[];for(let r of await this.sessionFiles())try{let n=await this.summary(r);n&&e.push(n)}catch{}return e.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(e){let r=await this.findSession(e);if(!r)return null;let n=await this.summary(r);if(!n)return null;let s=await this.parseWire(r.wirePath);return{...n,messages:s.messages,userPrompts:s.userPrompts}}async resolveSessionPath(e){return(await this.findSession(e))?.wirePath??null}async deleteSession(e){let r=await this.findSession(e);return r?(await Ck(r.sessionDir,{recursive:!0,force:!0}),await Lk(Mk(this.indexPath()),{recursive:!0,mode:448}),await Nk(this.indexPath(),`${JSON.stringify({sessionId:r.sessionId,deleted:!0})}
1677
- `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return Or(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),r=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&r.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let n;try{n=await Qh(this.sessionsDir,{withFileTypes:!0})}catch{return[...r.values()]}for(let s of n){if(!s.isDirectory())continue;let i=Or(this.sessionsDir,s.name),o;try{o=await Qh(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||r.has(a.name))continue;let l=Or(i,a.name);r.set(a.name,this.filesFor(a.name,l))}}return[...r.values()]}async readIndex(){let e;try{e=await zh(this.indexPath(),"utf-8")}catch{return new Map}let r=new Map;for(let n of e.split(/\r?\n/))if(n.trim())try{let s=JSON.parse(n);if(typeof s.sessionId!="string")continue;s.deleted===!0?r.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&r.set(s.sessionId,{sessionId:s.sessionId,sessionDir:_c(s.sessionDir),workDir:s.workDir})}catch{}return r}filesFor(e,r,n){return{sessionId:e,sessionDir:r,statePath:Or(r,"state.json"),wirePath:Or(r,"agents","main","wire.jsonl"),indexedWorkDir:n}}validSessionDir(e,r){if(!eg(e)||Ok(e)!==r)return!1;let n=Dk(this.sessionsDir,_c(e));return n!==""&&n!==".."&&!n.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!eg(n)}async findSession(e){let r=await this.sessionFiles(),n=r.find(i=>i.sessionId===e);if(n)return n;let s=r.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let r=JSON.parse(await zh(e,"utf-8"));return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}async summary(e){let r=await this.readState(e.statePath);if(!r)return null;let n;try{n=await Zh(e.wirePath)}catch{return null}let s=await Zh(e.statePath).catch(()=>n),i=await this.parseWire(e.wirePath),o=yc(r.createdAt)??s.birthtime,a=yc(r.updatedAt)??(s.mtime>n.mtime?s.mtime:n.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:r.title,cwd:r.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(r.lastPrompt?j(r.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 r=[],n=[],s=new Set,i=!0,o,a,l,c=0,u=0,f=0,d=0,m=!1,h=0,y,g;for await(let p of ue(e)){let _=Uk(p.time??p.created_at);if(i&&(i=!1,p.type==="metadata"&&!Pk.has(p.protocol_version))){let w=`Kimi transcript wire protocol version ${JSON.stringify(p.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:_,content:w}],userPrompts:[],messageCount:1,firstUserMessage:w,lastUserMessage:w}}if((p.type==="config.update"||p.type==="profile.bind")&&p.modelAlias&&(o=p.modelAlias),p.type==="usage.record"){p.model&&(o=p.model),m||=p.usage!==void 0;let w=p.usage?.inputOther??0,S=p.usage?.inputCacheRead??0,T=p.usage?.inputCacheCreation??0,b=p.usage?.output??0;c+=w,u+=S,f+=T,d+=b,p.usageScope==="turn"&&(y=w+S+T,g={inputTokens:w,cachedInputTokens:S,cacheWriteInputTokens:T,outputTokens:b,totalTokens:y+b});continue}if(p.type==="turn.prompt"&&p.origin?.kind==="user"){let w=tg(p.input);w&&((!p.promptId||!s.has(p.promptId))&&(n.push(w),p.promptId&&s.add(p.promptId)),a??=j(w,80),l=j(w,80),r.push({role:"user",timestamp:_,content:w}),h++);continue}if(p.type==="turn.steer"){let w=tg(p.input);w&&(r.push({role:"system",timestamp:_,content:w}),h++);continue}if(p.type!=="context.append_loop_event"||!p.event)continue;let E=p.event;E.type==="content.part"&&E.part?.type==="text"&&E.part.text?(r.push({role:"assistant",timestamp:_,content:E.part.text,model:o}),h++):E.type==="content.part"&&E.part?.type==="think"&&E.part.think?r.push({role:"thinking",timestamp:_,content:E.part.think,model:o}):E.type==="tool.call"?r.push({role:"tool_use",timestamp:_,content:E.name??"tool",toolName:E.name,toolInput:rg(E.args),toolInputData:nt(E.args),toolCallId:E.toolCallId,model:o}):E.type==="tool.result"&&r.push({role:"tool_result",timestamp:_,content:jk(E.result),toolCallId:E.toolCallId,model:o})}return Bk(r),{messages:r,userPrompts:n,messageCount:h,model:o,firstUserMessage:a,lastUserMessage:l,totalInputTokens:m?c:void 0,totalCachedInputTokens:m?u:void 0,totalCacheWriteInputTokens:m?f:void 0,totalOutputTokens:m?d:void 0,lastInputTokens:y,lastTokenUsage:g}}}});function wc(t){return new Ec(t)}var Ec,Tc=k(()=>{"use strict";ng();Ge();Ut();$e();Ec=class extends re{kimiHome;constructor(e){super({provider:new go(e),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",J,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(r,n)=>xt(r,{...n,acpTool:"kimi"})}),this.kimiHome=e?.kimiHome}openSession(e){return kt({...e,env:this.kimiHome!==void 0?{...e.env??process.env,KIMI_CODE_HOME:this.kimiHome}:e.env,binary:"kimi",acpTool:"kimi"})}seedArgsFor(e){let r=[];return e?.model&&r.push("--model",e.model),r.push("-p",e?.prompt??J,"--output-format","stream-json"),r}}});import{spawn as Hk}from"node:child_process";import{mkdirSync as Xk}from"node:fs";function Sc(t){return new vc(t)}async function qk(t,e){let r=Date.now(),n=sg({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});Ne("lmplayer",n,e.permissionMode??"yolo");let s=await og(e.binary,n,{cwd:e.cwd,env:be(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(ig(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function sg(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(...or("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function ig(t){if(t.error)return t.error;let e=rs(t.stderr).trim();return e?e.slice(0,500):`exit code ${t.code}`}function og(t,e,r){return new Promise((n,s)=>{let i;try{i=Hk(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(y){s(y);return}let o="",a="",l="",c,u,f,d=[],m=!1,h=y=>{let g=y.trim();if(!g)return;let p;try{p=JSON.parse(g)}catch{d.push(y),r.onText?.(y);return}if(!wn(p))return;let _=_o(p,!1);c===void 0&&_!==void 0&&(c=_),u=_o(p,!0)??u;let E=Gk(p);E!==void 0&&(f=E);let w=ag(p);w&&(d.push(w),r.onText?.(w))};i.stdout?.on("data",y=>{let g=y.toString("utf8");o+=g,l+=g;let p=l.indexOf(`
1678
- `);for(;p>=0;){let _=l.slice(0,p);l=l.slice(p+1),h(_),p=l.indexOf(`
1679
- `)}}),i.stderr?.on("data",y=>{a+=y.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",y=>{m||(m=!0,l.length>0&&h(l),n({code:y,stdout:o,stderr:a,sessionId:c??u,text:d.join(""),error:f}))}),i.on("error",y=>{m||(m=!0,s(y))})})}function Gk(t){let e=t.error;if(typeof e=="string"&&e.length>0)return e;if(wn(e)){let r=e.data;if(wn(r)&&typeof r.message=="string"&&r.message.length>0)return typeof e.name=="string"?`${e.name}: ${r.message}`:r.message;if(typeof e.message=="string"&&e.message.length>0)return e.message}}function ag(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(wn(r)){let n=ag(r);if(n)return n}}}function _o(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(wn(r)){let n=_o(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(wn(s)){let i=_o(s,e);if(i!==void 0)return i}}}function wn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var vc,bc=k(()=>{"use strict";oo();Ge();$e();Pt();It();kl();vc=class extends re{constructor(e){super({provider:new _n({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),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",J],resumeTemplate:"lmplayer tui --session {{session_id}}",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:qk})}seedArgsFor(e){return sg({prompt:e?.prompt??J,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){Xk(e,{recursive:!0});let n=this.seedArgsFor(r);Ne("lmplayer",n);try{let s=await og(this.binary,n,{cwd:e,env:hn(void 0,e)});return s.code!==0&&s.code!==null?{success:!1,error:ig(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 "${J}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as yo,readFile as Jk,rm as Vk}from"node:fs/promises";import{basename as lg,join as ur}from"node:path";function Kk(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function vs(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Yk(t,e){if(!e)return;t.observed=!0;let r=vs(e.promptTokenCount),n=vs(e.cachedContentTokenCount),s=vs(e.candidatesTokenCount),i=vs(e.thoughtsTokenCount);t.totalInputTokens+=r,t.totalCachedInputTokens+=n,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=r,t.lastTokenUsage={inputTokens:Math.max(r-n,0),cachedInputTokens:n,outputTokens:s,reasoningOutputTokens:i,totalTokens:vs(e.totalTokenCount)||r+s}}function zk(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 cg(t){return t.type==="user"||t.message?.role==="user"}function dg(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function ug(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
1677
+ `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return Or(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),r=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&r.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let n;try{n=await Qh(this.sessionsDir,{withFileTypes:!0})}catch{return[...r.values()]}for(let s of n){if(!s.isDirectory())continue;let i=Or(this.sessionsDir,s.name),o;try{o=await Qh(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||r.has(a.name))continue;let l=Or(i,a.name);r.set(a.name,this.filesFor(a.name,l))}}return[...r.values()]}async readIndex(){let e;try{e=await zh(this.indexPath(),"utf-8")}catch{return new Map}let r=new Map;for(let n of e.split(/\r?\n/))if(n.trim())try{let s=JSON.parse(n);if(typeof s.sessionId!="string")continue;s.deleted===!0?r.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&r.set(s.sessionId,{sessionId:s.sessionId,sessionDir:_c(s.sessionDir),workDir:s.workDir})}catch{}return r}filesFor(e,r,n){return{sessionId:e,sessionDir:r,statePath:Or(r,"state.json"),wirePath:Or(r,"agents","main","wire.jsonl"),indexedWorkDir:n}}validSessionDir(e,r){if(!eg(e)||Ok(e)!==r)return!1;let n=Dk(this.sessionsDir,_c(e));return n!==""&&n!==".."&&!n.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!eg(n)}async findSession(e){let r=await this.sessionFiles(),n=r.find(i=>i.sessionId===e);if(n)return n;let s=r.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let r=JSON.parse(await zh(e,"utf-8"));return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}async summary(e){let r=await this.readState(e.statePath);if(!r)return null;let n;try{n=await Zh(e.wirePath)}catch{return null}let s=await Zh(e.statePath).catch(()=>n),i=await this.parseWire(e.wirePath),o=yc(r.createdAt)??s.birthtime,a=yc(r.updatedAt)??(s.mtime>n.mtime?s.mtime:n.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:r.title,cwd:r.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(r.lastPrompt?j(r.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 r=[],n=[],s=new Set,i=!0,o,a,l,c=0,u=0,f=0,d=0,m=!1,g=0,y,h;for await(let p of ue(e)){let _=Uk(p.time??p.created_at);if(i&&(i=!1,p.type==="metadata"&&!Pk.has(p.protocol_version))){let w=`Kimi transcript wire protocol version ${JSON.stringify(p.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:_,content:w}],userPrompts:[],messageCount:1,firstUserMessage:w,lastUserMessage:w}}if((p.type==="config.update"||p.type==="profile.bind")&&p.modelAlias&&(o=p.modelAlias),p.type==="usage.record"){p.model&&(o=p.model),m||=p.usage!==void 0;let w=p.usage?.inputOther??0,S=p.usage?.inputCacheRead??0,T=p.usage?.inputCacheCreation??0,b=p.usage?.output??0;c+=w,u+=S,f+=T,d+=b,p.usageScope==="turn"&&(y=w+S+T,h={inputTokens:w,cachedInputTokens:S,cacheWriteInputTokens:T,outputTokens:b,totalTokens:y+b});continue}if(p.type==="turn.prompt"&&p.origin?.kind==="user"){let w=tg(p.input);w&&((!p.promptId||!s.has(p.promptId))&&(n.push(w),p.promptId&&s.add(p.promptId)),a??=j(w,80),l=j(w,80),r.push({role:"user",timestamp:_,content:w}),g++);continue}if(p.type==="turn.steer"){let w=tg(p.input);w&&(r.push({role:"system",timestamp:_,content:w}),g++);continue}if(p.type!=="context.append_loop_event"||!p.event)continue;let E=p.event;E.type==="content.part"&&E.part?.type==="text"&&E.part.text?(r.push({role:"assistant",timestamp:_,content:E.part.text,model:o}),g++):E.type==="content.part"&&E.part?.type==="think"&&E.part.think?r.push({role:"thinking",timestamp:_,content:E.part.think,model:o}):E.type==="tool.call"?r.push({role:"tool_use",timestamp:_,content:E.name??"tool",toolName:E.name,toolInput:rg(E.args),toolInputData:nt(E.args),toolCallId:E.toolCallId,model:o}):E.type==="tool.result"&&r.push({role:"tool_result",timestamp:_,content:jk(E.result),toolCallId:E.toolCallId,model:o})}return Bk(r),{messages:r,userPrompts:n,messageCount:g,model:o,firstUserMessage:a,lastUserMessage:l,totalInputTokens:m?c:void 0,totalCachedInputTokens:m?u:void 0,totalCacheWriteInputTokens:m?f:void 0,totalOutputTokens:m?d:void 0,lastInputTokens:y,lastTokenUsage:h}}}});function wc(t){return new Ec(t)}var Ec,Tc=k(()=>{"use strict";ng();Ge();Ut();$e();Ec=class extends re{kimiHome;constructor(e){super({provider:new go(e),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",J,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(r,n)=>xt(r,{...n,acpTool:"kimi"})}),this.kimiHome=e?.kimiHome}openSession(e){return kt({...e,env:this.kimiHome!==void 0?{...e.env??process.env,KIMI_CODE_HOME:this.kimiHome}:e.env,binary:"kimi",acpTool:"kimi"})}seedArgsFor(e){let r=[];return e?.model&&r.push("--model",e.model),r.push("-p",e?.prompt??J,"--output-format","stream-json"),r}}});import{spawn as Hk}from"node:child_process";import{mkdirSync as Xk}from"node:fs";function Sc(t){return new vc(t)}async function qk(t,e){let r=Date.now(),n=sg({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});Ne("lmplayer",n,e.permissionMode??"yolo");let s=await og(e.binary,n,{cwd:e.cwd,env:be(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(ig(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-r}}function sg(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(...or("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function ig(t){if(t.error)return t.error;let e=rs(t.stderr).trim();return e?e.slice(0,500):`exit code ${t.code}`}function og(t,e,r){return new Promise((n,s)=>{let i;try{i=Hk(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(y){s(y);return}let o="",a="",l="",c,u,f,d=[],m=!1,g=y=>{let h=y.trim();if(!h)return;let p;try{p=JSON.parse(h)}catch{d.push(y),r.onText?.(y);return}if(!wn(p))return;let _=_o(p,!1);c===void 0&&_!==void 0&&(c=_),u=_o(p,!0)??u;let E=Gk(p);E!==void 0&&(f=E);let w=ag(p);w&&(d.push(w),r.onText?.(w))};i.stdout?.on("data",y=>{let h=y.toString("utf8");o+=h,l+=h;let p=l.indexOf(`
1678
+ `);for(;p>=0;){let _=l.slice(0,p);l=l.slice(p+1),g(_),p=l.indexOf(`
1679
+ `)}}),i.stderr?.on("data",y=>{a+=y.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",y=>{m||(m=!0,l.length>0&&g(l),n({code:y,stdout:o,stderr:a,sessionId:c??u,text:d.join(""),error:f}))}),i.on("error",y=>{m||(m=!0,s(y))})})}function Gk(t){let e=t.error;if(typeof e=="string"&&e.length>0)return e;if(wn(e)){let r=e.data;if(wn(r)&&typeof r.message=="string"&&r.message.length>0)return typeof e.name=="string"?`${e.name}: ${r.message}`:r.message;if(typeof e.message=="string"&&e.message.length>0)return e.message}}function ag(t){for(let e of["text","content","delta","output","message"]){let r=t[e];if(typeof r=="string")return r}for(let e of["data","event","payload","part"]){let r=t[e];if(wn(r)){let n=ag(r);if(n)return n}}}function _o(t,e){for(let n of["sessionID","sessionId","session_id"]){let s=t[n];if(typeof s=="string"&&s.length>0)return s}let r=t.session;if(typeof r=="string"&&r.length>0)return r;if(wn(r)){let n=_o(r,e);if(n!==void 0)return n}if(e){let n=t.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=t[n];if(wn(s)){let i=_o(s,e);if(i!==void 0)return i}}}function wn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var vc,bc=k(()=>{"use strict";oo();Ge();$e();Pt();It();kl();vc=class extends re{constructor(e){super({provider:new _n({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),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",J],resumeTemplate:"lmplayer tui --session {{session_id}}",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:qk})}seedArgsFor(e){return sg({prompt:e?.prompt??J,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,r){Xk(e,{recursive:!0});let n=this.seedArgsFor(r);Ne("lmplayer",n);try{let s=await og(this.binary,n,{cwd:e,env:hn(void 0,e)});return s.code!==0&&s.code!==null?{success:!1,error:ig(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 "${J}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as yo,readFile as Jk,rm as Vk}from"node:fs/promises";import{basename as lg,join as ur}from"node:path";function Kk(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function vs(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Yk(t,e){if(!e)return;t.observed=!0;let r=vs(e.promptTokenCount),n=vs(e.cachedContentTokenCount),s=vs(e.candidatesTokenCount),i=vs(e.thoughtsTokenCount);t.totalInputTokens+=r,t.totalCachedInputTokens+=n,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=r,t.lastTokenUsage={inputTokens:Math.max(r-n,0),cachedInputTokens:n,outputTokens:s,reasoningOutputTokens:i,totalTokens:vs(e.totalTokenCount)||r+s}}function zk(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 cg(t){return t.type==="user"||t.message?.role==="user"}function dg(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function ug(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
1680
1680
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
1681
- `):"":""}function mg(t){return t.model||t.message?.model}function Qk(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:pg(t).filter(r=>!r.thought&&r.type!=="thinking"&&typeof r.text=="string"&&r.text.length>0).length}function Ss(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 Zk(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Ss(e.output??e.error??t)}return Ss(t)}function pg(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function fg(t,e,r){let n=t.name||"tool";return{role:"tool_use",timestamp:e,content:n,toolName:n,toolInput:Ss(t.args,!0),toolInputData:nt(t.args),toolCallId:t.id,model:r}}var Eo,hg=k(()=>{"use strict";Re();Eo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||ur(X,".qwen")}async discoverSessions(){let e=ur(this.baseDir,"projects"),r;try{r=await yo(e)}catch{return[]}let n=[];for(let s of r){let i=ur(e,s,"chats"),o;try{o=await yo(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=ur(i,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=!1,s=await fe(e),i="(unknown)",o,a,l,c,u=0;for await(let f of ue(e)){if(n=!0,f.cwd&&(i=f.cwd,f.version&&(a=f.version)),f.type==="system"&&f.cwd&&(i=f.cwd,f.version&&(a=f.version),f.model&&(o=f.model)),cg(f)){let d=ug(f).trim();d&&(l||(l=j(d,80)),c=j(d,80),u++)}if(dg(f)){let d=mg(f);d&&(o=d),u+=Qk(f)}}return n?{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}:null}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=lg(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await fe(e),s="(unknown)",i,o,a,l,c,u,f=[],d=Kk();for await(let m of ue(e)){if(Yk(d,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let h=m.message,y=m.timestamp?new Date(m.timestamp):n.modifiedAt;if(m.type==="tool_result"){let g=pg(m).filter(p=>p.functionResponse!==void 0);g.length===0&&m.toolCallResult?.callId&&f.push({role:"tool_result",timestamp:y,content:Ss(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let p of g){let _=p.functionResponse,E=Zk(_.response),w=Ss(m.toolCallResult?.resultDisplay);f.push({role:"tool_result",timestamp:y,content:w??E??m.toolCallResult?.status??"tool result",toolName:_.name,toolCallId:m.toolCallResult?.callId??_.id,...E!==void 0?{toolDetailedContent:E}:{}})}}else if(cg(m)){let g=ug(m);g.trim()&&(c||(c=j(g.trim(),80)),u=j(g.trim(),80)),f.push({role:"user",timestamp:y,content:g})}else if(dg(m)){let g=mg(m);if(g&&(i=g),Array.isArray(h.content))for(let p of h.content)p.type==="text"&&p.text?f.push({role:"assistant",timestamp:y,content:p.text,model:g}):p.type==="thinking"&&p.thinking?f.push({role:"thinking",timestamp:y,content:p.thinking}):p.functionCall&&f.push(fg(p.functionCall,y,g));else if(typeof h.content=="string")f.push({role:"assistant",timestamp:y,content:h.content,model:g});else if(Array.isArray(h.parts))for(let p of h.parts)if(p.thought||p.type==="thinking"){let _=p.thinking||p.text;_&&f.push({role:"thinking",timestamp:y,content:_})}else p.functionCall?f.push(fg(p.functionCall,y,g)):p.text&&f.push({role:"assistant",timestamp:y,content:p.text,model:g})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:f.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...zk(d),messages:f}}async resolveSessionPath(e){let r=ur(this.baseDir,"projects");try{let n=await yo(r),s=[];for(let i of n){let o=ur(r,i,"chats",`${e}.jsonl`);try{return await Jk(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=ur(r,i,"chats"),a;try{a=await yo(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;lg(l,".jsonl").startsWith(e)&&s.push(ur(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await Vk(r),!0}catch{return!1}}}});function xc(){return new Ic}var Ic,kc=k(()=>{"use strict";hg();Ge();Ut();$e();Ic=class extends re{constructor(){super({provider:new Eo,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",J,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:ao})}openSession(e){return lo({...e,binary:"qwen"})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as gg,readFile as _g,rm as yg,stat as Eg}from"node:fs/promises";import{basename as Ac,join as At}from"node:path";import{fileURLToPath as eA}from"node:url";async function tA(t){let e=await Promise.all(t.map(r=>fe(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function rA(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function wg(t){return t.type==="USER_INPUT"}function Tg(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function nA(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function vg(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Sg(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 sA(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function iA(t){for await(let e of ue(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=oA(s);if(i)return i}let n=aA(e.content);if(n)return n}return null}function oA(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function aA(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function lA(t,e){if(t.status!=="RUNNING"||!t.content)return;let r=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!r||r[1]!==e)&&!(t.step_index===void 0||Number(r[3])!==t.step_index))return r[2]}function cA(t,e){let r=new Set;for(let n of e){let s=dA(t,r,n);if(!s)continue;r.add(s);let i=n.event.step_index===void 0?void 0:`agy-step-${n.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=n.message.backgroundTaskId,n.message.toolName=s.name,n.message.toolCallId=i}}function dA(t,e,r){let n=r.message.backgroundTaskId===void 0?void 0:pA(r.event.content);if(n!==void 0)return bg(t.filter(i=>!e.has(i)&&hA(i)===n),r.event.step_index);let s=fA(r.event);if(s!==void 0)return bg(t.filter(i=>!e.has(i)&&uA(i.name,r.event.type)&&xg(mA(i))===s),r.event.step_index)}function bg(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let r=t.map(n=>({call:n,distance:n.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-n.stepIndex)})).sort((n,s)=>n.distance-s.distance);return r[0].distance<r[1].distance?r[0].call:void 0}function uA(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 mA(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function fA(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]),xg(e)}function xg(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return eA(e)}catch{return}}function pA(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function hA(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,r=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof r!="string"?void 0:`Timer: ${e}s, Prompt: ${r}`}}function Ig(t){if(t.endsWith(".db"))return Ac(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var wo,kg=k(()=>{"use strict";Re();wo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||At(X,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:At(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=At(this.baseDir,"conversations"),r;try{r=await gg(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=Ac(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return At(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,r){return At(this.baseDir,"brain",e,".system_generated","logs",r?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let r of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Eg(r),r}catch{}return null}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await tA([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,c,u=0;if(n)for await(let f of ue(n)){let d=Sg(f.content);if(d&&(a=d),wg(f)){let m=vg(f.content).trim();m&&(l||(l=j(m,80)),c=j(m,80)),u++}else Tg(f)&&f.content&&u++}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Ig(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,u=[],f=[];if(i)for await(let d of ue(i)){let m=rA(d.created_at,s.modifiedAt),h=Sg(d.content);if(h&&(a=h),wg(d)){let y=vg(d.content),g=y.trim();g&&(l||(l=j(g,80)),c=j(g,80)),o.push({role:"user",timestamp:m,content:y});continue}if(Array.isArray(d.tool_calls))for(let y of d.tool_calls){let g=y.name||"tool",p=sA(y.args),_=nt(y.args),E={role:"tool_use",timestamp:m,content:p,toolName:g,toolInput:p,toolInputData:_};o.push(E),u.push({name:g,stepIndex:d.step_index,input:_,message:E})}if(Tg(d)&&d.content)o.push({role:"assistant",timestamp:m,content:d.content,model:a});else if(nA(d)&&d.content){let y=lA(d,n),g=y===void 0?null:await this.readTaskLog(n,y),p={role:"tool_result",timestamp:g?.modifiedAt??m,content:d.content,toolName:d.type?.toLowerCase(),backgroundTaskId:y,...g===null?{}:{toolDetailedContent:g.content}};o.push(p),f.push({event:d,message:p})}d.thinking&&o.push({role:"thinking",timestamp:m,content:d.thinking})}return cA(u,f),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(d=>d.role==="user"||d.role==="assistant").length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await Eg(r),r}catch{}let n=At(this.baseDir,"conversations");try{let s=[];for(let i of await gg(n)){if(!i.endsWith(".db"))continue;Ac(i,".db").startsWith(e)&&s.push(At(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=Ig(r);return n?(await yg(this.conversationPath(n),{force:!0}),await yg(At(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await iA(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=At(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await _g(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}async readTaskLog(e,r){if(!/^task-\d+$/.test(r))return null;let n=At(this.baseDir,"brain",e,".system_generated","tasks",`${r}.log`);try{let[s,i]=await Promise.all([_g(n,"utf8"),fe(n)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as gA}from"node:child_process";import{StringDecoder as Ag}from"node:string_decoder";function To(t){return async(e,r)=>{let n=Date.now(),s=t.buildArgs(e,r);t.assertArgs?.(s,r),r.onProgress?.({kind:"system",summary:`${t.label} -p one-shot started (no streaming events)`});let{stdout:i}=await _A(t.label,r.binary,s,{cwd:r.cwd,env:be(r.env,r.cwd,r.sessionId),signal:r.signal});return r.onProgress?.({kind:"system",summary:`${t.label} -p one-shot completed`}),{text:i.trimEnd(),sessionId:r.sessionId,durationMs:Date.now()-n}}}function _A(t,e,r,n){return new Promise((s,i)=>{if(n.signal?.aborted){i(new Error(`${t} turn aborted`));return}let o;try{o=gA(e,r,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(d){i(d);return}let a="",l="",c=new Ag("utf8"),u=new Ag("utf8");o.stdout?.on("data",d=>{a+=c.write(d)}),o.stderr?.on("data",d=>{l+=u.write(d)});let f=()=>{o.kill("SIGTERM"),i(new Error(`${t} turn aborted`))};o.on("error",d=>{n.signal?.removeEventListener("abort",f),i(d)}),o.on("close",(d,m)=>{if(n.signal?.removeEventListener("abort",f),a+=c.end(),l+=u.end(),d===0){s({stdout:a,stderr:l});return}let h=m?`signal ${m}`:`exit code ${d}`,y=l.trim()||a.trim();i(new Error(`${t} failed (${h})${y?`: ${y}`:""}`))}),n.signal?.aborted?f():n.signal?.addEventListener("abort",f,{once:!0})})}var Rc=k(()=>{"use strict";It()});import{randomUUID as yA}from"node:crypto";function Lc(t){return new Nc(t)}function wA(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Nc,EA,Cc=k(()=>{"use strict";kg();Ge();$e();Pt();Rc();Nc=class extends re{constructor(e){super({provider:new wo(e),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",J,"--dangerously-skip-permissions","--print-timeout","2m"],seedTimeoutMs:13e4,resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:EA})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}async seed(e,r){let n=`[lmctl-seed:${yA()}]`,s=await super.seed(e,{...r,prompt:`${n}
1682
- ${r?.prompt??J}`}),i=(await this.provider.discoverSessions()).filter(o=>o.firstUserMessage?.startsWith(n));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}`}}},EA=To({label:"agy",buildArgs:(t,e)=>{let r=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",wA(e.timeoutMs)];return e.model&&r.push("--model",e.model),r},assertArgs:(t,e)=>Ne("agy",t,e.permissionMode??"yolo")})});import TA from"node:zlib";function NA(t,e){return t[e]===SA&&t[e+1]===bA&&t[e+2]===IA&&t[e+3]===xA}function Rg(t,e){return(t[e]&240)===80&&t[e+1]===kA&&t[e+2]===AA&&t[e+3]===RA}function LA(t,e){if(Rg(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!NA(t,e))return;let r=e+4;if(r+1>t.length)return;let n=t[r];r+=1;let s=n>>6,i=(n&32)!==0,o=(n&4)!==0,a=n&3;i||(r+=1),r+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(r+=l,!(r>t.length)){for(;;){if(r+3>t.length)return;let c=t[r]|t[r+1]<<8|t[r+2]<<16,u=(c&1)!==0,f=c>>1&3,d=c>>3;if(r+=3,f===3||(r+=f===1?1:d,r>t.length))return;if(u)break}if(o&&(r+=4),!(r>t.length))return r-e}}function CA(t){let e=[],r=0;for(;r+4<=t.length;){let n=LA(t,r);if(n===void 0||n<=0)break;e.push(t.subarray(r,r+n)),r+=n}return e}function vo(t){let e=[];for(let r of CA(t))Rg(r,0)||e.push(vA(r).toString("utf8"));return e.join("")}var vA,SA,bA,IA,xA,kA,AA,RA,Oc=k(()=>{"use strict";vA=TA.zstdDecompressSync,SA=40,bA=181,IA=47,xA=253,kA=42,AA=77,RA=24});import{readdir as Mc,rm as OA,stat as MA}from"node:fs/promises";import{join as mr}from"node:path";function DA(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Dc(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let r of t)r&&typeof r=="object"&&r.type==="text"&&typeof r.text=="string"&&e.push(r.text);return e.join("")}function $A(t){if(!Array.isArray(t))return[];let e=[];for(let r of t)r&&typeof r=="object"&&r.type==="reasoning"&&typeof r.text=="string"&&e.push(r.text);return e}function Ng(t){let e=[];for(let r of t){let n=r.data??{},s=r.time?new Date(r.time):new Date(0);if(r.type==="user/message"){let i=n;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:Dc(i.content)})}else if(r.type==="assistant/message"){let i=n.message;for(let o of $A(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:Dc(i?.content),model:i?.source?.model})}else if(r.type==="tool/call"){let i=n,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(r.type==="tool/result"){let i=n,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:Dc(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function FA(t){for(let e=t.length-1;e>=0;e--){let r=t[e];if(r.type==="turn/end")return r.data?.reason?.kind==="completed"?"complete":"aborted";if(r.type==="turn/start")return"in_progress"}}function Lg(t,e,r){let n=t.find(m=>m.type==="session");if(!n)return null;let s=n,i=n.data,o=s.id??i?.id;if(!o)return null;let a;for(let m of t)if(m.type==="request/header"){let h=m.data?.header;h?.config?.model&&(a=h.config.model)}let l=t.map(m=>m.time).filter(m=>typeof m=="number"),c=s.createdAt??i?.createdAt,u=c?new Date(c):new Date(0),f=l.length>0?new Date(Math.max(...l)):u,d=r.filter(m=>m.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:u,modifiedAt:f,model:a,firstUserMessage:d[0]?.content,lastUserMessage:d.at(-1)?.content,messageCount:r.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...PA(t)}}function PA(t){let e=!1,r=0,n=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 u=So(c.inputTokens),f=So(c.cacheReadTokens),d=So(c.outputTokens),m=So(c.reasoningTokens);r+=u,n+=f,s+=d,i+=m,o=u+f,a={inputTokens:u,cachedInputTokens:f,outputTokens:d,reasoningOutputTokens:m,totalTokens:u+f+d}}return{totalInputTokens:e?r:void 0,totalCachedInputTokens:e?n:void 0,totalOutputTokens:e?s:void 0,totalReasoningOutputTokens:e?i:void 0,lastInputTokens:o,lastTokenUsage:a}}function So(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}var bo,Cg=k(()=>{"use strict";Re();Oc();bo=class{name="dsh";sessionsDir;constructor(e={}){let r=e.dshHome||mr(X,".dsh");this.sessionsDir=mr(r,"sessions")}async discoverSessions(){let e=[],r;try{r=await Mc(this.sessionsDir)}catch{return[]}for(let n of r){let s;try{s=await Mc(mr(this.sessionsDir,n))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(n,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let r=await this.findSessionDir(e);if(!r)return null;let n=await this.readRecords(r.cwdDir,r.sessionDir);if(n.length===0)return null;let s=Ng(n),i=Lg(n,r.filePath,s);return i?{...i,turnStatus:FA(n),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let r=await this.findSessionDir(e);return r?(await OA(mr(this.sessionsDir,r.cwdDir,r.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,r){return mr(this.sessionsDir,DA(e),r,"session.jsonl.zstd")}async findSessionDir(e){let r;try{r=await Mc(this.sessionsDir)}catch{return null}for(let n of r){let s=e,i=mr(this.sessionsDir,n,s,"session.jsonl.zstd");try{return await MA(i),{cwdDir:n,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(e,r){let{readFile:n}=await import("node:fs/promises"),s=mr(this.sessionsDir,e,r,"session.jsonl.zstd"),i=await n(s),o=vo(i),a=[];for(let l of o.split(`
1681
+ `):"":""}function mg(t){return t.model||t.message?.model}function Qk(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:pg(t).filter(r=>!r.thought&&r.type!=="thinking"&&typeof r.text=="string"&&r.text.length>0).length}function Ss(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 Zk(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Ss(e.output??e.error??t)}return Ss(t)}function pg(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function fg(t,e,r){let n=t.name||"tool";return{role:"tool_use",timestamp:e,content:n,toolName:n,toolInput:Ss(t.args,!0),toolInputData:nt(t.args),toolCallId:t.id,model:r}}var Eo,hg=k(()=>{"use strict";Re();Eo=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||ur(X,".qwen")}async discoverSessions(){let e=ur(this.baseDir,"projects"),r;try{r=await yo(e)}catch{return[]}let n=[];for(let s of r){let i=ur(e,s,"chats"),o;try{o=await yo(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=ur(i,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=!1,s=await fe(e),i="(unknown)",o,a,l,c,u=0;for await(let f of ue(e)){if(n=!0,f.cwd&&(i=f.cwd,f.version&&(a=f.version)),f.type==="system"&&f.cwd&&(i=f.cwd,f.version&&(a=f.version),f.model&&(o=f.model)),cg(f)){let d=ug(f).trim();d&&(l||(l=j(d,80)),c=j(d,80),u++)}if(dg(f)){let d=mg(f);d&&(o=d),u+=Qk(f)}}return n?{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}:null}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=lg(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await fe(e),s="(unknown)",i,o,a,l,c,u,f=[],d=Kk();for await(let m of ue(e)){if(Yk(d,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let g=m.message,y=m.timestamp?new Date(m.timestamp):n.modifiedAt;if(m.type==="tool_result"){let h=pg(m).filter(p=>p.functionResponse!==void 0);h.length===0&&m.toolCallResult?.callId&&f.push({role:"tool_result",timestamp:y,content:Ss(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let p of h){let _=p.functionResponse,E=Zk(_.response),w=Ss(m.toolCallResult?.resultDisplay);f.push({role:"tool_result",timestamp:y,content:w??E??m.toolCallResult?.status??"tool result",toolName:_.name,toolCallId:m.toolCallResult?.callId??_.id,...E!==void 0?{toolDetailedContent:E}:{}})}}else if(cg(m)){let h=ug(m);h.trim()&&(c||(c=j(h.trim(),80)),u=j(h.trim(),80)),f.push({role:"user",timestamp:y,content:h})}else if(dg(m)){let h=mg(m);if(h&&(i=h),Array.isArray(g.content))for(let p of g.content)p.type==="text"&&p.text?f.push({role:"assistant",timestamp:y,content:p.text,model:h}):p.type==="thinking"&&p.thinking?f.push({role:"thinking",timestamp:y,content:p.thinking}):p.functionCall&&f.push(fg(p.functionCall,y,h));else if(typeof g.content=="string")f.push({role:"assistant",timestamp:y,content:g.content,model:h});else if(Array.isArray(g.parts))for(let p of g.parts)if(p.thought||p.type==="thinking"){let _=p.thinking||p.text;_&&f.push({role:"thinking",timestamp:y,content:_})}else p.functionCall?f.push(fg(p.functionCall,y,h)):p.text&&f.push({role:"assistant",timestamp:y,content:p.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:f.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...zk(d),messages:f}}async resolveSessionPath(e){let r=ur(this.baseDir,"projects");try{let n=await yo(r),s=[];for(let i of n){let o=ur(r,i,"chats",`${e}.jsonl`);try{return await Jk(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=ur(r,i,"chats"),a;try{a=await yo(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;lg(l,".jsonl").startsWith(e)&&s.push(ur(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await Vk(r),!0}catch{return!1}}}});function xc(){return new Ic}var Ic,kc=k(()=>{"use strict";hg();Ge();Ut();$e();Ic=class extends re{constructor(){super({provider:new Eo,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",J,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:ao})}openSession(e){return lo({...e,binary:"qwen"})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r,"--model",e.model]:r}}});import{readdir as gg,readFile as _g,rm as yg,stat as Eg}from"node:fs/promises";import{basename as Ac,join as At}from"node:path";import{fileURLToPath as eA}from"node:url";async function tA(t){let e=await Promise.all(t.map(r=>fe(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function rA(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function wg(t){return t.type==="USER_INPUT"}function Tg(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function nA(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function vg(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Sg(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 sA(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function iA(t){for await(let e of ue(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=oA(s);if(i)return i}let n=aA(e.content);if(n)return n}return null}function oA(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function aA(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function lA(t,e){if(t.status!=="RUNNING"||!t.content)return;let r=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!r||r[1]!==e)&&!(t.step_index===void 0||Number(r[3])!==t.step_index))return r[2]}function cA(t,e){let r=new Set;for(let n of e){let s=dA(t,r,n);if(!s)continue;r.add(s);let i=n.event.step_index===void 0?void 0:`agy-step-${n.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=n.message.backgroundTaskId,n.message.toolName=s.name,n.message.toolCallId=i}}function dA(t,e,r){let n=r.message.backgroundTaskId===void 0?void 0:pA(r.event.content);if(n!==void 0)return bg(t.filter(i=>!e.has(i)&&hA(i)===n),r.event.step_index);let s=fA(r.event);if(s!==void 0)return bg(t.filter(i=>!e.has(i)&&uA(i.name,r.event.type)&&xg(mA(i))===s),r.event.step_index)}function bg(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let r=t.map(n=>({call:n,distance:n.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-n.stepIndex)})).sort((n,s)=>n.distance-s.distance);return r[0].distance<r[1].distance?r[0].call:void 0}function uA(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 mA(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function fA(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]),xg(e)}function xg(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return eA(e)}catch{return}}function pA(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function hA(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,r=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof r!="string"?void 0:`Timer: ${e}s, Prompt: ${r}`}}function Ig(t){if(t.endsWith(".db"))return Ac(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var wo,kg=k(()=>{"use strict";Re();wo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||At(X,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:At(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=At(this.baseDir,"conversations"),r;try{r=await gg(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=Ac(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(e){return At(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,r){return At(this.baseDir,"brain",e,".system_generated","logs",r?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let r of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Eg(r),r}catch{}return null}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,i=await tA([r,n].filter(Boolean)),o=await this.resolveCwd(e,n),a,l,c,u=0;if(n)for await(let f of ue(n)){let d=Sg(f.content);if(d&&(a=d),wg(f)){let m=vg(f.content).trim();m&&(l||(l=j(m,80)),c=j(m,80)),u++}else Tg(f)&&f.content&&u++}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=Ig(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,u=[],f=[];if(i)for await(let d of ue(i)){let m=rA(d.created_at,s.modifiedAt),g=Sg(d.content);if(g&&(a=g),wg(d)){let y=vg(d.content),h=y.trim();h&&(l||(l=j(h,80)),c=j(h,80)),o.push({role:"user",timestamp:m,content:y});continue}if(Array.isArray(d.tool_calls))for(let y of d.tool_calls){let h=y.name||"tool",p=sA(y.args),_=nt(y.args),E={role:"tool_use",timestamp:m,content:p,toolName:h,toolInput:p,toolInputData:_};o.push(E),u.push({name:h,stepIndex:d.step_index,input:_,message:E})}if(Tg(d)&&d.content)o.push({role:"assistant",timestamp:m,content:d.content,model:a});else if(nA(d)&&d.content){let y=lA(d,n),h=y===void 0?null:await this.readTaskLog(n,y),p={role:"tool_result",timestamp:h?.modifiedAt??m,content:d.content,toolName:d.type?.toLowerCase(),backgroundTaskId:y,...h===null?{}:{toolDetailedContent:h.content}};o.push(p),f.push({event:d,message:p})}d.thinking&&o.push({role:"thinking",timestamp:m,content:d.thinking})}return cA(u,f),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(d=>d.role==="user"||d.role==="assistant").length,messages:o}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await Eg(r),r}catch{}let n=At(this.baseDir,"conversations");try{let s=[];for(let i of await gg(n)){if(!i.endsWith(".db"))continue;Ac(i,".db").startsWith(e)&&s.push(At(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=Ig(r);return n?(await yg(this.conversationPath(n),{force:!0}),await yg(At(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await iA(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=At(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await _g(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===e)return s}catch{}return null}async readTaskLog(e,r){if(!/^task-\d+$/.test(r))return null;let n=At(this.baseDir,"brain",e,".system_generated","tasks",`${r}.log`);try{let[s,i]=await Promise.all([_g(n,"utf8"),fe(n)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as gA}from"node:child_process";import{StringDecoder as Ag}from"node:string_decoder";function To(t){return async(e,r)=>{let n=Date.now(),s=t.buildArgs(e,r);t.assertArgs?.(s,r),r.onProgress?.({kind:"system",summary:`${t.label} -p one-shot started (no streaming events)`});let{stdout:i}=await _A(t.label,r.binary,s,{cwd:r.cwd,env:be(r.env,r.cwd,r.sessionId),signal:r.signal});return r.onProgress?.({kind:"system",summary:`${t.label} -p one-shot completed`}),{text:i.trimEnd(),sessionId:r.sessionId,durationMs:Date.now()-n}}}function _A(t,e,r,n){return new Promise((s,i)=>{if(n.signal?.aborted){i(new Error(`${t} turn aborted`));return}let o;try{o=gA(e,r,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(d){i(d);return}let a="",l="",c=new Ag("utf8"),u=new Ag("utf8");o.stdout?.on("data",d=>{a+=c.write(d)}),o.stderr?.on("data",d=>{l+=u.write(d)});let f=()=>{o.kill("SIGTERM"),i(new Error(`${t} turn aborted`))};o.on("error",d=>{n.signal?.removeEventListener("abort",f),i(d)}),o.on("close",(d,m)=>{if(n.signal?.removeEventListener("abort",f),a+=c.end(),l+=u.end(),d===0){s({stdout:a,stderr:l});return}let g=m?`signal ${m}`:`exit code ${d}`,y=l.trim()||a.trim();i(new Error(`${t} failed (${g})${y?`: ${y}`:""}`))}),n.signal?.aborted?f():n.signal?.addEventListener("abort",f,{once:!0})})}var Rc=k(()=>{"use strict";It()});import{randomUUID as yA}from"node:crypto";function Lc(t){return new Nc(t)}function wA(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Nc,EA,Cc=k(()=>{"use strict";kg();Ge();$e();Pt();Rc();Nc=class extends re{constructor(e){super({provider:new wo(e),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",J,"--dangerously-skip-permissions","--print-timeout","2m"],seedTimeoutMs:13e4,resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:EA})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}async seed(e,r){let n=`[lmctl-seed:${yA()}]`,s=await super.seed(e,{...r,prompt:`${n}
1682
+ ${r?.prompt??J}`}),i=(await this.provider.discoverSessions()).filter(o=>o.firstUserMessage?.startsWith(n));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}`}}},EA=To({label:"agy",buildArgs:(t,e)=>{let r=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",wA(e.timeoutMs)];return e.model&&r.push("--model",e.model),r},assertArgs:(t,e)=>Ne("agy",t,e.permissionMode??"yolo")})});import TA from"node:zlib";function NA(t,e){return t[e]===SA&&t[e+1]===bA&&t[e+2]===IA&&t[e+3]===xA}function Rg(t,e){return(t[e]&240)===80&&t[e+1]===kA&&t[e+2]===AA&&t[e+3]===RA}function LA(t,e){if(Rg(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!NA(t,e))return;let r=e+4;if(r+1>t.length)return;let n=t[r];r+=1;let s=n>>6,i=(n&32)!==0,o=(n&4)!==0,a=n&3;i||(r+=1),r+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(r+=l,!(r>t.length)){for(;;){if(r+3>t.length)return;let c=t[r]|t[r+1]<<8|t[r+2]<<16,u=(c&1)!==0,f=c>>1&3,d=c>>3;if(r+=3,f===3||(r+=f===1?1:d,r>t.length))return;if(u)break}if(o&&(r+=4),!(r>t.length))return r-e}}function CA(t){let e=[],r=0;for(;r+4<=t.length;){let n=LA(t,r);if(n===void 0||n<=0)break;e.push(t.subarray(r,r+n)),r+=n}return e}function vo(t){let e=[];for(let r of CA(t))Rg(r,0)||e.push(vA(r).toString("utf8"));return e.join("")}var vA,SA,bA,IA,xA,kA,AA,RA,Oc=k(()=>{"use strict";vA=TA.zstdDecompressSync,SA=40,bA=181,IA=47,xA=253,kA=42,AA=77,RA=24});import{readdir as Mc,rm as OA,stat as MA}from"node:fs/promises";import{join as mr}from"node:path";function DA(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Dc(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let r of t)r&&typeof r=="object"&&r.type==="text"&&typeof r.text=="string"&&e.push(r.text);return e.join("")}function $A(t){if(!Array.isArray(t))return[];let e=[];for(let r of t)r&&typeof r=="object"&&r.type==="reasoning"&&typeof r.text=="string"&&e.push(r.text);return e}function Ng(t){let e=[];for(let r of t){let n=r.data??{},s=r.time?new Date(r.time):new Date(0);if(r.type==="user/message"){let i=n;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:Dc(i.content)})}else if(r.type==="assistant/message"){let i=n.message;for(let o of $A(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:Dc(i?.content),model:i?.source?.model})}else if(r.type==="tool/call"){let i=n,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(r.type==="tool/result"){let i=n,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:Dc(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function FA(t){for(let e=t.length-1;e>=0;e--){let r=t[e];if(r.type==="turn/end")return r.data?.reason?.kind==="completed"?"complete":"aborted";if(r.type==="turn/start")return"in_progress"}}function Lg(t,e,r){let n=t.find(m=>m.type==="session");if(!n)return null;let s=n,i=n.data,o=s.id??i?.id;if(!o)return null;let a;for(let m of t)if(m.type==="request/header"){let g=m.data?.header;g?.config?.model&&(a=g.config.model)}let l=t.map(m=>m.time).filter(m=>typeof m=="number"),c=s.createdAt??i?.createdAt,u=c?new Date(c):new Date(0),f=l.length>0?new Date(Math.max(...l)):u,d=r.filter(m=>m.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:u,modifiedAt:f,model:a,firstUserMessage:d[0]?.content,lastUserMessage:d.at(-1)?.content,messageCount:r.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...PA(t)}}function PA(t){let e=!1,r=0,n=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 u=So(c.inputTokens),f=So(c.cacheReadTokens),d=So(c.outputTokens),m=So(c.reasoningTokens);r+=u,n+=f,s+=d,i+=m,o=u+f,a={inputTokens:u,cachedInputTokens:f,outputTokens:d,reasoningOutputTokens:m,totalTokens:u+f+d}}return{totalInputTokens:e?r:void 0,totalCachedInputTokens:e?n:void 0,totalOutputTokens:e?s:void 0,totalReasoningOutputTokens:e?i:void 0,lastInputTokens:o,lastTokenUsage:a}}function So(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}var bo,Cg=k(()=>{"use strict";Re();Oc();bo=class{name="dsh";sessionsDir;constructor(e={}){let r=e.dshHome||mr(X,".dsh");this.sessionsDir=mr(r,"sessions")}async discoverSessions(){let e=[],r;try{r=await Mc(this.sessionsDir)}catch{return[]}for(let n of r){let s;try{s=await Mc(mr(this.sessionsDir,n))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(n,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let r=await this.findSessionDir(e);if(!r)return null;let n=await this.readRecords(r.cwdDir,r.sessionDir);if(n.length===0)return null;let s=Ng(n),i=Lg(n,r.filePath,s);return i?{...i,turnStatus:FA(n),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let r=await this.findSessionDir(e);return r?(await OA(mr(this.sessionsDir,r.cwdDir,r.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,r){return mr(this.sessionsDir,DA(e),r,"session.jsonl.zstd")}async findSessionDir(e){let r;try{r=await Mc(this.sessionsDir)}catch{return null}for(let n of r){let s=e,i=mr(this.sessionsDir,n,s,"session.jsonl.zstd");try{return await MA(i),{cwdDir:n,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(e,r){let{readFile:n}=await import("node:fs/promises"),s=mr(this.sessionsDir,e,r,"session.jsonl.zstd"),i=await n(s),o=vo(i),a=[];for(let l of o.split(`
1683
1683
  `))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,r){let n=await this.readRecords(e,r);if(n.length===0)return null;let s=mr(this.sessionsDir,e,r,"session.jsonl.zstd");return Lg(n,s,Ng(n))}}});import{spawn as UA}from"node:child_process";async function Io(t,e=r=>$c.spawn(r)){if(fr){let r=await fr.catch(()=>{});if(r?.alive)return r;fr=void 0}return fr=e(t),fr}async function bs(){if(!fr)return;(await fr.catch(()=>{}))?.shutdown(),fr=void 0}var jA,Og,Tn,$c,fr,Mg=k(()=>{"use strict";jA=/dsh web:\s*(https?:\/\/\S+)/,Og=2e4,Tn=class t extends Error{method;detail;constructor(e,r){super(`dsh RPC ${e} failed: ${JSON.stringify(r)}`),this.name="DshRpcCallError",this.method=e,this.detail=r,Object.setPrototypeOf(this,t.prototype)}},$c=class t{baseUrl;child;constructor(e,r){this.baseUrl=e,this.child=r}static forTesting(e){return new t(e,void 0)}async rpc(e,r){let n=`${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:n,method:e,payload:r})})}catch(a){throw new Tn(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 Tn(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 Tn(e,"malformed response: HTTP 200 but body is not a well-formed {result:{ok,\u2026}} envelope");if(o.ok===!1)throw new Tn(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((r,n)=>{let s=UA("dsh",["web","--no-open","--port","0"],{env:e,stdio:["ignore","pipe","pipe"]}),i=!1,o="",a="",l=setTimeout(()=>{i||(i=!0,s.kill("SIGTERM"),n(new Error(`dsh web sidecar did not report a boot URL within ${Og}ms (stdout: ${o.slice(0,500)}; stderr: ${a.slice(0,500)})`)))},Og);s.stdout?.on("data",c=>{if(o+=c.toString(),i)return;let u=jA.exec(o);u&&(i=!0,clearTimeout(l),r(new t(u[1],s)))}),s.stderr?.on("data",c=>{a+=c.toString()}),s.on("error",c=>{i||(i=!0,clearTimeout(l),n(c))}),s.on("exit",(c,u)=>{if(i)return;i=!0,clearTimeout(l);let f=u?`signal ${u}`:`exit code ${c}`;n(new Error(`dsh web exited before reporting a boot URL (${f}): ${a.slice(0,500)}`))})})}}});import{randomUUID as BA}from"node:crypto";import{existsSync as Dg}from"node:fs";import{readFile as WA,mkdir as HA}from"node:fs/promises";function jc(t){return new Uc(t)}function Pc(t){return{...t,DSH_PERMISSION_MODE:t.DSH_PERMISSION_MODE??"danger-full-access"}}function qA(t){let e=t?.kind??"unknown",r=t?.error?.message;return r?`dsh turn ended with reason=${e}: ${r}`:`dsh turn ended with reason=${e} and no assistant text`}function xo(t){return t instanceof Error?t.message:String(t)}async function GA(t){let e=await $g(t),r=-1;for(let n of e)n.type==="turn/end"&&typeof n.seq=="number"&&n.seq>r&&(r=n.seq);return r}async function $g(t){let e;try{e=await WA(t)}catch{return[]}let r=vo(e),n=[];for(let s of r.split(`
1684
- `))if(s.trim())try{let i=JSON.parse(s);i!==null&&typeof i=="object"&&!Array.isArray(i)&&n.push(i)}catch{}return n}function JA(t){let r=t.data?.message?.content;if(typeof r=="string")return r;if(!Array.isArray(r))return"";let n=[];for(let s of r)s&&typeof s=="object"&&s.type==="text"&&typeof s.text=="string"&&n.push(s.text);return n.join("")}var XA,Fc,Uc,Bc=k(()=>{"use strict";Ge();Cg();Oc();Mg();$e();Pt();XA=500,Fc=8*60*60*1e3;Uc=class extends re{dshProvider;constructor(e){let r=new bo(e);super({provider:r,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:(n,s)=>this.dshPromptTurn(n,s)}),this.dshProvider=r}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,r){await HA(e,{recursive:!0});let n=`session-${BA()}`,s=Pc(process.env);Ne("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:n,cwd:e})}catch(a){return{success:!1,error:`session.create failed: ${xo(a)}`}}if(r?.model)try{await i.rpc("session.selectModel",{sessionId:n,provider:"deepseek-official",model:r.model})}catch(a){return{success:!1,error:`session.selectModel("${r.model}") failed: ${xo(a)}`}}let o=r?.prompt??J;try{await this.promptAndWait(i,e,n,o,Fc)}catch(a){return{success:!1,error:`seed turn failed: ${xo(a)}`}}return{success:!0,sessionId:n}}finally{await bs()}}async dshPromptTurn(e,r){let n=Date.now();if(r.bundleSession!==void 0){let o=r.bundleSession;if(o.provider!=="dsh")throw new Error(`bundle session provider mismatch: session serves "${o.provider}", turn targets "dsh"`);let a=await o.sendTurn(e,{signal:r.signal});return{text:a.text,sessionId:a.sessionId,durationMs:a.durationMs,...a.warnings!==void 0?{warnings:a.warnings}:{}}}let s=Pc(r.env??process.env);Ne("dsh",[],r.permissionMode??"yolo");let i;try{let o=await Io(s);r.model&&(await o.rpc("session.selectModel",{sessionId:r.sessionId,provider:"deepseek-official",model:r.model}),r.onProgress?.({kind:"system",summary:`dsh model set to ${r.model}`})),r.onProgress?.({kind:"system",summary:"dsh session.prompt sent"}),i=await this.promptAndWait(o,r.cwd,r.sessionId,e,r.timeoutMs&&r.timeoutMs>0?r.timeoutMs:Fc)}finally{await bs()}return r.onProgress?.({kind:"system",summary:"dsh turn completed"}),{text:i,sessionId:r.sessionId,durationMs:Date.now()-n}}async openSession(e){let r=Pc(e.env??process.env);Ne("dsh",[],e.permissionMode??"yolo");let n=await Io(r),s=this.dshProvider.sessionFilePath(e.cwd,e.sessionId);if(!Dg(s))throw await bs(),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 n.rpc("session.selectModel",{sessionId:e.sessionId,provider:"deepseek-official",model:e.model});let i=e.sessionId,o=this,a=0,l=!1,c=null,u=!1,f=!1,d=async()=>{f||(f=!0,await bs())};return{provider:"dsh",sessionId:i,get completedTurns(){return a},async sendTurn(m,h={}){if(l||c!==null)throw new Error("dsh bundle session is closed");if(u)throw new Error("dsh bundle session has a turn still in flight");if(h.signal?.aborted)throw new Error("Aborted");if(!Dg(s))throw new Error(`dsh bundle: session file for session "${i}" disappeared mid-bundle \u2014 identity re-check failed (external re-seed?)`);u=!0;let y=Date.now();try{let g=o.promptAndWait(n,e.cwd,i,m,Fc,h.signal);g.catch(()=>{});let p=await Promise.race([g,new Promise((_,E)=>{h.signal?.addEventListener("abort",()=>{(async()=>{l=!0,await d()})().finally(()=>E(new Error("Aborted")))},{once:!0})})]);return a+=1,{text:p,sessionId:i,durationMs:Date.now()-y}}finally{u=!1}},close(){return c!==null||(c=(async()=>{l=!0,await d()})()),c}}}async promptAndWait(e,r,n,s,i,o){let a=this.dshProvider.sessionFilePath(r,n),l=await GA(a);await e.rpc("session.prompt",{sessionId:n,mode:"queue",content:[{type:"text",text:s}]});let c=Date.now()+i;for(;;){if(o?.aborted)throw new Error("Aborted");let u=await $g(a),f=u.find(d=>d.type==="turn/end"&&(d.seq??-1)>l);if(f){let d=f.data?.reason,m=[...u].reverse().find(y=>y.type==="assistant/message"),h=m?JA(m):"";if(d?.kind!=="completed"&&!h)throw new Error(qA(d));return h}if(Date.now()>c)throw new Error(`dsh turn timed out after ${i}ms waiting for turn/end`);await new Promise(d=>setTimeout(d,XA))}}}});import{existsSync as VA}from"node:fs";import{join as Bg,resolve as KA}from"node:path";import{createRequire as YA}from"node:module";function zA(){return Wc===null&&(Wc=YA(import.meta.url)("node:sqlite").DatabaseSync),Wc}function Hc(t={}){return KA(t.hermesHome?.trim()||process.env.HERMES_HOME?.trim()||Bg(X,".hermes"))}function QA(t={}){return Bg(Hc(t),"state.db")}function Is(t){let e=typeof t=="number"&&Number.isFinite(t)?t:0;return new Date(e*1e3)}function He(t){return typeof t=="string"&&t.length>0?t:void 0}function ZA(t){if(!t)return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function Ug(t){return He(t.cwd)??He(ZA(t.model_config).cwd)??"(unknown)"}function eR(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function tR(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 jg(t){let e=t.input_tokens??0,r=t.output_tokens??0,n=t.cache_read_tokens??0,s=t.cache_write_tokens??0,i=t.reasoning_tokens??0;return(t.message_count??0)>0&&e+r+n+s+i>0?{totalInputTokens:e,totalCachedInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:r,totalReasoningOutputTokens:i}:{}}var Wc,Fg,Pg,ko,Wg=k(()=>{"use strict";Re();K();Wc=null;Fg="acp";Pg=`id, source, model, model_config, started_at,
1684
+ `))if(s.trim())try{let i=JSON.parse(s);i!==null&&typeof i=="object"&&!Array.isArray(i)&&n.push(i)}catch{}return n}function JA(t){let r=t.data?.message?.content;if(typeof r=="string")return r;if(!Array.isArray(r))return"";let n=[];for(let s of r)s&&typeof s=="object"&&s.type==="text"&&typeof s.text=="string"&&n.push(s.text);return n.join("")}var XA,Fc,Uc,Bc=k(()=>{"use strict";Ge();Cg();Oc();Mg();$e();Pt();XA=500,Fc=8*60*60*1e3;Uc=class extends re{dshProvider;constructor(e){let r=new bo(e);super({provider:r,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:(n,s)=>this.dshPromptTurn(n,s)}),this.dshProvider=r}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,r){await HA(e,{recursive:!0});let n=`session-${BA()}`,s=Pc(process.env);Ne("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:n,cwd:e})}catch(a){return{success:!1,error:`session.create failed: ${xo(a)}`}}if(r?.model)try{await i.rpc("session.selectModel",{sessionId:n,provider:"deepseek-official",model:r.model})}catch(a){return{success:!1,error:`session.selectModel("${r.model}") failed: ${xo(a)}`}}let o=r?.prompt??J;try{await this.promptAndWait(i,e,n,o,Fc)}catch(a){return{success:!1,error:`seed turn failed: ${xo(a)}`}}return{success:!0,sessionId:n}}finally{await bs()}}async dshPromptTurn(e,r){let n=Date.now();if(r.bundleSession!==void 0){let o=r.bundleSession;if(o.provider!=="dsh")throw new Error(`bundle session provider mismatch: session serves "${o.provider}", turn targets "dsh"`);let a=await o.sendTurn(e,{signal:r.signal});return{text:a.text,sessionId:a.sessionId,durationMs:a.durationMs,...a.warnings!==void 0?{warnings:a.warnings}:{}}}let s=Pc(r.env??process.env);Ne("dsh",[],r.permissionMode??"yolo");let i;try{let o=await Io(s);r.model&&(await o.rpc("session.selectModel",{sessionId:r.sessionId,provider:"deepseek-official",model:r.model}),r.onProgress?.({kind:"system",summary:`dsh model set to ${r.model}`})),r.onProgress?.({kind:"system",summary:"dsh session.prompt sent"}),i=await this.promptAndWait(o,r.cwd,r.sessionId,e,r.timeoutMs&&r.timeoutMs>0?r.timeoutMs:Fc)}finally{await bs()}return r.onProgress?.({kind:"system",summary:"dsh turn completed"}),{text:i,sessionId:r.sessionId,durationMs:Date.now()-n}}async openSession(e){let r=Pc(e.env??process.env);Ne("dsh",[],e.permissionMode??"yolo");let n=await Io(r),s=this.dshProvider.sessionFilePath(e.cwd,e.sessionId);if(!Dg(s))throw await bs(),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 n.rpc("session.selectModel",{sessionId:e.sessionId,provider:"deepseek-official",model:e.model});let i=e.sessionId,o=this,a=0,l=!1,c=null,u=!1,f=!1,d=async()=>{f||(f=!0,await bs())};return{provider:"dsh",sessionId:i,get completedTurns(){return a},async sendTurn(m,g={}){if(l||c!==null)throw new Error("dsh bundle session is closed");if(u)throw new Error("dsh bundle session has a turn still in flight");if(g.signal?.aborted)throw new Error("Aborted");if(!Dg(s))throw new Error(`dsh bundle: session file for session "${i}" disappeared mid-bundle \u2014 identity re-check failed (external re-seed?)`);u=!0;let y=Date.now();try{let h=o.promptAndWait(n,e.cwd,i,m,Fc,g.signal);h.catch(()=>{});let p=await Promise.race([h,new Promise((_,E)=>{g.signal?.addEventListener("abort",()=>{(async()=>{l=!0,await d()})().finally(()=>E(new Error("Aborted")))},{once:!0})})]);return a+=1,{text:p,sessionId:i,durationMs:Date.now()-y}}finally{u=!1}},close(){return c!==null||(c=(async()=>{l=!0,await d()})()),c}}}async promptAndWait(e,r,n,s,i,o){let a=this.dshProvider.sessionFilePath(r,n),l=await GA(a);await e.rpc("session.prompt",{sessionId:n,mode:"queue",content:[{type:"text",text:s}]});let c=Date.now()+i;for(;;){if(o?.aborted)throw new Error("Aborted");let u=await $g(a),f=u.find(d=>d.type==="turn/end"&&(d.seq??-1)>l);if(f){let d=f.data?.reason,m=[...u].reverse().find(y=>y.type==="assistant/message"),g=m?JA(m):"";if(d?.kind!=="completed"&&!g)throw new Error(qA(d));return g}if(Date.now()>c)throw new Error(`dsh turn timed out after ${i}ms waiting for turn/end`);await new Promise(d=>setTimeout(d,XA))}}}});import{existsSync as VA}from"node:fs";import{join as Bg,resolve as KA}from"node:path";import{createRequire as YA}from"node:module";function zA(){return Wc===null&&(Wc=YA(import.meta.url)("node:sqlite").DatabaseSync),Wc}function Hc(t={}){return KA(t.hermesHome?.trim()||process.env.HERMES_HOME?.trim()||Bg(X,".hermes"))}function QA(t={}){return Bg(Hc(t),"state.db")}function Is(t){let e=typeof t=="number"&&Number.isFinite(t)?t:0;return new Date(e*1e3)}function He(t){return typeof t=="string"&&t.length>0?t:void 0}function ZA(t){if(!t)return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function Ug(t){return He(t.cwd)??He(ZA(t.model_config).cwd)??"(unknown)"}function eR(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function tR(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 jg(t){let e=t.input_tokens??0,r=t.output_tokens??0,n=t.cache_read_tokens??0,s=t.cache_write_tokens??0,i=t.reasoning_tokens??0;return(t.message_count??0)>0&&e+r+n+s+i>0?{totalInputTokens:e,totalCachedInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:r,totalReasoningOutputTokens:i}:{}}var Wc,Fg,Pg,ko,Wg=k(()=>{"use strict";Re();K();Wc=null;Fg="acp";Pg=`id, source, model, model_config, started_at,
1685
1685
  last_activity_at, message_count, input_tokens, output_tokens,
1686
1686
  cache_read_tokens, cache_write_tokens, reasoning_tokens, cwd, title`;ko=class{name="hermes";dbPath;busyTimeoutMs;discoverLimit;constructor(e){this.dbPath=QA(e),this.busyTimeoutMs=e?.busyTimeoutMs??5e3,this.discoverLimit=e?.discoverLimit??200}get stateDbPath(){return this.dbPath}openDb(){if(!VA(this.dbPath))return null;let e=null;try{return e=new(zA())(this.dbPath,{open:!0,readOnly:!0}),e.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),e}catch(r){return e?.close(),C({event:"hermes_store_unavailable",provider:this.name,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),null}}selectSessionRow(e,r){return e.prepare(`SELECT ${Pg} FROM sessions WHERE id = ? AND source = ?`).get(r,Fg)??null}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=e.prepare(`SELECT ${Pg} FROM sessions
1687
1687
  WHERE source = ?
1688
1688
  ORDER BY COALESCE(last_activity_at, started_at) DESC
1689
1689
  LIMIT ?`).all(Fg,this.discoverLimit),n=[];for(let s of r){let i=this.previewTexts(e,s.id);n.push({provider:this.name,sessionId:s.id,slug:He(s.title),cwd:Ug(s),createdAt:Is(s.started_at),modifiedAt:Is(s.last_activity_at??s.started_at),model:He(s.model),startCommand:this.name,firstUserMessage:i.first,lastUserMessage:i.last,messageCount:s.message_count??0,filePath:this.dbPath,...jg(s)})}return n}catch(r){return C({event:"hermes_discover_sessions_failed",provider:this.name,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),[]}finally{e.close()}}activeMessageRows(e,r){let n=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,
1690
1690
  timestamp, finish_reason${["_compressed_summary","display_kind"].filter(a=>n.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(r)}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(r)}}previewTexts(e,r){try{let[n,s]=["ASC","DESC"].map(i=>{let o=`SELECT content FROM messages WHERE session_id = ?
1691
- AND role = 'user' AND content != ''`,a;try{a=e.prepare(`${o} AND active = 1 ORDER BY id ${i} LIMIT 1`).get(r)}catch(l){if(!/no such column: active/i.test(String(l)))throw l;a=e.prepare(`${o} ORDER BY id ${i} LIMIT 1`).get(r)}return a?j(a.content,80):void 0});return{first:n,last:s}}catch{return{}}}async loadSession(e){let r=this.openDb();if(!r)return null;try{let n=this.selectSessionRow(r,e);if(!n)return null;let s=this.activeMessageRows(r,e),i=[],o=[],a,l;for(let c of s){let u=Is(c.timestamp),f=c.content??"";if(c.role==="user"){f&&c._compressed_summary!==1&&c.display_kind!=="hidden"&&o.push(f),f.length>0&&(a||(a=j(f,80)),l=j(f,80)),i.push({role:"user",timestamp:u,content:f||"(empty)"});continue}if(c.role==="tool"){i.push({role:"tool_result",timestamp:u,content:f,toolCallId:He(c.tool_call_id),toolName:He(c.tool_name)});continue}f.length>0&&i.push({role:"assistant",timestamp:u,content:f,model:He(n.model),stopReason:He(c.finish_reason)});for(let d of eR(c.tool_calls)){let m=tR(d.function?.arguments);i.push({role:"tool_use",timestamp:u,content:He(d.function?.name)??"tool_call",toolName:He(d.function?.name),toolCallId:He(d.call_id)??He(d.id),toolInput:typeof d.function?.arguments=="string"?d.function.arguments:JSON.stringify(d.function?.arguments??{}),toolInputData:nt(m)})}}return{provider:this.name,sessionId:n.id,slug:He(n.title),cwd:Ug(n),createdAt:Is(n.started_at),modifiedAt:Is(n.last_activity_at??n.started_at),model:He(n.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:l,messageCount:n.message_count??i.length,filePath:this.dbPath,...jg(n),messages:i,userPrompts:o}}catch(n){return C({event:"hermes_load_session_failed",provider:this.name,session_id:e,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),null}finally{r.close()}}async resolveSessionPath(e){let r=this.openDb();if(!r)return null;try{return this.selectSessionRow(r,e)?this.dbPath:null}catch{return null}finally{r.close()}}async deleteSession(e){return!1}}});import{mkdir as rR}from"node:fs/promises";function sR(t){return nR.test(t)}function Hg(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 iR}function qc(t){return new Xc(t)}var nR,iR,Xc,Gc=k(()=>{"use strict";Ge();Wg();Ut();$e();K();nR=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;iR="dont_ask";Xc=class extends re{hermesProvider;hermesHome;constructor(e){let r=new ko(e);super({provider:r,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(n,s)=>xt(n,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:Hg(s.permissionMode)})}),this.hermesProvider=r,this.hermesHome=Hc(e)}async openSession(e){return kt({...e,env:{...e.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:Hg(e.permissionMode)})}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(e,r){await rR(e,{recursive:!0});let n=[];if(r?.effort){let i="hermes has no ACP-level effort surface";C({event:"hermes_effort_ignored",provider:this.name,effort:r.effort,reason:i}),n.push(`hermes seed ignored effort=${r.effort}: ${i}`)}let s;try{s=await this.sendTurn(r?.prompt??J,{sessionId:"",cwd:e,model:r?.model})}catch(i){return{success:!1,error:`hermes ACP seed failed: ${i instanceof Error?i.message:String(i)}`}}return sR(s.sessionId)?(n.push(...s.warnings??[]),{success:!0,sessionId:s.sessionId,...n.length>0?{warnings:n}:{}}):(C({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 Xg,rm as oR,stat as aR}from"node:fs/promises";import{join as Jc}from"node:path";function Vc(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 qg(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}var Ao,Gg=k(()=>{"use strict";Re();Ao=class{name="pi";baseDir;constructor(e={}){this.baseDir=e.piDir||Jc(X,".pi","agent","sessions")}getWatchPaths(){return[{directory:this.baseDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[];for(let r of await this.listSessionFiles())try{let n=await this.extractSummary(r);n&&e.push(n)}catch{}return e}async listSessionFiles(){let e;try{e=await Xg(this.baseDir)}catch{return[]}let r=[];for(let n of e){let s=Jc(this.baseDir,n);try{if(!(await aR(s)).isDirectory())continue;for(let i of await Xg(s))i.endsWith(".jsonl")&&r.push(Jc(s,i))}catch{}}return r}async readHeader(e){for await(let r of ue(e))return r.type==="session"?r:null;return null}async extractSummary(e){let r=await this.readHeader(e);if(!r)return null;let n=await fe(e),s,i,o,a=0,l=0,c=0,u=0,f=0,d=0,m=0,h;for await(let y of ue(e)){if(y.type==="model_change"&&y.provider&&y.modelId){s=`${y.provider}/${y.modelId}`;continue}if(y.type!=="message"||!y.message)continue;let g=y.message;if(g.provider&&g.model&&(s=`${g.provider}/${g.model}`),g.role==="user"){let p=Vc(g).trim();p&&(i||(i=j(p,80)),o=j(p,80)),a++}else if(g.role==="assistant"){a++;let p=g.usage;p&&(l+=p.input??0,c+=p.cacheRead??0,u+=p.cacheWrite??0,f+=p.output??0,d+=p.reasoning??0,m=p.input??0,h={inputTokens:p.input,cachedInputTokens:p.cacheRead,cacheWriteInputTokens:p.cacheWrite,outputTokens:p.output,reasoningOutputTokens:p.reasoning,totalTokens:p.totalTokens})}}return{provider:"pi",sessionId:r.id,cwd:r.cwd??"(unknown)",createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:s,startCommand:"pi",firstUserMessage:i,lastUserMessage:o,messageCount:a,filePath:e,totalInputTokens:l,totalCachedInputTokens:c,totalCacheWriteInputTokens:u,totalOutputTokens:f,totalReasoningOutputTokens:d,lastInputTokens:m,lastTokenUsage:h}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=await this.extractSummary(r);if(!n)return null;let s=[],i=n.model;for await(let o of ue(r)){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):n.modifiedAt;if(a.role==="user")s.push({role:"user",timestamp:l,content:Vc(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:qg(c.arguments),toolName:c.name??"tool",toolInput:qg(c.arguments),toolInputData:c.arguments,toolCallId:c.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:l,content:Vc(a),toolName:a.toolName,toolCallId:a.toolCallId})}return{...n,model:i,messages:s}}async resolveSessionPath(e){let r=`_${e}.jsonl`,n=[];for(let s of await this.listSessionFiles()){if(s.endsWith(r))return s;s.split("_").pop()?.replace(/\.jsonl$/,"")?.startsWith(e)&&n.push(s)}return n.length===1?n[0]:null}async deleteSession(e){let r=await this.resolveSessionPath(e);return r?(await oR(r,{force:!0}),!0):!1}}});function Yc(t){return new Kc(t)}var Kc,lR,zc=k(()=>{"use strict";Gg();Ge();$e();Pt();Rc();Kc=class extends re{constructor(e){super({provider:new Ao(e),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",J],resumeTemplate:"pi --session {{session_id}}",startTemplate:"pi",transport:lR})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}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}`}}},lR=To({label:"pi",buildArgs:(t,e)=>{let r=["--session",e.sessionId,"-p",t];return e.model&&r.push("--model",e.model),r},assertArgs:(t,e)=>Ne("pi",t,e.permissionMode??"yolo")})});import{createHash as cR}from"node:crypto";import{existsSync as dR,mkdirSync as Zc,readFileSync as uR,renameSync as mR,rmdirSync as e_,statSync as fR,writeFileSync as pR}from"node:fs";import{dirname as nd,join as Jg,resolve as Qc}from"node:path";function hR(t){return cR("sha256").update(t).digest("hex").slice(0,8)}function gR(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function _R(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function t_(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ro(t){return Math.max(1,Math.ceil(t.length/4))}function Sn(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return Qc(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?Jg(nd(Qc(r)),".lmctl-claude-mock","sessions.json"):Jg(Qc(t),".lmctl-claude-mock","sessions.json")}function Vg(){return{schemaVersion:1,sessions:{}}}function xs(t){if(!dR(t))return Vg();try{let e=JSON.parse(uR(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=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:r,...i!==void 0?{defaultDelayMs:i}:{},...n!==void 0?{script:n}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return Vg()}}function r_(t,e){Zc(nd(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;pR(r,`${JSON.stringify(e,null,2)}
1691
+ AND role = 'user' AND content != ''`,a;try{a=e.prepare(`${o} AND active = 1 ORDER BY id ${i} LIMIT 1`).get(r)}catch(l){if(!/no such column: active/i.test(String(l)))throw l;a=e.prepare(`${o} ORDER BY id ${i} LIMIT 1`).get(r)}return a?j(a.content,80):void 0});return{first:n,last:s}}catch{return{}}}async loadSession(e){let r=this.openDb();if(!r)return null;try{let n=this.selectSessionRow(r,e);if(!n)return null;let s=this.activeMessageRows(r,e),i=[],o=[],a,l;for(let c of s){let u=Is(c.timestamp),f=c.content??"";if(c.role==="user"){f&&c._compressed_summary!==1&&c.display_kind!=="hidden"&&o.push(f),f.length>0&&(a||(a=j(f,80)),l=j(f,80)),i.push({role:"user",timestamp:u,content:f||"(empty)"});continue}if(c.role==="tool"){i.push({role:"tool_result",timestamp:u,content:f,toolCallId:He(c.tool_call_id),toolName:He(c.tool_name)});continue}f.length>0&&i.push({role:"assistant",timestamp:u,content:f,model:He(n.model),stopReason:He(c.finish_reason)});for(let d of eR(c.tool_calls)){let m=tR(d.function?.arguments);i.push({role:"tool_use",timestamp:u,content:He(d.function?.name)??"tool_call",toolName:He(d.function?.name),toolCallId:He(d.call_id)??He(d.id),toolInput:typeof d.function?.arguments=="string"?d.function.arguments:JSON.stringify(d.function?.arguments??{}),toolInputData:nt(m)})}}return{provider:this.name,sessionId:n.id,slug:He(n.title),cwd:Ug(n),createdAt:Is(n.started_at),modifiedAt:Is(n.last_activity_at??n.started_at),model:He(n.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:l,messageCount:n.message_count??i.length,filePath:this.dbPath,...jg(n),messages:i,userPrompts:o}}catch(n){return C({event:"hermes_load_session_failed",provider:this.name,session_id:e,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),null}finally{r.close()}}async resolveSessionPath(e){let r=this.openDb();if(!r)return null;try{return this.selectSessionRow(r,e)?this.dbPath:null}catch{return null}finally{r.close()}}async deleteSession(e){return!1}}});import{mkdir as rR}from"node:fs/promises";function sR(t){return nR.test(t)}function Hg(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 iR}function qc(t){return new Xc(t)}var nR,iR,Xc,Gc=k(()=>{"use strict";Ge();Wg();Ut();$e();K();nR=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;iR="dont_ask";Xc=class extends re{hermesProvider;hermesHome;constructor(e){let r=new ko(e);super({provider:r,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(n,s)=>xt(n,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:Hg(s.permissionMode)})}),this.hermesProvider=r,this.hermesHome=Hc(e)}async openSession(e){return kt({...e,env:{...e.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:Hg(e.permissionMode)})}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(e,r){await rR(e,{recursive:!0});let n=[];if(r?.effort){let i="hermes has no ACP-level effort surface";C({event:"hermes_effort_ignored",provider:this.name,effort:r.effort,reason:i}),n.push(`hermes seed ignored effort=${r.effort}: ${i}`)}let s;try{s=await this.sendTurn(r?.prompt??J,{sessionId:"",cwd:e,model:r?.model})}catch(i){return{success:!1,error:`hermes ACP seed failed: ${i instanceof Error?i.message:String(i)}`}}return sR(s.sessionId)?(n.push(...s.warnings??[]),{success:!0,sessionId:s.sessionId,...n.length>0?{warnings:n}:{}}):(C({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 Xg,rm as oR,stat as aR}from"node:fs/promises";import{join as Jc}from"node:path";function Vc(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 qg(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}var Ao,Gg=k(()=>{"use strict";Re();Ao=class{name="pi";baseDir;constructor(e={}){this.baseDir=e.piDir||Jc(X,".pi","agent","sessions")}getWatchPaths(){return[{directory:this.baseDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[];for(let r of await this.listSessionFiles())try{let n=await this.extractSummary(r);n&&e.push(n)}catch{}return e}async listSessionFiles(){let e;try{e=await Xg(this.baseDir)}catch{return[]}let r=[];for(let n of e){let s=Jc(this.baseDir,n);try{if(!(await aR(s)).isDirectory())continue;for(let i of await Xg(s))i.endsWith(".jsonl")&&r.push(Jc(s,i))}catch{}}return r}async readHeader(e){for await(let r of ue(e))return r.type==="session"?r:null;return null}async extractSummary(e){let r=await this.readHeader(e);if(!r)return null;let n=await fe(e),s,i,o,a=0,l=0,c=0,u=0,f=0,d=0,m=0,g;for await(let y of ue(e)){if(y.type==="model_change"&&y.provider&&y.modelId){s=`${y.provider}/${y.modelId}`;continue}if(y.type!=="message"||!y.message)continue;let h=y.message;if(h.provider&&h.model&&(s=`${h.provider}/${h.model}`),h.role==="user"){let p=Vc(h).trim();p&&(i||(i=j(p,80)),o=j(p,80)),a++}else if(h.role==="assistant"){a++;let p=h.usage;p&&(l+=p.input??0,c+=p.cacheRead??0,u+=p.cacheWrite??0,f+=p.output??0,d+=p.reasoning??0,m=p.input??0,g={inputTokens:p.input,cachedInputTokens:p.cacheRead,cacheWriteInputTokens:p.cacheWrite,outputTokens:p.output,reasoningOutputTokens:p.reasoning,totalTokens:p.totalTokens})}}return{provider:"pi",sessionId:r.id,cwd:r.cwd??"(unknown)",createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:s,startCommand:"pi",firstUserMessage:i,lastUserMessage:o,messageCount:a,filePath:e,totalInputTokens:l,totalCachedInputTokens:c,totalCacheWriteInputTokens:u,totalOutputTokens:f,totalReasoningOutputTokens:d,lastInputTokens:m,lastTokenUsage:g}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=await this.extractSummary(r);if(!n)return null;let s=[],i=n.model;for await(let o of ue(r)){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):n.modifiedAt;if(a.role==="user")s.push({role:"user",timestamp:l,content:Vc(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:qg(c.arguments),toolName:c.name??"tool",toolInput:qg(c.arguments),toolInputData:c.arguments,toolCallId:c.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:l,content:Vc(a),toolName:a.toolName,toolCallId:a.toolCallId})}return{...n,model:i,messages:s}}async resolveSessionPath(e){let r=`_${e}.jsonl`,n=[];for(let s of await this.listSessionFiles()){if(s.endsWith(r))return s;s.split("_").pop()?.replace(/\.jsonl$/,"")?.startsWith(e)&&n.push(s)}return n.length===1?n[0]:null}async deleteSession(e){let r=await this.resolveSessionPath(e);return r?(await oR(r,{force:!0}),!0):!1}}});function Yc(t){return new Kc(t)}var Kc,lR,zc=k(()=>{"use strict";Gg();Ge();$e();Pt();Rc();Kc=class extends re{constructor(e){super({provider:new Ao(e),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",J],resumeTemplate:"pi --session {{session_id}}",startTemplate:"pi",transport:lR})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}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}`}}},lR=To({label:"pi",buildArgs:(t,e)=>{let r=["--session",e.sessionId,"-p",t];return e.model&&r.push("--model",e.model),r},assertArgs:(t,e)=>Ne("pi",t,e.permissionMode??"yolo")})});import{createHash as cR}from"node:crypto";import{existsSync as dR,mkdirSync as Zc,readFileSync as uR,renameSync as mR,rmdirSync as e_,statSync as fR,writeFileSync as pR}from"node:fs";import{dirname as nd,join as Jg,resolve as Qc}from"node:path";function hR(t){return cR("sha256").update(t).digest("hex").slice(0,8)}function gR(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function _R(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function t_(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ro(t){return Math.max(1,Math.ceil(t.length/4))}function Sn(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return Qc(e);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?Jg(nd(Qc(r)),".lmctl-claude-mock","sessions.json"):Jg(Qc(t),".lmctl-claude-mock","sessions.json")}function Vg(){return{schemaVersion:1,sessions:{}}}function xs(t){if(!dR(t))return Vg();try{let e=JSON.parse(uR(t,"utf8")),r=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},n=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:r,...i!==void 0?{defaultDelayMs:i}:{},...n!==void 0?{script:n}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return Vg()}}function r_(t,e){Zc(nd(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`;pR(r,`${JSON.stringify(e,null,2)}
1692
1692
  `,"utf8"),mR(r,t)}function wR(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function TR(t){let e=`${t}.lock`;Zc(nd(t),{recursive:!0});let r=Date.now()+Kg;for(;;)try{return Zc(e),e}catch(n){if(n.code!=="EEXIST")throw n;try{if(Date.now()-fR(e).mtimeMs>yR){try{e_(e)}catch{}continue}}catch{continue}if(Date.now()>=r)throw new Error(`ClaudeMock store lock timeout after ${Kg}ms: ${e}`);wR(ER)}}function vR(t){try{e_(t)}catch{}}function n_(t,e){let r=TR(t);try{return e()}finally{vR(r)}}function SR(t){return{...t,timestamp:t.timestamp.toISOString()}}function bR(t){return{...t,timestamp:new Date(t.timestamp)}}function IR(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(SR)}}function s_(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(bR)}}function No(t,e=process.cwd()){let r=vn.get(t);if(r!==void 0)return r;let s=xs(Sn(e)).sessions[t];if(s===void 0)return;let i=s_(s);return vn.set(i.sessionId,i),i}function Yg(t){vn.set(t.sessionId,t);let e=Sn(t.cwd);n_(e,()=>{let r=xs(e);r.sessions[t.sessionId]=IR({...t,filePath:e}),r_(e,r)})}function xR(t,e=process.cwd()){let r=Sn(e);return n_(r,()=>{let n=xs(r),s=n.sessions[t]!==void 0;return s&&(delete n.sessions[t],r_(r,n)),s})}function kR(){let t=xs(Sn()),e=Object.values(t.sessions).map(s_);for(let r of e)vn.set(r.sessionId,r);return e}function ed(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function zg(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 Qg(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function AR(t,e){let{script:r,scriptContains:n}=e;if(r!==void 0){let s=zg(r[t]??r[t_(t)]);if(s!==void 0)return s}if(n!==void 0){for(let s of Object.keys(n))if(t.includes(s)){let i=zg(n[s]);if(i!==void 0)return i}}}function Zg(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 sd(){return new rd}var vn,yR,ER,Kg,td,rd,id=k(()=>{"use strict";vn=new Map;yR=5e3,ER=15,Kg=1e4;td=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let r of kR())e.set(r.sessionId,r);for(let r of vn.values())e.set(r.sessionId,r);return[...e.values()].map(Zg)}async loadSession(e){let r=No(e);return r===void 0?null:{...Zg(r),messages:r.messages.slice()}}async resolveSessionPath(e){return No(e)?.filePath??null}async deleteSession(e){let r=vn.delete(e),n=xR(e);return r||n}},rd=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new td;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,r){let n=gR(_R(e,r)),s=`mock-${n}-${hR(`${e}:${n}`)}`,i=new Date,o=Sn(e),a=No(s,e),l=r?.prompt??"ClaudeMock seed",c=Ro(l),u={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 u.messages.push({role:"user",timestamp:i,content:l}),u.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),u.totalInputTokens+=c,u.totalOutputTokens+=Ro("ACK: ClaudeMock seeded"),Yg(u),{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,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=No(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=xs(Sn(r.cwd)),a=AR(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await Qg(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${t_(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:c,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Ro(e),s.totalOutputTokens+=Ro(c),Yg(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await Qg(l),{text:c,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function pr(t){let e=[Ql({claudeDir:t?.claudeDir}),rc({codexDir:t?.codexDir,codeDir:t?.codeDir}),lc({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),mc({copilotDir:t?.copilotDir}),hc(),wc({kimiHome:t?.kimiHome}),Sc({lmplayerDbPath:t?.lmplayerDbPath}),xc(),Lc({agyDir:t?.agyDir}),jc({dshHome:t?.dshHome}),qc({hermesHome:t?.hermesHome}),Yc({piDir:t?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(sd()),e}var od=k(()=>{"use strict";Zl();nc();cc();fc();gc();Tc();bc();kc();Cc();Bc();Gc();zc();id();Zl();nc();cc();fc();gc();Tc();bc();kc();Cc();Bc();Gc();zc();id()});var Mr,bn,i_=k(()=>{"use strict";Mr=["claude","qwen","codex","dsh","gemini","copilot","opencode","kimi","hermes"],bn=["agy","pi","lmplayer"]});var dd={};se(dd,{BUNDLE_CAPABLE_PROVIDERS:()=>Mr,BUNDLE_NEVER_CAPABLE_PROVIDERS:()=>bn,ProviderRegistry:()=>es,TransportConnectionError:()=>ne,TransportError:()=>ir,TransportJsonError:()=>qi,TransportProcessError:()=>ns,TransportRpcError:()=>ss,_resetDefaultRegistryForTests:()=>RR,bundleSupportedProviders:()=>In,chat:()=>$r,countTokens:()=>LR,createAdapterRegistry:()=>sr,createAllAdapters:()=>pr,deleteSession:()=>cd,listSessions:()=>As,openBundleSession:()=>ks,seed:()=>ld});function Dr(){return Lo===null&&(Lo=sr(pr())),Lo}function RR(){Lo=null}function ad(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function $r(t){let e=t.registry??Dr(),r=ad(e,t.provider),n={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=await r.sendTurn(t.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs,...s.warnings!==void 0?{warnings:s.warnings}:{}}}function In(t){return(t??Dr()).getAllAdapters().filter(r=>r.openSession!==void 0).map(r=>r.name)}async function ks(t){let e=t.registry??Dr(),r=ad(e,t.provider);if(r.openSession===void 0)throw new Error(`provider "${t.provider}" does not support bundle sessions in this version (supported: ${In(e).join(", ")})`);return r.openSession(t)}async function ld(t){let e=t.registry??Dr(),r=ad(e,t.provider),n=await o_(e,t.provider,t.cwd),s=await r.seed(t.cwd,{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};let o=await o_(e,t.provider,t.cwd),a=NR(n,o);return s.success?a?{success:!0,sessionId:a,...i}:{success:!0,...i}:(a&&await r.delete?.(a).catch(()=>{}),{success:!1,error:s.error,...i})}async function o_(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function NR(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function As(t={}){return(t.registry??Dr()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function cd(t,e,r=Dr()){return r.deleteSession(e,t)}async function LR(t){let r=await(t.registry??Dr()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var Lo,jt=k(()=>{"use strict";bl();od();bl();od();i_();Rr();Lo=null});function Co(t){return OR.has(t)}function md(){return ud===null&&(ud=sr(pr())),ud}function fd(t,e,r={}){if(!Co(t))return null;try{let n=md().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&r.isLead===!0?zi({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?CR[t]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:t,model:r.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...a_[t]??[]]}catch{return null}}function c_(t,e,r={}){let n=fd(t,e,r);return n===null?null:n.join(" ")}function ge(t,e){return md().getSession(t,e)}async function Rt(t){return(await md().resolveSessions(t)).map(r=>r.provider.name)}var a_,CR,OR,l_,ud,pt=k(()=>{"use strict";jt();Ml();a_={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:[]},CR={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]},OR=new Set(Object.keys(a_)),l_=/^[\w.:-]+$/;ud=null});function MR(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return d_;let r=Number(e);return!Number.isFinite(r)||r<=0?d_:r}async function DR(t,e,r){try{let n=he(e,r,t),s=n.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof n.provider=="string"&&n.provider.trim()!=="")i=n.provider;else{let c=await Rt(s);if(c.length!==1)return null;i=c[0]}let o=await ge(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 u_(t,e,r,n,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??MR(),o=await DR(t,r,n),a=o!==null&&o>=i;return a&&C({event:"session_idle_reclaim",receiver_teamfile:r,receiver_alias:n,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 d_,m_=k(()=>{"use strict";K();pt();Oe();d_=36e5});function $R(t){return t===null?null:De(t)?"live":"dead"}function pd(t){let e=t.nowMs??Date.now(),r=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:$R(t.holderPid),since:t.since,idle_ms:Number.isFinite(r)?Math.max(0,e-r):null}}function FR(t){return(0,f_.formatDuration)(t)}function hd(t){let e=[];return t.idle_ms!==null&&e.push(`active ${FR(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 f_,p_=k(()=>{"use strict";kr();f_=ct(tt(),1)});import{randomUUID as PR}from"node:crypto";import{hostname as h_,networkInterfaces as UR}from"node:os";function g_(t){let e=(t.now??new Date).toISOString();return{lock_id:PR(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??h_(),holder_ips:t.ips??XR(),started_at:e,last_heartbeat:e}}function __(t=process.env){return y_(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,jR)}function WR(t=process.env){return y_(t.LMCTL_TERMINAL_LOCK_STALE_MS,BR)}function gd(t,e={}){let r=e.now??new Date,n=e.localHost??h_(),s=e.staleMs??WR();if(t.holder_host===n)return(e.isProcessAlive??HR)(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)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Fr(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function y_(t,e){if(t===void 0||t.trim()==="")return e;let r=t.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?e:n}function HR(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 XR(){let t=new Set;for(let e of Object.values(UR()))for(let r of e??[])r.internal||t.add(r.address);return[...t].sort()}var jR,BR,Rs=k(()=>{"use strict";jR=15e3,BR=12e4});function qR(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
1693
1693
  manually, outside a member session that lmctl started. Running lmctl this way is
1694
1694
  not officially supported.
@@ -1697,8 +1697,8 @@ The session marker may be stale or the team may not be registered in this lmctl
1697
1697
  Consulted ${Un(Ee())}
1698
1698
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function E_(t){return`unknown option --from
1699
1699
  ${qR(t)}`}function xn(t,e){let r=_d(t,e);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function _d(t,e){let r=t[xl];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of e.listRootTeams()){let o;try{o=Ye(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var kn=k(()=>{"use strict";It();_t();Et()});function Wt(t){let e=Yt(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Ns=k(()=>{"use strict";Oe()});function Ls(t,e,r){let n=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=ut({path:Ee()})),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&&De(a.holder_pid)),pollMs:GR,settleMs:JR,maxHoldMs:cn(r),onHold:()=>C({event:"delivery_hold_open_started",receiver:n}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&C({event:"delivery_hold_open_released",receiver:n,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function w_(t){let e=VR(t.newMessage,{newMessageFrom:t.newMessageFrom??KR(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 r=!1,n=Q(),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=>{r=!0,n&&(s+=1,o=Buffer.byteLength(c,"utf8"),i+=o),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};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=Ls(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await $r(a);if(t.requireResume&&l.sessionId!==t.receiver.sessionId)throw new Error(`provider session changed: expected ${t.receiver.sessionId}, received ${l.sessionId??"(missing)"}`);return n&&ve(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:r,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:r,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:l.status==="empty"?{status:"empty",receipt:l.text,prompt:e,wroteDelta:r,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:{status:"ok",receipt:l.text,prompt:e,wroteDelta:r,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}}function VR(t,e={}){return[`--- new prompt (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
1700
- `)}function KR(t){return`${t.teamfile}:${t.alias}`}var KH,GR,JR,Oo=k(()=>{"use strict";jt();K();tr();_t();kr();et();KH=60*60*1e3,GR=2e3,JR=5e3});async function Ur(t){let e=t.onEvent??(()=>{}),r=YR(t.io,e),n=null,s=null,i=null,o,a,l=null,c=!1,u=null,f=t.prompt;try{let d=await L(r,N=>he(t.teamfile,t.alias,N));if(t.expectedSession!==void 0&&(d.provider!==t.expectedSession.provider||d.sessionid!==t.expectedSession.sessionid))throw new ie(`session changed for ${d.alias}; expected ${t.expectedSession.provider}:${t.expectedSession.sessionid}, found ${d.provider}:${d.sessionid}`);let m=d.teamfile,h=await L(r,N=>aN(N,t.env??process.env)),y=h.sender,g=await lN(r,{explicitRoot:t.rootFlag,sender:y,receiverTeamfile:m,operatorOrigin:h.origin==="operator"}),p=y===null?null:await cN(r,{rootTeamfile:g,sender:y,receiverTeamfile:m,receiverAlias:d.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
1701
- `});let _=t.env??process.env,E=await L(r,N=>N.getRootTeam(g)?.name??null);E!==null&&(_.LMBEE_TEAM_NAME=E),i=await eN(r,{receiverTeamfile:m,receiverAlias:d.alias,sender:y,rootTeamfile:g,provider:d.provider,model:d.model,sessionId:d.sessionid,cwd:d.sessiondir,prompt:t.prompt,origin:h.origin,parentInvocationId:nr(_.LMCTL_INVOCATION_ID)}),o=sN(r,i),i!==null&&(_.LMCTL_INVOCATION_ID=String(i));try{sn(r,ae(m),m)}catch{}n={root_teamfile:g,sender_teamfile:y?.teamfile??null,sender_alias:y?.alias??null,receiver_teamfile:m,receiver_alias:d.alias,receiver_provider:d.provider,receiver_session_id:d.sessionid,origin:h.origin,message_type:t.messageType??null,policy:p};let w=await x_(r,m,d.alias);if(w!==null){let N=Fr(w);return Pr(i,n,t.prompt,N,"unavailable"),u=yd(N,null),{status:"busy",message:N,teamChatLogId:null}}let S=!1;if(t.heldLease!==void 0){let N=t.heldLease;if(!await L(r,q=>{let V=q.getAgentInflight(m,d.alias);return V===null||V.sender_teamfile!==N.row.sender_teamfile||V.sender_alias!==N.row.sender_alias||V.started_at!==N.row.started_at||V.holder_pid!==process.pid?!1:q.heartbeatAgentInflight(N.row,N.leaseId,new Date().toISOString())})){let q=`bundle lease lost for ${d.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return Pr(i,n,t.prompt,q,"unavailable"),u=Cs(q,null),{status:"error",errorKind:"provider",message:q,teamChatLogId:null,messageId:null}}}else{let N=await zR(r,m,d.alias);if(N.busy){let P=await QR(r,m,d.alias);return P+=await ZR(r,m,d.alias),Pr(i,n,t.prompt,P,"unavailable"),u=yd(P,null),{status:"busy",message:P,teamChatLogId:null}}S=N.idleReclaim}if(y!==null&&y.teamfile!==m){let N=await L(r,P=>wf(P,{root:g,sender:y,receiverTeamfile:m,receiverAlias:d.alias,now:new Date}));if(N.stop){let P=vf(N.chain);return Pr(i,n,t.prompt,P,"cycle"),u=Cs(P,null),{status:"error",errorKind:"cycle",message:P,teamChatLogId:null,messageId:null}}}if(t.heldLease===void 0){let N=await mN(r,{receiver_teamfile:m,receiver_alias:d.alias,sender_teamfile:y?.teamfile??m,sender_alias:y?.alias??"operator",...S?{force:!0,reclaimReason:"session-idle"}:{}});if(!N.acquired){let P=k_(m,d.alias,N.current);return P+=` ${hd(pd({holderPid:N.current.holder_pid,since:N.current.started_at}))}`,Pr(i,n,t.prompt,P,"unavailable"),u=yd(P,null),{status:"busy",message:P,teamChatLogId:null}}s={row:N.lease,leaseId:N.leaseId},a=ln(P=>L(r,q=>q.heartbeatAgentInflight(s.row,s.leaseId,P)),{intervalMs:b_,onError:P=>{Q()&&ve(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:P instanceof Error?P.message:String(P)}))}})}let T=await w_({sender:y??{teamfile:m,alias:"operator"},receiver:{teamfile:m,alias:d.alias,provider:d.provider,sessionId:d.sessionid,cwd:d.sessiondir,...d.model!==void 0?{model:d.model}:{},...d.effort!==void 0?{effort:d.effort}:{},...d.isLead!==void 0?{isLead:d.isLead}:{}},newMessage:t.prompt,newMessageFrom:y===null?"operator":`${y.teamfile}:${y.alias}`,io:r,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:N=>e({kind:"delta",chunk:N}),onProgress:N=>e({kind:"progress",alias:d.alias,event:N}),onPromptBuilt:async N=>{f=N,l===null&&(l=await pN(r,{...n,message:N}),l!==null&&(t.onAccepted?.(Ft(l)),i!==null&&await nN(r,i,l))),i!==null&&await rN(r,i,N)}});f=T.prompt;let b=T.status==="stalled",v=T.status==="empty",x=null,I=b?`provider stalled${T.stalledAfterMs!==void 0?` after ${T.stalledAfterMs}ms`:""}`:v?"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":T.status==="error"?T.error??T.receipt:n.policy?.outOfPolicy===!0?n.policy.reason:null,R=b||v||T.status==="error"?"error":n.policy?.outOfPolicy===!0?"out_of_policy":"ok";l!==null?(await S_(r,l,{...n,message:f,response:T.receipt,status:R,error_detail:I}),c=!0,x=l):x=await gN(r,{...n,message:f,response:T.receipt,status:R,error_detail:I});let M=T.status!=="error"?T.warnings:void 0;if(b||v){let N=I;Pr(i,n,f,N,"error"),u=Cs(N,x,T.receipt,M)}else u=iN(T.receipt,x,M);return{status:b?"stalled":v?"empty":"ok",replyText:T.receipt,wroteDelta:T.wroteDelta,teamChatLogId:x,messageId:x===null?null:Ft(x),durationMs:T.durationMs}}catch(d){let m=d instanceof Error?d.message:String(d);return l!==null&&!c&&n!==null&&(await S_(r,l,{...n,message:f,response:null,status:"error",error_detail:m}),c=!0),Pr(i,n,f,m,"error"),u=Cs(m,l),{status:"error",errorKind:d instanceof ie?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:Ft(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await hN(r,n,Ft(l)),s!==null&&await fN(r,s.row,s.leaseId),i!==null&&await tN(r,i,u??Cs("chat turn exited without a terminal outcome",null))}}function YR(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function zR(t,e,r){let n=await L(t,i=>(mn(i,e,r),Ze(i,e,r)));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await L(t,i=>u_(i,n,e,r));return{busy:!s,idleReclaim:s}}async function QR(t,e,r){let n=await x_(t,e,r);if(n!==null)return Fr(n);let s=await L(t,i=>i.getAgentInflight(e,r));return s!==null?k_(e,r,s):`${r} is busy; wait and retry`}async function ZR(t,e,r){let n=await L(t,s=>s.getAgentInflight(e,r));return n===null?"":` ${hd(pd({holderPid:n.holder_pid,since:n.started_at}))}`}async function eN(t,e){try{return(await L(t,n=>n.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:oN(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(r){return Q()&&ve(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function tN(t,e,r){try{await L(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){Q()&&ve(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function rN(t,e,r){try{await L(t,n=>{n.updateTrackedInvocationRequestPayload(e,r)})}catch(n){Q()&&ve(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function nN(t,e,r){try{await L(t,n=>{n.linkTrackedInvocationMessage(e,r)})}catch(n){Q()&&ve(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:r,error:n instanceof Error?n.message:String(n)}))}}function sN(t,e){if(e===null)return;let r=setInterval(()=>{L(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{Q()&&ve(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},b_);return r.unref?.(),r}function I_(t){return t!==void 0&&t.length>0?{config_warnings:JSON.stringify(t)}:{}}function iN(t,e,r){return{status:"done",result_summary:Os(t),error:null,team_chat_log_id:e,...I_(r)}}function yd(t,e){return{status:"busy",result_summary:Os(t),error:t,team_chat_log_id:e}}function Cs(t,e,r,n){return{status:"error",result_summary:Os(r===void 0?t:r),error:t,team_chat_log_id:e,...I_(n)}}function Os(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function oN(t,e,r){return`lmctl prompt ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function aN(t,e){let r=xn(e,t);if(r.ok)return{sender:Wt(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Bt("chat"))}async function lN(t,e){if(e.explicitRoot!==void 0)return await L(t,n=>me(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await L(t,n=>Tf(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function cN(t,e){return await L(t,r=>gf({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:dN(r,e.sender.teamfile,e.receiverTeamfile)}))}function dN(t,e,r){return{teams:[e,r].map(s=>uN(s,t))}}function uN(t,e){let r=Ye(t,e),n=Kt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function mN(t,e){return await L(t,r=>{let n=Q(),s=St(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:vt(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(n&&ve(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:v_(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(n&&ve(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:v_(s.current)})),{acquired:!1,current:s.current})})}async function x_(t,e,r){return await L(t,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(e,r);if(o===null)return null;if(gd(o).live)return o;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(e,r);return s===null?null:gd(s).live?s:null})}function v_(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 fN(t,e,r){try{await L(t,n=>{n.releaseAgentInflight(e,r)})}catch(n){t.stderr.write(`warning: failed to release chat in-flight slot: ${n instanceof Error?n.message:String(n)}
1700
+ `)}function KR(t){return`${t.teamfile}:${t.alias}`}var KH,GR,JR,Oo=k(()=>{"use strict";jt();K();tr();_t();kr();et();KH=60*60*1e3,GR=2e3,JR=5e3});async function Ur(t){let e=t.onEvent??(()=>{}),r=YR(t.io,e),n=null,s=null,i=null,o,a,l=null,c=!1,u=null,f=t.prompt;try{let d=await L(r,N=>he(t.teamfile,t.alias,N));if(t.expectedSession!==void 0&&(d.provider!==t.expectedSession.provider||d.sessionid!==t.expectedSession.sessionid))throw new ie(`session changed for ${d.alias}; expected ${t.expectedSession.provider}:${t.expectedSession.sessionid}, found ${d.provider}:${d.sessionid}`);let m=d.teamfile,g=await L(r,N=>aN(N,t.env??process.env)),y=g.sender,h=await lN(r,{explicitRoot:t.rootFlag,sender:y,receiverTeamfile:m,operatorOrigin:g.origin==="operator"}),p=y===null?null:await cN(r,{rootTeamfile:h,sender:y,receiverTeamfile:m,receiverAlias:d.alias});p!==null&&!p.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
1701
+ `});let _=t.env??process.env,E=await L(r,N=>N.getRootTeam(h)?.name??null);E!==null&&(_.LMBEE_TEAM_NAME=E),i=await eN(r,{receiverTeamfile:m,receiverAlias:d.alias,sender:y,rootTeamfile:h,provider:d.provider,model:d.model,sessionId:d.sessionid,cwd:d.sessiondir,prompt:t.prompt,origin:g.origin,parentInvocationId:nr(_.LMCTL_INVOCATION_ID)}),o=sN(r,i),i!==null&&(_.LMCTL_INVOCATION_ID=String(i));try{sn(r,ae(m),m)}catch{}n={root_teamfile:h,sender_teamfile:y?.teamfile??null,sender_alias:y?.alias??null,receiver_teamfile:m,receiver_alias:d.alias,receiver_provider:d.provider,receiver_session_id:d.sessionid,origin:g.origin,message_type:t.messageType??null,policy:p};let w=await x_(r,m,d.alias);if(w!==null){let N=Fr(w);return Pr(i,n,t.prompt,N,"unavailable"),u=yd(N,null),{status:"busy",message:N,teamChatLogId:null}}let S=!1;if(t.heldLease!==void 0){let N=t.heldLease;if(!await L(r,q=>{let V=q.getAgentInflight(m,d.alias);return V===null||V.sender_teamfile!==N.row.sender_teamfile||V.sender_alias!==N.row.sender_alias||V.started_at!==N.row.started_at||V.holder_pid!==process.pid?!1:q.heartbeatAgentInflight(N.row,N.leaseId,new Date().toISOString())})){let q=`bundle lease lost for ${d.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return Pr(i,n,t.prompt,q,"unavailable"),u=Cs(q,null),{status:"error",errorKind:"provider",message:q,teamChatLogId:null,messageId:null}}}else{let N=await zR(r,m,d.alias);if(N.busy){let P=await QR(r,m,d.alias);return P+=await ZR(r,m,d.alias),Pr(i,n,t.prompt,P,"unavailable"),u=yd(P,null),{status:"busy",message:P,teamChatLogId:null}}S=N.idleReclaim}if(y!==null&&y.teamfile!==m){let N=await L(r,P=>wf(P,{root:h,sender:y,receiverTeamfile:m,receiverAlias:d.alias,now:new Date}));if(N.stop){let P=vf(N.chain);return Pr(i,n,t.prompt,P,"cycle"),u=Cs(P,null),{status:"error",errorKind:"cycle",message:P,teamChatLogId:null,messageId:null}}}if(t.heldLease===void 0){let N=await mN(r,{receiver_teamfile:m,receiver_alias:d.alias,sender_teamfile:y?.teamfile??m,sender_alias:y?.alias??"operator",...S?{force:!0,reclaimReason:"session-idle"}:{}});if(!N.acquired){let P=k_(m,d.alias,N.current);return P+=` ${hd(pd({holderPid:N.current.holder_pid,since:N.current.started_at}))}`,Pr(i,n,t.prompt,P,"unavailable"),u=yd(P,null),{status:"busy",message:P,teamChatLogId:null}}s={row:N.lease,leaseId:N.leaseId},a=ln(P=>L(r,q=>q.heartbeatAgentInflight(s.row,s.leaseId,P)),{intervalMs:b_,onError:P=>{Q()&&ve(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:P instanceof Error?P.message:String(P)}))}})}let T=await w_({sender:y??{teamfile:m,alias:"operator"},receiver:{teamfile:m,alias:d.alias,provider:d.provider,sessionId:d.sessionid,cwd:d.sessiondir,...d.model!==void 0?{model:d.model}:{},...d.effort!==void 0?{effort:d.effort}:{},...d.isLead!==void 0?{isLead:d.isLead}:{}},newMessage:t.prompt,newMessageFrom:y===null?"operator":`${y.teamfile}:${y.alias}`,io:r,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:N=>e({kind:"delta",chunk:N}),onProgress:N=>e({kind:"progress",alias:d.alias,event:N}),onPromptBuilt:async N=>{f=N,l===null&&(l=await pN(r,{...n,message:N}),l!==null&&(t.onAccepted?.(Ft(l)),i!==null&&await nN(r,i,l))),i!==null&&await rN(r,i,N)}});f=T.prompt;let b=T.status==="stalled",v=T.status==="empty",x=null,I=b?`provider stalled${T.stalledAfterMs!==void 0?` after ${T.stalledAfterMs}ms`:""}`:v?"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":T.status==="error"?T.error??T.receipt:n.policy?.outOfPolicy===!0?n.policy.reason:null,R=b||v||T.status==="error"?"error":n.policy?.outOfPolicy===!0?"out_of_policy":"ok";l!==null?(await S_(r,l,{...n,message:f,response:T.receipt,status:R,error_detail:I}),c=!0,x=l):x=await gN(r,{...n,message:f,response:T.receipt,status:R,error_detail:I});let M=T.status!=="error"?T.warnings:void 0;if(b||v){let N=I;Pr(i,n,f,N,"error"),u=Cs(N,x,T.receipt,M)}else u=iN(T.receipt,x,M);return{status:b?"stalled":v?"empty":"ok",replyText:T.receipt,wroteDelta:T.wroteDelta,teamChatLogId:x,messageId:x===null?null:Ft(x),durationMs:T.durationMs}}catch(d){let m=d instanceof Error?d.message:String(d);return l!==null&&!c&&n!==null&&(await S_(r,l,{...n,message:f,response:null,status:"error",error_detail:m}),c=!0),Pr(i,n,f,m,"error"),u=Cs(m,l),{status:"error",errorKind:d instanceof ie?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:Ft(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await hN(r,n,Ft(l)),s!==null&&await fN(r,s.row,s.leaseId),i!==null&&await tN(r,i,u??Cs("chat turn exited without a terminal outcome",null))}}function YR(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}async function zR(t,e,r){let n=await L(t,i=>(mn(i,e,r),Ze(i,e,r)));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await L(t,i=>u_(i,n,e,r));return{busy:!s,idleReclaim:s}}async function QR(t,e,r){let n=await x_(t,e,r);if(n!==null)return Fr(n);let s=await L(t,i=>i.getAgentInflight(e,r));return s!==null?k_(e,r,s):`${r} is busy; wait and retry`}async function ZR(t,e,r){let n=await L(t,s=>s.getAgentInflight(e,r));return n===null?"":` ${hd(pd({holderPid:n.holder_pid,since:n.started_at}))}`}async function eN(t,e){try{return(await L(t,n=>n.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:oN(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(r){return Q()&&ve(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function tN(t,e,r){try{await L(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){Q()&&ve(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function rN(t,e,r){try{await L(t,n=>{n.updateTrackedInvocationRequestPayload(e,r)})}catch(n){Q()&&ve(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:n instanceof Error?n.message:String(n)}))}}async function nN(t,e,r){try{await L(t,n=>{n.linkTrackedInvocationMessage(e,r)})}catch(n){Q()&&ve(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:r,error:n instanceof Error?n.message:String(n)}))}}function sN(t,e){if(e===null)return;let r=setInterval(()=>{L(t,n=>n.heartbeatTrackedInvocation(e)).catch(n=>{Q()&&ve(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:n instanceof Error?n.message:String(n)}))})},b_);return r.unref?.(),r}function I_(t){return t!==void 0&&t.length>0?{config_warnings:JSON.stringify(t)}:{}}function iN(t,e,r){return{status:"done",result_summary:Os(t),error:null,team_chat_log_id:e,...I_(r)}}function yd(t,e){return{status:"busy",result_summary:Os(t),error:t,team_chat_log_id:e}}function Cs(t,e,r,n){return{status:"error",result_summary:Os(r===void 0?t:r),error:t,team_chat_log_id:e,...I_(n)}}function Os(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function oN(t,e,r){return`lmctl prompt ${JSON.stringify(t)} ${e} ${JSON.stringify(r)}`}function aN(t,e){let r=xn(e,t);if(r.ok)return{sender:Wt(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Bt("chat"))}async function lN(t,e){if(e.explicitRoot!==void 0)return await L(t,n=>me(e.explicitRoot,n));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let r=e.sender;return await L(t,n=>Tf(n,{sender:r,now:new Date})??e.receiverTeamfile)}async function cN(t,e){return await L(t,r=>gf({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:dN(r,e.sender.teamfile,e.receiverTeamfile)}))}function dN(t,e,r){return{teams:[e,r].map(s=>uN(s,t))}}function uN(t,e){let r=Ye(t,e),n=Kt(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function mN(t,e){return await L(t,r=>{let n=Q(),s=St(r,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:vt(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(n&&ve(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:v_(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(n&&ve(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:v_(s.current)})),{acquired:!1,current:s.current})})}async function x_(t,e,r){return await L(t,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(e,r);if(o===null)return null;if(gd(o).live)return o;let l=n.getAgentInflight(e,r);if(n.clearTerminalLock(e,r,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(e,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(e,r);return s===null?null:gd(s).live?s:null})}function v_(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 fN(t,e,r){try{await L(t,n=>{n.releaseAgentInflight(e,r)})}catch(n){t.stderr.write(`warning: failed to release chat in-flight slot: ${n instanceof Error?n.message:String(n)}
1702
1702
  `)}}function k_(t,e,r){return`${e} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function pN(t,e){let r=Ms(e.message);try{return await L(t,n=>n.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:r.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:r.truncated?1:0,message_type:e.message_type??null,created_at:new Date().toISOString()}))}catch(n){return t.stderr.write(`warning: failed to begin chat log: ${n instanceof Error?n.message:String(n)}
1703
1703
  `),null}}async function S_(t,e,r){let n=Ms(r.message),s=r.response===null?null:Ms(r.response);try{await L(t,i=>i.finishTeamChatLog(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,receiver_provider:r.receiver_provider,receiver_session_id:r.receiver_session_id,provider_prompt:r.message,message:n.text,response:s?.text??null,origin:r.origin,status:r.status,error_detail:r.error_detail,truncated:n.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)}
1704
1704
  `)}}async function hN(t,e,r){if(e!==null)try{await L(t,n=>{n.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,r)})}catch(n){t.stderr.write(`warning: failed to clear chat causal pointer: ${n instanceof Error?n.message:String(n)}
@@ -1707,14 +1707,14 @@ ${qR(t)}`}function xn(t,e){let r=_d(t,e);return r.ok?{ok:!0,identity:r.identity,
1707
1707
  ${r.map((s,i)=>` ${i+1}) ${s}`).join(`
1708
1708
  `)}
1709
1709
  `);;){let s=await this.ask("Choose a number or exact value: "),i=r.filter(o=>o.toLowerCase()===s.toLowerCase());if(i.length===1)return i[0];if(/^[1-9]\d*$/.test(s)&&Number(s)<=r.length)return r[Number(s)-1];this.io.stderr.write(`Choose one of the listed values.
1710
- `)}}close(){this.rl?.close()}}});function Do(t){return/\S\s+\S/u.test(t)}function R_(t){let[e,...r]=t;if(!e||e.startsWith("-"))return null;if(r.some(i=>["--force","-f","--yes","-y"].includes(i)))throw new Error("Force/yes flags are not allowed in inferred mode; destructive changes require confirmation.");if(r.some(i=>i.startsWith("-")&&!Do(i)))throw new Error("Use an explicit command for options; no inferred action was taken.");if(/\.lmb$/i.test(e))return{kind:"batch",file:e,rest:r};let n=Yt(e)??(e.endsWith(":")&&Ce(e.slice(0,-1))?{teamfile:e.slice(0,-1),alias:""}:null);if(n||Ce(e)){let i=n?.teamfile??e,o=n?.alias,a=[...r];return!o&&a.length&&!Do(a[0])&&(o=a.shift()),{kind:"team",file:i,...o!==void 0?{alias:o}:{},...a.length?a.some(Do)?{prompt:a.join(" ")}:{pendingPrompt:a.join(" ")}:{}}}let s=r.length?r.some(Do)?{prompt:r.join(" ")}:{pendingPrompt:r.join(" ")}:{};return qn(e)?{kind:"session",id:e,...s}:{kind:"models",query:e,...s}}function $o(t,e){let r=t.toLowerCase(),n=e.filter(s=>s.toLowerCase()===r);return[...new Set(n.length?n:e.filter(s=>s.toLowerCase().startsWith(r)))]}var N_=k(()=>{"use strict";Ae();Oe()});import{mkdirSync as P_,readFileSync as _N,renameSync as yN,writeFileSync as EN,existsSync as U_}from"node:fs";import{homedir as wN}from"node:os";import{dirname as j_,join as Fo,resolve as Po}from"node:path";import{fileURLToPath as TN}from"node:url";function xN(){return Fo(wN(),".lmctl","cache","lmprice")}function An(t,e){return Fo(t,e)}function Br(t){try{return JSON.parse(_N(t,"utf-8"))}catch{return null}}function W_(t,e){let r=`${t}.tmp-${process.pid}`;EN(r,e),yN(r,t)}function wd(t){return t===null||typeof t=="number"}function Uo(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(r=>{if(typeof r!="object"||r===null)return!1;let n=r;if(typeof n.source!="string"||typeof n.source_model_id!="string"||typeof n.pricing!="object"||n.pricing===null)return!1;let s=n.pricing;return wd(s.input_per_1m_tokens)&&wd(s.output_per_1m_tokens)&&wd(s.input_cache_read_per_1m_tokens)})}function jo(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 r=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")}),n=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"&&AN.has(i.evidence)});return r&&n}function RN(t){let e=Br(An(t,B_)),r={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},n={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=Br(An(t,kN));s&&(r.etag=typeof s.etag=="string"?s.etag:null,r.last_checked=typeof s.fetchedAt=="string"?s.fetchedAt:null)}return{model_list:r,aliases:n}}function NN(t){let e=RN(t),r=Br(An(t,Td)),n=Br(An(t,vd));return{catalog:Uo(r)?r:null,aliases:jo(n)?n:null,meta:e}}function LN(t,e){try{P_(t,{recursive:!0}),W_(An(t,B_),JSON.stringify(e))}catch{}}function C_(t,e,r){try{P_(t,{recursive:!0}),W_(An(t,e),JSON.stringify(r))}catch{}}function CN(t,e){let r=ON(t),n=r?[Po(r,"data",e)]:[Po(t,"..","..","data",e)];for(let s of n)if(U_(s))return s;return null}function ON(t){let e=Po(t);for(;;){if(U_(Po(e,"package.json")))return e;let r=j_(e);if(r===e)return null;e=r}}function O_(t,e,r){let n=r!==void 0?r:CN(t,e);return n===null?null:Br(n)}function MN(){let t=process.env.LMCTL_PRICE_TTL;if(t===void 0||t==="")return L_;let e=Number(t);return!Number.isFinite(e)||e<0?L_:e*1e3}function DN(){let t=process.env.LMCTL_PRICE_DATA;return t!==void 0&&t!==""?t:null}async function M_(t,e,r,n){try{let s=await t(e,{method:"HEAD",signal:AbortSignal.timeout(bN)});if(!s.ok)return{kind:"failed"};let i=s.headers.get("etag");if(r!==null&&i!==null&&i===n)return{kind:"match"};let o=await t(e,{signal:AbortSignal.timeout(IN)});return o.ok?{kind:"payload",payload:await o.json(),etag:o.headers.get("etag")??i}:{kind:"failed"}}catch{return{kind:"failed"}}}function Ht(t={}){return Object.keys(t).length===0?(D_??=$_(t),D_):$_(t)}async function $_(t){let e=j_(TN(import.meta.url)),r=t.pinDir!==void 0?t.pinDir:DN();if(r!==null&&r!==""){let h=Br(Fo(r,Td)),y=Br(Fo(r,vd));if(Uo(h)&&jo(y)){let g={catalog:h,aliases:y,source:"pinned",generatedAt:h.generated_at??null};return Sd=g.generatedAt,g}return F_(t,e)}let n=t.fetchImpl??fetch,s=t.cacheDir??xN(),i=t.now??Date.now(),o=t.ttlMs??MN(),a=NN(s),l=(h,y)=>h!==null&&y.last_checked!==null&&i-Date.parse(y.last_checked)<o,c=a.catalog,u=a.aliases,f=!1,d={model_list:{...a.meta.model_list},aliases:{...a.meta.aliases}},m=!1;if(!l(c,a.meta.model_list)){let h=await M_(n,vN,c,a.meta.model_list.etag);h.kind==="match"?(d.model_list.last_checked=new Date(i).toISOString(),m=!0):h.kind==="payload"&&(d.model_list.last_checked=new Date(i).toISOString(),m=!0,Uo(h.payload)&&(c=h.payload,h.etag!==null&&(d.model_list.etag=h.etag),C_(s,Td,c),f=!0))}if(!l(u,a.meta.aliases)){let h=await M_(n,SN,u,a.meta.aliases.etag);h.kind==="match"?(d.aliases.last_checked=new Date(i).toISOString(),m=!0):h.kind==="payload"&&(d.aliases.last_checked=new Date(i).toISOString(),m=!0,jo(h.payload)&&(u=h.payload,h.etag!==null&&(d.aliases.etag=h.etag),C_(s,vd,u),f=!0))}if((m||f)&&LN(s,d),c!==null||u!==null){let h={catalog:c,aliases:u,source:f?"network":"cache",generatedAt:c?.generated_at??null};return Sd=h.generatedAt,h}return F_(t,e)}function F_(t,e){let r=O_(e,"price-data.json",t.bundledPath),n=O_(e,"price-aliases.json",t.bundledAliasesPath),s=Uo(r)?r:null,i=jo(n)?n:null,o={catalog:s,aliases:i,source:s!==null||i!==null?"bundled":"unavailable",generatedAt:s?.generated_at??null};return Sd=o.generatedAt,o}function H_(t,e){if(e===null)return null;let{input_per_1m_tokens:r,output_per_1m_tokens:n,input_cache_read_per_1m_tokens:s}=e;if(r===null||n===null)return null;let i=s??r,o=t.input/1e6*r+t.output/1e6*n+t.cachedInput/1e6*i;return Number(o.toPrecision(10))}var vN,SN,bN,IN,L_,Td,vd,B_,kN,AN,Sd,D_,Ds=k(()=>{"use strict";vN="https://lmctl.com/dataset/model_list.json",SN="https://lmctl.com/dataset/aliases.json",bN=1e3,IN=1e4,L_=6*60*60*1e3;Td="model_list.json",vd="aliases.json",B_="meta.json",kN="model_list.meta.json";AN=new Set(["established","asserted","unresolved"]);Sd=null,D_=null});function Hr(t){return t.toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function Wr(t){let e=t.source_model_id.toLowerCase(),r=e.slice(e.lastIndexOf("/")+1);return Hr(r)}function q_(t){let e=new Set,r=n=>{let s=n.toLowerCase().split("/");for(let i=0;i<s.length;i+=1)e.add(Hr(s.slice(i).join("/")))};return r(t.source_model_id),t.gateway_id&&r(t.gateway_id),e}function $N(t,e){let r=new Set,n=l=>{r.add(Hr(l))},s=t.trim().toLowerCase(),i=null,o=s.indexOf(":");o>0&&!s.slice(0,o).includes("/")&&(i=s.slice(0,o),n(s),s=s.slice(o+1)),n(s);let a=s.slice(s.lastIndexOf("/")+1);n(a);for(let l of e)n(`${l}/${a}`);return i!==null&&n(`${i}/${a}`),[...r]}function Rn(t){let e=n=>!(n.mode!==void 0&&n.mode!==null&&n.mode!=="chat"||t.nonChatName&&t.nonChatName.test(n.source_model_id.toLowerCase())),r=n=>e(n)&&t.family.test(n.source_model_id.toLowerCase());return{firstPartyProviders:t.firstPartyProviders,isChatModel:e,coversRecord:r,normalize:n=>$N(n,t.vendorPrefixes),matchRow(n,s){if(!r(n))return!1;let i=q_(n);return s.some(o=>i.has(o))}}}function PN(t){let e=t.trim(),r=FN.exec(e);return r?{model:e.slice(0,r.index).trim(),effort:r[1].trim()}:{model:e,effort:null}}function WN(t,e,r){let n=e.trim().toLowerCase(),s=Hr(n);if(r.records.some(o=>o.source_model_id.toLowerCase()===n&&t.matchRow(o,[s])))return!0;let i=t.normalize(e);return i.length>0&&r.records.some(o=>t.matchRow(o,i))}function HN(t,e,r){let n=[];for(let[s,i]of Object.entries(hr))s!==r&&WN(i,t,e)&&n.push(s);return n}function Bo(t){return t==="moonshot"?0:t==="litellm"?1:t==="openrouter"?2:t==="manual"?3:4}function XN(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}function qN(t){let e=new Map,r=[];for(let n of t){let s=n.source_model_id.toLowerCase(),i=s.lastIndexOf("/"),o=i===-1?"":s.slice(0,i+1),a=i===-1?s:s.slice(i+1),l=`${n.source}:${o}${Hr(a)}`,c=e.get(l);if(c===void 0){e.set(l,n);continue}if(!XN(c.pricing,n.pricing)){r.push(n);continue}/\d\.\d/.test(c.source_model_id)&&!/\d\.\d/.test(n.source_model_id)&&e.set(l,n)}return[...e.values(),...r]}function GN(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 Q_(t,e){return t.map(GN).sort((r,n)=>{let s=Bo(r.source)-Bo(n.source);if(s!==0)return s;let i=r.provider!==null&&e.includes(r.provider)?0:1,o=n.provider!==null&&e.includes(n.provider)?0:1;return i!==o?i-o:r.sourceModelId.localeCompare(n.sourceModelId)})}function bd(t){return t.pricing.input_per_1m_tokens!==null&&t.pricing.output_per_1m_tokens!==null}function JN(t,e,r){let n=qN(t),s=Q_(n,r),o=n.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 Id(t,e,r){if(t.length===0)return{kind:"known-unpriced",id:e};let n=JN(t,e,r),s=n.offers.find(bd);return s===void 0?{kind:"known-unpriced",id:e}:s.estimated?{kind:"estimated",model:n}:{kind:"priced",model:n}}function VN(t,e){return t.standards.find(r=>r.standard_slug.toLowerCase()===e.toLowerCase())??null}function KN(t,e,r){let n=t.standard_slug;if(e===null||e.catalog_record_id===null)return{kind:"known-unpriced",id:n};let s=e.catalog_record_id.toLowerCase(),i=r.records.find(l=>(l.record_id??`${l.source}:${l.source_model_id}`).toLowerCase()===s);if(!i)return{kind:"known-unpriced",id:n};let o=Wr(i),a=r.records.filter(l=>Wr(l)!==o?!1:l.mode===void 0||l.mode===null||l.mode==="chat");return a.length===0?{kind:"known-unpriced",id:n}:Id(a,o,xd)}function Z_(t,e,r,n){if(r===null||!Array.isArray(r.records))return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};if(n!==null){let y=[e.trim().toLowerCase()];y.push(`${t.toLowerCase()}/${y[0]}`);let g=n.aliases.find(p=>y.includes(p.alias.toLowerCase()));if(g){if(g.evidence==="unresolved"||g.standard_slug===null)return{state:{kind:"unresolved",alias:g.alias},viaAlias:!0,pinRoute:null};let p=VN(n,g.standard_slug);return{state:KN(g,p,r),viaAlias:!0,pinRoute:p?.catalog_record_id?.toLowerCase()??null}}}let s=hr[t];if(!s)return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};let i=e.trim().toLowerCase(),o=s.normalize(e),a=y=>({state:y,viaAlias:!1,pinRoute:null}),l=Hr(i),c=r.records.filter(y=>y.source_model_id.toLowerCase()===i&&s.matchRow(y,[l]));if(c.length>0){let y=Wr(c[0]),g=r.records.filter(p=>s.matchRow(p,[y])&&Wr(p)===y);return a(Id(g.length>0?g:c,y,X_[t]??xd))}let u=r.records.filter(y=>s.matchRow(y,o));if(u.length===0){let y=HN(e,r,t);return y.length>0?a({kind:"wrong-provider",declared:e,otherProviders:y}):a({kind:"unknown",declared:e})}let f=new Map;for(let y of u){let g=Wr(y),p=f.get(g);p?p.push(y):f.set(g,[y])}let d=X_[t]??xd,m=null,h=null;for(let y of f.values()){let g=Q_(y,d);(h===null||YN(g[0],h[0],d)<0)&&(m=y,h=g)}return a(Id(m,Wr(m[0]),d))}function Wo(t,e,r,n){return Z_(t,e,r,n).state}function Ho(t,e,r,n){let{state:s,viaAlias:i,pinRoute:o}=Z_(t,e,r,n);if(s.kind!=="priced"&&s.kind!=="estimated")return{state:s,offer:null,provenance:null};let a=s.model.offers;if(i&&o!==null){let c=a.find(u=>u.route.toLowerCase()===o);if(c!==void 0&&bd(c))return{state:s,offer:c,provenance:"alias-pin"}}let l=a.find(bd)??null;return{state:s,offer:l,provenance:i&&o!==null?"alias-pin":"route-preference"}}function ey(t,e){let r=hr[e];if(!r)return null;let n=new Set;for(let s of t.records)r.coversRecord(s)&&n.add(Wr(s));return n.size}function YN(t,e,r){let n=Bo(t.source)-Bo(e.source);if(n!==0)return n;let s=t.provider!==null&&r.includes(t.provider)?0:1,i=e.provider!==null&&r.includes(e.provider)?0:1;return s!==i?s-i:t.sourceModelId.localeCompare(e.sourceModelId)}var G_,J_,V_,K_,Y_,z_,FN,UN,jN,BN,hr,X_,xd,$s=k(()=>{"use strict";G_=Rn({vendorPrefixes:["anthropic"],family:/claude/,firstPartyProviders:["anthropic"]}),J_=Rn({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)(-|$)/}),V_=Rn({vendorPrefixes:["google","gemini"],family:/gemini|gemma/,firstPartyProviders:["gemini","google","vertex_ai-language-models"],nonChatName:/embedding|imagen|-image|tts|audio|veo|lyria|live|realtime|video/}),K_=Rn({vendorPrefixes:["moonshot","moonshotai"],family:/kimi|moonshot/,firstPartyProviders:["moonshot"]}),Y_=Rn({vendorPrefixes:["dashscope","qwen"],family:/qwen/,firstPartyProviders:["dashscope"]}),z_=Rn({vendorPrefixes:["deepseek","nousresearch"],family:/deepseek|nous|hermes-\d/,firstPartyProviders:["deepseek","nousresearch"]}),FN=/\s*\(([^()]+)\)\s*$/;UN={"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"},jN=["gemini","google","vertex_ai-language-models","anthropic"],BN={normalize(t){let{model:e}=PN(t),r=UN[e.toLowerCase()];return r===void 0?[]:[Hr(r)]},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 r=q_(t);return e.some(n=>r.has(n))}},hr={claude:G_,codex:J_,gemini:V_,agy:BN,kimi:K_,qwen:Y_,hermes:z_},X_={claude:G_.firstPartyProviders,codex:J_.firstPartyProviders,gemini:V_.firstPartyProviders,agy:jN,kimi:K_.firstPartyProviders,qwen:Y_.firstPartyProviders,hermes:z_.firstPartyProviders};xd=[]});import{spawnSync as Cd}from"node:child_process";import{existsSync as ry,readFileSync as ny}from"node:fs";import{homedir as sy}from"node:os";import{resolve as Nd}from"node:path";function Nn(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 eL(){let t=Cd("agy",["models"],{encoding:"utf-8",timeout:ZN});return{status:t.status,stdout:t.stdout??"",error:t.error}}function tL(t){let e=[];for(let r of t.split(/\r?\n/)){let n=r.trim(),s=n.indexOf(" ");if(s<0)continue;let i=n.slice(s+1).trim();i&&e.push(i)}return e}function Ps(t){if(!t&&kd)return kd;let e=s=>(t||(kd=s),s),r;try{r=(t??eL)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?Nn("agy models",s):`agy models could not be run: ${String(s)}`})}if(r.error)return e({available:!1,models:[],reason:Nn("agy models",r.error)});if(r.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${r.status??"unknown"}`});let n=tL(r.stdout);return n.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:n})}function nL(){let t=Cd("codex",["debug","models"],{encoding:"utf-8",timeout:rL});return{status:t.status,stdout:t.stdout??"",error:t.error}}function sL(t){let e;try{e=JSON.parse(t)}catch{return}let r=e.models;if(!Array.isArray(r))return;let n=[];for(let s of r){if(!s||typeof s!="object")continue;let{slug:i,visibility:o}=s;typeof i=="string"&&o==="list"&&n.push(i)}return n}function Us(t){if(!t&&Ad)return Ad;let e=s=>(t||(Ad=s),s),r;try{r=(t??nL)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?Nn("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(r.error)return e({available:!1,models:[],reason:Nn("codex debug models",r.error)});if(r.status!==0)return e({available:!1,models:[],reason:`codex debug models exited with status ${r.status??"unknown"}`});let n=sL(r.stdout);return n===void 0?e({available:!1,models:[],reason:"codex debug models did not return parseable JSON"}):n.length===0?e({available:!1,models:[],reason:"codex debug models returned no user-visible models"}):e({available:!0,models:n})}function oL(t){let e=Cd("opencode",t?["models",t]:["models"],{encoding:"utf-8",timeout:iL});return{status:e.status,stdout:e.stdout??"",error:e.error}}function Od(t,e){if(!e&&Rd.has(t))return Rd.get(t);let r=o=>(e||Rd.set(t,o),o),n=t?`opencode models ${t}`:"opencode models",s;try{s=(e??oL)(t)}catch(o){return r({available:!1,models:[],reason:o instanceof Error?Nn(n,o):`${n} could not be run: ${String(o)}`})}if(s.error)return r({available:!1,models:[],reason:Nn(n,s.error)});if(s.status!==0)return r({available:!1,models:[],reason:`${n} 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?r({available:!1,models:[],reason:`${n} returned no models`}):r({available:!0,models:i})}function Md(t,e={}){let r=[];for(let n of t){let s=n.provider.trim().toLowerCase();if(n.effort&&s!=="opencode"&&s!=="lmplayer"&&s!=="qwen"&&r.push(`[${n.alias}] effort="${n.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),s==="qwen"&&n.effort&&r.push(`[${n.alias}] effort="${n.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),!n.model&&QN.has(s)&&r.push(`[${n.alias}] provider=${s} has no model= \u2014 ${s} will use its own ambient default, which cannot be linted or priced and may not be the intended one. Set model= explicitly.`),s==="copilot"){if(!n.model)continue;r.push(`[${n.alias}] model="${n.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(s==="lmplayer"&&!n.model){r.push(`[${n.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.5).`);continue}if(s!=="lmplayer"){if(s==="opencode"){if(n.effort&&!n.model&&r.push(`[${n.alias}] effort="${n.effort}" has no effect without model= on an opencode member.`),!n.model){r.push(`[${n.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.5).`);continue}let i=lL(e.opencodeConfigPath);if(!i.available){r.push(`[${n.alias}] model="${n.model}" cannot be verified for opencode: ${i.reason}.`);continue}if(i.models.includes(n.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(n.model))continue;if(!n.model.includes("/")){let l=i.models.filter(c=>c.endsWith(`/${n.model}`));r.push(l.length>0?`[${n.alias}] model="${n.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${n.alias}] model="${n.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${n.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}let o=n.model.slice(0,n.model.indexOf("/")),a=Od(o,e.opencodeModelsRunner);if(a.available&&a.models.includes(n.model))continue;if(a.available&&!a.models.includes(n.model)){r.push(`[${n.alias}] model="${n.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}r.push(`[${n.alias}] model="${n.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(!n.model)continue;let i=js(e.kimiConfigPath);i.available?i.models.includes(n.model)||r.push(`[${n.alias}] model="${n.model}" is not declared in Kimi's [models] config. Valid configured models: ${Fs(i.models)}`):r.push(`[${n.alias}] model="${n.model}" cannot be verified for kimi: ${i.reason}.`);continue}if(s==="agy"){if(!n.model)continue;let i=Ps(e.agyModelsRunner);i.available?i.models.includes(n.model)||r.push(`[${n.alias}] model="${n.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${Fs(i.models)}`):r.push(`[${n.alias}] model="${n.model}" cannot be verified for agy: ${i.reason}.`);continue}if(s==="dsh"){if(!n.model||Go.includes(n.model))continue;qo.includes(n.model)||r.push(`[${n.alias}] model="${n.model}" is not in dsh's built-in catalog. Valid pinned models: ${Fs(qo)}. 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): ${Fs(Go)}. 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(!n.model)continue;let i=n.model.indexOf(":");(i<=0||i===n.model.length-1)&&r.push(`[${n.alias}] model="${n.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(!n.model)continue;n.model===ty&&r.push(`[${n.alias}] model="${ty}" 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=Us(e.codexModelsRunner);if(!i.available){r.push(`[${n.alias}] model="${n.model}" cannot be verified for codex: ${i.reason}.`);continue}i.models.includes(n.model)||r.push(`[${n.alias}] model="${n.model}" is not in codex's live model catalog (\`codex debug models\`). Valid models: ${Fs(i.models)}`);continue}n.model&&(iy.has(s)||r.push(`[${n.alias}] model="${n.model}" cannot be verified for provider "${s}": no model validation path exists for this provider.`))}}}return r}async function oy(t,e={}){let r=t.filter(o=>o.model!==void 0&&iy.has(o.provider.trim().toLowerCase()));if(r.length===0)return{warnings:[],errors:[]};let n=e.snapshot??await Ht();if(n.catalog===null)return{warnings:[],errors:[]};let s=[],i=[];for(let o of r){let a=o.provider.trim().toLowerCase(),l=o.model,c=Wo(a,l,n.catalog,n.aliases);if(c.kind==="unknown"){let u=ey(n.catalog,a)??0;s.push(`[${o.alias}] model "${l}" is unknown to the lmprice catalog for provider "${a}" (${u} 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")&&zN.test(l)){let u=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="${u}" instead.`)}}return{warnings:s,errors:i}}async function ay(t,e={}){return(await oy(t,e)).warnings}async function ly(t,e={}){return(await oy(t,e)).errors}function js(t){let e=process.env.KIMI_CODE_HOME||Nd(sy(),".kimi-code"),r=t??Nd(e,"config.toml");if(!ry(r))return{available:!1,models:[],reason:`${r} not found`};let n;try{n=ny(r,"utf-8")}catch(i){return{available:!1,models:[],reason:`${r} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of n.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${r} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=aL(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${r} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${r} has no [models] entries`}:{available:!0,models:[...s].sort()}}function aL(t){let e=[],r=0;for(;r<t.length;){for(;/\s/.test(t[r]??"");)r++;if(r>=t.length)break;let n="",s=t[r]==='"'||t[r]==="'"?t[r++]:void 0;if(s){for(;r<t.length&&t[r]!==s;)s==='"'&&t[r]==="\\"&&r+1<t.length&&r++,n+=t[r++];if(t[r]!==s)return null;r++}else{for(;r<t.length&&t[r]!==".";)n+=t[r++];n=n.trim()}if(!n)return null;for(e.push(n);/\s/.test(t[r]??"");)r++;if(r>=t.length)break;if(t[r]!==".")return null;r++}return e.length>0?e:null}function lL(t){let e=t??Nd(sy(),".config","opencode","opencode.json");if(!ry(e))return{available:!0,models:[]};let r;try{r=JSON.parse(ny(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:cL(r)}}function cL(t){if(!Ld(t))return[];let e=Xo(t.provider)??Xo(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Ld(s))continue;let i=Xo(s.models)??Xo(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Xo(t){return Ld(t)?t:null}function Ld(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Fs(t){return t.length>0?t.join(", "):"(none)"}var iy,zN,QN,qo,Go,ty,ZN,kd,rL,Ad,iL,Rd,Jo=k(()=>{"use strict";Ds();$s();iy=new Set(Object.keys(hr).filter(t=>t!=="codex"&&t!=="kimi")),zN=/\d\.(?=\d)/,QN=new Set(["claude","codex","gemini","qwen","kimi","agy"]),qo=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],Go=["deepseek-flash","deepseek-pro"],ty="gpt-5.3-codex-spark",ZN=15e3;kd=null;rL=5e3;Ad=null;iL=5e3;Rd=new Map});function Vo(t){return["agy","opencode","copilot","hermes","pi","lmplayer"].includes(t)}function cy(t){if(!/(?:^|[/:])(?:gpt-|o\d(?:-|$)|chatgpt-|claude[ -]|gemini[ -])/i.test(t))return!1;let e=/claude/i.test(t)?"claude":/gemini/i.test(t)?"gemini":"codex";return hr[e].isChatModel({source:"",source_model_id:t,pricing:{input_per_1m_tokens:null,output_per_1m_tokens:null,input_cache_read_per_1m_tokens:null}})}function Dd(t,e){let r=[];for(let n of e.records){let s=n.source_model_id,i;if(t==="copilot")n.provider==="github_copilot"&&s.startsWith("github_copilot/")&&(i=s.slice(15));else if(["hermes","pi","lmplayer"].includes(t))n.source==="openrouter"&&/^(openai|anthropic|google)\//.test(s)&&(i=t==="hermes"?`openrouter:${s}`:t==="pi"?`openrouter/${s}`:s);else{let o={claude:"anthropic",gemini:"gemini",qwen:"dashscope"}[t],a=hr[t];if(o&&n.source==="litellm"&&n.provider===o&&a?.coversRecord(n)){i=s.startsWith(`${o}/`)?s.slice(o.length+1):s;let l=t==="claude"?"claude-":t==="gemini"?"gemini-":"qwen";(i.includes("/")||!i.startsWith(l))&&(i=void 0)}}!i||n.mode!=null&&n.mode!=="chat"||i.includes(":batch")||i.includes(":free")||Vo(t)&&!cy(i)||r.push(i)}return[...new Set(r)].sort()}async function Bs(t){let e;switch(t){case"dsh":e=[...Go,...qo];break;case"codex":e=Us().models;break;case"agy":e=Ps().models;break;case"kimi":e=js().models;break;case"opencode":e=Od("").models;break;default:{let{catalog:r}=await Ht();e=r?Dd(t,r):[]}}return[...new Set(e.filter(r=>!Vo(t)||cy(r)))].sort()}var $d=k(()=>{"use strict";Ds();$s();Jo()});var my={};se(my,{MODEL_PROVIDERS:()=>Xt,knownModelNames:()=>Ln,runModel:()=>Ko});function uy(t,e){switch(t){case"codex":return Us();case"agy":return Ps();case"kimi":return js();case"claude":{let r=e.catalog?Dd(t,e.catalog):[];return r.length>0?{available:!0,models:r}:{available:!1,models:[],reason:"No first-party Claude models in the available catalog"}}default:return{available:!1,models:[],reason:"Model list unavailable"}}}async function Ln(t){if(!Xt.includes(t))return Bs(t);let e=t==="claude"?await Ht():{catalog:null,aliases:null,source:"unavailable",generatedAt:null};return uy(t,e).models}function uL(t,e,r){let{state:n,offer:s,provenance:i}=Ho(t,e,r.catalog,r.aliases);return{model:e,pricing:{input_per_1m_tokens:s?.pricing.input_per_1m_tokens??null,output_per_1m_tokens:s?.pricing.output_per_1m_tokens??null,input_cache_read_per_1m_tokens:s?.pricing.input_cache_read_per_1m_tokens??null},price_resolution:n.kind,price_source:s?.source??null,price_source_model_id:s?.sourceModelId??null,price_provenance:i,price_estimated:s?.estimated??!1}}async function Ko(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(dy),0;let n=oe(t,[],["--json"]),s=n.positionals.find(m=>m!=="all"&&!Xt.includes(m)),i=n.error??(s===void 0?void 0:`unknown provider: ${s} (valid targets: all, ${Xt.join(", ")})`);if(i!==void 0)return e.stderr.write(`error: ${i}
1710
+ `)}}close(){this.rl?.close()}}});function Do(t){return/\S\s+\S/u.test(t)}function R_(t){let[e,...r]=t;if(!e||e.startsWith("-"))return null;if(r.some(i=>["--force","-f","--yes","-y"].includes(i)))throw new Error("Force/yes flags are not allowed in inferred mode; destructive changes require confirmation.");if(r.some(i=>i.startsWith("-")&&!Do(i)))throw new Error("Use an explicit command for options; no inferred action was taken.");if(/\.lmb$/i.test(e))return{kind:"batch",file:e,rest:r};let n=Yt(e)??(e.endsWith(":")&&Ce(e.slice(0,-1))?{teamfile:e.slice(0,-1),alias:""}:null);if(n||Ce(e)){let i=n?.teamfile??e,o=n?.alias,a=[...r];return!o&&a.length&&!Do(a[0])&&(o=a.shift()),{kind:"team",file:i,...o!==void 0?{alias:o}:{},...a.length?a.some(Do)?{prompt:a.join(" ")}:{pendingPrompt:a.join(" ")}:{}}}let s=r.length?r.some(Do)?{prompt:r.join(" ")}:{pendingPrompt:r.join(" ")}:{};return qn(e)?{kind:"session",id:e,...s}:{kind:"models",query:e,...s}}function $o(t,e){let r=t.toLowerCase(),n=e.filter(s=>s.toLowerCase()===r);return[...new Set(n.length?n:e.filter(s=>s.toLowerCase().startsWith(r)))]}var N_=k(()=>{"use strict";Ae();Oe()});import{mkdirSync as P_,readFileSync as _N,renameSync as yN,writeFileSync as EN,existsSync as U_}from"node:fs";import{homedir as wN}from"node:os";import{dirname as j_,join as Fo,resolve as Po}from"node:path";import{fileURLToPath as TN}from"node:url";function xN(){return Fo(wN(),".lmctl","cache","lmprice")}function An(t,e){return Fo(t,e)}function Br(t){try{return JSON.parse(_N(t,"utf-8"))}catch{return null}}function W_(t,e){let r=`${t}.tmp-${process.pid}`;EN(r,e),yN(r,t)}function wd(t){return t===null||typeof t=="number"}function Uo(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(r=>{if(typeof r!="object"||r===null)return!1;let n=r;if(typeof n.source!="string"||typeof n.source_model_id!="string"||typeof n.pricing!="object"||n.pricing===null)return!1;let s=n.pricing;return wd(s.input_per_1m_tokens)&&wd(s.output_per_1m_tokens)&&wd(s.input_cache_read_per_1m_tokens)})}function jo(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 r=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")}),n=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"&&AN.has(i.evidence)});return r&&n}function RN(t){let e=Br(An(t,B_)),r={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},n={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=Br(An(t,kN));s&&(r.etag=typeof s.etag=="string"?s.etag:null,r.last_checked=typeof s.fetchedAt=="string"?s.fetchedAt:null)}return{model_list:r,aliases:n}}function NN(t){let e=RN(t),r=Br(An(t,Td)),n=Br(An(t,vd));return{catalog:Uo(r)?r:null,aliases:jo(n)?n:null,meta:e}}function LN(t,e){try{P_(t,{recursive:!0}),W_(An(t,B_),JSON.stringify(e))}catch{}}function C_(t,e,r){try{P_(t,{recursive:!0}),W_(An(t,e),JSON.stringify(r))}catch{}}function CN(t,e){let r=ON(t),n=r?[Po(r,"data",e)]:[Po(t,"..","..","data",e)];for(let s of n)if(U_(s))return s;return null}function ON(t){let e=Po(t);for(;;){if(U_(Po(e,"package.json")))return e;let r=j_(e);if(r===e)return null;e=r}}function O_(t,e,r){let n=r!==void 0?r:CN(t,e);return n===null?null:Br(n)}function MN(){let t=process.env.LMCTL_PRICE_TTL;if(t===void 0||t==="")return L_;let e=Number(t);return!Number.isFinite(e)||e<0?L_:e*1e3}function DN(){let t=process.env.LMCTL_PRICE_DATA;return t!==void 0&&t!==""?t:null}async function M_(t,e,r,n){try{let s=await t(e,{method:"HEAD",signal:AbortSignal.timeout(bN)});if(!s.ok)return{kind:"failed"};let i=s.headers.get("etag");if(r!==null&&i!==null&&i===n)return{kind:"match"};let o=await t(e,{signal:AbortSignal.timeout(IN)});return o.ok?{kind:"payload",payload:await o.json(),etag:o.headers.get("etag")??i}:{kind:"failed"}}catch{return{kind:"failed"}}}function Ht(t={}){return Object.keys(t).length===0?(D_??=$_(t),D_):$_(t)}async function $_(t){let e=j_(TN(import.meta.url)),r=t.pinDir!==void 0?t.pinDir:DN();if(r!==null&&r!==""){let g=Br(Fo(r,Td)),y=Br(Fo(r,vd));if(Uo(g)&&jo(y)){let h={catalog:g,aliases:y,source:"pinned",generatedAt:g.generated_at??null};return Sd=h.generatedAt,h}return F_(t,e)}let n=t.fetchImpl??fetch,s=t.cacheDir??xN(),i=t.now??Date.now(),o=t.ttlMs??MN(),a=NN(s),l=(g,y)=>g!==null&&y.last_checked!==null&&i-Date.parse(y.last_checked)<o,c=a.catalog,u=a.aliases,f=!1,d={model_list:{...a.meta.model_list},aliases:{...a.meta.aliases}},m=!1;if(!l(c,a.meta.model_list)){let g=await M_(n,vN,c,a.meta.model_list.etag);g.kind==="match"?(d.model_list.last_checked=new Date(i).toISOString(),m=!0):g.kind==="payload"&&(d.model_list.last_checked=new Date(i).toISOString(),m=!0,Uo(g.payload)&&(c=g.payload,g.etag!==null&&(d.model_list.etag=g.etag),C_(s,Td,c),f=!0))}if(!l(u,a.meta.aliases)){let g=await M_(n,SN,u,a.meta.aliases.etag);g.kind==="match"?(d.aliases.last_checked=new Date(i).toISOString(),m=!0):g.kind==="payload"&&(d.aliases.last_checked=new Date(i).toISOString(),m=!0,jo(g.payload)&&(u=g.payload,g.etag!==null&&(d.aliases.etag=g.etag),C_(s,vd,u),f=!0))}if((m||f)&&LN(s,d),c!==null||u!==null){let g={catalog:c,aliases:u,source:f?"network":"cache",generatedAt:c?.generated_at??null};return Sd=g.generatedAt,g}return F_(t,e)}function F_(t,e){let r=O_(e,"price-data.json",t.bundledPath),n=O_(e,"price-aliases.json",t.bundledAliasesPath),s=Uo(r)?r:null,i=jo(n)?n:null,o={catalog:s,aliases:i,source:s!==null||i!==null?"bundled":"unavailable",generatedAt:s?.generated_at??null};return Sd=o.generatedAt,o}function H_(t,e){if(e===null)return null;let{input_per_1m_tokens:r,output_per_1m_tokens:n,input_cache_read_per_1m_tokens:s}=e;if(r===null||n===null)return null;let i=s??r,o=t.input/1e6*r+t.output/1e6*n+t.cachedInput/1e6*i;return Number(o.toPrecision(10))}var vN,SN,bN,IN,L_,Td,vd,B_,kN,AN,Sd,D_,Ds=k(()=>{"use strict";vN="https://lmctl.com/dataset/model_list.json",SN="https://lmctl.com/dataset/aliases.json",bN=1e3,IN=1e4,L_=6*60*60*1e3;Td="model_list.json",vd="aliases.json",B_="meta.json",kN="model_list.meta.json";AN=new Set(["established","asserted","unresolved"]);Sd=null,D_=null});function Hr(t){return t.toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function Wr(t){let e=t.source_model_id.toLowerCase(),r=e.slice(e.lastIndexOf("/")+1);return Hr(r)}function q_(t){let e=new Set,r=n=>{let s=n.toLowerCase().split("/");for(let i=0;i<s.length;i+=1)e.add(Hr(s.slice(i).join("/")))};return r(t.source_model_id),t.gateway_id&&r(t.gateway_id),e}function $N(t,e){let r=new Set,n=l=>{r.add(Hr(l))},s=t.trim().toLowerCase(),i=null,o=s.indexOf(":");o>0&&!s.slice(0,o).includes("/")&&(i=s.slice(0,o),n(s),s=s.slice(o+1)),n(s);let a=s.slice(s.lastIndexOf("/")+1);n(a);for(let l of e)n(`${l}/${a}`);return i!==null&&n(`${i}/${a}`),[...r]}function Rn(t){let e=n=>!(n.mode!==void 0&&n.mode!==null&&n.mode!=="chat"||t.nonChatName&&t.nonChatName.test(n.source_model_id.toLowerCase())),r=n=>e(n)&&t.family.test(n.source_model_id.toLowerCase());return{firstPartyProviders:t.firstPartyProviders,isChatModel:e,coversRecord:r,normalize:n=>$N(n,t.vendorPrefixes),matchRow(n,s){if(!r(n))return!1;let i=q_(n);return s.some(o=>i.has(o))}}}function PN(t){let e=t.trim(),r=FN.exec(e);return r?{model:e.slice(0,r.index).trim(),effort:r[1].trim()}:{model:e,effort:null}}function WN(t,e,r){let n=e.trim().toLowerCase(),s=Hr(n);if(r.records.some(o=>o.source_model_id.toLowerCase()===n&&t.matchRow(o,[s])))return!0;let i=t.normalize(e);return i.length>0&&r.records.some(o=>t.matchRow(o,i))}function HN(t,e,r){let n=[];for(let[s,i]of Object.entries(hr))s!==r&&WN(i,t,e)&&n.push(s);return n}function Bo(t){return t==="moonshot"?0:t==="litellm"?1:t==="openrouter"?2:t==="manual"?3:4}function XN(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}function qN(t){let e=new Map,r=[];for(let n of t){let s=n.source_model_id.toLowerCase(),i=s.lastIndexOf("/"),o=i===-1?"":s.slice(0,i+1),a=i===-1?s:s.slice(i+1),l=`${n.source}:${o}${Hr(a)}`,c=e.get(l);if(c===void 0){e.set(l,n);continue}if(!XN(c.pricing,n.pricing)){r.push(n);continue}/\d\.\d/.test(c.source_model_id)&&!/\d\.\d/.test(n.source_model_id)&&e.set(l,n)}return[...e.values(),...r]}function GN(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 Q_(t,e){return t.map(GN).sort((r,n)=>{let s=Bo(r.source)-Bo(n.source);if(s!==0)return s;let i=r.provider!==null&&e.includes(r.provider)?0:1,o=n.provider!==null&&e.includes(n.provider)?0:1;return i!==o?i-o:r.sourceModelId.localeCompare(n.sourceModelId)})}function bd(t){return t.pricing.input_per_1m_tokens!==null&&t.pricing.output_per_1m_tokens!==null}function JN(t,e,r){let n=qN(t),s=Q_(n,r),o=n.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 Id(t,e,r){if(t.length===0)return{kind:"known-unpriced",id:e};let n=JN(t,e,r),s=n.offers.find(bd);return s===void 0?{kind:"known-unpriced",id:e}:s.estimated?{kind:"estimated",model:n}:{kind:"priced",model:n}}function VN(t,e){return t.standards.find(r=>r.standard_slug.toLowerCase()===e.toLowerCase())??null}function KN(t,e,r){let n=t.standard_slug;if(e===null||e.catalog_record_id===null)return{kind:"known-unpriced",id:n};let s=e.catalog_record_id.toLowerCase(),i=r.records.find(l=>(l.record_id??`${l.source}:${l.source_model_id}`).toLowerCase()===s);if(!i)return{kind:"known-unpriced",id:n};let o=Wr(i),a=r.records.filter(l=>Wr(l)!==o?!1:l.mode===void 0||l.mode===null||l.mode==="chat");return a.length===0?{kind:"known-unpriced",id:n}:Id(a,o,xd)}function Z_(t,e,r,n){if(r===null||!Array.isArray(r.records))return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};if(n!==null){let y=[e.trim().toLowerCase()];y.push(`${t.toLowerCase()}/${y[0]}`);let h=n.aliases.find(p=>y.includes(p.alias.toLowerCase()));if(h){if(h.evidence==="unresolved"||h.standard_slug===null)return{state:{kind:"unresolved",alias:h.alias},viaAlias:!0,pinRoute:null};let p=VN(n,h.standard_slug);return{state:KN(h,p,r),viaAlias:!0,pinRoute:p?.catalog_record_id?.toLowerCase()??null}}}let s=hr[t];if(!s)return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};let i=e.trim().toLowerCase(),o=s.normalize(e),a=y=>({state:y,viaAlias:!1,pinRoute:null}),l=Hr(i),c=r.records.filter(y=>y.source_model_id.toLowerCase()===i&&s.matchRow(y,[l]));if(c.length>0){let y=Wr(c[0]),h=r.records.filter(p=>s.matchRow(p,[y])&&Wr(p)===y);return a(Id(h.length>0?h:c,y,X_[t]??xd))}let u=r.records.filter(y=>s.matchRow(y,o));if(u.length===0){let y=HN(e,r,t);return y.length>0?a({kind:"wrong-provider",declared:e,otherProviders:y}):a({kind:"unknown",declared:e})}let f=new Map;for(let y of u){let h=Wr(y),p=f.get(h);p?p.push(y):f.set(h,[y])}let d=X_[t]??xd,m=null,g=null;for(let y of f.values()){let h=Q_(y,d);(g===null||YN(h[0],g[0],d)<0)&&(m=y,g=h)}return a(Id(m,Wr(m[0]),d))}function Wo(t,e,r,n){return Z_(t,e,r,n).state}function Ho(t,e,r,n){let{state:s,viaAlias:i,pinRoute:o}=Z_(t,e,r,n);if(s.kind!=="priced"&&s.kind!=="estimated")return{state:s,offer:null,provenance:null};let a=s.model.offers;if(i&&o!==null){let c=a.find(u=>u.route.toLowerCase()===o);if(c!==void 0&&bd(c))return{state:s,offer:c,provenance:"alias-pin"}}let l=a.find(bd)??null;return{state:s,offer:l,provenance:i&&o!==null?"alias-pin":"route-preference"}}function ey(t,e){let r=hr[e];if(!r)return null;let n=new Set;for(let s of t.records)r.coversRecord(s)&&n.add(Wr(s));return n.size}function YN(t,e,r){let n=Bo(t.source)-Bo(e.source);if(n!==0)return n;let s=t.provider!==null&&r.includes(t.provider)?0:1,i=e.provider!==null&&r.includes(e.provider)?0:1;return s!==i?s-i:t.sourceModelId.localeCompare(e.sourceModelId)}var G_,J_,V_,K_,Y_,z_,FN,UN,jN,BN,hr,X_,xd,$s=k(()=>{"use strict";G_=Rn({vendorPrefixes:["anthropic"],family:/claude/,firstPartyProviders:["anthropic"]}),J_=Rn({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)(-|$)/}),V_=Rn({vendorPrefixes:["google","gemini"],family:/gemini|gemma/,firstPartyProviders:["gemini","google","vertex_ai-language-models"],nonChatName:/embedding|imagen|-image|tts|audio|veo|lyria|live|realtime|video/}),K_=Rn({vendorPrefixes:["moonshot","moonshotai"],family:/kimi|moonshot/,firstPartyProviders:["moonshot"]}),Y_=Rn({vendorPrefixes:["dashscope","qwen"],family:/qwen/,firstPartyProviders:["dashscope"]}),z_=Rn({vendorPrefixes:["deepseek","nousresearch"],family:/deepseek|nous|hermes-\d/,firstPartyProviders:["deepseek","nousresearch"]}),FN=/\s*\(([^()]+)\)\s*$/;UN={"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"},jN=["gemini","google","vertex_ai-language-models","anthropic"],BN={normalize(t){let{model:e}=PN(t),r=UN[e.toLowerCase()];return r===void 0?[]:[Hr(r)]},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 r=q_(t);return e.some(n=>r.has(n))}},hr={claude:G_,codex:J_,gemini:V_,agy:BN,kimi:K_,qwen:Y_,hermes:z_},X_={claude:G_.firstPartyProviders,codex:J_.firstPartyProviders,gemini:V_.firstPartyProviders,agy:jN,kimi:K_.firstPartyProviders,qwen:Y_.firstPartyProviders,hermes:z_.firstPartyProviders};xd=[]});import{spawnSync as Cd}from"node:child_process";import{existsSync as ry,readFileSync as ny}from"node:fs";import{homedir as sy}from"node:os";import{resolve as Nd}from"node:path";function Nn(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 eL(){let t=Cd("agy",["models"],{encoding:"utf-8",timeout:ZN});return{status:t.status,stdout:t.stdout??"",error:t.error}}function tL(t){let e=[];for(let r of t.split(/\r?\n/)){let n=r.trim(),s=n.indexOf(" ");if(s<0)continue;let i=n.slice(s+1).trim();i&&e.push(i)}return e}function Ps(t){if(!t&&kd)return kd;let e=s=>(t||(kd=s),s),r;try{r=(t??eL)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?Nn("agy models",s):`agy models could not be run: ${String(s)}`})}if(r.error)return e({available:!1,models:[],reason:Nn("agy models",r.error)});if(r.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${r.status??"unknown"}`});let n=tL(r.stdout);return n.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:n})}function nL(){let t=Cd("codex",["debug","models"],{encoding:"utf-8",timeout:rL});return{status:t.status,stdout:t.stdout??"",error:t.error}}function sL(t){let e;try{e=JSON.parse(t)}catch{return}let r=e.models;if(!Array.isArray(r))return;let n=[];for(let s of r){if(!s||typeof s!="object")continue;let{slug:i,visibility:o}=s;typeof i=="string"&&o==="list"&&n.push(i)}return n}function Us(t){if(!t&&Ad)return Ad;let e=s=>(t||(Ad=s),s),r;try{r=(t??nL)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?Nn("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(r.error)return e({available:!1,models:[],reason:Nn("codex debug models",r.error)});if(r.status!==0)return e({available:!1,models:[],reason:`codex debug models exited with status ${r.status??"unknown"}`});let n=sL(r.stdout);return n===void 0?e({available:!1,models:[],reason:"codex debug models did not return parseable JSON"}):n.length===0?e({available:!1,models:[],reason:"codex debug models returned no user-visible models"}):e({available:!0,models:n})}function oL(t){let e=Cd("opencode",t?["models",t]:["models"],{encoding:"utf-8",timeout:iL});return{status:e.status,stdout:e.stdout??"",error:e.error}}function Od(t,e){if(!e&&Rd.has(t))return Rd.get(t);let r=o=>(e||Rd.set(t,o),o),n=t?`opencode models ${t}`:"opencode models",s;try{s=(e??oL)(t)}catch(o){return r({available:!1,models:[],reason:o instanceof Error?Nn(n,o):`${n} could not be run: ${String(o)}`})}if(s.error)return r({available:!1,models:[],reason:Nn(n,s.error)});if(s.status!==0)return r({available:!1,models:[],reason:`${n} 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?r({available:!1,models:[],reason:`${n} returned no models`}):r({available:!0,models:i})}function Md(t,e={}){let r=[];for(let n of t){let s=n.provider.trim().toLowerCase();if(n.effort&&s!=="opencode"&&s!=="lmplayer"&&s!=="qwen"&&r.push(`[${n.alias}] effort="${n.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),s==="qwen"&&n.effort&&r.push(`[${n.alias}] effort="${n.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),!n.model&&QN.has(s)&&r.push(`[${n.alias}] provider=${s} has no model= \u2014 ${s} will use its own ambient default, which cannot be linted or priced and may not be the intended one. Set model= explicitly.`),s==="copilot"){if(!n.model)continue;r.push(`[${n.alias}] model="${n.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(s==="lmplayer"&&!n.model){r.push(`[${n.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.5).`);continue}if(s!=="lmplayer"){if(s==="opencode"){if(n.effort&&!n.model&&r.push(`[${n.alias}] effort="${n.effort}" has no effect without model= on an opencode member.`),!n.model){r.push(`[${n.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.5).`);continue}let i=lL(e.opencodeConfigPath);if(!i.available){r.push(`[${n.alias}] model="${n.model}" cannot be verified for opencode: ${i.reason}.`);continue}if(i.models.includes(n.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(n.model))continue;if(!n.model.includes("/")){let l=i.models.filter(c=>c.endsWith(`/${n.model}`));r.push(l.length>0?`[${n.alias}] model="${n.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${n.alias}] model="${n.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${n.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}let o=n.model.slice(0,n.model.indexOf("/")),a=Od(o,e.opencodeModelsRunner);if(a.available&&a.models.includes(n.model))continue;if(a.available&&!a.models.includes(n.model)){r.push(`[${n.alias}] model="${n.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}r.push(`[${n.alias}] model="${n.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(!n.model)continue;let i=js(e.kimiConfigPath);i.available?i.models.includes(n.model)||r.push(`[${n.alias}] model="${n.model}" is not declared in Kimi's [models] config. Valid configured models: ${Fs(i.models)}`):r.push(`[${n.alias}] model="${n.model}" cannot be verified for kimi: ${i.reason}.`);continue}if(s==="agy"){if(!n.model)continue;let i=Ps(e.agyModelsRunner);i.available?i.models.includes(n.model)||r.push(`[${n.alias}] model="${n.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${Fs(i.models)}`):r.push(`[${n.alias}] model="${n.model}" cannot be verified for agy: ${i.reason}.`);continue}if(s==="dsh"){if(!n.model||Go.includes(n.model))continue;qo.includes(n.model)||r.push(`[${n.alias}] model="${n.model}" is not in dsh's built-in catalog. Valid pinned models: ${Fs(qo)}. 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): ${Fs(Go)}. 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(!n.model)continue;let i=n.model.indexOf(":");(i<=0||i===n.model.length-1)&&r.push(`[${n.alias}] model="${n.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(!n.model)continue;n.model===ty&&r.push(`[${n.alias}] model="${ty}" 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=Us(e.codexModelsRunner);if(!i.available){r.push(`[${n.alias}] model="${n.model}" cannot be verified for codex: ${i.reason}.`);continue}i.models.includes(n.model)||r.push(`[${n.alias}] model="${n.model}" is not in codex's live model catalog (\`codex debug models\`). Valid models: ${Fs(i.models)}`);continue}n.model&&(iy.has(s)||r.push(`[${n.alias}] model="${n.model}" cannot be verified for provider "${s}": no model validation path exists for this provider.`))}}}return r}async function oy(t,e={}){let r=t.filter(o=>o.model!==void 0&&iy.has(o.provider.trim().toLowerCase()));if(r.length===0)return{warnings:[],errors:[]};let n=e.snapshot??await Ht();if(n.catalog===null)return{warnings:[],errors:[]};let s=[],i=[];for(let o of r){let a=o.provider.trim().toLowerCase(),l=o.model,c=Wo(a,l,n.catalog,n.aliases);if(c.kind==="unknown"){let u=ey(n.catalog,a)??0;s.push(`[${o.alias}] model "${l}" is unknown to the lmprice catalog for provider "${a}" (${u} 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")&&zN.test(l)){let u=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="${u}" instead.`)}}return{warnings:s,errors:i}}async function ay(t,e={}){return(await oy(t,e)).warnings}async function ly(t,e={}){return(await oy(t,e)).errors}function js(t){let e=process.env.KIMI_CODE_HOME||Nd(sy(),".kimi-code"),r=t??Nd(e,"config.toml");if(!ry(r))return{available:!1,models:[],reason:`${r} not found`};let n;try{n=ny(r,"utf-8")}catch(i){return{available:!1,models:[],reason:`${r} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of n.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${r} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=aL(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${r} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${r} has no [models] entries`}:{available:!0,models:[...s].sort()}}function aL(t){let e=[],r=0;for(;r<t.length;){for(;/\s/.test(t[r]??"");)r++;if(r>=t.length)break;let n="",s=t[r]==='"'||t[r]==="'"?t[r++]:void 0;if(s){for(;r<t.length&&t[r]!==s;)s==='"'&&t[r]==="\\"&&r+1<t.length&&r++,n+=t[r++];if(t[r]!==s)return null;r++}else{for(;r<t.length&&t[r]!==".";)n+=t[r++];n=n.trim()}if(!n)return null;for(e.push(n);/\s/.test(t[r]??"");)r++;if(r>=t.length)break;if(t[r]!==".")return null;r++}return e.length>0?e:null}function lL(t){let e=t??Nd(sy(),".config","opencode","opencode.json");if(!ry(e))return{available:!0,models:[]};let r;try{r=JSON.parse(ny(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:cL(r)}}function cL(t){if(!Ld(t))return[];let e=Xo(t.provider)??Xo(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Ld(s))continue;let i=Xo(s.models)??Xo(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function Xo(t){return Ld(t)?t:null}function Ld(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Fs(t){return t.length>0?t.join(", "):"(none)"}var iy,zN,QN,qo,Go,ty,ZN,kd,rL,Ad,iL,Rd,Jo=k(()=>{"use strict";Ds();$s();iy=new Set(Object.keys(hr).filter(t=>t!=="codex"&&t!=="kimi")),zN=/\d\.(?=\d)/,QN=new Set(["claude","codex","gemini","qwen","kimi","agy"]),qo=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],Go=["deepseek-flash","deepseek-pro"],ty="gpt-5.3-codex-spark",ZN=15e3;kd=null;rL=5e3;Ad=null;iL=5e3;Rd=new Map});function Vo(t){return["agy","opencode","copilot","hermes","pi","lmplayer"].includes(t)}function cy(t){if(!/(?:^|[/:])(?:gpt-|o\d(?:-|$)|chatgpt-|claude[ -]|gemini[ -])/i.test(t))return!1;let e=/claude/i.test(t)?"claude":/gemini/i.test(t)?"gemini":"codex";return hr[e].isChatModel({source:"",source_model_id:t,pricing:{input_per_1m_tokens:null,output_per_1m_tokens:null,input_cache_read_per_1m_tokens:null}})}function Dd(t,e){let r=[];for(let n of e.records){let s=n.source_model_id,i;if(t==="copilot")n.provider==="github_copilot"&&s.startsWith("github_copilot/")&&(i=s.slice(15));else if(["hermes","pi","lmplayer"].includes(t))n.source==="openrouter"&&/^(openai|anthropic|google)\//.test(s)&&(i=t==="hermes"?`openrouter:${s}`:t==="pi"?`openrouter/${s}`:s);else{let o={claude:"anthropic",gemini:"gemini",qwen:"dashscope"}[t],a=hr[t];if(o&&n.source==="litellm"&&n.provider===o&&a?.coversRecord(n)){i=s.startsWith(`${o}/`)?s.slice(o.length+1):s;let l=t==="claude"?"claude-":t==="gemini"?"gemini-":"qwen";(i.includes("/")||!i.startsWith(l))&&(i=void 0)}}!i||n.mode!=null&&n.mode!=="chat"||i.includes(":batch")||i.includes(":free")||Vo(t)&&!cy(i)||r.push(i)}return[...new Set(r)].sort()}async function Bs(t){let e;switch(t){case"dsh":e=[...Go,...qo];break;case"codex":e=Us().models;break;case"agy":e=Ps().models;break;case"kimi":e=js().models;break;case"opencode":e=Od("").models;break;default:{let{catalog:r}=await Ht();e=r?Dd(t,r):[]}}return[...new Set(e.filter(r=>!Vo(t)||cy(r)))].sort()}var $d=k(()=>{"use strict";Ds();$s();Jo()});var my={};se(my,{MODEL_PROVIDERS:()=>Xt,knownModelNames:()=>Ln,runModel:()=>Ko});function uy(t,e){switch(t){case"codex":return Us();case"agy":return Ps();case"kimi":return js();case"claude":{let r=e.catalog?Dd(t,e.catalog):[];return r.length>0?{available:!0,models:r}:{available:!1,models:[],reason:"No first-party Claude models in the available catalog"}}default:return{available:!1,models:[],reason:"Model list unavailable"}}}async function Ln(t){if(!Xt.includes(t))return Bs(t);let e=t==="claude"?await Ht():{catalog:null,aliases:null,source:"unavailable",generatedAt:null};return uy(t,e).models}function uL(t,e,r){let{state:n,offer:s,provenance:i}=Ho(t,e,r.catalog,r.aliases);return{model:e,pricing:{input_per_1m_tokens:s?.pricing.input_per_1m_tokens??null,output_per_1m_tokens:s?.pricing.output_per_1m_tokens??null,input_cache_read_per_1m_tokens:s?.pricing.input_cache_read_per_1m_tokens??null},price_resolution:n.kind,price_source:s?.source??null,price_source_model_id:s?.sourceModelId??null,price_provenance:i,price_estimated:s?.estimated??!1}}async function Ko(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(dy),0;let n=oe(t,[],["--json"]),s=n.positionals.find(m=>m!=="all"&&!Xt.includes(m)),i=n.error??(s===void 0?void 0:`unknown provider: ${s} (valid targets: all, ${Xt.join(", ")})`);if(i!==void 0)return e.stderr.write(`error: ${i}
1711
1711
  ${dy}`),2;let o=r.selections?.map(m=>m.provider)??(n.positionals.length===0||n.positionals.includes("all")?[...Xt]:Xt.filter(m=>n.positionals.includes(m)));e.stderr.write(`querying models: ${o.join(", ")} ...
1712
- `);let a=await(r.loadSnapshot??Ht)(),l=[];for(let m of o){let h;try{let y=r.selections?.find(g=>g.provider===m);h=y?.models!==void 0?{available:!0,models:y.models}:r.loadModels?await r.loadModels(m,a):Xt.includes(m)?uy(m,a):{available:!0,models:await Bs(m)}}catch(y){h={available:!1,models:[],reason:y instanceof Error?y.message:String(y)}}l.push({provider:m,status:h.available?"ok":"unavailable",source:r.selections?.some(y=>y.provider===m&&y.models!==void 0)?"requested model selection":dL[m]??"provider model catalog",reason:h.reason??null,models:[...new Set(h.models)].sort().map(y=>uL(m,y,a))})}if(H(n,"--json"))return ee(e,{schema_version:1,currency:"USD",unit:"per_million_tokens",price_data_source:a.source,price_data_generated_at:a.generatedAt,providers:l}),0;e.stdout.write(`USD per million tokens (API reference rates, not subscription charges). n/a = unknown.
1712
+ `);let a=await(r.loadSnapshot??Ht)(),l=[];for(let m of o){let g;try{let y=r.selections?.find(h=>h.provider===m);g=y?.models!==void 0?{available:!0,models:y.models}:r.loadModels?await r.loadModels(m,a):Xt.includes(m)?uy(m,a):{available:!0,models:await Bs(m)}}catch(y){g={available:!1,models:[],reason:y instanceof Error?y.message:String(y)}}l.push({provider:m,status:g.available?"ok":"unavailable",source:r.selections?.some(y=>y.provider===m&&y.models!==void 0)?"requested model selection":dL[m]??"provider model catalog",reason:g.reason??null,models:[...new Set(g.models)].sort().map(y=>uL(m,y,a))})}if(H(n,"--json"))return ee(e,{schema_version:1,currency:"USD",unit:"per_million_tokens",price_data_source:a.source,price_data_generated_at:a.generatedAt,providers:l}),0;e.stdout.write(`USD per million tokens (API reference rates, not subscription charges). n/a = unknown.
1713
1713
  `),e.stdout.write(`Price catalog: ${a.source}${a.generatedAt?` (${a.generatedAt})`:""}
1714
- `);let c=["MODEL","INPUT","OUTPUT","CACHE READ","PRICE"],u=m=>m===null?"n/a":String(m),f=l.map(m=>m.models.map(h=>[(0,Xr.escapeCell)(h.model),u(h.pricing.input_per_1m_tokens),u(h.pricing.output_per_1m_tokens),u(h.pricing.input_cache_read_per_1m_tokens),h.price_resolution])),d=(0,Xr.measureColumns)([{rows:[],headers:c},...f]);for(let[m,h]of l.entries()){if(e.stdout.write(`
1715
- ${h.provider} (${h.source})
1716
- `),h.status==="unavailable"){e.stdout.write(` unavailable: ${(0,Xr.escapeCell)(h.reason??"model list unavailable")}
1717
- `);continue}e.stdout.write(`${(0,Xr.renderGrid)(f[m],{headers:c,widths:d,margin:2,align:["left","right","right","right","left"]})}
1714
+ `);let c=["MODEL","INPUT","OUTPUT","CACHE READ"],u=m=>m===null?"n/a":`$${m}`,f=l.map(m=>m.models.map(g=>[(0,Xr.escapeCell)(g.model),u(g.pricing.input_per_1m_tokens),u(g.pricing.output_per_1m_tokens),u(g.pricing.input_cache_read_per_1m_tokens)])),d=(0,Xr.measureColumns)([{rows:[],headers:c},...f]);for(let[m,g]of l.entries()){if(e.stdout.write(`
1715
+ ${g.provider} (${g.source})
1716
+ `),g.status==="unavailable"){e.stdout.write(` unavailable: ${(0,Xr.escapeCell)(g.reason??"model list unavailable")}
1717
+ `);continue}e.stdout.write(`${(0,Xr.renderGrid)(f[m],{headers:c,widths:d,margin:2,align:["left","right","right","right"]})}
1718
1718
  `)}return 0}var Xr,Xt,dy,dL,Yo=k(()=>{"use strict";Xr=ct(tt(),1);de();Jo();$d();Ds();$s();Xt=["codex","agy","claude","kimi"],dy=`usage: lmctl model [provider ...] [--json]
1719
1719
 
1720
1720
  List known model names and USD prices per million tokens.
@@ -1763,28 +1763,28 @@ zero. All known models are kept, including models without a price.
1763
1763
  )`});var Ud={};se(Ud,{parseIdleTimeoutMs:()=>wy,resolvePromptInput:()=>Ey,runChat:()=>Ws});import{readFileSync as pL,openSync as hL}from"node:fs";import{homedir as gL}from"node:os";import{join as _L}from"node:path";import{spawn as yL}from"node:child_process";function wL(t){return _L(gL(),".lmctl",`daemonize-${t}.log`)}function TL(t){let e=process.stdout.isTTY===!0,r=process.stderr.isTTY===!0;if(!e&&!r)return{stdio:["ignore","inherit","inherit"],logPath:null};let n=wL(t),s=hL(n,"a");return{stdio:["ignore",e?s:"inherit",r?s:"inherit"],logPath:n}}function vL(t,e){let{stdio:r,logPath:n}=TL(process.pid),s=yL(process.argv[0],[process.argv[1],"chat",...t],{detached:!0,stdio:r,env:{...process.env,[zo]:"1"}});return s.on("error",i=>{e.stderr.write(`error: --daemonize failed to spawn the detached child: ${i.message}
1764
1764
  `)}),s.unref(),e.stdout.write(`${JSON.stringify({status:"detached",pid:s.pid??null,logPath:n})}
1765
1765
  `),0}async function Ws(t,e={stdout:process.stdout,stderr:process.stderr}){let r=e.env??process.env;if(t.length===1&&(Yt(t[0])||qn(t[0]))||t.length===2&&Ce(t[0])&&Gn(t[1])){let d=new jr(e);if(d.interactive)try{let m=await d.ask(`Prompt for ${t.join(" ")}: `);if(!m)return e.stderr.write(`error: prompt text is required
1766
- `),2;let{sendInferredPrompt:h}=await Promise.resolve().then(()=>(Zo(),Qo));return d.close(),await h(t,m,e)}catch(m){return e.stderr.write(`error: ${m instanceof Error?m.message:String(m)}
1766
+ `),2;let{sendInferredPrompt:g}=await Promise.resolve().then(()=>(Zo(),Qo));return d.close(),await g(t,m,e)}catch(m){return e.stderr.write(`error: ${m instanceof Error?m.message:String(m)}
1767
1767
  `),2}finally{d.close()}return e.stderr.write(`error: prompt text is required. Use: lmctl prompt ${t.join(" ")} "<prompt>"
1768
1768
  `),2}if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${_y}
1769
1769
  `),t.length===0?2:0;if(t.includes("--daemonize")&&r[zo]!=="1")return vL(t.filter(d=>d!=="--daemonize"),e);r[zo]==="1"&&(ji(e),delete process.env[zo]);let s=SL(t);if(typeof s=="string")return e.stderr.write(`error: ${s}
1770
1770
  ${_y}
1771
1771
  `),2;if(s.promptFile!==void 0){let d=await Ey(s.promptFile,e);if(typeof d!="string")return e.stderr.write(`error: ${d.error}
1772
1772
  `),2;s.prompt=d}if(s.runFlag!==void 0){let d=Number.parseInt(s.runFlag,10);return!Number.isFinite(d)||d<=0||String(d)!==s.runFlag?(e.stderr.write(`error: invalid --run "${s.runFlag}" (expected a positive integer run id)
1773
- `),2):await L(e,async m=>{let h=m.getRun(d);if(h===null)return e.stderr.write(`error: run ${d}: not found
1774
- `),1;if(h.terminal_state!==null&&h.terminal_state.length>0)return A(e,`run ${d}: already terminal (${h.terminal_state}); prompt --run cannot resume a terminated run`);let y=py(m,d);if(y===null)return e.stderr.write(`error: run ${d}: no pending operator-answerable attention (prompt --run only resumes paused runs)
1773
+ `),2):await L(e,async m=>{let g=m.getRun(d);if(g===null)return e.stderr.write(`error: run ${d}: not found
1774
+ `),1;if(g.terminal_state!==null&&g.terminal_state.length>0)return A(e,`run ${d}: already terminal (${g.terminal_state}); prompt --run cannot resume a terminated run`);let y=py(m,d);if(y===null)return e.stderr.write(`error: run ${d}: no pending operator-answerable attention (prompt --run only resumes paused runs)
1775
1775
  `),1;if(y.kind==="workflow_escalation"){if(s.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
1776
- `),2;let g=m.resumeEscalation(y.attention_id,s.prompt);return g.resumed===!0?(e.stdout.write(`run ${d}: escalation resumed (decision: ${s.prompt})
1777
- `),0):(e.stderr.write(`error: run ${d}: resumeEscalation failed (${g.reason})
1778
- `),1)}if(y.kind==="interactive_waiting_operator"){let g=gy(m,y.attention_id);if(g===null||g.step_id===null)return e.stderr.write(`error: run ${d}: pending interactive_waiting_operator attention has no associated interactive step
1779
- `),1;let p=m.resumeInteractive(g.step_id,s.prompt,s.done===!0);return p.resumed===!0?(e.stdout.write(`run ${d}: interactive resumed (step ${g.step_id}${s.done===!0?", done":""})
1776
+ `),2;let h=m.resumeEscalation(y.attention_id,s.prompt);return h.resumed===!0?(e.stdout.write(`run ${d}: escalation resumed (decision: ${s.prompt})
1777
+ `),0):(e.stderr.write(`error: run ${d}: resumeEscalation failed (${h.reason})
1778
+ `),1)}if(y.kind==="interactive_waiting_operator"){let h=gy(m,y.attention_id);if(h===null||h.step_id===null)return e.stderr.write(`error: run ${d}: pending interactive_waiting_operator attention has no associated interactive step
1779
+ `),1;let p=m.resumeInteractive(h.step_id,s.prompt,s.done===!0);return p.resumed===!0?(e.stdout.write(`run ${d}: interactive resumed (step ${h.step_id}${s.done===!0?", done":""})
1780
1780
  `),0):(e.stderr.write(`error: run ${d}: resumeInteractive failed (${p.reason})
1781
1781
  `),1)}return e.stderr.write(`error: run ${d}: pending attention kind "${y.kind}" is not operator-answerable
1782
1782
  `),1})}let i=wt(EL,{target:s.target,alias:s.alias,flags:{session:s.sessionFlag,provider:s.providerFlag}});if(i.mode==="error")return e.stderr.write(`error: ${i.message}
1783
1783
  `),2;if(i.mode==="managed")return e.stderr.write(`error: prompt managed mode requires --run <id>
1784
1784
  `),2;let o;if(i.mode==="ai-team"){if(i.alias===void 0)return e.stderr.write(`error: prompt: alias required (internal)
1785
1785
  `),2;e.stderr.write(`${i.alias}: turn running; this can take minutes
1786
- `);let d=mt(e,h=>`${i.alias}: turn still running (${h}s elapsed)
1787
- `),m;try{m=await Ur({teamfile:i.teamfile,alias:i.alias,prompt:s.prompt,permissionMode:s.permissionMode,...s.idleTimeoutMs!==void 0?{idleTimeoutMs:s.idleTimeoutMs}:{},...s.rootFlag!==void 0?{rootFlag:s.rootFlag}:{},env:r,io:e,onEvent:h=>{d.poke(),!(s.json===!0&&h.kind==="delta")&&xL(e,h,s.verbose===!0)},...s.json===!0?{onAccepted:h=>{d.poke(),e.stdout.write(`${JSON.stringify({status:"accepted",message_id:h})}
1786
+ `);let d=mt(e,g=>`${i.alias}: turn still running (${g}s elapsed)
1787
+ `),m;try{m=await Ur({teamfile:i.teamfile,alias:i.alias,prompt:s.prompt,permissionMode:s.permissionMode,...s.idleTimeoutMs!==void 0?{idleTimeoutMs:s.idleTimeoutMs}:{},...s.rootFlag!==void 0?{rootFlag:s.rootFlag}:{},env:r,io:e,onEvent:g=>{d.poke(),!(s.json===!0&&g.kind==="delta")&&xL(e,g,s.verbose===!0)},...s.json===!0?{onAccepted:g=>{d.poke(),e.stdout.write(`${JSON.stringify({status:"accepted",message_id:g})}
1788
1788
  `)}}:{}})}finally{d.stop()}return s.json===!0?m.status==="busy"?(e.stdout.write(`${JSON.stringify({status:"busy",message:m.message,teamChatLogId:m.teamChatLogId})}
1789
1789
  `),1):m.status==="error"?(e.stdout.write(`${JSON.stringify({status:"error",errorKind:m.errorKind,message:m.message,teamChatLogId:m.teamChatLogId,...m.messageId===null?{}:{message_id:m.messageId}})}
1790
1790
  `),1):(e.stdout.write(`${JSON.stringify({status:m.status,replyText:m.replyText,teamChatLogId:m.teamChatLogId,...m.messageId===null?{}:{message_id:m.messageId},turn_finished:!0,note:yy(i.alias)})}
@@ -1797,14 +1797,14 @@ ${_y}
1797
1797
  `):e.stdout.write(`${m.replyText}${m.replyText.endsWith(`
1798
1798
  `)?"":`
1799
1799
  `}`),e.stderr.write(`note: ${yy(i.alias)}
1800
- `),m.status==="stalled"?1:0)}else{let d=i.provider,m=e.cwd??process.cwd();if(d===void 0){let h=await Rt(i.sessionid);if(h.length!==1)return e.stderr.write(`error: prompt raw mode requires --provider <name> when the session provider is missing or ambiguous
1801
- `),2;d=h[0],m=(await ge(i.sessionid,h[0]))?.cwd??m}o={provider:d,sessionId:i.sessionid,cwd:m}}let a=!1,l=Q(),c=0,u=0,f=0;try{let d={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,prompt:s.prompt,permissionMode:s.permissionMode,env:r,onDelta:h=>{a=!0,l&&(c+=1,f=Buffer.byteLength(h,"utf8"),u+=f),e.stdout.write(h)},onProgress:h=>Ty(e,o.alias??"(raw)",h,s.verbose===!0)};o.model!==void 0&&(d.model=o.model),o.effort!==void 0&&(d.effort=o.effort),o.alias!==void 0&&(d.alias=o.alias),o.isLead!==void 0&&(d.isLead=o.isLead),s.idleTimeoutMs!==void 0&&(d.timeoutMs=s.idleTimeoutMs);let m=await $r(d);return l&&ve(JSON.stringify({event:"chat_return",alias:o.alias??"(raw)",provider:o.provider,streamed:a,blockCount:c,streamedBytes:u,resultTextBytes:Buffer.byteLength(m.text,"utf8"),lastChunkBytes:f,tailPreview:IL(m.text,200)})),m.status==="empty"?(e.stderr.write(`error: 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
1800
+ `),m.status==="stalled"?1:0)}else{let d=i.provider,m=e.cwd??process.cwd();if(d===void 0){let g=await Rt(i.sessionid);if(g.length!==1)return e.stderr.write(`error: prompt raw mode requires --provider <name> when the session provider is missing or ambiguous
1801
+ `),2;d=g[0],m=(await ge(i.sessionid,g[0]))?.cwd??m}o={provider:d,sessionId:i.sessionid,cwd:m}}let a=!1,l=Q(),c=0,u=0,f=0;try{let d={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,prompt:s.prompt,permissionMode:s.permissionMode,env:r,onDelta:g=>{a=!0,l&&(c+=1,f=Buffer.byteLength(g,"utf8"),u+=f),e.stdout.write(g)},onProgress:g=>Ty(e,o.alias??"(raw)",g,s.verbose===!0)};o.model!==void 0&&(d.model=o.model),o.effort!==void 0&&(d.effort=o.effort),o.alias!==void 0&&(d.alias=o.alias),o.isLead!==void 0&&(d.isLead=o.isLead),s.idleTimeoutMs!==void 0&&(d.timeoutMs=s.idleTimeoutMs);let m=await $r(d);return l&&ve(JSON.stringify({event:"chat_return",alias:o.alias??"(raw)",provider:o.provider,streamed:a,blockCount:c,streamedBytes:u,resultTextBytes:Buffer.byteLength(m.text,"utf8"),lastChunkBytes:f,tailPreview:IL(m.text,200)})),m.status==="empty"?(e.stderr.write(`error: 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
1802
1802
  `),1):(a?m.text.endsWith(`
1803
1803
  `)||e.stdout.write(`
1804
1804
  `):e.stdout.write(`${m.text}${m.text.endsWith(`
1805
1805
  `)?"":`
1806
1806
  `}`),m.status==="stalled"?1:0)}catch(d){let m=d instanceof Error?d.message:String(d);return e.stderr.write(`error: ${m}
1807
- `),1}}function yy(t){return`${t}'s turn has finished and exited; resubmit \`lmctl prompt\` to continue (no persistent session is left running)`}function SL(t){let e=[],r="yolo",n,s,i,o,a,l,c=!1,u=!1,f=!1;for(let g=0;g<t.length;g+=1){let p=t[g];if(p==="--permission-mode"){let _=t[++g];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(p==="--idle-timeout"){let _=t[++g];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let E=wy(_);if(typeof E=="string")return E;n=E;continue}if(p==="--session"){let _=t[++g];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(p==="--provider"){let _=t[++g];if(_===void 0||_.startsWith("--"))return"missing value for --provider";i=_;continue}if(p==="--from"||p.startsWith("--from="))return E_("prompt");if(p.startsWith("I_am="))return`unknown argument: ${p}`;if(p==="--root"){let _=t[++g];if(_===void 0||_.startsWith("--"))return"missing value for --root";o=_;continue}if(p==="--prompt-file"){let _=t[++g];if(_===void 0||_!=="-"&&_.startsWith("--"))return"missing value for --prompt-file";a=_;continue}if(p==="--force"||p.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl prompt)";if(p==="--json"){u=!0;continue}if(p==="--verbose"){f=!0;continue}if(p==="--run"){let _=t[++g];if(_===void 0||_.startsWith("--"))return"missing value for --run";l=_;continue}if(p==="--done"){c=!0;continue}if(p.startsWith("--"))return`unknown flag: ${p}`;e.push(p)}if(l!==void 0){if(s!==void 0)return"--run is mutually exclusive with --session";if(i!==void 0)return"--run is mutually exclusive with --provider";if(o!==void 0)return"--run is mutually exclusive with --root";if(a!==void 0&&e.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&e.length===0)return"a prompt (answer) is required with --run";if(e.length>1)return`--run takes exactly one positional (the answer); got ${e.length}`;let g={prompt:a!==void 0?"":e[0],permissionMode:r,runFlag:l,done:c,json:u,verbose:f};return a!==void 0&&(g.promptFile=a),g}let d,m,h;if(a!==void 0){if(e.length===0){if(s===void 0)return"expected <teamfile>:<alias> --prompt-file <path> | <teamfile> <alias> --prompt-file <path> | --session <id> --prompt-file <path>"}else if(e.length===1)d=e[0];else if(e.length===2)d=e[0],m=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";h=""}else{if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';h=e[0]}else if(e.length===2){if(Ce(e[0])&&Gn(e[1]))return`prompt text is required for alias "${e[1]}". Use: lmctl prompt ${e[0]} ${e[1]} "<prompt>"`;d=e[0],h=e[1]}else if(e.length===3)d=e[0],m=e[1],h=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`}if(c)return"--done requires --run";let y={prompt:h,permissionMode:r};return d!==void 0&&(y.target=d),m!==void 0&&(y.alias=m),n!==void 0&&(y.idleTimeoutMs=n),s!==void 0&&(y.sessionFlag=s),i!==void 0&&(y.providerFlag=i),o!==void 0&&(y.rootFlag=o),a!==void 0&&(y.promptFile=a),u&&(y.json=u),f&&(y.verbose=f),y}async function Ey(t,e,r=process.stdin){let n;try{n=t==="-"?await bL(r):pL(t,"utf8")}catch(i){let o=i instanceof Error?i.message:String(i);return{error:`--prompt-file ${t}: ${o}`}}let s=n.endsWith(`\r
1807
+ `),1}}function yy(t){return`${t}'s turn has finished and exited; resubmit \`lmctl prompt\` to continue (no persistent session is left running)`}function SL(t){let e=[],r="yolo",n,s,i,o,a,l,c=!1,u=!1,f=!1;for(let h=0;h<t.length;h+=1){let p=t[h];if(p==="--permission-mode"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(p==="--idle-timeout"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let E=wy(_);if(typeof E=="string")return E;n=E;continue}if(p==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(p==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";i=_;continue}if(p==="--from"||p.startsWith("--from="))return E_("prompt");if(p.startsWith("I_am="))return`unknown argument: ${p}`;if(p==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";o=_;continue}if(p==="--prompt-file"){let _=t[++h];if(_===void 0||_!=="-"&&_.startsWith("--"))return"missing value for --prompt-file";a=_;continue}if(p==="--force"||p.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl prompt)";if(p==="--json"){u=!0;continue}if(p==="--verbose"){f=!0;continue}if(p==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";l=_;continue}if(p==="--done"){c=!0;continue}if(p.startsWith("--"))return`unknown flag: ${p}`;e.push(p)}if(l!==void 0){if(s!==void 0)return"--run is mutually exclusive with --session";if(i!==void 0)return"--run is mutually exclusive with --provider";if(o!==void 0)return"--run is mutually exclusive with --root";if(a!==void 0&&e.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&e.length===0)return"a prompt (answer) is required with --run";if(e.length>1)return`--run takes exactly one positional (the answer); got ${e.length}`;let h={prompt:a!==void 0?"":e[0],permissionMode:r,runFlag:l,done:c,json:u,verbose:f};return a!==void 0&&(h.promptFile=a),h}let d,m,g;if(a!==void 0){if(e.length===0){if(s===void 0)return"expected <teamfile>:<alias> --prompt-file <path> | <teamfile> <alias> --prompt-file <path> | --session <id> --prompt-file <path>"}else if(e.length===1)d=e[0];else if(e.length===2)d=e[0],m=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";g=""}else{if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';g=e[0]}else if(e.length===2){if(Ce(e[0])&&Gn(e[1]))return`prompt text is required for alias "${e[1]}". Use: lmctl prompt ${e[0]} ${e[1]} "<prompt>"`;d=e[0],g=e[1]}else if(e.length===3)d=e[0],m=e[1],g=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`}if(c)return"--done requires --run";let y={prompt:g,permissionMode:r};return d!==void 0&&(y.target=d),m!==void 0&&(y.alias=m),n!==void 0&&(y.idleTimeoutMs=n),s!==void 0&&(y.sessionFlag=s),i!==void 0&&(y.providerFlag=i),o!==void 0&&(y.rootFlag=o),a!==void 0&&(y.promptFile=a),u&&(y.json=u),f&&(y.verbose=f),y}async function Ey(t,e,r=process.stdin){let n;try{n=t==="-"?await bL(r):pL(t,"utf8")}catch(i){let o=i instanceof Error?i.message:String(i);return{error:`--prompt-file ${t}: ${o}`}}let s=n.endsWith(`\r
1808
1808
  `)?n.slice(0,-2):n.endsWith(`
1809
1809
  `)?n.slice(0,-1):n;return s.length===0?{error:`--prompt-file ${t}: file is empty; a prompt is required`}:s}async function bL(t){let e=[];for await(let r of t)e.push(typeof r=="string"?Buffer.from(r,"utf8"):r);return Buffer.concat(e).toString("utf8")}function wy(t){if(t==="0")return 0;if(/^\d+$/.test(t)){let i=Number(t);return i>0&&i<1e3?`--idle-timeout ${t} means ${t}ms, not ${t}s \u2014 that's not enough time for any real provider call to make progress. Use an explicit unit, e.g. --idle-timeout ${t}s.`:i}let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms >= 1000, or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function Ty(t,e,r,n=!1){if(r.kind!=="tool_use"&&r.kind!=="tool_result"&&r.kind!=="api_retry")return;let s=r.kind==="tool_use"?`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}`:r.kind==="tool_result"?`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}`:`[${e}] api_retry${r.summary?`: ${r.summary}`:""}`;C({event:"chat_progress",alias:e,progress_kind:r.kind,line:s}),n&&t.stderr.write(`${s}
1810
1810
  `)}function IL(t,e){return t.slice(-e)}function xL(t,e,r=!1){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?Ty(t,e.alias,e.event,r):t.stderr.write(e.message)}var EL,_y,zo,Hs=k(()=>{"use strict";pt();Ed();Oe();Ae();Oe();jt();de();Oe();Mo();kn();K();Fd();Pd();de();EL={name:"prompt",allowsBareTeamfile:!1,supportsRaw:!0},_y=`usage: lmctl prompt <teamfile>:<alias> "<prompt>"
@@ -1900,19 +1900,19 @@ try {
1900
1900
  } finally {
1901
1901
  clearTimeout(timer);
1902
1902
  }
1903
- `,n=Bd(process.execPath,["--input-type=module","-e",r,t],{encoding:"utf8",shell:!1,timeout:35e3,maxBuffer:Wd+4096,windowsHide:!0});if(n.error)throw n.error.code==="ETIMEDOUT"?new Error("urlget() request timed out"):new Error(`urlget() failed: ${n.error.message}`);if(n.status!==0)throw new Error(`urlget() failed: ${String(n.stderr||"child process exited")}`.trim());return String(n.stdout||"")}async function RL(t){if(typeof t!="string"||!t.trim())throw new Error("urlget() requires a non-empty URL string");let e;try{e=new URL(t)}catch{throw new Error("urlget() requires a valid HTTP(S) URL")}if(e.protocol!=="http:"&&e.protocol!=="https:"||e.username||e.password)throw new Error("urlget() only permits HTTP(S) URLs without embedded credentials");let r=new AbortController,n=setTimeout(()=>r.abort(),3e4),s;try{let i=await fetch(e.toString(),{method:"GET",redirect:"follow",signal:r.signal});if(!i.ok)throw r.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>Wd)throw await s.cancel().catch(()=>{}),r.abort(),new Error("response exceeds 10 MiB limit");o.push(l.value)}return Buffer.concat(o).toString("utf-8")}catch(i){if(r.abort(),s)try{await s.cancel().catch(()=>{})}catch{}throw i.name==="AbortError"?new Error("urlget() request timed out"):new Error(`urlget() failed: ${i?.message||String(i)}`)}finally{clearTimeout(n)}}function na(t,e,r,n=null,s=!1,i=0,o=null){return{stdout:t,stderr:e,code:r,signal:n,timed_out:s,duration_ms:i,pid:o}}function My(t){let e=String(t);return e.length>0&&/^[a-zA-Z0-9_./@=-]+$/.test(e)?e:"'"+e.replace(/'/g,"'\\''")+"'"}function Dy(t,e=6e4){if(!Number.isSafeInteger(e)||e<0)throw new Error("system() timeout must be a non-negative safe integer in milliseconds");let r=performance.now(),n;if(Array.isArray(t)){if(t.length===0)throw new Error("system() argv array must not be empty");let u=String(t[0]),f=t.slice(1).map(String);n=Bd(u,f,{shell:!1,encoding:"utf-8",timeout:e>0?e:void 0,maxBuffer:10*1024*1024,killSignal:"SIGKILL"})}else n=Bd(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()-r)),i=typeof n.pid=="number"?n.pid:null;if(n.error){if(n.error.code==="ETIMEDOUT"){let u=n.stdout!=null?String(n.stdout):"",f=n.stderr!=null?String(n.stderr):"";return na(u,f,null,n.signal||"SIGKILL",!0,s,i)}throw n.error}let o=n.stdout!=null?String(n.stdout):"",a=n.stderr!=null?String(n.stderr):"",l=n.status!==null?n.status:null,c=n.signal!==null?String(n.signal):null;return na(o,a,l,c,!1,s,i)}function $y(t,e=6e4){return new Promise((r,n)=>{if(!Number.isSafeInteger(e)||e<0){n(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){n(new Error("system() argv array must not be empty"));return}let E=String(t[0]),w=t.slice(1).map(String);o=vy(E,w,{shell:!1,detached:i,stdio:["ignore","pipe","pipe"]})}else o=vy(t,{shell:!0,detached:i,stdio:["ignore","pipe","pipe"]});ra.add(o);let a="",l="",c=null,u=null,f=0,d=!1,m=!1,h,y=!1,g,p=()=>{if(y)return;y=!0,ra.delete(o),g&&clearTimeout(g);try{o.stdout?.destroy(),o.stderr?.destroy()}catch{}let E=Math.max(0,Math.round(performance.now()-s)),w=typeof o.pid=="number"?o.pid:null;if(h){n(h);return}if(m){r(na(a,l,null,u||"SIGKILL",!0,E,w));return}r(na(a,l,c,u,!1,E,w))};e>0&&(g=setTimeout(()=>{m=!0,u="SIGKILL";try{if(i&&o.pid)try{process.kill(-o.pid,"SIGKILL")}catch{o.kill("SIGKILL")}else o.kill("SIGKILL")}catch{}p()},e));let _=10*1024*1024;o.stdout?.setEncoding("utf-8"),o.stderr?.setEncoding("utf-8"),o.stdout?.on("data",E=>{let w=Buffer.byteLength(E,"utf-8");if(f+w>_){if(!d){d=!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(`
1903
+ `,n=Bd(process.execPath,["--input-type=module","-e",r,t],{encoding:"utf8",shell:!1,timeout:35e3,maxBuffer:Wd+4096,windowsHide:!0});if(n.error)throw n.error.code==="ETIMEDOUT"?new Error("urlget() request timed out"):new Error(`urlget() failed: ${n.error.message}`);if(n.status!==0)throw new Error(`urlget() failed: ${String(n.stderr||"child process exited")}`.trim());return String(n.stdout||"")}async function RL(t){if(typeof t!="string"||!t.trim())throw new Error("urlget() requires a non-empty URL string");let e;try{e=new URL(t)}catch{throw new Error("urlget() requires a valid HTTP(S) URL")}if(e.protocol!=="http:"&&e.protocol!=="https:"||e.username||e.password)throw new Error("urlget() only permits HTTP(S) URLs without embedded credentials");let r=new AbortController,n=setTimeout(()=>r.abort(),3e4),s;try{let i=await fetch(e.toString(),{method:"GET",redirect:"follow",signal:r.signal});if(!i.ok)throw r.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>Wd)throw await s.cancel().catch(()=>{}),r.abort(),new Error("response exceeds 10 MiB limit");o.push(l.value)}return Buffer.concat(o).toString("utf-8")}catch(i){if(r.abort(),s)try{await s.cancel().catch(()=>{})}catch{}throw i.name==="AbortError"?new Error("urlget() request timed out"):new Error(`urlget() failed: ${i?.message||String(i)}`)}finally{clearTimeout(n)}}function na(t,e,r,n=null,s=!1,i=0,o=null){return{stdout:t,stderr:e,code:r,signal:n,timed_out:s,duration_ms:i,pid:o}}function My(t){let e=String(t);return e.length>0&&/^[a-zA-Z0-9_./@=-]+$/.test(e)?e:"'"+e.replace(/'/g,"'\\''")+"'"}function Dy(t,e=6e4){if(!Number.isSafeInteger(e)||e<0)throw new Error("system() timeout must be a non-negative safe integer in milliseconds");let r=performance.now(),n;if(Array.isArray(t)){if(t.length===0)throw new Error("system() argv array must not be empty");let u=String(t[0]),f=t.slice(1).map(String);n=Bd(u,f,{shell:!1,encoding:"utf-8",timeout:e>0?e:void 0,maxBuffer:10*1024*1024,killSignal:"SIGKILL"})}else n=Bd(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()-r)),i=typeof n.pid=="number"?n.pid:null;if(n.error){if(n.error.code==="ETIMEDOUT"){let u=n.stdout!=null?String(n.stdout):"",f=n.stderr!=null?String(n.stderr):"";return na(u,f,null,n.signal||"SIGKILL",!0,s,i)}throw n.error}let o=n.stdout!=null?String(n.stdout):"",a=n.stderr!=null?String(n.stderr):"",l=n.status!==null?n.status:null,c=n.signal!==null?String(n.signal):null;return na(o,a,l,c,!1,s,i)}function $y(t,e=6e4){return new Promise((r,n)=>{if(!Number.isSafeInteger(e)||e<0){n(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){n(new Error("system() argv array must not be empty"));return}let E=String(t[0]),w=t.slice(1).map(String);o=vy(E,w,{shell:!1,detached:i,stdio:["ignore","pipe","pipe"]})}else o=vy(t,{shell:!0,detached:i,stdio:["ignore","pipe","pipe"]});ra.add(o);let a="",l="",c=null,u=null,f=0,d=!1,m=!1,g,y=!1,h,p=()=>{if(y)return;y=!0,ra.delete(o),h&&clearTimeout(h);try{o.stdout?.destroy(),o.stderr?.destroy()}catch{}let E=Math.max(0,Math.round(performance.now()-s)),w=typeof o.pid=="number"?o.pid:null;if(g){n(g);return}if(m){r(na(a,l,null,u||"SIGKILL",!0,E,w));return}r(na(a,l,c,u,!1,E,w))};e>0&&(h=setTimeout(()=>{m=!0,u="SIGKILL";try{if(i&&o.pid)try{process.kill(-o.pid,"SIGKILL")}catch{o.kill("SIGKILL")}else o.kill("SIGKILL")}catch{}p()},e));let _=10*1024*1024;o.stdout?.setEncoding("utf-8"),o.stderr?.setEncoding("utf-8"),o.stdout?.on("data",E=>{let w=Buffer.byteLength(E,"utf-8");if(f+w>_){if(!d){d=!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(`
1904
1904
  `)?`
1905
- `:"")+"system() output exceeds 10 MiB limit",h=new Error("system() output exceeds 10 MiB limit"),p()}return}f+=w,a+=E}),o.stderr?.on("data",E=>{let w=Buffer.byteLength(E,"utf-8");if(f+w>_){if(!d){d=!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(`
1905
+ `:"")+"system() output exceeds 10 MiB limit",g=new Error("system() output exceeds 10 MiB limit"),p()}return}f+=w,a+=E}),o.stderr?.on("data",E=>{let w=Buffer.byteLength(E,"utf-8");if(f+w>_){if(!d){d=!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(`
1906
1906
  `)?`
1907
- `:"")+"system() output exceeds 10 MiB limit",h=new Error("system() output exceeds 10 MiB limit"),p()}return}f+=w,l+=E}),o.on("error",E=>{h||(h=E)}),o.on("close",(E,w)=>{E!==null?(c=E,u=null):(c=null,u=w?String(w):null),p()})}catch(i){n(i instanceof Error?i:new Error(String(i)))}})}function NL(t,e=null){if(typeof t!="string")return t??e;let r=t.trim();if(r.length===0)return e;try{return JSON.parse(r)}catch{}let n=r.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);if(n&&n[1])try{return JSON.parse(n[1].trim())}catch{}let s=r.indexOf("{"),i=r.lastIndexOf("}");if(s!==-1&&i>s)try{return JSON.parse(r.slice(s,i+1))}catch{}let o=r.indexOf("["),a=r.lastIndexOf("]");if(o!==-1&&a>o)try{return JSON.parse(r.slice(o,a+1))}catch{}return e}function Vs(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),r="";for(;;){let n=0;try{n=U.readSync(0,e,0,1,null)}catch{return r.length>0?r:null}if(n===0)return r.length>0?r:null;let s=e.toString("utf-8",0,n);if(s===`
1907
+ `:"")+"system() output exceeds 10 MiB limit",g=new Error("system() output exceeds 10 MiB limit"),p()}return}f+=w,l+=E}),o.on("error",E=>{g||(g=E)}),o.on("close",(E,w)=>{E!==null?(c=E,u=null):(c=null,u=w?String(w):null),p()})}catch(i){n(i instanceof Error?i:new Error(String(i)))}})}function NL(t,e=null){if(typeof t!="string")return t??e;let r=t.trim();if(r.length===0)return e;try{return JSON.parse(r)}catch{}let n=r.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);if(n&&n[1])try{return JSON.parse(n[1].trim())}catch{}let s=r.indexOf("{"),i=r.lastIndexOf("}");if(s!==-1&&i>s)try{return JSON.parse(r.slice(s,i+1))}catch{}let o=r.indexOf("["),a=r.lastIndexOf("]");if(o!==-1&&a>o)try{return JSON.parse(r.slice(o,a+1))}catch{}return e}function Vs(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),r="";for(;;){let n=0;try{n=U.readSync(0,e,0,1,null)}catch{return r.length>0?r:null}if(n===0)return r.length>0?r:null;let s=e.toString("utf-8",0,n);if(s===`
1908
1908
  `)return r.endsWith("\r")&&(r=r.slice(0,-1)),r;r+=s}}catch{return null}}function Ks(t,e=typeof process<"u"?process.stdin:null,r=typeof process<"u"?process.stdout:null){return new Promise(n=>{if(!e||typeof e.on!="function"){n(null);return}if(e.destroyed||e.readableEnded){n(null);return}if(e.isTTY===!1||typeof process<"u"&&e===process.stdin&&!process.stdin.isTTY){n(null);return}t!=null&&r&&typeof r.write=="function"&&r.write(String(t));let s=Ry.createInterface({input:e,output:r,terminal:!!e.isTTY}),i=!1,o=()=>{s.close()};s.question("",a=>{i||(i=!0,o(),n(a))}),s.on("close",()=>{i||(i=!0,n(null))}),s.on("error",()=>{i||(i=!0,o(),n(null))})})}function Sy(t,e=!0,r=","){Cy(r);let n=[],s=[],i="",o=!1,a=!1,l=!1;for(let f=0;f<t.length;f++){let d=t[f],m=t[f+1];if(l=!0,o)d==='"'?m==='"'?(i+='"',f++):(o=!1,a=!0):i+=d;else{if(a&&d!==r&&d!=="\r"&&d!==`
1909
1909
  `)throw new Error("Invalid CSV: unexpected character after closing quote");if(d==='"'){if(i.length>0)throw new Error("Invalid CSV: quote inside unquoted field");o=!0}else d===r?(a=!1,s.push(i),i=""):d==="\r"?(m===`
1910
1910
  `&&f++,s.push(i),n.push(s),s=[],i="",a=!1,l=!1):d===`
1911
- `?(s.push(i),n.push(s),s=[],i="",a=!1,l=!1):i+=d}}if(o)throw new Error("Invalid CSV: unterminated quoted field");if(l&&(s.push(i),n.push(s)),!e)return n.map(f=>f.map(by));if(n.length===0)return[];let c=n[0].map(f=>f.trim()),u=[];for(let f=1;f<n.length;f++){let d=n[f],m={};for(let h=0;h<c.length;h++)yr(m,c[h],h<d.length?by(d[h]):null);u.push(m)}return u}function by(t){let e=t.trim();if(e==="")return"";if(/^-?\d+$/.test(e)){let r=Number(e);if(!Number.isNaN(r))return r}if(/^-?\d+\.\d+$/.test(e)){let r=Number(e);if(!Number.isNaN(r))return r}return e.toLowerCase()==="true"?!0:e.toLowerCase()==="false"?!1:e.toLowerCase()==="null"?null:t}function Iy(t,e=","){if(Cy(e),!Array.isArray(t)||t.length===0)return"";let r=t[0];if(Array.isArray(r))return t.map(n=>n.map(s=>ta(s,e)).join(e)).join(`
1911
+ `?(s.push(i),n.push(s),s=[],i="",a=!1,l=!1):i+=d}}if(o)throw new Error("Invalid CSV: unterminated quoted field");if(l&&(s.push(i),n.push(s)),!e)return n.map(f=>f.map(by));if(n.length===0)return[];let c=n[0].map(f=>f.trim()),u=[];for(let f=1;f<n.length;f++){let d=n[f],m={};for(let g=0;g<c.length;g++)yr(m,c[g],g<d.length?by(d[g]):null);u.push(m)}return u}function by(t){let e=t.trim();if(e==="")return"";if(/^-?\d+$/.test(e)){let r=Number(e);if(!Number.isNaN(r))return r}if(/^-?\d+\.\d+$/.test(e)){let r=Number(e);if(!Number.isNaN(r))return r}return e.toLowerCase()==="true"?!0:e.toLowerCase()==="false"?!1:e.toLowerCase()==="null"?null:t}function Iy(t,e=","){if(Cy(e),!Array.isArray(t)||t.length===0)return"";let r=t[0];if(Array.isArray(r))return t.map(n=>n.map(s=>ta(s,e)).join(e)).join(`
1912
1912
  `);if(typeof r=="object"&&r!==null){let n=Object.keys(r),s=n.map(o=>ta(o,e)).join(e),i=t.map(o=>n.map(a=>ta(Nt(o,a)??"",e)).join(e));return[s,...i].join(`
1913
1913
  `)}return t.map(n=>ta(n,e)).join(`
1914
1914
  `)}function ta(t,e){let r=t==null?"":String(t);return r===""||r.includes(e)||r.includes('"')||r.includes(`
1915
- `)||r.includes("\r")?`"${r.replaceAll('"','""')}"`:r}function Hd(t,e){if(!(!t||typeof t!="object")){"line"in t&&"column"in t&&!t.file&&(t.file=e);for(let r of Object.keys(t)){let n=t[r];if(Array.isArray(n))for(let s of n)Hd(s,e);else n&&typeof n=="object"&&Hd(n,e)}}}function CL(){if(!jd){let e=new qs(LL,"<std>").tokenize(),n=new Gs(e,"<std>").parse();for(let s of n.statements)s.kind==="FunctionDeclStmt"&&(s.isStdlib=!0);jd=n}return{kind:"Program",statements:[...jd.statements],line:1,column:1,file:"<std>"}}function OL(t,e={}){let r=e.file||"<main>",n=e.baseDir||(e.file?we.dirname(we.resolve(e.file)):process.cwd()),s=new Map,i=new Set;function o(g,p){if(e.moduleResolver)return e.moduleResolver(g,p).path;let _=n;p&&p!=="<main>"&&p!=="<std>"&&(_=we.dirname(p));let E=we.resolve(_,g);try{return U.realpathSync(E)}catch{return E}}function a(g,p){let _,E;if(e.moduleResolver){let v=e.moduleResolver(g,p);_=v.path,E=v.source}else{if(_=o(g,p),s.has(_))return s.get(_);if(i.has(_))return{kind:"Program",statements:[],line:1,column:1,file:_};try{E=U.readFileSync(_,"utf-8")}catch(v){throw new F(`Cannot resolve import '${g}': ${v?.message||String(v)}`,1,1,"PARSER",p)}}if(s.has(_))return s.get(_);if(i.has(_))return{kind:"Program",statements:[],line:1,column:1,file:_};i.add(_);let S=new qs(E,_).tokenize(),b=new Gs(S,_).parse();for(let v of b.statements)if(v.kind!=="FunctionDeclStmt"&&v.kind!=="ImportStmt")throw new F(`Library '${_}' cannot contain top-level executable statements; libraries must only declare functions. Found '${v.kind}'.`,v.line,v.column,"CHECKER",_);for(let v of b.statements)v.kind==="ImportStmt"&&a(v.path,_);return i.delete(_),s.set(_,b),b}let c=new qs(t,r).tokenize(),f=new Gs(c,r).parse(),d=r!=="<main>"?o(r):"<main>";s.set(d,f);for(let g of f.statements)g.kind==="ImportStmt"&&a(g.path,r);let m=[];if(!e.noStdlib){let g=CL();for(let p of g.statements)p.kind==="FunctionDeclStmt"&&m.push(p)}for(let[g,p]of s.entries())if(g!==d)for(let _ of p.statements)_.kind==="FunctionDeclStmt"&&m.push(_);for(let g of f.statements)g.kind!=="ImportStmt"&&m.push(g);let h={kind:"Program",statements:m,line:f.line,column:f.column,file:r},y=Array.from(s.keys());return{program:h,loadedFiles:y}}function FL(t,e){if(e===void 0)return`${t}(...args: any): any`;if(typeof e=="number"){let i=Array.from({length:e},(o,a)=>`arg${a+1}: any`);return`${t}(${i.join(", ")}): any`}let r=Array.from({length:e.min},(i,o)=>`arg${o+1}: any`),n=e.max===void 0?[]:Array.from({length:e.max-e.min},(i,o)=>`[arg${e.min+o+1}: any]`),s=e.max===void 0?["...args: any"]:[];return`${t}(${[...r,...n,...s].join(", ")}): any`}function ky(t,e){let r=new Date(t),n=(s,i=2)=>String(s).padStart(i,"0");return String(e).replace(/%[YmdHMS%]/g,s=>{switch(s){case"%Y":return String(r.getFullYear());case"%m":return n(r.getMonth()+1);case"%d":return n(r.getDate());case"%H":return n(r.getHours());case"%M":return n(r.getMinutes());case"%S":return n(r.getSeconds());case"%%":return"%";default:return s}})}function Js(t,e){let r=0,n=s=>typeof s=="object"&&s!==null?JSON.stringify(s):String(s);return String(t).replace(/%[sdf%]/g,s=>{if(s==="%%")return"%";let i=e[r++];return s==="%d"?String(Math.trunc(Number(i))):s==="%f"?String(Number(i)):n(i)})}async function PL(){console.log("================================================="),console.log(" LMScript Verification & Full Feature Test Suite "),console.log(`=================================================
1915
+ `)||r.includes("\r")?`"${r.replaceAll('"','""')}"`:r}function Hd(t,e){if(!(!t||typeof t!="object")){"line"in t&&"column"in t&&!t.file&&(t.file=e);for(let r of Object.keys(t)){let n=t[r];if(Array.isArray(n))for(let s of n)Hd(s,e);else n&&typeof n=="object"&&Hd(n,e)}}}function CL(){if(!jd){let e=new qs(LL,"<std>").tokenize(),n=new Gs(e,"<std>").parse();for(let s of n.statements)s.kind==="FunctionDeclStmt"&&(s.isStdlib=!0);jd=n}return{kind:"Program",statements:[...jd.statements],line:1,column:1,file:"<std>"}}function OL(t,e={}){let r=e.file||"<main>",n=e.baseDir||(e.file?we.dirname(we.resolve(e.file)):process.cwd()),s=new Map,i=new Set;function o(h,p){if(e.moduleResolver)return e.moduleResolver(h,p).path;let _=n;p&&p!=="<main>"&&p!=="<std>"&&(_=we.dirname(p));let E=we.resolve(_,h);try{return U.realpathSync(E)}catch{return E}}function a(h,p){let _,E;if(e.moduleResolver){let v=e.moduleResolver(h,p);_=v.path,E=v.source}else{if(_=o(h,p),s.has(_))return s.get(_);if(i.has(_))return{kind:"Program",statements:[],line:1,column:1,file:_};try{E=U.readFileSync(_,"utf-8")}catch(v){throw new F(`Cannot resolve import '${h}': ${v?.message||String(v)}`,1,1,"PARSER",p)}}if(s.has(_))return s.get(_);if(i.has(_))return{kind:"Program",statements:[],line:1,column:1,file:_};i.add(_);let S=new qs(E,_).tokenize(),b=new Gs(S,_).parse();for(let v of b.statements)if(v.kind!=="FunctionDeclStmt"&&v.kind!=="ImportStmt")throw new F(`Library '${_}' cannot contain top-level executable statements; libraries must only declare functions. Found '${v.kind}'.`,v.line,v.column,"CHECKER",_);for(let v of b.statements)v.kind==="ImportStmt"&&a(v.path,_);return i.delete(_),s.set(_,b),b}let c=new qs(t,r).tokenize(),f=new Gs(c,r).parse(),d=r!=="<main>"?o(r):"<main>";s.set(d,f);for(let h of f.statements)h.kind==="ImportStmt"&&a(h.path,r);let m=[];if(!e.noStdlib){let h=CL();for(let p of h.statements)p.kind==="FunctionDeclStmt"&&m.push(p)}for(let[h,p]of s.entries())if(h!==d)for(let _ of p.statements)_.kind==="FunctionDeclStmt"&&m.push(_);for(let h of f.statements)h.kind!=="ImportStmt"&&m.push(h);let g={kind:"Program",statements:m,line:f.line,column:f.column,file:r},y=Array.from(s.keys());return{program:g,loadedFiles:y}}function FL(t,e){if(e===void 0)return`${t}(...args: any): any`;if(typeof e=="number"){let i=Array.from({length:e},(o,a)=>`arg${a+1}: any`);return`${t}(${i.join(", ")}): any`}let r=Array.from({length:e.min},(i,o)=>`arg${o+1}: any`),n=e.max===void 0?[]:Array.from({length:e.max-e.min},(i,o)=>`[arg${e.min+o+1}: any]`),s=e.max===void 0?["...args: any"]:[];return`${t}(${[...r,...n,...s].join(", ")}): any`}function ky(t,e){let r=new Date(t),n=(s,i=2)=>String(s).padStart(i,"0");return String(e).replace(/%[YmdHMS%]/g,s=>{switch(s){case"%Y":return String(r.getFullYear());case"%m":return n(r.getMonth()+1);case"%d":return n(r.getDate());case"%H":return n(r.getHours());case"%M":return n(r.getMinutes());case"%S":return n(r.getSeconds());case"%%":return"%";default:return s}})}function Js(t,e){let r=0,n=s=>typeof s=="object"&&s!==null?JSON.stringify(s):String(s);return String(t).replace(/%[sdf%]/g,s=>{if(s==="%%")return"%";let i=e[r++];return s==="%d"?String(Math.trunc(Number(i))):s==="%f"?String(Number(i)):n(i)})}async function PL(){console.log("================================================="),console.log(" LMScript Verification & Full Feature Test Suite "),console.log(`=================================================
1916
1916
  `);let t=new Er,e=!0;console.log("Test Suite 1: Functions, Recursion, and Control Flow");let n=t.run(`
1917
1917
  fn factorial(n) {
1918
1918
  if (n <= 1) {
@@ -2147,10 +2147,10 @@ try {
2147
2147
  `;break;case"t":s+=" ";break;case"r":s+="\r";break;case"\\":s+="\\";break;case'"':s+='"';break;case"'":s+="'";break;default:s+=i;break}}else s+=this.advance()}if(this.pos>=this.length)throw new F("Unterminated string literal at end of file",r,n,"LEXER",this.file);return this.advance(),{type:"STRING",value:s,literal:s,line:r,column:n}}tryReadHeredoc(e,r){let n=this.pos+2;if(!this.isAlpha(this.source[n]))return;for(n++;n<this.length&&this.isAlphaNumeric(this.source[n]);)n++;let s=this.source.slice(this.pos+2,n),i=this.source[n]==="\r"&&this.source[n+1]===`
2148
2148
  `?2:this.source[n]===`
2149
2149
  `?1:0;if(i===0)return;let o=n+i-this.pos;for(let l=0;l<o;l++)this.advance();let a=this.pos;for(;this.pos<this.length;){let l=this.pos,c=this.pos;for(;c<this.length&&this.source[c]!=="\r"&&this.source[c]!==`
2150
- `;)c++;let u=this.source.slice(l,c),f=u===`${s};`;if(u===s||f){let h=this.source[c]==="\r"&&this.source[c+1]===`
2150
+ `;)c++;let u=this.source.slice(l,c),f=u===`${s};`;if(u===s||f){let g=this.source[c]==="\r"&&this.source[c+1]===`
2151
2151
  `?2:this.source[c]===`
2152
- `||this.source[c]==="\r"?1:0,y=this.source.slice(a,l),p=s.length+(f?0:h);for(let _=0;_<p;_++)this.advance();return{type:"STRING",value:y,literal:y,line:e,column:r}}let d=this.source[c]==="\r"&&this.source[c+1]===`
2153
- `?2:c<this.length?1:0,m=c+d-this.pos;for(let h=0;h<m;h++)this.advance()}throw new F(`Unterminated heredoc; expected closing marker '${s}'`,e,r,"LEXER",this.file)}readIdentifier(e,r){let n="";for(;this.pos<this.length&&this.isAlphaNumeric(this.peek());)n+=this.advance();let s=Object.hasOwn(xy,n)?xy[n]:void 0;if(s){let i;return s==="TRUE"&&(i=!0),s==="FALSE"&&(i=!1),s==="NULL"&&(i=null),{type:s,value:n,literal:i,line:e,column:r}}return{type:"IDENTIFIER",value:n,line:e,column:r}}};Gs=class{tokens;current=0;file;constructor(e,r){this.tokens=e,this.file=r}parse(){let e=[],r=this.peek();for(;!this.isAtEnd();)e.push(this.parseDeclaration(!0));let n={kind:"Program",statements:e,line:r.line,column:r.column,file:this.file};return this.file&&Hd(n,this.file),n}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 F("'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(r){throw r instanceof F?r:new F(r instanceof Error?r.message:String(r),this.peek().line,this.peek().column,"PARSER",this.file)}}parseImportStmt(){let e=this.previous(),r=this.consume("STRING","Expected file path string after 'import'");return this.consumeOptionalSemicolon(),{kind:"ImportStmt",path:r.value,line:e.line,column:e.column,file:this.file}}parseFunctionDecl(){let e=this.previous(),r=this.consume("IDENTIFIER","Expected function name after 'fn'");this.consume("LPAREN","Expected '(' after function name");let n=[];if(!this.check("RPAREN"))do{let i=this.consume("IDENTIFIER","Expected parameter name");n.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:r.value,params:n,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 r=this.consume("IDENTIFIER","Expected variable name after 'let'"),n;return this.match("ASSIGN")&&(n=this.parseExpression()),this.consumeOptionalSemicolon(),{kind:"VarDeclStmt",name:r.value,initializer:n,line:e.line,column:e.column}}parseStatement(){if(this.match("IMPORT"))throw new F("'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(),r=this.parseExpression();if(this.consumeOptionalSemicolon(),r.kind==="AssignExpr")return{kind:"SyncAssignStmt",target:r.target,value:r.value,line:e.line,column:e.column};if(r.kind==="IndexAssignExpr")return{kind:"SyncIndexAssignStmt",target:r.target,index:r.index,value:r.value,line:e.line,column:e.column};if(r.kind==="CallExpr")return{kind:"SyncCallStmt",call:r,line:e.line,column:e.column};throw new F("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 r=this.parseExpression();this.consume("RPAREN","Expected ')' after if condition");let n=this.parseStatement(),s;return this.match("ELSE")&&(s=this.parseStatement()),{kind:"IfStmt",condition:r,thenBranch:n,elseBranch:s,line:e.line,column:e.column}}parseWhileStatement(){let e=this.previous();this.consume("LPAREN","Expected '(' after 'while'");let r=this.parseExpression();this.consume("RPAREN","Expected ')' after while condition");let n=this.parseStatement();return{kind:"WhileStmt",condition:r,body:n,line:e.line,column:e.column}}parseForStatement(){let e=this.previous();this.consume("LPAREN","Expected '(' after 'for'");let r;if(this.match("SEMICOLON"))r=void 0;else if(this.match("LET"))r=this.parseVarDecl();else{let o=this.parseExpression();this.consume("SEMICOLON","Expected ';' after for-loop initializer"),r={kind:"ExprStmt",expr:o,line:o.line,column:o.column}}let n;this.check("SEMICOLON")||(n=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:r,condition:n,update:s,body:i,line:e.line,column:e.column}}parseReturnStatement(){let e=this.previous(),r;return!this.check("SEMICOLON")&&!this.check("RBRACE")&&!this.isAtEnd()&&(r=this.parseExpression()),this.consumeOptionalSemicolon(),{kind:"ReturnStmt",value:r,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 r=[];for(;!this.check("RBRACE")&&!this.isAtEnd();)r.push(this.parseDeclaration());return this.consume("RBRACE","Expected '}' after block"),{kind:"BlockStmt",statements:r,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.parseLogicalOr();if(this.match("ASSIGN")){let r=this.previous(),n=this.parseAssignment();if(e.kind==="IdentifierExpr")return{kind:"AssignExpr",target:e.name,value:n,line:r.line,column:r.column};if(e.kind==="IndexExpr")return{kind:"IndexAssignExpr",target:e.target,index:e.index,value:n,line:r.line,column:r.column};if(e.kind==="TupleExpr"||e.kind==="ArrayExpr"){let s=[];for(let i of e.elements){if(i.kind!=="IdentifierExpr")throw new F("Destructuring assignment target must be an identifier",i.line,i.column,"PARSER",this.file);s.push(i.name)}return{kind:"TupleAssignExpr",targets:s,value:n,line:r.line,column:r.column}}throw new F("Invalid assignment target",e.line,e.column,"PARSER",this.file)}return e}parseLogicalOr(){let e=this.parseLogicalAnd();for(;this.match("OR");){let r=this.previous(),n=this.parseLogicalAnd();e={kind:"BinaryExpr",operator:"||",left:e,right:n,line:r.line,column:r.column}}return e}parseLogicalAnd(){let e=this.parseEquality();for(;this.match("AND");){let r=this.previous(),n=this.parseEquality();e={kind:"BinaryExpr",operator:"&&",left:e,right:n,line:r.line,column:r.column}}return e}parseEquality(){let e=this.parseRelational();for(;this.match("EQUAL","NOT_EQUAL");){let r=this.previous(),n=r.type==="EQUAL"?"==":"!=",s=this.parseRelational();e={kind:"BinaryExpr",operator:n,left:e,right:s,line:r.line,column:r.column}}return e}parseRelational(){let e=this.parseAdditive();for(;this.match("LESS","LESS_EQUAL","GREATER","GREATER_EQUAL");){let r=this.previous(),n=r.type==="LESS"?"<":r.type==="LESS_EQUAL"?"<=":r.type==="GREATER"?">":">=",s=this.parseAdditive();e={kind:"BinaryExpr",operator:n,left:e,right:s,line:r.line,column:r.column}}return e}parseAdditive(){let e=this.parseMultiplicative();for(;this.match("PLUS","MINUS");){let r=this.previous(),n=r.type==="PLUS"?"+":"-",s=this.parseMultiplicative();e={kind:"BinaryExpr",operator:n,left:e,right:s,line:r.line,column:r.column}}return e}parseMultiplicative(){let e=this.parseUnary();for(;this.match("STAR","SLASH","PERCENT");){let r=this.previous(),n=r.type==="STAR"?"*":r.type==="SLASH"?"/":"%",s=this.parseUnary();e={kind:"BinaryExpr",operator:n,left:e,right:s,line:r.line,column:r.column}}return e}parseUnary(){if(this.match("NOT","MINUS")){let e=this.previous(),r=e.type==="NOT"?"!":"-",n=this.parseUnary();return{kind:"UnaryExpr",operator:r,operand:n,line:e.line,column:e.column}}return this.parseCallAndIndex()}parseCallAndIndex(){let e=this.parsePrimary();for(;;)if(this.match("LPAREN")){if(e.kind!=="IdentifierExpr")throw new F("Only identifiers 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:e.name,args:r,line:e.line,column:e.column}}else if(this.match("LBRACKET")){let r=this.parseExpression();this.consume("RBRACKET","Expected ']' after index expression"),e={kind:"IndexExpr",target:e,index:r,line:e.line,column:e.column}}else if(this.match("DOT")){let r=this.consume("IDENTIFIER","Expected property name after '.'");e={kind:"IndexExpr",target:e,index:{kind:"LiteralExpr",value:r.value,line:r.line,column:r.column},line:r.line,column:r.column}}else break;return e}parsePrimary(){let e=this.peek();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 r=this.previous();this.consume("LPAREN","Expected '(' after 'parallel'"),this.consume("LBRACKET","Expected '[' starting array of function calls in 'parallel([ ... ])'");let n=[];if(!this.check("RBRACKET"))do{let s=this.parseExpression();if(s.kind!=="CallExpr")throw new F("Each task in parallel([...]) must be a direct function call expression",s.line,s.column,"PARSER",this.file);n.push(s)}while(this.match("COMMA"));return this.consume("RBRACKET","Expected ']' closing array in 'parallel([ ... ])'"),this.consume("RPAREN","Expected ')' closing 'parallel(...)'"),{kind:"ParallelExpr",tasks:n,line:r.line,column:r.column}}if(this.match("IDENTIFIER"))return{kind:"IdentifierExpr",name:this.previous().value,line:e.line,column:e.column};if(this.match("LPAREN")){let r=this.previous(),n=[],s=!1;if(!this.check("RPAREN"))do if(n.push(this.parseExpression()),this.match("COMMA"))s=!0;else break;while(!this.check("RPAREN")&&!this.isAtEnd());return this.consume("RPAREN","Expected ')' after expression"),n.length===1&&!s?{kind:"GroupingExpr",expression:n[0],line:r.line,column:r.column}:{kind:"TupleExpr",elements:n,line:r.line,column:r.column}}if(this.match("LBRACKET")){let r=[];if(!this.check("RBRACKET"))do r.push(this.parseExpression());while(this.match("COMMA"));return this.consume("RBRACKET","Expected ']' after array elements"),{kind:"ArrayExpr",elements:r,line:e.line,column:e.column}}if(this.match("LBRACE")){let r=this.previous(),n=[];if(!this.check("RBRACE"))do{let s="";if(this.match("IDENTIFIER","STRING"))s=this.previous().value;else throw new F("Expected object key (identifier or string)",this.peek().line,this.peek().column,"PARSER",this.file);this.consume("COLON","Expected ':' after object key");let i=this.parseExpression();n.push({key:s,value:i})}while(this.match("COMMA"));return this.consume("RBRACE","Expected '}' after object literal"),{kind:"ObjectExpr",properties:n,line:r.line,column:r.column}}throw new F(`Unexpected token '${e.value||e.type}' in expression`,e.line,e.column,"PARSER",this.file)}match(...e){for(let r of e)if(this.check(r))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,r){if(this.check(e))return this.advance();let n=this.peek();throw new F(r,n.line,n.column,"PARSER",this.file)}consumeOptionalSemicolon(){this.check("SEMICOLON")&&this.advance()}},LL=`# LMScript Standard Library (std.lms)
2152
+ `||this.source[c]==="\r"?1:0,y=this.source.slice(a,l),p=s.length+(f?0:g);for(let _=0;_<p;_++)this.advance();return{type:"STRING",value:y,literal:y,line:e,column:r}}let d=this.source[c]==="\r"&&this.source[c+1]===`
2153
+ `?2:c<this.length?1:0,m=c+d-this.pos;for(let g=0;g<m;g++)this.advance()}throw new F(`Unterminated heredoc; expected closing marker '${s}'`,e,r,"LEXER",this.file)}readIdentifier(e,r){let n="";for(;this.pos<this.length&&this.isAlphaNumeric(this.peek());)n+=this.advance();let s=Object.hasOwn(xy,n)?xy[n]:void 0;if(s){let i;return s==="TRUE"&&(i=!0),s==="FALSE"&&(i=!1),s==="NULL"&&(i=null),{type:s,value:n,literal:i,line:e,column:r}}return{type:"IDENTIFIER",value:n,line:e,column:r}}};Gs=class{tokens;current=0;file;constructor(e,r){this.tokens=e,this.file=r}parse(){let e=[],r=this.peek();for(;!this.isAtEnd();)e.push(this.parseDeclaration(!0));let n={kind:"Program",statements:e,line:r.line,column:r.column,file:this.file};return this.file&&Hd(n,this.file),n}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 F("'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(r){throw r instanceof F?r:new F(r instanceof Error?r.message:String(r),this.peek().line,this.peek().column,"PARSER",this.file)}}parseImportStmt(){let e=this.previous(),r=this.consume("STRING","Expected file path string after 'import'");return this.consumeOptionalSemicolon(),{kind:"ImportStmt",path:r.value,line:e.line,column:e.column,file:this.file}}parseFunctionDecl(){let e=this.previous(),r=this.consume("IDENTIFIER","Expected function name after 'fn'");this.consume("LPAREN","Expected '(' after function name");let n=[];if(!this.check("RPAREN"))do{let i=this.consume("IDENTIFIER","Expected parameter name");n.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:r.value,params:n,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 r=this.consume("IDENTIFIER","Expected variable name after 'let'"),n;return this.match("ASSIGN")&&(n=this.parseExpression()),this.consumeOptionalSemicolon(),{kind:"VarDeclStmt",name:r.value,initializer:n,line:e.line,column:e.column}}parseStatement(){if(this.match("IMPORT"))throw new F("'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(),r=this.parseExpression();if(this.consumeOptionalSemicolon(),r.kind==="AssignExpr")return{kind:"SyncAssignStmt",target:r.target,value:r.value,line:e.line,column:e.column};if(r.kind==="IndexAssignExpr")return{kind:"SyncIndexAssignStmt",target:r.target,index:r.index,value:r.value,line:e.line,column:e.column};if(r.kind==="CallExpr")return{kind:"SyncCallStmt",call:r,line:e.line,column:e.column};throw new F("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 r=this.parseExpression();this.consume("RPAREN","Expected ')' after if condition");let n=this.parseStatement(),s;return this.match("ELSE")&&(s=this.parseStatement()),{kind:"IfStmt",condition:r,thenBranch:n,elseBranch:s,line:e.line,column:e.column}}parseWhileStatement(){let e=this.previous();this.consume("LPAREN","Expected '(' after 'while'");let r=this.parseExpression();this.consume("RPAREN","Expected ')' after while condition");let n=this.parseStatement();return{kind:"WhileStmt",condition:r,body:n,line:e.line,column:e.column}}parseForStatement(){let e=this.previous();this.consume("LPAREN","Expected '(' after 'for'");let r;if(this.match("SEMICOLON"))r=void 0;else if(this.match("LET"))r=this.parseVarDecl();else{let o=this.parseExpression();this.consume("SEMICOLON","Expected ';' after for-loop initializer"),r={kind:"ExprStmt",expr:o,line:o.line,column:o.column}}let n;this.check("SEMICOLON")||(n=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:r,condition:n,update:s,body:i,line:e.line,column:e.column}}parseReturnStatement(){let e=this.previous(),r;return!this.check("SEMICOLON")&&!this.check("RBRACE")&&!this.isAtEnd()&&(r=this.parseExpression()),this.consumeOptionalSemicolon(),{kind:"ReturnStmt",value:r,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 r=[];for(;!this.check("RBRACE")&&!this.isAtEnd();)r.push(this.parseDeclaration());return this.consume("RBRACE","Expected '}' after block"),{kind:"BlockStmt",statements:r,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.parseLogicalOr();if(this.match("ASSIGN")){let r=this.previous(),n=this.parseAssignment();if(e.kind==="IdentifierExpr")return{kind:"AssignExpr",target:e.name,value:n,line:r.line,column:r.column};if(e.kind==="IndexExpr")return{kind:"IndexAssignExpr",target:e.target,index:e.index,value:n,line:r.line,column:r.column};if(e.kind==="TupleExpr"||e.kind==="ArrayExpr"){let s=[];for(let i of e.elements){if(i.kind!=="IdentifierExpr")throw new F("Destructuring assignment target must be an identifier",i.line,i.column,"PARSER",this.file);s.push(i.name)}return{kind:"TupleAssignExpr",targets:s,value:n,line:r.line,column:r.column}}throw new F("Invalid assignment target",e.line,e.column,"PARSER",this.file)}return e}parseLogicalOr(){let e=this.parseLogicalAnd();for(;this.match("OR");){let r=this.previous(),n=this.parseLogicalAnd();e={kind:"BinaryExpr",operator:"||",left:e,right:n,line:r.line,column:r.column}}return e}parseLogicalAnd(){let e=this.parseEquality();for(;this.match("AND");){let r=this.previous(),n=this.parseEquality();e={kind:"BinaryExpr",operator:"&&",left:e,right:n,line:r.line,column:r.column}}return e}parseEquality(){let e=this.parseRelational();for(;this.match("EQUAL","NOT_EQUAL");){let r=this.previous(),n=r.type==="EQUAL"?"==":"!=",s=this.parseRelational();e={kind:"BinaryExpr",operator:n,left:e,right:s,line:r.line,column:r.column}}return e}parseRelational(){let e=this.parseAdditive();for(;this.match("LESS","LESS_EQUAL","GREATER","GREATER_EQUAL");){let r=this.previous(),n=r.type==="LESS"?"<":r.type==="LESS_EQUAL"?"<=":r.type==="GREATER"?">":">=",s=this.parseAdditive();e={kind:"BinaryExpr",operator:n,left:e,right:s,line:r.line,column:r.column}}return e}parseAdditive(){let e=this.parseMultiplicative();for(;this.match("PLUS","MINUS");){let r=this.previous(),n=r.type==="PLUS"?"+":"-",s=this.parseMultiplicative();e={kind:"BinaryExpr",operator:n,left:e,right:s,line:r.line,column:r.column}}return e}parseMultiplicative(){let e=this.parseUnary();for(;this.match("STAR","SLASH","PERCENT");){let r=this.previous(),n=r.type==="STAR"?"*":r.type==="SLASH"?"/":"%",s=this.parseUnary();e={kind:"BinaryExpr",operator:n,left:e,right:s,line:r.line,column:r.column}}return e}parseUnary(){if(this.match("NOT","MINUS")){let e=this.previous(),r=e.type==="NOT"?"!":"-",n=this.parseUnary();return{kind:"UnaryExpr",operator:r,operand:n,line:e.line,column:e.column}}return this.parseCallAndIndex()}parseCallAndIndex(){let e=this.parsePrimary();for(;;)if(this.match("LPAREN")){if(e.kind!=="IdentifierExpr")throw new F("Only identifiers 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:e.name,args:r,line:e.line,column:e.column}}else if(this.match("LBRACKET")){let r=this.parseExpression();this.consume("RBRACKET","Expected ']' after index expression"),e={kind:"IndexExpr",target:e,index:r,line:e.line,column:e.column}}else if(this.match("DOT")){let r=this.consume("IDENTIFIER","Expected property name after '.'");e={kind:"IndexExpr",target:e,index:{kind:"LiteralExpr",value:r.value,line:r.line,column:r.column},line:r.line,column:r.column}}else break;return e}parsePrimary(){let e=this.peek();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 r=this.previous();this.consume("LPAREN","Expected '(' after 'parallel'"),this.consume("LBRACKET","Expected '[' starting array of function calls in 'parallel([ ... ])'");let n=[];if(!this.check("RBRACKET"))do{let s=this.parseExpression();if(s.kind!=="CallExpr")throw new F("Each task in parallel([...]) must be a direct function call expression",s.line,s.column,"PARSER",this.file);n.push(s)}while(this.match("COMMA"));return this.consume("RBRACKET","Expected ']' closing array in 'parallel([ ... ])'"),this.consume("RPAREN","Expected ')' closing 'parallel(...)'"),{kind:"ParallelExpr",tasks:n,line:r.line,column:r.column}}if(this.match("IDENTIFIER"))return{kind:"IdentifierExpr",name:this.previous().value,line:e.line,column:e.column};if(this.match("LPAREN")){let r=this.previous(),n=[],s=!1;if(!this.check("RPAREN"))do if(n.push(this.parseExpression()),this.match("COMMA"))s=!0;else break;while(!this.check("RPAREN")&&!this.isAtEnd());return this.consume("RPAREN","Expected ')' after expression"),n.length===1&&!s?{kind:"GroupingExpr",expression:n[0],line:r.line,column:r.column}:{kind:"TupleExpr",elements:n,line:r.line,column:r.column}}if(this.match("LBRACKET")){let r=[];if(!this.check("RBRACKET"))do r.push(this.parseExpression());while(this.match("COMMA"));return this.consume("RBRACKET","Expected ']' after array elements"),{kind:"ArrayExpr",elements:r,line:e.line,column:e.column}}if(this.match("LBRACE")){let r=this.previous(),n=[];if(!this.check("RBRACE"))do{let s="";if(this.match("IDENTIFIER","STRING"))s=this.previous().value;else throw new F("Expected object key (identifier or string)",this.peek().line,this.peek().column,"PARSER",this.file);this.consume("COLON","Expected ':' after object key");let i=this.parseExpression();n.push({key:s,value:i})}while(this.match("COMMA"));return this.consume("RBRACE","Expected '}' after object literal"),{kind:"ObjectExpr",properties:n,line:r.line,column:r.column}}throw new F(`Unexpected token '${e.value||e.type}' in expression`,e.line,e.column,"PARSER",this.file)}match(...e){for(let r of e)if(this.check(r))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,r){if(this.check(e))return this.advance();let n=this.peek();throw new F(r,n.line,n.column,"PARSER",this.file)}consumeOptionalSemicolon(){this.check("SEMICOLON")&&this.advance()}},LL=`# LMScript Standard Library (std.lms)
2154
2154
 
2155
2155
  # String Utilities
2156
2156
  fn is_blank(s) {
@@ -2245,12 +2245,12 @@ fn clamp(val, low, high) {
2245
2245
  }
2246
2246
  return val;
2247
2247
  }
2248
- `,jd=null;qr=class{variables=new Set;parent;constructor(e){this.parent=e}define(e){this.variables.add(e)}hasInCurrent(e){return this.variables.has(e)}resolve(e){return this.variables.has(e)?!0:this.parent?this.parent.resolve(e):!1}},Xd=class{diagnostics=[];hostFunctions=new Map;options;functions=new Map;currentScope=new qr;loopDepth=0;inFunction=!1;hasConcurrency=!1;constructor(e,r={}){this.options=r;for(let[n,s]of e.entries())this.hostFunctions.set(n,s),this.functions.set(n,{name:n,paramCount:typeof s.arity=="number"?s.arity:-1,params:[],isHost:!0,line:0,column:0})}check(e){if(this.diagnostics=[],this.hasConcurrency=!1,this.loopDepth=0,this.inFunction=!1,this.currentScope=new qr,this.options.globals)for(let r of this.options.globals)this.currentScope.define(r);this.functions.clear();for(let[r,n]of this.hostFunctions.entries())this.functions.set(r,{name:r,paramCount:typeof n.arity=="number"?n.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)this.checkStmt(r);return this.diagnostics}addError(e,r,n,s){this.diagnostics.push({message:e,line:r,column:n,severity:"error",file:s})}collectFunction(e){if(this.functions.has(e.name)){let n=this.functions.get(e.name);if(n.isHost){this.addError(`Cannot redefine host function '${e.name}'`,e.line,e.column,e.file);return}if(n.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=n.file?`${n.file}:${n.line}`:`line ${n.line}`;this.addError(`Duplicate function declaration '${e.name}' (already defined at ${s})`,e.line,e.column,e.file);return}let r=new Set;for(let n of e.params)r.has(n)&&this.addError(`Duplicate parameter name '${n}' in function '${e.name}'`,e.line,e.column,e.file),r.add(n);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"ImportStmt":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 r=this.currentScope,n=this.inFunction;this.inFunction=!0,this.currentScope=new qr(r);for(let s of e.params)this.currentScope.define(s);for(let s of e.body.statements)this.checkStmt(s);this.inFunction=n,this.currentScope=r;break}case"VarDeclStmt":{this.currentScope.hasInCurrent(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);break}case"TupleVarDeclStmt":{this.checkExpr(e.initializer);for(let r of e.names)this.currentScope.hasInCurrent(r)&&this.addError(`Variable '${r}' is already declared in this scope`,e.line,e.column,e.file),this.currentScope.define(r);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"ForStmt":{let r=this.currentScope;this.currentScope=new qr(r),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=r;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 r=this.currentScope;this.currentScope=new qr(r);for(let n of e.statements)this.checkStmt(n);this.currentScope=r;break}case"SyncAssignStmt":{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 r=e.call;r.args.length===0&&this.addError(`Synchronized call '${r.callee}' requires at least one argument (the target container)`,e.line,e.column,e.file);let n=this.hostFunctions.get(r.callee);(!n||!n.isContainerMutation)&&this.addError(`Synchronized call '${r.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 r=e.args[0];for(;r.kind==="GroupingExpr";)r=r.expression;if(r.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 r.value!="string"){this.addError(`File path in '${e.callee}' must be a string`,e.line,e.column,e.file);return}try{if(!U.statSync(r.value).isFile())throw new Error("path is not a regular file");U.accessSync(r.value,U.constants.R_OK)}catch(n){this.addError(`Cannot read file ${JSON.stringify(r.value)}: ${n instanceof Error?n.message:String(n)}`,e.line,e.column,e.file)}}checkExpr(e){switch(e.kind){case"LiteralExpr":break;case"IdentifierExpr":{!this.currentScope.resolve(e.name)&&!this.functions.has(e.name)&&this.addError(`Undeclared variable '${e.name}'`,e.line,e.column,e.file);break}case"AssignExpr":{this.checkExpr(e.value),this.currentScope.resolve(e.target)||this.currentScope.define(e.target);break}case"TupleAssignExpr":{this.checkExpr(e.value);for(let r of e.targets)this.currentScope.resolve(r)||this.currentScope.define(r);break}case"IndexAssignExpr":{this.checkExpr(e.target),this.checkExpr(e.index),this.checkExpr(e.value);break}case"UnaryExpr":{this.checkExpr(e.operand);break}case"BinaryExpr":{this.checkExpr(e.left),this.checkExpr(e.right);break}case"GroupingExpr":{this.checkExpr(e.expression);break}case"TupleExpr":{for(let r of e.elements)this.checkExpr(r);break}case"ArrayExpr":{for(let r of e.elements)this.checkExpr(r);break}case"ObjectExpr":{for(let r of e.properties)this.checkExpr(r.value);break}case"IndexExpr":{this.checkExpr(e.target),this.checkExpr(e.index);break}case"ParallelExpr":{this.hasConcurrency=!0;for(let r of e.tasks)this.checkExpr(r);break}case"CallExpr":{let r=this.functions.get(e.callee);r?r.paramCount>=0&&e.args.length!==r.paramCount&&this.addError(`Function '${e.callee}' expects ${r.paramCount} argument(s), but received ${e.args.length}`,e.line,e.column,e.file):this.currentScope.resolve(e.callee)||this.addError(`Call to undefined function '${e.callee}'`,e.line,e.column,e.file);let n=this.hostFunctions.get(e.callee),s=n?.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),this.options.checkFiles&&n?.readsFile&&e.args.length>0&&this.checkReadPath(e);for(let i of e.args)this.checkExpr(i);break}}}},Cn=class{value;constructor(e){this.value=e}},gr=class{},_r=class{},On=class{name;constructor(e){this.name=e}toString(){return`<function ${this.name}>`}},ht=class t{static nextId=1;id=t.nextId++;values=new Map;parent;isFunctionBoundary;constructor(e,r=!1){this.parent=e,this.isFunctionBoundary=r}resolveBinding(e){if(this.values.has(e))return{env:this,name:e};if(this.parent)return this.parent.resolveBinding(e)}define(e,r){this.values.set(e,r)}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)}set(e,r){if(this.values.has(e)){this.values.set(e,r);return}if(!this.isFunctionBoundary&&this.parent?.has(e)){this.parent.set(e,r);return}this.values.set(e,r)}},sa=class{holderTaskId;depth=0;waiters=[];acquire(e=0,r=1e4){return this.depth===0?(this.holderTaskId=e,this.depth=1,Promise.resolve()):this.holderTaskId===e?(this.depth++,Promise.resolve()):new Promise((n,s)=>{let i;r>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 ${r}ms (possible deadlock)`)))},r));let o=()=>{i&&clearTimeout(i),this.holderTaskId=e,this.depth=1,n()};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,r=0,n=1e4){await this.acquire(r,n);try{return await e()}finally{this.release()}}},qd=class{bindingLocks=new Map;objectLocks=new WeakMap;getBindingLock(e){let r=this.bindingLocks.get(e);return r||(r=new sa,this.bindingLocks.set(e,r)),r}getObjectLock(e){let r=this.objectLocks.get(e);return r||(r=new sa,this.objectLocks.set(e,r)),r}},ia=class{globalEnv;userFunctions=new Map;hostFunctions;stdout;stderr;lockManager=new qd;isAsync;nextTaskId=1;initialGlobals;callDepth=0;asyncCallDepth=new Map;recordedErrors=[];constructor(e,r=o=>console.log(o),n=!1,s,i){this.stdout=r,this.stderr=i,this.isAsync=n,this.initialGlobals=s,this.globalEnv=new ht,this.hostFunctions=new Map(e);let o=e.get("print");(!o||o.isDefault)&&this.hostFunctions.set("print",{fn:(...g)=>{let p=g.map(_=>typeof _=="object"?JSON.stringify(_):String(_)).join(" ");return this.stdout(p),p},description:"Prints formatted values to output log",isDefault:!0});let a=e.get("println");(!a||a.isDefault)&&this.hostFunctions.set("println",{fn:(...g)=>{let p=g.map(_=>typeof _=="object"?JSON.stringify(_):String(_)).join(" ");return this.stdout(p),p},description:"Prints line to output log",isDefault:!0});let l=e.get("printf");(!l||l.isDefault)&&this.hostFunctions.set("printf",{fn:(g,...p)=>{let _=Js(g,p);return this.stdout(_),_},description:"Formats a template using %s/%d/%f/%% substitution and prints it",isDefault:!0});let c=e.get("error");(!c||c.isDefault)&&this.hostFunctions.set("error",{fn:(...g)=>{let p=g.map(_=>typeof _=="object"?JSON.stringify(_):String(_)).join(" ");return this.stderr?this.stderr(`error: ${p}`):typeof process<"u"&&process.stderr?process.stderr.write(`error: ${p}
2249
- `):console.error(`error: ${p}`),this.recordedErrors.push(p),p},description:"Prints error message to stderr and records it for execution error summary",isDefault:!0});let u=e.get("system");(!u||u.isDefault)&&this.hostFunctions.set("system",{fn:(g,p=6e4)=>{if(!Number.isSafeInteger(p)||p<0)throw new Error("system() timeout must be a non-negative safe integer in milliseconds");return this.isAsync?$y(g,p):Dy(g,p)},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 f=e.get("prompt_human");(!f||f.isDefault)&&this.hostFunctions.set("prompt_human",{fn:g=>this.isAsync?Ks(g):Vs(g),arity:{min:0,max:1},description:"Prompts operator on stdin/terminal, returning input string or null if closed/non-interactive",isDefault:!0});let d=e.get("shell_quote");(!d||d.isDefault)&&this.hostFunctions.set("shell_quote",{fn:g=>My(g),arity:1,description:"Quotes string safely for POSIX shell command execution",isDefault:!0});let m=e.get("run_script");(!m||m.isDefault)&&this.hostFunctions.set("run_script",{fn:(g,p=[])=>{let _=we.resolve(String(g));if(!U.existsSync(_))throw new Error(`run_script: file not found: '${_}'`);let E=U.readFileSync(_,"utf-8"),w=Array.isArray(p)?p.map(String):[],S=new Er;for(let[T,b]of this.hostFunctions)S.hasFunction(T)?b.isDefault||S.registerFunction(T,b.fn,b.arity,{description:b.description,allowOverwrite:!0},!1,b.isContainerMutation):S.registerFunction(T,b.fn,b.arity,b.description,b.isDefault,b.isContainerMutation);if(S.setGlobal("args",[...w]),S.setGlobal("ARGV",[_,...w]),this.isAsync)return(async()=>{let T=await S.runAsync(E,{file:_}),b=T.output.join(`
2248
+ `,jd=null;qr=class{variables=new Set;parent;constructor(e){this.parent=e}define(e){this.variables.add(e)}hasInCurrent(e){return this.variables.has(e)}resolve(e){return this.variables.has(e)?!0:this.parent?this.parent.resolve(e):!1}},Xd=class{diagnostics=[];hostFunctions=new Map;options;functions=new Map;currentScope=new qr;loopDepth=0;inFunction=!1;hasConcurrency=!1;constructor(e,r={}){this.options=r;for(let[n,s]of e.entries())this.hostFunctions.set(n,s),this.functions.set(n,{name:n,paramCount:typeof s.arity=="number"?s.arity:-1,params:[],isHost:!0,line:0,column:0})}check(e){if(this.diagnostics=[],this.hasConcurrency=!1,this.loopDepth=0,this.inFunction=!1,this.currentScope=new qr,this.options.globals)for(let r of this.options.globals)this.currentScope.define(r);this.functions.clear();for(let[r,n]of this.hostFunctions.entries())this.functions.set(r,{name:r,paramCount:typeof n.arity=="number"?n.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)this.checkStmt(r);return this.diagnostics}addError(e,r,n,s){this.diagnostics.push({message:e,line:r,column:n,severity:"error",file:s})}collectFunction(e){if(this.functions.has(e.name)){let n=this.functions.get(e.name);if(n.isHost){this.addError(`Cannot redefine host function '${e.name}'`,e.line,e.column,e.file);return}if(n.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=n.file?`${n.file}:${n.line}`:`line ${n.line}`;this.addError(`Duplicate function declaration '${e.name}' (already defined at ${s})`,e.line,e.column,e.file);return}let r=new Set;for(let n of e.params)r.has(n)&&this.addError(`Duplicate parameter name '${n}' in function '${e.name}'`,e.line,e.column,e.file),r.add(n);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"ImportStmt":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 r=this.currentScope,n=this.inFunction;this.inFunction=!0,this.currentScope=new qr(r);for(let s of e.params)this.currentScope.define(s);for(let s of e.body.statements)this.checkStmt(s);this.inFunction=n,this.currentScope=r;break}case"VarDeclStmt":{this.currentScope.hasInCurrent(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);break}case"TupleVarDeclStmt":{this.checkExpr(e.initializer);for(let r of e.names)this.currentScope.hasInCurrent(r)&&this.addError(`Variable '${r}' is already declared in this scope`,e.line,e.column,e.file),this.currentScope.define(r);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"ForStmt":{let r=this.currentScope;this.currentScope=new qr(r),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=r;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 r=this.currentScope;this.currentScope=new qr(r);for(let n of e.statements)this.checkStmt(n);this.currentScope=r;break}case"SyncAssignStmt":{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 r=e.call;r.args.length===0&&this.addError(`Synchronized call '${r.callee}' requires at least one argument (the target container)`,e.line,e.column,e.file);let n=this.hostFunctions.get(r.callee);(!n||!n.isContainerMutation)&&this.addError(`Synchronized call '${r.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 r=e.args[0];for(;r.kind==="GroupingExpr";)r=r.expression;if(r.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 r.value!="string"){this.addError(`File path in '${e.callee}' must be a string`,e.line,e.column,e.file);return}try{if(!U.statSync(r.value).isFile())throw new Error("path is not a regular file");U.accessSync(r.value,U.constants.R_OK)}catch(n){this.addError(`Cannot read file ${JSON.stringify(r.value)}: ${n instanceof Error?n.message:String(n)}`,e.line,e.column,e.file)}}checkExpr(e){switch(e.kind){case"LiteralExpr":break;case"IdentifierExpr":{!this.currentScope.resolve(e.name)&&!this.functions.has(e.name)&&this.addError(`Undeclared variable '${e.name}'`,e.line,e.column,e.file);break}case"AssignExpr":{this.checkExpr(e.value),this.currentScope.resolve(e.target)||this.currentScope.define(e.target);break}case"TupleAssignExpr":{this.checkExpr(e.value);for(let r of e.targets)this.currentScope.resolve(r)||this.currentScope.define(r);break}case"IndexAssignExpr":{this.checkExpr(e.target),this.checkExpr(e.index),this.checkExpr(e.value);break}case"UnaryExpr":{this.checkExpr(e.operand);break}case"BinaryExpr":{this.checkExpr(e.left),this.checkExpr(e.right);break}case"GroupingExpr":{this.checkExpr(e.expression);break}case"TupleExpr":{for(let r of e.elements)this.checkExpr(r);break}case"ArrayExpr":{for(let r of e.elements)this.checkExpr(r);break}case"ObjectExpr":{for(let r of e.properties)this.checkExpr(r.value);break}case"IndexExpr":{this.checkExpr(e.target),this.checkExpr(e.index);break}case"ParallelExpr":{this.hasConcurrency=!0;for(let r of e.tasks)this.checkExpr(r);break}case"CallExpr":{let r=this.functions.get(e.callee);r?r.paramCount>=0&&e.args.length!==r.paramCount&&this.addError(`Function '${e.callee}' expects ${r.paramCount} argument(s), but received ${e.args.length}`,e.line,e.column,e.file):this.currentScope.resolve(e.callee)||this.addError(`Call to undefined function '${e.callee}'`,e.line,e.column,e.file);let n=this.hostFunctions.get(e.callee),s=n?.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),this.options.checkFiles&&n?.readsFile&&e.args.length>0&&this.checkReadPath(e);for(let i of e.args)this.checkExpr(i);break}}}},Cn=class{value;constructor(e){this.value=e}},gr=class{},_r=class{},On=class{name;constructor(e){this.name=e}toString(){return`<function ${this.name}>`}},ht=class t{static nextId=1;id=t.nextId++;values=new Map;parent;isFunctionBoundary;constructor(e,r=!1){this.parent=e,this.isFunctionBoundary=r}resolveBinding(e){if(this.values.has(e))return{env:this,name:e};if(this.parent)return this.parent.resolveBinding(e)}define(e,r){this.values.set(e,r)}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)}set(e,r){if(this.values.has(e)){this.values.set(e,r);return}if(!this.isFunctionBoundary&&this.parent?.has(e)){this.parent.set(e,r);return}this.values.set(e,r)}},sa=class{holderTaskId;depth=0;waiters=[];acquire(e=0,r=1e4){return this.depth===0?(this.holderTaskId=e,this.depth=1,Promise.resolve()):this.holderTaskId===e?(this.depth++,Promise.resolve()):new Promise((n,s)=>{let i;r>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 ${r}ms (possible deadlock)`)))},r));let o=()=>{i&&clearTimeout(i),this.holderTaskId=e,this.depth=1,n()};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,r=0,n=1e4){await this.acquire(r,n);try{return await e()}finally{this.release()}}},qd=class{bindingLocks=new Map;objectLocks=new WeakMap;getBindingLock(e){let r=this.bindingLocks.get(e);return r||(r=new sa,this.bindingLocks.set(e,r)),r}getObjectLock(e){let r=this.objectLocks.get(e);return r||(r=new sa,this.objectLocks.set(e,r)),r}},ia=class{globalEnv;userFunctions=new Map;hostFunctions;stdout;stderr;lockManager=new qd;isAsync;nextTaskId=1;initialGlobals;callDepth=0;asyncCallDepth=new Map;recordedErrors=[];constructor(e,r=o=>console.log(o),n=!1,s,i){this.stdout=r,this.stderr=i,this.isAsync=n,this.initialGlobals=s,this.globalEnv=new ht,this.hostFunctions=new Map(e);let o=e.get("print");(!o||o.isDefault)&&this.hostFunctions.set("print",{fn:(...h)=>{let p=h.map(_=>typeof _=="object"?JSON.stringify(_):String(_)).join(" ");return this.stdout(p),p},description:"Prints formatted values to output log",isDefault:!0});let a=e.get("println");(!a||a.isDefault)&&this.hostFunctions.set("println",{fn:(...h)=>{let p=h.map(_=>typeof _=="object"?JSON.stringify(_):String(_)).join(" ");return this.stdout(p),p},description:"Prints line to output log",isDefault:!0});let l=e.get("printf");(!l||l.isDefault)&&this.hostFunctions.set("printf",{fn:(h,...p)=>{let _=Js(h,p);return this.stdout(_),_},description:"Formats a template using %s/%d/%f/%% substitution and prints it",isDefault:!0});let c=e.get("error");(!c||c.isDefault)&&this.hostFunctions.set("error",{fn:(...h)=>{let p=h.map(_=>typeof _=="object"?JSON.stringify(_):String(_)).join(" ");return this.stderr?this.stderr(`error: ${p}`):typeof process<"u"&&process.stderr?process.stderr.write(`error: ${p}
2249
+ `):console.error(`error: ${p}`),this.recordedErrors.push(p),p},description:"Prints error message to stderr and records it for execution error summary",isDefault:!0});let u=e.get("system");(!u||u.isDefault)&&this.hostFunctions.set("system",{fn:(h,p=6e4)=>{if(!Number.isSafeInteger(p)||p<0)throw new Error("system() timeout must be a non-negative safe integer in milliseconds");return this.isAsync?$y(h,p):Dy(h,p)},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 f=e.get("prompt_human");(!f||f.isDefault)&&this.hostFunctions.set("prompt_human",{fn:h=>this.isAsync?Ks(h):Vs(h),arity:{min:0,max:1},description:"Prompts operator on stdin/terminal, returning input string or null if closed/non-interactive",isDefault:!0});let d=e.get("shell_quote");(!d||d.isDefault)&&this.hostFunctions.set("shell_quote",{fn:h=>My(h),arity:1,description:"Quotes string safely for POSIX shell command execution",isDefault:!0});let m=e.get("run_script");(!m||m.isDefault)&&this.hostFunctions.set("run_script",{fn:(h,p=[])=>{let _=we.resolve(String(h));if(!U.existsSync(_))throw new Error(`run_script: file not found: '${_}'`);let E=U.readFileSync(_,"utf-8"),w=Array.isArray(p)?p.map(String):[],S=new Er;for(let[T,b]of this.hostFunctions)S.hasFunction(T)?b.isDefault||S.registerFunction(T,b.fn,b.arity,{description:b.description,allowOverwrite:!0},!1,b.isContainerMutation):S.registerFunction(T,b.fn,b.arity,b.description,b.isDefault,b.isContainerMutation);if(S.setGlobal("args",[...w]),S.setGlobal("ARGV",[_,...w]),this.isAsync)return(async()=>{let T=await S.runAsync(E,{file:_}),b=T.output.join(`
2250
2250
  `)+(T.output.length>0?`
2251
2251
  `:""),v=T.exitCode!==void 0?T.exitCode:T.success?0:1,x={success:T.success&&v===0,stdout:b,output:[...T.output],value:T.value,exit_code:v,code:v,errors:T.errors??[]};return x.toString=()=>b,x})();{let T=S.run(E,{file:_}),b=T.output.join(`
2252
2252
  `)+(T.output.length>0?`
2253
- `:""),v=T.exitCode!==void 0?T.exitCode:T.success?0:1,x={success:T.success&&v===0,stdout:b,output:[...T.output],value:T.value,exit_code:v,code:v,errors:T.errors??[]};return x.toString=()=>b,x}},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 h=e.get("urlget");(!h||h.isDefault)&&this.hostFunctions.set("urlget",{fn:g=>this.isAsync?RL(g):Oy(g),arity:1,description:"Downloads UTF-8 text from a public HTTP(S) URL",isDefault:!0});let y=e.get("sleep");(!y||y.isDefault)&&this.hostFunctions.set("sleep",{fn:g=>{if(typeof g!="number"||!Number.isFinite(g)||g<0)throw new Error("sleep() duration must be a non-negative finite number");if(g>2147483647)throw new Error("sleep() duration exceeds maximum supported timeout (2147483647 ms)");if(this.isAsync)return new Promise(_=>setTimeout(_,g));let p=Date.now()+g;for(;Date.now()<p;);return null},arity:1,description:"Sleeps for the specified milliseconds",isDefault:!0})}evaluateProgram(e){if(this.globalEnv=new ht,this.initialGlobals)for(let[n,s]of this.initialGlobals.entries())this.globalEnv.define(n,s);this.userFunctions.clear(),this.callDepth=0;for(let n of e.statements)n.kind==="FunctionDeclStmt"&&this.userFunctions.set(n.name,n);let r;for(let n of e.statements)n.kind!=="FunctionDeclStmt"&&(r=this.execStmt(n,this.globalEnv));return r}execStmt(e,r){switch(e.kind){case"ImportStmt":return;case"BlockStmt":{let n=new ht(r);for(let s of e.statements)this.execStmt(s,n);return}case"VarDeclStmt":{let n=null;return e.initializer&&(n=this.evalExpr(e.initializer,r)),r.define(e.name,n),n}case"TupleVarDeclStmt":{let n=this.evalExpr(e.initializer,r);if(!Array.isArray(n))throw new F(`Cannot destructure non-array value (got ${typeof n})`,e.line,e.column,"RUNTIME",e.file);for(let s=0;s<e.names.length;s++){let i=s<n.length?n[s]:null;r.define(e.names[s],i)}return n}case"IfStmt":{let n=this.evalExpr(e.condition,r);return this.isTruthy(n)?this.execStmt(e.thenBranch,r):e.elseBranch?this.execStmt(e.elseBranch,r):void 0}case"WhileStmt":{let n=0;for(;this.isTruthy(this.evalExpr(e.condition,r));){if(++n>1e6)throw new F("Execution fuel exhausted: while loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{this.execStmt(e.body,r)}catch(s){if(s instanceof gr)break;if(s instanceof _r)continue;throw s}}return}case"ForStmt":{let n=new ht(r);e.init&&this.execStmt(e.init,n);let s=0;for(;;){if(e.condition){let i=this.evalExpr(e.condition,n);if(!this.isTruthy(i))break}if(++s>1e6)throw new F("Execution fuel exhausted: for loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{this.execStmt(e.body,n)}catch(i){if(i instanceof gr)break;if(!(i instanceof _r))throw i}e.update&&this.evalExpr(e.update,n)}return}case"ReturnStmt":{let n=e.value?this.evalExpr(e.value,r):null;throw new Cn(n)}case"BreakStmt":throw new gr;case"ContinueStmt":throw new _r;case"SyncAssignStmt":case"SyncIndexAssignStmt":case"SyncCallStmt":throw new F("Synchronized statements require asynchronous execution via engine.runAsync()",e.line,e.column,"RUNTIME",e.file);case"ExprStmt":return this.evalExpr(e.expr,r);default:return}}evalExpr(e,r){switch(e.kind){case"ParallelExpr":throw new F("'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,r);case"AssignExpr":{let n=this.evalExpr(e.value,r);return r.set(e.target,n),n}case"TupleAssignExpr":{let n=this.evalExpr(e.value,r);if(!Array.isArray(n))throw new F(`Cannot destructure non-array value (got ${typeof n})`,e.line,e.column,"RUNTIME",e.file);for(let s=0;s<e.targets.length;s++){let i=s<n.length?n[s]:null;r.set(e.targets[s],i)}return n}case"IndexAssignExpr":{let n=this.evalExpr(e.target,r),s=this.evalExpr(e.index,r),i=this.evalExpr(e.value,r);if(Array.isArray(n)||typeof n=="object"&&n!==null)return Array.isArray(n)&&typeof s=="number"&&s<0&&(s=n.length+s),yr(n,s,i),i;throw new F("Cannot index-assign to non-array / non-object",e.line,e.column,"RUNTIME",e.file)}case"GroupingExpr":return this.evalExpr(e.expression,r);case"TupleExpr":return e.elements.map(n=>this.evalExpr(n,r));case"ArrayExpr":return e.elements.map(n=>this.evalExpr(n,r));case"ObjectExpr":{let n={};for(let s of e.properties)yr(n,s.key,this.evalExpr(s.value,r));return n}case"IndexExpr":{let n=this.evalExpr(e.target,r),s=this.evalExpr(e.index,r);if(n==null)throw new F("Cannot read property of null or undefined",e.line,e.column,"RUNTIME",e.file);return Array.isArray(n)&&typeof s=="number"&&s<0?n[n.length+s]:Nt(n,s)}case"UnaryExpr":{let n=this.evalExpr(e.operand,r),s=e.operator;if(s==="!")return!this.isTruthy(n);if(s==="-")return-n;throw new F(`Unknown unary operator: ${s}`,e.line,e.column,"RUNTIME",e.file)}case"BinaryExpr":{if(e.operator==="&&"){let o=this.evalExpr(e.left,r);return this.isTruthy(o)?this.evalExpr(e.right,r):o}if(e.operator==="||"){let o=this.evalExpr(e.left,r);return this.isTruthy(o)?o:this.evalExpr(e.right,r)}let n=this.evalExpr(e.left,r),s=this.evalExpr(e.right,r),i=e.operator;switch(i){case"+":return typeof n=="string"||typeof s=="string"?String(n)+String(s):n+s;case"-":return n-s;case"*":return n*s;case"/":if(s===0)throw new F("Division by zero",e.line,e.column,"RUNTIME",e.file);return n/s;case"%":return n%s;case"==":return n===s;case"!=":return n!==s;case"<":return n<s;case"<=":return n<=s;case">":return n>s;case">=":return n>=s;default:throw new F(`Unknown binary operator: ${i}`,e.line,e.column,"RUNTIME",e.file)}}case"CallExpr":{let n=e.args.map(i=>this.evalExpr(i,r)),s=this.resolveCallTarget(e.callee,r);return this.invokeNamed(s,n,r,e.line,e.column,e.file)}}}resolveCallTarget(e,r){if(this.userFunctions.has(e)||this.hostFunctions.has(e))return e;if(r.has(e)){let n=r.get(e);if(n instanceof On)return n.name}return e}invokeNamed(e,r,n,s,i,o){if(this.userFunctions.has(e)){let a=this.userFunctions.get(e);if(this.callDepth++,this.callDepth>ea)throw this.callDepth--,new F(`Execution fuel exhausted: maximum function call depth exceeded (${ea})`,s,i,"RUNTIME",o);let l=new ht(this.globalEnv,!0);for(let c=0;c<a.params.length;c++)l.define(a.params[c],r[c]);try{for(let c of a.body.statements)this.execStmt(c,l)}catch(c){if(c instanceof Cn)return c.value;throw c}finally{this.callDepth--}return null}if(this.hostFunctions.has(e)){let a=this.hostFunctions.get(e);try{return a.fn(...r)}catch(l){throw l instanceof Ve||l?.name==="LMScriptExit"||l?.isControlFlow?l:new F(`Error in host function '${e}': ${l?.message||String(l)}`,s,i,"RUNTIME",o)}}throw n.has(e)&&!(this.userFunctions.has(e)||this.hostFunctions.has(e))?new F(`'${e}' is not a function`,s,i,"RUNTIME",o):new F(`Undefined function '${e}'`,s,i,"RUNTIME",o)}resolveIdentifier(e,r){return r.has(e)?r.get(e):this.userFunctions.has(e)||this.hostFunctions.has(e)?new On(e):r.get(e)}isTruthy(e){return!(e==null||e===!1||e===0||e==="")}async evaluateProgramAsync(e){if(this.globalEnv=new ht,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 r=this.nextTaskId++,n;for(let s of e.statements)s.kind!=="FunctionDeclStmt"&&(n=await this.execStmtAsync(s,this.globalEnv,r));return n}async execStmtAsync(e,r,n){switch(e.kind){case"ImportStmt":return;case"BlockStmt":{let s=new ht(r);for(let i of e.statements)await this.execStmtAsync(i,s,n);return}case"VarDeclStmt":{let s=null;return e.initializer&&(s=await this.evalExprAsync(e.initializer,r,n)),r.define(e.name,s),s}case"TupleVarDeclStmt":{let s=await this.evalExprAsync(e.initializer,r,n);if(!Array.isArray(s))throw new F(`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;r.define(e.names[i],o)}return s}case"IfStmt":{let s=await this.evalExprAsync(e.condition,r,n);return this.isTruthy(s)?await this.execStmtAsync(e.thenBranch,r,n):e.elseBranch?await this.execStmtAsync(e.elseBranch,r,n):void 0}case"WhileStmt":{let s=0;for(;this.isTruthy(await this.evalExprAsync(e.condition,r,n));){if(++s>1e6)throw new F("Execution fuel exhausted: while loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{await this.execStmtAsync(e.body,r,n)}catch(i){if(i instanceof gr)break;if(i instanceof _r)continue;throw i}}return}case"ForStmt":{let s=new ht(r);e.init&&await this.execStmtAsync(e.init,s,n);let i=0;for(;;){if(e.condition){let o=await this.evalExprAsync(e.condition,s,n);if(!this.isTruthy(o))break}if(++i>1e6)throw new F("Execution fuel exhausted: for loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{await this.execStmtAsync(e.body,s,n)}catch(o){if(o instanceof gr)break;if(!(o instanceof _r))throw o}e.update&&await this.evalExprAsync(e.update,s,n)}return}case"ReturnStmt":{let s=e.value?await this.evalExprAsync(e.value,r,n):null;throw new Cn(s)}case"BreakStmt":throw new gr;case"ContinueStmt":throw new _r;case"SyncAssignStmt":{let s=r.resolveBinding(e.target);if(!s)throw new F(`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,r,n);s.env.set(s.name,a)},n);return}case"SyncIndexAssignStmt":{let s=await this.evalExprAsync(e.target,r,n);if(s==null||typeof s!="object"&&typeof s!="function")throw new F("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,r,n),a=await this.evalExprAsync(e.value,r,n);Array.isArray(s)&&typeof o=="number"&&o<0&&(o=s.length+o),yr(s,o,a)},n);return}case"SyncCallStmt":{let s=e.call;if(s.args.length===0)throw new F("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 F(`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],r,n);if(o==null||typeof o!="object"&&typeof o!="function")throw new F("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],r,n));await this.invokeCallAsync(s.callee,[o,...l],r,e.line,e.column,n,e.file)},n);return}case"ExprStmt":return await this.evalExprAsync(e.expr,r,n);default:return}}async evalExprAsync(e,r,n){switch(e.kind){case"LiteralExpr":return e.value;case"IdentifierExpr":return this.resolveIdentifier(e.name,r);case"AssignExpr":{let s=await this.evalExprAsync(e.value,r,n);return r.set(e.target,s),s}case"TupleAssignExpr":{let s=await this.evalExprAsync(e.value,r,n);if(!Array.isArray(s))throw new F(`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;r.set(e.targets[i],o)}return s}case"IndexAssignExpr":{let s=await this.evalExprAsync(e.target,r,n),i=await this.evalExprAsync(e.index,r,n),o=await this.evalExprAsync(e.value,r,n);if(Array.isArray(s)||typeof s=="object"&&s!==null)return Array.isArray(s)&&typeof i=="number"&&i<0&&(i=s.length+i),yr(s,i,o),o;throw new F("Cannot index-assign to non-array / non-object",e.line,e.column,"RUNTIME",e.file)}case"GroupingExpr":return await this.evalExprAsync(e.expression,r,n);case"TupleExpr":{let s=[];for(let i of e.elements)s.push(await this.evalExprAsync(i,r,n));return s}case"ArrayExpr":{let s=[];for(let i of e.elements)s.push(await this.evalExprAsync(i,r,n));return s}case"ObjectExpr":{let s={};for(let i of e.properties)yr(s,i.key,await this.evalExprAsync(i.value,r,n));return s}case"ParallelExpr":{if(e.tasks.length===0)return[];let s=this.asyncCallDepth.get(n)??0,i=e.tasks.map(async c=>{let u=this.nextTaskId++;return this.asyncCallDepth.set(u,s),await this.evalExprAsync(c,r,u)}),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=await this.evalExprAsync(e.target,r,n),i=await this.evalExprAsync(e.index,r,n);if(s==null)throw new F("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]:Nt(s,i)}case"UnaryExpr":{let s=await this.evalExprAsync(e.operand,r,n),i=e.operator;if(i==="!")return!this.isTruthy(s);if(i==="-")return-s;throw new F(`Unknown unary operator: ${i}`,e.line,e.column,"RUNTIME",e.file)}case"BinaryExpr":{if(e.operator==="&&"){let a=await this.evalExprAsync(e.left,r,n);return this.isTruthy(a)?await this.evalExprAsync(e.right,r,n):a}if(e.operator==="||"){let a=await this.evalExprAsync(e.left,r,n);return this.isTruthy(a)?a:await this.evalExprAsync(e.right,r,n)}let s=await this.evalExprAsync(e.left,r,n),i=await this.evalExprAsync(e.right,r,n),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 F("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 F(`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,r,n));return await this.invokeCallAsync(e.callee,s,r,e.line,e.column,n,e.file)}}}async invokeCallAsync(e,r,n,s,i,o,a){let l=this.resolveCallTarget(e,n);if(this.userFunctions.has(l)){let c=this.userFunctions.get(l),u=(this.asyncCallDepth.get(o)??0)+1;if(this.asyncCallDepth.set(o,u),u>ea)throw this.asyncCallDepth.set(o,u-1),new F(`Execution fuel exhausted: maximum function call depth exceeded (${ea})`,s,i,"RUNTIME",a);let f=new ht(this.globalEnv,!0);for(let d=0;d<c.params.length;d++)f.define(c.params[d],r[d]);try{for(let d of c.body.statements)await this.execStmtAsync(d,f,o)}catch(d){if(d instanceof Cn)return d.value;throw d}finally{this.asyncCallDepth.set(o,u-1)}return null}if(this.hostFunctions.has(l)){let c=this.hostFunctions.get(l);try{let u=c.fn(...r);return u instanceof Promise?await u:u}catch(u){throw u instanceof Ve||u?.name==="LMScriptExit"||u?.isControlFlow?u:new F(`Error in host function '${l}': ${u?.message||String(u)}`,s,i,"RUNTIME",a)}}throw n.has(l)&&!(this.userFunctions.has(l)||this.hostFunctions.has(l))?new F(`'${l}' is not a function`,s,i,"RUNTIME",a):new F(`Undefined function '${l}'`,s,i,"RUNTIME",a)}getRecordedErrors(){return[...this.recordedErrors]}},ML=[{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 (init; condition; update) { ... }",description:"C-style for loop for iteration. Use 'let' in the init clause (for (let i = 0; ...)) so the counter is fresh to this loop -- an init without 'let' (for (i = 0; ...)) reuses/mutates an outer i of the same name, which silently corrupts an enclosing loop that also counts with i.",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. A bare assignment (name = value) inside the body is local to THIS function by default -- it never mutates an outer/global variable that merely happens to share the name (same principle as Python/Perl/JS function scoping). See 'let' for a fresh binding even across nested if/while/for blocks within the same function.",example:"fn add(a, b) { return a + b; }"},{name:"let",category:"Language Constructs",signature:"let name = value;",description:"Declares a guaranteed-fresh local variable, scoped to the immediately enclosing block (function body, if/while/for body) -- it always shadows any outer variable of the same name and is discarded when the block exits, never mutating the outer one. Use it for a for-loop's own counter to keep nested loops sharing a name (e.g. two loops both using i) from corrupting each other: for (let i = 0; ...) { for (let i = 0; ...) { ... } }.",example:"fn f() { let total = 0; return total; }"},{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;"}],DL=[{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("~/repos/*/*.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:"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.",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:"now",category:"System & Process",signature:"now(): number",description:"Returns current epoch in ms (alias for clock).",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 for a given epoch-ms timestamp.",example:"iso = date();"},{name:"strftime",category:"System & Process",signature:"strftime(epochMs: number, fmt: string): string",description:"Formats an epoch-ms timestamp using %Y/%m/%d/%H/%M/%S tokens.",example:'s = strftime(now(), "%Y-%m-%d");'},{name:"date_format",category:"System & Process",signature:"date_format(epochMs: number, fmt: string): string",description:"Formats an epoch-ms timestamp using %Y/%m/%d/%H/%M/%S tokens (alias for strftime).",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.",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:"Expression-level ternary: returns thenVal if cond is truthy, else elseVal.",example:'label = if_else(count > 0, "some", "none");'},{name:"regex_test",category:"Strings",signature:"regex_test(s: string, pattern: string, [flags: string]): boolean",description:"Tests whether a regex pattern matches anywhere in the string. JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'has_digits = regex_test(s, "\\\\d+");'},{name:"test",category:"Strings",signature:"test(s: string, pattern: string, [flags: string]): boolean",description:"Tests whether a regex pattern matches anywhere in the string (alias for regex_test). JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'has_digits = test(s, "\\\\d+");'},{name:"regex_match",category:"Strings",signature:"regex_match(s: string, pattern: string, [flags: string]): array|null",description:"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null. JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'m = regex_match(line, "provider=(\\\\S+)");'},{name:"match",category:"Strings",signature:"match(s: string, pattern: string, [flags: string]): array|null",description:"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null (alias for regex_match). JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'m = match(line, "provider=(\\\\S+)");'},{name:"search",category:"Strings",signature:"search(s: string, pattern: string, [flags: string]): array|null",description:"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null (alias for regex_match). JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'m = search(line, "provider=(\\\\S+)");'},{name:"regex_find_all",category:"Strings",signature:"regex_find_all(s: string, pattern: string, [flags: string]): array",description:"Returns an array of every regex match in the string, each as [full_match, group1, ...]. JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'nums = regex_find_all(s, "\\\\d+");'},{name:"findall",category:"Strings",signature:"findall(s: string, pattern: string, [flags: string]): array",description:"Returns an array of every regex match in the string, each as [full_match, group1, ...] (alias for regex_find_all). JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'nums = findall(s, "\\\\d+");'},{name:"regex_replace",category:"Strings",signature:"regex_replace(s: string, pattern: string, replacement: string, [flags: string]): string",description:'Replaces regex match(es) with replacement (supports $1/$2 group backreferences); include "g" in flags to replace every occurrence. JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].',example:'clean = regex_replace(s, "\\\\s+", " ", "g");'},{name:"split_regex",category:"Strings",signature:"split_regex(s: string, pattern: string, [flags: string]): array",description:"Splits a string into an array wherever the regex pattern matches. JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'parts = split_regex(s, "\\\\d+");'},{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:"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:"toUpperCase",category:"Strings",signature:"toUpperCase(s: string): string",description:"Converts all characters in string to uppercase (alias for upper).",example:'u = toUpperCase("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:"toLowerCase",category:"Strings",signature:"toLowerCase(s: string): string",description:"Converts all characters in string to lowercase (alias for lower).",example:'l = toLowerCase("HELLO");'},{name:"capitalize",category:"Strings",signature:"capitalize(s: string): string",description:"Capitalizes the first character of a string.",example:'c = capitalize("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:"indexOf",category:"Strings",signature:"indexOf(haystack: string|array, needle: any, [fromIndex: number]): number",description:"Finds the first index of a substring or item, or -1 if not found (alias for index_of).",example:'idx = indexOf("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 starting from start index of specified length.",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 Unicode code point 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:"sprintf",category:"Strings",signature:"sprintf(template: string, ...args: any): string",description:"Formats a template using %s/%d/%f/%% substitution (C/Perl/Python printf style; use format() for {} brace syntax).",example:'msg = sprintf("%s scored %d", "Alice", 95);'},{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 number of object keys (alias for len).",example:"n = length([10, 20, 30]);"},{name:"count",category:"Lists & Arrays",signature:"count(item: any): number",description:"Returns the length of a string, array, or number of object keys (alias for len).",example:"n = count([10, 20, 30]);"},{name:"push",category:"Lists & Arrays",signature:"push(arr: array, item: 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, item: 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(a: array, b: array): array",description:"Concatenates two 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:"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:"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:"has",category:"Maps & Key-Value",signature:"has(obj: object, key: string): boolean",description:"Checks if an object has the specified key (alias for has_key).",example:'if (has(user, "email")) { ... }'},{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:"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:"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",category:"JSON & Data",signature:"json(str: string): any",description:"Parses a JSON string into an object or array.",example:'data = json("{\\"key\\": \\"value\\"}");'},{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 (default null) without throwing.",example:'data = json_parse_safe(llm_output); if (data == null) { print("parse failed"); }'},{name:"json_stringify",category:"JSON & Data",signature:"json_stringify(val: any, [indent: number = 2]): string",description:"Serializes a value to formatted JSON string.",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]): string|null",description:"Pauses execution to prompt an operator on terminal stdin, returning the entered input line or null if stdin is closed/non-interactive.",example:'guidance = prompt_human("Enter instructions (or Enter to halt): "); if (guidance != null) { process(guidance); }'},{name:"error",category:"System & Process",signature:"error(...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:"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), prints "error: <message>" to stderr 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:"print",category:"System & Process",signature:"print(...args: any): string",description:"Formats and logs values to output.",example:'print("Result:", val);'},{name:"printf",category:"System & Process",signature:"printf(template: string, ...args: any): string",description:"Formats a template using %s/%d/%f/%% substitution and prints it (C/Perl/Python printf style).",example:'printf("%s scored %d", "Alice", 95);'},{name:"println",category:"System & Process",signature:"println(...args: any): string",description:"Formats and logs values followed by a newline.",example:'println("Done.");'},{name:"sleep",category:"System & Process",signature:"sleep(ms: number): void",description:"Pauses execution for specified milliseconds.",example:"sleep(1000);"},{name:"clock",category:"System & Process",signature:"clock(): number",description:"Returns current epoch timestamp in milliseconds.",example:"start = clock();"},{name:"str",category:"System & Process",signature:"str(val: any): string",description:"Converts a value to its string representation.",example:"s = str(123);"},{name:"to_string",category:"System & Process",signature:"to_string(val: any): string",description:"Converts a value to its string representation (alias for str).",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:"urlget",category:"System & Process",signature:"urlget(url: string): string",description:"Performs HTTP(S) GET request and returns response body string.",example:'html = urlget("https://example.com");'}],$L=[{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:"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:"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);"}];Er=class t{hostFunctions=new Map;functionDocs=new Map;registeredModules=new Map;functionOriginModule=new Map;currentRegisteringModule="core";outputLogs=[];isAsyncMode=!1;constructor(){this.registeredModules.set("core",{name:"core",description:"LMScript core language built-ins and standard library"}),this.registerPredefinedFunctions(),this.registerDefaultDocs()}registerDefaultDocs(){for(let e of ML)this.functionDocs.set(e.name,{...e,module:e.module??"core"});for(let e of DL)this.functionDocs.set(e.name,{...e,module:e.module??"core"});for(let e of $L)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,r){if(this.registeredModules.has(e.name))throw new Error(`Module '${e.name}' is already registered`);this.registeredModules.set(e.name,e);let n=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,r)}finally{this.currentRegisteringModule=n}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(r=>(r.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 r of this.functionDocs.values())e.add(r.category);return Array.from(e)}getFunctionsByCategory(e){return Array.from(this.functionDocs.values()).filter(r=>r.category.toLowerCase()===e.toLowerCase())}registerPredefinedFunctions(){this.registerFunction("read_file",e=>U.readFileSync(e,"utf-8"),1,"Reads entire file as UTF-8 string"),this.registerFunction("read",e=>U.readFileSync(e,"utf-8"),1,"Reads entire file as UTF-8 string"),this.registerFunction("read_lines",e=>{let r=U.readFileSync(e,"utf-8"),n=r.length>0;return r.endsWith(`\r
2253
+ `:""),v=T.exitCode!==void 0?T.exitCode:T.success?0:1,x={success:T.success&&v===0,stdout:b,output:[...T.output],value:T.value,exit_code:v,code:v,errors:T.errors??[]};return x.toString=()=>b,x}},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 g=e.get("urlget");(!g||g.isDefault)&&this.hostFunctions.set("urlget",{fn:h=>this.isAsync?RL(h):Oy(h),arity:1,description:"Downloads UTF-8 text from a public HTTP(S) URL",isDefault:!0});let y=e.get("sleep");(!y||y.isDefault)&&this.hostFunctions.set("sleep",{fn:h=>{if(typeof h!="number"||!Number.isFinite(h)||h<0)throw new Error("sleep() duration must be a non-negative finite number");if(h>2147483647)throw new Error("sleep() duration exceeds maximum supported timeout (2147483647 ms)");if(this.isAsync)return new Promise(_=>setTimeout(_,h));let p=Date.now()+h;for(;Date.now()<p;);return null},arity:1,description:"Sleeps for the specified milliseconds",isDefault:!0})}evaluateProgram(e){if(this.globalEnv=new ht,this.initialGlobals)for(let[n,s]of this.initialGlobals.entries())this.globalEnv.define(n,s);this.userFunctions.clear(),this.callDepth=0;for(let n of e.statements)n.kind==="FunctionDeclStmt"&&this.userFunctions.set(n.name,n);let r;for(let n of e.statements)n.kind!=="FunctionDeclStmt"&&(r=this.execStmt(n,this.globalEnv));return r}execStmt(e,r){switch(e.kind){case"ImportStmt":return;case"BlockStmt":{let n=new ht(r);for(let s of e.statements)this.execStmt(s,n);return}case"VarDeclStmt":{let n=null;return e.initializer&&(n=this.evalExpr(e.initializer,r)),r.define(e.name,n),n}case"TupleVarDeclStmt":{let n=this.evalExpr(e.initializer,r);if(!Array.isArray(n))throw new F(`Cannot destructure non-array value (got ${typeof n})`,e.line,e.column,"RUNTIME",e.file);for(let s=0;s<e.names.length;s++){let i=s<n.length?n[s]:null;r.define(e.names[s],i)}return n}case"IfStmt":{let n=this.evalExpr(e.condition,r);return this.isTruthy(n)?this.execStmt(e.thenBranch,r):e.elseBranch?this.execStmt(e.elseBranch,r):void 0}case"WhileStmt":{let n=0;for(;this.isTruthy(this.evalExpr(e.condition,r));){if(++n>1e6)throw new F("Execution fuel exhausted: while loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{this.execStmt(e.body,r)}catch(s){if(s instanceof gr)break;if(s instanceof _r)continue;throw s}}return}case"ForStmt":{let n=new ht(r);e.init&&this.execStmt(e.init,n);let s=0;for(;;){if(e.condition){let i=this.evalExpr(e.condition,n);if(!this.isTruthy(i))break}if(++s>1e6)throw new F("Execution fuel exhausted: for loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{this.execStmt(e.body,n)}catch(i){if(i instanceof gr)break;if(!(i instanceof _r))throw i}e.update&&this.evalExpr(e.update,n)}return}case"ReturnStmt":{let n=e.value?this.evalExpr(e.value,r):null;throw new Cn(n)}case"BreakStmt":throw new gr;case"ContinueStmt":throw new _r;case"SyncAssignStmt":case"SyncIndexAssignStmt":case"SyncCallStmt":throw new F("Synchronized statements require asynchronous execution via engine.runAsync()",e.line,e.column,"RUNTIME",e.file);case"ExprStmt":return this.evalExpr(e.expr,r);default:return}}evalExpr(e,r){switch(e.kind){case"ParallelExpr":throw new F("'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,r);case"AssignExpr":{let n=this.evalExpr(e.value,r);return r.set(e.target,n),n}case"TupleAssignExpr":{let n=this.evalExpr(e.value,r);if(!Array.isArray(n))throw new F(`Cannot destructure non-array value (got ${typeof n})`,e.line,e.column,"RUNTIME",e.file);for(let s=0;s<e.targets.length;s++){let i=s<n.length?n[s]:null;r.set(e.targets[s],i)}return n}case"IndexAssignExpr":{let n=this.evalExpr(e.target,r),s=this.evalExpr(e.index,r),i=this.evalExpr(e.value,r);if(Array.isArray(n)||typeof n=="object"&&n!==null)return Array.isArray(n)&&typeof s=="number"&&s<0&&(s=n.length+s),yr(n,s,i),i;throw new F("Cannot index-assign to non-array / non-object",e.line,e.column,"RUNTIME",e.file)}case"GroupingExpr":return this.evalExpr(e.expression,r);case"TupleExpr":return e.elements.map(n=>this.evalExpr(n,r));case"ArrayExpr":return e.elements.map(n=>this.evalExpr(n,r));case"ObjectExpr":{let n={};for(let s of e.properties)yr(n,s.key,this.evalExpr(s.value,r));return n}case"IndexExpr":{let n=this.evalExpr(e.target,r),s=this.evalExpr(e.index,r);if(n==null)throw new F("Cannot read property of null or undefined",e.line,e.column,"RUNTIME",e.file);return Array.isArray(n)&&typeof s=="number"&&s<0?n[n.length+s]:Nt(n,s)}case"UnaryExpr":{let n=this.evalExpr(e.operand,r),s=e.operator;if(s==="!")return!this.isTruthy(n);if(s==="-")return-n;throw new F(`Unknown unary operator: ${s}`,e.line,e.column,"RUNTIME",e.file)}case"BinaryExpr":{if(e.operator==="&&"){let o=this.evalExpr(e.left,r);return this.isTruthy(o)?this.evalExpr(e.right,r):o}if(e.operator==="||"){let o=this.evalExpr(e.left,r);return this.isTruthy(o)?o:this.evalExpr(e.right,r)}let n=this.evalExpr(e.left,r),s=this.evalExpr(e.right,r),i=e.operator;switch(i){case"+":return typeof n=="string"||typeof s=="string"?String(n)+String(s):n+s;case"-":return n-s;case"*":return n*s;case"/":if(s===0)throw new F("Division by zero",e.line,e.column,"RUNTIME",e.file);return n/s;case"%":return n%s;case"==":return n===s;case"!=":return n!==s;case"<":return n<s;case"<=":return n<=s;case">":return n>s;case">=":return n>=s;default:throw new F(`Unknown binary operator: ${i}`,e.line,e.column,"RUNTIME",e.file)}}case"CallExpr":{let n=e.args.map(i=>this.evalExpr(i,r)),s=this.resolveCallTarget(e.callee,r);return this.invokeNamed(s,n,r,e.line,e.column,e.file)}}}resolveCallTarget(e,r){if(this.userFunctions.has(e)||this.hostFunctions.has(e))return e;if(r.has(e)){let n=r.get(e);if(n instanceof On)return n.name}return e}invokeNamed(e,r,n,s,i,o){if(this.userFunctions.has(e)){let a=this.userFunctions.get(e);if(this.callDepth++,this.callDepth>ea)throw this.callDepth--,new F(`Execution fuel exhausted: maximum function call depth exceeded (${ea})`,s,i,"RUNTIME",o);let l=new ht(this.globalEnv,!0);for(let c=0;c<a.params.length;c++)l.define(a.params[c],r[c]);try{for(let c of a.body.statements)this.execStmt(c,l)}catch(c){if(c instanceof Cn)return c.value;throw c}finally{this.callDepth--}return null}if(this.hostFunctions.has(e)){let a=this.hostFunctions.get(e);try{return a.fn(...r)}catch(l){throw l instanceof Ve||l?.name==="LMScriptExit"||l?.isControlFlow?l:new F(`Error in host function '${e}': ${l?.message||String(l)}`,s,i,"RUNTIME",o)}}throw n.has(e)&&!(this.userFunctions.has(e)||this.hostFunctions.has(e))?new F(`'${e}' is not a function`,s,i,"RUNTIME",o):new F(`Undefined function '${e}'`,s,i,"RUNTIME",o)}resolveIdentifier(e,r){return r.has(e)?r.get(e):this.userFunctions.has(e)||this.hostFunctions.has(e)?new On(e):r.get(e)}isTruthy(e){return!(e==null||e===!1||e===0||e==="")}async evaluateProgramAsync(e){if(this.globalEnv=new ht,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 r=this.nextTaskId++,n;for(let s of e.statements)s.kind!=="FunctionDeclStmt"&&(n=await this.execStmtAsync(s,this.globalEnv,r));return n}async execStmtAsync(e,r,n){switch(e.kind){case"ImportStmt":return;case"BlockStmt":{let s=new ht(r);for(let i of e.statements)await this.execStmtAsync(i,s,n);return}case"VarDeclStmt":{let s=null;return e.initializer&&(s=await this.evalExprAsync(e.initializer,r,n)),r.define(e.name,s),s}case"TupleVarDeclStmt":{let s=await this.evalExprAsync(e.initializer,r,n);if(!Array.isArray(s))throw new F(`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;r.define(e.names[i],o)}return s}case"IfStmt":{let s=await this.evalExprAsync(e.condition,r,n);return this.isTruthy(s)?await this.execStmtAsync(e.thenBranch,r,n):e.elseBranch?await this.execStmtAsync(e.elseBranch,r,n):void 0}case"WhileStmt":{let s=0;for(;this.isTruthy(await this.evalExprAsync(e.condition,r,n));){if(++s>1e6)throw new F("Execution fuel exhausted: while loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{await this.execStmtAsync(e.body,r,n)}catch(i){if(i instanceof gr)break;if(i instanceof _r)continue;throw i}}return}case"ForStmt":{let s=new ht(r);e.init&&await this.execStmtAsync(e.init,s,n);let i=0;for(;;){if(e.condition){let o=await this.evalExprAsync(e.condition,s,n);if(!this.isTruthy(o))break}if(++i>1e6)throw new F("Execution fuel exhausted: for loop exceeded maximum iterations limit (1000000)",e.line,e.column,"RUNTIME");try{await this.execStmtAsync(e.body,s,n)}catch(o){if(o instanceof gr)break;if(!(o instanceof _r))throw o}e.update&&await this.evalExprAsync(e.update,s,n)}return}case"ReturnStmt":{let s=e.value?await this.evalExprAsync(e.value,r,n):null;throw new Cn(s)}case"BreakStmt":throw new gr;case"ContinueStmt":throw new _r;case"SyncAssignStmt":{let s=r.resolveBinding(e.target);if(!s)throw new F(`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,r,n);s.env.set(s.name,a)},n);return}case"SyncIndexAssignStmt":{let s=await this.evalExprAsync(e.target,r,n);if(s==null||typeof s!="object"&&typeof s!="function")throw new F("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,r,n),a=await this.evalExprAsync(e.value,r,n);Array.isArray(s)&&typeof o=="number"&&o<0&&(o=s.length+o),yr(s,o,a)},n);return}case"SyncCallStmt":{let s=e.call;if(s.args.length===0)throw new F("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 F(`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],r,n);if(o==null||typeof o!="object"&&typeof o!="function")throw new F("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],r,n));await this.invokeCallAsync(s.callee,[o,...l],r,e.line,e.column,n,e.file)},n);return}case"ExprStmt":return await this.evalExprAsync(e.expr,r,n);default:return}}async evalExprAsync(e,r,n){switch(e.kind){case"LiteralExpr":return e.value;case"IdentifierExpr":return this.resolveIdentifier(e.name,r);case"AssignExpr":{let s=await this.evalExprAsync(e.value,r,n);return r.set(e.target,s),s}case"TupleAssignExpr":{let s=await this.evalExprAsync(e.value,r,n);if(!Array.isArray(s))throw new F(`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;r.set(e.targets[i],o)}return s}case"IndexAssignExpr":{let s=await this.evalExprAsync(e.target,r,n),i=await this.evalExprAsync(e.index,r,n),o=await this.evalExprAsync(e.value,r,n);if(Array.isArray(s)||typeof s=="object"&&s!==null)return Array.isArray(s)&&typeof i=="number"&&i<0&&(i=s.length+i),yr(s,i,o),o;throw new F("Cannot index-assign to non-array / non-object",e.line,e.column,"RUNTIME",e.file)}case"GroupingExpr":return await this.evalExprAsync(e.expression,r,n);case"TupleExpr":{let s=[];for(let i of e.elements)s.push(await this.evalExprAsync(i,r,n));return s}case"ArrayExpr":{let s=[];for(let i of e.elements)s.push(await this.evalExprAsync(i,r,n));return s}case"ObjectExpr":{let s={};for(let i of e.properties)yr(s,i.key,await this.evalExprAsync(i.value,r,n));return s}case"ParallelExpr":{if(e.tasks.length===0)return[];let s=this.asyncCallDepth.get(n)??0,i=e.tasks.map(async c=>{let u=this.nextTaskId++;return this.asyncCallDepth.set(u,s),await this.evalExprAsync(c,r,u)}),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=await this.evalExprAsync(e.target,r,n),i=await this.evalExprAsync(e.index,r,n);if(s==null)throw new F("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]:Nt(s,i)}case"UnaryExpr":{let s=await this.evalExprAsync(e.operand,r,n),i=e.operator;if(i==="!")return!this.isTruthy(s);if(i==="-")return-s;throw new F(`Unknown unary operator: ${i}`,e.line,e.column,"RUNTIME",e.file)}case"BinaryExpr":{if(e.operator==="&&"){let a=await this.evalExprAsync(e.left,r,n);return this.isTruthy(a)?await this.evalExprAsync(e.right,r,n):a}if(e.operator==="||"){let a=await this.evalExprAsync(e.left,r,n);return this.isTruthy(a)?a:await this.evalExprAsync(e.right,r,n)}let s=await this.evalExprAsync(e.left,r,n),i=await this.evalExprAsync(e.right,r,n),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 F("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 F(`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,r,n));return await this.invokeCallAsync(e.callee,s,r,e.line,e.column,n,e.file)}}}async invokeCallAsync(e,r,n,s,i,o,a){let l=this.resolveCallTarget(e,n);if(this.userFunctions.has(l)){let c=this.userFunctions.get(l),u=(this.asyncCallDepth.get(o)??0)+1;if(this.asyncCallDepth.set(o,u),u>ea)throw this.asyncCallDepth.set(o,u-1),new F(`Execution fuel exhausted: maximum function call depth exceeded (${ea})`,s,i,"RUNTIME",a);let f=new ht(this.globalEnv,!0);for(let d=0;d<c.params.length;d++)f.define(c.params[d],r[d]);try{for(let d of c.body.statements)await this.execStmtAsync(d,f,o)}catch(d){if(d instanceof Cn)return d.value;throw d}finally{this.asyncCallDepth.set(o,u-1)}return null}if(this.hostFunctions.has(l)){let c=this.hostFunctions.get(l);try{let u=c.fn(...r);return u instanceof Promise?await u:u}catch(u){throw u instanceof Ve||u?.name==="LMScriptExit"||u?.isControlFlow?u:new F(`Error in host function '${l}': ${u?.message||String(u)}`,s,i,"RUNTIME",a)}}throw n.has(l)&&!(this.userFunctions.has(l)||this.hostFunctions.has(l))?new F(`'${l}' is not a function`,s,i,"RUNTIME",a):new F(`Undefined function '${l}'`,s,i,"RUNTIME",a)}getRecordedErrors(){return[...this.recordedErrors]}},ML=[{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 (init; condition; update) { ... }",description:"C-style for loop for iteration. Use 'let' in the init clause (for (let i = 0; ...)) so the counter is fresh to this loop -- an init without 'let' (for (i = 0; ...)) reuses/mutates an outer i of the same name, which silently corrupts an enclosing loop that also counts with i.",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. A bare assignment (name = value) inside the body is local to THIS function by default -- it never mutates an outer/global variable that merely happens to share the name (same principle as Python/Perl/JS function scoping). See 'let' for a fresh binding even across nested if/while/for blocks within the same function.",example:"fn add(a, b) { return a + b; }"},{name:"let",category:"Language Constructs",signature:"let name = value;",description:"Declares a guaranteed-fresh local variable, scoped to the immediately enclosing block (function body, if/while/for body) -- it always shadows any outer variable of the same name and is discarded when the block exits, never mutating the outer one. Use it for a for-loop's own counter to keep nested loops sharing a name (e.g. two loops both using i) from corrupting each other: for (let i = 0; ...) { for (let i = 0; ...) { ... } }.",example:"fn f() { let total = 0; return total; }"},{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;"}],DL=[{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("~/repos/*/*.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:"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.",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:"now",category:"System & Process",signature:"now(): number",description:"Returns current epoch in ms (alias for clock).",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 for a given epoch-ms timestamp.",example:"iso = date();"},{name:"strftime",category:"System & Process",signature:"strftime(epochMs: number, fmt: string): string",description:"Formats an epoch-ms timestamp using %Y/%m/%d/%H/%M/%S tokens.",example:'s = strftime(now(), "%Y-%m-%d");'},{name:"date_format",category:"System & Process",signature:"date_format(epochMs: number, fmt: string): string",description:"Formats an epoch-ms timestamp using %Y/%m/%d/%H/%M/%S tokens (alias for strftime).",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.",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:"Expression-level ternary: returns thenVal if cond is truthy, else elseVal.",example:'label = if_else(count > 0, "some", "none");'},{name:"regex_test",category:"Strings",signature:"regex_test(s: string, pattern: string, [flags: string]): boolean",description:"Tests whether a regex pattern matches anywhere in the string. JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'has_digits = regex_test(s, "\\\\d+");'},{name:"test",category:"Strings",signature:"test(s: string, pattern: string, [flags: string]): boolean",description:"Tests whether a regex pattern matches anywhere in the string (alias for regex_test). JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'has_digits = test(s, "\\\\d+");'},{name:"regex_match",category:"Strings",signature:"regex_match(s: string, pattern: string, [flags: string]): array|null",description:"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null. JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'m = regex_match(line, "provider=(\\\\S+)");'},{name:"match",category:"Strings",signature:"match(s: string, pattern: string, [flags: string]): array|null",description:"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null (alias for regex_match). JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'m = match(line, "provider=(\\\\S+)");'},{name:"search",category:"Strings",signature:"search(s: string, pattern: string, [flags: string]): array|null",description:"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null (alias for regex_match). JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'m = search(line, "provider=(\\\\S+)");'},{name:"regex_find_all",category:"Strings",signature:"regex_find_all(s: string, pattern: string, [flags: string]): array",description:"Returns an array of every regex match in the string, each as [full_match, group1, ...]. JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'nums = regex_find_all(s, "\\\\d+");'},{name:"findall",category:"Strings",signature:"findall(s: string, pattern: string, [flags: string]): array",description:"Returns an array of every regex match in the string, each as [full_match, group1, ...] (alias for regex_find_all). JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'nums = findall(s, "\\\\d+");'},{name:"regex_replace",category:"Strings",signature:"regex_replace(s: string, pattern: string, replacement: string, [flags: string]): string",description:'Replaces regex match(es) with replacement (supports $1/$2 group backreferences); include "g" in flags to replace every occurrence. JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].',example:'clean = regex_replace(s, "\\\\s+", " ", "g");'},{name:"split_regex",category:"Strings",signature:"split_regex(s: string, pattern: string, [flags: string]): array",description:"Splits a string into an array wherever the regex pattern matches. JavaScript RegExp syntax, not POSIX -- e.g. \\\\s not [[:space:]].",example:'parts = split_regex(s, "\\\\d+");'},{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:"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:"toUpperCase",category:"Strings",signature:"toUpperCase(s: string): string",description:"Converts all characters in string to uppercase (alias for upper).",example:'u = toUpperCase("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:"toLowerCase",category:"Strings",signature:"toLowerCase(s: string): string",description:"Converts all characters in string to lowercase (alias for lower).",example:'l = toLowerCase("HELLO");'},{name:"capitalize",category:"Strings",signature:"capitalize(s: string): string",description:"Capitalizes the first character of a string.",example:'c = capitalize("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:"indexOf",category:"Strings",signature:"indexOf(haystack: string|array, needle: any, [fromIndex: number]): number",description:"Finds the first index of a substring or item, or -1 if not found (alias for index_of).",example:'idx = indexOf("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 starting from start index of specified length.",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 Unicode code point 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:"sprintf",category:"Strings",signature:"sprintf(template: string, ...args: any): string",description:"Formats a template using %s/%d/%f/%% substitution (C/Perl/Python printf style; use format() for {} brace syntax).",example:'msg = sprintf("%s scored %d", "Alice", 95);'},{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 number of object keys (alias for len).",example:"n = length([10, 20, 30]);"},{name:"count",category:"Lists & Arrays",signature:"count(item: any): number",description:"Returns the length of a string, array, or number of object keys (alias for len).",example:"n = count([10, 20, 30]);"},{name:"push",category:"Lists & Arrays",signature:"push(arr: array, item: 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, item: 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(a: array, b: array): array",description:"Concatenates two 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:"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:"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:"has",category:"Maps & Key-Value",signature:"has(obj: object, key: string): boolean",description:"Checks if an object has the specified key (alias for has_key).",example:'if (has(user, "email")) { ... }'},{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:"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:"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",category:"JSON & Data",signature:"json(str: string): any",description:"Parses a JSON string into an object or array.",example:'data = json("{\\"key\\": \\"value\\"}");'},{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 (default null) without throwing.",example:'data = json_parse_safe(llm_output); if (data == null) { print("parse failed"); }'},{name:"json_stringify",category:"JSON & Data",signature:"json_stringify(val: any, [indent: number = 2]): string",description:"Serializes a value to formatted JSON string.",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]): string|null",description:"Pauses execution to prompt an operator on terminal stdin, returning the entered input line or null if stdin is closed/non-interactive.",example:'guidance = prompt_human("Enter instructions (or Enter to halt): "); if (guidance != null) { process(guidance); }'},{name:"error",category:"System & Process",signature:"error(...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:"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), prints "error: <message>" to stderr 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:"print",category:"System & Process",signature:"print(...args: any): string",description:"Formats and logs values to output.",example:'print("Result:", val);'},{name:"printf",category:"System & Process",signature:"printf(template: string, ...args: any): string",description:"Formats a template using %s/%d/%f/%% substitution and prints it (C/Perl/Python printf style).",example:'printf("%s scored %d", "Alice", 95);'},{name:"println",category:"System & Process",signature:"println(...args: any): string",description:"Formats and logs values followed by a newline.",example:'println("Done.");'},{name:"sleep",category:"System & Process",signature:"sleep(ms: number): void",description:"Pauses execution for specified milliseconds.",example:"sleep(1000);"},{name:"clock",category:"System & Process",signature:"clock(): number",description:"Returns current epoch timestamp in milliseconds.",example:"start = clock();"},{name:"str",category:"System & Process",signature:"str(val: any): string",description:"Converts a value to its string representation.",example:"s = str(123);"},{name:"to_string",category:"System & Process",signature:"to_string(val: any): string",description:"Converts a value to its string representation (alias for str).",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:"urlget",category:"System & Process",signature:"urlget(url: string): string",description:"Performs HTTP(S) GET request and returns response body string.",example:'html = urlget("https://example.com");'}],$L=[{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:"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:"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);"}];Er=class t{hostFunctions=new Map;functionDocs=new Map;registeredModules=new Map;functionOriginModule=new Map;currentRegisteringModule="core";outputLogs=[];isAsyncMode=!1;constructor(){this.registeredModules.set("core",{name:"core",description:"LMScript core language built-ins and standard library"}),this.registerPredefinedFunctions(),this.registerDefaultDocs()}registerDefaultDocs(){for(let e of ML)this.functionDocs.set(e.name,{...e,module:e.module??"core"});for(let e of DL)this.functionDocs.set(e.name,{...e,module:e.module??"core"});for(let e of $L)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,r){if(this.registeredModules.has(e.name))throw new Error(`Module '${e.name}' is already registered`);this.registeredModules.set(e.name,e);let n=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,r)}finally{this.currentRegisteringModule=n}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(r=>(r.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 r of this.functionDocs.values())e.add(r.category);return Array.from(e)}getFunctionsByCategory(e){return Array.from(this.functionDocs.values()).filter(r=>r.category.toLowerCase()===e.toLowerCase())}registerPredefinedFunctions(){this.registerFunction("read_file",e=>U.readFileSync(e,"utf-8"),1,"Reads entire file as UTF-8 string"),this.registerFunction("read",e=>U.readFileSync(e,"utf-8"),1,"Reads entire file as UTF-8 string"),this.registerFunction("read_lines",e=>{let r=U.readFileSync(e,"utf-8"),n=r.length>0;return r.endsWith(`\r
2254
2254
  `)?r=r.slice(0,-2):r.endsWith(`
2255
2255
  `)&&(r=r.slice(0,-1)),n?r.length===0?[""]:r.split(/\r?\n/):[]},1,"Reads file as an array of string lines"),this.registerFunction("write_lines",(e,r)=>{if(!Array.isArray(r))throw new Error("write_lines: second argument must be an array of lines");let n=r.length===0?"":r.map(String).join(`
2256
2256
  `)+`
@@ -2260,7 +2260,7 @@ fn clamp(val, low, high) {
2260
2260
  `)+(a.output.length>0?`
2261
2261
  `:""),c=a.exitCode!==void 0?a.exitCode:a.success?0:1,u={success:a.success&&c===0,stdout:l,output:[...a.output],value:a.value,exit_code:c,code:c,errors:a.errors??[]};return u.toString=()=>l,u}},{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 r=e.map(n=>typeof n=="object"?JSON.stringify(n):String(n)).join(" ");return typeof process<"u"&&process.stderr?process.stderr.write(`error: ${r}
2262
2262
  `):console.error(`error: ${r}`),r},void 0,"Formats and logs an error to stderr and records it for the execution error summary",!0),this.registerFunction("urlget",e=>Oy(e),1,"Downloads UTF-8 text from a public HTTP(S) URL",!0),this.registerFunction("sleep",e=>{if(typeof e!="number"||!Number.isFinite(e)||e<0)throw new Error("sleep() duration must be a non-negative finite number");if(e>2147483647)throw new Error("sleep() duration exceeds maximum supported timeout (2147483647 ms)");let r=Date.now()+e;for(;Date.now()<r;);return null},1,"Sleeps for the specified milliseconds",!0),this.registerFunction("prompt_human",e=>this.isAsyncMode?Ks(e):Vs(e),{min:0,max:1},"Prompts operator on stdin/terminal, returning input string or null if closed/non-interactive",!0),this.registerFunction("json",(e,r)=>{if(typeof e=="string")try{return JSON.parse(e)}catch(n){throw new Error(`Invalid JSON string: ${n.message}`)}return JSON.stringify(e,null,r)},{min:1,max:2},"Parses JSON string into object/array, or stringifies data to JSON string"),this.registerFunction("json_parse",e=>{try{return JSON.parse(String(e))}catch(r){throw new Error(`JSON parse error: ${r.message}`)}},1,"Parses JSON string into object/array"),this.registerFunction("json_parse_safe",(e,r=null)=>NL(e,r),{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,r)=>JSON.stringify(e,null,r),{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(e):[],1,"Returns array of object values"),this.registerFunction("entries",e=>e&&typeof e=="object"?Object.entries(e):[],1,"Returns array of [key, value] pairs"),this.registerFunction("items",e=>e&&typeof e=="object"?Object.entries(e):[],1,"Returns array of [key, value] pairs (alias for entries)"),this.registerFunction("has_key",(e,r)=>e&&typeof e=="object"?Object.hasOwn(e,r):!1,2,"Checks if object has key"),this.registerFunction("has",(e,r)=>e&&typeof e=="object"?Object.hasOwn(e,r):!1,2,"Checks if object has key"),this.registerFunction("get",(e,r,n=null)=>{let s=Xs(e,r);return s!==void 0?s:n},void 0,"Safely extracts nested property by path (e.g. 'user.address.city')"),this.registerFunction("getstr",(e,r,n="")=>{let s=Xs(e,r);return s==null?n: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,r,n=0)=>{let s=Xs(e,r);return s==null?n: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,r,n=!1)=>{let s=Xs(e,r);if(s==null)return n;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,r,n=[])=>{let s=Xs(e,r);return Array.isArray(s)?s:n},{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",(e,r)=>{if(e==null||e===""||e===!1||Array.isArray(e)&&e.length===0)throw typeof process<"u"&&process.stderr?process.stderr.write(`error: ${String(r)}
2263
- `):console.error(`error: ${String(r)}`),new Ve(2);return e},2,'Stops the script (stderr message, exit 2) if value is missing -- "", null, [], or false -- else returns value unchanged, so it composes with getstr/getnum/getbool/getlist'),this.registerFunction("set",(e,r,n)=>{if(e==null||typeof e!="object")return e;let s=Array.isArray(r)?r:String(r).replace(/\[(\w+)\]/g,".$1").split(".").filter(Boolean),i=e;for(let o=0;o<s.length-1;o++){let a=s[o];(Nt(i,a)==null||typeof Nt(i,a)!="object")&&yr(i,a,{}),i=Nt(i,a)}return s.length>0&&yr(i,s[s.length-1],n),e},3,"Sets nested property by path",!0,!0),this.registerFunction("pluck",(e,r)=>Array.isArray(e)?e.map(n=>Nt(n,r)):[],2,"Extracts key from array of objects"),this.registerFunction("filter_by",(e,r,n)=>Array.isArray(e)?e.filter(s=>s!=null&&Nt(s,r)===n):[],3,"Filters array of objects where item[key] == value"),this.registerFunction("find_by",(e,r,n)=>{if(!Array.isArray(e))return null;let s=e.find(i=>i!=null&&Nt(i,r)===n);return s!==void 0?s:null},3,"Finds first object in array where item[key] == value"),this.registerFunction("merge",(e,r)=>({...e,...r}),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,r)=>(e&&typeof e=="object"&&delete e[r],e),2,"Deletes key from object",!0,!0),this.registerFunction("print",(...e)=>{let r=e.map(n=>typeof n=="object"?JSON.stringify(n):String(n)).join(" ");return this.outputLogs.push(r),r},void 0,"Prints formatted values to output log",!0),this.registerFunction("println",(...e)=>{let r=e.map(n=>typeof n=="object"?JSON.stringify(n):String(n)).join(" ");return this.outputLogs.push(r),r},void 0,"Prints line to output log",!0),this.registerFunction("printf",(e,...r)=>{let n=Js(e,r);return this.outputLogs.push(n),n},void 0,"Formats a template using %s/%d/%f/%% substitution and prints it",!0),this.registerFunction("split",(e,r="")=>String(e).split(r),void 0,"Splits string by delimiter"),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 r=e.split(/\r?\n/).map(a=>a.trim()).filter(a=>a.length>0);if(r.length===0)return null;let n=a=>a==="DONE"||a==="NOTHING_TO_DO"||a==="BLOCKED"||a==="OTHER",s=r[r.length-1],i=r.length>1?r[r.length-2]:null,o=r.length>2?r[r.length-3]:null;return n(s)?i&&n(i)&&i!==s?null:s:i&&n(i)?o&&n(o)&&o!==i?null:i: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,r=", ")=>Array.isArray(e)?e.join(r):String(e),void 0,"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("toUpperCase",e=>String(e).toUpperCase(),1,"Converts string to uppercase (alias for upper)"),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("toLowerCase",e=>String(e).toLowerCase(),1,"Converts string to lowercase (alias for lower)"),this.registerFunction("capitalize",e=>{let r=String(e);return r.length===0?"":r.charAt(0).toUpperCase()+r.slice(1)},1,"Capitalizes first letter"),this.registerFunction("title_case",e=>String(e).replace(/\b\w/g,r=>r.toUpperCase()),1,"Converts string to Title Case"),this.registerFunction("contains",(e,r)=>Array.isArray(e)?e.includes(r):String(e).includes(String(r)),2,"Checks if string or array contains item"),this.registerFunction("includes",(e,r)=>Array.isArray(e)?e.includes(r):String(e).includes(String(r)),2,"Checks if string or array contains item"),this.registerFunction("starts_with",(e,r)=>String(e).startsWith(r),2,"Checks if string starts with prefix"),this.registerFunction("startswith",(e,r)=>String(e).startsWith(r),2,"Checks if string starts with prefix (alias for starts_with)"),this.registerFunction("ends_with",(e,r)=>String(e).endsWith(r),2,"Checks if string ends with suffix"),this.registerFunction("endswith",(e,r)=>String(e).endsWith(r),2,"Checks if string ends with suffix (alias for ends_with)"),this.registerFunction("index_of",(e,r,n)=>String(e).indexOf(r,n),void 0,"Finds index of substring"),this.registerFunction("indexOf",(e,r,n)=>String(e).indexOf(r,n),void 0,"Finds index of substring (alias for index_of)"),this.registerFunction("last_index_of",(e,r)=>String(e).lastIndexOf(r),2,"Finds last index of substring"),this.registerFunction("count_matches",(e,r)=>r?String(e).split(r).length-1:0,2,"Counts occurrences of substring"),this.registerFunction("substr",(e,r,n)=>{let s=String(e);return n===void 0?s.substring(r):s.substring(r,r+n)},void 0,"Returns substring by start and length"),this.registerFunction("substring",(e,r,n)=>String(e).substring(r,n),void 0,"Returns substring between indices"),this.registerFunction("slice",(e,r,n)=>e!=null?e.slice(r,n):"",void 0,"Slices string or array"),this.registerFunction("char_at",(e,r)=>String(e).charAt(r),2,"Returns character at index"),this.registerFunction("char_code",(e,r=0)=>String(e).charCodeAt(r),void 0,"Returns character code at index"),this.registerFunction("from_char_code",(...e)=>String.fromCharCode(...e),void 0,"Returns string from character codes"),this.registerFunction("replace",(e,r,n)=>String(e).replace(r,n),3,"Replaces first occurrence"),this.registerFunction("replace_all",(e,r,n)=>String(e).replaceAll(r,n),3,"Replaces all occurrences"),this.registerFunction("repeat",(e,r)=>String(e).repeat(r),2,"Repeats string count times"),this.registerFunction("pad_start",(e,r,n=" ")=>String(e).padStart(r,n),void 0,"Left-pads string"),this.registerFunction("pad_end",(e,r,n=" ")=>String(e).padEnd(r,n),void 0,"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 On,1,"Checks if value is a first-class function reference"),this.registerFunction("shell_quote",e=>My(e),1,"Quotes string safely for POSIX shell command execution",!0),this.registerFunction("format",(e,...r)=>{let n=String(e),s=r.length===1&&typeof r[0]=="object"&&r[0]!==null&&!Array.isArray(r[0])?r[0]:void 0,i=0,o="",a=l=>typeof l=="object"&&l!==null?JSON.stringify(l):String(l);for(let l=0;l<n.length;){let c=n[l];if(c==="{"&&n[l+1]==="{"){o+="{",l+=2;continue}if(c==="}"&&n[l+1]==="}"){o+="}",l+=2;continue}if(c!=="{"){o+=c,l+=1;continue}let u=n.indexOf("}",l+1);if(u<0){o+=c,l+=1;continue}let f=n.slice(l+1,u);if(f==="")o+=i<r.length?a(r[i++]):"{}";else if(/^\d+$/.test(f)){let d=Number(f);o+=d<r.length?a(r[d]):`{${f}}`}else s&&/^[a-zA-Z0-9_]+$/.test(f)&&Object.hasOwn(s,f)?o+=a(s[f]):o+=`{${f}}`;l=u+1}return o},void 0,"Formats string with arguments, supporting {{ and }} brace escapes, positional {0}, auto {}, and {key} map substitution"),this.registerFunction("sprintf",(e,...r)=>Js(e,r),void 0,"Formats a template using %s/%d/%f/%% substitution (C/Perl/Python printf style; use format() for {} brace syntax)"),this.registerFunction("regex_test",(e,r,n="")=>new RegExp(r,n).test(String(e)),{min:2,max:3},"Tests whether a regex pattern matches anywhere in the string"),this.registerFunction("test",(e,r,n="")=>new RegExp(r,n).test(String(e)),{min:2,max:3},"Tests whether a regex pattern matches anywhere in the string (alias for regex_test)"),this.registerFunction("regex_match",(e,r,n="")=>{let s=String(e).match(new RegExp(r,n));return s?Array.from(s,i=>i===void 0?null:i):null},{min:2,max:3},"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null"),this.registerFunction("match",(e,r,n="")=>{let s=String(e).match(new RegExp(r,n));return s?Array.from(s,i=>i===void 0?null:i):null},{min:2,max:3},"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null (alias for regex_match)"),this.registerFunction("search",(e,r,n="")=>{let s=String(e).match(new RegExp(r,n));return s?Array.from(s,i=>i===void 0?null:i):null},{min:2,max:3},"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null (alias for regex_match)"),this.registerFunction("regex_find_all",(e,r,n="")=>{let s=new RegExp(r,n.includes("g")?n:`${n}g`),i=String(e),o=[],a;for(;(a=s.exec(i))!==null;)o.push(Array.from(a,l=>l===void 0?null:l)),a[0]===""&&(s.lastIndex+=1);return o},{min:2,max:3},"Returns an array of every regex match in the string, each as [full_match, group1, ...]"),this.registerFunction("findall",(e,r,n="")=>{let s=new RegExp(r,n.includes("g")?n:`${n}g`),i=String(e),o=[],a;for(;(a=s.exec(i))!==null;)o.push(Array.from(a,l=>l===void 0?null:l)),a[0]===""&&(s.lastIndex+=1);return o},{min:2,max:3},"Returns an array of every regex match in the string, each as [full_match, group1, ...] (alias for regex_find_all)"),this.registerFunction("regex_replace",(e,r,n,s="")=>String(e).replace(new RegExp(r,s),n),{min:3,max:4},'Replaces regex match(es) with replacement (supports $1/$2 group backreferences); include "g" in flags to replace every occurrence, not just the first'),this.registerFunction("split_regex",(e,r,n="")=>String(e).split(new RegExp(r,n)),{min:2,max:3},"Splits a string into an array wherever the regex pattern 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=>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 (alias for len)"),this.registerFunction("count",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 (alias for len)"),this.registerFunction("range",(e,r,n=1)=>{let s=r===void 0?0:e,i=r===void 0?e:r,o=[];if(n>0)for(let a=s;a<i;a+=n)o.push(a);else if(n<0)for(let a=s;a>i;a+=n)o.push(a);return o},void 0,"Generates an array of numbers"),this.registerFunction("abs",e=>Math.abs(e),1,"Absolute value"),this.registerFunction("min",(...e)=>{let r=e.length===1&&Array.isArray(e[0])?e[0]:e;return Math.min(...r)},void 0,"Minimum value"),this.registerFunction("max",(...e)=>{let r=e.length===1&&Array.isArray(e[0])?e[0]:e;return Math.max(...r)},void 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,r)=>Math.pow(e,r),2,"Power calculation"),this.registerFunction("random",()=>Math.random(),0,"Random float between 0 and 1"),this.registerFunction("clock",()=>Date.now(),0,"Returns current epoch in ms"),this.registerFunction("now",()=>Date.now(),0,"Returns current epoch in ms (alias for clock)"),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,r)=>ky(e,r),2,"Formats an epoch-ms timestamp using %Y/%m/%d/%H/%M/%S tokens"),this.registerFunction("date_format",(e,r)=>ky(e,r),2,"Formats an epoch-ms timestamp using %Y/%m/%d/%H/%M/%S tokens (alias for strftime)"),this.registerFunction("coalesce",(...e)=>{for(let r of e)if(r!=null)return r;return null},void 0,"Returns the first non-null/non-undefined argument, else null"),this.registerFunction("if_null",(e,r)=>e??r,2,"Returns fallback if val is null/undefined, else val"),this.registerFunction("default_to",(e,r)=>e??r,2,"Returns fallback if val is null/undefined, else val (alias for if_null)"),this.registerFunction("if_else",(e,r,n)=>e?r:n,3,"Expression-level ternary: returns thenVal if cond is truthy, else elseVal"),this.registerFunction("str",e=>e===null?"null":String(e),1,"Converts value to string"),this.registerFunction("to_string",e=>e===null?"null":String(e),1,"Converts value to string (alias for str)"),this.registerFunction("num",e=>Number(e),1,"Converts value to number"),this.registerFunction("type",e=>e===null?"null":Array.isArray(e)?"array":e instanceof On?"function":typeof e,1,"Returns runtime type of value"),this.registerFunction("assert",(e,r="Assertion failed")=>{if(!e)throw new Error(r);return!0},void 0,"Throws error if condition is falsy")}registerFunction(e,r,n,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,u=typeof s=="object"?s.doc:void 0,f=typeof s=="object"?!!s.allowOverwrite:!1,d=typeof s=="object"&&s.module?s.module:this.currentRegisteringModule,m=this.functionOriginModule.get(e);if(m&&m!==d&&!f)throw new Error(`Cannot register function '${e}' from module '${d}': already registered by module '${m}'`);return this.functionOriginModule.set(e,d),this.hostFunctions.set(e,{fn:r,arity:n,description:a,isDefault:l,isContainerMutation:c,doc:u}),u?this.functionDocs.set(e,{...u,module:u.module??d}):a&&!this.functionDocs.has(e)&&this.functionDocs.set(e,{name:e,category:"Uncategorized",module:d,signature:FL(e,n),description:a}),this}getFunctionOriginModule(e){return this.functionOriginModule.get(e)}initialGlobals=new Map;setGlobal(e,r){return this.initialGlobals.set(e,r),this}getGlobal(e){return this.initialGlobals.get(e)}scanAndCheck(e,r={}){try{let{program:n}=OL(e,r),s=[...this.initialGlobals.keys(),...r.globals||[]],i=new Xd(this.hostFunctions,{...r,globals:s}),o=i.check(n);return{ast:n,diagnostics:o,hasConcurrency:i.hasConcurrency}}catch(n){return n instanceof F?{ast:null,diagnostics:[{message:n.message,line:n.line,column:n.column,severity:"error",file:n.file||r.file}],hasConcurrency:!1}:{ast:null,diagnostics:[{message:n instanceof Error?n.message:String(n),line:1,column:1,severity:"error",file:r.file}],hasConcurrency:!1}}}run(e,r={}){let n=[],{ast:s,diagnostics:i,hasConcurrency:o}=this.scanAndCheck(e,r);if(i.filter(c=>c.severity==="error").length>0||!s)return this.outputLogs=n,{success:!1,diagnostics:i,output:n};if(o)return this.outputLogs=n,{success:!1,diagnostics:[...i,{message:"Concurrency constructs ('parallel', 'sync') require asynchronous execution via engine.runAsync()",line:1,column:1,severity:"error",file:r.file}],output:n};let l;try{l=new ia(this.hostFunctions,f=>n.push(f),!1,this.initialGlobals,r.stderr);let c=l.evaluateProgram(s);this.outputLogs=[...n];let u=l.getRecordedErrors();return this.lastRecordedErrors=u,{success:!0,value:c,diagnostics:i,output:n,errors:u}}catch(c){let u=l?l.getRecordedErrors():[];if(this.lastRecordedErrors=u,c instanceof Ve||c?.name==="LMScriptExit"||c?.isControlFlow){this.outputLogs=[...n];let h=typeof c.exitCode=="number"?c.exitCode:0;return{success:h===0,value:h,exitCode:h,diagnostics:i,output:n,errors:u}}let f=c instanceof F?c.line:1,d=c instanceof F?c.column:1,m=c instanceof F&&c.file||r.file;return this.outputLogs=[...n],{success:!1,diagnostics:[...i,{message:c?.message||String(c),line:f,column:d,severity:"error",file:m}],output:n,errors:u}}}async runAsync(e,r={}){let n=[],{ast:s,diagnostics:i}=this.scanAndCheck(e,r);if(i.filter(l=>l.severity==="error").length>0||!s)return this.outputLogs=n,this.lastRecordedErrors=[],{success:!1,diagnostics:i,output:n,errors:[]};let a;try{a=new ia(this.hostFunctions,u=>n.push(u),!0,this.initialGlobals,r.stderr);let l=await a.evaluateProgramAsync(s);this.outputLogs=[...n];let c=a.getRecordedErrors();return this.lastRecordedErrors=c,{success:!0,value:l,diagnostics:i,output:n,errors:c}}catch(l){let c=a?a.getRecordedErrors():[];if(this.lastRecordedErrors=c,l instanceof Ve||l?.name==="LMScriptExit"||l?.isControlFlow){this.outputLogs=[...n];let m=typeof l.exitCode=="number"?l.exitCode:0;return{success:m===0,value:m,exitCode:m,diagnostics:i,output:n,errors:c}}let u=l instanceof F?l.line:1,f=l instanceof F?l.column:1,d=l instanceof F&&l.file||r.file;return this.outputLogs=[...n],{success:!1,diagnostics:[...i,{message:l?.message||String(l),line:u,column:f,severity:"error",file:d}],output:n,errors:c}}}lastRecordedErrors=[];getRecordedErrors(){return[...this.lastRecordedErrors]}hasFunction(e){return this.hostFunctions.has(e)}getRegisteredFunctions(){return Array.from(this.hostFunctions.keys())}};Ay=we.basename(Ny(import.meta.url));(Ay==="lmscript.ts"||Ay==="lmscript.js")&&process.argv[1]&&U.existsSync(process.argv[1])&&U.realpathSync(Ny(import.meta.url))===U.realpathSync(we.resolve(process.argv[1]))&&UL()});import{homedir as jL}from"node:os";function Fy(t,e){let r=new Set;return{text:t.replace(WL,(s,i)=>{let o=i.trim(),a=BL[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function Py(t){return{workdir:t.workdir,teamfile:t.teamfile,date:HL(t.date)}}function HL(t){return t.toISOString().slice(0,10)}var BL,WL,Uy=k(()=>{"use strict";Ae();BL={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>Wn(t.teamfile),home:()=>jL(),date:t=>t.date},WL=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var ru={};se(ru,{GEMINI_PROVIDER_NOTICE:()=>Xy,_setAgyModelsRunnerForTests:()=>YL,_setCatalogSnapshotForTests:()=>KL,_setCodexModelsRunnerForTests:()=>zL,_setLintOpenCodeConfigProbeForTests:()=>eC,_setLintSessiondirFsOpsForTests:()=>ZL,_setTeamfileSeedForTests:()=>QL,buildRootTeamRegistrationRow:()=>zy,lintTeamfileStructured:()=>tu,registerRootTeam:()=>oa,runLint:()=>Lt,runSeed:()=>Vr,seedTeamfile:()=>Tr,sha256Text:()=>Yy,validateMemberSpec:()=>st});import{createHash as XL}from"node:crypto";import{accessSync as qL,constants as jy,existsSync as GL,readFileSync as Kd,realpathSync as Yd,statSync as JL,writeFileSync as By}from"node:fs";import{dirname as Jr,resolve as Hy}from"node:path";function KL(t){zs=t??void 0}function Jy(t){return ay(t,zs!==void 0?{snapshot:zs}:{})}function Vy(t){return ly(t,zs!==void 0?{snapshot:zs}:{})}function YL(t){Zd=t??void 0}function zL(t){eu=t??void 0}function QL(t){qy=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(jt(),dd)),n=await r(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function ZL(t){Gr=t===null?zd:{...zd,...t}}function eC(t){Gy=t??fs}async function tC(t,e,r){let n=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(n.map(async i=>({member:i,result:await Gy({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...r!==void 0?{env:r}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function rC(t,e){let r=Jr(e),n=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=Hy(o);if(n.has(a))continue;let l=nC(a);l!==void 0&&(n.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 nC(t){try{if(Gr.existsSync(t)){if(!Gr.statSync(t).isDirectory())return"ENOTDIR";Gr.accessSync(t,jy.W_OK);return}let e=iC(t);if(e===void 0)return;if(!Gr.statSync(e).isDirectory())return"ENOTDIR";Gr.accessSync(e,jy.W_OK);return}catch(e){return oC(e)??"permission check failed"}}function sC(t){let e=Hy(t);try{return Yd(e)}catch{return e}}function iC(t){let e=t;for(;;){try{if(Gr.existsSync(e))return e}catch{return}let r=Jr(e);if(r===e)return;e=r}}function oC(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 Ky(t,e){let r;try{r=await L(e,l=>me(t,l))}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let n;try{n=ae(r)}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let s=Hn(n,Jr(r));e.stderr.write(`notice: checking teamfile and models ...
2263
+ `):console.error(`error: ${String(r)}`),new Ve(2);return e},2,'Stops the script (stderr message, exit 2) if value is missing -- "", null, [], or false -- else returns value unchanged, so it composes with getstr/getnum/getbool/getlist'),this.registerFunction("set",(e,r,n)=>{if(e==null||typeof e!="object")return e;let s=Array.isArray(r)?r:String(r).replace(/\[(\w+)\]/g,".$1").split(".").filter(Boolean),i=e;for(let o=0;o<s.length-1;o++){let a=s[o];(Nt(i,a)==null||typeof Nt(i,a)!="object")&&yr(i,a,{}),i=Nt(i,a)}return s.length>0&&yr(i,s[s.length-1],n),e},3,"Sets nested property by path",!0,!0),this.registerFunction("pluck",(e,r)=>Array.isArray(e)?e.map(n=>Nt(n,r)):[],2,"Extracts key from array of objects"),this.registerFunction("filter_by",(e,r,n)=>Array.isArray(e)?e.filter(s=>s!=null&&Nt(s,r)===n):[],3,"Filters array of objects where item[key] == value"),this.registerFunction("find_by",(e,r,n)=>{if(!Array.isArray(e))return null;let s=e.find(i=>i!=null&&Nt(i,r)===n);return s!==void 0?s:null},3,"Finds first object in array where item[key] == value"),this.registerFunction("merge",(e,r)=>({...e,...r}),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,r)=>(e&&typeof e=="object"&&delete e[r],e),2,"Deletes key from object",!0,!0),this.registerFunction("print",(...e)=>{let r=e.map(n=>typeof n=="object"?JSON.stringify(n):String(n)).join(" ");return this.outputLogs.push(r),r},void 0,"Prints formatted values to output log",!0),this.registerFunction("println",(...e)=>{let r=e.map(n=>typeof n=="object"?JSON.stringify(n):String(n)).join(" ");return this.outputLogs.push(r),r},void 0,"Prints line to output log",!0),this.registerFunction("printf",(e,...r)=>{let n=Js(e,r);return this.outputLogs.push(n),n},void 0,"Formats a template using %s/%d/%f/%% substitution and prints it",!0),this.registerFunction("split",(e,r="")=>String(e).split(r),void 0,"Splits string by delimiter"),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 r=e.split(/\r?\n/).map(a=>a.trim()).filter(a=>a.length>0);if(r.length===0)return null;let n=a=>a==="DONE"||a==="NOTHING_TO_DO"||a==="BLOCKED"||a==="OTHER",s=r[r.length-1],i=r.length>1?r[r.length-2]:null,o=r.length>2?r[r.length-3]:null;return n(s)?i&&n(i)&&i!==s?null:s:i&&n(i)?o&&n(o)&&o!==i?null:i: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,r=", ")=>Array.isArray(e)?e.join(r):String(e),void 0,"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("toUpperCase",e=>String(e).toUpperCase(),1,"Converts string to uppercase (alias for upper)"),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("toLowerCase",e=>String(e).toLowerCase(),1,"Converts string to lowercase (alias for lower)"),this.registerFunction("capitalize",e=>{let r=String(e);return r.length===0?"":r.charAt(0).toUpperCase()+r.slice(1)},1,"Capitalizes first letter"),this.registerFunction("title_case",e=>String(e).replace(/\b\w/g,r=>r.toUpperCase()),1,"Converts string to Title Case"),this.registerFunction("contains",(e,r)=>Array.isArray(e)?e.includes(r):String(e).includes(String(r)),2,"Checks if string or array contains item"),this.registerFunction("includes",(e,r)=>Array.isArray(e)?e.includes(r):String(e).includes(String(r)),2,"Checks if string or array contains item"),this.registerFunction("starts_with",(e,r)=>String(e).startsWith(r),2,"Checks if string starts with prefix"),this.registerFunction("startswith",(e,r)=>String(e).startsWith(r),2,"Checks if string starts with prefix (alias for starts_with)"),this.registerFunction("ends_with",(e,r)=>String(e).endsWith(r),2,"Checks if string ends with suffix"),this.registerFunction("endswith",(e,r)=>String(e).endsWith(r),2,"Checks if string ends with suffix (alias for ends_with)"),this.registerFunction("index_of",(e,r,n)=>String(e).indexOf(r,n),void 0,"Finds index of substring"),this.registerFunction("indexOf",(e,r,n)=>String(e).indexOf(r,n),void 0,"Finds index of substring (alias for index_of)"),this.registerFunction("last_index_of",(e,r)=>String(e).lastIndexOf(r),2,"Finds last index of substring"),this.registerFunction("count_matches",(e,r)=>r?String(e).split(r).length-1:0,2,"Counts occurrences of substring"),this.registerFunction("substr",(e,r,n)=>{let s=String(e);return n===void 0?s.substring(r):s.substring(r,r+n)},void 0,"Returns substring by start and length"),this.registerFunction("substring",(e,r,n)=>String(e).substring(r,n),void 0,"Returns substring between indices"),this.registerFunction("slice",(e,r,n)=>e!=null?e.slice(r,n):"",void 0,"Slices string or array"),this.registerFunction("char_at",(e,r)=>String(e).charAt(r),2,"Returns character at index"),this.registerFunction("char_code",(e,r=0)=>String(e).charCodeAt(r),void 0,"Returns character code at index"),this.registerFunction("from_char_code",(...e)=>String.fromCharCode(...e),void 0,"Returns string from character codes"),this.registerFunction("replace",(e,r,n)=>String(e).replace(r,n),3,"Replaces first occurrence"),this.registerFunction("replace_all",(e,r,n)=>String(e).replaceAll(r,n),3,"Replaces all occurrences"),this.registerFunction("repeat",(e,r)=>String(e).repeat(r),2,"Repeats string count times"),this.registerFunction("pad_start",(e,r,n=" ")=>String(e).padStart(r,n),void 0,"Left-pads string"),this.registerFunction("pad_end",(e,r,n=" ")=>String(e).padEnd(r,n),void 0,"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 On,1,"Checks if value is a first-class function reference"),this.registerFunction("shell_quote",e=>My(e),1,"Quotes string safely for POSIX shell command execution",!0),this.registerFunction("format",(e,...r)=>{let n=String(e),s=r.length===1&&typeof r[0]=="object"&&r[0]!==null&&!Array.isArray(r[0])?r[0]:void 0,i=0,o="",a=l=>typeof l=="object"&&l!==null?JSON.stringify(l):String(l);for(let l=0;l<n.length;){let c=n[l];if(c==="{"&&n[l+1]==="{"){o+="{",l+=2;continue}if(c==="}"&&n[l+1]==="}"){o+="}",l+=2;continue}if(c!=="{"){o+=c,l+=1;continue}let u=n.indexOf("}",l+1);if(u<0){o+=c,l+=1;continue}let f=n.slice(l+1,u);if(f==="")o+=i<r.length?a(r[i++]):"{}";else if(/^\d+$/.test(f)){let d=Number(f);o+=d<r.length?a(r[d]):`{${f}}`}else s&&/^[a-zA-Z0-9_]+$/.test(f)&&Object.hasOwn(s,f)?o+=a(s[f]):o+=`{${f}}`;l=u+1}return o},void 0,"Formats string with arguments, supporting {{ and }} brace escapes, positional {0}, auto {}, and {key} map substitution"),this.registerFunction("sprintf",(e,...r)=>Js(e,r),void 0,"Formats a template using %s/%d/%f/%% substitution (C/Perl/Python printf style; use format() for {} brace syntax)"),this.registerFunction("regex_test",(e,r,n="")=>new RegExp(r,n).test(String(e)),{min:2,max:3},"Tests whether a regex pattern matches anywhere in the string"),this.registerFunction("test",(e,r,n="")=>new RegExp(r,n).test(String(e)),{min:2,max:3},"Tests whether a regex pattern matches anywhere in the string (alias for regex_test)"),this.registerFunction("regex_match",(e,r,n="")=>{let s=String(e).match(new RegExp(r,n));return s?Array.from(s,i=>i===void 0?null:i):null},{min:2,max:3},"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null"),this.registerFunction("match",(e,r,n="")=>{let s=String(e).match(new RegExp(r,n));return s?Array.from(s,i=>i===void 0?null:i):null},{min:2,max:3},"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null (alias for regex_match)"),this.registerFunction("search",(e,r,n="")=>{let s=String(e).match(new RegExp(r,n));return s?Array.from(s,i=>i===void 0?null:i):null},{min:2,max:3},"Returns [full_match, group1, group2, ...] for the first regex match anywhere in the string, or null (alias for regex_match)"),this.registerFunction("regex_find_all",(e,r,n="")=>{let s=new RegExp(r,n.includes("g")?n:`${n}g`),i=String(e),o=[],a;for(;(a=s.exec(i))!==null;)o.push(Array.from(a,l=>l===void 0?null:l)),a[0]===""&&(s.lastIndex+=1);return o},{min:2,max:3},"Returns an array of every regex match in the string, each as [full_match, group1, ...]"),this.registerFunction("findall",(e,r,n="")=>{let s=new RegExp(r,n.includes("g")?n:`${n}g`),i=String(e),o=[],a;for(;(a=s.exec(i))!==null;)o.push(Array.from(a,l=>l===void 0?null:l)),a[0]===""&&(s.lastIndex+=1);return o},{min:2,max:3},"Returns an array of every regex match in the string, each as [full_match, group1, ...] (alias for regex_find_all)"),this.registerFunction("regex_replace",(e,r,n,s="")=>String(e).replace(new RegExp(r,s),n),{min:3,max:4},'Replaces regex match(es) with replacement (supports $1/$2 group backreferences); include "g" in flags to replace every occurrence, not just the first'),this.registerFunction("split_regex",(e,r,n="")=>String(e).split(new RegExp(r,n)),{min:2,max:3},"Splits a string into an array wherever the regex pattern 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=>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 (alias for len)"),this.registerFunction("count",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 (alias for len)"),this.registerFunction("range",(e,r,n=1)=>{let s=r===void 0?0:e,i=r===void 0?e:r,o=[];if(n>0)for(let a=s;a<i;a+=n)o.push(a);else if(n<0)for(let a=s;a>i;a+=n)o.push(a);return o},void 0,"Generates an array of numbers"),this.registerFunction("abs",e=>Math.abs(e),1,"Absolute value"),this.registerFunction("min",(...e)=>{let r=e.length===1&&Array.isArray(e[0])?e[0]:e;return Math.min(...r)},void 0,"Minimum value"),this.registerFunction("max",(...e)=>{let r=e.length===1&&Array.isArray(e[0])?e[0]:e;return Math.max(...r)},void 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,r)=>Math.pow(e,r),2,"Power calculation"),this.registerFunction("random",()=>Math.random(),0,"Random float between 0 and 1"),this.registerFunction("clock",()=>Date.now(),0,"Returns current epoch in ms"),this.registerFunction("now",()=>Date.now(),0,"Returns current epoch in ms (alias for clock)"),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,r)=>ky(e,r),2,"Formats an epoch-ms timestamp using %Y/%m/%d/%H/%M/%S tokens"),this.registerFunction("date_format",(e,r)=>ky(e,r),2,"Formats an epoch-ms timestamp using %Y/%m/%d/%H/%M/%S tokens (alias for strftime)"),this.registerFunction("coalesce",(...e)=>{for(let r of e)if(r!=null)return r;return null},void 0,"Returns the first non-null/non-undefined argument, else null"),this.registerFunction("if_null",(e,r)=>e??r,2,"Returns fallback if val is null/undefined, else val"),this.registerFunction("default_to",(e,r)=>e??r,2,"Returns fallback if val is null/undefined, else val (alias for if_null)"),this.registerFunction("if_else",(e,r,n)=>e?r:n,3,"Expression-level ternary: returns thenVal if cond is truthy, else elseVal"),this.registerFunction("str",e=>e===null?"null":String(e),1,"Converts value to string"),this.registerFunction("to_string",e=>e===null?"null":String(e),1,"Converts value to string (alias for str)"),this.registerFunction("num",e=>Number(e),1,"Converts value to number"),this.registerFunction("type",e=>e===null?"null":Array.isArray(e)?"array":e instanceof On?"function":typeof e,1,"Returns runtime type of value"),this.registerFunction("assert",(e,r="Assertion failed")=>{if(!e)throw new Error(r);return!0},void 0,"Throws error if condition is falsy")}registerFunction(e,r,n,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,u=typeof s=="object"?s.doc:void 0,f=typeof s=="object"?!!s.allowOverwrite:!1,d=typeof s=="object"&&s.module?s.module:this.currentRegisteringModule,m=this.functionOriginModule.get(e);if(m&&m!==d&&!f)throw new Error(`Cannot register function '${e}' from module '${d}': already registered by module '${m}'`);return this.functionOriginModule.set(e,d),this.hostFunctions.set(e,{fn:r,arity:n,description:a,isDefault:l,isContainerMutation:c,doc:u}),u?this.functionDocs.set(e,{...u,module:u.module??d}):a&&!this.functionDocs.has(e)&&this.functionDocs.set(e,{name:e,category:"Uncategorized",module:d,signature:FL(e,n),description:a}),this}getFunctionOriginModule(e){return this.functionOriginModule.get(e)}initialGlobals=new Map;setGlobal(e,r){return this.initialGlobals.set(e,r),this}getGlobal(e){return this.initialGlobals.get(e)}scanAndCheck(e,r={}){try{let{program:n}=OL(e,r),s=[...this.initialGlobals.keys(),...r.globals||[]],i=new Xd(this.hostFunctions,{...r,globals:s}),o=i.check(n);return{ast:n,diagnostics:o,hasConcurrency:i.hasConcurrency}}catch(n){return n instanceof F?{ast:null,diagnostics:[{message:n.message,line:n.line,column:n.column,severity:"error",file:n.file||r.file}],hasConcurrency:!1}:{ast:null,diagnostics:[{message:n instanceof Error?n.message:String(n),line:1,column:1,severity:"error",file:r.file}],hasConcurrency:!1}}}run(e,r={}){let n=[],{ast:s,diagnostics:i,hasConcurrency:o}=this.scanAndCheck(e,r);if(i.filter(c=>c.severity==="error").length>0||!s)return this.outputLogs=n,{success:!1,diagnostics:i,output:n};if(o)return this.outputLogs=n,{success:!1,diagnostics:[...i,{message:"Concurrency constructs ('parallel', 'sync') require asynchronous execution via engine.runAsync()",line:1,column:1,severity:"error",file:r.file}],output:n};let l;try{l=new ia(this.hostFunctions,f=>n.push(f),!1,this.initialGlobals,r.stderr);let c=l.evaluateProgram(s);this.outputLogs=[...n];let u=l.getRecordedErrors();return this.lastRecordedErrors=u,{success:!0,value:c,diagnostics:i,output:n,errors:u}}catch(c){let u=l?l.getRecordedErrors():[];if(this.lastRecordedErrors=u,c instanceof Ve||c?.name==="LMScriptExit"||c?.isControlFlow){this.outputLogs=[...n];let g=typeof c.exitCode=="number"?c.exitCode:0;return{success:g===0,value:g,exitCode:g,diagnostics:i,output:n,errors:u}}let f=c instanceof F?c.line:1,d=c instanceof F?c.column:1,m=c instanceof F&&c.file||r.file;return this.outputLogs=[...n],{success:!1,diagnostics:[...i,{message:c?.message||String(c),line:f,column:d,severity:"error",file:m}],output:n,errors:u}}}async runAsync(e,r={}){let n=[],{ast:s,diagnostics:i}=this.scanAndCheck(e,r);if(i.filter(l=>l.severity==="error").length>0||!s)return this.outputLogs=n,this.lastRecordedErrors=[],{success:!1,diagnostics:i,output:n,errors:[]};let a;try{a=new ia(this.hostFunctions,u=>n.push(u),!0,this.initialGlobals,r.stderr);let l=await a.evaluateProgramAsync(s);this.outputLogs=[...n];let c=a.getRecordedErrors();return this.lastRecordedErrors=c,{success:!0,value:l,diagnostics:i,output:n,errors:c}}catch(l){let c=a?a.getRecordedErrors():[];if(this.lastRecordedErrors=c,l instanceof Ve||l?.name==="LMScriptExit"||l?.isControlFlow){this.outputLogs=[...n];let m=typeof l.exitCode=="number"?l.exitCode:0;return{success:m===0,value:m,exitCode:m,diagnostics:i,output:n,errors:c}}let u=l instanceof F?l.line:1,f=l instanceof F?l.column:1,d=l instanceof F&&l.file||r.file;return this.outputLogs=[...n],{success:!1,diagnostics:[...i,{message:l?.message||String(l),line:u,column:f,severity:"error",file:d}],output:n,errors:c}}}lastRecordedErrors=[];getRecordedErrors(){return[...this.lastRecordedErrors]}hasFunction(e){return this.hostFunctions.has(e)}getRegisteredFunctions(){return Array.from(this.hostFunctions.keys())}};Ay=we.basename(Ny(import.meta.url));(Ay==="lmscript.ts"||Ay==="lmscript.js")&&process.argv[1]&&U.existsSync(process.argv[1])&&U.realpathSync(Ny(import.meta.url))===U.realpathSync(we.resolve(process.argv[1]))&&UL()});import{homedir as jL}from"node:os";function Fy(t,e){let r=new Set;return{text:t.replace(WL,(s,i)=>{let o=i.trim(),a=BL[o];return a===void 0?(r.add(o),s):a(e)}),unknownNames:[...r].sort()}}function Py(t){return{workdir:t.workdir,teamfile:t.teamfile,date:HL(t.date)}}function HL(t){return t.toISOString().slice(0,10)}var BL,WL,Uy=k(()=>{"use strict";Ae();BL={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>Wn(t.teamfile),home:()=>jL(),date:t=>t.date},WL=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var ru={};se(ru,{GEMINI_PROVIDER_NOTICE:()=>Xy,_setAgyModelsRunnerForTests:()=>YL,_setCatalogSnapshotForTests:()=>KL,_setCodexModelsRunnerForTests:()=>zL,_setLintOpenCodeConfigProbeForTests:()=>eC,_setLintSessiondirFsOpsForTests:()=>ZL,_setTeamfileSeedForTests:()=>QL,buildRootTeamRegistrationRow:()=>zy,lintTeamfileStructured:()=>tu,registerRootTeam:()=>oa,runLint:()=>Lt,runSeed:()=>Vr,seedTeamfile:()=>Tr,sha256Text:()=>Yy,validateMemberSpec:()=>st});import{createHash as XL}from"node:crypto";import{accessSync as qL,constants as jy,existsSync as GL,readFileSync as Kd,realpathSync as Yd,statSync as JL,writeFileSync as By}from"node:fs";import{dirname as Jr,resolve as Hy}from"node:path";function KL(t){zs=t??void 0}function Jy(t){return ay(t,zs!==void 0?{snapshot:zs}:{})}function Vy(t){return ly(t,zs!==void 0?{snapshot:zs}:{})}function YL(t){Zd=t??void 0}function zL(t){eu=t??void 0}function QL(t){qy=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(jt(),dd)),n=await r(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function ZL(t){Gr=t===null?zd:{...zd,...t}}function eC(t){Gy=t??fs}async function tC(t,e,r){let n=t.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(n.map(async i=>({member:i,result:await Gy({cwd:i.sessiondir??e,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...r!==void 0?{env:r}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function rC(t,e){let r=Jr(e),n=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=Hy(o);if(n.has(a))continue;let l=nC(a);l!==void 0&&(n.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 nC(t){try{if(Gr.existsSync(t)){if(!Gr.statSync(t).isDirectory())return"ENOTDIR";Gr.accessSync(t,jy.W_OK);return}let e=iC(t);if(e===void 0)return;if(!Gr.statSync(e).isDirectory())return"ENOTDIR";Gr.accessSync(e,jy.W_OK);return}catch(e){return oC(e)??"permission check failed"}}function sC(t){let e=Hy(t);try{return Yd(e)}catch{return e}}function iC(t){let e=t;for(;;){try{if(Gr.existsSync(e))return e}catch{return}let r=Jr(e);if(r===e)return;e=r}}function oC(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 Ky(t,e){let r;try{r=await L(e,l=>me(t,l))}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let n;try{n=ae(r)}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let s=Hn(n,Jr(r));e.stderr.write(`notice: checking teamfile and models ...
2264
2264
  `);let i=Md(n.members,{agyModelsRunner:Zd,codexModelsRunner:eu});i.push(...await Jy(n.members)),s.push(...await Vy(n.members));let o=Kd(r,"utf8"),a=Fy(o,Py({workdir:Jr(r),teamfile:r,date:new Date})).unknownNames;a.length>0&&i.push(`unknown template placeholder${a.length===1?"":"s"}: ${a.map(l=>`{{${l}}}`).join(", ")}`),i.push(...Ul(n.members,Jr(r))),i.push(...rC(n.members,r)),i.push(...await tC(n.members,Jr(r),e.env));for(let l of s)e.stderr.write(`error: ${l.field}: ${l.message}
2265
2265
  `);for(let l of n.members)Qd([l],e),l.session!==void 0&&l.session.length<Ys&&i.push(`${l.alias}: sessionid is shorter than ${Ys} chars; run lmctl seed to refresh it`);return{ok:!0,result:{config:n,absTeamfile:r,errors:s,warnings:i}}}async function Lt(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(VL),0;let r=oe(t,[],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
2266
2266
  `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
@@ -2281,7 +2281,7 @@ After this seed finishes, use \`lmctl prompt ${JSON.stringify(r)} <alias> "<mess
2281
2281
  `);for(let E of await Jy(o.members))e.stderr.write(`warning: ${E}
2282
2282
  `);for(let E of Ul(o.members,i))e.stderr.write(`warning: ${E}
2283
2283
  `);let d=await Vy(o.members);if(d.length>0){for(let E of d)e.stderr.write(`error: ${E.field}: ${E.message}
2284
- `);return 1}let m=r.replaceSession;if(m){let E=o.members.find(w=>w.alias.toLowerCase()===m.alias.toLowerCase());if(!E||E.teamfile||E.session!==m.sessionid)return wr(e,"Session binding changed; refresh cancelled.")}let h=0,y=o.members.filter(E=>E.teamfile!==void 0?!1:m?E.alias.toLowerCase()===m.alias.toLowerCase():E.session===void 0||E.session.length<Ys);for(let E of y)if(!Qy(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
2284
+ `);return 1}let m=r.replaceSession;if(m){let E=o.members.find(w=>w.alias.toLowerCase()===m.alias.toLowerCase());if(!E||E.teamfile||E.session!==m.sessionid)return wr(e,"Session binding changed; refresh cancelled.")}let g=0,y=o.members.filter(E=>E.teamfile!==void 0?!1:m?E.alias.toLowerCase()===m.alias.toLowerCase():E.session===void 0||E.session.length<Ys);for(let E of y)if(!Qy(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
2285
2285
  `),1;for(let E of o.members){if(E.teamfile!==void 0||m&&E.alias.toLowerCase()!==m.alias.toLowerCase())continue;if(!m&&E.session!==void 0&&E.session.length>=Ys){e.stderr.write(`warning: ${E.alias}: existing sessionid preserved; skipping
2286
2286
  `);continue}let w=E.sessiondir??i;e.stderr.write(`${E.alias}: launching ${E.provider} seed session; this can take several seconds
2287
2287
  `);let S=mt(e,x=>`${E.alias}: still launching (${x}s elapsed)
@@ -2291,10 +2291,10 @@ After this seed finishes, use \`lmctl prompt ${JSON.stringify(r)} <alias> "<mess
2291
2291
  `);if(x.error!==void 0||x.sessionId===void 0||x.sessionId.length<Ys){let N=`provider did not report a sessionid; no new session was found for ${w} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${E.alias}: seed failed${x.error!==void 0?`: ${x.error}`:`; ${N}`}
2292
2292
  `),1}let I=u.get(E.alias.toLowerCase());if(I===void 0)return e.stderr.write(`error: ${E.alias}: could not find matching _MEMBER_ line to update
2293
2293
  `),1;let R=sC(w),M=Vd(l[I],"sessionid",x.sessionId);if(M=Vd(M,"sessiondir",R),E.model===void 0){let N;try{N=(await ge(x.sessionId,E.provider))?.model}catch{N=void 0}N!==void 0&&N.length>0?M=Vd(M,"model",N):e.stderr.write(`warning: ${E.alias}: seed could not determine which model ${E.provider} selected; model= left unset
2294
- `)}if((m||r.guardFile)&&Kd(n,"utf8")!==c)return wr(e,`Teamfile changed during seeding; new session ${x.sessionId} was not attached. Existing bindings preserved.`);l[I]=M,h+=1,c=l.join(`
2294
+ `)}if((m||r.guardFile)&&Kd(n,"utf8")!==c)return wr(e,`Teamfile changed during seeding; new session ${x.sessionId} was not attached. Existing bindings preserved.`);l[I]=M,g+=1,c=l.join(`
2295
2295
  `),By(n,c,"utf8"),e.stdout.write(`${E.alias}: seeded ${x.sessionId} provider=${E.provider} sessiondir=${R}
2296
- `)}finally{v()}}let g=l.join(`
2297
- `),p=hC(g,Yd(n));p!==g&&By(n,p,"utf8"),h===0&&e.stdout.write(`no members needed seeding
2296
+ `)}finally{v()}}let h=l.join(`
2297
+ `),p=hC(h,Yd(n));p!==h&&By(n,p,"utf8"),g===0&&e.stdout.write(`no members needed seeding
2298
2298
  `);let _=new Date().toISOString();try{await L(e,E=>{oa(E,{teamfilePath:s,name:o.name,rawText:p,now:_})})}catch(E){return wr(e,E instanceof Error?E.message:String(E))}return 0}function Yy(t){return XL("sha256").update(t).digest("hex")}function zy(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:Yy(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function oa(t,e){let r=ki(e.rawText,e.teamfilePath);Xn(t,e.teamfilePath,r);let n=zy(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(n),n}function uC(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=fC(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function mC(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function fC(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function Vd(t,e,r){let n=`${e}=${pC(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(i,o)=>`${o}${n}`):`${t.trimEnd()} ${n}`}function pC(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function hC(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
2299
2299
  `),s=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n+1):"";return s===r?t:s.startsWith("#teamfile:")?i.length>0?`${r}
2300
2300
  ${i}`:`${r}
@@ -2364,8 +2364,8 @@ possibly work, seed reports it as an error and seeds nothing.
2364
2364
  and save it to <file> (lmctl.com curates these, not lmctl itself).
2365
2365
  Refuses to overwrite an existing <file> unless --force is given.
2366
2366
  --script <name> With --save-script, fetch commands/<name>.lms instead of the default
2367
- `,Xy='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',zd={existsSync:GL,statSync:JL,accessSync:qL},qy=async t=>{let{seed:e}=await Promise.resolve().then(()=>(jt(),dd)),r=await e(t);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},Gr=zd,Gy=fs;aC=/^\[([^\]]+)\]\s+(.*)$/s,lC=/^([^:\s][^:]*):\s+(.*)$/s});function Fe(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 Ct(t,e){if(t==null||typeof t=="boolean")return null;let r=Number(t);return Fe(e==="percent"?r/100:r)}function Zy(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 eE(t){if(typeof t!="string"||t.trim()==="")return null;let e=Date.parse(t);return Number.isFinite(e)?Math.floor(e/1e3):null}function tE(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 rE(t){let e=String(t??"").trim().toLowerCase().replace(/-/g,"_").split("_").filter(Boolean);for(let r of[e[0],e.at(-1)]){if(r?.startsWith("5h")||r?.startsWith("five")||r==="session")return"five_hour";if(r?.startsWith("7d")||r?.startsWith("seven")||r?.startsWith("week"))return"weekly";if(r?.startsWith("30d")||r?.startsWith("month"))return"monthly"}return"unknown"}function aa(t,e=[]){let r=t==null?"":String(t);for(let n of e)typeof n=="string"&&n.length>=4&&(r=r.replaceAll(n,"***REDACTED***"));for(let n of _C)r=r.replace(n,"***REDACTED***");return r}function Ke(t){let e=Fe(t.used_fraction),r=Fe(t.remaining_fraction),n=t.resets_at==null?eE(t.resets_at_iso):Number(t.resets_at),s=t.resets_at_iso==null?Zy(n):Zy(eE(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??(r===null?null:Fe(1-r)),remaining_fraction:r??(e===null?null:Fe(1-e)),resets_at:n==null||!Number.isFinite(n)?null:Math.trunc(n),resets_at_iso:s,is_exhausted:t.is_exhausted??(r!==null?r<=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 Ie(t,e,r={}){let n={$schema:gC,provider:t,status:e,source:r.source??null,read_at:r.read_at??Math.floor(Date.now()/1e3),account_id:r.account_id??null,plan_type:r.plan_type??null,ordinary_usage_allowed:r.ordinary_usage_allowed??null,buckets:r.buckets??[]};for(let s of["credits","spend_control","characteristics","reason","detail","retry_after_seconds"])r[s]!=null&&(n[s]=r[s]);return n}function Le(t,e,r,n,s,i=[],o){return Ie(t,e,{source:s??null,reason:r,...n==null?{}:{detail:aa(n,i)},...o==null?{}:{retry_after_seconds:o}})}function nE(t){let e=t.get("retry-after");if(e===null)return null;let r=Number.parseFloat(e);return Number.isFinite(r)&&r>=0?Math.trunc(r):null}var gC,_C,Qs=k(()=>{"use strict";gC="https://lmctl.com/schemas/lmratelimit-v1.json";_C=[/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 yC}from"node:child_process";import{readdirSync as EC,readFileSync as wC}from"node:fs";import{join as TC}from"node:path";function AC(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("ANTIGRAVITY")))}function RC(t){let e=t.trim().toLowerCase(),r={"gemini models":"gemini","claude and gpt models":"3p",gemini:"gemini","3p models":"3p","3p":"3p"};return r[e]?r[e]:e.replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function NC(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 LC(t){let e={weekly:"weekly",five_hour:"5h",monthly:"monthly"},r=[];for(let n of t.split(/\r?\n/)){let s=n.trim().split(" ").map(l=>l.trim());if(s.length<3||!s[0]||!s[1])continue;let i=NC(s[1]);if(!i)continue;let o=Number(s[2].replace(/%$/,"").trim());if(!Number.isFinite(o))continue;let a=Fe(o/100);r.push(Ke({bucket_id:`${RC(s[0])}-${e[i]}`,group_name:s[0],window_type:i,used_fraction:a===null?null:Fe(1-a),remaining_fraction:a,resets_at_iso:s[3]||null,raw_value:o,raw_scale:"remaining_percent"}))}return r.sort((n,s)=>String(n.group_name??"").localeCompare(String(s.group_name??""))||String(n.bucket_id??"").localeCompare(String(s.bucket_id??"")))}function Zs(t,e,r){return Le("agy","provider_unavailable",t,e,"agy_cli_print")}function CC(t,e){try{let r=xC(Math.max(t,60)*1e3,AC(e));if(r.error?.code==="ENOENT")return Zs("agy_not_found","the agy CLI is not on PATH",t);if(r.error?.code==="ETIMEDOUT")return Zs("cli_timeout","agy -p /usage did not finish in time",t);if(r.error)return Zs("cli_failed",r.error.message,t);let n=LC(r.stdout??"");return n.length===0?Zs("cli_unparseable",`exit ${r.status??1}; no buckets parsed from CLI output`,t):Ie("agy","ok",{source:"agy_cli_print",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:n})}catch(r){return Zs("cli_failed",r instanceof Error?r.message:String(r),t)}}function OC(t){let e=[],r=new Set,n=(s,i,o)=>{!s||!i||r.has(`${s}\0${i}`)||(r.add(`${s}\0${i}`),e.push([s,i,o]))};n(t[sE],t[iE],-1);try{for(let s of EC("/proc"))if(/^\d+$/.test(s))try{let i={};for(let o of wC(TC("/proc",s,"environ")).toString("utf8").split("\0")){let a=o.indexOf("=");a>0&&(i[o.slice(0,a)]=o.slice(a+1))}n(i[sE],i[iE],Number(s))}catch{}}catch{}return e}function MC(t){if(typeof t!="object"||t===null)return null;let e=t.response;if(typeof e!="object"||e===null)return null;let r=e.groups;if(!Array.isArray(r))return null;let n=[];for(let s of r){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=Ct(l.remainingFraction,"fraction");n.push(Ke({bucket_id:l.bucketId??l.displayName??"unknown",group_name:o,window_type:rE(l.window),used_fraction:c===null?null:Fe(1-c),remaining_fraction:c,resets_at_iso:l.resetTime??null,raw_value:l.remainingFraction??null,raw_scale:"remaining_fraction"}))}}return n.length===0?null:(n.sort((s,i)=>String(s.group_name??"").localeCompare(String(i.group_name??""))||String(s.bucket_id??"").localeCompare(String(i.bucket_id??""))),Ie("agy","ok",{source:"agy_connect_rpc",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:n}))}async function DC(t,e){let r=OC(e);if(r.length===0)return Le("agy","provider_unavailable","no_active_session","no live agy process exposed ANTIGRAVITY_LS_ADDRESS/ANTIGRAVITY_CSRF_TOKEN","agy_connect_rpc");let n=[];for(let[s,i,o]of r)try{let a=await kC(`http://${s}${vC}`,{"Content-Type":"application/json","Connect-Protocol-Version":"1","x-codeium-csrf-token":i},t*1e3);if(a.status===200){let l;try{l=JSON.parse(a.body)}catch{n.push(`pid=${o}: unparseable response`);continue}let c=MC(l);if(c)return c;n.push(`pid=${o}: response had no quota groups`)}else a.status===401||a.status===403?n.push(`pid=${o}: HTTP ${a.status} unauthorized`):n.push(`pid=${o}: HTTP ${a.status}`)}catch(a){n.push(`pid=${o}: ${a instanceof Error?a.message:String(a)}`)}return Le("agy","provider_unavailable","no_active_session",`all candidate language servers failed: ${n.slice(0,5).join("; ")}`,"agy_connect_rpc",r.map(([,s])=>s))}async function oE(t){let e=CC(t.timeoutSeconds,t.env);if(e.status==="ok")return e;let r=await DC(t.timeoutSeconds,t.env);return r.status==="ok"?r:Le("agy","provider_unavailable","cli_and_language_server_unavailable",`cli: ${String(e.reason??e.status)} (${String(e.detail??"no detail")}); connect: ${String(r.reason??r.status)} (${String(r.detail??"no detail")})`,"agy_cli_print")}var sE,iE,vC,SC,bC,IC,xC,kC,aE=k(()=>{"use strict";Qs();sE="ANTIGRAVITY_LS_ADDRESS",iE="ANTIGRAVITY_CSRF_TOKEN",vC="/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary",SC=["-p","/usage"],bC=(t,e)=>{let r=yC("agy",SC,{encoding:"utf8",timeout:t,maxBuffer:16777216,env:e,stdio:["ignore","pipe","ignore"]});return{status:r.status,stdout:typeof r.stdout=="string"?r.stdout:"",error:r.error}},IC=async(t,e,r)=>{let n=await fetch(t,{method:"POST",headers:e,body:"{}",signal:AbortSignal.timeout(r)});return{status:n.status,body:await n.text()}},xC=bC,kC=IC});import{spawnSync as uE}from"node:child_process";import{existsSync as $C,readFileSync as FC}from"node:fs";import{homedir as mE}from"node:os";import{join as fE}from"node:path";function BC(t){let e=String(t??"").toLowerCase();return e.includes("session")||e.includes("five")||e.includes("5h")?"five_hour":e.includes("week")||e.includes("seven")||e.includes("7d")?"weekly":e.includes("month")||e.includes("30d")?"monthly":"unknown"}function pE(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("CLAUDE")))}function WC(t){try{let e=uE("claude",["--version"],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],env:pE(t)}),r=typeof e.stdout=="string"?e.stdout.trim().split(/\s+/)[0]:"";if(r)return`claude-code/${r}`}catch{}return"claude-code/unknown"}function it(t,e,r,n="claude_oauth_api",s){return Le("claude",t,e,r,n,void 0,s)}function HC(t){let e=t.CLAUDE_CODE_OAUTH_TOKEN;if(e)return{oauth:{accessToken:e,source:"CLAUDE_CODE_OAUTH_TOKEN"}};let r=fE(mE(),".claude",".credentials.json");if(!$C(r))return t.ANTHROPIC_API_KEY?{error:"not_claude_ai_subscriber"}:{error:"no_credentials_found"};try{let n=JSON.parse(FC(r,"utf8")),s=typeof n=="object"&&n!==null&&"claudeAiOauth"in n?n.claudeAiOauth:void 0;return!s||typeof s!="object"||!("accessToken"in s)||!s.accessToken?{error:"not_claude_ai_subscriber"}:{oauth:s}}catch(n){return{error:`credentials_unreadable: ${n instanceof Error?n.name:"Error"}`}}}function XC(t){let e=t.get("retry-after");if(!e)return;let r=Number.parseInt(e,10);return Number.isFinite(r)?r:void 0}function qC(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 r=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"].indexOf(e[1].slice(0,3).toLowerCase());if(r<0)return;let n=Number(e[3]),s=Number(e[4]??0);(e[5]??"").toLowerCase()==="pm"&&n!==12&&(n+=12),(e[5]??"").toLowerCase()==="am"&&n===12&&(n=0);let i=new Date(Date.UTC(new Date().getUTCFullYear(),r,Number(e[2]),n,s));return Number.isFinite(i.getTime())?Math.floor(i.getTime()/1e3):void 0}function JC(t){let e=[];for(let r of t.split(/\r?\n/)){let n=GC.exec(r.trim());if(!n)continue;let s=n[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(Ke({bucket_id:l,group_name:o?"session":"weekly",window_type:c,used_fraction:Ct(Number(n[2]),"percent"),raw_value:Number(n[2]),raw_scale:"used_percent",resets_at:qC(n[3])}))}return e.sort((r,n)=>String(r.window_type).localeCompare(String(n.window_type))||String(r.bucket_id).localeCompare(String(n.bucket_id)))}function VC(t){let e={},r;for(let n of t.split(/\r?\n/)){let s=/^Last\s+(\S+)\s*[·-]\s*(\d+)\s+requests?\s*[·-]\s*(\d+)\s+sessions?\s*$/.exec(n.trim());if(s){r={requests:Number(s[2]),sessions:Number(s[3])},e[`window_${s[1].toLowerCase()}`]=r;continue}let i=/^\s+(\d+)%\s+of your usage\s+(.+?)\s*$/.exec(n);if(!i||!r)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&&(r[a]=Number(i[1]))}return e}function cE(t){if(!t||typeof t!="object")return;let e=t,r=e.limit&&typeof e.limit=="object"?e.limit:{},n=e.used&&typeof e.used=="object"?e.used:{},s=r.exponent??n.exponent??2,i=l=>l==null||!Number.isFinite(Number(l))?void 0:(Number(l)/10**Number(s)).toFixed(2),o=Ct(e.percent,"percent"),a={limit_usd:i(r.amount_minor),used_usd:i(n.amount_minor),remaining_fraction:o==null?void 0:Math.max(0,1-o),resets_at_iso:e.resets_at};return Object.values(a).every(l=>l==null)?void 0:a}async function dE(t,e,r){try{let n=uE("claude",["-p","/usage"],{encoding:"utf8",timeout:Math.max(r,60)*1e3,input:"",env:pE(e),maxBuffer:16777216}),s=typeof n.stdout=="string"?n.stdout:"",i=JC(s);if(!i.length)return;let o=VC(s);return Ie("claude",Xe.ok,{source:"claude_cli_print",account_id:null,plan_type:t.subscriptionType??t.rateLimitTier??null,ordinary_usage_allowed:null,buckets:i,...Object.keys(o).length?{characteristics:o}:{}})}catch{return}}async function hE({timeoutSeconds:t,env:e}){let r=HC(e);if(r.error==="not_claude_ai_subscriber")return it(Xe.notApplicable,r.error,"no OAuth subscription credentials; API-key accounts have no subscription quota endpoint");if(r.error==="no_credentials_found")return it(Xe.unavailable,"credentials_missing",`credentials file not found: ${fE(mE(),".claude",".credentials.json")}`);if(r.error)return it(Xe.expired,"oauth_token_expired_or_invalid",r.error);let n=r.oauth,s=Array.isArray(n.scopes)?n.scopes:[];if(s.length&&!s.includes(lE))return it(Xe.notApplicable,"not_claude_ai_subscriber",`credential lacks the ${lE} scope required by the usage endpoint`);if(typeof n.expiresAt=="number"&&Date.now()+jC>=n.expiresAt)return it(Xe.expired,"oauth_token_expired_or_invalid","local credential expiry has passed; run `claude` to renew the token");let i=new AbortController,o=setTimeout(()=>i.abort(),t*1e3),a;try{a=await fetch(`${PC}/api/oauth/usage`,{headers:{Authorization:`Bearer ${n.accessToken}`,"anthropic-beta":UC,"Content-Type":"application/json","User-Agent":WC(e)},signal:i.signal})}catch(d){let m=await dE(n,e,t);return m||it(Xe.unavailable,"request_failed",`${d instanceof Error?d.name:"request failed"} (CLI fallback also unavailable)`)}finally{clearTimeout(o)}if(a.status===401)return it(Xe.expired,"oauth_token_expired_or_invalid","HTTP 401 from usage endpoint");if(a.status===403)return it(Xe.notApplicable,"not_claude_ai_subscriber","HTTP 403 from usage endpoint (account is not usage-eligible)");if(a.status===429){let d=XC(a.headers),m=await dE(n,e,t);return m||it(Xe.throttled,"rate_limited",`usage endpoint rate limited${d==null?"":`; retry after ${d}s`}`,"claude_oauth_api",d)}if(a.status!==200)return it(Xe.unavailable,`http_${a.status}`,"usage endpoint returned an unexpected status");let l;try{l=await a.json()}catch{return it(Xe.unavailable,"malformed_response","SyntaxError: malformed JSON")}if(!l||typeof l!="object"||Array.isArray(l))return it(Xe.unavailable,"malformed_response","response was not an object");let c=l,u=Array.isArray(c.limits)?c.limits:[],f=u.length?u.flatMap(d=>{if(!d||typeof d!="object")return[];let m=d.kind,h=BC(m==="session"?"session":m),y=d.scope?.model?.display_name,g=m==="session"?"session":m==="weekly_all"?"week-all-models":`week-scoped-${y||m}`;return[Ke({bucket_id:g,group_name:m==="session"?"session":"weekly",window_type:h,used_fraction:Ct(d.percent,"percent"),resets_at_iso:d.resets_at,raw_value:d.percent,raw_scale:"used_percent"})]}):["five_hour","seven_day"].flatMap(d=>{let m=c[d];return!m||typeof m!="object"?[]:[Ke({bucket_id:d==="five_hour"?"session":"week-all-models",group_name:d==="five_hour"?"session":"weekly",window_type:d==="five_hour"?"five_hour":"weekly",used_fraction:Ct(m.utilization,"percent"),resets_at_iso:m.resets_at,raw_value:m.utilization,raw_scale:"used_percent"})]});return Ie("claude",Xe.ok,{source:"claude_oauth_api",account_id:null,plan_type:n.subscriptionType??n.rateLimitTier??null,ordinary_usage_allowed:null,buckets:f.sort((d,m)=>String(d.window_type).localeCompare(String(m.window_type))||String(d.bucket_id).localeCompare(String(m.bucket_id))),...cE(c.spend)?{spend_control:cE(c.spend)}:{}})}var PC,UC,lE,jC,Xe,GC,gE=k(()=>{"use strict";Qs();PC="https://api.anthropic.com",UC="oauth-2025-04-20",lE="user:profile",jC=3e5;Xe={ok:"ok",unavailable:"provider_unavailable",expired:"auth_expired",notApplicable:"not_applicable",throttled:"reader_throttled"};GC=/^Current\s+(.+?):\s*(\d+(?:\.\d+)?)\s*%\s*used(?:\s*[·-]\s*resets\s*(.+?))?$/});import{readFileSync as KC}from"node:fs";import{homedir as YC}from"node:os";import{join as zC}from"node:path";function ot(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function _E(t){let e=typeof t=="number"?t:Number(t);if(!Number.isFinite(e)||e<=0)return"unknown";let r=e/60;return r>=240&&r<=360?"five_hour":r>=9e3&&r<=11500?"weekly":r>=38e3&&r<=46e3?"monthly":"unknown"}function yE(t){return t==="five_hour"?"5h":t==="weekly"?"weekly":t==="monthly"?"monthly":"window"}function e0(t){if(t.CODEX_ACCESS_TOKEN)return{token:t.CODEX_ACCESS_TOKEN,accountId:t.CODEX_ACCOUNT_ID};let e=t.CODEX_AUTH_PATH||zC(YC(),".codex","auth.json");try{let r=JSON.parse(KC(e,"utf8")),n=ot(r)&&ot(r.tokens)?r.tokens:void 0,s=n?.access_token,i=n?.account_id;return{token:typeof s=="string"?s:void 0,accountId:typeof i=="string"?i:void 0}}catch{return{}}}function t0(t){if(ot(t))return{has_credits:t.has_credits,unlimited:t.unlimited,balance:t.balance}}function r0(t){let e=[],r=ot(t.rate_limit)?t.rate_limit:{},n=typeof r.allowed=="boolean"?r.allowed:void 0,s=typeof r.limit_reached=="boolean"?r.limit_reached:void 0;for(let o of["primary_window","secondary_window"]){let a=ot(r[o])?r[o]:void 0;if(!a)continue;let l=_E(a.limit_window_seconds);e.push(Ke({bucket_id:`codex-${yE(l)}`,group_name:"codex",window_type:l,used_fraction:Ct(a.used_percent,"percent"),resets_at:a.reset_at,raw_value:a.used_percent,raw_scale:"used_percent",...n===void 0?{}:{allowed:n},...s===void 0?{}:{limit_reached:s}}))}let i=Array.isArray(t.additional_rate_limits)?t.additional_rate_limits:[];for(let o of i){if(!ot(o))continue;let a=ot(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,u=c||l||"additional",f=typeof a.allowed=="boolean"?a.allowed:void 0,d=typeof a.limit_reached=="boolean"?a.limit_reached:void 0;for(let m of["primary_window","secondary_window"]){let h=ot(a[m])?a[m]:void 0;if(!h)continue;let y=_E(h.limit_window_seconds);e.push(Ke({bucket_id:`${u}-${yE(y)}`,group_name:l||u,window_type:y,used_fraction:Ct(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},...f===void 0?{}:{allowed:f},...d===void 0?{}:{limit_reached:d}}))}}return e.sort((o,a)=>String(o.group_name??"").localeCompare(String(a.group_name??""))||String(o.bucket_id).localeCompare(String(a.bucket_id)))}function n0(t){let e=ot(t.rate_limit)?t.rate_limit:{},r=typeof e.allowed=="boolean"?e.allowed:void 0,n=ot(t.spend_control)?t.spend_control:void 0,s=ot(t.credits)?t.credits:void 0;return Ie("codex","ok",{source:"codex_http",account_id:t.account_id,plan_type:t.plan_type,...r===void 0?{}:{ordinary_usage_allowed:r},buckets:r0(t),...s?{credits:t0(s)}:{},...n?{spend_control:n}:{}})}async function EE(t){let{timeoutSeconds:e,env:r}=t,n=e0(r);if(!n.token)return Ie("codex","provider_unavailable",{source:"codex_http",reason:"credentials_missing",detail:"no access_token in ~/.codex/auth.json (or $CODEX_ACCESS_TOKEN)"});let s=new AbortController,i=setTimeout(()=>s.abort(),Math.ceil(e*1e3));try{let o={Authorization:`Bearer ${n.token}`,"User-Agent":ZC,"Content-Type":"application/json",Accept:"application/json"};n.accountId&&(o["ChatGPT-Account-Id"]=n.accountId);let a=(r.CODEX_BASE_URL||QC).replace(/\/$/,""),l=await fetch(`${a}/wham/usage`,{headers:o,signal:s.signal});if(l.status===401)return Ie("codex","auth_expired",{source:"codex_http",reason:"oauth_token_expired_or_invalid",detail:"HTTP 401 from the codex usage endpoint"});if(l.status===429){let u=l.headers.get("retry-after"),f=u===null?void 0:Number.parseInt(u,10);return Ie("codex","reader_throttled",{source:"codex_http",reason:"throttled",detail:"HTTP 429 from codex usage endpoint",...f!==void 0&&Number.isFinite(f)&&f>=0?{retry_after_seconds:f}:{}})}if(!l.ok)return Ie("codex","provider_unavailable",{source:"codex_http",reason:`http_${l.status}`,detail:"codex usage endpoint returned an unexpected status"});let c;try{c=await l.json()}catch(u){return Ie("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:aa(String(u),[n.token])})}return ot(c)?n0(c):Ie("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:"response was not an object"})}catch(o){let a=o instanceof Error?`${o.name}: ${o.message}`:String(o);return Ie("codex","provider_unavailable",{source:"codex_http",reason:"http_request_failed",detail:aa(a,[n.token])})}finally{clearTimeout(i)}}var QC,ZC,wE=k(()=>{"use strict";Qs();QC="https://chatgpt.com/backend-api",ZC="codex-cli"});import{homedir as vE}from"node:os";import{join as ei}from"node:path";import{readFileSync as SE,readdirSync as s0,statSync as TE}from"node:fs";function l0(t){if(t.KIMI_CREDENTIALS_PATH)return t.KIMI_CREDENTIALS_PATH;let e=t.KIMI_CODE_HOME?ei(t.KIMI_CODE_HOME,"credentials"):i0,r=[];try{for(let n of s0(e))(n==="kimi-code.json"||n.startsWith("kimi-code-env-")&&n.endsWith(".json"))&&r.push(ei(e,n))}catch{}return r.length>0?r.sort((n,s)=>{try{return TE(s).mtimeMs-TE(n).mtimeMs}catch{return 0}})[0]:ei(e,"kimi-code.json")}function c0(t){let e=l0(t),r;try{r=SE(e,"utf8")}catch{return{error:"credentials_missing"}}let n;try{n=JSON.parse(r)}catch{return{error:"credentials_malformed"}}return!n||typeof n!="object"||!n.access_token?{error:"credentials_malformed"}:{access_token:n.access_token}}function d0(t){if(t.KIMI_CODE_BASE_URL)return t.KIMI_CODE_BASE_URL;let e=t.KIMI_CODE_CONFIG_PATH||o0;try{let r=SE(e,"utf8"),n=!1;for(let s of r.split(`
2368
- `)){let i=s.trim();if(i.startsWith("[")){n=i==='[providers."managed:kimi-code"]';continue}if(n&&i.startsWith("base_url")){let o=i.match(/base_url\s*=\s*(?:"([^"]+)"|'([^']+)')/);if(o)return o[1]||o[2]}}}catch{}return a0}async function bE({timeoutSeconds:t,env:e}){let r=c0(e);if(r.error==="credentials_missing")return Le("kimi","provider_unavailable",r.error);if(r.error)return Le("kimi","provider_unavailable",r.error);let n=d0(e),s=new AbortController,i=setTimeout(()=>s.abort(),t*1e3),o;try{o=await fetch(`${n}/usages`,{headers:{Authorization:`Bearer ${r.access_token}`,Accept:"application/json"},signal:s.signal})}catch(f){return Le("kimi","provider_unavailable","connection_error",f instanceof Error?f.name:String(f))}finally{clearTimeout(i)}if(o.status===401)return Le("kimi","auth_expired","HTTP 401 from Kimi usage endpoint");if(o.status===403)return Le("kimi","not_applicable","HTTP 403 from Kimi usage endpoint");if(o.status===429){let f=nE(o.headers);return Le("kimi","reader_throttled","HTTP 429 from Kimi usage endpoint",void 0,"kimi_http",[],f)}if(o.status!==200)return Le("kimi","provider_unavailable",`HTTP ${o.status} from Kimi usage endpoint`);let a;try{a=await o.json()}catch{return Le("kimi","provider_unavailable","malformed_response","SyntaxError: malformed JSON")}if(!a||typeof a!="object")return Le("kimi","provider_unavailable","malformed_response","response was not an object");let l=[],c=new Set;function u(f){let d=String(f.bucket_id),m=d,h=2;for(;c.has(d);)d=`${m}-${h}`,h++;c.add(d),f.bucket_id=d,l.push(Ke(f))}if(Array.isArray(a.limits))for(let f of a.limits){if(!f||typeof f!="object")continue;let d=f.window,m=f.detail;if(!d||typeof d!="object"||!m||typeof m!="object")continue;let h=0;if(d.timeUnit==="TIME_UNIT_MINUTE")h=Number(d.duration);else if(d.timeUnit==="TIME_UNIT_HOUR")h=Number(d.duration)*60;else if(d.timeUnit==="TIME_UNIT_DAY")h=Number(d.duration)*1440;else if(d.timeUnit==="TIME_UNIT_WEEK")h=Number(d.duration)*10080;else if(d.timeUnit==="TIME_UNIT_MONTH")h=Number(d.duration)*43200;else continue;let y=tE(h),g="window";y==="five_hour"&&(g="5h"),y==="weekly"&&(g="weekly"),y==="monthly"&&(g="monthly"),m.used===void 0&&(m.used=0),m.limit===void 0&&(m.limit=0);let p=Number(m.used),_=Number(m.limit);if(!Number.isFinite(p)||!Number.isFinite(_)||_<=0||p<0)continue;let E=Math.max(0,_-p);if(m.remaining!==void 0){let w=Number(m.remaining);Number.isFinite(w)&&(E=w)}u({bucket_id:`kimi-${g}`,window_type:y,used_fraction:Fe(p/_),remaining_fraction:Fe(E/_),resets_at_iso:m.resetTime,raw_value:(Number.isInteger(p),p),raw_scale:"count"})}if(a.usage&&typeof a.usage=="object"){let f=a.usage.used,d=a.usage.limit;if(f!==void 0&&d!==void 0){let m=Number(f),h=Number(d);if(Number.isFinite(m)&&Number.isFinite(h)&&h>0&&m>=0){let y=Math.max(0,h-m);if(a.usage.remaining!==void 0){let g=Number(a.usage.remaining);Number.isFinite(g)&&(y=g)}u({bucket_id:"kimi-weekly",window_type:"weekly",used_fraction:Fe(m/h),remaining_fraction:Fe(y/h),resets_at_iso:a.usage.resetTime,raw_value:(Number.isInteger(m),m),raw_scale:"count"})}}}if(a.usages&&typeof a.usages=="object"){let f=[{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:d,id:m,type:h}of f){if(c.has(m))continue;let y=a.usages[d];if(!y||typeof y!="object"||typeof y.used_ratio=="boolean")continue;let g=Number(y.used_ratio);!Number.isFinite(g)||g<0||(c.add(m),l.push(Ke({bucket_id:m,window_type:h,used_fraction:Fe(g),resets_at_iso:typeof y.reset_time=="string"&&y.reset_time?y.reset_time:null,raw_value:g,raw_scale:"ratio"})))}}return Ie("kimi","ok",{source:"kimi_http",buckets:l})}var i0,o0,a0,IE=k(()=>{"use strict";Qs();i0=ei(vE(),".kimi-code","credentials"),o0=ei(vE(),".kimi-code","config.toml"),a0="https://api.kimi.com/coding/v1"});async function ca(t={}){let e=t.targets??t.providers??["all"];if(!Array.isArray(e)||e.length===0||e.some(o=>typeof o!="string"))return{status:"error",error:"providers must be a non-empty list of provider names",readings:[]};for(let o of e)if(!la.includes(o))return{status:"error",error:`unknown provider: ${o} (valid targets: ${la.join(", ")})`,readings:[]};let r=t.timeoutSeconds??u0;if(!Number.isFinite(r)||r<=0)return{status:"error",error:"timeoutSeconds must be a positive finite number",readings:[]};let n=t.env??process.env,s=new Set(e.includes("all")?["codex","agy","claude","kimi"]:e);t.progress?.(`querying ${e.join(" ")} live (timeout ${r}s per provider) ...`);let i=[];s.has("codex")&&i.push(EE({timeoutSeconds:r,env:n})),s.has("agy")&&i.push(oE({timeoutSeconds:r,env:n})),s.has("claude")&&i.push(hE({timeoutSeconds:r,env:n})),s.has("kimi")&&i.push(bE({timeoutSeconds:r,env:n}));try{return{status:"ok",readings:(await Promise.all(i)).filter(Boolean)}}catch(o){return{status:"error",error:String(o),readings:[]}}}var la,u0,nu=k(()=>{"use strict";aE();gE();wE();IE();la=["all","codex","agy","claude","kimi"],u0=15});import{execFile as m0}from"node:child_process";import{mkdtempSync as f0,realpathSync as su,rmSync as p0,statSync as LE}from"node:fs";import{tmpdir as CE}from"node:os";import{isAbsolute as iu,join as xE,relative as h0}from"node:path";import{promisify as g0}from"node:util";function OE(t){if(typeof t!="string"||!t||!iu(t))throw new Error("lmbee: snapshot_db must be an absolute path to a temporary database copy");let e;try{e=su(t);let n=LE(e);if(!n.isFile()||n.nlink!==1)throw new Error("not a standalone file")}catch{throw new Error("lmbee: snapshot_db must be an existing temporary database copy")}let r=h0(su(CE()),e);if(!r||r===".."||r.startsWith("../")||iu(r))throw new Error("lmbee: snapshot_db must be a temporary database copy inside the system temp directory");return e}function kE(t){if(t!=null){if(typeof t!="string"||!t.trim())throw new Error("lmbee: team must be a nonempty string");return t}}function E0(t){if(t==null)return{scope:"recent",limit:200};if(typeof t!="object"||Array.isArray(t))throw new Error("lmbee: list options must be a map");let e=t,r=e.scope??"recent";if(r!=="recent"&&r!=="unfinished"&&r!=="all")throw new Error("lmbee: scope must be recent, unfinished, or all");let n=e.limit??200;if(typeof n!="number"||!Number.isSafeInteger(n)||n<1||n>200)throw new Error("lmbee: limit must be an integer from 1 to 200");let s=e.after_id;if(s!==void 0&&(typeof s!="number"||!Number.isSafeInteger(s)||s<=0))throw new Error("lmbee: after_id must be a positive integer");if(r==="recent"&&(e.limit!==void 0||s!==void 0))throw new Error("lmbee: limit and after_id require unfinished or all scope");return{scope:r,limit:n,afterId:s}}function ME(t,e){let r=t.prepare(`SELECT name FROM pragma_table_info('${e}')`).all();return new Set(r.map(n=>n.name))}function ou(t,e,r){let n=ME(t,e);if(n.size===0)throw new Error(`lmbee: snapshot schema incompatible: missing table '${e}' (expected the lmbee queue schema; its absence is not an empty result)`);let s=r.filter(i=>!n.has(i));if(s.length>0)throw new Error(`lmbee: snapshot schema incompatible: table '${e}' is missing column(s): ${s.join(", ")}`)}function b0(t){let e=OE(t),r=new en(e,{readonly:!0,fileMustExist:!0});try{ou(r,"queue",w0),ou(r,"answers",T0)}catch(n){throw r.close(),n}return r}function RE(t){return{...t,hasAnswer:t.hasAnswer===1}}function I0(t,e,r){let n=[],s=[];e!==void 0&&(n.push("q.to_id = ?"),s.push(e)),r.scope==="unfinished"&&n.push(S0),r.afterId!==void 0&&(n.push("q.id < ?"),s.push(r.afterId));let i=n.length>0?`WHERE ${n.join(" AND ")}`:"";if(r.scope==="recent")return{queue:t.prepare(`SELECT q.*, ${AE} AS hasAnswer FROM queue q ${i} ORDER BY q.id DESC LIMIT 30`).all(...s).map(RE)};let o=t.prepare(`SELECT q.*, ${AE} AS hasAnswer FROM queue q ${i} ORDER BY q.id DESC LIMIT ?`).all(...s,r.limit+1),a=o.length>r.limit;return a&&(o.length=r.limit),{queue:o.map(RE),meta:{next_cursor:a?o[o.length-1].id:null}}}function x0(t,e){let r=t.prepare("SELECT * FROM queue WHERE id = ?").get(e);if(r==null)return{error:{code:"queue_not_found",message:`no queue entry ${e}`}};let n=t.prepare("SELECT 1 AS x FROM answers WHERE prompt_queue_id = ? AND superseded_at IS NULL").get(e);return{queue:r,hasAnswer:n!=null}}function NE(t,e){let r=t-Date.parse(e);return Number.isFinite(r)?r:null}function k0(t,e){let r=Date.now(),n=(d,m)=>e?t.prepare(`SELECT to_id, ${m} AS ts FROM queue WHERE status = ? AND to_id = ?`).all(d,e):t.prepare(`SELECT to_id, ${m} AS ts FROM queue WHERE status = ?`).all(d),s=d=>{let m=new Map;for(let h of d){let y=m.get(h.to_id);y?y.push(h.ts):m.set(h.to_id,[h.ts])}return m},i=d=>{let m=d.reduce((h,y)=>h===null||y!==null&&y<h?y:h,null);return m===null?0:NE(r,m)},o=s(n("pending","created_ts")),a=s(n("escalating","escalation_claimed_ts")),l=new Map;if(ME(t,"team_progress").size>0){ou(t,"team_progress",v0);let d=e?t.prepare("SELECT * FROM team_progress WHERE team = ?").all(e):t.prepare("SELECT * FROM team_progress").all();for(let m of d)l.set(m.team,m)}let c=d=>({escalationAttemptCount:d?.escalation_attempt_count??0,lastEscalationAttemptTs:d?.last_escalation_attempt_ts??null,quotaExhaustedLastSeenAgeMs:d?.quota_exhausted_last_seen_ts?NE(r,d.quota_exhausted_last_seen_ts):null,quotaExhaustedMessage:d?.quota_exhausted_message??null}),u=new Set([...o.keys(),...a.keys()]),f=[...u].map(d=>{let m=o.get(d)??[],h=a.get(d)??[];return{toId:d,pendingCount:m.length,oldestPendingAgeMs:m.length>0?i(m):null,escalatingCount:h.length,oldestEscalatingAgeMs:h.length>0?i(h):null,...c(l.get(d))}});for(let d of l.values())u.has(d.team)||d.escalation_attempt_count<=0||f.push({toId:d.team,pendingCount:0,oldestPendingAgeMs:null,escalatingCount:0,oldestEscalatingAgeMs:null,...c(d)});return f.sort((d,m)=>(m.oldestPendingAgeMs??-1)-(d.oldestPendingAgeMs??-1)),{stats:f}}function DE(t,e=()=>{}){let r=(s,i)=>{let o=b0(s);try{return i(o)}finally{o.close()}},n=async s=>{if(typeof s!="string"||!iu(s))throw new Error("lmbee: source_db must be an absolute path");let i;try{if(i=su(s),!LE(i).isFile())throw new Error("not a file")}catch{throw new Error("lmbee: source_db must be an existing database file")}let o=f0(xE(CE(),"lmctl-lmbee-snapshot-")),a=xE(o,"state.db");try{return await _0("sqlite3",["-readonly",i,`.backup "${a.replaceAll('"','""')}"`],{env:t,timeout:12e4,maxBuffer:1048576}),OE(a),e(o),a}catch(l){p0(o,{recursive:!0,force:!0});let c=l;throw c.code==="ENOENT"?new Error("sqlite3 executable not found on PATH"):new Error(`lmbee snapshot failed: ${c.stderr?.trim()||c.message}`)}};return{name:"lmbee",description:"Read-only queue queries against temporary lmbee database copies",docs:y0,register(s){s.registerFunction("lmbee_queue_list",(i,o,a)=>r(i,l=>I0(l,kE(o),E0(a))),{min:1,max:3}),s.registerFunction("lmbee_queue_get",(i,o)=>{if(typeof o!="number"||!Number.isSafeInteger(o)||o<=0)throw new Error("lmbee: id must be a positive integer");return r(i,a=>x0(a,o))},2),s.registerFunction("lmbee_queue_stats",(i,o)=>r(i,a=>k0(a,kE(o))),{min:1,max:2}),s.registerFunction("lmbee_snapshot",n,1)}}}var _0,y0,w0,T0,v0,S0,AE,$E=k(()=>{"use strict";Ei();_0=g0(m0),y0=[{name:"lmbee_queue_list",category:"Queue Management",signature:"lmbee_queue_list(snapshot_db, team = null, options = null)",description:"Lists queue rows from a temporary lmbee database copy, read directly (no lmbee executable needed).",parameters:[{name:"snapshot_db",type:"string",description:"Existing database copy in the system temp directory"},{name:"team",type:"string",description:"Optional recipient filter"},{name:"options",type:"map",description:`Optional { scope, limit, after_id }: scope "recent" (default) is the newest 30 rows; scope "unfinished" is every genuinely open row (lmauto's listUnfinishedQueue predicate); scope "all" is every row. limit (1-200) and after_id page unfinished/all newest-first.`}],returns:{type:"map",description:"{ queue: [...] } for recent, plus { meta: { next_cursor } } for paged scopes; each row carries hasAnswer (current, non-superseded answer)"},example:'page = lmbee_queue_list("/tmp/lmbee-copy/state.db", null, {"scope":"unfinished","limit":200});'},{name:"lmbee_queue_get",category:"Queue Management",signature:"lmbee_queue_get(snapshot_db, id)",description:"Gets one queue row from a temporary lmbee database copy.",parameters:[{name:"snapshot_db",type:"string",description:"Existing database copy in the system temp directory"},{name:"id",type:"number",description:"Positive integer queue ID"}],returns:{type:"map",description:"{ queue: row, hasAnswer: boolean } or a queue_not_found error object"},example:'item = lmbee_queue_get("/tmp/lmbee-copy/state.db", 7);'},{name:"lmbee_queue_stats",category:"Queue Management",signature:"lmbee_queue_stats(snapshot_db, team = null)",description:"Reads per-recipient queue counts from a temporary lmbee database copy, without a row window.",parameters:[{name:"snapshot_db",type:"string",description:"Existing database copy in the system temp directory"},{name:"team",type:"string",description:"Optional recipient filter"}],returns:{type:"map",description:"{ stats: [...] } most-stale-first; team_progress-sourced fields (escalationAttemptCount, lastEscalationAttemptTs, quota*) default to 0/null when the snapshot predates that table"},example:'counts = lmbee_queue_stats("/tmp/lmbee-copy/state.db", "worker");'},{name:"lmbee_snapshot",category:"Queue Management",signature:"lmbee_snapshot(source_db)",description:"Creates a WAL-aware temporary database backup, removed when the script ends.",parameters:[{name:"source_db",type:"string",description:"Absolute path to an existing lmbee database"}],returns:{type:"string",description:"Temporary snapshot path for lmbee queue functions"},example:'snapshot = lmbee_snapshot(env("HOME") + "/.lmbee/state.db");'}];w0=["id","from_id","to_id","status","created_ts","expects_response","in_reply_to","retracted_ts","escalation_claimed_ts"],T0=["prompt_queue_id","superseded_at"],v0=["team","escalation_attempt_count","last_escalation_attempt_ts","quota_exhausted_last_seen_ts","quota_exhausted_message"],S0=`q.status != 'merged'
2367
+ `,Xy='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',zd={existsSync:GL,statSync:JL,accessSync:qL},qy=async t=>{let{seed:e}=await Promise.resolve().then(()=>(jt(),dd)),r=await e(t);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}},Gr=zd,Gy=fs;aC=/^\[([^\]]+)\]\s+(.*)$/s,lC=/^([^:\s][^:]*):\s+(.*)$/s});function Fe(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 Ct(t,e){if(t==null||typeof t=="boolean")return null;let r=Number(t);return Fe(e==="percent"?r/100:r)}function Zy(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 eE(t){if(typeof t!="string"||t.trim()==="")return null;let e=Date.parse(t);return Number.isFinite(e)?Math.floor(e/1e3):null}function tE(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 rE(t){let e=String(t??"").trim().toLowerCase().replace(/-/g,"_").split("_").filter(Boolean);for(let r of[e[0],e.at(-1)]){if(r?.startsWith("5h")||r?.startsWith("five")||r==="session")return"five_hour";if(r?.startsWith("7d")||r?.startsWith("seven")||r?.startsWith("week"))return"weekly";if(r?.startsWith("30d")||r?.startsWith("month"))return"monthly"}return"unknown"}function aa(t,e=[]){let r=t==null?"":String(t);for(let n of e)typeof n=="string"&&n.length>=4&&(r=r.replaceAll(n,"***REDACTED***"));for(let n of _C)r=r.replace(n,"***REDACTED***");return r}function Ke(t){let e=Fe(t.used_fraction),r=Fe(t.remaining_fraction),n=t.resets_at==null?eE(t.resets_at_iso):Number(t.resets_at),s=t.resets_at_iso==null?Zy(n):Zy(eE(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??(r===null?null:Fe(1-r)),remaining_fraction:r??(e===null?null:Fe(1-e)),resets_at:n==null||!Number.isFinite(n)?null:Math.trunc(n),resets_at_iso:s,is_exhausted:t.is_exhausted??(r!==null?r<=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 Ie(t,e,r={}){let n={$schema:gC,provider:t,status:e,source:r.source??null,read_at:r.read_at??Math.floor(Date.now()/1e3),account_id:r.account_id??null,plan_type:r.plan_type??null,ordinary_usage_allowed:r.ordinary_usage_allowed??null,buckets:r.buckets??[]};for(let s of["credits","spend_control","characteristics","reason","detail","retry_after_seconds"])r[s]!=null&&(n[s]=r[s]);return n}function Le(t,e,r,n,s,i=[],o){return Ie(t,e,{source:s??null,reason:r,...n==null?{}:{detail:aa(n,i)},...o==null?{}:{retry_after_seconds:o}})}function nE(t){let e=t.get("retry-after");if(e===null)return null;let r=Number.parseFloat(e);return Number.isFinite(r)&&r>=0?Math.trunc(r):null}var gC,_C,Qs=k(()=>{"use strict";gC="https://lmctl.com/schemas/lmratelimit-v1.json";_C=[/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 yC}from"node:child_process";import{readdirSync as EC,readFileSync as wC}from"node:fs";import{join as TC}from"node:path";function AC(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("ANTIGRAVITY")))}function RC(t){let e=t.trim().toLowerCase(),r={"gemini models":"gemini","claude and gpt models":"3p",gemini:"gemini","3p models":"3p","3p":"3p"};return r[e]?r[e]:e.replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function NC(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 LC(t){let e={weekly:"weekly",five_hour:"5h",monthly:"monthly"},r=[];for(let n of t.split(/\r?\n/)){let s=n.trim().split(" ").map(l=>l.trim());if(s.length<3||!s[0]||!s[1])continue;let i=NC(s[1]);if(!i)continue;let o=Number(s[2].replace(/%$/,"").trim());if(!Number.isFinite(o))continue;let a=Fe(o/100);r.push(Ke({bucket_id:`${RC(s[0])}-${e[i]}`,group_name:s[0],window_type:i,used_fraction:a===null?null:Fe(1-a),remaining_fraction:a,resets_at_iso:s[3]||null,raw_value:o,raw_scale:"remaining_percent"}))}return r.sort((n,s)=>String(n.group_name??"").localeCompare(String(s.group_name??""))||String(n.bucket_id??"").localeCompare(String(s.bucket_id??"")))}function Zs(t,e,r){return Le("agy","provider_unavailable",t,e,"agy_cli_print")}function CC(t,e){try{let r=xC(Math.max(t,60)*1e3,AC(e));if(r.error?.code==="ENOENT")return Zs("agy_not_found","the agy CLI is not on PATH",t);if(r.error?.code==="ETIMEDOUT")return Zs("cli_timeout","agy -p /usage did not finish in time",t);if(r.error)return Zs("cli_failed",r.error.message,t);let n=LC(r.stdout??"");return n.length===0?Zs("cli_unparseable",`exit ${r.status??1}; no buckets parsed from CLI output`,t):Ie("agy","ok",{source:"agy_cli_print",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:n})}catch(r){return Zs("cli_failed",r instanceof Error?r.message:String(r),t)}}function OC(t){let e=[],r=new Set,n=(s,i,o)=>{!s||!i||r.has(`${s}\0${i}`)||(r.add(`${s}\0${i}`),e.push([s,i,o]))};n(t[sE],t[iE],-1);try{for(let s of EC("/proc"))if(/^\d+$/.test(s))try{let i={};for(let o of wC(TC("/proc",s,"environ")).toString("utf8").split("\0")){let a=o.indexOf("=");a>0&&(i[o.slice(0,a)]=o.slice(a+1))}n(i[sE],i[iE],Number(s))}catch{}}catch{}return e}function MC(t){if(typeof t!="object"||t===null)return null;let e=t.response;if(typeof e!="object"||e===null)return null;let r=e.groups;if(!Array.isArray(r))return null;let n=[];for(let s of r){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=Ct(l.remainingFraction,"fraction");n.push(Ke({bucket_id:l.bucketId??l.displayName??"unknown",group_name:o,window_type:rE(l.window),used_fraction:c===null?null:Fe(1-c),remaining_fraction:c,resets_at_iso:l.resetTime??null,raw_value:l.remainingFraction??null,raw_scale:"remaining_fraction"}))}}return n.length===0?null:(n.sort((s,i)=>String(s.group_name??"").localeCompare(String(i.group_name??""))||String(s.bucket_id??"").localeCompare(String(i.bucket_id??""))),Ie("agy","ok",{source:"agy_connect_rpc",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:n}))}async function DC(t,e){let r=OC(e);if(r.length===0)return Le("agy","provider_unavailable","no_active_session","no live agy process exposed ANTIGRAVITY_LS_ADDRESS/ANTIGRAVITY_CSRF_TOKEN","agy_connect_rpc");let n=[];for(let[s,i,o]of r)try{let a=await kC(`http://${s}${vC}`,{"Content-Type":"application/json","Connect-Protocol-Version":"1","x-codeium-csrf-token":i},t*1e3);if(a.status===200){let l;try{l=JSON.parse(a.body)}catch{n.push(`pid=${o}: unparseable response`);continue}let c=MC(l);if(c)return c;n.push(`pid=${o}: response had no quota groups`)}else a.status===401||a.status===403?n.push(`pid=${o}: HTTP ${a.status} unauthorized`):n.push(`pid=${o}: HTTP ${a.status}`)}catch(a){n.push(`pid=${o}: ${a instanceof Error?a.message:String(a)}`)}return Le("agy","provider_unavailable","no_active_session",`all candidate language servers failed: ${n.slice(0,5).join("; ")}`,"agy_connect_rpc",r.map(([,s])=>s))}async function oE(t){let e=CC(t.timeoutSeconds,t.env);if(e.status==="ok")return e;let r=await DC(t.timeoutSeconds,t.env);return r.status==="ok"?r:Le("agy","provider_unavailable","cli_and_language_server_unavailable",`cli: ${String(e.reason??e.status)} (${String(e.detail??"no detail")}); connect: ${String(r.reason??r.status)} (${String(r.detail??"no detail")})`,"agy_cli_print")}var sE,iE,vC,SC,bC,IC,xC,kC,aE=k(()=>{"use strict";Qs();sE="ANTIGRAVITY_LS_ADDRESS",iE="ANTIGRAVITY_CSRF_TOKEN",vC="/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary",SC=["-p","/usage"],bC=(t,e)=>{let r=yC("agy",SC,{encoding:"utf8",timeout:t,maxBuffer:16777216,env:e,stdio:["ignore","pipe","ignore"]});return{status:r.status,stdout:typeof r.stdout=="string"?r.stdout:"",error:r.error}},IC=async(t,e,r)=>{let n=await fetch(t,{method:"POST",headers:e,body:"{}",signal:AbortSignal.timeout(r)});return{status:n.status,body:await n.text()}},xC=bC,kC=IC});import{spawnSync as uE}from"node:child_process";import{existsSync as $C,readFileSync as FC}from"node:fs";import{homedir as mE}from"node:os";import{join as fE}from"node:path";function BC(t){let e=String(t??"").toLowerCase();return e.includes("session")||e.includes("five")||e.includes("5h")?"five_hour":e.includes("week")||e.includes("seven")||e.includes("7d")?"weekly":e.includes("month")||e.includes("30d")?"monthly":"unknown"}function pE(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("CLAUDE")))}function WC(t){try{let e=uE("claude",["--version"],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],env:pE(t)}),r=typeof e.stdout=="string"?e.stdout.trim().split(/\s+/)[0]:"";if(r)return`claude-code/${r}`}catch{}return"claude-code/unknown"}function it(t,e,r,n="claude_oauth_api",s){return Le("claude",t,e,r,n,void 0,s)}function HC(t){let e=t.CLAUDE_CODE_OAUTH_TOKEN;if(e)return{oauth:{accessToken:e,source:"CLAUDE_CODE_OAUTH_TOKEN"}};let r=fE(mE(),".claude",".credentials.json");if(!$C(r))return t.ANTHROPIC_API_KEY?{error:"not_claude_ai_subscriber"}:{error:"no_credentials_found"};try{let n=JSON.parse(FC(r,"utf8")),s=typeof n=="object"&&n!==null&&"claudeAiOauth"in n?n.claudeAiOauth:void 0;return!s||typeof s!="object"||!("accessToken"in s)||!s.accessToken?{error:"not_claude_ai_subscriber"}:{oauth:s}}catch(n){return{error:`credentials_unreadable: ${n instanceof Error?n.name:"Error"}`}}}function XC(t){let e=t.get("retry-after");if(!e)return;let r=Number.parseInt(e,10);return Number.isFinite(r)?r:void 0}function qC(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 r=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"].indexOf(e[1].slice(0,3).toLowerCase());if(r<0)return;let n=Number(e[3]),s=Number(e[4]??0);(e[5]??"").toLowerCase()==="pm"&&n!==12&&(n+=12),(e[5]??"").toLowerCase()==="am"&&n===12&&(n=0);let i=new Date(Date.UTC(new Date().getUTCFullYear(),r,Number(e[2]),n,s));return Number.isFinite(i.getTime())?Math.floor(i.getTime()/1e3):void 0}function JC(t){let e=[];for(let r of t.split(/\r?\n/)){let n=GC.exec(r.trim());if(!n)continue;let s=n[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(Ke({bucket_id:l,group_name:o?"session":"weekly",window_type:c,used_fraction:Ct(Number(n[2]),"percent"),raw_value:Number(n[2]),raw_scale:"used_percent",resets_at:qC(n[3])}))}return e.sort((r,n)=>String(r.window_type).localeCompare(String(n.window_type))||String(r.bucket_id).localeCompare(String(n.bucket_id)))}function VC(t){let e={},r;for(let n of t.split(/\r?\n/)){let s=/^Last\s+(\S+)\s*[·-]\s*(\d+)\s+requests?\s*[·-]\s*(\d+)\s+sessions?\s*$/.exec(n.trim());if(s){r={requests:Number(s[2]),sessions:Number(s[3])},e[`window_${s[1].toLowerCase()}`]=r;continue}let i=/^\s+(\d+)%\s+of your usage\s+(.+?)\s*$/.exec(n);if(!i||!r)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&&(r[a]=Number(i[1]))}return e}function cE(t){if(!t||typeof t!="object")return;let e=t,r=e.limit&&typeof e.limit=="object"?e.limit:{},n=e.used&&typeof e.used=="object"?e.used:{},s=r.exponent??n.exponent??2,i=l=>l==null||!Number.isFinite(Number(l))?void 0:(Number(l)/10**Number(s)).toFixed(2),o=Ct(e.percent,"percent"),a={limit_usd:i(r.amount_minor),used_usd:i(n.amount_minor),remaining_fraction:o==null?void 0:Math.max(0,1-o),resets_at_iso:e.resets_at};return Object.values(a).every(l=>l==null)?void 0:a}async function dE(t,e,r){try{let n=uE("claude",["-p","/usage"],{encoding:"utf8",timeout:Math.max(r,60)*1e3,input:"",env:pE(e),maxBuffer:16777216}),s=typeof n.stdout=="string"?n.stdout:"",i=JC(s);if(!i.length)return;let o=VC(s);return Ie("claude",Xe.ok,{source:"claude_cli_print",account_id:null,plan_type:t.subscriptionType??t.rateLimitTier??null,ordinary_usage_allowed:null,buckets:i,...Object.keys(o).length?{characteristics:o}:{}})}catch{return}}async function hE({timeoutSeconds:t,env:e}){let r=HC(e);if(r.error==="not_claude_ai_subscriber")return it(Xe.notApplicable,r.error,"no OAuth subscription credentials; API-key accounts have no subscription quota endpoint");if(r.error==="no_credentials_found")return it(Xe.unavailable,"credentials_missing",`credentials file not found: ${fE(mE(),".claude",".credentials.json")}`);if(r.error)return it(Xe.expired,"oauth_token_expired_or_invalid",r.error);let n=r.oauth,s=Array.isArray(n.scopes)?n.scopes:[];if(s.length&&!s.includes(lE))return it(Xe.notApplicable,"not_claude_ai_subscriber",`credential lacks the ${lE} scope required by the usage endpoint`);if(typeof n.expiresAt=="number"&&Date.now()+jC>=n.expiresAt)return it(Xe.expired,"oauth_token_expired_or_invalid","local credential expiry has passed; run `claude` to renew the token");let i=new AbortController,o=setTimeout(()=>i.abort(),t*1e3),a;try{a=await fetch(`${PC}/api/oauth/usage`,{headers:{Authorization:`Bearer ${n.accessToken}`,"anthropic-beta":UC,"Content-Type":"application/json","User-Agent":WC(e)},signal:i.signal})}catch(d){let m=await dE(n,e,t);return m||it(Xe.unavailable,"request_failed",`${d instanceof Error?d.name:"request failed"} (CLI fallback also unavailable)`)}finally{clearTimeout(o)}if(a.status===401)return it(Xe.expired,"oauth_token_expired_or_invalid","HTTP 401 from usage endpoint");if(a.status===403)return it(Xe.notApplicable,"not_claude_ai_subscriber","HTTP 403 from usage endpoint (account is not usage-eligible)");if(a.status===429){let d=XC(a.headers),m=await dE(n,e,t);return m||it(Xe.throttled,"rate_limited",`usage endpoint rate limited${d==null?"":`; retry after ${d}s`}`,"claude_oauth_api",d)}if(a.status!==200)return it(Xe.unavailable,`http_${a.status}`,"usage endpoint returned an unexpected status");let l;try{l=await a.json()}catch{return it(Xe.unavailable,"malformed_response","SyntaxError: malformed JSON")}if(!l||typeof l!="object"||Array.isArray(l))return it(Xe.unavailable,"malformed_response","response was not an object");let c=l,u=Array.isArray(c.limits)?c.limits:[],f=u.length?u.flatMap(d=>{if(!d||typeof d!="object")return[];let m=d.kind,g=BC(m==="session"?"session":m),y=d.scope?.model?.display_name,h=m==="session"?"session":m==="weekly_all"?"week-all-models":`week-scoped-${y||m}`;return[Ke({bucket_id:h,group_name:m==="session"?"session":"weekly",window_type:g,used_fraction:Ct(d.percent,"percent"),resets_at_iso:d.resets_at,raw_value:d.percent,raw_scale:"used_percent"})]}):["five_hour","seven_day"].flatMap(d=>{let m=c[d];return!m||typeof m!="object"?[]:[Ke({bucket_id:d==="five_hour"?"session":"week-all-models",group_name:d==="five_hour"?"session":"weekly",window_type:d==="five_hour"?"five_hour":"weekly",used_fraction:Ct(m.utilization,"percent"),resets_at_iso:m.resets_at,raw_value:m.utilization,raw_scale:"used_percent"})]});return Ie("claude",Xe.ok,{source:"claude_oauth_api",account_id:null,plan_type:n.subscriptionType??n.rateLimitTier??null,ordinary_usage_allowed:null,buckets:f.sort((d,m)=>String(d.window_type).localeCompare(String(m.window_type))||String(d.bucket_id).localeCompare(String(m.bucket_id))),...cE(c.spend)?{spend_control:cE(c.spend)}:{}})}var PC,UC,lE,jC,Xe,GC,gE=k(()=>{"use strict";Qs();PC="https://api.anthropic.com",UC="oauth-2025-04-20",lE="user:profile",jC=3e5;Xe={ok:"ok",unavailable:"provider_unavailable",expired:"auth_expired",notApplicable:"not_applicable",throttled:"reader_throttled"};GC=/^Current\s+(.+?):\s*(\d+(?:\.\d+)?)\s*%\s*used(?:\s*[·-]\s*resets\s*(.+?))?$/});import{readFileSync as KC}from"node:fs";import{homedir as YC}from"node:os";import{join as zC}from"node:path";function ot(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function _E(t){let e=typeof t=="number"?t:Number(t);if(!Number.isFinite(e)||e<=0)return"unknown";let r=e/60;return r>=240&&r<=360?"five_hour":r>=9e3&&r<=11500?"weekly":r>=38e3&&r<=46e3?"monthly":"unknown"}function yE(t){return t==="five_hour"?"5h":t==="weekly"?"weekly":t==="monthly"?"monthly":"window"}function e0(t){if(t.CODEX_ACCESS_TOKEN)return{token:t.CODEX_ACCESS_TOKEN,accountId:t.CODEX_ACCOUNT_ID};let e=t.CODEX_AUTH_PATH||zC(YC(),".codex","auth.json");try{let r=JSON.parse(KC(e,"utf8")),n=ot(r)&&ot(r.tokens)?r.tokens:void 0,s=n?.access_token,i=n?.account_id;return{token:typeof s=="string"?s:void 0,accountId:typeof i=="string"?i:void 0}}catch{return{}}}function t0(t){if(ot(t))return{has_credits:t.has_credits,unlimited:t.unlimited,balance:t.balance}}function r0(t){let e=[],r=ot(t.rate_limit)?t.rate_limit:{},n=typeof r.allowed=="boolean"?r.allowed:void 0,s=typeof r.limit_reached=="boolean"?r.limit_reached:void 0;for(let o of["primary_window","secondary_window"]){let a=ot(r[o])?r[o]:void 0;if(!a)continue;let l=_E(a.limit_window_seconds);e.push(Ke({bucket_id:`codex-${yE(l)}`,group_name:"codex",window_type:l,used_fraction:Ct(a.used_percent,"percent"),resets_at:a.reset_at,raw_value:a.used_percent,raw_scale:"used_percent",...n===void 0?{}:{allowed:n},...s===void 0?{}:{limit_reached:s}}))}let i=Array.isArray(t.additional_rate_limits)?t.additional_rate_limits:[];for(let o of i){if(!ot(o))continue;let a=ot(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,u=c||l||"additional",f=typeof a.allowed=="boolean"?a.allowed:void 0,d=typeof a.limit_reached=="boolean"?a.limit_reached:void 0;for(let m of["primary_window","secondary_window"]){let g=ot(a[m])?a[m]:void 0;if(!g)continue;let y=_E(g.limit_window_seconds);e.push(Ke({bucket_id:`${u}-${yE(y)}`,group_name:l||u,window_type:y,used_fraction:Ct(g.used_percent,"percent"),resets_at:g.reset_at,raw_value:g.used_percent,raw_scale:"used_percent",...l===void 0?{}:{limit_name:l},...c===void 0?{}:{metered_feature:c},...f===void 0?{}:{allowed:f},...d===void 0?{}:{limit_reached:d}}))}}return e.sort((o,a)=>String(o.group_name??"").localeCompare(String(a.group_name??""))||String(o.bucket_id).localeCompare(String(a.bucket_id)))}function n0(t){let e=ot(t.rate_limit)?t.rate_limit:{},r=typeof e.allowed=="boolean"?e.allowed:void 0,n=ot(t.spend_control)?t.spend_control:void 0,s=ot(t.credits)?t.credits:void 0;return Ie("codex","ok",{source:"codex_http",account_id:t.account_id,plan_type:t.plan_type,...r===void 0?{}:{ordinary_usage_allowed:r},buckets:r0(t),...s?{credits:t0(s)}:{},...n?{spend_control:n}:{}})}async function EE(t){let{timeoutSeconds:e,env:r}=t,n=e0(r);if(!n.token)return Ie("codex","provider_unavailable",{source:"codex_http",reason:"credentials_missing",detail:"no access_token in ~/.codex/auth.json (or $CODEX_ACCESS_TOKEN)"});let s=new AbortController,i=setTimeout(()=>s.abort(),Math.ceil(e*1e3));try{let o={Authorization:`Bearer ${n.token}`,"User-Agent":ZC,"Content-Type":"application/json",Accept:"application/json"};n.accountId&&(o["ChatGPT-Account-Id"]=n.accountId);let a=(r.CODEX_BASE_URL||QC).replace(/\/$/,""),l=await fetch(`${a}/wham/usage`,{headers:o,signal:s.signal});if(l.status===401)return Ie("codex","auth_expired",{source:"codex_http",reason:"oauth_token_expired_or_invalid",detail:"HTTP 401 from the codex usage endpoint"});if(l.status===429){let u=l.headers.get("retry-after"),f=u===null?void 0:Number.parseInt(u,10);return Ie("codex","reader_throttled",{source:"codex_http",reason:"throttled",detail:"HTTP 429 from codex usage endpoint",...f!==void 0&&Number.isFinite(f)&&f>=0?{retry_after_seconds:f}:{}})}if(!l.ok)return Ie("codex","provider_unavailable",{source:"codex_http",reason:`http_${l.status}`,detail:"codex usage endpoint returned an unexpected status"});let c;try{c=await l.json()}catch(u){return Ie("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:aa(String(u),[n.token])})}return ot(c)?n0(c):Ie("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:"response was not an object"})}catch(o){let a=o instanceof Error?`${o.name}: ${o.message}`:String(o);return Ie("codex","provider_unavailable",{source:"codex_http",reason:"http_request_failed",detail:aa(a,[n.token])})}finally{clearTimeout(i)}}var QC,ZC,wE=k(()=>{"use strict";Qs();QC="https://chatgpt.com/backend-api",ZC="codex-cli"});import{homedir as vE}from"node:os";import{join as ei}from"node:path";import{readFileSync as SE,readdirSync as s0,statSync as TE}from"node:fs";function l0(t){if(t.KIMI_CREDENTIALS_PATH)return t.KIMI_CREDENTIALS_PATH;let e=t.KIMI_CODE_HOME?ei(t.KIMI_CODE_HOME,"credentials"):i0,r=[];try{for(let n of s0(e))(n==="kimi-code.json"||n.startsWith("kimi-code-env-")&&n.endsWith(".json"))&&r.push(ei(e,n))}catch{}return r.length>0?r.sort((n,s)=>{try{return TE(s).mtimeMs-TE(n).mtimeMs}catch{return 0}})[0]:ei(e,"kimi-code.json")}function c0(t){let e=l0(t),r;try{r=SE(e,"utf8")}catch{return{error:"credentials_missing"}}let n;try{n=JSON.parse(r)}catch{return{error:"credentials_malformed"}}return!n||typeof n!="object"||!n.access_token?{error:"credentials_malformed"}:{access_token:n.access_token}}function d0(t){if(t.KIMI_CODE_BASE_URL)return t.KIMI_CODE_BASE_URL;let e=t.KIMI_CODE_CONFIG_PATH||o0;try{let r=SE(e,"utf8"),n=!1;for(let s of r.split(`
2368
+ `)){let i=s.trim();if(i.startsWith("[")){n=i==='[providers."managed:kimi-code"]';continue}if(n&&i.startsWith("base_url")){let o=i.match(/base_url\s*=\s*(?:"([^"]+)"|'([^']+)')/);if(o)return o[1]||o[2]}}}catch{}return a0}async function bE({timeoutSeconds:t,env:e}){let r=c0(e);if(r.error==="credentials_missing")return Le("kimi","provider_unavailable",r.error);if(r.error)return Le("kimi","provider_unavailable",r.error);let n=d0(e),s=new AbortController,i=setTimeout(()=>s.abort(),t*1e3),o;try{o=await fetch(`${n}/usages`,{headers:{Authorization:`Bearer ${r.access_token}`,Accept:"application/json"},signal:s.signal})}catch(f){return Le("kimi","provider_unavailable","connection_error",f instanceof Error?f.name:String(f))}finally{clearTimeout(i)}if(o.status===401)return Le("kimi","auth_expired","HTTP 401 from Kimi usage endpoint");if(o.status===403)return Le("kimi","not_applicable","HTTP 403 from Kimi usage endpoint");if(o.status===429){let f=nE(o.headers);return Le("kimi","reader_throttled","HTTP 429 from Kimi usage endpoint",void 0,"kimi_http",[],f)}if(o.status!==200)return Le("kimi","provider_unavailable",`HTTP ${o.status} from Kimi usage endpoint`);let a;try{a=await o.json()}catch{return Le("kimi","provider_unavailable","malformed_response","SyntaxError: malformed JSON")}if(!a||typeof a!="object")return Le("kimi","provider_unavailable","malformed_response","response was not an object");let l=[],c=new Set;function u(f){let d=String(f.bucket_id),m=d,g=2;for(;c.has(d);)d=`${m}-${g}`,g++;c.add(d),f.bucket_id=d,l.push(Ke(f))}if(Array.isArray(a.limits))for(let f of a.limits){if(!f||typeof f!="object")continue;let d=f.window,m=f.detail;if(!d||typeof d!="object"||!m||typeof m!="object")continue;let g=0;if(d.timeUnit==="TIME_UNIT_MINUTE")g=Number(d.duration);else if(d.timeUnit==="TIME_UNIT_HOUR")g=Number(d.duration)*60;else if(d.timeUnit==="TIME_UNIT_DAY")g=Number(d.duration)*1440;else if(d.timeUnit==="TIME_UNIT_WEEK")g=Number(d.duration)*10080;else if(d.timeUnit==="TIME_UNIT_MONTH")g=Number(d.duration)*43200;else continue;let y=tE(g),h="window";y==="five_hour"&&(h="5h"),y==="weekly"&&(h="weekly"),y==="monthly"&&(h="monthly"),m.used===void 0&&(m.used=0),m.limit===void 0&&(m.limit=0);let p=Number(m.used),_=Number(m.limit);if(!Number.isFinite(p)||!Number.isFinite(_)||_<=0||p<0)continue;let E=Math.max(0,_-p);if(m.remaining!==void 0){let w=Number(m.remaining);Number.isFinite(w)&&(E=w)}u({bucket_id:`kimi-${h}`,window_type:y,used_fraction:Fe(p/_),remaining_fraction:Fe(E/_),resets_at_iso:m.resetTime,raw_value:(Number.isInteger(p),p),raw_scale:"count"})}if(a.usage&&typeof a.usage=="object"){let f=a.usage.used,d=a.usage.limit;if(f!==void 0&&d!==void 0){let m=Number(f),g=Number(d);if(Number.isFinite(m)&&Number.isFinite(g)&&g>0&&m>=0){let y=Math.max(0,g-m);if(a.usage.remaining!==void 0){let h=Number(a.usage.remaining);Number.isFinite(h)&&(y=h)}u({bucket_id:"kimi-weekly",window_type:"weekly",used_fraction:Fe(m/g),remaining_fraction:Fe(y/g),resets_at_iso:a.usage.resetTime,raw_value:(Number.isInteger(m),m),raw_scale:"count"})}}}if(a.usages&&typeof a.usages=="object"){let f=[{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:d,id:m,type:g}of f){if(c.has(m))continue;let y=a.usages[d];if(!y||typeof y!="object"||typeof y.used_ratio=="boolean")continue;let h=Number(y.used_ratio);!Number.isFinite(h)||h<0||(c.add(m),l.push(Ke({bucket_id:m,window_type:g,used_fraction:Fe(h),resets_at_iso:typeof y.reset_time=="string"&&y.reset_time?y.reset_time:null,raw_value:h,raw_scale:"ratio"})))}}return Ie("kimi","ok",{source:"kimi_http",buckets:l})}var i0,o0,a0,IE=k(()=>{"use strict";Qs();i0=ei(vE(),".kimi-code","credentials"),o0=ei(vE(),".kimi-code","config.toml"),a0="https://api.kimi.com/coding/v1"});async function ca(t={}){let e=t.targets??t.providers??["all"];if(!Array.isArray(e)||e.length===0||e.some(o=>typeof o!="string"))return{status:"error",error:"providers must be a non-empty list of provider names",readings:[]};for(let o of e)if(!la.includes(o))return{status:"error",error:`unknown provider: ${o} (valid targets: ${la.join(", ")})`,readings:[]};let r=t.timeoutSeconds??u0;if(!Number.isFinite(r)||r<=0)return{status:"error",error:"timeoutSeconds must be a positive finite number",readings:[]};let n=t.env??process.env,s=new Set(e.includes("all")?["codex","agy","claude","kimi"]:e);t.progress?.(`querying ${e.join(" ")} live (timeout ${r}s per provider) ...`);let i=[];s.has("codex")&&i.push(EE({timeoutSeconds:r,env:n})),s.has("agy")&&i.push(oE({timeoutSeconds:r,env:n})),s.has("claude")&&i.push(hE({timeoutSeconds:r,env:n})),s.has("kimi")&&i.push(bE({timeoutSeconds:r,env:n}));try{return{status:"ok",readings:(await Promise.all(i)).filter(Boolean)}}catch(o){return{status:"error",error:String(o),readings:[]}}}var la,u0,nu=k(()=>{"use strict";aE();gE();wE();IE();la=["all","codex","agy","claude","kimi"],u0=15});import{execFile as m0}from"node:child_process";import{mkdtempSync as f0,realpathSync as su,rmSync as p0,statSync as LE}from"node:fs";import{tmpdir as CE}from"node:os";import{isAbsolute as iu,join as xE,relative as h0}from"node:path";import{promisify as g0}from"node:util";function OE(t){if(typeof t!="string"||!t||!iu(t))throw new Error("lmbee: snapshot_db must be an absolute path to a temporary database copy");let e;try{e=su(t);let n=LE(e);if(!n.isFile()||n.nlink!==1)throw new Error("not a standalone file")}catch{throw new Error("lmbee: snapshot_db must be an existing temporary database copy")}let r=h0(su(CE()),e);if(!r||r===".."||r.startsWith("../")||iu(r))throw new Error("lmbee: snapshot_db must be a temporary database copy inside the system temp directory");return e}function kE(t){if(t!=null){if(typeof t!="string"||!t.trim())throw new Error("lmbee: team must be a nonempty string");return t}}function E0(t){if(t==null)return{scope:"recent",limit:200};if(typeof t!="object"||Array.isArray(t))throw new Error("lmbee: list options must be a map");let e=t,r=e.scope??"recent";if(r!=="recent"&&r!=="unfinished"&&r!=="all")throw new Error("lmbee: scope must be recent, unfinished, or all");let n=e.limit??200;if(typeof n!="number"||!Number.isSafeInteger(n)||n<1||n>200)throw new Error("lmbee: limit must be an integer from 1 to 200");let s=e.after_id;if(s!==void 0&&(typeof s!="number"||!Number.isSafeInteger(s)||s<=0))throw new Error("lmbee: after_id must be a positive integer");if(r==="recent"&&(e.limit!==void 0||s!==void 0))throw new Error("lmbee: limit and after_id require unfinished or all scope");return{scope:r,limit:n,afterId:s}}function ME(t,e){let r=t.prepare(`SELECT name FROM pragma_table_info('${e}')`).all();return new Set(r.map(n=>n.name))}function ou(t,e,r){let n=ME(t,e);if(n.size===0)throw new Error(`lmbee: snapshot schema incompatible: missing table '${e}' (expected the lmbee queue schema; its absence is not an empty result)`);let s=r.filter(i=>!n.has(i));if(s.length>0)throw new Error(`lmbee: snapshot schema incompatible: table '${e}' is missing column(s): ${s.join(", ")}`)}function b0(t){let e=OE(t),r=new en(e,{readonly:!0,fileMustExist:!0});try{ou(r,"queue",w0),ou(r,"answers",T0)}catch(n){throw r.close(),n}return r}function RE(t){return{...t,hasAnswer:t.hasAnswer===1}}function I0(t,e,r){let n=[],s=[];e!==void 0&&(n.push("q.to_id = ?"),s.push(e)),r.scope==="unfinished"&&n.push(S0),r.afterId!==void 0&&(n.push("q.id < ?"),s.push(r.afterId));let i=n.length>0?`WHERE ${n.join(" AND ")}`:"";if(r.scope==="recent")return{queue:t.prepare(`SELECT q.*, ${AE} AS hasAnswer FROM queue q ${i} ORDER BY q.id DESC LIMIT 30`).all(...s).map(RE)};let o=t.prepare(`SELECT q.*, ${AE} AS hasAnswer FROM queue q ${i} ORDER BY q.id DESC LIMIT ?`).all(...s,r.limit+1),a=o.length>r.limit;return a&&(o.length=r.limit),{queue:o.map(RE),meta:{next_cursor:a?o[o.length-1].id:null}}}function x0(t,e){let r=t.prepare("SELECT * FROM queue WHERE id = ?").get(e);if(r==null)return{error:{code:"queue_not_found",message:`no queue entry ${e}`}};let n=t.prepare("SELECT 1 AS x FROM answers WHERE prompt_queue_id = ? AND superseded_at IS NULL").get(e);return{queue:r,hasAnswer:n!=null}}function NE(t,e){let r=t-Date.parse(e);return Number.isFinite(r)?r:null}function k0(t,e){let r=Date.now(),n=(d,m)=>e?t.prepare(`SELECT to_id, ${m} AS ts FROM queue WHERE status = ? AND to_id = ?`).all(d,e):t.prepare(`SELECT to_id, ${m} AS ts FROM queue WHERE status = ?`).all(d),s=d=>{let m=new Map;for(let g of d){let y=m.get(g.to_id);y?y.push(g.ts):m.set(g.to_id,[g.ts])}return m},i=d=>{let m=d.reduce((g,y)=>g===null||y!==null&&y<g?y:g,null);return m===null?0:NE(r,m)},o=s(n("pending","created_ts")),a=s(n("escalating","escalation_claimed_ts")),l=new Map;if(ME(t,"team_progress").size>0){ou(t,"team_progress",v0);let d=e?t.prepare("SELECT * FROM team_progress WHERE team = ?").all(e):t.prepare("SELECT * FROM team_progress").all();for(let m of d)l.set(m.team,m)}let c=d=>({escalationAttemptCount:d?.escalation_attempt_count??0,lastEscalationAttemptTs:d?.last_escalation_attempt_ts??null,quotaExhaustedLastSeenAgeMs:d?.quota_exhausted_last_seen_ts?NE(r,d.quota_exhausted_last_seen_ts):null,quotaExhaustedMessage:d?.quota_exhausted_message??null}),u=new Set([...o.keys(),...a.keys()]),f=[...u].map(d=>{let m=o.get(d)??[],g=a.get(d)??[];return{toId:d,pendingCount:m.length,oldestPendingAgeMs:m.length>0?i(m):null,escalatingCount:g.length,oldestEscalatingAgeMs:g.length>0?i(g):null,...c(l.get(d))}});for(let d of l.values())u.has(d.team)||d.escalation_attempt_count<=0||f.push({toId:d.team,pendingCount:0,oldestPendingAgeMs:null,escalatingCount:0,oldestEscalatingAgeMs:null,...c(d)});return f.sort((d,m)=>(m.oldestPendingAgeMs??-1)-(d.oldestPendingAgeMs??-1)),{stats:f}}function DE(t,e=()=>{}){let r=(s,i)=>{let o=b0(s);try{return i(o)}finally{o.close()}},n=async s=>{if(typeof s!="string"||!iu(s))throw new Error("lmbee: source_db must be an absolute path");let i;try{if(i=su(s),!LE(i).isFile())throw new Error("not a file")}catch{throw new Error("lmbee: source_db must be an existing database file")}let o=f0(xE(CE(),"lmctl-lmbee-snapshot-")),a=xE(o,"state.db");try{return await _0("sqlite3",["-readonly",i,`.backup "${a.replaceAll('"','""')}"`],{env:t,timeout:12e4,maxBuffer:1048576}),OE(a),e(o),a}catch(l){p0(o,{recursive:!0,force:!0});let c=l;throw c.code==="ENOENT"?new Error("sqlite3 executable not found on PATH"):new Error(`lmbee snapshot failed: ${c.stderr?.trim()||c.message}`)}};return{name:"lmbee",description:"Read-only queue queries against temporary lmbee database copies",docs:y0,register(s){s.registerFunction("lmbee_queue_list",(i,o,a)=>r(i,l=>I0(l,kE(o),E0(a))),{min:1,max:3}),s.registerFunction("lmbee_queue_get",(i,o)=>{if(typeof o!="number"||!Number.isSafeInteger(o)||o<=0)throw new Error("lmbee: id must be a positive integer");return r(i,a=>x0(a,o))},2),s.registerFunction("lmbee_queue_stats",(i,o)=>r(i,a=>k0(a,kE(o))),{min:1,max:2}),s.registerFunction("lmbee_snapshot",n,1)}}}var _0,y0,w0,T0,v0,S0,AE,$E=k(()=>{"use strict";Ei();_0=g0(m0),y0=[{name:"lmbee_queue_list",category:"Queue Management",signature:"lmbee_queue_list(snapshot_db, team = null, options = null)",description:"Lists queue rows from a temporary lmbee database copy, read directly (no lmbee executable needed).",parameters:[{name:"snapshot_db",type:"string",description:"Existing database copy in the system temp directory"},{name:"team",type:"string",description:"Optional recipient filter"},{name:"options",type:"map",description:`Optional { scope, limit, after_id }: scope "recent" (default) is the newest 30 rows; scope "unfinished" is every genuinely open row (lmauto's listUnfinishedQueue predicate); scope "all" is every row. limit (1-200) and after_id page unfinished/all newest-first.`}],returns:{type:"map",description:"{ queue: [...] } for recent, plus { meta: { next_cursor } } for paged scopes; each row carries hasAnswer (current, non-superseded answer)"},example:'page = lmbee_queue_list("/tmp/lmbee-copy/state.db", null, {"scope":"unfinished","limit":200});'},{name:"lmbee_queue_get",category:"Queue Management",signature:"lmbee_queue_get(snapshot_db, id)",description:"Gets one queue row from a temporary lmbee database copy.",parameters:[{name:"snapshot_db",type:"string",description:"Existing database copy in the system temp directory"},{name:"id",type:"number",description:"Positive integer queue ID"}],returns:{type:"map",description:"{ queue: row, hasAnswer: boolean } or a queue_not_found error object"},example:'item = lmbee_queue_get("/tmp/lmbee-copy/state.db", 7);'},{name:"lmbee_queue_stats",category:"Queue Management",signature:"lmbee_queue_stats(snapshot_db, team = null)",description:"Reads per-recipient queue counts from a temporary lmbee database copy, without a row window.",parameters:[{name:"snapshot_db",type:"string",description:"Existing database copy in the system temp directory"},{name:"team",type:"string",description:"Optional recipient filter"}],returns:{type:"map",description:"{ stats: [...] } most-stale-first; team_progress-sourced fields (escalationAttemptCount, lastEscalationAttemptTs, quota*) default to 0/null when the snapshot predates that table"},example:'counts = lmbee_queue_stats("/tmp/lmbee-copy/state.db", "worker");'},{name:"lmbee_snapshot",category:"Queue Management",signature:"lmbee_snapshot(source_db)",description:"Creates a WAL-aware temporary database backup, removed when the script ends.",parameters:[{name:"source_db",type:"string",description:"Absolute path to an existing lmbee database"}],returns:{type:"string",description:"Temporary snapshot path for lmbee queue functions"},example:'snapshot = lmbee_snapshot(env("HOME") + "/.lmbee/state.db");'}];w0=["id","from_id","to_id","status","created_ts","expects_response","in_reply_to","retracted_ts","escalation_claimed_ts"],T0=["prompt_queue_id","superseded_at"],v0=["team","escalation_attempt_count","last_escalation_attempt_ts","quota_exhausted_last_seen_ts","quota_exhausted_message"],S0=`q.status != 'merged'
2369
2369
  AND q.retracted_ts IS NULL
2370
2370
  AND NOT EXISTS (SELECT 1 FROM answers r WHERE r.prompt_queue_id = q.id)
2371
2371
  AND NOT ((q.expects_response = 0 OR q.in_reply_to IS NOT NULL) AND q.status IN ('sent', 'retrieved'))`,AE="EXISTS (SELECT 1 FROM answers a WHERE a.prompt_queue_id = q.id AND a.superseded_at IS NULL)"});import{readFileSync as A0,rmSync as R0}from"node:fs";import{createInterface as N0}from"node:readline";async function L0(t){let e=t.provider.trim().toLowerCase();return bn.includes(e)||pn().tools[e]?.agent!==void 0||!Mr.includes(e)?!1:In().includes(e)}async function au(t,e){try{await L(t,r=>{r.releaseAgentInflight(e.row,e.leaseId)})}catch(r){t.stderr.write(`warning: failed to release batch bundle lease: ${r instanceof Error?r.message:String(r)}
@@ -2375,26 +2375,26 @@ possibly work, seed reports it as an error and seeds nothing.
2375
2375
  `)}}function $0(t={}){let e=new Er;e.isAsyncMode=!0;let r=t.scriptArgs??[];if(e.setGlobal("args",[...r]),e.setGlobal("ARGV",[...r]),t.io){let n=t.io;e.registerFunction("print",(...s)=>{let i=s.map(o=>typeof o=="object"?JSON.stringify(o):String(o)).join(" ");return n.stdout.write(i+`
2376
2376
  `),i},void 0,{description:"Prints formatted values to stdout",allowOverwrite:!0}),e.registerFunction("println",(...s)=>{let i=s.map(o=>typeof o=="object"?JSON.stringify(o):String(o)).join(" ");return n.stdout.write(i+`
2377
2377
  `),i},void 0,{description:"Prints line to stdout",allowOverwrite:!0}),e.registerFunction("printf",(s,...i)=>{let o=Js(s,i);return n.stdout.write(o+`
2378
- `),o},void 0,{description:"Formats a template using %s/%d/%f/%% substitution and prints it",allowOverwrite:!0}),e.registerFunction("prompt_human",s=>{if(e.isAsyncMode){let i=n.stdin??(typeof process<"u"?process.stdin:null),o=n.stdout??(typeof process<"u"?process.stdout:null);return Ks(s,i,o)}return Vs(s)},{min:0,max:1},{description:"Prompts operator on stdin/terminal, returning input string or null if closed/non-interactive",allowOverwrite:!0})}return e}function F0(t,e,r,n=process.env){t.registerFunction("lm_exit",(g=0)=>{let p=Math.floor(Number(g)),_=Number.isFinite(p)&&p>=0&&p<=255?p:1;throw new Ve(_)},{min:0,max:1},"Exits the LMScript execution with an exit code"),t.registerFunction("lm_log",(...g)=>{let p=g.map(_=>typeof _=="object"?JSON.stringify(_):String(_)).join(" ");return e.stderr.write(p+(p.endsWith(`
2378
+ `),o},void 0,{description:"Formats a template using %s/%d/%f/%% substitution and prints it",allowOverwrite:!0}),e.registerFunction("prompt_human",s=>{if(e.isAsyncMode){let i=n.stdin??(typeof process<"u"?process.stdin:null),o=n.stdout??(typeof process<"u"?process.stdout:null);return Ks(s,i,o)}return Vs(s)},{min:0,max:1},{description:"Prompts operator on stdin/terminal, returning input string or null if closed/non-interactive",allowOverwrite:!0})}return e}function F0(t,e,r,n=process.env){t.registerFunction("lm_exit",(h=0)=>{let p=Math.floor(Number(h)),_=Number.isFinite(p)&&p>=0&&p<=255?p:1;throw new Ve(_)},{min:0,max:1},"Exits the LMScript execution with an exit code"),t.registerFunction("lm_log",(...h)=>{let p=h.map(_=>typeof _=="object"?JSON.stringify(_):String(_)).join(" ");return e.stderr.write(p+(p.endsWith(`
2379
2379
  `)?"":`
2380
- `)),p},void 0,"Writes formatted log message to stderr"),t.registerFunction("lm_error",(...g)=>{let p=g.map(_=>typeof _=="object"?JSON.stringify(_):String(_)).join(" ");return e.stderr.write(`error: ${p}
2381
- `),r.recordError(p),p},void 0,"Writes error message to stderr and records it for end-of-run error summary");let s=(g,p=!1)=>{try{let _=A0(String(g),"utf8").replace(/^\uFEFF/u,"").replace(/\r\n?/gu,`
2382
- `);return!!p?[_.trim()].filter(w=>w.length>0):_.split(/\n\s*\n/u).map(w=>w.trim()).filter(Boolean)}catch(_){throw A(e,`batch: ${_ instanceof Error?_.message:String(_)}`),new Ve(1)}};t.registerFunction("lm_read_prompts",(g,p=!1)=>s(g,p),{min:1,max:2},"Reads prompt file with BOM and CRLF normalization, splitting into paragraphs or single prompt"),t.registerFunction("lm_read_paragraphs",g=>s(g,!1),1,"Reads file and splits into blank-line-separated paragraphs"),t.registerFunction("lm_members",g=>{try{return ae(String(g)).members.map(_=>({alias:_.alias,provider:_.provider,model:_.model,sessionid:_.session,sessiondir:_.sessiondir}))}catch(p){throw new Error(`Failed to read teamfile '${g}': ${p?.message||String(p)}`)}},1,"Resolves all members declared in a teamfile"),t.registerFunction("lm_member",(g,p)=>{try{let _=he(String(g),String(p),e.dal);return{alias:_.alias,provider:_.provider,model:_.model,sessionid:_.sessionid,sessiondir:_.sessiondir,isLead:_.isLead,teamfile:_.teamfile}}catch{return null}},2,"Resolves a specific member in a teamfile"),t.registerFunction("lm_batch_open",async(g,p,_,E={})=>{if(typeof g!="string"){if(!g||Array.isArray(g)||typeof g!="object"||typeof g.provider!="string"||!g.provider.trim())throw new Error("lm_batch_open: member map requires provider");let P=p??{};if(typeof P!="object"||Array.isArray(P)||_!==void 0)throw new Error("lm_batch_open(member, options): options must be a map");let q={kind:"agent",id:`batch-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,member:{...g},sourceMember:g,options:{...P},closed:!1,failed:!1,inFlight:!1};return r.registerBatch(q),q}if(typeof p!="string"||typeof _!="string")throw new Error("lm_batch_open(teamfile, alias, batchfile, options): alias and batchfile are required");let w;try{w=he(String(g),String(p),e.dal)}catch(P){return A(e,`batch: ${P?.message||String(P)}`),null}let S=Number(E?.promptCount??1),b=!!!E?.legacy&&S>1&&await L0(w),v={...e.env??n},x=await O0(e,{member:w,batchfile:String(_),promptCount:S,parentInvocationId:nr(v.LMCTL_INVOCATION_ID)});x!==null&&(v.LMCTL_INVOCATION_ID=String(x));let I,R,M,N=!1;e.stderr.write(`batch ${We()}: starting ${S} prompt${S===1?"":"s"} -> ${w.alias} (teamfile=${g} input=${_})
2380
+ `)),p},void 0,"Writes formatted log message to stderr"),t.registerFunction("lm_error",(...h)=>{let p=h.map(_=>typeof _=="object"?JSON.stringify(_):String(_)).join(" ");return e.stderr.write(`error: ${p}
2381
+ `),r.recordError(p),p},void 0,"Writes error message to stderr and records it for end-of-run error summary");let s=(h,p=!1)=>{try{let _=A0(String(h),"utf8").replace(/^\uFEFF/u,"").replace(/\r\n?/gu,`
2382
+ `);return!!p?[_.trim()].filter(w=>w.length>0):_.split(/\n\s*\n/u).map(w=>w.trim()).filter(Boolean)}catch(_){throw A(e,`batch: ${_ instanceof Error?_.message:String(_)}`),new Ve(1)}};t.registerFunction("lm_read_prompts",(h,p=!1)=>s(h,p),{min:1,max:2},"Reads prompt file with BOM and CRLF normalization, splitting into paragraphs or single prompt"),t.registerFunction("lm_read_paragraphs",h=>s(h,!1),1,"Reads file and splits into blank-line-separated paragraphs"),t.registerFunction("lm_members",h=>{try{return ae(String(h)).members.map(_=>({alias:_.alias,provider:_.provider,model:_.model,sessionid:_.session,sessiondir:_.sessiondir}))}catch(p){throw new Error(`Failed to read teamfile '${h}': ${p?.message||String(p)}`)}},1,"Resolves all members declared in a teamfile"),t.registerFunction("lm_member",(h,p)=>{try{let _=he(String(h),String(p),e.dal);return{alias:_.alias,provider:_.provider,model:_.model,sessionid:_.sessionid,sessiondir:_.sessiondir,isLead:_.isLead,teamfile:_.teamfile}}catch{return null}},2,"Resolves a specific member in a teamfile"),t.registerFunction("lm_batch_open",async(h,p,_,E={})=>{if(typeof h!="string"){if(!h||Array.isArray(h)||typeof h!="object"||typeof h.provider!="string"||!h.provider.trim())throw new Error("lm_batch_open: member map requires provider");let P=p??{};if(typeof P!="object"||Array.isArray(P)||_!==void 0)throw new Error("lm_batch_open(member, options): options must be a map");let q={kind:"agent",id:`batch-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,member:{...h},sourceMember:h,options:{...P},closed:!1,failed:!1,inFlight:!1};return r.registerBatch(q),q}if(typeof p!="string"||typeof _!="string")throw new Error("lm_batch_open(teamfile, alias, batchfile, options): alias and batchfile are required");let w;try{w=he(String(h),String(p),e.dal)}catch(P){return A(e,`batch: ${P?.message||String(P)}`),null}let S=Number(E?.promptCount??1),b=!!!E?.legacy&&S>1&&await L0(w),v={...e.env??n},x=await O0(e,{member:w,batchfile:String(_),promptCount:S,parentInvocationId:nr(v.LMCTL_INVOCATION_ID)});x!==null&&(v.LMCTL_INVOCATION_ID=String(x));let I,R,M,N=!1;e.stderr.write(`batch ${We()}: starting ${S} prompt${S===1?"":"s"} -> ${w.alias} (teamfile=${h} input=${_})
2383
2383
  `);try{if(b){let V=await L(e,Z=>(mn(Z,w.teamfile,w.alias),Ze(Z,w.teamfile,w.alias)));if(V.busy){let Z=V.reason==="in-flight"?`${w.alias} is servicing ${V.inFlight.sender_alias} (${V.inFlight.sender_teamfile}) since ${V.inFlight.started_at} \u2014 wait and retry`:V.source==="terminal-lock"?Fr(V.terminalLock):`${w.alias} is busy (interactive terminal); wait and retry`;return x!==null&&await L(e,D=>{D.finishTrackedInvocation(x,{status:"busy",exit_code:1,error:Z,result_summary:"0 prompts completed"})}),A(e,`batch: cannot start bundle: ${Z}`),null}let _e=await L(e,Z=>C0(v,Z)),Te=await L(e,Z=>St(Z,{receiver_teamfile:w.teamfile,receiver_alias:w.alias,sender_teamfile:_e?.teamfile??w.teamfile,sender_alias:_e?.alias??"operator",ttlMs:vt(v)}));if(!Te.acquired){let Z=`${w.alias} is servicing ${Te.current.sender_alias} (${Te.current.sender_teamfile}) since ${Te.current.started_at} \u2014 wait and retry`;return x!==null&&await L(e,D=>{D.finishTrackedInvocation(x,{status:"busy",exit_code:1,error:Z,result_summary:"0 prompts completed"})}),A(e,`batch: cannot start bundle: ${Z}`),null}I={row:Te.lease,leaseId:Te.leaseId};let br=ln(Z=>L(e,D=>D.heartbeatAgentInflight(I.row,I.leaseId,Z)));M={stop:()=>clearInterval(br)};let Dt=mt(e,Z=>`batch ${We()}: opening provider session (${Z}s elapsed)
2384
- `);try{let Z={...v};try{let D=await L(e,z=>z.getRootTeam(w.teamfile)?.name??null);D!==null&&(Z.LMBEE_TEAM_NAME=D)}catch{}R=await ks({provider:w.provider,sessionId:w.sessionid,cwd:w.sessiondir,env:Z,...w.model!==void 0?{model:w.model}:{},...w.effort!==void 0?{effort:w.effort}:{},alias:w.alias,isLead:w.isLead,permissionMode:"yolo",holdOpen:Ls(e,{teamfile:w.teamfile,alias:w.alias},Z)}),N=!0}catch{M&&M.stop(),M=void 0,await au(e,I),I=void 0,N=!1}finally{Dt.stop()}}let q={id:`batch-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,teamfile:String(g),alias:String(p),batchfile:String(_),member:w,promptCount:S,useBundle:N,rootId:x,rootFinish:{status:"error",error:"batch exited without a terminal outcome"},heldLease:I,bundleSession:R,heartbeatTimer:M,closed:!1,env:v};return r.registerBatch(q),q}catch(P){if(M){try{M.stop()}catch{}M=void 0}if(I){try{await au(e,I)}catch{}I=void 0}if(R){try{await R.close()}catch{}R=void 0}if(x!==null)try{await L(e,q=>{q.finishTrackedInvocation(x,{status:"error",exit_code:1,error:P?.message||String(P),result_summary:"0 prompts completed"})})}catch{}throw P}},{min:1,max:4},"Opens a batch from a member map or a teamfile with lifecycle management"),t.registerFunction("lm_batch_turn",async(g,p,_,E)=>{let w=typeof g=="string"?r.getBatch(g):g?.id?r.getBatch(g.id)??g:void 0;if(!w)throw new Error("Invalid or unmanaged batch handle");if(w.kind==="agent"){if(r.getBatch(w.id)!==w)throw new Error("Invalid or unmanaged batch handle");if(w.closed||w.failed)return{status:"error",reply:"",error:"Batch is closed or stopped after a failed turn"};if(w.inFlight)return{status:"busy",reply:"",error:"Batch already has an active turn"};w.inFlight=!0;try{let v=w.member.sessionid,x=await u(w.member,String(p),w.options);return w.member.sessionid&&w.sourceMember.provider===w.member.provider&&w.sourceMember.sessionid===v&&(w.sourceMember.sessionid=w.member.sessionid),x.status!=="ok"&&(w.failed=!0),{status:x.status,reply:x.reply.replace(/\n+$/u,""),error:x.error}}finally{w.inFlight=!1}}let S=Number(_),T=Number(E);e.stderr.write(`batch ${We()}: prompt ${S}/${T} -> ${w.member.alias}
2384
+ `);try{let Z={...v};try{let D=await L(e,z=>z.getRootTeam(w.teamfile)?.name??null);D!==null&&(Z.LMBEE_TEAM_NAME=D)}catch{}R=await ks({provider:w.provider,sessionId:w.sessionid,cwd:w.sessiondir,env:Z,...w.model!==void 0?{model:w.model}:{},...w.effort!==void 0?{effort:w.effort}:{},alias:w.alias,isLead:w.isLead,permissionMode:"yolo",holdOpen:Ls(e,{teamfile:w.teamfile,alias:w.alias},Z)}),N=!0}catch{M&&M.stop(),M=void 0,await au(e,I),I=void 0,N=!1}finally{Dt.stop()}}let q={id:`batch-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,teamfile:String(h),alias:String(p),batchfile:String(_),member:w,promptCount:S,useBundle:N,rootId:x,rootFinish:{status:"error",error:"batch exited without a terminal outcome"},heldLease:I,bundleSession:R,heartbeatTimer:M,closed:!1,env:v};return r.registerBatch(q),q}catch(P){if(M){try{M.stop()}catch{}M=void 0}if(I){try{await au(e,I)}catch{}I=void 0}if(R){try{await R.close()}catch{}R=void 0}if(x!==null)try{await L(e,q=>{q.finishTrackedInvocation(x,{status:"error",exit_code:1,error:P?.message||String(P),result_summary:"0 prompts completed"})})}catch{}throw P}},{min:1,max:4},"Opens a batch from a member map or a teamfile with lifecycle management"),t.registerFunction("lm_batch_turn",async(h,p,_,E)=>{let w=typeof h=="string"?r.getBatch(h):h?.id?r.getBatch(h.id)??h:void 0;if(!w)throw new Error("Invalid or unmanaged batch handle");if(w.kind==="agent"){if(r.getBatch(w.id)!==w)throw new Error("Invalid or unmanaged batch handle");if(w.closed||w.failed)return{status:"error",reply:"",error:"Batch is closed or stopped after a failed turn"};if(w.inFlight)return{status:"busy",reply:"",error:"Batch already has an active turn"};w.inFlight=!0;try{let v=w.member.sessionid,x=await u(w.member,String(p),w.options);return w.member.sessionid&&w.sourceMember.provider===w.member.provider&&w.sourceMember.sessionid===v&&(w.sourceMember.sessionid=w.member.sessionid),x.status!=="ok"&&(w.failed=!0),{status:x.status,reply:x.reply.replace(/\n+$/u,""),error:x.error}}finally{w.inFlight=!1}}let S=Number(_),T=Number(E);e.stderr.write(`batch ${We()}: prompt ${S}/${T} -> ${w.member.alias}
2385
2385
  `);let b=mt(e,v=>`batch ${We()}: prompt ${S}/${T} still running (${v}s elapsed)
2386
- `);try{let v=await Ur({teamfile:w.member.teamfile,alias:w.member.alias,prompt:String(p),expectedSession:{provider:w.member.provider,sessionid:w.member.sessionid},permissionMode:"yolo",env:{...w.env},messageType:"batch",...w.heldLease!==void 0?{heldLease:w.heldLease}:{},...w.bundleSession!==void 0?{bundleSession:w.bundleSession}:{},io:e,onEvent:I=>{b.poke(),I.kind==="warning"&&e.stderr.write(I.message)}}),x=v.replyText?String(v.replyText).replace(/\n+$/u,""):"";if(v.status!=="ok"){let I=v.status==="stalled"?"provider stalled":v.status==="empty"?"provider returned no content and no observed activity for this turn":v.message,R=`batch: stopped at prompt ${S}/${T} (${S-1} completed): ${I}; later prompts were not sent`;return w.rootFinish={status:v.status==="busy"?"busy":"error",exit_code:1,error:R,result_summary:`${S-1}/${T} prompts completed`},A(e,R),{status:v.status,reply:x,error:R}}return{status:"ok",reply:x,error:null}}catch(v){let x=`batch: stopped at prompt ${S}/${T} (${S-1} completed): ${v instanceof Error?v.message:String(v)}; later prompts were not sent`;return w.rootFinish={status:"error",exit_code:1,error:x,result_summary:`${S-1}/${T} prompts completed`},A(e,x),{status:"error",reply:"",error:x}}finally{b.stop()}},4,"Executes a prompt turn within a batch session"),t.registerFunction("lm_batch_close",async(g,p="done",_)=>{let E=typeof g=="string"?r.getBatch(g):g?.id?r.getBatch(g.id)??g:void 0;return E?(await FE(E,e,p==="done"?"done":p==="cancelled"?"cancelled":"error",_),!0):!1},{min:1,max:3},"Closes a batch session and cleans up resources"),t.registerFunction("lm_ratelimit_readings",async(g={})=>{try{if(!g||typeof g!="object"||Array.isArray(g))throw new Error("lm_ratelimit_readings: options must be a map");let p=g.providers??(g.provider===void 0?["all"]:[g.provider]);if(!Array.isArray(p)||p.some(E=>typeof E!="string"||!E||E.startsWith("-")))throw new Error("lm_ratelimit_readings: providers must be a list of provider names");let _=g.timeoutSeconds??15;if(typeof _!="number"||!Number.isFinite(_)||_<=0)throw new Error("lm_ratelimit_readings: timeoutSeconds must be a positive finite number");return ca({providers:p.length?p:["all"],timeoutSeconds:_,env:e.env??n,progress:E=>{e.stderr.write(`${E}
2387
- `)}})}catch(p){return{status:"error",error:p instanceof Error?p.message:String(p),readings:[]}}},{min:0,max:1},"Reads live provider quota values without analytics or aggregation");let i=new WeakSet,o=new Set,a=new Set,l=new Map,c=async(g,p,_={},E=!1)=>{let w=(v,x="",I=null)=>({status:v,reply:x,error:I,message_id:null,team_chat_log_id:null}),S,T=!1,b;try{if(!g||typeof g!="object"||Array.isArray(g))throw new Error("lm_agent: member must be a map");for(let P of["provider","alias","model","effort","sessiondir","sessionid"]){let q=g[P];if(q!=null&&(typeof q!="string"||!q.trim()))throw new Error(`lm_agent: ${P} must be a nonempty string when supplied`)}if(!g.provider)throw new Error("lm_agent: provider is required");if(typeof p!="string")throw new Error("lm_agent: prompt must be a string");if(!_||typeof _!="object"||Array.isArray(_))throw new Error("lm_agent: options must be a map");let v=_.permissionMode??"yolo";if(v!=="yolo"&&v!=="plan")throw new Error("lm_agent: permissionMode must be yolo or plan");if(_.idleTimeoutMs!=null&&(typeof _.idleTimeoutMs!="number"||!Number.isFinite(_.idleTimeoutMs)||_.idleTimeoutMs<0))throw new Error("lm_agent: idleTimeoutMs must be a finite nonnegative number");let x=g.provider,I=g.sessiondir??process.cwd(),R=g.sessionid??"";if(S=R?JSON.stringify([x,R]):void 0,i.has(g)||S!==void 0&&(o.has(S)||!E&&a.has(S)))return w("busy","","lm_agent: session already has an active turn in this engine");i.add(g),S!==void 0&&o.add(S),T=!0,e.stderr.write(`agent ${We()}: prompting ${g.alias??x}
2386
+ `);try{let v=await Ur({teamfile:w.member.teamfile,alias:w.member.alias,prompt:String(p),expectedSession:{provider:w.member.provider,sessionid:w.member.sessionid},permissionMode:"yolo",env:{...w.env},messageType:"batch",...w.heldLease!==void 0?{heldLease:w.heldLease}:{},...w.bundleSession!==void 0?{bundleSession:w.bundleSession}:{},io:e,onEvent:I=>{b.poke(),I.kind==="warning"&&e.stderr.write(I.message)}}),x=v.replyText?String(v.replyText).replace(/\n+$/u,""):"";if(v.status!=="ok"){let I=v.status==="stalled"?"provider stalled":v.status==="empty"?"provider returned no content and no observed activity for this turn":v.message,R=`batch: stopped at prompt ${S}/${T} (${S-1} completed): ${I}; later prompts were not sent`;return w.rootFinish={status:v.status==="busy"?"busy":"error",exit_code:1,error:R,result_summary:`${S-1}/${T} prompts completed`},A(e,R),{status:v.status,reply:x,error:R}}return{status:"ok",reply:x,error:null}}catch(v){let x=`batch: stopped at prompt ${S}/${T} (${S-1} completed): ${v instanceof Error?v.message:String(v)}; later prompts were not sent`;return w.rootFinish={status:"error",exit_code:1,error:x,result_summary:`${S-1}/${T} prompts completed`},A(e,x),{status:"error",reply:"",error:x}}finally{b.stop()}},4,"Executes a prompt turn within a batch session"),t.registerFunction("lm_batch_close",async(h,p="done",_)=>{let E=typeof h=="string"?r.getBatch(h):h?.id?r.getBatch(h.id)??h:void 0;return E?(await FE(E,e,p==="done"?"done":p==="cancelled"?"cancelled":"error",_),!0):!1},{min:1,max:3},"Closes a batch session and cleans up resources"),t.registerFunction("lm_ratelimit_readings",async(h={})=>{try{if(!h||typeof h!="object"||Array.isArray(h))throw new Error("lm_ratelimit_readings: options must be a map");let p=h.providers??(h.provider===void 0?["all"]:[h.provider]);if(!Array.isArray(p)||p.some(E=>typeof E!="string"||!E||E.startsWith("-")))throw new Error("lm_ratelimit_readings: providers must be a list of provider names");let _=h.timeoutSeconds??15;if(typeof _!="number"||!Number.isFinite(_)||_<=0)throw new Error("lm_ratelimit_readings: timeoutSeconds must be a positive finite number");return ca({providers:p.length?p:["all"],timeoutSeconds:_,env:e.env??n,progress:E=>{e.stderr.write(`${E}
2387
+ `)}})}catch(p){return{status:"error",error:p instanceof Error?p.message:String(p),readings:[]}}},{min:0,max:1},"Reads live provider quota values without analytics or aggregation");let i=new WeakSet,o=new Set,a=new Set,l=new Map,c=async(h,p,_={},E=!1)=>{let w=(v,x="",I=null)=>({status:v,reply:x,error:I,message_id:null,team_chat_log_id:null}),S,T=!1,b;try{if(!h||typeof h!="object"||Array.isArray(h))throw new Error("lm_agent: member must be a map");for(let P of["provider","alias","model","effort","sessiondir","sessionid"]){let q=h[P];if(q!=null&&(typeof q!="string"||!q.trim()))throw new Error(`lm_agent: ${P} must be a nonempty string when supplied`)}if(!h.provider)throw new Error("lm_agent: provider is required");if(typeof p!="string")throw new Error("lm_agent: prompt must be a string");if(!_||typeof _!="object"||Array.isArray(_))throw new Error("lm_agent: options must be a map");let v=_.permissionMode??"yolo";if(v!=="yolo"&&v!=="plan")throw new Error("lm_agent: permissionMode must be yolo or plan");if(_.idleTimeoutMs!=null&&(typeof _.idleTimeoutMs!="number"||!Number.isFinite(_.idleTimeoutMs)||_.idleTimeoutMs<0))throw new Error("lm_agent: idleTimeoutMs must be a finite nonnegative number");let x=h.provider,I=h.sessiondir??process.cwd(),R=h.sessionid??"";if(S=R?JSON.stringify([x,R]):void 0,i.has(h)||S!==void 0&&(o.has(S)||!E&&a.has(S)))return w("busy","","lm_agent: session already has an active turn in this engine");i.add(h),S!==void 0&&o.add(S),T=!0,e.stderr.write(`agent ${We()}: prompting ${h.alias??x}
2388
2388
  `),b=mt(e,P=>`agent ${We()}: still running (${P}s elapsed)
2389
- `);let M=R;if(!M&&["agy","pi","dsh"].includes(x)){if(v!=="yolo")throw new Error(`lm_agent: fresh ${x} sessions require yolo seed; supply sessionid for resume`);let P=await ld({provider:x,cwd:I,model:g.model,effort:g.effort});for(let q of P.warnings??[])e.stderr.write(`warning: ${q}
2390
- `);if(!P.success||!P.sessionId)throw new Error(P.error??"lm_agent: provider did not identify the seeded session");M=P.sessionId,g.sessionid=M,S=JSON.stringify([x,M]),o.add(S)}let N=await $r({provider:x,cwd:I,sessionId:M,prompt:p,model:g.model,effort:g.effort,alias:g.alias,isLead:!1,permissionMode:v,timeoutMs:_.idleTimeoutMs,requireResume:!!M,env:{...e.env??n},onDelta:()=>b?.poke(),onProgress:()=>b?.poke()});for(let P of N.warnings??[])e.stderr.write(`warning: ${P}
2391
- `);return M&&N.sessionId!==M?w("error","","lm_agent: provider changed session identity during resume"):(N.sessionId&&(g.sessionid=N.sessionId),N.status==="stalled"?w("stalled",N.text,"provider stalled"):N.status==="empty"?w("empty","","lm_agent: 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"):N.sessionId?w("ok",N.text):w("error",N.text,"lm_agent: provider did not return a session ID"))}catch(v){return w("error","",v instanceof Error?v.message:String(v))}finally{b?.stop(),T&&(i.delete(g),S!==void 0&&o.delete(S))}},u=async(g,p,_={},E=!1)=>{let w=await c(g,p,_,E);if(g?.sessionid&&w.status!=="busy"){let S=JSON.stringify([g.provider,g.sessionid]),T=l.get(S)??{lines:[],options:{}};T.lines.push(`You: ${p}`),w.reply&&T.lines.push(`Agent: ${w.reply}`),w.error&&T.lines.push(`${w.status}: ${w.error}`),T.options={..._},l.set(S,T)}return w};t.registerFunction("lm_agent",u,{min:2,max:3},"Prompts an agent described by a map without a teamfile"),t.registerFunction("lm_session_list",async(g={})=>{if(!g||typeof g!="object"||Array.isArray(g)||g.provider!=null&&(typeof g.provider!="string"||!g.provider.trim())||g.sessiondir!=null&&(typeof g.sessiondir!="string"||!g.sessiondir.trim())||g.all!=null&&typeof g.all!="boolean")throw new Error("lm_session_list: expected options map with provider, sessiondir, and all");return(await As({provider:g.provider,workspace:g.all?void 0:g.sessiondir??process.cwd()})).map(_=>({provider:_.provider,sessionid:_.sessionId,sessiondir:_.cwd,modifiedAt:_.modifiedAt.toISOString()}))},{min:0,max:1},"Lists native provider sessions"),t.registerFunction("lm_session_delete",async(g,p={})=>{let _=(w,S=null)=>({status:w,error:S});if(!g||typeof g!="object"||Array.isArray(g)||typeof g.provider!="string"||!g.provider.trim()||typeof g.sessionid!="string"||!g.sessionid.trim())return _("error","lm_session_delete: member requires provider and sessionid");if(!p||typeof p!="object"||Array.isArray(p)||p.force!==!0)return _("error","lm_session_delete: force: true is required because cross-process turns cannot be detected");let E=JSON.stringify([g.provider,g.sessionid]);if(i.has(g)||o.has(E)||a.has(E))return _("busy","lm_session_delete: session has an active turn in this engine");o.add(E);try{return await cd(g.provider,g.sessionid)?(l.delete(E),g.sessionid=null,_("deleted")):_("not_found")}catch(w){return _("error",w instanceof Error?w.message:String(w))}finally{o.delete(E)}},{min:1,max:2},"Deletes a native session with explicit cross-process race acceptance");let f=async(g,p,_={})=>{if(!Array.isArray(g))throw new Error("lm_fanout: participants must be an array of member maps");if(g.length===0)return[];let E;if(typeof p=="string")E=g.map(()=>p);else if(Array.isArray(p)){if(p.length!==g.length)throw new Error(`lm_fanout: prompts array length (${p.length}) must match participants length (${g.length})`);for(let w of p)if(typeof w!="string")throw new Error("lm_fanout: every prompts[] entry must be a string");E=p}else throw new Error("lm_fanout: prompts must be a string (broadcast to every participant) or an array of strings (one per participant)");if(!_||typeof _!="object"||Array.isArray(_))throw new Error("lm_fanout: options must be a map");return Promise.all(g.map((w,S)=>u(w,E[S],_)))};t.registerFunction("lm_fanout",f,{min:2,max:3},"Dispatches a prompt to every participant in an array concurrently (runtime-sized, unlike parallel()); returns an array of lm_agent-shaped results in the same order as participants. prompts is a single string broadcast to all, or an array of strings (one per participant, same length).");let d=async(g,p={})=>{if(typeof g!="string"||g.length===0)throw new Error("lm_seed: teamfile must be a nonempty string");if(!p||typeof p!="object"||Array.isArray(p))throw new Error("lm_seed: options must be a map");if(p.preamble!==void 0&&typeof p.preamble!="string"&&(typeof p.preamble!="object"||p.preamble===null||Array.isArray(p.preamble)))throw new Error("lm_seed: options.preamble must be a string or a map keyed by alias");let _=p.preamble!==void 0?{preamble:p.preamble}:{};return{status:await Tr(g,e,_)===0?"ok":"error"}};t.registerFunction("lm_seed",d,{min:1,max:2},"Seeds a real teamfile over the exact same path lmctl seed takes; options.preamble overrides the default Lead prompt (string) or per-alias prompts (map).");let m=async g=>{if(typeof g!="string"||g.length===0)throw new Error("lm_lint: teamfile must be a nonempty string");return tu(g,e)};t.registerFunction("lm_lint",m,1,"Validates a teamfile over the exact same path lmctl lint takes, returning { status, errors, warnings, counts } instead of text to parse.");let h=!1,y=async g=>{let p=g!==null&&typeof g=="object";if(h)throw new Error("prompt_human: another operator prompt is active");h=!0;let _,E;try{let w=e.stdin??process.stdin;if(!p)return await Ks(g,w,e.stdout);let S={...g};if(Array.isArray(g)||typeof S.provider!="string"||!S.provider.trim()||typeof S.sessionid!="string"||!S.sessionid.trim())return{command:"error",args:["prompt_human: session map requires provider and sessionid; call lm_agent first"]};let T=JSON.stringify([S.provider,S.sessionid]);if(o.has(T))return{command:"busy",args:["Agent turn is still running"]};a.add(T),E=T;let b=w;if(b.destroyed||b.readableEnded)return{command:"eof",args:[]};_=N0({input:b,output:e.stdout,terminal:!!b.isTTY,crlfDelay:1/0});let v=_[Symbol.asyncIterator](),x=!1;_.on("SIGINT",()=>{x=!0,_?.close()}),e.stdout.write(`Session ${S.alias??S.provider} (${S.sessionid})
2389
+ `);let M=R;if(!M&&["agy","pi","dsh"].includes(x)){if(v!=="yolo")throw new Error(`lm_agent: fresh ${x} sessions require yolo seed; supply sessionid for resume`);let P=await ld({provider:x,cwd:I,model:h.model,effort:h.effort});for(let q of P.warnings??[])e.stderr.write(`warning: ${q}
2390
+ `);if(!P.success||!P.sessionId)throw new Error(P.error??"lm_agent: provider did not identify the seeded session");M=P.sessionId,h.sessionid=M,S=JSON.stringify([x,M]),o.add(S)}let N=await $r({provider:x,cwd:I,sessionId:M,prompt:p,model:h.model,effort:h.effort,alias:h.alias,isLead:!1,permissionMode:v,timeoutMs:_.idleTimeoutMs,requireResume:!!M,env:{...e.env??n},onDelta:()=>b?.poke(),onProgress:()=>b?.poke()});for(let P of N.warnings??[])e.stderr.write(`warning: ${P}
2391
+ `);return M&&N.sessionId!==M?w("error","","lm_agent: provider changed session identity during resume"):(N.sessionId&&(h.sessionid=N.sessionId),N.status==="stalled"?w("stalled",N.text,"provider stalled"):N.status==="empty"?w("empty","","lm_agent: 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"):N.sessionId?w("ok",N.text):w("error",N.text,"lm_agent: provider did not return a session ID"))}catch(v){return w("error","",v instanceof Error?v.message:String(v))}finally{b?.stop(),T&&(i.delete(h),S!==void 0&&o.delete(S))}},u=async(h,p,_={},E=!1)=>{let w=await c(h,p,_,E);if(h?.sessionid&&w.status!=="busy"){let S=JSON.stringify([h.provider,h.sessionid]),T=l.get(S)??{lines:[],options:{}};T.lines.push(`You: ${p}`),w.reply&&T.lines.push(`Agent: ${w.reply}`),w.error&&T.lines.push(`${w.status}: ${w.error}`),T.options={..._},l.set(S,T)}return w};t.registerFunction("lm_agent",u,{min:2,max:3},"Prompts an agent described by a map without a teamfile"),t.registerFunction("lm_session_list",async(h={})=>{if(!h||typeof h!="object"||Array.isArray(h)||h.provider!=null&&(typeof h.provider!="string"||!h.provider.trim())||h.sessiondir!=null&&(typeof h.sessiondir!="string"||!h.sessiondir.trim())||h.all!=null&&typeof h.all!="boolean")throw new Error("lm_session_list: expected options map with provider, sessiondir, and all");return(await As({provider:h.provider,workspace:h.all?void 0:h.sessiondir??process.cwd()})).map(_=>({provider:_.provider,sessionid:_.sessionId,sessiondir:_.cwd,modifiedAt:_.modifiedAt.toISOString()}))},{min:0,max:1},"Lists native provider sessions"),t.registerFunction("lm_session_delete",async(h,p={})=>{let _=(w,S=null)=>({status:w,error:S});if(!h||typeof h!="object"||Array.isArray(h)||typeof h.provider!="string"||!h.provider.trim()||typeof h.sessionid!="string"||!h.sessionid.trim())return _("error","lm_session_delete: member requires provider and sessionid");if(!p||typeof p!="object"||Array.isArray(p)||p.force!==!0)return _("error","lm_session_delete: force: true is required because cross-process turns cannot be detected");let E=JSON.stringify([h.provider,h.sessionid]);if(i.has(h)||o.has(E)||a.has(E))return _("busy","lm_session_delete: session has an active turn in this engine");o.add(E);try{return await cd(h.provider,h.sessionid)?(l.delete(E),h.sessionid=null,_("deleted")):_("not_found")}catch(w){return _("error",w instanceof Error?w.message:String(w))}finally{o.delete(E)}},{min:1,max:2},"Deletes a native session with explicit cross-process race acceptance");let f=async(h,p,_={})=>{if(!Array.isArray(h))throw new Error("lm_fanout: participants must be an array of member maps");if(h.length===0)return[];let E;if(typeof p=="string")E=h.map(()=>p);else if(Array.isArray(p)){if(p.length!==h.length)throw new Error(`lm_fanout: prompts array length (${p.length}) must match participants length (${h.length})`);for(let w of p)if(typeof w!="string")throw new Error("lm_fanout: every prompts[] entry must be a string");E=p}else throw new Error("lm_fanout: prompts must be a string (broadcast to every participant) or an array of strings (one per participant)");if(!_||typeof _!="object"||Array.isArray(_))throw new Error("lm_fanout: options must be a map");return Promise.all(h.map((w,S)=>u(w,E[S],_)))};t.registerFunction("lm_fanout",f,{min:2,max:3},"Dispatches a prompt to every participant in an array concurrently (runtime-sized, unlike parallel()); returns an array of lm_agent-shaped results in the same order as participants. prompts is a single string broadcast to all, or an array of strings (one per participant, same length).");let d=async(h,p={})=>{if(typeof h!="string"||h.length===0)throw new Error("lm_seed: teamfile must be a nonempty string");if(!p||typeof p!="object"||Array.isArray(p))throw new Error("lm_seed: options must be a map");if(p.preamble!==void 0&&typeof p.preamble!="string"&&(typeof p.preamble!="object"||p.preamble===null||Array.isArray(p.preamble)))throw new Error("lm_seed: options.preamble must be a string or a map keyed by alias");let _=p.preamble!==void 0?{preamble:p.preamble}:{};return{status:await Tr(h,e,_)===0?"ok":"error"}};t.registerFunction("lm_seed",d,{min:1,max:2},"Seeds a real teamfile over the exact same path lmctl seed takes; options.preamble overrides the default Lead prompt (string) or per-alias prompts (map).");let m=async h=>{if(typeof h!="string"||h.length===0)throw new Error("lm_lint: teamfile must be a nonempty string");return tu(h,e)};t.registerFunction("lm_lint",m,1,"Validates a teamfile over the exact same path lmctl lint takes, returning { status, errors, warnings, counts } instead of text to parse.");let g=!1,y=async h=>{let p=h!==null&&typeof h=="object";if(g)throw new Error("prompt_human: another operator prompt is active");g=!0;let _,E;try{let w=e.stdin??process.stdin;if(!p)return await Ks(h,w,e.stdout);let S={...h};if(Array.isArray(h)||typeof S.provider!="string"||!S.provider.trim()||typeof S.sessionid!="string"||!S.sessionid.trim())return{command:"error",args:["prompt_human: session map requires provider and sessionid; call lm_agent first"]};let T=JSON.stringify([S.provider,S.sessionid]);if(o.has(T))return{command:"busy",args:["Agent turn is still running"]};a.add(T),E=T;let b=w;if(b.destroyed||b.readableEnded)return{command:"eof",args:[]};_=N0({input:b,output:e.stdout,terminal:!!b.isTTY,crlfDelay:1/0});let v=_[Symbol.asyncIterator](),x=!1;_.on("SIGINT",()=>{x=!0,_?.close()}),e.stdout.write(`Session ${S.alias??S.provider} (${S.sessionid})
2392
2392
  `);let I=l.get(T);if(I)for(let R of I.lines)e.stdout.write(`${R}
2393
2393
  `);else{let R=await sr(pr()).getSession(S.sessionid,S.provider);if(!R)return{command:"error",args:["Could not load session history"]};for(let M of R.messages)(M.role==="user"||M.role==="assistant")&&e.stdout.write(`${M.role==="user"?"You":"Agent"}: ${M.content}
2394
2394
  `)}for(e.stdout.write(`Talk to the agent. Return to the script with /exit [command] [args...].
2395
2395
  `);;){e.stdout.write("You> ");let R=await v.next();if(x)return{command:"cancelled",args:[]};if(R.done)return{command:"eof",args:[]};let M=R.value.trim();if(!M)continue;if(/^\/exit(?:\s|$)/u.test(M)){let P=M.split(/\s+/u).slice(1);return{command:P.shift()??"exit",args:P}}let N=await u(S,R.value,I?.options??{},!0);if(N.reply&&e.stdout.write(`Agent: ${N.reply}
2396
2396
  `),N.status!=="ok")return e.stdout.write(`${N.status}: ${N.error}
2397
- `),{command:N.status,args:[N.error??"Agent turn failed"]}}}catch(w){if(!p)throw w;return{command:"error",args:[w instanceof Error?w.message:String(w)]}}finally{_?.close(),E!==void 0&&a.delete(E),h=!1}};t.registerFunction("prompt_human",g=>{if(!t.isAsyncMode&&(g===null||typeof g!="object")){if(h)throw new Error("prompt_human: another operator prompt is active");return Vs(g)}return y(g)},{min:0,max:1},{description:"Prompts for a string, or hands an agent session to the operator and returns a decision map",allowOverwrite:!0}),t.registerFunctionDoc({name:"prompt_human",module:"core",category:"System & Process",signature:"prompt_human([question: string]): string|null; prompt_human(session: map): map",description:'Question form reads one line. In the lmctl engine, a session map opens an agent conversation showing script history. /exit retry a b returns {command: "retry", args: ["a", "b"]}; arguments are whitespace-separated. Bare /exit returns command "exit"; closed input returns "eof". Errors, stalls, busy sessions and Ctrl-C return "error", "stalled", "busy" and "cancelled" maps. All map results have args: string[].',example:'agent = { provider: "codex" }; lm_agent(agent, "Review this change"); decision = prompt_human(agent); if (decision.command == "retry") { lm_agent(agent, join(decision.args, " ")); }'}),t.registerFunction("lm_prompt",async(g,p,_,E={})=>{try{let w=await Ur({teamfile:String(g),alias:String(p),prompt:String(_),permissionMode:E?.permissionMode??"yolo",idleTimeoutMs:E?.idleTimeoutMs,env:{...e.env??n},messageType:E?.messageType,io:e});return{status:w.status,reply:w.replyText??"",error:w.message??null,message_id:w.messageId??null,team_chat_log_id:w.teamChatLogId??null}}catch(w){return{status:"error",reply:"",error:w?.message||String(w),message_id:null,team_chat_log_id:null}}},{min:3,max:4},"Sends a prompt directly to a team member and returns the reply")}function U0(t,e,r=new qt,n=process.env){return t.registerModule(P0,{io:e,registry:r,env:n})}function ti(t,e=[],r=new qt,n=process.env){let s=$0({scriptArgs:e,io:t,env:n});return U0(s,t,r,n),n.LMCTL_LMBEE_BRIDGE==="1"&&s.registerModule(DE(n,i=>r.registerTemporaryDirectory(i))),s}async function da(t,e,r={stdout:process.stdout,stderr:process.stderr},n=process.env,s){let i=new qt,o=u=>{i.removeTemporaryDirectories();for(let f of i.getOpenBatches()){if(f.kind==="agent"){f.closed=!0;continue}if(f.heartbeatTimer){try{f.heartbeatTimer.stop()}catch{}f.heartbeatTimer=void 0}if(f.heldLease){try{if(r.dal)r.dal.releaseAgentInflight(f.heldLease.row,f.heldLease.leaseId);else{let d=ut({path:Ee(n?.LMCTL_DB)});try{d.releaseAgentInflight(f.heldLease.row,f.heldLease.leaseId)}finally{d.close()}}}catch{}f.heldLease=void 0}f.rootId!==null&&M0(r,f.rootId,{status:"cancelled",signal:u,error:`batch interrupted by ${u}`},n)}process.exit(u==="SIGINT"?130:143)};process.once("SIGINT",o),process.once("SIGTERM",o);let a=!1,l,c=()=>{if(a)return;a=!0;let u=i.getErrors(),f=l?l.getRecordedErrors():[],d=[...u];for(let m of f)d.includes(m)||d.push(m);if(d.length>0){r.stderr.write(`
2397
+ `),{command:N.status,args:[N.error??"Agent turn failed"]}}}catch(w){if(!p)throw w;return{command:"error",args:[w instanceof Error?w.message:String(w)]}}finally{_?.close(),E!==void 0&&a.delete(E),g=!1}};t.registerFunction("prompt_human",h=>{if(!t.isAsyncMode&&(h===null||typeof h!="object")){if(g)throw new Error("prompt_human: another operator prompt is active");return Vs(h)}return y(h)},{min:0,max:1},{description:"Prompts for a string, or hands an agent session to the operator and returns a decision map",allowOverwrite:!0}),t.registerFunctionDoc({name:"prompt_human",module:"core",category:"System & Process",signature:"prompt_human([question: string]): string|null; prompt_human(session: map): map",description:'Question form reads one line. In the lmctl engine, a session map opens an agent conversation showing script history. /exit retry a b returns {command: "retry", args: ["a", "b"]}; arguments are whitespace-separated. Bare /exit returns command "exit"; closed input returns "eof". Errors, stalls, busy sessions and Ctrl-C return "error", "stalled", "busy" and "cancelled" maps. All map results have args: string[].',example:'agent = { provider: "codex" }; lm_agent(agent, "Review this change"); decision = prompt_human(agent); if (decision.command == "retry") { lm_agent(agent, join(decision.args, " ")); }'}),t.registerFunction("lm_prompt",async(h,p,_,E={})=>{try{let w=await Ur({teamfile:String(h),alias:String(p),prompt:String(_),permissionMode:E?.permissionMode??"yolo",idleTimeoutMs:E?.idleTimeoutMs,env:{...e.env??n},messageType:E?.messageType,io:e});return{status:w.status,reply:w.replyText??"",error:w.message??null,message_id:w.messageId??null,team_chat_log_id:w.teamChatLogId??null}}catch(w){return{status:"error",reply:"",error:w?.message||String(w),message_id:null,team_chat_log_id:null}}},{min:3,max:4},"Sends a prompt directly to a team member and returns the reply")}function U0(t,e,r=new qt,n=process.env){return t.registerModule(P0,{io:e,registry:r,env:n})}function ti(t,e=[],r=new qt,n=process.env){let s=$0({scriptArgs:e,io:t,env:n});return U0(s,t,r,n),n.LMCTL_LMBEE_BRIDGE==="1"&&s.registerModule(DE(n,i=>r.registerTemporaryDirectory(i))),s}async function da(t,e,r={stdout:process.stdout,stderr:process.stderr},n=process.env,s){let i=new qt,o=u=>{i.removeTemporaryDirectories();for(let f of i.getOpenBatches()){if(f.kind==="agent"){f.closed=!0;continue}if(f.heartbeatTimer){try{f.heartbeatTimer.stop()}catch{}f.heartbeatTimer=void 0}if(f.heldLease){try{if(r.dal)r.dal.releaseAgentInflight(f.heldLease.row,f.heldLease.leaseId);else{let d=ut({path:Ee(n?.LMCTL_DB)});try{d.releaseAgentInflight(f.heldLease.row,f.heldLease.leaseId)}finally{d.close()}}}catch{}f.heldLease=void 0}f.rootId!==null&&M0(r,f.rootId,{status:"cancelled",signal:u,error:`batch interrupted by ${u}`},n)}process.exit(u==="SIGINT"?130:143)};process.once("SIGINT",o),process.once("SIGTERM",o);let a=!1,l,c=()=>{if(a)return;a=!0;let u=i.getErrors(),f=l?l.getRecordedErrors():[],d=[...u];for(let m of f)d.includes(m)||d.push(m);if(d.length>0){r.stderr.write(`
2398
2398
  === LMScript Error Summary (${d.length} error${d.length===1?"":"s"}) ===
2399
2399
  `);for(let m=0;m<d.length;m++)r.stderr.write(` ${m+1}. ${d[m]}
2400
2400
  `);r.stderr.write(`==========================================
@@ -2436,10 +2436,10 @@ ${n}
2436
2436
  `)){if(!JE.test(r))continue;let n=uu(r,"alias"),s=uu(r,"provider");if(n===void 0||s===void 0)continue;let i=uu(r,"model");e.push({alias:n,provider:s,...i!==void 0&&i!==""?{model:i}:{}})}return e}var mu,ha,JE,_a=k(()=>{"use strict";gt();mu={1:["Lead"],lead:["Lead"],2:["Lead","Reviewer"],"lead-reviewer":["Lead","Reviewer"],3:["Lead","Coder","Reviewer"],"lead-coder-reviewer":["Lead","Coder","Reviewer"]},ha="1|2|3|lead|lead-reviewer|lead-coder-reviewer";JE=/^\s*_MEMBER_\s+\S/});import{existsSync as ya,mkdirSync as KE,readFileSync as Ea,readdirSync as K0,statSync as Y0,writeFileSync as YE}from"node:fs";import{basename as si,dirname as fu,extname as pu,resolve as ii}from"node:path";function ni(t,e){return new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t)?.slice(1).find(r=>r!==void 0)}function Dn(t,e,r){if(/["\r\n]/.test(r))throw new Error(`${e} cannot contain quotes or newlines in a teamfile.`);let n=`${e}=${/\s/.test(r)?`"${r}"`:r}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(i,o)=>`${o}${n}`):`${t.trimEnd()} ${n}`}async function z0(t,e){let r=Ot(),n=[...new Set(r?Object.values(r).map(s=>s.provider):[])];for(e.stderr.write(`Providers from lmctl init: ${n.join(", ")||"(none saved)"}; another supported provider may be typed.
2437
2437
  `);;){let s=await t.ask("Provider: ");if(oi.includes(s))return s;e.stderr.write(`Known providers: ${oi.join(", ")}
2438
2438
  `)}}async function Q0(t,e,r,n={},s){let i=ya(t),o=i?Ea(t,"utf8"):"",a=o.split(`
2439
- `),l=a.map((m,h)=>/^\s*_MEMBER_(?:\s|$)/.test(m)?h:-1).filter(m=>m>=0);if(!l.length){let m=s?[s]:(await e.ask("Member aliases [Lead] (comma separated): ")||"Lead").split(",").map(h=>h.trim());for(let h of m)l.push(a.length),a.push(Dn("_MEMBER_","alias",h))}let c=new Set;for(let m of l){let h=a[m],y=ni(h,"alias");if(y||(y=await e.ask(`Alias for member on line ${m+1}: `)),!/^[A-Za-z][A-Za-z0-9_-]*$/.test(y)||c.has(y.toLowerCase()))throw new Error(`Invalid or duplicate alias: ${y}`);if(c.add(y.toLowerCase()),h=Dn(h,"alias",y),!ni(h,"teamfile")){let g=ni(h,"provider");g||(g=await z0(e,r));let p=st({alias:y,provider:g});if(p)throw new Error(p);if(h=Dn(h,"provider",g),!ni(h,"model")&&!ni(h,"sessionid")){let _=await(n.models??Ln)(g).catch(()=>[]);_.length&&r.stderr.write(`Models for ${g}:
2439
+ `),l=a.map((m,g)=>/^\s*_MEMBER_(?:\s|$)/.test(m)?g:-1).filter(m=>m>=0);if(!l.length){let m=s?[s]:(await e.ask("Member aliases [Lead] (comma separated): ")||"Lead").split(",").map(g=>g.trim());for(let g of m)l.push(a.length),a.push(Dn("_MEMBER_","alias",g))}let c=new Set;for(let m of l){let g=a[m],y=ni(g,"alias");if(y||(y=await e.ask(`Alias for member on line ${m+1}: `)),!/^[A-Za-z][A-Za-z0-9_-]*$/.test(y)||c.has(y.toLowerCase()))throw new Error(`Invalid or duplicate alias: ${y}`);if(c.add(y.toLowerCase()),g=Dn(g,"alias",y),!ni(g,"teamfile")){let h=ni(g,"provider");h||(h=await z0(e,r));let p=st({alias:y,provider:h});if(p)throw new Error(p);if(g=Dn(g,"provider",h),!ni(g,"model")&&!ni(g,"sessionid")){let _=await(n.models??Ln)(h).catch(()=>[]);_.length&&r.stderr.write(`Models for ${h}:
2440
2440
  ${_.map(w=>` ${w}`).join(`
2441
2441
  `)}
2442
- `);let E=await e.ask(`Model for ${y} (blank for provider default): `);E&&(h=Dn(h,"model",E))}}a[m]=h}let u=a.join(`
2442
+ `);let E=await e.ask(`Model for ${y} (blank for provider default): `);E&&(g=Dn(g,"model",E))}}a[m]=g}let u=a.join(`
2443
2443
  `),f=rn(u,si(t)),d=Hn(f,fu(t));if(d.length)throw new Error(d.map(m=>m.message).join(`
2444
2444
  `));if(i||(u=Yr({teamName:si(t,pu(t)),members:f.members})),u!==o){if(i&&Ea(t,"utf8")!==o)throw new Error("Teamfile changed while completing it; nothing was written.");KE(fu(t),{recursive:!0}),YE(t,u.endsWith(`
2445
2445
  `)?u:`${u}
@@ -2456,22 +2456,22 @@ ${_.map(w=>` ${w}`).join(`
2456
2456
  `),e.stdout.write(`Context is the last completed turn; unavailable values are n/a.
2457
2457
  `)}function iw(t){return t.running==="idle"&&t.ageMs!==null&&t.ageMs>=7*864e5&&t.context!==null&&t.context>=1e5}async function ow(t,e,r,n){return L(n,async s=>{if(Ze(s,t,e).busy)throw new Error(`${e} is busy; its session was not replaced.`);let i=St(s,{receiver_teamfile:t,receiver_alias:e,sender_teamfile:t,sender_alias:e,ttlMs:8*60*60*1e3});if(!i.acquired)throw new Error(`${e} is busy; its session was not replaced.`);try{let o=ae(t).members.find(a=>a.alias.toLowerCase()===e.toLowerCase());if(!o||o.session!==r)throw new Error("Session binding changed; refresh cancelled.");if((await Sa(o.provider,r)).running==="busy")throw new Error(`${e} is running; its session was not replaced.`);return await Tr(t,{...n,dal:s},{replaceSession:{alias:e,sessionid:r}})}finally{s.releaseAgentInflight(i.lease,i.leaseId)}})}var vr,aw=k(()=>{"use strict";Ae();pt();Su();de();vr=ct(tt(),1);et();gt()});var Qo={};se(Qo,{runInferred:()=>cO,runInferredBatch:()=>mw,sendInferredPrompt:()=>ci});import{existsSync as dw,mkdtempSync as rO,readFileSync as nO,rmSync as sO,writeFileSync as iO}from"node:fs";import{tmpdir as oO}from"node:os";import{resolve as Iu,join as lw}from"node:path";async function ci(t,e,r,n={}){let s=rO(lw(oO(),"lmctl-intent-prompt-")),i=lw(s,"prompt.txt");try{return iO(i,`${e}\r
2458
2458
  `,{encoding:"utf8",mode:384}),await(n.chat??Ws)([...t,"--prompt-file",i],r)}finally{sO(s,{recursive:!0,force:!0})}}async function cw(t,e,r,n,s){let i=await(s.rows??bu)(t,n,e);ba(i,n);for(let o of i)if(!(!o.file||!o.alias||!o.sessionid||!iw(o))&&(n.stdout.write(`${o.alias}: old and large (at least 7 days and 100,000 context tokens). A refresh starts a new context; the old transcript remains.
2459
- `),r.interactive&&await r.confirm(`Replace ${o.file}:${o.alias}'s session ${o.sessionid}?`))){let a=await(s.refresh??ow)(o.file,o.alias,o.sessionid,n);if(a)return a;ba(await(s.rows??bu)(t,n,e),n)}return 0}async function uw(t,e){if(t.startsWith("-"))throw new Error("Use an explicit command for options; no inferred action was taken.");return await e.confirm(`Is ${JSON.stringify(t)} the prompt to send?`)?t:null}async function lO(t,e,r,n,s,i){let o=t.indexOf("/"),a=o>0?t.slice(0,o):t,l=$o(a,oi),c=[];if(l.length){let d=await r.choose("Provider:",l);if(o<0&&e===void 0&&i===void 0)return(s.model??Ko)([],n,{selections:[{provider:d}]});let m=await(s.models??Ln)(d).catch(()=>[]),h;if(o>0){let y=t.slice(o+1);if(!y)throw new Error("A model name is required after provider/.");let g=$o(y,m);g.length?c.push(...g.map(p=>({provider:d,model:p}))):c.push({provider:d,model:y})}else{if(m.length?h=await r.choose("Model:",m):h=await r.ask(`Model for ${d}: `),!h)throw new Error("A model name is required.");c.push({provider:d,model:h})}}else{let d=await Promise.all(Xt.map(async h=>({provider:h,names:await(s.models??Ln)(h).catch(()=>[])}))),m=d.flatMap(({provider:h,names:y})=>y.filter(g=>g.toLowerCase()===t.toLowerCase()).map(g=>({provider:h,model:g})));if(c.push(...m.length?m:d.flatMap(({provider:h,names:y})=>$o(t,y).map(g=>({provider:h,model:g})))),!c.length)return null}if(i!==void 0){let d=await uw(i,r);if(d===null)return 0;e=d}if(e===void 0){let d=[...new Set(c.map(m=>m.provider))].map(m=>({provider:m,models:c.filter(h=>h.provider===m).map(h=>h.model)}));return(s.model??Ko)([],n,{selections:d})}let u=await r.choose("Prompt destination:",c.map(d=>`${d.provider}/${d.model}`)),f=c.find(d=>`${d.provider}/${d.model}`===u);return(s.script??da)(aO,[JSON.stringify({provider:f.provider,model:f.model,sessiondir:n.cwd??process.cwd()}),e],n,n.env??process.env)}async function mw(t,e,r,n={}){let s=new jr(r,n.ask);try{let i=Iu(r.cwd??process.cwd(),t);if(!dw(i))throw new Error(`Batch file not found: ${i}`);if(!nO(i,"utf8").trim())throw new Error(`Batch file has no prompts: ${i}`);if(e.length>2||e.some(c=>c.startsWith("-")))throw new Error("Expected .lmb [teamfile [alias]]; force/yes flags are not allowed in inferred mode.");let o=e[0]?Iu(r.cwd??process.cwd(),e[0]):await zE(s,r.cwd??process.cwd()),a=await hu(o,s,r,n,e[1]);if(a)return a;let l=await wa(o,e[1],s);return(n.batch??xu)([o,l,i],r)}catch(i){return r.stderr.write(`error: ${i instanceof Error?i.message:String(i)}
2460
- `),2}finally{s.close()}}async function cO(t,e,r={}){let n=new jr(e,r.ask);try{let s=R_(t);if(!s)return null;if(s.kind==="batch")return n.close(),mw(s.file,s.rest,e,r);if(s.kind==="models")return await lO(s.query,s.prompt,n,e,r,s.pendingPrompt);if(s.pendingPrompt!==void 0){let c=await uw(s.pendingPrompt,n);if(c===null)return 0;s.prompt=c}if(s.kind==="team"){let c=Iu(e.cwd??process.cwd(),s.file),u=s.alias;if(dw(c)&&(u!==void 0||s.prompt!==void 0)){let d=ae(c);if(!d.parseErrors.length&&d.members.length){u=await wa(c,u,n);let m=d.members.find(h=>h.alias===u);if(s.prompt!==void 0&&(m.session||m.teamfile))return await ci([c,u],s.prompt,e,r)}}let f=await hu(c,n,e,r,u);return f||(u=u!==void 0||s.prompt!==void 0?await wa(c,u,n):void 0,s.prompt!==void 0?await ci([c,u],s.prompt,e,r):await cw(c,u,n,e,r))}let i=await(r.registrations??sw)(s.id,e);if(i.length){let c=await n.choose("Registered session:",i.map(f=>`${f.file}:${f.member.alias}`)),u=i.find(f=>`${f.file}:${f.member.alias}`===c);return s.prompt!==void 0?await ci([u.file,u.member.alias],s.prompt,e,r):await cw(u.file,u.member.alias,n,e,r)}let o=await(r.findProviders??Rt)(s.id),a=o.length?await n.choose("Session provider:",o):await n.choose("Session provider:",oi),l=await(r.summary??Sa)(a,s.id);return s.prompt!==void 0?await ci(["--provider",a,s.id],s.prompt,{...e,cwd:l.sessiondir??e.cwd},r):(ba([l],e),await QE(s.id,a,l.model,e.cwd??process.cwd(),n,e,l.sessiondir),0)}catch(s){return e.stderr.write(`error: ${s instanceof Error?s.message:String(s)}
2459
+ `),r.interactive&&await r.confirm(`Replace ${o.file}:${o.alias}'s session ${o.sessionid}?`))){let a=await(s.refresh??ow)(o.file,o.alias,o.sessionid,n);if(a)return a;ba(await(s.rows??bu)(t,n,e),n)}return 0}async function uw(t,e){if(t.startsWith("-"))throw new Error("Use an explicit command for options; no inferred action was taken.");return await e.confirm(`Is ${JSON.stringify(t)} the prompt to send?`)?t:null}async function lO(t,e,r,n,s,i){let o=t.indexOf("/"),a=o>0?t.slice(0,o):t,l=$o(a,oi),c=[];if(l.length){let d=await r.choose("Provider:",l);if(o<0&&e===void 0&&i===void 0)return(s.model??Ko)([],n,{selections:[{provider:d}]});let m=await(s.models??Ln)(d).catch(()=>[]),g;if(o>0){let y=t.slice(o+1);if(!y)throw new Error("A model name is required after provider/.");let h=$o(y,m);h.length?c.push(...h.map(p=>({provider:d,model:p}))):c.push({provider:d,model:y})}else{if(m.length?g=await r.choose("Model:",m):g=await r.ask(`Model for ${d}: `),!g)throw new Error("A model name is required.");c.push({provider:d,model:g})}}else{let d=await Promise.all(Xt.map(async g=>({provider:g,names:await(s.models??Ln)(g).catch(()=>[])}))),m=d.flatMap(({provider:g,names:y})=>y.filter(h=>h.toLowerCase()===t.toLowerCase()).map(h=>({provider:g,model:h})));if(c.push(...m.length?m:d.flatMap(({provider:g,names:y})=>$o(t,y).map(h=>({provider:g,model:h})))),!c.length)return null}if(i!==void 0){let d=await uw(i,r);if(d===null)return 0;e=d}if(e===void 0){let d=[...new Set(c.map(m=>m.provider))].map(m=>({provider:m,models:c.filter(g=>g.provider===m).map(g=>g.model)}));return(s.model??Ko)([],n,{selections:d})}let u=await r.choose("Prompt destination:",c.map(d=>`${d.provider}/${d.model}`)),f=c.find(d=>`${d.provider}/${d.model}`===u);return(s.script??da)(aO,[JSON.stringify({provider:f.provider,model:f.model,sessiondir:n.cwd??process.cwd()}),e],n,n.env??process.env)}async function mw(t,e,r,n={}){let s=new jr(r,n.ask);try{let i=Iu(r.cwd??process.cwd(),t);if(!dw(i))throw new Error(`Batch file not found: ${i}`);if(!nO(i,"utf8").trim())throw new Error(`Batch file has no prompts: ${i}`);if(e.length>2||e.some(c=>c.startsWith("-")))throw new Error("Expected .lmb [teamfile [alias]]; force/yes flags are not allowed in inferred mode.");let o=e[0]?Iu(r.cwd??process.cwd(),e[0]):await zE(s,r.cwd??process.cwd()),a=await hu(o,s,r,n,e[1]);if(a)return a;let l=await wa(o,e[1],s);return(n.batch??xu)([o,l,i],r)}catch(i){return r.stderr.write(`error: ${i instanceof Error?i.message:String(i)}
2460
+ `),2}finally{s.close()}}async function cO(t,e,r={}){let n=new jr(e,r.ask);try{let s=R_(t);if(!s)return null;if(s.kind==="batch")return n.close(),mw(s.file,s.rest,e,r);if(s.kind==="models")return await lO(s.query,s.prompt,n,e,r,s.pendingPrompt);if(s.pendingPrompt!==void 0){let c=await uw(s.pendingPrompt,n);if(c===null)return 0;s.prompt=c}if(s.kind==="team"){let c=Iu(e.cwd??process.cwd(),s.file),u=s.alias;if(dw(c)&&(u!==void 0||s.prompt!==void 0)){let d=ae(c);if(!d.parseErrors.length&&d.members.length){u=await wa(c,u,n);let m=d.members.find(g=>g.alias===u);if(s.prompt!==void 0&&(m.session||m.teamfile))return await ci([c,u],s.prompt,e,r)}}let f=await hu(c,n,e,r,u);return f||(u=u!==void 0||s.prompt!==void 0?await wa(c,u,n):void 0,s.prompt!==void 0?await ci([c,u],s.prompt,e,r):await cw(c,u,n,e,r))}let i=await(r.registrations??sw)(s.id,e);if(i.length){let c=await n.choose("Registered session:",i.map(f=>`${f.file}:${f.member.alias}`)),u=i.find(f=>`${f.file}:${f.member.alias}`===c);return s.prompt!==void 0?await ci([u.file,u.member.alias],s.prompt,e,r):await cw(u.file,u.member.alias,n,e,r)}let o=await(r.findProviders??Rt)(s.id),a=o.length?await n.choose("Session provider:",o):await n.choose("Session provider:",oi),l=await(r.summary??Sa)(a,s.id);return s.prompt!==void 0?await ci(["--provider",a,s.id],s.prompt,{...e,cwd:l.sessiondir??e.cwd},r):(ba([l],e),await QE(s.id,a,l.model,e.cwd??process.cwd(),n,e,l.sessiondir),0)}catch(s){return e.stderr.write(`error: ${s instanceof Error?s.message:String(s)}
2461
2461
  `),2}finally{n.close()}}var aO,Zo=k(()=>{"use strict";Ae();Ed();N_();Yo();Hs();ku();lu();pt();ZE();aw();aO=`member = json_parse(args[0]);
2462
2462
  result = lm_agent(member, args[1]);
2463
2463
  if (result.reply != "") { println(result.reply); }
2464
2464
  if (result.status != "ok") { lm_error(str(result.error)); lm_exit(1); }
2465
2465
  println("Session: " + member.sessionid);`});var hw={};se(hw,{runBatch:()=>xu});import{readFileSync as dO}from"node:fs";async function xu(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(fw),0;let r=oe(t,[],["--legacy","--single"]);if(r.error!==void 0)return A(e,r.error);if(r.positionals.length===1&&/\.lmb$/i.test(r.positionals[0])&&Object.keys(r.flags).length===0){let{runInferredBatch:_}=await Promise.resolve().then(()=>(Zo(),Qo));return _(r.positionals[0],[],e)}if(r.positionals.length!==3)return A(e,fw.trimEnd());let[n,s,i]=r.positionals,o=r.flags["--legacy"]===!0,a=r.flags["--single"]===!0,l,c;try{let _=dO(i,"utf8").replace(/^\uFEFF/u,"").replace(/\r\n?/gu,`
2466
- `);if(l=a?[_.trim()].filter(E=>E.length>0):_.split(/\n\s*\n/u).map(E=>E.trim()).filter(Boolean),l.length===0)return A(e,`batch: ${i}: no prompts found`);c=he(n,s,e.dal)}catch(_){return A(e,`batch: ${_ instanceof Error?_.message:String(_)}`)}let u=!o&&l.length>1&&await fO(c),f={...e.env??process.env},d=await pO(e,{member:c,batchfile:i,promptCount:l.length,parentInvocationId:nr(f.LMCTL_INVOCATION_ID)}),m={status:"error",error:"batch exited without a terminal outcome"},h=_=>{m=_},y=_=>{d!==null&&(gO(e,d,{status:"cancelled",signal:_,error:`batch interrupted by ${_}`}),process.exit(_==="SIGINT"?130:143))},g=()=>y("SIGINT"),p=()=>y("SIGTERM");d!==null&&(f.LMCTL_INVOCATION_ID=String(d),process.once("SIGINT",g),process.once("SIGTERM",p)),e.stderr.write(`batch ${We()}: starting ${l.length} prompt${l.length===1?"":"s"} -> ${c.alias} (teamfile=${n} input=${i})
2467
- `);try{return u?await uO(e,{member:c,prompts:l,env:f,setRootFinish:h,teamfile:n,batchfile:i}):await Au(e,{member:c,prompts:l,env:f,setRootFinish:h,teamfile:n,batchfile:i})}finally{d!==null&&(process.removeListener("SIGINT",g),process.removeListener("SIGTERM",p),await hO(e,d,m))}}async function Au(t,e){let{member:r,prompts:n,env:s}=e;for(let[i,o]of n.entries()){t.stderr.write(`batch ${We()}: prompt ${i+1}/${n.length} -> ${r.alias}
2466
+ `);if(l=a?[_.trim()].filter(E=>E.length>0):_.split(/\n\s*\n/u).map(E=>E.trim()).filter(Boolean),l.length===0)return A(e,`batch: ${i}: no prompts found`);c=he(n,s,e.dal)}catch(_){return A(e,`batch: ${_ instanceof Error?_.message:String(_)}`)}let u=!o&&l.length>1&&await fO(c),f={...e.env??process.env},d=await pO(e,{member:c,batchfile:i,promptCount:l.length,parentInvocationId:nr(f.LMCTL_INVOCATION_ID)}),m={status:"error",error:"batch exited without a terminal outcome"},g=_=>{m=_},y=_=>{d!==null&&(gO(e,d,{status:"cancelled",signal:_,error:`batch interrupted by ${_}`}),process.exit(_==="SIGINT"?130:143))},h=()=>y("SIGINT"),p=()=>y("SIGTERM");d!==null&&(f.LMCTL_INVOCATION_ID=String(d),process.once("SIGINT",h),process.once("SIGTERM",p)),e.stderr.write(`batch ${We()}: starting ${l.length} prompt${l.length===1?"":"s"} -> ${c.alias} (teamfile=${n} input=${i})
2467
+ `);try{return u?await uO(e,{member:c,prompts:l,env:f,setRootFinish:g,teamfile:n,batchfile:i}):await Au(e,{member:c,prompts:l,env:f,setRootFinish:g,teamfile:n,batchfile:i})}finally{d!==null&&(process.removeListener("SIGINT",h),process.removeListener("SIGTERM",p),await hO(e,d,m))}}async function Au(t,e){let{member:r,prompts:n,env:s}=e;for(let[i,o]of n.entries()){t.stderr.write(`batch ${We()}: prompt ${i+1}/${n.length} -> ${r.alias}
2468
2468
  `);let a=mt(t,l=>`batch ${We()}: prompt ${i+1}/${n.length} still running (${l}s elapsed)
2469
2469
  `);try{let l=await Ur({teamfile:r.teamfile,alias:r.alias,prompt:o,expectedSession:{provider:r.provider,sessionid:r.sessionid},permissionMode:"yolo",env:{...s},messageType:"batch",...e.heldLease!==void 0?{heldLease:e.heldLease}:{},...e.bundleSession!==void 0?{bundleSession:e.bundleSession}:{},io:t,onEvent:c=>{a.poke(),c.kind==="warning"&&t.stderr.write(c.message)}});if((l.status==="ok"||l.status==="stalled"||l.status==="empty")&&l.replyText&&t.stdout.write(`${l.replyText}${l.replyText.endsWith(`
2470
2470
  `)?"":`
2471
2471
  `}
2472
2472
  `),l.status!=="ok"){let c=l.status==="stalled"?"provider stalled":l.status==="empty"?"provider returned no content and no observed activity for this turn":l.message,u=`batch: stopped at prompt ${i+1}/${n.length} (${i} completed): ${c}; later prompts were not sent`;return e.setRootFinish({status:l.status==="busy"?"busy":"error",exit_code:1,error:u,result_summary:`${i}/${n.length} prompts completed`}),A(t,u)}}catch(l){let c=`batch: stopped at prompt ${i+1}/${n.length} (${i} completed): ${l instanceof Error?l.message:String(l)}; later prompts were not sent`;return e.setRootFinish({status:"error",exit_code:1,error:c,result_summary:`${i}/${n.length} prompts completed`}),A(t,c)}finally{a.stop()}}return t.stderr.write(`batch ${We()}: completed ${n.length}/${n.length} prompts
2473
2473
  `),e.setRootFinish({status:"done",exit_code:0,result_summary:`batch completed ${n.length}/${n.length} prompts`}),0}async function uO(t,e){let{member:r,prompts:n,env:s}=e,i=await L(t,d=>(mn(d,r.teamfile,r.alias),Ze(d,r.teamfile,r.alias)));if(i.busy){let d=i.reason==="in-flight"?`${r.alias} is servicing ${i.inFlight.sender_alias} (${i.inFlight.sender_teamfile}) since ${i.inFlight.started_at} \u2014 wait and retry`:i.source==="terminal-lock"?Fr(i.terminalLock):`${r.alias} is busy (interactive terminal); wait and retry`;return e.setRootFinish({status:"busy",exit_code:1,error:d,result_summary:"0 prompts completed"}),A(t,`batch: cannot start bundle: ${d}`)}let o=await L(t,d=>mO(s,d)),a=await L(t,d=>St(d,{receiver_teamfile:r.teamfile,receiver_alias:r.alias,sender_teamfile:o?.teamfile??r.teamfile,sender_alias:o?.alias??"operator",ttlMs:vt()}));if(!a.acquired){let d=`${r.alias} is servicing ${a.current.sender_alias} (${a.current.sender_teamfile}) since ${a.current.started_at} \u2014 wait and retry`;return e.setRootFinish({status:"busy",exit_code:1,error:d,result_summary:"0 prompts completed"}),A(t,`batch: cannot start bundle: ${d}`)}let l={row:a.lease,leaseId:a.leaseId},c=ln(d=>L(t,m=>m.heartbeatAgentInflight(l.row,l.leaseId,d))),u,f=mt(t,d=>`batch ${We()}: opening provider session (${d}s elapsed)
2474
- `);try{let d={...s};try{let m=await L(t,h=>h.getRootTeam(r.teamfile)?.name??null);m!==null&&(d.LMBEE_TEAM_NAME=m)}catch{}u=await ks({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,env:d,...r.model!==void 0?{model:r.model}:{},...r.effort!==void 0?{effort:r.effort}:{},alias:r.alias,isLead:r.isLead,permissionMode:"yolo",holdOpen:Ls(t,{teamfile:r.teamfile,alias:r.alias},d)})}catch{return clearInterval(c),await pw(t,l),Au(t,{member:r,prompts:n,env:s,setRootFinish:e.setRootFinish,teamfile:e.teamfile,batchfile:e.batchfile})}finally{f.stop()}try{return await Au(t,{member:r,prompts:n,env:s,setRootFinish:e.setRootFinish,teamfile:e.teamfile,batchfile:e.batchfile,heldLease:l,bundleSession:u})}finally{await u.close(),clearInterval(c),await pw(t,l)}}async function pw(t,e){try{await L(t,r=>{r.releaseAgentInflight(e.row,e.leaseId)})}catch(r){t.stderr.write(`warning: failed to release batch bundle lease: ${r instanceof Error?r.message:String(r)}
2474
+ `);try{let d={...s};try{let m=await L(t,g=>g.getRootTeam(r.teamfile)?.name??null);m!==null&&(d.LMBEE_TEAM_NAME=m)}catch{}u=await ks({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,env:d,...r.model!==void 0?{model:r.model}:{},...r.effort!==void 0?{effort:r.effort}:{},alias:r.alias,isLead:r.isLead,permissionMode:"yolo",holdOpen:Ls(t,{teamfile:r.teamfile,alias:r.alias},d)})}catch{return clearInterval(c),await pw(t,l),Au(t,{member:r,prompts:n,env:s,setRootFinish:e.setRootFinish,teamfile:e.teamfile,batchfile:e.batchfile})}finally{f.stop()}try{return await Au(t,{member:r,prompts:n,env:s,setRootFinish:e.setRootFinish,teamfile:e.teamfile,batchfile:e.batchfile,heldLease:l,bundleSession:u})}finally{await u.close(),clearInterval(c),await pw(t,l)}}async function pw(t,e){try{await L(t,r=>{r.releaseAgentInflight(e.row,e.leaseId)})}catch(r){t.stderr.write(`warning: failed to release batch bundle lease: ${r instanceof Error?r.message:String(r)}
2475
2475
  `)}}function mO(t,e){let r=xn(t,e);if(r.ok)return Wt(r.identity);if(r.reason==="unset")return null;throw new Error(Bt("batch"))}async function fO(t){let e=t.provider.trim().toLowerCase();return bn.includes(e)||pn().tools[e]?.agent!==void 0||!Mr.includes(e)?!1:In().includes(e)}async function pO(t,e){try{let{member:r}=e;return await L(t,n=>n.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:r.teamfile,from_identity:`${r.teamfile}:batch`,target_teamfile:r.teamfile,target_alias:r.alias,root_teamfile:r.teamfile,cwd:r.sessiondir,command:`lmctl batch ${r.teamfile} ${r.alias} ${e.batchfile}`,holder_pid:process.pid,launch_source:"exec",parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({batchfile:e.batchfile,prompt_count:e.promptCount,provider:r.provider,sessionid:r.sessionid,...r.model!==void 0?{model:r.model}:{}})}).id)}catch(r){return t.stderr.write(`warning: failed to start batch root invocation: ${r instanceof Error?r.message:String(r)}
2476
2476
  `),null}}async function hO(t,e,r){try{await L(t,n=>{n.finishTrackedInvocation(e,r)})}catch(n){t.stderr.write(`warning: failed to finish batch root invocation: ${n instanceof Error?n.message:String(n)}
2477
2477
  `)}}function gO(t,e,r){try{if(t.dal!==void 0){t.dal.finishTrackedInvocation(e,r);return}let n=ut({path:Ee()});try{n.finishTrackedInvocation(e,r)}finally{n.close()}}catch{}}var fw,ku=k(()=>{"use strict";Mo();de();_t();Oe();tr();et();Zn();Vn();Rs();kn();Ns();ts();Oo();jt();fw=`usage: lmctl batch <teamfile> <alias> <batchfile> [--legacy] [--single]
@@ -2536,7 +2536,7 @@ Available Functions (by module):
2536
2536
  `}}}return e+=`
2537
2537
  Use 'lmctl script help <function>' for parameter details, return types, and examples.
2538
2538
  Use 'lmctl script help <module>' to inspect a module.
2539
- `,e}async function yO(t,e={stdout:process.stdout,stderr:process.stderr}){if(ji(e),t.length===0)return A(e,Ru.trimEnd());if(t[0]==="help"){let c=ti(e,[],new qt,e.env);if(t.length===1)return e.stdout.write(Nu(c)),0;let u=t[1],f=c.getModule(u);if(f)return e.stdout.write(yw(c,f)),0;let d=c.getFunctionDoc(u);return d?(e.stdout.write(_w(d)),0):A(e,`script: function '${u}' not found. Run 'lmctl script help' to see all available functions.`)}if(t[0]==="--help"||t[0]==="-h"){let c=ti(e,[],new qt,e.env);return e.stdout.write(Nu(c)),0}let r,n=!1,s,i=[],o=0;for(;o<t.length;){let c=t[o];if(c==="-e"){if(o+1>=t.length)return A(e,"script: -e requires a code argument");r=t[o+1],o+=2,i.push(...t.slice(o));break}else if(c==="--check"||c==="--dry-run")n=!0,o++;else{if(c.startsWith("-")&&c!=="-")return A(e,`script: unknown flag: ${c}`);s=c,i.push(...t.slice(o+1));break}}let a,l=s&&s!=="-"?_O(s):void 0;if(r!==void 0)a=r;else if(s!==void 0)if(s==="-")try{e.stdin&&typeof e.stdin.on=="function"?a=await new Promise((c,u)=>{let f="";e.stdin.on("data",d=>{f+=d}),e.stdin.on("end",()=>c(f)),e.stdin.on("error",u)}):a=gw(0,"utf8")}catch(c){return A(e,`script: failed to read standard input: ${c?.message||String(c)}`)}else try{a=gw(s,"utf8")}catch(c){return A(e,`script: ${c?.message||String(c)}`)}else return A(e,Ru.trimEnd());if(n){let c=new qt,u=ti(e,i,c,e.env),{diagnostics:f}=u.scanAndCheck(a,{file:l});if(f.filter(m=>m.severity==="error").length>0){for(let m of f){let h=m.file?`${m.file}:${m.line}:${m.column}`:`${m.line}:${m.column}`;e.stderr.write(`error:${h}: ${m.message}
2539
+ `,e}async function yO(t,e={stdout:process.stdout,stderr:process.stderr}){if(ji(e),t.length===0)return A(e,Ru.trimEnd());if(t[0]==="help"){let c=ti(e,[],new qt,e.env);if(t.length===1)return e.stdout.write(Nu(c)),0;let u=t[1],f=c.getModule(u);if(f)return e.stdout.write(yw(c,f)),0;let d=c.getFunctionDoc(u);return d?(e.stdout.write(_w(d)),0):A(e,`script: function '${u}' not found. Run 'lmctl script help' to see all available functions.`)}if(t[0]==="--help"||t[0]==="-h"){let c=ti(e,[],new qt,e.env);return e.stdout.write(Nu(c)),0}let r,n=!1,s,i=[],o=0;for(;o<t.length;){let c=t[o];if(c==="-e"){if(o+1>=t.length)return A(e,"script: -e requires a code argument");r=t[o+1],o+=2,i.push(...t.slice(o));break}else if(c==="--check"||c==="--dry-run")n=!0,o++;else{if(c.startsWith("-")&&c!=="-")return A(e,`script: unknown flag: ${c}`);s=c,i.push(...t.slice(o+1));break}}let a,l=s&&s!=="-"?_O(s):void 0;if(r!==void 0)a=r;else if(s!==void 0)if(s==="-")try{e.stdin&&typeof e.stdin.on=="function"?a=await new Promise((c,u)=>{let f="";e.stdin.on("data",d=>{f+=d}),e.stdin.on("end",()=>c(f)),e.stdin.on("error",u)}):a=gw(0,"utf8")}catch(c){return A(e,`script: failed to read standard input: ${c?.message||String(c)}`)}else try{a=gw(s,"utf8")}catch(c){return A(e,`script: ${c?.message||String(c)}`)}else return A(e,Ru.trimEnd());if(n){let c=new qt,u=ti(e,i,c,e.env),{diagnostics:f}=u.scanAndCheck(a,{file:l});if(f.filter(m=>m.severity==="error").length>0){for(let m of f){let g=m.file?`${m.file}:${m.line}:${m.column}`:`${m.line}:${m.column}`;e.stderr.write(`error:${g}: ${m.message}
2540
2540
  `)}return 2}return 0}return da(a,i,e,e.env,l)}var Ru,Ia,ww=k(()=>{"use strict";de();lu();Ru=`usage: lmctl script [flags] <scriptfile> [args...]
2541
2541
  lmctl script [flags] -e '<code>' [args...]
2542
2542
  lmctl script [flags] - [args...]
@@ -2552,7 +2552,7 @@ Flags:
2552
2552
  -e <code> Execute inline script code
2553
2553
  --check, --dry-run Scan and check script without executing host effects
2554
2554
  -h, --help Show this help message and function listing
2555
- `,Ia=["Language Constructs","lmctl Automation","Strings","Lists & Arrays","Maps & Key-Value","File I/O","JSON & Data","Math","System & Process"]});import{mkdtempSync as EO,readFileSync as wO,rmSync as TO,writeFileSync as vO}from"node:fs";import{tmpdir as SO}from"node:os";import{spawnSync as bO}from"node:child_process";import{basename as xa,extname as Lu,join as Cu,resolve as Ou}from"node:path";import*as Tw from"node:readline";function IO(t){return e=>{let r=t.EDITOR??t.VISUAL??"vi";bO(r,[e],{stdio:"inherit"})}}async function vw(t){let{io:e,cwd:r,env:n=process.env}=t,s=t.initial??{},i=Tw.createInterface({input:t.input,output:e.stdout,terminal:!1}),o=[],a=[];i.on("line",f=>{let d=a.shift();d!==void 0?d(f):o.push(f)});let l=!1;i.on("close",()=>{for(l=!0;a.length>0;)a.shift()("")});let c=async f=>{e.stdout.write(f);let d=o.shift();return d!==void 0?d.trim():l?"":new Promise(m=>a.push(h=>m(h.trim())))},u=()=>i.close();try{let f,d;if(s.output!==void 0)f=Ou(r,s.output),d=xa(f,Lu(f));else{let p=Ou(r,t.directory??"."),_=await c(`Directory [${p}]: `),E=_===""?p:Ou(r,_),w=`${xa(E)}.lmctl`,S=await c(`Teamfile name [${w}]: `),T=S===""?w:S,b=Lu(T)?T:`${T}.lmctl`;f=Cu(E,b),d=xa(b,Lu(b))}let m;if(s.members!==void 0&&s.members.length>0)m=s.members.map(p=>({...p,model:p.model??s.model}));else{let p=Ot(t.initConfigPath),_=[...new Set(p===null?[]:Object.values(p).map(v=>v.provider))];e.stdout.write(`Providers from lmctl init: ${_.length>0?_.join(", "):"(none saved; run lmctl init to save suggestions)"}
2555
+ `,Ia=["Language Constructs","lmctl Automation","Strings","Lists & Arrays","Maps & Key-Value","File I/O","JSON & Data","Math","System & Process"]});import{mkdtempSync as EO,readFileSync as wO,rmSync as TO,writeFileSync as vO}from"node:fs";import{tmpdir as SO}from"node:os";import{spawnSync as bO}from"node:child_process";import{basename as xa,extname as Lu,join as Cu,resolve as Ou}from"node:path";import*as Tw from"node:readline";function IO(t){return e=>{let r=t.EDITOR??t.VISUAL??"vi";bO(r,[e],{stdio:"inherit"})}}async function vw(t){let{io:e,cwd:r,env:n=process.env}=t,s=t.initial??{},i=Tw.createInterface({input:t.input,output:e.stdout,terminal:!1}),o=[],a=[];i.on("line",f=>{let d=a.shift();d!==void 0?d(f):o.push(f)});let l=!1;i.on("close",()=>{for(l=!0;a.length>0;)a.shift()("")});let c=async f=>{e.stdout.write(f);let d=o.shift();return d!==void 0?d.trim():l?"":new Promise(m=>a.push(g=>m(g.trim())))},u=()=>i.close();try{let f,d;if(s.output!==void 0)f=Ou(r,s.output),d=xa(f,Lu(f));else{let p=Ou(r,t.directory??"."),_=await c(`Directory [${p}]: `),E=_===""?p:Ou(r,_),w=`${xa(E)}.lmctl`,S=await c(`Teamfile name [${w}]: `),T=S===""?w:S,b=Lu(T)?T:`${T}.lmctl`;f=Cu(E,b),d=xa(b,Lu(b))}let m;if(s.members!==void 0&&s.members.length>0)m=s.members.map(p=>({...p,model:p.model??s.model}));else{let p=Ot(t.initConfigPath),_=[...new Set(p===null?[]:Object.values(p).map(v=>v.provider))];e.stdout.write(`Providers from lmctl init: ${_.length>0?_.join(", "):"(none saved; run lmctl init to save suggestions)"}
2556
2556
  `),e.stdout.write(`You can type another provider.
2557
2557
  `);let E=s.provider??(_.length===1?_[0]:void 0),w=E;for(;w===void 0;){let v=await c(`Default provider${E!==void 0?` [${E}]`:""}: `),x=v===""?E:v;if(x===void 0){if(l)return e.stderr.write(`error: stdin closed (EOF) at the provider prompt and no default is available
2558
2558
  `),u(),null;continue}if(st({alias:"Probe",provider:x})!==void 0){e.stdout.write(`unknown provider "${x}" (known: ${Object.keys(pa).join(", ")})
@@ -2570,25 +2570,25 @@ Flags:
2570
2570
  `),M.length===0&&e.stdout.write(` No model suggestions available.
2571
2571
  `);for(let _e of M)e.stdout.write(` ${_e}
2572
2572
  `);e.stdout.write(`Type a model name, including one not listed, or leave blank to ${s.model!==void 0?"keep the default":"omit"}.
2573
- `);let P=s.model,q=await c(`Model for ${v}${P!==void 0?` [${P}]`:" (blank to omit)"}: `),V=q===""?P:q;m.push({alias:v,provider:I,...V!==void 0?{model:V}:{}})}}let h=Yr({teamName:d,members:m}),y=t.editFile??IO(n),g=s.seed??!0;for(;;){e.stdout.write(`
2573
+ `);let P=s.model,q=await c(`Model for ${v}${P!==void 0?` [${P}]`:" (blank to omit)"}: `),V=q===""?P:q;m.push({alias:v,provider:I,...V!==void 0?{model:V}:{}})}}let g=Yr({teamName:d,members:m}),y=t.editFile??IO(n),h=s.seed??!0;for(;;){e.stdout.write(`
2574
2574
  --- ${f} ---
2575
- ${h}---
2576
- `);let p=(await c(`Write and seed? [${g?"Y/n":"y/N"}/e(dit)]: `)).toLowerCase();if(p==="e"||p==="edit"){let E=EO(Cu(SO(),"lmctl-plan-edit-"));try{let w=Cu(E,xa(f));vO(w,h,"utf8"),y(w),h=wO(w,"utf8")}finally{TO(E,{recursive:!0,force:!0})}continue}if(p==="q"||p==="quit"||p==="abort")return u(),null;let _=p===""?g:p!=="n"&&p!=="no";return u(),{destPath:f,text:h,seed:_}}}catch(f){throw u(),f}}function Sw(t){return ga(t)}var bw=k(()=>{"use strict";du();Mn();$d();gt();_a()});var Cw={};se(Cw,{readPlanSource:()=>Sr,runPlan:()=>OO});import{existsSync as kw,mkdirSync as xO,readdirSync as kO,readFileSync as Iw,statSync as AO,writeFileSync as RO}from"node:fs";import{basename as Aw,dirname as NO,extname as LO,join as Rw,resolve as Du}from"node:path";async function OO(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(CO),0;let n=[],s=[];for(let I=0;I<t.length;I+=1){let R=t[I];if(R==="--member"){let M=t[I+1];if(M===void 0||M.startsWith("--"))return e.stderr.write(`error: missing value for --member
2575
+ ${g}---
2576
+ `);let p=(await c(`Write and seed? [${h?"Y/n":"y/N"}/e(dit)]: `)).toLowerCase();if(p==="e"||p==="edit"){let E=EO(Cu(SO(),"lmctl-plan-edit-"));try{let w=Cu(E,xa(f));vO(w,g,"utf8"),y(w),g=wO(w,"utf8")}finally{TO(E,{recursive:!0,force:!0})}continue}if(p==="q"||p==="quit"||p==="abort")return u(),null;let _=p===""?h:p!=="n"&&p!=="no";return u(),{destPath:f,text:g,seed:_}}}catch(f){throw u(),f}}function Sw(t){return ga(t)}var bw=k(()=>{"use strict";du();Mn();$d();gt();_a()});var Cw={};se(Cw,{readPlanSource:()=>Sr,runPlan:()=>OO});import{existsSync as kw,mkdirSync as xO,readdirSync as kO,readFileSync as Iw,statSync as AO,writeFileSync as RO}from"node:fs";import{basename as Aw,dirname as NO,extname as LO,join as Rw,resolve as Du}from"node:path";async function OO(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(CO),0;let n=[],s=[];for(let I=0;I<t.length;I+=1){let R=t[I];if(R==="--member"){let M=t[I+1];if(M===void 0||M.startsWith("--"))return e.stderr.write(`error: missing value for --member
2577
2577
  `),2;n.push(M),I+=1;continue}s.push(R)}let i=oe(s,["--pattern","--provider","--model","--from","--output"],["--json","--stdout","--force","--seed","--no-seed","--wizard","--non-interactive","--no-interactive"]);if(i.error!==void 0)return e.stderr.write(`error: ${i.error}
2578
2578
  `),e.stderr.write(`usage: lmctl plan [directory] [options]
2579
2579
  `),2;if(i.positionals.length>1)return e.stderr.write(`usage: lmctl plan [directory] [options]
2580
- `),2;let o=e.cwd??process.cwd(),a=i.positionals[0],l=W(i,"--pattern"),c=W(i,"--provider"),u=W(i,"--model"),f=W(i,"--from"),d=W(i,"--output"),m=H(i,"--json"),h=H(i,"--stdout"),y=H(i,"--force"),g=H(i,"--seed"),p=H(i,"--no-seed"),_=H(i,"--wizard"),E=H(i,"--non-interactive")||H(i,"--no-interactive");if(m&&h)return e.stderr.write(`error: --json and --stdout are mutually exclusive
2581
- `),2;if(h&&g)return e.stderr.write(`error: --seed requires a written teamfile; it cannot be combined with --stdout
2582
- `),2;if(g&&p)return e.stderr.write(`error: --seed and --no-seed are mutually exclusive
2583
- `),2;if(_&&h)return e.stderr.write(`error: --wizard cannot be combined with --stdout
2580
+ `),2;let o=e.cwd??process.cwd(),a=i.positionals[0],l=W(i,"--pattern"),c=W(i,"--provider"),u=W(i,"--model"),f=W(i,"--from"),d=W(i,"--output"),m=H(i,"--json"),g=H(i,"--stdout"),y=H(i,"--force"),h=H(i,"--seed"),p=H(i,"--no-seed"),_=H(i,"--wizard"),E=H(i,"--non-interactive")||H(i,"--no-interactive");if(m&&g)return e.stderr.write(`error: --json and --stdout are mutually exclusive
2581
+ `),2;if(g&&h)return e.stderr.write(`error: --seed requires a written teamfile; it cannot be combined with --stdout
2582
+ `),2;if(h&&p)return e.stderr.write(`error: --seed and --no-seed are mutually exclusive
2583
+ `),2;if(_&&g)return e.stderr.write(`error: --wizard cannot be combined with --stdout
2584
2584
  `),2;if(_&&m)return e.stderr.write(`error: --wizard cannot be combined with --json
2585
- `),2;let w=l!==void 0||c!==void 0||u!==void 0||f!==void 0||n.length>0,S=e.stdin??process.stdin,T=r.stdinIsTTY??(e.stdin===void 0?process.stdin.isTTY===!0:S.isTTY===!0),b=_||!E&&!w&&!h&&!m&&T,v;if(b){if(f!==void 0)return e.stderr.write(`error: --from cannot be combined with --wizard
2585
+ `),2;let w=l!==void 0||c!==void 0||u!==void 0||f!==void 0||n.length>0,S=e.stdin??process.stdin,T=r.stdinIsTTY??(e.stdin===void 0?process.stdin.isTTY===!0:S.isTTY===!0),b=_||!E&&!w&&!g&&!m&&T,v;if(b){if(f!==void 0)return e.stderr.write(`error: --from cannot be combined with --wizard
2586
2586
  `),2;if(l!==void 0&&n.length>0)return e.stderr.write(`error: --pattern and --member are mutually exclusive
2587
2587
  `),2;let I=Lw(n,u,R=>{e.stderr.write(`error: ${R}
2588
2588
  `)});if(I.error!==void 0)return 1;v=await MO(e,S,o,a,{provider:c,model:u,pattern:l,members:I.members,seed:!p,output:d},r)}else{if(!w)return e.stderr.write(`error: ${Nw}
2589
- `),2;let I=await DO({pattern:l,provider:c,model:u,from:f,memberRaws:n,output:d,directory:a,cwd:o,seedFlag:g,deps:r},R=>{e.stderr.write(`error: ${R}
2589
+ `),2;let I=await DO({pattern:l,provider:c,model:u,from:f,memberRaws:n,output:d,directory:a,cwd:o,seedFlag:h,deps:r},R=>{e.stderr.write(`error: ${R}
2590
2590
  `)});if(typeof I=="number")return I;v=I}if(v===null)return e.stderr.write(`aborted
2591
- `),1;if(h)return e.stdout.write(v.text),0;let x=v.destPath;return FO(v,x,{asJson:m,force:y,seed:v.seed},e)}async function MO(t,e,r,n,s,i){let o=await vw({io:t,input:e,cwd:r,...n!==void 0?{directory:n}:{},initial:s,...i.initConfigPath!==void 0?{initConfigPath:i.initConfigPath}:{},...i.loadModels!==void 0?{loadModels:i.loadModels}:{},...i.editFile!==void 0?{editFile:i.editFile}:{},...t.env!==void 0?{env:t.env}:{}});return o===null?null:{text:o.text,destPath:o.destPath,members:Sw(o.text),seed:o.seed}}async function DO(t,e){let{pattern:r,provider:n,model:s,from:i,memberRaws:o,output:a,directory:l,cwd:c,seedFlag:u,deps:f}=t,d=[r!==void 0,o.length>0,i!==void 0].filter(Boolean).length;if(d===0)return e(Nw),2;if(d>1)return e("--pattern, --member and --from are mutually exclusive"),2;if(i!==void 0&&(n!==void 0||s!==void 0))return e("--from cannot be combined with --provider or --model (the source teamfile defines the roster)"),2;let m=$O(a,l,c);if(i!==void 0){let g;try{g=await Sr(i,f.fetchFn??globalThis.fetch,c)}catch(E){return e(E instanceof Error?E.message:String(E)),1}let p=VE(g),_=ga(p);return _.length===0?(e(`--from source "${i}" has no parseable _MEMBER_ lines`),1):{text:p,destPath:m,members:_,seed:u}}let h;if(o.length>0){let g=Lw(o,s,e);if(g.error!==void 0)return 1;h=g.members}else{let g=qE(r);if(g===void 0)return e(`invalid pattern "${r}" (expected ${ha})`),2;if(n!==void 0){let p=st({alias:"Lead",provider:n});if(p!==void 0)return e(p),1;h=g.map(_=>({alias:_,provider:n,...s!==void 0?{model:s}:{}}))}else{let p=Ot(f.initConfigPath);if(p===null)return e("missing --provider, and no ~/.lmctl/init.toml found. Run `lmctl init` first, or pass --provider explicitly."),2;let _=[p.provider1,p.provider2,p.provider3];h=g.map((E,w)=>{let S=_[w%_.length];return{alias:E,provider:S.provider,model:s??S.model1}})}}let y=Aw(m,LO(m));return{text:Yr({teamName:y,members:h}),destPath:m,members:h,seed:u}}function Lw(t,e,r){if(t.length===0)return{members:void 0};let n=[],s=new Set;for(let i of t){let o=GE(i);if(o.error!==void 0)return r(o.error),{error:o.error};let a=o.spec,l=a.alias.toLowerCase();if(s.has(l))return r(`duplicate member alias "${a.alias}"`),{error:l};s.add(l),n.push({...a,model:a.model??e})}return n[0].alias.toLowerCase()!=="lead"?(r(`the first member must be Lead (got "${n[0].alias}")`),{error:"lead-not-first"}):{members:n}}function $O(t,e,r){if(t!==void 0)return Du(r,t);let n=Du(r,e??".");return Rw(n,`${Aw(n)}.lmctl`)}async function FO(t,e,r,n){if(kw(e)&&!r.force)return n.stderr.write(`error: ${e} already exists (use --force to overwrite)
2591
+ `),1;if(g)return e.stdout.write(v.text),0;let x=v.destPath;return FO(v,x,{asJson:m,force:y,seed:v.seed},e)}async function MO(t,e,r,n,s,i){let o=await vw({io:t,input:e,cwd:r,...n!==void 0?{directory:n}:{},initial:s,...i.initConfigPath!==void 0?{initConfigPath:i.initConfigPath}:{},...i.loadModels!==void 0?{loadModels:i.loadModels}:{},...i.editFile!==void 0?{editFile:i.editFile}:{},...t.env!==void 0?{env:t.env}:{}});return o===null?null:{text:o.text,destPath:o.destPath,members:Sw(o.text),seed:o.seed}}async function DO(t,e){let{pattern:r,provider:n,model:s,from:i,memberRaws:o,output:a,directory:l,cwd:c,seedFlag:u,deps:f}=t,d=[r!==void 0,o.length>0,i!==void 0].filter(Boolean).length;if(d===0)return e(Nw),2;if(d>1)return e("--pattern, --member and --from are mutually exclusive"),2;if(i!==void 0&&(n!==void 0||s!==void 0))return e("--from cannot be combined with --provider or --model (the source teamfile defines the roster)"),2;let m=$O(a,l,c);if(i!==void 0){let h;try{h=await Sr(i,f.fetchFn??globalThis.fetch,c)}catch(E){return e(E instanceof Error?E.message:String(E)),1}let p=VE(h),_=ga(p);return _.length===0?(e(`--from source "${i}" has no parseable _MEMBER_ lines`),1):{text:p,destPath:m,members:_,seed:u}}let g;if(o.length>0){let h=Lw(o,s,e);if(h.error!==void 0)return 1;g=h.members}else{let h=qE(r);if(h===void 0)return e(`invalid pattern "${r}" (expected ${ha})`),2;if(n!==void 0){let p=st({alias:"Lead",provider:n});if(p!==void 0)return e(p),1;g=h.map(_=>({alias:_,provider:n,...s!==void 0?{model:s}:{}}))}else{let p=Ot(f.initConfigPath);if(p===null)return e("missing --provider, and no ~/.lmctl/init.toml found. Run `lmctl init` first, or pass --provider explicitly."),2;let _=[p.provider1,p.provider2,p.provider3];g=h.map((E,w)=>{let S=_[w%_.length];return{alias:E,provider:S.provider,model:s??S.model1}})}}let y=Aw(m,LO(m));return{text:Yr({teamName:y,members:g}),destPath:m,members:g,seed:u}}function Lw(t,e,r){if(t.length===0)return{members:void 0};let n=[],s=new Set;for(let i of t){let o=GE(i);if(o.error!==void 0)return r(o.error),{error:o.error};let a=o.spec,l=a.alias.toLowerCase();if(s.has(l))return r(`duplicate member alias "${a.alias}"`),{error:l};s.add(l),n.push({...a,model:a.model??e})}return n[0].alias.toLowerCase()!=="lead"?(r(`the first member must be Lead (got "${n[0].alias}")`),{error:"lead-not-first"}):{members:n}}function $O(t,e,r){if(t!==void 0)return Du(r,t);let n=Du(r,e??".");return Rw(n,`${Aw(n)}.lmctl`)}async function FO(t,e,r,n){if(kw(e)&&!r.force)return n.stderr.write(`error: ${e} already exists (use --force to overwrite)
2592
2592
  `),1;xO(NO(e),{recursive:!0}),RO(e,t.text,"utf8");let s=r.asJson?{...n,stdout:{write:()=>{}}}:n;if(!(await Lt([e],s)===0))return r.seed&&n.stderr.write(`error: refusing to seed \u2014 lint failed
2593
2593
  `),r.asJson&&ee(n,Mu(e,!1,!1,t.members)),1;let a=!1;if(r.seed){let l=await Vr([e],s);return a=l===0,r.asJson&&ee(n,Mu(e,!0,a,t.members)),l}return r.asJson?(ee(n,Mu(e,!0,!1,t.members)),0):(n.stdout.write(`Created ${e}
2594
2594
  `),n.stdout.write(`This is a starting point, not a finished teamfile -- edit it freely.
@@ -2657,19 +2657,19 @@ Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2657
2657
  local config, then uses stdin/stdout for JSON-RPC frames.
2658
2658
  `});function Hw(t,e){if(t===void 0)return{date:void 0};let r=/^(\d+)([smhd])$/.exec(t);if(r!==null){let s=Number(r[1]),i=r[2],o=i==="s"?s:i==="m"?s*60:i==="h"?s*3600:s*86400;return{date:new Date(Date.now()-o*1e3)}}let n=Date.parse(t);return Number.isFinite(n)?{date:new Date(n)}:{error:`invalid ${e} "${t}" (expected ISO8601 or duration like 24h)`}}var Xw=k(()=>{"use strict"});var eT={};se(eT,{applyMaxBytes:()=>La,parseTailSince:()=>Qw,renderMessage:()=>zw,runTail:()=>hM});async function hM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${pM}
2659
2659
  `),0;let r=oe(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run","--since"],["--watch","--help","--json"]);if(r.error!==void 0)return A(e,r.error);let n=H(r,"--json"),s=W(r,"--since"),i=Qw(s);if("error"in i)return A(e,i.error);let o=i.date,a=W(r,"--lines"),l=W(r,"--max-bytes");if(a!==void 0&&l!==void 0)return A(e,"--lines and --max-bytes are mutually exclusive (choose one)");let c;if(a!==void 0){let p=Number.parseInt(a,10);if(!Number.isFinite(p)||p<1||String(p)!==a)return A(e,`invalid --lines "${a}" (expected a positive integer)`);c={kind:"lines",lines:p}}else{let p=l===void 0?mM:Number.parseInt(l,10);if(!Number.isFinite(p)||p<0||l!==void 0&&String(p)!==l)return A(e,`invalid --max-bytes "${l}" (expected a non-negative integer)`);n&&l!==void 0&&e.stderr.write(`warning: --max-bytes has no effect under --json (byte-truncation has no JSON analog); ignoring
2660
- `),c={kind:"bytes",maxBytes:p}}let u=H(r,"--watch"),f=W(r,"--watch-interval"),d=f===void 0?fM:Number.parseInt(f.replace(/s$/,""),10);if(!Number.isFinite(d)||d<1)return A(e,`invalid --watch-interval "${f}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return A(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let m=W(r,"--run");if(m!==void 0){if(r.positionals.length>0)return A(e,"--run is mutually exclusive with positional [target] [alias]");if(W(r,"--session")!==void 0)return A(e,"--run is mutually exclusive with --session");if(W(r,"--provider")!==void 0)return A(e,"--run is mutually exclusive with --provider");let p=Number.parseInt(m,10);if(!Number.isFinite(p)||p<=0||String(p)!==m)return A(e,`invalid --run "${m}" (expected a positive integer run id)`);try{return await L(e,async _=>gM(e,_,p,c,u,d,o,n))}catch(_){return rt(e,_)}}let h=wt(uM,{target:r.positionals[0],alias:r.positionals[1],flags:{session:W(r,"--session"),provider:W(r,"--provider")}});if(h.mode==="error")return A(e,h.message);if(h.mode==="managed")return A(e,"tail managed mode requires --run <id>");let y;if(h.mode==="ai-team")if(h.alias===void 0){let p;try{p=await L(e,w=>me(h.teamfile,w))}catch(w){return A(e,`tail: ${w instanceof Error?w.message:String(w)}`)}let _;try{_=ae(p)}catch(w){return A(e,`tail: ${w instanceof Error?w.message:String(w)}`)}let E=Kt(_);if(E===void 0)return A(e,`tail: ${h.teamfile} has no Lead member; pass <tf>:<alias>`);try{let w=await L(e,S=>he(h.teamfile,E.alias,S));y={provider:w.provider,sessionId:w.sessionid,cwd:w.sessiondir}}catch(w){return w instanceof ie?A(e,w.message):rt(e,w)}}else try{let p=await L(e,_=>he(h.teamfile,h.alias,_));y={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ie?A(e,p.message):rt(e,p)}else{let p=h.sessionid,_=h.provider;if(_===void 0){let E=await Rt(p);if(E.length===0)return A(e,`tail: session "${p}" not found in any provider store`);if(E.length>1)return A(e,`tail: session "${p}" matches multiple providers (${E.join(", ")}); pass --provider`);_=E[0]}y={provider:_,sessionId:p}}let g=await qw(e,y.provider,y.sessionId,c,-1,o,n);return g===Na?1:u?await new Promise(p=>{let _=async()=>{try{let S=await qw(e,y.provider,y.sessionId,c,g,o,n);S!==Na&&(g=S)}catch(S){e.stderr.write(`tail: ${S instanceof Error?S.message:String(S)}
2660
+ `),c={kind:"bytes",maxBytes:p}}let u=H(r,"--watch"),f=W(r,"--watch-interval"),d=f===void 0?fM:Number.parseInt(f.replace(/s$/,""),10);if(!Number.isFinite(d)||d<1)return A(e,`invalid --watch-interval "${f}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return A(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let m=W(r,"--run");if(m!==void 0){if(r.positionals.length>0)return A(e,"--run is mutually exclusive with positional [target] [alias]");if(W(r,"--session")!==void 0)return A(e,"--run is mutually exclusive with --session");if(W(r,"--provider")!==void 0)return A(e,"--run is mutually exclusive with --provider");let p=Number.parseInt(m,10);if(!Number.isFinite(p)||p<=0||String(p)!==m)return A(e,`invalid --run "${m}" (expected a positive integer run id)`);try{return await L(e,async _=>gM(e,_,p,c,u,d,o,n))}catch(_){return rt(e,_)}}let g=wt(uM,{target:r.positionals[0],alias:r.positionals[1],flags:{session:W(r,"--session"),provider:W(r,"--provider")}});if(g.mode==="error")return A(e,g.message);if(g.mode==="managed")return A(e,"tail managed mode requires --run <id>");let y;if(g.mode==="ai-team")if(g.alias===void 0){let p;try{p=await L(e,w=>me(g.teamfile,w))}catch(w){return A(e,`tail: ${w instanceof Error?w.message:String(w)}`)}let _;try{_=ae(p)}catch(w){return A(e,`tail: ${w instanceof Error?w.message:String(w)}`)}let E=Kt(_);if(E===void 0)return A(e,`tail: ${g.teamfile} has no Lead member; pass <tf>:<alias>`);try{let w=await L(e,S=>he(g.teamfile,E.alias,S));y={provider:w.provider,sessionId:w.sessionid,cwd:w.sessiondir}}catch(w){return w instanceof ie?A(e,w.message):rt(e,w)}}else try{let p=await L(e,_=>he(g.teamfile,g.alias,_));y={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ie?A(e,p.message):rt(e,p)}else{let p=g.sessionid,_=g.provider;if(_===void 0){let E=await Rt(p);if(E.length===0)return A(e,`tail: session "${p}" not found in any provider store`);if(E.length>1)return A(e,`tail: session "${p}" matches multiple providers (${E.join(", ")}); pass --provider`);_=E[0]}y={provider:_,sessionId:p}}let h=await qw(e,y.provider,y.sessionId,c,-1,o,n);return h===Na?1:u?await new Promise(p=>{let _=async()=>{try{let S=await qw(e,y.provider,y.sessionId,c,h,o,n);S!==Na&&(h=S)}catch(S){e.stderr.write(`tail: ${S instanceof Error?S.message:String(S)}
2661
2661
  `)}},E=setInterval(()=>{_()},d*1e3),w=()=>{clearInterval(E),p(0)};process.once("SIGINT",w),process.once("SIGTERM",w)}):0}async function qw(t,e,r,n,s,i,o){let a;try{a=await ge(r,e)}catch(d){return t.stderr.write(`tail: failed to load session: ${d instanceof Error?d.message:String(d)}
2662
2662
  `),Na}if(a===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
2663
- `),Na;let l=a.messages??[],c=s<0&&n.kind==="lines"?Math.max(0,l.length-n.lines):s+1;if(s<0&&i!==void 0){let d=i.getTime(),m=l.length;for(let h=0;h<l.length;h+=1){let y=l[h].timestamp,g=y===void 0?NaN:(y instanceof Date?y:new Date(y)).getTime();if(!Number.isNaN(g)&&g>=d){m=h;break}}c=Math.max(c,m)}let u=s<0&&c>0;if(c>=l.length)return o===!0&&s<0&&ee(t,{schema_version:Ra,provider:e,sessionId:r,messages:[],truncated:u}),l.length-1;if(o===!0){let d=l.slice(c).map(h=>({role:h.role,content:h.content,model:h.model??null,timestamp:(h.timestamp instanceof Date?h.timestamp:new Date(h.timestamp)).toISOString()}));return ee(t,{schema_version:Ra,provider:e,sessionId:r,messages:d,truncated:u}),l.length-1}let f="";for(let d=c;d<l.length;d+=1)f+=`${zw(l[d])}
2663
+ `),Na;let l=a.messages??[],c=s<0&&n.kind==="lines"?Math.max(0,l.length-n.lines):s+1;if(s<0&&i!==void 0){let d=i.getTime(),m=l.length;for(let g=0;g<l.length;g+=1){let y=l[g].timestamp,h=y===void 0?NaN:(y instanceof Date?y:new Date(y)).getTime();if(!Number.isNaN(h)&&h>=d){m=g;break}}c=Math.max(c,m)}let u=s<0&&c>0;if(c>=l.length)return o===!0&&s<0&&ee(t,{schema_version:Ra,provider:e,sessionId:r,messages:[],truncated:u}),l.length-1;if(o===!0){let d=l.slice(c).map(g=>({role:g.role,content:g.content,model:g.model??null,timestamp:(g.timestamp instanceof Date?g.timestamp:new Date(g.timestamp)).toISOString()}));return ee(t,{schema_version:Ra,provider:e,sessionId:r,messages:d,truncated:u}),l.length-1}let f="";for(let d=c;d<l.length;d+=1)f+=`${zw(l[d])}
2664
2664
  `;return t.stdout.write(n.kind==="bytes"?La(f,n.maxBytes):f),l.length-1}function zw(t){let e=Zw(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
2665
2665
  `).replace(/\r/g,`
2666
2666
  `).split(`
2667
2667
  `),i=s[0]??"",o=s.slice(1);return o.length===0?`${r}: ${i}`:`${r}: ${i}
2668
2668
  ${o.map(a=>` ${a}`).join(`
2669
2669
  `)}`}function Gw(t){return t.map(e=>({id:e.id,kind:e.kind,step_id:e.step_id,timestamp:new Date(e.timestamp_ms).toISOString(),payload:e.payload}))}async function gM(t,e,r,n,s,i,o,a){if(e.getRun(r)===null)return A(t,`tail: run ${r}: not found`);let c=o===void 0?e.listSessionEvents(r):e.listSessionEvents(r).filter(d=>d.timestamp_ms>=o.getTime()),u=n.kind==="lines"?c.slice(Math.max(0,c.length-n.lines)):c;if(a===!0)ee(t,{schema_version:Ra,run_id:r,truncated:u.length<c.length,events:Gw(u)});else{let d=u.map(m=>`${Kw(m)}
2670
- `).join("");t.stdout.write(n.kind==="bytes"?La(d,n.maxBytes):d)}let f=c.length>0?c[c.length-1].id:0;return s?await new Promise(d=>{let h=setInterval(()=>{try{let g=e.listSessionEvents(r,f);if(g.length===0)return;for(let _ of g)f=_.id;if(a===!0){ee(t,{schema_version:Ra,run_id:r,truncated:!1,events:Gw(g)});return}let p=g.map(_=>`${Kw(_)}
2671
- `).join("");t.stdout.write(n.kind==="bytes"?La(p,n.maxBytes):p)}catch(g){t.stderr.write(`tail: ${g instanceof Error?g.message:String(g)}
2672
- `)}},i*1e3),y=()=>{clearInterval(h),d(0)};process.once("SIGINT",y),process.once("SIGTERM",y)}):0}function La(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(Jw,"utf8");if(n>=e)return Vw(t,e);let s=e-n,i=Vw(t,s);return`${Jw}${i}`}function Vw(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function Kw(t){let e=Zw(new Date(t.timestamp_ms))??"",r="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function Qw(t){return Hw(t,"--since")}function Zw(t){if(t===void 0)return;let e=(0,Yw.formatLocalTimestamp)(t);return e==="unknown"?void 0:e}var Yw,uM,mM,fM,Ra,pM,Na,Jw,tT=k(()=>{"use strict";pt();Yw=ct(tt(),1);de();Oe();Ae();Et();Xw();uM={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},mM=4096,fM=2,Ra=1,pM=`usage: lmctl tail [target] [alias]
2670
+ `).join("");t.stdout.write(n.kind==="bytes"?La(d,n.maxBytes):d)}let f=c.length>0?c[c.length-1].id:0;return s?await new Promise(d=>{let g=setInterval(()=>{try{let h=e.listSessionEvents(r,f);if(h.length===0)return;for(let _ of h)f=_.id;if(a===!0){ee(t,{schema_version:Ra,run_id:r,truncated:!1,events:Gw(h)});return}let p=h.map(_=>`${Kw(_)}
2671
+ `).join("");t.stdout.write(n.kind==="bytes"?La(p,n.maxBytes):p)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2672
+ `)}},i*1e3),y=()=>{clearInterval(g),d(0)};process.once("SIGINT",y),process.once("SIGTERM",y)}):0}function La(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(Jw,"utf8");if(n>=e)return Vw(t,e);let s=e-n,i=Vw(t,s);return`${Jw}${i}`}function Vw(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function Kw(t){let e=Zw(new Date(t.timestamp_ms))??"",r="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function Qw(t){return Hw(t,"--since")}function Zw(t){if(t===void 0)return;let e=(0,Yw.formatLocalTimestamp)(t);return e==="unknown"?void 0:e}var Yw,uM,mM,fM,Ra,pM,Na,Jw,tT=k(()=>{"use strict";pt();Yw=ct(tt(),1);de();Oe();Ae();Et();Xw();uM={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},mM=4096,fM=2,Ra=1,pM=`usage: lmctl tail [target] [alias]
2673
2673
  lmctl tail --session <id> [--provider <name>]
2674
2674
  lmctl tail --run <id>
2675
2675
  [--lines N | --max-bytes N] [--since <duration|ISO8601>]
@@ -2711,14 +2711,14 @@ context, one paragraph per prompt with a blank line between prompts.
2711
2711
  Codex prompts require native prompt metadata or user_message events;
2712
2712
  unclassified user-role records are omitted in this compact mode.
2713
2713
  `});var iT={};se(iT,{runCost:()=>vM});function EM(t,e,r,n){let s=new Set,i=[];for(let o of e){let a=r===null?null:Wo(t,o,r,n),l=a?.kind==="priced"||a?.kind==="estimated"?`id:${a.model.normalizedId}`:a?.kind==="known-unpriced"?`id:${a.id}`:`raw:${o.trim().toLowerCase()}`;s.has(l)||(s.add(l),i.push(o))}return i}async function vM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${TM}
2714
- `),0;let r=oe(t,["--provider"],["--json"]);if(r.error!==void 0)return A(e,r.error);if(r.positionals.length>2)return A(e,`too many positionals (${r.positionals.length}); expected <target> [alias]`);let n=H(r,"--json"),s=wt(yM,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:W(r,"--provider")}});if(s.mode==="error")return A(e,s.message);if(s.mode==="managed")return A(e,"cost: managed-run targets are not supported (no per-run token/model rollup exists)");let i,o;if(s.mode==="ai-team")try{let I=await L(e,R=>he(s.teamfile,s.alias,R));i=I.provider,o=I.sessionid}catch(I){if(I instanceof ie)return A(e,I.message);throw I}else if(o=s.sessionid,s.provider!==void 0)i=s.provider;else{let I=await Rt(o);if(I.length===0)return A(e,`cost: session "${o}" not found in any provider store`);if(I.length>1)return A(e,`cost: session "${o}" matches multiple providers (${I.join(", ")}); pass --provider`);i=I[0]}let a;try{a=await ge(o,i)}catch(I){return A(e,`cost: failed to load session: ${I instanceof Error?I.message:String(I)}`)}if(a===null)return A(e,`cost: session not found: ${o} (provider=${i})`);let l=[...new Set(a.messages.map(I=>I.model).filter(I=>I!==void 0&&I!=="<synthetic>"))],c=[...a.messages].reverse().find(I=>I.model!==void 0&&I.model!=="<synthetic>")?.model,u=a.model??c??null,f={input:a.totalInputTokens??null,output:a.totalOutputTokens??null,cachedInput:a.totalCachedInputTokens??null},d=await Ht(),m=EM(i,l,d.catalog,d.aliases),h=m.length>1,y="unavailable",g=null,p=null,_=null,E=null,w=!1,S=null,T=null;if(u!==null&&d.catalog!==null){let I=Ho(i,u,d.catalog,d.aliases);if(y=I.state.kind,I.offer!==null)T=I.offer.pricing,g=I.offer.route,p=I.offer.source,_=I.offer.sourceModelId,E=I.provenance,w=I.offer.estimated;else switch(I.state.kind){case"unresolved":S=`alias "${I.state.alias}" is deliberately unresolved in the lmprice alias table`;break;case"known-unpriced":S=`"${I.state.id}" is a known model with no published price row`;break;case"unknown":S=`model "${u}" not found in lmprice catalog for provider "${i}"`;break;case"wrong-provider":S=`model "${u}" is not offered by provider "${i}" (found under: ${I.state.otherProviders.join(", ")})`;break;default:S=`no lmprice catalog coverage for provider "${i}"`;break}}else u!==null&&(S="lmprice catalog unavailable");let b=T===null?null:{inputPer1m:T.input_per_1m_tokens,outputPer1m:T.output_per_1m_tokens,cachedInputPer1m:T.input_cache_read_per_1m_tokens},v=f.input===null||f.output===null?null:H_({input:f.input,output:f.output,cachedInput:f.cachedInput??0},T),x={schema_version:wM,provider:i,sessionId:o,model:u,modelsUsed:m,approximate:h,tokens:f,pricePerModel:b,costUsd:v,priceResolution:y,priceRoute:g,priceSource:p,priceSourceModelId:_,priceProvenance:E,priceEstimated:w,costUnavailableReason:S,priceDataSource:d.source,priceDataGeneratedAt:d.generatedAt};return n?(ee(e,x),0):(e.stdout.write(`Session: ${o}
2714
+ `),0;let r=oe(t,["--provider"],["--json"]);if(r.error!==void 0)return A(e,r.error);if(r.positionals.length>2)return A(e,`too many positionals (${r.positionals.length}); expected <target> [alias]`);let n=H(r,"--json"),s=wt(yM,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:W(r,"--provider")}});if(s.mode==="error")return A(e,s.message);if(s.mode==="managed")return A(e,"cost: managed-run targets are not supported (no per-run token/model rollup exists)");let i,o;if(s.mode==="ai-team")try{let I=await L(e,R=>he(s.teamfile,s.alias,R));i=I.provider,o=I.sessionid}catch(I){if(I instanceof ie)return A(e,I.message);throw I}else if(o=s.sessionid,s.provider!==void 0)i=s.provider;else{let I=await Rt(o);if(I.length===0)return A(e,`cost: session "${o}" not found in any provider store`);if(I.length>1)return A(e,`cost: session "${o}" matches multiple providers (${I.join(", ")}); pass --provider`);i=I[0]}let a;try{a=await ge(o,i)}catch(I){return A(e,`cost: failed to load session: ${I instanceof Error?I.message:String(I)}`)}if(a===null)return A(e,`cost: session not found: ${o} (provider=${i})`);let l=[...new Set(a.messages.map(I=>I.model).filter(I=>I!==void 0&&I!=="<synthetic>"))],c=[...a.messages].reverse().find(I=>I.model!==void 0&&I.model!=="<synthetic>")?.model,u=a.model??c??null,f={input:a.totalInputTokens??null,output:a.totalOutputTokens??null,cachedInput:a.totalCachedInputTokens??null},d=await Ht(),m=EM(i,l,d.catalog,d.aliases),g=m.length>1,y="unavailable",h=null,p=null,_=null,E=null,w=!1,S=null,T=null;if(u!==null&&d.catalog!==null){let I=Ho(i,u,d.catalog,d.aliases);if(y=I.state.kind,I.offer!==null)T=I.offer.pricing,h=I.offer.route,p=I.offer.source,_=I.offer.sourceModelId,E=I.provenance,w=I.offer.estimated;else switch(I.state.kind){case"unresolved":S=`alias "${I.state.alias}" is deliberately unresolved in the lmprice alias table`;break;case"known-unpriced":S=`"${I.state.id}" is a known model with no published price row`;break;case"unknown":S=`model "${u}" not found in lmprice catalog for provider "${i}"`;break;case"wrong-provider":S=`model "${u}" is not offered by provider "${i}" (found under: ${I.state.otherProviders.join(", ")})`;break;default:S=`no lmprice catalog coverage for provider "${i}"`;break}}else u!==null&&(S="lmprice catalog unavailable");let b=T===null?null:{inputPer1m:T.input_per_1m_tokens,outputPer1m:T.output_per_1m_tokens,cachedInputPer1m:T.input_cache_read_per_1m_tokens},v=f.input===null||f.output===null?null:H_({input:f.input,output:f.output,cachedInput:f.cachedInput??0},T),x={schema_version:wM,provider:i,sessionId:o,model:u,modelsUsed:m,approximate:g,tokens:f,pricePerModel:b,costUsd:v,priceResolution:y,priceRoute:h,priceSource:p,priceSourceModelId:_,priceProvenance:E,priceEstimated:w,costUnavailableReason:S,priceDataSource:d.source,priceDataGeneratedAt:d.generatedAt};return n?(ee(e,x),0):(e.stdout.write(`Session: ${o}
2715
2715
  `),e.stdout.write(` Provider: ${i}
2716
2716
  `),e.stdout.write(` Model: ${u??"(unknown)"}
2717
- `),h&&e.stdout.write(` NOTE: this session used multiple models (${m.join(", ")}) -- cost below is approximate, priced at ${u}'s rate for the whole session.
2717
+ `),g&&e.stdout.write(` NOTE: this session used multiple models (${m.join(", ")}) -- cost below is approximate, priced at ${u}'s rate for the whole session.
2718
2718
  `),e.stdout.write(` Tokens: ${f.input==null?"n/a":(0,Ca.formatCount)(f.input)} in / ${f.output==null?"n/a":(0,Ca.formatCount)(f.output)} out`+(f.cachedInput!=null?` (cached: ${(0,Ca.formatCount)(f.cachedInput)})`:"")+`
2719
2719
  `),v===null?e.stdout.write(` Cost: n/a (${S??`no lmprice entry for "${u??"unknown"}"`})
2720
- `):e.stdout.write(` Cost: ~$${v.toFixed(4)}${h?" (approximate)":""}${w?" (estimated rate)":""}
2721
- `),g!==null&&e.stdout.write(` Price route: ${g}${w?" (manual/estimated row)":""}
2720
+ `):e.stdout.write(` Cost: ~$${v.toFixed(4)}${g?" (approximate)":""}${w?" (estimated rate)":""}
2721
+ `),h!==null&&e.stdout.write(` Price route: ${h}${w?" (manual/estimated row)":""}
2722
2722
  `),e.stdout.write(` Price data: ${d.source}${d.generatedAt?` (generated ${d.generatedAt})`:""}
2723
2723
  `),0)}var Ca,yM,wM,TM,oT=k(()=>{"use strict";pt();Ca=ct(tt(),1);Ds();$s();de();Oe();yM={name:"cost",allowsBareTeamfile:!1,supportsRaw:!0};wM=1,TM=`usage: lmctl cost <target> [alias] [--json]
2724
2724
  lmctl cost <sessionid> [--provider <name>]
@@ -2744,7 +2744,7 @@ unavailable) and
2744
2744
  strict short timeout and NEVER blocks or fails this command: any network
2745
2745
  error degrades silently to the local cache, then the bundled built-in
2746
2746
  copy, in that order.`});var lT={};se(lT,{runLs:()=>xM});import{resolve as ju}from"node:path";function IM(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function xM(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${SM}
2747
- `),0;let r=oe(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return A(e,r.error);if(r.positionals.length>0)return A(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=W(r,"--format"),s=H(r,"--json");if(H(r,"--runs")){for(let g of["--provider","--sessiondir"])if(W(r,g)!==void 0)return A(e,`--runs is mutually exclusive with ${g}`);for(let g of["--recursive","--all"])if(H(r,g))return A(e,`--runs is mutually exclusive with ${g}`);if(n==="teamfile")return A(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let m=W(r,"--limit"),h=bM;if(m!==void 0){let g=Number.parseInt(m,10);if(!Number.isFinite(g)||g<1||String(g)!==m)return A(e,`invalid --limit "${m}" (expected a positive integer)`);if(g>aT)return A(e,`--limit ${g} exceeds maximum (${aT})`);h=g}let y=n==="json"||s===!0?"json":"table";try{return await L(e,async g=>kM(e,g,h,y))}catch(g){return rt(e,g)}}let o=AM(n,s);if("error"in o)return A(e,o.error);let a=o.format,l=W(r,"--provider"),c=W(r,"--sessiondir"),u=H(r,"--recursive"),f=H(r,"--all"),d;try{d=await As(l?{provider:l}:{})}catch(m){return A(e,`ls: discovery failed: ${m instanceof Error?m.message:String(m)}`)}if(!f){let m=c!==void 0?ju(c):ju(process.cwd());d=d.filter(h=>{let y=ju(h.cwd);return u?y===m||y.startsWith(`${m}/`):y===m})}if(d=IM(d),a==="json")return ee(e,d.map(m=>({provider:m.provider,sessionId:m.sessionId,cwd:m.cwd,messageCount:m.messageCount,modifiedAt:m.modifiedAt.toISOString(),...m.model!==void 0?{model:m.model}:{}}))),0;if(d.length===0){if(a==="table"){let m=f?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${m}.
2747
+ `),0;let r=oe(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return A(e,r.error);if(r.positionals.length>0)return A(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=W(r,"--format"),s=H(r,"--json");if(H(r,"--runs")){for(let h of["--provider","--sessiondir"])if(W(r,h)!==void 0)return A(e,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(H(r,h))return A(e,`--runs is mutually exclusive with ${h}`);if(n==="teamfile")return A(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let m=W(r,"--limit"),g=bM;if(m!==void 0){let h=Number.parseInt(m,10);if(!Number.isFinite(h)||h<1||String(h)!==m)return A(e,`invalid --limit "${m}" (expected a positive integer)`);if(h>aT)return A(e,`--limit ${h} exceeds maximum (${aT})`);g=h}let y=n==="json"||s===!0?"json":"table";try{return await L(e,async h=>kM(e,h,g,y))}catch(h){return rt(e,h)}}let o=AM(n,s);if("error"in o)return A(e,o.error);let a=o.format,l=W(r,"--provider"),c=W(r,"--sessiondir"),u=H(r,"--recursive"),f=H(r,"--all"),d;try{d=await As(l?{provider:l}:{})}catch(m){return A(e,`ls: discovery failed: ${m instanceof Error?m.message:String(m)}`)}if(!f){let m=c!==void 0?ju(c):ju(process.cwd());d=d.filter(g=>{let y=ju(g.cwd);return u?y===m||y.startsWith(`${m}/`):y===m})}if(d=IM(d),a==="json")return ee(e,d.map(m=>({provider:m.provider,sessionId:m.sessionId,cwd:m.cwd,messageCount:m.messageCount,modifiedAt:m.modifiedAt.toISOString(),...m.model!==void 0?{model:m.model}:{}}))),0;if(d.length===0){if(a==="table"){let m=f?"(all)":c??process.cwd(),g=u?"under":"in";e.stdout.write(`No native sessions found ${g} ${m}.
2748
2748
  `)}return 0}if(a==="teamfile"){for(let m of d)e.stdout.write(`_MEMBER_ alias=- provider=${m.provider} sessionid=${m.sessionId} sessiondir=${m.cwd}
2749
2749
  `);return 0}return(0,Pe.printTable)(d.map(m=>[(0,Pe.escapeCell)(m.sessionId),(0,Pe.escapeCell)(m.provider),(0,Pe.escapeCell)(m.cwd.length>36?`\u2026${m.cwd.slice(-35)}`:m.cwd),(0,Pe.formatRelativeTime)(m.modifiedAt)]),{headers:["SESSION","PROVIDER","SESSIONDIR","MODIFIED"],stream:e.stdout}),0}async function kM(t,e,r,n){let s=hy(e,{limit:r});return n==="json"?(ee(t,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0):s.length===0?(t.stdout.write(`No runs found.
2750
2750
  `),0):((0,Pe.printTable)(s.map(i=>[(0,Pe.escapeCell)(i.id),(0,Pe.escapeCell)(i.workflow_id),(0,Pe.escapeCell)(i.team_id),(0,Pe.escapeCell)(i.current_state??""),(0,Pe.escapeCell)(i.terminal_state??""),(0,Pe.escapeCell)(i.started_at)]),{headers:["RUN_ID","WORKFLOW","TEAM","STATE","TERMINAL","STARTED"],stream:t.stdout}),0)}function AM(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var Pe,SM,bM,aT,cT=k(()=>{"use strict";Pe=ct(tt(),1);jt();de();Pd();SM=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
@@ -2778,7 +2778,7 @@ what it detected; use --force to overwrite an existing file (without
2778
2778
 
2779
2779
  --force Overwrite ~/.lmctl/init.toml if it already exists
2780
2780
  -h, --help display help for command
2781
- `});import{execFileSync as LM}from"node:child_process";import{resolve as mT}from"node:path";function CM(t){return t.filter(e=>e.state!=="retired")}function fT(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?A(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=LM("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return A(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=mT(s),o=e.listProjects().find(a=>mT(a.local_path)===i);return o===void 0?A(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function pT(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?A(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?A(t,`project ${r.name} has no assigned team; use --team <name>`):s}function hT(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?A(t,`member not found: ${n}`):i}let s=CM(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?A(t,`team ${r.name} has no active agent member`):s}var gT=k(()=>{"use strict";de()});var ET={};se(ET,{SIZE_WARN_EST_TOKENS:()=>mi,estimateTokens:()=>yT,runTerminal:()=>Bu});import{spawn as OM}from"node:child_process";import{statSync as MM}from"node:fs";async function Bu(t,e){if(t.includes("--help")||t.includes("-h"))return WM(e);let r=oe(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return A(e,r.error);let n=W(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return A(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return A(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?H(r,o):W(r,o)!==void 0)return A(e,`--run is mutually exclusive with ${o}`);try{return await L(e,async o=>{let a=W(r,"--alias"),l=fy(o,s,a);return"err"in l?A(e,l.err):Wu(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return rt(e,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?H(r,l):W(r,l)!==void 0)return A(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return A(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=wt(DM,{target:i,alias:o,flags:{}});return a.mode==="error"?A(e,a.message):a.mode!=="ai-team"?A(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?A(e,"terminal: alias required for the teamfile target"):await L(e,l=>$M(e,a.teamfile,a.alias,l,H(r,"--json")))}try{return await L(e,async s=>{let i=UM(e,s,r);if(typeof i=="number")return i;let o=W(r,"--alias");return H(r,"--size")?BM(e,s,i,o,H(r,"--json")):jM(e,s,i,o)})}catch(s){return rt(e,s)}}async function $M(t,e,r,n,s){let i;try{i=he(e,r,n)}catch(d){return d instanceof ie?A(t,d.message):rt(t,d)}let o=St(n,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:vt()});if(!o.acquired){let d=o.current.holder_pid,m=d===null?null:De(d)?"live":"dead",h=`${i.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at} `+(d===null?"(holder_pid=unavailable)":`(holder_pid=${d}, ${m})`);return s?(ee(t,{status:"error",errorKind:"busy",message:h,holder_pid:d,holder_liveness:m}),1):A(t,h)}let a=g_({teamfile:i.teamfile,alias:i.alias}),l=null,c=null,u=null,f=[];try{n.setTerminalLock(a),c=FM(n,i),c!==null&&(process.env.LMCTL_INVOCATION_ID=String(c));let d=n.getRootTeam(i.teamfile)?.name??null;d!==null&&(process.env.LMBEE_TEAM_NAME=d),l=setInterval(()=>{try{let m=new Date().toISOString(),h=n.heartbeatTerminalLock(a.teamfile,a.alias,a.lock_id,m);h&&n.heartbeatAgentInflight(o.lease,o.leaseId,m),!h&&l!==null&&(clearInterval(l),l=null)}catch{}},__()),l.unref?.();try{sn(t,ae(i.teamfile),i.teamfile)}catch{}return u=await Wu(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead},m=>{f.push(`${m.provider} terminal ignored model=${m.model}: ${m.reason}`)}),u}finally{l!==null&&clearInterval(l),n.clearTerminalLock(a.teamfile,a.alias,a.lock_id),n.releaseAgentInflight(o.lease,o.leaseId),PM(n,c,u,f)}}function FM(t,e){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:process.pid,launch_source:"terminal",parent_invocation_id:nr(process.env.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function PM(t,e,r,n=[]){if(e!==null)try{t.finishTrackedInvocation(e,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`,...n.length>0?{config_warnings:JSON.stringify(n)}:{}})}catch{}}async function Wu(t,e,r){let{provider:n,sessionid:s,sessiondir:i,model:o}=e;if(!Co(n))return A(t,`no resume incantation for provider "${n}"`);if(!l_.test(s))return A(t,"refusing to resume: malformed sessionid");let a=fd(n,s,{isLead:e.isLead,model:o,onModelIgnored:u=>{let f=`warning: ${u.provider} terminal ignored model=${u.model}: ${u.reason}`;t.stderr.write(`${f}
2781
+ `});import{execFileSync as LM}from"node:child_process";import{resolve as mT}from"node:path";function CM(t){return t.filter(e=>e.state!=="retired")}function fT(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?A(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=LM("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return A(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=mT(s),o=e.listProjects().find(a=>mT(a.local_path)===i);return o===void 0?A(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function pT(t,e,r,n){if(n!==void 0){let i=e.findTeamByName(n);return i===null?A(t,`team not found: ${n}`):i}let s=e.getTeam(r.team_id);return s===null?A(t,`project ${r.name} has no assigned team; use --team <name>`):s}function hT(t,e,r,n){if(n!==void 0){let i=e.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?A(t,`member not found: ${n}`):i}let s=CM(e.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?A(t,`team ${r.name} has no active agent member`):s}var gT=k(()=>{"use strict";de()});var ET={};se(ET,{SIZE_WARN_EST_TOKENS:()=>mi,estimateTokens:()=>yT,runTerminal:()=>Bu});import{spawn as OM}from"node:child_process";import{statSync as MM}from"node:fs";async function Bu(t,e){if(t.includes("--help")||t.includes("-h"))return WM(e);let r=oe(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return A(e,r.error);let n=W(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return A(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return A(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?H(r,o):W(r,o)!==void 0)return A(e,`--run is mutually exclusive with ${o}`);try{return await L(e,async o=>{let a=W(r,"--alias"),l=fy(o,s,a);return"err"in l?A(e,l.err):Wu(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return rt(e,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?H(r,l):W(r,l)!==void 0)return A(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return A(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=wt(DM,{target:i,alias:o,flags:{}});return a.mode==="error"?A(e,a.message):a.mode!=="ai-team"?A(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?A(e,"terminal: alias required for the teamfile target"):await L(e,l=>$M(e,a.teamfile,a.alias,l,H(r,"--json")))}try{return await L(e,async s=>{let i=UM(e,s,r);if(typeof i=="number")return i;let o=W(r,"--alias");return H(r,"--size")?BM(e,s,i,o,H(r,"--json")):jM(e,s,i,o)})}catch(s){return rt(e,s)}}async function $M(t,e,r,n,s){let i;try{i=he(e,r,n)}catch(d){return d instanceof ie?A(t,d.message):rt(t,d)}let o=St(n,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:vt()});if(!o.acquired){let d=o.current.holder_pid,m=d===null?null:De(d)?"live":"dead",g=`${i.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at} `+(d===null?"(holder_pid=unavailable)":`(holder_pid=${d}, ${m})`);return s?(ee(t,{status:"error",errorKind:"busy",message:g,holder_pid:d,holder_liveness:m}),1):A(t,g)}let a=g_({teamfile:i.teamfile,alias:i.alias}),l=null,c=null,u=null,f=[];try{n.setTerminalLock(a),c=FM(n,i),c!==null&&(process.env.LMCTL_INVOCATION_ID=String(c));let d=n.getRootTeam(i.teamfile)?.name??null;d!==null&&(process.env.LMBEE_TEAM_NAME=d),l=setInterval(()=>{try{let m=new Date().toISOString(),g=n.heartbeatTerminalLock(a.teamfile,a.alias,a.lock_id,m);g&&n.heartbeatAgentInflight(o.lease,o.leaseId,m),!g&&l!==null&&(clearInterval(l),l=null)}catch{}},__()),l.unref?.();try{sn(t,ae(i.teamfile),i.teamfile)}catch{}return u=await Wu(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead},m=>{f.push(`${m.provider} terminal ignored model=${m.model}: ${m.reason}`)}),u}finally{l!==null&&clearInterval(l),n.clearTerminalLock(a.teamfile,a.alias,a.lock_id),n.releaseAgentInflight(o.lease,o.leaseId),PM(n,c,u,f)}}function FM(t,e){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:process.pid,launch_source:"terminal",parent_invocation_id:nr(process.env.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function PM(t,e,r,n=[]){if(e!==null)try{t.finishTrackedInvocation(e,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`,...n.length>0?{config_warnings:JSON.stringify(n)}:{}})}catch{}}async function Wu(t,e,r){let{provider:n,sessionid:s,sessiondir:i,model:o}=e;if(!Co(n))return A(t,`no resume incantation for provider "${n}"`);if(!l_.test(s))return A(t,"refusing to resume: malformed sessionid");let a=fd(n,s,{isLead:e.isLead,model:o,onModelIgnored:u=>{let f=`warning: ${u.provider} terminal ignored model=${u.model}: ${u.reason}`;t.stderr.write(`${f}
2782
2782
  `),ke({event:"model_ignored",provider:u.provider,model:u.model,reason:u.reason}),r?.(u)}});if(a===null||a.length===0)return A(t,`no resume incantation for provider "${n}"`);let[l,...c]=a;return await new Promise(u=>{let f=OM(l,c,{stdio:"inherit",cwd:i,env:be(process.env,i,s,"terminal")});f.on("error",d=>{u(A(t,`failed to launch ${l}: ${d.message}`))}),f.on("exit",d=>u(d??0))})}function UM(t,e,r){let n=W(r,"--team");if(n!==void 0){let o=e.findTeamByName(n);return o===null?A(t,`team not found: ${n}`):o}let s=fT(t,e,W(r,"--project"));return typeof s=="number"?s:pT(t,e,s,void 0)}async function jM(t,e,r,n){let s=hT(t,e,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?A(t,`member ${s.alias} has no session yet \u2014 seed it first: lmctl seed <teamfile> (check with lmctl status <teamfile>)`):Wu(t,{provider:wl(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function yT(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=MM(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function BM(t,e,r,n,s){let i;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return A(t,`member not found: ${n}`);i=[a]}else i=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let c=wl(a),u=a.model??null,f=null;Co(c)&&(f=await ge(l,c));let d=yT(f),m=d.est>mi;o.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:m,model:u,resume_incantation:m?c_(c,l,u!==null?{model:u}:{}):null})}if(s)return ee(t,{estimate:!0,legend:_T,guide_tokens:mi,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2783
2783
  `),t.stdout.write(`${_T}
2784
2784
  `);for(let a of o){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
@@ -2820,12 +2820,12 @@ what it detected; use --force to overwrite an existing file (without
2820
2820
  tokens it surfaces the resume incantation so YOU can
2821
2821
  open & self-compact. Nothing is ever changed
2822
2822
  automatically; ${mi} is a guide, not a gate.
2823
- `),0}var DM,mi,_T,Hu=k(()=>{"use strict";tr();pt();de();gT();Oe();Ae();It();Ci();et();Vn();Rs();Fd();K();kr();DM={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},mi=2e5,_T="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});var TT={};se(TT,{runQuickrun:()=>YM});import{existsSync as HM,mkdirSync as XM,writeFileSync as qM}from"node:fs";import{basename as GM,dirname as JM,join as wT}from"node:path";function KM(t){let e=GM(t),r=wT(t,`${e}.lmctl`),n=2;for(;HM(r);)r=wT(t,`${e}${n}.lmctl`),n+=1;return r}async function YM(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(VM),0;let n=t.includes("--no-seed"),s=t.includes("--no-terminal"),i=t.filter(g=>g!=="--no-seed"&&g!=="--no-terminal"&&g!=="--help"&&g!=="-h");if(i.length!==1)return e.stderr.write(`usage: lmctl quickrun <url-or-path>
2824
- `),2;let o=i[0],a=r.cwd??process.cwd(),l=r.fetchFn??fetch,c=Ot(r.initConfigPath);if(c===null)return e.stderr.write("error: no ~/.lmctl/init.toml found. Run `lmctl init` first, then try quickrun again.\n"),1;let u;try{u=await Sr(o,l,a)}catch(g){return e.stderr.write(`error: could not fetch ${o}: ${g instanceof Error?g.message:String(g)}
2823
+ `),0}var DM,mi,_T,Hu=k(()=>{"use strict";tr();pt();de();gT();Oe();Ae();It();Ci();et();Vn();Rs();Fd();K();kr();DM={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},mi=2e5,_T="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});var TT={};se(TT,{runQuickrun:()=>YM});import{existsSync as HM,mkdirSync as XM,writeFileSync as qM}from"node:fs";import{basename as GM,dirname as JM,join as wT}from"node:path";function KM(t){let e=GM(t),r=wT(t,`${e}.lmctl`),n=2;for(;HM(r);)r=wT(t,`${e}${n}.lmctl`),n+=1;return r}async function YM(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(VM),0;let n=t.includes("--no-seed"),s=t.includes("--no-terminal"),i=t.filter(h=>h!=="--no-seed"&&h!=="--no-terminal"&&h!=="--help"&&h!=="-h");if(i.length!==1)return e.stderr.write(`usage: lmctl quickrun <url-or-path>
2824
+ `),2;let o=i[0],a=r.cwd??process.cwd(),l=r.fetchFn??fetch,c=Ot(r.initConfigPath);if(c===null)return e.stderr.write("error: no ~/.lmctl/init.toml found. Run `lmctl init` first, then try quickrun again.\n"),1;let u;try{u=await Sr(o,l,a)}catch(h){return e.stderr.write(`error: could not fetch ${o}: ${h instanceof Error?h.message:String(h)}
2825
2825
  `),1}let f=HE(u,c),d=KM(a);if(XM(JM(d),{recursive:!0}),qM(d,f,"utf8"),e.stdout.write(`Wrote ${d}
2826
2826
  `),await Lt([d],e)!==0)return e.stderr.write(`error: ${d} failed lint after substitution -- check the values in ~/.lmctl/init.toml.
2827
2827
  `),1;if(n)return e.stdout.write(`Edit ${d} if needed, then run: lmctl seed ${d}
2828
- `),0;let h=await Vr([d],e);return h!==0?h:s?0:(r.openTerminal??Bu)([d,"Lead"],e)}var VM,vT=k(()=>{"use strict";Mn();di();gt();Hu();VM=`usage: lmctl quickrun <url-or-path>
2828
+ `),0;let g=await Vr([d],e);return g!==0?g:s?0:(r.openTerminal??Bu)([d,"Lead"],e)}var VM,vT=k(()=>{"use strict";Mn();di();gt();Hu();VM=`usage: lmctl quickrun <url-or-path>
2829
2829
 
2830
2830
  Fetches a .lmctl teamfile template (any https:// URL or local file/dir
2831
2831
  path -- lmctl.com publishes example templates, but this is not restricted
@@ -2842,8 +2842,8 @@ taken, so quickrun never overwrites an existing teamfile.
2842
2842
  --no-seed Write the resolved teamfile but do not seed or open it
2843
2843
  --no-terminal Seed, but do not open the Lead's terminal afterward
2844
2844
  -h, --help display help for command
2845
- `});var bT={};se(bT,{runHello:()=>eD});import{writeFileSync as zM}from"node:fs";import{join as QM}from"node:path";async function eD(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(ZM),0;let n,s,i=[];for(let h=0;h<t.length;h+=1){let y=t[h];if(y==="-p"||y==="--prompt"){s=t[h+1],h+=1;continue}i.push(y)}if(i.length===1&&(n=i[0]),n===void 0||s===void 0)return e.stderr.write(`usage: lmctl hello <provider> -p "<prompt>"
2846
- `),2;let o=r.cwd??process.cwd(),a=r.fetchFn??fetch,l=`${ST}/${n}.lmctl`,c;try{c=await Sr(l,a,o)}catch(h){return e.stderr.write(`error: could not fetch ${l}: ${h instanceof Error?h.message:String(h)}
2845
+ `});var bT={};se(bT,{runHello:()=>eD});import{writeFileSync as zM}from"node:fs";import{join as QM}from"node:path";async function eD(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(ZM),0;let n,s,i=[];for(let g=0;g<t.length;g+=1){let y=t[g];if(y==="-p"||y==="--prompt"){s=t[g+1],g+=1;continue}i.push(y)}if(i.length===1&&(n=i[0]),n===void 0||s===void 0)return e.stderr.write(`usage: lmctl hello <provider> -p "<prompt>"
2846
+ `),2;let o=r.cwd??process.cwd(),a=r.fetchFn??fetch,l=`${ST}/${n}.lmctl`,c;try{c=await Sr(l,a,o)}catch(g){return e.stderr.write(`error: could not fetch ${l}: ${g instanceof Error?g.message:String(g)}
2847
2847
  `),1}let u=QM(o,`${n}_hello.lmctl`);if(zM(u,c,"utf8"),e.stdout.write(`Wrote ${u}
2848
2848
  `),await Lt([u],e)!==0)return e.stderr.write(`error: ${u} failed lint -- lmctl.com's ${n}.lmctl example may be out of date.
2849
2849
  `),1;let d=await Vr([u],e);return d!==0?d:(r.sendPrompt??Ws)([u,"Lead",s],e)}var ST,ZM,IT=k(()=>{"use strict";di();gt();Hs();ST="https://lmctl.com/helloexample",ZM=`usage: lmctl hello <provider> -p "<prompt>"
@@ -2877,16 +2877,16 @@ Example:
2877
2877
 
2878
2878
  `),assistantTimestamp:CD(s[s.length-1]?.timestamp)}}function CD(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function OD(t){if(!(t===null||t.trim()===""))try{let e=JSON.parse(t);if(!Array.isArray(e))return;let r=e.filter(n=>typeof n=="string"&&n.length>0);return r.length>0?r:void 0}catch{return}}function Vu(t){let e=OD(t.config_warnings);return{id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:Zt(t),from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:CT(t.result_summary),error:CT(t.error),...e!==void 0?{config_warnings:e}:{}}}function MD(t,e){return t.scope==="self"?$D(t,e):FD(t,e)}function DD(t){if(t===null)return"idle";let e=t.holder_pid!==null?`pid ${t.holder_pid}${t.holder_host!==null?` on ${t.holder_host}`:""}`:"holder",r=t.reason==="dead-pid"?"appears dead -- usually a mid-turn kill, most often a shell `timeout` wrapper; use --idle-timeout instead":"stale";return`idle (reclaimable lock: ${e} ${r})`}function $D(t,e){let r=[];r.push(`identity: ${t.identity}`),r.push(`team: ${t.team.name}`),r.push(`teamfile: ${t.team.teamfile}`),r.push(""),r.push("members:"),t.members.length===0&&r.push(" none");for(let n of t.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?DD(n.reclaimable):`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("transcript harvest:"),PT(r,t.transcript_harvest,"self"),r.push(""),r.push("activity from me:"),Ku(r,Yu(t.activity.from_me,e.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Ku(r,Yu(t.activity.to_me,e.sinceIso),"to-me"),r.push(""),r.push(FT(t)),r.join(`
2879
2879
  `)}function FD(t,e){let r=[];r.push("scope: db"),r.push("identity: none"),r.push(""),r.push("teams:"),t.teams.length===0&&r.push(" none");for(let n of t.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("transcript harvest:"),PT(r,t.transcript_harvest,"db"),r.push(""),r.push("recent activity:"),Ku(r,Yu(t.activity,e.sinceIso),"db"),r.push(""),r.push(FT(t)),r.join(`
2880
- `)}function FT(t){return Un(t.db_path)}function Ku(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,Oa))PD(t,n,r);UT(t,e.length,Oa,"older")}function PT(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,Oa)){let s=r==="db"?` from ${Mt(n.from_identity)} -> ${Mt(n.target)}`:` -> ${Mt(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;t.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else t.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&t.push(` inspect: ${n.tail_hint}`)}UT(t,e.length,Oa,"more transcript harvest rows")}function Yu(t,e){let r=Date.parse(e);return Number.isFinite(r)?t.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):t}function PD(t,e,r){let n=jD(e,r),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${jT(i)}"`;if(t.push(` #${e.id} ${UD(e)} ${e.kind}${n} ${s}${o}`),e.config_warnings!==void 0)for(let a of e.config_warnings)t.push(` config not applied: ${a}`)}function UD(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.status.toUpperCase()}function jD(t,e){if(e==="from-me")return t.target===null?"":` -> ${Mt(t.target)}`;if(e==="to-me")return` from ${Mt(t.from_identity)}`;let r=t.target===null?"":` -> ${Mt(t.target)}`;return` from ${Mt(t.from_identity)}${r}`}function UT(t,e,r,n){let s=e-r;s>0&&t.push(` (+${s} ${n} -- use --json)`)}function CT(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function jT(t){let e=t.replace(/\s+/g," ").trim();return e.length<=RT?e:`${e.slice(0,RT-3)}...`}function BD(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=NT?e:`${e.slice(0,NT-3)}...`}function Da(t){return(0,Ue.formatDuration)(t)}function fi(t){return(0,Ue.formatRelativeTime)(t)}function Mt(t){if(t==="operator")return t;try{let e=Wt(t);return`${fD(e.teamfile)}:${e.alias}`}catch{return t}}function WD(t){if(t===void 0)return{iso:new Date(Date.now()-yD).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}async function HD(t,e,r,n){let s=await L(t,u=>{let f=me(e,u),d=Ye(f,u);if(d.parseErrors.length>0)throw new Error(d.parseErrors.join("; "));return{teamfile:f,teamName:d.name,targets:ai(f,u,new Set,[])}}),i=wu(s.teamfile),o=i.kind==="repo"?i:null,a=await li(t,s.targets),l=[],c=0;for(let u of s.targets){let f={alias:u.alias,reportPath:u.reportPath,teamfile:u.teamfile,provider:u.provider,sessionid:u.sessionid,declaredModel:u.model,liveness:a.get($n(u.teamfile,u.alias))??Ta(),probed:!1,detailLoaded:!1},d=await yu(t,{teamfile:u.teamfile,alias:u.alias});if(d!==void 0&&(f.configWarnings=d),n&&u.sessionid!==null){f.probed=!0;let m=null;try{m=await ge(u.sessionid,u.provider)}catch(h){t.stderr.write(`warning: failed to load session "${u.sessionid}" for ${u.reportPath} (${u.provider}): ${h instanceof Error?h.message:String(h)}
2881
- `)}f.detailLoaded=m!==null,f.messageCount=m?.messageCount??null,f.observedModel=m?.model??"(unknown)",f.lastContext=m?.lastInputTokens??null,f.totalInputTokens=m?.totalInputTokens??null,f.totalOutputTokens=m?.totalOutputTokens??null,m?.totalCachedInputTokens!==void 0&&(f.totalCachedInputTokens=m.totalCachedInputTokens),f.sessionLimit=m===null?null:Xu(m.messages),o!==null&&(f.activitySinceLastCommit={messageCount:m===null?null:Tu(m,o.since),tokens:null},f.cumulativeTokens=m===null?null:vu(m)??"n/a"),m?.messageCount===void 0?c=void 0:c!==void 0&&(c+=m.messageCount)}l.push(f)}return r?(ee(t,{schema_version:zu,scope:"team",team:s.teamName,teamfile:s.teamfile,details:n,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(u=>({ref:u.ref,timestamp:u.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(u=>{let f={alias:u.alias,reportPath:u.reportPath,teamfile:u.teamfile,provider:u.provider,sessionid:u.sessionid,seeded:u.sessionid!==null,model:u.declaredModel,liveness:u.liveness};return u.configWarnings!==void 0&&(f.config_warnings=u.configWarnings),u.probed&&(f.messageCount=u.messageCount??null,f.observed_model=u.observedModel,f.lastContext=u.lastContext??null,f.totalInputTokens=u.totalInputTokens??null,f.totalOutputTokens=u.totalOutputTokens??null,u.totalCachedInputTokens!==void 0&&(f.totalCachedInputTokens=u.totalCachedInputTokens),f.sessionLimit=u.sessionLimit??null,u.activitySinceLastCommit!==void 0&&(f.activitySinceLastCommit=u.activitySinceLastCommit),u.cumulativeTokens!==void 0&&(f.cumulativeTokens=u.cumulativeTokens==="n/a"?null:u.cumulativeTokens)),f}),...n?{total:{messageCount:c??null}}:{}}),0):(t.stdout.write(GD(s.teamName,s.teamfile,i,l,n,c)),0)}function XD(t){return t.sessionid??"(not seeded)"}function qD(t){return t.sessionid===null?"not seeded":va(t.liveness)}function GD(t,e,r,n,s,i){let o=[],a=r.kind==="repo"?r:null;if(o.push(`TEAM: ${t}`),o.push(`teamfile: ${e}`),r.kind==="repo"){o.push("Git progress:");for(let y of r.commits)o.push(` ${y.ref}: ${y.timestamp.toISOString()}`);o.push(` Uncommitted: ${at(r.working.uncommittedTracked)} changed (tracked), ${at(r.working.untracked)} untracked`)}else r.reason==="no-commits"?o.push(`Git progress: git repository in ${r.teamDir} has no commits (no commit-based progress to report)`):o.push(`Git progress: no git repository in ${r.teamDir} (no commit-based progress to report)`);if(!s){o.push("members:"),n.length===0&&o.push(" none");for(let y of n){let g=y.declaredModel===null?"":` model=${y.declaredModel}`;if(y.sessionid===null?o.push(` ${y.reportPath}: not seeded provider=${y.provider}${g} (run: lmctl seed "${y.teamfile}")`):o.push(` ${y.reportPath}: ${va(y.liveness)} provider=${y.provider}${g} session=${y.sessionid}`),y.configWarnings!==void 0)for(let p of y.configWarnings)o.push(` config not applied: ${p}`)}return o.push(""),o.push("session detail (observed model, messages, tokens, limits) not probed -- use --details"),`${o.join(`
2880
+ `)}function FT(t){return Un(t.db_path)}function Ku(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,Oa))PD(t,n,r);UT(t,e.length,Oa,"older")}function PT(t,e,r){if(e.length===0){t.push(" none");return}for(let n of e.slice(0,Oa)){let s=r==="db"?` from ${Mt(n.from_identity)} -> ${Mt(n.target)}`:` -> ${Mt(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;t.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else t.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&t.push(` inspect: ${n.tail_hint}`)}UT(t,e.length,Oa,"more transcript harvest rows")}function Yu(t,e){let r=Date.parse(e);return Number.isFinite(r)?t.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):t}function PD(t,e,r){let n=jD(e,r),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,i=e.error??e.result,o=i===null?"":` "${jT(i)}"`;if(t.push(` #${e.id} ${UD(e)} ${e.kind}${n} ${s}${o}`),e.config_warnings!==void 0)for(let a of e.config_warnings)t.push(` config not applied: ${a}`)}function UD(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.status.toUpperCase()}function jD(t,e){if(e==="from-me")return t.target===null?"":` -> ${Mt(t.target)}`;if(e==="to-me")return` from ${Mt(t.from_identity)}`;let r=t.target===null?"":` -> ${Mt(t.target)}`;return` from ${Mt(t.from_identity)}${r}`}function UT(t,e,r,n){let s=e-r;s>0&&t.push(` (+${s} ${n} -- use --json)`)}function CT(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function jT(t){let e=t.replace(/\s+/g," ").trim();return e.length<=RT?e:`${e.slice(0,RT-3)}...`}function BD(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=NT?e:`${e.slice(0,NT-3)}...`}function Da(t){return(0,Ue.formatDuration)(t)}function fi(t){return(0,Ue.formatRelativeTime)(t)}function Mt(t){if(t==="operator")return t;try{let e=Wt(t);return`${fD(e.teamfile)}:${e.alias}`}catch{return t}}function WD(t){if(t===void 0)return{iso:new Date(Date.now()-yD).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}async function HD(t,e,r,n){let s=await L(t,u=>{let f=me(e,u),d=Ye(f,u);if(d.parseErrors.length>0)throw new Error(d.parseErrors.join("; "));return{teamfile:f,teamName:d.name,targets:ai(f,u,new Set,[])}}),i=wu(s.teamfile),o=i.kind==="repo"?i:null,a=await li(t,s.targets),l=[],c=0;for(let u of s.targets){let f={alias:u.alias,reportPath:u.reportPath,teamfile:u.teamfile,provider:u.provider,sessionid:u.sessionid,declaredModel:u.model,liveness:a.get($n(u.teamfile,u.alias))??Ta(),probed:!1,detailLoaded:!1},d=await yu(t,{teamfile:u.teamfile,alias:u.alias});if(d!==void 0&&(f.configWarnings=d),n&&u.sessionid!==null){f.probed=!0;let m=null;try{m=await ge(u.sessionid,u.provider)}catch(g){t.stderr.write(`warning: failed to load session "${u.sessionid}" for ${u.reportPath} (${u.provider}): ${g instanceof Error?g.message:String(g)}
2881
+ `)}f.detailLoaded=m!==null,f.messageCount=m?.messageCount??null,f.observedModel=m?.model??"(unknown)",f.lastContext=m?.lastInputTokens??null,f.totalInputTokens=m?.totalInputTokens??null,f.totalOutputTokens=m?.totalOutputTokens??null,m?.totalCachedInputTokens!==void 0&&(f.totalCachedInputTokens=m.totalCachedInputTokens),f.sessionLimit=m===null?null:Xu(m.messages),o!==null&&(f.activitySinceLastCommit={messageCount:m===null?null:Tu(m,o.since),tokens:null},f.cumulativeTokens=m===null?null:vu(m)??"n/a"),m?.messageCount===void 0?c=void 0:c!==void 0&&(c+=m.messageCount)}l.push(f)}return r?(ee(t,{schema_version:zu,scope:"team",team:s.teamName,teamfile:s.teamfile,details:n,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(u=>({ref:u.ref,timestamp:u.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(u=>{let f={alias:u.alias,reportPath:u.reportPath,teamfile:u.teamfile,provider:u.provider,sessionid:u.sessionid,seeded:u.sessionid!==null,model:u.declaredModel,liveness:u.liveness};return u.configWarnings!==void 0&&(f.config_warnings=u.configWarnings),u.probed&&(f.messageCount=u.messageCount??null,f.observed_model=u.observedModel,f.lastContext=u.lastContext??null,f.totalInputTokens=u.totalInputTokens??null,f.totalOutputTokens=u.totalOutputTokens??null,u.totalCachedInputTokens!==void 0&&(f.totalCachedInputTokens=u.totalCachedInputTokens),f.sessionLimit=u.sessionLimit??null,u.activitySinceLastCommit!==void 0&&(f.activitySinceLastCommit=u.activitySinceLastCommit),u.cumulativeTokens!==void 0&&(f.cumulativeTokens=u.cumulativeTokens==="n/a"?null:u.cumulativeTokens)),f}),...n?{total:{messageCount:c??null}}:{}}),0):(t.stdout.write(GD(s.teamName,s.teamfile,i,l,n,c)),0)}function XD(t){return t.sessionid??"(not seeded)"}function qD(t){return t.sessionid===null?"not seeded":va(t.liveness)}function GD(t,e,r,n,s,i){let o=[],a=r.kind==="repo"?r:null;if(o.push(`TEAM: ${t}`),o.push(`teamfile: ${e}`),r.kind==="repo"){o.push("Git progress:");for(let y of r.commits)o.push(` ${y.ref}: ${y.timestamp.toISOString()}`);o.push(` Uncommitted: ${at(r.working.uncommittedTracked)} changed (tracked), ${at(r.working.untracked)} untracked`)}else r.reason==="no-commits"?o.push(`Git progress: git repository in ${r.teamDir} has no commits (no commit-based progress to report)`):o.push(`Git progress: no git repository in ${r.teamDir} (no commit-based progress to report)`);if(!s){o.push("members:"),n.length===0&&o.push(" none");for(let y of n){let h=y.declaredModel===null?"":` model=${y.declaredModel}`;if(y.sessionid===null?o.push(` ${y.reportPath}: not seeded provider=${y.provider}${h} (run: lmctl seed "${y.teamfile}")`):o.push(` ${y.reportPath}: ${va(y.liveness)} provider=${y.provider}${h} session=${y.sessionid}`),y.configWarnings!==void 0)for(let p of y.configWarnings)o.push(` config not applied: ${p}`)}return o.push(""),o.push("session detail (observed model, messages, tokens, limits) not probed -- use --details"),`${o.join(`
2882
2882
  `)}
2883
- `}let l=a!==null?["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT","MSGS SINCE COMMIT","TOKENS SINCE COMMIT","TOKENS (cumulative)"]:["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT"],c=l.map((y,g)=>g>=5?"right":"left"),u=!1,f=n.filter(y=>y.sessionLimit!=null),d=[];for(let y of n){let g=nw(y.lastContext??void 0,y.detailLoaded,tw);(g==="n/a"||y.cumulativeTokens==="n/a")&&(u=!0);let p=[(0,Ue.escapeCell)(XD(y)),(0,Ue.escapeCell)(y.reportPath),(0,Ue.escapeCell)(y.provider),(0,Ue.escapeCell)(y.observedModel??"(unknown)"),qD(y),at(y.messageCount),g];a!==null&&p.push(at(y.activitySinceLastCommit?.messageCount),at(y.activitySinceLastCommit?.tokens),rw(y.cumulativeTokens)),d.push(p)}let m=["TOTAL","","","","",at(i)];a!==null&&m.push("",at(JD(n)),at(null),at(VD(n))),d.push(m);let h=(0,Ue.formatTable)(d,{headers:l,align:c,margin:2}).split(`
2884
- `);if(o.push(h[0]),n.forEach((y,g)=>{if(o.push(h[g+1]),y.configWarnings!==void 0)for(let p of y.configWarnings)o.push(` config not applied: ${p}`)}),o.push(h[h.length-1]),u&&o.push("n/a = this provider does not expose a context/token total; absence is not a health signal."),o.push(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
2883
+ `}let l=a!==null?["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT","MSGS SINCE COMMIT","TOKENS SINCE COMMIT","TOKENS (cumulative)"]:["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT"],c=l.map((y,h)=>h>=5?"right":"left"),u=!1,f=n.filter(y=>y.sessionLimit!=null),d=[];for(let y of n){let h=nw(y.lastContext??void 0,y.detailLoaded,tw);(h==="n/a"||y.cumulativeTokens==="n/a")&&(u=!0);let p=[(0,Ue.escapeCell)(XD(y)),(0,Ue.escapeCell)(y.reportPath),(0,Ue.escapeCell)(y.provider),(0,Ue.escapeCell)(y.observedModel??"(unknown)"),qD(y),at(y.messageCount),h];a!==null&&p.push(at(y.activitySinceLastCommit?.messageCount),at(y.activitySinceLastCommit?.tokens),rw(y.cumulativeTokens)),d.push(p)}let m=["TOTAL","","","","",at(i)];a!==null&&m.push("",at(JD(n)),at(null),at(VD(n))),d.push(m);let g=(0,Ue.formatTable)(d,{headers:l,align:c,margin:2}).split(`
2884
+ `);if(o.push(g[0]),n.forEach((y,h)=>{if(o.push(g[h+1]),y.configWarnings!==void 0)for(let p of y.configWarnings)o.push(` config not applied: ${p}`)}),o.push(g[g.length-1]),u&&o.push("n/a = this provider does not expose a context/token total; absence is not a health signal."),o.push(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
2885
2885
  Right after a compaction the last completed turn IS the summarisation request, which carried the
2886
2886
  full pre-compaction prompt \u2014 so this reads the OLD large number while the live context is already
2887
2887
  small. Re-read after the next turn before concluding a compaction failed or gating on the value.`),f.length>0){o.push("Session limits:");for(let y of f)o.push(` ${y.reportPath}: LIMITED resets_at=${Eu(y.sessionLimit)}`)}return`${o.join(`
2888
2888
  `)}
2889
- `}function JD(t){let e=0;for(let r of t){let n=r.activitySinceLastCommit?.messageCount;n==null?e=void 0:e!==void 0&&(e+=n)}return e}function VD(t){let e=0;for(let r of t){let n=r.cumulativeTokens;n==null||n==="n/a"?e=void 0:e!==void 0&&(e+=n)}return e}async function KD(t,e,r,n){let s=await L(t,h=>he(e,r,h)),i;try{i=await ge(s.sessionid,s.provider)}catch(h){return A(t,`status: failed to load session: ${h instanceof Error?h.message:String(h)}`)}if(i===null)return A(t,`status: session not found: ${s.sessionid} (provider=${s.provider})`);let o=Xu(i.messages),l=(await li(t,[{teamfile:s.teamfile,alias:s.alias}])).get($n(s.teamfile,s.alias))??Ta(),c=await yu(t,{teamfile:s.teamfile,alias:s.alias}),u=wu(s.teamfile),f=u.kind==="repo"?u:null,d={provider:i.provider,sessionid:i.sessionId,seeded:!0,alias:s.alias,teamfile:s.teamfile,reportPath:s.alias,cwd:i.cwd,messageCount:i.messageCount??null,model:s.model??null,observed_model:i.model??null,lastContext:i.lastInputTokens??null,liveness:l,totalInputTokens:i.totalInputTokens??null,totalOutputTokens:i.totalOutputTokens??null,...i.totalCachedInputTokens!==void 0?{totalCachedInputTokens:i.totalCachedInputTokens}:{},sessionLimit:o,...c!==void 0?{config_warnings:c}:{},...f!==null?{activitySinceLastCommit:{messageCount:Tu(i,f.since),tokens:null},cumulativeTokens:vu(i)}:{},createdAt:i.createdAt.toISOString(),modifiedAt:i.modifiedAt.toISOString()};if(n)return ee(t,{schema_version:zu,scope:"member",...d}),0;let m=[];if(m.push(`Session: ${i.sessionId}`),m.push(` Provider: ${i.provider}`),m.push(` Alias: ${s.alias}`),m.push(` Liveness: ${va(l)}`),m.push(` CWD: ${i.cwd}`),m.push(` Messages: ${at(i.messageCount)}`),m.push(` Model (declared): ${s.model??"(none)"}`),m.push(` Model (observed): ${i.model??"(unknown)"}`),c!==void 0)for(let h of c)m.push(` Config NOT applied: ${h}`);if(i.totalInputTokens===void 0||i.totalOutputTokens===void 0)m.push(" Tokens: n/a");else{let h=` Tokens: ${(0,Ue.formatCount)(i.totalInputTokens)} in / ${(0,Ue.formatCount)(i.totalOutputTokens)} out`;d.totalCachedInputTokens!==void 0&&(h+=` (cached: ${(0,Ue.formatCount)(d.totalCachedInputTokens)})`),m.push(h)}return(i.totalInputTokens===void 0||i.totalOutputTokens===void 0)&&m.push(" n/a = this provider does not expose a context/token total; absence is not a health signal."),m.push(` lastContext = prompt size of the LAST COMPLETED turn; it LAGS BY ONE TURN. Right after a
2889
+ `}function JD(t){let e=0;for(let r of t){let n=r.activitySinceLastCommit?.messageCount;n==null?e=void 0:e!==void 0&&(e+=n)}return e}function VD(t){let e=0;for(let r of t){let n=r.cumulativeTokens;n==null||n==="n/a"?e=void 0:e!==void 0&&(e+=n)}return e}async function KD(t,e,r,n){let s=await L(t,g=>he(e,r,g)),i;try{i=await ge(s.sessionid,s.provider)}catch(g){return A(t,`status: failed to load session: ${g instanceof Error?g.message:String(g)}`)}if(i===null)return A(t,`status: session not found: ${s.sessionid} (provider=${s.provider})`);let o=Xu(i.messages),l=(await li(t,[{teamfile:s.teamfile,alias:s.alias}])).get($n(s.teamfile,s.alias))??Ta(),c=await yu(t,{teamfile:s.teamfile,alias:s.alias}),u=wu(s.teamfile),f=u.kind==="repo"?u:null,d={provider:i.provider,sessionid:i.sessionId,seeded:!0,alias:s.alias,teamfile:s.teamfile,reportPath:s.alias,cwd:i.cwd,messageCount:i.messageCount??null,model:s.model??null,observed_model:i.model??null,lastContext:i.lastInputTokens??null,liveness:l,totalInputTokens:i.totalInputTokens??null,totalOutputTokens:i.totalOutputTokens??null,...i.totalCachedInputTokens!==void 0?{totalCachedInputTokens:i.totalCachedInputTokens}:{},sessionLimit:o,...c!==void 0?{config_warnings:c}:{},...f!==null?{activitySinceLastCommit:{messageCount:Tu(i,f.since),tokens:null},cumulativeTokens:vu(i)}:{},createdAt:i.createdAt.toISOString(),modifiedAt:i.modifiedAt.toISOString()};if(n)return ee(t,{schema_version:zu,scope:"member",...d}),0;let m=[];if(m.push(`Session: ${i.sessionId}`),m.push(` Provider: ${i.provider}`),m.push(` Alias: ${s.alias}`),m.push(` Liveness: ${va(l)}`),m.push(` CWD: ${i.cwd}`),m.push(` Messages: ${at(i.messageCount)}`),m.push(` Model (declared): ${s.model??"(none)"}`),m.push(` Model (observed): ${i.model??"(unknown)"}`),c!==void 0)for(let g of c)m.push(` Config NOT applied: ${g}`);if(i.totalInputTokens===void 0||i.totalOutputTokens===void 0)m.push(" Tokens: n/a");else{let g=` Tokens: ${(0,Ue.formatCount)(i.totalInputTokens)} in / ${(0,Ue.formatCount)(i.totalOutputTokens)} out`;d.totalCachedInputTokens!==void 0&&(g+=` (cached: ${(0,Ue.formatCount)(d.totalCachedInputTokens)})`),m.push(g)}return(i.totalInputTokens===void 0||i.totalOutputTokens===void 0)&&m.push(" n/a = this provider does not expose a context/token total; absence is not a health signal."),m.push(` lastContext = prompt size of the LAST COMPLETED turn; it LAGS BY ONE TURN. Right after a
2890
2890
  compaction it still reports the pre-compaction size (the summarisation request itself).`),o!==null&&m.push(` SessionLimit: LIMITED resets_at=${Eu(o)}`),m.push(` Created: ${d.createdAt}`),m.push(` Modified: ${d.modifiedAt}`),t.stdout.write(`${m.join(`
2891
2891
  `)}
2892
2892
  `),0}var Ue,_D,zu,Oa,yD,RT,NT,wD,Qu=k(()=>{"use strict";Ue=ct(tt(),1);et();de();Ns();_t();kn();Et();Oe();Su();ts();pt();AT();_D=`usage: lmctl status [--json] [--since <duration|ISO8601>]
@@ -2909,21 +2909,21 @@ breakdown, liveness with terminal-lock/in-flight holder info).
2909
2909
 
2910
2910
  --json emits { schema_version: 2, scope: 'self'|'db'|'team'|'member', ... }.
2911
2911
  `,zu=2,Oa=5,yD=24*60*60*1e3,RT=72,NT=80;wD={name:"status",allowsBareTeamfile:!0,supportsRaw:!1}});var VT={};se(VT,{_setRunningWatchMaxTicksForTests:()=>QD,runRunning:()=>c$});function QD(t){nm=t??void 0}function e$(t){let e=t.split(`
2912
- `,1)[0];return e.length<=HT?e:`${e.slice(0,HT)}\u2026`}function $a(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function em(t,e){let r=t.target_teamfile,n=t.target_alias;if(r===null||n===null)return Zu;let s=e.get(r);if(s===void 0){try{s=ae(r)}catch{s=null}e.set(r,s)}return s===null?Zu:Ii(s,n)?.model??Zu}function sm(t){return t.target!==null?Mt(t.target):t.from_identity}function XT(t){return[(0,lt.escapeCell)(sm(t)),t.kind,"running",t.holder_liveness,(0,lt.escapeCell)(t.model),fi(t.started_at)]}function qT(t){return[(0,lt.escapeCell)(sm(t)),t.kind,"DEAD","",(0,lt.escapeCell)(t.model),`stale ${fi(t.started_at)}, holder process confirmed dead`]}function GT(t){let e=`ran ${Da(t.ran_ms)}, idle ${fi(t.ended_at)}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${(0,lt.escapeCell)(e$(t.error))}`),[(0,lt.escapeCell)(sm(t)),t.kind,t.status,"",(0,lt.escapeCell)(t.model),e]}function tm(t){return t.filter(e=>e!=="").join(" ")}function JT(t){let e=new Map(t.map(i=>[i.id,i])),r=new Map,n=[];for(let i of t){let o=i.parent_invocation_id;if(o!==null&&e.has(o)){let a=r.get(o)??[];a.push(i),r.set(o,a)}else n.push(i)}let s=(i,o)=>o.started_at.localeCompare(i.started_at);n.sort(s);for(let i of r.values())i.sort(s);return{roots:n,childrenByParent:r}}function r$(t){let{roots:e,childrenByParent:r}=JT(t),n=[],s=(i,o)=>{n.push(`${" ".repeat(o+1)}${i.line}`);for(let a of r.get(i.id)??[])s(a,o+1)};for(let i of e)s(i,0);return n}function n$(t,e,r){let n=[...t.map(a=>({state:"running",...a})),...e.map(a=>({state:"dead",...a})),...r.map(a=>({state:"idle",...a}))],{roots:s,childrenByParent:i}=JT(n),o=a=>({...a,children:(i.get(a.id)??[]).map(o)});return s.map(o)}function s$(t){if(t===void 0)return{windowMs:YD};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2];return{windowMs:(s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400)*1e3}}let r=Date.parse(t);return Number.isFinite(r)?{windowMs:Math.max(0,Date.now()-r)}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}function rm(t,e){return!(e.teamfile!==void 0&&t.target_teamfile!==e.teamfile||e.member!==void 0&&(t.target_alias??"").toLowerCase()!==e.member)}function i$(t,e,r={}){let n=Date.now(),s=t.listAllRunningTrackedInvocations().filter(m=>rm(m,e)),i=new Map,o=[],a=[];for(let m of s){let h=Zt(m),y=n-new Date(m.started_at).getTime(),g={id:m.id,kind:m.kind,origin:m.origin,from_identity:m.from_identity,target:$a(m),model:em(m,i),started_at:m.started_at,parent_invocation_id:m.parent_invocation_id};if(h==="dead"){if(vl(t,m)!==null)continue;a.push({...g,stale_for_ms:y})}else o.push({...g,running_for_ms:y,holder_liveness:h??"unknown"})}let l=new Set(s.map($a).filter(m=>m!==null)),c=new Date(n-e.idleWindowMs).toISOString(),u=t.listRecentlyFinishedTrackedInvocations(c).filter(m=>rm(m,e)),f=new Set,d=[];for(let m of u){let h=$a(m);h===null||l.has(h)||f.has(h)||(f.add(h),d.push({id:m.id,kind:m.kind,origin:m.origin,from_identity:m.from_identity,target:h,model:em(m,i),status:m.status,started_at:m.started_at,ended_at:m.ended_at,idle_ms:n-new Date(m.ended_at).getTime(),ran_ms:new Date(m.ended_at).getTime()-new Date(m.started_at).getTime(),error:m.error,parent_invocation_id:m.parent_invocation_id}))}if(r.tree===!0){let m=new Set([...o.map(y=>y.id),...a.map(y=>y.id),...d.map(y=>y.id)]),h=[...m];for(;h.length>0;){let y=t.listFinishedTrackedInvocationChildren(h,c).filter(g=>!m.has(g.id)&&rm(g,e));if(y.length===0)break;h=[];for(let g of y){m.add(g.id),h.push(g.id);let p=$a(g);d.push({id:g.id,kind:g.kind,origin:g.origin,from_identity:g.from_identity,target:p,model:em(g,i),status:g.status,started_at:g.started_at,ended_at:g.ended_at,idle_ms:n-new Date(g.ended_at).getTime(),ran_ms:new Date(g.ended_at).getTime()-new Date(g.started_at).getTime(),error:g.error,parent_invocation_id:g.parent_invocation_id})}}}return{running:o,dead:a,idle:d}}function o$(t,e){return e?{schema_version:WT,tree:n$(t.running,t.dead,t.idle)}:{schema_version:WT,...t}}function a$(t){let e=[...t.running.map(n=>({id:n.id,parent_invocation_id:n.parent_invocation_id,started_at:n.started_at,line:tm(XT(n))})),...t.dead.map(n=>({id:n.id,parent_invocation_id:n.parent_invocation_id,started_at:n.started_at,line:tm(qT(n))})),...t.idle.map(n=>({id:n.id,parent_invocation_id:n.parent_invocation_id,started_at:n.started_at,line:tm(GT(n))}))],r=r$(e);return`${r.length>0?r.join(`
2912
+ `,1)[0];return e.length<=HT?e:`${e.slice(0,HT)}\u2026`}function $a(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function em(t,e){let r=t.target_teamfile,n=t.target_alias;if(r===null||n===null)return Zu;let s=e.get(r);if(s===void 0){try{s=ae(r)}catch{s=null}e.set(r,s)}return s===null?Zu:Ii(s,n)?.model??Zu}function sm(t){return t.target!==null?Mt(t.target):t.from_identity}function XT(t){return[(0,lt.escapeCell)(sm(t)),t.kind,"running",t.holder_liveness,(0,lt.escapeCell)(t.model),fi(t.started_at)]}function qT(t){return[(0,lt.escapeCell)(sm(t)),t.kind,"DEAD","",(0,lt.escapeCell)(t.model),`stale ${fi(t.started_at)}, holder process confirmed dead`]}function GT(t){let e=`ran ${Da(t.ran_ms)}, idle ${fi(t.ended_at)}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${(0,lt.escapeCell)(e$(t.error))}`),[(0,lt.escapeCell)(sm(t)),t.kind,t.status,"",(0,lt.escapeCell)(t.model),e]}function tm(t){return t.filter(e=>e!=="").join(" ")}function JT(t){let e=new Map(t.map(i=>[i.id,i])),r=new Map,n=[];for(let i of t){let o=i.parent_invocation_id;if(o!==null&&e.has(o)){let a=r.get(o)??[];a.push(i),r.set(o,a)}else n.push(i)}let s=(i,o)=>o.started_at.localeCompare(i.started_at);n.sort(s);for(let i of r.values())i.sort(s);return{roots:n,childrenByParent:r}}function r$(t){let{roots:e,childrenByParent:r}=JT(t),n=[],s=(i,o)=>{n.push(`${" ".repeat(o+1)}${i.line}`);for(let a of r.get(i.id)??[])s(a,o+1)};for(let i of e)s(i,0);return n}function n$(t,e,r){let n=[...t.map(a=>({state:"running",...a})),...e.map(a=>({state:"dead",...a})),...r.map(a=>({state:"idle",...a}))],{roots:s,childrenByParent:i}=JT(n),o=a=>({...a,children:(i.get(a.id)??[]).map(o)});return s.map(o)}function s$(t){if(t===void 0)return{windowMs:YD};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2];return{windowMs:(s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400)*1e3}}let r=Date.parse(t);return Number.isFinite(r)?{windowMs:Math.max(0,Date.now()-r)}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}function rm(t,e){return!(e.teamfile!==void 0&&t.target_teamfile!==e.teamfile||e.member!==void 0&&(t.target_alias??"").toLowerCase()!==e.member)}function i$(t,e,r={}){let n=Date.now(),s=t.listAllRunningTrackedInvocations().filter(m=>rm(m,e)),i=new Map,o=[],a=[];for(let m of s){let g=Zt(m),y=n-new Date(m.started_at).getTime(),h={id:m.id,kind:m.kind,origin:m.origin,from_identity:m.from_identity,target:$a(m),model:em(m,i),started_at:m.started_at,parent_invocation_id:m.parent_invocation_id};if(g==="dead"){if(vl(t,m)!==null)continue;a.push({...h,stale_for_ms:y})}else o.push({...h,running_for_ms:y,holder_liveness:g??"unknown"})}let l=new Set(s.map($a).filter(m=>m!==null)),c=new Date(n-e.idleWindowMs).toISOString(),u=t.listRecentlyFinishedTrackedInvocations(c).filter(m=>rm(m,e)),f=new Set,d=[];for(let m of u){let g=$a(m);g===null||l.has(g)||f.has(g)||(f.add(g),d.push({id:m.id,kind:m.kind,origin:m.origin,from_identity:m.from_identity,target:g,model:em(m,i),status:m.status,started_at:m.started_at,ended_at:m.ended_at,idle_ms:n-new Date(m.ended_at).getTime(),ran_ms:new Date(m.ended_at).getTime()-new Date(m.started_at).getTime(),error:m.error,parent_invocation_id:m.parent_invocation_id}))}if(r.tree===!0){let m=new Set([...o.map(y=>y.id),...a.map(y=>y.id),...d.map(y=>y.id)]),g=[...m];for(;g.length>0;){let y=t.listFinishedTrackedInvocationChildren(g,c).filter(h=>!m.has(h.id)&&rm(h,e));if(y.length===0)break;g=[];for(let h of y){m.add(h.id),g.push(h.id);let p=$a(h);d.push({id:h.id,kind:h.kind,origin:h.origin,from_identity:h.from_identity,target:p,model:em(h,i),status:h.status,started_at:h.started_at,ended_at:h.ended_at,idle_ms:n-new Date(h.ended_at).getTime(),ran_ms:new Date(h.ended_at).getTime()-new Date(h.started_at).getTime(),error:h.error,parent_invocation_id:h.parent_invocation_id})}}}return{running:o,dead:a,idle:d}}function o$(t,e){return e?{schema_version:WT,tree:n$(t.running,t.dead,t.idle)}:{schema_version:WT,...t}}function a$(t){let e=[...t.running.map(n=>({id:n.id,parent_invocation_id:n.parent_invocation_id,started_at:n.started_at,line:tm(XT(n))})),...t.dead.map(n=>({id:n.id,parent_invocation_id:n.parent_invocation_id,started_at:n.started_at,line:tm(qT(n))})),...t.idle.map(n=>({id:n.id,parent_invocation_id:n.parent_invocation_id,started_at:n.started_at,line:tm(GT(n))}))],r=r$(e);return`${r.length>0?r.join(`
2913
2913
  `):" none"}
2914
2914
  `}function l$(t,e){let r=[{title:`Running (${t.running.length}):`,rows:t.running.map(XT)},{title:`Dead (reclaimable) (${t.dead.length}):`,rows:t.dead.map(qT)},{title:`Idle, finished in the last ${Da(e)} (${t.idle.length}):`,rows:t.idle.map(GT)}],n=["MEMBER","KIND","STATE","LIVENESS","MODEL","TIMING"],s=(0,lt.measureColumns)([{rows:[],headers:n},...r.map(a=>a.rows)],{max:t$}),i=!1,o=[];return r.forEach((a,l)=>{if(l>0&&o.push(""),o.push(a.title),a.rows.length===0){o.push(" none");return}let c=!i;i=!0,o.push((0,lt.renderGrid)(a.rows,{widths:s,margin:2,...c?{headers:n}:{}}))}),`${o.join(`
2915
2915
  `)}
2916
2916
  `}async function c$(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${ZD}
2917
- `),0;let r=oe(t,["--team","--member","--since","--watch-interval"],["--json","--tree","--watch"]);if(r.error!==void 0)return A(e,r.error);let n=H(r,"--json"),s=H(r,"--tree"),i=H(r,"--watch"),o=W(r,"--team"),a=W(r,"--member"),l=s$(W(r,"--since"));if("error"in l)return A(e,l.error);let c=W(r,"--watch-interval"),u=c===void 0?zD:Number.parseInt(c.replace(/s$/,""),10);if(!Number.isFinite(u)||u<1)return A(e,`invalid --watch-interval "${c}" (expected <N>s, N\u22651)`);let f=()=>L(e,d=>{let m={...o!==void 0?{teamfile:me(o,d)}:{},...a!==void 0?{member:a.toLowerCase()}:{},idleWindowMs:l.windowMs},h=i$(d,m,{tree:s});if(n){let y=o$(h,s);return i?e.stdout.write(`${JSON.stringify(y)}
2918
- `):ee(e,y),0}return e.stdout.write(s?a$(h):l$(h,l.windowMs)),0});return i?await new Promise(d=>{let m=0,h=!1,y=_=>{clearInterval(_),d(0)},g=async _=>{if(!h){h=!0;try{await f()}catch(E){e.stderr.write(`running: ${E instanceof Error?E.message:String(E)}
2919
- `)}finally{h=!1}m+=1,nm!==void 0&&m>=nm&&y(_)}},p=setInterval(()=>{g(p)},u*1e3);g(p),process.once("SIGINT",()=>y(p)),process.once("SIGTERM",()=>y(p))}):f()}var lt,YD,WT,zD,nm,ZD,HT,Zu,t$,KT=k(()=>{"use strict";lt=ct(tt(),1);et();Zn();Ae();de();Qu();Et();YD=24*60*60*1e3,WT=3,zD=2;ZD=["usage: lmctl running [--team <file>] [--member <alias>] [--since <duration|ISO8601>]"," [--tree] [--watch] [--watch-interval Ns] [--json]","","Shows tracked_invocation activity DB-wide across the whole fleet, split","into three sections (flat mode, the default):",' - Running: status="running" with a live (or unverifiable cross-host)'," holder -- genuinely in-flight work.",' - Dead (reclaimable): status="running" but the holder process is'," confirmed dead -- an orphaned record, not active work. Its elapsed",' time is reported as staleness, not as "running", so a dead worker'," is never mistaken for one that is genuinely still building."," - Idle: targets with nothing running or dead, showing their most"," recent finish from the last 24 hours and how long they've been"," idle since.","","--team <file> narrows the view to one teamfile (path is canonicalized","before matching); --member <alias> narrows it to one member alias","(case-insensitive; combinable with --team). --since sets the lookback","window for the Idle section -- a relative duration (<n>s|m|h|d, e.g. 7d)","or an absolute ISO8601 timestamp (default 24h). Running and Dead are","point-in-time current state and are not time-filtered.","","--watch re-renders the full snapshot every --watch-interval (default 2s)","until interrupted (SIGINT/SIGTERM). With --json, each snapshot is emitted","as ONE compact JSON object per line (NDJSON).","","--tree shows the same rows as one hierarchical dispatch-lineage view","instead: no section headers (each row already carries its own status),","indented under the session that dispatched it (who woke whom), sorted","by the most recent root session first. A node is a specific turn at a","specific time, not a team:alias identity -- the same member can appear","as multiple nodes for its different turns. Lineage is only known for","turns dispatched by a NESTED `lmctl prompt`/`lmctl terminal` call made","from within another turn's own tool calls; anything else (a human's","direct dispatch, or a turn from before this feature existed) has no","recorded parent and shows as its own root. Unlike the flat Idle section,","--tree does NOT collapse finished rows to one per target: every finished","descendant of a node in view (within the --since window) is rendered, so","a `lmctl batch` run shows as its batch root with ALL of its per-prompt","turns nested underneath.","","Every row also carries `model`: the target member's declared `model=`",'read straight from its teamfile (no session/provider query) -- "default"',"when the teamfile has no model= attribute, the alias/file can't be","resolved, or there is no target at all. This is the DECLARED value only,","not necessarily what actually ran (see the MODEL column in `lmctl status","<teamfile> --details`).","","--json emits { schema_version, running, dead, idle } (flat, one array","per section, matching the three flat-mode sections -- each row carries","its own status/timing/error fields). --tree --json instead emits","{ schema_version, tree } -- an array of root nodes, each row's full",'fields plus a "state" discriminant ("running"/"dead"/"idle") and a','"children" array of the same shape, nested per the dispatch lineage.',"","Queries lmctl's own database only -- never touches native provider","session files."].join(`
2917
+ `),0;let r=oe(t,["--team","--member","--since","--watch-interval"],["--json","--tree","--watch"]);if(r.error!==void 0)return A(e,r.error);let n=H(r,"--json"),s=H(r,"--tree"),i=H(r,"--watch"),o=W(r,"--team"),a=W(r,"--member"),l=s$(W(r,"--since"));if("error"in l)return A(e,l.error);let c=W(r,"--watch-interval"),u=c===void 0?zD:Number.parseInt(c.replace(/s$/,""),10);if(!Number.isFinite(u)||u<1)return A(e,`invalid --watch-interval "${c}" (expected <N>s, N\u22651)`);let f=()=>L(e,d=>{let m={...o!==void 0?{teamfile:me(o,d)}:{},...a!==void 0?{member:a.toLowerCase()}:{},idleWindowMs:l.windowMs},g=i$(d,m,{tree:s});if(n){let y=o$(g,s);return i?e.stdout.write(`${JSON.stringify(y)}
2918
+ `):ee(e,y),0}return e.stdout.write(s?a$(g):l$(g,l.windowMs)),0});return i?await new Promise(d=>{let m=0,g=!1,y=_=>{clearInterval(_),d(0)},h=async _=>{if(!g){g=!0;try{await f()}catch(E){e.stderr.write(`running: ${E instanceof Error?E.message:String(E)}
2919
+ `)}finally{g=!1}m+=1,nm!==void 0&&m>=nm&&y(_)}},p=setInterval(()=>{h(p)},u*1e3);h(p),process.once("SIGINT",()=>y(p)),process.once("SIGTERM",()=>y(p))}):f()}var lt,YD,WT,zD,nm,ZD,HT,Zu,t$,KT=k(()=>{"use strict";lt=ct(tt(),1);et();Zn();Ae();de();Qu();Et();YD=24*60*60*1e3,WT=3,zD=2;ZD=["usage: lmctl running [--team <file>] [--member <alias>] [--since <duration|ISO8601>]"," [--tree] [--watch] [--watch-interval Ns] [--json]","","Shows tracked_invocation activity DB-wide across the whole fleet, split","into three sections (flat mode, the default):",' - Running: status="running" with a live (or unverifiable cross-host)'," holder -- genuinely in-flight work.",' - Dead (reclaimable): status="running" but the holder process is'," confirmed dead -- an orphaned record, not active work. Its elapsed",' time is reported as staleness, not as "running", so a dead worker'," is never mistaken for one that is genuinely still building."," - Idle: targets with nothing running or dead, showing their most"," recent finish from the last 24 hours and how long they've been"," idle since.","","--team <file> narrows the view to one teamfile (path is canonicalized","before matching); --member <alias> narrows it to one member alias","(case-insensitive; combinable with --team). --since sets the lookback","window for the Idle section -- a relative duration (<n>s|m|h|d, e.g. 7d)","or an absolute ISO8601 timestamp (default 24h). Running and Dead are","point-in-time current state and are not time-filtered.","","--watch re-renders the full snapshot every --watch-interval (default 2s)","until interrupted (SIGINT/SIGTERM). With --json, each snapshot is emitted","as ONE compact JSON object per line (NDJSON).","","--tree shows the same rows as one hierarchical dispatch-lineage view","instead: no section headers (each row already carries its own status),","indented under the session that dispatched it (who woke whom), sorted","by the most recent root session first. A node is a specific turn at a","specific time, not a team:alias identity -- the same member can appear","as multiple nodes for its different turns. Lineage is only known for","turns dispatched by a NESTED `lmctl prompt`/`lmctl terminal` call made","from within another turn's own tool calls; anything else (a human's","direct dispatch, or a turn from before this feature existed) has no","recorded parent and shows as its own root. Unlike the flat Idle section,","--tree does NOT collapse finished rows to one per target: every finished","descendant of a node in view (within the --since window) is rendered, so","a `lmctl batch` run shows as its batch root with ALL of its per-prompt","turns nested underneath.","","Every row also carries `model`: the target member's declared `model=`",'read straight from its teamfile (no session/provider query) -- "default"',"when the teamfile has no model= attribute, the alias/file can't be","resolved, or there is no target at all. This is the DECLARED value only,","not necessarily what actually ran (see the MODEL column in `lmctl status","<teamfile> --details`).","","--json emits { schema_version, running, dead, idle } (flat, one array","per section, matching the three flat-mode sections -- each row carries","its own status/timing/error fields). --tree --json instead emits","{ schema_version, tree } -- an array of root nodes, each row's full",'fields plus a "state" discriminant ("running"/"dead"/"idle") and a','"children" array of the same shape, nested per the dispatch lineage.',"","Queries lmctl's own database only -- never touches native provider","session files."].join(`
2920
2920
  `),HT=120;Zu="default";t$=[26,void 0,void 0,void 0,24,void 0]});var ZT={};se(ZT,{runRatelimit:()=>h$});function im(t){return typeof t=="object"&&t!==null}function d$(t){return(0,xe.formatPercent)(typeof t=="number"?t:null)}function u$(t,e){let r=typeof e.bucket_id=="string"&&e.bucket_id!==""?e.bucket_id:"unknown-bucket";return r==="session"?r="5h":r==="week-all-models"?r="weekly":r.startsWith("week-scoped-")&&(r=`weekly-${r.slice(12)}`),t!==""&&!r.startsWith(`${t}-`)&&(r=`${t}-${r}`),(0,xe.escapeCell)(r)}function f$(t,e){let r="unknown",n=null,s,i=null;if(typeof e.resets_at_iso=="string"&&e.resets_at_iso!==""){let c=Date.parse(e.resets_at_iso);i=Number.isFinite(c)?c-Date.now():null,i!==null&&(Math.abs(i)<1e3?r="now":i>0?r=`in ${(0,xe.formatDuration)(i,{maxUnit:"d",style:"compact"})}`:r=`${(0,xe.formatDuration)(-i,{maxUnit:"d",style:"compact"})} ago`,s=m$[typeof e.window_type=="string"?e.window_type:""],s!==void 0&&(n=Math.min(1,Math.max(0,1-i/s))))}n!==null&&(r=`${(0,xe.formatBar)(n)} ${r}`);let o="";if(n!==null&&s!==void 0&&i!==null&&typeof e.used_fraction=="number"&&Number.isFinite(e.used_fraction)){let c=e.used_fraction;if(c<=n){let u=n>0?Math.max(0,1-c/n):NaN;o=`unused +${(0,xe.formatPercent)(u)}`}else{let u=n*s,f=u>0?(1-c)/c*u:0,d=Math.max(0,i-f);o=`needing -${(0,xe.formatDuration)(d,{maxUnit:"d",style:"compact"})}`}}let a=[];e.is_exhausted===!0&&a.push("[EXHAUSTED]"),e.allowed===!1&&a.push("allowed=false"),e.limit_reached===!0&&a.push("limit_reached");let l=[u$(t,e),`${(0,xe.formatBar)(typeof e.used_fraction=="number"?e.used_fraction:null)} ${d$(e.used_fraction)}`,r];return o!==""&&l.push(o),a.length>0&&l.push(a.join(" ")),l}function p$(t){let e=typeof t.provider=="string"&&t.provider!==""?t.provider:"unknown",r=typeof t.status=="string"?t.status:"unknown",n=typeof t.source=="string"&&t.source!==""?t.source:"unknown source",s=typeof t.plan_type=="string"&&t.plan_type!==""?t.plan_type:"?",i=typeof t.read_at=="number"&&Number.isFinite(t.read_at)?(0,xe.formatClock)(t.read_at*1e3):"unknown",o=typeof t.reason=="string"?t.reason:"",a=`${e}: ${r} (${n}) plan=${s} read ${i}`;r==="auth_expired"?(a=`${e}: unavailable (${n}) plan=${s} read ${i}`,typeof t.detail=="string"&&t.detail!==""&&(a+=` -- ${t.detail}`)):r==="provider_unavailable"&&QT.has(o)?(a=`${e}: not installed/configured (${n}) plan=${s} read ${i}`,typeof t.detail=="string"&&t.detail!==""&&(a+=` -- ${t.detail}`)):r!=="ok"&&(a+=` -- ${o!==""?o:"no reason given"}`,typeof t.detail=="string"&&t.detail!==""&&(a+=` -- ${t.detail}`),r==="provider_unavailable"&&(a+=` (${e} server-side, not lmctl \u2014 try again later)`));let l=typeof t.provider=="string"?t.provider:"",c=Array.isArray(t.buckets)?t.buckets.filter(im).map(f=>f$(l,f)):[],u=[];if(im(t.credits)){let f=t.credits,d=[];typeof f.has_credits=="boolean"&&d.push(`has_credits=${f.has_credits}`),f.unlimited===!0&&d.push("unlimited"),f.balance!==void 0&&f.balance!==null&&d.push(`balance=${String(f.balance)}`),u.push(` credits: ${d.length>0?d.join(" "):"present"}`)}if(im(t.spend_control)){let f=t.spend_control,d=` spend control: reached=${f.reached===!0}`;f.individual_limit!==void 0&&f.individual_limit!==null&&(d+=` individual_limit=${String(f.individual_limit)}`),u.push(d)}return{head:a,bucketRows:c,footers:u}}function om(t,e){return t.stderr.write(`error: ${e}
2921
2921
  ${zT}
2922
2922
  `),2}async function h$(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${zT}
2923
2923
  `),0;let r=oe(t,["--timeout"],["--json"]);if(r.error!==void 0)return om(e,r.error);let n=H(r,"--json");for(let p of r.positionals)if(!YT.includes(p))return om(e,`unknown provider: ${p} (valid targets: ${YT.join(", ")})`);let s=r.positionals.length>0?r.positionals:["all"],i=15,o=W(r,"--timeout");if(o!==void 0){let p=Number(o);if(!Number.isFinite(p)||p<=0)return om(e,`invalid --timeout "${o}" (expected a positive number of seconds)`);i=p}let a=await ca({targets:s,timeoutSeconds:i,env:e.env??process.env,progress:p=>e.stderr.write(`${p}
2924
2924
  `)});if(a.status==="error")return e.stderr.write(`error: ${a.error}
2925
2925
  `),1;let l=a.readings;if(n)return ee(e,{readings:l}),0;let c=new Set(r.positionals),u=l.filter(p=>{let _=typeof p.status=="string"?p.status:"",E=typeof p.reason=="string"?p.reason:"";return _!=="provider_unavailable"||!QT.has(E)?!0:c.has(typeof p.provider=="string"?p.provider:"")});if(u.length===0)return e.stdout.write(`rate-limit: no readings returned.
2926
- `),0;let f=["LIMIT","USED","RESET TIME","OVERSTOCK"],d=["left","left","left"],m=u.map(p$),h=(0,xe.measureColumns)([{rows:[],headers:f},...m.map(p=>p.bucketRows)]),y=!1,g=[];for(let p of m){if(g.length>0&&g.push(""),g.push(p.head),p.bucketRows.length>0){let _=!y;y=!0,g.push((0,xe.renderGrid)(p.bucketRows,{widths:h,margin:2,align:d,..._?{headers:f}:{}}))}g.push(...p.footers)}return e.stdout.write(`${g.join(`
2926
+ `),0;let f=["LIMIT","USED","RESET TIME","OVERSTOCK"],d=["left","left","left"],m=u.map(p$),g=(0,xe.measureColumns)([{rows:[],headers:f},...m.map(p=>p.bucketRows)]),y=!1,h=[];for(let p of m){if(h.length>0&&h.push(""),h.push(p.head),p.bucketRows.length>0){let _=!y;y=!0,h.push((0,xe.renderGrid)(p.bucketRows,{widths:g,margin:2,align:d,..._?{headers:f}:{}}))}h.push(...p.footers)}return e.stdout.write(`${h.join(`
2927
2927
  `)}
2928
2928
  `),0}var xe,zT,QT,YT,m$,ev=k(()=>{"use strict";xe=ct(tt(),1);de();nu();zT=["usage: lmctl ratelimit [provider ...] [--json] [--timeout <seconds>]",""," Queries provider subscription rate limits in REAL TIME via the TypeScript"," provider readers -- stateless: nothing is read from or written to any"," database.",""," Providers: all (default), codex, agy, claude, kimi. Multiple allowed.",""," --timeout <seconds> Per-provider reader timeout (default 15).",' --json Emit {"readings": [...]} in the lmratelimit-v1 schema'," with every raw field preserved verbatim -- the same"," shape lmbee's collector parses. Unknown future"," fields pass through.","",' Prints a "querying ..." note on stderr before the readers run.'].join(`
2929
2929
  `),QT=new Set(["agy_not_found","credentials_missing"]),YT=la;m$={five_hour:5*36e5,daily:864e5,weekly:7*864e5,monthly:30*864e5}});_t();import{pathToFileURL as g$}from"node:url";import{execFileSync as _v}from"node:child_process";import{existsSync as yv,readFileSync as Ev}from"node:fs";import{join as gm}from"node:path";import{fileURLToPath as wv}from"node:url";function _m(){return wv(new URL("../..",import.meta.url))}function Wa(t=_m()){try{let e=JSON.parse(Ev(gm(t,"package.json"),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}function Ba(t,e){try{return _v("git",e,{cwd:t,stdio:["ignore","pipe","ignore"],timeout:2e3}).toString().trim()}catch{return}}function Ha(t=_m()){let e=Wa(t);if(!yv(gm(t,".git")))return e;let r=Ba(t,["rev-parse","--short","HEAD"]);if(r===void 0)return e;let n=Ba(t,["describe","--tags","--exact-match","HEAD"]),s=Ba(t,["status","--porcelain"]),i=s!==void 0&&s.length>0;return n===`v${e}`&&!i?e:`${e}+${r}${i?".dirty":""}`}K();import{mkdirSync as Ov,readFileSync as Mv,renameSync as Dv,writeFileSync as $v}from"node:fs";import{homedir as Fv}from"node:os";import{dirname as Pv,join as Uv}from"node:path";function xm(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Lv(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Cv(t,e){return!Lv(t)||xm(t)?null:`${e} must use https://: ${t}`}async function km(t,e){let r=Cv(t,e.description);if(r!==null||!xm(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Im(t,e.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw Im(t,e.description,n,a)}}finally{clearTimeout(i)}}function Im(t,e,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${i}`)}var jv="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",Bv=60*60*1e3,Wv=1500;function Hv(){let t=process.env.HOME??Fv();return Uv(t,".lmctl",".update-check.json")}function Xv(t){return t.isTTY===!0}function qv(t,e){let r=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function qa(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!Xv(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function Gv(t,e){try{let r=JSON.parse(Mv(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<Bv)return r.latest}catch{}return null}function Jv(t,e){Ov(Pv(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;$v(r,`${JSON.stringify(e)}