@lmctl-ai/lmctl 0.2.261 → 0.2.262

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lmbee.js CHANGED
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
- var hq=Object.create;var Rp=Object.defineProperty;var _q=Object.getOwnPropertyDescriptor;var gq=Object.getOwnPropertyNames;var Eq=Object.getPrototypeOf,yq=Object.prototype.hasOwnProperty;var rr=(e,t)=>()=>(e&&(t=e(e=0)),t);var FT=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),ec=(e,t)=>{for(var n in t)Rp(e,n,{get:t[n],enumerable:!0})},wq=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of gq(t))!yq.call(e,s)&&s!==n&&Rp(e,s,{get:()=>t[s],enumerable:!(r=_q(t,s))||r.enumerable});return e};var Cn=(e,t,n)=>(n=e!=null?hq(Eq(e)):{},wq(t||!e||!e.__esModule?Rp(n,"default",{value:e,enumerable:!0}):n,e));var gE=FT(Jt=>{"use strict";function sa(e){if(!Array.isArray(e))throw new TypeError("Each row and headers must be an array of cells");return Array.from(e,t=>{let n=t==null?"":String(t);if(/[\x00-\x1f\x7f-\x9f]/u.test(n))throw new TypeError("Cells must be single-line text without terminal control characters");return n})}function ox(e){if(e===void 0)return[];if(!Array.isArray(e))throw new TypeError('align must be an array of "left", "right", or "decimal" per column');return e.map(t=>{if(t!=="left"&&t!=="right"&&t!=="decimal")throw new TypeError('align entries must be "left", "right", or "decimal"');return t})}function Jr(e){let t=0;for(let n of e){let r=n.codePointAt(0);if(!(r>=768&&r<=879||r>=6832&&r<=6911||r>=7616&&r<=7679||r>=8400&&r<=8447||r>=65024&&r<=65039||r>=65056&&r<=65071||r===8203||r>=917760&&r<=917999)){if(r>=4352&&r<=4447||r>=11904&&r<=12350||r>=12353&&r<=13311||r>=13312&&r<=19903||r>=19968&&r<=40959||r>=40960&&r<=42191||r>=44032&&r<=55203||r>=63744&&r<=64255||r>=65072&&r<=65135||r>=65280&&r<=65376||r>=65504&&r<=65510||r>=9728&&r<=10175||r>=126976&&r<=129791||r>=131072&&r<=262141){t+=2;continue}t+=1}}return t}function hE(e,t,n){let r=" ".repeat(Math.max(0,t-Jr(e)));return n?r+e:e+r}function ix(e){if(Array.isArray(e))return{rows:e};if(e!==null&&typeof e=="object"&&Array.isArray(e.rows))return e;throw new TypeError("each grid must be a rows array or { rows, headers }")}function I4(e){if(e===void 0)return"\u2026";if(typeof e!="string"||/[\x00-\x1f\x7f-\x9f]/u.test(e))throw new TypeError("ellipsis must be a single-line string without terminal control characters");return e}function k4(e,t,n="\u2026"){if(Jr(e)<=t)return e;let r=Jr(n)>t?"\u2026":n,s=Jr(r);if(t<=s)return r;let o="",i=0;for(let a of e){let c=Jr(a);if(i+c>t-s)break;o+=a,i+=c}return`${o}${r}`}function R4(e){if(e===void 0)return[];if(!Array.isArray(e))throw new TypeError("max must be an array of per-column width caps");return e.map(t=>{if(t!=null){if(typeof t!="number"||!Number.isInteger(t)||t<1)throw new TypeError("max entries must be positive integers, null, or undefined");return t}})}function ax(e){let t=/^(?:[+-]?\$?|\$[+-]?)(?:\d+|\d{1,3}(?:,\d{3})+|(?=\.))(?:\.(\d+))?$/.exec(e);return!t||!/\d/.test(e)?null:{places:t[1]?.length??0}}function N4(e){if(e!==void 0){if(!Array.isArray(e)||e.some(t=>!Number.isInteger(t)||t<0))throw new TypeError("decimalPlaces must be an array of nonnegative integers");return e}}function cx(e){if(!Array.isArray(e))throw new TypeError("grids must be an array of grids");let t=[];for(let n of e){let r=ix(n);r.headers!==void 0&&sa(r.headers);for(let s of r.rows.map(sa))s.forEach((o,i)=>{t[i]=Math.max(t[i]??0,ax(o)?.places??0)})}return t}Jt.measureDecimalPlaces=cx;function lx(e,t,n){let r=N4(n)??[],s=t.includes("decimal")?cx(e):[];return Array.from({length:Math.max(r.length,s.length)},(o,i)=>Math.max(r[i]??0,s[i]??0))}function dx(e,t){let n=ax(e);if(!n)return null;let r=n.places?n.places+1:0,s=t?t+1:0;return e+" ".repeat(Math.max(0,s-r))}function ux(e,{max:t,align:n,decimalPlaces:r}={}){if(!Array.isArray(e))throw new TypeError("grids must be an array of grids");let s=R4(t),o=ox(n),i=lx(e,o,r),a=[],c=(l,d)=>{a[l]=Math.max(a[l]??0,d)};for(let l of e){let d=ix(l);d.headers!==void 0&&sa(d.headers).forEach((u,f)=>{c(f,Jr(u))});for(let u of d.rows.map(sa))u.forEach((f,m)=>{let p=o[m]==="decimal"?dx(f,i[m]??0)??f:f;c(m,Jr(p))})}return a.map((l,d)=>{let u=s[d];return u===void 0?l:Math.min(l,u)})}Jt.measureColumns=ux;function x4(e){if(e===void 0)return"";if(typeof e=="number"&&Number.isInteger(e)&&e>=0)return" ".repeat(e);if(typeof e=="string"&&!/[\x00-\x1f\x7f-\x9f]/u.test(e))return e;throw new TypeError("margin must be a number of spaces or a single-line string")}function fx(e,{widths:t,headers:n,align:r,truncate:s=!0,truncateTrailing:o=!1,margin:i,max:a,ellipsis:c,decimalPlaces:l}={}){if(!Array.isArray(e))throw new TypeError("rows must be an array of row arrays");if(t!==void 0&&!Array.isArray(t))throw new TypeError("widths must be an array of column widths");if(t!==void 0&&a!==void 0)throw new TypeError("pass widths or max, not both (max caps a measurement)");let d=x4(i),u=ox(r),f=I4(c),m=lx([e],u,l),p=t??ux([{rows:e,headers:n}],{max:a,align:u,decimalPlaces:m}),h=e.map(sa);n!==void 0&&h.unshift(sa(n));let _=h.map((g,w)=>{let y=g.length-1;for(;y>=0&&g[y]==="";)y--;return g.slice(0,y+1).map((E,T)=>{let b=p[T]||0,A=s&&b>0&&(T!==y||o)?k4(E,b,f):E;if(u[T]==="decimal"){let I=n!==void 0&&w===0?null:dx(E,m[T]??0),R=hE(I!==null&&Jr(I)<=b?I:A,b,!0);return T===y&&I!==null?R.trimEnd():R}return u[T]==="right"?hE(A,b,!0):T===y?A:hE(A,b,!1)}).join(" ")}).join(`
2
+ var hq=Object.create;var Rp=Object.defineProperty;var _q=Object.getOwnPropertyDescriptor;var gq=Object.getOwnPropertyNames;var Eq=Object.getPrototypeOf,yq=Object.prototype.hasOwnProperty;var rr=(e,t)=>()=>(e&&(t=e(e=0)),t);var FT=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),ec=(e,t)=>{for(var n in t)Rp(e,n,{get:t[n],enumerable:!0})},wq=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of gq(t))!yq.call(e,s)&&s!==n&&Rp(e,s,{get:()=>t[s],enumerable:!(r=_q(t,s))||r.enumerable});return e};var Cn=(e,t,n)=>(n=e!=null?hq(Eq(e)):{},wq(t||!e||!e.__esModule?Rp(n,"default",{value:e,enumerable:!0}):n,e));var gE=FT(Jt=>{"use strict";function sa(e){if(!Array.isArray(e))throw new TypeError("Each row and headers must be an array of cells");return Array.from(e,t=>{let n=t==null?"":String(t);if(/[\x00-\x1f\x7f-\x9f]/u.test(n))throw new TypeError("Cells must be single-line text without terminal control characters");return n})}function ox(e){if(e===void 0)return[];if(!Array.isArray(e))throw new TypeError('align must be an array of "left", "right", or "decimal" per column');return e.map(t=>{if(t!=="left"&&t!=="right"&&t!=="decimal")throw new TypeError('align entries must be "left", "right", or "decimal"');return t})}function Yr(e){let t=0;for(let n of e){let r=n.codePointAt(0);if(!(r>=768&&r<=879||r>=6832&&r<=6911||r>=7616&&r<=7679||r>=8400&&r<=8447||r>=65024&&r<=65039||r>=65056&&r<=65071||r===8203||r>=917760&&r<=917999)){if(r>=4352&&r<=4447||r>=11904&&r<=12350||r>=12353&&r<=13311||r>=13312&&r<=19903||r>=19968&&r<=40959||r>=40960&&r<=42191||r>=44032&&r<=55203||r>=63744&&r<=64255||r>=65072&&r<=65135||r>=65280&&r<=65376||r>=65504&&r<=65510||r>=9728&&r<=10175||r>=126976&&r<=129791||r>=131072&&r<=262141){t+=2;continue}t+=1}}return t}function hE(e,t,n){let r=" ".repeat(Math.max(0,t-Yr(e)));return n?r+e:e+r}function ix(e){if(Array.isArray(e))return{rows:e};if(e!==null&&typeof e=="object"&&Array.isArray(e.rows))return e;throw new TypeError("each grid must be a rows array or { rows, headers }")}function I4(e){if(e===void 0)return"\u2026";if(typeof e!="string"||/[\x00-\x1f\x7f-\x9f]/u.test(e))throw new TypeError("ellipsis must be a single-line string without terminal control characters");return e}function k4(e,t,n="\u2026"){if(Yr(e)<=t)return e;let r=Yr(n)>t?"\u2026":n,s=Yr(r);if(t<=s)return r;let o="",i=0;for(let a of e){let c=Yr(a);if(i+c>t-s)break;o+=a,i+=c}return`${o}${r}`}function R4(e){if(e===void 0)return[];if(!Array.isArray(e))throw new TypeError("max must be an array of per-column width caps");return e.map(t=>{if(t!=null){if(typeof t!="number"||!Number.isInteger(t)||t<1)throw new TypeError("max entries must be positive integers, null, or undefined");return t}})}function ax(e){let t=/^(?:[+-]?\$?|\$[+-]?)(?:\d+|\d{1,3}(?:,\d{3})+|(?=\.))(?:\.(\d+))?$/.exec(e);return!t||!/\d/.test(e)?null:{places:t[1]?.length??0}}function N4(e){if(e!==void 0){if(!Array.isArray(e)||e.some(t=>!Number.isInteger(t)||t<0))throw new TypeError("decimalPlaces must be an array of nonnegative integers");return e}}function cx(e){if(!Array.isArray(e))throw new TypeError("grids must be an array of grids");let t=[];for(let n of e){let r=ix(n);r.headers!==void 0&&sa(r.headers);for(let s of r.rows.map(sa))s.forEach((o,i)=>{t[i]=Math.max(t[i]??0,ax(o)?.places??0)})}return t}Jt.measureDecimalPlaces=cx;function lx(e,t,n){let r=N4(n)??[],s=t.includes("decimal")?cx(e):[];return Array.from({length:Math.max(r.length,s.length)},(o,i)=>Math.max(r[i]??0,s[i]??0))}function dx(e,t){let n=ax(e);if(!n)return null;let r=n.places?n.places+1:0,s=t?t+1:0;return e+" ".repeat(Math.max(0,s-r))}function ux(e,{max:t,align:n,decimalPlaces:r}={}){if(!Array.isArray(e))throw new TypeError("grids must be an array of grids");let s=R4(t),o=ox(n),i=lx(e,o,r),a=[],c=(l,d)=>{a[l]=Math.max(a[l]??0,d)};for(let l of e){let d=ix(l);d.headers!==void 0&&sa(d.headers).forEach((u,f)=>{c(f,Yr(u))});for(let u of d.rows.map(sa))u.forEach((f,m)=>{let p=o[m]==="decimal"?dx(f,i[m]??0)??f:f;c(m,Yr(p))})}return a.map((l,d)=>{let u=s[d];return u===void 0?l:Math.min(l,u)})}Jt.measureColumns=ux;function x4(e){if(e===void 0)return"";if(typeof e=="number"&&Number.isInteger(e)&&e>=0)return" ".repeat(e);if(typeof e=="string"&&!/[\x00-\x1f\x7f-\x9f]/u.test(e))return e;throw new TypeError("margin must be a number of spaces or a single-line string")}function fx(e,{widths:t,headers:n,align:r,truncate:s=!0,truncateTrailing:o=!1,margin:i,max:a,ellipsis:c,decimalPlaces:l}={}){if(!Array.isArray(e))throw new TypeError("rows must be an array of row arrays");if(t!==void 0&&!Array.isArray(t))throw new TypeError("widths must be an array of column widths");if(t!==void 0&&a!==void 0)throw new TypeError("pass widths or max, not both (max caps a measurement)");let d=x4(i),u=ox(r),f=I4(c),m=lx([e],u,l),p=t??ux([{rows:e,headers:n}],{max:a,align:u,decimalPlaces:m}),h=e.map(sa);n!==void 0&&h.unshift(sa(n));let _=h.map((g,w)=>{let y=g.length-1;for(;y>=0&&g[y]==="";)y--;return g.slice(0,y+1).map((E,T)=>{let b=p[T]||0,A=s&&b>0&&(T!==y||o)?k4(E,b,f):E;if(u[T]==="decimal"){let I=n!==void 0&&w===0?null:dx(E,m[T]??0),R=hE(I!==null&&Yr(I)<=b?I:A,b,!0);return T===y&&I!==null?R.trimEnd():R}return u[T]==="right"?hE(A,b,!0):T===y?A:hE(A,b,!1)}).join(" ")}).join(`
3
3
  `);return _===""||d===""?_:`${d}${_.split(`
4
4
  `).join(`
5
5
  ${d}`)}`}Jt.renderGrid=fx;function mx(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:c}={}){return fx(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:c})}function L4(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:c,stream:l=process.stdout}={}){let d=mx(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:c});d&&l.write(`${d}
6
- `)}Jt.formatTable=mx;Jt.printTable=L4;function sx(e){return e instanceof Date?e.getTime():typeof e=="number"?e:typeof e=="string"&&e.trim()?Date.parse(e):NaN}function C4(e,{now:t=Date.now()}={}){let n=sx(t);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=sx(e);if(!Number.isFinite(r))return"unknown";let s=r-n,o=Math.floor(Math.abs(s)/1e3);if(o===0)return"now";for(let[i,a]of[["w",604800],["d",86400],["h",3600],["m",60],["s",1]])if(o>=a)return`${Math.floor(o/a)}${i}${s<0?" ago":""}`}Jt.formatRelativeTime=C4;function O4(e){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let t=e<0?"-":"",n=Math.abs(e);if(n<1e3)return String(e);let r=Math.round(n/1e3);return r<1e3?`${t}${r}K`:`${t}${(n/1e6).toFixed(1)}M`}Jt.formatCount=O4;var _E=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function D4(e,{maxUnit:t="w",style:n="spaced"}={}){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let r=_E.findIndex(([a])=>a===t);if(r===-1)throw new TypeError('maxUnit must be one of "w", "d", "h", "m", "s"');if(n!=="spaced"&&n!=="compact")throw new TypeError('style must be "spaced" or "compact"');let s=Math.floor(Math.max(0,e)/1e3);if(n==="compact"){let a=_E.slice(r).filter(([u])=>u!=="s");if(a.length===0||s<60)return"<1m";let c=[],l=s,d=!1;for(let[u,f]of a){let m=Math.floor(l/f);if(l-=m*f,m>0&&!d){let p=u==="d"||u==="w"?`${m}${u}`:`${vr(m)}${u}`;c.push({text:p,zero:!1}),d=!0}else d&&c.push({text:`${vr(m)}${u}`,zero:m===0})}for(;c.length>0&&c[c.length-1].zero;)c.pop();return c.map(u=>u.text).join("")}let o=s,i=[];for(let[a,c]of _E.slice(r))if(o>=c||a==="s"&&i.length===0){let l=Math.floor(o/c);if(o-=l*c,i.push(`${l}${a}`),i.length===2)break}return i.join(" ")}Jt.formatDuration=D4;function px(e){return e===void 0?new Date:e instanceof Date?e:typeof e=="number"||typeof e=="string"?new Date(e):new Date(NaN)}function vr(e){return String(e).padStart(2,"0")}function hx(e){let t=px(e);return Number.isNaN(t.getTime())?"unknown":`${vr(t.getHours())}:${vr(t.getMinutes())}:${vr(t.getSeconds())}`}Jt.formatClock=hx;function $4(e){let t=px(e);return Number.isNaN(t.getTime())?"unknown":`${`${t.getFullYear()}-${vr(t.getMonth()+1)}-${vr(t.getDate())}`} ${hx(t)}`}Jt.formatLocalTimestamp=$4;function M4(e){return typeof e=="number"&&Number.isFinite(e)?`${Math.round(e*100)}%`:"?%"}Jt.formatPercent=M4;function P4(e,{width:t=10,fill:n="#",empty:r=" ",unknown:s="?"}={}){if(typeof t!="number"||!Number.isInteger(t)||t<1)throw new TypeError("width must be a positive integer");for(let[i,a]of[["fill",n],["empty",r],["unknown",s]])if(typeof a!="string"||[...a].length!==1||/[\x00-\x1f\x7f-\x9f]/u.test(a)||Jr(a)!==1)throw new TypeError(`${i} must be a single character with terminal display width 1`);if(typeof e!="number"||!Number.isFinite(e))return s.repeat(t);let o=Math.min(t,Math.max(0,Math.round(e*t)));return`${n.repeat(o)}${r.repeat(t-o)}`}Jt.formatBar=P4;function U4(e){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let t=Math.floor(Math.max(0,e)/1e3),n=Math.floor(t/86400);t-=n*86400;let r=Math.floor(t/3600);t-=r*3600;let s=Math.floor(t/60);t-=s*60;let o=`${vr(r)}:${vr(s)}:${vr(t)}`;return n>0?`${n}d ${o}`:o}Jt.formatTimer=U4;function F4(e){return(e==null?"":String(e)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
6
+ `)}Jt.formatTable=mx;Jt.printTable=L4;function sx(e){return e instanceof Date?e.getTime():typeof e=="number"?e:typeof e=="string"&&e.trim()?Date.parse(e):NaN}function C4(e,{now:t=Date.now()}={}){let n=sx(t);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=sx(e);if(!Number.isFinite(r))return"unknown";let s=r-n,o=Math.floor(Math.abs(s)/1e3);if(o===0)return"now";for(let[i,a]of[["w",604800],["d",86400],["h",3600],["m",60],["s",1]])if(o>=a)return`${Math.floor(o/a)}${i}${s<0?" ago":""}`}Jt.formatRelativeTime=C4;function O4(e){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let t=e<0?"-":"",n=Math.abs(e);if(n<1e3)return String(e);let r=Math.round(n/1e3);return r<1e3?`${t}${r}K`:`${t}${(n/1e6).toFixed(1)}M`}Jt.formatCount=O4;var _E=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function D4(e,{maxUnit:t="w",style:n="spaced"}={}){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let r=_E.findIndex(([a])=>a===t);if(r===-1)throw new TypeError('maxUnit must be one of "w", "d", "h", "m", "s"');if(n!=="spaced"&&n!=="compact")throw new TypeError('style must be "spaced" or "compact"');let s=Math.floor(Math.max(0,e)/1e3);if(n==="compact"){let a=_E.slice(r).filter(([u])=>u!=="s");if(a.length===0||s<60)return"<1m";let c=[],l=s,d=!1;for(let[u,f]of a){let m=Math.floor(l/f);if(l-=m*f,m>0&&!d){let p=u==="d"||u==="w"?`${m}${u}`:`${vr(m)}${u}`;c.push({text:p,zero:!1}),d=!0}else d&&c.push({text:`${vr(m)}${u}`,zero:m===0})}for(;c.length>0&&c[c.length-1].zero;)c.pop();return c.map(u=>u.text).join("")}let o=s,i=[];for(let[a,c]of _E.slice(r))if(o>=c||a==="s"&&i.length===0){let l=Math.floor(o/c);if(o-=l*c,i.push(`${l}${a}`),i.length===2)break}return i.join(" ")}Jt.formatDuration=D4;function px(e){return e===void 0?new Date:e instanceof Date?e:typeof e=="number"||typeof e=="string"?new Date(e):new Date(NaN)}function vr(e){return String(e).padStart(2,"0")}function hx(e){let t=px(e);return Number.isNaN(t.getTime())?"unknown":`${vr(t.getHours())}:${vr(t.getMinutes())}:${vr(t.getSeconds())}`}Jt.formatClock=hx;function $4(e){let t=px(e);return Number.isNaN(t.getTime())?"unknown":`${`${t.getFullYear()}-${vr(t.getMonth()+1)}-${vr(t.getDate())}`} ${hx(t)}`}Jt.formatLocalTimestamp=$4;function M4(e){return typeof e=="number"&&Number.isFinite(e)?`${Math.round(e*100)}%`:"?%"}Jt.formatPercent=M4;function P4(e,{width:t=10,fill:n="#",empty:r=" ",unknown:s="?"}={}){if(typeof t!="number"||!Number.isInteger(t)||t<1)throw new TypeError("width must be a positive integer");for(let[i,a]of[["fill",n],["empty",r],["unknown",s]])if(typeof a!="string"||[...a].length!==1||/[\x00-\x1f\x7f-\x9f]/u.test(a)||Yr(a)!==1)throw new TypeError(`${i} must be a single character with terminal display width 1`);if(typeof e!="number"||!Number.isFinite(e))return s.repeat(t);let o=Math.min(t,Math.max(0,Math.round(e*t)));return`${n.repeat(o)}${r.repeat(t-o)}`}Jt.formatBar=P4;function U4(e){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let t=Math.floor(Math.max(0,e)/1e3),n=Math.floor(t/86400);t-=n*86400;let r=Math.floor(t/3600);t-=r*3600;let s=Math.floor(t/60);t-=s*60;let o=`${vr(r)}:${vr(s)}:${vr(t)}`;return n>0?`${n}d ${o}`:o}Jt.formatTimer=U4;function F4(e){return(e==null?"":String(e)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
7
7
  `?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}Jt.escapeCell=F4});var Jn=FT(mn=>{"use strict";function Jm(e){if(!Array.isArray(e))throw new TypeError("Each row and headers must be an array of cells");return Array.from(e,t=>{let n=t==null?"":String(t);if(/[\x00-\x1f\x7f-\x9f]/u.test(n))throw new TypeError("Cells must be single-line text without terminal control characters");return n})}function Ite(e){if(e===void 0)return[];if(!Array.isArray(e))throw new TypeError('align must be an array of "left" or "right" per column');return e.map(t=>{if(t!=="left"&&t!=="right")throw new TypeError('align entries must be "left" or "right"');return t})}function Qs(e){let t=0;for(let n of e){let r=n.codePointAt(0);if(!(r>=768&&r<=879||r>=6832&&r<=6911||r>=7616&&r<=7679||r>=8400&&r<=8447||r>=65024&&r<=65039||r>=65056&&r<=65071||r===8203||r>=917760&&r<=917999)){if(r>=4352&&r<=4447||r>=11904&&r<=12350||r>=12353&&r<=13311||r>=13312&&r<=19903||r>=19968&&r<=40959||r>=40960&&r<=42191||r>=44032&&r<=55203||r>=63744&&r<=64255||r>=65072&&r<=65135||r>=65280&&r<=65376||r>=65504&&r<=65510||r>=9728&&r<=10175||r>=126976&&r<=129791||r>=131072&&r<=262141){t+=2;continue}t+=1}}return t}function o$(e,t,n){let r=" ".repeat(Math.max(0,t-Qs(e)));return n?r+e:e+r}function kte(e){if(Array.isArray(e))return{rows:e};if(e!==null&&typeof e=="object"&&Array.isArray(e.rows))return e;throw new TypeError("each grid must be a rows array or { rows, headers }")}function Rte(e){if(e===void 0)return"\u2026";if(typeof e!="string"||/[\x00-\x1f\x7f-\x9f]/u.test(e))throw new TypeError("ellipsis must be a single-line string without terminal control characters");return e}function Nte(e,t,n="\u2026"){if(Qs(e)<=t)return e;let r=Qs(n)>t?"\u2026":n,s=Qs(r);if(t<=s)return r;let o="",i=0;for(let a of e){let c=Qs(a);if(i+c>t-s)break;o+=a,i+=c}return`${o}${r}`}function xte(e){if(e===void 0)return[];if(!Array.isArray(e))throw new TypeError("max must be an array of per-column width caps");return e.map(t=>{if(t!=null){if(typeof t!="number"||!Number.isInteger(t)||t<1)throw new TypeError("max entries must be positive integers, null, or undefined");return t}})}function a$(e,{max:t}={}){if(!Array.isArray(e))throw new TypeError("grids must be an array of grids");let n=xte(t),r=[],s=(o,i)=>{r[o]=Math.max(r[o]??0,i)};for(let o of e){let i=kte(o);i.headers!==void 0&&Jm(i.headers).forEach((a,c)=>{s(c,Qs(a))});for(let a of i.rows.map(Jm))a.forEach((c,l)=>{s(l,Qs(c))})}return r.map((o,i)=>{let a=n[i];return a===void 0?o:Math.min(o,a)})}mn.measureColumns=a$;function Lte(e){if(e===void 0)return"";if(typeof e=="number"&&Number.isInteger(e)&&e>=0)return" ".repeat(e);if(typeof e=="string"&&!/[\x00-\x1f\x7f-\x9f]/u.test(e))return e;throw new TypeError("margin must be a number of spaces or a single-line string")}function c$(e,{widths:t,headers:n,align:r,truncate:s=!0,truncateTrailing:o=!1,margin:i,max:a,ellipsis:c}={}){if(!Array.isArray(e))throw new TypeError("rows must be an array of row arrays");if(t!==void 0&&!Array.isArray(t))throw new TypeError("widths must be an array of column widths");if(t!==void 0&&a!==void 0)throw new TypeError("pass widths or max, not both (max caps a measurement)");let l=Lte(i),d=Ite(r),u=Rte(c),f=t??a$([{rows:e,headers:n}],{max:a}),m=e.map(Jm);n!==void 0&&m.unshift(Jm(n));let p=m.map(h=>{let _=h.length-1;for(;_>=0&&h[_]==="";)_--;return h.slice(0,_+1).map((g,w)=>{let y=f[w]||0,E=s&&y>0&&(w!==_||o)?Nte(g,y,u):g;return d[w]==="right"?o$(E,y,!0):w===_?E:o$(E,y,!1)}).join(" ")}).join(`
8
8
  `);return p===""||l===""?p:`${l}${p.split(`
9
9
  `).join(`
10
10
  ${l}`)}`}mn.renderGrid=c$;function l$(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a}={}){return c$(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a})}function Cte(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,stream:c=process.stdout}={}){let l=l$(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a});l&&c.write(`${l}
11
- `)}mn.formatTable=l$;mn.printTable=Cte;function i$(e){return e instanceof Date?e.getTime():typeof e=="number"?e:typeof e=="string"&&e.trim()?Date.parse(e):NaN}function Ote(e,{now:t=Date.now()}={}){let n=i$(t);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=i$(e);if(!Number.isFinite(r))return"unknown";let s=r-n,o=Math.floor(Math.abs(s)/1e3);if(o===0)return"now";for(let[i,a]of[["w",604800],["d",86400],["h",3600],["m",60],["s",1]])if(o>=a)return`${Math.floor(o/a)}${i}${s<0?" ago":""}`}mn.formatRelativeTime=Ote;function Dte(e){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let t=e<0?"-":"",n=Math.abs(e);if(n<1e3)return String(e);let r=Math.round(n/1e3);return r<1e3?`${t}${r}K`:`${t}${(n/1e6).toFixed(1)}M`}mn.formatCount=Dte;var lw=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function $te(e,{maxUnit:t="w",style:n="spaced"}={}){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let r=lw.findIndex(([a])=>a===t);if(r===-1)throw new TypeError('maxUnit must be one of "w", "d", "h", "m", "s"');if(n!=="spaced"&&n!=="compact")throw new TypeError('style must be "spaced" or "compact"');let s=Math.floor(Math.max(0,e)/1e3);if(n==="compact"){let a=lw.slice(r).filter(([u])=>u!=="s");if(a.length===0||s<60)return"<1m";let c=[],l=s,d=!1;for(let[u,f]of a){let m=Math.floor(l/f);if(l-=m*f,m>0&&!d){let p=u==="d"||u==="w"?`${m}${u}`:`${Ar(m)}${u}`;c.push({text:p,zero:!1}),d=!0}else d&&c.push({text:`${Ar(m)}${u}`,zero:m===0})}for(;c.length>0&&c[c.length-1].zero;)c.pop();return c.map(u=>u.text).join("")}let o=s,i=[];for(let[a,c]of lw.slice(r))if(o>=c||a==="s"&&i.length===0){let l=Math.floor(o/c);if(o-=l*c,i.push(`${l}${a}`),i.length===2)break}return i.join(" ")}mn.formatDuration=$te;function d$(e){return e===void 0?new Date:e instanceof Date?e:typeof e=="number"||typeof e=="string"?new Date(e):new Date(NaN)}function Ar(e){return String(e).padStart(2,"0")}function u$(e){let t=d$(e);return Number.isNaN(t.getTime())?"unknown":`${Ar(t.getHours())}:${Ar(t.getMinutes())}:${Ar(t.getSeconds())}`}mn.formatClock=u$;function Mte(e){let t=d$(e);return Number.isNaN(t.getTime())?"unknown":`${`${t.getFullYear()}-${Ar(t.getMonth()+1)}-${Ar(t.getDate())}`} ${u$(t)}`}mn.formatLocalTimestamp=Mte;function Pte(e){return typeof e=="number"&&Number.isFinite(e)?`${Math.round(e*100)}%`:"?%"}mn.formatPercent=Pte;function Ute(e,{width:t=10,fill:n="#",empty:r=" ",unknown:s="?"}={}){if(typeof t!="number"||!Number.isInteger(t)||t<1)throw new TypeError("width must be a positive integer");for(let[i,a]of[["fill",n],["empty",r],["unknown",s]])if(typeof a!="string"||[...a].length!==1||/[\x00-\x1f\x7f-\x9f]/u.test(a)||Qs(a)!==1)throw new TypeError(`${i} must be a single character with terminal display width 1`);if(typeof e!="number"||!Number.isFinite(e))return s.repeat(t);let o=Math.min(t,Math.max(0,Math.round(e*t)));return`${n.repeat(o)}${r.repeat(t-o)}`}mn.formatBar=Ute;function Fte(e){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let t=Math.floor(Math.max(0,e)/1e3),n=Math.floor(t/86400);t-=n*86400;let r=Math.floor(t/3600);t-=r*3600;let s=Math.floor(t/60);t-=s*60;let o=`${Ar(r)}:${Ar(s)}:${Ar(t)}`;return n>0?`${n}d ${o}`:o}mn.formatTimer=Fte;function jte(e){return(e==null?"":String(e)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
11
+ `)}mn.formatTable=l$;mn.printTable=Cte;function i$(e){return e instanceof Date?e.getTime():typeof e=="number"?e:typeof e=="string"&&e.trim()?Date.parse(e):NaN}function Ote(e,{now:t=Date.now()}={}){let n=i$(t);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=i$(e);if(!Number.isFinite(r))return"unknown";let s=r-n,o=Math.floor(Math.abs(s)/1e3);if(o===0)return"now";for(let[i,a]of[["w",604800],["d",86400],["h",3600],["m",60],["s",1]])if(o>=a)return`${Math.floor(o/a)}${i}${s<0?" ago":""}`}mn.formatRelativeTime=Ote;function Dte(e){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let t=e<0?"-":"",n=Math.abs(e);if(n<1e3)return String(e);let r=Math.round(n/1e3);return r<1e3?`${t}${r}K`:`${t}${(n/1e6).toFixed(1)}M`}mn.formatCount=Dte;var lw=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function $te(e,{maxUnit:t="w",style:n="spaced"}={}){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let r=lw.findIndex(([a])=>a===t);if(r===-1)throw new TypeError('maxUnit must be one of "w", "d", "h", "m", "s"');if(n!=="spaced"&&n!=="compact")throw new TypeError('style must be "spaced" or "compact"');let s=Math.floor(Math.max(0,e)/1e3);if(n==="compact"){let a=lw.slice(r).filter(([u])=>u!=="s");if(a.length===0||s<60)return"<1m";let c=[],l=s,d=!1;for(let[u,f]of a){let m=Math.floor(l/f);if(l-=m*f,m>0&&!d){let p=u==="d"||u==="w"?`${m}${u}`:`${Ir(m)}${u}`;c.push({text:p,zero:!1}),d=!0}else d&&c.push({text:`${Ir(m)}${u}`,zero:m===0})}for(;c.length>0&&c[c.length-1].zero;)c.pop();return c.map(u=>u.text).join("")}let o=s,i=[];for(let[a,c]of lw.slice(r))if(o>=c||a==="s"&&i.length===0){let l=Math.floor(o/c);if(o-=l*c,i.push(`${l}${a}`),i.length===2)break}return i.join(" ")}mn.formatDuration=$te;function d$(e){return e===void 0?new Date:e instanceof Date?e:typeof e=="number"||typeof e=="string"?new Date(e):new Date(NaN)}function Ir(e){return String(e).padStart(2,"0")}function u$(e){let t=d$(e);return Number.isNaN(t.getTime())?"unknown":`${Ir(t.getHours())}:${Ir(t.getMinutes())}:${Ir(t.getSeconds())}`}mn.formatClock=u$;function Mte(e){let t=d$(e);return Number.isNaN(t.getTime())?"unknown":`${`${t.getFullYear()}-${Ir(t.getMonth()+1)}-${Ir(t.getDate())}`} ${u$(t)}`}mn.formatLocalTimestamp=Mte;function Pte(e){return typeof e=="number"&&Number.isFinite(e)?`${Math.round(e*100)}%`:"?%"}mn.formatPercent=Pte;function Ute(e,{width:t=10,fill:n="#",empty:r=" ",unknown:s="?"}={}){if(typeof t!="number"||!Number.isInteger(t)||t<1)throw new TypeError("width must be a positive integer");for(let[i,a]of[["fill",n],["empty",r],["unknown",s]])if(typeof a!="string"||[...a].length!==1||/[\x00-\x1f\x7f-\x9f]/u.test(a)||Qs(a)!==1)throw new TypeError(`${i} must be a single character with terminal display width 1`);if(typeof e!="number"||!Number.isFinite(e))return s.repeat(t);let o=Math.min(t,Math.max(0,Math.round(e*t)));return`${n.repeat(o)}${r.repeat(t-o)}`}mn.formatBar=Ute;function Fte(e){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let t=Math.floor(Math.max(0,e)/1e3),n=Math.floor(t/86400);t-=n*86400;let r=Math.floor(t/3600);t-=r*3600;let s=Math.floor(t/60);t-=s*60;let o=`${Ir(r)}:${Ir(s)}:${Ir(t)}`;return n>0?`${n}d ${o}`:o}mn.formatTimer=Fte;function jte(e){return(e==null?"":String(e)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
12
12
  `?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}mn.escapeCell=jte});import{createHash as uoe,randomBytes as qU}from"node:crypto";function HU(e=process.env){return{domain:e.LMCTL_AUTH_DOMAIN?.trim()||Wl.domain,clientId:e.LMCTL_CLI_CLIENT_ID?.trim()||Wl.clientId,scope:e.LMCTL_AUTH_SCOPE?.trim()||Wl.scope,ports:Wl.ports,authUrl:(e.LMCTL_AUTH_URL?.trim()||Wl.authUrl).replace(/\/+$/,"")}}function WU(e=qU){let t=e(32).toString("base64url"),n=uoe("sha256").update(t).digest("base64url");return{verifier:t,challenge:n}}function BU(e=qU){return e(16).toString("base64url")}function GU(e){return`http://127.0.0.1:${e}/callback`}function XU(e,t){let n=new URLSearchParams({response_type:"code",client_id:e.clientId,redirect_uri:GU(t.port),scope:e.scope,state:t.state,code_challenge:t.challenge,code_challenge_method:"S256"});return`https://${e.domain}/oauth2/authorize?${n.toString()}`}function VU(e){let t=new URL(e,"http://127.0.0.1");return{code:t.searchParams.get("code")??void 0,state:t.searchParams.get("state")??void 0,error:t.searchParams.get("error")??void 0}}async function JU(e,t,n=fetch){let r=new URLSearchParams({grant_type:"authorization_code",client_id:e.clientId,code:t.code,redirect_uri:GU(t.port),code_verifier:t.verifier}),s=await n(`https://${e.domain}/oauth2/token`,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:r.toString()});if(!s.ok)throw new Error(`token exchange failed: HTTP ${s.status} ${await KU(s)}`);let o=await s.json();if(!o.id_token)throw new Error("token exchange returned no id_token");return o}async function YU(e,t,n=fetch){let r=await n(`${e.authUrl}/appkeys`,{method:"POST",headers:{authorization:`Bearer ${t.idToken}`,"content-type":"application/json"},body:JSON.stringify({label:t.label})});if(!r.ok)throw new Error(`appkey mint failed: HTTP ${r.status} ${await KU(r)}`);return await r.json()}async function KU(e){try{return(await e.text()).slice(0,300)}catch{return""}}var Wl,zU=rr(()=>{Wl={domain:"auth.lmctl.ai",clientId:"lpla33du6p451g9ohb0su9c5u",scope:"openid email profile",ports:[8976,8977,8978,8979],authUrl:"https://lmctl.ai/auth"}});var tF={};ec(tF,{appkeyDir:()=>ZU,persistCredentials:()=>eF,runLogin:()=>voe});import{createServer as foe}from"node:http";import{spawn as moe}from"node:child_process";import{hostname as poe}from"node:os";import{mkdir as hoe,rename as _oe,writeFile as goe}from"node:fs/promises";import{homedir as Eoe}from"node:os";import{join as ip}from"node:path";function ZU(e=process.env){let t=e.XDG_CONFIG_HOME?.trim()||ip(Eoe(),".config");return ip(t,"lmctl")}async function eF(e,t,n,r=process.env){let s=ZU(r);await hoe(s,{recursive:!0,mode:448});let o=ip(s,"appkey.json"),i={version:1,appkey:e.appkey,user_id:e.user_id,label:e.label,issued_at:e.created_at};await QU(o,JSON.stringify(i,null,2)+`
13
13
  `);let a=null;if(t.refresh_token){a=ip(s,"identity.json");let c={user_pool_id:r.COGNITO_USER_POOL_ID?.trim()||"us-east-1_UalgyPyId",client_id:n.clientId,refresh_token:t.refresh_token};await QU(a,JSON.stringify(c,null,2)+`
14
14
  `)}return{appkeyPath:o,identityPath:a}}async function QU(e,t){let n=`${e}.tmp-${process.pid}`;await goe(n,t,{mode:384}),await _oe(n,e)}async function yoe(e){let t,n=new Promise(s=>t=s),r=foe((s,o)=>{if(!s.url?.startsWith("/callback")){o.writeHead(404).end();return}let i=VU(s.url);o.writeHead(200,{"content-type":"text/html"}).end("<html><body style='font-family:sans-serif'><h3>lmctl login complete.</h3><p>You can close this tab and return to the terminal.</p></body></html>"),t(i)});for(let s of e)if(await woe(r,s))return{server:r,port:s,wait:n};throw new Error(`could not bind any loopback port (${e.join(", ")}); is another login running?`)}function woe(e,t){return new Promise(n=>{let r=()=>{e.removeListener("error",r),n(!1)};e.once("error",r),e.listen(t,"127.0.0.1",()=>{e.removeListener("error",r),n(!0)})})}function Toe(e,t){let n=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",r=process.platform==="win32"?["/c","start","",e]:[e];try{let s=moe(n,r,{stdio:"ignore",detached:!0});s.on("error",()=>{}),s.unref()}catch{}t.stdout.write(`
@@ -67,8 +67,8 @@ If your browser didn't open, visit:
67
67
  Signed in as ${m.user_id}
68
68
  Appkey saved to ${p.appkeyPath} (0600)
69
69
  `),0}catch(d){return t.stderr.write(`error: ${d instanceof Error?d.message:String(d)}
70
- `),1}finally{a.close()}}var Lj=rr(()=>{Ij()});import{spawn as Ule}from"node:child_process";import{openSync as Fle,mkdirSync as jle,writeFileSync as qle}from"node:fs";import{homedir as Hle}from"node:os";import{join as MT}from"node:path";import{mkdirSync as Yle,readFileSync as Tq,renameSync as Kle,writeFileSync as zle}from"node:fs";import{homedir as vq}from"node:os";import{dirname as ede,join as jT}from"node:path";var Xle=Object.freeze({free:1e6,test:1e7});var po=class extends Error{code="APPKEY_NOT_FOUND";constructor(t="no lmctl appkey found; run `lmchat login` on a machine with a browser, or copy ~/.config/lmctl/appkey.json here, or set LMCTL_APPKEY"){super(t),this.name="AppkeyNotFoundError"}},Pr=class extends Error{code="APPKEY_VALIDATION_ERROR";status;constructor(t,n={}){super(t),this.name="AppkeyValidationError",this.status=n.status,this.cause=n.cause}},sd=class extends Error{code="APPKEY_INVALID";source;constructor(t){super(`${t} resolved an invalid lmctl appkey`),this.name="AppkeyInvalidError",this.source=t}},od=class extends Error{code="AUTH_API_ERROR";status;constructor(t,n={}){super(t),this.name="AuthApiError",this.status=n.status,this.cause=n.cause}};var Sq="https://lmctl.ai/auth",bq=1e4;function Np(e){return e.length>0&&!e.includes(`
71
- `)}function Fe(e={}){let t=e.env??process.env,n=e.fs??{readFileSync:(c,l)=>Tq(c,l)},r=e.homedir??vq,s=t.LMCTL_APPKEY?.trim();if(s&&Np(s))return{appkey:s,source:"env:LMCTL_APPKEY",envelope:null};let o=t.LMCTL_APPKEY_FILE?.trim();if(o){let c=qT(n,o,"env:LMCTL_APPKEY_FILE");if(c)return c}let i=Aq(t,r),a=qT(n,i,"file:default");if(a)return a;throw new po}async function WT(e,t={}){let n=await Rq("/whoami",{method:"GET",headers:{authorization:`Bearer ${e}`}},t,Pr);if(n.status===401)return{valid:!1};if(n.status!==200)throw new Pr(`appkey validation failed with status ${n.status}`,{status:n.status});let r=await xq(n,"validate appkey response",Pr);return{valid:!0,userId:HT(r,"user_id","validate appkey response",Pr),label:HT(r,"label","validate appkey response",Pr)}}function qT(e,t,n){let r;try{r=e.readFileSync(t,"utf8")}catch{return null}let s=r.trim();if(s.length===0)return null;if(s.startsWith("{")){let o;try{o=JSON.parse(s)}catch{o=void 0}if(o&&typeof o=="object"){let i=o;return typeof i.appkey=="string"&&Np(i.appkey.trim())?{appkey:i.appkey.trim(),source:n,envelope:i}:null}}return Np(s)?{appkey:s,source:n,envelope:null}:null}function Aq(e,t){let n=e.XDG_CONFIG_HOME?.trim()||jT(t(),".config");return jT(n,"lmctl","appkey.json")}function Iq(e){let t=e.env??process.env;return(e.authBaseUrl?.trim()||t.LMCTL_AUTH_BASE_URL?.trim()||Sq).replace(/\/+$/,"")}function kq(e,t){if(e.fetchImpl)return e.fetchImpl;if(typeof globalThis.fetch=="function")return(n,r)=>globalThis.fetch(n,r);throw new t("global fetch is unavailable; pass fetchImpl explicitly")}async function Rq(e,t,n,r){return await Nq(e,t,n,r,n.timeoutMs)}async function Nq(e,t,n,r,s,o){let i=kq(n,r),a=`${Iq(n)}${e}`,c=s??bq,l={...t},d=new AbortController;l.signal=d.signal;let u=setTimeout(()=>{d.abort()},c);try{return await i(a,l)}catch(f){throw d.signal.aborted?o?o():new r(`auth request timed out for ${e} after ${c}ms`,{cause:f}):f instanceof r?f:new r(`auth request failed for ${e}`,{cause:f})}finally{clearTimeout(u)}}async function xq(e,t,n){let r;try{r=await e.json()}catch(s){throw new n(`${t} was not valid JSON`,{cause:s,status:e.status})}if(!r||typeof r!="object"||Array.isArray(r))throw new n(`${t} must be a JSON object`,{status:e.status});return r}function HT(e,t,n,r){let s=e[t];if(typeof s!="string"||s.length===0)throw new r(`${n} missing string field ${t}`);return s}function Dt(e){return async(...t)=>{throw new Error(`lmmail-client fake: ${e} not stubbed`)}}var rde={listMailboxes:Dt("listMailboxes"),createMailbox:Dt("createMailbox"),deleteMailbox:Dt("deleteMailbox"),sendMessage:Dt("sendMessage"),listMessages:Dt("listMessages"),getRecentMessages:Dt("getRecentMessages"),getMessage:Dt("getMessage"),getMessageMetadata:Dt("getMessageMetadata"),getThread:Dt("getThread"),download:Dt("download"),deleteMessage:Dt("deleteMessage"),registerSite:Dt("registerSite"),resolveSite:Dt("resolveSite"),listSites:Dt("listSites"),setSiteName:Dt("setSiteName"),deleteSiteName:Dt("deleteSiteName"),deleteSite:Dt("deleteSite")};var sr=class extends Error{status;code;responseBody;constructor(t,n,r,s){super(`${t}: HTTP ${n}${s?` ${s}`:r?` ${r}`:""}`),this.name="LmmailHttpError",this.status=n,this.code=s,this.responseBody=r}};function gn(e){let t=e.apiUrl.replace(/\/+$/,"");if(!t)throw new Error("lmmail API URL is required");if(!e.appkey)throw new Error("lmmail appkey is required");let n=e.fetch??fetch,r={authorization:`Bearer ${e.appkey}`};async function s(A={}){return(await T(`${t}/mailboxes${A.withCounts?"?with_counts=1":""}`,{headers:r},"list mailboxes failed")).mailboxes}async function o(A,I={}){let R=await n(`${t}/mailboxes`,{method:"POST",headers:{...r,"content-type":"application/json"},body:JSON.stringify({mailbox_name:A})});if(R.status===409){let L=await R.text().catch(()=>"");if(I.tolerate409!==!1&&VT(L)==="mailbox_exists")return;throw XT("create mailbox failed",R.status,L)}await b(R,"create mailbox failed")}async function i(A){return T(`${t}/mailboxes/${encodeURIComponent(A)}`,{method:"DELETE",headers:r},"delete mailbox failed")}async function a(A){let I=A.attachments??[],R=await T(`${t}/mailboxes/${encodeURIComponent(A.mailbox)}/messages`,{method:"POST",headers:{...r,"content-type":"application/json"},body:JSON.stringify({...A.subject===void 0?{}:{subject:A.subject},body:BT(A.body),attachments:I.map(BT)})},"allocate message failed"),L=[{target:R.body,bytes:A.body.bytes},...R.attachments.map((N,k)=>({target:N,bytes:I[k].bytes}))];for(let{target:N,bytes:k}of L){let D=new FormData;for(let[v,S]of Object.entries(N.fields))D.append(v,S);D.append("file",new Blob([new Uint8Array(k)],{type:N.content_type}),N.name);let O=await n(N.upload_url,{method:"POST",body:D});await b(O,`upload failed for ${N.name}`)}return await T(Lq(t,R.finalize_url),{method:"POST",headers:r},"finalize message failed"),R.seq}async function c(A,I={}){let R=new URLSearchParams;if(I.status&&R.set("status",I.status),I.after!==void 0&&R.set("after",String(I.after)),I.wait_s!==void 0){if(!Number.isInteger(I.wait_s)||I.wait_s<0||I.wait_s>20)throw new Error("wait_s must be an integer from 0 through 20");R.set("wait_s",String(I.wait_s))}let L=R.size>0?`?${R.toString()}`:"",N=await T(`${t}/mailboxes/${encodeURIComponent(A)}/messages${L}`,{headers:r},"list messages failed");return{messages:N.messages,next_after:N.next_after}}async function l(A={}){let I=new URLSearchParams;if(A.limit!==void 0){if(!Number.isInteger(A.limit)||A.limit<1||A.limit>50)throw new Error("limit must be an integer from 1 through 50");I.set("limit",String(A.limit))}let R=I.size>0?`?${I.toString()}`:"";return T(`${t}/messages/recent${R}`,{headers:r},"get recent messages failed")}async function d(A,I){return T(`${t}/mailboxes/${encodeURIComponent(A)}/messages/${I}`,{headers:r},"get message failed")}async function u(A,I){let R=await d(A,I);return{...R,body:GT(R.body),attachments:R.attachments.map(GT)}}async function f(A,I){return T(`${t}/mailboxes/${encodeURIComponent(A)}/messages/${I}/thread`,{headers:r},"get thread failed")}async function m(A){let I=await n(A);return await b(I,"download failed"),new Uint8Array(await I.arrayBuffer())}async function p(A,I){await T(`${t}/mailboxes/${encodeURIComponent(A)}/messages/${I}`,{method:"DELETE",headers:r},"delete message failed")}async function h(A,I,R){return await T(`${t}/sites`,{method:"POST",headers:{...r,"content-type":"application/json"},body:JSON.stringify({site_name:A,site_uuid:I,mailbox:R})},"register site failed")}async function _(A){return await T(`${t}/sites/${encodeURIComponent(A)}`,{headers:r},"resolve site failed")}async function g(A={}){let I=new URLSearchParams;if(A.cursor!==void 0&&I.set("cursor",A.cursor),A.limit!==void 0){if(!Number.isInteger(A.limit)||A.limit<1||A.limit>50)throw new Error("limit must be an integer from 1 through 50");I.set("limit",String(A.limit))}let R=I.size>0?`?${I.toString()}`:"";return T(`${t}/sites${R}`,{headers:r},"list sites failed")}async function w(A,I){return T(`${t}/sites/name`,{method:"PUT",headers:{...r,"content-type":"application/json"},body:JSON.stringify({site:A,name:I})},"set site name failed")}async function y(A){return T(`${t}/sites/name`,{method:"DELETE",headers:{...r,"content-type":"application/json"},body:JSON.stringify({site:A})},"delete site name failed")}async function E(A){await T(`${t}/sites/${encodeURIComponent(A)}`,{method:"DELETE",headers:r},"delete site failed")}async function T(A,I,R){let L=await n(A,I);await b(L,R);try{return await L.json()}catch(N){throw new Error(`${R}: invalid JSON response: ${Cq(N)}`)}}async function b(A,I){if(A.ok)return;let R=await A.text().catch(()=>"");throw XT(I,A.status,R)}return{listMailboxes:s,createMailbox:o,deleteMailbox:i,sendMessage:a,listMessages:c,getRecentMessages:l,getMessage:d,getMessageMetadata:u,getThread:f,download:m,deleteMessage:p,registerSite:h,resolveSite:_,listSites:g,setSiteName:w,deleteSiteName:y,deleteSite:E}}function BT(e){return{name:e.name,size:e.bytes.byteLength,content_type:e.contentType}}function GT(e){return{name:e.name,size:e.size,content_type:e.content_type}}function XT(e,t,n){return new sr(e,t,n,VT(n))}function VT(e){try{let t=JSON.parse(e);return typeof t.error=="string"?t.error:void 0}catch{return}}function Lq(e,t){return/^https?:\/\//i.test(t)?t:`${e}${t.startsWith("/")?"":"/"}${t}`}function Cq(e){return e instanceof Error?e.message:String(e)}import{execFile as aH}from"node:child_process";import{existsSync as cH}from"node:fs";import{join as lH}from"node:path";import{promisify as dH}from"node:util";import{existsSync as JT}from"node:fs";import{createRequire as Oq}from"node:module";import{dirname as Dq}from"node:path";var xp=null;function $q(){return xp===null&&(xp=Oq(import.meta.url)("node:sqlite").DatabaseSync),xp}var Mq={1:"SQLITE_ERROR",2:"SQLITE_INTERNAL",3:"SQLITE_PERM",4:"SQLITE_ABORT",5:"SQLITE_BUSY",6:"SQLITE_LOCKED",7:"SQLITE_NOMEM",8:"SQLITE_READONLY",9:"SQLITE_INTERRUPT",10:"SQLITE_IOERR",11:"SQLITE_CORRUPT",12:"SQLITE_NOTFOUND",13:"SQLITE_FULL",14:"SQLITE_CANTOPEN",15:"SQLITE_PROTOCOL",16:"SQLITE_EMPTY",17:"SQLITE_SCHEMA",18:"SQLITE_TOOBIG",19:"SQLITE_CONSTRAINT",20:"SQLITE_MISMATCH",21:"SQLITE_MISUSE",22:"SQLITE_NOLFS",23:"SQLITE_AUTH",24:"SQLITE_FORMAT",25:"SQLITE_RANGE",26:"SQLITE_NOTADB",27:"SQLITE_NOTICE",28:"SQLITE_WARNING"},Pq={261:"SQLITE_BUSY_RECOVERY",517:"SQLITE_BUSY_SNAPSHOT",773:"SQLITE_BUSY_TIMEOUT",262:"SQLITE_LOCKED_SHAREDCACHE",518:"SQLITE_LOCKED_VTAB",264:"SQLITE_READONLY_RECOVERY",520:"SQLITE_READONLY_CANTLOCK",776:"SQLITE_READONLY_ROLLBACK",1032:"SQLITE_READONLY_DBMOVED",1288:"SQLITE_READONLY_CANTINIT",1544:"SQLITE_READONLY_DIRECTORY",270:"SQLITE_CANTOPEN_NOTEMPDIR",526:"SQLITE_CANTOPEN_ISDIR",782:"SQLITE_CANTOPEN_FULLPATH",1038:"SQLITE_CANTOPEN_CONVPATH",1294:"SQLITE_CANTOPEN_DIRTYWAL",1550:"SQLITE_CANTOPEN_SYMLINK",275:"SQLITE_CONSTRAINT_CHECK",531:"SQLITE_CONSTRAINT_COMMITHOOK",787:"SQLITE_CONSTRAINT_FOREIGNKEY",1043:"SQLITE_CONSTRAINT_FUNCTION",1299:"SQLITE_CONSTRAINT_NOTNULL",1555:"SQLITE_CONSTRAINT_PRIMARYKEY",1811:"SQLITE_CONSTRAINT_TRIGGER",2067:"SQLITE_CONSTRAINT_UNIQUE",2323:"SQLITE_CONSTRAINT_VTAB",2579:"SQLITE_CONSTRAINT_ROWID",2835:"SQLITE_CONSTRAINT_PINNED",3091:"SQLITE_CONSTRAINT_DATATYPE"};function Uq(e){return Pq[e]??Mq[e&255]??`SQLITE_UNKNOWN_${e}`}var Fq="SQLite3 can only bind numbers, strings, bigints, buffers, and null";function or(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.errcode=="number")throw t.code=Uq(t.errcode),e;if(t.code==="ERR_INVALID_ARG_TYPE"&&/cannot be bound/.test(String(t.message)))throw new TypeError(Fq);if(t.code==="ERR_INVALID_STATE"&&/database is not open/.test(String(t.message)))throw new TypeError("The database connection is not open")}throw e}function jq(){let e="unable to open database file";return Object.assign(new Error(e),{code:"SQLITE_CANTOPEN",errcode:14,errstr:e})}function YT(e){return e instanceof Uint8Array&&!Buffer.isBuffer(e)?Buffer.from(e.buffer,e.byteOffset,e.byteLength):e}function qq(e){if(e==null)return e;if(Array.isArray(e))return e.map(YT);if(typeof e=="object"){let t={};for(let[n,r]of Object.entries(e))t[n]=YT(r);return t}return e}function Hq(e){if(e===null||typeof e!="object"||Array.isArray(e)||e instanceof Uint8Array)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function id(e){return e.map((t,n)=>{if(t===void 0)return null;if(n===0&&Hq(t)){let r={};for(let[s,o]of Object.entries(t))r[s]=o===void 0?null:o;return r}return t})}var Lp=class{handle;pluckMode=!1;arrayMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0),this.handle.setAllowUnknownNamedParameters(!0)}get source(){return this.handle.sourceSQL}run(...t){try{let n=this.handle.run(...id(t));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}catch(n){or(n)}}get(...t){try{return this.project(this.handle.get(...id(t)))}catch(n){or(n)}}all(...t){try{return this.handle.all(...id(t)).map(n=>this.project(n))}catch(n){or(n)}}*iterate(...t){let n;try{n=this.handle.iterate(...id(t))}catch(r){or(r)}for(;;){let r;try{r=n.next()}catch(s){or(s)}if(r.done)return;yield this.project(r.value)}}raw(t=!0){return this.arrayMode=t,this.handle.setReturnArrays(t||this.pluckMode),this}pluck(t=!0){return this.pluckMode=t,this.handle.setReturnArrays(t||this.arrayMode),this}project(t){let n=qq(t);return this.pluckMode&&Array.isArray(n)?n[0]:n}},Cp=class{name;memory;readonly;handle;savepointId=0;constructor(t,n={}){let r=t===":memory:"||t==="";if(n.readonly===!0&&r)throw new TypeError("In-memory/temporary databases cannot be readonly");if(!r&&!JT(Dq(t)))throw new TypeError("Cannot open database because the directory does not exist");if(n.fileMustExist===!0&&!r&&!JT(t))throw jq();this.name=t,this.memory=r,this.readonly=n.readonly===!0;try{this.handle=new($q())(t,{readOnly:this.readonly,timeout:n.timeout??5e3,enableForeignKeyConstraints:n.foreignKeys??!0})}catch(s){or(s)}}get open(){return this.handle.isOpen}get inTransaction(){return this.handle.isTransaction}prepare(t){try{return new Lp(this.handle.prepare(t))}catch(n){or(n)}}exec(t){try{return this.handle.exec(t),this}catch(n){or(n)}}pragma(t,n){let r=this.prepare(`PRAGMA ${t}`);return n?.simple===!0?r.pluck().get():r.all()}transaction(t){let n=s=>(...o)=>this.runTransaction(s,t,o),r=n("BEGIN");return r.default=n("BEGIN"),r.deferred=n("BEGIN DEFERRED"),r.immediate=n("BEGIN IMMEDIATE"),r.exclusive=n("BEGIN EXCLUSIVE"),r}serialize(){try{let t=this.handle.serialize();return Buffer.from(t.buffer,t.byteOffset,t.byteLength)}catch(t){or(t)}}close(){if(!this.handle.isOpen)return this;try{return this.handle.close(),this}catch(t){or(t)}}runTransaction(t,n,r){if(!this.inTransaction){this.exec(t);try{let o=n(...r);return this.exec("COMMIT"),o}catch(o){if(this.inTransaction)try{this.exec("ROLLBACK")}catch(i){if(!Wq(i))throw i}throw o}}let s=`lmbee_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${s}`);try{let o=n(...r);return this.exec(`RELEASE ${s}`),o}catch(o){if(this.inTransaction)try{this.exec(`ROLLBACK TO ${s}`),this.exec(`RELEASE ${s}`)}catch(i){if(!Bq(i))throw i}throw o}}};function Wq(e){return e instanceof Error&&/cannot rollback - no transaction is active/i.test(e.message)}function Bq(e){return e instanceof Error&&/no such savepoint:/i.test(e.message)}var tn=Cp;import{existsSync as Dp,lstatSync as Gq,mkdirSync as Xq,readFileSync as QT,realpathSync as KT}from"node:fs";import{basename as Vq,dirname as Pp,isAbsolute as Jq,join as Yq,relative as Kq,resolve as zT}from"node:path";import{fileURLToPath as zq}from"node:url";var ZT=Yq(Pp(zq(import.meta.url)),"schema.sql");function tc(e){if(e!==void 0&&e!=="")return e;let t=process.env.LMBEE_DB;if(t)return t;throw new Error("No lmbee database selected: pass an explicit database path or set LMBEE_DB to the intended existing database. The retired ~/.lmbee/state.db default is no longer used.")}function Qq(e){if(e.startsWith("~"))throw new Error(`Refusing to open the lmbee database at "${e}": lmbee does not expand "~" in database paths, so this would be created as a literal directory named "~" under the current working directory. Use an absolute path instead (for example ~/.lmbee/state.db). Note for systemd units: Environment= expands neither "~" nor "$HOME", so write the absolute path literally there too.`)}function Zq(e,t){if(!(e===":memory:"||Dp(e)))throw new Error(`Refusing to create the lmbee database at "${e}": ${t} points at non-existent "${e}", and a typo is indistinguishable from a fresh install. To provision a new database here, \`touch "${e}"\` first, then retry, or point ${t} at an existing database.`)}function eH(e){e.transaction(()=>{let n=e.prepare("PRAGMA table_info(queue)").all();if(n.length===0)return;let r=new Set(n.map(o=>o.name));r.has("subject_id")||e.exec("ALTER TABLE queue ADD COLUMN subject_id TEXT"),r.has("dedupe_key")||e.exec("ALTER TABLE queue ADD COLUMN dedupe_key TEXT"),e.prepare(`SELECT name FROM pragma_index_list('queue') WHERE "unique" = 1 AND partial = 0`).all().some(o=>{let i=e.prepare("SELECT name FROM pragma_index_info(?) ORDER BY seqno").all(o.name);return i.length===1&&i[0].name==="dedupe_key"})||e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_queue_dedupe_key ON queue(dedupe_key)"),r.has("delivered_via_escalation")||e.exec("ALTER TABLE queue ADD COLUMN delivered_via_escalation INTEGER NOT NULL DEFAULT 0"),r.has("escalation_claimed_ts")||e.exec("ALTER TABLE queue ADD COLUMN escalation_claimed_ts TEXT"),r.has("escalation_claim_token")||e.exec("ALTER TABLE queue ADD COLUMN escalation_claim_token TEXT"),r.has("escalation_only")||e.exec("ALTER TABLE queue ADD COLUMN escalation_only INTEGER NOT NULL DEFAULT 0"),r.has("admission_fingerprint")||e.exec("ALTER TABLE queue ADD COLUMN admission_fingerprint TEXT"),r.has("expects_response")||e.exec("ALTER TABLE queue ADD COLUMN expects_response INTEGER NOT NULL DEFAULT 0"),r.has("to_alias")||e.exec("ALTER TABLE queue ADD COLUMN to_alias TEXT"),r.has("retracted_ts")||e.exec("ALTER TABLE queue ADD COLUMN retracted_ts TEXT"),r.has("retracted_reason")||e.exec("ALTER TABLE queue ADD COLUMN retracted_reason TEXT"),r.has("retraction_notice")||e.exec("ALTER TABLE queue ADD COLUMN retraction_notice INTEGER NOT NULL DEFAULT 0"),r.has("in_reply_to")||e.exec("ALTER TABLE queue ADD COLUMN in_reply_to INTEGER"),r.has("operator_priority")||e.exec("ALTER TABLE queue ADD COLUMN operator_priority INTEGER NOT NULL DEFAULT 0"),r.has("merged_into_id")||e.exec("ALTER TABLE queue ADD COLUMN merged_into_id INTEGER")}).immediate()}function tH(e){e.transaction(()=>{let n=e.prepare("PRAGMA table_info(team_progress)").all();if(n.length===0)return;let r=new Set(n.map(s=>s.name));r.has("last_miniplayer_reply_hash")||e.exec("ALTER TABLE team_progress ADD COLUMN last_miniplayer_reply_hash TEXT"),r.has("blocked_surfaced_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN blocked_surfaced_ts TEXT"),r.has("last_escalation_attempt_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN last_escalation_attempt_ts TEXT"),r.has("escalation_attempt_count")||e.exec("ALTER TABLE team_progress ADD COLUMN escalation_attempt_count INTEGER NOT NULL DEFAULT 0"),r.has("fault_surfaced_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN fault_surfaced_ts TEXT"),r.has("epic_closed_surfaced_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN epic_closed_surfaced_ts TEXT"),r.has("quota_exhausted_last_seen_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN quota_exhausted_last_seen_ts TEXT"),r.has("quota_exhausted_message")||e.exec("ALTER TABLE team_progress ADD COLUMN quota_exhausted_message TEXT"),r.has("miniplayer_verdict_label")||e.exec("ALTER TABLE team_progress ADD COLUMN miniplayer_verdict_label TEXT"),r.has("miniplayer_verdict_reason")||e.exec("ALTER TABLE team_progress ADD COLUMN miniplayer_verdict_reason TEXT"),r.has("miniplayer_verdict_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN miniplayer_verdict_ts TEXT"),r.has("miniplayer_verdict_input_hash")||e.exec("ALTER TABLE team_progress ADD COLUMN miniplayer_verdict_input_hash TEXT"),r.has("miniplayer_verdict_structural_hash")||e.exec("ALTER TABLE team_progress ADD COLUMN miniplayer_verdict_structural_hash TEXT"),r.has("holder_watch_pid")||e.exec("ALTER TABLE team_progress ADD COLUMN holder_watch_pid INTEGER"),r.has("holder_watch_started_at")||e.exec("ALTER TABLE team_progress ADD COLUMN holder_watch_started_at TEXT"),r.has("holder_watch_cpu_ticks")||e.exec("ALTER TABLE team_progress ADD COLUMN holder_watch_cpu_ticks INTEGER"),r.has("holder_watch_observed_at")||e.exec("ALTER TABLE team_progress ADD COLUMN holder_watch_observed_at TEXT"),r.has("holder_watch_low_cpu_streak")||e.exec("ALTER TABLE team_progress ADD COLUMN holder_watch_low_cpu_streak INTEGER"),r.has("hung_holder_flagged_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN hung_holder_flagged_ts TEXT"),r.has("hung_holder_reason")||e.exec("ALTER TABLE team_progress ADD COLUMN hung_holder_reason TEXT"),r.has("last_cli_activity_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN last_cli_activity_ts TEXT")}).immediate()}function nH(e){e.transaction(()=>{let n=e.prepare("PRAGMA table_info(cron_jobs)").all();if(n.length===0)return;let r=new Set(n.map(s=>s.name));r.has("last_fire_error")||e.exec("ALTER TABLE cron_jobs ADD COLUMN last_fire_error TEXT"),r.has("running_systemd_unit")||e.exec("ALTER TABLE cron_jobs ADD COLUMN running_systemd_unit TEXT"),r.has("timezone")||e.exec("ALTER TABLE cron_jobs ADD COLUMN timezone TEXT"),r.has("provider")||e.exec("ALTER TABLE cron_jobs ADD COLUMN provider TEXT"),r.has("model")||e.exec("ALTER TABLE cron_jobs ADD COLUMN model TEXT"),r.has("working_directory")||e.exec("ALTER TABLE cron_jobs ADD COLUMN working_directory TEXT"),r.has("escalation_owner")||e.exec("ALTER TABLE cron_jobs ADD COLUMN escalation_owner TEXT"),r.has("session_teamfile")||e.exec("ALTER TABLE cron_jobs ADD COLUMN session_teamfile TEXT"),r.has("session_alias")||e.exec("ALTER TABLE cron_jobs ADD COLUMN session_alias TEXT"),r.has("session_seeded_at")||e.exec("ALTER TABLE cron_jobs ADD COLUMN session_seeded_at TEXT"),r.has("session_generation")||e.exec("ALTER TABLE cron_jobs ADD COLUMN session_generation INTEGER NOT NULL DEFAULT 0")}).immediate()}function rH(e){e.transaction(()=>{let n=e.prepare("PRAGMA table_info(entities)").all();if(n.length===0)return;let r=new Set(n.map(s=>s.name));r.has("delivered_ts")||e.exec("ALTER TABLE entities ADD COLUMN delivered_ts TEXT"),r.has("review_time")||e.exec("ALTER TABLE entities ADD COLUMN review_time TEXT"),r.has("needs_review")||e.exec("ALTER TABLE entities ADD COLUMN needs_review INTEGER NOT NULL DEFAULT 0 CHECK(needs_review IN (0,1))"),r.has("review_reason")||e.exec("ALTER TABLE entities ADD COLUMN review_reason TEXT"),r.has("review_input_hash")||e.exec("ALTER TABLE entities ADD COLUMN review_input_hash TEXT"),r.has("hold_until")||e.exec("ALTER TABLE entities ADD COLUMN hold_until TEXT"),r.has("hold_reason")||e.exec("ALTER TABLE entities ADD COLUMN hold_reason TEXT"),r.has("blocked_on")||e.exec("ALTER TABLE entities ADD COLUMN blocked_on TEXT")}).immediate()}function sH(e){e.transaction(()=>{let n=e.prepare("PRAGMA table_info(mail_ledger)").all();if(n.length===0)return;let r=new Set(n.map(s=>s.name));r.has("ack_sent_ts")||e.exec("ALTER TABLE mail_ledger ADD COLUMN ack_sent_ts TEXT"),r.has("delivery_error")||e.exec("ALTER TABLE mail_ledger ADD COLUMN delivery_error TEXT"),r.has("delivery_error_ts")||e.exec("ALTER TABLE mail_ledger ADD COLUMN delivery_error_ts TEXT")}).immediate()}function cd(e){let t=process.env.LMBEE_TEST_DB_ROOT;if(!t||e===":memory:")return;let n=[],r=zT(e);for(;Gq(r,{throwIfNoEntry:!1})===void 0;){n.unshift(Vq(r));let i=Pp(r);if(i===r)throw new Error("Cannot resolve test database path");r=i}let s=zT(KT(r),...n),o=Kq(KT(t),s);if(o===".."||o.startsWith("../")||o.startsWith("..\\")||Jq(o))throw new Error(`Database path is outside the test database root: ${e}`)}function $p(e){let t=s=>e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(s)!==void 0,n=s=>e.prepare(`PRAGMA table_info(${s})`).all(),r;for(let s of["queue_responses","chat_tasks","chat_messages","chat_message_task_reassignments"])if(t(s)){r=`legacy table '${s}'`;break}if(r===void 0&&t("answers")){let s=new Set(n("answers").map(o=>o.name));s.has("request_queue_id")?r="legacy column 'answers.request_queue_id'":s.has("superseded_at")||(r="legacy 'answers' shape: missing column 'superseded_at'")}if(r===void 0&&t("queue")){let s=n("queue"),o=new Set(s.map(i=>i.name));o.has("team")?r="legacy column 'queue.team'":o.has("to_id")?s.some(i=>i.name==="from_id"&&i.notnull!==1)?r="legacy 'queue' shape: from_id is still nullable":o.has("restart_nudge_sent_ts")&&(r="legacy column 'queue.restart_nudge_sent_ts'"):r="legacy 'queue' shape: missing column 'to_id'"}if(r===void 0&&t("cron_jobs")){let s=e.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'cron_jobs'").get();(s===void 0||!s.sql.includes("'miniplayer'"))&&(r="legacy 'cron_jobs' CHECK constraint predates 'miniplayer'")}if(r===void 0&&t("cron_jobs")){let s=e.prepare("SELECT id, action_payload FROM cron_jobs WHERE action_kind = 'enqueue'").all();for(let o of s){let i;try{i=JSON.parse(o.action_payload)}catch{i=void 0}let a=typeof i=="object"&&i!==null?i.prompt:void 0;if(typeof a!="string"||a.trim().length===0){r=`legacy 'cron_jobs' enqueue payload (id ${o.id}) predates the 'prompt' vocabulary`;break}}}if(r===void 0&&t("team_progress")&&new Set(n("team_progress").map(o=>o.name)).has("last_scan_head")&&(r="legacy column 'team_progress.last_scan_head'"),r===void 0&&t("cron_runs")&&(new Set(n("cron_runs").map(o=>o.name)).has("execution_state")||(r="legacy 'cron_runs' shape: missing column 'execution_state'")),r===void 0&&t("rate_limit_policy_log")){let s=e.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'rate_limit_policy_log'").get();(s===void 0||!s.sql.includes("'confirmed_would_fire_policy_disabled'"))&&(r="legacy 'rate_limit_policy_log' CHECK constraint predates 'confirmed_would_fire_policy_disabled'")}if(r===void 0&&t("rate_limit_policy_arm")&&(new Set(n("rate_limit_policy_arm").map(o=>o.name)).has("armed_used_fraction")||(r="legacy 'rate_limit_policy_arm' shape: missing column 'armed_used_fraction'")),r!==void 0)throw new Error(`Refusing to open this lmbee state.db: abandoned pre-v14 lmbee schema shape (${r}). Per the operator's 2026-10-01 shared-database decision, lmbee now shares lmctl's state.db and every pre-existing lmbee-only database is abandoned -- there is no data migration, ever. Do not remove a shared lmctl database. Check LMBEE_DB and the database ownership; point lmbee at the intended compatible database. Preserve this file for operator review.`)}var ad=62;function Mp(e){let t=e.pragma("user_version",{simple:!0});if(t<=ad)return;let n;if(e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'schema_meta'").get()!==void 0){let s=new Set(e.prepare("PRAGMA table_info(schema_meta)").all().map(o=>o.name));if(s.has("key")&&s.has("value")){let o=e.prepare("SELECT value FROM schema_meta WHERE key = 'min_reader_version'").get();typeof o?.value=="string"&&(n=o.value)}}let r;if(n===void 0)r="schema_meta.min_reader_version is absent";else if(!/^[1-9]\d*$/.test(n))r=`schema_meta.min_reader_version=${JSON.stringify(n)} is malformed (not a canonical decimal integer)`;else if(Number(n)>ad)r=`schema_meta.min_reader_version=${n} declares a breaking floor above ${ad}`;else return;throw new Error(`Refusing to open the shared state.db: it was migrated by a newer lmctl with breaking changes (user_version=${t} exceeds the newest lmctl schema version this lmbee build understands, ${ad}, and ${r}). Upgrade lmbee to a build that understands the newer lmctl schema before opening this database again. lmbee never writes user_version or schema_meta, so the file is untouched.`)}var Op;function oH(){return Op===void 0&&(Op=[...QT(ZT,"utf8").matchAll(/CREATE TABLE IF NOT EXISTS (\w+)/gi)].map(t=>t[1])),Op}function iH(e,t){let n=new Set(e.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all().map(s=>s.name)),r=oH().filter(s=>!n.has(s));if(r.length!==0)throw new Error(`Refusing a read-only open of "${t}": required lmbee schema is missing (no table${r.length===1?"":"s"}: ${r.join(", ")}), and a read-only handle cannot create it. Run any writable lmbee command (or start the daemon) once against this database to provision it, then retry.`)}function ld(e,t={}){let n=tc(e);Qq(n);let r=!e&&typeof process.env.LMBEE_DB=="string"&&process.env.LMBEE_DB!=="";if(r&&Zq(n,"LMBEE_DB"),cd(n),t.readOnly&&n===":memory:")throw new Error("Refusing a read-only open of ':memory:': an in-memory database starts empty on every open, so the required lmbee schema can never be present and a read-only handle cannot create it.");if(t.readOnly&&n!==":memory:"){if(!Dp(n))throw new Error(`Refusing a read-only open of "${n}": the file does not exist, so the required lmbee schema is missing. Run any writable lmbee command (or start the daemon) once against this database to provision it, then retry.`);let a=new tn(n,{readonly:!0,fileMustExist:!0});try{$p(a),Mp(a),a.pragma("busy_timeout = 5000"),t.requireLmbeeSchema!==!1&&iH(a,n)}catch(c){throw a.close(),c}return{path:n,db:a,close:()=>a.close()}}if(n!==":memory:"){let a=Pp(n);Dp(a)||Xq(a,{recursive:!0})}let s=new tn(n,r?{fileMustExist:!0}:void 0);try{$p(s),Mp(s)}catch(a){throw s.close(),a}s.pragma("journal_mode = WAL"),s.pragma("busy_timeout = 5000");let o=QT(ZT,"utf8"),i=s.transaction(()=>{eH(s),tH(s),sH(s),rH(s),nH(s),s.exec(o);let a=s.pragma("table_info(on_demand_launches)");a.some(c=>c.name==="phase")||(s.exec("ALTER TABLE on_demand_launches ADD COLUMN phase TEXT NOT NULL DEFAULT 'reserved' CHECK(phase IN ('reserved', 'dispatching', 'worker_adopted', 'uncertain'))"),s.exec("UPDATE on_demand_launches SET phase = 'uncertain' WHERE state = 'adopted' OR run_id IS NOT NULL")),a.some(c=>c.name==="worker_pid")||s.exec("ALTER TABLE on_demand_launches ADD COLUMN worker_pid INTEGER"),a.some(c=>c.name==="worker_start")||s.exec("ALTER TABLE on_demand_launches ADD COLUMN worker_start TEXT"),a.some(c=>c.name==="receipt_path")||s.exec("ALTER TABLE on_demand_launches ADD COLUMN receipt_path TEXT")});try{i.immediate()}catch(a){throw s.close(),a}return{path:n,db:s,close:()=>s.close()}}function yt(e,t){return e.prepare("SELECT * FROM team_state WHERE team = ?").get(t)??null}function ev(e,t){let n=yt(e,t);return n===null?{kind:"never-observed"}:{kind:"observed",value:n,observedAt:n.last_ts,changedAt:n.changed_ts}}function Ur(e,t,n,r){let s=new Date(r).toISOString(),o=yt(e,t),i=o&&o.status===n?o.changed_ts:s;e.prepare(`INSERT INTO team_state(team, status, changed_ts, last_ts) VALUES (?, ?, ?, ?)
70
+ `),1}finally{a.close()}}var Lj=rr(()=>{Ij()});import{spawn as Ule}from"node:child_process";import{openSync as Fle,mkdirSync as jle,writeFileSync as qle}from"node:fs";import{homedir as Hle}from"node:os";import{join as MT}from"node:path";import{mkdirSync as Yle,readFileSync as Tq,renameSync as Kle,writeFileSync as zle}from"node:fs";import{homedir as vq}from"node:os";import{dirname as ede,join as jT}from"node:path";var Xle=Object.freeze({free:1e6,test:1e7});var po=class extends Error{code="APPKEY_NOT_FOUND";constructor(t="no lmctl appkey found; run `lmchat login` on a machine with a browser, or copy ~/.config/lmctl/appkey.json here, or set LMCTL_APPKEY"){super(t),this.name="AppkeyNotFoundError"}},Ur=class extends Error{code="APPKEY_VALIDATION_ERROR";status;constructor(t,n={}){super(t),this.name="AppkeyValidationError",this.status=n.status,this.cause=n.cause}},sd=class extends Error{code="APPKEY_INVALID";source;constructor(t){super(`${t} resolved an invalid lmctl appkey`),this.name="AppkeyInvalidError",this.source=t}},od=class extends Error{code="AUTH_API_ERROR";status;constructor(t,n={}){super(t),this.name="AuthApiError",this.status=n.status,this.cause=n.cause}};var Sq="https://lmctl.ai/auth",bq=1e4;function Np(e){return e.length>0&&!e.includes(`
71
+ `)}function Fe(e={}){let t=e.env??process.env,n=e.fs??{readFileSync:(c,l)=>Tq(c,l)},r=e.homedir??vq,s=t.LMCTL_APPKEY?.trim();if(s&&Np(s))return{appkey:s,source:"env:LMCTL_APPKEY",envelope:null};let o=t.LMCTL_APPKEY_FILE?.trim();if(o){let c=qT(n,o,"env:LMCTL_APPKEY_FILE");if(c)return c}let i=Aq(t,r),a=qT(n,i,"file:default");if(a)return a;throw new po}async function WT(e,t={}){let n=await Rq("/whoami",{method:"GET",headers:{authorization:`Bearer ${e}`}},t,Ur);if(n.status===401)return{valid:!1};if(n.status!==200)throw new Ur(`appkey validation failed with status ${n.status}`,{status:n.status});let r=await xq(n,"validate appkey response",Ur);return{valid:!0,userId:HT(r,"user_id","validate appkey response",Ur),label:HT(r,"label","validate appkey response",Ur)}}function qT(e,t,n){let r;try{r=e.readFileSync(t,"utf8")}catch{return null}let s=r.trim();if(s.length===0)return null;if(s.startsWith("{")){let o;try{o=JSON.parse(s)}catch{o=void 0}if(o&&typeof o=="object"){let i=o;return typeof i.appkey=="string"&&Np(i.appkey.trim())?{appkey:i.appkey.trim(),source:n,envelope:i}:null}}return Np(s)?{appkey:s,source:n,envelope:null}:null}function Aq(e,t){let n=e.XDG_CONFIG_HOME?.trim()||jT(t(),".config");return jT(n,"lmctl","appkey.json")}function Iq(e){let t=e.env??process.env;return(e.authBaseUrl?.trim()||t.LMCTL_AUTH_BASE_URL?.trim()||Sq).replace(/\/+$/,"")}function kq(e,t){if(e.fetchImpl)return e.fetchImpl;if(typeof globalThis.fetch=="function")return(n,r)=>globalThis.fetch(n,r);throw new t("global fetch is unavailable; pass fetchImpl explicitly")}async function Rq(e,t,n,r){return await Nq(e,t,n,r,n.timeoutMs)}async function Nq(e,t,n,r,s,o){let i=kq(n,r),a=`${Iq(n)}${e}`,c=s??bq,l={...t},d=new AbortController;l.signal=d.signal;let u=setTimeout(()=>{d.abort()},c);try{return await i(a,l)}catch(f){throw d.signal.aborted?o?o():new r(`auth request timed out for ${e} after ${c}ms`,{cause:f}):f instanceof r?f:new r(`auth request failed for ${e}`,{cause:f})}finally{clearTimeout(u)}}async function xq(e,t,n){let r;try{r=await e.json()}catch(s){throw new n(`${t} was not valid JSON`,{cause:s,status:e.status})}if(!r||typeof r!="object"||Array.isArray(r))throw new n(`${t} must be a JSON object`,{status:e.status});return r}function HT(e,t,n,r){let s=e[t];if(typeof s!="string"||s.length===0)throw new r(`${n} missing string field ${t}`);return s}function Dt(e){return async(...t)=>{throw new Error(`lmmail-client fake: ${e} not stubbed`)}}var rde={listMailboxes:Dt("listMailboxes"),createMailbox:Dt("createMailbox"),deleteMailbox:Dt("deleteMailbox"),sendMessage:Dt("sendMessage"),listMessages:Dt("listMessages"),getRecentMessages:Dt("getRecentMessages"),getMessage:Dt("getMessage"),getMessageMetadata:Dt("getMessageMetadata"),getThread:Dt("getThread"),download:Dt("download"),deleteMessage:Dt("deleteMessage"),registerSite:Dt("registerSite"),resolveSite:Dt("resolveSite"),listSites:Dt("listSites"),setSiteName:Dt("setSiteName"),deleteSiteName:Dt("deleteSiteName"),deleteSite:Dt("deleteSite")};var sr=class extends Error{status;code;responseBody;constructor(t,n,r,s){super(`${t}: HTTP ${n}${s?` ${s}`:r?` ${r}`:""}`),this.name="LmmailHttpError",this.status=n,this.code=s,this.responseBody=r}};function gn(e){let t=e.apiUrl.replace(/\/+$/,"");if(!t)throw new Error("lmmail API URL is required");if(!e.appkey)throw new Error("lmmail appkey is required");let n=e.fetch??fetch,r={authorization:`Bearer ${e.appkey}`};async function s(A={}){return(await T(`${t}/mailboxes${A.withCounts?"?with_counts=1":""}`,{headers:r},"list mailboxes failed")).mailboxes}async function o(A,I={}){let R=await n(`${t}/mailboxes`,{method:"POST",headers:{...r,"content-type":"application/json"},body:JSON.stringify({mailbox_name:A})});if(R.status===409){let L=await R.text().catch(()=>"");if(I.tolerate409!==!1&&VT(L)==="mailbox_exists")return;throw XT("create mailbox failed",R.status,L)}await b(R,"create mailbox failed")}async function i(A){return T(`${t}/mailboxes/${encodeURIComponent(A)}`,{method:"DELETE",headers:r},"delete mailbox failed")}async function a(A){let I=A.attachments??[],R=await T(`${t}/mailboxes/${encodeURIComponent(A.mailbox)}/messages`,{method:"POST",headers:{...r,"content-type":"application/json"},body:JSON.stringify({...A.subject===void 0?{}:{subject:A.subject},body:BT(A.body),attachments:I.map(BT)})},"allocate message failed"),L=[{target:R.body,bytes:A.body.bytes},...R.attachments.map((N,k)=>({target:N,bytes:I[k].bytes}))];for(let{target:N,bytes:k}of L){let D=new FormData;for(let[v,S]of Object.entries(N.fields))D.append(v,S);D.append("file",new Blob([new Uint8Array(k)],{type:N.content_type}),N.name);let O=await n(N.upload_url,{method:"POST",body:D});await b(O,`upload failed for ${N.name}`)}return await T(Lq(t,R.finalize_url),{method:"POST",headers:r},"finalize message failed"),R.seq}async function c(A,I={}){let R=new URLSearchParams;if(I.status&&R.set("status",I.status),I.after!==void 0&&R.set("after",String(I.after)),I.wait_s!==void 0){if(!Number.isInteger(I.wait_s)||I.wait_s<0||I.wait_s>20)throw new Error("wait_s must be an integer from 0 through 20");R.set("wait_s",String(I.wait_s))}let L=R.size>0?`?${R.toString()}`:"",N=await T(`${t}/mailboxes/${encodeURIComponent(A)}/messages${L}`,{headers:r},"list messages failed");return{messages:N.messages,next_after:N.next_after}}async function l(A={}){let I=new URLSearchParams;if(A.limit!==void 0){if(!Number.isInteger(A.limit)||A.limit<1||A.limit>50)throw new Error("limit must be an integer from 1 through 50");I.set("limit",String(A.limit))}let R=I.size>0?`?${I.toString()}`:"";return T(`${t}/messages/recent${R}`,{headers:r},"get recent messages failed")}async function d(A,I){return T(`${t}/mailboxes/${encodeURIComponent(A)}/messages/${I}`,{headers:r},"get message failed")}async function u(A,I){let R=await d(A,I);return{...R,body:GT(R.body),attachments:R.attachments.map(GT)}}async function f(A,I){return T(`${t}/mailboxes/${encodeURIComponent(A)}/messages/${I}/thread`,{headers:r},"get thread failed")}async function m(A){let I=await n(A);return await b(I,"download failed"),new Uint8Array(await I.arrayBuffer())}async function p(A,I){await T(`${t}/mailboxes/${encodeURIComponent(A)}/messages/${I}`,{method:"DELETE",headers:r},"delete message failed")}async function h(A,I,R){return await T(`${t}/sites`,{method:"POST",headers:{...r,"content-type":"application/json"},body:JSON.stringify({site_name:A,site_uuid:I,mailbox:R})},"register site failed")}async function _(A){return await T(`${t}/sites/${encodeURIComponent(A)}`,{headers:r},"resolve site failed")}async function g(A={}){let I=new URLSearchParams;if(A.cursor!==void 0&&I.set("cursor",A.cursor),A.limit!==void 0){if(!Number.isInteger(A.limit)||A.limit<1||A.limit>50)throw new Error("limit must be an integer from 1 through 50");I.set("limit",String(A.limit))}let R=I.size>0?`?${I.toString()}`:"";return T(`${t}/sites${R}`,{headers:r},"list sites failed")}async function w(A,I){return T(`${t}/sites/name`,{method:"PUT",headers:{...r,"content-type":"application/json"},body:JSON.stringify({site:A,name:I})},"set site name failed")}async function y(A){return T(`${t}/sites/name`,{method:"DELETE",headers:{...r,"content-type":"application/json"},body:JSON.stringify({site:A})},"delete site name failed")}async function E(A){await T(`${t}/sites/${encodeURIComponent(A)}`,{method:"DELETE",headers:r},"delete site failed")}async function T(A,I,R){let L=await n(A,I);await b(L,R);try{return await L.json()}catch(N){throw new Error(`${R}: invalid JSON response: ${Cq(N)}`)}}async function b(A,I){if(A.ok)return;let R=await A.text().catch(()=>"");throw XT(I,A.status,R)}return{listMailboxes:s,createMailbox:o,deleteMailbox:i,sendMessage:a,listMessages:c,getRecentMessages:l,getMessage:d,getMessageMetadata:u,getThread:f,download:m,deleteMessage:p,registerSite:h,resolveSite:_,listSites:g,setSiteName:w,deleteSiteName:y,deleteSite:E}}function BT(e){return{name:e.name,size:e.bytes.byteLength,content_type:e.contentType}}function GT(e){return{name:e.name,size:e.size,content_type:e.content_type}}function XT(e,t,n){return new sr(e,t,n,VT(n))}function VT(e){try{let t=JSON.parse(e);return typeof t.error=="string"?t.error:void 0}catch{return}}function Lq(e,t){return/^https?:\/\//i.test(t)?t:`${e}${t.startsWith("/")?"":"/"}${t}`}function Cq(e){return e instanceof Error?e.message:String(e)}import{execFile as aH}from"node:child_process";import{existsSync as cH}from"node:fs";import{join as lH}from"node:path";import{promisify as dH}from"node:util";import{existsSync as JT}from"node:fs";import{createRequire as Oq}from"node:module";import{dirname as Dq}from"node:path";var xp=null;function $q(){return xp===null&&(xp=Oq(import.meta.url)("node:sqlite").DatabaseSync),xp}var Mq={1:"SQLITE_ERROR",2:"SQLITE_INTERNAL",3:"SQLITE_PERM",4:"SQLITE_ABORT",5:"SQLITE_BUSY",6:"SQLITE_LOCKED",7:"SQLITE_NOMEM",8:"SQLITE_READONLY",9:"SQLITE_INTERRUPT",10:"SQLITE_IOERR",11:"SQLITE_CORRUPT",12:"SQLITE_NOTFOUND",13:"SQLITE_FULL",14:"SQLITE_CANTOPEN",15:"SQLITE_PROTOCOL",16:"SQLITE_EMPTY",17:"SQLITE_SCHEMA",18:"SQLITE_TOOBIG",19:"SQLITE_CONSTRAINT",20:"SQLITE_MISMATCH",21:"SQLITE_MISUSE",22:"SQLITE_NOLFS",23:"SQLITE_AUTH",24:"SQLITE_FORMAT",25:"SQLITE_RANGE",26:"SQLITE_NOTADB",27:"SQLITE_NOTICE",28:"SQLITE_WARNING"},Pq={261:"SQLITE_BUSY_RECOVERY",517:"SQLITE_BUSY_SNAPSHOT",773:"SQLITE_BUSY_TIMEOUT",262:"SQLITE_LOCKED_SHAREDCACHE",518:"SQLITE_LOCKED_VTAB",264:"SQLITE_READONLY_RECOVERY",520:"SQLITE_READONLY_CANTLOCK",776:"SQLITE_READONLY_ROLLBACK",1032:"SQLITE_READONLY_DBMOVED",1288:"SQLITE_READONLY_CANTINIT",1544:"SQLITE_READONLY_DIRECTORY",270:"SQLITE_CANTOPEN_NOTEMPDIR",526:"SQLITE_CANTOPEN_ISDIR",782:"SQLITE_CANTOPEN_FULLPATH",1038:"SQLITE_CANTOPEN_CONVPATH",1294:"SQLITE_CANTOPEN_DIRTYWAL",1550:"SQLITE_CANTOPEN_SYMLINK",275:"SQLITE_CONSTRAINT_CHECK",531:"SQLITE_CONSTRAINT_COMMITHOOK",787:"SQLITE_CONSTRAINT_FOREIGNKEY",1043:"SQLITE_CONSTRAINT_FUNCTION",1299:"SQLITE_CONSTRAINT_NOTNULL",1555:"SQLITE_CONSTRAINT_PRIMARYKEY",1811:"SQLITE_CONSTRAINT_TRIGGER",2067:"SQLITE_CONSTRAINT_UNIQUE",2323:"SQLITE_CONSTRAINT_VTAB",2579:"SQLITE_CONSTRAINT_ROWID",2835:"SQLITE_CONSTRAINT_PINNED",3091:"SQLITE_CONSTRAINT_DATATYPE"};function Uq(e){return Pq[e]??Mq[e&255]??`SQLITE_UNKNOWN_${e}`}var Fq="SQLite3 can only bind numbers, strings, bigints, buffers, and null";function or(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.errcode=="number")throw t.code=Uq(t.errcode),e;if(t.code==="ERR_INVALID_ARG_TYPE"&&/cannot be bound/.test(String(t.message)))throw new TypeError(Fq);if(t.code==="ERR_INVALID_STATE"&&/database is not open/.test(String(t.message)))throw new TypeError("The database connection is not open")}throw e}function jq(){let e="unable to open database file";return Object.assign(new Error(e),{code:"SQLITE_CANTOPEN",errcode:14,errstr:e})}function YT(e){return e instanceof Uint8Array&&!Buffer.isBuffer(e)?Buffer.from(e.buffer,e.byteOffset,e.byteLength):e}function qq(e){if(e==null)return e;if(Array.isArray(e))return e.map(YT);if(typeof e=="object"){let t={};for(let[n,r]of Object.entries(e))t[n]=YT(r);return t}return e}function Hq(e){if(e===null||typeof e!="object"||Array.isArray(e)||e instanceof Uint8Array)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function id(e){return e.map((t,n)=>{if(t===void 0)return null;if(n===0&&Hq(t)){let r={};for(let[s,o]of Object.entries(t))r[s]=o===void 0?null:o;return r}return t})}var Lp=class{handle;pluckMode=!1;arrayMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0),this.handle.setAllowUnknownNamedParameters(!0)}get source(){return this.handle.sourceSQL}run(...t){try{let n=this.handle.run(...id(t));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}catch(n){or(n)}}get(...t){try{return this.project(this.handle.get(...id(t)))}catch(n){or(n)}}all(...t){try{return this.handle.all(...id(t)).map(n=>this.project(n))}catch(n){or(n)}}*iterate(...t){let n;try{n=this.handle.iterate(...id(t))}catch(r){or(r)}for(;;){let r;try{r=n.next()}catch(s){or(s)}if(r.done)return;yield this.project(r.value)}}raw(t=!0){return this.arrayMode=t,this.handle.setReturnArrays(t||this.pluckMode),this}pluck(t=!0){return this.pluckMode=t,this.handle.setReturnArrays(t||this.arrayMode),this}project(t){let n=qq(t);return this.pluckMode&&Array.isArray(n)?n[0]:n}},Cp=class{name;memory;readonly;handle;savepointId=0;constructor(t,n={}){let r=t===":memory:"||t==="";if(n.readonly===!0&&r)throw new TypeError("In-memory/temporary databases cannot be readonly");if(!r&&!JT(Dq(t)))throw new TypeError("Cannot open database because the directory does not exist");if(n.fileMustExist===!0&&!r&&!JT(t))throw jq();this.name=t,this.memory=r,this.readonly=n.readonly===!0;try{this.handle=new($q())(t,{readOnly:this.readonly,timeout:n.timeout??5e3,enableForeignKeyConstraints:n.foreignKeys??!0})}catch(s){or(s)}}get open(){return this.handle.isOpen}get inTransaction(){return this.handle.isTransaction}prepare(t){try{return new Lp(this.handle.prepare(t))}catch(n){or(n)}}exec(t){try{return this.handle.exec(t),this}catch(n){or(n)}}pragma(t,n){let r=this.prepare(`PRAGMA ${t}`);return n?.simple===!0?r.pluck().get():r.all()}transaction(t){let n=s=>(...o)=>this.runTransaction(s,t,o),r=n("BEGIN");return r.default=n("BEGIN"),r.deferred=n("BEGIN DEFERRED"),r.immediate=n("BEGIN IMMEDIATE"),r.exclusive=n("BEGIN EXCLUSIVE"),r}serialize(){try{let t=this.handle.serialize();return Buffer.from(t.buffer,t.byteOffset,t.byteLength)}catch(t){or(t)}}close(){if(!this.handle.isOpen)return this;try{return this.handle.close(),this}catch(t){or(t)}}runTransaction(t,n,r){if(!this.inTransaction){this.exec(t);try{let o=n(...r);return this.exec("COMMIT"),o}catch(o){if(this.inTransaction)try{this.exec("ROLLBACK")}catch(i){if(!Wq(i))throw i}throw o}}let s=`lmbee_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${s}`);try{let o=n(...r);return this.exec(`RELEASE ${s}`),o}catch(o){if(this.inTransaction)try{this.exec(`ROLLBACK TO ${s}`),this.exec(`RELEASE ${s}`)}catch(i){if(!Bq(i))throw i}throw o}}};function Wq(e){return e instanceof Error&&/cannot rollback - no transaction is active/i.test(e.message)}function Bq(e){return e instanceof Error&&/no such savepoint:/i.test(e.message)}var tn=Cp;import{existsSync as Dp,lstatSync as Gq,mkdirSync as Xq,readFileSync as QT,realpathSync as KT}from"node:fs";import{basename as Vq,dirname as Pp,isAbsolute as Jq,join as Yq,relative as Kq,resolve as zT}from"node:path";import{fileURLToPath as zq}from"node:url";var ZT=Yq(Pp(zq(import.meta.url)),"schema.sql");function tc(e){if(e!==void 0&&e!=="")return e;let t=process.env.LMBEE_DB;if(t)return t;throw new Error("No lmbee database selected: pass an explicit database path or set LMBEE_DB to the intended existing database. The retired ~/.lmbee/state.db default is no longer used.")}function Qq(e){if(e.startsWith("~"))throw new Error(`Refusing to open the lmbee database at "${e}": lmbee does not expand "~" in database paths, so this would be created as a literal directory named "~" under the current working directory. Use an absolute path instead (for example ~/.lmbee/state.db). Note for systemd units: Environment= expands neither "~" nor "$HOME", so write the absolute path literally there too.`)}function Zq(e,t){if(!(e===":memory:"||Dp(e)))throw new Error(`Refusing to create the lmbee database at "${e}": ${t} points at non-existent "${e}", and a typo is indistinguishable from a fresh install. To provision a new database here, \`touch "${e}"\` first, then retry, or point ${t} at an existing database.`)}function eH(e){e.transaction(()=>{let n=e.prepare("PRAGMA table_info(queue)").all();if(n.length===0)return;let r=new Set(n.map(o=>o.name));r.has("subject_id")||e.exec("ALTER TABLE queue ADD COLUMN subject_id TEXT"),r.has("dedupe_key")||e.exec("ALTER TABLE queue ADD COLUMN dedupe_key TEXT"),e.prepare(`SELECT name FROM pragma_index_list('queue') WHERE "unique" = 1 AND partial = 0`).all().some(o=>{let i=e.prepare("SELECT name FROM pragma_index_info(?) ORDER BY seqno").all(o.name);return i.length===1&&i[0].name==="dedupe_key"})||e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_queue_dedupe_key ON queue(dedupe_key)"),r.has("delivered_via_escalation")||e.exec("ALTER TABLE queue ADD COLUMN delivered_via_escalation INTEGER NOT NULL DEFAULT 0"),r.has("escalation_claimed_ts")||e.exec("ALTER TABLE queue ADD COLUMN escalation_claimed_ts TEXT"),r.has("escalation_claim_token")||e.exec("ALTER TABLE queue ADD COLUMN escalation_claim_token TEXT"),r.has("escalation_only")||e.exec("ALTER TABLE queue ADD COLUMN escalation_only INTEGER NOT NULL DEFAULT 0"),r.has("admission_fingerprint")||e.exec("ALTER TABLE queue ADD COLUMN admission_fingerprint TEXT"),r.has("expects_response")||e.exec("ALTER TABLE queue ADD COLUMN expects_response INTEGER NOT NULL DEFAULT 0"),r.has("to_alias")||e.exec("ALTER TABLE queue ADD COLUMN to_alias TEXT"),r.has("retracted_ts")||e.exec("ALTER TABLE queue ADD COLUMN retracted_ts TEXT"),r.has("retracted_reason")||e.exec("ALTER TABLE queue ADD COLUMN retracted_reason TEXT"),r.has("retraction_notice")||e.exec("ALTER TABLE queue ADD COLUMN retraction_notice INTEGER NOT NULL DEFAULT 0"),r.has("in_reply_to")||e.exec("ALTER TABLE queue ADD COLUMN in_reply_to INTEGER"),r.has("operator_priority")||e.exec("ALTER TABLE queue ADD COLUMN operator_priority INTEGER NOT NULL DEFAULT 0"),r.has("merged_into_id")||e.exec("ALTER TABLE queue ADD COLUMN merged_into_id INTEGER")}).immediate()}function tH(e){e.transaction(()=>{let n=e.prepare("PRAGMA table_info(team_progress)").all();if(n.length===0)return;let r=new Set(n.map(s=>s.name));r.has("last_miniplayer_reply_hash")||e.exec("ALTER TABLE team_progress ADD COLUMN last_miniplayer_reply_hash TEXT"),r.has("blocked_surfaced_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN blocked_surfaced_ts TEXT"),r.has("last_escalation_attempt_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN last_escalation_attempt_ts TEXT"),r.has("escalation_attempt_count")||e.exec("ALTER TABLE team_progress ADD COLUMN escalation_attempt_count INTEGER NOT NULL DEFAULT 0"),r.has("fault_surfaced_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN fault_surfaced_ts TEXT"),r.has("epic_closed_surfaced_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN epic_closed_surfaced_ts TEXT"),r.has("quota_exhausted_last_seen_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN quota_exhausted_last_seen_ts TEXT"),r.has("quota_exhausted_message")||e.exec("ALTER TABLE team_progress ADD COLUMN quota_exhausted_message TEXT"),r.has("miniplayer_verdict_label")||e.exec("ALTER TABLE team_progress ADD COLUMN miniplayer_verdict_label TEXT"),r.has("miniplayer_verdict_reason")||e.exec("ALTER TABLE team_progress ADD COLUMN miniplayer_verdict_reason TEXT"),r.has("miniplayer_verdict_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN miniplayer_verdict_ts TEXT"),r.has("miniplayer_verdict_input_hash")||e.exec("ALTER TABLE team_progress ADD COLUMN miniplayer_verdict_input_hash TEXT"),r.has("miniplayer_verdict_structural_hash")||e.exec("ALTER TABLE team_progress ADD COLUMN miniplayer_verdict_structural_hash TEXT"),r.has("holder_watch_pid")||e.exec("ALTER TABLE team_progress ADD COLUMN holder_watch_pid INTEGER"),r.has("holder_watch_started_at")||e.exec("ALTER TABLE team_progress ADD COLUMN holder_watch_started_at TEXT"),r.has("holder_watch_cpu_ticks")||e.exec("ALTER TABLE team_progress ADD COLUMN holder_watch_cpu_ticks INTEGER"),r.has("holder_watch_observed_at")||e.exec("ALTER TABLE team_progress ADD COLUMN holder_watch_observed_at TEXT"),r.has("holder_watch_low_cpu_streak")||e.exec("ALTER TABLE team_progress ADD COLUMN holder_watch_low_cpu_streak INTEGER"),r.has("hung_holder_flagged_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN hung_holder_flagged_ts TEXT"),r.has("hung_holder_reason")||e.exec("ALTER TABLE team_progress ADD COLUMN hung_holder_reason TEXT"),r.has("last_cli_activity_ts")||e.exec("ALTER TABLE team_progress ADD COLUMN last_cli_activity_ts TEXT")}).immediate()}function nH(e){e.transaction(()=>{let n=e.prepare("PRAGMA table_info(cron_jobs)").all();if(n.length===0)return;let r=new Set(n.map(s=>s.name));r.has("last_fire_error")||e.exec("ALTER TABLE cron_jobs ADD COLUMN last_fire_error TEXT"),r.has("running_systemd_unit")||e.exec("ALTER TABLE cron_jobs ADD COLUMN running_systemd_unit TEXT"),r.has("timezone")||e.exec("ALTER TABLE cron_jobs ADD COLUMN timezone TEXT"),r.has("provider")||e.exec("ALTER TABLE cron_jobs ADD COLUMN provider TEXT"),r.has("model")||e.exec("ALTER TABLE cron_jobs ADD COLUMN model TEXT"),r.has("working_directory")||e.exec("ALTER TABLE cron_jobs ADD COLUMN working_directory TEXT"),r.has("escalation_owner")||e.exec("ALTER TABLE cron_jobs ADD COLUMN escalation_owner TEXT"),r.has("session_teamfile")||e.exec("ALTER TABLE cron_jobs ADD COLUMN session_teamfile TEXT"),r.has("session_alias")||e.exec("ALTER TABLE cron_jobs ADD COLUMN session_alias TEXT"),r.has("session_seeded_at")||e.exec("ALTER TABLE cron_jobs ADD COLUMN session_seeded_at TEXT"),r.has("session_generation")||e.exec("ALTER TABLE cron_jobs ADD COLUMN session_generation INTEGER NOT NULL DEFAULT 0")}).immediate()}function rH(e){e.transaction(()=>{let n=e.prepare("PRAGMA table_info(entities)").all();if(n.length===0)return;let r=new Set(n.map(s=>s.name));r.has("delivered_ts")||e.exec("ALTER TABLE entities ADD COLUMN delivered_ts TEXT"),r.has("review_time")||e.exec("ALTER TABLE entities ADD COLUMN review_time TEXT"),r.has("needs_review")||e.exec("ALTER TABLE entities ADD COLUMN needs_review INTEGER NOT NULL DEFAULT 0 CHECK(needs_review IN (0,1))"),r.has("review_reason")||e.exec("ALTER TABLE entities ADD COLUMN review_reason TEXT"),r.has("review_input_hash")||e.exec("ALTER TABLE entities ADD COLUMN review_input_hash TEXT"),r.has("hold_until")||e.exec("ALTER TABLE entities ADD COLUMN hold_until TEXT"),r.has("hold_reason")||e.exec("ALTER TABLE entities ADD COLUMN hold_reason TEXT"),r.has("blocked_on")||e.exec("ALTER TABLE entities ADD COLUMN blocked_on TEXT")}).immediate()}function sH(e){e.transaction(()=>{let n=e.prepare("PRAGMA table_info(mail_ledger)").all();if(n.length===0)return;let r=new Set(n.map(s=>s.name));r.has("ack_sent_ts")||e.exec("ALTER TABLE mail_ledger ADD COLUMN ack_sent_ts TEXT"),r.has("delivery_error")||e.exec("ALTER TABLE mail_ledger ADD COLUMN delivery_error TEXT"),r.has("delivery_error_ts")||e.exec("ALTER TABLE mail_ledger ADD COLUMN delivery_error_ts TEXT")}).immediate()}function cd(e){let t=process.env.LMBEE_TEST_DB_ROOT;if(!t||e===":memory:")return;let n=[],r=zT(e);for(;Gq(r,{throwIfNoEntry:!1})===void 0;){n.unshift(Vq(r));let i=Pp(r);if(i===r)throw new Error("Cannot resolve test database path");r=i}let s=zT(KT(r),...n),o=Kq(KT(t),s);if(o===".."||o.startsWith("../")||o.startsWith("..\\")||Jq(o))throw new Error(`Database path is outside the test database root: ${e}`)}function $p(e){let t=s=>e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(s)!==void 0,n=s=>e.prepare(`PRAGMA table_info(${s})`).all(),r;for(let s of["queue_responses","chat_tasks","chat_messages","chat_message_task_reassignments"])if(t(s)){r=`legacy table '${s}'`;break}if(r===void 0&&t("answers")){let s=new Set(n("answers").map(o=>o.name));s.has("request_queue_id")?r="legacy column 'answers.request_queue_id'":s.has("superseded_at")||(r="legacy 'answers' shape: missing column 'superseded_at'")}if(r===void 0&&t("queue")){let s=n("queue"),o=new Set(s.map(i=>i.name));o.has("team")?r="legacy column 'queue.team'":o.has("to_id")?s.some(i=>i.name==="from_id"&&i.notnull!==1)?r="legacy 'queue' shape: from_id is still nullable":o.has("restart_nudge_sent_ts")&&(r="legacy column 'queue.restart_nudge_sent_ts'"):r="legacy 'queue' shape: missing column 'to_id'"}if(r===void 0&&t("cron_jobs")){let s=e.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'cron_jobs'").get();(s===void 0||!s.sql.includes("'miniplayer'"))&&(r="legacy 'cron_jobs' CHECK constraint predates 'miniplayer'")}if(r===void 0&&t("cron_jobs")){let s=e.prepare("SELECT id, action_payload FROM cron_jobs WHERE action_kind = 'enqueue'").all();for(let o of s){let i;try{i=JSON.parse(o.action_payload)}catch{i=void 0}let a=typeof i=="object"&&i!==null?i.prompt:void 0;if(typeof a!="string"||a.trim().length===0){r=`legacy 'cron_jobs' enqueue payload (id ${o.id}) predates the 'prompt' vocabulary`;break}}}if(r===void 0&&t("team_progress")&&new Set(n("team_progress").map(o=>o.name)).has("last_scan_head")&&(r="legacy column 'team_progress.last_scan_head'"),r===void 0&&t("cron_runs")&&(new Set(n("cron_runs").map(o=>o.name)).has("execution_state")||(r="legacy 'cron_runs' shape: missing column 'execution_state'")),r===void 0&&t("rate_limit_policy_log")){let s=e.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'rate_limit_policy_log'").get();(s===void 0||!s.sql.includes("'confirmed_would_fire_policy_disabled'"))&&(r="legacy 'rate_limit_policy_log' CHECK constraint predates 'confirmed_would_fire_policy_disabled'")}if(r===void 0&&t("rate_limit_policy_arm")&&(new Set(n("rate_limit_policy_arm").map(o=>o.name)).has("armed_used_fraction")||(r="legacy 'rate_limit_policy_arm' shape: missing column 'armed_used_fraction'")),r!==void 0)throw new Error(`Refusing to open this lmbee state.db: abandoned pre-v14 lmbee schema shape (${r}). Per the operator's 2026-10-01 shared-database decision, lmbee now shares lmctl's state.db and every pre-existing lmbee-only database is abandoned -- there is no data migration, ever. Do not remove a shared lmctl database. Check LMBEE_DB and the database ownership; point lmbee at the intended compatible database. Preserve this file for operator review.`)}var ad=62;function Mp(e){let t=e.pragma("user_version",{simple:!0});if(t<=ad)return;let n;if(e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'schema_meta'").get()!==void 0){let s=new Set(e.prepare("PRAGMA table_info(schema_meta)").all().map(o=>o.name));if(s.has("key")&&s.has("value")){let o=e.prepare("SELECT value FROM schema_meta WHERE key = 'min_reader_version'").get();typeof o?.value=="string"&&(n=o.value)}}let r;if(n===void 0)r="schema_meta.min_reader_version is absent";else if(!/^[1-9]\d*$/.test(n))r=`schema_meta.min_reader_version=${JSON.stringify(n)} is malformed (not a canonical decimal integer)`;else if(Number(n)>ad)r=`schema_meta.min_reader_version=${n} declares a breaking floor above ${ad}`;else return;throw new Error(`Refusing to open the shared state.db: it was migrated by a newer lmctl with breaking changes (user_version=${t} exceeds the newest lmctl schema version this lmbee build understands, ${ad}, and ${r}). Upgrade lmbee to a build that understands the newer lmctl schema before opening this database again. lmbee never writes user_version or schema_meta, so the file is untouched.`)}var Op;function oH(){return Op===void 0&&(Op=[...QT(ZT,"utf8").matchAll(/CREATE TABLE IF NOT EXISTS (\w+)/gi)].map(t=>t[1])),Op}function iH(e,t){let n=new Set(e.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all().map(s=>s.name)),r=oH().filter(s=>!n.has(s));if(r.length!==0)throw new Error(`Refusing a read-only open of "${t}": required lmbee schema is missing (no table${r.length===1?"":"s"}: ${r.join(", ")}), and a read-only handle cannot create it. Run any writable lmbee command (or start the daemon) once against this database to provision it, then retry.`)}function ld(e,t={}){let n=tc(e);Qq(n);let r=!e&&typeof process.env.LMBEE_DB=="string"&&process.env.LMBEE_DB!=="";if(r&&Zq(n,"LMBEE_DB"),cd(n),t.readOnly&&n===":memory:")throw new Error("Refusing a read-only open of ':memory:': an in-memory database starts empty on every open, so the required lmbee schema can never be present and a read-only handle cannot create it.");if(t.readOnly&&n!==":memory:"){if(!Dp(n))throw new Error(`Refusing a read-only open of "${n}": the file does not exist, so the required lmbee schema is missing. Run any writable lmbee command (or start the daemon) once against this database to provision it, then retry.`);let a=new tn(n,{readonly:!0,fileMustExist:!0});try{$p(a),Mp(a),a.pragma("busy_timeout = 5000"),t.requireLmbeeSchema!==!1&&iH(a,n)}catch(c){throw a.close(),c}return{path:n,db:a,close:()=>a.close()}}if(n!==":memory:"){let a=Pp(n);Dp(a)||Xq(a,{recursive:!0})}let s=new tn(n,r?{fileMustExist:!0}:void 0);try{$p(s),Mp(s)}catch(a){throw s.close(),a}s.pragma("journal_mode = WAL"),s.pragma("busy_timeout = 5000");let o=QT(ZT,"utf8"),i=s.transaction(()=>{eH(s),tH(s),sH(s),rH(s),nH(s),s.exec(o);let a=s.pragma("table_info(on_demand_launches)");a.some(c=>c.name==="phase")||(s.exec("ALTER TABLE on_demand_launches ADD COLUMN phase TEXT NOT NULL DEFAULT 'reserved' CHECK(phase IN ('reserved', 'dispatching', 'worker_adopted', 'uncertain'))"),s.exec("UPDATE on_demand_launches SET phase = 'uncertain' WHERE state = 'adopted' OR run_id IS NOT NULL")),a.some(c=>c.name==="worker_pid")||s.exec("ALTER TABLE on_demand_launches ADD COLUMN worker_pid INTEGER"),a.some(c=>c.name==="worker_start")||s.exec("ALTER TABLE on_demand_launches ADD COLUMN worker_start TEXT"),a.some(c=>c.name==="receipt_path")||s.exec("ALTER TABLE on_demand_launches ADD COLUMN receipt_path TEXT")});try{i.immediate()}catch(a){throw s.close(),a}return{path:n,db:s,close:()=>s.close()}}function wt(e,t){return e.prepare("SELECT * FROM team_state WHERE team = ?").get(t)??null}function ev(e,t){let n=wt(e,t);return n===null?{kind:"never-observed"}:{kind:"observed",value:n,observedAt:n.last_ts,changedAt:n.changed_ts}}function Fr(e,t,n,r){let s=new Date(r).toISOString(),o=wt(e,t),i=o&&o.status===n?o.changed_ts:s;e.prepare(`INSERT INTO team_state(team, status, changed_ts, last_ts) VALUES (?, ?, ?, ?)
72
72
  ON CONFLICT(team) DO UPDATE SET status = excluded.status, changed_ts = excluded.changed_ts, last_ts = excluded.last_ts`).run(t,n,i,s)}function Ht(e,t,n,r,s={}){e.prepare("INSERT INTO events(ts, scan, team, status, note) VALUES (?, ?, ?, ?, ?)").run(new Date(r).toISOString(),s.scan??null,t,n,s.note??null)}function dd(e,t,n,r){return e.prepare("SELECT * FROM events WHERE status = ? AND ts >= ? ORDER BY id DESC LIMIT ?").all(t,n,r)}function fe(e,t){return e.prepare("SELECT * FROM team_progress WHERE team = ?").get(t)??null}function tv(e,t,n,r,s=r){let o=fe(e,t),i=o&&o.progress_status===n?o.progress_changed_ts:s;e.prepare(`INSERT INTO team_progress(team, progress_status, progress_changed_ts, last_scan_ts)
73
73
  VALUES (?, ?, ?, ?)
74
74
  ON CONFLICT(team) DO UPDATE SET
@@ -132,7 +132,7 @@ Appkey saved to ${p.appkeyPath} (0600)
132
132
  `),null;for(let[o,i]of[["peer_site",n],["team",r],["alias",s]])try{ai(i,o)}catch(a){return process.stderr.write(`teams-conf: skipping remote _TEAM_ line -- ${a instanceof Error?a.message:String(a)}: ${t}
133
133
  `),null}return{channel:"lmmail",name:r,peerSite:n,alias:s}}var DH=/^(`{3,}|~{3,})/;function Qp(e){let t=[],n=null;for(let r of e.split(/\r?\n/)){let s=r.trim(),o=DH.exec(s);if(o){let a=o[1];n===null?n={char:a[0],len:a.length}:a[0]===n.char&&a.length>=n.len&&s.slice(a.length).trim()===""&&(n=null);continue}if(n!==null||!xH.test(s))continue;let i=CH(s);i&&t.push(i)}return t}function Cv(e){return e.toLowerCase().endsWith(".md")}function $H(e,t){let n=new Set,r=[];for(let s of[e,...t])if(!(!s||n.has(s))&&(n.add(s),!!zp(s))){try{if(!NH(s).isFile())continue}catch{continue}r.push(s)}return r}function MH(e,t=[]){let n=$H(e,t),r=new Map,s=o=>{try{return Ov(o,"utf8")}catch{return null}};for(let o of n){if(!Cv(o))continue;let i=s(o);if(i!==null)for(let a of Qp(i))r.has(a.name)||r.set(a.name,a)}for(let o of n){if(Cv(o))continue;let i=s(o);if(i!==null)for(let a of nc(i))r.has(a.name)||r.set(a.name,a)}return[...r.values()]}function _d(e,t,n){e.prepare(`INSERT INTO sources(path, label, added_ts) VALUES (?, ?, ?)
134
134
  ON CONFLICT(path) DO UPDATE SET label = excluded.label`).run(t,n,new Date().toISOString())}function Zp(e){return e.prepare("SELECT * FROM sources ORDER BY id").all()}function gd(e,t){e.prepare("DELETE FROM sources WHERE path = ?").run(t)}function PH(e){let t=pd(e);return zp(t)?RH(t):null}function re(e){let t=PH(Lv(e.repoPath,`${e.name}.lmctl`));if(t)return t;throw zp(e.repoPath)?new Error(`resolveTeamfilePath: cannot resolve a teamfile for team "${e.name}" -- expected "${Lv(e.repoPath,`${e.name}.lmctl`)}" to exist. teams.conf has no explicit teamfile-path column -- fix by naming the teamfile "<name>.lmctl" under repo_path.`):new Error(`resolveTeamfilePath: repo_path "${e.repoPath}" for team "${e.name}" does not exist`)}var UH=/^_MEMBER_(\s|$)/,FH=/(\w+)=(?:"([^"]*)"|([\S]*))/g;function ir(e,t){return th(e).find(n=>n.alias===t)?.provider??null}function eh(e){return th(e).filter(t=>t.sessionid!==void 0&&t.sessionid.length>0).length}function ho(e){return th(e).filter(t=>t.alias!==void 0).map(t=>({alias:t.alias,provider:t.provider??null}))}function th(e){let t;try{t=Ov(re(e),"utf8")}catch{return[]}let n=[];for(let r of t.split(`
135
- `)){if(!UH.test(r.trim()))continue;let s={};for(let o of r.matchAll(FH)){let i=o[1];s[i]=o[2]!==void 0?o[2]:o[3]}n.push({alias:s.alias,provider:s.provider,sessionid:s.sessionid})}return n}function _o(e,t){let n=Zp(e).map(r=>r.path);return MH(t,n)}function li(e){if(typeof e!="string")return null;let t=e.lastIndexOf(":");if(t===-1)return null;let n=e.slice(0,t),r=e.slice(t+1);return!n||!r?null:{teamfilePath:n,alias:r}}function di(e,t){let n=li(t);if(n===null||n.alias!==e.leadAlias)return!1;let r;try{r=re(e)}catch{return!1}return r===n.teamfilePath}function wt(e,t){return t.running.some(n=>di(e,n.target))}function $v(e,t,n){return n.running.some(r=>{let s=li(r.target);return s!==null&&s.alias===t&&s.teamfilePath===e})}function jH(e,t,n){let r=new Set(e.filter(d=>wt(d,t)).map(d=>d.name)),s=new Set(n??[]),o=n===null,i=[...s].filter(d=>!r.has(d)).sort(),a=[...r].filter(d=>!s.has(d)).sort(),c=o||i.length>0,l=o?"first-run":i.length>0?`active->other: ${i.join(", ")}`:"nochange";return{first:o,active:[...r].sort(),wentIdle:i,newlyActive:a,wake:c,why:l}}function Ed(e){let t=e.prepare("SELECT v FROM kv WHERE k = ?").get("active");return t?JSON.parse(t.v):null}function qH(e,t){e.prepare("INSERT INTO kv(k, v) VALUES ('active', ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(JSON.stringify(t))}function yd(e,t,n){let r=jH(t,n,Ed(e));return qH(e,r.active),r}import{randomUUID as vS}from"node:crypto";import{existsSync as SS,mkdirSync as oW,readFileSync as Rd,rmSync as iW,writeFileSync as bS}from"node:fs";import{homedir as aW}from"node:os";import{join as AS,resolve as TS,sep as cW}from"node:path";var Jde=64*1024;import{readFileSync as wd,writeFileSync as WH}from"node:fs";function BH(e,t){return e.prepare("UPDATE queue SET status = 'sent', sent_ts = ? WHERE id = ? AND status = 'pending'").run(new Date().toISOString(),t).changes>0}function Mv(e,t){let n=[],r=new Map;for(let o of t){if(o.dedupe_key!==null){n.push(o);continue}let i=JSON.stringify([o.from_id,o.to_id,o.escalation_only,o.to_alias]),a=r.get(i);a?a.push(o):r.set(i,[o])}let s=[...n];for(let o of r.values()){if(o.length===1){s.push(o[0]);continue}let[i,...a]=o,c;try{c=wd(i.prompt_file,"utf8")}catch{s.push(...o);continue}let l=[],d=!0;for(let u of a)try{l.push(`
135
+ `)){if(!UH.test(r.trim()))continue;let s={};for(let o of r.matchAll(FH)){let i=o[1];s[i]=o[2]!==void 0?o[2]:o[3]}n.push({alias:s.alias,provider:s.provider,sessionid:s.sessionid})}return n}function _o(e,t){let n=Zp(e).map(r=>r.path);return MH(t,n)}function li(e){if(typeof e!="string")return null;let t=e.lastIndexOf(":");if(t===-1)return null;let n=e.slice(0,t),r=e.slice(t+1);return!n||!r?null:{teamfilePath:n,alias:r}}function di(e,t){let n=li(t);if(n===null||n.alias!==e.leadAlias)return!1;let r;try{r=re(e)}catch{return!1}return r===n.teamfilePath}function Tt(e,t){return t.running.some(n=>di(e,n.target))}function $v(e,t,n){return n.running.some(r=>{let s=li(r.target);return s!==null&&s.alias===t&&s.teamfilePath===e})}function jH(e,t,n){let r=new Set(e.filter(d=>Tt(d,t)).map(d=>d.name)),s=new Set(n??[]),o=n===null,i=[...s].filter(d=>!r.has(d)).sort(),a=[...r].filter(d=>!s.has(d)).sort(),c=o||i.length>0,l=o?"first-run":i.length>0?`active->other: ${i.join(", ")}`:"nochange";return{first:o,active:[...r].sort(),wentIdle:i,newlyActive:a,wake:c,why:l}}function Ed(e){let t=e.prepare("SELECT v FROM kv WHERE k = ?").get("active");return t?JSON.parse(t.v):null}function qH(e,t){e.prepare("INSERT INTO kv(k, v) VALUES ('active', ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(JSON.stringify(t))}function yd(e,t,n){let r=jH(t,n,Ed(e));return qH(e,r.active),r}import{randomUUID as vS}from"node:crypto";import{existsSync as SS,mkdirSync as oW,readFileSync as Rd,rmSync as iW,writeFileSync as bS}from"node:fs";import{homedir as aW}from"node:os";import{join as AS,resolve as TS,sep as cW}from"node:path";var Jde=64*1024;import{readFileSync as wd,writeFileSync as WH}from"node:fs";function BH(e,t){return e.prepare("UPDATE queue SET status = 'sent', sent_ts = ? WHERE id = ? AND status = 'pending'").run(new Date().toISOString(),t).changes>0}function Mv(e,t){let n=[],r=new Map;for(let o of t){if(o.dedupe_key!==null){n.push(o);continue}let i=JSON.stringify([o.from_id,o.to_id,o.escalation_only,o.to_alias]),a=r.get(i);a?a.push(o):r.set(i,[o])}let s=[...n];for(let o of r.values()){if(o.length===1){s.push(o[0]);continue}let[i,...a]=o,c;try{c=wd(i.prompt_file,"utf8")}catch{s.push(...o);continue}let l=[],d=!0;for(let u of a)try{l.push(`
136
136
 
137
137
  --- addendum, ${u.created_ts} ---
138
138
  ${wd(u.prompt_file,"utf8")}`)}catch{d=!1;break}if(!d){s.push(...o);continue}if(l.length>0){WH(i.prompt_file,c+l.join(""));let u=e.prepare("UPDATE queue SET status = 'merged' WHERE id = ? AND status = 'pending'");for(let f of a)u.run(f.id)}s.push(i)}return s}function rh(e,t,n){let r=new Map(t.map(c=>[c.name,c])),s=n.teamName?e.prepare("SELECT * FROM queue WHERE status = 'pending' AND escalation_only = 0 AND to_id = ? ORDER BY id").all(n.teamName):e.prepare("SELECT * FROM queue WHERE status = 'pending' AND escalation_only = 0 ORDER BY id").all(),o=Mv(e,s),i=new Set,a=0;for(let c of o){let l=c.to_alias===null?c.to_id:`${c.to_id}:${c.to_alias}`;if(i.has(l))continue;i.add(l);let d=r.get(c.to_id);if(!d||n.isTeamBusy(d))continue;if(n.minMemoryPercent!==void 0){let p=n.memoryCheck;if(p&&!p(n.minMemoryPercent))continue}try{wd(c.prompt_file,"utf8")}catch{continue}if(!BH(e,c.id))continue;let u;try{u=wd(c.prompt_file,"utf8")}catch(p){process.stderr.write(`[lmqueue] row #${c.id} claimed 'sent' but its prompt file became unreadable before dispatch -- nothing was actually sent: ${p instanceof Error?p.message:String(p)}
@@ -159,7 +159,7 @@ ${wd(u.prompt_file,"utf8")}`)}catch{d=!1;break}if(!d){s.push(...o);continue}if(l
159
159
  ORDER BY id DESC LIMIT 1`).get(t.site,t.team,t.alias)??null}import{readFileSync as nW}from"node:fs";var rW=/^MemTotal:\s+(\d+)\s*kB/m,sW=/^MemAvailable:\s+(\d+)\s*kB/m;function kd(e){return e===null?null:`memory headroom: ${e.percentAvailable.toFixed(1)}% available (context only, not a wake trigger)`}function sc(e="/proc/meminfo"){let t;try{t=nW(e,"utf8")}catch{return null}let n=rW.exec(t),r=sW.exec(t);if(!n||!r)return null;let s=Number(n[1]),o=Number(r[1]);return!Number.isFinite(s)||s<=0||!Number.isFinite(o)||o<0?null:{totalKb:s,availableKb:o,percentAvailable:o/s*100}}var dh=10;function wS(e=dh,t=sc){if(e<=0)return!0;let n=t();return n===null?(process.stderr.write(`[memory] could not read /proc/meminfo -- deferring dispatch conservatively (set --min-memory-percent 0 to disable this gate)
160
160
  `),!1):n.percentAvailable>=e}var H=class extends Error{code;exitCode;constructor(t,n,r=2){super(n),this.code=t,this.exitCode=r}};function Nd(){return process.env.LMBEE_QUEUE_DIR?process.env.LMBEE_QUEUE_DIR:AS(aW(),".lmbee","queue")}function lW(e,t,n){SS(n)||oW(n,{recursive:!0});let r=AS(n,`${e}.md`);return bS(r,t),r}function wo(e){if(e==="operator")return{baseId:e,alias:null};let t=e.indexOf(":");return t===-1?{baseId:e,alias:null}:{baseId:e.slice(0,t),alias:e.slice(t+1)}}function Ne(e,t,n,r,s){if(!s.from)throw new Error("enqueue: options.from is required ('autopilot', 'operator', or a maintainer team name)");let{baseId:o,alias:i}=wo(n);if(o==="math"&&s.from==="autopilot"&&s.subject!==void 0&&t.some(u=>u.name==="triage")&&(o="triage",i=null),o!=="operator"&&!t.some(u=>u.name===o))throw new Error(`enqueue: unknown team "${o}"`);let a=new Date().toISOString(),c=s.dedupeKey??null,l=s.expectsResponse??(s.from==="operator"||o==="operator");return e.transaction(()=>{let u=e.prepare(`INSERT INTO queue(from_id, to_id, prompt_file, status, created_ts, subject_id, dedupe_key, escalation_only, expects_response, to_alias, retraction_notice, in_reply_to, operator_priority)
161
161
  VALUES (?, ?, '', 'pending', ?, ?, ?, ?, ?, ?, ?, ?, ?)
162
- ON CONFLICT(dedupe_key) DO NOTHING`).run(s.from,o,a,s.subject??null,c,s.escalationOnly?1:0,l?1:0,i,s.retractionNotice?1:0,s.inReplyTo??null,s.operatorPriority?1:0);if(u.changes===0){let p=e.prepare("SELECT id FROM queue WHERE dedupe_key = ?").get(c);if(!p)throw new Error(`enqueue: dedupe conflict on "${c}" but the existing row is already gone`);return p.id}let f=Number(u.lastInsertRowid),m=lW(f,r,s.queueDir??Nd());return e.prepare("UPDATE queue SET prompt_file = ? WHERE id = ?").run(m,f),f}).immediate()}function uh(e,t,n=30){return t?e.prepare("SELECT * FROM queue WHERE to_id = ? ORDER BY id DESC LIMIT ?").all(t,n):e.prepare("SELECT * FROM queue ORDER BY id DESC LIMIT ?").all(n)}function IS(e,t,n={}){return n.fromAutopilot?e.prepare("SELECT * FROM queue WHERE to_id = ? AND status = 'pending' AND from_id = 'autopilot' AND subject_id IS NULL ORDER BY id").all(t):e.prepare("SELECT * FROM queue WHERE to_id = ? AND status = 'pending' ORDER BY id").all(t)}function Tt(e,t,n={}){return n.fromAutopilot?e.prepare("SELECT * FROM queue WHERE to_id = ? AND status IN ('pending', 'escalating') AND from_id = 'autopilot' AND subject_id IS NULL ORDER BY id").all(t):e.prepare("SELECT * FROM queue WHERE to_id = ? AND status IN ('pending', 'escalating') ORDER BY id").all(t)}function xd(e,t){let n=e.prepare("SELECT * FROM queue WHERE to_id = ? AND status = 'pending' ORDER BY id").all(t),r=[];for(let s of n){let o=[s.from_id,s.to_id,s.escalation_only,s.to_alias],a=e.prepare("SELECT MIN(id) AS id FROM queue WHERE from_id = ? AND to_id = ? AND escalation_only = ? AND to_alias IS ? AND id > ? AND status != 'merged'").get(...o,s.id).id??Number.MAX_SAFE_INTEGER,c=e.prepare("SELECT * FROM queue WHERE from_id = ? AND to_id = ? AND escalation_only = ? AND to_alias IS ? AND status = 'merged' AND id > ? AND id < ? AND retracted_ts IS NULL").all(...o,s.id,a);r.push(...c)}return r.sort((s,o)=>s.id-o.id),r}function ms(e,t){return e.prepare("SELECT * FROM queue WHERE id = ?").get(t)??null}function kS(e,t){return e.prepare(`SELECT (
162
+ ON CONFLICT(dedupe_key) DO NOTHING`).run(s.from,o,a,s.subject??null,c,s.escalationOnly?1:0,l?1:0,i,s.retractionNotice?1:0,s.inReplyTo??null,s.operatorPriority?1:0);if(u.changes===0){let p=e.prepare("SELECT id FROM queue WHERE dedupe_key = ?").get(c);if(!p)throw new Error(`enqueue: dedupe conflict on "${c}" but the existing row is already gone`);return p.id}let f=Number(u.lastInsertRowid),m=lW(f,r,s.queueDir??Nd());return e.prepare("UPDATE queue SET prompt_file = ? WHERE id = ?").run(m,f),f}).immediate()}function uh(e,t,n=30){return t?e.prepare("SELECT * FROM queue WHERE to_id = ? ORDER BY id DESC LIMIT ?").all(t,n):e.prepare("SELECT * FROM queue ORDER BY id DESC LIMIT ?").all(n)}function IS(e,t,n={}){return n.fromAutopilot?e.prepare("SELECT * FROM queue WHERE to_id = ? AND status = 'pending' AND from_id = 'autopilot' AND subject_id IS NULL ORDER BY id").all(t):e.prepare("SELECT * FROM queue WHERE to_id = ? AND status = 'pending' ORDER BY id").all(t)}function vt(e,t,n={}){return n.fromAutopilot?e.prepare("SELECT * FROM queue WHERE to_id = ? AND status IN ('pending', 'escalating') AND from_id = 'autopilot' AND subject_id IS NULL ORDER BY id").all(t):e.prepare("SELECT * FROM queue WHERE to_id = ? AND status IN ('pending', 'escalating') ORDER BY id").all(t)}function xd(e,t){let n=e.prepare("SELECT * FROM queue WHERE to_id = ? AND status = 'pending' ORDER BY id").all(t),r=[];for(let s of n){let o=[s.from_id,s.to_id,s.escalation_only,s.to_alias],a=e.prepare("SELECT MIN(id) AS id FROM queue WHERE from_id = ? AND to_id = ? AND escalation_only = ? AND to_alias IS ? AND id > ? AND status != 'merged'").get(...o,s.id).id??Number.MAX_SAFE_INTEGER,c=e.prepare("SELECT * FROM queue WHERE from_id = ? AND to_id = ? AND escalation_only = ? AND to_alias IS ? AND status = 'merged' AND id > ? AND id < ? AND retracted_ts IS NULL").all(...o,s.id,a);r.push(...c)}return r.sort((s,o)=>s.id-o.id),r}function ms(e,t){return e.prepare("SELECT * FROM queue WHERE id = ?").get(t)??null}function kS(e,t){return e.prepare(`SELECT (
163
163
  EXISTS(SELECT 1 FROM queue WHERE to_id = ? AND sent_ts IS NOT NULL)
164
164
  OR EXISTS(SELECT 1 FROM queue WHERE from_id = ?)
165
165
  ) AS found`).get(t,t).found===1}var fh=["pending","sent","retrieved","escalating","merged"];function dW(e){let{escalation_claim_token:t,prompt_file:n,admission_fingerprint:r,...s}=e;return s}var uW=50,oc=200;function mh(e,t={}){let n=t.limit??uW;if(!Number.isSafeInteger(n)||n<1||n>oc)throw new H("INVALID_ARGUMENT",`limit must be a positive integer <= ${oc}`);let r=[],s=[];t.fromId!==void 0&&(r.push("from_id = ?"),s.push(t.fromId)),t.toId!==void 0&&(r.push("to_id = ?"),s.push(t.toId)),t.status!==void 0&&(r.push("status = ?"),s.push(t.status)),t.since!==void 0&&(r.push("created_ts >= ?"),s.push(t.since)),t.until!==void 0&&(r.push("created_ts < ?"),s.push(t.until)),t.after!==void 0&&(r.push("id < ?"),s.push(t.after));let o=r.length>0?`WHERE ${r.join(" AND ")}`:"",i=e.prepare(`SELECT * FROM queue ${o} ORDER BY id DESC LIMIT ?`).all(...s,n+1).map(dW),a=i.length>n,c=a?i.slice(0,n):i;return{rows:c,meta:{next_cursor:a?c[c.length-1].id:null}}}function fW(e,t){return e.prepare("UPDATE queue SET status = 'sent', sent_ts = ? WHERE id = ? AND status = 'pending'").run(new Date().toISOString(),t).changes>0}function mW(e){return`'${e.replaceAll("'","'\\''")}'`}function pW(e,t,n){return`${e}
@@ -170,7 +170,7 @@ ${wd(u.prompt_file,"utf8")}`)}catch{d=!1;break}if(!d){s.push(...o);continue}if(l
170
170
  `),!0}return hW(e,t.remoteMail,n,r,s),!0}function EW(e){let t=new Map,n=[];for(let r of e){if(!K(r))continue;let s;try{s=re(r)}catch{continue}t.set(r.name,r),n.push({name:r.name,teamfilePath:s,leadAlias:r.leadAlias})}return{refs:n,byName:t}}function ph(e){let t=e.expects_response?" (expects a response)":"";return`--- addendum from ${e.from_id}, ${e.created_ts}${t} ---`}function yW(e,t){let n=new Map;for(let r of t){if(r.dedupe_key!==null)continue;let s=JSON.stringify([r.to_id,r.escalation_only,r.to_alias]),o=n.get(s);o?o.push(r):n.set(s,[r])}for(let r of n.values()){if(r.length<2)continue;let[s,...o]=r;if(e.prepare("UPDATE queue SET status = 'pending' WHERE id = ? AND status = 'pending'").run(s.id).changes===0)continue;let a;try{a=Rd(s.prompt_file,"utf8")}catch{continue}let c=[],l=!0;for(let u of o)try{c.push(`
171
171
 
172
172
  ${ph(u)}
173
- ${Rd(u.prompt_file,"utf8")}`)}catch{l=!1;break}if(!l||c.length===0)continue;bS(s.prompt_file,a+c.join(""));let d=e.prepare("UPDATE queue SET status = 'merged', merged_into_id = ? WHERE id = ? AND status = 'pending'");for(let u of o)d.run(s.id,u.id);r.some(u=>u.expects_response)&&!s.expects_response&&e.prepare("UPDATE queue SET expects_response = 1 WHERE id = ?").run(s.id)}}function ps(e,t){let n=t.send??Xv,r=t.sendAwaited??ar,s=t.memoryCheck??wS,{refs:o,byName:i}=EW(t.teams),a=(t.teamName?e.prepare("SELECT * FROM queue WHERE status = 'pending' AND escalation_only = 0 AND to_id = ? ORDER BY id").all(t.teamName):e.prepare("SELECT * FROM queue WHERE status = 'pending' AND escalation_only = 0 ORDER BY id").all()).filter(u=>i.has(u.to_id));yW(e,a);let c=rh(e,o,{teamName:t.teamName,isTeamBusy:u=>wt(i.get(u.name),t.report)||Vv(e,u.name)||eS(e,u.name),minMemoryPercent:t.minMemoryPercent,memoryCheck:s,send:(u,f)=>n(u,f),onDispatch:({row:u,team:f,target:m,promptText:p})=>{let h=u.dedupe_key!==null&&t.remoteMail?ih(e,u.dedupe_key):null,_=pW(p,f.name,u.id);if(!h||!t.remoteMail)return n(m,_),!0;let g=t.remoteMail,w=i.get(f.name);return r(m,_).then(y=>{y.kind==="ok"||y.kind==="stalled"?_W(e,g,h,w,y.replyText,m.alias):(process.stderr.write(`[deliver] mail-originated dispatch to ${f.name} (in_reply_to ${h.msg_id}) produced no reply to mail back: ${y.kind}
173
+ ${Rd(u.prompt_file,"utf8")}`)}catch{l=!1;break}if(!l||c.length===0)continue;bS(s.prompt_file,a+c.join(""));let d=e.prepare("UPDATE queue SET status = 'merged', merged_into_id = ? WHERE id = ? AND status = 'pending'");for(let u of o)d.run(s.id,u.id);r.some(u=>u.expects_response)&&!s.expects_response&&e.prepare("UPDATE queue SET expects_response = 1 WHERE id = ?").run(s.id)}}function ps(e,t){let n=t.send??Xv,r=t.sendAwaited??ar,s=t.memoryCheck??wS,{refs:o,byName:i}=EW(t.teams),a=(t.teamName?e.prepare("SELECT * FROM queue WHERE status = 'pending' AND escalation_only = 0 AND to_id = ? ORDER BY id").all(t.teamName):e.prepare("SELECT * FROM queue WHERE status = 'pending' AND escalation_only = 0 ORDER BY id").all()).filter(u=>i.has(u.to_id));yW(e,a);let c=rh(e,o,{teamName:t.teamName,isTeamBusy:u=>Tt(i.get(u.name),t.report)||Vv(e,u.name)||eS(e,u.name),minMemoryPercent:t.minMemoryPercent,memoryCheck:s,send:(u,f)=>n(u,f),onDispatch:({row:u,team:f,target:m,promptText:p})=>{let h=u.dedupe_key!==null&&t.remoteMail?ih(e,u.dedupe_key):null,_=pW(p,f.name,u.id);if(!h||!t.remoteMail)return n(m,_),!0;let g=t.remoteMail,w=i.get(f.name);return r(m,_).then(y=>{y.kind==="ok"||y.kind==="stalled"?_W(e,g,h,w,y.replyText,m.alias):(process.stderr.write(`[deliver] mail-originated dispatch to ${f.name} (in_reply_to ${h.msg_id}) produced no reply to mail back: ${y.kind}
174
174
  `),y.kind==="error"&&hS(e,h.msg_id,y.message,(g.now??(()=>new Date().toISOString()))()))}).catch(y=>{process.stderr.write(`[deliver] failed to capture reply for mail-originated dispatch to ${f.name} (in_reply_to ${h.msg_id}): ${y instanceof Error?y.message:String(y)}
175
175
  `)}),!0}}),l=t.teamName?e.prepare("SELECT * FROM queue WHERE status = 'pending' AND escalation_only = 0 AND to_id = ? ORDER BY id").all(t.teamName):e.prepare("SELECT * FROM queue WHERE status = 'pending' AND escalation_only = 0 ORDER BY id").all(),d=new Set;for(let u of l){let f=u.to_alias===null?u.to_id:`${u.to_id}:${u.to_alias}`;if(d.has(f)||(d.add(f),u.to_id==="operator"))continue;let m=t.teams.find(p=>p.name===u.to_id);if(!m){process.stderr.write(`[deliver] queue row #${u.id} addressed to unregistered team "${u.to_id}" -- left pending
176
176
  `);continue}K(m)||gW(e,t,m,u)&&c++}return c}function Ld(e,t,n){return n!==void 0?wW(e,t,n):e.transaction(s=>{let o=e.prepare("SELECT * FROM queue WHERE to_id = ? AND status = 'pending' ORDER BY id").all(s);if(o.length===0)return o;let i=new Date().toISOString(),a=e.prepare("UPDATE queue SET status = 'retrieved', retrieved_ts = ? WHERE id = ? AND status = 'pending'"),c=[];for(let l of o)a.run(i,l.id).changes!==0&&(l.status="retrieved",l.retrieved_ts=i,c.push(l));return c})(t)}function wW(e,t,n){if(!Number.isSafeInteger(n)||n<=0)throw new H("INVALID_ARGUMENT",`Queue prompt id must be a positive integer: ${n}`,2);return e.transaction((s,o)=>{let i=e.prepare("SELECT * FROM queue WHERE id = ?").get(o);if(i===void 0)throw new H("NOT_FOUND",`Queue prompt ${o} was not found`,2);if(i.to_id!==s)throw new H("INVALID_ARGUMENT",`Queue prompt ${o} is addressed to "${i.to_id}", not "${s}"`,2);if(i.retracted_ts!==null)throw new H("CONFLICT",`Queue prompt ${o} was retracted: ${i.retracted_reason??"(no reason recorded)"}`,4);if(i.status==="merged"||i.merged_into_id!==null)throw new H("CONFLICT",`Queue prompt ${o} was merged into ${i.merged_into_id??"another prompt"}`,4);if(i.status!=="pending"&&i.status!=="sent"&&i.status!=="retrieved")throw new H("CONFLICT",`Queue prompt ${o} is not eligible for receipt (status: ${i.status})`,4);if(i.status!=="retrieved"){let c=new Date().toISOString();e.prepare("UPDATE queue SET status = 'retrieved', retrieved_ts = COALESCE(retrieved_ts, ?) WHERE id = ? AND status IN ('pending', 'sent')").run(c,o)}let a=e.prepare("SELECT * FROM queue WHERE id = ?").get(o);if(a.status==="retrieved"){let c=a.retrieved_ts??new Date().toISOString();e.prepare(`WITH RECURSIVE descendants(id) AS (
@@ -195,27 +195,27 @@ ${R}`:""}${u}${_}`,onSent:A}}let I=b.description.trim();return{message:`Continue
195
195
 
196
196
  ${I}`:""}
197
197
 
198
- (${E.length-1} other ready task(s) also available: \`lmauto tasks list --owner-team <path> --owner-alias <alias> --status todo\`.)`+u+_,onSent:A}}var Ie={idleThresholdMs:45*6e4,cooldownMs:30*6e4};function jW(e,t){return t.running.some(n=>di(e,n.from_identity))}function To(e,t){return t.dead.some(n=>di(e,n.target))&&!wt(e,t)}function vh(e){if(e.isCurrentlyActive)return!1;let t=!e.hasInFlightWorker,n=e.timeSinceLastNudgeMs===null||e.timeSinceLastNudgeMs>e.config.cooldownMs;if(e.isDeadReclaimable)return t&&n;let r=!e.isCoordinator&&e.progressStatus==="UNKNOWN"&&(e.progressAgeMs===null||e.progressAgeMs>=e.config.idleThresholdMs),s=!e.heavyLockMayBeHeldByThisTeam&&e.hasStalePersistentInProgressWork;return t&&n&&(e.neverDispatched||r||s)}function Sh(e,t,n,r){let s;try{s=re(t)}catch{return!1}let o=Ke(e,s,t.leadAlias);if(o===null)return!1;let i=new Map(o.entities.map(a=>[a.id,a]));return o.entities.some(a=>(a.kind==="task"||a.kind==="subtask")&&we(a.status)==="in-progress"&&!ur(e,a,i)&&r-Date.parse(a.updated_at)>=n&&!bh(a,r))}function bh(e,t){return e.hold_until!==null&&Date.parse(e.hold_until)>t}function Ah(e,t){if(yt(e,t.name)!==null||kS(e,t.name))return!1;let n;try{n=re(t)}catch{return!0}return Ke(e,n,t.leadAlias)===null}function qW(e){return vh({...e,config:{...e.config,idleThresholdMs:0}})}function XS(e){return`last_nudged:${e}`}function Ih(e,t){return e.prepare("SELECT v FROM kv WHERE k = ?").get(XS(t))?.v??null}function ac(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(XS(t),n)}function VS(e,t,n,r,s,o,i){if(yt(e,t.name)?.status==="BLOCKED")return null;let c=Ah(e,t),l=o?.progress_changed_ts==null?null:s-Date.parse(o.progress_changed_ts),d=Ih(e,t.name),u=d===null?null:s-Date.parse(d);return{isCurrentlyActive:wt(t,n),hasInFlightWorker:jW(t,n),neverDispatched:c,progressStatus:o?.progress_status??null,progressAgeMs:l,isDeadReclaimable:To(t,n),hasStalePersistentInProgressWork:Sh(e,t,r.idleThresholdMs,s),timeSinceLastNudgeMs:u,config:r,isCoordinator:t.coordinator===!0,heavyLockMayBeHeldByThisTeam:i.held&&(i.holder===null||i.holder.holder===t.name)}}function JS(e,t,n,r,s,o,i){let a=VS(e,t,n,s,o,i,r);return a!==null&&vh(a)}async function kh(e,t,n,r,s=Ie,o=Date.now()){let i=await Gp(e,t,t.name,o);return JS(e,t,n,r,s,o,i)}function Rh(e,t,n,r,s=Ie,o=Date.now()){return JS(e,t,n,r,s,o,fe(e,t.name))}async function wi(e,t,n,r,s=Ie,o=Date.now(),i={}){let a=[];for(let c of t){if(!c.autoNudge||fe(e,c.name)?.confirmed_done_ts)continue;(i.readOnly?Rh(e,c,n,r,s,o):await kh(e,c,n,r,s,o))&&!fe(e,c.name)?.confirmed_done_ts&&a.push(c.name)}return a}async function YS(e,t,n,r,s=Ie,o=Date.now()){let i=[],a=[];for(let c of t){if(!c.autoNudge||fe(e,c.name)?.confirmed_done_ts)continue;let l=await Gp(e,c,c.name,o);if(fe(e,c.name)?.confirmed_done_ts)continue;let d=VS(e,c,n,s,o,l,r);d!==null&&(vh(d)&&i.push(c.name),qW(d)&&a.push(c.name))}return{stalled:i,continueEligible:a}}import{existsSync as KS,readFileSync as zS}from"node:fs";import{dirname as xh,join as QS}from"node:path";import{fileURLToPath as ZS}from"node:url";var Nh={sha:"unknown",dirty:!0,builtAt:"unknown"};function HW(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.sha=="string"&&typeof t.dirty=="boolean"&&typeof t.builtAt=="string"}function eb(){let e=xh(ZS(import.meta.url));for(let t=0;t<5;t+=1){let n=QS(e,"package.json");if(KS(n))try{let r=JSON.parse(zS(n,"utf8"));if(r&&typeof r=="object"&&typeof r.version=="string")return r.version}catch{}e=xh(e)}return"unknown"}function Lh(){let e=QS(xh(ZS(import.meta.url)),"..","build-info.json");if(!KS(e))return Nh;try{let t=JSON.parse(zS(e,"utf8"));return HW(t)?t:Nh}catch{return Nh}}var WW="https://ecezfoozb3.execute-api.us-east-1.amazonaws.com/prod";function Hn(e){return(e.LMCTL_LMMAIL_API_URL?.trim()||e.LMMAIL_API_URL?.trim()||WW).replace(/\/+$/,"")}import{randomUUID as i8}from"node:crypto";import{join as a8,resolve as hL}from"node:path";var tb="root_teamfile <> '(direct)'",cc=tb+" AND COALESCE(accounting_only,0)=0";function nb(e){return e.prepare("PRAGMA table_info(team_chat_log)").all().some(t=>t.name==="accounting_only")?cc:tb}import{stat as mX,realpath as pX}from"node:fs/promises";import{existsSync as GW}from"node:fs";import{createRequire as XW}from"node:module";var BW=new URL("./cli/index.js",import.meta.url).href,Ch=null;function VW(){return Ch===null&&(Ch=XW(BW)("node:sqlite").DatabaseSync),Ch}var JW={1:"SQLITE_ERROR",2:"SQLITE_INTERNAL",3:"SQLITE_PERM",4:"SQLITE_ABORT",5:"SQLITE_BUSY",6:"SQLITE_LOCKED",7:"SQLITE_NOMEM",8:"SQLITE_READONLY",9:"SQLITE_INTERRUPT",10:"SQLITE_IOERR",11:"SQLITE_CORRUPT",12:"SQLITE_NOTFOUND",13:"SQLITE_FULL",14:"SQLITE_CANTOPEN",15:"SQLITE_PROTOCOL",17:"SQLITE_SCHEMA",18:"SQLITE_TOOBIG",19:"SQLITE_CONSTRAINT",20:"SQLITE_MISMATCH",21:"SQLITE_MISUSE",23:"SQLITE_AUTH",25:"SQLITE_RANGE",26:"SQLITE_NOTADB"},YW={275:"SQLITE_CONSTRAINT_CHECK",531:"SQLITE_CONSTRAINT_COMMITHOOK",787:"SQLITE_CONSTRAINT_FOREIGNKEY",1043:"SQLITE_CONSTRAINT_FUNCTION",1299:"SQLITE_CONSTRAINT_NOTNULL",1555:"SQLITE_CONSTRAINT_PRIMARYKEY",1811:"SQLITE_CONSTRAINT_TRIGGER",2067:"SQLITE_CONSTRAINT_UNIQUE",2323:"SQLITE_CONSTRAINT_VTAB",2579:"SQLITE_CONSTRAINT_ROWID",2835:"SQLITE_CONSTRAINT_PINNED",3091:"SQLITE_CONSTRAINT_DATATYPE",261:"SQLITE_BUSY_RECOVERY",517:"SQLITE_BUSY_SNAPSHOT",773:"SQLITE_BUSY_TIMEOUT",262:"SQLITE_LOCKED_SHAREDCACHE",518:"SQLITE_LOCKED_VTAB"};function KW(e){let t=YW[e];if(t!==void 0)return t;let n=JW[e&255];return n!==void 0?n:`SQLITE_UNKNOWN_${e}`}function vo(e){throw e&&typeof e=="object"&&"errcode"in e&&typeof e.errcode=="number"&&(e.code=KW(e.errcode)),e}var Dh=class{name;handle;savepointId=0;constructor(t,n={}){if(n.fileMustExist===!0&&t!==":memory:"&&!GW(t))throw new Error("unable to open database file");this.name=t;try{this.handle=new(VW())(t,{readOnly:n.readonly===!0})}catch(r){vo(r)}this.exec("PRAGMA busy_timeout = 5000"),this.exec(`PRAGMA foreign_keys = ${n.foreignKeys===!0?"ON":"OFF"}`)}prepare(t){try{return new $h(this.handle.prepare(t))}catch(n){vo(n)}}exec(t){try{this.handle.exec(t)}catch(n){vo(n)}}pragma(t,n){let r=`PRAGMA ${t}`;if(t.includes("=")){this.exec(r);return}if(n?.simple===!0){let s=this.prepare(r).get();return s===void 0?void 0:Object.values(s)[0]}return this.prepare(r).all()}transaction(t){let n=(...r)=>this.runTransaction("BEGIN",t,r);return n.immediate=(...r)=>this.runTransaction("BEGIN IMMEDIATE",t,r),n}get inTransaction(){return this.handle.isTransaction}close(){try{this.handle.close()}catch(t){vo(t)}}runTransaction(t,n,r){if(!this.inTransaction){this.exec(t);try{let o=n(...r);return this.exec("COMMIT"),o}catch(o){if(this.inTransaction)try{this.exec("ROLLBACK")}catch(i){if(!zW(i))throw i}throw o}}let s=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${s}`);try{let o=n(...r);return this.exec(`RELEASE ${s}`),o}catch(o){if(this.inTransaction)try{this.exec(`ROLLBACK TO ${s}`),this.exec(`RELEASE ${s}`)}catch(i){if(!QW(i))throw i}throw o}}};function zW(e){return e instanceof Error&&/cannot rollback - no transaction is active/i.test(e.message)}function QW(e){return e instanceof Error&&/no such savepoint:/i.test(e.message)}var Ti=Dh,$h=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){try{let n=this.handle.get(...Oh(t));return this.normalizeRow(n)}catch(n){vo(n)}}all(...t){try{return this.handle.all(...Oh(t)).map(n=>this.normalizeRow(n))}catch(n){vo(n)}}run(...t){try{let n=this.handle.run(...Oh(t));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}catch(n){vo(n)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&Mh(t)?Object.values(t):Mh(t)?{...t}:t}};function Oh(e){return e.length===1&&ZW(e[0])?[e[0]]:e}function ZW(e){if(!Mh(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Mh(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ph(e){return new Ti(e,{readonly:!0,fileMustExist:!0})}import{join as cn,resolve as yA}from"node:path";import{homedir as hX}from"node:os";import{readdir as cB}from"node:fs/promises";import{join as ib,sep as ab}from"node:path";import{createHash as eB}from"node:crypto";import{lstat as tB,readFile as nB,realpath as rb,stat as sb}from"node:fs/promises";import{isAbsolute as ob,relative as rB,resolve as sB,sep as oB}from"node:path";var dc="bx3",sn={input_uncached:null,input_cached:null,input_cache_write:null,output:null};function ie(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}function pe(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function lc(e){return pe(e)}function Tn(e){if(typeof e!="string"&&typeof e!="number")return null;let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():null}function $e(e){if(!Number.isSafeInteger(e.maxBytes)||e.maxBytes<=0)throw new Error("maxBytes must be a positive safe integer");if(!Number.isSafeInteger(e.maxRows)||e.maxRows<=0)throw new Error("maxRows must be a positive safe integer");e.signal.throwIfAborted()}function We(e,t){return e<t?-1:e>t?1:0}var yn=class{map=new Map;record(t,n,r,s){if(typeof r!="string"||r.length===0||r.includes("\0"))return;let o=`${t}\0${n}\0${r}`;this.map.has(o)||this.map.set(o,{direction:n,path:r,bytes:s})}files(t){let n=[];for(let r of this.map.values())r.direction===t&&n.push({path:r.path,bytes:r.bytes});return n}},iB=0,wn=class{map=new Map;record(t){let n;t.id!==null?n=`id\0${t.id}\0${t.direction}\0${t.kind}`:t.bytes===null?n=`mark\0${t.direction}\0${t.kind}\0${t.basis}\0${t.ref??""}`:n=`seq\0${iB++}`,this.map.has(n)||this.map.set(n,t)}entries(){return[...this.map.values()]}};function Xt(e,t,n){if(e===null||t===null)return null;let r=n==="written"?"write":"read",s=0;for(let o of e){if(o.bytes===null)return null;s+=o.bytes}for(let o of t)if(o.direction===r){if(o.bytes===null)return null;s+=o.bytes}return s}function fr(e,t,n){let r={},s=lc(e.cacheWrite5m),o=lc(e.cacheWrite1h),i=lc(e.reasoning),a=lc(e.webSearch),c=lc(e.webFetch);i!==null&&(t===null||i<=t)&&(r.reasoning_output_tokens=i);let l=(s??0)+(o??0),d=n===null||l<=n;return s!==null&&d&&(r.cache_write_5m_tokens=s),o!==null&&d&&(r.cache_write_1h_tokens=o),a!==null&&(r.web_search_requests=a),c!==null&&(r.web_fetch_requests=c),Object.keys(r).length>0?r:null}var aB=new Set(["schedulewakeup","taskcreate","taskupdate","taskoutput","taskstop","todowrite","todoread","croncreate","crondelete","cronlist","monitor","listagents","toolsearch","askuserquestion","exitplanmode","agent","skill","job"]);function ws(e){return typeof e=="string"&&aB.has(e.toLowerCase())}function at(e,t){e.record({direction:"read",kind:"unattributed",id:t,ref:null,bytes:null,basis:"unknown"}),e.record({direction:"write",kind:"unattributed",id:t,ref:null,bytes:null,basis:"unknown"})}function vi(e){let t=ie(e);return t&&typeof t.content=="string"?Buffer.byteLength(t.content,"utf8"):null}async function At(e,t){if(!ob(e))return null;let n=await tB(e).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await rb(e).catch(()=>null);if(!r)return null;for(let s of t){let o=await rb(s).catch(()=>sB(s)),i=rB(o,r);if(i===""||!i.startsWith(`..${oB}`)&&i!==".."&&!ob(i))return r}return null}async function on(e,t){$e(t);let n=await sb(e).catch(()=>null);if(!n?.isFile()||n.size>t.maxBytes)return null;let r=await nB(e,{signal:t.signal});t.signal.throwIfAborted();let s=await sb(e).catch(()=>null);return!s?.isFile()||n.dev!==s.dev||n.ino!==s.ino||n.size!==s.size||n.mtimeMs!==s.mtimeMs?null:{revision:`${dc}:sha256:${eB("sha256").update(r).digest("hex")}`,data:r}}function Hd(e,t){if(e.length>0&&e[e.length-1]!==10)return null;let n=e.toString("utf8"),r=n.length===0?[]:n.slice(0,-1).split(`
199
- `),s=[];for(let o of r)if(t.signal.throwIfAborted(),!!o.trim())try{let i=ie(JSON.parse(o));if(!i)return null;s.push(i)}catch{return null}return s}var Si=class{format;constructor(t){this.format=t}async discover(t,n,r){$e(t);let s=[],o=0,i=!1,a=async(c,l)=>{if(t.signal.throwIfAborted(),l>8||o>t.maxRows){i=!0;return}let d=await cB(c,{withFileTypes:!0}).catch(f=>(f.code!=="ENOENT"&&(i=!0),[])),u=f=>ib(c,f.name)+(f.isDirectory()?ab:"");for(let f of d.sort((m,p)=>We(u(m),u(p)))){t.signal.throwIfAborted();let m=ib(c,f.name),p=f.isDirectory()&&r?.startsWith(m+ab);if(!(r&&!p&&We(u(f),r)<=0)){if(!p&&++o>t.maxRows){i=!0;break}if(f.isDirectory())await a(m,l+1);else if(f.isFile()){let h=this.format.sessionId(m);h&&s.push({provider:this.format.provider,sessionid:h,source_id:m})}if(s.length>=n){i=!0;break}}}};return await a(this.format.root,0),s.sort((c,l)=>We(c.source_id,l.source_id)),{sources:s.slice(0,n),truncated:i||s.length>n}}async bytes(t,n){if($e(n),t.provider!==this.format.provider||this.format.sessionId(t.source_id)!==t.sessionid)return null;let r=await At(t.source_id,[this.format.root]);if(!r)return null;let s=await on(r,n).catch(()=>(n.signal.throwIfAborted(),null));return s&&{...s,revision:`${this.format.revision}:${s.revision}`}}async inspect(t,n){let r=await this.bytes(t,n);return r?{status:"ready",revision:r.revision}:{status:"partial"}}async read(t,n,r){let s=await this.bytes(t,r);if(!s||s.revision!==n)return{status:"partial"};let o=this.format.decode(s.data,t.sessionid,t.source_id,r);return!o||!o.responses?{status:"partial"}:{status:"complete",source:t,revision:n,checkpoint:null,responses:o.responses,...o.captureStatus?{capture_status:o.captureStatus}:{}}}};function bi(e,t=!0){let n={input_uncached:null,input_cached:null,input_cache_write:null,output:null};if(!t||!e.length||new Set(e.map(r=>r.response_id)).size!==e.length)return n;for(let r of Object.keys(n)){let s=e.map(i=>i.tokens[r]);if(s.some(i=>i===null||!Number.isSafeInteger(i)||i<0))continue;let o=s.reduce((i,a)=>i+a,0);Number.isSafeInteger(o)&&(n[r]=o)}return n}import{readdir as uB}from"node:fs/promises";import{join as Ai,resolve as fB}from"node:path";import{createReadStream as cb}from"node:fs";import{createInterface as lb}from"node:readline";import{stat as lB}from"node:fs/promises";import{homedir as dB}from"node:os";var ge=dB();function db(e){try{let t=JSON.parse(e);return t===null||typeof t!="object"||Array.isArray(t)?void 0:t}catch{return}}async function*ze(e,t){let n=cb(e,{encoding:"utf-8"}),r=lb({input:n,crlfDelay:1/0});try{for await(let s of r){let o=s.trim();if(!o)continue;let i=db(o);i!==void 0?yield i:t?.()}}finally{n.destroy()}}async function vn(e,t){let n=[],r=cb(e,{encoding:"utf-8"}),s=lb({input:r,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(!i)continue;let a=db(i);if(a!==void 0&&n.push(a),n.length>=t)break}}finally{s.close(),r.destroy()}return n}async function dt(e){let t=await lB(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function Ve(e){return e.replace(/\\n/g,`
200
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function de(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}function Dn(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}var ub=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Bd(e){return fB(e||process.env.XDG_DATA_HOME||Ai(ge,".local","share"))}function mB(e){return Ai(Bd(e),"muse","sessions")}function pB(e,t,n,r){let s=r?.input_tokens,o=r?.cache_read_tokens??r?.input_cache_read_tokens,i=r?.cache_write_tokens??r?.input_cache_write_tokens,a=typeof r?.promptTokens=="number"?r.promptTokens:typeof r?.prompt_tokens=="number"?r.prompt_tokens:void 0,c=typeof s=="number"&&typeof o=="number"&&o>s||typeof a=="number"&&typeof o=="number"&&o>a||typeof a=="number"&&typeof i=="number"&&i>a||typeof a=="number"&&typeof o=="number"&&typeof i=="number"&&o+i>a,l=c?null:typeof o=="number"?o:null,d=c?null:typeof i=="number"?i:null,u=null;return c||(typeof r?.input_uncached_tokens=="number"?u=r.input_uncached_tokens:typeof a=="number"&&typeof o=="number"&&typeof i=="number"&&a>=o+i&&(u=a-o-i)),{response_id:e,timestamp:t.toISOString(),model:typeof n=="string"&&n.length>0?n:null,tokens:{input_uncached:typeof u=="number"?u:null,input_cached:typeof l=="number"?l:null,input_cache_write:typeof d=="number"?d:null,output:typeof r?.output_tokens=="number"?r.output_tokens:null},files_read:null,files_written:null}}function mb(e,t){let n,r,s,o,i,a=[],c=new Map,l=new Map,d=new Set,u,f,m=()=>{f="partial"},p=g=>{if(typeof g!="string"||g.length===0){m();return}let w=c.get(g);return w||(w={id:g,turn:{id:g,status:"unknown"},responseIds:[]},c.set(g,w)),w},h=g=>{if(g.retained_frame&&Array.isArray(g.children)){for(let A of g.children)try{if(typeof A?.record_json!="string")throw new Error("missing record_json");h(JSON.parse(A.record_json))}catch{m()}return}if(g.stream?.kind!=="session"||g.stream?.id!==e)return;if(g.schema_version!==1){m();return}if(g.payload_type?.startsWith("runtime.session")&&g.payload_schema_version!==1){m();return}let w=g.payload?.source_run_record_id;for(let A of[g.id,w])if(!(typeof A!="string"||A.length===0)&&d.has(A))return;for(let A of[g.id,w])typeof A=="string"&&A.length>0&&d.add(A);let y=typeof g.recorded_at=="number"&&Number.isFinite(g.recorded_at)?new Date(g.recorded_at/1e3):void 0;if(g.recorded_at!==void 0&&(!y||!Number.isFinite(y.getTime()))){m();return}y&&Number.isFinite(y.getTime())&&((!s||y<s)&&(s=y),(!o||y>o)&&(o=y));let E=g.payload;if(g.payload_type==="runtime.session.metadata"&&(typeof E?.record?.workspace_root=="string"&&(n=E.record.workspace_root),typeof E?.record?.model_id=="string"&&(r=E.record.model_id)),g.payload_type!=="runtime.session"||E?.kind!=="run")return;let T=E.event,b=p(E.run_id);if(!T||!y||!b){T||m();return}if(T.kind==="started"&&typeof T.prompt=="string")a.push({role:"user",content:T.prompt,timestamp:y}),b.turn.startedAt=y,b.turn.prompt=T.prompt,b.turn.status="in_progress",i="in_progress";else if(T.kind==="assistant_message_committed"&&typeof T.text=="string")a.push({role:"assistant",content:T.text,timestamp:y});else if(T.kind==="terminal")b.turn.completedAt=y,b.turn.status=T.terminal==="completed"?"complete":"aborted",i=b.turn.status;else if(T.kind==="model_completed"){typeof T.model=="string"&&T.model.length>0&&(r=T.model,b.turn.model=T.model);let A=typeof w=="string"&&w.length>0?w:typeof g.id=="string"&&g.id.length>0?g.id:void 0;if(!A)m();else{b.responseIds.push(A);let q={};if(T.usage&&typeof T.usage=="object")for(let F of["input_tokens","output_tokens","cached_tokens","reasoning_tokens","input_uncached_tokens","cache_read_tokens","input_cache_read_tokens","cache_write_tokens","input_cache_write_tokens","promptTokens","prompt_tokens"]){let M=T.usage[F];typeof M=="number"&&Number.isSafeInteger(M)&&M>=0&&(q[F]=M)}Object.keys(q).length>0&&(b.turn.rawUsage=[...b.turn.rawUsage??[],{responseId:A,values:q}]),l.set(A,pB(A,y,T.model,q))}if(!T.usage)return;let I={},R=T.usage.input_tokens,L=T.usage.cache_read_tokens??T.usage.input_cache_read_tokens,N=T.usage.cache_write_tokens??T.usage.input_cache_write_tokens,k=typeof T.usage.promptTokens=="number"?T.usage.promptTokens:typeof T.usage.prompt_tokens=="number"?T.usage.prompt_tokens:void 0,D=typeof R=="number"&&typeof L=="number"&&L>R||typeof k=="number"&&typeof L=="number"&&L>k||typeof k=="number"&&typeof N=="number"&&N>k||typeof k=="number"&&typeof L=="number"&&typeof N=="number"&&L+N>k,O=D?void 0:typeof L=="number"?L:void 0,v=D?void 0:typeof N=="number"?N:void 0,S;D||(typeof T.usage.input_uncached_tokens=="number"?S=T.usage.input_uncached_tokens:typeof k=="number"&&typeof L=="number"&&typeof N=="number"&&k>=L+N&&(S=k-L-N)),S!==void 0&&S<0&&(S=void 0);let x=T.usage.output_tokens,C=T.usage.reasoning_tokens;typeof S=="number"&&Number.isSafeInteger(S)&&S>=0&&(I.inputTokens=S),typeof O=="number"&&Number.isSafeInteger(O)&&O>=0&&(I.cachedInputTokens=O),typeof v=="number"&&Number.isSafeInteger(v)&&v>=0&&(I.cacheWriteInputTokens=v),typeof x=="number"&&Number.isSafeInteger(x)&&x>=0&&(I.outputTokens=x),typeof C=="number"&&Number.isSafeInteger(C)&&C>=0&&(I.reasoningOutputTokens=C),u=I}};return{visit:h,finish:()=>{if(!n||!s||!o)return null;let g=a.filter(T=>T.role==="user").map(T=>T.content),w=[...c.values()].map(T=>({...T.turn,...T.responseIds.length>0?{responseIds:[...T.responseIds]}:{}})),y=[...l.values()],E=bi(y,f!=="partial");return{provider:"muse",sessionId:e,filePath:t,cwd:n,createdAt:s,modifiedAt:o,model:r,messages:a,messageCount:a.length,firstUserMessage:g[0],lastUserMessage:g.at(-1),userPrompts:g,turnStatus:i,totalInputTokens:E.input_uncached??void 0,totalCachedInputTokens:E.input_cached??void 0,totalCacheWriteInputTokens:E.input_cache_write??void 0,totalOutputTokens:E.output??void 0,lastTokenUsage:u,turns:w,responses:y,...f?{captureStatus:f}:{}}},markPartial:m}}function hB(e,t,n){let r=mb(t,n);for(let s of e)r.visit(s);return r.finish()}function _B(e,t,n,r){r.signal.throwIfAborted();let s=Math.max(0,r.maxBytes),o=e.length<=s?e:e.subarray(0,Math.max(0,e.subarray(0,s).lastIndexOf(10))),i=o.length!==e.length,a=[],c=i,l=0,d=f=>{if(!f||typeof f!="object"||Array.isArray(f)){c=!0;return}let m=f;if(m.retained_frame&&Array.isArray(m.children)){for(let p of m.children){if(l>=r.maxRows){c=!0;return}let h;try{if(typeof p?.record_json!="string")throw new Error("missing record_json");h=JSON.parse(p.record_json)}catch{c=!0;continue}d(h)}return}if(l>=r.maxRows){c=!0;return}a.push(m),l++};for(let f of o.toString("utf8").split(/\r?\n/u)){if(r.signal.throwIfAborted(),f.trim()==="")continue;let m;try{m=JSON.parse(f)}catch{c=!0;continue}d(m)}let u=hB(a,t,n);return u&&c&&(u.captureStatus="partial"),u}function pb(e){return{provider:"muse",root:mB(e),revision:"muse-session-v2",sessionId:n=>n.replaceAll("\\","/").match(/\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\/session\.jsonl$/iu)?.[1]??null,decode:_B}}async function fb(e,t){let n=mb(e,t);for await(let r of ze(t,n.markPartial))n.visit(r);return n.finish()}var Wd=class{name="muse";dataHome;constructor(t={}){this.dataHome=Bd(t.museDataHome)}get root(){return Ai(this.dataHome,"muse","sessions")}getWatchPaths(){return[{directory:this.root,filePattern:/session\.jsonl$/}]}async files(t=this.root,n=0){let r;try{r=await uB(t,{withFileTypes:!0})}catch{return[]}let s=[];for(let o of r)o.isFile()&&o.name==="session.jsonl"?s.push(Ai(t,o.name)):o.isDirectory()&&n<4&&s.push(...await this.files(Ai(t,o.name),n+1));return s}async resolveSessionPath(t){return ub.test(t)?(await this.files()).find(n=>n.endsWith(Ai(t,"session.jsonl")))??null:null}async loadSession(t){let n=await this.resolveSessionPath(t);return n?fb(t,n):null}async discoverSessions(){let t=[];for(let n of await this.files())try{let r=n.split(/[\\/]/).at(-2);if(!ub.test(r))continue;let s=await fb(r,n);s&&t.push(s)}catch{}return t}async deleteSession(){return!1}};import{readFile as hb,readdir as gB,rm as EB,stat as _b}from"node:fs/promises";import{basename as yB,join as Ii,resolve as wB}from"node:path";var Tb=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;function Vd(e){return wB(e||process.env.MINIPLAYER_HOME||Ii(process.env.XDG_DATA_HOME||Ii(ge,".local","share"),"miniplayer"))}var Xd=class{name="miniplayer";home;constructor(t={}){this.home=Vd(t.miniplayerHome)}getWatchPaths(){return[{directory:Ii(this.home,"sessions"),filePattern:/\.json$/}]}async discoverSessions(){let t;try{t=await gB(Ii(this.home,"sessions"))}catch{return[]}return(await Promise.all(t.filter(r=>r.endsWith(".json")).map(r=>this.loadSession(r.slice(0,-5))))).filter(r=>r!==null)}async resolveSessionPath(t){if(!Tb.test(t))return null;let n=Ii(this.home,"sessions",`${t}.json`);try{return(await _b(n)).isFile()?n:null}catch{return null}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;try{let r=vb(JSON.parse(await hb(n,"utf8")),t,n);if(!r)return null;let s="complete";try{let o=JSON.parse(await hb(`${n}.lock`,"utf8"));if(Number.isInteger(o.pid)&&o.pid>0)try{process.kill(o.pid,0),s="in_progress"}catch{s="aborted"}}catch{}return{...r,...s!=="complete"?{turnStatus:s}:{}}}catch{return null}}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;try{throw await _b(`${n}.lock`),new Error("Cannot delete a locked miniplayer session")}catch(r){if(r.code!=="ENOENT")throw r}return await EB(n),!0}};function Gd(e){if(typeof e=="string")return e;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function Uh(e){return!e||typeof e!="object"?"tool":typeof e.toolName=="string"?e.toolName:typeof e.name=="string"?e.name:"tool"}function gb(e){if(!e||typeof e!="object")return null;let t=e.toolCallId??e.id;return typeof t=="string"&&t.length>0?t:null}function Eb(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function yb(e){if(typeof e!="string")return null;try{let t=new URL(e);return t.username="",t.password="",t.search="",t.hash="",t.toString()}catch{return null}}function wb(e){let t=e.usage&&typeof e.usage=="object"&&!Array.isArray(e.usage)?e.usage:{},n={};for(let[c,l]of Object.entries(t))pe(l)!==null&&(n[c]=l);let r=pe(t.inputTokens),s=pe(t.cachedInputTokens),o=pe(e.cacheWriteInputTokens??t.cacheWriteInputTokens),i=pe(t.outputTokens),a=null;return e.usageConvention==="input-includes-cache"&&r!==null&&s!==null&&s<=r&&(a=r-s),e.usageConvention==="input-excludes-cache"&&r!==null&&o!==null&&(a=r+o),e.usageConvention==="synthetic"&&r===0&&s===0&&(o===0||o===null)&&i===0&&(a=0),{tokens:{input_uncached:a,input_cached:s,input_cache_write:o,output:i},rawUsage:n,pricingFacts:pe(t.reasoningTokens)===null?null:{reasoning_output_tokens:pe(t.reasoningTokens)}}}function vb(e,t,n){if(!e||typeof e!="object")return null;let r=e;if(![1,2].includes(r.version)||r.id!==t||typeof r.cwd!="string")return null;let s=p=>{if(typeof p!="string")return;let h=new Date(p);return Number.isFinite(h.getTime())?h:void 0},o=s(r.createdAt),i=s(r.updatedAt);if(!o||!i)return null;let a=[],c=[],l=[],d=r.version===1,u="complete";if(r.version===1){if(!Array.isArray(r.messages))return null;for(let p of r.messages){if(!p||!["user","assistant"].includes(p.role)||typeof p.content!="string")return null;a.push({role:p.role,content:p.content,timestamp:s(p.timestamp)??i})}}else{if(!Array.isArray(r.turns))return null;let p=new Set,h=new Set;for(let _ of r.turns){if(!_||typeof _.responseId!="string"||!_.responseId||typeof _.input?.text!="string")return null;if(p.has(_.responseId)){d=!0;continue}p.add(_.responseId);let g=s(_.startedAt),w=s(_.completedAt??_.endedAt);if(!g)return null;let y=typeof _.model=="string"?_.model:void 0;["complete","running","failed","aborted"].includes(_.status)||(d=!0);let E=_.status==="complete"?"complete":_.status==="running"?"in_progress":_.status==="failed"?"failed":_.status==="aborted"?"aborted":"unknown";u=E==="failed"||E==="unknown"?"aborted":E,(E!=="complete"||_.partial===!0)&&(d=!0);let T=Array.isArray(_.modelResponses),b=T?_.modelResponses:[],A=[];c.push({id:_.responseId,startedAt:g,completedAt:w,model:y,prompt:_.input.text,status:E,responseIds:A}),a.push({role:"user",timestamp:g,content:_.input.text});let I=Array.isArray(_.toolEvents)&&_.toolEvents.length>0;if(!T&&!I){let D=_.usage??{},O=wb({..._,usage:D});Object.keys(O.rawUsage).length&&(c.at(-1).rawUsage=[{responseId:_.responseId,values:O.rawUsage}]),A.push(_.responseId),l.push({response_id:_.responseId,timestamp:(w??g).toISOString(),model:y??null,model_provider:typeof _.provider=="string"?_.provider:null,tokens:O.tokens,files_read:[],files_written:[],read_bytes:Buffer.byteLength(_.input.text,"utf8"),write_bytes:0,external_io:[{direction:"read",kind:"prompt",id:_.responseId,ref:null,bytes:Buffer.byteLength(_.input.text,"utf8"),basis:"input_text"}],pricing_facts:O.pricingFacts}),E!=="complete"&&!_.usage&&(d=!0),typeof _.output?.text=="string"&&a.push({role:"assistant",timestamp:w??g,content:_.output.text,model:y});continue}let R=new Map,L=new Map,N=new Set,k=[];for(let D of b){if(!D||typeof D!="object"||typeof D.responseId!="string"||!D.responseId){d=!0;continue}if(A.includes(D.responseId)){d=!0;continue}let O=D,v=k.length;k.push({response:O,index:v,filesRead:[],filesWritten:[],io:[]}),A.push(D.responseId),h.has(D.responseId)&&(d=!0),h.add(D.responseId),O.toolCalls!==void 0&&!Array.isArray(O.toolCalls)&&(d=!0,k[v].io.push({direction:"read",kind:"unattributed",id:D.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:D.responseId,ref:null,bytes:null,basis:"unknown"}));for(let S of Array.isArray(O.toolCalls)?O.toolCalls:[]){let x=gb(S),C=Uh(S);if(x)R.set(x,v),L.set(x,C);else{d=!0;let q=C==="list_directory"||C==="read_file"||C==="webget"||C==="shell"||C==="tool",F=C==="write_file"||C==="shell"||C==="tool";q&&k[v].io.push({direction:"read",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"}),F&&k[v].io.push({direction:"write",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"})}}}A.length===0&&b.length>0&&(d=!0);for(let D of Array.isArray(_.toolEvents)?_.toolEvents:[]){let O=D&&typeof D=="object"?D:{},v=gb(O),S=v?R.get(v):void 0,x=Uh(O),C=Eb(O.result),q=O.status==="failed"||O.error!==void 0;if(O.type==="tool_call"?a.push({role:"tool_use",timestamp:s(O?.timestamp)??g,content:Gd(O?.input??O?.args),toolName:x,toolInput:Gd(O?.input??O?.args),toolInputData:Eb(O?.input??O?.args)??void 0,...v?{toolCallId:v}:{}}):a.push({role:"tool_result",timestamp:s(O?.timestamp)??w??g,content:Gd(q?O?.error:O?.result),toolName:x,...v?{toolCallId:v}:{}}),S===void 0){d=!0;continue}let F=k[S];(O.type==="tool_result"||q||O.result!==void 0)&&N.add(v);let M=C?.path,$=pe(C?.bytesRead??C?.bytesWritten);O.type!=="tool_call"&&(x==="read_file"&&!q&&typeof M=="string"&&$!==null?F.filesRead.push({path:M,bytes:$}):x==="write_file"&&!q&&typeof M=="string"&&$!==null?F.filesWritten.push({path:M,bytes:$}):x==="webget"&&!q&&$!==null?F.io.push({direction:"read",kind:"web",id:v,ref:yb(C?.finalUrl??C?.url),bytes:$,basis:"certified_counter"}):x==="shell"||q?(x!=="write_file"&&F.io.push({direction:"read",kind:"unattributed",id:v,ref:null,bytes:null,basis:"unknown"}),(x==="shell"||x==="write_file")&&F.io.push({direction:"write",kind:"unattributed",id:v,ref:null,bytes:null,basis:"unknown"})):x==="list_directory"||x==="read_file"||x==="webget"?F.io.push({direction:"read",kind:x==="webget"?"web":"unattributed",id:v,ref:x==="webget"?yb(C?.finalUrl??C?.url):null,bytes:null,basis:"unknown"}):x==="write_file"?F.io.push({direction:"write",kind:"unattributed",id:v,ref:null,bytes:null,basis:"unknown"}):F.io.push({direction:"read",kind:"unattributed",id:v,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:v,ref:null,bytes:null,basis:"unknown"}))}for(let[D,O]of L)if(!N.has(D)){let v=k[R.get(D)],S=O==="list_directory"||O==="read_file"||O==="webget"||O==="shell",x=O==="write_file"||O==="shell";S&&v.io.push({direction:"read",kind:"unattributed",id:D,ref:null,bytes:null,basis:"unknown"}),x&&v.io.push({direction:"write",kind:"unattributed",id:D,ref:null,bytes:null,basis:"unknown"}),d=!0}for(let D of k){let O=D.response,v=wb(O),S=s(O.completedAt??O.startedAt)??w??g;new Set((Array.isArray(O.toolCalls)?O.toolCalls:[]).map(F=>Uh(F))).has("shell")&&!D.io.some(F=>F.kind==="unattributed"&&F.direction==="read")&&D.io.push({direction:"read",kind:"unattributed",id:O.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:O.responseId,ref:null,bytes:null,basis:"unknown"}),D.index===0&&D.io.unshift({direction:"read",kind:"prompt",id:_.responseId,ref:null,bytes:Buffer.byteLength(_.input.text,"utf8"),basis:"input_text"});let C=D.io.some(F=>F.direction==="read"&&F.bytes===null),q=D.io.some(F=>F.direction==="write"&&F.bytes===null);if(l.push({response_id:O.responseId,timestamp:S.toISOString(),model:typeof O.model=="string"?O.model:null,model_provider:typeof O.provider=="string"?O.provider:typeof _.provider=="string"?_.provider:null,tokens:v.tokens,files_read:C?null:D.filesRead,files_written:q?null:D.filesWritten,read_bytes:C?null:D.filesRead.reduce((F,M)=>F+(M.bytes??0),0)+D.io.filter(F=>F.direction==="read").reduce((F,M)=>F+(M.bytes??0),0),write_bytes:q?null:D.filesWritten.reduce((F,M)=>F+(M.bytes??0),0)+D.io.filter(F=>F.direction==="write").reduce((F,M)=>F+(M.bytes??0),0),external_io:D.io,pricing_facts:v.pricingFacts}),Object.keys(v.rawUsage).length){let F=c.at(-1);F.rawUsage=[...F.rawUsage??[],{responseId:O.responseId,values:v.rawUsage}]}}c.at(-1).responseIds=A,A.length!==b.length&&(d=!0),typeof _.output?.text=="string"&&a.push({role:"assistant",timestamp:w??g,content:_.output.text,model:y})}}let f=a.filter(p=>p.role==="user").map(p=>p.content),m=bi(l,!d);return{provider:"miniplayer",sessionId:t,cwd:r.cwd,filePath:n,createdAt:o,modifiedAt:i,model:typeof r.model=="string"?r.model:void 0,messages:a,messageCount:a.length,userPrompts:f,firstUserMessage:f[0],lastUserMessage:f.at(-1),turns:c,responses:l,turnStatus:u,...d?{captureStatus:"partial"}:{},totalInputTokens:m.input_uncached??void 0,totalCachedInputTokens:m.input_cached??void 0,totalCacheWriteInputTokens:m.input_cache_write??void 0,totalOutputTokens:m.output??void 0}}function Jd(e){return{provider:"miniplayer",root:Ii(Vd(e),"sessions"),revision:"miniplayer-data-v3",sessionId(t){let n=yB(t,".json");return t.endsWith(".json")&&Tb.test(n)?n:null},decode(t,n,r,s){s.signal.throwIfAborted();try{let o=JSON.parse(t.toString("utf8"));return(Array.isArray(o.turns)?o.turns.reduce((a,c)=>a+1+(Array.isArray(c?.modelResponses)?c.modelResponses.length:0)+(Array.isArray(c?.toolEvents)?c.toolEvents.length:0),0):Array.isArray(o.messages)?o.messages.length:0)>s.maxRows?null:vb(o,n,r)}catch{return null}}}}import{createHash as e_}from"node:crypto";import{createRequire as EG}from"node:module";import{lstat as yG,readFile as wG,readdir as TG,realpath as Qh,stat as nA}from"node:fs/promises";import{basename as Qd,dirname as vG,isAbsolute as rA,join as Ao,relative as SG,resolve as Fr,sep as bG}from"node:path";import{createHash as vB}from"node:crypto";import{createRequire as SB}from"node:module";import{readdir as bB,realpath as AB}from"node:fs/promises";import{basename as Sb,dirname as IB,join as bb,resolve as Ab}from"node:path";var TB=new URL("./cli/index.js",import.meta.url).href,Ts="agy",Yd="agy-tokens-v1",kB=SB(TB);function RB(){return kB("node:sqlite").DatabaseSync}function NB(){return process.env.HOME||process.env.USERPROFILE||""}function So(e){let t=[],n=0,r=()=>{let s=0n,o=0n;for(;;){if(n>=e.length||o>63n)return null;let i=e[n++];if(s|=BigInt(i&127)<<o,o+=7n,!(i&128))break}return s<=BigInt(Number.MAX_SAFE_INTEGER)?Number(s):null};for(;n<e.length;){let s=r();if(s===null)return t;let o=s>>>3,i=s&7;if(o===0)return t;if(i===0){let a=r();if(a===null)return t;t.push({field:o,wire:i,varint:a})}else if(i===1){if(n+8>e.length)return t;n+=8,t.push({field:o,wire:i})}else if(i===5){if(n+4>e.length)return t;n+=4,t.push({field:o,wire:i})}else if(i===2){let a=r();if(a===null||n+a>e.length)return t;t.push({field:o,wire:i,bytes:e.subarray(n,n+a)}),n+=a}else return t}return t}function mr(e,t){return e.find(n=>n.field===t)}function xB(e){let t=new Map;for(let n of e){if(n.field!==20||n.bytes===void 0)continue;let r=So(n.bytes),s=mr(r,1)?.bytes,o=mr(r,2)?.bytes;if(s===void 0||o===void 0)continue;let i=s.toString("utf8");t.has(i)||t.set(i,o.toString("utf8"))}return t}function LB(e){let t=mr(So(e),5)?.bytes;if(t===void 0)return null;let n=mr(So(t),1)?.bytes;if(n===void 0)return null;let r=So(n),s=mr(r,1)?.varint;if(s===void 0)return null;let o=mr(r,2)?.varint??0,i=s*1e3+Math.floor(o/1e6),a=new Date(i);return Number.isFinite(a.getTime())?a.toISOString():null}function CB(e){let t=mr(e,4)?.bytes,n=t!==void 0?So(t):[],r=s=>{let o=mr(n,s)?.varint;return o===void 0?null:pe(o)};return{tokens:{input_uncached:r(2),input_cached:r(5),input_cache_write:r(4),output:r(3)},thinkingOutputTokens:r(9)}}function OB(e){let t=mr(So(e),1)?.bytes;if(t===void 0)return null;let n=So(t),r=xB(n),s=r.get("request_id");if(s===void 0||s.length===0)return null;let o=mr(n,19)?.bytes,i=o!==void 0&&o.length>0?o.toString("utf8"):null,a=r.get("last_step_index"),c=a===void 0?Number.NaN:Number(a),l=Number.isSafeInteger(c)&&c>=0?c:null,{tokens:d,thinkingOutputTokens:u}=CB(n);return{requestId:s,model:i,lastStepIndex:l,tokens:d,thinkingOutputTokens:u}}function Ib(e,t){$e(t);let n=e.prepare("SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) AS total FROM gen_metadata").get(),r=pe(n?.total);if(r===null||r>t.maxBytes)return null;let s=e.prepare("SELECT idx, data FROM gen_metadata ORDER BY idx LIMIT ?").all(t.maxRows+1);if(s.length>t.maxRows)return null;let o=vB("sha256");o.update("rev:").update(Yd).update(`
198
+ (${E.length-1} other ready task(s) also available: \`lmauto tasks list --owner-team <path> --owner-alias <alias> --status todo\`.)`+u+_,onSent:A}}var Ie={idleThresholdMs:45*6e4,cooldownMs:30*6e4};function jW(e,t){return t.running.some(n=>di(e,n.from_identity))}function To(e,t){return t.dead.some(n=>di(e,n.target))&&!Tt(e,t)}function vh(e){if(e.isCurrentlyActive)return!1;let t=!e.hasInFlightWorker,n=e.timeSinceLastNudgeMs===null||e.timeSinceLastNudgeMs>e.config.cooldownMs;if(e.isDeadReclaimable)return t&&n;let r=!e.isCoordinator&&e.progressStatus==="UNKNOWN"&&(e.progressAgeMs===null||e.progressAgeMs>=e.config.idleThresholdMs),s=!e.heavyLockMayBeHeldByThisTeam&&e.hasStalePersistentInProgressWork;return t&&n&&(e.neverDispatched||r||s)}function Sh(e,t,n,r){let s;try{s=re(t)}catch{return!1}let o=Ke(e,s,t.leadAlias);if(o===null)return!1;let i=new Map(o.entities.map(a=>[a.id,a]));return o.entities.some(a=>(a.kind==="task"||a.kind==="subtask")&&we(a.status)==="in-progress"&&!ur(e,a,i)&&r-Date.parse(a.updated_at)>=n&&!bh(a,r))}function bh(e,t){return e.hold_until!==null&&Date.parse(e.hold_until)>t}function Ah(e,t){if(wt(e,t.name)!==null||kS(e,t.name))return!1;let n;try{n=re(t)}catch{return!0}return Ke(e,n,t.leadAlias)===null}function qW(e){return vh({...e,config:{...e.config,idleThresholdMs:0}})}function XS(e){return`last_nudged:${e}`}function Ih(e,t){return e.prepare("SELECT v FROM kv WHERE k = ?").get(XS(t))?.v??null}function ac(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(XS(t),n)}function VS(e,t,n,r,s,o,i){if(wt(e,t.name)?.status==="BLOCKED")return null;let c=Ah(e,t),l=o?.progress_changed_ts==null?null:s-Date.parse(o.progress_changed_ts),d=Ih(e,t.name),u=d===null?null:s-Date.parse(d);return{isCurrentlyActive:Tt(t,n),hasInFlightWorker:jW(t,n),neverDispatched:c,progressStatus:o?.progress_status??null,progressAgeMs:l,isDeadReclaimable:To(t,n),hasStalePersistentInProgressWork:Sh(e,t,r.idleThresholdMs,s),timeSinceLastNudgeMs:u,config:r,isCoordinator:t.coordinator===!0,heavyLockMayBeHeldByThisTeam:i.held&&(i.holder===null||i.holder.holder===t.name)}}function JS(e,t,n,r,s,o,i){let a=VS(e,t,n,s,o,i,r);return a!==null&&vh(a)}async function kh(e,t,n,r,s=Ie,o=Date.now()){let i=await Gp(e,t,t.name,o);return JS(e,t,n,r,s,o,i)}function Rh(e,t,n,r,s=Ie,o=Date.now()){return JS(e,t,n,r,s,o,fe(e,t.name))}async function wi(e,t,n,r,s=Ie,o=Date.now(),i={}){let a=[];for(let c of t){if(!c.autoNudge||fe(e,c.name)?.confirmed_done_ts)continue;(i.readOnly?Rh(e,c,n,r,s,o):await kh(e,c,n,r,s,o))&&!fe(e,c.name)?.confirmed_done_ts&&a.push(c.name)}return a}async function YS(e,t,n,r,s=Ie,o=Date.now()){let i=[],a=[];for(let c of t){if(!c.autoNudge||fe(e,c.name)?.confirmed_done_ts)continue;let l=await Gp(e,c,c.name,o);if(fe(e,c.name)?.confirmed_done_ts)continue;let d=VS(e,c,n,s,o,l,r);d!==null&&(vh(d)&&i.push(c.name),qW(d)&&a.push(c.name))}return{stalled:i,continueEligible:a}}import{existsSync as KS,readFileSync as zS}from"node:fs";import{dirname as xh,join as QS}from"node:path";import{fileURLToPath as ZS}from"node:url";var Nh={sha:"unknown",dirty:!0,builtAt:"unknown"};function HW(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.sha=="string"&&typeof t.dirty=="boolean"&&typeof t.builtAt=="string"}function eb(){let e=xh(ZS(import.meta.url));for(let t=0;t<5;t+=1){let n=QS(e,"package.json");if(KS(n))try{let r=JSON.parse(zS(n,"utf8"));if(r&&typeof r=="object"&&typeof r.version=="string")return r.version}catch{}e=xh(e)}return"unknown"}function Lh(){let e=QS(xh(ZS(import.meta.url)),"..","build-info.json");if(!KS(e))return Nh;try{let t=JSON.parse(zS(e,"utf8"));return HW(t)?t:Nh}catch{return Nh}}var WW="https://ecezfoozb3.execute-api.us-east-1.amazonaws.com/prod";function Hn(e){return(e.LMCTL_LMMAIL_API_URL?.trim()||e.LMMAIL_API_URL?.trim()||WW).replace(/\/+$/,"")}import{randomUUID as i8}from"node:crypto";import{join as a8,resolve as hL}from"node:path";var tb="root_teamfile <> '(direct)'",cc=tb+" AND COALESCE(accounting_only,0)=0";function nb(e){return e.prepare("PRAGMA table_info(team_chat_log)").all().some(t=>t.name==="accounting_only")?cc:tb}import{stat as mX,realpath as pX}from"node:fs/promises";import{existsSync as GW}from"node:fs";import{createRequire as XW}from"node:module";var BW=new URL("./cli/index.js",import.meta.url).href,Ch=null;function VW(){return Ch===null&&(Ch=XW(BW)("node:sqlite").DatabaseSync),Ch}var JW={1:"SQLITE_ERROR",2:"SQLITE_INTERNAL",3:"SQLITE_PERM",4:"SQLITE_ABORT",5:"SQLITE_BUSY",6:"SQLITE_LOCKED",7:"SQLITE_NOMEM",8:"SQLITE_READONLY",9:"SQLITE_INTERRUPT",10:"SQLITE_IOERR",11:"SQLITE_CORRUPT",12:"SQLITE_NOTFOUND",13:"SQLITE_FULL",14:"SQLITE_CANTOPEN",15:"SQLITE_PROTOCOL",17:"SQLITE_SCHEMA",18:"SQLITE_TOOBIG",19:"SQLITE_CONSTRAINT",20:"SQLITE_MISMATCH",21:"SQLITE_MISUSE",23:"SQLITE_AUTH",25:"SQLITE_RANGE",26:"SQLITE_NOTADB"},YW={275:"SQLITE_CONSTRAINT_CHECK",531:"SQLITE_CONSTRAINT_COMMITHOOK",787:"SQLITE_CONSTRAINT_FOREIGNKEY",1043:"SQLITE_CONSTRAINT_FUNCTION",1299:"SQLITE_CONSTRAINT_NOTNULL",1555:"SQLITE_CONSTRAINT_PRIMARYKEY",1811:"SQLITE_CONSTRAINT_TRIGGER",2067:"SQLITE_CONSTRAINT_UNIQUE",2323:"SQLITE_CONSTRAINT_VTAB",2579:"SQLITE_CONSTRAINT_ROWID",2835:"SQLITE_CONSTRAINT_PINNED",3091:"SQLITE_CONSTRAINT_DATATYPE",261:"SQLITE_BUSY_RECOVERY",517:"SQLITE_BUSY_SNAPSHOT",773:"SQLITE_BUSY_TIMEOUT",262:"SQLITE_LOCKED_SHAREDCACHE",518:"SQLITE_LOCKED_VTAB"};function KW(e){let t=YW[e];if(t!==void 0)return t;let n=JW[e&255];return n!==void 0?n:`SQLITE_UNKNOWN_${e}`}function vo(e){throw e&&typeof e=="object"&&"errcode"in e&&typeof e.errcode=="number"&&(e.code=KW(e.errcode)),e}var Dh=class{name;handle;savepointId=0;constructor(t,n={}){if(n.fileMustExist===!0&&t!==":memory:"&&!GW(t))throw new Error("unable to open database file");this.name=t;try{this.handle=new(VW())(t,{readOnly:n.readonly===!0})}catch(r){vo(r)}this.exec("PRAGMA busy_timeout = 5000"),this.exec(`PRAGMA foreign_keys = ${n.foreignKeys===!0?"ON":"OFF"}`)}prepare(t){try{return new $h(this.handle.prepare(t))}catch(n){vo(n)}}exec(t){try{this.handle.exec(t)}catch(n){vo(n)}}pragma(t,n){let r=`PRAGMA ${t}`;if(t.includes("=")){this.exec(r);return}if(n?.simple===!0){let s=this.prepare(r).get();return s===void 0?void 0:Object.values(s)[0]}return this.prepare(r).all()}transaction(t){let n=(...r)=>this.runTransaction("BEGIN",t,r);return n.immediate=(...r)=>this.runTransaction("BEGIN IMMEDIATE",t,r),n}get inTransaction(){return this.handle.isTransaction}close(){try{this.handle.close()}catch(t){vo(t)}}runTransaction(t,n,r){if(!this.inTransaction){this.exec(t);try{let o=n(...r);return this.exec("COMMIT"),o}catch(o){if(this.inTransaction)try{this.exec("ROLLBACK")}catch(i){if(!zW(i))throw i}throw o}}let s=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${s}`);try{let o=n(...r);return this.exec(`RELEASE ${s}`),o}catch(o){if(this.inTransaction)try{this.exec(`ROLLBACK TO ${s}`),this.exec(`RELEASE ${s}`)}catch(i){if(!QW(i))throw i}throw o}}};function zW(e){return e instanceof Error&&/cannot rollback - no transaction is active/i.test(e.message)}function QW(e){return e instanceof Error&&/no such savepoint:/i.test(e.message)}var Ti=Dh,$h=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){try{let n=this.handle.get(...Oh(t));return this.normalizeRow(n)}catch(n){vo(n)}}all(...t){try{return this.handle.all(...Oh(t)).map(n=>this.normalizeRow(n))}catch(n){vo(n)}}run(...t){try{let n=this.handle.run(...Oh(t));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}catch(n){vo(n)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&Mh(t)?Object.values(t):Mh(t)?{...t}:t}};function Oh(e){return e.length===1&&ZW(e[0])?[e[0]]:e}function ZW(e){if(!Mh(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Mh(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ph(e){return new Ti(e,{readonly:!0,fileMustExist:!0})}import{join as cn,resolve as yA}from"node:path";import{homedir as hX}from"node:os";import{readdir as cB}from"node:fs/promises";import{join as ib,sep as ab}from"node:path";import{createHash as eB}from"node:crypto";import{lstat as tB,readFile as nB,realpath as rb,stat as sb}from"node:fs/promises";import{isAbsolute as ob,relative as rB,resolve as sB,sep as oB}from"node:path";var dc="bx3",sn={input_uncached:null,input_cached:null,input_cache_write:null,output:null};function ie(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}function pe(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function lc(e){return pe(e)}function Tn(e){if(typeof e!="string"&&typeof e!="number")return null;let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():null}function $e(e){if(!Number.isSafeInteger(e.maxBytes)||e.maxBytes<=0)throw new Error("maxBytes must be a positive safe integer");if(!Number.isSafeInteger(e.maxRows)||e.maxRows<=0)throw new Error("maxRows must be a positive safe integer");e.signal.throwIfAborted()}function We(e,t){return e<t?-1:e>t?1:0}var yn=class{map=new Map;record(t,n,r,s){if(typeof r!="string"||r.length===0||r.includes("\0"))return;let o=`${t}\0${n}\0${r}`;this.map.has(o)||this.map.set(o,{direction:n,path:r,bytes:s})}files(t){let n=[];for(let r of this.map.values())r.direction===t&&n.push({path:r.path,bytes:r.bytes});return n}},iB=0,wn=class{map=new Map;record(t){let n;t.id!==null?n=`id\0${t.id}\0${t.direction}\0${t.kind}`:t.bytes===null?n=`mark\0${t.direction}\0${t.kind}\0${t.basis}\0${t.ref??""}`:n=`seq\0${iB++}`,this.map.has(n)||this.map.set(n,t)}entries(){return[...this.map.values()]}};function Xt(e,t,n){if(e===null||t===null)return null;let r=n==="written"?"write":"read",s=0;for(let o of e){if(o.bytes===null)return null;s+=o.bytes}for(let o of t)if(o.direction===r){if(o.bytes===null)return null;s+=o.bytes}return s}function fr(e,t,n){let r={},s=lc(e.cacheWrite5m),o=lc(e.cacheWrite1h),i=lc(e.reasoning),a=lc(e.webSearch),c=lc(e.webFetch);i!==null&&(t===null||i<=t)&&(r.reasoning_output_tokens=i);let l=(s??0)+(o??0),d=n===null||l<=n;return s!==null&&d&&(r.cache_write_5m_tokens=s),o!==null&&d&&(r.cache_write_1h_tokens=o),a!==null&&(r.web_search_requests=a),c!==null&&(r.web_fetch_requests=c),Object.keys(r).length>0?r:null}var aB=new Set(["schedulewakeup","taskcreate","taskupdate","taskoutput","taskstop","todowrite","todoread","croncreate","crondelete","cronlist","monitor","listagents","toolsearch","askuserquestion","exitplanmode","agent","skill","job"]);function ws(e){return typeof e=="string"&&aB.has(e.toLowerCase())}function at(e,t){e.record({direction:"read",kind:"unattributed",id:t,ref:null,bytes:null,basis:"unknown"}),e.record({direction:"write",kind:"unattributed",id:t,ref:null,bytes:null,basis:"unknown"})}function vi(e){let t=ie(e);return t&&typeof t.content=="string"?Buffer.byteLength(t.content,"utf8"):null}async function It(e,t){if(!ob(e))return null;let n=await tB(e).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await rb(e).catch(()=>null);if(!r)return null;for(let s of t){let o=await rb(s).catch(()=>sB(s)),i=rB(o,r);if(i===""||!i.startsWith(`..${oB}`)&&i!==".."&&!ob(i))return r}return null}async function on(e,t){$e(t);let n=await sb(e).catch(()=>null);if(!n?.isFile()||n.size>t.maxBytes)return null;let r=await nB(e,{signal:t.signal});t.signal.throwIfAborted();let s=await sb(e).catch(()=>null);return!s?.isFile()||n.dev!==s.dev||n.ino!==s.ino||n.size!==s.size||n.mtimeMs!==s.mtimeMs?null:{revision:`${dc}:sha256:${eB("sha256").update(r).digest("hex")}`,data:r}}function Hd(e,t){if(e.length>0&&e[e.length-1]!==10)return null;let n=e.toString("utf8"),r=n.length===0?[]:n.slice(0,-1).split(`
199
+ `),s=[];for(let o of r)if(t.signal.throwIfAborted(),!!o.trim())try{let i=ie(JSON.parse(o));if(!i)return null;s.push(i)}catch{return null}return s}var Si=class{format;constructor(t){this.format=t}async discover(t,n,r){$e(t);let s=[],o=0,i=!1,a=async(c,l)=>{if(t.signal.throwIfAborted(),l>8||o>t.maxRows){i=!0;return}let d=await cB(c,{withFileTypes:!0}).catch(f=>(f.code!=="ENOENT"&&(i=!0),[])),u=f=>ib(c,f.name)+(f.isDirectory()?ab:"");for(let f of d.sort((m,p)=>We(u(m),u(p)))){t.signal.throwIfAborted();let m=ib(c,f.name),p=f.isDirectory()&&r?.startsWith(m+ab);if(!(r&&!p&&We(u(f),r)<=0)){if(!p&&++o>t.maxRows){i=!0;break}if(f.isDirectory())await a(m,l+1);else if(f.isFile()){let h=this.format.sessionId(m);h&&s.push({provider:this.format.provider,sessionid:h,source_id:m})}if(s.length>=n){i=!0;break}}}};return await a(this.format.root,0),s.sort((c,l)=>We(c.source_id,l.source_id)),{sources:s.slice(0,n),truncated:i||s.length>n}}async bytes(t,n){if($e(n),t.provider!==this.format.provider||this.format.sessionId(t.source_id)!==t.sessionid)return null;let r=await It(t.source_id,[this.format.root]);if(!r)return null;let s=await on(r,n).catch(()=>(n.signal.throwIfAborted(),null));return s&&{...s,revision:`${this.format.revision}:${s.revision}`}}async inspect(t,n){let r=await this.bytes(t,n);return r?{status:"ready",revision:r.revision}:{status:"partial"}}async read(t,n,r){let s=await this.bytes(t,r);if(!s||s.revision!==n)return{status:"partial"};let o=this.format.decode(s.data,t.sessionid,t.source_id,r);return!o||!o.responses?{status:"partial"}:{status:"complete",source:t,revision:n,checkpoint:null,responses:o.responses,...o.captureStatus?{capture_status:o.captureStatus}:{}}}};function bi(e,t=!0){let n={input_uncached:null,input_cached:null,input_cache_write:null,output:null};if(!t||!e.length||new Set(e.map(r=>r.response_id)).size!==e.length)return n;for(let r of Object.keys(n)){let s=e.map(i=>i.tokens[r]);if(s.some(i=>i===null||!Number.isSafeInteger(i)||i<0))continue;let o=s.reduce((i,a)=>i+a,0);Number.isSafeInteger(o)&&(n[r]=o)}return n}import{readdir as uB}from"node:fs/promises";import{join as Ai,resolve as fB}from"node:path";import{createReadStream as cb}from"node:fs";import{createInterface as lb}from"node:readline";import{stat as lB}from"node:fs/promises";import{homedir as dB}from"node:os";var ge=dB();function db(e){try{let t=JSON.parse(e);return t===null||typeof t!="object"||Array.isArray(t)?void 0:t}catch{return}}async function*ze(e,t){let n=cb(e,{encoding:"utf-8"}),r=lb({input:n,crlfDelay:1/0});try{for await(let s of r){let o=s.trim();if(!o)continue;let i=db(o);i!==void 0?yield i:t?.()}}finally{n.destroy()}}async function vn(e,t){let n=[],r=cb(e,{encoding:"utf-8"}),s=lb({input:r,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(!i)continue;let a=db(i);if(a!==void 0&&n.push(a),n.length>=t)break}}finally{s.close(),r.destroy()}return n}async function dt(e){let t=await lB(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function Ve(e){return e.replace(/\\n/g,`
200
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function de(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}function Dn(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}var ub=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Bd(e){return fB(e||process.env.XDG_DATA_HOME||Ai(ge,".local","share"))}function mB(e){return Ai(Bd(e),"muse","sessions")}function pB(e,t,n,r){let s=r?.input_tokens,o=r?.cache_read_tokens??r?.input_cache_read_tokens,i=r?.cache_write_tokens??r?.input_cache_write_tokens,a=typeof r?.promptTokens=="number"?r.promptTokens:typeof r?.prompt_tokens=="number"?r.prompt_tokens:void 0,c=typeof s=="number"&&typeof o=="number"&&o>s||typeof a=="number"&&typeof o=="number"&&o>a||typeof a=="number"&&typeof i=="number"&&i>a||typeof a=="number"&&typeof o=="number"&&typeof i=="number"&&o+i>a,l=c?null:typeof o=="number"?o:null,d=c?null:typeof i=="number"?i:null,u=null;return c||(typeof r?.input_uncached_tokens=="number"?u=r.input_uncached_tokens:typeof a=="number"&&typeof o=="number"&&typeof i=="number"&&a>=o+i&&(u=a-o-i)),{response_id:e,timestamp:t.toISOString(),model:typeof n=="string"&&n.length>0?n:null,tokens:{input_uncached:typeof u=="number"?u:null,input_cached:typeof l=="number"?l:null,input_cache_write:typeof d=="number"?d:null,output:typeof r?.output_tokens=="number"?r.output_tokens:null},files_read:null,files_written:null}}function mb(e,t){let n,r,s,o,i,a=[],c=new Map,l=new Map,d=new Set,u,f,m=()=>{f="partial"},p=g=>{if(typeof g!="string"||g.length===0){m();return}let w=c.get(g);return w||(w={id:g,turn:{id:g,status:"unknown"},responseIds:[]},c.set(g,w)),w},h=g=>{if(g.retained_frame&&Array.isArray(g.children)){for(let A of g.children)try{if(typeof A?.record_json!="string")throw new Error("missing record_json");h(JSON.parse(A.record_json))}catch{m()}return}if(g.stream?.kind!=="session"||g.stream?.id!==e)return;if(g.schema_version!==1){m();return}if(g.payload_type?.startsWith("runtime.session")&&g.payload_schema_version!==1){m();return}let w=g.payload?.source_run_record_id;for(let A of[g.id,w])if(!(typeof A!="string"||A.length===0)&&d.has(A))return;for(let A of[g.id,w])typeof A=="string"&&A.length>0&&d.add(A);let y=typeof g.recorded_at=="number"&&Number.isFinite(g.recorded_at)?new Date(g.recorded_at/1e3):void 0;if(g.recorded_at!==void 0&&(!y||!Number.isFinite(y.getTime()))){m();return}y&&Number.isFinite(y.getTime())&&((!s||y<s)&&(s=y),(!o||y>o)&&(o=y));let E=g.payload;if(g.payload_type==="runtime.session.metadata"&&(typeof E?.record?.workspace_root=="string"&&(n=E.record.workspace_root),typeof E?.record?.model_id=="string"&&(r=E.record.model_id)),g.payload_type!=="runtime.session"||E?.kind!=="run")return;let T=E.event,b=p(E.run_id);if(!T||!y||!b){T||m();return}if(T.kind==="started"&&typeof T.prompt=="string")a.push({role:"user",content:T.prompt,timestamp:y}),b.turn.startedAt=y,b.turn.prompt=T.prompt,b.turn.status="in_progress",i="in_progress";else if(T.kind==="assistant_message_committed"&&typeof T.text=="string")a.push({role:"assistant",content:T.text,timestamp:y});else if(T.kind==="terminal")b.turn.completedAt=y,b.turn.status=T.terminal==="completed"?"complete":"aborted",i=b.turn.status;else if(T.kind==="model_completed"){typeof T.model=="string"&&T.model.length>0&&(r=T.model,b.turn.model=T.model);let A=typeof w=="string"&&w.length>0?w:typeof g.id=="string"&&g.id.length>0?g.id:void 0;if(!A)m();else{b.responseIds.push(A);let q={};if(T.usage&&typeof T.usage=="object")for(let F of["input_tokens","output_tokens","cached_tokens","reasoning_tokens","input_uncached_tokens","cache_read_tokens","input_cache_read_tokens","cache_write_tokens","input_cache_write_tokens","promptTokens","prompt_tokens"]){let M=T.usage[F];typeof M=="number"&&Number.isSafeInteger(M)&&M>=0&&(q[F]=M)}Object.keys(q).length>0&&(b.turn.rawUsage=[...b.turn.rawUsage??[],{responseId:A,values:q}]),l.set(A,pB(A,y,T.model,q))}if(!T.usage)return;let I={},R=T.usage.input_tokens,L=T.usage.cache_read_tokens??T.usage.input_cache_read_tokens,N=T.usage.cache_write_tokens??T.usage.input_cache_write_tokens,k=typeof T.usage.promptTokens=="number"?T.usage.promptTokens:typeof T.usage.prompt_tokens=="number"?T.usage.prompt_tokens:void 0,D=typeof R=="number"&&typeof L=="number"&&L>R||typeof k=="number"&&typeof L=="number"&&L>k||typeof k=="number"&&typeof N=="number"&&N>k||typeof k=="number"&&typeof L=="number"&&typeof N=="number"&&L+N>k,O=D?void 0:typeof L=="number"?L:void 0,v=D?void 0:typeof N=="number"?N:void 0,S;D||(typeof T.usage.input_uncached_tokens=="number"?S=T.usage.input_uncached_tokens:typeof k=="number"&&typeof L=="number"&&typeof N=="number"&&k>=L+N&&(S=k-L-N)),S!==void 0&&S<0&&(S=void 0);let x=T.usage.output_tokens,C=T.usage.reasoning_tokens;typeof S=="number"&&Number.isSafeInteger(S)&&S>=0&&(I.inputTokens=S),typeof O=="number"&&Number.isSafeInteger(O)&&O>=0&&(I.cachedInputTokens=O),typeof v=="number"&&Number.isSafeInteger(v)&&v>=0&&(I.cacheWriteInputTokens=v),typeof x=="number"&&Number.isSafeInteger(x)&&x>=0&&(I.outputTokens=x),typeof C=="number"&&Number.isSafeInteger(C)&&C>=0&&(I.reasoningOutputTokens=C),u=I}};return{visit:h,finish:()=>{if(!n||!s||!o)return null;let g=a.filter(T=>T.role==="user").map(T=>T.content),w=[...c.values()].map(T=>({...T.turn,...T.responseIds.length>0?{responseIds:[...T.responseIds]}:{}})),y=[...l.values()],E=bi(y,f!=="partial");return{provider:"muse",sessionId:e,filePath:t,cwd:n,createdAt:s,modifiedAt:o,model:r,messages:a,messageCount:a.length,firstUserMessage:g[0],lastUserMessage:g.at(-1),userPrompts:g,turnStatus:i,totalInputTokens:E.input_uncached??void 0,totalCachedInputTokens:E.input_cached??void 0,totalCacheWriteInputTokens:E.input_cache_write??void 0,totalOutputTokens:E.output??void 0,lastTokenUsage:u,turns:w,responses:y,...f?{captureStatus:f}:{}}},markPartial:m}}function hB(e,t,n){let r=mb(t,n);for(let s of e)r.visit(s);return r.finish()}function _B(e,t,n,r){r.signal.throwIfAborted();let s=Math.max(0,r.maxBytes),o=e.length<=s?e:e.subarray(0,Math.max(0,e.subarray(0,s).lastIndexOf(10))),i=o.length!==e.length,a=[],c=i,l=0,d=f=>{if(!f||typeof f!="object"||Array.isArray(f)){c=!0;return}let m=f;if(m.retained_frame&&Array.isArray(m.children)){for(let p of m.children){if(l>=r.maxRows){c=!0;return}let h;try{if(typeof p?.record_json!="string")throw new Error("missing record_json");h=JSON.parse(p.record_json)}catch{c=!0;continue}d(h)}return}if(l>=r.maxRows){c=!0;return}a.push(m),l++};for(let f of o.toString("utf8").split(/\r?\n/u)){if(r.signal.throwIfAborted(),f.trim()==="")continue;let m;try{m=JSON.parse(f)}catch{c=!0;continue}d(m)}let u=hB(a,t,n);return u&&c&&(u.captureStatus="partial"),u}function pb(e){return{provider:"muse",root:mB(e),revision:"muse-session-v2",sessionId:n=>n.replaceAll("\\","/").match(/\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\/session\.jsonl$/iu)?.[1]??null,decode:_B}}async function fb(e,t){let n=mb(e,t);for await(let r of ze(t,n.markPartial))n.visit(r);return n.finish()}var Wd=class{name="muse";dataHome;constructor(t={}){this.dataHome=Bd(t.museDataHome)}get root(){return Ai(this.dataHome,"muse","sessions")}getWatchPaths(){return[{directory:this.root,filePattern:/session\.jsonl$/}]}async files(t=this.root,n=0){let r;try{r=await uB(t,{withFileTypes:!0})}catch{return[]}let s=[];for(let o of r)o.isFile()&&o.name==="session.jsonl"?s.push(Ai(t,o.name)):o.isDirectory()&&n<4&&s.push(...await this.files(Ai(t,o.name),n+1));return s}async resolveSessionPath(t){return ub.test(t)?(await this.files()).find(n=>n.endsWith(Ai(t,"session.jsonl")))??null:null}async loadSession(t){let n=await this.resolveSessionPath(t);return n?fb(t,n):null}async discoverSessions(){let t=[];for(let n of await this.files())try{let r=n.split(/[\\/]/).at(-2);if(!ub.test(r))continue;let s=await fb(r,n);s&&t.push(s)}catch{}return t}async deleteSession(){return!1}};import{readFile as hb,readdir as gB,rm as EB,stat as _b}from"node:fs/promises";import{basename as yB,join as Ii,resolve as wB}from"node:path";var Tb=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;function Vd(e){return wB(e||process.env.MINIPLAYER_HOME||Ii(process.env.XDG_DATA_HOME||Ii(ge,".local","share"),"miniplayer"))}var Xd=class{name="miniplayer";home;constructor(t={}){this.home=Vd(t.miniplayerHome)}getWatchPaths(){return[{directory:Ii(this.home,"sessions"),filePattern:/\.json$/}]}async discoverSessions(){let t;try{t=await gB(Ii(this.home,"sessions"))}catch{return[]}return(await Promise.all(t.filter(r=>r.endsWith(".json")).map(r=>this.loadSession(r.slice(0,-5))))).filter(r=>r!==null)}async resolveSessionPath(t){if(!Tb.test(t))return null;let n=Ii(this.home,"sessions",`${t}.json`);try{return(await _b(n)).isFile()?n:null}catch{return null}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;try{let r=vb(JSON.parse(await hb(n,"utf8")),t,n);if(!r)return null;let s="complete";try{let o=JSON.parse(await hb(`${n}.lock`,"utf8"));if(Number.isInteger(o.pid)&&o.pid>0)try{process.kill(o.pid,0),s="in_progress"}catch{s="aborted"}}catch{}return{...r,...s!=="complete"?{turnStatus:s}:{}}}catch{return null}}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;try{throw await _b(`${n}.lock`),new Error("Cannot delete a locked miniplayer session")}catch(r){if(r.code!=="ENOENT")throw r}return await EB(n),!0}};function Gd(e){if(typeof e=="string")return e;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function Uh(e){return!e||typeof e!="object"?"tool":typeof e.toolName=="string"?e.toolName:typeof e.name=="string"?e.name:"tool"}function gb(e){if(!e||typeof e!="object")return null;let t=e.toolCallId??e.id;return typeof t=="string"&&t.length>0?t:null}function Eb(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function yb(e){if(typeof e!="string")return null;try{let t=new URL(e);return t.username="",t.password="",t.search="",t.hash="",t.toString()}catch{return null}}function wb(e){let t=e.usage&&typeof e.usage=="object"&&!Array.isArray(e.usage)?e.usage:{},n={};for(let[c,l]of Object.entries(t))pe(l)!==null&&(n[c]=l);let r=pe(t.inputTokens),s=pe(t.cachedInputTokens),o=pe(e.cacheWriteInputTokens??t.cacheWriteInputTokens),i=pe(t.outputTokens),a=null;return e.usageConvention==="input-includes-cache"&&r!==null&&s!==null&&s<=r&&(a=r-s),e.usageConvention==="input-excludes-cache"&&r!==null&&o!==null&&(a=r+o),e.usageConvention==="synthetic"&&r===0&&s===0&&(o===0||o===null)&&i===0&&(a=0),{tokens:{input_uncached:a,input_cached:s,input_cache_write:o,output:i},rawUsage:n,pricingFacts:pe(t.reasoningTokens)===null?null:{reasoning_output_tokens:pe(t.reasoningTokens)}}}function vb(e,t,n){if(!e||typeof e!="object")return null;let r=e;if(![1,2].includes(r.version)||r.id!==t||typeof r.cwd!="string")return null;let s=p=>{if(typeof p!="string")return;let h=new Date(p);return Number.isFinite(h.getTime())?h:void 0},o=s(r.createdAt),i=s(r.updatedAt);if(!o||!i)return null;let a=[],c=[],l=[],d=r.version===1,u="complete";if(r.version===1){if(!Array.isArray(r.messages))return null;for(let p of r.messages){if(!p||!["user","assistant"].includes(p.role)||typeof p.content!="string")return null;a.push({role:p.role,content:p.content,timestamp:s(p.timestamp)??i})}}else{if(!Array.isArray(r.turns))return null;let p=new Set,h=new Set;for(let _ of r.turns){if(!_||typeof _.responseId!="string"||!_.responseId||typeof _.input?.text!="string")return null;if(p.has(_.responseId)){d=!0;continue}p.add(_.responseId);let g=s(_.startedAt),w=s(_.completedAt??_.endedAt);if(!g)return null;let y=typeof _.model=="string"?_.model:void 0;["complete","running","failed","aborted"].includes(_.status)||(d=!0);let E=_.status==="complete"?"complete":_.status==="running"?"in_progress":_.status==="failed"?"failed":_.status==="aborted"?"aborted":"unknown";u=E==="failed"||E==="unknown"?"aborted":E,(E!=="complete"||_.partial===!0)&&(d=!0);let T=Array.isArray(_.modelResponses),b=T?_.modelResponses:[],A=[];c.push({id:_.responseId,startedAt:g,completedAt:w,model:y,prompt:_.input.text,status:E,responseIds:A}),a.push({role:"user",timestamp:g,content:_.input.text});let I=Array.isArray(_.toolEvents)&&_.toolEvents.length>0;if(!T&&!I){let D=_.usage??{},O=wb({..._,usage:D});Object.keys(O.rawUsage).length&&(c.at(-1).rawUsage=[{responseId:_.responseId,values:O.rawUsage}]),A.push(_.responseId),l.push({response_id:_.responseId,timestamp:(w??g).toISOString(),model:y??null,model_provider:typeof _.provider=="string"?_.provider:null,tokens:O.tokens,files_read:[],files_written:[],read_bytes:Buffer.byteLength(_.input.text,"utf8"),write_bytes:0,external_io:[{direction:"read",kind:"prompt",id:_.responseId,ref:null,bytes:Buffer.byteLength(_.input.text,"utf8"),basis:"input_text"}],pricing_facts:O.pricingFacts}),E!=="complete"&&!_.usage&&(d=!0),typeof _.output?.text=="string"&&a.push({role:"assistant",timestamp:w??g,content:_.output.text,model:y});continue}let R=new Map,L=new Map,N=new Set,k=[];for(let D of b){if(!D||typeof D!="object"||typeof D.responseId!="string"||!D.responseId){d=!0;continue}if(A.includes(D.responseId)){d=!0;continue}let O=D,v=k.length;k.push({response:O,index:v,filesRead:[],filesWritten:[],io:[]}),A.push(D.responseId),h.has(D.responseId)&&(d=!0),h.add(D.responseId),O.toolCalls!==void 0&&!Array.isArray(O.toolCalls)&&(d=!0,k[v].io.push({direction:"read",kind:"unattributed",id:D.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:D.responseId,ref:null,bytes:null,basis:"unknown"}));for(let S of Array.isArray(O.toolCalls)?O.toolCalls:[]){let x=gb(S),C=Uh(S);if(x)R.set(x,v),L.set(x,C);else{d=!0;let q=C==="list_directory"||C==="read_file"||C==="webget"||C==="shell"||C==="tool",F=C==="write_file"||C==="shell"||C==="tool";q&&k[v].io.push({direction:"read",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"}),F&&k[v].io.push({direction:"write",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"})}}}A.length===0&&b.length>0&&(d=!0);for(let D of Array.isArray(_.toolEvents)?_.toolEvents:[]){let O=D&&typeof D=="object"?D:{},v=gb(O),S=v?R.get(v):void 0,x=Uh(O),C=Eb(O.result),q=O.status==="failed"||O.error!==void 0;if(O.type==="tool_call"?a.push({role:"tool_use",timestamp:s(O?.timestamp)??g,content:Gd(O?.input??O?.args),toolName:x,toolInput:Gd(O?.input??O?.args),toolInputData:Eb(O?.input??O?.args)??void 0,...v?{toolCallId:v}:{}}):a.push({role:"tool_result",timestamp:s(O?.timestamp)??w??g,content:Gd(q?O?.error:O?.result),toolName:x,...v?{toolCallId:v}:{}}),S===void 0){d=!0;continue}let F=k[S];(O.type==="tool_result"||q||O.result!==void 0)&&N.add(v);let M=C?.path,$=pe(C?.bytesRead??C?.bytesWritten);O.type!=="tool_call"&&(x==="read_file"&&!q&&typeof M=="string"&&$!==null?F.filesRead.push({path:M,bytes:$}):x==="write_file"&&!q&&typeof M=="string"&&$!==null?F.filesWritten.push({path:M,bytes:$}):x==="webget"&&!q&&$!==null?F.io.push({direction:"read",kind:"web",id:v,ref:yb(C?.finalUrl??C?.url),bytes:$,basis:"certified_counter"}):x==="shell"||q?(x!=="write_file"&&F.io.push({direction:"read",kind:"unattributed",id:v,ref:null,bytes:null,basis:"unknown"}),(x==="shell"||x==="write_file")&&F.io.push({direction:"write",kind:"unattributed",id:v,ref:null,bytes:null,basis:"unknown"})):x==="list_directory"||x==="read_file"||x==="webget"?F.io.push({direction:"read",kind:x==="webget"?"web":"unattributed",id:v,ref:x==="webget"?yb(C?.finalUrl??C?.url):null,bytes:null,basis:"unknown"}):x==="write_file"?F.io.push({direction:"write",kind:"unattributed",id:v,ref:null,bytes:null,basis:"unknown"}):F.io.push({direction:"read",kind:"unattributed",id:v,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:v,ref:null,bytes:null,basis:"unknown"}))}for(let[D,O]of L)if(!N.has(D)){let v=k[R.get(D)],S=O==="list_directory"||O==="read_file"||O==="webget"||O==="shell",x=O==="write_file"||O==="shell";S&&v.io.push({direction:"read",kind:"unattributed",id:D,ref:null,bytes:null,basis:"unknown"}),x&&v.io.push({direction:"write",kind:"unattributed",id:D,ref:null,bytes:null,basis:"unknown"}),d=!0}for(let D of k){let O=D.response,v=wb(O),S=s(O.completedAt??O.startedAt)??w??g;new Set((Array.isArray(O.toolCalls)?O.toolCalls:[]).map(F=>Uh(F))).has("shell")&&!D.io.some(F=>F.kind==="unattributed"&&F.direction==="read")&&D.io.push({direction:"read",kind:"unattributed",id:O.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:O.responseId,ref:null,bytes:null,basis:"unknown"}),D.index===0&&D.io.unshift({direction:"read",kind:"prompt",id:_.responseId,ref:null,bytes:Buffer.byteLength(_.input.text,"utf8"),basis:"input_text"});let C=D.io.some(F=>F.direction==="read"&&F.bytes===null),q=D.io.some(F=>F.direction==="write"&&F.bytes===null);if(l.push({response_id:O.responseId,timestamp:S.toISOString(),model:typeof O.model=="string"?O.model:null,model_provider:typeof O.provider=="string"?O.provider:typeof _.provider=="string"?_.provider:null,tokens:v.tokens,files_read:C?null:D.filesRead,files_written:q?null:D.filesWritten,read_bytes:C?null:D.filesRead.reduce((F,M)=>F+(M.bytes??0),0)+D.io.filter(F=>F.direction==="read").reduce((F,M)=>F+(M.bytes??0),0),write_bytes:q?null:D.filesWritten.reduce((F,M)=>F+(M.bytes??0),0)+D.io.filter(F=>F.direction==="write").reduce((F,M)=>F+(M.bytes??0),0),external_io:D.io,pricing_facts:v.pricingFacts}),Object.keys(v.rawUsage).length){let F=c.at(-1);F.rawUsage=[...F.rawUsage??[],{responseId:O.responseId,values:v.rawUsage}]}}c.at(-1).responseIds=A,A.length!==b.length&&(d=!0),typeof _.output?.text=="string"&&a.push({role:"assistant",timestamp:w??g,content:_.output.text,model:y})}}let f=a.filter(p=>p.role==="user").map(p=>p.content),m=bi(l,!d);return{provider:"miniplayer",sessionId:t,cwd:r.cwd,filePath:n,createdAt:o,modifiedAt:i,model:typeof r.model=="string"?r.model:void 0,messages:a,messageCount:a.length,userPrompts:f,firstUserMessage:f[0],lastUserMessage:f.at(-1),turns:c,responses:l,turnStatus:u,...d?{captureStatus:"partial"}:{},totalInputTokens:m.input_uncached??void 0,totalCachedInputTokens:m.input_cached??void 0,totalCacheWriteInputTokens:m.input_cache_write??void 0,totalOutputTokens:m.output??void 0}}function Jd(e){return{provider:"miniplayer",root:Ii(Vd(e),"sessions"),revision:"miniplayer-data-v3",sessionId(t){let n=yB(t,".json");return t.endsWith(".json")&&Tb.test(n)?n:null},decode(t,n,r,s){s.signal.throwIfAborted();try{let o=JSON.parse(t.toString("utf8"));return(Array.isArray(o.turns)?o.turns.reduce((a,c)=>a+1+(Array.isArray(c?.modelResponses)?c.modelResponses.length:0)+(Array.isArray(c?.toolEvents)?c.toolEvents.length:0),0):Array.isArray(o.messages)?o.messages.length:0)>s.maxRows?null:vb(o,n,r)}catch{return null}}}}import{createHash as e_}from"node:crypto";import{createRequire as EG}from"node:module";import{lstat as yG,readFile as wG,readdir as TG,realpath as Qh,stat as nA}from"node:fs/promises";import{basename as Qd,dirname as vG,isAbsolute as rA,join as Ao,relative as SG,resolve as jr,sep as bG}from"node:path";import{createHash as vB}from"node:crypto";import{createRequire as SB}from"node:module";import{readdir as bB,realpath as AB}from"node:fs/promises";import{basename as Sb,dirname as IB,join as bb,resolve as Ab}from"node:path";var TB=new URL("./cli/index.js",import.meta.url).href,Ts="agy",Yd="agy-tokens-v1",kB=SB(TB);function RB(){return kB("node:sqlite").DatabaseSync}function NB(){return process.env.HOME||process.env.USERPROFILE||""}function So(e){let t=[],n=0,r=()=>{let s=0n,o=0n;for(;;){if(n>=e.length||o>63n)return null;let i=e[n++];if(s|=BigInt(i&127)<<o,o+=7n,!(i&128))break}return s<=BigInt(Number.MAX_SAFE_INTEGER)?Number(s):null};for(;n<e.length;){let s=r();if(s===null)return t;let o=s>>>3,i=s&7;if(o===0)return t;if(i===0){let a=r();if(a===null)return t;t.push({field:o,wire:i,varint:a})}else if(i===1){if(n+8>e.length)return t;n+=8,t.push({field:o,wire:i})}else if(i===5){if(n+4>e.length)return t;n+=4,t.push({field:o,wire:i})}else if(i===2){let a=r();if(a===null||n+a>e.length)return t;t.push({field:o,wire:i,bytes:e.subarray(n,n+a)}),n+=a}else return t}return t}function mr(e,t){return e.find(n=>n.field===t)}function xB(e){let t=new Map;for(let n of e){if(n.field!==20||n.bytes===void 0)continue;let r=So(n.bytes),s=mr(r,1)?.bytes,o=mr(r,2)?.bytes;if(s===void 0||o===void 0)continue;let i=s.toString("utf8");t.has(i)||t.set(i,o.toString("utf8"))}return t}function LB(e){let t=mr(So(e),5)?.bytes;if(t===void 0)return null;let n=mr(So(t),1)?.bytes;if(n===void 0)return null;let r=So(n),s=mr(r,1)?.varint;if(s===void 0)return null;let o=mr(r,2)?.varint??0,i=s*1e3+Math.floor(o/1e6),a=new Date(i);return Number.isFinite(a.getTime())?a.toISOString():null}function CB(e){let t=mr(e,4)?.bytes,n=t!==void 0?So(t):[],r=s=>{let o=mr(n,s)?.varint;return o===void 0?null:pe(o)};return{tokens:{input_uncached:r(2),input_cached:r(5),input_cache_write:r(4),output:r(3)},thinkingOutputTokens:r(9)}}function OB(e){let t=mr(So(e),1)?.bytes;if(t===void 0)return null;let n=So(t),r=xB(n),s=r.get("request_id");if(s===void 0||s.length===0)return null;let o=mr(n,19)?.bytes,i=o!==void 0&&o.length>0?o.toString("utf8"):null,a=r.get("last_step_index"),c=a===void 0?Number.NaN:Number(a),l=Number.isSafeInteger(c)&&c>=0?c:null,{tokens:d,thinkingOutputTokens:u}=CB(n);return{requestId:s,model:i,lastStepIndex:l,tokens:d,thinkingOutputTokens:u}}function Ib(e,t){$e(t);let n=e.prepare("SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) AS total FROM gen_metadata").get(),r=pe(n?.total);if(r===null||r>t.maxBytes)return null;let s=e.prepare("SELECT idx, data FROM gen_metadata ORDER BY idx LIMIT ?").all(t.maxRows+1);if(s.length>t.maxRows)return null;let o=vB("sha256");o.update("rev:").update(Yd).update(`
201
201
  `);let i=[],a=[],c=0;for(let u of s){if(t.signal.throwIfAborted(),!(u.data instanceof Uint8Array))return null;let f=Buffer.from(u.data);if(c+=f.length,c>t.maxBytes)return null;o.update("g").update(String(u.idx)).update("\0").update(f).update(`
202
202
  `);let m=OB(f);m!==null&&(i.push(m),m.lastStepIndex!==null&&a.push(m.lastStepIndex))}let l=new Map,d=[...new Set(a)].sort((u,f)=>u-f);for(let u of d){t.signal.throwIfAborted();let m=e.prepare("SELECT idx, step_payload FROM steps WHERE idx = ?").get(u)?.step_payload;if(!(m instanceof Uint8Array))continue;let p=Buffer.from(m);if(c+=p.length,c>t.maxBytes)return null;o.update("s").update(String(u)).update("\0").update(p).update(`
203
- `);let h=LB(p);h!==null&&l.set(u,h)}return{revision:`${dc}+${Yd}:sha256:${o.digest("hex")}`,generations:i,timestamps:l}}function DB(e){return e.generations.map(t=>({response_id:t.requestId,timestamp:t.lastStepIndex===null?null:e.timestamps.get(t.lastStepIndex)??null,model:t.model,tokens:t.tokens,files_read:null,files_written:null,external_io:null,read_bytes:null,write_bytes:null,model_provider:null,pricing_facts:fr({reasoning:t.thinkingOutputTokens},t.tokens.output,t.tokens.input_cache_write)}))}var uc=class{conversationsDir;sqliteBusyTimeoutMs;constructor(t={}){this.conversationsDir=Ab(t.agyConversationsDir??bb(NB(),".gemini","antigravity-cli","conversations")),this.sqliteBusyTimeoutMs=t.sqliteBusyTimeoutMs??5e3}async discover(t,n,r=null){$e(t);let s=await bB(this.conversationsDir,{withFileTypes:!0}).catch(()=>[]),o=[];for(let i of s){if(t.signal.throwIfAborted(),!i.isFile()||i.isSymbolicLink()||!i.name.endsWith(".db"))continue;let a=await AB(bb(this.conversationsDir,i.name)).catch(()=>null);a!==null&&(r!==null&&We(a,r)<=0||o.push(a))}return o.sort(We),{sources:o.slice(0,n).map(i=>({provider:Ts,sessionid:Sb(i,".db"),source_id:i})),truncated:!1}}async open(t){let n=await At(t.source_id,[this.conversationsDir]);if(n===null||Sb(n,".db")!==t.sessionid||Ab(IB(n))!==this.conversationsDir)return null;try{let r=new(RB())(n,{open:!0,readOnly:!0});return r.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),r}catch{return null}}async inspect(t,n){if($e(n),t.provider!==Ts)return{status:"unsupported"};let r=await this.open(t);if(r===null)return{status:"unavailable"};try{let s=Ib(r,n);return s?{status:"ready",revision:s.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}async read(t,n,r){if($e(r),t.provider!==Ts)return{status:"unsupported"};let s=await this.open(t);if(s===null)return{status:"unavailable"};try{s.exec("BEGIN");let o=Ib(s,r);if(o===null||o.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let i=DB(o);return s.exec("COMMIT"),{status:"complete",source:t,revision:n,checkpoint:n,responses:i}}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function kb(e={}){return new uc(e)}import{readdir as XB,realpath as VB}from"node:fs/promises";import{basename as Fh,dirname as Nb,join as Cb,resolve as Ob}from"node:path";import JB from"node:zlib";import $B from"node:zlib";var MB=$B.zstdDecompressSync,PB=40,UB=181,FB=47,jB=253,qB=42,HB=77,WB=24;function BB(e,t){return e[t]===PB&&e[t+1]===UB&&e[t+2]===FB&&e[t+3]===jB}function Rb(e,t){return(e[t]&240)===80&&e[t+1]===qB&&e[t+2]===HB&&e[t+3]===WB}function GB(e,t){if(Rb(e,t))return t+8>e.length?void 0:8+e.readUInt32LE(t+4);if(!BB(e,t))return;let n=t+4;if(n+1>e.length)return;let r=e[n];n+=1;let s=r>>6,o=(r&32)!==0,i=(r&4)!==0,a=r&3;o||(n+=1),n+=[0,1,2,4][a];let c=s===0?o?1:0:[2,4,8][s-1];if(n+=c,!(n>e.length)){for(;;){if(n+3>e.length)return;let l=e[n]|e[n+1]<<8|e[n+2]<<16,d=(l&1)!==0,u=l>>1&3,f=l>>3;if(n+=3,u===3||(n+=u===1?1:f,n>e.length))return;if(d)break}if(i&&(n+=4),!(n>e.length))return n-t}}function fc(e){let t=[],n=0;for(;n+4<=e.length;){let r=GB(e,n);if(r===void 0||r<=0)break;t.push(e.subarray(n,n+r)),n+=r}return t}function Kd(e){let t=[];for(let n of fc(e))Rb(n,0)||t.push(MB(n).toString("utf8"));return t.join("")}var vs="dsh",YB=JB.zstdDecompressSync;function Db(e){return/^session(\.v\d+)?\.jsonl\.zstd$/.test(e)}var KB=5e5,zB=new Set(["read","read_image"]),QB=new Set(["write","edit"]),ZB=new Set(["create_goal","get_goal","update_goal","todo_write","ask_user_question","exit_plan_mode","list_agents","interrupt_agent","job_list","job_kill","job_output"]);function e2(e){return ZB.has(e)||ws(e)}function t2(){return process.env.HOME||process.env.USERPROFILE||""}function n2(e){if(typeof e=="string")return Buffer.byteLength(e,"utf8");if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let s=ie(r);s?.type==="text"&&typeof s.text=="string"&&(t+=Buffer.byteLength(s.text,"utf8"),n=!0)}return n?t:null}function xb(e){if(!e)return null;let t=pe(e.inputTokens),n=pe(e.outputTokens);if(t===null||n===null)return null;let r=e.cacheReadTokens===void 0?null:pe(e.cacheReadTokens);return{input_uncached:t,input_cached:r,input_cache_write:null,output:n}}function r2(e){return e.length>=4&&(e[0]&240)===80&&e[1]===42&&e[2]===77&&e[3]===24}function s2(e,t){let n=fc(e),r=0;for(let i of n)r+=i.length;if(r!==e.length)return{text:"",truncated:!0};let s=[],o=0;for(let i of n){if(t.signal.throwIfAborted(),r2(i))continue;if(i.length>t.maxBytes)return{text:s.join(""),truncated:!0};let a;try{a=YB(i)}catch{return{text:s.join(""),truncated:!0}}if(o+=a.length,o>t.maxBytes)return{text:s.join(""),truncated:!0};s.push(a.toString("utf8"))}return{text:s.join(""),truncated:!1}}function o2(e){let t=[];for(let n of e.split(`
204
- `)){if(!n.trim())continue;let r;try{r=JSON.parse(n)}catch{continue}let s=typeof r.type=="string"?r.type:"";s.endsWith("-chunks")||s==="assistant/chunk"&&ie(ie(r.data)?.chunk)?.type!=="usage"||t.push(r)}return t}function i2(e){if(typeof e=="string")try{return ie(JSON.parse(e))}catch{return null}return ie(e)}function Lb(e,t){return typeof e!="number"||typeof t!="number"?null:`${e}\0${t}`}function a2(e,t,n,r){let s=new Map,o=[],i=new Set,a=new Map,c=null,l=null,d=null;for(let f of e){r.signal.throwIfAborted();let m=ie(f.data);if(f.type==="assistant/chunk"){let p=ie(m?.chunk),h=ie(p?.usage),_=Lb(m?.turn,m?.step);h&&_!==null&&typeof m?.turn=="number"&&typeof m?.step=="number"&&a.set(_,{turn:m.turn,step:m.step,usage:h,time:f.time});continue}if(f.type==="request/header"){let p=ie(ie(m?.header)?.config);typeof p?.provider=="string"&&p.provider&&(c=p.provider),typeof p?.model=="string"&&p.model&&(l=p.model);continue}if(f.type==="user/message"){if(ie(m?.source)?.kind!=="user")continue;let h=typeof m?.id=="string"&&m.id?m.id:null;o.push({id:h,bytes:n2(m?.content)});continue}if(f.type==="assistant/message"){let p=ie(m?.message),h=ie(p?.source),_=typeof p?.id=="string"&&p.id?p.id:null,g=Lb(m?.turn,m?.step),w;if(g!==null)i.add(g),w=`dsh:turn-step:${m.turn}/${m.step}`;else{if(ie(m?.usage))return{status:"partial"};w=_}if(w===null)return{status:"partial"};let y=xb(ie(m?.usage)),E=s.get(w);if(!E){if(E={meta:{response_id:w,timestamp:Tn(typeof f.time=="number"?f.time:null),model:(typeof h?.model=="string"&&h.model?h.model:null)??l,tokens:y??{...sn},files_read:[],files_written:[]},obs:new yn,io:new wn,reasoning:null,provider:typeof h?.provider=="string"&&h.provider?h.provider:null},s.set(w,E),s.size>r.maxRows)return{status:"partial"};for(let T of o)E.io.record({direction:"read",kind:"prompt",id:T.id,ref:null,bytes:T.bytes,basis:T.bytes===null?"unknown":"input_text"});o.length=0}if(y){E.meta.tokens=y;let T=pe(ie(m?.usage)?.reasoningTokens);T!==null&&(E.reasoning=T)}d=w;continue}if(f.type==="tool/call"){let p=d!==null?s.get(d):void 0;if(!p)continue;let h=typeof m?.callId=="string"&&m.callId?m.callId:null,_=typeof m?.name=="string"?m.name.toLowerCase():"",g=i2(m?.arguments),w=(typeof g?.file_path=="string"&&g.file_path?g.file_path:null)??(typeof g?.path=="string"&&g.path?g.path:null);zB.has(_)?w!==null?p.obs.record(h??"","read",w,null):at(p.io,h):QB.has(_)?w!==null?p.obs.record(h??"","written",w,vi(g)):at(p.io,h):e2(_)||at(p.io,h);continue}}for(let[f,{turn:m,step:p,usage:h,time:_}]of a){if(i.has(f))continue;r.signal.throwIfAborted();let g=xb(h),w=new wn;at(w,null);let y={meta:{response_id:`dsh:turn-step:${m}/${p}`,timestamp:Tn(typeof _=="number"?_:null),model:l,tokens:g??{...sn},files_read:[],files_written:[]},obs:new yn,io:w,reasoning:pe(h.reasoningTokens),provider:c};if(s.set(y.meta.response_id,y),s.size>r.maxRows)return{status:"partial"}}let u=[];for(let{meta:f,obs:m,io:p,reasoning:h,provider:_}of s.values()){let g=m.files("read"),w=m.files("written"),y=p.entries();u.push({...f,files_read:g,files_written:w,external_io:y,read_bytes:Xt(g,y,"read"),write_bytes:Xt(w,y,"written"),model_provider:c??_,pricing_facts:fr({reasoning:h??void 0},f.tokens.output,f.tokens.input_cache_write)})}return{status:"complete",source:t,revision:n,checkpoint:n,responses:u}}var jh=class{sessionsDir;maxDiscoveryTraversalVisits;constructor(t={}){let n=t.dshHome??process.env.DSH_HOME??Cb(t2(),".dsh");this.sessionsDir=Ob(n,"sessions"),this.maxDiscoveryTraversalVisits=t.maxDiscoveryTraversalVisits&&t.maxDiscoveryTraversalVisits>0?Math.trunc(t.maxDiscoveryTraversalVisits):KB}async discover(t,n,r=null){$e(t);let{paths:s,truncated:o}=await c2(this.sessionsDir,n,this.maxDiscoveryTraversalVisits,t,r);return{sources:s.map(i=>({provider:vs,sessionid:Fh(Nb(i)),source_id:i})),truncated:o}}matches(t,n){return Db(Fh(n))&&Fh(Nb(n))===t.sessionid}async inspect(t,n){if($e(n),t.provider!==vs)return{status:"unsupported"};let r=await At(t.source_id,[this.sessionsDir]);if(!r||!this.matches(t,r))return{status:"unavailable"};let s=await on(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(t,n,r){if($e(r),t.provider!==vs)return{status:"unsupported"};let s=await At(t.source_id,[this.sessionsDir]);if(!s||!this.matches(t,s))return{status:"unavailable"};let o=await on(s,r).catch(()=>null);if(!o)return{status:"partial"};if(o.revision!==n)return{status:"partial"};let{text:i,truncated:a}=s2(o.data,r);return a?{status:"partial"}:a2(o2(i),t,n,r)}};async function c2(e,t,n,r,s){let o=[],i=0,a=!1;async function c(l,d){r.signal.throwIfAborted();let u=await XB(l,{withFileTypes:!0}).catch(()=>[]);u.sort((f,m)=>We(f.name,m.name));for(let f of u){if(r.signal.throwIfAborted(),o.length>=t)return;if(i+=1,i>n){a=!0;return}let m=Cb(l,f.name);if(f.isDirectory()&&!f.isSymbolicLink()&&d<2){if(await c(m,d+1),a||o.length>=t)return}else if(f.isFile()&&Db(f.name)){let p=await VB(m).catch(()=>Ob(m));(s===null||We(p,s)>0)&&o.push(p)}}}return await c(e,0),{paths:o.sort(We),truncated:a}}function $b(e={}){return new jh(e)}import{readdir as l2,realpath as d2}from"node:fs/promises";import{basename as zd,dirname as u2,join as qh,resolve as Mb}from"node:path";var Ss="qwen",f2="qwen-code.api_response",m2="qwen-code.tool_call",Pb="chats",p2=new Set(["read_file"]),h2=new Set(["write_file"]),_2=5e5;function g2(){return process.env.HOME||process.env.USERPROFILE||""}function E2(){let e=g2();return[qh(e,".qwen","projects"),qh(e,".qwen.bk1","projects")]}function y2(e){return e.type!=="system"||e.subtype!=="ui_telemetry"?null:ie(ie(e.systemPayload)?.uiEvent)}function w2(e){let t=e["event.name"];return typeof t=="string"&&t.length>0?t:null}function T2(e){let t=pe(e.input_token_count),n=pe(e.output_token_count),r=pe(e.cached_content_token_count),s=pe(e.total_token_count);if(t===null||n===null||r===null||s===null||r>t||t+n!==s)return null;let o=e.thoughts_token_count===void 0?null:pe(e.thoughts_token_count);return e.thoughts_token_count!==void 0&&(o===null||o>n)?null:{input_uncached:t-r,input_cached:r,input_cache_write:null,output:n}}function v2(e){let t=ie(e)?.parts;if(!Array.isArray(t))return null;let n=0,r=!1;for(let s of t){let o=ie(s);!o||o.thought===!0||typeof o.text=="string"&&(n+=Buffer.byteLength(o.text,"utf8"),r=!0)}return r?n:null}function S2(e){let t=new Map,n=new Set,r=new Map;for(let i of e){let a=typeof i.uuid=="string"&&i.uuid?i.uuid:null;if(a!==null&&(t.set(a,typeof i.parentUuid=="string"&&i.parentUuid?i.parentUuid:null),i.type==="user")){n.add(a);let c=v2(i.message);c!==null&&r.set(a,c)}}let s=new Map;return{promptBytes:r,resolve:i=>{let a=[],c=new Set,l=i,d;for(;;){let u=s.get(l);if(u){d=u;break}if(n.has(l)){d={kind:"found",uuid:l};break}if(!t.has(l)){d={kind:"broken"};break}if(c.has(l)){d={kind:"broken"};break}c.add(l),a.push(l);let f=t.get(l)??null;if(f===null){d={kind:"clean"};break}l=f}for(let u of a)s.set(u,d);return d}}}function b2(e,t,n,r){let{promptBytes:s,resolve:o}=S2(e),i=new Set,a=new Map,c=0;for(let d of e){r.signal.throwIfAborted();let u=y2(d);if(u===null)continue;let f=w2(u);if(f===f2){let w=typeof u.response_id=="string"&&u.response_id?u.response_id:null;if(w===null)return{status:"unsupported"};let y=T2(u);if(y===null)return{status:"partial"};let E=a.get(w);if(!E){if(E={meta:{response_id:w,timestamp:Tn(u["event.timestamp"]??d.timestamp),model:typeof u.model=="string"&&u.model?u.model:null,tokens:{...sn},files_read:[],files_written:[]},obs:new yn,io:new wn,thoughts:null},a.set(w,E),a.size>r.maxRows)return{status:"partial"};let b=typeof d.uuid=="string"&&d.uuid?d.uuid:null,A=b===null?{kind:"broken"}:o(b);if(A.kind==="broken")E.io.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"});else if(A.kind==="found"&&!i.has(A.uuid)){i.add(A.uuid);let I=s.get(A.uuid)??null;E.io.record({direction:"read",kind:"prompt",id:A.uuid,ref:null,bytes:I,basis:I===null?"unknown":"input_text"})}}E.meta.tokens=y,typeof u.model=="string"&&u.model&&(E.meta.model=u.model);let T=pe(u.thoughts_token_count);T!==null&&(E.thoughts=T);continue}if(f!==m2)continue;let m=typeof u.response_id=="string"&&u.response_id?u.response_id:null;if(m===null)continue;let p=a.get(m);if(p===void 0)return{status:"partial"};let h=typeof u.function_name=="string"?u.function_name.toLowerCase():"",_=ie(u.function_args),g=`tool-${c++}`;if(p2.has(h)){let w=typeof _?.file_path=="string"?_.file_path:null;w!==null?p.obs.record(g,"read",w,null):at(p.io,g)}else if(h2.has(h)){let w=typeof _?.file_path=="string"?_.file_path:null;w!==null?p.obs.record(g,"written",w,vi(_)):at(p.io,g)}else ws(h)||at(p.io,g)}let l=[];for(let{meta:d,obs:u,io:f,thoughts:m}of a.values()){let p=u.files("read"),h=u.files("written"),_=f.entries();l.push({...d,files_read:p,files_written:h,external_io:_,read_bytes:Xt(p,_,"read"),write_bytes:Xt(h,_,"written"),model_provider:null,pricing_facts:fr({reasoning:m??void 0},d.tokens.output,d.tokens.input_cache_write)})}return{status:"complete",source:t,revision:n,checkpoint:n,responses:l}}async function A2(e,t,n,r,s){let o=[],i=0,a=!1;async function c(l){r.signal.throwIfAborted();let d=await l2(l,{withFileTypes:!0}).catch(()=>[]);d.sort((u,f)=>We(u.name,f.name));for(let u of d){if(r.signal.throwIfAborted(),o.length>=t)return;if(i+=1,i>n){a=!0;return}let f=qh(l,u.name);if(u.isDirectory()&&!u.isSymbolicLink()){if(await c(f),a||o.length>=t)return}else if(u.isFile()&&u.name.endsWith(".jsonl")&&zd(l)===Pb){let m=await d2(f).catch(()=>Mb(f));(s===null||We(m,s)>0)&&o.push(m)}}}return await c(e),{paths:o.sort(We),truncated:a}}function I2(e,t){for(let n of e){let r=n.sessionId;if(typeof r=="string"&&r.length>0&&r!==t)return!1}return!0}var Hh=class{roots;maxDiscoveryTraversalVisits;constructor(t={}){this.roots=(t.qwenProjectsDirs??E2()).map(n=>Mb(n)),this.maxDiscoveryTraversalVisits=t.maxDiscoveryTraversalVisits&&t.maxDiscoveryTraversalVisits>0?Math.trunc(t.maxDiscoveryTraversalVisits):_2}async discover(t,n,r=null){$e(t);let s=new Map,o=!1;for(let a of this.roots){t.signal.throwIfAborted();let c=await A2(a,n,this.maxDiscoveryTraversalVisits,t,r);c.truncated&&(o=!0);for(let l of c.paths)s.set(l,l)}return{sources:[...s.keys()].sort(We).slice(0,n).map(a=>({provider:Ss,sessionid:zd(a,".jsonl"),source_id:a})),truncated:o}}matches(t,n){return zd(n,".jsonl")===t.sessionid&&zd(u2(n))===Pb}async inspect(t,n){if($e(n),t.provider!==Ss)return{status:"unsupported"};let r=await At(t.source_id,[...this.roots]);if(!r||!this.matches(t,r))return{status:"unavailable"};let s=await on(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(t,n,r){if($e(r),t.provider!==Ss)return{status:"unsupported"};let s=await At(t.source_id,[...this.roots]);if(!s||!this.matches(t,s))return{status:"unavailable"};let o=await on(s,r).catch(()=>null);if(!o)return{status:"partial"};if(o.revision!==n)return{status:"partial"};let i=Hd(o.data,r);return i?I2(i,t.sessionid)?b2(i,t,n,r):{status:"unavailable"}:{status:"partial"}}};function Ub(e={}){return new Hh(e)}import{createHash as R2}from"node:crypto";import{createRequire as N2}from"node:module";import{join as mc,resolve as Wh}from"node:path";var k2=new URL("./cli/index.js",import.meta.url).href,bo="opencode",x2=N2(k2);function L2(){return x2("node:sqlite").DatabaseSync}function Fb(){return process.env.HOME||process.env.USERPROFILE||""}function C2(){let e=process.env.XDG_DATA_HOME||mc(Fb(),".local","share"),t=process.env.XDG_CONFIG_HOME||mc(Fb(),".config");return[mc(e,"opencode","opencode.db"),mc(e,"opencode","opencode-local.db"),mc(t,"opencode","opencode.db")]}var O2=["read","read_file","view","view_file","view_image"],D2=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],$2=["filePath","path","file","file_path","filepath","notebook_path","paths"],M2=new Set(["session-job-notification"]);function P2(e){if(typeof e!="string")return null;let t=e.toLowerCase();return t==="apply_patch"?"apply_patch":O2.includes(t)?"read":D2.includes(t)?"written":null}function jb(e,t=$2){let n=ie(e);if(!n)return null;for(let r of t){let s=n[r];if(typeof s=="string"&&s.length>0)return s;if(Array.isArray(s)){for(let o of s)if(typeof o=="string"&&o.length>0)return o}}return null}function U2(e){let t=ie(e);if(!t)return null;if(typeof t.content=="string")return Buffer.byteLength(t.content,"utf8");if(typeof t.newString=="string")return Buffer.byteLength(t.newString,"utf8");if(typeof t.new_string=="string")return Buffer.byteLength(t.new_string,"utf8");if(typeof t.newSource=="string")return Buffer.byteLength(t.newSource,"utf8");if(Array.isArray(t.edits)){let n=0;for(let r of t.edits){let s=ie(r),o=s?.newString??s?.new_string;if(typeof o!="string")return null;n+=Buffer.byteLength(o,"utf8")}return n}return null}function F2(e){let t=new Map,n=null,r=()=>{n&&(t.set(n.path,(t.get(n.path)??0)+n.bytes),n=null)};for(let s of e.split(`
203
+ `);let h=LB(p);h!==null&&l.set(u,h)}return{revision:`${dc}+${Yd}:sha256:${o.digest("hex")}`,generations:i,timestamps:l}}function DB(e){return e.generations.map(t=>({response_id:t.requestId,timestamp:t.lastStepIndex===null?null:e.timestamps.get(t.lastStepIndex)??null,model:t.model,tokens:t.tokens,files_read:null,files_written:null,external_io:null,read_bytes:null,write_bytes:null,model_provider:null,pricing_facts:fr({reasoning:t.thinkingOutputTokens},t.tokens.output,t.tokens.input_cache_write)}))}var uc=class{conversationsDir;sqliteBusyTimeoutMs;constructor(t={}){this.conversationsDir=Ab(t.agyConversationsDir??bb(NB(),".gemini","antigravity-cli","conversations")),this.sqliteBusyTimeoutMs=t.sqliteBusyTimeoutMs??5e3}async discover(t,n,r=null){$e(t);let s=await bB(this.conversationsDir,{withFileTypes:!0}).catch(()=>[]),o=[];for(let i of s){if(t.signal.throwIfAborted(),!i.isFile()||i.isSymbolicLink()||!i.name.endsWith(".db"))continue;let a=await AB(bb(this.conversationsDir,i.name)).catch(()=>null);a!==null&&(r!==null&&We(a,r)<=0||o.push(a))}return o.sort(We),{sources:o.slice(0,n).map(i=>({provider:Ts,sessionid:Sb(i,".db"),source_id:i})),truncated:!1}}async open(t){let n=await It(t.source_id,[this.conversationsDir]);if(n===null||Sb(n,".db")!==t.sessionid||Ab(IB(n))!==this.conversationsDir)return null;try{let r=new(RB())(n,{open:!0,readOnly:!0});return r.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),r}catch{return null}}async inspect(t,n){if($e(n),t.provider!==Ts)return{status:"unsupported"};let r=await this.open(t);if(r===null)return{status:"unavailable"};try{let s=Ib(r,n);return s?{status:"ready",revision:s.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}async read(t,n,r){if($e(r),t.provider!==Ts)return{status:"unsupported"};let s=await this.open(t);if(s===null)return{status:"unavailable"};try{s.exec("BEGIN");let o=Ib(s,r);if(o===null||o.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let i=DB(o);return s.exec("COMMIT"),{status:"complete",source:t,revision:n,checkpoint:n,responses:i}}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function kb(e={}){return new uc(e)}import{readdir as XB,realpath as VB}from"node:fs/promises";import{basename as Fh,dirname as Nb,join as Cb,resolve as Ob}from"node:path";import JB from"node:zlib";import $B from"node:zlib";var MB=$B.zstdDecompressSync,PB=40,UB=181,FB=47,jB=253,qB=42,HB=77,WB=24;function BB(e,t){return e[t]===PB&&e[t+1]===UB&&e[t+2]===FB&&e[t+3]===jB}function Rb(e,t){return(e[t]&240)===80&&e[t+1]===qB&&e[t+2]===HB&&e[t+3]===WB}function GB(e,t){if(Rb(e,t))return t+8>e.length?void 0:8+e.readUInt32LE(t+4);if(!BB(e,t))return;let n=t+4;if(n+1>e.length)return;let r=e[n];n+=1;let s=r>>6,o=(r&32)!==0,i=(r&4)!==0,a=r&3;o||(n+=1),n+=[0,1,2,4][a];let c=s===0?o?1:0:[2,4,8][s-1];if(n+=c,!(n>e.length)){for(;;){if(n+3>e.length)return;let l=e[n]|e[n+1]<<8|e[n+2]<<16,d=(l&1)!==0,u=l>>1&3,f=l>>3;if(n+=3,u===3||(n+=u===1?1:f,n>e.length))return;if(d)break}if(i&&(n+=4),!(n>e.length))return n-t}}function fc(e){let t=[],n=0;for(;n+4<=e.length;){let r=GB(e,n);if(r===void 0||r<=0)break;t.push(e.subarray(n,n+r)),n+=r}return t}function Kd(e){let t=[];for(let n of fc(e))Rb(n,0)||t.push(MB(n).toString("utf8"));return t.join("")}var vs="dsh",YB=JB.zstdDecompressSync;function Db(e){return/^session(\.v\d+)?\.jsonl\.zstd$/.test(e)}var KB=5e5,zB=new Set(["read","read_image"]),QB=new Set(["write","edit"]),ZB=new Set(["create_goal","get_goal","update_goal","todo_write","ask_user_question","exit_plan_mode","list_agents","interrupt_agent","job_list","job_kill","job_output"]);function e2(e){return ZB.has(e)||ws(e)}function t2(){return process.env.HOME||process.env.USERPROFILE||""}function n2(e){if(typeof e=="string")return Buffer.byteLength(e,"utf8");if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let s=ie(r);s?.type==="text"&&typeof s.text=="string"&&(t+=Buffer.byteLength(s.text,"utf8"),n=!0)}return n?t:null}function xb(e){if(!e)return null;let t=pe(e.inputTokens),n=pe(e.outputTokens);if(t===null||n===null)return null;let r=e.cacheReadTokens===void 0?null:pe(e.cacheReadTokens);return{input_uncached:t,input_cached:r,input_cache_write:null,output:n}}function r2(e){return e.length>=4&&(e[0]&240)===80&&e[1]===42&&e[2]===77&&e[3]===24}function s2(e,t){let n=fc(e),r=0;for(let i of n)r+=i.length;if(r!==e.length)return{text:"",truncated:!0};let s=[],o=0;for(let i of n){if(t.signal.throwIfAborted(),r2(i))continue;if(i.length>t.maxBytes)return{text:s.join(""),truncated:!0};let a;try{a=YB(i)}catch{return{text:s.join(""),truncated:!0}}if(o+=a.length,o>t.maxBytes)return{text:s.join(""),truncated:!0};s.push(a.toString("utf8"))}return{text:s.join(""),truncated:!1}}function o2(e){let t=[];for(let n of e.split(`
204
+ `)){if(!n.trim())continue;let r;try{r=JSON.parse(n)}catch{continue}let s=typeof r.type=="string"?r.type:"";s.endsWith("-chunks")||s==="assistant/chunk"&&ie(ie(r.data)?.chunk)?.type!=="usage"||t.push(r)}return t}function i2(e){if(typeof e=="string")try{return ie(JSON.parse(e))}catch{return null}return ie(e)}function Lb(e,t){return typeof e!="number"||typeof t!="number"?null:`${e}\0${t}`}function a2(e,t,n,r){let s=new Map,o=[],i=new Set,a=new Map,c=null,l=null,d=null;for(let f of e){r.signal.throwIfAborted();let m=ie(f.data);if(f.type==="assistant/chunk"){let p=ie(m?.chunk),h=ie(p?.usage),_=Lb(m?.turn,m?.step);h&&_!==null&&typeof m?.turn=="number"&&typeof m?.step=="number"&&a.set(_,{turn:m.turn,step:m.step,usage:h,time:f.time});continue}if(f.type==="request/header"){let p=ie(ie(m?.header)?.config);typeof p?.provider=="string"&&p.provider&&(c=p.provider),typeof p?.model=="string"&&p.model&&(l=p.model);continue}if(f.type==="user/message"){if(ie(m?.source)?.kind!=="user")continue;let h=typeof m?.id=="string"&&m.id?m.id:null;o.push({id:h,bytes:n2(m?.content)});continue}if(f.type==="assistant/message"){let p=ie(m?.message),h=ie(p?.source),_=typeof p?.id=="string"&&p.id?p.id:null,g=Lb(m?.turn,m?.step),w;if(g!==null)i.add(g),w=`dsh:turn-step:${m.turn}/${m.step}`;else{if(ie(m?.usage))return{status:"partial"};w=_}if(w===null)return{status:"partial"};let y=xb(ie(m?.usage)),E=s.get(w);if(!E){if(E={meta:{response_id:w,timestamp:Tn(typeof f.time=="number"?f.time:null),model:(typeof h?.model=="string"&&h.model?h.model:null)??l,tokens:y??{...sn},files_read:[],files_written:[]},obs:new yn,io:new wn,reasoning:null,provider:typeof h?.provider=="string"&&h.provider?h.provider:null},s.set(w,E),s.size>r.maxRows)return{status:"partial"};for(let T of o)E.io.record({direction:"read",kind:"prompt",id:T.id,ref:null,bytes:T.bytes,basis:T.bytes===null?"unknown":"input_text"});o.length=0}if(y){E.meta.tokens=y;let T=pe(ie(m?.usage)?.reasoningTokens);T!==null&&(E.reasoning=T)}d=w;continue}if(f.type==="tool/call"){let p=d!==null?s.get(d):void 0;if(!p)continue;let h=typeof m?.callId=="string"&&m.callId?m.callId:null,_=typeof m?.name=="string"?m.name.toLowerCase():"",g=i2(m?.arguments),w=(typeof g?.file_path=="string"&&g.file_path?g.file_path:null)??(typeof g?.path=="string"&&g.path?g.path:null);zB.has(_)?w!==null?p.obs.record(h??"","read",w,null):at(p.io,h):QB.has(_)?w!==null?p.obs.record(h??"","written",w,vi(g)):at(p.io,h):e2(_)||at(p.io,h);continue}}for(let[f,{turn:m,step:p,usage:h,time:_}]of a){if(i.has(f))continue;r.signal.throwIfAborted();let g=xb(h),w=new wn;at(w,null);let y={meta:{response_id:`dsh:turn-step:${m}/${p}`,timestamp:Tn(typeof _=="number"?_:null),model:l,tokens:g??{...sn},files_read:[],files_written:[]},obs:new yn,io:w,reasoning:pe(h.reasoningTokens),provider:c};if(s.set(y.meta.response_id,y),s.size>r.maxRows)return{status:"partial"}}let u=[];for(let{meta:f,obs:m,io:p,reasoning:h,provider:_}of s.values()){let g=m.files("read"),w=m.files("written"),y=p.entries();u.push({...f,files_read:g,files_written:w,external_io:y,read_bytes:Xt(g,y,"read"),write_bytes:Xt(w,y,"written"),model_provider:c??_,pricing_facts:fr({reasoning:h??void 0},f.tokens.output,f.tokens.input_cache_write)})}return{status:"complete",source:t,revision:n,checkpoint:n,responses:u}}var jh=class{sessionsDir;maxDiscoveryTraversalVisits;constructor(t={}){let n=t.dshHome??process.env.DSH_HOME??Cb(t2(),".dsh");this.sessionsDir=Ob(n,"sessions"),this.maxDiscoveryTraversalVisits=t.maxDiscoveryTraversalVisits&&t.maxDiscoveryTraversalVisits>0?Math.trunc(t.maxDiscoveryTraversalVisits):KB}async discover(t,n,r=null){$e(t);let{paths:s,truncated:o}=await c2(this.sessionsDir,n,this.maxDiscoveryTraversalVisits,t,r);return{sources:s.map(i=>({provider:vs,sessionid:Fh(Nb(i)),source_id:i})),truncated:o}}matches(t,n){return Db(Fh(n))&&Fh(Nb(n))===t.sessionid}async inspect(t,n){if($e(n),t.provider!==vs)return{status:"unsupported"};let r=await It(t.source_id,[this.sessionsDir]);if(!r||!this.matches(t,r))return{status:"unavailable"};let s=await on(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(t,n,r){if($e(r),t.provider!==vs)return{status:"unsupported"};let s=await It(t.source_id,[this.sessionsDir]);if(!s||!this.matches(t,s))return{status:"unavailable"};let o=await on(s,r).catch(()=>null);if(!o)return{status:"partial"};if(o.revision!==n)return{status:"partial"};let{text:i,truncated:a}=s2(o.data,r);return a?{status:"partial"}:a2(o2(i),t,n,r)}};async function c2(e,t,n,r,s){let o=[],i=0,a=!1;async function c(l,d){r.signal.throwIfAborted();let u=await XB(l,{withFileTypes:!0}).catch(()=>[]);u.sort((f,m)=>We(f.name,m.name));for(let f of u){if(r.signal.throwIfAborted(),o.length>=t)return;if(i+=1,i>n){a=!0;return}let m=Cb(l,f.name);if(f.isDirectory()&&!f.isSymbolicLink()&&d<2){if(await c(m,d+1),a||o.length>=t)return}else if(f.isFile()&&Db(f.name)){let p=await VB(m).catch(()=>Ob(m));(s===null||We(p,s)>0)&&o.push(p)}}}return await c(e,0),{paths:o.sort(We),truncated:a}}function $b(e={}){return new jh(e)}import{readdir as l2,realpath as d2}from"node:fs/promises";import{basename as zd,dirname as u2,join as qh,resolve as Mb}from"node:path";var Ss="qwen",f2="qwen-code.api_response",m2="qwen-code.tool_call",Pb="chats",p2=new Set(["read_file"]),h2=new Set(["write_file"]),_2=5e5;function g2(){return process.env.HOME||process.env.USERPROFILE||""}function E2(){let e=g2();return[qh(e,".qwen","projects"),qh(e,".qwen.bk1","projects")]}function y2(e){return e.type!=="system"||e.subtype!=="ui_telemetry"?null:ie(ie(e.systemPayload)?.uiEvent)}function w2(e){let t=e["event.name"];return typeof t=="string"&&t.length>0?t:null}function T2(e){let t=pe(e.input_token_count),n=pe(e.output_token_count),r=pe(e.cached_content_token_count),s=pe(e.total_token_count);if(t===null||n===null||r===null||s===null||r>t||t+n!==s)return null;let o=e.thoughts_token_count===void 0?null:pe(e.thoughts_token_count);return e.thoughts_token_count!==void 0&&(o===null||o>n)?null:{input_uncached:t-r,input_cached:r,input_cache_write:null,output:n}}function v2(e){let t=ie(e)?.parts;if(!Array.isArray(t))return null;let n=0,r=!1;for(let s of t){let o=ie(s);!o||o.thought===!0||typeof o.text=="string"&&(n+=Buffer.byteLength(o.text,"utf8"),r=!0)}return r?n:null}function S2(e){let t=new Map,n=new Set,r=new Map;for(let i of e){let a=typeof i.uuid=="string"&&i.uuid?i.uuid:null;if(a!==null&&(t.set(a,typeof i.parentUuid=="string"&&i.parentUuid?i.parentUuid:null),i.type==="user")){n.add(a);let c=v2(i.message);c!==null&&r.set(a,c)}}let s=new Map;return{promptBytes:r,resolve:i=>{let a=[],c=new Set,l=i,d;for(;;){let u=s.get(l);if(u){d=u;break}if(n.has(l)){d={kind:"found",uuid:l};break}if(!t.has(l)){d={kind:"broken"};break}if(c.has(l)){d={kind:"broken"};break}c.add(l),a.push(l);let f=t.get(l)??null;if(f===null){d={kind:"clean"};break}l=f}for(let u of a)s.set(u,d);return d}}}function b2(e,t,n,r){let{promptBytes:s,resolve:o}=S2(e),i=new Set,a=new Map,c=0;for(let d of e){r.signal.throwIfAborted();let u=y2(d);if(u===null)continue;let f=w2(u);if(f===f2){let w=typeof u.response_id=="string"&&u.response_id?u.response_id:null;if(w===null)return{status:"unsupported"};let y=T2(u);if(y===null)return{status:"partial"};let E=a.get(w);if(!E){if(E={meta:{response_id:w,timestamp:Tn(u["event.timestamp"]??d.timestamp),model:typeof u.model=="string"&&u.model?u.model:null,tokens:{...sn},files_read:[],files_written:[]},obs:new yn,io:new wn,thoughts:null},a.set(w,E),a.size>r.maxRows)return{status:"partial"};let b=typeof d.uuid=="string"&&d.uuid?d.uuid:null,A=b===null?{kind:"broken"}:o(b);if(A.kind==="broken")E.io.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"});else if(A.kind==="found"&&!i.has(A.uuid)){i.add(A.uuid);let I=s.get(A.uuid)??null;E.io.record({direction:"read",kind:"prompt",id:A.uuid,ref:null,bytes:I,basis:I===null?"unknown":"input_text"})}}E.meta.tokens=y,typeof u.model=="string"&&u.model&&(E.meta.model=u.model);let T=pe(u.thoughts_token_count);T!==null&&(E.thoughts=T);continue}if(f!==m2)continue;let m=typeof u.response_id=="string"&&u.response_id?u.response_id:null;if(m===null)continue;let p=a.get(m);if(p===void 0)return{status:"partial"};let h=typeof u.function_name=="string"?u.function_name.toLowerCase():"",_=ie(u.function_args),g=`tool-${c++}`;if(p2.has(h)){let w=typeof _?.file_path=="string"?_.file_path:null;w!==null?p.obs.record(g,"read",w,null):at(p.io,g)}else if(h2.has(h)){let w=typeof _?.file_path=="string"?_.file_path:null;w!==null?p.obs.record(g,"written",w,vi(_)):at(p.io,g)}else ws(h)||at(p.io,g)}let l=[];for(let{meta:d,obs:u,io:f,thoughts:m}of a.values()){let p=u.files("read"),h=u.files("written"),_=f.entries();l.push({...d,files_read:p,files_written:h,external_io:_,read_bytes:Xt(p,_,"read"),write_bytes:Xt(h,_,"written"),model_provider:null,pricing_facts:fr({reasoning:m??void 0},d.tokens.output,d.tokens.input_cache_write)})}return{status:"complete",source:t,revision:n,checkpoint:n,responses:l}}async function A2(e,t,n,r,s){let o=[],i=0,a=!1;async function c(l){r.signal.throwIfAborted();let d=await l2(l,{withFileTypes:!0}).catch(()=>[]);d.sort((u,f)=>We(u.name,f.name));for(let u of d){if(r.signal.throwIfAborted(),o.length>=t)return;if(i+=1,i>n){a=!0;return}let f=qh(l,u.name);if(u.isDirectory()&&!u.isSymbolicLink()){if(await c(f),a||o.length>=t)return}else if(u.isFile()&&u.name.endsWith(".jsonl")&&zd(l)===Pb){let m=await d2(f).catch(()=>Mb(f));(s===null||We(m,s)>0)&&o.push(m)}}}return await c(e),{paths:o.sort(We),truncated:a}}function I2(e,t){for(let n of e){let r=n.sessionId;if(typeof r=="string"&&r.length>0&&r!==t)return!1}return!0}var Hh=class{roots;maxDiscoveryTraversalVisits;constructor(t={}){this.roots=(t.qwenProjectsDirs??E2()).map(n=>Mb(n)),this.maxDiscoveryTraversalVisits=t.maxDiscoveryTraversalVisits&&t.maxDiscoveryTraversalVisits>0?Math.trunc(t.maxDiscoveryTraversalVisits):_2}async discover(t,n,r=null){$e(t);let s=new Map,o=!1;for(let a of this.roots){t.signal.throwIfAborted();let c=await A2(a,n,this.maxDiscoveryTraversalVisits,t,r);c.truncated&&(o=!0);for(let l of c.paths)s.set(l,l)}return{sources:[...s.keys()].sort(We).slice(0,n).map(a=>({provider:Ss,sessionid:zd(a,".jsonl"),source_id:a})),truncated:o}}matches(t,n){return zd(n,".jsonl")===t.sessionid&&zd(u2(n))===Pb}async inspect(t,n){if($e(n),t.provider!==Ss)return{status:"unsupported"};let r=await It(t.source_id,[...this.roots]);if(!r||!this.matches(t,r))return{status:"unavailable"};let s=await on(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(t,n,r){if($e(r),t.provider!==Ss)return{status:"unsupported"};let s=await It(t.source_id,[...this.roots]);if(!s||!this.matches(t,s))return{status:"unavailable"};let o=await on(s,r).catch(()=>null);if(!o)return{status:"partial"};if(o.revision!==n)return{status:"partial"};let i=Hd(o.data,r);return i?I2(i,t.sessionid)?b2(i,t,n,r):{status:"unavailable"}:{status:"partial"}}};function Ub(e={}){return new Hh(e)}import{createHash as R2}from"node:crypto";import{createRequire as N2}from"node:module";import{join as mc,resolve as Wh}from"node:path";var k2=new URL("./cli/index.js",import.meta.url).href,bo="opencode",x2=N2(k2);function L2(){return x2("node:sqlite").DatabaseSync}function Fb(){return process.env.HOME||process.env.USERPROFILE||""}function C2(){let e=process.env.XDG_DATA_HOME||mc(Fb(),".local","share"),t=process.env.XDG_CONFIG_HOME||mc(Fb(),".config");return[mc(e,"opencode","opencode.db"),mc(e,"opencode","opencode-local.db"),mc(t,"opencode","opencode.db")]}var O2=["read","read_file","view","view_file","view_image"],D2=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],$2=["filePath","path","file","file_path","filepath","notebook_path","paths"],M2=new Set(["session-job-notification"]);function P2(e){if(typeof e!="string")return null;let t=e.toLowerCase();return t==="apply_patch"?"apply_patch":O2.includes(t)?"read":D2.includes(t)?"written":null}function jb(e,t=$2){let n=ie(e);if(!n)return null;for(let r of t){let s=n[r];if(typeof s=="string"&&s.length>0)return s;if(Array.isArray(s)){for(let o of s)if(typeof o=="string"&&o.length>0)return o}}return null}function U2(e){let t=ie(e);if(!t)return null;if(typeof t.content=="string")return Buffer.byteLength(t.content,"utf8");if(typeof t.newString=="string")return Buffer.byteLength(t.newString,"utf8");if(typeof t.new_string=="string")return Buffer.byteLength(t.new_string,"utf8");if(typeof t.newSource=="string")return Buffer.byteLength(t.newSource,"utf8");if(Array.isArray(t.edits)){let n=0;for(let r of t.edits){let s=ie(r),o=s?.newString??s?.new_string;if(typeof o!="string")return null;n+=Buffer.byteLength(o,"utf8")}return n}return null}function F2(e){let t=new Map,n=null,r=()=>{n&&(t.set(n.path,(t.get(n.path)??0)+n.bytes),n=null)};for(let s of e.split(`
205
205
  `)){let o=s.replace(/\r$/,""),i=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(o);if(i){r(),n={path:i[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(o);if(a){n&&(n.path=a[1].trim());continue}if(o.startsWith("*** ")){r();continue}n&&o.startsWith("+")&&(n.bytes+=Buffer.byteLength(o.slice(1),"utf8")+1)}return r(),[...t].map(([s,o])=>({path:s,bytes:o}))}function j2(e){if(typeof e!="string"||e.length===0)return null;try{let t=new URL(e);return t.protocol!=="http:"&&t.protocol!=="https:"?null:`${t.origin}${t.pathname}`}catch{return null}}function q2(e,t=!1){let n=ie(e);if(!n)return{...sn};let r=n.input===void 0?t?null:0:pe(n.input),s=n.output===void 0?t?null:0:pe(n.output),o=n.reasoning===void 0?t?null:0:pe(n.reasoning),i=ie(n.cache),a=i?.read===void 0?t?null:0:pe(i.read),c=i?.write===void 0?t?null:0:pe(i.write);return t&&r===0&&s===0&&o===0&&a===0&&c===0?{...sn}:t?{input_uncached:r!==null&&c!==null&&Number.isSafeInteger(r+c)?r+c:null,input_cached:a,input_cache_write:c,output:s!==null&&o!==null&&Number.isSafeInteger(s+o)?s+o:null}:r===null||s===null||o===null||a===null||c===null?{...sn}:r+s+o+a+c===0?{...sn}:{input_uncached:r+c,input_cached:a,input_cache_write:c,output:s+o}}function qb(e,t,n){$e(n);let r=n.maxRows*20,s=e.prepare("SELECT (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM message WHERE session_id=?) + (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM part WHERE session_id=?) AS total").get(t,t),o=pe(s?.total);if(o===null||o>n.maxBytes)return null;let i=e.prepare("SELECT id,time_created,time_updated,data FROM message WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(t,r+1),a=e.prepare("SELECT id,message_id,time_created,time_updated,data FROM part WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(t,r+1);if(i.length+a.length>r)return null;let c=0,l=R2("sha256");for(let d of[...i,...a]){n.signal.throwIfAborted();let u=JSON.stringify(d);if(c+=Buffer.byteLength(u),c>n.maxBytes)return null;l.update(u).update(`
206
- `)}return{revision:`${dc}:sha256:${l.digest("hex")}`,messages:i,parts:a}}function H2(e){let t=0,n=!1,r=!1;for(let s of e){let o;try{o=ie(JSON.parse(s.data))}catch{continue}let i=typeof o?.type=="string"?o.type:"";o?.synthetic===!0||o?.ignored===!0||(i==="text"&&typeof o.text=="string"?(t+=Buffer.byteLength(o.text,"utf8"),n=!0):i&&!M2.has(i)&&(r=!0))}return n?t:r?"unknown":null}function W2(e,t,n,r){let s=new Map;for(let l of n.parts){let d=s.get(l.message_id)??[];d.push(l),s.set(l.message_id,d)}let o=new Map;for(let l of n.messages){let d;try{d=ie(JSON.parse(l.data))}catch{continue}if(d?.role!=="user")continue;let u=H2(s.get(l.id)??[]);u==="unknown"?o.set(l.id,null):u!==null&&o.set(l.id,u)}let i=new Map,a=new Set;for(let l of n.messages){let d;try{d=ie(JSON.parse(l.data))}catch{continue}if(d?.role!=="assistant")continue;let u=typeof d.parentID=="string"?d.parentID:null;u!==null&&o.has(u)&&!a.has(u)&&(a.add(u),i.set(l.id,{id:u,bytes:o.get(u)}))}let c=[];for(let l of n.messages){r.signal.throwIfAborted();let d;try{d=ie(JSON.parse(l.data))}catch{return{status:"partial"}}if(r.requireBillingCounters&&d&&Object.hasOwn(d,"tokens")&&d.role!=="assistant")return{status:"partial"};if(!d||d.role!=="assistant")continue;let u=new yn,f=new wn,m=0,p=i.get(l.id);p&&f.record({direction:"read",kind:"prompt",id:p.id,ref:null,bytes:p.bytes,basis:p.bytes===null?"unknown":"input_text"});for(let A of s.get(l.id)??[]){let I;try{I=ie(JSON.parse(A.data))}catch{return{status:"partial"}}if(I?.type!=="tool")continue;let R=typeof I.tool=="string"?I.tool.toLowerCase():"",L=P2(I.tool),N=ie(I.state),k=ie(N?.input),D=typeof I.callID=="string"&&I.callID?I.callID:typeof N?.callID=="string"&&N.callID?N.callID:A.id;if(L==="written")u.record(D,"written",jb(k),U2(k));else if(L==="apply_patch"){let O=k?.patchText;if(typeof O=="string")for(let v of F2(O))u.record(D,"written",v.path,v.bytes);else at(f,D)}else if(L==="read"){let O=jb(k,["filePath","path","file","file_path"]);if(O===null)continue;let v=null;if(N?.status==="completed"){let S=ie(ie(N.metadata)?.display);S?.type==="file"&&typeof S.text=="string"&&(v=Buffer.byteLength(S.text,"utf8"))}u.record(D,"read",O,v)}else if(R==="webfetch"){m+=1;let O=N?.status==="completed"?N.output:void 0;f.record({direction:"read",kind:"web",id:D,ref:j2(k?.url),bytes:typeof O=="string"?Buffer.byteLength(O,"utf8"):null,basis:typeof O=="string"?"normalized_content":"unknown"})}else ws(I.tool)||at(f,D)}let h=ie(d.time),_=ie(d.model)?.modelID??d.modelID,g=q2(d.tokens,r.requireBillingCounters),w=ie(d.tokens),y=u.files("read"),E=u.files("written"),T=f.entries(),b=fr({reasoning:w?.reasoning,webFetch:m>0?m:void 0},g.output,g.input_cache_write);if(c.push({response_id:l.id,timestamp:Tn(h?.created??l.time_created),model:typeof _=="string"&&_?_:null,tokens:g,files_read:y,files_written:E,external_io:T,read_bytes:Xt(y,T,"read"),write_bytes:Xt(E,T,"written"),model_provider:typeof d.providerID=="string"&&d.providerID?d.providerID:null,pricing_facts:b}),c.length>r.maxRows)return{status:"partial"}}return{status:"complete",source:e,revision:t,checkpoint:t,responses:c}}var pc=class{dbPaths;sqliteBusyTimeoutMs;constructor(t={}){this.dbPaths=(t.dbPaths??C2()).map(n=>Wh(n)),this.sqliteBusyTimeoutMs=t.sqliteBusyTimeoutMs??5e3}openDb(t){if(!this.dbPaths.includes(Wh(t)))return null;try{let n=new(L2())(t,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),n}catch{return null}}async discover(t,n,r=null){$e(t);let s=new Map;for(let i of this.dbPaths){t.signal.throwIfAborted();let a=await At(i,[Wh(i,"..")]);if(!a||r&&We(a,r.source_id)<0)continue;let c=this.openDb(a);if(c)try{let l=r?.source_id===a?r.sessionid:"",d=c.prepare("SELECT id FROM session WHERE id > ? ORDER BY id LIMIT ?").all(l,n);for(let u of d)typeof u.id=="string"&&u.id&&!s.has(u.id)&&s.set(u.id,{provider:bo,sessionid:u.id,source_id:a})}catch{}finally{c.close()}}return{sources:[...s.values()].sort((i,a)=>We(`${i.source_id}\0${i.sessionid}`,`${a.source_id}\0${a.sessionid}`)).slice(0,n),truncated:!1}}inspect(t,n){if($e(n),t.provider!==bo)return{status:"unsupported"};let r=this.openDb(t.source_id);if(!r)return{status:"unavailable"};try{if(r.prepare("SELECT id FROM session WHERE id=?").get(t.sessionid)?.id!==t.sessionid)return{status:"unavailable"};let o=qb(r,t.sessionid,n);return o?{status:"ready",revision:o.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}read(t,n,r){if($e(r),t.provider!==bo)return{status:"unsupported"};let s=this.openDb(t.source_id);if(!s)return{status:"unavailable"};try{if(s.exec("BEGIN"),s.prepare("SELECT id FROM session WHERE id=?").get(t.sessionid)?.id!==t.sessionid)return s.exec("ROLLBACK"),{status:"unavailable"};let i=qb(s,t.sessionid,r);if(!i||i.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=W2(t,n,i,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function Hb(e={}){return new pc(e)}import{readdir as B2,realpath as G2,stat as X2}from"node:fs/promises";import{basename as Wb,dirname as V2,join as Bb,resolve as Gb}from"node:path";var bs="copilot",Xb="events.jsonl",J2=new Set(["report_intent"]),Y2=new Set(["view"]);function K2(e){let t=new Map,n=null,r=()=>{n&&(t.set(n.path,(t.get(n.path)??0)+n.bytes),n=null)};for(let s of e.split(`
207
- `)){let o=s.replace(/\r$/,""),i=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(o);if(i){r(),n={path:i[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(o);if(a){n&&(n.path=a[1].trim());continue}if(o.startsWith("*** ")){r();continue}n&&o.startsWith("+")&&(n.bytes+=Buffer.byteLength(o.slice(1),"utf8")+1)}return r(),[...t].map(([s,o])=>({path:s,bytes:o}))}function z2(e){let t=e?.content;return typeof t=="string"?Buffer.byteLength(t,"utf8"):null}function Q2(e,t,n){let r=ie(e);if(!r)return{entry:null,incomplete:e!=null};let s=[],o=!1;for(let[a,c]of Object.entries(r)){let l=ie(c);if(!l){o=!0;continue}let d=ie(l.usage),u=ie(l.requests),f=ie(l.tokenDetails),m=ie(f?.input);s.push({model:a,requests_count:u?pe(u.count):null,input_tokens:d?pe(d.inputTokens):null,input_other_tokens:m?pe(m.tokenCount):null,cache_read_tokens:d?pe(d.cacheReadTokens):null,cache_write_tokens:d?pe(d.cacheWriteTokens):null,output_tokens:d?pe(d.outputTokens):null,reasoning_tokens:d?pe(d.reasoningTokens):null})}s.sort((a,c)=>We(a.model,c.model));let i=o||s.length>0;return t===null?{entry:null,incomplete:i}:{entry:{native_id:t,recorded_at:n,kind:"copilot_session_shutdown",semantics:"reported_scope_unknown",models:s},incomplete:o}}function Z2(e,t,n,r){let s=new Map;for(let u of e){if(u.type!=="user.message")continue;let f=ie(u.data),m=typeof f?.interactionId=="string"?f.interactionId:null;if(m===null)continue;let p=z2(f);s.has(m)?s.get(m)===null&&p!==null&&s.set(m,p):s.set(m,p)}let o=new Map,i=new Set,a=new Map,c=!1,l=1e3;for(let u of e){if(r.signal.throwIfAborted(),u.type==="session.shutdown"){let g=typeof u.id=="string"&&u.id?u.id:null,w=Tn(u.timestamp),{entry:y,incomplete:E}=Q2(ie(u.data)?.modelMetrics,g,w);if(E&&(c=!0),y){let T=a.get(y.native_id);if(T&&JSON.stringify(T)!==JSON.stringify(y))c=!0;else if(a.set(y.native_id,y),a.size>l)return{snapshot:{status:"partial"},sessionUsage:null}}continue}if(u.type!=="assistant.message")continue;let f=ie(u.data);if(!f)continue;let m=typeof f.messageId=="string"&&f.messageId?f.messageId:typeof u.id=="string"&&u.id?u.id:null;if(m===null)continue;let p=typeof f.interactionId=="string"?f.interactionId:null,h=o.get(m);if(!h){if(h={meta:{response_id:m,timestamp:Tn(u.timestamp),model:typeof f.model=="string"&&f.model?f.model:null,tokens:{...sn},files_read:[],files_written:[]},obs:new yn,io:new wn,promptRecorded:!1},o.set(m,h),o.size>r.maxRows)return{snapshot:{status:"partial"},sessionUsage:null};if(p!==null&&s.has(p)){if(!i.has(p)){i.add(p);let g=s.get(p);h.io.record({direction:"read",kind:"prompt",id:p,ref:null,bytes:g,basis:g===null?"unknown":"input_text"}),h.promptRecorded=!0}}else h.io.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})}let _=pe(f.outputTokens);if(_!==null&&(h.meta.tokens.output=(h.meta.tokens.output??0)+_),h.meta.model===null&&typeof f.model=="string"&&f.model&&(h.meta.model=f.model),Array.isArray(f.toolRequests))for(let g of f.toolRequests){let w=ie(g);if(!w)continue;let y=typeof w.name=="string"?w.name.toLowerCase():"",E=typeof w.toolCallId=="string"&&w.toolCallId?w.toolCallId:null,T=w.arguments;if(y==="create"){let b=ie(T),A=typeof b?.path=="string"?b.path:null,I=typeof b?.file_text=="string"?Buffer.byteLength(b.file_text,"utf8"):null;A!==null?h.obs.record(E??m,"written",A,I):at(h.io,E)}else if(y==="apply_patch")if(typeof T=="string"){let b=K2(T);if(b.length>0)for(let A of b)h.obs.record(E??m,"written",A.path,A.bytes);else at(h.io,E)}else at(h.io,E);else if(Y2.has(y)){let b=ie(T),A=typeof b?.path=="string"?b.path:null;A!==null?h.obs.record(E??m,"read",A,null):at(h.io,E)}else J2.has(y)||at(h.io,E)}}let d=[];for(let{meta:u,obs:f,io:m}of o.values()){let p=f.files("read"),h=f.files("written"),_=m.entries();d.push({...u,files_read:p,files_written:h,external_io:_,read_bytes:Xt(p,_,"read"),write_bytes:Xt(h,_,"written"),model_provider:null,pricing_facts:null})}return c?{snapshot:{status:"partial"},sessionUsage:null}:{snapshot:{status:"complete",source:t,revision:n,checkpoint:n,responses:d},sessionUsage:a.size>0?[...a.values()]:null}}function eG(){return process.env.HOME||process.env.USERPROFILE||""}var Bh=class{sessionStateDir;constructor(t={}){this.sessionStateDir=Gb(t.copilotSessionStateDir??Bb(eG(),".copilot","session-state"))}async discover(t,n,r=null){$e(t);let s;try{s=await B2(this.sessionStateDir)}catch{return{sources:[],truncated:!1}}let o=[];for(let i of s.sort(We)){t.signal.throwIfAborted();let a=Bb(this.sessionStateDir,i,Xb);if(!(await X2(a).catch(()=>null))?.isFile())continue;let l=await G2(a).catch(()=>Gb(a)),d={provider:bs,sessionid:i,source_id:l};r!==null&&We(`${l}\0${i}`,r)<=0||o.push(d)}return o.sort((i,a)=>We(`${i.source_id}\0${i.sessionid}`,`${a.source_id}\0${a.sessionid}`)),{sources:o.slice(0,n),truncated:!1}}matches(t,n){return Wb(n)===Xb&&Wb(V2(n))===t.sessionid}async inspect(t,n){if($e(n),t.provider!==bs)return{status:"unsupported"};let r=await At(t.source_id,[this.sessionStateDir]);if(!r||!this.matches(t,r))return{status:"unavailable"};let s=await on(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(t,n,r){return(await this.readWithUsage(t,n,r)).snapshot}async readWithUsage(t,n,r){if($e(r),t.provider!==bs)return{snapshot:{status:"unsupported"},sessionUsage:null};let s=await At(t.source_id,[this.sessionStateDir]);if(!s||!this.matches(t,s))return{snapshot:{status:"unavailable"},sessionUsage:null};let o=await on(s,r).catch(()=>null);if(!o||o.revision!==n)return{snapshot:{status:"partial"},sessionUsage:null};let i=Hd(o.data,r);return i?Z2(i,t,n,r):{snapshot:{status:"partial"},sessionUsage:null}}};function Vb(e={}){return new Bh(e)}import{readdir as Jb,readFile as tG,realpath as Gh,stat as Yb}from"node:fs/promises";import{basename as _c,dirname as Ri,isAbsolute as Vh,join as ki,relative as Qb,resolve as hc,sep as Zb}from"node:path";var As="kimi",Jh="wire.jsonl",eA="agents",nG=new Set(["1.4","1.5"]),rG=5e5,sG=8*1024*1024,oG=new Set(["read"]),iG=new Set(["write","edit"]),aG=new Set(["todolist","tasklist","taskoutput","taskstop","waitfor","creategoal","updategoal","getgoal","enterplanmode","exitplanmode","agentswarm","agent","skill","croncreate","crondelete","cronlist"]);function cG(e){return aG.has(e)||ws(e)}function lG(){return process.env.HOME||process.env.USERPROFILE||""}function dG(e,t){if(e.length>0&&e[e.length-1]!==10)return null;let n=[],r=0;for(;r<e.length;){t.signal.throwIfAborted();let s=e.indexOf(10,r);s===-1&&(s=e.length);let o=e.toString("utf8",r,s);if(r=s+1,!!o.trim())try{let i=ie(JSON.parse(o));if(!i)return null;n.push(i)}catch{return null}}return n}function Kb(e){let t=ie(e);if(!t)return null;let n=pe(t.inputOther),r=pe(t.inputCacheRead),s=pe(t.inputCacheCreation),o=pe(t.output);return n===null||r===null||s===null||o===null?null:{input_uncached:n+s,input_cached:r,input_cache_write:s,output:o}}function uG(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let s=ie(r);s?.type==="text"&&typeof s.text=="string"&&(t+=Buffer.byteLength(s.text,"utf8"),n=!0)}return n?t:null}var fG=new Set(["system_trigger","cron_job","task"]);function mG(e,t,n,r){let s=e.find(w=>w.type==="metadata"),o=s&&typeof s.protocol_version=="string"?s.protocol_version:null;if(o!==null&&!nG.has(o))return{status:"unsupported"};let i=pG(t.source_id),a=new Map,c=new Map,l=[],d=new Set,u=new Set,f=null,m=!1,p=w=>`${i}/${w}`,h=(w,y)=>{let E=p(w),T=a.get(E);return T||(T={meta:{response_id:E,timestamp:Tn(typeof y=="number"?y:null),model:null,tokens:{...sn},files_read:[],files_written:[]},obs:new yn,io:new wn,turnStepKey:null,tokensSource:"none"},a.set(E,T)),T},_=(w,y)=>{if(w.turnStepKey!==null)return;let E=y.turnId===void 0?null:String(y.turnId),T=y.step===void 0?null:String(y.step);E!==null&&T!==null&&(w.turnStepKey=`${E}.${T}`)};for(let w of e){if(r.signal.throwIfAborted(),w.type==="turn.prompt"){let E=ie(w.origin),T=typeof E?.kind=="string"?E.kind:null,b=typeof w.promptId=="string"&&w.promptId?w.promptId:null;if(T!==null&&fG.has(T))continue;if(b!==null){if(d.has(b))continue;d.add(b)}T==="user"?l.push({bytes:uG(w.input),id:b}):l.push({bytes:null,id:b});continue}if(w.type==="usage.record"){if(u.size>1){m=!0;continue}if(u.size===0){f===null&&(m=!0);continue}let[E]=u,T=a.get(p(E));if(!T){m=!0;continue}if(T.tokensSource==="record"){m=!0;continue}let b=Kb(w.usage);b&&(T.meta.tokens=b,T.tokensSource="record");continue}if(w.type==="llm.request"){let E=typeof w.turnStep=="string"?w.turnStep:null,T=(typeof w.modelAlias=="string"&&w.modelAlias?w.modelAlias:null)??(typeof w.model=="string"&&w.model?w.model:null);E!==null&&T!==null&&(c.has(E)?c.get(E)!==T&&c.set(E,null):c.set(E,T));continue}if(w.type!=="context.append_loop_event")continue;let y=ie(w.event);if(y){if(y.type==="step.begin"){let E=typeof y.uuid=="string"&&y.uuid?y.uuid:null;if(E===null)continue;let T=h(E,w.time);if(a.size>r.maxRows)return{status:"partial"};if(u.add(E),_(T,y),l.length>0){for(let b of l)T.io.record({direction:"read",kind:"prompt",id:b.id,ref:null,bytes:b.bytes,basis:b.bytes===null?"unknown":"input_text"});l.length=0}continue}if(y.type==="step.end"){let E=typeof y.uuid=="string"&&y.uuid?y.uuid:null;if(E===null)continue;let T=h(E,w.time);if(a.size>r.maxRows)return{status:"partial"};u.delete(E),f=E,_(T,y);let b=Kb(y.usage);b&&(T.meta.tokens=b),T.tokensSource="end",T.meta.timestamp===null&&(T.meta.timestamp=Tn(typeof w.time=="number"?w.time:null));continue}if(y.type==="tool.call"){let E=typeof y.stepUuid=="string"&&y.stepUuid?y.stepUuid:null;if(E===null)continue;let T=h(E,w.time);if(a.size>r.maxRows)return{status:"partial"};let b=typeof y.name=="string"?y.name.toLowerCase():"",A=typeof y.toolCallId=="string"&&y.toolCallId?y.toolCallId:null,I=ie(y.args),R=typeof I?.path=="string"&&I.path?I.path:typeof I?.file_path=="string"&&I.file_path?I.file_path:null;oG.has(b)?R!==null?T.obs.record(A??"","read",R,null):at(T.io,A):iG.has(b)?R!==null?T.obs.record(A??"","written",R,vi(I)):at(T.io,A):cG(b)||at(T.io,A);continue}}}let g=[];for(let{meta:w,obs:y,io:E,turnStepKey:T}of a.values()){w.model===null&&T!==null&&(w.model=c.get(T)??null);let b=y.files("read"),A=y.files("written"),I=E.entries();g.push({...w,files_read:b,files_written:A,external_io:I,read_bytes:Xt(b,I,"read"),write_bytes:Xt(A,I,"written"),model_provider:null,pricing_facts:fr({},w.tokens.output,w.tokens.input_cache_write)})}return{status:"complete",source:t,revision:n,checkpoint:n,responses:g,...m?{capture_status:"partial"}:{}}}function Xh(e){return _c(e)===Jh&&_c(Ri(Ri(e)))===eA}function zb(e){return _c(Ri(Ri(Ri(e))))}function pG(e){return _c(Ri(e))}function hG(e,t){let n=Qb(t,e);return n===""||!n.startsWith(`..${Zb}`)&&n!==".."&&!Vh(n)}function _G(e){if(e instanceof Error&&e.name==="AbortError")throw e}var gc=class{home;sessionsDir;indexPath;maxDiscoveryTraversalVisits;constructor(t={}){this.home=hc(t.kimiHome??process.env.KIMI_CODE_HOME??ki(lG(),".kimi-code")),this.sessionsDir=ki(this.home,"sessions"),this.indexPath=ki(this.home,"session_index.jsonl"),this.maxDiscoveryTraversalVisits=t.maxDiscoveryTraversalVisits&&t.maxDiscoveryTraversalVisits>0?Math.trunc(t.maxDiscoveryTraversalVisits):rG}async discover(t,n,r=null){$e(t);let s=new Set,o=!1,i=await Gh(this.sessionsDir).catch(()=>hc(this.sessionsDir)),a=f=>{Xh(f)&&hG(f,i)&&s.add(f)},c=0,l=async(f,m)=>{if(t.signal.throwIfAborted(),o)return;let p=await Jb(f,{withFileTypes:!0}).catch(()=>[]);p.sort((h,_)=>We(h.name,_.name));for(let h of p){if(t.signal.throwIfAborted(),c+=1,c>this.maxDiscoveryTraversalVisits){o=!0;return}let _=ki(f,h.name);if(h.isDirectory()&&!h.isSymbolicLink()&&m<4){if(await l(_,m+1),o)return}else h.isFile()&&h.name===Jh&&Xh(_)&&a(await Gh(_).catch(()=>hc(_)))}};await l(this.sessionsDir,0);try{await this.unionIndex(a,t)}catch(f){_G(f)}let d=[...s].sort(We);return{sources:(r===null?d:d.filter(f=>We(f,r)>0)).slice(0,n).map(f=>({provider:As,sessionid:zb(f),source_id:f})),truncated:o}}async unionIndex(t,n){let r=await Yb(this.indexPath).catch(()=>null);if(!r?.isFile()||r.size>sG)return;let s=await tG(this.indexPath,{signal:n.signal});for(let o of s.toString("utf8").split(`
208
- `)){if(n.signal.throwIfAborted(),!o.trim())continue;let i;try{i=ie(JSON.parse(o))}catch{continue}let a=typeof i?.sessionId=="string"?i.sessionId:null,c=typeof i?.sessionDir=="string"?i.sessionDir:null;if(!a||!c||!Vh(c)||_c(c)!==a)continue;let l=Qb(this.sessionsDir,hc(c));if(l.startsWith(`..${Zb}`)||l===".."||Vh(l))continue;let d=ki(c,eA),u=await Jb(d,{withFileTypes:!0}).catch(()=>[]);for(let f of u){if(!f.isDirectory())continue;let m=ki(d,f.name,Jh);(await Yb(m).catch(()=>null))?.isFile()&&t(await Gh(m).catch(()=>hc(m)))}}}matches(t,n){return Xh(n)&&zb(n)===t.sessionid}async inspect(t,n){if($e(n),t.provider!==As)return{status:"unsupported"};let r=await At(t.source_id,[this.sessionsDir]);if(!r||!this.matches(t,r))return{status:"unavailable"};let s=await on(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(t,n,r){if($e(r),t.provider!==As)return{status:"unsupported"};let s=await At(t.source_id,[this.sessionsDir]);if(!s||!this.matches(t,s))return{status:"unavailable"};let o=await on(s,r).catch(()=>null);if(!o)return{status:"partial"};if(o.revision!==n)return{status:"partial"};let i=dG(o.data,r);return i?mG(i,t,n,r):{status:"partial"}}};function tA(e={}){return new gc(e)}var gG=new URL("./cli/index.js",import.meta.url).href,Is=class{map=new Map;record(t,n,r,s){if(typeof r!="string"||r.length===0||r.includes("\0"))return;let o=`${t}\0${n}\0${r}`;this.map.has(o)||this.map.set(o,{direction:n,path:r,bytes:s})}files(t){let n=[];for(let r of this.map.values())r.direction===t&&n.push({path:r.path,bytes:r.bytes});return n}absorb(t){for(let[n,r]of t.map)this.map.has(n)||this.map.set(n,r)}},AG=0,ks=class{map=new Map;record(t){let n;t.id!==null?n=`id\0${t.id}\0${t.direction}\0${t.kind}`:t.bytes===null?n=`mark\0${t.direction}\0${t.kind}\0${t.basis}\0${t.ref??""}`:n=`seq\0${AG++}`,this.map.has(n)||this.map.set(n,t)}entries(){return[...this.map.values()]}absorb(t){for(let[n,r]of t.map)this.map.has(n)||this.map.set(n,r)}},IG=new Set(["schedulewakeup","taskcreate","taskupdate","taskoutput","taskstop","todowrite","todoread","croncreate","crondelete","cronlist","monitor","listagents","toolsearch","askuserquestion","exitplanmode","agent","skill","job"]);function t_(e){return typeof e=="string"&&IG.has(e.toLowerCase())}function wc(e,t){e.record({direction:"read",kind:"unattributed",id:t,ref:null,bytes:null,basis:"unknown"}),e.record({direction:"write",kind:"unattributed",id:t,ref:null,bytes:null,basis:"unknown"})}function lA(e){if(typeof e!="string"||e.length===0)return null;try{let t=new URL(e);return t.protocol!=="http:"&&t.protocol!=="https:"?null:`${t.origin}${t.pathname}`}catch{return null}}function Li(e,t,n){if(e===null)return null;let r=n==="written"?"write":"read",s=0;for(let o of e){if(o.bytes===null)return null;s+=o.bytes}for(let o of t)if(o.direction===r){if(o.bytes===null)return null;s+=o.bytes}return s}function xi(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function n_(e,t,n){let r={},s=xi(e.cacheWrite5m),o=xi(e.cacheWrite1h),i=xi(e.reasoning),a=xi(e.webSearch),c=xi(e.webFetch);i!==null&&(t===null||i<=t)&&(r.reasoning_output_tokens=i);let l=(s??0)+(o??0),d=n===null||l<=n;return s!==null&&d&&(r.cache_write_5m_tokens=s),o!==null&&d&&(r.cache_write_1h_tokens=o),a!==null&&(r.web_search_requests=a),c!==null&&(r.web_fetch_requests=c),Object.keys(r).length>0?r:null}var Ni=["claude","codex","lmplayer",Ts,vs,bo,bs,Ss,As,"muse","miniplayer"],Ec={input_uncached:null,input_cached:null,input_cache_write:null,output:null},kG=5e5,r_="bx3",RG=EG(gG);function Zd(){return process.env.HOME||process.env.USERPROFILE||""}function NG(){if(process.env.OPENCODE_DB)return[Fr(process.env.OPENCODE_DB)];let e=process.env.XDG_DATA_HOME||Ao(Zd(),".local","share");return[Ao(e,"lmplayer","opencode-local.db"),Ao(e,"lmplayer","opencode-dev.db")]}function xG(){return RG("node:sqlite").DatabaseSync}function he(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}function an(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function s_(e){if(typeof e!="string"&&typeof e!="number")return null;let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():null}function yc(e){if(!Number.isSafeInteger(e.maxBytes)||e.maxBytes<=0)throw new Error("maxBytes must be a positive safe integer");if(!Number.isSafeInteger(e.maxRows)||e.maxRows<=0)throw new Error("maxRows must be a positive safe integer");e.signal.throwIfAborted()}function eu(e){return`${e.source_id}\0${e.sessionid}`}function Rs(e,t){return e<t?-1:e>t?1:0}function Yh(e,t){return Rs(eu(e),eu(t))}var Kh=["claude","codex","lmplayer"];function LG(e){let t={version:2,pos:e.pos,done:e.done,rr:e.rr};return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function sA(e){let t=he(e);if(!t||typeof t.source_id!="string"||typeof t.sessionid!="string"||t.source_id.includes("\0")||t.sessionid.includes("\0"))throw new Error("invalid passive session discovery cursor");return{source_id:t.source_id,sessionid:t.sessionid}}function CG(e){if(e===void 0)return null;let t;try{t=he(JSON.parse(Buffer.from(e,"base64url").toString("utf8")))}catch{throw new Error("invalid passive session discovery cursor")}if(!t)throw new Error("invalid passive session discovery cursor");if(t.version===1){let o=t.provider;if(!Number.isSafeInteger(o)||o<0||o>=Kh.length)throw new Error("invalid passive session discovery cursor");let i=o,a=sA({source_id:t.source_id,sessionid:t.sessionid}),c=new Map([[Kh[i],a]]),l=new Set(Kh.slice(0,i));return{pos:c,done:l,rr:0}}if(t.version!==2)throw new Error("invalid passive session discovery cursor");let n=he(t.pos);if(!n||!Array.isArray(t.done)||!Number.isSafeInteger(t.rr)||t.rr<0)throw new Error("invalid passive session discovery cursor");let r=new Map;for(let[o,i]of Object.entries(n))r.set(o,sA(i));let s=new Set;for(let o of t.done){if(typeof o!="string")throw new Error("invalid passive session discovery cursor");s.add(o)}return{pos:r,done:s,rr:t.rr}}var OG=["read","read_file","view","view_file","view_image"],DG=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],$G=["filePath","path","file","file_path","filepath","notebook_path","paths"];function dA(e){if(typeof e!="string")return null;let t=e.toLowerCase();return t==="apply_patch"?"apply_patch":OG.includes(t)?"read":DG.includes(t)?"written":null}function MG(e){return typeof e=="string"?(()=>{try{return JSON.parse(e)}catch{return e}})():e}function tu(e,t=$G){let n=he(e);if(!n)return null;for(let r of t){let s=n[r];if(typeof s=="string"&&s.length>0)return s;if(Array.isArray(s)){for(let o of s)if(typeof o=="string"&&o.length>0)return o}}return null}function uA(e){let t=he(e);if(!t)return null;if(typeof t.content=="string")return Buffer.byteLength(t.content,"utf8");if(typeof t.new_string=="string")return Buffer.byteLength(t.new_string,"utf8");if(typeof t.newString=="string")return Buffer.byteLength(t.newString,"utf8");if(typeof t.new_source=="string")return Buffer.byteLength(t.new_source,"utf8");if(typeof t.newSource=="string")return Buffer.byteLength(t.newSource,"utf8");if(Array.isArray(t.edits)){let n=0;for(let r of t.edits){let s=he(r),o=s?.new_string??s?.newString;if(typeof o!="string")return null;n+=Buffer.byteLength(o,"utf8")}return n}return null}function nu(e){let t=new Map,n=null,r=()=>{n&&(t.set(n.path,(t.get(n.path)??0)+n.bytes),n=null)};for(let s of e.split(`
206
+ `)}return{revision:`${dc}:sha256:${l.digest("hex")}`,messages:i,parts:a}}function H2(e){let t=0,n=!1,r=!1;for(let s of e){let o;try{o=ie(JSON.parse(s.data))}catch{continue}let i=typeof o?.type=="string"?o.type:"";o?.synthetic===!0||o?.ignored===!0||(i==="text"&&typeof o.text=="string"?(t+=Buffer.byteLength(o.text,"utf8"),n=!0):i&&!M2.has(i)&&(r=!0))}return n?t:r?"unknown":null}function W2(e,t,n,r){let s=new Map;for(let l of n.parts){let d=s.get(l.message_id)??[];d.push(l),s.set(l.message_id,d)}let o=new Map;for(let l of n.messages){let d;try{d=ie(JSON.parse(l.data))}catch{continue}if(d?.role!=="user")continue;let u=H2(s.get(l.id)??[]);u==="unknown"?o.set(l.id,null):u!==null&&o.set(l.id,u)}let i=new Map,a=new Set;for(let l of n.messages){let d;try{d=ie(JSON.parse(l.data))}catch{continue}if(d?.role!=="assistant")continue;let u=typeof d.parentID=="string"?d.parentID:null;u!==null&&o.has(u)&&!a.has(u)&&(a.add(u),i.set(l.id,{id:u,bytes:o.get(u)}))}let c=[];for(let l of n.messages){r.signal.throwIfAborted();let d;try{d=ie(JSON.parse(l.data))}catch{return{status:"partial"}}if(r.requireBillingCounters&&d&&Object.hasOwn(d,"tokens")&&d.role!=="assistant")return{status:"partial"};if(!d||d.role!=="assistant")continue;let u=new yn,f=new wn,m=0,p=i.get(l.id);p&&f.record({direction:"read",kind:"prompt",id:p.id,ref:null,bytes:p.bytes,basis:p.bytes===null?"unknown":"input_text"});for(let A of s.get(l.id)??[]){let I;try{I=ie(JSON.parse(A.data))}catch{return{status:"partial"}}if(I?.type!=="tool")continue;let R=typeof I.tool=="string"?I.tool.toLowerCase():"",L=P2(I.tool),N=ie(I.state),k=ie(N?.input),D=typeof I.callID=="string"&&I.callID?I.callID:typeof N?.callID=="string"&&N.callID?N.callID:A.id;if(L==="written")u.record(D,"written",jb(k),U2(k));else if(L==="apply_patch"){let O=k?.patchText;if(typeof O=="string")for(let v of F2(O))u.record(D,"written",v.path,v.bytes);else at(f,D)}else if(L==="read"){let O=jb(k,["filePath","path","file","file_path"]);if(O===null)continue;let v=null;if(N?.status==="completed"){let S=ie(ie(N.metadata)?.display);S?.type==="file"&&typeof S.text=="string"&&(v=Buffer.byteLength(S.text,"utf8"))}u.record(D,"read",O,v)}else if(R==="webfetch"){m+=1;let O=N?.status==="completed"?N.output:void 0;f.record({direction:"read",kind:"web",id:D,ref:j2(k?.url),bytes:typeof O=="string"?Buffer.byteLength(O,"utf8"):null,basis:typeof O=="string"?"normalized_content":"unknown"})}else ws(I.tool)||at(f,D)}let h=ie(d.time),_=ie(d.model)?.modelID??d.modelID,g=q2(d.tokens,r.requireBillingCounters),w=ie(d.tokens),y=u.files("read"),E=u.files("written"),T=f.entries(),b=fr({reasoning:w?.reasoning,webFetch:m>0?m:void 0},g.output,g.input_cache_write);if(c.push({response_id:l.id,timestamp:Tn(h?.created??l.time_created),model:typeof _=="string"&&_?_:null,tokens:g,files_read:y,files_written:E,external_io:T,read_bytes:Xt(y,T,"read"),write_bytes:Xt(E,T,"written"),model_provider:typeof d.providerID=="string"&&d.providerID?d.providerID:null,pricing_facts:b}),c.length>r.maxRows)return{status:"partial"}}return{status:"complete",source:e,revision:t,checkpoint:t,responses:c}}var pc=class{dbPaths;sqliteBusyTimeoutMs;constructor(t={}){this.dbPaths=(t.dbPaths??C2()).map(n=>Wh(n)),this.sqliteBusyTimeoutMs=t.sqliteBusyTimeoutMs??5e3}openDb(t){if(!this.dbPaths.includes(Wh(t)))return null;try{let n=new(L2())(t,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),n}catch{return null}}async discover(t,n,r=null){$e(t);let s=new Map;for(let i of this.dbPaths){t.signal.throwIfAborted();let a=await It(i,[Wh(i,"..")]);if(!a||r&&We(a,r.source_id)<0)continue;let c=this.openDb(a);if(c)try{let l=r?.source_id===a?r.sessionid:"",d=c.prepare("SELECT id FROM session WHERE id > ? ORDER BY id LIMIT ?").all(l,n);for(let u of d)typeof u.id=="string"&&u.id&&!s.has(u.id)&&s.set(u.id,{provider:bo,sessionid:u.id,source_id:a})}catch{}finally{c.close()}}return{sources:[...s.values()].sort((i,a)=>We(`${i.source_id}\0${i.sessionid}`,`${a.source_id}\0${a.sessionid}`)).slice(0,n),truncated:!1}}inspect(t,n){if($e(n),t.provider!==bo)return{status:"unsupported"};let r=this.openDb(t.source_id);if(!r)return{status:"unavailable"};try{if(r.prepare("SELECT id FROM session WHERE id=?").get(t.sessionid)?.id!==t.sessionid)return{status:"unavailable"};let o=qb(r,t.sessionid,n);return o?{status:"ready",revision:o.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}read(t,n,r){if($e(r),t.provider!==bo)return{status:"unsupported"};let s=this.openDb(t.source_id);if(!s)return{status:"unavailable"};try{if(s.exec("BEGIN"),s.prepare("SELECT id FROM session WHERE id=?").get(t.sessionid)?.id!==t.sessionid)return s.exec("ROLLBACK"),{status:"unavailable"};let i=qb(s,t.sessionid,r);if(!i||i.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=W2(t,n,i,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function Hb(e={}){return new pc(e)}import{readdir as B2,realpath as G2,stat as X2}from"node:fs/promises";import{basename as Wb,dirname as V2,join as Bb,resolve as Gb}from"node:path";var bs="copilot",Xb="events.jsonl",J2=new Set(["report_intent"]),Y2=new Set(["view"]);function K2(e){let t=new Map,n=null,r=()=>{n&&(t.set(n.path,(t.get(n.path)??0)+n.bytes),n=null)};for(let s of e.split(`
207
+ `)){let o=s.replace(/\r$/,""),i=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(o);if(i){r(),n={path:i[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(o);if(a){n&&(n.path=a[1].trim());continue}if(o.startsWith("*** ")){r();continue}n&&o.startsWith("+")&&(n.bytes+=Buffer.byteLength(o.slice(1),"utf8")+1)}return r(),[...t].map(([s,o])=>({path:s,bytes:o}))}function z2(e){let t=e?.content;return typeof t=="string"?Buffer.byteLength(t,"utf8"):null}function Q2(e,t,n){let r=ie(e);if(!r)return{entry:null,incomplete:e!=null};let s=[],o=!1;for(let[a,c]of Object.entries(r)){let l=ie(c);if(!l){o=!0;continue}let d=ie(l.usage),u=ie(l.requests),f=ie(l.tokenDetails),m=ie(f?.input);s.push({model:a,requests_count:u?pe(u.count):null,input_tokens:d?pe(d.inputTokens):null,input_other_tokens:m?pe(m.tokenCount):null,cache_read_tokens:d?pe(d.cacheReadTokens):null,cache_write_tokens:d?pe(d.cacheWriteTokens):null,output_tokens:d?pe(d.outputTokens):null,reasoning_tokens:d?pe(d.reasoningTokens):null})}s.sort((a,c)=>We(a.model,c.model));let i=o||s.length>0;return t===null?{entry:null,incomplete:i}:{entry:{native_id:t,recorded_at:n,kind:"copilot_session_shutdown",semantics:"reported_scope_unknown",models:s},incomplete:o}}function Z2(e,t,n,r){let s=new Map;for(let u of e){if(u.type!=="user.message")continue;let f=ie(u.data),m=typeof f?.interactionId=="string"?f.interactionId:null;if(m===null)continue;let p=z2(f);s.has(m)?s.get(m)===null&&p!==null&&s.set(m,p):s.set(m,p)}let o=new Map,i=new Set,a=new Map,c=!1,l=1e3;for(let u of e){if(r.signal.throwIfAborted(),u.type==="session.shutdown"){let g=typeof u.id=="string"&&u.id?u.id:null,w=Tn(u.timestamp),{entry:y,incomplete:E}=Q2(ie(u.data)?.modelMetrics,g,w);if(E&&(c=!0),y){let T=a.get(y.native_id);if(T&&JSON.stringify(T)!==JSON.stringify(y))c=!0;else if(a.set(y.native_id,y),a.size>l)return{snapshot:{status:"partial"},sessionUsage:null}}continue}if(u.type!=="assistant.message")continue;let f=ie(u.data);if(!f)continue;let m=typeof f.messageId=="string"&&f.messageId?f.messageId:typeof u.id=="string"&&u.id?u.id:null;if(m===null)continue;let p=typeof f.interactionId=="string"?f.interactionId:null,h=o.get(m);if(!h){if(h={meta:{response_id:m,timestamp:Tn(u.timestamp),model:typeof f.model=="string"&&f.model?f.model:null,tokens:{...sn},files_read:[],files_written:[]},obs:new yn,io:new wn,promptRecorded:!1},o.set(m,h),o.size>r.maxRows)return{snapshot:{status:"partial"},sessionUsage:null};if(p!==null&&s.has(p)){if(!i.has(p)){i.add(p);let g=s.get(p);h.io.record({direction:"read",kind:"prompt",id:p,ref:null,bytes:g,basis:g===null?"unknown":"input_text"}),h.promptRecorded=!0}}else h.io.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})}let _=pe(f.outputTokens);if(_!==null&&(h.meta.tokens.output=(h.meta.tokens.output??0)+_),h.meta.model===null&&typeof f.model=="string"&&f.model&&(h.meta.model=f.model),Array.isArray(f.toolRequests))for(let g of f.toolRequests){let w=ie(g);if(!w)continue;let y=typeof w.name=="string"?w.name.toLowerCase():"",E=typeof w.toolCallId=="string"&&w.toolCallId?w.toolCallId:null,T=w.arguments;if(y==="create"){let b=ie(T),A=typeof b?.path=="string"?b.path:null,I=typeof b?.file_text=="string"?Buffer.byteLength(b.file_text,"utf8"):null;A!==null?h.obs.record(E??m,"written",A,I):at(h.io,E)}else if(y==="apply_patch")if(typeof T=="string"){let b=K2(T);if(b.length>0)for(let A of b)h.obs.record(E??m,"written",A.path,A.bytes);else at(h.io,E)}else at(h.io,E);else if(Y2.has(y)){let b=ie(T),A=typeof b?.path=="string"?b.path:null;A!==null?h.obs.record(E??m,"read",A,null):at(h.io,E)}else J2.has(y)||at(h.io,E)}}let d=[];for(let{meta:u,obs:f,io:m}of o.values()){let p=f.files("read"),h=f.files("written"),_=m.entries();d.push({...u,files_read:p,files_written:h,external_io:_,read_bytes:Xt(p,_,"read"),write_bytes:Xt(h,_,"written"),model_provider:null,pricing_facts:null})}return c?{snapshot:{status:"partial"},sessionUsage:null}:{snapshot:{status:"complete",source:t,revision:n,checkpoint:n,responses:d},sessionUsage:a.size>0?[...a.values()]:null}}function eG(){return process.env.HOME||process.env.USERPROFILE||""}var Bh=class{sessionStateDir;constructor(t={}){this.sessionStateDir=Gb(t.copilotSessionStateDir??Bb(eG(),".copilot","session-state"))}async discover(t,n,r=null){$e(t);let s;try{s=await B2(this.sessionStateDir)}catch{return{sources:[],truncated:!1}}let o=[];for(let i of s.sort(We)){t.signal.throwIfAborted();let a=Bb(this.sessionStateDir,i,Xb);if(!(await X2(a).catch(()=>null))?.isFile())continue;let l=await G2(a).catch(()=>Gb(a)),d={provider:bs,sessionid:i,source_id:l};r!==null&&We(`${l}\0${i}`,r)<=0||o.push(d)}return o.sort((i,a)=>We(`${i.source_id}\0${i.sessionid}`,`${a.source_id}\0${a.sessionid}`)),{sources:o.slice(0,n),truncated:!1}}matches(t,n){return Wb(n)===Xb&&Wb(V2(n))===t.sessionid}async inspect(t,n){if($e(n),t.provider!==bs)return{status:"unsupported"};let r=await It(t.source_id,[this.sessionStateDir]);if(!r||!this.matches(t,r))return{status:"unavailable"};let s=await on(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(t,n,r){return(await this.readWithUsage(t,n,r)).snapshot}async readWithUsage(t,n,r){if($e(r),t.provider!==bs)return{snapshot:{status:"unsupported"},sessionUsage:null};let s=await It(t.source_id,[this.sessionStateDir]);if(!s||!this.matches(t,s))return{snapshot:{status:"unavailable"},sessionUsage:null};let o=await on(s,r).catch(()=>null);if(!o||o.revision!==n)return{snapshot:{status:"partial"},sessionUsage:null};let i=Hd(o.data,r);return i?Z2(i,t,n,r):{snapshot:{status:"partial"},sessionUsage:null}}};function Vb(e={}){return new Bh(e)}import{readdir as Jb,readFile as tG,realpath as Gh,stat as Yb}from"node:fs/promises";import{basename as _c,dirname as Ri,isAbsolute as Vh,join as ki,relative as Qb,resolve as hc,sep as Zb}from"node:path";var As="kimi",Jh="wire.jsonl",eA="agents",nG=new Set(["1.4","1.5"]),rG=5e5,sG=8*1024*1024,oG=new Set(["read"]),iG=new Set(["write","edit"]),aG=new Set(["todolist","tasklist","taskoutput","taskstop","waitfor","creategoal","updategoal","getgoal","enterplanmode","exitplanmode","agentswarm","agent","skill","croncreate","crondelete","cronlist"]);function cG(e){return aG.has(e)||ws(e)}function lG(){return process.env.HOME||process.env.USERPROFILE||""}function dG(e,t){if(e.length>0&&e[e.length-1]!==10)return null;let n=[],r=0;for(;r<e.length;){t.signal.throwIfAborted();let s=e.indexOf(10,r);s===-1&&(s=e.length);let o=e.toString("utf8",r,s);if(r=s+1,!!o.trim())try{let i=ie(JSON.parse(o));if(!i)return null;n.push(i)}catch{return null}}return n}function Kb(e){let t=ie(e);if(!t)return null;let n=pe(t.inputOther),r=pe(t.inputCacheRead),s=pe(t.inputCacheCreation),o=pe(t.output);return n===null||r===null||s===null||o===null?null:{input_uncached:n+s,input_cached:r,input_cache_write:s,output:o}}function uG(e){if(!Array.isArray(e))return null;let t=0,n=!1;for(let r of e){let s=ie(r);s?.type==="text"&&typeof s.text=="string"&&(t+=Buffer.byteLength(s.text,"utf8"),n=!0)}return n?t:null}var fG=new Set(["system_trigger","cron_job","task"]);function mG(e,t,n,r){let s=e.find(w=>w.type==="metadata"),o=s&&typeof s.protocol_version=="string"?s.protocol_version:null;if(o!==null&&!nG.has(o))return{status:"unsupported"};let i=pG(t.source_id),a=new Map,c=new Map,l=[],d=new Set,u=new Set,f=null,m=!1,p=w=>`${i}/${w}`,h=(w,y)=>{let E=p(w),T=a.get(E);return T||(T={meta:{response_id:E,timestamp:Tn(typeof y=="number"?y:null),model:null,tokens:{...sn},files_read:[],files_written:[]},obs:new yn,io:new wn,turnStepKey:null,tokensSource:"none"},a.set(E,T)),T},_=(w,y)=>{if(w.turnStepKey!==null)return;let E=y.turnId===void 0?null:String(y.turnId),T=y.step===void 0?null:String(y.step);E!==null&&T!==null&&(w.turnStepKey=`${E}.${T}`)};for(let w of e){if(r.signal.throwIfAborted(),w.type==="turn.prompt"){let E=ie(w.origin),T=typeof E?.kind=="string"?E.kind:null,b=typeof w.promptId=="string"&&w.promptId?w.promptId:null;if(T!==null&&fG.has(T))continue;if(b!==null){if(d.has(b))continue;d.add(b)}T==="user"?l.push({bytes:uG(w.input),id:b}):l.push({bytes:null,id:b});continue}if(w.type==="usage.record"){if(u.size>1){m=!0;continue}if(u.size===0){f===null&&(m=!0);continue}let[E]=u,T=a.get(p(E));if(!T){m=!0;continue}if(T.tokensSource==="record"){m=!0;continue}let b=Kb(w.usage);b&&(T.meta.tokens=b,T.tokensSource="record");continue}if(w.type==="llm.request"){let E=typeof w.turnStep=="string"?w.turnStep:null,T=(typeof w.modelAlias=="string"&&w.modelAlias?w.modelAlias:null)??(typeof w.model=="string"&&w.model?w.model:null);E!==null&&T!==null&&(c.has(E)?c.get(E)!==T&&c.set(E,null):c.set(E,T));continue}if(w.type!=="context.append_loop_event")continue;let y=ie(w.event);if(y){if(y.type==="step.begin"){let E=typeof y.uuid=="string"&&y.uuid?y.uuid:null;if(E===null)continue;let T=h(E,w.time);if(a.size>r.maxRows)return{status:"partial"};if(u.add(E),_(T,y),l.length>0){for(let b of l)T.io.record({direction:"read",kind:"prompt",id:b.id,ref:null,bytes:b.bytes,basis:b.bytes===null?"unknown":"input_text"});l.length=0}continue}if(y.type==="step.end"){let E=typeof y.uuid=="string"&&y.uuid?y.uuid:null;if(E===null)continue;let T=h(E,w.time);if(a.size>r.maxRows)return{status:"partial"};u.delete(E),f=E,_(T,y);let b=Kb(y.usage);b&&(T.meta.tokens=b),T.tokensSource="end",T.meta.timestamp===null&&(T.meta.timestamp=Tn(typeof w.time=="number"?w.time:null));continue}if(y.type==="tool.call"){let E=typeof y.stepUuid=="string"&&y.stepUuid?y.stepUuid:null;if(E===null)continue;let T=h(E,w.time);if(a.size>r.maxRows)return{status:"partial"};let b=typeof y.name=="string"?y.name.toLowerCase():"",A=typeof y.toolCallId=="string"&&y.toolCallId?y.toolCallId:null,I=ie(y.args),R=typeof I?.path=="string"&&I.path?I.path:typeof I?.file_path=="string"&&I.file_path?I.file_path:null;oG.has(b)?R!==null?T.obs.record(A??"","read",R,null):at(T.io,A):iG.has(b)?R!==null?T.obs.record(A??"","written",R,vi(I)):at(T.io,A):cG(b)||at(T.io,A);continue}}}let g=[];for(let{meta:w,obs:y,io:E,turnStepKey:T}of a.values()){w.model===null&&T!==null&&(w.model=c.get(T)??null);let b=y.files("read"),A=y.files("written"),I=E.entries();g.push({...w,files_read:b,files_written:A,external_io:I,read_bytes:Xt(b,I,"read"),write_bytes:Xt(A,I,"written"),model_provider:null,pricing_facts:fr({},w.tokens.output,w.tokens.input_cache_write)})}return{status:"complete",source:t,revision:n,checkpoint:n,responses:g,...m?{capture_status:"partial"}:{}}}function Xh(e){return _c(e)===Jh&&_c(Ri(Ri(e)))===eA}function zb(e){return _c(Ri(Ri(Ri(e))))}function pG(e){return _c(Ri(e))}function hG(e,t){let n=Qb(t,e);return n===""||!n.startsWith(`..${Zb}`)&&n!==".."&&!Vh(n)}function _G(e){if(e instanceof Error&&e.name==="AbortError")throw e}var gc=class{home;sessionsDir;indexPath;maxDiscoveryTraversalVisits;constructor(t={}){this.home=hc(t.kimiHome??process.env.KIMI_CODE_HOME??ki(lG(),".kimi-code")),this.sessionsDir=ki(this.home,"sessions"),this.indexPath=ki(this.home,"session_index.jsonl"),this.maxDiscoveryTraversalVisits=t.maxDiscoveryTraversalVisits&&t.maxDiscoveryTraversalVisits>0?Math.trunc(t.maxDiscoveryTraversalVisits):rG}async discover(t,n,r=null){$e(t);let s=new Set,o=!1,i=await Gh(this.sessionsDir).catch(()=>hc(this.sessionsDir)),a=f=>{Xh(f)&&hG(f,i)&&s.add(f)},c=0,l=async(f,m)=>{if(t.signal.throwIfAborted(),o)return;let p=await Jb(f,{withFileTypes:!0}).catch(()=>[]);p.sort((h,_)=>We(h.name,_.name));for(let h of p){if(t.signal.throwIfAborted(),c+=1,c>this.maxDiscoveryTraversalVisits){o=!0;return}let _=ki(f,h.name);if(h.isDirectory()&&!h.isSymbolicLink()&&m<4){if(await l(_,m+1),o)return}else h.isFile()&&h.name===Jh&&Xh(_)&&a(await Gh(_).catch(()=>hc(_)))}};await l(this.sessionsDir,0);try{await this.unionIndex(a,t)}catch(f){_G(f)}let d=[...s].sort(We);return{sources:(r===null?d:d.filter(f=>We(f,r)>0)).slice(0,n).map(f=>({provider:As,sessionid:zb(f),source_id:f})),truncated:o}}async unionIndex(t,n){let r=await Yb(this.indexPath).catch(()=>null);if(!r?.isFile()||r.size>sG)return;let s=await tG(this.indexPath,{signal:n.signal});for(let o of s.toString("utf8").split(`
208
+ `)){if(n.signal.throwIfAborted(),!o.trim())continue;let i;try{i=ie(JSON.parse(o))}catch{continue}let a=typeof i?.sessionId=="string"?i.sessionId:null,c=typeof i?.sessionDir=="string"?i.sessionDir:null;if(!a||!c||!Vh(c)||_c(c)!==a)continue;let l=Qb(this.sessionsDir,hc(c));if(l.startsWith(`..${Zb}`)||l===".."||Vh(l))continue;let d=ki(c,eA),u=await Jb(d,{withFileTypes:!0}).catch(()=>[]);for(let f of u){if(!f.isDirectory())continue;let m=ki(d,f.name,Jh);(await Yb(m).catch(()=>null))?.isFile()&&t(await Gh(m).catch(()=>hc(m)))}}}matches(t,n){return Xh(n)&&zb(n)===t.sessionid}async inspect(t,n){if($e(n),t.provider!==As)return{status:"unsupported"};let r=await It(t.source_id,[this.sessionsDir]);if(!r||!this.matches(t,r))return{status:"unavailable"};let s=await on(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(t,n,r){if($e(r),t.provider!==As)return{status:"unsupported"};let s=await It(t.source_id,[this.sessionsDir]);if(!s||!this.matches(t,s))return{status:"unavailable"};let o=await on(s,r).catch(()=>null);if(!o)return{status:"partial"};if(o.revision!==n)return{status:"partial"};let i=dG(o.data,r);return i?mG(i,t,n,r):{status:"partial"}}};function tA(e={}){return new gc(e)}var gG=new URL("./cli/index.js",import.meta.url).href,Is=class{map=new Map;record(t,n,r,s){if(typeof r!="string"||r.length===0||r.includes("\0"))return;let o=`${t}\0${n}\0${r}`;this.map.has(o)||this.map.set(o,{direction:n,path:r,bytes:s})}files(t){let n=[];for(let r of this.map.values())r.direction===t&&n.push({path:r.path,bytes:r.bytes});return n}absorb(t){for(let[n,r]of t.map)this.map.has(n)||this.map.set(n,r)}},AG=0,ks=class{map=new Map;record(t){let n;t.id!==null?n=`id\0${t.id}\0${t.direction}\0${t.kind}`:t.bytes===null?n=`mark\0${t.direction}\0${t.kind}\0${t.basis}\0${t.ref??""}`:n=`seq\0${AG++}`,this.map.has(n)||this.map.set(n,t)}entries(){return[...this.map.values()]}absorb(t){for(let[n,r]of t.map)this.map.has(n)||this.map.set(n,r)}},IG=new Set(["schedulewakeup","taskcreate","taskupdate","taskoutput","taskstop","todowrite","todoread","croncreate","crondelete","cronlist","monitor","listagents","toolsearch","askuserquestion","exitplanmode","agent","skill","job"]);function t_(e){return typeof e=="string"&&IG.has(e.toLowerCase())}function wc(e,t){e.record({direction:"read",kind:"unattributed",id:t,ref:null,bytes:null,basis:"unknown"}),e.record({direction:"write",kind:"unattributed",id:t,ref:null,bytes:null,basis:"unknown"})}function lA(e){if(typeof e!="string"||e.length===0)return null;try{let t=new URL(e);return t.protocol!=="http:"&&t.protocol!=="https:"?null:`${t.origin}${t.pathname}`}catch{return null}}function Li(e,t,n){if(e===null)return null;let r=n==="written"?"write":"read",s=0;for(let o of e){if(o.bytes===null)return null;s+=o.bytes}for(let o of t)if(o.direction===r){if(o.bytes===null)return null;s+=o.bytes}return s}function xi(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function n_(e,t,n){let r={},s=xi(e.cacheWrite5m),o=xi(e.cacheWrite1h),i=xi(e.reasoning),a=xi(e.webSearch),c=xi(e.webFetch);i!==null&&(t===null||i<=t)&&(r.reasoning_output_tokens=i);let l=(s??0)+(o??0),d=n===null||l<=n;return s!==null&&d&&(r.cache_write_5m_tokens=s),o!==null&&d&&(r.cache_write_1h_tokens=o),a!==null&&(r.web_search_requests=a),c!==null&&(r.web_fetch_requests=c),Object.keys(r).length>0?r:null}var Ni=["claude","codex","lmplayer",Ts,vs,bo,bs,Ss,As,"muse","miniplayer"],Ec={input_uncached:null,input_cached:null,input_cache_write:null,output:null},kG=5e5,r_="bx3",RG=EG(gG);function Zd(){return process.env.HOME||process.env.USERPROFILE||""}function NG(){if(process.env.OPENCODE_DB)return[jr(process.env.OPENCODE_DB)];let e=process.env.XDG_DATA_HOME||Ao(Zd(),".local","share");return[Ao(e,"lmplayer","opencode-local.db"),Ao(e,"lmplayer","opencode-dev.db")]}function xG(){return RG("node:sqlite").DatabaseSync}function he(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}function an(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function s_(e){if(typeof e!="string"&&typeof e!="number")return null;let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():null}function yc(e){if(!Number.isSafeInteger(e.maxBytes)||e.maxBytes<=0)throw new Error("maxBytes must be a positive safe integer");if(!Number.isSafeInteger(e.maxRows)||e.maxRows<=0)throw new Error("maxRows must be a positive safe integer");e.signal.throwIfAborted()}function eu(e){return`${e.source_id}\0${e.sessionid}`}function Rs(e,t){return e<t?-1:e>t?1:0}function Yh(e,t){return Rs(eu(e),eu(t))}var Kh=["claude","codex","lmplayer"];function LG(e){let t={version:2,pos:e.pos,done:e.done,rr:e.rr};return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function sA(e){let t=he(e);if(!t||typeof t.source_id!="string"||typeof t.sessionid!="string"||t.source_id.includes("\0")||t.sessionid.includes("\0"))throw new Error("invalid passive session discovery cursor");return{source_id:t.source_id,sessionid:t.sessionid}}function CG(e){if(e===void 0)return null;let t;try{t=he(JSON.parse(Buffer.from(e,"base64url").toString("utf8")))}catch{throw new Error("invalid passive session discovery cursor")}if(!t)throw new Error("invalid passive session discovery cursor");if(t.version===1){let o=t.provider;if(!Number.isSafeInteger(o)||o<0||o>=Kh.length)throw new Error("invalid passive session discovery cursor");let i=o,a=sA({source_id:t.source_id,sessionid:t.sessionid}),c=new Map([[Kh[i],a]]),l=new Set(Kh.slice(0,i));return{pos:c,done:l,rr:0}}if(t.version!==2)throw new Error("invalid passive session discovery cursor");let n=he(t.pos);if(!n||!Array.isArray(t.done)||!Number.isSafeInteger(t.rr)||t.rr<0)throw new Error("invalid passive session discovery cursor");let r=new Map;for(let[o,i]of Object.entries(n))r.set(o,sA(i));let s=new Set;for(let o of t.done){if(typeof o!="string")throw new Error("invalid passive session discovery cursor");s.add(o)}return{pos:r,done:s,rr:t.rr}}var OG=["read","read_file","view","view_file","view_image"],DG=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],$G=["filePath","path","file","file_path","filepath","notebook_path","paths"];function dA(e){if(typeof e!="string")return null;let t=e.toLowerCase();return t==="apply_patch"?"apply_patch":OG.includes(t)?"read":DG.includes(t)?"written":null}function MG(e){return typeof e=="string"?(()=>{try{return JSON.parse(e)}catch{return e}})():e}function tu(e,t=$G){let n=he(e);if(!n)return null;for(let r of t){let s=n[r];if(typeof s=="string"&&s.length>0)return s;if(Array.isArray(s)){for(let o of s)if(typeof o=="string"&&o.length>0)return o}}return null}function uA(e){let t=he(e);if(!t)return null;if(typeof t.content=="string")return Buffer.byteLength(t.content,"utf8");if(typeof t.new_string=="string")return Buffer.byteLength(t.new_string,"utf8");if(typeof t.newString=="string")return Buffer.byteLength(t.newString,"utf8");if(typeof t.new_source=="string")return Buffer.byteLength(t.new_source,"utf8");if(typeof t.newSource=="string")return Buffer.byteLength(t.newSource,"utf8");if(Array.isArray(t.edits)){let n=0;for(let r of t.edits){let s=he(r),o=s?.new_string??s?.newString;if(typeof o!="string")return null;n+=Buffer.byteLength(o,"utf8")}return n}return null}function nu(e){let t=new Map,n=null,r=()=>{n&&(t.set(n.path,(t.get(n.path)??0)+n.bytes),n=null)};for(let s of e.split(`
209
209
  `)){let o=s.replace(/\r$/,""),i=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(o);if(i){r(),n={path:i[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(o);if(a){n&&(n.path=a[1].trim());continue}if(o.startsWith("*** ")){r();continue}n&&o.startsWith("+")&&(n.bytes+=Buffer.byteLength(o.slice(1),"utf8")+1)}return r(),[...t].map(([s,o])=>({path:s,bytes:o}))}var PG=[["text(await tools.apply_patch(",2],["await tools.apply_patch(",1],["tools.apply_patch(",1]];function UG(e){let t=0,n=e.length,r=()=>{for(;t<n&&/\s/.test(e[t]);)t++};r();let s=0,o=!1;for(let[l,d]of PG)if(e.startsWith(l,t)){t+=l.length,s=d,o=!0;break}if(!o||e[t]!=='"')return null;let i=t;t++;let a=!1;for(;t<n;){let l=e[t];if(l==="\\"){t+=2;continue}if(l==='"'){t++,a=!0;break}t++}if(!a)return null;let c;try{c=JSON.parse(e.slice(i,t))}catch{return null}if(typeof c!="string")return null;for(let l=0;l<s;l++){if(r(),e[t]!==")")return null;t++}return r(),e[t]===";"&&t++,r(),t<n?null:c}function oA(e){if(e.length===0||e.endsWith(`
210
210
  `))return null;let t=[];for(let n of e.split(`
211
211
  `)){let r=/^\s*\d+\t(.*)$/s.exec(n);if(r===null)return null;t.push(r[1])}return t.join(`
212
212
  `)}async function iA(e,t){yc(t);let n=await nA(e).catch(()=>null);if(!n?.isFile()||n.size>t.maxBytes)return null;let r=await wG(e,{signal:t.signal});t.signal.throwIfAborted();let s=await nA(e).catch(()=>null);return!s?.isFile()||n.dev!==s.dev||n.ino!==s.ino||n.size!==s.size||n.mtimeMs!==s.mtimeMs?null:{revision:`${r_}:sha256:${e_("sha256").update(r).digest("hex")}`,data:r}}function FG(e,t){if(e.length>0&&e[e.length-1]!==10)return null;let n=[],r=0;for(;r<e.length;){t.signal.throwIfAborted();let s=e.indexOf(10,r);s===-1&&(s=e.length);let o=e.toString("utf8",r,s);if(r=s+1,!!o.trim())try{let i=he(JSON.parse(o));if(!i)return null;n.push(i)}catch{return null}}return n}function jG(e){return Qd(vG(e))==="subagents"}function qG(e){let t=he(e);if(!t)return null;let n=an(t.input_tokens),r=an(t.output_tokens);if(n===null||r===null)return null;let s=t.cache_read_input_tokens===void 0?0:an(t.cache_read_input_tokens),o=t.cache_creation_input_tokens===void 0?0:an(t.cache_creation_input_tokens);return s===null||o===null?null:{input_uncached:n+o,input_cached:s,input_cache_write:o,output:r}}function HG(e,t){let n=new Map;for(let r of e){if(t.signal.throwIfAborted(),r.type!=="user")continue;let s=he(r.message),o=Array.isArray(s?.content)?s.content:null;if(!o)continue;let i=o.map(he).filter(d=>d?.type==="tool_result"),a=i.length===1,c=he(r.toolUseResult),l=c?.type==="text"?he(c.file):null;for(let d of i){if(typeof d.tool_use_id!="string"||d.tool_use_id.length===0)continue;let u,f=null;if(d.is_error===!0)u=null;else if(a&&l&&typeof l.content=="string")u=Buffer.byteLength(l.content,"utf8"),f=typeof l.filePath=="string"?l.filePath:null;else if(typeof d.content=="string"){let m=oA(d.content);u=m!==null?Buffer.byteLength(m,"utf8"):null}else if(Array.isArray(d.content)){let m=d.content.map(he).filter(p=>p?.type==="text"&&typeof p.text=="string").map(p=>p.text);if(m.length===1){let p=oA(m[0]);u=p!==null?Buffer.byteLength(p,"utf8"):null}else u=null}else u=null;n.set(d.tool_use_id,{bytes:u,cleanPath:f})}}return n}function WG(e){let t=e?.content;if(typeof t=="string")return Buffer.byteLength(t,"utf8");if(Array.isArray(t)){let n=0,r=!1;for(let s of t){let o=he(s);o?.type==="text"&&typeof o.text=="string"&&(n+=Buffer.byteLength(o.text,"utf8"),r=!0)}if(r)return n}return null}function BG(e){if(e.type!=="user"||e.toolUseResult!==void 0||e.isMeta===!0||e.isCompactSummary===!0||e.isVisibleInTranscriptOnly===!0||e.promptSource==="system"||e.scheduledTaskId!==void 0||e.scheduledFireId!==void 0)return!1;let t=he(e.message)?.content;return!(Array.isArray(t)&&t.some(n=>he(n)?.type==="tool_result"))}function GG(e){let t=new Map,n=new Set,r=new Map;for(let i of e){let a=typeof i.uuid=="string"&&i.uuid?i.uuid:null;if(a!==null&&(t.set(a,typeof i.parentUuid=="string"&&i.parentUuid?i.parentUuid:null),BG(i))){n.add(a);let c=WG(he(i.message));c!==null&&r.set(a,c)}}let s=new Map;return{promptBytes:r,parent:t,resolve:i=>{let a=[],c=new Set,l=i,d;for(;;){let u=s.get(l);if(u){d=u;break}if(n.has(l)){d={kind:"found",uuid:l};break}if(!t.has(l)){d={kind:"broken"};break}if(c.has(l)){d={kind:"broken"};break}c.add(l),a.push(l);let f=t.get(l)??null;if(f===null){d={kind:"clean"};break}l=f}for(let u of a)s.set(u,d);return d}}}function XG(e,t){let n=he(t.cache_creation),r=he(t.output_tokens_details),s=he(t.server_tool_use),o=(i,a)=>{let c=xi(a);c!==null&&(e[i]=c)};o("cacheWrite5m",n?.ephemeral_5m_input_tokens),o("cacheWrite1h",n?.ephemeral_1h_input_tokens),o("reasoning",r?.thinking_tokens),o("webSearch",s?.web_search_requests),o("webFetch",s?.web_fetch_requests)}function VG(e,t,n,r,s=!1){let o=HG(e,r),{promptBytes:i,parent:a,resolve:c}=GG(e),l=new Set,d=(p,h)=>{let _=i.get(h)??null;p.record({direction:"read",kind:"prompt",id:h,ref:null,bytes:_,basis:_===null?"unknown":"input_text"})},u=p=>{p.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})},f=new Map;for(let p of e){if(r.signal.throwIfAborted(),p.type!=="assistant"||p.isSidechain===!0&&!s||p.isMeta===!0)continue;let h=he(p.message);if(!h||typeof h.id!="string"||h.id.length===0)continue;let _=f.get(h.id);if(!_){if(_={meta:{response_id:h.id,timestamp:s_(p.timestamp),model:null,tokens:{...Ec},files_read:[],files_written:[]},obs:new Is,io:new ks,pricingRaw:{}},f.set(h.id,_),f.size>r.maxRows)return{status:"partial"};let w=typeof p.uuid=="string"&&p.uuid?p.uuid:null;if(w===null)u(_.io);else{let y=c(w);if(y.kind==="broken")u(_.io);else if(y.kind==="found"){let E=[],T=y.uuid;for(;T!==null&&!l.has(T);){let b=T;l.add(b),E.push(b);let A=a.get(b)??null;if(A===null){T=null;continue}let I=c(A);T=I.kind==="found"?I.uuid:null}for(let b=E.length-1;b>=0;b-=1)d(_.io,E[b])}}}let g=he(h.usage);if(g){let w=qG(g);w&&(_.meta.tokens=w),XG(_.pricingRaw,g)}if(typeof h.model=="string"&&h.model&&(_.meta.model=h.model),Array.isArray(h.content))for(let w of h.content){let y=he(w);if(y?.type!=="tool_use")continue;let E=typeof y.id=="string"&&y.id?y.id:h.id,T=dA(y.name),b=MG(y.input),A=typeof y.name=="string"?y.name.toLowerCase():"";if(T==="read"){let I=tu(b,["file_path","filePath","path","file"]);if(I===null)continue;let R=o.get(E),L=R===void 0||R.cleanPath!==null&&R.cleanPath!==I?null:R.bytes;_.obs.record(E,"read",I,L)}else if(T==="written")_.obs.record(E,"written",tu(b),uA(b));else if(T==="apply_patch"){let I=typeof b=="string"?b:he(b)?.input;if(typeof I=="string")for(let R of nu(I))_.obs.record(E,"written",R.path,R.bytes)}else A==="webfetch"||A==="websearch"?_.io.record({direction:"read",kind:"web",id:E,ref:lA(he(b)?.url),bytes:null,basis:"unknown"}):t_(y.name)||wc(_.io,E)}}let m=[];for(let{meta:p,obs:h,io:_,pricingRaw:g}of f.values()){let w=h.files("read"),y=h.files("written"),E=_.entries();m.push({...p,files_read:w,files_written:y,external_io:E,read_bytes:Li(w,E,"read"),write_bytes:Li(y,E,"written"),model_provider:null,pricing_facts:n_(g,p.tokens.output,p.tokens.input_cache_write)})}return{status:"complete",source:t,revision:n,checkpoint:n,responses:m}}function JG(e){let t=he(e);if(!t)return null;let n=an(t.input_tokens),r=an(t.cached_input_tokens),s=an(t.output_tokens);if(n===null||r===null||s===null||r>n)return null;let o=t.cache_write_input_tokens===void 0?null:an(t.cache_write_input_tokens);return t.cache_write_input_tokens!==void 0&&o===null?null:{input_uncached:n-r,input_cached:r,input_cache_write:o,output:s}}function YG(e,t,n){let r=typeof e.call_id=="string"&&e.call_id?e.call_id:null,s=typeof e.name=="string"?e.name.toLowerCase():"",o=e.type==="custom_tool_call"?e.input:e.arguments;if(s==="apply_patch"&&typeof o=="string"){if(r!==null)for(let i of nu(o))t.record(r,"written",i.path,i.bytes);return}if(typeof o=="string"){let i=UG(o);if(i!==null){if(r!==null)for(let a of nu(i))t.record(r,"written",a.path,a.bytes);return}}t_(s)||wc(n,r)}function KG(e){let n=he(e.internal_chat_message_metadata_passthrough)?.content_item_kinds,r=e.content;if(!Array.isArray(n))return"unknown";if(!Array.isArray(r))return"injected";let s=0,o=!1;for(let i=0;i<r.length;i+=1){if(n[i]!=="user.text")continue;let a=he(r[i]);a&&typeof a.text=="string"&&(s+=Buffer.byteLength(a.text,"utf8"),o=!0)}return o?{bytes:s}:"injected"}function zG(e,t,n,r){let s=new Map,o=new Map,i=null,a=null,c=new Is,l=new ks,d=0,u=!1,f=!0,m=new Set;for(let h of e){r.signal.throwIfAborted();let _=he(h.payload);if(h.type==="session_meta"&&_&&typeof _.model_provider=="string"&&_.model_provider){a=_.model_provider;continue}if(h.type==="turn_context"&&_){let E=typeof _.model=="string"&&_.model?_.model:null;E&&(i=E),E&&typeof _.turn_id=="string"&&o.set(_.turn_id,E);continue}if(h.type==="response_item"&&_){if(_.type==="function_call"||_.type==="custom_tool_call")YG(_,c,l);else if(_.type==="local_shell_call")wc(l,typeof _.call_id=="string"?_.call_id:null);else if(_.type==="web_search_call")d+=1,l.record({direction:"read",kind:"web",id:typeof _.id=="string"?_.id:null,ref:null,bytes:null,basis:"unknown"});else if(_.type==="message"&&_.role==="user"){let E=KG(_),T=typeof _.id=="string"&&_.id?_.id:null;E==="unknown"?l.record({direction:"read",kind:"prompt",id:T,ref:null,bytes:null,basis:"unknown"}):E!=="injected"&&(T===null?l.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"}):m.has(T)||(m.add(T),l.record({direction:"read",kind:"prompt",id:T,ref:null,bytes:E.bytes,basis:"input_text"})))}continue}if(h.type==="event_msg"&&_?.type==="token_count"){u=!0,f&&(c=new Is,l=new ks,d=0);continue}if(h.type!=="token_usage_record"||!_)continue;if(typeof _.response_id!="string"||_.response_id.length===0)return{status:"unsupported"};let g=JG(_.usage);if(!g)return{status:"partial"};let w=typeof _.turn_id=="string"?o.get(_.turn_id)??i:i,y=s.get(_.response_id);if(!y&&(y={meta:{response_id:_.response_id,timestamp:null,model:null,tokens:g,files_read:[],files_written:[]},obs:new Is,io:new ks,rawUsage:null,webSearch:0},s.set(_.response_id,y),s.size>r.maxRows))return{status:"partial"};f=!1,y.meta.timestamp=s_(h.timestamp),y.meta.model=w??null,y.meta.tokens=g,y.rawUsage=he(_.usage),y.obs.absorb(c),y.io.absorb(l),y.webSearch+=d,c=new Is,l=new ks,d=0}if(u&&s.size===0)return{status:"unsupported"};let p=[];for(let{meta:h,obs:_,io:g,rawUsage:w,webSearch:y}of s.values()){let E=_.files("read"),T=_.files("written"),b=g.entries(),A=he(w),I=n_({reasoning:A?.reasoning_output_tokens,webSearch:y>0?y:void 0},h.tokens.output,h.tokens.input_cache_write);p.push({...h,files_read:E,files_written:T,external_io:b,read_bytes:Li(E,b,"read"),write_bytes:Li(T,b,"written"),model_provider:a,pricing_facts:I})}return{status:"complete",source:t,revision:n,checkpoint:n,responses:p,...u?{capture_status:"partial"}:{}}}function QG(e,t=!1){let n=he(e);if(!n)return{...Ec};let r=n.input===void 0?t?null:0:an(n.input),s=n.output===void 0?t?null:0:an(n.output),o=n.reasoning===void 0?t?null:0:an(n.reasoning),i=he(n.cache),a=i?.read===void 0?t?null:0:an(i.read),c=i?.write===void 0?t?null:0:an(i.write);return t&&r===0&&s===0&&o===0&&a===0&&c===0?{...Ec}:t?{input_uncached:r!==null&&c!==null&&Number.isSafeInteger(r+c)?r+c:null,input_cached:a,input_cache_write:c,output:s!==null&&o!==null&&Number.isSafeInteger(s+o)?s+o:null}:r===null||s===null||o===null||a===null||c===null?{...Ec}:r+s+o+a+c===0?{...Ec}:{input_uncached:r+c,input_cached:a,input_cache_write:c,output:s+o}}function aA(e,t,n){yc(n);let r=n.maxRows*20,s=e.prepare("SELECT (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM message WHERE session_id=?) + (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM part WHERE session_id=?) AS total").get(t,t),o=an(s?.total);if(o===null||o>n.maxBytes)return null;let i=e.prepare("SELECT id,time_created,time_updated,data FROM message WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(t,r+1),a=e.prepare("SELECT id,message_id,time_created,time_updated,data FROM part WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(t,r+1);if(i.length+a.length>r)return null;let c=0,l=e_("sha256");for(let d of[...i,...a]){n.signal.throwIfAborted();let u=JSON.stringify(d);if(c+=Buffer.byteLength(u),c>n.maxBytes)return null;l.update(u).update(`
213
- `)}return{revision:`${r_}:sha256:${l.digest("hex")}`,messages:i,parts:a}}var ZG=new Set(["session-job-notification"]);function eX(e){let t=0,n=!1,r=!1;for(let s of e){let o;try{o=he(JSON.parse(s.data))}catch{continue}let i=typeof o?.type=="string"?o.type:"";o?.synthetic===!0||o?.ignored===!0||(i==="text"&&typeof o.text=="string"?(t+=Buffer.byteLength(o.text,"utf8"),n=!0):i&&!ZG.has(i)&&(r=!0))}return n?t:r?"unknown":null}function tX(e,t,n,r){let s=new Map;for(let l of n.parts){let d=s.get(l.message_id)??[];d.push(l),s.set(l.message_id,d)}let o=new Map;for(let l of n.messages){let d;try{d=he(JSON.parse(l.data))}catch{continue}if(d?.role!=="user")continue;let u=eX(s.get(l.id)??[]);u==="unknown"?o.set(l.id,null):u!==null&&o.set(l.id,u)}let i=new Map,a=new Set;for(let l of n.messages){let d;try{d=he(JSON.parse(l.data))}catch{continue}if(d?.role!=="assistant")continue;let u=typeof d.parentID=="string"?d.parentID:null;u!==null&&o.has(u)&&!a.has(u)&&(a.add(u),i.set(l.id,{id:u,bytes:o.get(u)}))}let c=[];for(let l of n.messages){r.signal.throwIfAborted();let d;try{d=he(JSON.parse(l.data))}catch{return{status:"partial"}}if(r.requireBillingCounters&&d&&Object.hasOwn(d,"tokens")&&d.role!=="assistant")return{status:"partial"};if(!d||d.role!=="assistant")continue;let u=new Is,f=new ks,m=0,p=i.get(l.id);p&&f.record({direction:"read",kind:"prompt",id:p.id,ref:null,bytes:p.bytes,basis:p.bytes===null?"unknown":"input_text"});for(let A of s.get(l.id)??[]){let I;try{I=he(JSON.parse(A.data))}catch{return{status:"partial"}}if(I?.type!=="tool")continue;let R=typeof I.tool=="string"?I.tool.toLowerCase():"",L=dA(I.tool),N=he(I.state),k=he(N?.input),D=typeof I.callID=="string"&&I.callID?I.callID:typeof N?.callID=="string"&&N.callID?N.callID:A.id;if(L==="written")u.record(D,"written",tu(k),uA(k));else if(L==="apply_patch"){let O=k?.patchText;if(typeof O=="string")for(let v of nu(O))u.record(D,"written",v.path,v.bytes);else wc(f,D)}else if(L==="read"){let O=tu(k,["filePath","path","file","file_path"]);if(O===null)continue;let v=null;if(N?.status==="completed"){let S=he(he(N.metadata)?.display);S?.type==="file"&&typeof S.text=="string"&&(v=Buffer.byteLength(S.text,"utf8"))}u.record(D,"read",O,v)}else if(R==="webfetch"){m+=1;let O=N?.status==="completed"?N.output:void 0;f.record({direction:"read",kind:"web",id:D,ref:lA(k?.url),bytes:typeof O=="string"?Buffer.byteLength(O,"utf8"):null,basis:typeof O=="string"?"normalized_content":"unknown"})}else t_(I.tool)||wc(f,D)}let h=he(d.time),_=he(d.model)?.modelID??d.modelID,g=QG(d.tokens,r.requireBillingCounters),w=he(d.tokens),y=u.files("read"),E=u.files("written"),T=f.entries(),b=n_({reasoning:w?.reasoning,webFetch:m>0?m:void 0},g.output,g.input_cache_write);if(c.push({response_id:l.id,timestamp:s_(h?.created??l.time_created),model:typeof _=="string"&&_?_:null,tokens:g,files_read:y,files_written:E,external_io:T,read_bytes:Li(y,T,"read"),write_bytes:Li(E,T,"written"),model_provider:typeof d.providerID=="string"&&d.providerID?d.providerID:null,pricing_facts:b}),c.length>r.maxRows)return{status:"partial"}}return{status:"complete",source:e,revision:t,checkpoint:t,responses:c}}async function zh(e,t){if(!rA(e))return null;let n=await yG(e).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await Qh(e).catch(()=>null);if(!r)return null;for(let s of t){let o=await Qh(s).catch(()=>Fr(s)),i=SG(o,r);if(i===""||!i.startsWith(`..${bG}`)&&i!==".."&&!rA(i))return r}return null}async function cA(e,t,n,r,s=null){let o=[],i=0,a=!1;async function c(l){r.signal.throwIfAborted();let d=await TG(l,{withFileTypes:!0}).catch(()=>[]);d.sort((u,f)=>Rs(u.name,f.name));for(let u of d){if(r.signal.throwIfAborted(),o.length>=t)return;if(i+=1,i>n){a=!0;return}let f=Ao(l,u.name);if(u.isDirectory()&&!u.isSymbolicLink()){if(await c(f),a||o.length>=t)return}else if(u.isFile()&&u.name.endsWith(".jsonl")){let m=await Qh(f).catch(()=>Fr(f));(s===null||Rs(m,s)>0)&&o.push(m)}}}return await c(e),{paths:o.sort(Rs),truncated:a}}function nX(e,t){let n=new Set;if(t.length===0)return n;let r=400;for(let{db:s}of e)for(let o=0;o<t.length;o+=r){let i=t.slice(o,o+r);try{let a=s.prepare(`SELECT id FROM session WHERE id IN (${i.map(()=>"?").join(",")})`).all(...i);for(let c of a)typeof c.id=="string"&&n.add(c.id)}catch{}}return n}var Zh=class{claudeProjectsDir;codexSessionDirs;lmplayerDbPaths;sqliteBusyTimeoutMs;maxDiscoveryTraversalVisits;agyReader;dshReader;qwenReader;opencodeReader;copilotReader;kimiReader;sessionDataReaders;constructor(t={}){this.sessionDataReaders=Object.fromEntries([pb(t.museDataHome),Jd(t.miniplayerHome)].map(n=>[n.provider,new Si(n)])),this.claudeProjectsDir=Fr(t.claudeProjectsDir??Ao(Zd(),".claude","projects")),this.codexSessionDirs=(t.codexSessionDirs??[Ao(Zd(),".codex","sessions"),Ao(Zd(),".code","sessions")]).map(n=>Fr(n)),this.lmplayerDbPaths=(t.lmplayerDbPaths??NG()).map(n=>Fr(n)),this.sqliteBusyTimeoutMs=t.sqliteBusyTimeoutMs??5e3,this.maxDiscoveryTraversalVisits=t.maxDiscoveryTraversalVisits&&t.maxDiscoveryTraversalVisits>0?Math.trunc(t.maxDiscoveryTraversalVisits):kG,this.agyReader=kb(t.agyConversationsDir?{agyConversationsDir:t.agyConversationsDir}:{}),this.dshReader=$b(t.dshHome?{dshHome:t.dshHome}:{}),this.qwenReader=Ub(t.qwenProjectsDirs?{qwenProjectsDirs:t.qwenProjectsDirs}:{}),this.opencodeReader=Hb(t.opencodeDbPaths?{dbPaths:t.opencodeDbPaths}:{}),this.copilotReader=Vb(t.copilotSessionStateDir?{copilotSessionStateDir:t.copilotSessionStateDir}:{}),this.kimiReader=tA(t.kimiHome?{kimiHome:t.kimiHome}:{})}capabilities(){let t=e_("sha256").update(JSON.stringify({claudeProjectsDir:this.claudeProjectsDir,codexSessionDirs:this.codexSessionDirs,lmplayerDbPaths:this.lmplayerDbPaths,agyExtractionRevisionTag:Yd,sessionData:Object.values(this.sessionDataReaders).map(({format:n})=>[n.provider,n.root,n.revision])})).digest("hex");return{scope:"account",revision:`${r_}:${t}`,providers:[...Ni],metering:{muse:"partial",miniplayer:"partial",claude:"per_response",codex:"per_response",lmplayer:"per_response",opencode:"per_response",[Ss]:"per_response",[vs]:"per_response",[Ts]:"partial",[bs]:"partial",[As]:"per_response"}}}async discover(t){if(yc(t),!Number.isSafeInteger(t.maxSources)||t.maxSources<=0)throw new Error("maxSources must be a positive safe integer");let n=CG(t.after),r=n?.pos??new Map,s=n?.done??new Set,o=n?.rr??0,i=Ni.filter(_=>!s.has(_));if(i.length===0)return{sources:[],complete:!0,cursor:null};let a=new Map,c=new Map;for(let _ of i){t.signal.throwIfAborted();let g=r.get(_)??null,{sources:w,truncated:y}=await this.discoverProvider(Ni.indexOf(_),t,t.maxSources+1,g);if(y)throw new Error(`passive session discovery exceeded the traversal budget for provider "${_}"; cannot certify a complete or progressing sweep`);let E=g?eu({provider:_,source_id:g.source_id,sessionid:g.sessionid}):null,T=E===null?w:w.filter(b=>Rs(eu(b),E)>0);c.set(_,T.length>t.maxSources),a.set(_,T.slice(0,t.maxSources))}let l=o%i.length,d=i.map((_,g)=>i[(g+l)%i.length]),u=new Map(i.map(_=>[_,0])),f=[],m=!0;for(;f.length<t.maxSources&&m;){m=!1;for(let _ of d){if(f.length>=t.maxSources)break;let g=a.get(_),w=u.get(_);w<g.length&&(f.push(g[w]),u.set(_,w+1),m=!0)}}let p={},h=[...s];for(let _ of i){let g=a.get(_),w=u.get(_);if(!c.get(_)&&w===g.length){h.push(_);continue}if(w>0){let E=g[w-1];p[_]={source_id:E.source_id,sessionid:E.sessionid}}else{let E=r.get(_);E&&(p[_]=E)}}return Ni.every(_=>h.includes(_))?{sources:f,complete:!0,cursor:null}:{sources:f,complete:!1,cursor:LG({pos:p,done:h,rr:o+1})}}async inspect(t,n){if(yc(n),!Ni.includes(t.provider))return{status:"unsupported"};if(t.provider==="claude"||t.provider==="codex"){let r=t.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,s=await zh(t.source_id,r);if(!s||!this.jsonlSourceMatches(t,s))return{status:"unavailable"};let o=await iA(s,n).catch(()=>null);return o?{status:"ready",revision:o.revision}:{status:"partial"}}return t.provider==="lmplayer"?this.inspectLmplayer(t,n):t.provider===Ts?this.agyReader.inspect(t,n):t.provider===vs?this.dshReader.inspect(t,n):t.provider===bo?this.opencodeReader.inspect(t,n):t.provider===bs?this.copilotReader.inspect(t,n):t.provider===Ss?this.qwenReader.inspect(t,n):t.provider===As?this.kimiReader.inspect(t,n):this.sessionDataReaders[t.provider]?.inspect(t,n)??{status:"unsupported"}}async read(t,n,r){if(yc(r),t.provider==="claude"||t.provider==="codex"){let s=t.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,o=await zh(t.source_id,s);if(!o||!this.jsonlSourceMatches(t,o))return{status:"unavailable"};let i=await iA(o,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let a=FG(i.data,r);return a?t.provider==="claude"?VG(a,t,n,r,jG(o)):zG(a,t,n,r):{status:"partial"}}if(t.provider==="lmplayer")return this.readLmplayer(t,n,r);if(t.provider===Ts)return this.agyReader.read(t,n,r);if(t.provider===vs)return this.dshReader.read(t,n,r);if(t.provider===bo)return this.opencodeReader.read(t,n,r);if(t.provider===Ss)return this.qwenReader.read(t,n,r);if(t.provider===bs){let{snapshot:s,sessionUsage:o}=await this.copilotReader.readWithUsage(t,n,r);return s.status!=="complete"?s:{...s,session_usage:o}}return t.provider===As?this.kimiReader.read(t,n,r):this.sessionDataReaders[t.provider]?this.sessionDataReaders[t.provider].read(t,n,r):{status:"unsupported"}}async discoverProvider(t,n,r,s){let o=s?.source_id??null;if(t===0){let{paths:i,truncated:a}=await cA(this.claudeProjectsDir,r,this.maxDiscoveryTraversalVisits,n,o);return{sources:i.map(c=>({provider:"claude",sessionid:Qd(c,".jsonl"),source_id:c})).sort(Yh),truncated:a}}if(t===1){let i=[],a=!1;for(let c of[...this.codexSessionDirs].sort(Rs)){let l=await cA(c,r,this.maxDiscoveryTraversalVisits,n,o);l.truncated&&(a=!0);for(let d of l.paths){let u=Qd(d,".jsonl"),f=u.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u);i.push({provider:"codex",sessionid:f?.[1]??u,source_id:d})}}return{sources:i.sort(Yh).slice(0,r),truncated:a}}if(t===2)return{sources:await this.discoverLmplayer(n,r,s),truncated:!1};if(t===3)return this.agyReader.discover(n,r,o);if(t===4)return this.dshReader.discover(n,r,o);if(t===5)return this.opencodeReader.discover(n,r,s);if(t===6){let i=s?`${s.source_id}\0${s.sessionid}`:null;return this.copilotReader.discover(n,r,i)}return t===7?this.qwenReader.discover(n,r,o):t===8?this.kimiReader.discover(n,r,o):this.sessionDataReaders[Ni[t]].discover(n,r,o)}jsonlSourceMatches(t,n){let r=Qd(n,".jsonl");return t.provider==="claude"?r===t.sessionid:(r.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u)?.[1]??r)===t.sessionid}openLmplayer(t){if(!this.lmplayerDbPaths.includes(Fr(t)))return null;try{let n=new(xG())(t,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),n}catch{return null}}async discoverLmplayer(t,n,r){let s=[];try{let o=[...new Set(this.lmplayerDbPaths.map(a=>Fr(a)))].sort(Rs);for(let a of o){t.signal.throwIfAborted();let c=await zh(a,[Fr(a,"..")]);if(!c)continue;let l=this.openLmplayer(c);l&&s.push({path:c,db:l})}let i=[];for(let a=0;a<s.length&&i.length<n;a+=1){t.signal.throwIfAborted();let{path:c,db:l}=s[a];if(r&&Rs(c,r.source_id)<0)continue;let d=r?.source_id===c?r.sessionid:"";for(;;){t.signal.throwIfAborted();let u;try{u=l.prepare("SELECT id FROM session WHERE id > ? ORDER BY id LIMIT ?").all(d,n)}catch{break}if(u.length===0)break;let f=u.map(p=>typeof p.id=="string"&&p.id?p.id:"").filter(Boolean);if(f.length===0)break;let m=a===0?new Set:nX(s.slice(0,a),f);for(let p of f){if(i.length>=n)break;m.has(p)||i.push({provider:"lmplayer",sessionid:p,source_id:c})}if(d=f[f.length-1],i.length>=n||u.length<n)break}}return i.sort(Yh).slice(0,n)}finally{for(let{db:o}of s)try{o.close()}catch{}}}inspectLmplayer(t,n){let r=this.openLmplayer(t.source_id);if(!r)return{status:"unavailable"};try{if(r.prepare("SELECT id FROM session WHERE id=?").get(t.sessionid)?.id!==t.sessionid)return{status:"unavailable"};let o=aA(r,t.sessionid,n);return o?{status:"ready",revision:o.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}readLmplayer(t,n,r){let s=this.openLmplayer(t.source_id);if(!s)return{status:"unavailable"};try{if(s.exec("BEGIN"),s.prepare("SELECT id FROM session WHERE id=?").get(t.sessionid)?.id!==t.sessionid)return s.exec("ROLLBACK"),{status:"unavailable"};let i=aA(s,t.sessionid,r);if(!i||i.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=tX(t,n,i,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function fA(e={}){return new Zh(e)}import{createHash as hA}from"node:crypto";import{opendir as sX,open as oX,realpath as _A}from"node:fs/promises";import{constants as o_}from"node:fs";import{join as iX,relative as aX,isAbsolute as cX,basename as lX,dirname as dX}from"node:path";function Tc(e){if(!e.trim())return"unknown";let t=e.split(/\r?\n/).filter(r=>r.trim().length>0);if(t.length>1)try{let r=JSON.parse(t[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(e)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function Io(e){let t=Tc(e);if(t==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(t==="json"){let a=JSON.parse(e);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let n=e.split(`
213
+ `)}return{revision:`${r_}:sha256:${l.digest("hex")}`,messages:i,parts:a}}var ZG=new Set(["session-job-notification"]);function eX(e){let t=0,n=!1,r=!1;for(let s of e){let o;try{o=he(JSON.parse(s.data))}catch{continue}let i=typeof o?.type=="string"?o.type:"";o?.synthetic===!0||o?.ignored===!0||(i==="text"&&typeof o.text=="string"?(t+=Buffer.byteLength(o.text,"utf8"),n=!0):i&&!ZG.has(i)&&(r=!0))}return n?t:r?"unknown":null}function tX(e,t,n,r){let s=new Map;for(let l of n.parts){let d=s.get(l.message_id)??[];d.push(l),s.set(l.message_id,d)}let o=new Map;for(let l of n.messages){let d;try{d=he(JSON.parse(l.data))}catch{continue}if(d?.role!=="user")continue;let u=eX(s.get(l.id)??[]);u==="unknown"?o.set(l.id,null):u!==null&&o.set(l.id,u)}let i=new Map,a=new Set;for(let l of n.messages){let d;try{d=he(JSON.parse(l.data))}catch{continue}if(d?.role!=="assistant")continue;let u=typeof d.parentID=="string"?d.parentID:null;u!==null&&o.has(u)&&!a.has(u)&&(a.add(u),i.set(l.id,{id:u,bytes:o.get(u)}))}let c=[];for(let l of n.messages){r.signal.throwIfAborted();let d;try{d=he(JSON.parse(l.data))}catch{return{status:"partial"}}if(r.requireBillingCounters&&d&&Object.hasOwn(d,"tokens")&&d.role!=="assistant")return{status:"partial"};if(!d||d.role!=="assistant")continue;let u=new Is,f=new ks,m=0,p=i.get(l.id);p&&f.record({direction:"read",kind:"prompt",id:p.id,ref:null,bytes:p.bytes,basis:p.bytes===null?"unknown":"input_text"});for(let A of s.get(l.id)??[]){let I;try{I=he(JSON.parse(A.data))}catch{return{status:"partial"}}if(I?.type!=="tool")continue;let R=typeof I.tool=="string"?I.tool.toLowerCase():"",L=dA(I.tool),N=he(I.state),k=he(N?.input),D=typeof I.callID=="string"&&I.callID?I.callID:typeof N?.callID=="string"&&N.callID?N.callID:A.id;if(L==="written")u.record(D,"written",tu(k),uA(k));else if(L==="apply_patch"){let O=k?.patchText;if(typeof O=="string")for(let v of nu(O))u.record(D,"written",v.path,v.bytes);else wc(f,D)}else if(L==="read"){let O=tu(k,["filePath","path","file","file_path"]);if(O===null)continue;let v=null;if(N?.status==="completed"){let S=he(he(N.metadata)?.display);S?.type==="file"&&typeof S.text=="string"&&(v=Buffer.byteLength(S.text,"utf8"))}u.record(D,"read",O,v)}else if(R==="webfetch"){m+=1;let O=N?.status==="completed"?N.output:void 0;f.record({direction:"read",kind:"web",id:D,ref:lA(k?.url),bytes:typeof O=="string"?Buffer.byteLength(O,"utf8"):null,basis:typeof O=="string"?"normalized_content":"unknown"})}else t_(I.tool)||wc(f,D)}let h=he(d.time),_=he(d.model)?.modelID??d.modelID,g=QG(d.tokens,r.requireBillingCounters),w=he(d.tokens),y=u.files("read"),E=u.files("written"),T=f.entries(),b=n_({reasoning:w?.reasoning,webFetch:m>0?m:void 0},g.output,g.input_cache_write);if(c.push({response_id:l.id,timestamp:s_(h?.created??l.time_created),model:typeof _=="string"&&_?_:null,tokens:g,files_read:y,files_written:E,external_io:T,read_bytes:Li(y,T,"read"),write_bytes:Li(E,T,"written"),model_provider:typeof d.providerID=="string"&&d.providerID?d.providerID:null,pricing_facts:b}),c.length>r.maxRows)return{status:"partial"}}return{status:"complete",source:e,revision:t,checkpoint:t,responses:c}}async function zh(e,t){if(!rA(e))return null;let n=await yG(e).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await Qh(e).catch(()=>null);if(!r)return null;for(let s of t){let o=await Qh(s).catch(()=>jr(s)),i=SG(o,r);if(i===""||!i.startsWith(`..${bG}`)&&i!==".."&&!rA(i))return r}return null}async function cA(e,t,n,r,s=null){let o=[],i=0,a=!1;async function c(l){r.signal.throwIfAborted();let d=await TG(l,{withFileTypes:!0}).catch(()=>[]);d.sort((u,f)=>Rs(u.name,f.name));for(let u of d){if(r.signal.throwIfAborted(),o.length>=t)return;if(i+=1,i>n){a=!0;return}let f=Ao(l,u.name);if(u.isDirectory()&&!u.isSymbolicLink()){if(await c(f),a||o.length>=t)return}else if(u.isFile()&&u.name.endsWith(".jsonl")){let m=await Qh(f).catch(()=>jr(f));(s===null||Rs(m,s)>0)&&o.push(m)}}}return await c(e),{paths:o.sort(Rs),truncated:a}}function nX(e,t){let n=new Set;if(t.length===0)return n;let r=400;for(let{db:s}of e)for(let o=0;o<t.length;o+=r){let i=t.slice(o,o+r);try{let a=s.prepare(`SELECT id FROM session WHERE id IN (${i.map(()=>"?").join(",")})`).all(...i);for(let c of a)typeof c.id=="string"&&n.add(c.id)}catch{}}return n}var Zh=class{claudeProjectsDir;codexSessionDirs;lmplayerDbPaths;sqliteBusyTimeoutMs;maxDiscoveryTraversalVisits;agyReader;dshReader;qwenReader;opencodeReader;copilotReader;kimiReader;sessionDataReaders;constructor(t={}){this.sessionDataReaders=Object.fromEntries([pb(t.museDataHome),Jd(t.miniplayerHome)].map(n=>[n.provider,new Si(n)])),this.claudeProjectsDir=jr(t.claudeProjectsDir??Ao(Zd(),".claude","projects")),this.codexSessionDirs=(t.codexSessionDirs??[Ao(Zd(),".codex","sessions"),Ao(Zd(),".code","sessions")]).map(n=>jr(n)),this.lmplayerDbPaths=(t.lmplayerDbPaths??NG()).map(n=>jr(n)),this.sqliteBusyTimeoutMs=t.sqliteBusyTimeoutMs??5e3,this.maxDiscoveryTraversalVisits=t.maxDiscoveryTraversalVisits&&t.maxDiscoveryTraversalVisits>0?Math.trunc(t.maxDiscoveryTraversalVisits):kG,this.agyReader=kb(t.agyConversationsDir?{agyConversationsDir:t.agyConversationsDir}:{}),this.dshReader=$b(t.dshHome?{dshHome:t.dshHome}:{}),this.qwenReader=Ub(t.qwenProjectsDirs?{qwenProjectsDirs:t.qwenProjectsDirs}:{}),this.opencodeReader=Hb(t.opencodeDbPaths?{dbPaths:t.opencodeDbPaths}:{}),this.copilotReader=Vb(t.copilotSessionStateDir?{copilotSessionStateDir:t.copilotSessionStateDir}:{}),this.kimiReader=tA(t.kimiHome?{kimiHome:t.kimiHome}:{})}capabilities(){let t=e_("sha256").update(JSON.stringify({claudeProjectsDir:this.claudeProjectsDir,codexSessionDirs:this.codexSessionDirs,lmplayerDbPaths:this.lmplayerDbPaths,agyExtractionRevisionTag:Yd,sessionData:Object.values(this.sessionDataReaders).map(({format:n})=>[n.provider,n.root,n.revision])})).digest("hex");return{scope:"account",revision:`${r_}:${t}`,providers:[...Ni],metering:{muse:"partial",miniplayer:"partial",claude:"per_response",codex:"per_response",lmplayer:"per_response",opencode:"per_response",[Ss]:"per_response",[vs]:"per_response",[Ts]:"partial",[bs]:"partial",[As]:"per_response"}}}async discover(t){if(yc(t),!Number.isSafeInteger(t.maxSources)||t.maxSources<=0)throw new Error("maxSources must be a positive safe integer");let n=CG(t.after),r=n?.pos??new Map,s=n?.done??new Set,o=n?.rr??0,i=Ni.filter(_=>!s.has(_));if(i.length===0)return{sources:[],complete:!0,cursor:null};let a=new Map,c=new Map;for(let _ of i){t.signal.throwIfAborted();let g=r.get(_)??null,{sources:w,truncated:y}=await this.discoverProvider(Ni.indexOf(_),t,t.maxSources+1,g);if(y)throw new Error(`passive session discovery exceeded the traversal budget for provider "${_}"; cannot certify a complete or progressing sweep`);let E=g?eu({provider:_,source_id:g.source_id,sessionid:g.sessionid}):null,T=E===null?w:w.filter(b=>Rs(eu(b),E)>0);c.set(_,T.length>t.maxSources),a.set(_,T.slice(0,t.maxSources))}let l=o%i.length,d=i.map((_,g)=>i[(g+l)%i.length]),u=new Map(i.map(_=>[_,0])),f=[],m=!0;for(;f.length<t.maxSources&&m;){m=!1;for(let _ of d){if(f.length>=t.maxSources)break;let g=a.get(_),w=u.get(_);w<g.length&&(f.push(g[w]),u.set(_,w+1),m=!0)}}let p={},h=[...s];for(let _ of i){let g=a.get(_),w=u.get(_);if(!c.get(_)&&w===g.length){h.push(_);continue}if(w>0){let E=g[w-1];p[_]={source_id:E.source_id,sessionid:E.sessionid}}else{let E=r.get(_);E&&(p[_]=E)}}return Ni.every(_=>h.includes(_))?{sources:f,complete:!0,cursor:null}:{sources:f,complete:!1,cursor:LG({pos:p,done:h,rr:o+1})}}async inspect(t,n){if(yc(n),!Ni.includes(t.provider))return{status:"unsupported"};if(t.provider==="claude"||t.provider==="codex"){let r=t.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,s=await zh(t.source_id,r);if(!s||!this.jsonlSourceMatches(t,s))return{status:"unavailable"};let o=await iA(s,n).catch(()=>null);return o?{status:"ready",revision:o.revision}:{status:"partial"}}return t.provider==="lmplayer"?this.inspectLmplayer(t,n):t.provider===Ts?this.agyReader.inspect(t,n):t.provider===vs?this.dshReader.inspect(t,n):t.provider===bo?this.opencodeReader.inspect(t,n):t.provider===bs?this.copilotReader.inspect(t,n):t.provider===Ss?this.qwenReader.inspect(t,n):t.provider===As?this.kimiReader.inspect(t,n):this.sessionDataReaders[t.provider]?.inspect(t,n)??{status:"unsupported"}}async read(t,n,r){if(yc(r),t.provider==="claude"||t.provider==="codex"){let s=t.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,o=await zh(t.source_id,s);if(!o||!this.jsonlSourceMatches(t,o))return{status:"unavailable"};let i=await iA(o,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let a=FG(i.data,r);return a?t.provider==="claude"?VG(a,t,n,r,jG(o)):zG(a,t,n,r):{status:"partial"}}if(t.provider==="lmplayer")return this.readLmplayer(t,n,r);if(t.provider===Ts)return this.agyReader.read(t,n,r);if(t.provider===vs)return this.dshReader.read(t,n,r);if(t.provider===bo)return this.opencodeReader.read(t,n,r);if(t.provider===Ss)return this.qwenReader.read(t,n,r);if(t.provider===bs){let{snapshot:s,sessionUsage:o}=await this.copilotReader.readWithUsage(t,n,r);return s.status!=="complete"?s:{...s,session_usage:o}}return t.provider===As?this.kimiReader.read(t,n,r):this.sessionDataReaders[t.provider]?this.sessionDataReaders[t.provider].read(t,n,r):{status:"unsupported"}}async discoverProvider(t,n,r,s){let o=s?.source_id??null;if(t===0){let{paths:i,truncated:a}=await cA(this.claudeProjectsDir,r,this.maxDiscoveryTraversalVisits,n,o);return{sources:i.map(c=>({provider:"claude",sessionid:Qd(c,".jsonl"),source_id:c})).sort(Yh),truncated:a}}if(t===1){let i=[],a=!1;for(let c of[...this.codexSessionDirs].sort(Rs)){let l=await cA(c,r,this.maxDiscoveryTraversalVisits,n,o);l.truncated&&(a=!0);for(let d of l.paths){let u=Qd(d,".jsonl"),f=u.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u);i.push({provider:"codex",sessionid:f?.[1]??u,source_id:d})}}return{sources:i.sort(Yh).slice(0,r),truncated:a}}if(t===2)return{sources:await this.discoverLmplayer(n,r,s),truncated:!1};if(t===3)return this.agyReader.discover(n,r,o);if(t===4)return this.dshReader.discover(n,r,o);if(t===5)return this.opencodeReader.discover(n,r,s);if(t===6){let i=s?`${s.source_id}\0${s.sessionid}`:null;return this.copilotReader.discover(n,r,i)}return t===7?this.qwenReader.discover(n,r,o):t===8?this.kimiReader.discover(n,r,o):this.sessionDataReaders[Ni[t]].discover(n,r,o)}jsonlSourceMatches(t,n){let r=Qd(n,".jsonl");return t.provider==="claude"?r===t.sessionid:(r.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u)?.[1]??r)===t.sessionid}openLmplayer(t){if(!this.lmplayerDbPaths.includes(jr(t)))return null;try{let n=new(xG())(t,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),n}catch{return null}}async discoverLmplayer(t,n,r){let s=[];try{let o=[...new Set(this.lmplayerDbPaths.map(a=>jr(a)))].sort(Rs);for(let a of o){t.signal.throwIfAborted();let c=await zh(a,[jr(a,"..")]);if(!c)continue;let l=this.openLmplayer(c);l&&s.push({path:c,db:l})}let i=[];for(let a=0;a<s.length&&i.length<n;a+=1){t.signal.throwIfAborted();let{path:c,db:l}=s[a];if(r&&Rs(c,r.source_id)<0)continue;let d=r?.source_id===c?r.sessionid:"";for(;;){t.signal.throwIfAborted();let u;try{u=l.prepare("SELECT id FROM session WHERE id > ? ORDER BY id LIMIT ?").all(d,n)}catch{break}if(u.length===0)break;let f=u.map(p=>typeof p.id=="string"&&p.id?p.id:"").filter(Boolean);if(f.length===0)break;let m=a===0?new Set:nX(s.slice(0,a),f);for(let p of f){if(i.length>=n)break;m.has(p)||i.push({provider:"lmplayer",sessionid:p,source_id:c})}if(d=f[f.length-1],i.length>=n||u.length<n)break}}return i.sort(Yh).slice(0,n)}finally{for(let{db:o}of s)try{o.close()}catch{}}}inspectLmplayer(t,n){let r=this.openLmplayer(t.source_id);if(!r)return{status:"unavailable"};try{if(r.prepare("SELECT id FROM session WHERE id=?").get(t.sessionid)?.id!==t.sessionid)return{status:"unavailable"};let o=aA(r,t.sessionid,n);return o?{status:"ready",revision:o.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}readLmplayer(t,n,r){let s=this.openLmplayer(t.source_id);if(!s)return{status:"unavailable"};try{if(s.exec("BEGIN"),s.prepare("SELECT id FROM session WHERE id=?").get(t.sessionid)?.id!==t.sessionid)return s.exec("ROLLBACK"),{status:"unavailable"};let i=aA(s,t.sessionid,r);if(!i||i.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=tX(t,n,i,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function fA(e={}){return new Zh(e)}import{createHash as hA}from"node:crypto";import{opendir as sX,open as oX,realpath as _A}from"node:fs/promises";import{constants as o_}from"node:fs";import{join as iX,relative as aX,isAbsolute as cX,basename as lX,dirname as dX}from"node:path";function Tc(e){if(!e.trim())return"unknown";let t=e.split(/\r?\n/).filter(r=>r.trim().length>0);if(t.length>1)try{let r=JSON.parse(t[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(e)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function Io(e){let t=Tc(e);if(t==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(t==="json"){let a=JSON.parse(e);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let n=e.split(`
214
214
  `).map(a=>a).filter(a=>a.trim().length>0);if(n.length===0)throw new Error("gemini session file is empty");let r=n[0],s;try{s=JSON.parse(r)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let o=[],i=new Map;for(let a=1;a<n.length;a++){let c;try{c=JSON.parse(n[a])}catch{continue}if(c===null||typeof c!="object")continue;let l=c;if("$set"in l&&l.$set&&typeof l.$set=="object"){Object.assign(s,l.$set);continue}if(typeof l.id=="string"||typeof l.type=="string"){let d=l;if(typeof d.id=="string"){let u=i.get(d.id);u?rX(u,d):(o.push(d),i.set(d.id,d))}else o.push(d)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:o}}function rX(e,t){for(let[n,r]of Object.entries(t))if(r!==void 0){if(n==="tokens"&&mA(e.tokens)&&mA(r)){e.tokens={...e.tokens,...r};continue}e[n]=r}}function mA(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function pA(e,t){if(t==="json")return JSON.stringify(e,null,2);let{messages:n,...r}=e,s=[JSON.stringify(r)];for(let o of n)s.push(JSON.stringify(o));return s.join(`
215
215
  `)+`
216
- `}var jr=e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null,uX=e=>{let t=typeof e=="number"||typeof e=="string"?new Date(e):null;return t&&Number.isFinite(t.getTime())?t.toISOString():null},gA=(e,t,n)=>({response_id:e,timestamp:uX(t),model:typeof n=="string"&&n?n:null,tokens:{input_uncached:null,input_cached:null,input_cache_write:null,output:null},files_read:null,files_written:null});function fX(e,t,n){try{if(e==="pi"){let d=t.split(`
217
- `).filter(f=>f.trim()).map(f=>JSON.parse(f));if(d[0]?.type!=="session"||d[0]?.id!==n||d.slice(1).some(f=>f?.type==="session"))return;let u=[];for(let f of d){let m=f.message;if(m?.usage!==void 0&&(f.type!=="message"||m.role!=="assistant"))return;if(f.type!=="message"||m?.role!=="assistant")continue;if(typeof f.id!="string"||!f.id)return;let p=m.usage,h=gA(f.id,f.timestamp,m.model);if(!p||typeof p!="object")return;h.tokens={input_uncached:jr(p.input),input_cached:jr(p.cacheRead),input_cache_write:jr(p.cacheWrite),output:jr(p.output)},h.pricing_facts={reasoning_output_tokens:jr(p.reasoning)},h.providerCostUsd=typeof p.cost?.total=="number"&&Number.isFinite(p.cost.total)&&p.cost.total>=0?p.cost.total:null,u.push(h)}return u}let r;try{r=JSON.parse(t)}catch{}let s=Array.isArray(r?.messages)?r.messages:t.split(`
218
- `).filter(d=>d.trim()).map(d=>JSON.parse(d));if((Array.isArray(r?.messages)?r:s[0])?.sessionId!==n)return;let i=new Map,a=new Map;for(let d of s){if(!d||typeof d!="object"||Array.isArray(d)||d.$set?.sessionId!==void 0&&d.$set.sessionId!==n)return;if(typeof d.id!="string")continue;let u=i.get(d.id)??{};for(let f of["model","timestamp","type"]){let m=d[f];if(!(f==="model"&&m===null&&u.model===void 0)&&m!==void 0){if(typeof m!="string"||u[f]!==void 0&&u[f]!==m)return;u[f]=m}}i.set(d.id,u),Object.hasOwn(d,"tokens")&&a.set(d.id,d.tokens)}let c=Io(t);if(!c||c.sessionId!==n)return;let l=[];for(let d of c.messages){if(d.tokens!==void 0&&!["gemini","assistant"].includes(d.type??""))return;if(!["gemini","assistant"].includes(d.type??""))continue;if(!d.id||!d.tokens)return;let u=a.get(d.id)??d.tokens,f=jr(u.input),m=jr(u.cached),p=jr(u.output),h=jr(u.thoughts),_=gA(d.id,d.timestamp,d.model);_.tokens={input_uncached:f!==null&&m!==null&&m<=f?f-m:null,input_cached:m,input_cache_write:null,output:p!==null&&h!==null&&Number.isSafeInteger(p+h)?p+h:null},_.pricing_facts={reasoning_output_tokens:h},l.push(_)}return l}catch{return}}function i_(e,t){let n=async(s,o)=>{o.signal.throwIfAborted();let i=await _A(s),a=await _A(t),c=aX(a,i);if(c===".."||c.startsWith("../")||c.startsWith("..\\")||cX(c))throw Error("outside native root");let l=await oX(i,o_.O_RDONLY|o_.O_NOFOLLOW|o_.O_NONBLOCK);try{let d=await l.stat({bigint:!0});if(!d.isFile()||d.size>BigInt(o.maxBytes))throw Error("native byte limit");let u=Buffer.alloc(Number(d.size)+1),f=0;for(;f<u.length;){o.signal.throwIfAborted();let p=await l.read(u,f,u.length-f,f);if(!p.bytesRead)break;f+=p.bytesRead}let m=await l.stat({bigint:!0});if(o.signal.throwIfAborted(),f!==Number(d.size)||d.size!==m.size||d.mtimeNs!==m.mtimeNs||d.ctimeNs!==m.ctimeNs||d.ino!==m.ino||d.dev!==m.dev)throw Error("changing native file");return new TextDecoder("utf-8",{fatal:!0}).decode(u.subarray(0,f))}finally{await l.close()}},r=s=>{try{return e==="pi"?JSON.parse(s.slice(0,s.indexOf(`
216
+ `}var qr=e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null,uX=e=>{let t=typeof e=="number"||typeof e=="string"?new Date(e):null;return t&&Number.isFinite(t.getTime())?t.toISOString():null},gA=(e,t,n)=>({response_id:e,timestamp:uX(t),model:typeof n=="string"&&n?n:null,tokens:{input_uncached:null,input_cached:null,input_cache_write:null,output:null},files_read:null,files_written:null});function fX(e,t,n){try{if(e==="pi"){let d=t.split(`
217
+ `).filter(f=>f.trim()).map(f=>JSON.parse(f));if(d[0]?.type!=="session"||d[0]?.id!==n||d.slice(1).some(f=>f?.type==="session"))return;let u=[];for(let f of d){let m=f.message;if(m?.usage!==void 0&&(f.type!=="message"||m.role!=="assistant"))return;if(f.type!=="message"||m?.role!=="assistant")continue;if(typeof f.id!="string"||!f.id)return;let p=m.usage,h=gA(f.id,f.timestamp,m.model);if(!p||typeof p!="object")return;h.tokens={input_uncached:qr(p.input),input_cached:qr(p.cacheRead),input_cache_write:qr(p.cacheWrite),output:qr(p.output)},h.pricing_facts={reasoning_output_tokens:qr(p.reasoning)},h.providerCostUsd=typeof p.cost?.total=="number"&&Number.isFinite(p.cost.total)&&p.cost.total>=0?p.cost.total:null,u.push(h)}return u}let r;try{r=JSON.parse(t)}catch{}let s=Array.isArray(r?.messages)?r.messages:t.split(`
218
+ `).filter(d=>d.trim()).map(d=>JSON.parse(d));if((Array.isArray(r?.messages)?r:s[0])?.sessionId!==n)return;let i=new Map,a=new Map;for(let d of s){if(!d||typeof d!="object"||Array.isArray(d)||d.$set?.sessionId!==void 0&&d.$set.sessionId!==n)return;if(typeof d.id!="string")continue;let u=i.get(d.id)??{};for(let f of["model","timestamp","type"]){let m=d[f];if(!(f==="model"&&m===null&&u.model===void 0)&&m!==void 0){if(typeof m!="string"||u[f]!==void 0&&u[f]!==m)return;u[f]=m}}i.set(d.id,u),Object.hasOwn(d,"tokens")&&a.set(d.id,d.tokens)}let c=Io(t);if(!c||c.sessionId!==n)return;let l=[];for(let d of c.messages){if(d.tokens!==void 0&&!["gemini","assistant"].includes(d.type??""))return;if(!["gemini","assistant"].includes(d.type??""))continue;if(!d.id||!d.tokens)return;let u=a.get(d.id)??d.tokens,f=qr(u.input),m=qr(u.cached),p=qr(u.output),h=qr(u.thoughts),_=gA(d.id,d.timestamp,d.model);_.tokens={input_uncached:f!==null&&m!==null&&m<=f?f-m:null,input_cached:m,input_cache_write:null,output:p!==null&&h!==null&&Number.isSafeInteger(p+h)?p+h:null},_.pricing_facts={reasoning_output_tokens:h},l.push(_)}return l}catch{return}}function i_(e,t){let n=async(s,o)=>{o.signal.throwIfAborted();let i=await _A(s),a=await _A(t),c=aX(a,i);if(c===".."||c.startsWith("../")||c.startsWith("..\\")||cX(c))throw Error("outside native root");let l=await oX(i,o_.O_RDONLY|o_.O_NOFOLLOW|o_.O_NONBLOCK);try{let d=await l.stat({bigint:!0});if(!d.isFile()||d.size>BigInt(o.maxBytes))throw Error("native byte limit");let u=Buffer.alloc(Number(d.size)+1),f=0;for(;f<u.length;){o.signal.throwIfAborted();let p=await l.read(u,f,u.length-f,f);if(!p.bytesRead)break;f+=p.bytesRead}let m=await l.stat({bigint:!0});if(o.signal.throwIfAborted(),f!==Number(d.size)||d.size!==m.size||d.mtimeNs!==m.mtimeNs||d.ctimeNs!==m.ctimeNs||d.ino!==m.ino||d.dev!==m.dev)throw Error("changing native file");return new TextDecoder("utf-8",{fatal:!0}).decode(u.subarray(0,f))}finally{await l.close()}},r=s=>{try{return e==="pi"?JSON.parse(s.slice(0,s.indexOf(`
219
219
  `)<0?s.length:s.indexOf(`
220
220
  `))).id:Io(s)?.sessionId}catch{return}};return{async discover(s){let o=[],i=0,a=!0,c=async(l,d)=>{if(s.signal.throwIfAborted(),d>4){a=!1;return}let u=await sX(l).catch(()=>{a=!1});if(u)for await(let f of u){if(s.signal.throwIfAborted(),++i>s.maxRows||o.length>=s.maxSources){a=!1;break}let m=iX(l,f.name);if(f.isDirectory())await c(m,d+1);else if(f.isFile()&&/\.jsonl?$/.test(f.name)&&(e!=="gemini"||lX(dX(m))==="chats"&&f.name.startsWith("session-"))){let p=await n(m,s).catch(()=>{});if(p===void 0){s.signal.throwIfAborted(),a=!1;continue}let h=r(p);typeof h=="string"&&h?o.push({provider:e,sessionid:h,source_id:m}):a=!1}}};return await c(t,0),{sources:o,complete:a,cursor:null}},async inspect(s,o){let i=await n(s.source_id,o);return{status:"ready",revision:hA("sha256").update(i).digest("hex")}},async read(s,o,i){let a=await n(s.source_id,i);if(hA("sha256").update(a).digest("hex")!==o)return{status:"partial"};if(a.split(`
221
221
  `).length>i.maxRows)return{status:"partial"};let c=fX(e,a,s.sessionid);return c&&c.length<=i.maxRows?{status:"complete",source:s,revision:o,responses:c}:{status:"partial"}}}}var ru=["kimi","opencode","gemini","miniplayer","pi","agy","lmplayer"],a_=e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null;function _X(e,t){if(!t.length||t.some(d=>typeof d.response_id!="string"||!d.response_id)||new Set(t.map(d=>d.response_id)).size!==t.length)return;let n=e==="agy"&&t.some(d=>(d.tokens.input_cache_write??0)>0),r=t.map(d=>{let u=d.tokens,f=u.input_cache_write,m=u.input_uncached;for(let h of Object.values(u))h!==null&&a_(h)===null&&(n=!0);let p=m;return["kimi","opencode","miniplayer","lmplayer"].includes(e)&&(f===null||m===null||f>m?(p=null,n=!0):p=m-f),(p===null||u.input_cached===null||u.output===null)&&(n=!0),{...d,tokens:{...u,input_uncached:p}}}),s=bi(r);s.input_cache_write===null&&(e==="pi"||r.some(d=>d.tokens.input_cache_write!=null))&&(n=!0);let o=new Set(t.map(d=>d.model).filter(d=>typeof d=="string"&&d.length>0));for(let d of["input_uncached","input_cached","output"])s[d]===null&&(n=!0);let i=d=>{if(d.some(f=>f==null))return null;if(d.some(f=>a_(f)===null))return n=!0,null;let u=d.reduce((f,m)=>f+m,0);return a_(u)===null?(n=!0,null):u};t.some(d=>d.pricing_facts?.reasoning_output_tokens!=null&&d.tokens.output!=null&&d.pricing_facts.reasoning_output_tokens>d.tokens.output)&&(n=!0);let a=i(t.map(d=>d.pricing_facts?.reasoning_output_tokens)),c=t.map(d=>d.providerCostUsd),l=c.every(d=>typeof d=="number"&&Number.isFinite(d)&&d>=0)?c.reduce((d,u)=>d+u,0):null;return{source:"native",inputUncached:s.input_uncached,cacheRead:s.input_cached,cacheWrite:s.input_cache_write,output:s.output,reasoning:a,modelReported:o.size===1?[...o][0]:null,mixedModels:o.size>1,providerCostUsd:l,reason:n||s.input_cache_write===null?"counter_not_exposed":null,invalidCounters:n}}async function EA(e,t,n,r){let s=[],o=new Set;for(let i of e){r.signal?.throwIfAborted();let a=yA(i),c;try{if(!(await mX(a)).isFile())return{sources:s,complete:!1};let l=await pX(a);if(o.has(l))continue;o.add(l),c=Ph(a),c.pragma("busy_timeout = 0"),c.prepare("SELECT id FROM session WHERE id=?").get(n)&&s.push({provider:t,sessionid:n,source_id:a})}catch(l){if(l.code!=="ENOENT")return{sources:s,complete:!1}}finally{try{c?.close()}catch{}}}return{sources:s,complete:!0}}function gX(e,t,n){let r=t.HOME||t.USERPROFILE||hX(),s=t.XDG_DATA_HOME||cn(r,".local","share"),o=t.XDG_CONFIG_HOME||cn(r,".config");if(e==="pi")return i_("pi",t.PI_CODING_AGENT_DIR?cn(t.PI_CODING_AGENT_DIR,"sessions"):cn(r,".pi","agent","sessions"));if(e==="gemini")return i_("gemini",cn(t.GEMINI_CLI_HOME||cn(r,".gemini"),"tmp"));if(e==="miniplayer"){let c=new Si(Jd(t.MINIPLAYER_HOME||cn(s,"miniplayer")));return{discover:async l=>{let d=await c.discover(l,l.maxSources,null);return{...d,complete:!d.truncated&&d.sources.length<l.maxSources}},inspect:(l,d)=>c.inspect(l,d),read:(l,d,u)=>c.read(l,d,u)}}if(e==="opencode"){let c=[cn(s,"opencode","opencode.db"),cn(s,"opencode","opencode-local.db"),cn(o,"opencode","opencode.db")].map(d=>yA(d)),l=new pc({dbPaths:c,sqliteBusyTimeoutMs:0});return{discover:d=>EA(c,e,n,d),inspect:(d,u)=>l.inspect(d,u),read:(d,u,f)=>l.read(d,u,f)}}if(e==="kimi"||e==="agy"){let c=e==="kimi"?new gc({kimiHome:t.KIMI_CODE_HOME||cn(r,".kimi-code")}):new uc({agyConversationsDir:cn(r,".gemini","antigravity-cli","conversations"),sqliteBusyTimeoutMs:0});return{discover:async l=>{let d=await c.discover(l,l.maxSources,null);return{...d,complete:!d.truncated&&d.sources.length<l.maxSources}},inspect:(l,d)=>c.inspect(l,d),read:(l,d,u)=>c.read(l,d,u)}}let i=t.OPENCODE_DB?[t.OPENCODE_DB]:[cn(s,"lmplayer","opencode-local.db"),cn(s,"lmplayer","opencode-dev.db")],a=fA({lmplayerDbPaths:i,sqliteBusyTimeoutMs:0});return{discover:c=>EA(i,e,n,c),inspect:(c,l)=>a.inspect(c,l),read:(c,l,d)=>a.read(c,l,d)}}async function wA(e,t,n,r){if(!ru.includes(e.provider)||!t||e.native_session_id&&e.native_session_id!==t)return;let s=new AbortController,o,i,a=async()=>{let c=r.db??(i=Ph(r.dbPath));i&&i.pragma("busy_timeout = 0");let l={signal:s.signal,maxBytes:8*1024*1024,maxRows:1e4,maxSources:512,requireBillingCounters:!0},d=r.reader??gX(e.provider,r.env??process.env,t),u=await d.discover(l);if(u.complete!==!0)return;let f=u.sources.filter(p=>p.provider===e.provider&&(p.sessionid===t||e.provider==="lmplayer"&&p.sessionid==="")).map(p=>({...p,sessionid:t}));if(!f.length)return;let m;for(let p of f){s.signal.throwIfAborted();let h=await d.inspect(p,l);if(h.status!=="ready")return;let _=await d.read(p,h.revision,l);if(s.signal.throwIfAborted(),_.status!=="complete"||_.capture_status!==void 0||_.source?.provider!==e.provider||_.source?.sessionid!==t||_.source?.source_id!==p.source_id||_.revision!==h.revision)return;let g=Date.parse(e.startedAt),w=Date.parse(n);if(!Number.isFinite(g)||!Number.isFinite(w)||w<g)return;let y=_.responses;if(!Array.isArray(y)||y.some(b=>!b.timestamp||!Number.isFinite(Date.parse(b.timestamp))))return;let E=y.filter(b=>Date.parse(b.timestamp)>=g&&Date.parse(b.timestamp)<=w);if(!E.length)continue;if(m)return;let T=c.pragma("busy_timeout",{simple:!0});try{c.pragma("busy_timeout = 0");let b=c.prepare("SELECT 1 FROM team_chat_log WHERE attempt_key IS NOT NULL AND attempt_key<>? AND provider=? AND (native_session_id=? OR native_session_id IS NULL) AND julianday(created_at)<=julianday(?) AND (ended_at IS NULL OR julianday(ended_at)>=julianday(?)) LIMIT 1");for(let A of E){let I=new Date(A.timestamp).toISOString();if(b.get(e.attempt_key,e.provider,t,I,I))return}}finally{c.pragma("busy_timeout = "+T)}m=E}return m?_X(e.provider,m):void 0};try{return await Promise.race([a(),new Promise(c=>{o=setTimeout(()=>{s.abort(),c(void 0)},2e3)})])}catch{return}finally{clearTimeout(o),s.abort();try{i?.close()}catch{}}}function pr(e){return e.some(t=>t!=null&&(typeof t!="number"||!Number.isSafeInteger(t)||t<0))}import{randomUUID as zX}from"node:crypto";var su={attempt_key:"TEXT",provider:"TEXT",native_session_id:"TEXT",cwd:"TEXT",ended_at:"TEXT",turn_outcome:"TEXT",model_requested:"TEXT",model_reported:"TEXT",tok_input_uncached:"INTEGER",tok_cache_read:"INTEGER",tok_cache_write:"INTEGER",tok_output:"INTEGER",tok_reasoning:"INTEGER",usage_source:"TEXT CHECK(usage_source IN ('wire','native','cumulative_delta'))",usage_reason:"TEXT",price_record_id:"TEXT",price_snapshot_sha256:"TEXT",rate_input_1m:"REAL",rate_output_1m:"REAL",rate_cache_read_1m:"REAL",rate_cache_write_1m:"REAL",cost_reason:"TEXT",provider_cost_usd:"REAL"},TA=`CREATE UNIQUE INDEX IF NOT EXISTS idx_team_chat_attempt_unique ON team_chat_log(attempt_key) WHERE attempt_key IS NOT NULL;
@@ -237,7 +237,7 @@ CREATE VIEW IF NOT EXISTS turn_usage AS SELECT
237
237
  +COALESCE(tok_cache_write,0)*COALESCE(rate_cache_write_1m,rate_input_1m,0)
238
238
  +COALESCE(tok_output,0)*COALESCE(rate_output_1m,0))/1e6 END AS cost_usd
239
239
  FROM team_chat_log WHERE attempt_key IS NOT NULL;
240
- `;import{createHash as xA}from"node:crypto";import{mkdirSync as LA,readFileSync as yX,renameSync as wX,writeFileSync as TX,existsSync as CA}from"node:fs";import{homedir as vX}from"node:os";import{dirname as OA,join as cu,resolve as lu}from"node:path";import{fileURLToPath as SX}from"node:url";var EX=new URL("./cli/index.js",import.meta.url).href,bX="https://lmctl.com/dataset/model_list.json",AX="https://lmctl.com/dataset/aliases.json",IX=1e3,kX=1e4,vA=6*60*60*1e3;function RX(){return cu(vX(),".lmctl","cache","lmprice")}var iu="model_list.json",au="aliases.json",DA="meta.json",NX="model_list.meta.json";function Di(e,t){return cu(e,t)}var vc=new WeakMap;function du(e,t){if(!e||!t)return null;let n=vc.get(e),r=vc.get(t);return n===void 0||r===void 0?null:xA("sha256").update(n).update(r).digest("hex")}function ko(e){try{let t=yX(e,"utf-8"),n=JSON.parse(t);return n&&typeof n=="object"&&vc.set(n,t),n}catch{return null}}function $A(e,t){let n=`${e}.tmp-${process.pid}`;TX(n,t),wX(n,e)}function c_(e){return e===null||typeof e=="number"}function Ro(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.schema_version!==1||!Array.isArray(t.records)||t.records.length===0?!1:t.records.every(n=>{if(typeof n!="object"||n===null)return!1;let r=n;if(typeof r.source!="string"||typeof r.source_model_id!="string"||typeof r.pricing!="object"||r.pricing===null)return!1;let s=r.pricing;return c_(s.input_per_1m_tokens)&&c_(s.output_per_1m_tokens)&&c_(s.input_cache_read_per_1m_tokens)})}var xX=new Set(["established","asserted","unresolved"]);function No(e){if(typeof e!="object"||e===null)return!1;let t=e;if(t.schema_version!==1||!Array.isArray(t.standards)||!Array.isArray(t.aliases))return!1;let n=t.standards.every(s=>{if(typeof s!="object"||s===null)return!1;let o=s;return typeof o.standard_slug=="string"&&(o.catalog_record_id===null||typeof o.catalog_record_id=="string")}),r=t.aliases.every(s=>{if(typeof s!="object"||s===null)return!1;let o=s;return typeof o.alias=="string"&&(o.standard_slug===null||typeof o.standard_slug=="string")&&typeof o.evidence=="string"&&xX.has(o.evidence)});return n&&r}var SA={etag:null,last_checked:null};function LX(e){let t=ko(Di(e,DA)),n={etag:typeof t?.model_list?.etag=="string"?t.model_list.etag:null,last_checked:typeof t?.model_list?.last_checked=="string"?t.model_list.last_checked:null},r={etag:typeof t?.aliases?.etag=="string"?t.aliases.etag:null,last_checked:typeof t?.aliases?.last_checked=="string"?t.aliases.last_checked:null};if(t===null){let s=ko(Di(e,NX));s&&(n.etag=typeof s.etag=="string"?s.etag:null,n.last_checked=typeof s.fetchedAt=="string"?s.fetchedAt:null)}return{model_list:n,aliases:r,...typeof t?.pair_sha256=="string"?{pair_sha256:t.pair_sha256}:{}}}function CX(e){let t=LX(e),n=ko(Di(e,iu)),r=ko(Di(e,au));return t.pair_sha256&&du(Ro(n)?n:null,No(r)?r:null)!==t.pair_sha256?{catalog:null,aliases:null,meta:{model_list:{...SA},aliases:{...SA}}}:{catalog:Ro(n)?n:null,aliases:No(r)?r:null,meta:t}}function bA(e,t){try{return LA(e,{recursive:!0}),$A(Di(e,DA),JSON.stringify(t)),!0}catch{return!1}}function l_(e){return(e&&typeof e=="object"?vc.get(e):void 0)??JSON.stringify(e)}function ou(e,t,n){try{LA(e,{recursive:!0}),$A(Di(e,t),l_(n))}catch{}}function OX(e,t){let n=DX(e),r=n?[lu(n,"data",t)]:[lu(e,"..","..","data",t)];for(let s of r)if(CA(s))return s;return null}function DX(e){let t=lu(e);for(;;){if(CA(lu(t,"package.json")))return t;let n=OA(t);if(n===t)return null;t=n}}function AA(e,t,n){let r=n!==void 0?n:OX(e,t);return r===null?null:ko(r)}function uu(e=process.env){let t=e.LMCTL_PRICE_TTL;if(t===void 0||t==="")return vA;let n=Number(t);return!Number.isFinite(n)||n<0?vA:n*1e3}function $X(){let e=process.env.LMCTL_PRICE_DATA;return e!==void 0&&e!==""?e:null}async function IA(e,t,n,r){try{let s=await e(t,{method:"HEAD",signal:AbortSignal.timeout(IX)});if(!s.ok)return{kind:"failed"};let o=s.headers.get("etag");if(n!==null&&o!==null&&o===r)return{kind:"match"};let i=await e(t,{signal:AbortSignal.timeout(kX)});if(!i.ok)return{kind:"failed"};let a=await i.text(),c=JSON.parse(a);return c&&typeof c=="object"&&vc.set(c,a),{kind:"payload",payload:c,etag:i.headers.get("etag")??o}}catch{return{kind:"failed"}}}var d_=null;var kA=null;function MA(e={}){return Object.keys(e).length===0?(kA??=RA(e),kA):RA(e)}async function RA(e){let t=OA(SX(EX)),n=e.pinDir!==void 0?e.pinDir:$X();if(n!==null&&n!==""){let h=ko(cu(n,iu)),_=ko(cu(n,au));if(Ro(h)&&No(_)){let g={sha256:du(h,_),catalog:h,aliases:_,source:"pinned",generatedAt:h.generated_at??null};return d_=g.generatedAt,g}return NA(e,t)}let r=e.fetchImpl??fetch,s=e.cacheDir??RX(),o=e.now??Date.now(),i=e.ttlMs??uu(),a=CX(s),c=(h,_)=>h!==null&&_.last_checked!==null&&o>=Date.parse(_.last_checked)&&o-Date.parse(_.last_checked)<i,l=a.catalog,d=a.aliases,u=!1,f=!1,m={model_list:{...a.meta.model_list},aliases:{...a.meta.aliases}},p=!1;if(!c(l,a.meta.model_list)){let h=await IA(r,bX,l,a.meta.model_list.etag);h.kind==="failed"&&(f=!0),h.kind==="match"?(m.model_list.last_checked=new Date(o).toISOString(),p=!0):h.kind==="payload"&&(Ro(h.payload)?(m.model_list.last_checked=new Date(o).toISOString(),p=!0,l=h.payload,h.etag!==null&&(m.model_list.etag=h.etag),u=!0):f=!0)}if(!c(d,a.meta.aliases)){let h=await IA(r,AX,d,a.meta.aliases.etag);h.kind==="failed"&&(f=!0),h.kind==="match"?(m.aliases.last_checked=new Date(o).toISOString(),p=!0):h.kind==="payload"&&(No(h.payload)?(m.aliases.last_checked=new Date(o).toISOString(),p=!0,d=h.payload,h.etag!==null&&(m.aliases.etag=h.etag),u=!0):f=!0)}if(!f&&(p||u))if(l!==null&&d!==null){let h=xA("sha256").update(l_(l)).update(l_(d)).digest("hex");bA(s,{...m,pair_sha256:h})&&h!==a.meta.pair_sha256&&(ou(s,iu,l),ou(s,au,d))}else l!==a.catalog&&l!==null&&ou(s,iu,l),d!==a.aliases&&d!==null&&ou(s,au,d),bA(s,m);if(l!==null||d!==null){let h={catalog:l,aliases:d,sha256:du(l,d),source:u?"network":"cache",refreshFailed:f,generatedAt:l?.generated_at??null};return d_=h.generatedAt,h}return{...NA(e,t),refreshFailed:f}}function NA(e,t){let n=AA(t,"price-data.json",e.bundledPath),r=AA(t,"price-aliases.json",e.bundledAliasesPath),s=Ro(n)?n:null,o=No(r)?r:null,i={catalog:s,aliases:o,sha256:du(s,o),source:s!==null||o!==null?"bundled":"unavailable",generatedAt:s?.generated_at??null};return d_=i.generatedAt,i}var Ci=e=>typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null,Oi=e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null;function PA(e){if(e.cacheWrite!==void 0)return Oi(e.cacheWrite);if(e.cacheWrite5m===void 0&&e.cacheWrite1h===void 0)return 0;let t=Oi(e.cacheWrite5m),n=Oi(e.cacheWrite1h);return t===null||n===null?null:Oi(t+n)}function u_(e,t){let n=Oi(e.cacheWrite5m===void 0?0:e.cacheWrite5m),r=Oi(e.cacheWrite1h===void 0?0:e.cacheWrite1h);return n!==null&&r!==null&&Number.isSafeInteger(n+r)&&n+r===t?{five:n,one:r}:null}function f_(e,t){let n=Ci(t.input_per_1m_tokens),r=Ci(t.output_per_1m_tokens),s=Ci(t.input_cache_read_per_1m_tokens),o=Ci(t.source_cost_fields?.cache_creation_input_token_cost),i=Ci(t.input_cache_write_per_1m_tokens)??(o===null?n:o*1e6),a=Ci(t.source_cost_fields?.cache_creation_input_token_cost_above_1hr),c=a===null?i:a*1e6,l=PA(e),d=u_(e,l),u=l===null?null:d===null||l===0?i:d.five>0&&i===null||d.one>0&&c===null?null:(d.five*(i??0)+d.one*(c??0))/l;return{inputPer1m:n,outputPer1m:r,cacheReadPer1m:s,cacheWritePer1m:u}}function UA(e,t){if(t===null)return null;let n=f_(e,t),r=PA(e);if(r===null||e.input>0&&n.inputPer1m===null||e.output>0&&n.outputPer1m===null||e.cachedInput>0&&n.cacheReadPer1m===null||r>0&&n.cacheWritePer1m===null)return null;let s=(e.input*(n.inputPer1m??0)+e.output*(n.outputPer1m??0)+e.cachedInput*(n.cacheReadPer1m??0)+r*(n.cacheWritePer1m??0))/1e6;return Number(s.toPrecision(10))}function xo(e){return e.toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function $i(e){let t=e.source_model_id.toLowerCase(),n=t.slice(t.lastIndexOf("/")+1);return xo(n)}function jA(e){let t=new Set,n=r=>{let s=r.toLowerCase().split("/");for(let o=0;o<s.length;o+=1)t.add(xo(s.slice(o).join("/")))};return n(e.source_model_id),e.gateway_id&&n(e.gateway_id),t}function MX(e,t){let n=new Set,r=c=>{n.add(xo(c))},s=e.trim().toLowerCase(),o=null,i=s.indexOf(":");i>0&&!s.slice(0,i).includes("/")&&(o=s.slice(0,i),r(s),s=s.slice(i+1)),r(s);let a=s.slice(s.lastIndexOf("/")+1);r(a);for(let c of t)r(`${c}/${a}`);return o!==null&&r(`${o}/${a}`),[...n]}function Lo(e){let t=r=>!(r.mode!==void 0&&r.mode!==null&&r.mode!=="chat"||e.nonChatName&&e.nonChatName.test(r.source_model_id.toLowerCase())),n=r=>t(r)&&e.family.test(r.source_model_id.toLowerCase());return{firstPartyProviders:e.firstPartyProviders,isChatModel:t,coversRecord:n,normalize:r=>MX(r,e.vendorPrefixes),matchRow(r,s){if(!n(r))return!1;let o=jA(r);return s.some(i=>o.has(i))}}}var qA=Lo({vendorPrefixes:["anthropic"],family:/claude/,firstPartyProviders:["anthropic"]}),HA=Lo({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)(-|$)/}),WA=Lo({vendorPrefixes:["google","gemini"],family:/gemini|gemma/,firstPartyProviders:["gemini","google","vertex_ai-language-models"],nonChatName:/embedding|imagen|-image|tts|audio|veo|lyria|live|realtime|video/}),BA=Lo({vendorPrefixes:["moonshot","moonshotai"],family:/kimi|moonshot/,firstPartyProviders:["moonshot"]}),GA=Lo({vendorPrefixes:["dashscope","qwen"],family:/qwen/,firstPartyProviders:["dashscope"]}),XA=Lo({vendorPrefixes:["deepseek","nousresearch"],family:/deepseek|nous|hermes-\d/,firstPartyProviders:["deepseek","nousresearch"]}),PX=/\s*\(([^()]+)\)\s*$/;function UX(e){let t=e.trim(),n=PX.exec(t);return n?{model:t.slice(0,n.index).trim(),effort:n[1].trim()}:{model:t,effort:null}}var FX={"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"},jX=["gemini","google","vertex_ai-language-models","anthropic"],qX={normalize(e){let{model:t}=UX(e),n=FX[t.toLowerCase()];return n===void 0?[]:[xo(n)]},isChatModel(e){return e.mode===void 0||e.mode===null||e.mode==="chat"},coversRecord(e){return this.isChatModel(e)&&/gemini|claude/.test(e.source_model_id.toLowerCase())},matchRow(e,t){if(!this.coversRecord(e))return!1;let n=jA(e);return t.some(r=>n.has(r))}},VA=Lo({vendorPrefixes:["deepseek"],family:/deepseek/,firstPartyProviders:["deepseek"]}),JA={claude:qA,codex:HA,gemini:WA,agy:qX,kimi:BA,qwen:GA,hermes:XA,deepseek:VA},FA={claude:qA.firstPartyProviders,codex:HA.firstPartyProviders,gemini:WA.firstPartyProviders,agy:jX,kimi:BA.firstPartyProviders,qwen:GA.firstPartyProviders,hermes:XA.firstPartyProviders,deepseek:VA.firstPartyProviders};function HX(e,t,n){let r=t.trim().toLowerCase(),s=xo(r);if(n.records.some(i=>i.source_model_id.toLowerCase()===r&&e.matchRow(i,[s])))return!0;let o=e.normalize(t);return o.length>0&&n.records.some(i=>e.matchRow(i,o))}function WX(e,t,n){let r=[];for(let[s,o]of Object.entries(JA))s!==n&&HX(o,e,t)&&r.push(s);return r}function fu(e){return e==="moonshot"?0:e==="litellm"?1:e==="openrouter"?2:e==="manual"?3:4}function BX(e,t){return e.input_per_1m_tokens===t.input_per_1m_tokens&&e.output_per_1m_tokens===t.output_per_1m_tokens&&e.input_cache_read_per_1m_tokens===t.input_cache_read_per_1m_tokens&&(e.input_cache_write_per_1m_tokens??null)===(t.input_cache_write_per_1m_tokens??null)&&(e.source_cost_fields?.cache_creation_input_token_cost??null)===(t.source_cost_fields?.cache_creation_input_token_cost??null)&&(e.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)===(t.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)}function GX(e){let t=new Map,n=[];for(let r of e){let s=r.source_model_id.toLowerCase(),o=s.lastIndexOf("/"),i=o===-1?"":s.slice(0,o+1),a=o===-1?s:s.slice(o+1),c=`${r.source}:${i}${xo(a)}`,l=t.get(c);if(l===void 0){t.set(c,r);continue}if(!BX(l.pricing,r.pricing)){n.push(r);continue}/\d\.\d/.test(l.source_model_id)&&!/\d\.\d/.test(r.source_model_id)&&t.set(c,r)}return[...t.values(),...n]}function YA(e){return{route:e.record_id??`${e.source}:${e.source_model_id}`,source:e.source,sourceModelId:e.source_model_id,provider:e.provider??null,pricing:e.pricing,estimated:e.source==="manual"}}function KA(e,t){return e.map(YA).sort((n,r)=>{let s=fu(n.source)-fu(r.source);if(s!==0)return s;let o=n.provider!==null&&t.includes(n.provider)?0:1,i=r.provider!==null&&t.includes(r.provider)?0:1;return o!==i?o-i:n.sourceModelId.localeCompare(r.sourceModelId)})}function mu(e){return e.pricing.input_per_1m_tokens!==null&&e.pricing.output_per_1m_tokens!==null}function XX(e,t,n){let r=GX(e),s=KA(r,n),i=r.find(a=>(a.record_id??`${a.source}:${a.source_model_id}`)===s[0].route)?.context_window?.input_tokens??void 0;return{id:s[0].sourceModelId,normalizedId:t,offers:s,...i!=null?{contextWindow:i}:{}}}function m_(e,t,n,r){if(e.length===0)return{kind:"known-unpriced",id:t};let s=XX(e,t,n);if(r!==void 0){let i=e.map(YA),a=i.filter(d=>d.provider===r&&!d.sourceModelId.includes("/")&&d.source!=="openrouter"&&!d.estimated),c=a.length>0?a:i;if(c.length!==1||!mu(c[0]))return{kind:"known-unpriced",id:t};let l=c[0];s.offers=[l,...s.offers.filter(d=>d.route!==l.route)],s.id=l.sourceModelId}let o=s.offers.find(mu);return o===void 0?{kind:"known-unpriced",id:t}:o.estimated?{kind:"estimated",model:s}:{kind:"priced",model:s}}var p_=[];function VX(e,t){return e.standards.find(n=>n.standard_slug.toLowerCase()===t.toLowerCase())??null}function JX(e,t,n){let r=e.standard_slug;if(t===null||t.catalog_record_id===null)return{kind:"known-unpriced",id:r};let s=t.catalog_record_id,o=u=>u.record_id??u.source+":"+u.source_model_id,i=n.records.find(u=>o(u)===s),a=i?[]:n.records.filter(u=>o(u).toLowerCase()===s.toLowerCase()),c=i??(a.length===1?a[0]:void 0);if(!c)return{kind:"known-unpriced",id:r};let l=$i(c),d=n.records.filter(u=>$i(u)!==l?!1:u.mode===void 0||u.mode===null||u.mode==="chat");return d.length===0?{kind:"known-unpriced",id:r}:m_(d,l,p_)}function YX(e,t,n,r){if(n===null||!Array.isArray(n.records))return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};if(r!==null){let h=[t.trim().toLowerCase()];h.push(`${e.toLowerCase()}/${h[0]}`);let _=r.aliases.find(g=>h.includes(g.alias.toLowerCase()));if(_){if(_.evidence==="unresolved"||_.standard_slug===null)return{state:{kind:"unresolved",alias:_.alias},viaAlias:!0,pinRoute:null};let g=VX(r,_.standard_slug);return{state:JX(_,g,n),viaAlias:!0,pinRoute:g?.catalog_record_id??null}}}let s=JA[e];if(!s)return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};let o=t.trim().toLowerCase(),i=s.normalize(t),a=h=>({state:h,viaAlias:!1,pinRoute:null}),c=xo(o),l=n.records.filter(h=>h.source_model_id.toLowerCase()===o&&s.matchRow(h,[c]));if(l.length>0){let h=$i(l[0]),_=n.records.filter(g=>s.matchRow(g,[h])&&$i(g)===h);return a(m_(_.length>0?_:l,h,FA[e]??p_,e==="codex"?"openai":void 0))}let d=n.records.filter(h=>s.matchRow(h,i));if(d.length===0){let h=WX(t,n,e);return h.length>0?a({kind:"wrong-provider",declared:t,otherProviders:h}):a({kind:"unknown",declared:t})}let u=new Map;for(let h of d){let _=$i(h),g=u.get(_);g?g.push(h):u.set(_,[h])}let f=FA[e]??p_,m=null,p=null;for(let h of u.values()){let _=KA(h,f);(p===null||KX(_[0],p[0],f)<0)&&(m=h,p=_)}return a(m_(m,$i(m[0]),f,e==="codex"?"openai":void 0))}function zA(e,t,n,r){let{state:s,viaAlias:o,pinRoute:i}=YX(e,t,n,r);if(s.kind!=="priced"&&s.kind!=="estimated")return{state:s,offer:null,provenance:null};let a=s.model.offers;if(o&&i!==null){let l=a.find(d=>d.route===i)??a.find(d=>d.route.toLowerCase()===i.toLowerCase());if(l!==void 0&&mu(l))return{state:s,offer:l,provenance:"alias-pin"}}let c=a.find(mu)??null;return{state:s,offer:c,provenance:o&&i!==null?"alias-pin":"route-preference"}}function KX(e,t,n){let r=fu(e.source)-fu(t.source);if(r!==0)return r;let s=e.provider!==null&&n.includes(e.provider)?0:1,o=t.provider!==null&&n.includes(t.provider)?0:1;return s!==o?s-o:e.sourceModelId.localeCompare(t.sourceModelId)}function QA(e){return{startedAt:new Date().toISOString(),attempt_key:zX(),provider:e.provider,model_requested:e.modelRequested,cwd:e.cwd,native_session_id:e.sessionId||null}}function ZA(e,t){return t?"cancelled":/\bstall(?:ed|ing)?\b/i.test(e)?"stalled":"error"}var qr=e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null,QX=e=>typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null;async function h_(e,t,n=async()=>({catalog:null,aliases:null,source:"unavailable",generatedAt:null}),r){let s={...e,ended_at:new Date().toISOString(),turn_outcome:t.status,native_session_id:t.sessionId||e.native_session_id||null};try{let o=["claude","codex","muse","dsh"].includes(e.provider)||ru.includes(e.provider)&&t.usage?.source==="wire"?t.usage:r&&ru.includes(e.provider)?await wA(e,t.sessionId||String(e.native_session_id??""),String(s.ended_at),r):void 0;if(t.status!=="cancelled"&&(o?.outcome==="cancelled"||o?.outcome==="error")&&(s.turn_outcome=o.outcome),!o||o.source===null)return s.usage_source=null,s.usage_reason=e.provider==="ClaudeMock"?"mock_estimate":s.turn_outcome!=="ok"?"turn_not_completed":["copilot","hermes"].includes(e.provider)?"session_totals_only":"native_record_missing",s.cost_reason="usage_unavailable",s;if(Object.assign(s,{usage_source:o.source,usage_reason:o.reason,tok_input_uncached:qr(o.inputUncached),tok_cache_read:qr(o.cacheRead),tok_cache_write:qr(o.cacheWrite),tok_output:qr(o.output),tok_reasoning:qr(o.reasoning),model_reported:o.modelReported,provider_cost_usd:QX(o.providerCostUsd)}),o.invalidCounters||pr([o.inputUncached,o.cacheRead,o.cacheWrite,o.output,o.reasoning]))return s.usage_reason="counter_not_exposed",s.cost_reason="usage_unavailable",s;if(o.mixedModels)return s.cost_reason="mixed_models",s.model_reported=null,s;let i=o.modelReported||e.model_requested;if(!i)return s.cost_reason="model_unknown",s;let a,c=await Promise.race([n(),new Promise(p=>{a=setTimeout(()=>p(null),1e3)})]).finally(()=>{a&&clearTimeout(a)});if(!c||!c.catalog)return s.cost_reason="price_data_unavailable",s;let l=zA(e.provider,i,c.catalog,c.aliases);if(!l.offer)return s.cost_reason=l.state.kind==="unresolved"?"model_unresolved":l.state.kind==="unknown"||l.state.kind==="wrong-provider"?"model_unknown":"model_unpriced",s;let d=c.catalog.records.find(p=>(p.record_id??p.source+":"+p.source_model_id)===l.offer.route),u=l.offer.pricing,f={input:qr(o.inputUncached)??0,output:qr(o.output)??0,cachedInput:qr(o.cacheRead)??0,cacheWrite:qr(o.cacheWrite)??0,...o.cacheWrite5m==null?{}:{cacheWrite5m:o.cacheWrite5m},...o.cacheWrite1h==null?{}:{cacheWrite1h:o.cacheWrite1h}},m=f_(f,u);return Object.assign(s,{price_record_id:d?.record_id??null,price_snapshot_sha256:c.sha256??null,rate_input_1m:m.inputPer1m,rate_output_1m:m.outputPer1m,rate_cache_read_1m:m.cacheReadPer1m,rate_cache_write_1m:m.cacheWritePer1m}),s.cost_reason=UA(f,u)===null?"rate_missing":null,s}catch{return{...s,usage_reason:"recorder_failed",cost_reason:"usage_unavailable"}}}function Co(e,t,n){try{let r=Object.entries(n).filter(([s])=>Object.hasOwn(su,s));if(!r.length)return;e.prepare(`UPDATE team_chat_log SET ${r.map(([s])=>`${s}=?`).join(",")} WHERE id=? AND ended_at IS NULL`).run(...r.map(([,s])=>s??null),t)}catch(r){for(let o of["usage_source","model_reported","tok_input_uncached","tok_cache_read","tok_cache_write","tok_output","tok_reasoning","price_record_id","price_snapshot_sha256","rate_input_1m","rate_output_1m","rate_cache_read_1m","rate_cache_write_1m","provider_cost_usd"])n[o]=null;n.usage_reason="recorder_failed",n.cost_reason="usage_unavailable";let s=r?.code??"";if(/^SQLITE_(?:BUSY|LOCKED)(?:_|$)/.test(s))return;try{e.prepare("UPDATE team_chat_log SET attempt_key=COALESCE(attempt_key,?),provider=COALESCE(provider,?),native_session_id=COALESCE(native_session_id,?),cwd=COALESCE(cwd,?),model_requested=COALESCE(model_requested,?),ended_at=COALESCE(ended_at,?),turn_outcome=COALESCE(turn_outcome,?),usage_reason='recorder_failed',cost_reason='usage_unavailable' WHERE id=? AND ended_at IS NULL").run(n.attempt_key??null,n.provider??null,n.native_session_id??null,n.cwd??null,n.model_requested??null,n.ended_at??null,n.turn_outcome??null,t)}catch{}}}import{randomUUID as PI}from"node:crypto";import{existsSync as qI,mkdirSync as qV,renameSync as HV,rmdirSync as WV}from"node:fs";import{hostname as b_}from"node:os";var eI=`
240
+ `;import{createHash as xA}from"node:crypto";import{mkdirSync as LA,readFileSync as yX,renameSync as wX,writeFileSync as TX,existsSync as CA}from"node:fs";import{homedir as vX}from"node:os";import{dirname as OA,join as cu,resolve as lu}from"node:path";import{fileURLToPath as SX}from"node:url";var EX=new URL("./cli/index.js",import.meta.url).href,bX="https://lmctl.com/dataset/model_list.json",AX="https://lmctl.com/dataset/aliases.json",IX=1e3,kX=1e4,vA=6*60*60*1e3;function RX(){return cu(vX(),".lmctl","cache","lmprice")}var iu="model_list.json",au="aliases.json",DA="meta.json",NX="model_list.meta.json";function Di(e,t){return cu(e,t)}var vc=new WeakMap;function du(e,t){if(!e||!t)return null;let n=vc.get(e),r=vc.get(t);return n===void 0||r===void 0?null:xA("sha256").update(n).update(r).digest("hex")}function ko(e){try{let t=yX(e,"utf-8"),n=JSON.parse(t);return n&&typeof n=="object"&&vc.set(n,t),n}catch{return null}}function $A(e,t){let n=`${e}.tmp-${process.pid}`;TX(n,t),wX(n,e)}function c_(e){return e===null||typeof e=="number"}function Ro(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.schema_version!==1||!Array.isArray(t.records)||t.records.length===0?!1:t.records.every(n=>{if(typeof n!="object"||n===null)return!1;let r=n;if(typeof r.source!="string"||typeof r.source_model_id!="string"||typeof r.pricing!="object"||r.pricing===null)return!1;let s=r.pricing;return c_(s.input_per_1m_tokens)&&c_(s.output_per_1m_tokens)&&c_(s.input_cache_read_per_1m_tokens)})}var xX=new Set(["established","asserted","unresolved"]);function No(e){if(typeof e!="object"||e===null)return!1;let t=e;if(t.schema_version!==1||!Array.isArray(t.standards)||!Array.isArray(t.aliases))return!1;let n=t.standards.every(s=>{if(typeof s!="object"||s===null)return!1;let o=s;return typeof o.standard_slug=="string"&&(o.catalog_record_id===null||typeof o.catalog_record_id=="string")}),r=t.aliases.every(s=>{if(typeof s!="object"||s===null)return!1;let o=s;return typeof o.alias=="string"&&(o.standard_slug===null||typeof o.standard_slug=="string")&&typeof o.evidence=="string"&&xX.has(o.evidence)});return n&&r}var SA={etag:null,last_checked:null};function LX(e){let t=ko(Di(e,DA)),n={etag:typeof t?.model_list?.etag=="string"?t.model_list.etag:null,last_checked:typeof t?.model_list?.last_checked=="string"?t.model_list.last_checked:null},r={etag:typeof t?.aliases?.etag=="string"?t.aliases.etag:null,last_checked:typeof t?.aliases?.last_checked=="string"?t.aliases.last_checked:null};if(t===null){let s=ko(Di(e,NX));s&&(n.etag=typeof s.etag=="string"?s.etag:null,n.last_checked=typeof s.fetchedAt=="string"?s.fetchedAt:null)}return{model_list:n,aliases:r,...typeof t?.pair_sha256=="string"?{pair_sha256:t.pair_sha256}:{}}}function CX(e){let t=LX(e),n=ko(Di(e,iu)),r=ko(Di(e,au));return t.pair_sha256&&du(Ro(n)?n:null,No(r)?r:null)!==t.pair_sha256?{catalog:null,aliases:null,meta:{model_list:{...SA},aliases:{...SA}}}:{catalog:Ro(n)?n:null,aliases:No(r)?r:null,meta:t}}function bA(e,t){try{return LA(e,{recursive:!0}),$A(Di(e,DA),JSON.stringify(t)),!0}catch{return!1}}function l_(e){return(e&&typeof e=="object"?vc.get(e):void 0)??JSON.stringify(e)}function ou(e,t,n){try{LA(e,{recursive:!0}),$A(Di(e,t),l_(n))}catch{}}function OX(e,t){let n=DX(e),r=n?[lu(n,"data",t)]:[lu(e,"..","..","data",t)];for(let s of r)if(CA(s))return s;return null}function DX(e){let t=lu(e);for(;;){if(CA(lu(t,"package.json")))return t;let n=OA(t);if(n===t)return null;t=n}}function AA(e,t,n){let r=n!==void 0?n:OX(e,t);return r===null?null:ko(r)}function uu(e=process.env){let t=e.LMCTL_PRICE_TTL;if(t===void 0||t==="")return vA;let n=Number(t);return!Number.isFinite(n)||n<0?vA:n*1e3}function $X(){let e=process.env.LMCTL_PRICE_DATA;return e!==void 0&&e!==""?e:null}async function IA(e,t,n,r){try{let s=await e(t,{method:"HEAD",signal:AbortSignal.timeout(IX)});if(!s.ok)return{kind:"failed"};let o=s.headers.get("etag");if(n!==null&&o!==null&&o===r)return{kind:"match"};let i=await e(t,{signal:AbortSignal.timeout(kX)});if(!i.ok)return{kind:"failed"};let a=await i.text(),c=JSON.parse(a);return c&&typeof c=="object"&&vc.set(c,a),{kind:"payload",payload:c,etag:i.headers.get("etag")??o}}catch{return{kind:"failed"}}}var d_=null;var kA=null;function MA(e={}){return Object.keys(e).length===0?(kA??=RA(e),kA):RA(e)}async function RA(e){let t=OA(SX(EX)),n=e.pinDir!==void 0?e.pinDir:$X();if(n!==null&&n!==""){let h=ko(cu(n,iu)),_=ko(cu(n,au));if(Ro(h)&&No(_)){let g={sha256:du(h,_),catalog:h,aliases:_,source:"pinned",generatedAt:h.generated_at??null};return d_=g.generatedAt,g}return NA(e,t)}let r=e.fetchImpl??fetch,s=e.cacheDir??RX(),o=e.now??Date.now(),i=e.ttlMs??uu(),a=CX(s),c=(h,_)=>h!==null&&_.last_checked!==null&&o>=Date.parse(_.last_checked)&&o-Date.parse(_.last_checked)<i,l=a.catalog,d=a.aliases,u=!1,f=!1,m={model_list:{...a.meta.model_list},aliases:{...a.meta.aliases}},p=!1;if(!c(l,a.meta.model_list)){let h=await IA(r,bX,l,a.meta.model_list.etag);h.kind==="failed"&&(f=!0),h.kind==="match"?(m.model_list.last_checked=new Date(o).toISOString(),p=!0):h.kind==="payload"&&(Ro(h.payload)?(m.model_list.last_checked=new Date(o).toISOString(),p=!0,l=h.payload,h.etag!==null&&(m.model_list.etag=h.etag),u=!0):f=!0)}if(!c(d,a.meta.aliases)){let h=await IA(r,AX,d,a.meta.aliases.etag);h.kind==="failed"&&(f=!0),h.kind==="match"?(m.aliases.last_checked=new Date(o).toISOString(),p=!0):h.kind==="payload"&&(No(h.payload)?(m.aliases.last_checked=new Date(o).toISOString(),p=!0,d=h.payload,h.etag!==null&&(m.aliases.etag=h.etag),u=!0):f=!0)}if(!f&&(p||u))if(l!==null&&d!==null){let h=xA("sha256").update(l_(l)).update(l_(d)).digest("hex");bA(s,{...m,pair_sha256:h})&&h!==a.meta.pair_sha256&&(ou(s,iu,l),ou(s,au,d))}else l!==a.catalog&&l!==null&&ou(s,iu,l),d!==a.aliases&&d!==null&&ou(s,au,d),bA(s,m);if(l!==null||d!==null){let h={catalog:l,aliases:d,sha256:du(l,d),source:u?"network":"cache",refreshFailed:f,generatedAt:l?.generated_at??null};return d_=h.generatedAt,h}return{...NA(e,t),refreshFailed:f}}function NA(e,t){let n=AA(t,"price-data.json",e.bundledPath),r=AA(t,"price-aliases.json",e.bundledAliasesPath),s=Ro(n)?n:null,o=No(r)?r:null,i={catalog:s,aliases:o,sha256:du(s,o),source:s!==null||o!==null?"bundled":"unavailable",generatedAt:s?.generated_at??null};return d_=i.generatedAt,i}var Ci=e=>typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null,Oi=e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null;function PA(e){if(e.cacheWrite!==void 0)return Oi(e.cacheWrite);if(e.cacheWrite5m===void 0&&e.cacheWrite1h===void 0)return 0;let t=Oi(e.cacheWrite5m),n=Oi(e.cacheWrite1h);return t===null||n===null?null:Oi(t+n)}function u_(e,t){let n=Oi(e.cacheWrite5m===void 0?0:e.cacheWrite5m),r=Oi(e.cacheWrite1h===void 0?0:e.cacheWrite1h);return n!==null&&r!==null&&Number.isSafeInteger(n+r)&&n+r===t?{five:n,one:r}:null}function f_(e,t){let n=Ci(t.input_per_1m_tokens),r=Ci(t.output_per_1m_tokens),s=Ci(t.input_cache_read_per_1m_tokens),o=Ci(t.source_cost_fields?.cache_creation_input_token_cost),i=Ci(t.input_cache_write_per_1m_tokens)??(o===null?n:o*1e6),a=Ci(t.source_cost_fields?.cache_creation_input_token_cost_above_1hr),c=a===null?i:a*1e6,l=PA(e),d=u_(e,l),u=l===null?null:d===null||l===0?i:d.five>0&&i===null||d.one>0&&c===null?null:(d.five*(i??0)+d.one*(c??0))/l;return{inputPer1m:n,outputPer1m:r,cacheReadPer1m:s,cacheWritePer1m:u}}function UA(e,t){if(t===null)return null;let n=f_(e,t),r=PA(e);if(r===null||e.input>0&&n.inputPer1m===null||e.output>0&&n.outputPer1m===null||e.cachedInput>0&&n.cacheReadPer1m===null||r>0&&n.cacheWritePer1m===null)return null;let s=(e.input*(n.inputPer1m??0)+e.output*(n.outputPer1m??0)+e.cachedInput*(n.cacheReadPer1m??0)+r*(n.cacheWritePer1m??0))/1e6;return Number(s.toPrecision(10))}function xo(e){return e.toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function $i(e){let t=e.source_model_id.toLowerCase(),n=t.slice(t.lastIndexOf("/")+1);return xo(n)}function jA(e){let t=new Set,n=r=>{let s=r.toLowerCase().split("/");for(let o=0;o<s.length;o+=1)t.add(xo(s.slice(o).join("/")))};return n(e.source_model_id),e.gateway_id&&n(e.gateway_id),t}function MX(e,t){let n=new Set,r=c=>{n.add(xo(c))},s=e.trim().toLowerCase(),o=null,i=s.indexOf(":");i>0&&!s.slice(0,i).includes("/")&&(o=s.slice(0,i),r(s),s=s.slice(i+1)),r(s);let a=s.slice(s.lastIndexOf("/")+1);r(a);for(let c of t)r(`${c}/${a}`);return o!==null&&r(`${o}/${a}`),[...n]}function Lo(e){let t=r=>!(r.mode!==void 0&&r.mode!==null&&r.mode!=="chat"||e.nonChatName&&e.nonChatName.test(r.source_model_id.toLowerCase())),n=r=>t(r)&&e.family.test(r.source_model_id.toLowerCase());return{firstPartyProviders:e.firstPartyProviders,isChatModel:t,coversRecord:n,normalize:r=>MX(r,e.vendorPrefixes),matchRow(r,s){if(!n(r))return!1;let o=jA(r);return s.some(i=>o.has(i))}}}var qA=Lo({vendorPrefixes:["anthropic"],family:/claude/,firstPartyProviders:["anthropic"]}),HA=Lo({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)(-|$)/}),WA=Lo({vendorPrefixes:["google","gemini"],family:/gemini|gemma/,firstPartyProviders:["gemini","google","vertex_ai-language-models"],nonChatName:/embedding|imagen|-image|tts|audio|veo|lyria|live|realtime|video/}),BA=Lo({vendorPrefixes:["moonshot","moonshotai"],family:/kimi|moonshot/,firstPartyProviders:["moonshot"]}),GA=Lo({vendorPrefixes:["dashscope","qwen"],family:/qwen/,firstPartyProviders:["dashscope"]}),XA=Lo({vendorPrefixes:["deepseek","nousresearch"],family:/deepseek|nous|hermes-\d/,firstPartyProviders:["deepseek","nousresearch"]}),PX=/\s*\(([^()]+)\)\s*$/;function UX(e){let t=e.trim(),n=PX.exec(t);return n?{model:t.slice(0,n.index).trim(),effort:n[1].trim()}:{model:t,effort:null}}var FX={"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"},jX=["gemini","google","vertex_ai-language-models","anthropic"],qX={normalize(e){let{model:t}=UX(e),n=FX[t.toLowerCase()];return n===void 0?[]:[xo(n)]},isChatModel(e){return e.mode===void 0||e.mode===null||e.mode==="chat"},coversRecord(e){return this.isChatModel(e)&&/gemini|claude/.test(e.source_model_id.toLowerCase())},matchRow(e,t){if(!this.coversRecord(e))return!1;let n=jA(e);return t.some(r=>n.has(r))}},VA=Lo({vendorPrefixes:["deepseek"],family:/deepseek/,firstPartyProviders:["deepseek"]}),JA={claude:qA,codex:HA,gemini:WA,agy:qX,kimi:BA,qwen:GA,hermes:XA,deepseek:VA},FA={claude:qA.firstPartyProviders,codex:HA.firstPartyProviders,gemini:WA.firstPartyProviders,agy:jX,kimi:BA.firstPartyProviders,qwen:GA.firstPartyProviders,hermes:XA.firstPartyProviders,deepseek:VA.firstPartyProviders};function HX(e,t,n){let r=t.trim().toLowerCase(),s=xo(r);if(n.records.some(i=>i.source_model_id.toLowerCase()===r&&e.matchRow(i,[s])))return!0;let o=e.normalize(t);return o.length>0&&n.records.some(i=>e.matchRow(i,o))}function WX(e,t,n){let r=[];for(let[s,o]of Object.entries(JA))s!==n&&HX(o,e,t)&&r.push(s);return r}function fu(e){return e==="moonshot"?0:e==="litellm"?1:e==="openrouter"?2:e==="manual"?3:4}function BX(e,t){return e.input_per_1m_tokens===t.input_per_1m_tokens&&e.output_per_1m_tokens===t.output_per_1m_tokens&&e.input_cache_read_per_1m_tokens===t.input_cache_read_per_1m_tokens&&(e.input_cache_write_per_1m_tokens??null)===(t.input_cache_write_per_1m_tokens??null)&&(e.source_cost_fields?.cache_creation_input_token_cost??null)===(t.source_cost_fields?.cache_creation_input_token_cost??null)&&(e.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)===(t.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)}function GX(e){let t=new Map,n=[];for(let r of e){let s=r.source_model_id.toLowerCase(),o=s.lastIndexOf("/"),i=o===-1?"":s.slice(0,o+1),a=o===-1?s:s.slice(o+1),c=`${r.source}:${i}${xo(a)}`,l=t.get(c);if(l===void 0){t.set(c,r);continue}if(!BX(l.pricing,r.pricing)){n.push(r);continue}/\d\.\d/.test(l.source_model_id)&&!/\d\.\d/.test(r.source_model_id)&&t.set(c,r)}return[...t.values(),...n]}function YA(e){return{route:e.record_id??`${e.source}:${e.source_model_id}`,source:e.source,sourceModelId:e.source_model_id,provider:e.provider??null,pricing:e.pricing,estimated:e.source==="manual"}}function KA(e,t){return e.map(YA).sort((n,r)=>{let s=fu(n.source)-fu(r.source);if(s!==0)return s;let o=n.provider!==null&&t.includes(n.provider)?0:1,i=r.provider!==null&&t.includes(r.provider)?0:1;return o!==i?o-i:n.sourceModelId.localeCompare(r.sourceModelId)})}function mu(e){return e.pricing.input_per_1m_tokens!==null&&e.pricing.output_per_1m_tokens!==null}function XX(e,t,n){let r=GX(e),s=KA(r,n),i=r.find(a=>(a.record_id??`${a.source}:${a.source_model_id}`)===s[0].route)?.context_window?.input_tokens??void 0;return{id:s[0].sourceModelId,normalizedId:t,offers:s,...i!=null?{contextWindow:i}:{}}}function m_(e,t,n,r){if(e.length===0)return{kind:"known-unpriced",id:t};let s=XX(e,t,n);if(r!==void 0){let i=e.map(YA),a=i.filter(d=>d.provider===r&&!d.sourceModelId.includes("/")&&d.source!=="openrouter"&&!d.estimated),c=a.length>0?a:i;if(c.length!==1||!mu(c[0]))return{kind:"known-unpriced",id:t};let l=c[0];s.offers=[l,...s.offers.filter(d=>d.route!==l.route)],s.id=l.sourceModelId}let o=s.offers.find(mu);return o===void 0?{kind:"known-unpriced",id:t}:o.estimated?{kind:"estimated",model:s}:{kind:"priced",model:s}}var p_=[];function VX(e,t){return e.standards.find(n=>n.standard_slug.toLowerCase()===t.toLowerCase())??null}function JX(e,t,n){let r=e.standard_slug;if(t===null||t.catalog_record_id===null)return{kind:"known-unpriced",id:r};let s=t.catalog_record_id,o=u=>u.record_id??u.source+":"+u.source_model_id,i=n.records.find(u=>o(u)===s),a=i?[]:n.records.filter(u=>o(u).toLowerCase()===s.toLowerCase()),c=i??(a.length===1?a[0]:void 0);if(!c)return{kind:"known-unpriced",id:r};let l=$i(c),d=n.records.filter(u=>$i(u)!==l?!1:u.mode===void 0||u.mode===null||u.mode==="chat");return d.length===0?{kind:"known-unpriced",id:r}:m_(d,l,p_)}function YX(e,t,n,r){if(n===null||!Array.isArray(n.records))return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};if(r!==null){let h=[t.trim().toLowerCase()];h.push(`${e.toLowerCase()}/${h[0]}`);let _=r.aliases.find(g=>h.includes(g.alias.toLowerCase()));if(_){if(_.evidence==="unresolved"||_.standard_slug===null)return{state:{kind:"unresolved",alias:_.alias},viaAlias:!0,pinRoute:null};let g=VX(r,_.standard_slug);return{state:JX(_,g,n),viaAlias:!0,pinRoute:g?.catalog_record_id??null}}}let s=JA[e];if(!s)return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};let o=t.trim().toLowerCase(),i=s.normalize(t),a=h=>({state:h,viaAlias:!1,pinRoute:null}),c=xo(o),l=n.records.filter(h=>h.source_model_id.toLowerCase()===o&&s.matchRow(h,[c]));if(l.length>0){let h=$i(l[0]),_=n.records.filter(g=>s.matchRow(g,[h])&&$i(g)===h);return a(m_(_.length>0?_:l,h,FA[e]??p_,e==="codex"?"openai":void 0))}let d=n.records.filter(h=>s.matchRow(h,i));if(d.length===0){let h=WX(t,n,e);return h.length>0?a({kind:"wrong-provider",declared:t,otherProviders:h}):a({kind:"unknown",declared:t})}let u=new Map;for(let h of d){let _=$i(h),g=u.get(_);g?g.push(h):u.set(_,[h])}let f=FA[e]??p_,m=null,p=null;for(let h of u.values()){let _=KA(h,f);(p===null||KX(_[0],p[0],f)<0)&&(m=h,p=_)}return a(m_(m,$i(m[0]),f,e==="codex"?"openai":void 0))}function zA(e,t,n,r){let{state:s,viaAlias:o,pinRoute:i}=YX(e,t,n,r);if(s.kind!=="priced"&&s.kind!=="estimated")return{state:s,offer:null,provenance:null};let a=s.model.offers;if(o&&i!==null){let l=a.find(d=>d.route===i)??a.find(d=>d.route.toLowerCase()===i.toLowerCase());if(l!==void 0&&mu(l))return{state:s,offer:l,provenance:"alias-pin"}}let c=a.find(mu)??null;return{state:s,offer:c,provenance:o&&i!==null?"alias-pin":"route-preference"}}function KX(e,t,n){let r=fu(e.source)-fu(t.source);if(r!==0)return r;let s=e.provider!==null&&n.includes(e.provider)?0:1,o=t.provider!==null&&n.includes(t.provider)?0:1;return s!==o?s-o:e.sourceModelId.localeCompare(t.sourceModelId)}function QA(e){return{startedAt:new Date().toISOString(),attempt_key:zX(),provider:e.provider,model_requested:e.modelRequested,cwd:e.cwd,native_session_id:e.sessionId||null}}function ZA(e,t){return t?"cancelled":/\bstall(?:ed|ing)?\b/i.test(e)?"stalled":"error"}var Hr=e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null,QX=e=>typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null;async function h_(e,t,n=async()=>({catalog:null,aliases:null,source:"unavailable",generatedAt:null}),r){let s={...e,ended_at:new Date().toISOString(),turn_outcome:t.status,native_session_id:t.sessionId||e.native_session_id||null};try{let o=["claude","codex","muse","dsh"].includes(e.provider)||ru.includes(e.provider)&&t.usage?.source==="wire"?t.usage:r&&ru.includes(e.provider)?await wA(e,t.sessionId||String(e.native_session_id??""),String(s.ended_at),r):void 0;if(t.status!=="cancelled"&&(o?.outcome==="cancelled"||o?.outcome==="error")&&(s.turn_outcome=o.outcome),!o||o.source===null)return s.usage_source=null,s.usage_reason=e.provider==="ClaudeMock"?"mock_estimate":s.turn_outcome!=="ok"?"turn_not_completed":["copilot","hermes"].includes(e.provider)?"session_totals_only":"native_record_missing",s.cost_reason="usage_unavailable",s;if(Object.assign(s,{usage_source:o.source,usage_reason:o.reason,tok_input_uncached:Hr(o.inputUncached),tok_cache_read:Hr(o.cacheRead),tok_cache_write:Hr(o.cacheWrite),tok_output:Hr(o.output),tok_reasoning:Hr(o.reasoning),model_reported:o.modelReported,provider_cost_usd:QX(o.providerCostUsd)}),o.invalidCounters||pr([o.inputUncached,o.cacheRead,o.cacheWrite,o.output,o.reasoning]))return s.usage_reason="counter_not_exposed",s.cost_reason="usage_unavailable",s;if(o.mixedModels)return s.cost_reason="mixed_models",s.model_reported=null,s;let i=o.modelReported||e.model_requested;if(!i)return s.cost_reason="model_unknown",s;let a,c=await Promise.race([n(),new Promise(p=>{a=setTimeout(()=>p(null),1e3)})]).finally(()=>{a&&clearTimeout(a)});if(!c||!c.catalog)return s.cost_reason="price_data_unavailable",s;let l=zA(e.provider,i,c.catalog,c.aliases);if(!l.offer)return s.cost_reason=l.state.kind==="unresolved"?"model_unresolved":l.state.kind==="unknown"||l.state.kind==="wrong-provider"?"model_unknown":"model_unpriced",s;let d=c.catalog.records.find(p=>(p.record_id??p.source+":"+p.source_model_id)===l.offer.route),u=l.offer.pricing,f={input:Hr(o.inputUncached)??0,output:Hr(o.output)??0,cachedInput:Hr(o.cacheRead)??0,cacheWrite:Hr(o.cacheWrite)??0,...o.cacheWrite5m==null?{}:{cacheWrite5m:o.cacheWrite5m},...o.cacheWrite1h==null?{}:{cacheWrite1h:o.cacheWrite1h}},m=f_(f,u);return Object.assign(s,{price_record_id:d?.record_id??null,price_snapshot_sha256:c.sha256??null,rate_input_1m:m.inputPer1m,rate_output_1m:m.outputPer1m,rate_cache_read_1m:m.cacheReadPer1m,rate_cache_write_1m:m.cacheWritePer1m}),s.cost_reason=UA(f,u)===null?"rate_missing":null,s}catch{return{...s,usage_reason:"recorder_failed",cost_reason:"usage_unavailable"}}}function Co(e,t,n){try{let r=Object.entries(n).filter(([s])=>Object.hasOwn(su,s));if(!r.length)return;e.prepare(`UPDATE team_chat_log SET ${r.map(([s])=>`${s}=?`).join(",")} WHERE id=? AND ended_at IS NULL`).run(...r.map(([,s])=>s??null),t)}catch(r){for(let o of["usage_source","model_reported","tok_input_uncached","tok_cache_read","tok_cache_write","tok_output","tok_reasoning","price_record_id","price_snapshot_sha256","rate_input_1m","rate_output_1m","rate_cache_read_1m","rate_cache_write_1m","provider_cost_usd"])n[o]=null;n.usage_reason="recorder_failed",n.cost_reason="usage_unavailable";let s=r?.code??"";if(/^SQLITE_(?:BUSY|LOCKED)(?:_|$)/.test(s))return;try{e.prepare("UPDATE team_chat_log SET attempt_key=COALESCE(attempt_key,?),provider=COALESCE(provider,?),native_session_id=COALESCE(native_session_id,?),cwd=COALESCE(cwd,?),model_requested=COALESCE(model_requested,?),ended_at=COALESCE(ended_at,?),turn_outcome=COALESCE(turn_outcome,?),usage_reason='recorder_failed',cost_reason='usage_unavailable' WHERE id=? AND ended_at IS NULL").run(n.attempt_key??null,n.provider??null,n.native_session_id??null,n.cwd??null,n.model_requested??null,n.ended_at??null,n.turn_outcome??null,t)}catch{}}}import{randomUUID as PI}from"node:crypto";import{existsSync as qI,mkdirSync as qV,renameSync as HV,rmdirSync as WV}from"node:fs";import{hostname as b_}from"node:os";var eI=`
241
241
  CREATE TABLE IF NOT EXISTS price_snapshot (
242
242
  sha256 TEXT PRIMARY KEY,
243
243
  generated_at TEXT,
@@ -1412,7 +1412,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1412
1412
  AND status = 'running'
1413
1413
  AND launch_source = 'terminal'
1414
1414
  ORDER BY started_at DESC, id DESC
1415
- LIMIT 1`,t,n)[0]??null}function bV(e){return e.holder_pid!==null&&(e.holder_host===null||e.holder_host===Mi())?Sn(e.holder_pid):AV(e)}function AV(e){let t=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(t)?Date.now()-t<=Ls():!1}function wu(e,t){return e.holder_pid===null?e.started_at<t:!Sn(e.holder_pid)}function Ls(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return _I;let n=Number(t);return!Number.isFinite(n)||n<=0?_I:n}function IV(e=process.env){let t=e.LMCTL_TERMINAL_LOCK_STALE_MS;if(t===void 0||t.trim()==="")return gI;let n=Number(t);return!Number.isFinite(n)||n<=0?gI:n}var NV=60*60*1e3;function Cs(e,t){return{teamfile:e,alias:t}}function wI(e,t,n={}){return{teamfile:e,alias:t,...n.provider===void 0||n.provider===null?{}:{provider:n.provider},...n.sessionId===void 0||n.sessionId===null?{}:{session_id:n.sessionId}}}function g_(e,t){return e===null?null:Cs(e,t??"")}function Hr(e){return`msg_tcl_${e}`}function $o(e){return`inv_${e}`}function Pi(e,t,n){return e.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
1415
+ LIMIT 1`,t,n)[0]??null}function bV(e){return e.holder_pid!==null&&(e.holder_host===null||e.holder_host===Mi())?Sn(e.holder_pid):AV(e)}function AV(e){let t=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(t)?Date.now()-t<=Ls():!1}function wu(e,t){return e.holder_pid===null?e.started_at<t:!Sn(e.holder_pid)}function Ls(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return _I;let n=Number(t);return!Number.isFinite(n)||n<=0?_I:n}function IV(e=process.env){let t=e.LMCTL_TERMINAL_LOCK_STALE_MS;if(t===void 0||t.trim()==="")return gI;let n=Number(t);return!Number.isFinite(n)||n<=0?gI:n}var NV=60*60*1e3;function Cs(e,t){return{teamfile:e,alias:t}}function wI(e,t,n={}){return{teamfile:e,alias:t,...n.provider===void 0||n.provider===null?{}:{provider:n.provider},...n.sessionId===void 0||n.sessionId===null?{}:{session_id:n.sessionId}}}function g_(e,t){return e===null?null:Cs(e,t??"")}function Wr(e){return`msg_tcl_${e}`}function $o(e){return`inv_${e}`}function Pi(e,t,n){return e.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
1416
1416
  holder_pid, holder_host, started_at, terminal_lock_id,
1417
1417
  terminal_invocation_id, currently_handling_message_id,
1418
1418
  currently_handling_since, last_seq
@@ -1429,7 +1429,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1429
1429
  SET currently_handling_message_id = NULL,
1430
1430
  currently_handling_since = NULL
1431
1431
  WHERE receiver_teamfile = ? AND receiver_alias = ?
1432
- AND currently_handling_message_id = ?`).run(t,n,r).changes===1}function CV(e,t){let n=t??new Date(Date.now()-Ls()).toISOString();return wu({holder_pid:e.holder_pid,started_at:e.started_at??""},n)}function OV(e,t,n){return t==="force"||t==="session-idle"?t:n?"force":e.holder_pid!==null&&!Sn(e.holder_pid)?"dead-pid":"stale"}function DV(e){return{sender:g_(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at}}function Ui(e,t){if(e!==1)throw new Error(`event projection CAS failed during ${t}`)}function w_(e,t,n){let r=Hr(t),s=g_(n.sender_teamfile,n.sender_alias),o=wI(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),i={message_id:r,message_type:"request",sender:s,receiver:o,root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:t}};return ln(e,{stream_id:r,event_type:"CREATE",observedLastSeq:0,ts:n.created_at,payload:{...i,content:n.message,provider_prompt:n.provider_prompt??n.message,origin:n.origin,...LV(e,n.sender_teamfile,n.sender_alias)}},()=>{E_(e,n.receiver_teamfile,n.receiver_alias,r,n.created_at)}),r}function Tu(e,t,n){let r=Hr(t),s={message_id:r,message_type:"request",sender:g_(n.sender_teamfile,n.sender_alias),receiver:wI(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:t}};return ln(e,{stream_id:r,event_type:"HANDLED",observedLastSeq:1,ts:n.created_at,payload:{...s,outcome:n.status,...n.usage?{usage:n.usage}:{},receipt:n.response,error:n.error_detail,truncated:n.truncated===1}},()=>{y_(e,n.receiver_teamfile,n.receiver_alias,r)}),r}function $V(e){return{sender:Cs(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:null,started_at:e.started_at}}function TI(e,t,n,r){let s=e.prepare(`UPDATE agent_state
1432
+ AND currently_handling_message_id = ?`).run(t,n,r).changes===1}function CV(e,t){let n=t??new Date(Date.now()-Ls()).toISOString();return wu({holder_pid:e.holder_pid,started_at:e.started_at??""},n)}function OV(e,t,n){return t==="force"||t==="session-idle"?t:n?"force":e.holder_pid!==null&&!Sn(e.holder_pid)?"dead-pid":"stale"}function DV(e){return{sender:g_(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at}}function Ui(e,t){if(e!==1)throw new Error(`event projection CAS failed during ${t}`)}function w_(e,t,n){let r=Wr(t),s=g_(n.sender_teamfile,n.sender_alias),o=wI(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),i={message_id:r,message_type:"request",sender:s,receiver:o,root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:t}};return ln(e,{stream_id:r,event_type:"CREATE",observedLastSeq:0,ts:n.created_at,payload:{...i,content:n.message,provider_prompt:n.provider_prompt??n.message,origin:n.origin,...LV(e,n.sender_teamfile,n.sender_alias)}},()=>{E_(e,n.receiver_teamfile,n.receiver_alias,r,n.created_at)}),r}function Tu(e,t,n){let r=Wr(t),s={message_id:r,message_type:"request",sender:g_(n.sender_teamfile,n.sender_alias),receiver:wI(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:t}};return ln(e,{stream_id:r,event_type:"HANDLED",observedLastSeq:1,ts:n.created_at,payload:{...s,outcome:n.status,...n.usage?{usage:n.usage}:{},receipt:n.response,error:n.error_detail,truncated:n.truncated===1}},()=>{y_(e,n.receiver_teamfile,n.receiver_alias,r)}),r}function $V(e){return{sender:Cs(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:null,started_at:e.started_at}}function TI(e,t,n,r){let s=e.prepare(`UPDATE agent_state
1433
1433
  SET lease_id = NULL, sender_teamfile = NULL, sender_alias = NULL,
1434
1434
  holder_pid = NULL, holder_host = NULL, started_at = NULL,
1435
1435
  last_heartbeat_at = NULL, last_seq = ?
@@ -1486,7 +1486,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1486
1486
  AND ended_at IS NOT NULL
1487
1487
  AND ended_at >= ?
1488
1488
  ORDER BY started_at ASC, id ASC
1489
- `).all(...t,n)}finishTrackedInvocation(t,n){return this.db.transaction(()=>{let r=n.ended_at??ae();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,Mn(n.result_summary),Mn(n.error),n.team_chat_log_id??null,Mn(n.meta),Mn(n.config_warnings),r,t).changes!==1)return null;let o=this.getTrackedInvocation(t);return vu(this.db,o),o.status==="cancelled"&&o.signal!==null&&o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,o.error??`holder received ${o.signal}`),o})()}reclaimTrackedInvocationIfUnchanged(t,n,r){return this.db.transaction(()=>{let s=r.ended_at??ae();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,Mn(r.result_summary),Mn(r.error),r.team_chat_log_id??null,Mn(r.meta),Mn(r.config_warnings),s,t,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let i=this.getTrackedInvocation(t);return vu(this.db,i),i})()}heartbeatTrackedInvocation(t,n=ae()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,t).changes!==1)return null;let s=this.getTrackedInvocation(t);return LI(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(t,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,t).changes!==1?null:(CI(this.db,t,n),this.getTrackedInvocation(t)))()}linkTrackedInvocationMessage(t,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,t).changes!==1?null:(OI(this.db,t,Hr(n)),this.getTrackedInvocation(t)))()}abortTrackedInvocationAndTerminalizeMessage(t,n,r){return this.db.transaction(()=>{let s=ae();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Mn(r),t,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let i=this.getTrackedInvocation(t);return vu(this.db,i),i.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(i.team_chat_log_id,r),i})()}terminalizeLinkedChatMessage(t,n){let r=this.stmts.getTeamChatLogById.get(t);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,t).changes!==1||Tu(this.db,t,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:ae()})}listClaimableTerminalTrackedInvocations(t){let n=["status IN ('done', 'error', 'busy', 'cancelled', 'aborted')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(t,n,r=ae()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,t).changes!==1)return null;let o=this.getTrackedInvocation(t);return xI(this.db,o,n,r),o})()}listTrackedInvocations(t={}){let n=[],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile)),t.status!==void 0&&(n.push("status = ?"),r.push(t.status)),t.kind!==void 0&&(n.push("kind = ?"),r.push(t.kind)),t.origin!==void 0&&(n.push("origin = ?"),r.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));r.push(s);let o=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${o} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(t={}){let n=[],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,o=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);return Number(o?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}updateTeamChatLogResponse(t,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,t)}getAgentInflight(t,n){return this.stmts.getAgentInflight.get(t,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,n){return this.tryAcquireAgentInflightTxn(t,n)}tryAcquireNativeHolder(t,n){return this.tryAcquireAgentInflightTxn(t,{nativeHolder:n})}findNativeHolder(t,n){return this.stmts.getNativeHolder.get(t,n)??null}updateNativeHolderPhase(t,n,r,s){return this.stmts.updateNativeHolderPhase.run(s,t,n,r,r).changes===1}publishNativeHolder(t,n,r,s,o="ready"){return this.stmts.publishNativeHolder.run(s,o,t,n,r,r).changes===1}clearNativeHolder(t,n,r){return this.stmts.clearNativeHolderFenced.run(t,n,r,r).changes===1}heartbeatAgentInflight(t,n,r=ae()){return this.db.transaction(()=>{let s=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);return s===null||s.sender_teamfile!==t.sender_teamfile||s.sender_alias!==t.sender_alias||s.started_at!==t.started_at?!1:SI(this.db,s,n,r)})()}clearAgentInflight(t,n){this.db.transaction(()=>{let s=this.getAgentInflight(t,n);if(s===null)return;this.stmts.clearAgentInflight.run(t,n).changes===1&&kc(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(t,n,r){return this.db.transaction(()=>{let o=this.getAgentInflight(t,n),i=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return i.changes===1&&o!==null&&kc(this.db,o,"INFLIGHT_RELEASE"),i.changes===1})()}releaseAgentInflight(t,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
1489
+ `).all(...t,n)}finishTrackedInvocation(t,n){return this.db.transaction(()=>{let r=n.ended_at??ae();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,Mn(n.result_summary),Mn(n.error),n.team_chat_log_id??null,Mn(n.meta),Mn(n.config_warnings),r,t).changes!==1)return null;let o=this.getTrackedInvocation(t);return vu(this.db,o),o.status==="cancelled"&&o.signal!==null&&o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,o.error??`holder received ${o.signal}`),o})()}reclaimTrackedInvocationIfUnchanged(t,n,r){return this.db.transaction(()=>{let s=r.ended_at??ae();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,Mn(r.result_summary),Mn(r.error),r.team_chat_log_id??null,Mn(r.meta),Mn(r.config_warnings),s,t,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let i=this.getTrackedInvocation(t);return vu(this.db,i),i})()}heartbeatTrackedInvocation(t,n=ae()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,t).changes!==1)return null;let s=this.getTrackedInvocation(t);return LI(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(t,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,t).changes!==1?null:(CI(this.db,t,n),this.getTrackedInvocation(t)))()}linkTrackedInvocationMessage(t,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,t).changes!==1?null:(OI(this.db,t,Wr(n)),this.getTrackedInvocation(t)))()}abortTrackedInvocationAndTerminalizeMessage(t,n,r){return this.db.transaction(()=>{let s=ae();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Mn(r),t,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let i=this.getTrackedInvocation(t);return vu(this.db,i),i.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(i.team_chat_log_id,r),i})()}terminalizeLinkedChatMessage(t,n){let r=this.stmts.getTeamChatLogById.get(t);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,t).changes!==1||Tu(this.db,t,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:ae()})}listClaimableTerminalTrackedInvocations(t){let n=["status IN ('done', 'error', 'busy', 'cancelled', 'aborted')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(t,n,r=ae()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,t).changes!==1)return null;let o=this.getTrackedInvocation(t);return xI(this.db,o,n,r),o})()}listTrackedInvocations(t={}){let n=[],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile)),t.status!==void 0&&(n.push("status = ?"),r.push(t.status)),t.kind!==void 0&&(n.push("kind = ?"),r.push(t.kind)),t.origin!==void 0&&(n.push("origin = ?"),r.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));r.push(s);let o=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${o} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(t={}){let n=[],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,o=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);return Number(o?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}updateTeamChatLogResponse(t,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,t)}getAgentInflight(t,n){return this.stmts.getAgentInflight.get(t,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,n){return this.tryAcquireAgentInflightTxn(t,n)}tryAcquireNativeHolder(t,n){return this.tryAcquireAgentInflightTxn(t,{nativeHolder:n})}findNativeHolder(t,n){return this.stmts.getNativeHolder.get(t,n)??null}updateNativeHolderPhase(t,n,r,s){return this.stmts.updateNativeHolderPhase.run(s,t,n,r,r).changes===1}publishNativeHolder(t,n,r,s,o="ready"){return this.stmts.publishNativeHolder.run(s,o,t,n,r,r).changes===1}clearNativeHolder(t,n,r){return this.stmts.clearNativeHolderFenced.run(t,n,r,r).changes===1}heartbeatAgentInflight(t,n,r=ae()){return this.db.transaction(()=>{let s=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);return s===null||s.sender_teamfile!==t.sender_teamfile||s.sender_alias!==t.sender_alias||s.started_at!==t.started_at?!1:SI(this.db,s,n,r)})()}clearAgentInflight(t,n){this.db.transaction(()=>{let s=this.getAgentInflight(t,n);if(s===null)return;this.stmts.clearAgentInflight.run(t,n).changes===1&&kc(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(t,n,r){return this.db.transaction(()=>{let o=this.getAgentInflight(t,n),i=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return i.changes===1&&o!==null&&kc(this.db,o,"INFLIGHT_RELEASE"),i.changes===1})()}releaseAgentInflight(t,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
1490
1490
  WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(t.receiver_teamfile,t.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let o=this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return o.changes===1&&kc(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),o.changes===1}let s=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(o=>o.started_at<t),s=0;for(let o of r)this.stmts.clearAgentInflight.run(o.receiver_teamfile,o.receiver_alias).changes===1&&(kc(this.db,o,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(t,n){let r=this.stmts.getRuntimeState.get(bc,Ic(t,n),Ac);return r===void 0?null:hI(r.data)}setTerminalLock(t){this.db.transaction(()=>{let r=this.getTerminalLock(t.teamfile,t.alias);r!==null&&r.lock_id!==t.lock_id&&T_(this.db,r,!0),this.stmts.upsertRuntimeState.run(bc,Ic(t.teamfile,t.alias),Ac,JSON.stringify(t),t.last_heartbeat),r?.lock_id!==t.lock_id&&bI(this.db,t)})()}heartbeatTerminalLock(t,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getTerminalLock(t,n);if(o===null||o.lock_id!==r)return this.db.exec("COMMIT"),!1;let i={...o,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(bc,Ic(t,n),Ac,JSON.stringify(i),s),this.db.exec("COMMIT"),!0}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearTerminalLock(t,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(bc,Ic(t,n),Ac);return o.changes===1&&T_(this.db,s),this.db.exec("COMMIT"),o.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,n,r){let s=this.stmts.getRuntimeState.get(t,n,r);return s===void 0?null:eJ(s.data)}tryAcquireRuntimeProcessLock(t,n,r,s,o=ae()){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,n,r);if(i!==null&&!tJ(i,s))return this.db.exec("COMMIT"),{acquired:!1,current:i};let a={lock_id:PI(),holder_pid:process.pid,holder_host:b_(),started_at:o,last_heartbeat:o};return this.stmts.upsertRuntimeState.run(t,n,r,JSON.stringify(a),o),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:i}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearRuntimeProcessLock(t,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(t,n,r);if(o===null||o.lock_id!==s)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(t,n,r);return this.db.exec("COMMIT"),i.changes===1}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,n){return this.stmts.setRunCurrentState.run(n,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,n,r){return this.stmts.setRunPausedState.run(n,r,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,n){return this.stmts.setRunPendingEscalationDecision.run(n,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,n){return this.stmts.setRunTerminalState.run(n,ae(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,n){return this.resumeRunTxn(t,n,ae())}insertStep(t){let n=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,ae());return this.stmts.getStep.get(n.lastInsertRowid)}finishStep(t,n,r){return this.stmts.finishStep.run(n??null,r??null,ae(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let n=this.stmts.listLatestStepOutcomesByState.all(t),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(t){let n=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??ae(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(n.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let n=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,ae());return this.stmts.getStepArtifact.get(n.lastInsertRowid)}insertExternalObject(t){let r=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,ae()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:r}}insertExternalSignal(t){let n=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,ae()),r=n.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:r}}raiseAttention(t){let n=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,ae());return this.stmts.getAttention.get(n.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run(ae(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let n=ae();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,n,n),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,n){return this.stmts.getDurableMemoryByName.get(t,n)??null}deleteDurableMemory(t,n){return this.stmts.deleteDurableMemory.run(t,n).changes>0}listDurableMemory(t,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(t,n):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(t).filter(s=>n.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(t).map(({name:r,description:s,type:o,updated_at:i})=>({name:r,description:s,type:o,updated_at:i}))}recordSessionSize(t){let n=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??ae());return this.stmts.getSessionSize.get(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,n,r=20){return this.stmts.sessionSizeHistory.all(t,n,r)}insertSessionEvent(t){let n=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(n.lastInsertRowid)}listSessionEvents(t,n){return n!==void 0?this.stmts.listSessionEventsSince.all(t,n):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,n=1e3){return this.stmts.listAllEventsSince.all(t,n)}latestAgentCall(t){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);if(n===void 0)return null;try{let r=JSON.parse(n.payload);return typeof r.alias!="string"||typeof r.provider!="string"?null:{alias:r.alias,provider:r.provider,...typeof r.model=="string"?{model:r.model}:{}}}catch{return null}}agentCallTokenTotals(t){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),r=0,s=0,o=0;for(let i of n)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(r+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:r,totalOutputTokens:s,agentCallCount:o}}addRollupValue(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let n=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(n.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,n,r){return this.stmts.findUnackedDrift.get(t,n??null,r)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let n=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,n,n),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,n){return this.stmts.getInteractiveSessionByRunAndState.get(t,n)??null}setInteractiveAgentOutput(t,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),t)}resumeInteractive(t,n,r){return this.resumeInteractiveTxn(t,n,r,ae())}resumeEscalation(t,n){return this.resumeEscalationTxn(t,n,ae())}};function FI(e,t,n){let r=jI(t);if(r.length===0)return;let s=new Set,o=[],i=c=>{if(c===e)return r;let l=n(c);if(l===null)throw new Error(`unknown workflow reference: ${c}`);return jI(l.definition)},a=c=>{let l=o.indexOf(c);if(l>=0)throw new Error(`cycle detected: ${[...o.slice(l),c].join(" -> ")}`);if(!s.has(c)){o.push(c);try{for(let d of i(c))a(d)}finally{o.pop()}s.add(c)}};a(e)}function jI(e){let t=QV(e),n=t===null?null:ZV(t,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))bu(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function QV(e){try{let t=JSON.parse(e);return bu(t)?t:null}catch{return null}}function ZV(e,t){let n=e[t];return bu(n)?n:null}function bu(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function eJ(e){try{let t=JSON.parse(e);return!bu(t)||typeof t.lock_id!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}function tJ(e,t){return e===null?!0:e.holder_host===b_()?!Sn(e.holder_pid):e.last_heartbeat<t}function nJ(e){return{getRuntimeState:e.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:e.prepare(`
1491
1491
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
1492
1492
  VALUES (?, ?, ?, ?, ?)
@@ -1894,7 +1894,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1894
1894
  response = NULL
1895
1895
  WHERE id = ?
1896
1896
  AND status = 'running'
1897
- `),...pI(e),...fI(e)}}function rJ(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}import{homedir as sJ}from"node:os";import{join as WI}from"node:path";var oJ=".lmctl",iJ="state.db";function aJ(e=process.env){let t=e.LMCTL_HOME;return t!==void 0&&t.length>0?t:WI(e.HOME||sJ(),oJ)}function BI(e=process.env){return WI(aJ(e),iJ)}function Fi(e,t=process.env){return e!==void 0&&e.length>0?e:t.LMCTL_DB!==void 0&&t.LMCTL_DB.length>0?t.LMCTL_DB:BI(t)}function GI(e,t=process.env){return t.LMCTL_DB!==void 0&&t.LMCTL_DB.length>0&&t.LMCTL_DB!==BI(t)?`db: ${e} (overridden by --db/LMCTL_DB)`:`db: ${e}`}import{isAbsolute as cJ,resolve as XI,join as VI}from"node:path";function dn(e){try{if(e instanceof Error){let t=e.message;if(typeof t=="string")return t}return String(e)}catch{return"Unprintable error"}}function A_(e){return{...e,status:"ok",error:null}}function Be(e,t,n){return{...n,status:"error",code:e,error:t}}var I_=new WeakMap;function JI(e,t){let n=I_.get(e);if(!n||e.closed)throw Error("Context is closed");return n.resources.add(t),()=>n.resources.delete(t)}function Au(e){let t=I_.get(e);if(!t)throw Error("Unknown context");return t.dal()}var lJ=new WeakMap;var YI=new WeakSet;function KI(e){return e!==null&&typeof e=="object"&&YI.has(e)}function k_(e){try{if(!e||typeof e!="object"||Array.isArray(e))return Be("invalid_argument","Context needs an explicit options map");let t={...e},n=["pid","env","cwd","dbPath","dal","onProgress","onWarning","clock","interactive"];if(Object.keys(t).some(h=>!n.includes(h)))return Be("invalid_argument","Unknown context option");if(!t.env||typeof t.env!="object"||Array.isArray(t.env)||typeof t.cwd!="string"||!cJ(t.cwd))return Be("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...t.env});if(Object.values(r).some(h=>h!==void 0&&typeof h!="string"))return Be("invalid_argument","Environment values must be strings or undefined");for(let h of["onProgress","onWarning","clock"])if(t[h]!==void 0&&typeof t[h]!="function")return Be("invalid_argument",h+" must be a function");if(t.interactive!==void 0&&typeof t.interactive!="boolean")return Be("invalid_argument","interactive must be a boolean");if(t.dbPath!==void 0&&(typeof t.dbPath!="string"||!t.dbPath))return Be("invalid_argument","dbPath must be a nonempty string");if(t.pid!==void 0&&(!Number.isInteger(t.pid)||t.pid<=0))return Be("invalid_argument","pid must be a positive integer");let s=XI(t.cwd),o=r.LMCTL_HOME||(r.HOME?VI(r.HOME,".lmctl"):void 0);if(!(t.dbPath||r.LMCTL_DB||(o?VI(o,"state.db"):void 0)))return Be("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,c,l,d,u=new AbortController,f=new Set,m=h=>{if(c){try{c.close()}catch(_){h.push(dn(_))}c=void 0}},p=Object.freeze({status:"ok",error:null,pid:t.pid,signal:u.signal,env:r,cwd:s,dbPath:XI(s,Fi(t.dbPath,r)),dal:t.dal,interactive:t.interactive??r.LMCTL_NON_INTERACTIVE!=="1",onProgress:t.onProgress??(()=>{}),onWarning:t.onWarning??(()=>{}),clock:t.clock??Date.now,get closed(){return a},close(){if(l)return l;let h;return l=new Promise(_=>{h=_}),a=!0,u.abort(),(async()=>{let _=[],g=0;for(let w of[...f])try{await w.close(),g++,f.delete(w)}catch(y){_.push(dn(y))}_.length||m(_),h({released:g,errors:_})})(),l},finalizeSync(h){if(d)return d;a=!0;let _=[],g={released:0,errors:_};d=g,l??=Promise.resolve(g);let w=[];for(let y of[...f])try{let E=y.finalizeSync(h);E instanceof Promise?w.push(E.then(()=>{g.released++,f.delete(y)}).catch(T=>{_.push(dn(T))})):(g.released++,f.delete(y))}catch(E){_.push(dn(E))}return u.abort(h),w.length?l=Promise.all(w).then(()=>(_.length||m(_),g)):_.length||m(_),g}});return I_.set(p,{resources:f,dal(){if(t.dal)return t.dal;if(c)return c;if(a)throw Error("Context is closed");return c??=hr({path:p.dbPath})}}),YI.add(p),lJ.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(t){return Be("invalid_argument","Invalid context: "+dn(t))}}import{readdirSync as n8}from"node:fs";import{join as lL,resolve as r8}from"node:path";import{randomUUID as s8}from"node:crypto";var Mo="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model.";function ji(e){return e!=="gemini"}function Iu(e){if(!ji(e))throw new Error(Mo)}function zI(e,t){return ji(e.name)&&e.protocol?.persistentResume===!0&&e.openSession!==void 0&&t.tools[e.name]?.agent===void 0}var qi=class extends Error{};async function Wr(e,t,n,r,s){if(e.provider!==t)throw new Error(`bundle session provider mismatch: session serves "${e.provider}", turn targets "${t}"`);if(e.sessionId!==n)throw new qi(`session identity mismatch: expected "${n}", got "${e.sessionId}"`);let o=await e.sendTurn(r,s);if(o.sessionId!==n)throw Object.assign(new qi(`session identity mismatch: expected "${n}", got "${o.sessionId}"`),{usage:o.usage,sessionId:o.sessionId});return{...o,...o.text===""&&o.sawActivity===!1?{status:"empty"}:{}}}async function R_(e,t){Iu(e.name);let n=t.requireResume??!0;if(n&&!t.sessionId.trim())throw new Error("conversation requires an existing session ID");let r=t.userConfig?.tools[e.name]?.agent!==void 0,s=t.execution!=="per-turn"&&e.openSession!==void 0&&!r;if(t.execution==="persistent"&&!s)throw new Error(`provider "${e.name}" does not support persistent sessions with this configuration`);let o=s?await e.openSession(t):void 0,i=!n&&t.sessionId==="";if(o&&(o.provider!==e.name||typeof o.sessionId!="string"||!o.sessionId.trim()||!i&&o.sessionId!==t.sessionId))throw await o.close(),new Error(`session identity mismatch opening ${e.name}: expected "${t.sessionId}", got "${o.sessionId}" (${o.provider})`);let a=o?.sessionId??t.sessionId,c=0,l=!1,d,u;return{provider:e.name,sessionId:a,execution:s?"persistent":"per-turn",transport:r?"custom":e.protocol?.transport??"unknown",cancellation:r?"unknown":s?e.protocol?.persistentCancellation??"unknown":e.protocol?.perTurnCancellation??"unknown",get completedTurns(){return c},async sendTurn(f,m={}){if(l)throw new Error("conversation is closed");if(d)throw new Error("conversation already has an active turn");if(m.signal?.aborted)throw new Error("Aborted");let p=new AbortController;d=p;let h=()=>p.abort();m.signal?.addEventListener("abort",h,{once:!0});try{let _=o?await Wr(o,e.name,a,f,{...m,signal:p.signal}):await e.sendTurn(f,{...t,...m,signal:p.signal,requireResume:n,timeoutMs:t.timeoutMs??0});if(p.signal.aborted)throw Object.assign(new Error("Aborted"),{usage:_.usage,sessionId:_.sessionId});if(n&&_.sessionId!==t.sessionId)throw l=!0,Object.assign(new qi(`session identity mismatch: expected "${t.sessionId}", got "${_.sessionId}"`),{usage:_.usage,sessionId:_.sessionId});return _.status!=="empty"&&_.status!=="stalled"&&c++,_}catch(_){throw p.signal.aborted&&o&&e.protocol?.persistentCancellation==="session"&&(l=!0),_ instanceof qi&&(l=!0,await o?.close()),_}finally{m.signal?.removeEventListener("abort",h),d=void 0}},close(){return u||(l=!0,d?.abort(),u=o?o.close():Promise.resolve()),u}}}import{platform as QI}from"node:os";import{realpathSync as dJ}from"node:fs";import{resolve as uJ}from"node:path";function N_(e){let t=uJ(e);try{return dJ(t)}catch{return t}}var ku=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let n=[],r=t?.provider?this.providers.filter(i=>i.name===t.provider):this.providers,s=await Promise.all(r.map(i=>i.discoverSessions()));for(let i of s)n.push(...i);let o=n;if(t?.workspace){let i=N_(t.workspace);o=o.filter(a=>N_(a.cwd)===i)}if(t?.from){let i=t.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(t?.to){let i=t.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),t?.limit&&(o=o.slice(0,t.limit)),o}async getSession(t,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let o=await s.loadSession(t);if(o)return o}return null}async resolveSession(t,n){let r=await this.resolveSessions(t,n);return r.length===1?r[0]:null}async resolveSessions(t,n){let r=n?this.providers.filter(o=>o.name===n):this.providers,s=[];for(let o of r){let i=await o.resolveSessionPath(t);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let t=QI()==="darwin"||QI()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:t,filePattern:s.filePattern});return n}async deleteSession(t,n){let r=await this.resolveSession(t,n);return r?r.provider.deleteSession(t):!1}registerAdapter(t){this.adapters.set(t.name,t),this.providers.push({name:t.name,discoverSessions:()=>t.discover(),loadSession:n=>t.load(n),resolveSessionPath:n=>t.resolvePath(n),deleteSession:n=>t.delete(n),getWatchPaths:()=>t.getWatchPaths?.()??[]})}getAdapter(t){return this.adapters.get(t)}getAllAdapters(){return[...this.adapters.values()]}};function Os(e){let t=new ku;for(let n of e)t.registerAdapter(n);return t}import{join as W_}from"node:path";import{mkdir as A6}from"node:fs/promises";var Vt=e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null,fJ=(e,t)=>e===null||t===null?null:Vt(e+t),x_=(e,t)=>JSON.stringify([e,t]),L_=class{finished=new Set;seen=new Set;models=new Map;reportModel(t,n){typeof n=="string"&&n&&n!=="<synthetic>"&&this.models.set(t,n)}remember(t,n){typeof n=="string"&&n&&this.finished.add(x_(t,n))}turn(t,n=""){return new C_(this,t,n)}};function O_(){return new L_}var C_=class{session;thread;id;value;ended=!1;reported=new Set;constructor(t,n,r){this.session=t,this.thread=n,this.id=r}bind(t){return typeof t!="string"||!t||this.ended||this.session.finished.has(x_(this.thread,t))||this.id&&this.id!==t?!1:(this.id=t,!0)}event(t){let n=t.method,r=t.params,s=r?.turn,o=r?.turnId??s?.id,i=typeof r?.threadId=="string"?r.threadId:this.thread;if(this.thread&&i!==this.thread||(this.thread||(this.thread=i),typeof o=="string"&&this.session.finished.has(x_(i,o))))return!1;if(n==="turn/started")return this.bind(o);if(this.id&&o&&o!==this.id)return!1;if(n==="turn/completed")return this.id?!this.ended:this.bind(o);if(n!=="thread/tokenUsage/updated")return!0;if(this.ended||!this.id||r?.threadId!==this.thread||r?.turnId!==this.id)return!1;let a=r.tokenUsage;if(!a?.last||typeof a.last!="object"||Array.isArray(a.last)||[a.last.inputTokens,a.last.cachedInputTokens,a.last.outputTokens].every(T=>T==null))return!0;let c=T=>["inputTokens","cachedInputTokens","cacheWriteInputTokens","outputTokens","reasoningOutputTokens","totalTokens"].map(b=>T[b]??null),l=a.total&&["inputTokens","cachedInputTokens","outputTokens"].every(T=>Vt(a.total[T])!==null)?c(a.total):null,d=typeof t.id=="string"&&t.id.length>0||typeof t.id=="number"&&Number.isSafeInteger(t.id)?t.id:null,u=Vt(t.emittedAtMs)??d,f=Vt(t.ordinal)??Vt(r.ordinal),m=JSON.stringify([this.thread,this.id,l,c(a.last),u,d,f]),p=u!==null||f!==null;if(p&&this.session.seen.has(m))return!1;p&&this.session.seen.add(m);let h=a.last,_=Vt(h.inputTokens),g=Vt(h.cachedInputTokens),y={source:"wire",inputUncached:_===null||g===null||g>_?null:_-g,cacheRead:g,cacheWrite:Vt(h.cacheWriteInputTokens??0),output:Vt(h.outputTokens),reasoning:Vt(h.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:pr([h.inputTokens,h.cachedInputTokens,h.cacheWriteInputTokens,h.outputTokens,h.reasoningOutputTokens])||_!==null&&g!==null&&g>_};[y.inputUncached,y.cacheRead,y.cacheWrite,y.output].includes(null)&&(y.reason="counter_not_exposed");let E=r.model??h.model;if(typeof E=="string"&&E&&E!=="<synthetic>"&&this.reported.add(E),!this.value)this.value=y;else{for(let T of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let b=this.value[T],A=y[T];b!==null&&A!==null&&Vt(b+A)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[T]=fJ(this.value[T],y[T])}this.value.reason=this.value.reason||y.reason,this.value.invalidCounters||=y.invalidCounters}return!0}usage(){if(this.value)return{...this.value,modelReported:this.reported.size>1?null:[...this.reported][0]??this.session.models.get(this.thread)??null,mixedModels:this.reported.size>1}}finish(){this.ended=!0,this.id&&this.session.remember(this.thread,this.id)}};function D_(e){let t=!1;for(let n of e.split(`
1897
+ `),...pI(e),...fI(e)}}function rJ(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}import{homedir as sJ}from"node:os";import{join as WI}from"node:path";var oJ=".lmctl",iJ="state.db";function aJ(e=process.env){let t=e.LMCTL_HOME;return t!==void 0&&t.length>0?t:WI(e.HOME||sJ(),oJ)}function BI(e=process.env){return WI(aJ(e),iJ)}function Fi(e,t=process.env){return e!==void 0&&e.length>0?e:t.LMCTL_DB!==void 0&&t.LMCTL_DB.length>0?t.LMCTL_DB:BI(t)}function GI(e,t=process.env){return t.LMCTL_DB!==void 0&&t.LMCTL_DB.length>0&&t.LMCTL_DB!==BI(t)?`db: ${e} (overridden by --db/LMCTL_DB)`:`db: ${e}`}import{isAbsolute as cJ,resolve as XI,join as VI}from"node:path";function dn(e){try{if(e instanceof Error){let t=e.message;if(typeof t=="string")return t}return String(e)}catch{return"Unprintable error"}}function A_(e){return{...e,status:"ok",error:null}}function Be(e,t,n){return{...n,status:"error",code:e,error:t}}var I_=new WeakMap;function JI(e,t){let n=I_.get(e);if(!n||e.closed)throw Error("Context is closed");return n.resources.add(t),()=>n.resources.delete(t)}function Au(e){let t=I_.get(e);if(!t)throw Error("Unknown context");return t.dal()}var lJ=new WeakMap;var YI=new WeakSet;function KI(e){return e!==null&&typeof e=="object"&&YI.has(e)}function k_(e){try{if(!e||typeof e!="object"||Array.isArray(e))return Be("invalid_argument","Context needs an explicit options map");let t={...e},n=["pid","env","cwd","dbPath","dal","onProgress","onWarning","clock","interactive"];if(Object.keys(t).some(h=>!n.includes(h)))return Be("invalid_argument","Unknown context option");if(!t.env||typeof t.env!="object"||Array.isArray(t.env)||typeof t.cwd!="string"||!cJ(t.cwd))return Be("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...t.env});if(Object.values(r).some(h=>h!==void 0&&typeof h!="string"))return Be("invalid_argument","Environment values must be strings or undefined");for(let h of["onProgress","onWarning","clock"])if(t[h]!==void 0&&typeof t[h]!="function")return Be("invalid_argument",h+" must be a function");if(t.interactive!==void 0&&typeof t.interactive!="boolean")return Be("invalid_argument","interactive must be a boolean");if(t.dbPath!==void 0&&(typeof t.dbPath!="string"||!t.dbPath))return Be("invalid_argument","dbPath must be a nonempty string");if(t.pid!==void 0&&(!Number.isInteger(t.pid)||t.pid<=0))return Be("invalid_argument","pid must be a positive integer");let s=XI(t.cwd),o=r.LMCTL_HOME||(r.HOME?VI(r.HOME,".lmctl"):void 0);if(!(t.dbPath||r.LMCTL_DB||(o?VI(o,"state.db"):void 0)))return Be("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,c,l,d,u=new AbortController,f=new Set,m=h=>{if(c){try{c.close()}catch(_){h.push(dn(_))}c=void 0}},p=Object.freeze({status:"ok",error:null,pid:t.pid,signal:u.signal,env:r,cwd:s,dbPath:XI(s,Fi(t.dbPath,r)),dal:t.dal,interactive:t.interactive??r.LMCTL_NON_INTERACTIVE!=="1",onProgress:t.onProgress??(()=>{}),onWarning:t.onWarning??(()=>{}),clock:t.clock??Date.now,get closed(){return a},close(){if(l)return l;let h;return l=new Promise(_=>{h=_}),a=!0,u.abort(),(async()=>{let _=[],g=0;for(let w of[...f])try{await w.close(),g++,f.delete(w)}catch(y){_.push(dn(y))}_.length||m(_),h({released:g,errors:_})})(),l},finalizeSync(h){if(d)return d;a=!0;let _=[],g={released:0,errors:_};d=g,l??=Promise.resolve(g);let w=[];for(let y of[...f])try{let E=y.finalizeSync(h);E instanceof Promise?w.push(E.then(()=>{g.released++,f.delete(y)}).catch(T=>{_.push(dn(T))})):(g.released++,f.delete(y))}catch(E){_.push(dn(E))}return u.abort(h),w.length?l=Promise.all(w).then(()=>(_.length||m(_),g)):_.length||m(_),g}});return I_.set(p,{resources:f,dal(){if(t.dal)return t.dal;if(c)return c;if(a)throw Error("Context is closed");return c??=hr({path:p.dbPath})}}),YI.add(p),lJ.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(t){return Be("invalid_argument","Invalid context: "+dn(t))}}import{readdirSync as n8}from"node:fs";import{join as lL,resolve as r8}from"node:path";import{randomUUID as s8}from"node:crypto";var Mo="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model.";function ji(e){return e!=="gemini"}function Iu(e){if(!ji(e))throw new Error(Mo)}function zI(e,t){return ji(e.name)&&e.protocol?.persistentResume===!0&&e.openSession!==void 0&&t.tools[e.name]?.agent===void 0}var qi=class extends Error{};async function Br(e,t,n,r,s){if(e.provider!==t)throw new Error(`bundle session provider mismatch: session serves "${e.provider}", turn targets "${t}"`);if(e.sessionId!==n)throw new qi(`session identity mismatch: expected "${n}", got "${e.sessionId}"`);let o=await e.sendTurn(r,s);if(o.sessionId!==n)throw Object.assign(new qi(`session identity mismatch: expected "${n}", got "${o.sessionId}"`),{usage:o.usage,sessionId:o.sessionId});return{...o,...o.text===""&&o.sawActivity===!1?{status:"empty"}:{}}}async function R_(e,t){Iu(e.name);let n=t.requireResume??!0;if(n&&!t.sessionId.trim())throw new Error("conversation requires an existing session ID");let r=t.userConfig?.tools[e.name]?.agent!==void 0,s=t.execution!=="per-turn"&&e.openSession!==void 0&&!r;if(t.execution==="persistent"&&!s)throw new Error(`provider "${e.name}" does not support persistent sessions with this configuration`);let o=s?await e.openSession(t):void 0,i=!n&&t.sessionId==="";if(o&&(o.provider!==e.name||typeof o.sessionId!="string"||!o.sessionId.trim()||!i&&o.sessionId!==t.sessionId))throw await o.close(),new Error(`session identity mismatch opening ${e.name}: expected "${t.sessionId}", got "${o.sessionId}" (${o.provider})`);let a=o?.sessionId??t.sessionId,c=0,l=!1,d,u;return{provider:e.name,sessionId:a,execution:s?"persistent":"per-turn",transport:r?"custom":e.protocol?.transport??"unknown",cancellation:r?"unknown":s?e.protocol?.persistentCancellation??"unknown":e.protocol?.perTurnCancellation??"unknown",get completedTurns(){return c},async sendTurn(f,m={}){if(l)throw new Error("conversation is closed");if(d)throw new Error("conversation already has an active turn");if(m.signal?.aborted)throw new Error("Aborted");let p=new AbortController;d=p;let h=()=>p.abort();m.signal?.addEventListener("abort",h,{once:!0});try{let _=o?await Br(o,e.name,a,f,{...m,signal:p.signal}):await e.sendTurn(f,{...t,...m,signal:p.signal,requireResume:n,timeoutMs:t.timeoutMs??0});if(p.signal.aborted)throw Object.assign(new Error("Aborted"),{usage:_.usage,sessionId:_.sessionId});if(n&&_.sessionId!==t.sessionId)throw l=!0,Object.assign(new qi(`session identity mismatch: expected "${t.sessionId}", got "${_.sessionId}"`),{usage:_.usage,sessionId:_.sessionId});return _.status!=="empty"&&_.status!=="stalled"&&c++,_}catch(_){throw p.signal.aborted&&o&&e.protocol?.persistentCancellation==="session"&&(l=!0),_ instanceof qi&&(l=!0,await o?.close()),_}finally{m.signal?.removeEventListener("abort",h),d=void 0}},close(){return u||(l=!0,d?.abort(),u=o?o.close():Promise.resolve()),u}}}import{platform as QI}from"node:os";import{realpathSync as dJ}from"node:fs";import{resolve as uJ}from"node:path";function N_(e){let t=uJ(e);try{return dJ(t)}catch{return t}}var ku=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let n=[],r=t?.provider?this.providers.filter(i=>i.name===t.provider):this.providers,s=await Promise.all(r.map(i=>i.discoverSessions()));for(let i of s)n.push(...i);let o=n;if(t?.workspace){let i=N_(t.workspace);o=o.filter(a=>N_(a.cwd)===i)}if(t?.from){let i=t.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(t?.to){let i=t.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),t?.limit&&(o=o.slice(0,t.limit)),o}async getSession(t,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let o=await s.loadSession(t);if(o)return o}return null}async resolveSession(t,n){let r=await this.resolveSessions(t,n);return r.length===1?r[0]:null}async resolveSessions(t,n){let r=n?this.providers.filter(o=>o.name===n):this.providers,s=[];for(let o of r){let i=await o.resolveSessionPath(t);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let t=QI()==="darwin"||QI()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:t,filePattern:s.filePattern});return n}async deleteSession(t,n){let r=await this.resolveSession(t,n);return r?r.provider.deleteSession(t):!1}registerAdapter(t){this.adapters.set(t.name,t),this.providers.push({name:t.name,discoverSessions:()=>t.discover(),loadSession:n=>t.load(n),resolveSessionPath:n=>t.resolvePath(n),deleteSession:n=>t.delete(n),getWatchPaths:()=>t.getWatchPaths?.()??[]})}getAdapter(t){return this.adapters.get(t)}getAllAdapters(){return[...this.adapters.values()]}};function Os(e){let t=new ku;for(let n of e)t.registerAdapter(n);return t}import{join as W_}from"node:path";import{mkdir as A6}from"node:fs/promises";var Vt=e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null,fJ=(e,t)=>e===null||t===null?null:Vt(e+t),x_=(e,t)=>JSON.stringify([e,t]),L_=class{finished=new Set;seen=new Set;models=new Map;reportModel(t,n){typeof n=="string"&&n&&n!=="<synthetic>"&&this.models.set(t,n)}remember(t,n){typeof n=="string"&&n&&this.finished.add(x_(t,n))}turn(t,n=""){return new C_(this,t,n)}};function O_(){return new L_}var C_=class{session;thread;id;value;ended=!1;reported=new Set;constructor(t,n,r){this.session=t,this.thread=n,this.id=r}bind(t){return typeof t!="string"||!t||this.ended||this.session.finished.has(x_(this.thread,t))||this.id&&this.id!==t?!1:(this.id=t,!0)}event(t){let n=t.method,r=t.params,s=r?.turn,o=r?.turnId??s?.id,i=typeof r?.threadId=="string"?r.threadId:this.thread;if(this.thread&&i!==this.thread||(this.thread||(this.thread=i),typeof o=="string"&&this.session.finished.has(x_(i,o))))return!1;if(n==="turn/started")return this.bind(o);if(this.id&&o&&o!==this.id)return!1;if(n==="turn/completed")return this.id?!this.ended:this.bind(o);if(n!=="thread/tokenUsage/updated")return!0;if(this.ended||!this.id||r?.threadId!==this.thread||r?.turnId!==this.id)return!1;let a=r.tokenUsage;if(!a?.last||typeof a.last!="object"||Array.isArray(a.last)||[a.last.inputTokens,a.last.cachedInputTokens,a.last.outputTokens].every(T=>T==null))return!0;let c=T=>["inputTokens","cachedInputTokens","cacheWriteInputTokens","outputTokens","reasoningOutputTokens","totalTokens"].map(b=>T[b]??null),l=a.total&&["inputTokens","cachedInputTokens","outputTokens"].every(T=>Vt(a.total[T])!==null)?c(a.total):null,d=typeof t.id=="string"&&t.id.length>0||typeof t.id=="number"&&Number.isSafeInteger(t.id)?t.id:null,u=Vt(t.emittedAtMs)??d,f=Vt(t.ordinal)??Vt(r.ordinal),m=JSON.stringify([this.thread,this.id,l,c(a.last),u,d,f]),p=u!==null||f!==null;if(p&&this.session.seen.has(m))return!1;p&&this.session.seen.add(m);let h=a.last,_=Vt(h.inputTokens),g=Vt(h.cachedInputTokens),y={source:"wire",inputUncached:_===null||g===null||g>_?null:_-g,cacheRead:g,cacheWrite:Vt(h.cacheWriteInputTokens??0),output:Vt(h.outputTokens),reasoning:Vt(h.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:pr([h.inputTokens,h.cachedInputTokens,h.cacheWriteInputTokens,h.outputTokens,h.reasoningOutputTokens])||_!==null&&g!==null&&g>_};[y.inputUncached,y.cacheRead,y.cacheWrite,y.output].includes(null)&&(y.reason="counter_not_exposed");let E=r.model??h.model;if(typeof E=="string"&&E&&E!=="<synthetic>"&&this.reported.add(E),!this.value)this.value=y;else{for(let T of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let b=this.value[T],A=y[T];b!==null&&A!==null&&Vt(b+A)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[T]=fJ(this.value[T],y[T])}this.value.reason=this.value.reason||y.reason,this.value.invalidCounters||=y.invalidCounters}return!0}usage(){if(this.value)return{...this.value,modelReported:this.reported.size>1?null:[...this.reported][0]??this.session.models.get(this.thread)??null,mixedModels:this.reported.size>1}}finish(){this.ended=!0,this.id&&this.session.remember(this.thread,this.id)}};function D_(e){let t=!1;for(let n of e.split(`
1898
1898
  `)){let r;try{r=JSON.parse(n)}catch{continue}let s=r.type;typeof s=="string"&&(s.endsWith(".started")&&(t=!0),["turn.completed","turn.failed","turn.aborted","turn.cancelled","error"].includes(s)&&(t=!1))}return t}function $_(e){let t=e.trimEnd().split(`
1899
1899
  `).at(-1)?.trimStart()??"";if(!t.startsWith("{"))return!1;try{return JSON.parse(t),!1}catch{return!0}}function ZI(e){let t,n=!1,r=!1,s;for(let o of e.split(`
1900
1900
  `)){let i;try{i=JSON.parse(o)}catch{continue}if(i.type==="thread.started"&&typeof i.thread_id=="string"&&(t=i.thread_id),i.type==="turn.started"&&(n=!0),i.type!=="turn.completed"||!n||r)continue;r=!0;let a=i.usage;if(!a)continue;let c=Vt(a.input_tokens),l=Vt(a.cached_input_tokens);s={source:"wire",inputUncached:c===null||l===null||l>c?null:c-l,cacheRead:l,cacheWrite:0,output:Vt(a.output_tokens),reasoning:Vt(a.reasoning_output_tokens),modelReported:typeof i.model=="string"?i.model:null,providerCostUsd:null,reason:null,invalidCounters:pr([a.input_tokens,a.cached_input_tokens,a.output_tokens,a.reasoning_output_tokens])||c!==null&&l!==null&&l>c},[s.inputUncached,s.cacheRead,s.output].includes(null)&&(s.reason="counter_not_exposed")}return($_(e)||D_(e))&&(s={source:"wire",inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:"counter_not_exposed",invalidCounters:!0}),{sessionId:t,usage:s}}import{spawn as mk}from"node:child_process";import{mkdirSync as l6}from"node:fs";import{readFileSync as mJ,writeFileSync as Qhe,mkdirSync as Zhe}from"node:fs";import{join as pJ,dirname as t_e}from"node:path";import{homedir as hJ}from"node:os";var M_={muse:{start:"muse",resume:"muse resume {{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}},hermes:{start:"hermes",resume:"hermes --yolo --resume {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}}},_J={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 gJ(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function EJ(e){let t=e.indexOf("=");if(t===-1)return null;let n=e.slice(0,t).trim(),r=gJ(e.slice(t+1).trim());return n?{key:n,value:r}:null}function yJ(e){let t=e.trim();return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1).trim():null}function Ru(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function wJ(){return pJ(hJ(),".lmctl","config.toml")}function Nu(e){let t=e??wJ(),n;try{n=mJ(t,"utf-8")}catch{return{tools:{}}}return TJ(n)}function ek(e){if(typeof e=="number")return Number.isFinite(e)?e:null;let t=String(e).trim();if(!t)return null;let n=t.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function TJ(e){let t={},n={},r=e.split(`
@@ -1908,9 +1908,9 @@ ${t}`),t}import{existsSync as i6}from"node:fs";import{readFileSync as dk,appendF
1908
1908
  \u2026 ${o} characters of ${n} \u2026
1909
1909
  ${e.slice(-s)}`}function BJ(e,t){try{let n=NJ(e).filter(s=>FJ.test(s)).sort().map(s=>{let o=Rc(e,s);return{path:o,size:xJ(o).size}}),r=n.reduce((s,o)=>s+o.size,0);for(let s=0;s<n.length&&(n.length-s>PJ||r>UJ);s++){let o=n[s];o.path!==t&&(LJ(o.path),r-=o.size)}}catch{}}function GJ(e,t){let n=HJ(),r=Rc(n,`stderr-${Date.now()}-${process.pid}-${kJ()}.log`);try{RJ(n,{recursive:!0,mode:448}),ok(n,448);let s=`[${new Date().toISOString()}] provider=${t}
1910
1910
  ${WJ(e,MJ,"provider output not saved")}
1911
- `;return CJ(r,s,{encoding:"utf8",flag:"wx",mode:384}),ok(r,384),BJ(n,r),{path:r,saved:!0}}catch{return{path:r,saved:!1}}}function XJ(e){let t=new Map,n=new Map;e.forEach((o,i)=>{o.trim()!==""&&(t.set(o,(t.get(o)??0)+1),n.set(o,i))});let r=[],s=0;return e.forEach((o,i)=>{let a=t.get(o);if(a===void 0||a===1){r.push(o);return}n.get(o)===i&&(s+=a-1,r.push(`${o} (repeated ${a} times)`))}),{lines:r,duplicates:s}}function Br(e){return Array.from(e)}function VJ(e,t){let n=Br(e),r=`\u2026[${n.length} characters clipped]\u2026`,s=Math.max(2,t-Br(r).length),o=Math.max(1,Math.floor(s*.4)),i=Math.max(1,s-o),a=n.slice(0,o).join("").replace(/[\u200d\ufe0f\u0300-\u036f]+$/u,""),c=n.slice(-i).join("").replace(/^[\u200d\ufe0f\u0300-\u036f]+/u,""),l=n.length-Br(a).length-Br(c).length;return`${a}\u2026[${l} characters clipped]\u2026${c}`}function JJ(e,t){let n=e.join(`
1912
- `);if(Br(n).length<=t)return{text:n,omittedLines:0,truncatedLine:!1};let r=Math.max(24,Math.floor(t*.68)),s=[],o=0,i=!1;for(let u=e.length-1;u>=0;u--){let f=e[u],m=Br(f).length+(s.length>0?1:0);if(o+m<=r){s.unshift({index:u,line:f}),o+=m;continue}s.length===0&&(s.unshift({index:u,line:VJ(f,e.length===1?t:r)}),i=!0);break}let a=s[0]?.index??e.length,c=[],l="",d=u=>{let f=e.length-u.length-s.length,m=[...u];return f>0&&m.push(`\u2026 ${f} lines omitted \u2026`),m.push(...s.map(p=>p.line)),m.join(`
1913
- `)};for(let u=0;u<a;u++){let f=[...c,e[u]],m=d(f);if(Br(m).length>t)break;c=f,l=m}return c.length===0&&(l=d(c)),Br(l).length>t&&(l=Br(l).slice(-t).join(""),i=!0),{text:l,omittedLines:Math.max(0,e.length-c.length-s.length),truncatedLine:i}}function tt(e,t){let n=Nc(e),r=t.fullOutput===void 0?n:Nc(t.fullOutput),{lines:s,duplicates:o}=XJ(n.trim().split(/\r\n|\r|\n/)),i=JJ(s,Math.max(64,t.maxChars??$J)),a=[];if(i.omittedLines>0&&a.push(`${i.omittedLines} lines omitted from summary`),i.truncatedLine&&a.push("a long line was clipped"),o>0&&a.push(`${o} duplicate lines collapsed`),t.fullOutput!==void 0&&r.trim()!==n.trim()&&a.push("filtered provider output is retained in the full log"),a.length===0)return i.text;let c=GJ(r,t.provider),l=c.saved?`full redacted output: ${c.path}`:`full redacted output could not be written; attempted path: ${c.path}`;return`${i.text}
1911
+ `;return CJ(r,s,{encoding:"utf8",flag:"wx",mode:384}),ok(r,384),BJ(n,r),{path:r,saved:!0}}catch{return{path:r,saved:!1}}}function XJ(e){let t=new Map,n=new Map;e.forEach((o,i)=>{o.trim()!==""&&(t.set(o,(t.get(o)??0)+1),n.set(o,i))});let r=[],s=0;return e.forEach((o,i)=>{let a=t.get(o);if(a===void 0||a===1){r.push(o);return}n.get(o)===i&&(s+=a-1,r.push(`${o} (repeated ${a} times)`))}),{lines:r,duplicates:s}}function Gr(e){return Array.from(e)}function VJ(e,t){let n=Gr(e),r=`\u2026[${n.length} characters clipped]\u2026`,s=Math.max(2,t-Gr(r).length),o=Math.max(1,Math.floor(s*.4)),i=Math.max(1,s-o),a=n.slice(0,o).join("").replace(/[\u200d\ufe0f\u0300-\u036f]+$/u,""),c=n.slice(-i).join("").replace(/^[\u200d\ufe0f\u0300-\u036f]+/u,""),l=n.length-Gr(a).length-Gr(c).length;return`${a}\u2026[${l} characters clipped]\u2026${c}`}function JJ(e,t){let n=e.join(`
1912
+ `);if(Gr(n).length<=t)return{text:n,omittedLines:0,truncatedLine:!1};let r=Math.max(24,Math.floor(t*.68)),s=[],o=0,i=!1;for(let u=e.length-1;u>=0;u--){let f=e[u],m=Gr(f).length+(s.length>0?1:0);if(o+m<=r){s.unshift({index:u,line:f}),o+=m;continue}s.length===0&&(s.unshift({index:u,line:VJ(f,e.length===1?t:r)}),i=!0);break}let a=s[0]?.index??e.length,c=[],l="",d=u=>{let f=e.length-u.length-s.length,m=[...u];return f>0&&m.push(`\u2026 ${f} lines omitted \u2026`),m.push(...s.map(p=>p.line)),m.join(`
1913
+ `)};for(let u=0;u<a;u++){let f=[...c,e[u]],m=d(f);if(Gr(m).length>t)break;c=f,l=m}return c.length===0&&(l=d(c)),Gr(l).length>t&&(l=Gr(l).slice(-t).join(""),i=!0),{text:l,omittedLines:Math.max(0,e.length-c.length-s.length),truncatedLine:i}}function tt(e,t){let n=Nc(e),r=t.fullOutput===void 0?n:Nc(t.fullOutput),{lines:s,duplicates:o}=XJ(n.trim().split(/\r\n|\r|\n/)),i=JJ(s,Math.max(64,t.maxChars??$J)),a=[];if(i.omittedLines>0&&a.push(`${i.omittedLines} lines omitted from summary`),i.truncatedLine&&a.push("a long line was clipped"),o>0&&a.push(`${o} duplicate lines collapsed`),t.fullOutput!==void 0&&r.trim()!==n.trim()&&a.push("filtered provider output is retained in the full log"),a.length===0)return i.text;let c=GJ(r,t.provider),l=c.saved?`full redacted output: ${c.path}`:`full redacted output could not be written; attempted path: ${c.path}`;return`${i.text}
1914
1914
 
1915
1915
  [provider stderr: ${a.join("; ")}; ${l}]`}function ik(e,t=500){let n=e.indexOf(`
1916
1916
 
@@ -1919,13 +1919,13 @@ ${WJ(e,MJ,"provider output not saved")}
1919
1919
  ${r}`}}}function Hi(e,t){return t===""?e:`${e}:${t.includes(`
1920
1920
  `)?`
1921
1921
  `:" "}${t}`}var uk=!1,ck=!1,lk=0,ZJ=5e3;function U_(){return Cu(QJ(),".lmctl")}function nt(){if(uk||process.env.LMCTL_DEBUG==="1")return!0;let e=Date.now();return e-lk>=ZJ&&(ck=r6(),lk=e),ck}function e6(){let e=new Date,t=e.getTimezoneOffset(),n=t<=0?"+":"-",r=String(Math.floor(Math.abs(t)/60)).padStart(2,"0"),s=String(Math.abs(t)%60).padStart(2,"0");return new Date(e.getTime()-t*6e4).toISOString().replace("Z",`${n}${r}:${s}`)}var Lu=null;function P_(e,t="",n=new WeakSet){if(/(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|credential|token|secret)/i.test(t)&&typeof e=="string")return"[REDACTED]";if(typeof e=="string")return Nc(e);if(Array.isArray(e))return e.map(r=>P_(r,"",n));if(e&&typeof e=="object"){if(n.has(e))return"[Circular]";n.add(e);let r={};for(let[s,o]of Object.entries(e))r[s]=P_(o,s,n);return n.delete(e),r}return e}function t6(e){return P_(e)}function bn(e,t){if(t?.verbose){if(!uk)return}else if(!t?.always&&!nt())return;try{n6();let n={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...t6(e)};YJ(Lu,JSON.stringify(n)+`
1922
- `)}catch{}}function n6(){if(!Lu){let t=e6().slice(0,13).replace("T","-");Lu=Cu(U_(),`debug-${t}.log`)}KJ(zJ(Lu),{recursive:!0})}function An(...e){bn({event:"legacy",msg:e.join(" ")})}function It(...e){bn({event:"legacy",msg:e.join(" ")},{verbose:!0})}function ne(e){bn(e,{always:!0})}function r6(){return s6()||o6()}function s6(){try{let e=dk(Cu(U_(),"config.toml"),"utf-8");for(let t of e.split(`
1923
- `)){let n=t.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function o6(){try{let e=dk(Cu(U_(),"config.json"),"utf-8"),t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)&&t.debug===!0}catch{}return!1}var F_="LMCTL_SELF_SESSIONID",a6="LMCTL_LAUNCH_SOURCE";function fk(e){let t=e.CLAUDE_CODE_EXECPATH;if(t===void 0||t.length===0)return e;let n=process.platform!=="win32"&&t.toLowerCase().endsWith(".exe"),r=!n&&!i6(t);if(!n&&!r)return e;ne({event:"claude_execpath_sanitized",reason:n?"wrong_platform_exe":"missing_file",value:t,platform:process.platform});let s={...e};return delete s.CLAUDE_CODE_EXECPATH,s}function Wi(e,t){let n={...e??process.env,PWD:t};return delete n.OLDPWD,n}function c6(e,t){return t===void 0||t.length===0?e:{...e??process.env,[F_]:t}}function kt(e,t,n,r="chat"){return{...c6(Wi(e,t),n),[a6]:r}}var Bi=class extends Error{constructor(t,n){super(t,n),this.name=this.constructor.name}},rt=class extends Bi{},ct=class extends Bi{exitCode;signal;stderr;constructor(t,n,r=null,s){super(t),this.exitCode=n,this.signal=r,this.stderr=s}};var Ou=class extends Bi{rpcCode;rpcData;constructor(t,n,r){super(t),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}};function xc(e,t){let n;if(t&&typeof t=="object"){let r=t.code;typeof r=="number"&&(n=r)}return new Ou(e,n,t)}var Uo=class e extends Error{cancelReason;constructor(t,n){super(t),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,e.prototype)}},Pe=class e{name;capabilities;injection;protocol;provider;binary;seedArgs;seedTimeoutMs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.protocol=t.protocol,this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedTimeoutMs=t.seedTimeoutMs??6e4,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let n=t?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===be?n:r)}turnOptsFor(t){return t}get seedBinary(){return this.binary}seed(t,n){return n?.signal?.aborted?Promise.resolve({success:!1,error:"seed cancelled before dispatch",errorCode:"ABORT_ERR"}):(l6(t,{recursive:!0}),new Promise(r=>{let s;try{try{n?.onDispatch?.()}catch{}s=mk(this.binary,this.seedArgsFor(n),{cwd:t,env:Wi(n?.env,t),signal:n?.signal,stdio:["pipe","pipe","pipe"],timeout:this.seedTimeoutMs})}catch(c){return r({success:!1,error:c instanceof Error?c.message:String(c)})}let o="",i="";s.stdout?.on("data",c=>{o+=c.toString()}),s.stderr?.on("data",c=>{i+=c.toString()});let a=n?.prompt!==void 0&&this.seedStdin!==void 0?`${n.prompt}
1924
- `:this.seedStdin;a&&s.stdin?.write(a),s.stdin?.end(),s.on("exit",(c,l)=>{if(c===0&&!l)r({success:!0});else{let d=Po(i).trim(),u=Po(o).trim(),f=d||u;r({success:!1,...n?.signal?.aborted?{errorCode:"ABORT_ERR"}:{},error:f?tt(f,{provider:this.name}):l?`terminated by ${l}`:`exit code ${c}`})}}),s.on("error",c=>{r({success:!1,error:c.message,errorCode:c.code})})}))}resumeCommand(t,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:xu,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,n){let r=this.turnOptsFor(n);if(r.userConfig&&tk(r.userConfig,this.name)){let o=r.userConfig.tools[this.name];if(o?.agent)return this.runOneShotAgent(t,r,o.agent)}let s=r.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return s<=0&&!r.signal?this.transportFn(t,{...r,binary:this.binary}):this.withTimeouts(s,t,r)}withTimeouts(t,n,r){let s=new AbortController,o,i,a="",c,l=r.sessionId,d,u=()=>{t<=0||(clearTimeout(o),o=setTimeout(()=>{r.onIdleWarning?.(t),f(),s.abort(),d&&d({text:a,...c?{usage:c}:{},sessionId:l,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},f=()=>{clearTimeout(o)};r.signal&&(r.signal.aborted?(i="external",s.abort()):r.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),u();let m={...r,binary:this.binary,signal:s.signal,onUsage:_=>{c=_,r.onUsage?.(_)},onSessionId:_=>{_&&(l=_),r.onSessionId?.(_)},onDelta:_=>{a+=_,u(),r.onDelta?.(_)},onProgress:_=>{_.kind!=="api_retry"&&u(),r.onProgress?.(_)}},p=this.transportFn(n,m).then(_=>(f(),{..._,status:_.status??"ok"})).catch(_=>{throw f(),i==="external"?Object.assign(new Uo("Turn cancelled","external"),{usage:_.usage??c,sessionId:l}):_}),h=new Promise(_=>{d=_});return Promise.race([p,h])}runOneShotAgent(t,n,r){let s=nk(n.userConfig,this.name,n.sessionId,t,n.profile),o=Date.now();return new Promise((i,a)=>{let c=n.timeoutMs!==void 0&&n.timeoutMs<=0?0:rk(n.env),l=mk(s,{shell:!0,cwd:n.cwd,env:kt(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f,m,p=!1,h=null,_=null,g=()=>{clearTimeout(f),f=setTimeout(()=>{!$_(y)&&!D_(y)&&T(h,_)},100)},w=c>0?setTimeout(()=>{u=!0,l.kill(),this.name==="codex"&&T(null)},c):void 0,y="",E="";if(l.stdout?.on("data",b=>{let A=b.toString();y+=A,n.onDelta?.(A),p&&!d&&g()}),l.stderr?.on("data",b=>{E+=b.toString(),p&&!d&&g()}),n.signal){if(n.signal.aborted)return clearTimeout(w),l.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>l.kill(),{once:!0})}let T=(b,A=null)=>{if(d)return;d=!0,clearTimeout(w),clearTimeout(f),clearTimeout(m),this.name==="codex"&&(l.stdout?.destroy(),l.stderr?.destroy());let I=Date.now()-o,R=this.name==="codex"?ZI(y):{};R.usage&&n.onUsage?.(R.usage),R.sessionId&&n.onSessionId?.(R.sessionId);let L=N=>Object.assign(N,{usage:R.usage,sessionId:R.sessionId??n.sessionId});if(this.name==="codex"&&n.signal?.aborted)a(L(new Uo("Turn cancelled","external")));else if(u)a(L(new Error(`Agent command timed out after ${c}ms`)));else if(b===0||b===null&&A===null)i({text:y.trim(),sessionId:R.sessionId??n.sessionId,durationMs:I,...R.usage?{usage:R.usage}:{}});else{let N=E.trim();a(L(new ct(N?tt(N,{provider:this.name}):A?`Agent command terminated by ${A}`:`Agent command exited with code ${b}`,b,A,E)))}};this.name==="codex"?(l.on("close",(b,A)=>T(b,A)),l.on("exit",(b,A)=>{d||(p=!0,h=b,_=A,g(),m=setTimeout(()=>T(b,A),5e3))})):l.on("exit",(b,A)=>T(b,A)),l.on("error",b=>{d||(d=!0,clearTimeout(w),clearTimeout(f),clearTimeout(m),a(b))})})}};var ht=e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null,Ds=e=>typeof e=="string"&&e.length>0&&e!=="<synthetic>"?e:null,pk=()=>({source:"wire",inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:null});function hk(e){if(!e.length)return;let t={...e[0]},n=new Set(e.map(r=>r.modelReported).filter(r=>r!==null));for(let r of e.slice(1)){for(let s of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let o=t[s],i=r[s];o!==null&&i!==null&&ht(o+i)===null&&(t.invalidCounters=!0),t[s]=o===null||i===null?null:ht(o+i)}t.invalidCounters||=r.invalidCounters,t.reason||=r.reason}return t.modelReported=n.size===1?[...n][0]:null,t.mixedModels=n.size>1,(t.invalidCounters||["inputUncached","cacheRead","cacheWrite","output"].some(r=>t[r]===null))&&(t.reason="counter_not_exposed"),t}var Du=class{session;seen;parts=[];constructor(t,n){this.session=t,this.seen=n}event(t,n){if(t.sessionId!==this.session||t.turnId!==n||!t.usage||typeof t.usage!="object")return!1;let r=t.sourceRange,s=Ds(r?.first?.id),o=Ds(r?.last?.id),i=Ds(r?.stream?.id),a=Ds(r?.stream?.kind),c=s&&o&&i&&a?JSON.stringify([this.session,a,i,s,o]):Ds(t.viewCursor)?JSON.stringify([this.session,t.viewCursor]):null;if(c&&this.seen.has(c))return!1;c&&this.seen.add(c);let l=t.usage,d=ht(t.promptTokens),u=ht(l.outputTokens),f=ht(l.cacheReadTokens),m=ht(l.cacheWriteTokens),p=d===0,h=f??(p?0:null),_=m??(p?0:null),g=d!==null&&h!==null&&_!==null&&h+_<=d?d-h-_:null,w=(h??0)>0||(_??0)>0,y={...pk(),inputUncached:g,cacheRead:h,cacheWrite:_,output:u,reasoning:ht(l.reasoningTokens),modelReported:Ds(t.modelId),invalidCounters:pr([t.promptTokens,t.totalTokens,l.inputTokens,l.cachedTokens,l.cacheReadTokens,l.cacheWriteTokens,l.outputTokens,l.reasoningTokens])||w||g===null||u===null||ht(t.totalTokens)!==null&&d!==null&&u!==null&&t.totalTokens!==d+u||ht(l.reasoningTokens)!==null&&u!==null&&l.reasoningTokens>u};return this.parts.push(y),!0}usage(){return hk(this.parts)}},Gi=class{session;boundary;seen;parts=new Map;ownershipUncertain=!1;latestSnapshot;invalidateOwnership(){this.ownershipUncertain=!0,this.latestSnapshot&&(this.latestSnapshot.invalidCounters=!0,this.latestSnapshot.reason="counter_not_exposed")}constructor(t,n,r){this.session=t,this.boundary=n,this.seen=r}update(t,n=1/0){let r=t.filter(c=>ht(c.seq)!==null&&c.seq>this.boundary&&c.seq<=n),s=r.find(c=>c.type==="turn/start")?.data?.turn,o=new Set(r.map(c=>c.data?.turn).filter(c=>ht(c)!==null)),i=this.ownershipUncertain||o.size>1,a=new Map;for(let c of r){let l=c.data;if(!l||s!==void 0&&l.turn!==s)continue;let d=c.type==="assistant/message",u=d?l.usage:c.type==="assistant/chunk"&&l.chunk?.type==="usage"?l.chunk.usage:void 0;if(!u||typeof u!="object")continue;let f=ht(l.turn)!==null&&ht(l.step)!==null?["step",l.turn,l.step]:Ds(l.message?.id)?["message",l.message.id]:["seq",c.seq],m=JSON.stringify([this.session,...f]);if(this.seen.has(m))continue;let p=a.get(m);(!p||d||!p.final)&&a.set(m,{record:c,final:d})}this.parts=new Map;for(let[c,{record:l,final:d}]of a){let u=l.data,f=d?u.usage:u.chunk.usage;this.parts.set(c,{...pk(),inputUncached:ht(f.inputTokens),cacheRead:ht(f.cacheReadTokens),output:ht(f.outputTokens),reasoning:ht(f.reasoningTokens),modelReported:Ds(u.message?.source?.model),invalidCounters:i||[f.inputTokens,f.cacheReadTokens,f.outputTokens].some(m=>ht(m)===null)||pr([f.inputTokens,f.cacheReadTokens,f.outputTokens,f.reasoningTokens])||ht(f.reasoningTokens)!==null&&ht(f.outputTokens)!==null&&f.reasoningTokens>f.outputTokens})}}lastUsage(){let t=[...this.parts.values()].at(-1);return t?{...t}:void 0}usage(){let t=hk([...this.parts.values()]);return t&&this.ownershipUncertain&&(t.invalidCounters=!0,t.reason="counter_not_exposed"),this.latestSnapshot=t,t}finish(){for(let t of this.parts.keys())this.seen.add(t)}};import{spawn as S6}from"node:child_process";import{randomBytes as b6}from"node:crypto";import{realpath as Pu}from"node:fs/promises";import{createInterface as d6}from"node:readline";var u6=1;function $s(e,t){let n=t.protocol??"acp",r=d6({input:e.stdout}),s=new Map,o=(a,c={},l)=>new Promise((d,u)=>{let f=u6++;s.set(f,{resolve:d,reject:u,onResponse:l});let m=JSON.stringify({jsonrpc:"2.0",id:f,method:a,params:c});bn({event:`${n}_send`,direction:"SEND",provider:t.provider,method:a,id:f,params:c}),e.stdin?.write(`${m}
1922
+ `)}catch{}}function n6(){if(!Lu){let t=e6().slice(0,13).replace("T","-");Lu=Cu(U_(),`debug-${t}.log`)}KJ(zJ(Lu),{recursive:!0})}function An(...e){bn({event:"legacy",msg:e.join(" ")})}function kt(...e){bn({event:"legacy",msg:e.join(" ")},{verbose:!0})}function ne(e){bn(e,{always:!0})}function r6(){return s6()||o6()}function s6(){try{let e=dk(Cu(U_(),"config.toml"),"utf-8");for(let t of e.split(`
1923
+ `)){let n=t.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function o6(){try{let e=dk(Cu(U_(),"config.json"),"utf-8"),t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)&&t.debug===!0}catch{}return!1}var F_="LMCTL_SELF_SESSIONID",a6="LMCTL_LAUNCH_SOURCE";function fk(e){let t=e.CLAUDE_CODE_EXECPATH;if(t===void 0||t.length===0)return e;let n=process.platform!=="win32"&&t.toLowerCase().endsWith(".exe"),r=!n&&!i6(t);if(!n&&!r)return e;ne({event:"claude_execpath_sanitized",reason:n?"wrong_platform_exe":"missing_file",value:t,platform:process.platform});let s={...e};return delete s.CLAUDE_CODE_EXECPATH,s}function Wi(e,t){let n={...e??process.env,PWD:t};return delete n.OLDPWD,n}function c6(e,t){return t===void 0||t.length===0?e:{...e??process.env,[F_]:t}}function Rt(e,t,n,r="chat"){return{...c6(Wi(e,t),n),[a6]:r}}var Bi=class extends Error{constructor(t,n){super(t,n),this.name=this.constructor.name}},rt=class extends Bi{},ct=class extends Bi{exitCode;signal;stderr;constructor(t,n,r=null,s){super(t),this.exitCode=n,this.signal=r,this.stderr=s}};var Ou=class extends Bi{rpcCode;rpcData;constructor(t,n,r){super(t),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}};function xc(e,t){let n;if(t&&typeof t=="object"){let r=t.code;typeof r=="number"&&(n=r)}return new Ou(e,n,t)}var Uo=class e extends Error{cancelReason;constructor(t,n){super(t),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,e.prototype)}},Pe=class e{name;capabilities;injection;protocol;provider;binary;seedArgs;seedTimeoutMs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.protocol=t.protocol,this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedTimeoutMs=t.seedTimeoutMs??6e4,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let n=t?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===be?n:r)}turnOptsFor(t){return t}get seedBinary(){return this.binary}seed(t,n){return n?.signal?.aborted?Promise.resolve({success:!1,error:"seed cancelled before dispatch",errorCode:"ABORT_ERR"}):(l6(t,{recursive:!0}),new Promise(r=>{let s;try{try{n?.onDispatch?.()}catch{}s=mk(this.binary,this.seedArgsFor(n),{cwd:t,env:Wi(n?.env,t),signal:n?.signal,stdio:["pipe","pipe","pipe"],timeout:this.seedTimeoutMs})}catch(c){return r({success:!1,error:c instanceof Error?c.message:String(c)})}let o="",i="";s.stdout?.on("data",c=>{o+=c.toString()}),s.stderr?.on("data",c=>{i+=c.toString()});let a=n?.prompt!==void 0&&this.seedStdin!==void 0?`${n.prompt}
1924
+ `:this.seedStdin;a&&s.stdin?.write(a),s.stdin?.end(),s.on("exit",(c,l)=>{if(c===0&&!l)r({success:!0});else{let d=Po(i).trim(),u=Po(o).trim(),f=d||u;r({success:!1,...n?.signal?.aborted?{errorCode:"ABORT_ERR"}:{},error:f?tt(f,{provider:this.name}):l?`terminated by ${l}`:`exit code ${c}`})}}),s.on("error",c=>{r({success:!1,error:c.message,errorCode:c.code})})}))}resumeCommand(t,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:xu,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,n){let r=this.turnOptsFor(n);if(r.userConfig&&tk(r.userConfig,this.name)){let o=r.userConfig.tools[this.name];if(o?.agent)return this.runOneShotAgent(t,r,o.agent)}let s=r.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return s<=0&&!r.signal?this.transportFn(t,{...r,binary:this.binary}):this.withTimeouts(s,t,r)}withTimeouts(t,n,r){let s=new AbortController,o,i,a="",c,l=r.sessionId,d,u=()=>{t<=0||(clearTimeout(o),o=setTimeout(()=>{r.onIdleWarning?.(t),f(),s.abort(),d&&d({text:a,...c?{usage:c}:{},sessionId:l,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},f=()=>{clearTimeout(o)};r.signal&&(r.signal.aborted?(i="external",s.abort()):r.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),u();let m={...r,binary:this.binary,signal:s.signal,onUsage:_=>{c=_,r.onUsage?.(_)},onSessionId:_=>{_&&(l=_),r.onSessionId?.(_)},onDelta:_=>{a+=_,u(),r.onDelta?.(_)},onProgress:_=>{_.kind!=="api_retry"&&u(),r.onProgress?.(_)}},p=this.transportFn(n,m).then(_=>(f(),{..._,status:_.status??"ok"})).catch(_=>{throw f(),i==="external"?Object.assign(new Uo("Turn cancelled","external"),{usage:_.usage??c,sessionId:l}):_}),h=new Promise(_=>{d=_});return Promise.race([p,h])}runOneShotAgent(t,n,r){let s=nk(n.userConfig,this.name,n.sessionId,t,n.profile),o=Date.now();return new Promise((i,a)=>{let c=n.timeoutMs!==void 0&&n.timeoutMs<=0?0:rk(n.env),l=mk(s,{shell:!0,cwd:n.cwd,env:Rt(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f,m,p=!1,h=null,_=null,g=()=>{clearTimeout(f),f=setTimeout(()=>{!$_(y)&&!D_(y)&&T(h,_)},100)},w=c>0?setTimeout(()=>{u=!0,l.kill(),this.name==="codex"&&T(null)},c):void 0,y="",E="";if(l.stdout?.on("data",b=>{let A=b.toString();y+=A,n.onDelta?.(A),p&&!d&&g()}),l.stderr?.on("data",b=>{E+=b.toString(),p&&!d&&g()}),n.signal){if(n.signal.aborted)return clearTimeout(w),l.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>l.kill(),{once:!0})}let T=(b,A=null)=>{if(d)return;d=!0,clearTimeout(w),clearTimeout(f),clearTimeout(m),this.name==="codex"&&(l.stdout?.destroy(),l.stderr?.destroy());let I=Date.now()-o,R=this.name==="codex"?ZI(y):{};R.usage&&n.onUsage?.(R.usage),R.sessionId&&n.onSessionId?.(R.sessionId);let L=N=>Object.assign(N,{usage:R.usage,sessionId:R.sessionId??n.sessionId});if(this.name==="codex"&&n.signal?.aborted)a(L(new Uo("Turn cancelled","external")));else if(u)a(L(new Error(`Agent command timed out after ${c}ms`)));else if(b===0||b===null&&A===null)i({text:y.trim(),sessionId:R.sessionId??n.sessionId,durationMs:I,...R.usage?{usage:R.usage}:{}});else{let N=E.trim();a(L(new ct(N?tt(N,{provider:this.name}):A?`Agent command terminated by ${A}`:`Agent command exited with code ${b}`,b,A,E)))}};this.name==="codex"?(l.on("close",(b,A)=>T(b,A)),l.on("exit",(b,A)=>{d||(p=!0,h=b,_=A,g(),m=setTimeout(()=>T(b,A),5e3))})):l.on("exit",(b,A)=>T(b,A)),l.on("error",b=>{d||(d=!0,clearTimeout(w),clearTimeout(f),clearTimeout(m),a(b))})})}};var ht=e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null,Ds=e=>typeof e=="string"&&e.length>0&&e!=="<synthetic>"?e:null,pk=()=>({source:"wire",inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:null});function hk(e){if(!e.length)return;let t={...e[0]},n=new Set(e.map(r=>r.modelReported).filter(r=>r!==null));for(let r of e.slice(1)){for(let s of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let o=t[s],i=r[s];o!==null&&i!==null&&ht(o+i)===null&&(t.invalidCounters=!0),t[s]=o===null||i===null?null:ht(o+i)}t.invalidCounters||=r.invalidCounters,t.reason||=r.reason}return t.modelReported=n.size===1?[...n][0]:null,t.mixedModels=n.size>1,(t.invalidCounters||["inputUncached","cacheRead","cacheWrite","output"].some(r=>t[r]===null))&&(t.reason="counter_not_exposed"),t}var Du=class{session;seen;parts=[];constructor(t,n){this.session=t,this.seen=n}event(t,n){if(t.sessionId!==this.session||t.turnId!==n||!t.usage||typeof t.usage!="object")return!1;let r=t.sourceRange,s=Ds(r?.first?.id),o=Ds(r?.last?.id),i=Ds(r?.stream?.id),a=Ds(r?.stream?.kind),c=s&&o&&i&&a?JSON.stringify([this.session,a,i,s,o]):Ds(t.viewCursor)?JSON.stringify([this.session,t.viewCursor]):null;if(c&&this.seen.has(c))return!1;c&&this.seen.add(c);let l=t.usage,d=ht(t.promptTokens),u=ht(l.outputTokens),f=ht(l.cacheReadTokens),m=ht(l.cacheWriteTokens),p=d===0,h=f??(p?0:null),_=m??(p?0:null),g=d!==null&&h!==null&&_!==null&&h+_<=d?d-h-_:null,w=(h??0)>0||(_??0)>0,y={...pk(),inputUncached:g,cacheRead:h,cacheWrite:_,output:u,reasoning:ht(l.reasoningTokens),modelReported:Ds(t.modelId),invalidCounters:pr([t.promptTokens,t.totalTokens,l.inputTokens,l.cachedTokens,l.cacheReadTokens,l.cacheWriteTokens,l.outputTokens,l.reasoningTokens])||w||g===null||u===null||ht(t.totalTokens)!==null&&d!==null&&u!==null&&t.totalTokens!==d+u||ht(l.reasoningTokens)!==null&&u!==null&&l.reasoningTokens>u};return this.parts.push(y),!0}usage(){return hk(this.parts)}},Gi=class{session;boundary;seen;parts=new Map;ownershipUncertain=!1;latestSnapshot;invalidateOwnership(){this.ownershipUncertain=!0,this.latestSnapshot&&(this.latestSnapshot.invalidCounters=!0,this.latestSnapshot.reason="counter_not_exposed")}constructor(t,n,r){this.session=t,this.boundary=n,this.seen=r}update(t,n=1/0){let r=t.filter(c=>ht(c.seq)!==null&&c.seq>this.boundary&&c.seq<=n),s=r.find(c=>c.type==="turn/start")?.data?.turn,o=new Set(r.map(c=>c.data?.turn).filter(c=>ht(c)!==null)),i=this.ownershipUncertain||o.size>1,a=new Map;for(let c of r){let l=c.data;if(!l||s!==void 0&&l.turn!==s)continue;let d=c.type==="assistant/message",u=d?l.usage:c.type==="assistant/chunk"&&l.chunk?.type==="usage"?l.chunk.usage:void 0;if(!u||typeof u!="object")continue;let f=ht(l.turn)!==null&&ht(l.step)!==null?["step",l.turn,l.step]:Ds(l.message?.id)?["message",l.message.id]:["seq",c.seq],m=JSON.stringify([this.session,...f]);if(this.seen.has(m))continue;let p=a.get(m);(!p||d||!p.final)&&a.set(m,{record:c,final:d})}this.parts=new Map;for(let[c,{record:l,final:d}]of a){let u=l.data,f=d?u.usage:u.chunk.usage;this.parts.set(c,{...pk(),inputUncached:ht(f.inputTokens),cacheRead:ht(f.cacheReadTokens),output:ht(f.outputTokens),reasoning:ht(f.reasoningTokens),modelReported:Ds(u.message?.source?.model),invalidCounters:i||[f.inputTokens,f.cacheReadTokens,f.outputTokens].some(m=>ht(m)===null)||pr([f.inputTokens,f.cacheReadTokens,f.outputTokens,f.reasoningTokens])||ht(f.reasoningTokens)!==null&&ht(f.outputTokens)!==null&&f.reasoningTokens>f.outputTokens})}}lastUsage(){let t=[...this.parts.values()].at(-1);return t?{...t}:void 0}usage(){let t=hk([...this.parts.values()]);return t&&this.ownershipUncertain&&(t.invalidCounters=!0,t.reason="counter_not_exposed"),this.latestSnapshot=t,t}finish(){for(let t of this.parts.keys())this.seen.add(t)}};import{spawn as S6}from"node:child_process";import{randomBytes as b6}from"node:crypto";import{realpath as Pu}from"node:fs/promises";import{createInterface as d6}from"node:readline";var u6=1;function $s(e,t){let n=t.protocol??"acp",r=d6({input:e.stdout}),s=new Map,o=(a,c={},l)=>new Promise((d,u)=>{let f=u6++;s.set(f,{resolve:d,reject:u,onResponse:l});let m=JSON.stringify({jsonrpc:"2.0",id:f,method:a,params:c});bn({event:`${n}_send`,direction:"SEND",provider:t.provider,method:a,id:f,params:c}),e.stdin?.write(`${m}
1925
1925
  `)}),i=(a,c={})=>{e.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:a,params:c})}
1926
1926
  `)};return r.on("line",a=>{let c=u=>{if(!t.onProtocolError)return;let f=a.slice(0,512);ne({event:`${n}_protocol_error`,provider:t.provider,reason:u,raw_preview:f,truncated:a.length>512}),t.onProtocolError(new Error(`${n.toUpperCase()} ${u}: ${JSON.stringify(f)}${a.length>512?" (truncated)":""}`))},l;try{l=JSON.parse(a)}catch{c("returned malformed JSON");return}if(!l||typeof l!="object"||Array.isArray(l)){c("returned an invalid message");return}if(bn({event:`${n}_recv`,direction:"RECV",provider:t.provider,id:typeof l.id=="number"?l.id:void 0,method:typeof l.method=="string"?l.method:void 0,preview:JSON.stringify(l).slice(0,300)}),t.onEvent?.(l),typeof l.method!="string"&&typeof l.id=="number"&&s.has(l.id)){let u=s.get(l.id);s.delete(l.id);try{u.onResponse?.(l)}catch(f){u.reject(f instanceof Error?f:new Error(String(f)));return}if(l.error){let f=l.error,m=typeof f?.message=="string"&&f.message.length>0?f.message:JSON.stringify(l.error);u.reject(xc(`${n.toUpperCase()} RPC error: ${m}`,f))}else u.resolve(l);return}let d=l.method;if(!d){c("returned an uncorrelated response");return}if(typeof l.id=="number"||typeof l.id=="string"){ne({event:`${n}_unhandled_request`,provider:t.provider,method:d,id:l.id,params:l.params});let u=JSON.stringify({jsonrpc:"2.0",id:l.id,error:{code:-32601,message:`Method not found: ${d} (lmctl does not implement server-side ${n.toUpperCase()} methods)`}});bn({event:`${n}_send`,direction:"SEND",provider:t.provider,replyTo:l.id,error:"method not found"}),e.stdin?.write(`${u}
1927
- `);return}t.onNotification?.(l)}),{sendRpc:o,sendNotification:i,close(a=new rt(`${n.toUpperCase()} RPC channel closed`)){r.close();for(let c of s.values())c.reject(a);s.clear()}}}import*as q_ from"node:child_process";var f6=1e3;function m6(e){if(typeof q_.spawnSync=="function")try{q_.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function _k(e){return e.exitCode!==null||e.signalCode!==null}function j_(e,t){return _k(e)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(o),n(!0))},o=setTimeout(()=>{r||(r=!0,e.removeListener("exit",s),n(!1))},t);e.once("exit",s)})}async function Ge(e,t={}){let n=Date.now(),r=t.stdinEnd!==!1,s=t.softDelayMs??5e3,o=t.killDelayMs??5e3,i=t.platform??process.platform,a=t.runTaskkill??m6;if(_k(e))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await j_(e,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(i==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await j_(e,o))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(i!=="win32")try{e.kill("SIGKILL")}catch{}return await j_(e,f6)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var p6=2e3,$u=8*60*60*1e3,h6=5e3,_6=1e3,g6=50,H_=Symbol("check-timed-out");async function Mu(e,t,n){if(typeof e=="boolean")return e;let r,s;try{return await Promise.race([e,new Promise(o=>{r=setTimeout(()=>o(H_),t),r.unref?.(),n!==void 0&&(s=()=>o(H_),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function _r(e,t){if(e===void 0){t.closeStdin();return}let n=!1,r=o=>{if(!n){n=!0;try{e.onRelease?.({elapsedMs:Date.now()-o.startedMs,held:o.held,reason:o.reason})}catch{}}t.closeStdin()},s=Date.now();E6(e,t,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function E6(e,t,n,r){let s=e.pollMs??p6,o=e.maxHoldMs??$u,i=e.settleMs??h6,a=e.backgroundGraceMs??_6,c=!1,l=null,d=u=>r({startedMs:n,held:c,reason:u});for(;;){if(t.isAborted())return d("aborted");if(t.hasChildExited())return d("child-exited");let u=o-(Date.now()-n);if(u<=0)return d("max-hold");let f;try{f=await Mu(e.hasOutstandingWork(),u,t.signal)}catch{return d("check-error")}if(f===H_)return d(t.isAborted()||t.signal?.aborted===!0?"aborted":"max-hold");if(f)l=null;else{if(!c&&t.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let h=a-(Date.now()-n);await new Promise(_=>setTimeout(_,Math.max(0,Math.min(s,g6,h))).unref?.());continue}if(!c||i<=0)return d("cleared");l===null&&(l=Date.now(),It(`${t.label}: dispatched work cleared \u2014 settling ${i}ms before closing stdin`));let p=Math.max(l,t.lastEventAtMs());if(!t.isTurnInFlight()&&Date.now()-p>=i)return d("cleared")}if(c||(c=!0,e.onHold?.(),It(`${t.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=o)return ne({event:"transport_hold_open_max_wait",provider:t.label,elapsed_ms:Date.now()-n}),d("max-hold");let m=Math.max(0,Math.min(s,o-(Date.now()-n)));await new Promise(p=>setTimeout(p,m).unref?.())}}function gk(e){nt()&&bn({event:"legacy",msg:`[debug] ${e}`},{always:!0})}var y6={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},w6={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"]}};function Ms(e,t){let n=w6[e];if(n)return n[t]??n.yolo}var T6=new Set(["codex","opencode","kimi","dsh","hermes","pi","miniplayer","muse"]);function v6(e,t){if(t.length===0)return!0;for(let n=0;n+t.length<=e.length;n++){let r=!0;for(let s=0;s<t.length;s++)if(e[n+s]!==t[s]){r=!1;break}if(r)return!0}return!1}function vt(e,t,n="yolo"){if(T6.has(e)){gk(`YOLO ${e} [mode=${n}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":e==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:e==="dsh"?"DSH_PERMISSION_MODE=danger-full-access env var on the sidecar spawn \u2014 no argv flag":e==="hermes"?"HERMES_YOLO_MODE=1 shell gate + ACP session/set_mode (modeId=dont_ask) edit gate":e==="pi"?"no tool-permission prompts exist in pi by design \u2014 nothing to bypass":e==="muse"?"MSP approval mode plus fixed host sandbox/write/shell posture":e==="miniplayer"?"native tools always granted; no permission mode":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?Ms(e,"plan"):y6[e];if(!r){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw ne({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new rt(s)}if(!v6(t,r)){let s=r.join(" "),o=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(i=>JSON.stringify(i)).join(", ")}]`;throw ne({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:n,args:t.join(" "),message:o}),new rt(o)}gk(`YOLO ${e} [mode=${n}]: argv flag '${r.join(" ")}'`)}function Lc(){let e=b6(16);e.writeUIntBE(Date.now(),0,6),e[6]=e[6]&15|112,e[8]=e[8]&63|128;let t=e.toString("hex");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}async function Uu(e){if(e.signal?.aborted)throw new Error("Aborted");if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e.sessionId))throw new Error("Muse requires a native session UUID");let t=e.permissionMode==="plan",n=["serve",...t?["--disable-write","--disable-shell"]:["--disable-sandbox","--trust-workspace"],...e.model?["--model",e.model]:[]];vt("muse",n,e.permissionMode??"yolo");let r=S6(e.progPath??"muse",n,{cwd:e.cwd,env:kt(e.env,e.cwd,e.sessionId),stdio:["pipe","pipe","pipe"]}),s,o=new Set,i=new Set,a,c,l=!1,d=!1,u=!1,f=!1,m=0,p=ak(),h=Date.now(),_=e.sessionId;r.stderr.setEncoding("utf8"),r.stderr.on("data",k=>{p.append(k)});let g=(k,D,O)=>{if(s===k){if(s=void 0,k.id&&i.add(k.id),D){let v=k.usage.usage()??(k.outcome?{source:null,inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:"turn_not_completed"}:void 0);Object.assign(D,{usage:v?{...v,outcome:k.outcome}:void 0,sessionId:_})}else O&&(O.usage=k.usage.usage());k.cleanup(),k.drained(),k.settled||(k.settled=!0,D?k.reject(D):(m++,k.resolve(O)))}},w=k=>{a||(a=k,s&&g(s,a),E.close(a),!f&&!l&&Ge(r,{softDelayMs:e.closeTimeoutMs??2e3,killDelayMs:e.closeTimeoutMs??2e3}).catch(()=>{}))},y=(k,D)=>{let O=D.params;if(!O||O.sessionId!==_)return;let v=D.method;if(v==="view/gap"||v==="session/closed"){w(new Error(`Muse ${v}: the conversation cannot continue without reopening`));return}if(v==="turn/unqueued"&&O.turnId===k.id){k.outcome="cancelled",g(k,new Uo("Muse queued turn cancelled","external"));return}v==="turn/started"&&O.turnId===k.id&&(k.queued=!1);let S=O.item,x=O.turnId??S?.turnId;if(x&&x!==k.id||v==="session/tokenUsage"&&(k.settled||O.turnId!==k.id||!k.usage.event(O,k.id)))return;k.opts.onEvent?.(D);let C={kind:"other",raw:D};if(["item/started","item/updated","item/completed"].includes(v)&&S?.turnId===k.id&&typeof S.itemId=="string"){let F=k.items.get(S.itemId);if(F&&typeof S.revision=="number"&&S.revision<=F.revision)return;k.items.set(S.itemId,{...S}),(S.kind==="toolCall"||S.kind==="userShell")&&v!=="item/updated"?C={kind:v==="item/completed"?"tool_result":"tool_use",id:S.itemId,tool:S.tool??S.kind,summary:S.failureReason??S.fallbackText,...v==="item/completed"?{status:S.status==="completed"?"ok":"error"}:{},...S.durationMs!==void 0?{elapsedMs:S.durationMs}:{},raw:D}:S.kind==="reasoning"?C={kind:"thinking",raw:D}:S.kind==="agentMessage"&&(C={kind:"text",raw:D})}else if(v==="item/delta"&&typeof O.itemId=="string"&&typeof O.delta=="string"){let F=k.items.get(O.itemId);if(!F)return;F.kind==="agentMessage"&&(O.field===void 0||O.field==="text")?(F.text=(F.text??"")+O.delta,k.cancelled||k.opts.onDelta?.(O.delta),C={kind:"text",raw:D}):F.kind==="reasoning"&&(C={kind:"thinking",raw:D})}if(k.cancelled||k.opts.onProgress?.(C),v!=="turn/completed"||O.turnId!==k.id)return;if(!["completed","failed","cancelled"].includes(O.terminal)){w(new Error(`Muse returned an unknown turn terminal: ${String(O.terminal)}`));return}if(k.cancelled||O.terminal==="cancelled"){k.outcome="cancelled",g(k,new Uo("Muse turn cancelled",k.cancelled?"external":"provider"));return}if(O.terminal!=="completed"){k.outcome="error",g(k,new Error(O.error?.message??O.reason??`Muse turn ended with ${String(O.terminal)}`));return}let q=[...k.items.values()].filter(F=>F.kind==="agentMessage");g(k,void 0,{text:q.map(F=>typeof F.text=="string"?F.text:"").join(`
1928
- `),sessionId:_,durationMs:typeof O.durationMs=="number"?O.durationMs:Date.now()-k.started,stopReason:O.terminal,...q.some(F=>F.truncated)?{warnings:["Muse reported a truncated response; inspect the native transcript for complete content"]}:{}})},E=$s(r,{provider:"muse",protocol:"msp",onProtocolError:w,onNotification:k=>{if(h=Date.now(),k.method==="view/gap"||k.method==="session/closed"){k.params?.sessionId===_&&!l&&w(new Error(`Muse ${k.method}: session must be reopened`));return}let D=s;D&&(D.id?y(D,k):D.events.push(k))}}),T=async(k,D,O=Lc())=>(await E.sendRpc(k,{...D,commandId:O})).result,b=k=>{!k.id||k.interruptSent||s!==k||(k.interruptSent=!0,T("turn/interrupt",{sessionId:_,turnId:k.id}).catch(D=>{s===k&&w(D instanceof Error?D:new Error(String(D)))}))},A=k=>{!k.id||k.unqueueSent||s!==k||(k.unqueueSent=!0,T("turn/unqueue",{sessionId:_,turnId:k.id}).catch(D=>{let O=D instanceof Error?D.message:String(D);/already started|not queued|launch boundary|turn is running/i.test(O)?(k.queued=!1,b(k)):s===k&&w(D instanceof Error?D:new Error(O))}))},I=k=>{k.queued?A(k):b(k)};r.on("error",k=>w(new Error(`Unable to start Muse: ${k.message}`)));let R=()=>{l||f||a||u||(u=!0,Ge(r,{softDelayMs:e.closeTimeoutMs??2e3,killDelayMs:e.closeTimeoutMs??2e3}).catch(k=>w(k instanceof Error?k:new Error(String(k)))))};r.stdin.on("error",R),r.stdout.on("end",R),r.on("exit",()=>{f=!0}),r.on("close",(k,D)=>{f=!0,l?E.close(new Error("Muse session closed")):w(new Error(Hi(`Muse exited (${D??k}) after ${m} completed prompt(s)`,p.text().trim()?tt(p.text(),{provider:"muse"}):""))),s&&g(s,new Error("Muse session closed"))});let L=()=>{if(c)return c;l=!0;let k=!!s;return s&&(s.cancelled=!0,I(s)),c=(async()=>{f||(await new Promise(D=>_r(d?e.holdOpen:void 0,{isAborted:()=>k,hasChildExited:()=>f,isTurnInFlight:()=>!!s,lastEventAtMs:()=>h,closeStdin:()=>{r.stdin.end(),D()},label:"muse"})),await Ge(r,{stdinEnd:!1,softDelayMs:e.closeTimeoutMs??2e3,killDelayMs:e.closeTimeoutMs??2e3}).catch(()=>{})),s&&g(s,new Error("Muse session closed")),E.close(new Error("Muse session closed"))})(),c},N=()=>{w(new Error("Aborted")),L()};e.signal?.addEventListener("abort",N,{once:!0});try{if(e.signal?.aborted)throw new Error("Aborted");let k=(await E.sendRpc("initialize",{clientInfo:{name:"lmctl",version:"1"}})).result;if(k?.schema?.version!==1)throw new Error("Muse MSP schema version is unsupported");if(e.expectedHome&&(typeof k.museHome!="string"||await Pu(k.museHome)!==await Pu(e.expectedHome)))throw new Error("Muse data home does not match the configured session reader");if(k.sessionDurability!==void 0&&k.sessionDurability!=="durable")throw new Error("Muse did not provide durable sessions");E.sendNotification("initialized");let D=t?"denyUnmatched":"allowAll",v=(e.create?await T("session/start",{sessionId:_,workspaceRoot:e.cwd,approvalMode:D,...e.model?{modelId:e.model}:{}}):await T("session/resume",{sessionId:_,excludeItems:!0}))?.session;if(v?.sessionId!==_)throw new Error(`Muse did not return requested session "${_}"`);if(typeof v.workspaceRoot!="string"||await Pu(v.workspaceRoot)!==await Pu(e.cwd))throw new Error("Muse session belongs to a different working directory");if(v.activeTurnId||v.status!=="idle")throw new Error(`Muse session is not idle (${String(v.status)})`);if((await T("session/setApprovalMode",{sessionId:_,mode:D}))?.effectiveMode?.mode!==D)throw new Error("Muse did not apply the requested approval mode");if(!e.create&&e.model&&v.modelId!==e.model&&(await T("session/setModel",{sessionId:_,model:{modelId:e.model,...v.providerId?{providerId:v.providerId}:{}}}))?.status!=="accepted")throw new Error("Muse did not accept the requested model");d=!0}catch(k){throw await L(),a??k}finally{e.signal?.removeEventListener("abort",N)}return{provider:"muse",sessionId:_,get completedTurns(){return m},close:L,async sendTurn(k,D={}){if(s?.cancelled&&await s.drain,a)throw new Error(a.message);if(l)throw new Error("Muse session is closed");if(s)throw new Error("Muse already has an active turn");if(D.signal?.aborted)throw new Error("Aborted");return new Promise((O,v)=>{let S,x=new Promise(F=>{S=F}),C={usage:new Du(_,o),commandId:Lc(),events:[],items:new Map,opts:D,started:Date.now(),cancelled:!1,interruptSent:!1,unqueueSent:!1,queued:!1,settled:!1,resolve:O,reject:v,drain:x,drained:S,cleanup:()=>{}};s=C;let q=()=>{C.cancelled=!0,C.settled=!0,v(Object.assign(new Error("Aborted"),{usage:C.usage.usage(),sessionId:_})),I(C)};C.cleanup=()=>D.signal?.removeEventListener("abort",q),D.signal?.addEventListener("abort",q,{once:!0}),T("turn/start",{sessionId:_,input:[{type:"text",text:k}],...e.effort?{reasoningEffort:e.effort}:{}},C.commandId).then(F=>{if(s===C){if(F?.commandId!==C.commandId||F.status!=="accepted"||!["started","queued"].includes(F.disposition)||typeof F.turnId!="string"||F.turnId.length===0||i.has(F.turnId)){w(new Error("Muse did not admit a fresh turn; refusing ambiguous dispatch"));return}C.id=F.turnId,C.queued=F.disposition==="queued",C.cancelled&&I(C);for(let M of C.events)s===C&&y(C,M);C.events=[]}},F=>{s===C&&g(C,F instanceof Error?F:new Error(String(F)))})})}}}function B_(e={}){let t=Bd(e.museDataHome),n=s=>({...s??process.env,XDG_DATA_HOME:t}),r=async(s,o)=>{if(o.bundleSession)return Wr(o.bundleSession,"muse",o.sessionId,s,o);let i=o.sessionId||Lc(),a=await Uu({...o,sessionId:i,create:o.sessionId==="",env:n(o.env),expectedHome:W_(t,"muse")});try{return await a.sendTurn(s,o)}finally{await a.close()}};return new class extends Pe{constructor(){super({provider:new Wd({museDataHome:t}),protocol:{transport:"muse-msp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"muse",seedArgs:[],startTemplate:"muse",resumeTemplate:"muse resume {{session_id}}",transport:r})}openSession(s){return Uu({...s,env:n(s.env),expectedHome:W_(t,"muse")})}async seed(s,o){await A6(s,{recursive:!0});let i=Lc(),a,c;try{a=await Uu({sessionId:i,cwd:s,create:!0,env:n(o?.env),signal:o?.signal,expectedHome:W_(t,"muse"),model:o?.model,effort:o?.effort}),o?.signal?.throwIfAborted();try{o?.onDispatch?.()}catch{}let l=await a.sendTurn(o?.prompt??be,{signal:o?.signal});if(c=l.usage,await a.close(),!await this.load(i))throw new Error("Muse seed did not persist a readable native session");return{success:!0,sessionId:i,usage:l.usage}}catch(l){return{success:!1,sessionId:i,usage:l?.usage??c,error:`Muse seed failed: ${l instanceof Error?l.message:String(l)}`}}finally{await a?.close()}}}}import{spawn as vk}from"node:child_process";import{existsSync as Sk}from"node:fs";function yk(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let n=0;n<e.length;n++)n===0?t.push(e[n]):t.push(`
1927
+ `);return}t.onNotification?.(l)}),{sendRpc:o,sendNotification:i,close(a=new rt(`${n.toUpperCase()} RPC channel closed`)){r.close();for(let c of s.values())c.reject(a);s.clear()}}}import*as q_ from"node:child_process";var f6=1e3;function m6(e){if(typeof q_.spawnSync=="function")try{q_.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function _k(e){return e.exitCode!==null||e.signalCode!==null}function j_(e,t){return _k(e)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(o),n(!0))},o=setTimeout(()=>{r||(r=!0,e.removeListener("exit",s),n(!1))},t);e.once("exit",s)})}async function Ge(e,t={}){let n=Date.now(),r=t.stdinEnd!==!1,s=t.softDelayMs??5e3,o=t.killDelayMs??5e3,i=t.platform??process.platform,a=t.runTaskkill??m6;if(_k(e))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await j_(e,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(i==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await j_(e,o))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(i!=="win32")try{e.kill("SIGKILL")}catch{}return await j_(e,f6)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var p6=2e3,$u=8*60*60*1e3,h6=5e3,_6=1e3,g6=50,H_=Symbol("check-timed-out");async function Mu(e,t,n){if(typeof e=="boolean")return e;let r,s;try{return await Promise.race([e,new Promise(o=>{r=setTimeout(()=>o(H_),t),r.unref?.(),n!==void 0&&(s=()=>o(H_),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function _r(e,t){if(e===void 0){t.closeStdin();return}let n=!1,r=o=>{if(!n){n=!0;try{e.onRelease?.({elapsedMs:Date.now()-o.startedMs,held:o.held,reason:o.reason})}catch{}}t.closeStdin()},s=Date.now();E6(e,t,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function E6(e,t,n,r){let s=e.pollMs??p6,o=e.maxHoldMs??$u,i=e.settleMs??h6,a=e.backgroundGraceMs??_6,c=!1,l=null,d=u=>r({startedMs:n,held:c,reason:u});for(;;){if(t.isAborted())return d("aborted");if(t.hasChildExited())return d("child-exited");let u=o-(Date.now()-n);if(u<=0)return d("max-hold");let f;try{f=await Mu(e.hasOutstandingWork(),u,t.signal)}catch{return d("check-error")}if(f===H_)return d(t.isAborted()||t.signal?.aborted===!0?"aborted":"max-hold");if(f)l=null;else{if(!c&&t.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let h=a-(Date.now()-n);await new Promise(_=>setTimeout(_,Math.max(0,Math.min(s,g6,h))).unref?.());continue}if(!c||i<=0)return d("cleared");l===null&&(l=Date.now(),kt(`${t.label}: dispatched work cleared \u2014 settling ${i}ms before closing stdin`));let p=Math.max(l,t.lastEventAtMs());if(!t.isTurnInFlight()&&Date.now()-p>=i)return d("cleared")}if(c||(c=!0,e.onHold?.(),kt(`${t.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=o)return ne({event:"transport_hold_open_max_wait",provider:t.label,elapsed_ms:Date.now()-n}),d("max-hold");let m=Math.max(0,Math.min(s,o-(Date.now()-n)));await new Promise(p=>setTimeout(p,m).unref?.())}}function gk(e){nt()&&bn({event:"legacy",msg:`[debug] ${e}`},{always:!0})}var y6={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},w6={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"]}};function Ms(e,t){let n=w6[e];if(n)return n[t]??n.yolo}var T6=new Set(["codex","opencode","kimi","dsh","hermes","pi","miniplayer","muse"]);function v6(e,t){if(t.length===0)return!0;for(let n=0;n+t.length<=e.length;n++){let r=!0;for(let s=0;s<t.length;s++)if(e[n+s]!==t[s]){r=!1;break}if(r)return!0}return!1}function St(e,t,n="yolo"){if(T6.has(e)){gk(`YOLO ${e} [mode=${n}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":e==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:e==="dsh"?"DSH_PERMISSION_MODE=danger-full-access env var on the sidecar spawn \u2014 no argv flag":e==="hermes"?"HERMES_YOLO_MODE=1 shell gate + ACP session/set_mode (modeId=dont_ask) edit gate":e==="pi"?"no tool-permission prompts exist in pi by design \u2014 nothing to bypass":e==="muse"?"MSP approval mode plus fixed host sandbox/write/shell posture":e==="miniplayer"?"native tools always granted; no permission mode":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?Ms(e,"plan"):y6[e];if(!r){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw ne({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new rt(s)}if(!v6(t,r)){let s=r.join(" "),o=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(i=>JSON.stringify(i)).join(", ")}]`;throw ne({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:n,args:t.join(" "),message:o}),new rt(o)}gk(`YOLO ${e} [mode=${n}]: argv flag '${r.join(" ")}'`)}function Lc(){let e=b6(16);e.writeUIntBE(Date.now(),0,6),e[6]=e[6]&15|112,e[8]=e[8]&63|128;let t=e.toString("hex");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}async function Uu(e){if(e.signal?.aborted)throw new Error("Aborted");if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e.sessionId))throw new Error("Muse requires a native session UUID");let t=e.permissionMode==="plan",n=["serve",...t?["--disable-write","--disable-shell"]:["--disable-sandbox","--trust-workspace"],...e.model?["--model",e.model]:[]];St("muse",n,e.permissionMode??"yolo");let r=S6(e.progPath??"muse",n,{cwd:e.cwd,env:Rt(e.env,e.cwd,e.sessionId),stdio:["pipe","pipe","pipe"]}),s,o=new Set,i=new Set,a,c,l=!1,d=!1,u=!1,f=!1,m=0,p=ak(),h=Date.now(),_=e.sessionId;r.stderr.setEncoding("utf8"),r.stderr.on("data",k=>{p.append(k)});let g=(k,D,O)=>{if(s===k){if(s=void 0,k.id&&i.add(k.id),D){let v=k.usage.usage()??(k.outcome?{source:null,inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:"turn_not_completed"}:void 0);Object.assign(D,{usage:v?{...v,outcome:k.outcome}:void 0,sessionId:_})}else O&&(O.usage=k.usage.usage());k.cleanup(),k.drained(),k.settled||(k.settled=!0,D?k.reject(D):(m++,k.resolve(O)))}},w=k=>{a||(a=k,s&&g(s,a),E.close(a),!f&&!l&&Ge(r,{softDelayMs:e.closeTimeoutMs??2e3,killDelayMs:e.closeTimeoutMs??2e3}).catch(()=>{}))},y=(k,D)=>{let O=D.params;if(!O||O.sessionId!==_)return;let v=D.method;if(v==="view/gap"||v==="session/closed"){w(new Error(`Muse ${v}: the conversation cannot continue without reopening`));return}if(v==="turn/unqueued"&&O.turnId===k.id){k.outcome="cancelled",g(k,new Uo("Muse queued turn cancelled","external"));return}v==="turn/started"&&O.turnId===k.id&&(k.queued=!1);let S=O.item,x=O.turnId??S?.turnId;if(x&&x!==k.id||v==="session/tokenUsage"&&(k.settled||O.turnId!==k.id||!k.usage.event(O,k.id)))return;k.opts.onEvent?.(D);let C={kind:"other",raw:D};if(["item/started","item/updated","item/completed"].includes(v)&&S?.turnId===k.id&&typeof S.itemId=="string"){let F=k.items.get(S.itemId);if(F&&typeof S.revision=="number"&&S.revision<=F.revision)return;k.items.set(S.itemId,{...S}),(S.kind==="toolCall"||S.kind==="userShell")&&v!=="item/updated"?C={kind:v==="item/completed"?"tool_result":"tool_use",id:S.itemId,tool:S.tool??S.kind,summary:S.failureReason??S.fallbackText,...v==="item/completed"?{status:S.status==="completed"?"ok":"error"}:{},...S.durationMs!==void 0?{elapsedMs:S.durationMs}:{},raw:D}:S.kind==="reasoning"?C={kind:"thinking",raw:D}:S.kind==="agentMessage"&&(C={kind:"text",raw:D})}else if(v==="item/delta"&&typeof O.itemId=="string"&&typeof O.delta=="string"){let F=k.items.get(O.itemId);if(!F)return;F.kind==="agentMessage"&&(O.field===void 0||O.field==="text")?(F.text=(F.text??"")+O.delta,k.cancelled||k.opts.onDelta?.(O.delta),C={kind:"text",raw:D}):F.kind==="reasoning"&&(C={kind:"thinking",raw:D})}if(k.cancelled||k.opts.onProgress?.(C),v!=="turn/completed"||O.turnId!==k.id)return;if(!["completed","failed","cancelled"].includes(O.terminal)){w(new Error(`Muse returned an unknown turn terminal: ${String(O.terminal)}`));return}if(k.cancelled||O.terminal==="cancelled"){k.outcome="cancelled",g(k,new Uo("Muse turn cancelled",k.cancelled?"external":"provider"));return}if(O.terminal!=="completed"){k.outcome="error",g(k,new Error(O.error?.message??O.reason??`Muse turn ended with ${String(O.terminal)}`));return}let q=[...k.items.values()].filter(F=>F.kind==="agentMessage");g(k,void 0,{text:q.map(F=>typeof F.text=="string"?F.text:"").join(`
1928
+ `),sessionId:_,durationMs:typeof O.durationMs=="number"?O.durationMs:Date.now()-k.started,stopReason:O.terminal,...q.some(F=>F.truncated)?{warnings:["Muse reported a truncated response; inspect the native transcript for complete content"]}:{}})},E=$s(r,{provider:"muse",protocol:"msp",onProtocolError:w,onNotification:k=>{if(h=Date.now(),k.method==="view/gap"||k.method==="session/closed"){k.params?.sessionId===_&&!l&&w(new Error(`Muse ${k.method}: session must be reopened`));return}let D=s;D&&(D.id?y(D,k):D.events.push(k))}}),T=async(k,D,O=Lc())=>(await E.sendRpc(k,{...D,commandId:O})).result,b=k=>{!k.id||k.interruptSent||s!==k||(k.interruptSent=!0,T("turn/interrupt",{sessionId:_,turnId:k.id}).catch(D=>{s===k&&w(D instanceof Error?D:new Error(String(D)))}))},A=k=>{!k.id||k.unqueueSent||s!==k||(k.unqueueSent=!0,T("turn/unqueue",{sessionId:_,turnId:k.id}).catch(D=>{let O=D instanceof Error?D.message:String(D);/already started|not queued|launch boundary|turn is running/i.test(O)?(k.queued=!1,b(k)):s===k&&w(D instanceof Error?D:new Error(O))}))},I=k=>{k.queued?A(k):b(k)};r.on("error",k=>w(new Error(`Unable to start Muse: ${k.message}`)));let R=()=>{l||f||a||u||(u=!0,Ge(r,{softDelayMs:e.closeTimeoutMs??2e3,killDelayMs:e.closeTimeoutMs??2e3}).catch(k=>w(k instanceof Error?k:new Error(String(k)))))};r.stdin.on("error",R),r.stdout.on("end",R),r.on("exit",()=>{f=!0}),r.on("close",(k,D)=>{f=!0,l?E.close(new Error("Muse session closed")):w(new Error(Hi(`Muse exited (${D??k}) after ${m} completed prompt(s)`,p.text().trim()?tt(p.text(),{provider:"muse"}):""))),s&&g(s,new Error("Muse session closed"))});let L=()=>{if(c)return c;l=!0;let k=!!s;return s&&(s.cancelled=!0,I(s)),c=(async()=>{f||(await new Promise(D=>_r(d?e.holdOpen:void 0,{isAborted:()=>k,hasChildExited:()=>f,isTurnInFlight:()=>!!s,lastEventAtMs:()=>h,closeStdin:()=>{r.stdin.end(),D()},label:"muse"})),await Ge(r,{stdinEnd:!1,softDelayMs:e.closeTimeoutMs??2e3,killDelayMs:e.closeTimeoutMs??2e3}).catch(()=>{})),s&&g(s,new Error("Muse session closed")),E.close(new Error("Muse session closed"))})(),c},N=()=>{w(new Error("Aborted")),L()};e.signal?.addEventListener("abort",N,{once:!0});try{if(e.signal?.aborted)throw new Error("Aborted");let k=(await E.sendRpc("initialize",{clientInfo:{name:"lmctl",version:"1"}})).result;if(k?.schema?.version!==1)throw new Error("Muse MSP schema version is unsupported");if(e.expectedHome&&(typeof k.museHome!="string"||await Pu(k.museHome)!==await Pu(e.expectedHome)))throw new Error("Muse data home does not match the configured session reader");if(k.sessionDurability!==void 0&&k.sessionDurability!=="durable")throw new Error("Muse did not provide durable sessions");E.sendNotification("initialized");let D=t?"denyUnmatched":"allowAll",v=(e.create?await T("session/start",{sessionId:_,workspaceRoot:e.cwd,approvalMode:D,...e.model?{modelId:e.model}:{}}):await T("session/resume",{sessionId:_,excludeItems:!0}))?.session;if(v?.sessionId!==_)throw new Error(`Muse did not return requested session "${_}"`);if(typeof v.workspaceRoot!="string"||await Pu(v.workspaceRoot)!==await Pu(e.cwd))throw new Error("Muse session belongs to a different working directory");if(v.activeTurnId||v.status!=="idle")throw new Error(`Muse session is not idle (${String(v.status)})`);if((await T("session/setApprovalMode",{sessionId:_,mode:D}))?.effectiveMode?.mode!==D)throw new Error("Muse did not apply the requested approval mode");if(!e.create&&e.model&&v.modelId!==e.model&&(await T("session/setModel",{sessionId:_,model:{modelId:e.model,...v.providerId?{providerId:v.providerId}:{}}}))?.status!=="accepted")throw new Error("Muse did not accept the requested model");d=!0}catch(k){throw await L(),a??k}finally{e.signal?.removeEventListener("abort",N)}return{provider:"muse",sessionId:_,get completedTurns(){return m},close:L,async sendTurn(k,D={}){if(s?.cancelled&&await s.drain,a)throw new Error(a.message);if(l)throw new Error("Muse session is closed");if(s)throw new Error("Muse already has an active turn");if(D.signal?.aborted)throw new Error("Aborted");return new Promise((O,v)=>{let S,x=new Promise(F=>{S=F}),C={usage:new Du(_,o),commandId:Lc(),events:[],items:new Map,opts:D,started:Date.now(),cancelled:!1,interruptSent:!1,unqueueSent:!1,queued:!1,settled:!1,resolve:O,reject:v,drain:x,drained:S,cleanup:()=>{}};s=C;let q=()=>{C.cancelled=!0,C.settled=!0,v(Object.assign(new Error("Aborted"),{usage:C.usage.usage(),sessionId:_})),I(C)};C.cleanup=()=>D.signal?.removeEventListener("abort",q),D.signal?.addEventListener("abort",q,{once:!0}),T("turn/start",{sessionId:_,input:[{type:"text",text:k}],...e.effort?{reasoningEffort:e.effort}:{}},C.commandId).then(F=>{if(s===C){if(F?.commandId!==C.commandId||F.status!=="accepted"||!["started","queued"].includes(F.disposition)||typeof F.turnId!="string"||F.turnId.length===0||i.has(F.turnId)){w(new Error("Muse did not admit a fresh turn; refusing ambiguous dispatch"));return}C.id=F.turnId,C.queued=F.disposition==="queued",C.cancelled&&I(C);for(let M of C.events)s===C&&y(C,M);C.events=[]}},F=>{s===C&&g(C,F instanceof Error?F:new Error(String(F)))})})}}}function B_(e={}){let t=Bd(e.museDataHome),n=s=>({...s??process.env,XDG_DATA_HOME:t}),r=async(s,o)=>{if(o.bundleSession)return Br(o.bundleSession,"muse",o.sessionId,s,o);let i=o.sessionId||Lc(),a=await Uu({...o,sessionId:i,create:o.sessionId==="",env:n(o.env),expectedHome:W_(t,"muse")});try{return await a.sendTurn(s,o)}finally{await a.close()}};return new class extends Pe{constructor(){super({provider:new Wd({museDataHome:t}),protocol:{transport:"muse-msp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"muse",seedArgs:[],startTemplate:"muse",resumeTemplate:"muse resume {{session_id}}",transport:r})}openSession(s){return Uu({...s,env:n(s.env),expectedHome:W_(t,"muse")})}async seed(s,o){await A6(s,{recursive:!0});let i=Lc(),a,c;try{a=await Uu({sessionId:i,cwd:s,create:!0,env:n(o?.env),signal:o?.signal,expectedHome:W_(t,"muse"),model:o?.model,effort:o?.effort}),o?.signal?.throwIfAborted();try{o?.onDispatch?.()}catch{}let l=await a.sendTurn(o?.prompt??be,{signal:o?.signal});if(c=l.usage,await a.close(),!await this.load(i))throw new Error("Muse seed did not persist a readable native session");return{success:!0,sessionId:i,usage:l.usage}}catch(l){return{success:!1,sessionId:i,usage:l?.usage??c,error:`Muse seed failed: ${l instanceof Error?l.message:String(l)}`}}finally{await a?.close()}}}}import{spawn as vk}from"node:child_process";import{existsSync as Sk}from"node:fs";function yk(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let n=0;n<e.length;n++)n===0?t.push(e[n]):t.push(`
1929
1929
 
1930
1930
  --- additional response (turn ${n+1} of ${e.length}; likely an injected mid-call notification) ---
1931
1931
 
@@ -1933,25 +1933,25 @@ ${r}`}}}function Hi(e,t){return t===""?e:`${e}:${t.includes(`
1933
1933
  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 t?`Original provider error:
1934
1934
  ${tt(t,{provider:e.tool})}
1935
1935
 
1936
- ${r}`:r}var N6={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]};function kk(e){let t=e.tool||"claude",n=e.binaryPath||k6[t]||"claude",r=["-p","","--output-format","stream-json","--input-format","stream-json"];t==="claude"&&r.push("--verbose"),e.sessionId&&r.push("--resume",e.sessionId),e.model&&r.push("--model",e.model);let s=e.permissionMode??"yolo",o=Ms(t,s)??N6[t]??["--dangerously-skip-permissions"];if(r.push(...o),vt(t,r,s),e.cwd&&!Sk(e.cwd))throw ne({event:"transport_error",provider:t,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),new rt(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});let i=kt(e.env,e.cwd,e.sessionId);return{tool:t,binary:n,args:r,spawnEnv:t==="claude"?fk(i):i}}function Rk(e,t){return new Promise((n,r)=>{let s=Date.now(),o,i,a,c;try{({tool:o,binary:i,args:a,spawnEnv:c}=kk(t))}catch($){return r($ instanceof Error?$:new Error(String($)))}let l=vk(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:c});l.stdin?.on("error",$=>{It(`stream-json: stdin pipe error, ignored (exit handler reports): ${$.message}`)});let d=!1;if(t.signal){if(t.signal.aborted)return d=!0,ne({event:"transport_abort",provider:o,phase:"pre_spawn"}),Ge(l).catch(()=>{}),r(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,ne({event:"transport_abort",provider:o}),Ge(l).catch(()=>{}),r(Object.assign(new Error("Aborted"),{usage:x.usage()}))},{once:!0})}let u="",f=!1,m=!1,p=0,h=!1,_="",g="",w,y,E=null,T=null,b=!1,A=!1,I=bk(),R=Ak();function L(){w!==void 0&&(clearTimeout(w),w=void 0)}function N(){y!==void 0&&(clearTimeout(y),y=void 0)}let k=null;function D(){return f||d||x.sawResult()}function O($){return $==="text_done"?I:R}async function v($){if($==="text_done"?w=void 0:y=void 0,D()||E!==null)return;k??=Date.now();let U=O($);if(t.holdOpen){let W=(t.holdOpen.maxHoldMs??$u)-(Date.now()-k),se=W>0?await Mu(Promise.resolve(t.holdOpen.hasOutstandingWork()).catch(()=>!1),W,t.signal):!1;if(D()||($==="text_done"?w!==void 0:y!==void 0))return;if(se===!0){ne({event:"transport_stall_grace_deferred",provider:o,grace_kind:$,grace_ms:U,reason:"outstanding_dispatched_work"}),S($);return}}T=$,E=$==="text_done"?`${o} finished responding but never emitted its closing result event (${U}ms of silence after its last message)`:`${o} went silent mid-turn and never emitted its closing result event (${U}ms of silence)`,ne({event:"transport_stall_grace_fired",provider:o,grace_kind:$,grace_ms:U}),Ge(l).catch(()=>{})}function S($){let U=setTimeout(()=>{v($)},O($));U.unref?.(),$==="text_done"?(L(),w=U):(N(),y=U)}let x=Fu({usageState:o==="claude"?G_(!!t.sessionId):void 0,onEvent:$=>{p=Date.now(),h=$.type!=="result",$.type==="system"&&$.subtype==="init"&&(g=$.session_id||g),$.type==="assistant"?(b=!Ik($),A=b&&$.message?.stop_reason==="pause_turn"):($.type==="result"||$.type==="user")&&(b=!1,A=!1),L(),o==="claude"&&b&&!A&&!x.sawResult()&&S("text_done"),N(),o==="claude"&&!x.sawResult()&&S("tool_use_silence"),t.onEvent?.($)},onText:$=>{_+=$,t.onText?.($)}});function C(){m||(m=!0,_r(t.holdOpen,{isAborted:()=>d,hasChildExited:()=>f,isTurnInFlight:()=>h,lastEventAtMs:()=>p,closeStdin:()=>{l.stdin?.end()},signal:t.signal,label:t.tool||"claude"}))}function q($){let U=x.sawResult();x.processLine($);let B=x.usage();B&&t.onUsage?.(B),!U&&x.sawResult()&&C()}l.stdout?.on("data",$=>{u+=$.toString();let U=u.split(`
1937
- `);u=U.pop()||"";for(let B of U)q(B)});let F="";l.stderr?.on("data",$=>{F+=$.toString()}),l.on("error",$=>{ne({event:"transport_error",provider:o,error_class:"TransportConnectionError",error_message:$.message}),r(new rt(`Failed to spawn ${i}: ${$.message}`,{cause:$}))}),l.on("exit",($,U)=>{if(f=!0,L(),N(),d)return;u.trim()&&q(u);let B=x.finalize();if(B?.isError)ne({event:"transport_error",provider:o,error_class:"Error",reason:"provider_result_error",error_message:B.errorMessage}),r(Object.assign(new Error(`${o} reported an error for this turn (no assistant output)`+(t.sessionId?` \u2014 session=${t.sessionId}`:"")+`: ${B.errorMessage??"unknown error"}`),{usage:B.usage,sessionId:B.sessionId}));else if(B)It(`stream-json: result ${B.result.slice(0,80)}${B.result.length>80?"...":""} (${B.durationMs}ms)`),n({result:B.result,sessionId:B.sessionId,durationMs:B.durationMs,numTurns:B.numTurns,usage:B.usage,exitCode:$});else if(E!==null&&T==="text_done"&&_.trim().length>0)ne({event:"transport_stall_finalized",provider:o,reason:E,text_len:_.length}),n({result:_,sessionId:g||t.sessionId||"",durationMs:Date.now()-s,numTurns:1,exitCode:$,warnings:[E]});else if(E!==null&&T==="tool_use_silence"){let W=F.trim()?`
1936
+ ${r}`:r}var N6={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]};function kk(e){let t=e.tool||"claude",n=e.binaryPath||k6[t]||"claude",r=["-p","","--output-format","stream-json","--input-format","stream-json"];t==="claude"&&r.push("--verbose"),e.sessionId&&r.push("--resume",e.sessionId),e.model&&r.push("--model",e.model);let s=e.permissionMode??"yolo",o=Ms(t,s)??N6[t]??["--dangerously-skip-permissions"];if(r.push(...o),St(t,r,s),e.cwd&&!Sk(e.cwd))throw ne({event:"transport_error",provider:t,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),new rt(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});let i=Rt(e.env,e.cwd,e.sessionId);return{tool:t,binary:n,args:r,spawnEnv:t==="claude"?fk(i):i}}function Rk(e,t){return new Promise((n,r)=>{let s=Date.now(),o,i,a,c;try{({tool:o,binary:i,args:a,spawnEnv:c}=kk(t))}catch($){return r($ instanceof Error?$:new Error(String($)))}let l=vk(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:c});l.stdin?.on("error",$=>{kt(`stream-json: stdin pipe error, ignored (exit handler reports): ${$.message}`)});let d=!1;if(t.signal){if(t.signal.aborted)return d=!0,ne({event:"transport_abort",provider:o,phase:"pre_spawn"}),Ge(l).catch(()=>{}),r(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,ne({event:"transport_abort",provider:o}),Ge(l).catch(()=>{}),r(Object.assign(new Error("Aborted"),{usage:x.usage()}))},{once:!0})}let u="",f=!1,m=!1,p=0,h=!1,_="",g="",w,y,E=null,T=null,b=!1,A=!1,I=bk(),R=Ak();function L(){w!==void 0&&(clearTimeout(w),w=void 0)}function N(){y!==void 0&&(clearTimeout(y),y=void 0)}let k=null;function D(){return f||d||x.sawResult()}function O($){return $==="text_done"?I:R}async function v($){if($==="text_done"?w=void 0:y=void 0,D()||E!==null)return;k??=Date.now();let U=O($);if(t.holdOpen){let W=(t.holdOpen.maxHoldMs??$u)-(Date.now()-k),se=W>0?await Mu(Promise.resolve(t.holdOpen.hasOutstandingWork()).catch(()=>!1),W,t.signal):!1;if(D()||($==="text_done"?w!==void 0:y!==void 0))return;if(se===!0){ne({event:"transport_stall_grace_deferred",provider:o,grace_kind:$,grace_ms:U,reason:"outstanding_dispatched_work"}),S($);return}}T=$,E=$==="text_done"?`${o} finished responding but never emitted its closing result event (${U}ms of silence after its last message)`:`${o} went silent mid-turn and never emitted its closing result event (${U}ms of silence)`,ne({event:"transport_stall_grace_fired",provider:o,grace_kind:$,grace_ms:U}),Ge(l).catch(()=>{})}function S($){let U=setTimeout(()=>{v($)},O($));U.unref?.(),$==="text_done"?(L(),w=U):(N(),y=U)}let x=Fu({usageState:o==="claude"?G_(!!t.sessionId):void 0,onEvent:$=>{p=Date.now(),h=$.type!=="result",$.type==="system"&&$.subtype==="init"&&(g=$.session_id||g),$.type==="assistant"?(b=!Ik($),A=b&&$.message?.stop_reason==="pause_turn"):($.type==="result"||$.type==="user")&&(b=!1,A=!1),L(),o==="claude"&&b&&!A&&!x.sawResult()&&S("text_done"),N(),o==="claude"&&!x.sawResult()&&S("tool_use_silence"),t.onEvent?.($)},onText:$=>{_+=$,t.onText?.($)}});function C(){m||(m=!0,_r(t.holdOpen,{isAborted:()=>d,hasChildExited:()=>f,isTurnInFlight:()=>h,lastEventAtMs:()=>p,closeStdin:()=>{l.stdin?.end()},signal:t.signal,label:t.tool||"claude"}))}function q($){let U=x.sawResult();x.processLine($);let B=x.usage();B&&t.onUsage?.(B),!U&&x.sawResult()&&C()}l.stdout?.on("data",$=>{u+=$.toString();let U=u.split(`
1937
+ `);u=U.pop()||"";for(let B of U)q(B)});let F="";l.stderr?.on("data",$=>{F+=$.toString()}),l.on("error",$=>{ne({event:"transport_error",provider:o,error_class:"TransportConnectionError",error_message:$.message}),r(new rt(`Failed to spawn ${i}: ${$.message}`,{cause:$}))}),l.on("exit",($,U)=>{if(f=!0,L(),N(),d)return;u.trim()&&q(u);let B=x.finalize();if(B?.isError)ne({event:"transport_error",provider:o,error_class:"Error",reason:"provider_result_error",error_message:B.errorMessage}),r(Object.assign(new Error(`${o} reported an error for this turn (no assistant output)`+(t.sessionId?` \u2014 session=${t.sessionId}`:"")+`: ${B.errorMessage??"unknown error"}`),{usage:B.usage,sessionId:B.sessionId}));else if(B)kt(`stream-json: result ${B.result.slice(0,80)}${B.result.length>80?"...":""} (${B.durationMs}ms)`),n({result:B.result,sessionId:B.sessionId,durationMs:B.durationMs,numTurns:B.numTurns,usage:B.usage,exitCode:$});else if(E!==null&&T==="text_done"&&_.trim().length>0)ne({event:"transport_stall_finalized",provider:o,reason:E,text_len:_.length}),n({result:_,sessionId:g||t.sessionId||"",durationMs:Date.now()-s,numTurns:1,exitCode:$,warnings:[E]});else if(E!==null&&T==="tool_use_silence"){let W=F.trim()?`
1938
1938
  ${tt(F,{provider:o})}`:"",se=`${E} \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})`:"")+W;ne({event:"transport_error",provider:o,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:$,signal:U,stderr_summary:se}),r(new ct(se,$,U,F))}else{let W=E!==null?`${E} \u2014 and produced no usable content to fall back on`+(t.sessionId?` (session=${t.sessionId})`:"")+(F.trim()?`
1939
1939
  ${tt(F,{provider:o})}`:""):R6({tool:o,exitCode:$,signal:U,stderr:F});ne({event:"transport_error",provider:o,error_class:"Error",reason:E!==null?"provider_stalled_no_content":"provider_no_result",exit_code:$,signal:U,stderr_summary:W}),r(new ct(W,$,U,F))}});let M=JSON.stringify({type:"user",message:{role:"user",content:e}});l.stdin?.write(M+`
1940
- `),It(`stream-json: prompt sent (${e.length} chars)`)})}function x6(e){return e==="qwen"?[ju(ge,".qwen","projects")]:[ju(ge,".claude","projects")]}async function Tk(e,t,n){let r=n??x6(e),s=null;for(let a of r){let c;try{c=await I6(a)}catch{continue}for(let l of c){for(let d of[ju(a,l,`${t}.jsonl`),ju(a,l,"chats",`${t}.jsonl`)])if(Sk(d)){s=d;break}if(s!==null)break}if(s!==null)break}if(s===null)throw new Error(`stream-json bundle: no session file for session "${t}" under ${r.join(", ")} \u2014 the session must exist on disk before a bundle can resume it`);let i=(await vn(s,5).catch(()=>[])).map(a=>a?.sessionId).find(a=>typeof a=="string"&&a.length>0);if(i!==t)throw new Error(`stream-json bundle: session file ${s} header does not match the requested session (expected "${t}", header carries ${i??"no sessionId"}) \u2014 the session was likely re-seeded externally; aborting instead of writing into the wrong session`)}async function Nk(e){let{tool:t,binary:n,args:r,spawnEnv:s}=kk(e),o=vk(n,r,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:s}),i=Date.now();o.stdin?.on("error",J=>{It(`stream-json bundle: stdin pipe error, ignored (exit handler reports): ${J.message}`)});let a={exited:!1,exitCode:null,signal:null,lastEventAtMs:0,turnActive:!1,completedTurns:0,closed:!1,closing:null},c=e.sessionId||"",l=t==="claude"?G_(!!e.sessionId):void 0,d=l?.resultIds??new Set,u=null,f="";o.stderr?.on("data",J=>{f+=J.toString()});let m="",p="",h=!1,_=!1,g=null,w=null,y=null,E,T,b=bk(),A=Ak(),I=null,R=[],L=()=>a.exited?Promise.resolve():new Promise(J=>{R.push(J)}),N=()=>new ct(`stream-json bundle process (${t}) exited${a.signal!==null?` by ${a.signal}`:a.exitCode!==null?` with code ${a.exitCode}`:""} after ${a.completedTurns} completed prompt(s); the bundle cannot continue`,a.exitCode,a.signal,f);function k(){E!==void 0&&(clearTimeout(E),E=void 0)}function D(){T!==void 0&&(clearTimeout(T),T=void 0)}function O(){return a.exited||I===null||I.aborted||I.processor.sawResult()}function v(J){return J==="text_done"?b:A}async function S(J){if(J==="text_done"?E=void 0:T=void 0,O()||g!==null)return;y??=Date.now();let V=v(J);if(e.holdOpen){let X=(e.holdOpen.maxHoldMs??$u)-(Date.now()-y),Q=X>0?await Mu(Promise.resolve(e.holdOpen.hasOutstandingWork()).catch(()=>!1),X,void 0):!1;if(O()||(J==="text_done"?E!==void 0:T!==void 0))return;if(Q===!0){ne({event:"transport_stall_grace_deferred",provider:t,grace_kind:J,grace_ms:V,reason:"outstanding_dispatched_work"}),x(J);return}}w=J,g=J==="text_done"?`${t} finished responding but never emitted its closing result event (${V}ms of silence after its last message)`:`${t} went silent mid-turn and never emitted its closing result event (${V}ms of silence)`,ne({event:"transport_stall_grace_fired",provider:t,grace_kind:J,grace_ms:V}),Ge(o).catch(()=>{})}function x(J){if(e.serviceHosted)return;let V=setTimeout(()=>{S(J)},v(J));V.unref?.(),J==="text_done"?(k(),E=V):(D(),T=V)}let C=!1,q,F,M=new Promise((J,V)=>{q=J,F=V});M.catch(()=>{});let $=e.serviceHosted&&e.closeTimeoutMs===void 0?void 0:setTimeout(()=>{C||(C=!0,F(new Error(`stream-json bundle: ${t} emitted no init event within the open timeout \u2014 cannot verify the resumed session identity`)))},e.closeTimeoutMs!==void 0?Math.max(e.closeTimeoutMs,5e3):3e4);$?.unref?.();function U(J){C||(C=!0,$!==void 0&&clearTimeout($),J?F(J):q())}let B="";function W(J){if(a.lastEventAtMs=Date.now(),J.type==="system"&&J.subtype==="init"){if(l&&typeof J.model=="string"&&(l.model=J.model),p=J.session_id||p,e.sessionId&&typeof J.session_id=="string"&&J.session_id.length>0&&J.session_id!==e.sessionId){let j=new Error(`stream-json bundle: provider resumed a different session (init reported "${J.session_id}", expected "${e.sessionId}")`);U(j),Ge(o).catch(()=>{});return}U()}let V=I?.processor.sawResult()??!0;J.type==="assistant"?(h=!Ik(J),_=h&&J.message?.stop_reason==="pause_turn"):(J.type==="result"||J.type==="user")&&(h=!1,_=!1),k(),t==="claude"&&a.turnActive&&h&&!_&&!V&&x("text_done"),D(),t==="claude"&&a.turnActive&&!V&&x("tool_use_silence")}function se(){let J=I;if(J===null)return;let V=J.processor.finalize();if(V!==null){if(I=null,a.turnActive=!1,k(),D(),V.isError){ne({event:"transport_error",provider:t,error_class:"Error",reason:"provider_result_error",error_message:V.errorMessage}),J.reject(Object.assign(new Error(`${t} reported an error for this turn (no assistant output)`+(e.sessionId?` \u2014 session=${e.sessionId}`:"")+`: ${V.errorMessage??"unknown error"}`),{usage:V.usage,sessionId:V.sessionId}));return}a.completedTurns+=1,c=V.sessionId||c,It(`stream-json bundle: result ${V.result.slice(0,80)}${V.result.length>80?"...":""} (${V.durationMs}ms)`),J.resolve({result:V.result,sessionId:V.sessionId||c,durationMs:V.durationMs,numTurns:V.numTurns,usage:V.usage})}}function z(J){if(!J.trim())return;let V;try{V=JSON.parse(J)}catch{return}let j=X_(V,p||c);if(j&&d.has(j))return;let X=I;if(X===null&&j&&(d.add(j),l&&(l.cost=null)),W(V),X!==null){let Q=X.processor.sawResult();X.processor.processLine(J),X.onEventForward?.(V),!Q&&X.processor.sawResult()&&se()}}o.stdout?.on("data",J=>{B+=J.toString();let V=B.split(`
1940
+ `),kt(`stream-json: prompt sent (${e.length} chars)`)})}function x6(e){return e==="qwen"?[ju(ge,".qwen","projects")]:[ju(ge,".claude","projects")]}async function Tk(e,t,n){let r=n??x6(e),s=null;for(let a of r){let c;try{c=await I6(a)}catch{continue}for(let l of c){for(let d of[ju(a,l,`${t}.jsonl`),ju(a,l,"chats",`${t}.jsonl`)])if(Sk(d)){s=d;break}if(s!==null)break}if(s!==null)break}if(s===null)throw new Error(`stream-json bundle: no session file for session "${t}" under ${r.join(", ")} \u2014 the session must exist on disk before a bundle can resume it`);let i=(await vn(s,5).catch(()=>[])).map(a=>a?.sessionId).find(a=>typeof a=="string"&&a.length>0);if(i!==t)throw new Error(`stream-json bundle: session file ${s} header does not match the requested session (expected "${t}", header carries ${i??"no sessionId"}) \u2014 the session was likely re-seeded externally; aborting instead of writing into the wrong session`)}async function Nk(e){let{tool:t,binary:n,args:r,spawnEnv:s}=kk(e),o=vk(n,r,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:s}),i=Date.now();o.stdin?.on("error",J=>{kt(`stream-json bundle: stdin pipe error, ignored (exit handler reports): ${J.message}`)});let a={exited:!1,exitCode:null,signal:null,lastEventAtMs:0,turnActive:!1,completedTurns:0,closed:!1,closing:null},c=e.sessionId||"",l=t==="claude"?G_(!!e.sessionId):void 0,d=l?.resultIds??new Set,u=null,f="";o.stderr?.on("data",J=>{f+=J.toString()});let m="",p="",h=!1,_=!1,g=null,w=null,y=null,E,T,b=bk(),A=Ak(),I=null,R=[],L=()=>a.exited?Promise.resolve():new Promise(J=>{R.push(J)}),N=()=>new ct(`stream-json bundle process (${t}) exited${a.signal!==null?` by ${a.signal}`:a.exitCode!==null?` with code ${a.exitCode}`:""} after ${a.completedTurns} completed prompt(s); the bundle cannot continue`,a.exitCode,a.signal,f);function k(){E!==void 0&&(clearTimeout(E),E=void 0)}function D(){T!==void 0&&(clearTimeout(T),T=void 0)}function O(){return a.exited||I===null||I.aborted||I.processor.sawResult()}function v(J){return J==="text_done"?b:A}async function S(J){if(J==="text_done"?E=void 0:T=void 0,O()||g!==null)return;y??=Date.now();let V=v(J);if(e.holdOpen){let X=(e.holdOpen.maxHoldMs??$u)-(Date.now()-y),Q=X>0?await Mu(Promise.resolve(e.holdOpen.hasOutstandingWork()).catch(()=>!1),X,void 0):!1;if(O()||(J==="text_done"?E!==void 0:T!==void 0))return;if(Q===!0){ne({event:"transport_stall_grace_deferred",provider:t,grace_kind:J,grace_ms:V,reason:"outstanding_dispatched_work"}),x(J);return}}w=J,g=J==="text_done"?`${t} finished responding but never emitted its closing result event (${V}ms of silence after its last message)`:`${t} went silent mid-turn and never emitted its closing result event (${V}ms of silence)`,ne({event:"transport_stall_grace_fired",provider:t,grace_kind:J,grace_ms:V}),Ge(o).catch(()=>{})}function x(J){if(e.serviceHosted)return;let V=setTimeout(()=>{S(J)},v(J));V.unref?.(),J==="text_done"?(k(),E=V):(D(),T=V)}let C=!1,q,F,M=new Promise((J,V)=>{q=J,F=V});M.catch(()=>{});let $=e.serviceHosted&&e.closeTimeoutMs===void 0?void 0:setTimeout(()=>{C||(C=!0,F(new Error(`stream-json bundle: ${t} emitted no init event within the open timeout \u2014 cannot verify the resumed session identity`)))},e.closeTimeoutMs!==void 0?Math.max(e.closeTimeoutMs,5e3):3e4);$?.unref?.();function U(J){C||(C=!0,$!==void 0&&clearTimeout($),J?F(J):q())}let B="";function W(J){if(a.lastEventAtMs=Date.now(),J.type==="system"&&J.subtype==="init"){if(l&&typeof J.model=="string"&&(l.model=J.model),p=J.session_id||p,e.sessionId&&typeof J.session_id=="string"&&J.session_id.length>0&&J.session_id!==e.sessionId){let j=new Error(`stream-json bundle: provider resumed a different session (init reported "${J.session_id}", expected "${e.sessionId}")`);U(j),Ge(o).catch(()=>{});return}U()}let V=I?.processor.sawResult()??!0;J.type==="assistant"?(h=!Ik(J),_=h&&J.message?.stop_reason==="pause_turn"):(J.type==="result"||J.type==="user")&&(h=!1,_=!1),k(),t==="claude"&&a.turnActive&&h&&!_&&!V&&x("text_done"),D(),t==="claude"&&a.turnActive&&!V&&x("tool_use_silence")}function se(){let J=I;if(J===null)return;let V=J.processor.finalize();if(V!==null){if(I=null,a.turnActive=!1,k(),D(),V.isError){ne({event:"transport_error",provider:t,error_class:"Error",reason:"provider_result_error",error_message:V.errorMessage}),J.reject(Object.assign(new Error(`${t} reported an error for this turn (no assistant output)`+(e.sessionId?` \u2014 session=${e.sessionId}`:"")+`: ${V.errorMessage??"unknown error"}`),{usage:V.usage,sessionId:V.sessionId}));return}a.completedTurns+=1,c=V.sessionId||c,kt(`stream-json bundle: result ${V.result.slice(0,80)}${V.result.length>80?"...":""} (${V.durationMs}ms)`),J.resolve({result:V.result,sessionId:V.sessionId||c,durationMs:V.durationMs,numTurns:V.numTurns,usage:V.usage})}}function z(J){if(!J.trim())return;let V;try{V=JSON.parse(J)}catch{return}let j=X_(V,p||c);if(j&&d.has(j))return;let X=I;if(X===null&&j&&(d.add(j),l&&(l.cost=null)),W(V),X!==null){let Q=X.processor.sawResult();X.processor.processLine(J),X.onEventForward?.(V),!Q&&X.processor.sawResult()&&se()}}o.stdout?.on("data",J=>{B+=J.toString();let V=B.split(`
1941
1941
  `);B=V.pop()||"";for(let j of V)z(j)}),o.on("error",J=>{if(u=new rt(`Failed to spawn ${n}: ${J.message}`,{cause:J}),ne({event:"transport_error",provider:t,error_class:"TransportConnectionError",error_message:J.message}),U(u),I!==null){let V=I;I=null,a.turnActive=!1,V.reject(u)}}),o.on("exit",(J,V)=>{a.exited=!0,a.exitCode=J,a.signal=V,k(),D(),B.trim()&&z(B),U(a.exited&&!C?new ct(`stream-json bundle: ${t} ${V?`terminated by ${V}`:`exited (code ${String(J)})`} before its init event`,J,V):void 0);let j=I;if(j!==null&&(I=null,a.turnActive=!1,!j.aborted))if(g!==null&&w==="text_done"&&m.trim().length>0)ne({event:"transport_stall_finalized",provider:t,reason:g,text_len:m.length}),j.resolve({result:m,sessionId:p||e.sessionId||"",durationMs:Date.now()-j.startMs,numTurns:1,warnings:[g]});else if(g!==null&&w==="tool_use_silence"){let X=f.trim()?tt(f,{provider:t}):"";ne({event:"transport_error",provider:t,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:J,signal:V,...X?{stderr_summary:X}:{}}),j.reject(new ct(`${g} \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})`:"")+(X?`
1942
1942
  ${X}`:""),J,V,f))}else{let X=N(),Q=f.trim()?tt(f,{provider:t}):"";ne({event:"transport_error",provider:t,error_class:"Error",reason:g!==null?"provider_stalled_no_content":"provider_no_result",exit_code:J,signal:V,...Q?{stderr_summary:Q}:{}}),j.reject(new ct(Q?`${X.message}
1943
1943
  ${Q}`:X.message,J,V,f))}for(let X of R.splice(0))X()}),o.on("close",(J,V)=>{if(!a.exited){a.exited=!0,a.exitCode=J,a.signal=V,k(),D(),C||U(new ct(`stream-json bundle: ${t} ${V?`terminated by ${V}`:`closed (code ${String(J)})`} before its init event`,J,V));for(let j of R.splice(0))j()}});try{e.sessionId&&await Tk(t,e.sessionId,e.sessionFileRoots),await M}catch(J){let V=u??(J instanceof Error?J:new Error(String(J)));if(e.serviceHosted&&e.closeTimeoutMs===void 0)o.stdin?.end(),await L();else{let j=e.closeTimeoutMs??2e3;await Ge(o,{softDelayMs:Math.min(1e3,j),killDelayMs:Math.min(1e3,j)}).catch(()=>{})}throw V}let ue=J=>new Promise(V=>{setTimeout(V,J).unref?.()});return{tool:t,get sessionId(){return c},get completedTurns(){return a.completedTurns},async sendTurn(J,V={}){if(a.closed||a.closing!==null)throw new Error(`stream-json bundle session (${t}) is closed`);if(a.exited)throw N();if(I!==null)throw new Error(`stream-json bundle session (${t}) has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending`);let j=()=>(a.closed=!0,Ge(o).catch(()=>{}),new Error("Aborted"));if(V.signal?.aborted)throw j();if(e.sessionId&&(await Tk(t,e.sessionId,e.sessionFileRoots),a.exited))throw N();if(V.signal?.aborted)throw j();return m="",h=!1,_=!1,g=null,w=null,y=null,new Promise((X,Q)=>{let ee=Fu({usageState:l,resultIds:d,sessionId:p||c,onText:He=>{m+=He,V.onText?.(He)}}),ce={processor:ee,resolve:X,reject:Q,startMs:Date.now(),aborted:!1,onEventForward:V.onEvent};I=ce,a.turnActive=!0;let le=()=>{ce.aborted=!0,ne({event:"transport_abort",provider:t}),a.closed=!0,Ge(o).catch(()=>{}),I===ce&&(I=null,a.turnActive=!1),Q(Object.assign(new Error("Aborted"),{usage:ee.usage()}))};V.signal?.addEventListener("abort",le,{once:!0});let Ee=JSON.stringify({type:"user",message:{role:"user",content:J}});o.stdin?.write(`${Ee}
1944
- `),It(`stream-json bundle: prompt sent (${J.length} chars)`)})},close(){return a.closing!==null||(a.closing=(async()=>{if(a.closed=!0,!a.exited&&(e.holdOpen!==void 0?await new Promise(J=>{_r(e.holdOpen,{isAborted:()=>!1,hasChildExited:()=>a.exited,isTurnInFlight:()=>a.turnActive,lastEventAtMs:()=>a.lastEventAtMs,closeStdin:()=>{o.stdin?.end(),J()},label:t})}):o.stdin?.end(),!a.exited)){let J=e.closeTimeoutMs;if(J===void 0&&e.serviceHosted)await L();else{let V=J??2e3;await Promise.race([L(),ue(V)]),a.exited||await Ge(o,{stdinEnd:!1,softDelayMs:Math.min(1e3,V),killDelayMs:Math.min(1e3,V)}).catch(()=>{})}}})()),a.closing}}}import{spawn as Ck}from"node:child_process";import{createInterface as Ok}from"node:readline";import{existsSync as C6,readFileSync as O6}from"node:fs";import{fileURLToPath as D6}from"node:url";function V_(e={}){return[]}function J_(e){return e==="plan"?"read-only":"danger-full-access"}function xk(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function qu(){return{agentItems:new Map,resultText:""}}function Xi(e,t,n,r){let s=e.method;if(!s)return!1;let o=e.params;if(s==="turn/started")return t.agentItems.clear(),t.resultText="",!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,c=a==="commentary"||a==="final_answer"?a:void 0;return t.agentItems.set(i.id,{phase:c,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let c=a?t.agentItems.get(a):void 0;return c?(c.phase==="commentary"||(c.buffer+=i),n?.(i),c.phase&&o&&(o._lmctlItemPhase=c.phase)):(t.resultText+=i,n?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=t.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let c=typeof i.text=="string"?i.text:a.buffer;if(r&&typeof i.text=="string"&&i.text!==a.buffer){let l=typeof o?.threadId=="string"?o.threadId:void 0,d=typeof o?.turnId=="string"?o.turnId:void 0;r({itemId:i.id,threadId:l,turnId:d,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}t.resultText+=c}t.agentItems.delete(i.id)}return!0}return!1}return!1}function Hu(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function Lk(e){let t=e.params,n=t?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Wu(){return{pendingCodexError:null}}function Bu(e,t){let n=Lk(e);return n.willRetry||(t.pendingCodexError=n.turnError),n}function Gu(e,t){if(t.pendingCodexError){let o=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:o}}let r=e.params?.turn;if((typeof r?.status=="string"?r.status:void 0)==="failed"){let o=r?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var L6=new URL("./cli/index.js",import.meta.url).href,$6=(()=>{try{let e=new URL("../../../package.json",L6),t=JSON.parse(O6(D6(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})();function Dk(){return xk($6)}function Ps(e,t){It(`[codex:${e}] ${JSON.stringify(t)}`)}function M6(e){let t=e.stderr.trim(),n=`lmctl: codex app-server ${e.signal?`terminated by ${e.signal}`:`exited with code ${e.exitCode}`} before completing the turn.
1944
+ `),kt(`stream-json bundle: prompt sent (${J.length} chars)`)})},close(){return a.closing!==null||(a.closing=(async()=>{if(a.closed=!0,!a.exited&&(e.holdOpen!==void 0?await new Promise(J=>{_r(e.holdOpen,{isAborted:()=>!1,hasChildExited:()=>a.exited,isTurnInFlight:()=>a.turnActive,lastEventAtMs:()=>a.lastEventAtMs,closeStdin:()=>{o.stdin?.end(),J()},label:t})}):o.stdin?.end(),!a.exited)){let J=e.closeTimeoutMs;if(J===void 0&&e.serviceHosted)await L();else{let V=J??2e3;await Promise.race([L(),ue(V)]),a.exited||await Ge(o,{stdinEnd:!1,softDelayMs:Math.min(1e3,V),killDelayMs:Math.min(1e3,V)}).catch(()=>{})}}})()),a.closing}}}import{spawn as Ck}from"node:child_process";import{createInterface as Ok}from"node:readline";import{existsSync as C6,readFileSync as O6}from"node:fs";import{fileURLToPath as D6}from"node:url";function V_(e={}){return[]}function J_(e){return e==="plan"?"read-only":"danger-full-access"}function xk(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function qu(){return{agentItems:new Map,resultText:""}}function Xi(e,t,n,r){let s=e.method;if(!s)return!1;let o=e.params;if(s==="turn/started")return t.agentItems.clear(),t.resultText="",!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,c=a==="commentary"||a==="final_answer"?a:void 0;return t.agentItems.set(i.id,{phase:c,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let c=a?t.agentItems.get(a):void 0;return c?(c.phase==="commentary"||(c.buffer+=i),n?.(i),c.phase&&o&&(o._lmctlItemPhase=c.phase)):(t.resultText+=i,n?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=t.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let c=typeof i.text=="string"?i.text:a.buffer;if(r&&typeof i.text=="string"&&i.text!==a.buffer){let l=typeof o?.threadId=="string"?o.threadId:void 0,d=typeof o?.turnId=="string"?o.turnId:void 0;r({itemId:i.id,threadId:l,turnId:d,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}t.resultText+=c}t.agentItems.delete(i.id)}return!0}return!1}return!1}function Hu(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function Lk(e){let t=e.params,n=t?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Wu(){return{pendingCodexError:null}}function Bu(e,t){let n=Lk(e);return n.willRetry||(t.pendingCodexError=n.turnError),n}function Gu(e,t){if(t.pendingCodexError){let o=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:o}}let r=e.params?.turn;if((typeof r?.status=="string"?r.status:void 0)==="failed"){let o=r?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var L6=new URL("./cli/index.js",import.meta.url).href,$6=(()=>{try{let e=new URL("../../../package.json",L6),t=JSON.parse(O6(D6(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})();function Dk(){return xk($6)}function Ps(e,t){kt(`[codex:${e}] ${JSON.stringify(t)}`)}function M6(e){let t=e.stderr.trim(),n=`lmctl: codex app-server ${e.signal?`terminated by ${e.signal}`:`exited with code ${e.exitCode}`} before completing the turn.
1945
1945
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return t?`Original provider error:
1946
1946
  ${tt(t,{provider:"codex"})}
1947
1947
 
1948
- ${n}`:n}function $k(e){let t=e.binaryPath||"codex",n=["app-server","--listen","stdio://"];e.model&&n.push("-c",`model=${JSON.stringify(e.model)}`);let r=e.isLead??e.alias?.toLowerCase()==="lead",s=r?V_():[];n.push(...s),nt()&&An(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:r,injected:s.length>0}));let o=e.permissionMode??"yolo",i=J_(o);if(vt("codex",n,o),e.cwd&&!C6(e.cwd))throw ne({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),new rt(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:t,codexArgs:n,sandbox:i,permissionMode:o,spawnEnv:kt(e.env,e.cwd,e.threadId)}}function Mk(e,t){let n=t.result;if(n?.thread?.id){e.reportModel(n.thread.id,n.model);for(let r of n.thread.turns??[])e.remember(n.thread.id,r.id)}}function Pk(e,t){return new Promise((n,r)=>{let s,o,i;try{({binary:s,codexArgs:o,sandbox:i}=$k(t))}catch(L){return r(L instanceof Error?L:new Error(String(L)))}let a=Ck(s,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:kt(t.env,t.cwd,t.threadId)}),c=O_(),l=c.turn(t.threadId||""),d=L=>Object.assign(L,{usage:l.usage(),sessionId:h}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,ne({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),Ge(a).catch(()=>{}),r(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,ne({event:"transport_abort",provider:"codex"}),Ge(a).catch(()=>{}),r(d(new Error("Aborted")))},{once:!0})}let f=Ok({input:a.stdout}),m=new Map,p=1,h=t.threadId||"",_="",g=!1,w=!1,y=Date.now(),E=qu(),T=Wu();function b(L,N={}){return new Promise((k,D)=>{let O=p++;m.set(O,{resolve:k,reject:D});let v=JSON.stringify({jsonrpc:"2.0",id:O,method:L,params:N});a.stdin?.write(v+`
1948
+ ${n}`:n}function $k(e){let t=e.binaryPath||"codex",n=["app-server","--listen","stdio://"];e.model&&n.push("-c",`model=${JSON.stringify(e.model)}`);let r=e.isLead??e.alias?.toLowerCase()==="lead",s=r?V_():[];n.push(...s),nt()&&An(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:r,injected:s.length>0}));let o=e.permissionMode??"yolo",i=J_(o);if(St("codex",n,o),e.cwd&&!C6(e.cwd))throw ne({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),new rt(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:t,codexArgs:n,sandbox:i,permissionMode:o,spawnEnv:Rt(e.env,e.cwd,e.threadId)}}function Mk(e,t){let n=t.result;if(n?.thread?.id){e.reportModel(n.thread.id,n.model);for(let r of n.thread.turns??[])e.remember(n.thread.id,r.id)}}function Pk(e,t){return new Promise((n,r)=>{let s,o,i;try{({binary:s,codexArgs:o,sandbox:i}=$k(t))}catch(L){return r(L instanceof Error?L:new Error(String(L)))}let a=Ck(s,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Rt(t.env,t.cwd,t.threadId)}),c=O_(),l=c.turn(t.threadId||""),d=L=>Object.assign(L,{usage:l.usage(),sessionId:h}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,ne({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),Ge(a).catch(()=>{}),r(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,ne({event:"transport_abort",provider:"codex"}),Ge(a).catch(()=>{}),r(d(new Error("Aborted")))},{once:!0})}let f=Ok({input:a.stdout}),m=new Map,p=1,h=t.threadId||"",_="",g=!1,w=!1,y=Date.now(),E=qu(),T=Wu();function b(L,N={}){return new Promise((k,D)=>{let O=p++;m.set(O,{resolve:k,reject:D});let v=JSON.stringify({jsonrpc:"2.0",id:O,method:L,params:N});a.stdin?.write(v+`
1949
1949
  `)})}function A(L,N={}){let k=JSON.stringify({jsonrpc:"2.0",method:L,params:N});a.stdin?.write(k+`
1950
1950
  `)}f.on("line",L=>{let N;try{N=JSON.parse(L)}catch{return}if(typeof N.id=="number"&&m.has(N.id)){Mk(c,N);let v=m.get(N.id);if(m.delete(N.id),N.error){let S=N.error,x=typeof S?.message=="string"&&S.message.length>0?S.message:JSON.stringify(N.error);v.reject(xc(`codex app-server error: ${x}`,S))}else v.resolve(N);t.onEvent?.(N);return}let k=N.method;if(!k){t.onEvent?.(N);return}if(u||!l.event(N))return;let D=l.usage();if(D&&t.onUsage?.(D),k==="thread/started"){let S=N.params?.thread;S?.id&&(h=S.id,t.onSessionId?.(h))}let O=nt()?v=>{Ps("item.text/buffer-mismatch",{itemId:v.itemId,threadId:v.threadId??null,turnId:v.turnId??null,expectedFromItemText:v.expectedFromItemText,gotFromBuffer:v.gotFromBuffer,expectedLen:v.expectedFromItemText.length,gotLen:v.gotFromBuffer.length})}:void 0;if(k==="turn/started"){let v=N.params,S=v?.turn;S?.id&&(_=S.id),Xi(N,E,t.onDelta,O),nt()&&Ps("turn/started",{params:v??null})}if(nt()&&(k==="item/started"||k==="item/completed")){let v=N.params;v?.item?.type==="agentMessage"&&Ps(k,{params:v??null})}if(k==="item/started"||k==="item/agentMessage/delta"||k==="item/completed"){if(k==="item/agentMessage/delta"){let v=N.params;nt()&&Ps("agentMessage/delta",{params:v??null})}Xi(N,E,t.onDelta,O)}if(k==="turn/completed"){l.finish();let v=N.params;if(nt())for(let[x,C]of E.agentItems.entries())C.buffer&&Ps("turn/completed/unflushed-item",{itemId:x,phase:C.phase,bufferLen:C.buffer.length});Hu(E),nt()&&Ps("turn/completed",{params:v??null});let S=Gu(N,T);S.shouldReject?(nt()&&Ps("turn/completed/terminal-reject",{message:S.turnError.message}),w=!0,g=!0,a.stdin?.end(),r(d(S.turnError))):(g=!0,a.stdin?.end())}if(k==="error"){let v=Bu(N,T);if(nt()){let S=N.params,x=S?.error,C=typeof x?.message=="string"?x.message:"(no message)";Ps(v.willRetry?"error/retry":"error/terminal-deferred",{message:C,willRetry:v.willRetry,params:S??null})}}t.onEvent?.(N)});let I="";a.stderr?.on("data",L=>{I+=L.toString()});let R=L=>{ne({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:L.message});let N=new rt(`Failed to spawn codex app-server: ${L.message}`,{cause:L});for(let k of m.values())k.reject(d(N));m.clear(),r(d(N))};a.on("error",R),a.stdin?.on("error",R),a.on("exit",(L,N)=>{if(u||w)return;if(g){n({result:E.resultText,usage:l.usage(),threadId:h,turnId:_,durationMs:Date.now()-y,exitCode:L});return}if(T.pendingCodexError){r(d(T.pendingCodexError));return}let k=M6({exitCode:L,signal:N,stderr:I});ne({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:L,signal:N,stderr_summary:k}),r(d(new ct(k,L,N,I)))}),(async()=>{try{if(await b("initialize",Dk()),A("initialized",{}),t.threadId)try{let L=b("thread/resume",{threadId:t.threadId,sandbox:i,approvalPolicy:"never",...t.model?{model:t.model}:{}}),N,k=t.serviceHosted&&t.closeTimeoutMs===void 0?new Promise(()=>{}):new Promise((D,O)=>{N=setTimeout(()=>O(new Error("resume timeout")),3e4)});try{let O=(await Promise.race([L,k])).result?.thread?.id;if(t.requireResume&&O!==t.threadId)throw new Error(`thread/resume did not return the requested thread "${t.threadId}" (got "${O??"unknown"}")`)}finally{clearTimeout(N)}h=t.threadId,t.onSessionId?.(h)}catch(L){if(t.requireResume)throw L;process.stderr.write(`[codex] thread/resume failed, creating new thread
1951
- `),ne({event:"codex_thread_resume_fallback",provider:"codex",thread_id:t.threadId,error_message:L instanceof Error?L.message:String(L)});let k=(await b("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:i,...t.model?{model:t.model}:{}})).result?.thread;k?.id&&(h=k.id,t.onSessionId?.(h))}else{let N=(await b("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:i,...t.model?{model:t.model}:{}})).result?.thread;N?.id&&(h=N.id,t.onSessionId?.(h))}l=c.turn(h),await b("turn/start",{threadId:h,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(L){Ge(a).catch(()=>{}),r(L instanceof Error?L:new Error(String(L)))}})()})}async function Uk(e){let{binary:t,codexArgs:n,sandbox:r}=$k(e),s=Ck(t,n,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:kt(e.env,e.cwd,e.threadId)}),o=Date.now(),i={exited:!1,exitCode:null,signal:null,completedTurns:0,closed:!1,closing:null},a=e.threadId||"",c=O_(),l=null,d="";s.stderr?.on("data",N=>{d+=N.toString()});let u=Ok({input:s.stdout}),f=new Map,m=1;function p(N,k={}){return new Promise((D,O)=>{let v=m++;f.set(v,{resolve:D,reject:O});let S=JSON.stringify({jsonrpc:"2.0",id:v,method:N,params:k});s.stdin?.write(S+`
1951
+ `),ne({event:"codex_thread_resume_fallback",provider:"codex",thread_id:t.threadId,error_message:L instanceof Error?L.message:String(L)});let k=(await b("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:i,...t.model?{model:t.model}:{}})).result?.thread;k?.id&&(h=k.id,t.onSessionId?.(h))}else{let N=(await b("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:i,...t.model?{model:t.model}:{}})).result?.thread;N?.id&&(h=N.id,t.onSessionId?.(h))}l=c.turn(h),await b("turn/start",{threadId:h,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(L){Ge(a).catch(()=>{}),r(L instanceof Error?L:new Error(String(L)))}})()})}async function Uk(e){let{binary:t,codexArgs:n,sandbox:r}=$k(e),s=Ck(t,n,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Rt(e.env,e.cwd,e.threadId)}),o=Date.now(),i={exited:!1,exitCode:null,signal:null,completedTurns:0,closed:!1,closing:null},a=e.threadId||"",c=O_(),l=null,d="";s.stderr?.on("data",N=>{d+=N.toString()});let u=Ok({input:s.stdout}),f=new Map,m=1;function p(N,k={}){return new Promise((D,O)=>{let v=m++;f.set(v,{resolve:D,reject:O});let S=JSON.stringify({jsonrpc:"2.0",id:v,method:N,params:k});s.stdin?.write(S+`
1952
1952
  `)})}function h(N,k={}){let D=JSON.stringify({jsonrpc:"2.0",method:N,params:k});s.stdin?.write(D+`
1953
1953
  `)}let _=[],g=()=>i.exited?Promise.resolve():new Promise(N=>{_.push(N)}),w=()=>new ct(`codex bundle process exited${i.signal!==null?` by ${i.signal}`:i.exitCode!==null?` with code ${i.exitCode}`:""} after ${i.completedTurns} completed prompt(s); the bundle cannot continue`,i.exitCode,i.signal,d),y=null,E=null,T,b,A=N=>{N.turnId&&p("turn/interrupt",{threadId:a,turnId:N.turnId}).catch(()=>{})};function I(N){let k=y;k===null||k.settled||(k.settled=!0,y=null,k.usage.finish(),N&&k.reject(Object.assign(N,{usage:k.usage.usage(),sessionId:a})))}u.on("line",N=>{let k;try{k=JSON.parse(N)}catch{return}if(typeof k.id=="number"&&f.has(k.id)){Mk(c,k);let C=f.get(k.id);if(f.delete(k.id),k.error){let q=k.error,F=typeof q?.message=="string"&&q.message.length>0?q.message:JSON.stringify(k.error);C.reject(xc(`codex app-server error: ${F}`,q))}else C.resolve(k);y?.onEvent?.(k);return}let D=k.method;if(!D){y?.onEvent?.(k);return}if(D==="thread/started"){let q=k.params?.thread;q?.id&&(a=q.id,e.onSessionId?.(a))}let O=k.params,v=O?.turnId??O?.turn?.id;if(E&&(D==="turn/started"&&!E.turnId&&v&&(E.usage.bind(v),E.usage.finish(),E.turnId=v,A(E)),D==="turn/completed"&&v===E.turnId&&(c.remember(a,v),E=null,b?.()),D.startsWith("turn/")||D.startsWith("item/")||D==="error"))return;let S=y;if(v&&S?.turnId&&v!==S.turnId||S!==null&&!S.usage.event(k))return;let x=S?.usage.usage();if(x&&S?.onUsage?.(x),D==="turn/started"&&S!==null){let q=k.params?.turn;q?.id&&(S.turnId=q.id),Xi(k,S.agentState,S.onDelta,void 0)}if(S!==null&&(D==="item/started"||D==="item/agentMessage/delta"||D==="item/completed")&&Xi(k,S.agentState,S.onDelta,void 0),D==="turn/completed"&&S!==null&&!S.settled){Hu(S.agentState);let C=Gu(k,S.turnState);S.settled=!0,S.usage.finish(),y=null,C.shouldReject?S.reject(Object.assign(C.turnError,{usage:S.usage.usage(),sessionId:a})):(i.completedTurns+=1,S.resolve({text:S.agentState.resultText,usage:S.usage.usage(),sessionId:a,turnId:S.turnId,durationMs:Date.now()-S.startMs}))}D==="error"&&S!==null&&Bu(k,S.turnState),S?.onEvent?.(k)});let R=N=>{l=new rt(`Failed to spawn codex app-server: ${N.message}`,{cause:N}),ne({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:N.message});for(let k of f.values())k.reject(l);f.clear(),I(l)};s.on("error",R),s.stdin?.on("error",R),s.on("exit",(N,k)=>{i.exited=!0,b?.(),i.exitCode=N,i.signal=k;let D=w();for(let v of f.values())v.reject(D);f.clear();let O=y;if(O!==null&&!O.settled)if(O.settled=!0,O.usage.finish(),y=null,O.turnState.pendingCodexError)O.reject(Object.assign(O.turnState.pendingCodexError,{usage:O.usage.usage(),sessionId:a}));else{let v=d.trim()?tt(d,{provider:"codex"}):"";ne({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:N,signal:k,...v?{stderr_summary:v}:{}}),O.reject(Object.assign(new ct(v?`${D.message}
1954
- ${v}`:D.message,N,k,d),{usage:O.usage.usage(),sessionId:a}))}for(let v of _.splice(0))v()}),s.on("close",(N,k)=>{if(!i.exited){i.exited=!0,i.exitCode=N,i.signal=k;for(let D of _.splice(0))D()}});try{if(await p("initialize",Dk()),h("initialized",{}),e.threadId){let N;try{N=await p("thread/resume",{threadId:e.threadId,sandbox:r,approvalPolicy:"never",...e.model?{model:e.model}:{}})}catch(D){throw new Error(`Cannot resume codex thread ${e.threadId} for a bundle: ${D instanceof Error?D.message:String(D)} (the thread/start fallback is disabled in bundle mode)`)}let k=N.result?.thread;if(k?.id!==e.threadId)throw new Error(`codex thread/resume did not return the requested thread id: expected "${e.threadId}", received "${k?.id??"unknown"}"`);a=e.threadId,e.onSessionId?.(a)}else{let k=(await p("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:r,...e.model?{model:e.model}:{}})).result?.thread;k?.id&&(a=k.id,e.onSessionId?.(a))}}catch(N){let k=l??(N instanceof Error?N:new Error(String(N)));if(e.serviceHosted&&e.closeTimeoutMs===void 0)s.stdin?.end(),await g();else{let D=e.closeTimeoutMs??2e3;await Ge(s,{softDelayMs:Math.min(1e3,D),killDelayMs:Math.min(1e3,D)}).catch(()=>{})}throw k}let L=N=>new Promise(k=>{setTimeout(k,N).unref?.()});return{provider:"codex",get sessionId(){return a},get completedTurns(){return i.completedTurns},async sendTurn(N,k={}){if(T&&await T,i.closed||i.closing!==null)throw new Error("codex bundle session is closed");if(i.exited)throw w();if(y!==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(k.signal?.aborted)throw new Error("Aborted");return new Promise((D,O)=>{let v={usage:c.turn(a),onUsage:k.onUsage,agentState:qu(),turnState:Wu(),resolve:D,reject:O,startMs:Date.now(),turnId:"",onDelta:k.onDelta,onEvent:k.onEvent,settled:!1};y=v;let S=()=>{v.settled||(v.settled=!0,y=null,E=v,T=new Promise(x=>{b=x}),A(v),k.signal?.removeEventListener("abort",S),v.usage.finish(),O(Object.assign(new Error("Aborted"),{usage:v.usage.usage(),sessionId:a})))};k.signal?.addEventListener("abort",S,{once:!0}),p("turn/start",{threadId:a,input:[{type:"text",text:N}],...e.model?{model:e.model}:{}}).then(x=>{v.usage.bind(x.result?.turn?.id)}).catch(x=>{if(v.settled){E===v&&(E=null,b?.());return}v.settled=!0,y=null,k.signal?.removeEventListener("abort",S),v.usage.finish(),O(Object.assign(i.exited?w():x instanceof Error?x:new Error(String(x)),{usage:v.usage.usage(),sessionId:a}))})})},close(){return i.closing!==null||(i.closing=(async()=>{if(i.closed=!0,b?.(),!i.exited&&(e.holdOpen!==void 0?await new Promise(N=>{_r(e.holdOpen,{isAborted:()=>!1,hasChildExited:()=>i.exited,isTurnInFlight:()=>y!==null,lastEventAtMs:()=>o,closeStdin:()=>{s.stdin?.end(),N()},label:"codex"})}):s.stdin?.end(),!i.exited)){let N=e.closeTimeoutMs;if(N===void 0&&e.serviceHosted)await g();else{let k=N??2e3;await Promise.race([g(),L(k)]),i.exited||await Ge(s,{stdinEnd:!1,softDelayMs:Math.min(1e3,k),killDelayMs:Math.min(1e3,k)}).catch(()=>{})}}})()),i.closing}}}import{spawn as sR}from"node:child_process";import{existsSync as dY}from"node:fs";var jk="(?:png|jpe?g|webp|heic|pdf)",P6=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${jk}\\s*`,"gi"),U6=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${jk}\\s*`,"i"),F6=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,j6=/^STANCE:\s+\S+\s*$/gim,q6=/\[Thought:\s*true\]\s*/gi;function Xu(e){let t=[...e.matchAll(P6)];if(t.length>0){let n=t[t.length-1],r=(n.index??0)+n[0].length;return Fk(e.slice(r).trimStart())}return Fk(H6(e.replace(U6,"")))}function H6(e){let t=F6.exec(e);if(t===null)return e;let n=e.slice(t[0].length),r=[...n.matchAll(j6)];if(r.length<2)return e;let s=r[0],o=(s.index??0)+s[0].length;return n.slice(o).trimStart()}function Fk(e){let t=[...e.matchAll(q6)];if(t.length===0)return e;let n=t[t.length-1],r=(n.index??0)+n[0].length;return e.slice(r).trimStart()}function Gr(e,t=""){let n=e.result;return typeof n?.sessionId=="string"&&n.sessionId.length>0?n.sessionId:t}function qk(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}var W6=new Set(["agent_message_chunk","agent_thought_chunk","tool_call","tool_call_update","plan"]);function Vu(e={}){let t="",n="",r="",s=!1,o=!1,i=!1,a=e.isolateResult??(e.tool==="gemini"?Xu:void 0),c=()=>({result:a?a(n):n,sessionId:t,stopReason:r,sawActivity:i});return{setSessionId(l){t=l},beginTurn(){n="",r="",s=!1,o=!0,i=!1},completeTurn(l){return r=qk(l),s=!0,o=!1,c()},cancelTurn(){n="",r="",o=!1},processMessage(l){if(l.method!=="session/update")return!1;let u=l.params?.update,f=u?.sessionUpdate;if(typeof f!="string"||(o&&W6.has(f)&&(i=!0),f!=="agent_message_chunk"))return!1;let m=u?.content,p=typeof m?.text=="string"?m.text:"";return p&&o&&(n+=p,e.onDelta?.(p)),!0},finalize(){return s?c():null}}}var Ju={name:"miniplayer",binary:"miniplayer",baseArgs:["acp"],argv:e=>{if(e.permissionMode==="plan")throw new Error("miniplayer has no plan mode; its native tools always have full permissions");return["acp",...e.model?["-m",e.model]:[]]}};import{readFileSync as B6,readdirSync as Hk}from"node:fs";import{join as Yu}from"node:path";function Wk(e,t){let n=t.GEMINI_DIR??process.env.GEMINI_DIR??Yu(ge,".gemini"),r=Yu(n,"tmp"),s;try{s=Hk(r)}catch{throw new Error(`gemini bundle: cannot read the gemini session store at ${r} \u2014 cannot verify session "${e}"`)}let o=`"sessionId": "${e}"`,i=`"sessionId":"${e}"`;for(let a of s){let c=Yu(r,a,"chats"),l;try{l=Hk(c)}catch{continue}for(let d of l){if(!d.endsWith(".json"))continue;let u;try{u=B6(Yu(c,d),"utf8").slice(0,8192)}catch{continue}if(u.includes(o)||u.includes(i))return}}throw new Error(`gemini bundle: no session "${e}" in the gemini chats store (${r}) \u2014 the session must exist on disk before a bundle can resume it`)}var Cc={name:"gemini",binary:"gemini",baseArgs:["--acp","-y","--skip-trust"],argv(e){let t=[...Cc.baseArgs];if(e.permissionMode==="plan"){let n=Ms("gemini","plan"),r=Ms("gemini","yolo");t=t.filter(s=>!(r??[]).includes(s)),n&&t.push(...n)}return e.model&&t.push("--model",e.model),t},isolateResult:Xu,sessionIdentity:{verifyLoadedSession:e=>{Wk(e.requestedSessionId,e.env)},recheckSession:e=>{Wk(e.requestedSessionId,e.env)}}};import{existsSync as G6,readFileSync as X6}from"node:fs";import{join as Y_}from"node:path";function Bk(e,t){let n=t.COPILOT_HOME??process.env.COPILOT_HOME??Y_(ge,".copilot"),r=Y_(n,"session-state",e),s=Y_(r,"workspace.yaml");if(!G6(s))throw new Error(`copilot bundle: no session "${e}" in the copilot session store (${r}) \u2014 the session must exist on disk before a bundle can resume it`);let o;try{o=X6(s,"utf8").slice(0,4096)}catch(a){throw new Error(`copilot bundle: cannot read ${s} \u2014 cannot verify session "${e}": `+(a instanceof Error?a.message:String(a)))}let i=/^id:\s*(\S+)\s*$/m.exec(o);if(i===null||i[1]!==e)throw new Error(`copilot bundle: session store entry ${s} belongs to ${i?.[1]??"no recorded id"}, not "${e}"`)}var Oc={name:"copilot",binary:"copilot",baseArgs:["--acp","--yolo"],argv(e){return e.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.
1954
+ ${v}`:D.message,N,k,d),{usage:O.usage.usage(),sessionId:a}))}for(let v of _.splice(0))v()}),s.on("close",(N,k)=>{if(!i.exited){i.exited=!0,i.exitCode=N,i.signal=k;for(let D of _.splice(0))D()}});try{if(await p("initialize",Dk()),h("initialized",{}),e.threadId){let N;try{N=await p("thread/resume",{threadId:e.threadId,sandbox:r,approvalPolicy:"never",...e.model?{model:e.model}:{}})}catch(D){throw new Error(`Cannot resume codex thread ${e.threadId} for a bundle: ${D instanceof Error?D.message:String(D)} (the thread/start fallback is disabled in bundle mode)`)}let k=N.result?.thread;if(k?.id!==e.threadId)throw new Error(`codex thread/resume did not return the requested thread id: expected "${e.threadId}", received "${k?.id??"unknown"}"`);a=e.threadId,e.onSessionId?.(a)}else{let k=(await p("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:r,...e.model?{model:e.model}:{}})).result?.thread;k?.id&&(a=k.id,e.onSessionId?.(a))}}catch(N){let k=l??(N instanceof Error?N:new Error(String(N)));if(e.serviceHosted&&e.closeTimeoutMs===void 0)s.stdin?.end(),await g();else{let D=e.closeTimeoutMs??2e3;await Ge(s,{softDelayMs:Math.min(1e3,D),killDelayMs:Math.min(1e3,D)}).catch(()=>{})}throw k}let L=N=>new Promise(k=>{setTimeout(k,N).unref?.()});return{provider:"codex",get sessionId(){return a},get completedTurns(){return i.completedTurns},async sendTurn(N,k={}){if(T&&await T,i.closed||i.closing!==null)throw new Error("codex bundle session is closed");if(i.exited)throw w();if(y!==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(k.signal?.aborted)throw new Error("Aborted");return new Promise((D,O)=>{let v={usage:c.turn(a),onUsage:k.onUsage,agentState:qu(),turnState:Wu(),resolve:D,reject:O,startMs:Date.now(),turnId:"",onDelta:k.onDelta,onEvent:k.onEvent,settled:!1};y=v;let S=()=>{v.settled||(v.settled=!0,y=null,E=v,T=new Promise(x=>{b=x}),A(v),k.signal?.removeEventListener("abort",S),v.usage.finish(),O(Object.assign(new Error("Aborted"),{usage:v.usage.usage(),sessionId:a})))};k.signal?.addEventListener("abort",S,{once:!0}),p("turn/start",{threadId:a,input:[{type:"text",text:N}],...e.model?{model:e.model}:{}}).then(x=>{v.usage.bind(x.result?.turn?.id)}).catch(x=>{if(v.settled){E===v&&(E=null,b?.());return}v.settled=!0,y=null,k.signal?.removeEventListener("abort",S),v.usage.finish(),O(Object.assign(i.exited?w():x instanceof Error?x:new Error(String(x)),{usage:v.usage.usage(),sessionId:a}))})})},close(){return i.closing!==null||(i.closing=(async()=>{if(i.closed=!0,b?.(),!i.exited&&(e.holdOpen!==void 0?await new Promise(N=>{_r(e.holdOpen,{isAborted:()=>!1,hasChildExited:()=>i.exited,isTurnInFlight:()=>y!==null,lastEventAtMs:()=>o,closeStdin:()=>{s.stdin?.end(),N()},label:"codex"})}):s.stdin?.end(),!i.exited)){let N=e.closeTimeoutMs;if(N===void 0&&e.serviceHosted)await g();else{let k=N??2e3;await Promise.race([g(),L(k)]),i.exited||await Ge(s,{stdinEnd:!1,softDelayMs:Math.min(1e3,k),killDelayMs:Math.min(1e3,k)}).catch(()=>{})}}})()),i.closing}}}import{spawn as sR}from"node:child_process";import{existsSync as dY}from"node:fs";var jk="(?:png|jpe?g|webp|heic|pdf)",P6=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${jk}\\s*`,"gi"),U6=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${jk}\\s*`,"i"),F6=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,j6=/^STANCE:\s+\S+\s*$/gim,q6=/\[Thought:\s*true\]\s*/gi;function Xu(e){let t=[...e.matchAll(P6)];if(t.length>0){let n=t[t.length-1],r=(n.index??0)+n[0].length;return Fk(e.slice(r).trimStart())}return Fk(H6(e.replace(U6,"")))}function H6(e){let t=F6.exec(e);if(t===null)return e;let n=e.slice(t[0].length),r=[...n.matchAll(j6)];if(r.length<2)return e;let s=r[0],o=(s.index??0)+s[0].length;return n.slice(o).trimStart()}function Fk(e){let t=[...e.matchAll(q6)];if(t.length===0)return e;let n=t[t.length-1],r=(n.index??0)+n[0].length;return e.slice(r).trimStart()}function Xr(e,t=""){let n=e.result;return typeof n?.sessionId=="string"&&n.sessionId.length>0?n.sessionId:t}function qk(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}var W6=new Set(["agent_message_chunk","agent_thought_chunk","tool_call","tool_call_update","plan"]);function Vu(e={}){let t="",n="",r="",s=!1,o=!1,i=!1,a=e.isolateResult??(e.tool==="gemini"?Xu:void 0),c=()=>({result:a?a(n):n,sessionId:t,stopReason:r,sawActivity:i});return{setSessionId(l){t=l},beginTurn(){n="",r="",s=!1,o=!0,i=!1},completeTurn(l){return r=qk(l),s=!0,o=!1,c()},cancelTurn(){n="",r="",o=!1},processMessage(l){if(l.method!=="session/update")return!1;let u=l.params?.update,f=u?.sessionUpdate;if(typeof f!="string"||(o&&W6.has(f)&&(i=!0),f!=="agent_message_chunk"))return!1;let m=u?.content,p=typeof m?.text=="string"?m.text:"";return p&&o&&(n+=p,e.onDelta?.(p)),!0},finalize(){return s?c():null}}}var Ju={name:"miniplayer",binary:"miniplayer",baseArgs:["acp"],argv:e=>{if(e.permissionMode==="plan")throw new Error("miniplayer has no plan mode; its native tools always have full permissions");return["acp",...e.model?["-m",e.model]:[]]}};import{readFileSync as B6,readdirSync as Hk}from"node:fs";import{join as Yu}from"node:path";function Wk(e,t){let n=t.GEMINI_DIR??process.env.GEMINI_DIR??Yu(ge,".gemini"),r=Yu(n,"tmp"),s;try{s=Hk(r)}catch{throw new Error(`gemini bundle: cannot read the gemini session store at ${r} \u2014 cannot verify session "${e}"`)}let o=`"sessionId": "${e}"`,i=`"sessionId":"${e}"`;for(let a of s){let c=Yu(r,a,"chats"),l;try{l=Hk(c)}catch{continue}for(let d of l){if(!d.endsWith(".json"))continue;let u;try{u=B6(Yu(c,d),"utf8").slice(0,8192)}catch{continue}if(u.includes(o)||u.includes(i))return}}throw new Error(`gemini bundle: no session "${e}" in the gemini chats store (${r}) \u2014 the session must exist on disk before a bundle can resume it`)}var Cc={name:"gemini",binary:"gemini",baseArgs:["--acp","-y","--skip-trust"],argv(e){let t=[...Cc.baseArgs];if(e.permissionMode==="plan"){let n=Ms("gemini","plan"),r=Ms("gemini","yolo");t=t.filter(s=>!(r??[]).includes(s)),n&&t.push(...n)}return e.model&&t.push("--model",e.model),t},isolateResult:Xu,sessionIdentity:{verifyLoadedSession:e=>{Wk(e.requestedSessionId,e.env)},recheckSession:e=>{Wk(e.requestedSessionId,e.env)}}};import{existsSync as G6,readFileSync as X6}from"node:fs";import{join as Y_}from"node:path";function Bk(e,t){let n=t.COPILOT_HOME??process.env.COPILOT_HOME??Y_(ge,".copilot"),r=Y_(n,"session-state",e),s=Y_(r,"workspace.yaml");if(!G6(s))throw new Error(`copilot bundle: no session "${e}" in the copilot session store (${r}) \u2014 the session must exist on disk before a bundle can resume it`);let o;try{o=X6(s,"utf8").slice(0,4096)}catch(a){throw new Error(`copilot bundle: cannot read ${s} \u2014 cannot verify session "${e}": `+(a instanceof Error?a.message:String(a)))}let i=/^id:\s*(\S+)\s*$/m.exec(o);if(i===null||i[1]!==e)throw new Error(`copilot bundle: session store entry ${s} belongs to ${i?.[1]??"no recorded id"}, not "${e}"`)}var Oc={name:"copilot",binary:"copilot",baseArgs:["--acp","--yolo"],argv(e){return e.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.
1955
1955
  `),ne({event:"acp_plan_mode_unsupported",provider:"copilot",requested_mode:"plan",effective_mode:"yolo"})),e.model&&(process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1956
1956
  `),ne({event:"acp_model_unsupported",provider:"copilot",model:e.model})),[...Oc.baseArgs]},yoloAssertion:"always-yolo",sessionIdentity:{verifyLoadedSession:e=>{Bk(e.requestedSessionId,e.env)},recheckSession:e=>{Bk(e.requestedSessionId,e.env)}}};import{spawn as nY}from"node:child_process";import{resolve as eR}from"node:path";import{existsSync as V6,mkdirSync as J6,readFileSync as Y6,writeFileSync as Gk}from"node:fs";import{join as Xk,resolve as yEe}from"node:path";var Vk={yellow:e=>e};function K6(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Jk(e,t={}){let n=Xk(e,".opencode"),r=Xk(n,"opencode.json");if(!V6(r)){J6(n,{recursive:!0});let i=JSON.stringify({permission:"allow"},null,2);return Gk(r,i+`
1957
1957
  `,"utf-8"),!0}let s;try{s=JSON.parse(Y6(r,"utf-8"))}catch{return console.log(Vk.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Vk.yellow(` .opencode/opencode.json at ${r} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;return s.permission===void 0&&(s.permission="allow",o=!0),K6(s.permission)||ne({event:"opencode_yolo_override",provider:"opencode",config_path:r,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),o&&Gk(r,JSON.stringify(s,null,2)+`
@@ -1969,19 +1969,19 @@ ${v}`:D.message,N,k,d),{usage:O.usage.usage(),sessionId:a}))}for(let v of _.spli
1969
1969
  WHERE s.id LIKE ?
1970
1970
  ORDER BY s.time_updated DESC
1971
1971
  LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}};function eg(e,t){let n=t?.dbPath!==void 0?[t.dbPath]:Zk();for(let r of n){if(!z_(r))continue;let s=new(Q_())(r,{open:!0,readOnly:!0});try{s.exec("PRAGMA busy_timeout = 5000");let o=s.prepare("SELECT directory FROM session WHERE id = ?").get(e);if(o!==void 0)return{directory:typeof o.directory=="string"?o.directory:""}}finally{s.close()}}return null}function Dc(e){return{id:e.id,onFailure:"non-fatal",applies:t=>e.value(t)!==void 0,run:async t=>{await t.sendRpc("session/set_config_option",{sessionId:t.sessionId,configId:e.configId,value:e.value(t)})},describeFailure:(t,n)=>{let r=e.value(t),s=n instanceof Error?n.message:String(n);return{event:"acp_config_option_failed",fields:{config_id:e.configId,value:r,error_message:s},stderrLine:`[acp] set_config_option(${e.configId}=${r}) failed: ${s}
1972
- `,warning:`${e.provider} ignored ${e.configId}=${r}: ${s}`,message:s}},successLog:t=>`acp: set_config_option(${e.configId}=${e.value(t)}) ok`}}var Fo={name:"opencode",binary:"opencode",baseArgs:["acp"],argv:()=>[...Fo.baseArgs],preSpawn(e){try{Jk(e.cwd)}catch(t){ne({event:"opencode_config_install_failed",cwd:e.cwd,error_message:t instanceof Error?t.message:String(t)})}},sessionSetup:[Dc({id:"model",provider:"opencode",configId:"model",value:e=>e.model}),Dc({id:"effort",provider:"opencode",configId:"effort",value:e=>e.effort})],probe:tR,sessionIdentity:{verifyLoadedSession:e=>{let t=eg(e.requestedSessionId,{...e.env.OPENCODE_DB!==void 0?{dbPath:e.env.OPENCODE_DB}:{}});if(t===null)throw new Error(`opencode bundle: no session "${e.requestedSessionId}" in the opencode session store \u2014 the session must exist on disk before a bundle can resume it`);if(eR(t.directory)!==eR(e.cwd))throw new Error(`opencode bundle: session "${e.requestedSessionId}" belongs to ${t.directory}, not ${e.cwd} \u2014 refusing to resume another workspace's session`)},recheckSession:e=>{if(eg(e.requestedSessionId,{...e.env.OPENCODE_DB!==void 0?{dbPath:e.env.OPENCODE_DB}:{}})===null)throw new Error(`opencode bundle: session "${e.requestedSessionId}" disappeared from the session store mid-bundle`)}}};function tR(e){let t;try{t=nY(e.binaryPath??Fo.binary,[...Fo.baseArgs],{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:kt(e.env,e.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=$s(t,{provider:"opencode"}),r=e.timeoutMs??5e3;return new Promise(s=>{let o=!1,i=(d,u=!0)=>{if(!o){if(o=!0,clearTimeout(l),t.removeListener("error",a),t.removeListener("exit",c),n.close(),!u){s(d);return}Ge(t,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{i({status:"unavailable",reason:"spawn",error:d.message},!1)},c=(d,u)=>{i({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};t.once("error",a),t.once("exit",c);let l=setTimeout(()=>{i({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let d=await n.sendRpc("session/new",{cwd:e.cwd,mcpServers:[]}),u=Gr(d);try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:e.model})}catch(f){i({status:"rejected",option:"model",value:e.model,error:f instanceof Error?f.message:String(f)});return}if(e.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:e.effort})}catch(f){i({status:"rejected",option:"effort",value:e.effort,error:f instanceof Error?f.message:String(f)});return}i({status:"verified"})}catch(d){i({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}import{existsSync as rY}from"node:fs";import{readdir as sY}from"node:fs/promises";import{join as tg,resolve as oY}from"node:path";var iY=/runtime\s+\S+\s+does not exist in workspace\s+\S+/;function rR(e){let t=iY.exec(e);return t?t[0]:null}function aY(e){if(!e.includes("notifications/initialized"))return e;let t=e.split(/\r?\n/),n=[];for(let r=0;r<t.length;r++){let s=t[r];if(s.includes("Error handling notification")&&s.includes("notifications/initialized")){let o=[s],i=r;for(;i+1<t.length&&o.length<8&&(i++,o.push(t[i]),t[i].trim()!=="}"););let a=o.join(`
1972
+ `,warning:`${e.provider} ignored ${e.configId}=${r}: ${s}`,message:s}},successLog:t=>`acp: set_config_option(${e.configId}=${e.value(t)}) ok`}}var Fo={name:"opencode",binary:"opencode",baseArgs:["acp"],argv:()=>[...Fo.baseArgs],preSpawn(e){try{Jk(e.cwd)}catch(t){ne({event:"opencode_config_install_failed",cwd:e.cwd,error_message:t instanceof Error?t.message:String(t)})}},sessionSetup:[Dc({id:"model",provider:"opencode",configId:"model",value:e=>e.model}),Dc({id:"effort",provider:"opencode",configId:"effort",value:e=>e.effort})],probe:tR,sessionIdentity:{verifyLoadedSession:e=>{let t=eg(e.requestedSessionId,{...e.env.OPENCODE_DB!==void 0?{dbPath:e.env.OPENCODE_DB}:{}});if(t===null)throw new Error(`opencode bundle: no session "${e.requestedSessionId}" in the opencode session store \u2014 the session must exist on disk before a bundle can resume it`);if(eR(t.directory)!==eR(e.cwd))throw new Error(`opencode bundle: session "${e.requestedSessionId}" belongs to ${t.directory}, not ${e.cwd} \u2014 refusing to resume another workspace's session`)},recheckSession:e=>{if(eg(e.requestedSessionId,{...e.env.OPENCODE_DB!==void 0?{dbPath:e.env.OPENCODE_DB}:{}})===null)throw new Error(`opencode bundle: session "${e.requestedSessionId}" disappeared from the session store mid-bundle`)}}};function tR(e){let t;try{t=nY(e.binaryPath??Fo.binary,[...Fo.baseArgs],{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Rt(e.env,e.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=$s(t,{provider:"opencode"}),r=e.timeoutMs??5e3;return new Promise(s=>{let o=!1,i=(d,u=!0)=>{if(!o){if(o=!0,clearTimeout(l),t.removeListener("error",a),t.removeListener("exit",c),n.close(),!u){s(d);return}Ge(t,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{i({status:"unavailable",reason:"spawn",error:d.message},!1)},c=(d,u)=>{i({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};t.once("error",a),t.once("exit",c);let l=setTimeout(()=>{i({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let d=await n.sendRpc("session/new",{cwd:e.cwd,mcpServers:[]}),u=Xr(d);try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:e.model})}catch(f){i({status:"rejected",option:"model",value:e.model,error:f instanceof Error?f.message:String(f)});return}if(e.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:e.effort})}catch(f){i({status:"rejected",option:"effort",value:e.effort,error:f instanceof Error?f.message:String(f)});return}i({status:"verified"})}catch(d){i({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}import{existsSync as rY}from"node:fs";import{readdir as sY}from"node:fs/promises";import{join as tg,resolve as oY}from"node:path";var iY=/runtime\s+\S+\s+does not exist in workspace\s+\S+/;function rR(e){let t=iY.exec(e);return t?t[0]:null}function aY(e){if(!e.includes("notifications/initialized"))return e;let t=e.split(/\r?\n/),n=[];for(let r=0;r<t.length;r++){let s=t[r];if(s.includes("Error handling notification")&&s.includes("notifications/initialized")){let o=[s],i=r;for(;i+1<t.length&&o.length<8&&(i++,o.push(t[i]),t[i].trim()!=="}"););let a=o.join(`
1973
1973
  `);if(/\bcode:\s*-32601\b/.test(a)&&/Method not found[^]*notifications\/initialized/.test(a)){r=i;continue}}n.push(s)}return n.join(`
1974
1974
  `)}var ng=e=>e.permissionMode==="plan"?"plan":"auto";async function nR(e,t){let n=oY(t.KIMI_CODE_HOME??process.env.KIMI_CODE_HOME??tg(ge,".kimi-code")),r=tg(n,"sessions"),s;try{s=await sY(r,{withFileTypes:!0})}catch{throw new Error(`kimi bundle: cannot read the kimi session store at ${r} \u2014 cannot verify session "${e}"`)}for(let o of s)if(o.isDirectory()&&rY(tg(r,o.name,e,"agents","main","wire.jsonl")))return;throw new Error(`kimi bundle: no session "${e}" in the kimi session store (${r}) \u2014 the session must exist on disk before a bundle can resume it`)}var $c={name:"kimi",binary:"kimi",baseArgs:["acp"],argv:()=>[...$c.baseArgs],sessionSetup:[{id:"permission-mode",onFailure:"fail-closed",applies:()=>!0,run:async e=>{await e.sendRpc("session/set_config_option",{sessionId:e.sessionId,configId:"mode",value:ng(e)})},describeFailure:(e,t)=>{let n=ng(e),r=t instanceof Error?t.message:String(t);return{event:"acp_permission_mode_failed",fields:{config_id:"mode",value:n,error_message:r},message:`Cannot set Kimi ACP permission mode to ${n}: ${r}`}},successLog:e=>`acp: set_config_option(mode=${ng(e)}) ok`},Dc({id:"model",provider:"kimi",configId:"model",value:e=>e.model})],onExitFinalization(e){let t=rR(e.result);t!==null&&ne({event:"kimi_runtime_dead",provider:"kimi",session_id:e.sessionId,matched_text:t})},filterExpectedStderr:aY,sessionIdentity:{verifyLoadedSession:async e=>{await nR(e.requestedSessionId,e.env)},recheckSession:async e=>{await nR(e.requestedSessionId,e.env)}}};var Mc={name:"hermes",binary:"hermes",baseArgs:["acp"],argv(e){if(e.permissionMode==="plan")throw new Error('provider "hermes" does not support --permission-mode plan');return[...Mc.baseArgs]},preSpawn(e){e.permissionMode==="yolo"&&(e.env.HERMES_YOLO_MODE="1")},modeVocabulary:{known:["default","accept_edits","dont_ask"],selectable:["accept_edits","dont_ask"]},sessionSetup:[{id:"session-mode",onFailure:"fail-closed",applies:e=>e.acpMode!==void 0,run:async e=>{await e.sendRpc("session/set_mode",{sessionId:e.sessionId,modeId:e.acpMode})},describeFailure:(e,t)=>{let n=t instanceof Error?t.message:String(t);return{event:"acp_session_mode_failed",fields:{mode_id:e.acpMode,error_message:n},message:`Cannot set hermes ACP session mode to ${String(e.acpMode)}: ${n}`}},successLog:e=>`acp: set_mode(modeId=${String(e.acpMode)}) ok`},{id:"model",onFailure:"fail-closed",applies:e=>{if(e.model===void 0)return!1;let t=e.response.result?.models?.currentModelId;return e.model!==t},run:async e=>{await e.sendRpc("session/set_model",{sessionId:e.sessionId,modelId:e.model})},describeFailure:(e,t)=>{let n=t instanceof Error?t.message:String(t);return{event:"acp_config_option_failed",fields:{config_id:"model",value:e.model,error_message:n},stderrLine:`[acp] set_model(modelId=${String(e.model)}) failed: ${n}
1975
1975
  `,message:`Cannot set Hermes ACP model to ${String(e.model)}: ${n}`}},successLog:e=>`acp: set_model(modelId=${String(e.model)}) ok`}],sessionIdentity:{verifyLoadedSession:()=>{}}};var cY={miniplayer:Ju,gemini:Cc,copilot:Oc,opencode:Fo,kimi:$c,hermes:Mc};function Pc(e){return cY[e]}var lY={miniplayer:{binary:Ju.binary,args:Ju.baseArgs},gemini:{binary:Cc.binary,args:Cc.baseArgs},copilot:{binary:Oc.binary,args:Oc.baseArgs},opencode:{binary:Fo.binary,args:Fo.baseArgs},kimi:{binary:$c.binary,args:$c.baseArgs},hermes:{binary:Mc.binary,args:Mc.baseArgs}};function oR(e,t){let n=Pc(e)?.modeVocabulary;if(!n)throw new rt(`ACP mode "${t}" requested for provider "${e}", which declares no ACP mode vocabulary. Add the provider's mode ids to its AcpProviderProfile modeVocabulary before setting a mode.`);if(!n.known.includes(t))throw new rt(`provider "${e}" has no ACP mode "${t}" (known: ${n.known.join(", ")}).`);if(!n.selectable.includes(t))throw new rt(`provider "${e}" ACP mode "${t}" is not selectable by lmctl (selectable: ${n.selectable.join(", ")}).`)}function uY(e){let t=e.stderr.trim(),n=`lmctl: ${e.tool} ACP process ${e.signal?`terminated by ${e.signal}`:`exited with code ${e.exitCode}`} before completing the prompt.
1976
1976
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return t?`Original provider error:
1977
1977
  ${tt(t,{provider:e.tool,...e.fullOutput===void 0?{}:{fullOutput:e.fullOutput}})}
1978
1978
 
1979
- ${n}`:n}function fY(e,t){return Pc(e)?.filterExpectedStderr?.(t)??t}function iR(e){if(e.method!=="session/update")return!1;let n=e.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}async function aR(e,t,n,r){for(let s of e.sessionSetup??[]){let o={...t,sessionId:n.sessionId,response:n.response,sendRpc:r};if(s.applies(o))try{await s.run(o),s.successLog&&It(s.successLog(o))}catch(i){let a=s.describeFailure(o,i);if(ne({event:a.event,provider:e.name,...a.fields}),a.stderrLine&&process.stderr.write(a.stderrLine),a.warning&&t.warnings.push(a.warning),s.onFailure==="fail-closed")throw new Error(a.message)}}}function cR(e,t,n){let r=kt(t.env,t.cwd,t.sessionId);e.preSpawn?.({...n,cwd:t.cwd,env:r});let s=t.binaryPath||e.binary,o=e.argv(n),i=e.yoloAssertion==="always-yolo"?"yolo":n.permissionMode;if(vt(t.tool,o,i),t.cwd&&!dY(t.cwd))throw ne({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),new rt(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:s,spawnArgs:o,spawnEnv:r}}async function lR(e){let{sendRpc:t,sendNotification:n,opts:r,outputProcessor:s}=e,o=e.strictSessionIdentity===!0,i=await t("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}});n("notifications/initialized");let a=r.sessionId||"",c;if(r.sessionId){let l;try{if(i.result?.agentCapabilities?.loadSession===!1)throw new Error("provider advertises loadSession=false");l=await t("session/load",{sessionId:r.sessionId,cwd:r.cwd,mcpServers:[]})}catch(u){if(o||r.requireResume)throw new Error(`Cannot resume session ${r.sessionId} via ACP: ${u instanceof Error?u.message:String(u)}`);process.stderr.write(`[acp] session/load failed for ${r.sessionId}, creating new session
1980
- `),ne({event:"acp_session_resume_fallback",provider:r.tool,session_id:r.sessionId,error_message:u instanceof Error?u.message:String(u)});let f=await t("session/new",{cwd:r.cwd,mcpServers:[]});return a=Gr(f),s.setSessionId(a),{sessionId:a,sessionResponse:f}}let d=Gr(l);if(r.requireResume&&d!==""&&d!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${d}"`);if(o){let u=Gr(l);if(u!==""&&u!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${u}"`);if(u===""){if(e.verifyLoadResponse===void 0)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received none`);await e.verifyLoadResponse(l)}a=r.sessionId}else a=Gr(l,r.sessionId);c=l,s.setSessionId(a)}else{let l=await t("session/new",{cwd:r.cwd,mcpServers:[]});a=Gr(l),c=l,s.setSessionId(a)}return{sessionId:a,sessionResponse:c}}function dR(e,t){let n=Pc(t.tool);if(!n)return Promise.reject(new Error(`No ACP config for tool "${t.tool}"`));if(t.acpMode!==void 0)try{oR(t.tool,t.acpMode)}catch(r){return Promise.reject(r)}return new Promise((r,s)=>{let o=t.permissionMode??"yolo",i=[],a={permissionMode:o,...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:I=>{i.push(I)}}},c,l,d;try{({binary:c,spawnArgs:l,spawnEnv:d}=cR(n,t,a))}catch(I){return s(I instanceof Error?I:new Error(String(I)))}let u=sR(c,l,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:d}),f=Date.now(),m=!1,p=!1,h=0,_=!1,g=!1;if(t.signal){if(t.signal.aborted)return m=!0,ne({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),Ge(u).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{m=!0,ne({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-f}),Ge(u).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let w=t.sessionId||"",y=Vu({tool:t.tool,onDelta:t.onDelta,...n.isolateResult?{isolateResult:n.isolateResult}:{}});y.setSessionId(w);let E=$s(u,{provider:t.tool,onEvent:I=>{h=Date.now(),iR(I)&&(g=!0),t.onEvent?.(I)},onNotification:I=>{h=Date.now(),y.processMessage(I)}}),{sendRpc:T,sendNotification:b}=E,A="";u.stderr?.on("data",I=>{A+=I.toString()}),u.on("error",I=>{E.close(I),ne({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:I.message,elapsed_ms:Date.now()-f}),s(new rt(`Failed to spawn ${n.binary} ${n.baseArgs.join(" ")}: ${I.message}`,{cause:I}))}),u.on("exit",(I,R)=>{if(p=!0,E.close(new ct(`ACP process ${R?`terminated by ${R}`:`exited with code ${String(I)}`}`,I,R)),m)return;let L=y.finalize();if(L!==null)n.onExitFinalization?.({...a,sessionId:L.sessionId,result:L.result,stopReason:L.stopReason,exitCode:I}),r({result:L.result,sessionId:L.sessionId,durationMs:Date.now()-f,stopReason:L.stopReason,exitCode:I,sawActivity:L.sawActivity,...i.length>0?{warnings:i}:{}});else{let N=fY(t.tool,A),k=uY({tool:t.tool,exitCode:I,signal:R,stderr:N,fullOutput:A});ne({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:I,signal:R,stderr_summary:k,elapsed_ms:Date.now()-f}),s(new ct(k,I,R,A))}}),(async()=>{try{let I=await lR({sendRpc:T,sendNotification:b,opts:t,outputProcessor:y});w=I.sessionId,t.onSessionId?.(w);let R=I.sessionResponse;await aR(n,a,{sessionId:w,response:R},T),y.beginTurn(),_=!0,It(`acp: prompt sent (${e.length} chars)`);let L;if(await T("session/prompt",{sessionId:w,prompt:[{type:"text",text:e}]},N=>{N.error?y.cancelTurn():L=y.completeTurn(N)}),!L)throw new Error("ACP prompt completed without a result boundary");_=!1,It(`acp: result received (${L.result.length} chars, stopReason=${L.stopReason})`),_r(t.holdOpen,{isAborted:()=>m,hasChildExited:()=>p,isTurnInFlight:()=>_,lastEventAtMs:()=>h,closeStdin:()=>{u.stdin?.end()},signal:t.signal,label:t.tool,wasBackgroundJobLaunched:()=>g})}catch(I){Ge(u).catch(()=>{}),s(I instanceof Error?I:new Error(String(I)))}})()})}async function uR(e){let t=Pc(e.tool);if(!t)throw new Error(`No ACP config for tool "${e.tool}"`);e.acpMode!==void 0&&oR(e.tool,e.acpMode);let n=e.permissionMode??"yolo",r=[],s=!0,o={permissionMode:n,...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:R=>{r.push(R)}}},{binary:i,spawnArgs:a,spawnEnv:c}=cR(t,e,o),l=sR(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:c}),d=Date.now(),u={exited:!1,exitCode:null,signal:null,lastEventAtMs:0,turnInFlight:!1,backgroundJobLaunched:!1,completedTurns:0,closed:!1,closing:null,telemetryFired:!1},f,m=e.sessionId||"",p=null,h="";l.stderr?.on("data",R=>{h+=R.toString()});let _,g,w=Vu({tool:e.tool,onDelta:R=>_?.(R),...t.isolateResult?{isolateResult:t.isolateResult}:{}});w.setSessionId(m);let y=$s(l,{provider:e.tool,onEvent:R=>{u.lastEventAtMs=Date.now(),iR(R)&&(u.backgroundJobLaunched=!0),g?.(R)},onNotification:R=>{u.lastEventAtMs=Date.now(),w.processMessage(R)}}),E=()=>new ct(`ACP bundle process (${e.tool}) exited${u.signal!==null?` by ${u.signal}`:u.exitCode!==null?` with code ${u.exitCode}`:""} after ${u.completedTurns} completed prompt(s); the bundle cannot continue`,u.exitCode,u.signal,h),T=[],b=()=>u.exited?Promise.resolve():new Promise(R=>{T.push(R)}),A=null;l.on("error",R=>{p=new rt(`Failed to spawn ${t.binary} ${t.baseArgs.join(" ")}: ${R.message}`,{cause:R}),ne({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:R.message,elapsed_ms:Date.now()-d}),y.close(R)}),l.on("exit",(R,L)=>{if(u.exited=!0,u.exitCode=R,u.signal=L,y.close(new ct(`ACP process ${L?`terminated by ${L}`:`exited with code ${String(R)}`}`,R,L)),!u.telemetryFired){u.telemetryFired=!0;let N=w.finalize();N!==null&&t.onExitFinalization?.({...o,sessionId:N.sessionId,result:N.result,stopReason:N.stopReason,exitCode:R})}if(A!==null){let N=A;A=null,N(E())}for(let N of T.splice(0))N()}),l.on("close",(R,L)=>{if(!u.exited){u.exited=!0,u.exitCode=R,u.signal=L;for(let N of T.splice(0))N()}});try{let R=await lR({sendRpc:y.sendRpc,sendNotification:y.sendNotification,opts:e,outputProcessor:w,strictSessionIdentity:!0,verifyLoadResponse:t.sessionIdentity===void 0?void 0:async L=>t.sessionIdentity.verifyLoadedSession({...o,requestedSessionId:e.sessionId,loadResponse:L,cwd:e.cwd,env:c})});m=R.sessionId,e.onSessionId?.(m),await aR(t,o,{sessionId:R.sessionId,response:R.sessionResponse},y.sendRpc)}catch(R){let L=p??(R instanceof Error?R:new Error(String(R)));throw e.serviceHosted&&e.closeTimeoutMs===void 0?(l.stdin?.end(),await b()):Ge(l).catch(()=>{}),L}let I=R=>new Promise(L=>{setTimeout(L,R).unref?.()});return{tool:e.tool,get sessionId(){return m},get completedTurns(){return u.completedTurns},async sendTurn(R,L={}){if(f&&await f,u.closed||u.closing!==null)throw new Error(`ACP bundle session (${e.tool}) is closed`);if(u.exited)throw E();if(u.turnInFlight)throw new Error(`ACP bundle session (${e.tool}) has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending`);if(L.signal?.aborted)throw new Error("Aborted");if(t.sessionIdentity?.recheckSession!==void 0){if(await t.sessionIdentity.recheckSession({requestedSessionId:m,cwd:e.cwd,env:c}),u.exited)throw E();if(L.signal?.aborted)throw new Error("Aborted")}u.turnInFlight=!0,_=L.onDelta,g=L.onEvent;let N=Date.now();try{w.beginTurn(),It(`acp: bundle prompt sent (${R.length} chars)`);let k,D=!1;if(await new Promise((v,S)=>{A=S;let x,C=()=>{D=!0,f=Promise.resolve().then(()=>x).catch(()=>{}),w.cancelTurn(),y.sendNotification("session/cancel",{sessionId:m}),S(new Error("Aborted"))},q=L.signal;q?.addEventListener("abort",C,{once:!0}),x=y.sendRpc("session/prompt",{sessionId:m,prompt:[{type:"text",text:R}]},F=>{D||(F.error?w.cancelTurn():k=w.completeTurn(F),_=void 0,g=void 0)}),x.then(F=>{q?.removeEventListener("abort",C),v(F)},F=>{q?.removeEventListener("abort",C),S(F instanceof Error?F:new Error(String(F)))})}),A=null,!k)throw new Error("ACP prompt completed without a result boundary");u.turnInFlight=!1,u.completedTurns+=1,It(`acp: bundle result received (${k.result.length} chars, stopReason=${k.stopReason})`);let O=s&&r.length>0?[...r]:void 0;return s=!1,{result:k.result,sessionId:k.sessionId,stopReason:k.stopReason,durationMs:Date.now()-N,sawActivity:k.sawActivity,...O!==void 0?{warnings:O}:{}}}catch(k){throw A=null,w.cancelTurn(),u.turnInFlight=!1,u.exited?E():k}finally{_=void 0,g=void 0}},close(){return u.closing!==null||(u.closing=(async()=>{if(u.closed=!0,u.exited||(e.holdOpen!==void 0?await new Promise(L=>{_r(e.holdOpen,{isAborted:()=>!1,hasChildExited:()=>u.exited,isTurnInFlight:()=>u.turnInFlight,lastEventAtMs:()=>u.lastEventAtMs,closeStdin:()=>{l.stdin?.end(),L()},label:e.tool,wasBackgroundJobLaunched:()=>u.backgroundJobLaunched})}):l.stdin?.end(),u.exited))return;let R=e.closeTimeoutMs;if(R===void 0&&e.serviceHosted)await b();else{let L=R??2e3;await Promise.race([b(),I(L)]),u.exited||await Ge(l,{stdinEnd:!1,softDelayMs:Math.min(1e3,L),killDelayMs:Math.min(1e3,L)}).catch(()=>{})}})()),u.closing}}}function st(e,t=120){let n=e.replace(/\s+/g," ").trim();return n.length>t?n.slice(0,t-1)+"\u2026":n}var mY=256;function fR(e,t){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(e.size>=mY){let r=e.keys().next().value;r!==void 0&&e.delete(r)}e.set(n.id,Date.now()),t(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=e.get(n.id);if(r!==void 0){t({...n,elapsedMs:Date.now()-r}),e.delete(n.id);return}}t(n)}}function mR(){let e=new Map;return(t,n)=>{pY(t,fR(e,n))}}function pY(e,t){let n=e.type;if(n==="system"){let r=e.subtype;if(r==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,o=typeof e.max_retries=="number"?e.max_retries:void 0,i=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,c=typeof e.retry_delay_ms=="number"?e.retry_delay_ms:void 0,l=[];s!==void 0&&l.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&l.push(`HTTP ${i}`),c!==void 0&&l.push(`retry in ${Math.round(c/1e3)}s`),a&&l.push(st(a,60));let d=l.length>0?l.join(", "):r;t({kind:"api_retry",summary:d});return}if(r==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,o=typeof e.error=="string"?e.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(st(o,80)),t({kind:"other",summary:i.join(": "),raw:e});return}t({kind:"system",summary:r||"system",raw:e});return}if(n==="assistant"||n==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&t({kind:"text",summary:st(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",c=typeof o.id=="string"?o.id:void 0,l=o.input,d="";l&&(typeof l.command=="string"?d=l.command:typeof l.file_path=="string"?d=l.file_path:typeof l.path=="string"?d=l.path:typeof l.pattern=="string"?d=l.pattern:typeof l.url=="string"?d=l.url:d=st(JSON.stringify(l))),t({kind:"tool_use",tool:a,summary:st(d),id:c,raw:o})}else if(i==="thinking"||i==="redacted_thinking"){let a=o.thinking||o.data||"";t({kind:"thinking",summary:st(a),raw:o})}else if(i==="tool_result"){let c=o.is_error===!0?"error":"ok",l=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,d,u=o.content;if(typeof u=="string")d=`${u.split(`
1979
+ ${n}`:n}function fY(e,t){return Pc(e)?.filterExpectedStderr?.(t)??t}function iR(e){if(e.method!=="session/update")return!1;let n=e.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}async function aR(e,t,n,r){for(let s of e.sessionSetup??[]){let o={...t,sessionId:n.sessionId,response:n.response,sendRpc:r};if(s.applies(o))try{await s.run(o),s.successLog&&kt(s.successLog(o))}catch(i){let a=s.describeFailure(o,i);if(ne({event:a.event,provider:e.name,...a.fields}),a.stderrLine&&process.stderr.write(a.stderrLine),a.warning&&t.warnings.push(a.warning),s.onFailure==="fail-closed")throw new Error(a.message)}}}function cR(e,t,n){let r=Rt(t.env,t.cwd,t.sessionId);e.preSpawn?.({...n,cwd:t.cwd,env:r});let s=t.binaryPath||e.binary,o=e.argv(n),i=e.yoloAssertion==="always-yolo"?"yolo":n.permissionMode;if(St(t.tool,o,i),t.cwd&&!dY(t.cwd))throw ne({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),new rt(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:s,spawnArgs:o,spawnEnv:r}}async function lR(e){let{sendRpc:t,sendNotification:n,opts:r,outputProcessor:s}=e,o=e.strictSessionIdentity===!0,i=await t("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}});n("notifications/initialized");let a=r.sessionId||"",c;if(r.sessionId){let l;try{if(i.result?.agentCapabilities?.loadSession===!1)throw new Error("provider advertises loadSession=false");l=await t("session/load",{sessionId:r.sessionId,cwd:r.cwd,mcpServers:[]})}catch(u){if(o||r.requireResume)throw new Error(`Cannot resume session ${r.sessionId} via ACP: ${u instanceof Error?u.message:String(u)}`);process.stderr.write(`[acp] session/load failed for ${r.sessionId}, creating new session
1980
+ `),ne({event:"acp_session_resume_fallback",provider:r.tool,session_id:r.sessionId,error_message:u instanceof Error?u.message:String(u)});let f=await t("session/new",{cwd:r.cwd,mcpServers:[]});return a=Xr(f),s.setSessionId(a),{sessionId:a,sessionResponse:f}}let d=Xr(l);if(r.requireResume&&d!==""&&d!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${d}"`);if(o){let u=Xr(l);if(u!==""&&u!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${u}"`);if(u===""){if(e.verifyLoadResponse===void 0)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received none`);await e.verifyLoadResponse(l)}a=r.sessionId}else a=Xr(l,r.sessionId);c=l,s.setSessionId(a)}else{let l=await t("session/new",{cwd:r.cwd,mcpServers:[]});a=Xr(l),c=l,s.setSessionId(a)}return{sessionId:a,sessionResponse:c}}function dR(e,t){let n=Pc(t.tool);if(!n)return Promise.reject(new Error(`No ACP config for tool "${t.tool}"`));if(t.acpMode!==void 0)try{oR(t.tool,t.acpMode)}catch(r){return Promise.reject(r)}return new Promise((r,s)=>{let o=t.permissionMode??"yolo",i=[],a={permissionMode:o,...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:I=>{i.push(I)}}},c,l,d;try{({binary:c,spawnArgs:l,spawnEnv:d}=cR(n,t,a))}catch(I){return s(I instanceof Error?I:new Error(String(I)))}let u=sR(c,l,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:d}),f=Date.now(),m=!1,p=!1,h=0,_=!1,g=!1;if(t.signal){if(t.signal.aborted)return m=!0,ne({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),Ge(u).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{m=!0,ne({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-f}),Ge(u).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let w=t.sessionId||"",y=Vu({tool:t.tool,onDelta:t.onDelta,...n.isolateResult?{isolateResult:n.isolateResult}:{}});y.setSessionId(w);let E=$s(u,{provider:t.tool,onEvent:I=>{h=Date.now(),iR(I)&&(g=!0),t.onEvent?.(I)},onNotification:I=>{h=Date.now(),y.processMessage(I)}}),{sendRpc:T,sendNotification:b}=E,A="";u.stderr?.on("data",I=>{A+=I.toString()}),u.on("error",I=>{E.close(I),ne({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:I.message,elapsed_ms:Date.now()-f}),s(new rt(`Failed to spawn ${n.binary} ${n.baseArgs.join(" ")}: ${I.message}`,{cause:I}))}),u.on("exit",(I,R)=>{if(p=!0,E.close(new ct(`ACP process ${R?`terminated by ${R}`:`exited with code ${String(I)}`}`,I,R)),m)return;let L=y.finalize();if(L!==null)n.onExitFinalization?.({...a,sessionId:L.sessionId,result:L.result,stopReason:L.stopReason,exitCode:I}),r({result:L.result,sessionId:L.sessionId,durationMs:Date.now()-f,stopReason:L.stopReason,exitCode:I,sawActivity:L.sawActivity,...i.length>0?{warnings:i}:{}});else{let N=fY(t.tool,A),k=uY({tool:t.tool,exitCode:I,signal:R,stderr:N,fullOutput:A});ne({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:I,signal:R,stderr_summary:k,elapsed_ms:Date.now()-f}),s(new ct(k,I,R,A))}}),(async()=>{try{let I=await lR({sendRpc:T,sendNotification:b,opts:t,outputProcessor:y});w=I.sessionId,t.onSessionId?.(w);let R=I.sessionResponse;await aR(n,a,{sessionId:w,response:R},T),y.beginTurn(),_=!0,kt(`acp: prompt sent (${e.length} chars)`);let L;if(await T("session/prompt",{sessionId:w,prompt:[{type:"text",text:e}]},N=>{N.error?y.cancelTurn():L=y.completeTurn(N)}),!L)throw new Error("ACP prompt completed without a result boundary");_=!1,kt(`acp: result received (${L.result.length} chars, stopReason=${L.stopReason})`),_r(t.holdOpen,{isAborted:()=>m,hasChildExited:()=>p,isTurnInFlight:()=>_,lastEventAtMs:()=>h,closeStdin:()=>{u.stdin?.end()},signal:t.signal,label:t.tool,wasBackgroundJobLaunched:()=>g})}catch(I){Ge(u).catch(()=>{}),s(I instanceof Error?I:new Error(String(I)))}})()})}async function uR(e){let t=Pc(e.tool);if(!t)throw new Error(`No ACP config for tool "${e.tool}"`);e.acpMode!==void 0&&oR(e.tool,e.acpMode);let n=e.permissionMode??"yolo",r=[],s=!0,o={permissionMode:n,...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:R=>{r.push(R)}}},{binary:i,spawnArgs:a,spawnEnv:c}=cR(t,e,o),l=sR(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:c}),d=Date.now(),u={exited:!1,exitCode:null,signal:null,lastEventAtMs:0,turnInFlight:!1,backgroundJobLaunched:!1,completedTurns:0,closed:!1,closing:null,telemetryFired:!1},f,m=e.sessionId||"",p=null,h="";l.stderr?.on("data",R=>{h+=R.toString()});let _,g,w=Vu({tool:e.tool,onDelta:R=>_?.(R),...t.isolateResult?{isolateResult:t.isolateResult}:{}});w.setSessionId(m);let y=$s(l,{provider:e.tool,onEvent:R=>{u.lastEventAtMs=Date.now(),iR(R)&&(u.backgroundJobLaunched=!0),g?.(R)},onNotification:R=>{u.lastEventAtMs=Date.now(),w.processMessage(R)}}),E=()=>new ct(`ACP bundle process (${e.tool}) exited${u.signal!==null?` by ${u.signal}`:u.exitCode!==null?` with code ${u.exitCode}`:""} after ${u.completedTurns} completed prompt(s); the bundle cannot continue`,u.exitCode,u.signal,h),T=[],b=()=>u.exited?Promise.resolve():new Promise(R=>{T.push(R)}),A=null;l.on("error",R=>{p=new rt(`Failed to spawn ${t.binary} ${t.baseArgs.join(" ")}: ${R.message}`,{cause:R}),ne({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:R.message,elapsed_ms:Date.now()-d}),y.close(R)}),l.on("exit",(R,L)=>{if(u.exited=!0,u.exitCode=R,u.signal=L,y.close(new ct(`ACP process ${L?`terminated by ${L}`:`exited with code ${String(R)}`}`,R,L)),!u.telemetryFired){u.telemetryFired=!0;let N=w.finalize();N!==null&&t.onExitFinalization?.({...o,sessionId:N.sessionId,result:N.result,stopReason:N.stopReason,exitCode:R})}if(A!==null){let N=A;A=null,N(E())}for(let N of T.splice(0))N()}),l.on("close",(R,L)=>{if(!u.exited){u.exited=!0,u.exitCode=R,u.signal=L;for(let N of T.splice(0))N()}});try{let R=await lR({sendRpc:y.sendRpc,sendNotification:y.sendNotification,opts:e,outputProcessor:w,strictSessionIdentity:!0,verifyLoadResponse:t.sessionIdentity===void 0?void 0:async L=>t.sessionIdentity.verifyLoadedSession({...o,requestedSessionId:e.sessionId,loadResponse:L,cwd:e.cwd,env:c})});m=R.sessionId,e.onSessionId?.(m),await aR(t,o,{sessionId:R.sessionId,response:R.sessionResponse},y.sendRpc)}catch(R){let L=p??(R instanceof Error?R:new Error(String(R)));throw e.serviceHosted&&e.closeTimeoutMs===void 0?(l.stdin?.end(),await b()):Ge(l).catch(()=>{}),L}let I=R=>new Promise(L=>{setTimeout(L,R).unref?.()});return{tool:e.tool,get sessionId(){return m},get completedTurns(){return u.completedTurns},async sendTurn(R,L={}){if(f&&await f,u.closed||u.closing!==null)throw new Error(`ACP bundle session (${e.tool}) is closed`);if(u.exited)throw E();if(u.turnInFlight)throw new Error(`ACP bundle session (${e.tool}) has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending`);if(L.signal?.aborted)throw new Error("Aborted");if(t.sessionIdentity?.recheckSession!==void 0){if(await t.sessionIdentity.recheckSession({requestedSessionId:m,cwd:e.cwd,env:c}),u.exited)throw E();if(L.signal?.aborted)throw new Error("Aborted")}u.turnInFlight=!0,_=L.onDelta,g=L.onEvent;let N=Date.now();try{w.beginTurn(),kt(`acp: bundle prompt sent (${R.length} chars)`);let k,D=!1;if(await new Promise((v,S)=>{A=S;let x,C=()=>{D=!0,f=Promise.resolve().then(()=>x).catch(()=>{}),w.cancelTurn(),y.sendNotification("session/cancel",{sessionId:m}),S(new Error("Aborted"))},q=L.signal;q?.addEventListener("abort",C,{once:!0}),x=y.sendRpc("session/prompt",{sessionId:m,prompt:[{type:"text",text:R}]},F=>{D||(F.error?w.cancelTurn():k=w.completeTurn(F),_=void 0,g=void 0)}),x.then(F=>{q?.removeEventListener("abort",C),v(F)},F=>{q?.removeEventListener("abort",C),S(F instanceof Error?F:new Error(String(F)))})}),A=null,!k)throw new Error("ACP prompt completed without a result boundary");u.turnInFlight=!1,u.completedTurns+=1,kt(`acp: bundle result received (${k.result.length} chars, stopReason=${k.stopReason})`);let O=s&&r.length>0?[...r]:void 0;return s=!1,{result:k.result,sessionId:k.sessionId,stopReason:k.stopReason,durationMs:Date.now()-N,sawActivity:k.sawActivity,...O!==void 0?{warnings:O}:{}}}catch(k){throw A=null,w.cancelTurn(),u.turnInFlight=!1,u.exited?E():k}finally{_=void 0,g=void 0}},close(){return u.closing!==null||(u.closing=(async()=>{if(u.closed=!0,u.exited||(e.holdOpen!==void 0?await new Promise(L=>{_r(e.holdOpen,{isAborted:()=>!1,hasChildExited:()=>u.exited,isTurnInFlight:()=>u.turnInFlight,lastEventAtMs:()=>u.lastEventAtMs,closeStdin:()=>{l.stdin?.end(),L()},label:e.tool,wasBackgroundJobLaunched:()=>u.backgroundJobLaunched})}):l.stdin?.end(),u.exited))return;let R=e.closeTimeoutMs;if(R===void 0&&e.serviceHosted)await b();else{let L=R??2e3;await Promise.race([b(),I(L)]),u.exited||await Ge(l,{stdinEnd:!1,softDelayMs:Math.min(1e3,L),killDelayMs:Math.min(1e3,L)}).catch(()=>{})}})()),u.closing}}}function st(e,t=120){let n=e.replace(/\s+/g," ").trim();return n.length>t?n.slice(0,t-1)+"\u2026":n}var mY=256;function fR(e,t){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(e.size>=mY){let r=e.keys().next().value;r!==void 0&&e.delete(r)}e.set(n.id,Date.now()),t(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=e.get(n.id);if(r!==void 0){t({...n,elapsedMs:Date.now()-r}),e.delete(n.id);return}}t(n)}}function mR(){let e=new Map;return(t,n)=>{pY(t,fR(e,n))}}function pY(e,t){let n=e.type;if(n==="system"){let r=e.subtype;if(r==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,o=typeof e.max_retries=="number"?e.max_retries:void 0,i=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,c=typeof e.retry_delay_ms=="number"?e.retry_delay_ms:void 0,l=[];s!==void 0&&l.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&l.push(`HTTP ${i}`),c!==void 0&&l.push(`retry in ${Math.round(c/1e3)}s`),a&&l.push(st(a,60));let d=l.length>0?l.join(", "):r;t({kind:"api_retry",summary:d});return}if(r==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,o=typeof e.error=="string"?e.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(st(o,80)),t({kind:"other",summary:i.join(": "),raw:e});return}t({kind:"system",summary:r||"system",raw:e});return}if(n==="assistant"||n==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&t({kind:"text",summary:st(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",c=typeof o.id=="string"?o.id:void 0,l=o.input,d="";l&&(typeof l.command=="string"?d=l.command:typeof l.file_path=="string"?d=l.file_path:typeof l.path=="string"?d=l.path:typeof l.pattern=="string"?d=l.pattern:typeof l.url=="string"?d=l.url:d=st(JSON.stringify(l))),t({kind:"tool_use",tool:a,summary:st(d),id:c,raw:o})}else if(i==="thinking"||i==="redacted_thinking"){let a=o.thinking||o.data||"";t({kind:"thinking",summary:st(a),raw:o})}else if(i==="tool_result"){let c=o.is_error===!0?"error":"ok",l=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,d,u=o.content;if(typeof u=="string")d=`${u.split(`
1981
1981
  `).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let f=u.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(d=`${f.split(`
1982
- `).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:c,summary:d,id:l,raw:o})}else i&&t({kind:"other",summary:i,raw:o})}return}if(n==="result"){t({kind:"system",summary:"result",raw:e});return}}async function Ku(e,t){let n=t.binary==="qwen"?"qwen":"claude",r=t.onProgress?mR():void 0;if(t.bundleSession!==void 0)return Wr(t.bundleSession,n,t.sessionId,e,{onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal});let s=await Rk(e,{sessionId:t.sessionId,cwd:t.cwd,env:t.env,tool:n,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,onText:t.onDelta,onUsage:t.onUsage,onEvent:o=>{typeof o.session_id=="string"&&o.session_id&&t.onSessionId?.(o.session_id),r&&r(o,t.onProgress)},signal:t.signal,holdOpen:t.holdOpen});return{text:s.result,...s.usage?{usage:s.usage}:{},sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns,...s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{}}}async function zu(e){let t=e.binary==="qwen"?"qwen":"claude",n=await Nk({tool:t,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,holdOpen:e.holdOpen,closeTimeoutMs:e.closeTimeoutMs,serviceHosted:e.serviceHosted,sessionFileRoots:e.sessionFileRoots});return{provider:t,get sessionId(){return n.sessionId},get completedTurns(){return n.completedTurns},async sendTurn(r,s={}){let o=mR(),i=await n.sendTurn(r,{onText:s.onDelta,onEvent:a=>{s.onEvent?.(a),s.onProgress&&o(a,s.onProgress)},signal:s.signal});return{text:i.result,...i.usage?{usage:i.usage}:{},sessionId:i.sessionId,durationMs:i.durationMs,...i.warnings!==void 0?{warnings:i.warnings}:{}}},close:()=>n.close()}}function pR(){let e=new Map;return(t,n)=>{hY(t,fR(e,n))}}function hY(e,t){if(e.method!=="session/update")return;let s=e.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&t({kind:"text",summary:st(a)});return}if(o==="agent_thought_chunk"||o==="thought"||o==="reasoning"){let a=s.content?.text||"";t({kind:"thinking",summary:st(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,c="",l=s.rawInput;l&&(typeof l.command=="string"?c=l.command:typeof l.file_path=="string"?c=l.file_path:typeof l.path=="string"?c=l.path:c=st(JSON.stringify(l))),t({kind:"tool_use",tool:i,summary:st(c),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")t({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let c=s.content,l=typeof c=="string"?c:typeof c?.text=="string"?c.text:"",d=l?`running\u2026 ${st(l,80)}`:"running\u2026";t({kind:"other",summary:d,id:a})}return}t({kind:"other",summary:o})}}function hR(e,t){if(t!==void 0)return e===""&&!t?"empty":void 0}async function Wn(e,t){let n=t.acpTool||t.binary,r=t.onProgress?pR():void 0;if(t.bundleSession!==void 0)return Wr(t.bundleSession,n,t.sessionId,e,{onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal});let s=[];if(t.model&&n==="copilot"){let a="copilot --acp does not implement per-session model selection";bn({event:"model_ignored",provider:n,model:t.model,reason:a}),s.push(`copilot ignored model=${t.model}: ${a}`)}let o=await dR(e,{tool:n,sessionId:t.sessionId,onSessionId:t.onSessionId,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:t.requireResume,onDelta:t.onDelta,onEvent:r?a=>r(a,t.onProgress):void 0,signal:t.signal,holdOpen:t.holdOpen}),i=[...s,...o.warnings??[]];return{text:o.result,sessionId:o.sessionId,durationMs:o.durationMs,stopReason:o.stopReason,...hR(o.result,o.sawActivity)!==void 0?{status:"empty"}:{},...i.length>0?{warnings:i}:{}}}async function gr(e){let t=e.acpTool||e.binary,n=await uR({tool:t,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:!0,holdOpen:e.holdOpen,closeTimeoutMs:e.closeTimeoutMs,serviceHosted:e.serviceHosted});return{provider:t,get sessionId(){return n.sessionId},get completedTurns(){return n.completedTurns},async sendTurn(r,s={}){let o=pR(),i=await n.sendTurn(r,{...s,onEvent:a=>{s.onEvent?.(a),s.onProgress&&o(a,s.onProgress)}});return{text:i.result,sessionId:i.sessionId,durationMs:i.durationMs,stopReason:i.stopReason,sawActivity:i.sawActivity,...hR(i.result,i.sawActivity)?{status:"empty"}:{},...i.warnings!==void 0?{warnings:i.warnings}:{}}},close:()=>n.close()}}function _R(e,t){let n=e.method;if(!n)return;let r=e.params;if(n==="turn/started"){t({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){t({kind:"system",summary:"turn completed"});return}if(n==="error"){let s=r?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=r?.willRetry===!0;t(a?{kind:"api_retry",summary:`codex retry: ${st(i,120)}`}:{kind:"other",summary:`codex error: ${st(i,120)}`});return}if(n==="item/started"||n==="item/completed"){let s=r?.item;if(!s)return;let o=s.type,i=n==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,c=s.command,l=Array.isArray(c)?c.join(" "):typeof c=="string"?c:"";if(i)t({kind:"tool_use",tool:"Bash",summary:st(l||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),t({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let c=s.changes,l=Array.isArray(c)?c.map(d=>d.path||"").filter(Boolean).join(", "):"";t({kind:"tool_use",tool:"FileChange",summary:st(l||"(edit)"),id:a})}else{let c=s.status||"done";t({kind:"tool_result",summary:c,status:c,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,c=s.server||"mcp",l=s.tool||"tool";if(i)t({kind:"tool_use",tool:`${c}/${l}`,summary:"",id:a});else{let d=s.status||"done";t({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;t(i?{kind:"tool_use",tool:"WebSearch",summary:st(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&t({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&t({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(n==="item/agentMessage/delta"){let s=r?.delta||"";if(s){let o=typeof r?._lmctlItemPhase=="string"?r._lmctlItemPhase:void 0;t(o==="commentary"?{kind:"thinking",summary:st(s)}:{kind:"text",summary:st(s)})}return}if(n.startsWith("item/reasoning/")||n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";t({kind:"thinking",summary:st(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let o=s.split(`
1982
+ `).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:c,summary:d,id:l,raw:o})}else i&&t({kind:"other",summary:i,raw:o})}return}if(n==="result"){t({kind:"system",summary:"result",raw:e});return}}async function Ku(e,t){let n=t.binary==="qwen"?"qwen":"claude",r=t.onProgress?mR():void 0;if(t.bundleSession!==void 0)return Br(t.bundleSession,n,t.sessionId,e,{onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal});let s=await Rk(e,{sessionId:t.sessionId,cwd:t.cwd,env:t.env,tool:n,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,onText:t.onDelta,onUsage:t.onUsage,onEvent:o=>{typeof o.session_id=="string"&&o.session_id&&t.onSessionId?.(o.session_id),r&&r(o,t.onProgress)},signal:t.signal,holdOpen:t.holdOpen});return{text:s.result,...s.usage?{usage:s.usage}:{},sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns,...s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{}}}async function zu(e){let t=e.binary==="qwen"?"qwen":"claude",n=await Nk({tool:t,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,holdOpen:e.holdOpen,closeTimeoutMs:e.closeTimeoutMs,serviceHosted:e.serviceHosted,sessionFileRoots:e.sessionFileRoots});return{provider:t,get sessionId(){return n.sessionId},get completedTurns(){return n.completedTurns},async sendTurn(r,s={}){let o=mR(),i=await n.sendTurn(r,{onText:s.onDelta,onEvent:a=>{s.onEvent?.(a),s.onProgress&&o(a,s.onProgress)},signal:s.signal});return{text:i.result,...i.usage?{usage:i.usage}:{},sessionId:i.sessionId,durationMs:i.durationMs,...i.warnings!==void 0?{warnings:i.warnings}:{}}},close:()=>n.close()}}function pR(){let e=new Map;return(t,n)=>{hY(t,fR(e,n))}}function hY(e,t){if(e.method!=="session/update")return;let s=e.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&t({kind:"text",summary:st(a)});return}if(o==="agent_thought_chunk"||o==="thought"||o==="reasoning"){let a=s.content?.text||"";t({kind:"thinking",summary:st(a)});return}if(o==="tool_call"){let i=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,c="",l=s.rawInput;l&&(typeof l.command=="string"?c=l.command:typeof l.file_path=="string"?c=l.file_path:typeof l.path=="string"?c=l.path:c=st(JSON.stringify(l))),t({kind:"tool_use",tool:i,summary:st(c),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")t({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let c=s.content,l=typeof c=="string"?c:typeof c?.text=="string"?c.text:"",d=l?`running\u2026 ${st(l,80)}`:"running\u2026";t({kind:"other",summary:d,id:a})}return}t({kind:"other",summary:o})}}function hR(e,t){if(t!==void 0)return e===""&&!t?"empty":void 0}async function Wn(e,t){let n=t.acpTool||t.binary,r=t.onProgress?pR():void 0;if(t.bundleSession!==void 0)return Br(t.bundleSession,n,t.sessionId,e,{onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal});let s=[];if(t.model&&n==="copilot"){let a="copilot --acp does not implement per-session model selection";bn({event:"model_ignored",provider:n,model:t.model,reason:a}),s.push(`copilot ignored model=${t.model}: ${a}`)}let o=await dR(e,{tool:n,sessionId:t.sessionId,onSessionId:t.onSessionId,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:t.requireResume,onDelta:t.onDelta,onEvent:r?a=>r(a,t.onProgress):void 0,signal:t.signal,holdOpen:t.holdOpen}),i=[...s,...o.warnings??[]];return{text:o.result,sessionId:o.sessionId,durationMs:o.durationMs,stopReason:o.stopReason,...hR(o.result,o.sawActivity)!==void 0?{status:"empty"}:{},...i.length>0?{warnings:i}:{}}}async function gr(e){let t=e.acpTool||e.binary,n=await uR({tool:t,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:!0,holdOpen:e.holdOpen,closeTimeoutMs:e.closeTimeoutMs,serviceHosted:e.serviceHosted});return{provider:t,get sessionId(){return n.sessionId},get completedTurns(){return n.completedTurns},async sendTurn(r,s={}){let o=pR(),i=await n.sendTurn(r,{...s,onEvent:a=>{s.onEvent?.(a),s.onProgress&&o(a,s.onProgress)}});return{text:i.result,sessionId:i.sessionId,durationMs:i.durationMs,stopReason:i.stopReason,sawActivity:i.sawActivity,...hR(i.result,i.sawActivity)?{status:"empty"}:{},...i.warnings!==void 0?{warnings:i.warnings}:{}}},close:()=>n.close()}}function _R(e,t){let n=e.method;if(!n)return;let r=e.params;if(n==="turn/started"){t({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){t({kind:"system",summary:"turn completed"});return}if(n==="error"){let s=r?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=r?.willRetry===!0;t(a?{kind:"api_retry",summary:`codex retry: ${st(i,120)}`}:{kind:"other",summary:`codex error: ${st(i,120)}`});return}if(n==="item/started"||n==="item/completed"){let s=r?.item;if(!s)return;let o=s.type,i=n==="item/started";switch(o){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,c=s.command,l=Array.isArray(c)?c.join(" "):typeof c=="string"?c:"";if(i)t({kind:"tool_use",tool:"Bash",summary:st(l||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),t({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let c=s.changes,l=Array.isArray(c)?c.map(d=>d.path||"").filter(Boolean).join(", "):"";t({kind:"tool_use",tool:"FileChange",summary:st(l||"(edit)"),id:a})}else{let c=s.status||"done";t({kind:"tool_result",summary:c,status:c,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,c=s.server||"mcp",l=s.tool||"tool";if(i)t({kind:"tool_use",tool:`${c}/${l}`,summary:"",id:a});else{let d=s.status||"done";t({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;t(i?{kind:"tool_use",tool:"WebSearch",summary:st(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&t({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&t({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(n==="item/agentMessage/delta"){let s=r?.delta||"";if(s){let o=typeof r?._lmctlItemPhase=="string"?r._lmctlItemPhase:void 0;t(o==="commentary"?{kind:"thinking",summary:st(s)}:{kind:"text",summary:st(s)})}return}if(n.startsWith("item/reasoning/")||n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";t({kind:"thinking",summary:st(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let o=s.split(`
1983
1983
  `).filter(c=>c.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${st(i,60)}`:st(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(n==="item/commandExecution/terminalInteraction"||n==="item/commandExecution/outputChunk"||n==="item/commandExecution/output"){let s=(typeof r?.stdin=="string"?r.stdin:"")||(typeof r?.delta=="string"?r.delta:"")||(typeof r?.output=="string"?r.output:"")||(typeof r?.text=="string"?r.text:"")||(typeof r?.content=="string"?r.content:"")||(typeof r?.chunk=="string"?r.chunk:"")||"";if(s){let o=s.split(`
1984
- `).filter(c=>c.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${st(i,60)}`:st(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){t({kind:"other",summary:n.slice(5)});return}}async function gR(e,t){if(t.bundleSession!==void 0)return Wr(t.bundleSession,"codex",t.sessionId,e,{onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal});let n=await Pk(e,{threadId:t.sessionId,requireResume:t.requireResume,onSessionId:t.onSessionId,onUsage:t.onUsage,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?r=>_R(r,t.onProgress):void 0,signal:t.signal});return{text:n.result,...n.usage?{usage:n.usage}:{},sessionId:n.threadId,durationMs:n.durationMs}}async function ER(e){let t=await Uk({threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,holdOpen:e.holdOpen,closeTimeoutMs:e.closeTimeoutMs,serviceHosted:e.serviceHosted});return{provider:"codex",get sessionId(){return t.sessionId},get completedTurns(){return t.completedTurns},async sendTurn(n,r={}){let s=await t.sendTurn(n,{...r,onEvent:o=>{r.onEvent?.(o),r.onProgress&&_R(o,r.onProgress)}});return{text:s.text,...s.usage?{usage:s.usage}:{},sessionId:s.sessionId,durationMs:s.durationMs}},close:()=>t.close()}}function rg(e={}){let t=Vd(e.miniplayerHome),n=r=>({...r??process.env,MINIPLAYER_HOME:t});return new class extends Pe{constructor(){super({provider:new Xd({miniplayerHome:t}),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeSession:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none",leaderSetupHint:"Miniplayer provides native file, shell and web tools. A stored session can be resumed (history is rebuilt from its completed turns)."},binary:"miniplayer",seedArgs:[],resumeTemplate:"",startTemplate:"miniplayer run",transport:(r,s)=>Wn(r,{...s,env:n(s.env),acpTool:"miniplayer"})})}openSession(r){return gr({...r,env:n(r.env),binary:"miniplayer",acpTool:"miniplayer"})}manualSeedHint(){return{launchCommand:"miniplayer --help",postLaunchNote:'Use lmctl prompt --provider miniplayer --model <model> "<prompt>". Each invocation creates a fresh run unless a session id is given.',lsCommand:"lmctl ls --provider miniplayer"}}resumeCommand(){throw new Error("miniplayer has no interactive terminal; use lmctl prompt or lmctl batch")}async seed(r,s){try{s?.signal?.throwIfAborted();try{s?.onDispatch?.()}catch{}let o=await Wn(s?.prompt??be,{binary:"miniplayer",acpTool:"miniplayer",sessionId:"",requireResume:!1,cwd:r,env:n(s?.env),signal:s?.signal,model:s?.model});return{success:!0,sessionId:o.sessionId,usage:o.usage}}catch(o){return{success:!1,usage:o?.usage,error:`miniplayer seed failed: ${o instanceof Error?o.message:String(o)}`}}}}}import{join as vR}from"node:path";import{readdir as Qu,stat as yR,unlink as _Y}from"node:fs/promises";import{join as Ji,basename as wR}from"node:path";function gY(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function EY(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return Ve(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}function yY(e,t){e.input=Math.max(e.input,t.input),e.cacheRead=Math.max(e.cacheRead,t.cacheRead),e.cacheWrite=Math.max(e.cacheWrite,t.cacheWrite),e.output=Math.max(e.output,t.output),e.cacheWriteSplitExposed||=t.cacheWriteSplitExposed,t.cacheWrite5m!==void 0&&(e.cacheWrite5m=Math.max(e.cacheWrite5m??0,t.cacheWrite5m)),t.cacheWrite1h!==void 0&&(e.cacheWrite1h=Math.max(e.cacheWrite1h??0,t.cacheWrite1h))}function wY(e){let t=e?.cache_creation?.ephemeral_5m_input_tokens,n=e?.cache_creation?.ephemeral_1h_input_tokens,r=typeof t=="number"||typeof n=="number",s=(t??0)+(n??0);return{input:e?.input_tokens??0,cacheRead:e?.cache_read_input_tokens??0,cacheWrite:Math.max(e?.cache_creation_input_tokens??0,s),...typeof t=="number"?{cacheWrite5m:t}:{},...typeof n=="number"?{cacheWrite1h:n}:{},cacheWriteSplitExposed:r,output:e?.output_tokens??0}}function TY(e){let t=e.cacheWrite1h??0;if(!e.cacheWriteSplitExposed)return{total:e.cacheWrite,fiveMinute:e.cacheWrite,oneHour:0};let n=e.cacheWrite5m??Math.max(0,e.cacheWrite-t),r=n+t;return{total:Math.max(e.cacheWrite,r),fiveMinute:r>e.cacheWrite?n:n+(e.cacheWrite-r),oneHour:t}}async function TR(e){let t=0,n=0,r=0,s=0,o=0,i=0,a,c,l=new Map,d=[];for await(let p of ze(e))if(!p.isSidechain){if(p.type==="user"&&!p.isMeta&&p.message){let h=p.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;t++,c=de(h.trim(),80)}}else if(p.type==="assistant"&&p.message){let h=p.message.content;if(Array.isArray(h))for(let g of h)g.type==="text"&&t++;let _=p.message.usage;if(_){let g=wY(_),w=p.message.id?.trim();if(w){let E=l.get(w);E?yY(E,g):l.set(w,g)}else d.push(g);let y=g.input+g.cacheWrite+g.cacheRead;y&&(i=y),a={inputTokens:g.input,cacheWriteInputTokens:g.cacheWrite,cachedInputTokens:g.cacheRead,outputTokens:g.output}}}}let u=0,f=0,m=p=>{let h=TY(p);n+=p.input+p.cacheRead+h.total,r+=p.cacheRead,s+=h.total,u+=h.fiveMinute,f+=h.oneHour,o+=p.output};for(let p of l.values())m(p);for(let p of d)m(p);return{messageCount:t,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalCacheWrite5mInputTokens:u,totalCacheWrite1hInputTokens:f,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a,lastUserMessage:c}}var Zu=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Ji(ge,".claude"),this.projectsDir=Ji(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],n;try{n=await Qu(this.projectsDir)}catch{return t}for(let r of n){let s=Ji(this.projectsDir,r);if(!(await yR(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Qu(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let c=wR(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(c))continue;let l=Ji(s,a);try{let d=await this.extractSummary(l,c);d&&t.push(d)}catch{}}}return t}async extractSummary(t,n){let r=await vn(t,50),s=await dt(t),o="",i,a,c,l,d,u;for(let m of r)if(!gY(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(c=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;l||(l=de(p.trim(),80)),d=de(p.trim(),80)}}if(!o)return null;let f=await TR(t);return{provider:"claude",sessionId:n,slug:i,cwd:o,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:c,cliVersion:a,startCommand:"claude",firstUserMessage:l,lastUserMessage:f.lastUserMessage??d,messageCount:f.messageCount,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalCacheWrite5mInputTokens:f.totalCacheWrite5mInputTokens||void 0,totalCacheWrite1hInputTokens:f.totalCacheWrite1hInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r=await dt(n),s=[],o="",i,a,c,l,d,u,f,m=t,p,h=[];for await(let g of ze(n))if(g.type!=="file-history-snapshot"&&!g.isSidechain){if(!o&&g.cwd&&(o=g.cwd),!i&&g.slug&&(i=g.slug),!a&&g.version&&(a=g.version),!l&&g.gitBranch&&(l=g.gitBranch),!f&&g.timestamp&&(f=new Date(g.timestamp)),g.sessionId&&(m=g.sessionId),g.type==="system"||g.type==="progress"||g.type==="queue-operation"){s.push({role:"system",timestamp:new Date(g.timestamp||0),content:EY(g)});continue}if(g.type==="user"&&g.message){if(g.isMeta)continue;let w=new Date(g.timestamp||0),y=g.message.content;if(g.isCompactSummary!==!0&&g.isVisibleInTranscriptOnly!==!0&&g.promptSource!=="system"&&g.toolUseResult===void 0&&g.origin?.kind!=="task-notification"&&g.interruptedMessageId===void 0&&g.interruptedByShutdown!==!0&&g.scheduledTaskId===void 0&&g.scheduledFireId===void 0&&!(Array.isArray(y)&&y.some(E=>E.type==="tool_result"))){let E=typeof y=="string"?y:Array.isArray(y)?y.filter(T=>T.type==="text"&&typeof T.text=="string").map(T=>T.text).join(`
1984
+ `).filter(c=>c.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${st(i,60)}`:st(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){t({kind:"other",summary:n.slice(5)});return}}async function gR(e,t){if(t.bundleSession!==void 0)return Br(t.bundleSession,"codex",t.sessionId,e,{onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal});let n=await Pk(e,{threadId:t.sessionId,requireResume:t.requireResume,onSessionId:t.onSessionId,onUsage:t.onUsage,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?r=>_R(r,t.onProgress):void 0,signal:t.signal});return{text:n.result,...n.usage?{usage:n.usage}:{},sessionId:n.threadId,durationMs:n.durationMs}}async function ER(e){let t=await Uk({threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,holdOpen:e.holdOpen,closeTimeoutMs:e.closeTimeoutMs,serviceHosted:e.serviceHosted});return{provider:"codex",get sessionId(){return t.sessionId},get completedTurns(){return t.completedTurns},async sendTurn(n,r={}){let s=await t.sendTurn(n,{...r,onEvent:o=>{r.onEvent?.(o),r.onProgress&&_R(o,r.onProgress)}});return{text:s.text,...s.usage?{usage:s.usage}:{},sessionId:s.sessionId,durationMs:s.durationMs}},close:()=>t.close()}}function rg(e={}){let t=Vd(e.miniplayerHome),n=r=>({...r??process.env,MINIPLAYER_HOME:t});return new class extends Pe{constructor(){super({provider:new Xd({miniplayerHome:t}),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeSession:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none",leaderSetupHint:"Miniplayer provides native file, shell and web tools. A stored session can be resumed (history is rebuilt from its completed turns)."},binary:"miniplayer",seedArgs:[],resumeTemplate:"",startTemplate:"miniplayer run",transport:(r,s)=>Wn(r,{...s,env:n(s.env),acpTool:"miniplayer"})})}openSession(r){return gr({...r,env:n(r.env),binary:"miniplayer",acpTool:"miniplayer"})}manualSeedHint(){return{launchCommand:"miniplayer --help",postLaunchNote:'Use lmctl prompt --provider miniplayer --model <model> "<prompt>". Each invocation creates a fresh run unless a session id is given.',lsCommand:"lmctl ls --provider miniplayer"}}resumeCommand(){throw new Error("miniplayer has no interactive terminal; use lmctl prompt or lmctl batch")}async seed(r,s){try{s?.signal?.throwIfAborted();try{s?.onDispatch?.()}catch{}let o=await Wn(s?.prompt??be,{binary:"miniplayer",acpTool:"miniplayer",sessionId:"",requireResume:!1,cwd:r,env:n(s?.env),signal:s?.signal,model:s?.model});return{success:!0,sessionId:o.sessionId,usage:o.usage}}catch(o){return{success:!1,usage:o?.usage,error:`miniplayer seed failed: ${o instanceof Error?o.message:String(o)}`}}}}}import{join as vR}from"node:path";import{readdir as Qu,stat as yR,unlink as _Y}from"node:fs/promises";import{join as Ji,basename as wR}from"node:path";function gY(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function EY(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return Ve(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}function yY(e,t){e.input=Math.max(e.input,t.input),e.cacheRead=Math.max(e.cacheRead,t.cacheRead),e.cacheWrite=Math.max(e.cacheWrite,t.cacheWrite),e.output=Math.max(e.output,t.output),e.cacheWriteSplitExposed||=t.cacheWriteSplitExposed,t.cacheWrite5m!==void 0&&(e.cacheWrite5m=Math.max(e.cacheWrite5m??0,t.cacheWrite5m)),t.cacheWrite1h!==void 0&&(e.cacheWrite1h=Math.max(e.cacheWrite1h??0,t.cacheWrite1h))}function wY(e){let t=e?.cache_creation?.ephemeral_5m_input_tokens,n=e?.cache_creation?.ephemeral_1h_input_tokens,r=typeof t=="number"||typeof n=="number",s=(t??0)+(n??0);return{input:e?.input_tokens??0,cacheRead:e?.cache_read_input_tokens??0,cacheWrite:Math.max(e?.cache_creation_input_tokens??0,s),...typeof t=="number"?{cacheWrite5m:t}:{},...typeof n=="number"?{cacheWrite1h:n}:{},cacheWriteSplitExposed:r,output:e?.output_tokens??0}}function TY(e){let t=e.cacheWrite1h??0;if(!e.cacheWriteSplitExposed)return{total:e.cacheWrite,fiveMinute:e.cacheWrite,oneHour:0};let n=e.cacheWrite5m??Math.max(0,e.cacheWrite-t),r=n+t;return{total:Math.max(e.cacheWrite,r),fiveMinute:r>e.cacheWrite?n:n+(e.cacheWrite-r),oneHour:t}}async function TR(e){let t=0,n=0,r=0,s=0,o=0,i=0,a,c,l=new Map,d=[];for await(let p of ze(e))if(!p.isSidechain){if(p.type==="user"&&!p.isMeta&&p.message){let h=p.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;t++,c=de(h.trim(),80)}}else if(p.type==="assistant"&&p.message){let h=p.message.content;if(Array.isArray(h))for(let g of h)g.type==="text"&&t++;let _=p.message.usage;if(_){let g=wY(_),w=p.message.id?.trim();if(w){let E=l.get(w);E?yY(E,g):l.set(w,g)}else d.push(g);let y=g.input+g.cacheWrite+g.cacheRead;y&&(i=y),a={inputTokens:g.input,cacheWriteInputTokens:g.cacheWrite,cachedInputTokens:g.cacheRead,outputTokens:g.output}}}}let u=0,f=0,m=p=>{let h=TY(p);n+=p.input+p.cacheRead+h.total,r+=p.cacheRead,s+=h.total,u+=h.fiveMinute,f+=h.oneHour,o+=p.output};for(let p of l.values())m(p);for(let p of d)m(p);return{messageCount:t,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalCacheWrite5mInputTokens:u,totalCacheWrite1hInputTokens:f,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a,lastUserMessage:c}}var Zu=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Ji(ge,".claude"),this.projectsDir=Ji(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],n;try{n=await Qu(this.projectsDir)}catch{return t}for(let r of n){let s=Ji(this.projectsDir,r);if(!(await yR(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Qu(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let c=wR(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(c))continue;let l=Ji(s,a);try{let d=await this.extractSummary(l,c);d&&t.push(d)}catch{}}}return t}async extractSummary(t,n){let r=await vn(t,50),s=await dt(t),o="",i,a,c,l,d,u;for(let m of r)if(!gY(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(c=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;l||(l=de(p.trim(),80)),d=de(p.trim(),80)}}if(!o)return null;let f=await TR(t);return{provider:"claude",sessionId:n,slug:i,cwd:o,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:c,cliVersion:a,startCommand:"claude",firstUserMessage:l,lastUserMessage:f.lastUserMessage??d,messageCount:f.messageCount,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalCacheWrite5mInputTokens:f.totalCacheWrite5mInputTokens||void 0,totalCacheWrite1hInputTokens:f.totalCacheWrite1hInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r=await dt(n),s=[],o="",i,a,c,l,d,u,f,m=t,p,h=[];for await(let g of ze(n))if(g.type!=="file-history-snapshot"&&!g.isSidechain){if(!o&&g.cwd&&(o=g.cwd),!i&&g.slug&&(i=g.slug),!a&&g.version&&(a=g.version),!l&&g.gitBranch&&(l=g.gitBranch),!f&&g.timestamp&&(f=new Date(g.timestamp)),g.sessionId&&(m=g.sessionId),g.type==="system"||g.type==="progress"||g.type==="queue-operation"){s.push({role:"system",timestamp:new Date(g.timestamp||0),content:EY(g)});continue}if(g.type==="user"&&g.message){if(g.isMeta)continue;let w=new Date(g.timestamp||0),y=g.message.content;if(g.isCompactSummary!==!0&&g.isVisibleInTranscriptOnly!==!0&&g.promptSource!=="system"&&g.toolUseResult===void 0&&g.origin?.kind!=="task-notification"&&g.interruptedMessageId===void 0&&g.interruptedByShutdown!==!0&&g.scheduledTaskId===void 0&&g.scheduledFireId===void 0&&!(Array.isArray(y)&&y.some(E=>E.type==="tool_result"))){let E=typeof y=="string"?y:Array.isArray(y)?y.filter(T=>T.type==="text"&&typeof T.text=="string").map(T=>T.text).join(`
1985
1985
  `):"";E&&!/^<(?:command-name>|local-command-|task-notification>\s*<)/u.test(E.trimStart())&&!/^<system-reminder>[\s\S]*<\/system-reminder>$/u.test(E.trim())&&!E.trimStart().startsWith("lmctl seed initial connection only.")&&h.push(E)}if(typeof y=="string"){let E=y.trim();if(E.includes("<command-name>")||E.includes("<local-command-")||/^<task-notification>\s*</u.test(E)||E.startsWith("lmctl seed initial connection only.")||/^<system-reminder>[\s\S]*<\/system-reminder>$/u.test(E))continue;d||(d=de(y.trim(),80)),u=de(y.trim(),80),p=void 0,s.push({role:"user",timestamp:w,content:Ve(y.trim())})}else if(Array.isArray(y)){for(let E of y)if(E.type==="tool_result"){let T=typeof E.content=="string"?Ve(E.content):JSON.stringify(E.content);s.push({role:"tool_result",timestamp:w,content:T,toolCallId:E.tool_use_id})}}}if(g.type==="assistant"&&g.message){g.message.stop_reason===null||g.message.stop_reason==="tool_use"?p="in_progress":typeof g.message.stop_reason=="string"&&(p="complete"),g.message.model&&(c=g.message.model);let w=new Date(g.timestamp||0),y=g.message.content;if(Array.isArray(y))for(let E of y)E.type==="text"&&E.text?s.push({role:"assistant",timestamp:w,content:Ve(E.text),model:g.message.model,...typeof g.message.stop_reason=="string"?{stopReason:g.message.stop_reason}:{}}):E.type==="tool_use"?s.push({role:"tool_use",timestamp:w,content:E.name||"unknown tool",toolName:E.name,toolInput:JSON.stringify(E.input,null,2),toolInputData:E.input,toolCallId:E.id,model:g.message.model,...typeof g.message.stop_reason=="string"?{stopReason:g.message.stop_reason}:{}}):E.type==="thinking"&&E.thinking&&s.push({role:"thinking",timestamp:w,content:E.thinking})}}if(!o)return null;vY(s);let _=await TR(n);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||r.createdAt,modifiedAt:r.modifiedAt,model:c,cliVersion:a,startCommand:"claude",gitBranch:l,turnStatus:p,firstUserMessage:d,lastUserMessage:u,messageCount:_.messageCount,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:_.totalCacheWriteInputTokens||void 0,totalCacheWrite5mInputTokens:_.totalCacheWrite5mInputTokens||void 0,totalCacheWrite1hInputTokens:_.totalCacheWrite1hInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:s,userPrompts:h}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let n=await this.resolveSessionFile(t);return n?(await _Y(n),!0):!1}async resolveSessionFile(t){let n;try{n=await Qu(this.projectsDir)}catch{return null}let r=[];for(let i of n){let a=Ji(this.projectsDir,i);if(!(await yR(a).catch(()=>null))?.isDirectory())continue;let l;try{l=await Qu(a)}catch{continue}for(let d of l){if(!d.endsWith(".jsonl"))continue;let u=wR(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&r.push({filePath:Ji(a,d),fileSessionId:u})}}let s=r.find(i=>i.fileSessionId===t);if(s)return s.filePath;let o=r.filter(i=>i.fileSessionId.startsWith(t));if(o.length===1)return o[0].filePath;for(let i of r){let a=await vn(i.filePath,20);for(let c of a)if(c.slug&&c.slug===t)return i.filePath}return null}};function vY(e){let t=SY(e),n=new Set;for(let r of e){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=t.get(r.toolCallId);if(s===void 0)continue;let o=s.content.match(/Command running in background with ID:\s*([A-Za-z0-9_-]+)/)?.[1];o!==void 0&&(n.add(o),r.backgroundTaskId=o,s.backgroundTaskId=o)}for(let r of e){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let o=t.get(r.toolCallId);o!==void 0&&(o.backgroundTaskId=s)}}function SY(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}function og(e){return new sg(e)}var sg=class extends Pe{claudeDir;constructor(t){super({provider:new Zu(t),protocol:{transport:"stream-json",perTurnCancellation:"process",persistentCancellation:"session",persistentResume:!0},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",be,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:Ku}),this.claudeDir=t?.claudeDir??vR(ge,".claude")}openSession(t){return zu({...t,binary:"claude",sessionFileRoots:t.sessionFileRoots??[vR(this.claudeDir,"projects")]})}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n,"--model",t.model]:n}};import{readdir as bY,stat as SR,unlink as AY}from"node:fs/promises";import{join as Uc,basename as IY}from"node:path";var kY=new Set(["agents_md.instructions","environments.environment_context","plugins.recommendations","plugins.usage_instructions","apps.instructions","collaboration_mode.instructions","generic.developer_instructions","host_skills.instructions","model_switch.instructions","multi_agent.mode_instructions","multi_agent.role_instructions","multi_agent.usage_hint","permissions.instructions","skills.instructions"]);function ig(e,t){if(!Array.isArray(e)||t>=e.length)return!1;let n=e[t];return typeof n=="string"&&kY.has(n)}function RY(e,t,n){return`${e}|${t.toISOString()}|${n}`}function Fc(e,t,n){let r=RY(n.role,n.timestamp,n.content);t.has(r)||(t.add(r),e.push(n))}function bR(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function NY(e){if(!e)return;let t=e.cached_input_tokens??e.cache_read_input_tokens;return{inputTokens:e.input_tokens,cachedInputTokens:t,outputTokens:e.output_tokens,reasoningOutputTokens:e.reasoning_output_tokens,totalTokens:e.total_tokens}}function Yi(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.map(n=>{if(typeof n=="string")return n;if(n&&typeof n=="object"){let r=n;if(typeof r.text=="string")return r.text;if(typeof r.image_url=="string")return"[input_image]";if(typeof r.type=="string")return`[${r.type}]`}return Yi(n)}).filter(n=>n.length>0).join(`
1986
1986
  `);try{return JSON.stringify(e)}catch{return String(e)}}function xY(e){let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{return}return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function LY(e,t){if(t===void 0)return;let n={input:t};if(e!=="apply_patch"||typeof t!="string")return n;let r=[...t.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return r.length>0&&(n.path=r[0].path,n.paths=r.map(s=>s.path),n.kinds=r.map(s=>s.kind)),n}async function AR(e){let t=0,n=0,r=0,s=0,o=0,i,a,c=new Set,l,d;for await(let u of ze(e)){if(u.type==="event_msg"&&u.payload?.type==="user_message"){let f=u.payload.message||u.payload.text;f&&(d=de(f.trim(),80))}if(u.type==="response_item"&&u.payload){let f=u.payload;if(f.type==="message"&&f.role==="user"&&f.content){let m=f.internal_chat_message_metadata_passthrough?.content_item_kinds;for(let p=0;p<f.content.length;p++){let h=f.content[p];ig(m,p)||h.type==="input_text"&&typeof h.text=="string"&&h.text&&(t++,d=de(h.text.trim(),80))}}else if(f.type==="message"&&f.role==="assistant"&&f.content)for(let m of f.content)m.type==="output_text"&&typeof m.text=="string"&&m.text&&t++}if(u.payload&&typeof u.payload.model_context_window=="number"&&(l=u.payload.model_context_window),u.type==="event_msg"&&u.payload?.type==="token_count"&&u.payload.info?.total_token_usage){let f=u.payload.info.total_token_usage;n=f.input_tokens??n,r=f.cached_input_tokens??f.cache_read_input_tokens??r,s=f.output_tokens??s,o=f.reasoning_output_tokens??o;let m=u.payload.info.last_token_usage;if(m&&typeof m.input_tokens=="number"&&typeof m.output_tokens=="number"){let h=JSON.stringify([u.timestamp??null,u.ordinal??null,f,m]);if(!c.has(h)){c.add(h);let _=[m.input_tokens,m.cached_input_tokens??m.cache_read_input_tokens??0,m.output_tokens,m.reasoning_output_tokens??0];a??=[0,0,0,0],_.forEach((g,w)=>{a[w]+=g})}}let p=NY(u.payload.info.last_token_usage);p&&(i=p),typeof u.payload.info.model_context_window=="number"&&(l=u.payload.info.model_context_window)}}return a&&([n,r,s,o]=a),{messageCount:t,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:l,lastUserMessage:d}}var ef=class{name="codex";codexDirs;constructor(t={}){let n=[Uc(ge,".codex"),Uc(ge,".code")];if(t.codexDirs&&t.codexDirs.length>0){this.codexDirs=[...new Set(t.codexDirs)];return}let r=[t.codexDir||n[0],t.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(t=>({directory:Uc(t,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let t=[];for(let n of this.codexDirs){let r=Uc(n,"sessions");try{await SR(r),t.push(r)}catch{}}return t}async discoverSessions(){let t=[],n=await this.getSessionsDirs();for(let r of n){let s=await this.findSessionFiles(r);for(let o of s)try{let i=await this.extractSummary(o);i&&t.push(i)}catch{}}return t}async findSessionFiles(t){let n=[],r;try{r=await bY(t)}catch{return n}for(let s of r){let o=Uc(t,s),i=await SR(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);n.push(...a)}else s.endsWith(".jsonl")&&n.push(o)}return n}extractSessionIdFromFilename(t){let n=IY(t,".jsonl"),r=n.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async extractSummary(t){let n=await vn(t,30),r=await dt(t),s=this.extractSessionIdFromFilename(t),o="",i,a,c,l,d,u,f;for(let p of n){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(c=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(l||(l=de(h.trim(),80)),d=de(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.internal_chat_message_metadata_passthrough?.content_item_kinds;for(let _=0;_<p.payload.content.length;_++){let g=p.payload.content[_];ig(h,_)||g.type==="input_text"&&typeof g.text=="string"&&g.text&&(l||(l=de(g.text.trim(),80)),d=de(g.text.trim(),80))}}}if(!o)return null;let m=await AR(t);return{provider:"codex",sessionId:s,cwd:o,createdAt:c||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:i,startCommand:bR(u,f),firstUserMessage:l,lastUserMessage:m.lastUserMessage??d,messageCount:m.messageCount,filePath:t,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(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r=await dt(n),s=[],o="",i,a,c,l,d,u=t,f,m,p=new Set,h=[],_=new Set,g=[],w=(T,b)=>{let A=g.find(I=>!I.mirrored&&I.source!==b&&I.text===T);A?A.mirrored=!0:g.push({text:T,source:b,mirrored:!1})},y=()=>{h.push(...g.map(T=>T.text)),g=[]};for await(let T of ze(n)){let b=T.timestamp?new Date(T.timestamp):new Date;if(T.type==="session_meta"&&T.payload){T.payload.id&&(u=T.payload.id),T.payload.cwd&&(o=T.payload.cwd),T.payload.cli_version&&(i=T.payload.cli_version),T.payload.timestamp&&(c=new Date(T.payload.timestamp)),f=bR(T.payload.originator,T.payload.source);continue}if(T.type==="turn_context"&&T.payload){T.payload.model&&(a=T.payload.model),!o&&T.payload.cwd&&(o=T.payload.cwd);continue}if(T.type==="response_item"&&T.payload){let A=T.payload;if(A.type==="message"){if(A.role==="user"&&A.content){let I=A.internal_chat_message_metadata_passthrough?.content_item_kinds;if(Array.isArray(I)){let R=A.content.filter((L,N)=>I[N]==="user.text"&&typeof L.text=="string").map(L=>L.text).join(`
1987
1987
  `);I.includes("user.text")&&R&&(!A.id||!_.has(A.id))&&(w(R,"metadata"),A.id&&_.add(A.id))}for(let R=0;R<A.content.length;R++){let L=A.content[R];if(!ig(I,R)&&L.type==="input_text"&&typeof L.text=="string"&&L.text){let N=L.text.trim();l||(l=de(N,80)),d=de(N,80),Fc(s,p,{role:"user",timestamp:b,content:Ve(N)})}}continue}if(A.role==="assistant"&&A.content){for(let I of A.content)I.type==="output_text"&&typeof I.text=="string"&&I.text&&Fc(s,p,{role:"assistant",timestamp:b,content:Ve(I.text),model:a});continue}if(A.role!=="user"&&A.role!=="assistant"&&A.content){for(let I of A.content)(I.type==="input_text"||I.type==="output_text")&&typeof I.text=="string"&&I.text&&Fc(s,p,{role:"system",timestamp:b,content:Ve(I.text.trim())});continue}}if(A.type==="function_call"){s.push({role:"tool_use",timestamp:b,content:A.name||"unknown tool",toolName:A.name,toolInput:A.arguments!==void 0?Ve(Yi(A.arguments)):void 0,toolInputData:xY(A.arguments),toolCallId:A.call_id});continue}if(A.type==="function_call_output"){s.push({role:"tool_result",timestamp:b,content:Ve(Yi(A.output)),toolCallId:A.call_id});continue}if(A.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:b,content:A.name||"unknown tool",toolName:A.name,toolInput:A.input!==void 0?Ve(Yi(A.input)):void 0,toolInputData:LY(A.name,A.input),toolCallId:A.call_id});continue}if(A.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:b,content:Ve(Yi(A.output)),toolCallId:A.call_id});continue}if(A.type==="reasoning"&&A.summary){let I=A.summary.map(R=>Yi(R.text)).join(`
@@ -1992,18 +1992,18 @@ ${n}`:n}function fY(e,t){return Pc(e)?.filterExpectedStderr?.(t)??t}function iR(
1992
1992
  `)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(t[r[1]]=r[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function qo(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function tK(e){let t=0,n=pg(),r;for await(let s of ze(e)){if(s.type==="user.message"){t++;let o=(s.data?.content||"").trim();o&&(r=de(o,80))}else s.type==="assistant.message"&&(s.data?.content||"").trim()&&t++;OR(n,s)}return{messageCount:t,tokens:n,lastUserMessage:r}}var of=class{name="copilot";sessionStateDir;constructor(t={}){let n=t.copilotDir||Bn(ge,".copilot");this.sessionStateDir=Bn(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],n;try{n=await LR(this.sessionStateDir)}catch{return t}for(let r of n){let s=Bn(this.sessionStateDir,r);if((await Ki(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,r);i&&t.push(i)}catch{}}return t}async loadSession(t){let n=await this.resolveSessionDir(t);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=Bn(n,"events.jsonl"),o=await Ki(s).catch(()=>null),i=o?s:Bn(n,"workspace.yaml"),a=await dt(o?s:n),c=[],l=[],d=r?.cwd||"(unknown workspace)",u,f,m,p,h,_,g=r?.id||QY(n)||t,w=pg();if(o)for await(let y of ze(s)){let E=qo(y.timestamp)||a.modifiedAt;if(OR(w,y),y.type==="session.start"&&y.data){y.data.sessionId&&(g=y.data.sessionId),y.data.copilotVersion&&(f=y.data.copilotVersion),y.data.startTime&&(_=qo(y.data.startTime)),y.data.selectedModel&&(u=y.data.selectedModel),y.data.context&&(y.data.context.cwd&&(d=y.data.context.cwd),y.data.context.branch&&(m=y.data.context.branch));continue}if(y.type==="session.model_change"&&y.data?.newModel){u=y.data.newModel;continue}if(y.type==="user.message"&&y.data){let T=y.data.content||"";T&&l.push(T);let b=T.trim();b&&(p||(p=de(b,80)),h=de(b,80)),c.push({role:"user",timestamp:E,content:Ve(b||T)});continue}if(y.type==="assistant.message"&&y.data){let T=(y.data.content||"").trim();if(T&&c.push({role:"assistant",timestamp:E,content:Ve(T),model:u}),y.data.toolRequests)for(let b of y.data.toolRequests)c.push({role:"tool_use",timestamp:E,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments?JSON.stringify(b.arguments,null,2):void 0,toolInputData:Dn(b.arguments),toolCallId:b.toolCallId});continue}if(y.type==="tool.execution_complete"&&y.data){let T=y.data.result?.content||"",b=y.data.result?.detailedContent||"";c.push({role:"tool_result",timestamp:E,content:Ve(T),toolDetailedContent:b?Ve(b):void 0,toolCallId:y.data.toolCallId});continue}if(y.type==="assistant.reasoning"&&y.data?.content){c.push({role:"thinking",timestamp:E,content:Ve(y.data.content)});continue}if(y.type==="session.error"||y.type==="session.warning"||y.type==="session.info"||y.type==="system.message"){let T=y.data?.message||"";T.trim()&&c.push({role:"system",timestamp:E,content:Ve(T)});continue}}if(!p){let y=(r?.summary||"").trim();y&&(p=de(y,80))}return nK(c),{provider:"copilot",sessionId:g,cwd:d,createdAt:_??qo(r?.created_at)??a.createdAt,modifiedAt:qo(r?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",gitBranch:m,firstUserMessage:p,lastUserMessage:h,messageCount:c.filter(y=>y.role==="user"||y.role==="assistant").length,filePath:i,...CR(w),messages:c,userPrompts:l}}async extractSummary(t,n){let r=await this.readWorkspaceYaml(t),s=Bn(t,"events.jsonl"),o=await Ki(s).catch(()=>null),i=o?s:Bn(t,"workspace.yaml"),a=await dt(o?s:t),c=o?await vn(s,20):[],l=r?.id||n,d=r?.cwd||"(unknown workspace)",u,f,m,p,h;for(let g of c)if(g.type==="session.start"&&g.data&&(g.data.sessionId&&(l=g.data.sessionId),g.data.copilotVersion&&(f=g.data.copilotVersion),g.data.startTime&&(m=qo(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context?.cwd&&(d=g.data.context.cwd)),g.type==="session.model_change"&&g.data?.newModel&&(u||(u=g.data.newModel)),g.type==="user.message"&&g.data){let w=(g.data.content||"").trim();w&&(p||(p=de(w,80)),h=de(w,80))}if(!p){let g=(r?.summary||"").trim();g&&(p=de(g,80))}let _=o?await tK(s):{messageCount:0,tokens:pg()};return{provider:"copilot",sessionId:l,cwd:d,createdAt:m??qo(r?.created_at)??a.createdAt,modifiedAt:qo(r?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_.lastUserMessage??h,messageCount:_.messageCount,filePath:i,...CR(_.tokens)}}async readWorkspaceYaml(t){let n=Bn(t,"workspace.yaml");try{let r=await KY(n,"utf-8");return eK(r)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let n=await this.resolveSessionDir(t);return n?(await zY(n,{recursive:!0}),!0):!1}async resolveSessionDir(t){let n;try{n=await LR(this.sessionStateDir)}catch{return null}if(n.includes(t)){let s=Bn(this.sessionStateDir,t);if((await Ki(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(t)){let o=Bn(this.sessionStateDir,s);(await Ki(o).catch(()=>null))?.isDirectory()&&r.push(o)}if(r.length===1)return r[0];for(let s of n){let o=Bn(this.sessionStateDir,s);if(!(await Ki(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===t||a.id?.startsWith(t)))return o}return null}};function nK(e){let t=rK(e),n=new Map;for(let r of e){if(r.role!=="tool_use"||r.toolCallId===void 0)continue;if(r.toolName==="bash"){let c=t.get(r.toolCallId),d=[c?.content,c?.toolDetailedContent].filter(f=>typeof f=="string").join(`
1993
1993
  `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(d===void 0)continue;let u=`copilot-shell:${d}:${r.toolCallId}`;n.set(d,u),r.backgroundTaskId=u,c!==void 0&&(c.backgroundTaskId=u);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let o=String(s),i=n.get(o);if(i===void 0)continue;r.backgroundTaskId=i;let a=t.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=i)}}function rK(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}function _g(e){return new hg(e)}var hg=class extends Pe{copilotDir;constructor(t){super({provider:new of(t),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn",persistentResume:!0},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",be,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>Wn(n,{...r,acpTool:"copilot"})}),this.copilotDir=t?.copilotDir}openSession(t){return gr({...t,env:this.copilotDir!==void 0?{...t.env??process.env,COPILOT_HOME:this.copilotDir}:t.env,binary:"copilot",acpTool:"copilot"})}async seed(t,n){let r=await super.seed(t,n);if(n?.model===void 0||n.model.trim().length===0)return r;let s="copilot seed does not implement per-session model selection";return bn({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}};function Eg(e){return new gg(e)}var gg=class extends Pe{constructor(t){super({provider:new Vi(t),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn",persistentResume:!0},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",be],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(n,r)=>Wn(n,{...r,acpTool:"opencode"})})}openSession(t){return gr({...t,binary:"opencode",acpTool:"opencode"})}seedArgsFor(t){let n=["run"];return t?.model&&n.push("--model",t.model),t?.effort&&n.push("--variant",t.effort),n.push(t?.prompt??be),n}};import{appendFile as sK,mkdir as oK,readFile as DR,readdir as $R,rm as iK,stat as MR}from"node:fs/promises";import{basename as aK,dirname as cK,isAbsolute as PR,join as Ho,relative as lK,resolve as yg}from"node:path";var dK="1.4",uK="1.5",fK=new Set([dK,uK]),af=class{name="kimi";homeDir;sessionsDir;constructor(t){this.homeDir=yg(t?.kimiHome??process.env.KIMI_CODE_HOME??Ho(ge,".kimi-code")),this.sessionsDir=Ho(this.homeDir,"sessions")}async discoverSessions(){let t=[];for(let n of await this.sessionFiles())try{let r=await this.summary(n);r&&t.push(r)}catch{}return t.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(t){let n=await this.findSession(t);if(!n)return null;let r=await this.summary(n);if(!r)return null;let s=await this.parseWire(n.wirePath);return{...r,messages:s.messages,userPrompts:s.userPrompts}}async resolveSessionPath(t){return(await this.findSession(t))?.wirePath??null}async deleteSession(t){let n=await this.findSession(t);return n?(await iK(n.sessionDir,{recursive:!0,force:!0}),await oK(cK(this.indexPath()),{recursive:!0,mode:448}),await sK(this.indexPath(),`${JSON.stringify({sessionId:n.sessionId,deleted:!0})}
1994
1994
  `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return Ho(this.homeDir,"session_index.jsonl")}async sessionFiles(){let t=await this.readIndex(),n=new Map;for(let s of t.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await $R(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let o=Ho(this.sessionsDir,s.name),i;try{i=await $R(o,{withFileTypes:!0})}catch{continue}for(let a of i){if(!a.isDirectory()||n.has(a.name))continue;let c=Ho(o,a.name);n.set(a.name,this.filesFor(a.name,c))}}return[...n.values()]}async readIndex(){let t;try{t=await DR(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of t.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:yg(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(t,n,r){return{sessionId:t,sessionDir:n,statePath:Ho(n,"state.json"),wirePath:Ho(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(t,n){if(!PR(t)||aK(t)!==n)return!1;let r=lK(this.sessionsDir,yg(t));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!PR(r)}async findSession(t){let n=await this.sessionFiles(),r=n.find(o=>o.sessionId===t);if(r)return r;let s=n.filter(o=>o.sessionId.startsWith(t));return s.length===1?s[0]:null}async readState(t){try{let n=JSON.parse(await DR(t,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(t){let n=await this.readState(t.statePath);if(!n)return null;let r;try{r=await MR(t.wirePath)}catch{return null}let s=await MR(t.statePath).catch(()=>r),o=await this.parseWire(t.wirePath),i=wg(n.createdAt)??s.birthtime,a=wg(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:t.sessionId,slug:n.title,cwd:n.workDir??t.indexedWorkDir??"(unknown)",createdAt:i,modifiedAt:a,model:o.model,startCommand:"kimi",firstUserMessage:o.firstUserMessage,lastUserMessage:o.lastUserMessage??(n.lastPrompt?de(n.lastPrompt.trim(),80):void 0),messageCount:o.messageCount,filePath:t.wirePath,filePaths:[t.statePath,t.wirePath],totalInputTokens:o.totalInputTokens,totalCachedInputTokens:o.totalCachedInputTokens,totalCacheWriteInputTokens:o.totalCacheWriteInputTokens,totalOutputTokens:o.totalOutputTokens,lastInputTokens:o.lastInputTokens,lastTokenUsage:o.lastTokenUsage}}async parseWire(t){let n=[],r=[],s=new Set,o=!0,i,a,c,l=0,d=0,u=0,f=0,m=!1,p=0,h,_;for await(let g of ze(t)){let w=mK(g.time??g.created_at);if(o&&(o=!1,g.type==="metadata"&&!fK.has(g.protocol_version))){let E=`Kimi transcript wire protocol version ${JSON.stringify(g.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:w,content:E}],userPrompts:[],messageCount:1,firstUserMessage:E,lastUserMessage:E}}if((g.type==="config.update"||g.type==="profile.bind")&&g.modelAlias&&(i=g.modelAlias),g.type==="usage.record"){g.model&&(i=g.model),m||=g.usage!==void 0;let E=g.usage?.inputOther??0,T=g.usage?.inputCacheRead??0,b=g.usage?.inputCacheCreation??0,A=g.usage?.output??0;l+=E,d+=T,u+=b,f+=A,g.usageScope==="turn"&&(h=E+T+b,_={inputTokens:E,cachedInputTokens:T,cacheWriteInputTokens:b,outputTokens:A,totalTokens:h+A});continue}if(g.type==="turn.prompt"&&g.origin?.kind==="user"){let E=UR(g.input);E&&((!g.promptId||!s.has(g.promptId))&&(r.push(E),g.promptId&&s.add(g.promptId)),a??=de(E,80),c=de(E,80),n.push({role:"user",timestamp:w,content:E}),p++);continue}if(g.type==="turn.steer"){let E=UR(g.input);E&&(n.push({role:"system",timestamp:w,content:E}),p++);continue}if(g.type!=="context.append_loop_event"||!g.event)continue;let y=g.event;y.type==="content.part"&&y.part?.type==="text"&&y.part.text?(n.push({role:"assistant",timestamp:w,content:y.part.text,model:i}),p++):y.type==="content.part"&&y.part?.type==="think"&&y.part.think?n.push({role:"thinking",timestamp:w,content:y.part.think,model:i}):y.type==="tool.call"?n.push({role:"tool_use",timestamp:w,content:y.name??"tool",toolName:y.name,toolInput:FR(y.args),toolInputData:Dn(y.args),toolCallId:y.toolCallId,model:i}):y.type==="tool.result"&&n.push({role:"tool_result",timestamp:w,content:pK(y.result),toolCallId:y.toolCallId,model:i})}return hK(n),{messages:n,userPrompts:r,messageCount:p,model:i,firstUserMessage:a,lastUserMessage:c,totalInputTokens:m?l:void 0,totalCachedInputTokens:m?d:void 0,totalCacheWriteInputTokens:m?u:void 0,totalOutputTokens:m?f:void 0,lastInputTokens:h,lastTokenUsage:_}}};function wg(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}function mK(e){return typeof e=="number"?new Date(e):wg(e)??new Date(0)}function UR(e){return typeof e=="string"?e.trim():Array.isArray(e)?e.map(t=>t&&typeof t=="object"&&"text"in t&&typeof t.text=="string"?t.text:"").filter(Boolean).join(`
1995
- `).trim():""}function FR(e){if(e!==void 0)try{return JSON.stringify(e)}catch{return String(e)}}function pK(e){return e&&typeof e=="object"&&"output"in e&&typeof e.output=="string"?e.output:FR(e)??""}function hK(e){let t=_K(e),n=new Set;for(let r of e){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=t.get(r.toolCallId);if(s===void 0)continue;let o=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];o!==void 0&&(n.add(o),r.backgroundTaskId=o,s.backgroundTaskId=o)}for(let r of e){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let o=t.get(r.toolCallId);o!==void 0&&(o.backgroundTaskId=s)}}function _K(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}function vg(e){return new Tg(e)}var Tg=class extends Pe{kimiHome;constructor(t){super({provider:new af(t),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn",persistentResume:!0},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",be,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>Wn(n,{...r,acpTool:"kimi"})}),this.kimiHome=t?.kimiHome}openSession(t){return gr({...t,env:this.kimiHome!==void 0?{...t.env??process.env,KIMI_CODE_HOME:this.kimiHome}:t.env,binary:"kimi",acpTool:"kimi"})}seedArgsFor(t){let n=[];return t?.model&&n.push("--model",t.model),n.push("-p",t?.prompt??be,"--output-format","stream-json"),n}};import{spawn as gK}from"node:child_process";import{mkdirSync as EK}from"node:fs";function bg(e){return new Sg(e)}var Sg=class extends Pe{constructor(t){super({provider:new Vi({providerName:"lmplayer",startCommand:"lmplayer",dbPaths:t?.lmplayerDbPaths,dbPath:t?.lmplayerDbPath}),protocol:{transport:"lmplayer",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",be],resumeTemplate:"lmplayer tui --session {{session_id}}",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:yK})}async sendTurn(t,n){let r=await super.sendTurn(t,n);return n.permissionMode==="plan"?{...r,warnings:[...r.warnings??[],"lmplayer does not enforce plan mode; this turn used full permissions"]}:r}seedArgsFor(t){return jR({prompt:t?.prompt??be,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,n){EK(t,{recursive:!0});let r=this.seedArgsFor(n);vt("lmplayer",r);try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}let s=await HR(this.binary,r,{cwd:t,env:Wi(n?.env,t),signal:n?.signal});return s.code!==0&&s.code!==null?{success:!1,error:qR(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(t){return{launchCommand:`cd ${t} && lmplayer run --format json --dangerously-skip-permissions "${be}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}};async function yK(e,t){let n=Date.now(),r=jR({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});vt("lmplayer",r,t.permissionMode??"yolo");let s=await HR(t.binary,r,{cwd:t.cwd,env:kt(t.env,t.cwd,t.sessionId),signal:t.signal,onText:o=>{t.onProgress?.({kind:"text",summary:o.slice(0,120)}),t.onDelta?.(o)}});if(s.code!==0&&s.code!==null)throw new Error(qR(s));return{text:s.text.trim(),sessionId:s.sessionId??t.sessionId,durationMs:Date.now()-n}}function jR(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...Ms("lmplayer",e.permissionMode)??[]),t.push("--",e.prompt),t}function qR(e){let n=[Po(e.stderr).trim(),e.error].filter(Boolean).join(`
1995
+ `).trim():""}function FR(e){if(e!==void 0)try{return JSON.stringify(e)}catch{return String(e)}}function pK(e){return e&&typeof e=="object"&&"output"in e&&typeof e.output=="string"?e.output:FR(e)??""}function hK(e){let t=_K(e),n=new Set;for(let r of e){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=t.get(r.toolCallId);if(s===void 0)continue;let o=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];o!==void 0&&(n.add(o),r.backgroundTaskId=o,s.backgroundTaskId=o)}for(let r of e){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let o=t.get(r.toolCallId);o!==void 0&&(o.backgroundTaskId=s)}}function _K(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}function vg(e){return new Tg(e)}var Tg=class extends Pe{kimiHome;constructor(t){super({provider:new af(t),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn",persistentResume:!0},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",be,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>Wn(n,{...r,acpTool:"kimi"})}),this.kimiHome=t?.kimiHome}openSession(t){return gr({...t,env:this.kimiHome!==void 0?{...t.env??process.env,KIMI_CODE_HOME:this.kimiHome}:t.env,binary:"kimi",acpTool:"kimi"})}seedArgsFor(t){let n=[];return t?.model&&n.push("--model",t.model),n.push("-p",t?.prompt??be,"--output-format","stream-json"),n}};import{spawn as gK}from"node:child_process";import{mkdirSync as EK}from"node:fs";function bg(e){return new Sg(e)}var Sg=class extends Pe{constructor(t){super({provider:new Vi({providerName:"lmplayer",startCommand:"lmplayer",dbPaths:t?.lmplayerDbPaths,dbPath:t?.lmplayerDbPath}),protocol:{transport:"lmplayer",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",be],resumeTemplate:"lmplayer tui --session {{session_id}}",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:yK})}async sendTurn(t,n){let r=await super.sendTurn(t,n);return n.permissionMode==="plan"?{...r,warnings:[...r.warnings??[],"lmplayer does not enforce plan mode; this turn used full permissions"]}:r}seedArgsFor(t){return jR({prompt:t?.prompt??be,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,n){EK(t,{recursive:!0});let r=this.seedArgsFor(n);St("lmplayer",r);try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}let s=await HR(this.binary,r,{cwd:t,env:Wi(n?.env,t),signal:n?.signal});return s.code!==0&&s.code!==null?{success:!1,error:qR(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(t){return{launchCommand:`cd ${t} && lmplayer run --format json --dangerously-skip-permissions "${be}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}};async function yK(e,t){let n=Date.now(),r=jR({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});St("lmplayer",r,t.permissionMode??"yolo");let s=await HR(t.binary,r,{cwd:t.cwd,env:Rt(t.env,t.cwd,t.sessionId),signal:t.signal,onText:o=>{t.onProgress?.({kind:"text",summary:o.slice(0,120)}),t.onDelta?.(o)}});if(s.code!==0&&s.code!==null)throw new Error(qR(s));return{text:s.text.trim(),sessionId:s.sessionId??t.sessionId,durationMs:Date.now()-n}}function jR(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...Ms("lmplayer",e.permissionMode)??[]),t.push("--",e.prompt),t}function qR(e){let n=[Po(e.stderr).trim(),e.error].filter(Boolean).join(`
1996
1996
  `);return n?tt(n,{provider:"lmplayer"}):`exit code ${e.code}`}function HR(e,t,n){return new Promise((r,s)=>{let o;try{o=gK(e,t,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(h){s(h);return}let i="",a="",c="",l,d,u,f=[],m=!1,p=h=>{let _=h.trim();if(!_)return;let g;try{g=JSON.parse(_)}catch{f.push(h),n.onText?.(h);return}if(!zi(g))return;let w=cf(g,!1);l===void 0&&w!==void 0&&(l=w),d=cf(g,!0)??d;let y=wK(g);y!==void 0&&(u=y);let E=WR(g);E&&(f.push(E),n.onText?.(E))};o.stdout?.on("data",h=>{let _=h.toString("utf8");i+=_,c+=_;let g=c.indexOf(`
1997
1997
  `);for(;g>=0;){let w=c.slice(0,g);c=c.slice(g+1),p(w),g=c.indexOf(`
1998
1998
  `)}}),o.stderr?.on("data",h=>{a+=h.toString("utf8")}),n.signal&&(n.signal.aborted?o.kill():n.signal.addEventListener("abort",()=>o.kill(),{once:!0})),o.on("exit",h=>{m||(m=!0,c.length>0&&p(c),r({code:h,stdout:i,stderr:a,sessionId:l??d,text:f.join(""),error:u}))}),o.on("error",h=>{m||(m=!0,s(h))})})}function wK(e){let t=e.error;if(typeof t=="string"&&t.length>0)return t;if(zi(t)){let n=t.data;if(zi(n)&&typeof n.message=="string"&&n.message.length>0)return typeof t.name=="string"?`${t.name}: ${n.message}`:n.message;if(typeof t.message=="string"&&t.message.length>0)return t.message}}function WR(e){for(let t of["text","content","delta","output","message"]){let n=e[t];if(typeof n=="string")return n}for(let t of["data","event","payload","part"]){let n=e[t];if(zi(n)){let r=WR(n);if(r)return r}}}function cf(e,t){for(let r of["sessionID","sessionId","session_id"]){let s=e[r];if(typeof s=="string"&&s.length>0)return s}let n=e.session;if(typeof n=="string"&&n.length>0)return n;if(zi(n)){let r=cf(n,t);if(r!==void 0)return r}if(t){let r=e.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=e[r];if(zi(s)){let o=cf(s,t);if(o!==void 0)return o}}}function zi(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}import{readdir as lf,readFile as TK,rm as vK}from"node:fs/promises";import{basename as BR,join as Fs}from"node:path";function SK(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Hc(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function bK(e,t){if(!t)return;e.observed=!0;let n=Hc(t.promptTokenCount),r=Hc(t.cachedContentTokenCount),s=Hc(t.candidatesTokenCount),o=Hc(t.thoughtsTokenCount);e.totalInputTokens+=n,e.totalCachedInputTokens+=r,e.totalOutputTokens+=s,e.totalReasoningOutputTokens+=o,e.lastInputTokens=n,e.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:o,totalTokens:Hc(t.totalTokenCount)||n+s}}function AK(e){return{totalInputTokens:e.observed?e.totalInputTokens:void 0,totalCachedInputTokens:e.observed?e.totalCachedInputTokens:void 0,totalOutputTokens:e.observed?e.totalOutputTokens:void 0,totalReasoningOutputTokens:e.observed?e.totalReasoningOutputTokens:void 0,lastInputTokens:e.lastInputTokens,lastTokenUsage:e.lastTokenUsage}}function GR(e){return e.type==="user"||e.message?.role==="user"}function XR(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function VR(e){let t=e.message;return t?typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
1999
1999
  `):Array.isArray(t.parts)?t.parts.filter(n=>!n.thought&&n.type!=="thinking").map(n=>n.text||"").join(`
2000
- `):"":""}function JR(e){return e.model||e.message?.model}function IK(e){let t=e.message?.content;return typeof t=="string"?t.length>0?1:0:KR(e).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Wc(e,t=!1){if(e!==void 0){if(typeof e=="string")return e;try{return JSON.stringify(e,null,t?2:void 0)}catch{return String(e)}}}function kK(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e;return Wc(t.output??t.error??e)}return Wc(e)}function KR(e){return Array.isArray(e.message?.content)?e.message.content:e.message?.parts??[]}function YR(e,t,n){let r=e.name||"tool";return{role:"tool_use",timestamp:t,content:r,toolName:r,toolInput:Wc(e.args,!0),toolInputData:Dn(e.args),toolCallId:e.id,model:n}}var df=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||Fs(ge,".qwen")}async discoverSessions(){let t=Fs(this.baseDir,"projects"),n;try{n=await lf(t)}catch{return[]}let r=[];for(let s of n){let o=Fs(t,s,"chats"),i;try{i=await lf(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let c=a.replace(/\.jsonl$/,""),l=Fs(o,a);try{let d=await this.extractSummary(l,c);d&&r.push(d)}catch{}}}return r}async extractSummary(t,n){let r=!1,s=await dt(t),o="(unknown)",i,a,c,l,d=0;for await(let u of ze(t)){if(r=!0,u.cwd&&(o=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(o=u.cwd,u.version&&(a=u.version),u.model&&(i=u.model)),GR(u)){let f=VR(u).trim();f&&(c||(c=de(f,80)),l=de(f,80),d++)}if(XR(u)){let f=JR(u);f&&(i=f),d+=IK(u)}}return r?{provider:"qwen",sessionId:n,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:l,messageCount:d,filePath:t}:null}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=BR(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(t,n){let r=await dt(t),s="(unknown)",o,i,a,c,l,d,u=[],f=SK();for await(let m of ze(t)){if(bK(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(i=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(i=m.version),m.model&&(o=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,h=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let _=KR(m).filter(g=>g.functionResponse!==void 0);_.length===0&&m.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:h,content:Wc(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of _){let w=g.functionResponse,y=kK(w.response),E=Wc(m.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:h,content:E??y??m.toolCallResult?.status??"tool result",toolName:w.name,toolCallId:m.toolCallResult?.callId??w.id,...y!==void 0?{toolDetailedContent:y}:{}})}}else if(GR(m)){let _=VR(m);_.trim()&&(l||(l=de(_.trim(),80)),d=de(_.trim(),80)),u.push({role:"user",timestamp:h,content:_})}else if(XR(m)){let _=JR(m);if(_&&(o=_),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:h,content:g.text,model:_}):g.type==="thinking"&&g.thinking?u.push({role:"thinking",timestamp:h,content:g.thinking}):g.functionCall&&u.push(YR(g.functionCall,h,_));else if(typeof p.content=="string")u.push({role:"assistant",timestamp:h,content:p.content,model:_});else if(Array.isArray(p.parts))for(let g of p.parts)if(g.thought||g.type==="thinking"){let w=g.thinking||g.text;w&&u.push({role:"thinking",timestamp:h,content:w})}else g.functionCall?u.push(YR(g.functionCall,h,_)):g.text&&u.push({role:"assistant",timestamp:h,content:g.text,model:_})}}return{provider:"qwen",sessionId:n,slug:c,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:d,messageCount:u.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:t,...AK(f),messages:u}}async resolveSessionPath(t){let n=Fs(this.baseDir,"projects");try{let r=await lf(n),s=[];for(let o of r){let i=Fs(n,o,"chats",`${t}.jsonl`);try{return await TK(i,{flag:"r"}),i}catch{continue}}for(let o of r){let i=Fs(n,o,"chats"),a;try{a=await lf(i)}catch{continue}for(let c of a){if(!c.endsWith(".jsonl"))continue;BR(c,".jsonl").startsWith(t)&&s.push(Fs(i,c))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;try{return await vK(n),!0}catch{return!1}}};function Ig(e){return new Ag(e)}var Ag=class extends Pe{constructor(t){super({provider:new df(t),protocol:{transport:"stream-json",perTurnCancellation:"process",persistentCancellation:"session",persistentResume:!0},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",be,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Ku})}openSession(t){return zu({...t,binary:"qwen"})}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n,"--model",t.model]:n}};import{basename as XK}from"node:path";import{randomUUID as VK}from"node:crypto";import{readdir as zR,readFile as QR,rm as ZR,stat as eN}from"node:fs/promises";import{basename as kg,join as Er}from"node:path";import{fileURLToPath as RK}from"node:url";var uf=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||Er(ge,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Er(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=Er(this.baseDir,"conversations"),n;try{n=await zR(t)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let o=kg(s,".db");try{let i=await this.extractSummary(o);i&&r.push(i)}catch{}}return r}conversationPath(t){return Er(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t,n){return Er(this.baseDir,"brain",t,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(t){for(let n of[this.transcriptPath(t,!0),this.transcriptPath(t,!1)])try{return await eN(n),n}catch{}return null}async extractSummary(t){let n=this.conversationPath(t),r=await this.existingTranscriptPath(t),s=r??n,o=await NK([n,r].filter(Boolean)),i=await this.resolveCwd(t,r),a,c,l,d=0;if(r)for await(let u of ze(r)){let f=sN(u.content);if(f&&(a=f),tN(u)){let m=rN(u.content).trim();m&&(c||(c=de(m,80)),l=de(m,80)),d++}else nN(u)&&u.content&&d++}return{provider:"agy",sessionId:t,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:c,lastUserMessage:l,messageCount:d,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=iN(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let o=await this.existingTranscriptPath(r),i=[],a=s.model,c=s.firstUserMessage,l=s.lastUserMessage,d=[],u=[];if(o)for await(let f of ze(o)){let m=xK(f.created_at,s.modifiedAt),p=sN(f.content);if(p&&(a=p),tN(f)){let h=rN(f.content),_=h.trim();_&&(c||(c=de(_,80)),l=de(_,80)),i.push({role:"user",timestamp:m,content:h});continue}if(Array.isArray(f.tool_calls))for(let h of f.tool_calls){let _=h.name||"tool",g=CK(h.args),w=Dn(h.args),y={role:"tool_use",timestamp:m,content:g,toolName:_,toolInput:g,toolInputData:w};i.push(y),d.push({name:_,stepIndex:f.step_index,input:w,message:y})}if(nN(f)&&f.content)i.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(LK(f)&&f.content){let h=MK(f,r),_=h===void 0?null:await this.readTaskLog(r,h),g={role:"tool_result",timestamp:_?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:h,..._===null?{}:{toolDetailedContent:_.content}};i.push(g),u.push({event:f,message:g})}f.thinking&&i.push({role:"thinking",timestamp:m,content:f.thinking})}return PK(d,u),{...s,model:a,firstUserMessage:c,lastUserMessage:l,messageCount:i.filter(f=>f.role==="user"||f.role==="assistant").length,messages:i}}async resolveSessionPath(t){let n=this.conversationPath(t);try{return await eN(n),n}catch{}let r=Er(this.baseDir,"conversations");try{let s=[];for(let o of await zR(r)){if(!o.endsWith(".db"))continue;kg(o,".db").startsWith(t)&&s.push(Er(r,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;let r=iN(n);return r?(await ZR(this.conversationPath(r),{force:!0}),await ZR(Er(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,n){let r=await this.cwdFromLastConversationCache(t);if(r)return r;if(n){let s=await OK(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let n=Er(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await QR(n,"utf8"));for(let[s,o]of Object.entries(r))if(o===t)return s}catch{}return null}async readTaskLog(t,n){if(!/^task-\d+$/.test(n))return null;let r=Er(this.baseDir,"brain",t,".system_generated","tasks",`${n}.log`);try{let[s,o]=await Promise.all([QR(r,"utf8"),dt(r)]);return{content:s,modifiedAt:o.modifiedAt}}catch{return null}}};async function NK(e){let t=await Promise.all(e.map(n=>dt(n)));return{createdAt:new Date(Math.min(...t.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(n=>n.modifiedAt.getTime())))}}function xK(e,t){if(!e)return t;let n=new Date(e);return Number.isNaN(n.getTime())?t:n}function tN(e){return e.type==="USER_INPUT"}function nN(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function LK(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function rN(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function sN(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function CK(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function OK(e){for await(let t of ze(e)){let n=t.tool_calls?.map(s=>s.args)??[];for(let s of n){let o=DK(s);if(o)return o}let r=$K(t.content);if(r)return r}return null}function DK(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,n=t.Cwd??t.cwd??t.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function $K(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function MK(e,t){if(e.status!=="RUNNING"||!e.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(e.content);if(!(!n||n[1]!==t)&&!(e.step_index===void 0||Number(n[3])!==e.step_index))return n[2]}function PK(e,t){let n=new Set;for(let r of t){let s=UK(e,n,r);if(!s)continue;n.add(s);let o=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=o,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=o}}function UK(e,t,n){let r=n.message.backgroundTaskId===void 0?void 0:HK(n.event.content);if(r!==void 0)return oN(e.filter(o=>!t.has(o)&&WK(o)===r),n.event.step_index);let s=qK(n.event);if(s!==void 0)return oN(e.filter(o=>!t.has(o)&&FK(o.name,n.event.type)&&aN(jK(o))===s),n.event.step_index)}function oN(e,t){if(e.length===0)return;if(e.length===1)return e[0];if(t===void 0)return;let n=e.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(t-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function FK(e,t){return t==="VIEW_FILE"?e==="view_file":t!=="CODE_ACTION"?!1:e==="write_to_file"||e==="replace_file_content"||e==="multi_replace_file_content"}function jK(e){let t=e.name==="view_file"?e.input?.AbsolutePath:e.input?.TargetFile;return typeof t=="string"?t:void 0}function qK(e){if(!e.content)return;let t;return e.type==="VIEW_FILE"?t=/File Path:\s*`?([^`\n]+)`?/.exec(e.content)?.[1]:e.type==="CODE_ACTION"&&(t=/Created file\s+(.+?)\s+with requested content/.exec(e.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(e.content)?.[1]),aN(t)}function aN(e){if(!e)return;let t=e.trim().replace(/^`|`$/g,"");if(!t.startsWith("file://"))return t;try{return RK(t)}catch{return}}function HK(e){if(e)return/Task Description:\s*([^\n]+)/.exec(e)?.[1]?.trim()}function WK(e){if(e.name==="run_command"){let t=e.input?.CommandLine;return typeof t=="string"?t:void 0}if(e.name==="schedule"){let t=e.input?.DurationSeconds,n=e.input?.Prompt;return typeof t!="string"&&typeof t!="number"||typeof n!="string"?void 0:`Timer: ${t}s, Prompt: ${n}`}}function iN(e){if(e.endsWith(".db"))return kg(e,".db");let t="/brain/",n=e.indexOf(t);return n===-1?null:e.slice(n+t.length).split("/")[0]||null}import{spawn as BK}from"node:child_process";import{StringDecoder as cN}from"node:string_decoder";function ff(e){return async(t,n)=>{let r=Date.now(),s=e.buildArgs(t,n);e.assertArgs?.(s,n),n.onProgress?.({kind:"system",summary:`${e.label} -p one-shot started (no streaming events)`});let{stdout:o}=await GK(e.label,n.binary,s,{cwd:n.cwd,env:kt(n.env,n.cwd,n.sessionId),signal:n.signal});return n.onProgress?.({kind:"system",summary:`${e.label} -p one-shot completed`}),{text:o.trimEnd(),sessionId:n.sessionId,durationMs:Date.now()-r}}}function GK(e,t,n,r){return new Promise((s,o)=>{if(r.signal?.aborted){o(new Error(`${e} turn aborted`));return}let i;try{i=BK(t,n,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(f){o(f);return}let a="",c="",l=new cN("utf8"),d=new cN("utf8");i.stdout?.on("data",f=>{a+=l.write(f)}),i.stderr?.on("data",f=>{c+=d.write(f)});let u=()=>{i.kill("SIGTERM"),o(new Error(`${e} turn aborted`))};i.on("error",f=>{r.signal?.removeEventListener("abort",u),o(f)}),i.on("close",(f,m)=>{if(r.signal?.removeEventListener("abort",u),a+=l.end(),c+=d.end(),f===0){s({stdout:a,stderr:c});return}let p=m?`signal ${m}`:`exit code ${f}`,h=c.trim()||a.trim();o(new Error(Hi(`${e} failed (${p})`,h?tt(h,{provider:e}):"")))}),r.signal?.aborted?u():r.signal?.addEventListener("abort",u,{once:!0})})}function Ng(e){return new Rg(e)}var Rg=class extends Pe{constructor(t){super({provider:new uf(t),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",be,"--dangerously-skip-permissions","--print-timeout","2m"],seedTimeoutMs:13e4,resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:JK})}async sendTurn(t,n){if(n.requireResume){let s=await this.resolvePath(n.sessionId);if(s===null||XK(s)!==`${n.sessionId}.db`)throw new Error(`agy cannot resume missing conversation "${n.sessionId}"`)}let r=await super.sendTurn(t,n);return n.permissionMode==="plan"?{...r,warnings:[...r.warnings??[],"agy does not enforce plan mode; this turn used full permissions"]}:r}seedArgsFor(t){let n=[...super.seedArgsFor(t)];return t?.model&&n.push("--model",t.model),n}async seed(t,n){let r=VK(),s=`[lmctl-seed:${r}]`,o=await super.seed(t,{...n,prompt:sk({flightToken:r,prompt:n?.prompt})});if(!o.success&&(o.errorCode==="ENOENT"||o.errorCode==="ABORT_ERR"))return o;let i=(await this.provider.discoverSessions()).filter(a=>a.firstUserMessage?.startsWith(s));if(o.success&&i.length===1)return{...o,sessionId:i[0].sessionId};for(let a of i)await this.provider.deleteSession(a.sessionId);return{...o,success:!1,error:o.error??`agy seed created ${i.length} identifiable sessions; expected one`}}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}},JK=ff({label:"agy",buildArgs:(e,t)=>{let n=[...t.sessionId?["--conversation",t.sessionId]:[],"-p",e,"--dangerously-skip-permissions","--print-timeout",YK(t.timeoutMs)];return t.model&&n.push("--model",t.model),n},assertArgs:(e,t)=>vt("agy",e,t.permissionMode??"yolo")});function YK(e){return e!==void 0&&e<=0?"0":e===void 0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}import{randomUUID as hN}from"node:crypto";import{existsSync as _N,statSync as az}from"node:fs";import{readFile as cz,mkdir as lz}from"node:fs/promises";import{existsSync as Bc,readdirSync as KK,statSync as lN}from"node:fs";import{readdir as xg,rm as zK}from"node:fs/promises";import dN,{join as yr}from"node:path";var mf=class{name="dsh";sessionsDir;constructor(t={}){let n=t.dshHome||process.env.DSH_HOME||yr(ge,".dsh");this.sessionsDir=yr(n,"sessions")}async discoverSessions(){let t=[],n;try{n=await xg(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await xg(yr(this.sessionsDir,r))}catch{continue}for(let o of s)if(o.startsWith("session-"))try{let i=await this.readSummary(r,o);i&&t.push(i)}catch{}}return t}async loadSession(t){let n=await this.findSessionDir(t);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=uN(r),o=fN(r,n.filePath,s);return o?{...o,turnStatus:tz(r),messages:s}:null}async resolveSessionPath(t){return(await this.findSessionDir(t))?.filePath??null}async deleteSession(t){let n=await this.findSessionDir(t);return n?(await zK(yr(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(t,n){let r=QK(t),s=ZK(t),o=r,i=yr(this.sessionsDir,r,n),a=yr(this.sessionsDir,s,n);!Bc(i)&&Bc(a)&&(o=s);let c=yr(this.sessionsDir,o,n);return Qi(c)}async findSessionDir(t){let n;try{n=await xg(this.sessionsDir)}catch{return null}for(let r of n){let s=t,o=yr(this.sessionsDir,r,s);try{let i=Qi(o);if(Bc(i))return{cwdDir:r,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(t,n){let{readFile:r}=await import("node:fs/promises"),s=yr(this.sessionsDir,t,n),o=Qi(s),i=await r(o),a=Kd(i),c=[];for(let l of a.split(`
2001
- `))if(l.trim())try{let d=JSON.parse(l);if(d.type?.endsWith("-chunks")||d.type==="assistant/chunk"&&d.data?.chunk?.type!=="usage")continue;c.push(d)}catch{}return c}async readSummary(t,n){let r=yr(this.sessionsDir,t,n),s=Qi(r),o=await this.readRecords(t,n);return o.length===0?null:fN(o,s,uN(o))}};function QK(e){if(e.length===0)throw new Error("cannot encode an empty project path");let t="",n=!1;for(let s=0;s<e.length;s++){let o=e.charCodeAt(s),i=String.fromCharCode(o);i==="/"||i==="\\"||i===":"?(n||(t+="-"),n=!0):i!=="~"&&/^[A-Za-z0-9._-]$/.test(i)?(t+=i,n=!1):(t+="~"+o.toString(16).toUpperCase().padStart(4,"0"),n=!1)}return`--${(t.replace(/^-+/,"")||"root").slice(0,251)}--`}function ZK(e){return"--"+e.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Qi(e,t){let n=t??(process.platform==="win32"?dN.win32:dN.posix),r=e,s="session.jsonl.zstd";if((e.endsWith(".jsonl.zstd")||e.endsWith(".jsonl"))&&(r=n.dirname(e),s=n.basename(e)),!Bc(r))return e.endsWith(".jsonl.zstd")||e.endsWith(".jsonl")?e:n.join(e,s);try{let o=KK(r),i=[];for(let a of o){let c=/^session(?:\.v(\d+))?\.jsonl\.zstd$/.exec(a);if(c){let l=c[1]?parseInt(c[1],10):0;if(Number.isSafeInteger(l))try{let d=n.join(r,a);lN(d).isFile()&&i.push({name:a,version:l})}catch{}}}if(i.length>0)return i.sort((a,c)=>c.version-a.version),n.join(r,i[0].name)}catch{}try{if(Bc(e)&&lN(e).isFile())return e}catch{}return n.join(r,s)}function Lg(e){if(typeof e=="string")return e;if(!Array.isArray(e))return"";let t=[];for(let n of e)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&t.push(n.text);return t.join("")}function ez(e){if(!Array.isArray(e))return[];let t=[];for(let n of e)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&t.push(n.text);return t}function uN(e){let t=[];for(let n of e){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let o=r;if(o.source?.kind!==void 0&&o.source.kind!=="user")continue;t.push({role:"user",timestamp:s,content:Lg(o.content)})}else if(n.type==="assistant/message"){let o=r.message;for(let i of ez(o?.content))t.push({role:"thinking",timestamp:s,content:i});t.push({role:"assistant",timestamp:s,content:Lg(o?.content),model:o?.source?.model})}else if(n.type==="tool/call"){let o=r,i;if(typeof o.arguments=="string")try{i=JSON.parse(o.arguments)}catch{}else o.arguments&&typeof o.arguments=="object"&&(i=o.arguments);t.push({role:"tool_use",timestamp:s,content:typeof o.arguments=="string"?o.arguments:JSON.stringify(o.arguments??{}),toolName:o.name,toolCallId:o.callId,toolInputData:i})}else if(n.type==="tool/result"){let o=r,a=(Array.isArray(o.message?.content)?o.message.content:[])[0];t.push({role:"tool_result",timestamp:s,content:Lg(a?.content??o.message?.content),toolCallId:a?.toolCallId??o.message?.source?.callId})}}return t}function tz(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function fN(e,t,n){let r=e.find(m=>m.type==="session");if(!r)return null;let s=r,o=r.data,i=s.id??o?.id;if(!i)return null;let a;for(let m of e)if(m.type==="request/header"){let p=m.data?.header;p?.config?.model&&(a=p.config.model)}let c=e.map(m=>m.time).filter(m=>typeof m=="number"),l=s.createdAt??o?.createdAt,d=l?new Date(l):new Date(0),u=c.length>0?new Date(Math.max(...c)):d,f=n.filter(m=>m.role==="user");return{provider:"dsh",sessionId:i,cwd:s.cwd??o?.cwd??"",createdAt:d,modifiedAt:u,model:a,firstUserMessage:f[0]?.content,lastUserMessage:f.at(-1)?.content,messageCount:n.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:t,...nz(e)}}function nz(e){let t=new Map;for(let i of e){let a=i.data?.turn??null,c=t.get(a)??[];c.push(i),t.set(a,c)}let n=[],r=[];for(let i of t.values()){let a=new Gi("",-1,new Set);a.update(i);let c=a.usage();c&&(n.push(c),r.push(a.lastUsage()))}if(!n.length)return{};let s=i=>{if(n.some(c=>c.invalidCounters||c[i]===null))return;let a=n.reduce((c,l)=>c+l[i],0);return Number.isSafeInteger(a)?a:void 0},o=r.at(-1);return{totalInputTokens:s("inputUncached"),totalCachedInputTokens:s("cacheRead"),totalOutputTokens:s("output"),totalReasoningOutputTokens:s("reasoning"),lastInputTokens:o.inputUncached!==null&&o.cacheRead!==null?o.inputUncached+o.cacheRead:void 0,lastTokenUsage:{totalTokens:o.inputUncached!==null&&o.cacheRead!==null&&o.output!==null?o.inputUncached+o.cacheRead+o.output:void 0,inputTokens:o.inputUncached??void 0,cachedInputTokens:o.cacheRead??void 0,outputTokens:o.output??void 0,reasoningOutputTokens:o.reasoning??void 0}}}import{spawn as rz}from"node:child_process";import{randomUUID as sz}from"node:crypto";var oz=/dsh web:\s*(https?:\/\/\S+)/,mN=2e4;function Cg(e,t=[]){if(e==null)return e;if(typeof e=="string"){let n=e;for(let r of t)r&&typeof r=="string"&&r.length>=8&&n.includes(r)&&(n=n.replaceAll(r,"[REDACTED]"));return n=n.replace(/(?:sk-|dsh-)[A-Za-z0-9_\-\.]+/gi,"[REDACTED]"),n=n.replace(/(?:token=)[A-Za-z0-9_\-\.]+/gi,"token=[REDACTED]"),n=n.replace(/bearer\s+[A-Za-z0-9_\-\.]+/gi,"Bearer [REDACTED]"),n}if(Array.isArray(e))return e.map(n=>Cg(n,t));if(typeof e=="object"){let n={};for(let[r,s]of Object.entries(e))/api[_-]?key|secret|token|password|auth|authorization|credential|cookie/i.test(r)?n[r]="[REDACTED]":n[r]=Cg(s,t);return n}return e}function iz(e){let t;try{t=new URL(e)}catch{throw new Error("invalid dsh boot URL: malformed URL")}if(t.protocol!=="http:")throw new Error(`invalid dsh boot URL scheme "${t.protocol}": must be http:`);if(t.username||t.password)throw new Error("invalid dsh boot URL: userinfo credentials are not allowed");let n=t.hostname;if(!(n==="127.0.0.1"||n==="localhost"||n==="::1"||n==="[::1]"))throw new Error(`invalid dsh boot URL host "${n}": loopback host (127.0.0.1 or localhost) required`);return t}var Xr=class e extends Error{method;detail;constructor(t,n,r=[]){let s=Cg(n,r),o=typeof s=="string"?s:JSON.stringify(s);super(`dsh RPC ${t} failed: ${o}`),this.name="DshRpcCallError",this.method=t,this.detail=s,Object.setPrototypeOf(this,e.prototype)}};function pN(e,t=2e3){if(!e||e.exitCode!==null||e.signalCode!==null)return;try{e.kill("SIGTERM")}catch{}let n,r=()=>{n!==void 0&&(clearTimeout(n),n=void 0)};if(e.once("exit",r),e.exitCode!==null||e.signalCode!==null){r();return}n=setTimeout(()=>{n=void 0;try{e.exitCode===null&&e.signalCode===null&&e.kill("SIGKILL")}catch{}},t),n.unref()}var Og=class e{baseUrl;child;cookie;isV2;tokenUrl;static MAX_RETAINED_SECRETS=8;cookieExchangePromise;knownSecrets=[];constructor(t,n,r,s=!1,o){if(this.baseUrl=t,this.child=n,this.cookie=r,this.isV2=s,this.tokenUrl=o,this.cookie&&this.recordSecret(this.cookie),this.tokenUrl){this.recordSecret(this.tokenUrl);try{let a=new URL(this.tokenUrl).searchParams.get("token");a&&this.recordSecret(a)}catch{}}}recordSecret(t){if(!t||typeof t!="string"||t.length<8)return;let n=r=>{if(r.length<8)return;let s=this.knownSecrets.indexOf(r);for(s!==-1&&this.knownSecrets.splice(s,1),this.knownSecrets.push(r);this.knownSecrets.length>e.MAX_RETAINED_SECRETS;)this.knownSecrets.shift()};if(n(t),t.includes("=")){let r=t.split("=")[1];r&&r.length>=8&&n(r)}}getSecretsToRedact(t=[]){let n=new Set;for(let r of this.knownSecrets)r&&r.length>=8&&n.add(r);if(this.cookie&&this.cookie.length>=8){n.add(this.cookie);let r=this.cookie.split("=")[1];r&&r.length>=8&&n.add(r)}if(this.tokenUrl)try{let s=new URL(this.tokenUrl).searchParams.get("token");s&&s.length>=8&&n.add(s)}catch{}for(let r of t)if(r&&r.length>=8&&(n.add(r),r.includes("="))){let s=r.split("=")[1];s&&s.length>=8&&n.add(s)}return Array.from(n)}static forTesting(t,n){let r=t,s=n?.isV2??!1,o=n?.cookie;try{let i=new URL(t);i.searchParams.has("token")&&(s=!0,r=i.origin)}catch{}return new e(r,void 0,o,s,t)}static async fromBootUrl(t,n,r){let s=iz(t),o=s.searchParams.has("token"),i;if(o)for(let a=0;a<5;a++){if(r?.aborted)throw new Error("dsh web boot aborted");try{let l=(await fetch(t,{redirect:"manual",signal:r})).headers.get("set-cookie");if(l){i=l.split(";")[0];break}}catch(c){if(r?.aborted)throw c;await new Promise(l=>setTimeout(l,100))}}return new e(s.origin,n,i,o,t)}async ensureCookie(t=!1){return this.tokenUrl?this.cookie&&!t?this.cookie:(this.cookieExchangePromise||(this.cookieExchangePromise=(async()=>{for(let n=0;n<5;n++)try{let r=AbortSignal.timeout(1e4),o=(await fetch(this.tokenUrl,{redirect:"manual",signal:r})).headers.get("set-cookie");if(o)return this.cookie=o.split(";")[0],this.recordSecret(this.cookie),this.cookie}catch{await new Promise(r=>setTimeout(r,100))}return this.cookie})().finally(()=>{this.cookieExchangePromise=void 0})),this.cookieExchangePromise):this.cookie}async rpc(t,n){this.isV2&&await this.ensureCookie();let r=this.cookie,s=r?[r]:[],o=`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,i=this.isV2?t.includes("/")?t:t.replace(/\./g,"/"):t.includes(".")?t:t.replace(/\//g,"."),a=n;if(this.isV2){let f=n;if(i==="session/prompt"&&f&&typeof f=="object"){let m=f;m.requestId||(f={...m,requestId:sz()})}f&&typeof f=="object"&&"args"in f?a=f:a={args:{request:f}}}let c={"content-type":"application/json"};this.cookie&&(c.cookie=this.cookie);let l;try{l=await fetch(`${this.baseUrl}/api/${i}`,{method:"POST",headers:c,body:JSON.stringify({type:"client-request",rpcId:o,method:i,payload:a}),redirect:"manual"})}catch(f){throw new Xr(t,`transport error: ${f instanceof Error?f.message:String(f)}`,this.getSecretsToRedact(s))}if(l.status>=300&&l.status<400)throw new Xr(t,`redirects are not permitted (HTTP ${l.status})`,this.getSecretsToRedact(s));if((l.status===401||l.status===403)&&this.isV2&&this.tokenUrl){let f=await this.ensureCookie(!0);if(f&&f!==c.cookie){c.cookie=f,s.push(f);try{l=await fetch(`${this.baseUrl}/api/${i}`,{method:"POST",headers:c,body:JSON.stringify({type:"client-request",rpcId:o,method:i,payload:a}),redirect:"manual"})}catch(m){throw new Xr(t,`transport error: ${m instanceof Error?m.message:String(m)}`,this.getSecretsToRedact(s))}if(l.status>=300&&l.status<400)throw new Xr(t,`redirects are not permitted (HTTP ${l.status})`,this.getSecretsToRedact(s))}}let d;try{d=await l.json()}catch{d=void 0}if(!l.ok)throw new Xr(t,d??l.statusText,this.getSecretsToRedact(s));let u=d&&typeof d=="object"?d.result:void 0;if(!u||typeof u!="object"||typeof u.ok!="boolean")throw new Xr(t,"malformed response: HTTP 200 but body is not a well-formed {result:{ok,\u2026}} envelope",this.getSecretsToRedact(s));if(u.ok===!1)throw new Xr(t,u.error??u,this.getSecretsToRedact(s));return"value"in u?u.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&&pN(this.child,2e3)}static spawn(t){return new Promise((n,r)=>{let s=rz("dsh",["web","--no-open","--port","0"],{env:t,stdio:["ignore","pipe","pipe"]}),o=!1,i=!1,a="",c="",l="",d=new AbortController,u=m=>{o||(o=!0,clearTimeout(f),d.abort(),pN(s,2e3),r(m))},f=setTimeout(()=>{let m=[c?`stdout:
2000
+ `):"":""}function JR(e){return e.model||e.message?.model}function IK(e){let t=e.message?.content;return typeof t=="string"?t.length>0?1:0:KR(e).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Wc(e,t=!1){if(e!==void 0){if(typeof e=="string")return e;try{return JSON.stringify(e,null,t?2:void 0)}catch{return String(e)}}}function kK(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e;return Wc(t.output??t.error??e)}return Wc(e)}function KR(e){return Array.isArray(e.message?.content)?e.message.content:e.message?.parts??[]}function YR(e,t,n){let r=e.name||"tool";return{role:"tool_use",timestamp:t,content:r,toolName:r,toolInput:Wc(e.args,!0),toolInputData:Dn(e.args),toolCallId:e.id,model:n}}var df=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||Fs(ge,".qwen")}async discoverSessions(){let t=Fs(this.baseDir,"projects"),n;try{n=await lf(t)}catch{return[]}let r=[];for(let s of n){let o=Fs(t,s,"chats"),i;try{i=await lf(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let c=a.replace(/\.jsonl$/,""),l=Fs(o,a);try{let d=await this.extractSummary(l,c);d&&r.push(d)}catch{}}}return r}async extractSummary(t,n){let r=!1,s=await dt(t),o="(unknown)",i,a,c,l,d=0;for await(let u of ze(t)){if(r=!0,u.cwd&&(o=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(o=u.cwd,u.version&&(a=u.version),u.model&&(i=u.model)),GR(u)){let f=VR(u).trim();f&&(c||(c=de(f,80)),l=de(f,80),d++)}if(XR(u)){let f=JR(u);f&&(i=f),d+=IK(u)}}return r?{provider:"qwen",sessionId:n,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:l,messageCount:d,filePath:t}:null}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=BR(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(t,n){let r=await dt(t),s="(unknown)",o,i,a,c,l,d,u=[],f=SK();for await(let m of ze(t)){if(bK(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(i=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(i=m.version),m.model&&(o=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,h=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let _=KR(m).filter(g=>g.functionResponse!==void 0);_.length===0&&m.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:h,content:Wc(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of _){let w=g.functionResponse,y=kK(w.response),E=Wc(m.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:h,content:E??y??m.toolCallResult?.status??"tool result",toolName:w.name,toolCallId:m.toolCallResult?.callId??w.id,...y!==void 0?{toolDetailedContent:y}:{}})}}else if(GR(m)){let _=VR(m);_.trim()&&(l||(l=de(_.trim(),80)),d=de(_.trim(),80)),u.push({role:"user",timestamp:h,content:_})}else if(XR(m)){let _=JR(m);if(_&&(o=_),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:h,content:g.text,model:_}):g.type==="thinking"&&g.thinking?u.push({role:"thinking",timestamp:h,content:g.thinking}):g.functionCall&&u.push(YR(g.functionCall,h,_));else if(typeof p.content=="string")u.push({role:"assistant",timestamp:h,content:p.content,model:_});else if(Array.isArray(p.parts))for(let g of p.parts)if(g.thought||g.type==="thinking"){let w=g.thinking||g.text;w&&u.push({role:"thinking",timestamp:h,content:w})}else g.functionCall?u.push(YR(g.functionCall,h,_)):g.text&&u.push({role:"assistant",timestamp:h,content:g.text,model:_})}}return{provider:"qwen",sessionId:n,slug:c,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:d,messageCount:u.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:t,...AK(f),messages:u}}async resolveSessionPath(t){let n=Fs(this.baseDir,"projects");try{let r=await lf(n),s=[];for(let o of r){let i=Fs(n,o,"chats",`${t}.jsonl`);try{return await TK(i,{flag:"r"}),i}catch{continue}}for(let o of r){let i=Fs(n,o,"chats"),a;try{a=await lf(i)}catch{continue}for(let c of a){if(!c.endsWith(".jsonl"))continue;BR(c,".jsonl").startsWith(t)&&s.push(Fs(i,c))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;try{return await vK(n),!0}catch{return!1}}};function Ig(e){return new Ag(e)}var Ag=class extends Pe{constructor(t){super({provider:new df(t),protocol:{transport:"stream-json",perTurnCancellation:"process",persistentCancellation:"session",persistentResume:!0},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",be,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:Ku})}openSession(t){return zu({...t,binary:"qwen"})}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n,"--model",t.model]:n}};import{basename as XK}from"node:path";import{randomUUID as VK}from"node:crypto";import{readdir as zR,readFile as QR,rm as ZR,stat as eN}from"node:fs/promises";import{basename as kg,join as Er}from"node:path";import{fileURLToPath as RK}from"node:url";var uf=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||Er(ge,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Er(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=Er(this.baseDir,"conversations"),n;try{n=await zR(t)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let o=kg(s,".db");try{let i=await this.extractSummary(o);i&&r.push(i)}catch{}}return r}conversationPath(t){return Er(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t,n){return Er(this.baseDir,"brain",t,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(t){for(let n of[this.transcriptPath(t,!0),this.transcriptPath(t,!1)])try{return await eN(n),n}catch{}return null}async extractSummary(t){let n=this.conversationPath(t),r=await this.existingTranscriptPath(t),s=r??n,o=await NK([n,r].filter(Boolean)),i=await this.resolveCwd(t,r),a,c,l,d=0;if(r)for await(let u of ze(r)){let f=sN(u.content);if(f&&(a=f),tN(u)){let m=rN(u.content).trim();m&&(c||(c=de(m,80)),l=de(m,80)),d++}else nN(u)&&u.content&&d++}return{provider:"agy",sessionId:t,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:c,lastUserMessage:l,messageCount:d,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=iN(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let o=await this.existingTranscriptPath(r),i=[],a=s.model,c=s.firstUserMessage,l=s.lastUserMessage,d=[],u=[];if(o)for await(let f of ze(o)){let m=xK(f.created_at,s.modifiedAt),p=sN(f.content);if(p&&(a=p),tN(f)){let h=rN(f.content),_=h.trim();_&&(c||(c=de(_,80)),l=de(_,80)),i.push({role:"user",timestamp:m,content:h});continue}if(Array.isArray(f.tool_calls))for(let h of f.tool_calls){let _=h.name||"tool",g=CK(h.args),w=Dn(h.args),y={role:"tool_use",timestamp:m,content:g,toolName:_,toolInput:g,toolInputData:w};i.push(y),d.push({name:_,stepIndex:f.step_index,input:w,message:y})}if(nN(f)&&f.content)i.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(LK(f)&&f.content){let h=MK(f,r),_=h===void 0?null:await this.readTaskLog(r,h),g={role:"tool_result",timestamp:_?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:h,..._===null?{}:{toolDetailedContent:_.content}};i.push(g),u.push({event:f,message:g})}f.thinking&&i.push({role:"thinking",timestamp:m,content:f.thinking})}return PK(d,u),{...s,model:a,firstUserMessage:c,lastUserMessage:l,messageCount:i.filter(f=>f.role==="user"||f.role==="assistant").length,messages:i}}async resolveSessionPath(t){let n=this.conversationPath(t);try{return await eN(n),n}catch{}let r=Er(this.baseDir,"conversations");try{let s=[];for(let o of await zR(r)){if(!o.endsWith(".db"))continue;kg(o,".db").startsWith(t)&&s.push(Er(r,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;let r=iN(n);return r?(await ZR(this.conversationPath(r),{force:!0}),await ZR(Er(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,n){let r=await this.cwdFromLastConversationCache(t);if(r)return r;if(n){let s=await OK(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let n=Er(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await QR(n,"utf8"));for(let[s,o]of Object.entries(r))if(o===t)return s}catch{}return null}async readTaskLog(t,n){if(!/^task-\d+$/.test(n))return null;let r=Er(this.baseDir,"brain",t,".system_generated","tasks",`${n}.log`);try{let[s,o]=await Promise.all([QR(r,"utf8"),dt(r)]);return{content:s,modifiedAt:o.modifiedAt}}catch{return null}}};async function NK(e){let t=await Promise.all(e.map(n=>dt(n)));return{createdAt:new Date(Math.min(...t.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(n=>n.modifiedAt.getTime())))}}function xK(e,t){if(!e)return t;let n=new Date(e);return Number.isNaN(n.getTime())?t:n}function tN(e){return e.type==="USER_INPUT"}function nN(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function LK(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function rN(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function sN(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function CK(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function OK(e){for await(let t of ze(e)){let n=t.tool_calls?.map(s=>s.args)??[];for(let s of n){let o=DK(s);if(o)return o}let r=$K(t.content);if(r)return r}return null}function DK(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,n=t.Cwd??t.cwd??t.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function $K(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function MK(e,t){if(e.status!=="RUNNING"||!e.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(e.content);if(!(!n||n[1]!==t)&&!(e.step_index===void 0||Number(n[3])!==e.step_index))return n[2]}function PK(e,t){let n=new Set;for(let r of t){let s=UK(e,n,r);if(!s)continue;n.add(s);let o=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=o,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=o}}function UK(e,t,n){let r=n.message.backgroundTaskId===void 0?void 0:HK(n.event.content);if(r!==void 0)return oN(e.filter(o=>!t.has(o)&&WK(o)===r),n.event.step_index);let s=qK(n.event);if(s!==void 0)return oN(e.filter(o=>!t.has(o)&&FK(o.name,n.event.type)&&aN(jK(o))===s),n.event.step_index)}function oN(e,t){if(e.length===0)return;if(e.length===1)return e[0];if(t===void 0)return;let n=e.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(t-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function FK(e,t){return t==="VIEW_FILE"?e==="view_file":t!=="CODE_ACTION"?!1:e==="write_to_file"||e==="replace_file_content"||e==="multi_replace_file_content"}function jK(e){let t=e.name==="view_file"?e.input?.AbsolutePath:e.input?.TargetFile;return typeof t=="string"?t:void 0}function qK(e){if(!e.content)return;let t;return e.type==="VIEW_FILE"?t=/File Path:\s*`?([^`\n]+)`?/.exec(e.content)?.[1]:e.type==="CODE_ACTION"&&(t=/Created file\s+(.+?)\s+with requested content/.exec(e.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(e.content)?.[1]),aN(t)}function aN(e){if(!e)return;let t=e.trim().replace(/^`|`$/g,"");if(!t.startsWith("file://"))return t;try{return RK(t)}catch{return}}function HK(e){if(e)return/Task Description:\s*([^\n]+)/.exec(e)?.[1]?.trim()}function WK(e){if(e.name==="run_command"){let t=e.input?.CommandLine;return typeof t=="string"?t:void 0}if(e.name==="schedule"){let t=e.input?.DurationSeconds,n=e.input?.Prompt;return typeof t!="string"&&typeof t!="number"||typeof n!="string"?void 0:`Timer: ${t}s, Prompt: ${n}`}}function iN(e){if(e.endsWith(".db"))return kg(e,".db");let t="/brain/",n=e.indexOf(t);return n===-1?null:e.slice(n+t.length).split("/")[0]||null}import{spawn as BK}from"node:child_process";import{StringDecoder as cN}from"node:string_decoder";function ff(e){return async(t,n)=>{let r=Date.now(),s=e.buildArgs(t,n);e.assertArgs?.(s,n),n.onProgress?.({kind:"system",summary:`${e.label} -p one-shot started (no streaming events)`});let{stdout:o}=await GK(e.label,n.binary,s,{cwd:n.cwd,env:Rt(n.env,n.cwd,n.sessionId),signal:n.signal});return n.onProgress?.({kind:"system",summary:`${e.label} -p one-shot completed`}),{text:o.trimEnd(),sessionId:n.sessionId,durationMs:Date.now()-r}}}function GK(e,t,n,r){return new Promise((s,o)=>{if(r.signal?.aborted){o(new Error(`${e} turn aborted`));return}let i;try{i=BK(t,n,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(f){o(f);return}let a="",c="",l=new cN("utf8"),d=new cN("utf8");i.stdout?.on("data",f=>{a+=l.write(f)}),i.stderr?.on("data",f=>{c+=d.write(f)});let u=()=>{i.kill("SIGTERM"),o(new Error(`${e} turn aborted`))};i.on("error",f=>{r.signal?.removeEventListener("abort",u),o(f)}),i.on("close",(f,m)=>{if(r.signal?.removeEventListener("abort",u),a+=l.end(),c+=d.end(),f===0){s({stdout:a,stderr:c});return}let p=m?`signal ${m}`:`exit code ${f}`,h=c.trim()||a.trim();o(new Error(Hi(`${e} failed (${p})`,h?tt(h,{provider:e}):"")))}),r.signal?.aborted?u():r.signal?.addEventListener("abort",u,{once:!0})})}function Ng(e){return new Rg(e)}var Rg=class extends Pe{constructor(t){super({provider:new uf(t),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",be,"--dangerously-skip-permissions","--print-timeout","2m"],seedTimeoutMs:13e4,resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:JK})}async sendTurn(t,n){if(n.requireResume){let s=await this.resolvePath(n.sessionId);if(s===null||XK(s)!==`${n.sessionId}.db`)throw new Error(`agy cannot resume missing conversation "${n.sessionId}"`)}let r=await super.sendTurn(t,n);return n.permissionMode==="plan"?{...r,warnings:[...r.warnings??[],"agy does not enforce plan mode; this turn used full permissions"]}:r}seedArgsFor(t){let n=[...super.seedArgsFor(t)];return t?.model&&n.push("--model",t.model),n}async seed(t,n){let r=VK(),s=`[lmctl-seed:${r}]`,o=await super.seed(t,{...n,prompt:sk({flightToken:r,prompt:n?.prompt})});if(!o.success&&(o.errorCode==="ENOENT"||o.errorCode==="ABORT_ERR"))return o;let i=(await this.provider.discoverSessions()).filter(a=>a.firstUserMessage?.startsWith(s));if(o.success&&i.length===1)return{...o,sessionId:i[0].sessionId};for(let a of i)await this.provider.deleteSession(a.sessionId);return{...o,success:!1,error:o.error??`agy seed created ${i.length} identifiable sessions; expected one`}}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}},JK=ff({label:"agy",buildArgs:(e,t)=>{let n=[...t.sessionId?["--conversation",t.sessionId]:[],"-p",e,"--dangerously-skip-permissions","--print-timeout",YK(t.timeoutMs)];return t.model&&n.push("--model",t.model),n},assertArgs:(e,t)=>St("agy",e,t.permissionMode??"yolo")});function YK(e){return e!==void 0&&e<=0?"0":e===void 0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}import{randomUUID as hN}from"node:crypto";import{existsSync as _N,statSync as az}from"node:fs";import{readFile as cz,mkdir as lz}from"node:fs/promises";import{existsSync as Bc,readdirSync as KK,statSync as lN}from"node:fs";import{readdir as xg,rm as zK}from"node:fs/promises";import dN,{join as yr}from"node:path";var mf=class{name="dsh";sessionsDir;constructor(t={}){let n=t.dshHome||process.env.DSH_HOME||yr(ge,".dsh");this.sessionsDir=yr(n,"sessions")}async discoverSessions(){let t=[],n;try{n=await xg(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await xg(yr(this.sessionsDir,r))}catch{continue}for(let o of s)if(o.startsWith("session-"))try{let i=await this.readSummary(r,o);i&&t.push(i)}catch{}}return t}async loadSession(t){let n=await this.findSessionDir(t);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=uN(r),o=fN(r,n.filePath,s);return o?{...o,turnStatus:tz(r),messages:s}:null}async resolveSessionPath(t){return(await this.findSessionDir(t))?.filePath??null}async deleteSession(t){let n=await this.findSessionDir(t);return n?(await zK(yr(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(t,n){let r=QK(t),s=ZK(t),o=r,i=yr(this.sessionsDir,r,n),a=yr(this.sessionsDir,s,n);!Bc(i)&&Bc(a)&&(o=s);let c=yr(this.sessionsDir,o,n);return Qi(c)}async findSessionDir(t){let n;try{n=await xg(this.sessionsDir)}catch{return null}for(let r of n){let s=t,o=yr(this.sessionsDir,r,s);try{let i=Qi(o);if(Bc(i))return{cwdDir:r,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(t,n){let{readFile:r}=await import("node:fs/promises"),s=yr(this.sessionsDir,t,n),o=Qi(s),i=await r(o),a=Kd(i),c=[];for(let l of a.split(`
2001
+ `))if(l.trim())try{let d=JSON.parse(l);if(d.type?.endsWith("-chunks")||d.type==="assistant/chunk"&&d.data?.chunk?.type!=="usage")continue;c.push(d)}catch{}return c}async readSummary(t,n){let r=yr(this.sessionsDir,t,n),s=Qi(r),o=await this.readRecords(t,n);return o.length===0?null:fN(o,s,uN(o))}};function QK(e){if(e.length===0)throw new Error("cannot encode an empty project path");let t="",n=!1;for(let s=0;s<e.length;s++){let o=e.charCodeAt(s),i=String.fromCharCode(o);i==="/"||i==="\\"||i===":"?(n||(t+="-"),n=!0):i!=="~"&&/^[A-Za-z0-9._-]$/.test(i)?(t+=i,n=!1):(t+="~"+o.toString(16).toUpperCase().padStart(4,"0"),n=!1)}return`--${(t.replace(/^-+/,"")||"root").slice(0,251)}--`}function ZK(e){return"--"+e.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Qi(e,t){let n=t??(process.platform==="win32"?dN.win32:dN.posix),r=e,s="session.jsonl.zstd";if((e.endsWith(".jsonl.zstd")||e.endsWith(".jsonl"))&&(r=n.dirname(e),s=n.basename(e)),!Bc(r))return e.endsWith(".jsonl.zstd")||e.endsWith(".jsonl")?e:n.join(e,s);try{let o=KK(r),i=[];for(let a of o){let c=/^session(?:\.v(\d+))?\.jsonl\.zstd$/.exec(a);if(c){let l=c[1]?parseInt(c[1],10):0;if(Number.isSafeInteger(l))try{let d=n.join(r,a);lN(d).isFile()&&i.push({name:a,version:l})}catch{}}}if(i.length>0)return i.sort((a,c)=>c.version-a.version),n.join(r,i[0].name)}catch{}try{if(Bc(e)&&lN(e).isFile())return e}catch{}return n.join(r,s)}function Lg(e){if(typeof e=="string")return e;if(!Array.isArray(e))return"";let t=[];for(let n of e)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&t.push(n.text);return t.join("")}function ez(e){if(!Array.isArray(e))return[];let t=[];for(let n of e)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&t.push(n.text);return t}function uN(e){let t=[];for(let n of e){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let o=r;if(o.source?.kind!==void 0&&o.source.kind!=="user")continue;t.push({role:"user",timestamp:s,content:Lg(o.content)})}else if(n.type==="assistant/message"){let o=r.message;for(let i of ez(o?.content))t.push({role:"thinking",timestamp:s,content:i});t.push({role:"assistant",timestamp:s,content:Lg(o?.content),model:o?.source?.model})}else if(n.type==="tool/call"){let o=r,i;if(typeof o.arguments=="string")try{i=JSON.parse(o.arguments)}catch{}else o.arguments&&typeof o.arguments=="object"&&(i=o.arguments);t.push({role:"tool_use",timestamp:s,content:typeof o.arguments=="string"?o.arguments:JSON.stringify(o.arguments??{}),toolName:o.name,toolCallId:o.callId,toolInputData:i})}else if(n.type==="tool/result"){let o=r,a=(Array.isArray(o.message?.content)?o.message.content:[])[0];t.push({role:"tool_result",timestamp:s,content:Lg(a?.content??o.message?.content),toolCallId:a?.toolCallId??o.message?.source?.callId})}}return t}function tz(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function fN(e,t,n){let r=e.find(m=>m.type==="session");if(!r)return null;let s=r,o=r.data,i=s.id??o?.id;if(!i)return null;let a;for(let m of e)if(m.type==="request/header"){let p=m.data?.header;p?.config?.model&&(a=p.config.model)}let c=e.map(m=>m.time).filter(m=>typeof m=="number"),l=s.createdAt??o?.createdAt,d=l?new Date(l):new Date(0),u=c.length>0?new Date(Math.max(...c)):d,f=n.filter(m=>m.role==="user");return{provider:"dsh",sessionId:i,cwd:s.cwd??o?.cwd??"",createdAt:d,modifiedAt:u,model:a,firstUserMessage:f[0]?.content,lastUserMessage:f.at(-1)?.content,messageCount:n.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:t,...nz(e)}}function nz(e){let t=new Map;for(let i of e){let a=i.data?.turn??null,c=t.get(a)??[];c.push(i),t.set(a,c)}let n=[],r=[];for(let i of t.values()){let a=new Gi("",-1,new Set);a.update(i);let c=a.usage();c&&(n.push(c),r.push(a.lastUsage()))}if(!n.length)return{};let s=i=>{if(n.some(c=>c.invalidCounters||c[i]===null))return;let a=n.reduce((c,l)=>c+l[i],0);return Number.isSafeInteger(a)?a:void 0},o=r.at(-1);return{totalInputTokens:s("inputUncached"),totalCachedInputTokens:s("cacheRead"),totalOutputTokens:s("output"),totalReasoningOutputTokens:s("reasoning"),lastInputTokens:o.inputUncached!==null&&o.cacheRead!==null?o.inputUncached+o.cacheRead:void 0,lastTokenUsage:{totalTokens:o.inputUncached!==null&&o.cacheRead!==null&&o.output!==null?o.inputUncached+o.cacheRead+o.output:void 0,inputTokens:o.inputUncached??void 0,cachedInputTokens:o.cacheRead??void 0,outputTokens:o.output??void 0,reasoningOutputTokens:o.reasoning??void 0}}}import{spawn as rz}from"node:child_process";import{randomUUID as sz}from"node:crypto";var oz=/dsh web:\s*(https?:\/\/\S+)/,mN=2e4;function Cg(e,t=[]){if(e==null)return e;if(typeof e=="string"){let n=e;for(let r of t)r&&typeof r=="string"&&r.length>=8&&n.includes(r)&&(n=n.replaceAll(r,"[REDACTED]"));return n=n.replace(/(?:sk-|dsh-)[A-Za-z0-9_\-\.]+/gi,"[REDACTED]"),n=n.replace(/(?:token=)[A-Za-z0-9_\-\.]+/gi,"token=[REDACTED]"),n=n.replace(/bearer\s+[A-Za-z0-9_\-\.]+/gi,"Bearer [REDACTED]"),n}if(Array.isArray(e))return e.map(n=>Cg(n,t));if(typeof e=="object"){let n={};for(let[r,s]of Object.entries(e))/api[_-]?key|secret|token|password|auth|authorization|credential|cookie/i.test(r)?n[r]="[REDACTED]":n[r]=Cg(s,t);return n}return e}function iz(e){let t;try{t=new URL(e)}catch{throw new Error("invalid dsh boot URL: malformed URL")}if(t.protocol!=="http:")throw new Error(`invalid dsh boot URL scheme "${t.protocol}": must be http:`);if(t.username||t.password)throw new Error("invalid dsh boot URL: userinfo credentials are not allowed");let n=t.hostname;if(!(n==="127.0.0.1"||n==="localhost"||n==="::1"||n==="[::1]"))throw new Error(`invalid dsh boot URL host "${n}": loopback host (127.0.0.1 or localhost) required`);return t}var Vr=class e extends Error{method;detail;constructor(t,n,r=[]){let s=Cg(n,r),o=typeof s=="string"?s:JSON.stringify(s);super(`dsh RPC ${t} failed: ${o}`),this.name="DshRpcCallError",this.method=t,this.detail=s,Object.setPrototypeOf(this,e.prototype)}};function pN(e,t=2e3){if(!e||e.exitCode!==null||e.signalCode!==null)return;try{e.kill("SIGTERM")}catch{}let n,r=()=>{n!==void 0&&(clearTimeout(n),n=void 0)};if(e.once("exit",r),e.exitCode!==null||e.signalCode!==null){r();return}n=setTimeout(()=>{n=void 0;try{e.exitCode===null&&e.signalCode===null&&e.kill("SIGKILL")}catch{}},t),n.unref()}var Og=class e{baseUrl;child;cookie;isV2;tokenUrl;static MAX_RETAINED_SECRETS=8;cookieExchangePromise;knownSecrets=[];constructor(t,n,r,s=!1,o){if(this.baseUrl=t,this.child=n,this.cookie=r,this.isV2=s,this.tokenUrl=o,this.cookie&&this.recordSecret(this.cookie),this.tokenUrl){this.recordSecret(this.tokenUrl);try{let a=new URL(this.tokenUrl).searchParams.get("token");a&&this.recordSecret(a)}catch{}}}recordSecret(t){if(!t||typeof t!="string"||t.length<8)return;let n=r=>{if(r.length<8)return;let s=this.knownSecrets.indexOf(r);for(s!==-1&&this.knownSecrets.splice(s,1),this.knownSecrets.push(r);this.knownSecrets.length>e.MAX_RETAINED_SECRETS;)this.knownSecrets.shift()};if(n(t),t.includes("=")){let r=t.split("=")[1];r&&r.length>=8&&n(r)}}getSecretsToRedact(t=[]){let n=new Set;for(let r of this.knownSecrets)r&&r.length>=8&&n.add(r);if(this.cookie&&this.cookie.length>=8){n.add(this.cookie);let r=this.cookie.split("=")[1];r&&r.length>=8&&n.add(r)}if(this.tokenUrl)try{let s=new URL(this.tokenUrl).searchParams.get("token");s&&s.length>=8&&n.add(s)}catch{}for(let r of t)if(r&&r.length>=8&&(n.add(r),r.includes("="))){let s=r.split("=")[1];s&&s.length>=8&&n.add(s)}return Array.from(n)}static forTesting(t,n){let r=t,s=n?.isV2??!1,o=n?.cookie;try{let i=new URL(t);i.searchParams.has("token")&&(s=!0,r=i.origin)}catch{}return new e(r,void 0,o,s,t)}static async fromBootUrl(t,n,r){let s=iz(t),o=s.searchParams.has("token"),i;if(o)for(let a=0;a<5;a++){if(r?.aborted)throw new Error("dsh web boot aborted");try{let l=(await fetch(t,{redirect:"manual",signal:r})).headers.get("set-cookie");if(l){i=l.split(";")[0];break}}catch(c){if(r?.aborted)throw c;await new Promise(l=>setTimeout(l,100))}}return new e(s.origin,n,i,o,t)}async ensureCookie(t=!1){return this.tokenUrl?this.cookie&&!t?this.cookie:(this.cookieExchangePromise||(this.cookieExchangePromise=(async()=>{for(let n=0;n<5;n++)try{let r=AbortSignal.timeout(1e4),o=(await fetch(this.tokenUrl,{redirect:"manual",signal:r})).headers.get("set-cookie");if(o)return this.cookie=o.split(";")[0],this.recordSecret(this.cookie),this.cookie}catch{await new Promise(r=>setTimeout(r,100))}return this.cookie})().finally(()=>{this.cookieExchangePromise=void 0})),this.cookieExchangePromise):this.cookie}async rpc(t,n){this.isV2&&await this.ensureCookie();let r=this.cookie,s=r?[r]:[],o=`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,i=this.isV2?t.includes("/")?t:t.replace(/\./g,"/"):t.includes(".")?t:t.replace(/\//g,"."),a=n;if(this.isV2){let f=n;if(i==="session/prompt"&&f&&typeof f=="object"){let m=f;m.requestId||(f={...m,requestId:sz()})}f&&typeof f=="object"&&"args"in f?a=f:a={args:{request:f}}}let c={"content-type":"application/json"};this.cookie&&(c.cookie=this.cookie);let l;try{l=await fetch(`${this.baseUrl}/api/${i}`,{method:"POST",headers:c,body:JSON.stringify({type:"client-request",rpcId:o,method:i,payload:a}),redirect:"manual"})}catch(f){throw new Vr(t,`transport error: ${f instanceof Error?f.message:String(f)}`,this.getSecretsToRedact(s))}if(l.status>=300&&l.status<400)throw new Vr(t,`redirects are not permitted (HTTP ${l.status})`,this.getSecretsToRedact(s));if((l.status===401||l.status===403)&&this.isV2&&this.tokenUrl){let f=await this.ensureCookie(!0);if(f&&f!==c.cookie){c.cookie=f,s.push(f);try{l=await fetch(`${this.baseUrl}/api/${i}`,{method:"POST",headers:c,body:JSON.stringify({type:"client-request",rpcId:o,method:i,payload:a}),redirect:"manual"})}catch(m){throw new Vr(t,`transport error: ${m instanceof Error?m.message:String(m)}`,this.getSecretsToRedact(s))}if(l.status>=300&&l.status<400)throw new Vr(t,`redirects are not permitted (HTTP ${l.status})`,this.getSecretsToRedact(s))}}let d;try{d=await l.json()}catch{d=void 0}if(!l.ok)throw new Vr(t,d??l.statusText,this.getSecretsToRedact(s));let u=d&&typeof d=="object"?d.result:void 0;if(!u||typeof u!="object"||typeof u.ok!="boolean")throw new Vr(t,"malformed response: HTTP 200 but body is not a well-formed {result:{ok,\u2026}} envelope",this.getSecretsToRedact(s));if(u.ok===!1)throw new Vr(t,u.error??u,this.getSecretsToRedact(s));return"value"in u?u.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&&pN(this.child,2e3)}static spawn(t){return new Promise((n,r)=>{let s=rz("dsh",["web","--no-open","--port","0"],{env:t,stdio:["ignore","pipe","pipe"]}),o=!1,i=!1,a="",c="",l="",d=new AbortController,u=m=>{o||(o=!0,clearTimeout(f),d.abort(),pN(s,2e3),r(m))},f=setTimeout(()=>{let m=[c?`stdout:
2002
2002
  ${c}`:"",l?`stderr:
2003
2003
  ${l}`:""].filter(Boolean).join(`
2004
2004
  `);u(new Error(`dsh web sidecar did not report a boot URL within ${mN}ms `+(m?`
2005
2005
  ${tt(m,{provider:"dsh"})}`:"(no output captured)")))},mN);s.stdout?.on("data",m=>{let p=m.toString();if(c+=p,a+=p,o||i)return;let h=a.split(`
2006
- `);a=h.pop()??"";for(let _ of h){let g=oz.exec(_);if(g){i=!0,e.fromBootUrl(g[1],s,d.signal).then(w=>{o||(o=!0,clearTimeout(f),n(w))},w=>{u(w instanceof Error?w:new Error(String(w)))});return}}}),s.stderr?.on("data",m=>{l+=m.toString()}),s.on("error",m=>{u(m)}),s.on("exit",(m,p)=>{let h=p?`signal ${p}`:`exit code ${m}`;u(new Error(Hi(`dsh web exited before reporting a boot URL (${h})`,l.trim()?tt(l,{provider:"dsh"}):"")))})})}},js;async function pf(e,t=n=>Og.spawn(n)){if(js){let n=await js.catch(()=>{});if(n?.alive)return n;js=void 0}return js=t(e),js}async function Gc(){if(!js)return;(await js.catch(()=>{}))?.shutdown(),js=void 0}var Dg=new Map,dz=500,$g=8*60*60*1e3;function Ug(e){return new Pg(e)}var Pg=class extends Pe{dshProvider;usageSeen=new Set;constructor(t){let n=new mf(t);super({provider:n,protocol:{transport:"dsh-rpc",perTurnCancellation:"unsupported",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"dsh has no in-session leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"dsh",seedArgs:[],resumeTemplate:"dsh web --no-open --port 0 # continuity is via the RPC sidecar, not a resume flag",startTemplate:"dsh web --no-open --port 0",transport:(r,s)=>this.dshPromptTurn(r,s)}),this.dshProvider=n}manualSeedHint(t){return{launchCommand:`cd ${t} && 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 ${t}`}}async seed(t,n){await lz(t,{recursive:!0});let r=`session-${hN()}`,s=Mg(n?.env??process.env);vt("dsh",[],"yolo");try{let o;try{o=await pf(s)}catch(a){return{success:!1,error:`dsh sidecar failed to start: ${hf(a)}`}}try{await o.rpc("session.create",{sessionId:r,cwd:t})}catch(a){return{success:!1,error:`session.create failed: ${hf(a)}`}}if(n?.model)try{await o.rpc("session.selectModel",{sessionId:r,provider:"deepseek-official",model:n.model})}catch(a){return{success:!1,error:`session.selectModel("${n.model}") failed: ${hf(a)}`}}let i=n?.prompt??be;try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}let a=await this.promptAndWait(o,t,r,i,$g,n?.signal);return{success:!0,sessionId:r,usage:a.usage}}catch(a){return{success:!1,sessionId:r,usage:a?.usage,error:`seed turn failed: ${hf(a)}`}}}finally{await Gc()}}async dshPromptTurn(t,n){let r=Date.now();if(n.bundleSession!==void 0)return Wr(n.bundleSession,"dsh",n.sessionId,t,{onDelta:n.onDelta,onProgress:n.onProgress,signal:n.signal});let s=Mg(n.env??process.env);vt("dsh",[],n.permissionMode??"yolo");let o=!n.sessionId,i=o?`session-${hN()}`:n.sessionId,a;try{let c=await pf(s);o&&await c.rpc("session.create",{sessionId:i,cwd:n.cwd}),n.model&&(await c.rpc("session.selectModel",{sessionId:i,provider:"deepseek-official",model:n.model}),n.onProgress?.({kind:"system",summary:`dsh model set to ${n.model}`})),n.onProgress?.({kind:"system",summary:"dsh session.prompt sent"}),a=await this.promptAndWait(c,n.cwd,i,t,n.timeoutMs??$g,n.signal)}finally{await Gc()}return n.onProgress?.({kind:"system",summary:"dsh turn completed"}),{...a,sessionId:i,durationMs:Date.now()-r}}async openSession(t){let n=Mg(t.env??process.env);vt("dsh",[],t.permissionMode??"yolo");let r=await pf(n),s=_f(this.dshProvider.sessionFilePath(t.cwd,t.sessionId)),o=!1;try{o=_N(s)&&az(s).isFile()}catch{o=!1}if(!o)throw await Gc(),new Error(`dsh bundle: session file does not exist for session "${t.sessionId}" (${s}) \u2014 the session must exist before a bundle can resume it`);t.model&&await r.rpc("session.selectModel",{sessionId:t.sessionId,provider:"deepseek-official",model:t.model});let i=t.sessionId,a=this,c=0,l=!1,d=null,u=!1,f=!1,m=async()=>{f||(f=!0,await Gc())};return{provider:"dsh",sessionId:i,get completedTurns(){return c},async sendTurn(p,h={}){if(l||d!==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(s=_f(s),!_N(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 _=Date.now();try{let g,w=a.promptAndWait(r,t.cwd,i,p,$g,h.signal,b=>{g=b});w.catch(()=>{});let y=()=>{},E=new Promise((b,A)=>{y=()=>{(async()=>{l=!0,await m()})().finally(()=>A(Object.assign(new Error("Aborted"),{usage:g,sessionId:i})))},h.signal?.addEventListener("abort",y,{once:!0})}),T;try{T=await Promise.race([w,E])}finally{h.signal?.removeEventListener("abort",y)}return c+=1,{...T,sessionId:i,durationMs:Date.now()-_}}finally{u=!1}},close(){return d!==null||(d=(async()=>{l=!0,await m()})()),d}}}async promptAndWait(t,n,r,s,o,i,a){let c=Date.now(),l=_f(this.dshProvider.sessionFilePath(n,r)),d=!1,u=await gN(l,()=>{d=!0}),f=u.reduce((w,y)=>typeof y.seq=="number"&&Number.isSafeInteger(y.seq)?Math.max(w,y.seq):w,-1),m=new Gi(r,f,this.usageSeen);d&&m.invalidateOwnership();let p=JSON.stringify([l,r]),h=Dg.get(p)??new Set;if(h.size){m.invalidateOwnership();for(let w of h)w.invalidateOwnership()}h.add(m),Dg.set(p,h),u.filter(w=>w.type==="turn/start"||w.type==="turn/end").at(-1)?.type==="turn/start"&&m.invalidateOwnership();let g;try{await t.rpc("session.prompt",{sessionId:r,mode:"queue",content:[{type:"text",text:s}]});let w=o>0?Date.now()+o:1/0;for(;;){l=_f(l);let y=await gN(l),E=y.find(T=>T.type==="turn/end"&&(T.seq??-1)>f);if(y.length&&m.update(y,E?.seq??1/0),a?.(m.usage()),i?.aborted)throw new Error("Aborted");if(E){let T=E.data?.reason;T?.kind!=="completed"&&(g=T?.kind==="aborted"?"cancelled":"error");let b=[...y].reverse().find(R=>R.type==="assistant/message"&&(R.seq??-1)>f&&(R.seq??1/0)<=(E.seq??1/0)),A=b?fz(b):"";if(T?.kind!=="completed"&&!A)throw new Error(uz(T));m.finish();let I=m.usage();return{text:A,sessionId:r,durationMs:Date.now()-c,usage:I?{...I,...T?.kind==="completed"?{}:{outcome:T?.kind==="aborted"?"cancelled":"error"}}:void 0}}if(Date.now()>w)throw new Error(`dsh turn timed out after ${o}ms waiting for turn/end`);await new Promise(T=>setTimeout(T,dz))}}catch(w){if(m.finish(),w instanceof Error){let y=m.usage();Object.assign(w,{usage:y?{...y,outcome:g}:void 0,sessionId:r})}throw w}finally{h.delete(m),h.size||Dg.delete(p)}}};function Mg(e){return{...e,DSH_PERMISSION_MODE:e.DSH_PERMISSION_MODE??"danger-full-access"}}function uz(e){let t=e?.kind??"unknown",n=e?.error?.message;return n?`dsh turn ended with reason=${t}: ${n}`:`dsh turn ended with reason=${t} and no assistant text`}function hf(e){return e instanceof Error?e.message:String(e)}async function gN(e,t){let n;try{n=await cz(e)}catch{return t?.(),[]}t&&fc(n).reduce((o,i)=>o+i.length,0)!==n.length&&t?.();let r=Kd(n),s=[];for(let o of r.split(`
2006
+ `);a=h.pop()??"";for(let _ of h){let g=oz.exec(_);if(g){i=!0,e.fromBootUrl(g[1],s,d.signal).then(w=>{o||(o=!0,clearTimeout(f),n(w))},w=>{u(w instanceof Error?w:new Error(String(w)))});return}}}),s.stderr?.on("data",m=>{l+=m.toString()}),s.on("error",m=>{u(m)}),s.on("exit",(m,p)=>{let h=p?`signal ${p}`:`exit code ${m}`;u(new Error(Hi(`dsh web exited before reporting a boot URL (${h})`,l.trim()?tt(l,{provider:"dsh"}):"")))})})}},js;async function pf(e,t=n=>Og.spawn(n)){if(js){let n=await js.catch(()=>{});if(n?.alive)return n;js=void 0}return js=t(e),js}async function Gc(){if(!js)return;(await js.catch(()=>{}))?.shutdown(),js=void 0}var Dg=new Map,dz=500,$g=8*60*60*1e3;function Ug(e){return new Pg(e)}var Pg=class extends Pe{dshProvider;usageSeen=new Set;constructor(t){let n=new mf(t);super({provider:n,protocol:{transport:"dsh-rpc",perTurnCancellation:"unsupported",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"dsh has no in-session leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"dsh",seedArgs:[],resumeTemplate:"dsh web --no-open --port 0 # continuity is via the RPC sidecar, not a resume flag",startTemplate:"dsh web --no-open --port 0",transport:(r,s)=>this.dshPromptTurn(r,s)}),this.dshProvider=n}manualSeedHint(t){return{launchCommand:`cd ${t} && 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 ${t}`}}async seed(t,n){await lz(t,{recursive:!0});let r=`session-${hN()}`,s=Mg(n?.env??process.env);St("dsh",[],"yolo");try{let o;try{o=await pf(s)}catch(a){return{success:!1,error:`dsh sidecar failed to start: ${hf(a)}`}}try{await o.rpc("session.create",{sessionId:r,cwd:t})}catch(a){return{success:!1,error:`session.create failed: ${hf(a)}`}}if(n?.model)try{await o.rpc("session.selectModel",{sessionId:r,provider:"deepseek-official",model:n.model})}catch(a){return{success:!1,error:`session.selectModel("${n.model}") failed: ${hf(a)}`}}let i=n?.prompt??be;try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}let a=await this.promptAndWait(o,t,r,i,$g,n?.signal);return{success:!0,sessionId:r,usage:a.usage}}catch(a){return{success:!1,sessionId:r,usage:a?.usage,error:`seed turn failed: ${hf(a)}`}}}finally{await Gc()}}async dshPromptTurn(t,n){let r=Date.now();if(n.bundleSession!==void 0)return Br(n.bundleSession,"dsh",n.sessionId,t,{onDelta:n.onDelta,onProgress:n.onProgress,signal:n.signal});let s=Mg(n.env??process.env);St("dsh",[],n.permissionMode??"yolo");let o=!n.sessionId,i=o?`session-${hN()}`:n.sessionId,a;try{let c=await pf(s);o&&await c.rpc("session.create",{sessionId:i,cwd:n.cwd}),n.model&&(await c.rpc("session.selectModel",{sessionId:i,provider:"deepseek-official",model:n.model}),n.onProgress?.({kind:"system",summary:`dsh model set to ${n.model}`})),n.onProgress?.({kind:"system",summary:"dsh session.prompt sent"}),a=await this.promptAndWait(c,n.cwd,i,t,n.timeoutMs??$g,n.signal)}finally{await Gc()}return n.onProgress?.({kind:"system",summary:"dsh turn completed"}),{...a,sessionId:i,durationMs:Date.now()-r}}async openSession(t){let n=Mg(t.env??process.env);St("dsh",[],t.permissionMode??"yolo");let r=await pf(n),s=_f(this.dshProvider.sessionFilePath(t.cwd,t.sessionId)),o=!1;try{o=_N(s)&&az(s).isFile()}catch{o=!1}if(!o)throw await Gc(),new Error(`dsh bundle: session file does not exist for session "${t.sessionId}" (${s}) \u2014 the session must exist before a bundle can resume it`);t.model&&await r.rpc("session.selectModel",{sessionId:t.sessionId,provider:"deepseek-official",model:t.model});let i=t.sessionId,a=this,c=0,l=!1,d=null,u=!1,f=!1,m=async()=>{f||(f=!0,await Gc())};return{provider:"dsh",sessionId:i,get completedTurns(){return c},async sendTurn(p,h={}){if(l||d!==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(s=_f(s),!_N(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 _=Date.now();try{let g,w=a.promptAndWait(r,t.cwd,i,p,$g,h.signal,b=>{g=b});w.catch(()=>{});let y=()=>{},E=new Promise((b,A)=>{y=()=>{(async()=>{l=!0,await m()})().finally(()=>A(Object.assign(new Error("Aborted"),{usage:g,sessionId:i})))},h.signal?.addEventListener("abort",y,{once:!0})}),T;try{T=await Promise.race([w,E])}finally{h.signal?.removeEventListener("abort",y)}return c+=1,{...T,sessionId:i,durationMs:Date.now()-_}}finally{u=!1}},close(){return d!==null||(d=(async()=>{l=!0,await m()})()),d}}}async promptAndWait(t,n,r,s,o,i,a){let c=Date.now(),l=_f(this.dshProvider.sessionFilePath(n,r)),d=!1,u=await gN(l,()=>{d=!0}),f=u.reduce((w,y)=>typeof y.seq=="number"&&Number.isSafeInteger(y.seq)?Math.max(w,y.seq):w,-1),m=new Gi(r,f,this.usageSeen);d&&m.invalidateOwnership();let p=JSON.stringify([l,r]),h=Dg.get(p)??new Set;if(h.size){m.invalidateOwnership();for(let w of h)w.invalidateOwnership()}h.add(m),Dg.set(p,h),u.filter(w=>w.type==="turn/start"||w.type==="turn/end").at(-1)?.type==="turn/start"&&m.invalidateOwnership();let g;try{await t.rpc("session.prompt",{sessionId:r,mode:"queue",content:[{type:"text",text:s}]});let w=o>0?Date.now()+o:1/0;for(;;){l=_f(l);let y=await gN(l),E=y.find(T=>T.type==="turn/end"&&(T.seq??-1)>f);if(y.length&&m.update(y,E?.seq??1/0),a?.(m.usage()),i?.aborted)throw new Error("Aborted");if(E){let T=E.data?.reason;T?.kind!=="completed"&&(g=T?.kind==="aborted"?"cancelled":"error");let b=[...y].reverse().find(R=>R.type==="assistant/message"&&(R.seq??-1)>f&&(R.seq??1/0)<=(E.seq??1/0)),A=b?fz(b):"";if(T?.kind!=="completed"&&!A)throw new Error(uz(T));m.finish();let I=m.usage();return{text:A,sessionId:r,durationMs:Date.now()-c,usage:I?{...I,...T?.kind==="completed"?{}:{outcome:T?.kind==="aborted"?"cancelled":"error"}}:void 0}}if(Date.now()>w)throw new Error(`dsh turn timed out after ${o}ms waiting for turn/end`);await new Promise(T=>setTimeout(T,dz))}}catch(w){if(m.finish(),w instanceof Error){let y=m.usage();Object.assign(w,{usage:y?{...y,outcome:g}:void 0,sessionId:r})}throw w}finally{h.delete(m),h.size||Dg.delete(p)}}};function Mg(e){return{...e,DSH_PERMISSION_MODE:e.DSH_PERMISSION_MODE??"danger-full-access"}}function uz(e){let t=e?.kind??"unknown",n=e?.error?.message;return n?`dsh turn ended with reason=${t}: ${n}`:`dsh turn ended with reason=${t} and no assistant text`}function hf(e){return e instanceof Error?e.message:String(e)}async function gN(e,t){let n;try{n=await cz(e)}catch{return t?.(),[]}t&&fc(n).reduce((o,i)=>o+i.length,0)!==n.length&&t?.();let r=Kd(n),s=[];for(let o of r.split(`
2007
2007
  `))if(o.trim())try{let i=JSON.parse(o);i!==null&&typeof i=="object"&&!Array.isArray(i)&&s.push(i)}catch{t?.()}return s}function fz(e){let n=e.data?.message?.content;if(typeof n=="string")return n;if(!Array.isArray(n))return"";let r=[];for(let s of n)s&&typeof s=="object"&&s.type==="text"&&typeof s.text=="string"&&r.push(s.text);return r.join("")}function _f(e,t){return Qi(e,t)}import{mkdir as vz}from"node:fs/promises";import{existsSync as pz}from"node:fs";import{join as vN,resolve as hz}from"node:path";import{createRequire as _z}from"node:module";var mz=new URL("./cli/index.js",import.meta.url).href,Fg=null;function gz(){return Fg===null&&(Fg=_z(mz)("node:sqlite").DatabaseSync),Fg}var EN="acp";function jg(e={}){return hz(e.hermesHome?.trim()||process.env.HERMES_HOME?.trim()||vN(ge,".hermes"))}function Ez(e={}){return vN(jg(e),"state.db")}var yN=`id, source, model, model_config, started_at,
2008
2008
  last_activity_at, message_count, input_tokens, output_tokens,
2009
2009
  cache_read_tokens, cache_write_tokens, reasoning_tokens, cwd, title`;function Xc(e){let t=typeof e=="number"&&Number.isFinite(e)?e:0;return new Date(t*1e3)}function un(e){return typeof e=="string"&&e.length>0?e:void 0}function yz(e){if(!e)return{};try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function wN(e){return un(e.cwd)??un(yz(e.model_config).cwd)??"(unknown)"}var gf=class{name="hermes";dbPath;busyTimeoutMs;discoverLimit;constructor(t){this.dbPath=Ez(t),this.busyTimeoutMs=t?.busyTimeoutMs??5e3,this.discoverLimit=t?.discoverLimit??200}get stateDbPath(){return this.dbPath}openDb(){if(!pz(this.dbPath))return null;let t=null;try{return t=new(gz())(this.dbPath,{open:!0,readOnly:!0}),t.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),t}catch(n){return t?.close(),ne({event:"hermes_store_unavailable",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),null}}selectSessionRow(t,n){return t.prepare(`SELECT ${yN} FROM sessions WHERE id = ? AND source = ?`).get(n,EN)??null}async discoverSessions(){let t=this.openDb();if(!t)return[];try{let n=t.prepare(`SELECT ${yN} FROM sessions
@@ -2011,15 +2011,15 @@ ${tt(m,{provider:"dsh"})}`:"(no output captured)")))},mN);s.stdout?.on("data",m=
2011
2011
  ORDER BY COALESCE(last_activity_at, started_at) DESC
2012
2012
  LIMIT ?`).all(EN,this.discoverLimit),r=[];for(let s of n){let o=this.previewTexts(t,s.id);r.push({provider:this.name,sessionId:s.id,slug:un(s.title),cwd:wN(s),createdAt:Xc(s.started_at),modifiedAt:Xc(s.last_activity_at??s.started_at),model:un(s.model),startCommand:this.name,firstUserMessage:o.first,lastUserMessage:o.last,messageCount:s.message_count??0,filePath:this.dbPath,...TN(s)})}return r}catch(n){return ne({event:"hermes_discover_sessions_failed",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),[]}finally{t.close()}}activeMessageRows(t,n){let r=new Set(t.prepare("PRAGMA table_info(messages)").all().map(a=>a.name)),o=`id, session_id, role, content, tool_call_id, tool_calls, tool_name,
2013
2013
  timestamp, finish_reason${["_compressed_summary","display_kind"].filter(a=>r.has(a)).map(a=>`, ${a}`).join("")}`,i="WHERE session_id = ? AND role IN ('user', 'assistant', 'tool')";try{return t.prepare(`SELECT ${o} FROM messages ${i} AND active = 1 ORDER BY id ASC`).all(n)}catch(a){if(!/no such column/i.test(a instanceof Error?a.message:String(a)))throw a;return t.prepare(`SELECT ${o} FROM messages ${i} ORDER BY id ASC`).all(n)}}previewTexts(t,n){try{let[r,s]=["ASC","DESC"].map(o=>{let i=`SELECT content FROM messages WHERE session_id = ?
2014
- AND role = 'user' AND content != ''`,a;try{a=t.prepare(`${i} AND active = 1 ORDER BY id ${o} LIMIT 1`).get(n)}catch(c){if(!/no such column: active/i.test(String(c)))throw c;a=t.prepare(`${i} ORDER BY id ${o} LIMIT 1`).get(n)}return a?de(a.content,80):void 0});return{first:r,last:s}}catch{return{}}}async loadSession(t){let n=this.openDb();if(!n)return null;try{let r=this.selectSessionRow(n,t);if(!r)return null;let s=this.activeMessageRows(n,t),o=[],i=[],a,c;for(let l of s){let d=Xc(l.timestamp),u=l.content??"";if(l.role==="user"){u&&l._compressed_summary!==1&&l.display_kind!=="hidden"&&i.push(u),u.length>0&&(a||(a=de(u,80)),c=de(u,80)),o.push({role:"user",timestamp:d,content:u||"(empty)"});continue}if(l.role==="tool"){o.push({role:"tool_result",timestamp:d,content:u,toolCallId:un(l.tool_call_id),toolName:un(l.tool_name)});continue}u.length>0&&o.push({role:"assistant",timestamp:d,content:u,model:un(r.model),stopReason:un(l.finish_reason)});for(let f of wz(l.tool_calls)){let m=Tz(f.function?.arguments);o.push({role:"tool_use",timestamp:d,content:un(f.function?.name)??"tool_call",toolName:un(f.function?.name),toolCallId:un(f.call_id)??un(f.id),toolInput:typeof f.function?.arguments=="string"?f.function.arguments:JSON.stringify(f.function?.arguments??{}),toolInputData:Dn(m)})}}return{provider:this.name,sessionId:r.id,slug:un(r.title),cwd:wN(r),createdAt:Xc(r.started_at),modifiedAt:Xc(r.last_activity_at??r.started_at),model:un(r.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:c,messageCount:r.message_count??o.length,filePath:this.dbPath,...TN(r),messages:o,userPrompts:i}}catch(r){return ne({event:"hermes_load_session_failed",provider:this.name,session_id:t,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),null}finally{n.close()}}async resolveSessionPath(t){let n=this.openDb();if(!n)return null;try{return this.selectSessionRow(n,t)?this.dbPath:null}catch{return null}finally{n.close()}}async deleteSession(t){return!1}};function wz(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function Tz(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e;if(typeof e!="string")return{};try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function TN(e){let t=e.input_tokens??0,n=e.output_tokens??0,r=e.cache_read_tokens??0,s=e.cache_write_tokens??0,o=e.reasoning_tokens??0;return(e.message_count??0)>0&&t+n+r+s+o>0?{totalInputTokens:t,totalCachedInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:n,totalReasoningOutputTokens:o}:{}}var Sz=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function bz(e){return Sz.test(e)}var Az="dont_ask";function SN(e){if(e==="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 Az}function Hg(e){return new qg(e)}var qg=class extends Pe{hermesProvider;hermesHome;constructor(t){let n=new gf(t);super({provider:n,protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn",persistentResume:!0},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Hermes has no provider-side leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"hermes",seedArgs:[],resumeTemplate:"hermes --yolo --resume {{session_id}}",startTemplate:"hermes",transport:async(r,s)=>Wn(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:SN(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=jg(t)}async openSession(t){return gr({...t,env:{...t.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:SN(t.permissionMode)})}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(t,n){await vz(t,{recursive:!0});let r=[];if(n?.effort){let o="hermes has no ACP-level effort surface";ne({event:"hermes_effort_ignored",provider:this.name,effort:n.effort,reason:o}),r.push(`hermes seed ignored effort=${n.effort}: ${o}`)}let s;try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}s=await this.sendTurn(n?.prompt??be,{sessionId:"",cwd:t,env:n?.env,signal:n?.signal,model:n?.model})}catch(o){return{success:!1,error:`hermes ACP seed failed: ${o instanceof Error?o.message:String(o)}`}}return bz(s.sessionId)?(r.push(...s.warnings??[]),{success:!0,sessionId:s.sessionId,usage:s.usage,...r.length>0?{warnings:r}:{}}):(ne({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 bN,rm as Iz,stat as kz}from"node:fs/promises";import{join as Wg}from"node:path";var Ef=class{name="pi";baseDir;constructor(t={}){this.baseDir=t.piDir||Wg(ge,".pi","agent","sessions")}getWatchPaths(){return[{directory:this.baseDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[];for(let n of await this.listSessionFiles())try{let r=await this.extractSummary(n);r&&t.push(r)}catch{}return t}async listSessionFiles(){let t;try{t=await bN(this.baseDir)}catch{return[]}let n=[];for(let r of t){let s=Wg(this.baseDir,r);try{if(!(await kz(s)).isDirectory())continue;for(let o of await bN(s))o.endsWith(".jsonl")&&n.push(Wg(s,o))}catch{}}return n}async readHeader(t){for await(let n of ze(t))return n.type==="session"?n:null;return null}async extractSummary(t){let n=await this.readHeader(t);if(!n)return null;let r=await dt(t),s,o,i,a=0,c=0,l=0,d=0,u=0,f=0,m=0,p;for await(let h of ze(t)){if(h.type==="model_change"&&h.provider&&h.modelId){s=`${h.provider}/${h.modelId}`;continue}if(h.type!=="message"||!h.message)continue;let _=h.message;if(_.provider&&_.model&&(s=`${_.provider}/${_.model}`),_.role==="user"){let g=Bg(_).trim();g&&(o||(o=de(g,80)),i=de(g,80)),a++}else if(_.role==="assistant"){a++;let g=_.usage;g&&(c+=g.input??0,l+=g.cacheRead??0,d+=g.cacheWrite??0,u+=g.output??0,f+=g.reasoning??0,m=g.input??0,p={inputTokens:g.input,cachedInputTokens:g.cacheRead,cacheWriteInputTokens:g.cacheWrite,outputTokens:g.output,reasoningOutputTokens:g.reasoning,totalTokens:g.totalTokens})}}return{provider:"pi",sessionId:n.id,cwd:n.cwd??"(unknown)",createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:s,startCommand:"pi",firstUserMessage:o,lastUserMessage:i,messageCount:a,filePath:t,totalInputTokens:c,totalCachedInputTokens:l,totalCacheWriteInputTokens:d,totalOutputTokens:u,totalReasoningOutputTokens:f,lastInputTokens:m,lastTokenUsage:p}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=await this.extractSummary(n);if(!r)return null;let s=[],o=r.model;for await(let i of ze(n)){if(i.type==="model_change"&&i.provider&&i.modelId){o=`${i.provider}/${i.modelId}`;continue}if(i.type!=="message"||!i.message)continue;let a=i.message;a.provider&&a.model&&(o=`${a.provider}/${a.model}`);let c=a.timestamp?new Date(a.timestamp):r.modifiedAt;if(a.role==="user")s.push({role:"user",timestamp:c,content:Bg(a)});else if(a.role==="assistant"&&Array.isArray(a.content))for(let l of a.content)l.type==="text"&&l.text?s.push({role:"assistant",timestamp:c,content:l.text,model:o}):l.type==="thinking"&&l.thinking?s.push({role:"thinking",timestamp:c,content:l.thinking}):l.type==="toolCall"&&s.push({role:"tool_use",timestamp:c,content:AN(l.arguments),toolName:l.name??"tool",toolInput:AN(l.arguments),toolInputData:l.arguments,toolCallId:l.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:c,content:Bg(a),toolName:a.toolName,toolCallId:a.toolCallId})}return{...r,model:o,messages:s}}async resolveSessionPath(t){let n=`_${t}.jsonl`,r=[];for(let s of await this.listSessionFiles()){if(s.endsWith(n))return s;s.split("_").pop()?.replace(/\.jsonl$/,"")?.startsWith(t)&&r.push(s)}return r.length===1?r[0]:null}async deleteSession(t){let n=await this.resolveSessionPath(t);return n?(await Iz(n,{force:!0}),!0):!1}};function Bg(e){return typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(" "):""}function AN(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}function Xg(e){return new Gg(e)}var Gg=class extends Pe{constructor(t){super({provider:new Ef(t),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"pi uses one-shot print turns; no streaming events are available."},binary:"pi",seedArgs:["-p",be],resumeTemplate:"pi --session {{session_id}}",startTemplate:"pi",transport:Rz})}seedArgsFor(t){let n=[...super.seedArgsFor(t)];return t?.model&&n.push("--model",t.model),n}manualSeedHint(t){return{launchCommand:`cd ${t} && pi`,postLaunchNote:"Send the lmctl seed instruction, wait for the session file to write, then exit.",lsCommand:`lmctl ls --provider pi --sessiondir ${t}`}}},Rz=ff({label:"pi",buildArgs:(e,t)=>{let n=[...t.sessionId?["--session",t.sessionId]:[],"-p",e];return t.model&&n.push("--model",t.model),n},assertArgs:(e,t)=>vt("pi",e,t.permissionMode??"yolo")});import{createHash as Nz}from"node:crypto";import{existsSync as xz,mkdirSync as Jg,readFileSync as Lz,renameSync as Cz,rmdirSync as ON,statSync as Oz,writeFileSync as Dz}from"node:fs";import{dirname as Qg,join as IN,resolve as Vg}from"node:path";var Zi=new Map;function $z(e){return Nz("sha256").update(e).digest("hex").slice(0,8)}function Mz(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function Pz(e,t){let n=t?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function DN(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function yf(e){return Math.max(1,Math.ceil(e.length/4))}function ea(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return Vg(t);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?IN(Qg(Vg(n)),".lmctl-claude-mock","sessions.json"):IN(Vg(e),".lmctl-claude-mock","sessions.json")}function kN(){return{schemaVersion:1,sessions:{}}}function Vc(e){if(!xz(e))return kN();try{let t=JSON.parse(Lz(e,"utf8")),n=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},r=typeof t.script=="object"&&t.script!==null?t.script:void 0,s=typeof t.scriptContains=="object"&&t.scriptContains!==null?t.scriptContains:void 0,o=Yg(t.defaultDelayMs);return{schemaVersion:1,sessions:n,...o!==void 0?{defaultDelayMs:o}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return kN()}}function $N(e,t){Jg(Qg(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;Dz(n,`${JSON.stringify(t,null,2)}
2014
+ AND role = 'user' AND content != ''`,a;try{a=t.prepare(`${i} AND active = 1 ORDER BY id ${o} LIMIT 1`).get(n)}catch(c){if(!/no such column: active/i.test(String(c)))throw c;a=t.prepare(`${i} ORDER BY id ${o} LIMIT 1`).get(n)}return a?de(a.content,80):void 0});return{first:r,last:s}}catch{return{}}}async loadSession(t){let n=this.openDb();if(!n)return null;try{let r=this.selectSessionRow(n,t);if(!r)return null;let s=this.activeMessageRows(n,t),o=[],i=[],a,c;for(let l of s){let d=Xc(l.timestamp),u=l.content??"";if(l.role==="user"){u&&l._compressed_summary!==1&&l.display_kind!=="hidden"&&i.push(u),u.length>0&&(a||(a=de(u,80)),c=de(u,80)),o.push({role:"user",timestamp:d,content:u||"(empty)"});continue}if(l.role==="tool"){o.push({role:"tool_result",timestamp:d,content:u,toolCallId:un(l.tool_call_id),toolName:un(l.tool_name)});continue}u.length>0&&o.push({role:"assistant",timestamp:d,content:u,model:un(r.model),stopReason:un(l.finish_reason)});for(let f of wz(l.tool_calls)){let m=Tz(f.function?.arguments);o.push({role:"tool_use",timestamp:d,content:un(f.function?.name)??"tool_call",toolName:un(f.function?.name),toolCallId:un(f.call_id)??un(f.id),toolInput:typeof f.function?.arguments=="string"?f.function.arguments:JSON.stringify(f.function?.arguments??{}),toolInputData:Dn(m)})}}return{provider:this.name,sessionId:r.id,slug:un(r.title),cwd:wN(r),createdAt:Xc(r.started_at),modifiedAt:Xc(r.last_activity_at??r.started_at),model:un(r.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:c,messageCount:r.message_count??o.length,filePath:this.dbPath,...TN(r),messages:o,userPrompts:i}}catch(r){return ne({event:"hermes_load_session_failed",provider:this.name,session_id:t,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),null}finally{n.close()}}async resolveSessionPath(t){let n=this.openDb();if(!n)return null;try{return this.selectSessionRow(n,t)?this.dbPath:null}catch{return null}finally{n.close()}}async deleteSession(t){return!1}};function wz(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function Tz(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e;if(typeof e!="string")return{};try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function TN(e){let t=e.input_tokens??0,n=e.output_tokens??0,r=e.cache_read_tokens??0,s=e.cache_write_tokens??0,o=e.reasoning_tokens??0;return(e.message_count??0)>0&&t+n+r+s+o>0?{totalInputTokens:t,totalCachedInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:n,totalReasoningOutputTokens:o}:{}}var Sz=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function bz(e){return Sz.test(e)}var Az="dont_ask";function SN(e){if(e==="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 Az}function Hg(e){return new qg(e)}var qg=class extends Pe{hermesProvider;hermesHome;constructor(t){let n=new gf(t);super({provider:n,protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn",persistentResume:!0},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Hermes has no provider-side leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"hermes",seedArgs:[],resumeTemplate:"hermes --yolo --resume {{session_id}}",startTemplate:"hermes",transport:async(r,s)=>Wn(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:SN(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=jg(t)}async openSession(t){return gr({...t,env:{...t.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:SN(t.permissionMode)})}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(t,n){await vz(t,{recursive:!0});let r=[];if(n?.effort){let o="hermes has no ACP-level effort surface";ne({event:"hermes_effort_ignored",provider:this.name,effort:n.effort,reason:o}),r.push(`hermes seed ignored effort=${n.effort}: ${o}`)}let s;try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}s=await this.sendTurn(n?.prompt??be,{sessionId:"",cwd:t,env:n?.env,signal:n?.signal,model:n?.model})}catch(o){return{success:!1,error:`hermes ACP seed failed: ${o instanceof Error?o.message:String(o)}`}}return bz(s.sessionId)?(r.push(...s.warnings??[]),{success:!0,sessionId:s.sessionId,usage:s.usage,...r.length>0?{warnings:r}:{}}):(ne({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 bN,rm as Iz,stat as kz}from"node:fs/promises";import{join as Wg}from"node:path";var Ef=class{name="pi";baseDir;constructor(t={}){this.baseDir=t.piDir||Wg(ge,".pi","agent","sessions")}getWatchPaths(){return[{directory:this.baseDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[];for(let n of await this.listSessionFiles())try{let r=await this.extractSummary(n);r&&t.push(r)}catch{}return t}async listSessionFiles(){let t;try{t=await bN(this.baseDir)}catch{return[]}let n=[];for(let r of t){let s=Wg(this.baseDir,r);try{if(!(await kz(s)).isDirectory())continue;for(let o of await bN(s))o.endsWith(".jsonl")&&n.push(Wg(s,o))}catch{}}return n}async readHeader(t){for await(let n of ze(t))return n.type==="session"?n:null;return null}async extractSummary(t){let n=await this.readHeader(t);if(!n)return null;let r=await dt(t),s,o,i,a=0,c=0,l=0,d=0,u=0,f=0,m=0,p;for await(let h of ze(t)){if(h.type==="model_change"&&h.provider&&h.modelId){s=`${h.provider}/${h.modelId}`;continue}if(h.type!=="message"||!h.message)continue;let _=h.message;if(_.provider&&_.model&&(s=`${_.provider}/${_.model}`),_.role==="user"){let g=Bg(_).trim();g&&(o||(o=de(g,80)),i=de(g,80)),a++}else if(_.role==="assistant"){a++;let g=_.usage;g&&(c+=g.input??0,l+=g.cacheRead??0,d+=g.cacheWrite??0,u+=g.output??0,f+=g.reasoning??0,m=g.input??0,p={inputTokens:g.input,cachedInputTokens:g.cacheRead,cacheWriteInputTokens:g.cacheWrite,outputTokens:g.output,reasoningOutputTokens:g.reasoning,totalTokens:g.totalTokens})}}return{provider:"pi",sessionId:n.id,cwd:n.cwd??"(unknown)",createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:s,startCommand:"pi",firstUserMessage:o,lastUserMessage:i,messageCount:a,filePath:t,totalInputTokens:c,totalCachedInputTokens:l,totalCacheWriteInputTokens:d,totalOutputTokens:u,totalReasoningOutputTokens:f,lastInputTokens:m,lastTokenUsage:p}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=await this.extractSummary(n);if(!r)return null;let s=[],o=r.model;for await(let i of ze(n)){if(i.type==="model_change"&&i.provider&&i.modelId){o=`${i.provider}/${i.modelId}`;continue}if(i.type!=="message"||!i.message)continue;let a=i.message;a.provider&&a.model&&(o=`${a.provider}/${a.model}`);let c=a.timestamp?new Date(a.timestamp):r.modifiedAt;if(a.role==="user")s.push({role:"user",timestamp:c,content:Bg(a)});else if(a.role==="assistant"&&Array.isArray(a.content))for(let l of a.content)l.type==="text"&&l.text?s.push({role:"assistant",timestamp:c,content:l.text,model:o}):l.type==="thinking"&&l.thinking?s.push({role:"thinking",timestamp:c,content:l.thinking}):l.type==="toolCall"&&s.push({role:"tool_use",timestamp:c,content:AN(l.arguments),toolName:l.name??"tool",toolInput:AN(l.arguments),toolInputData:l.arguments,toolCallId:l.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:c,content:Bg(a),toolName:a.toolName,toolCallId:a.toolCallId})}return{...r,model:o,messages:s}}async resolveSessionPath(t){let n=`_${t}.jsonl`,r=[];for(let s of await this.listSessionFiles()){if(s.endsWith(n))return s;s.split("_").pop()?.replace(/\.jsonl$/,"")?.startsWith(t)&&r.push(s)}return r.length===1?r[0]:null}async deleteSession(t){let n=await this.resolveSessionPath(t);return n?(await Iz(n,{force:!0}),!0):!1}};function Bg(e){return typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(" "):""}function AN(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}function Xg(e){return new Gg(e)}var Gg=class extends Pe{constructor(t){super({provider:new Ef(t),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"pi uses one-shot print turns; no streaming events are available."},binary:"pi",seedArgs:["-p",be],resumeTemplate:"pi --session {{session_id}}",startTemplate:"pi",transport:Rz})}seedArgsFor(t){let n=[...super.seedArgsFor(t)];return t?.model&&n.push("--model",t.model),n}manualSeedHint(t){return{launchCommand:`cd ${t} && pi`,postLaunchNote:"Send the lmctl seed instruction, wait for the session file to write, then exit.",lsCommand:`lmctl ls --provider pi --sessiondir ${t}`}}},Rz=ff({label:"pi",buildArgs:(e,t)=>{let n=[...t.sessionId?["--session",t.sessionId]:[],"-p",e];return t.model&&n.push("--model",t.model),n},assertArgs:(e,t)=>St("pi",e,t.permissionMode??"yolo")});import{createHash as Nz}from"node:crypto";import{existsSync as xz,mkdirSync as Jg,readFileSync as Lz,renameSync as Cz,rmdirSync as ON,statSync as Oz,writeFileSync as Dz}from"node:fs";import{dirname as Qg,join as IN,resolve as Vg}from"node:path";var Zi=new Map;function $z(e){return Nz("sha256").update(e).digest("hex").slice(0,8)}function Mz(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function Pz(e,t){let n=t?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function DN(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function yf(e){return Math.max(1,Math.ceil(e.length/4))}function ea(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return Vg(t);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?IN(Qg(Vg(n)),".lmctl-claude-mock","sessions.json"):IN(Vg(e),".lmctl-claude-mock","sessions.json")}function kN(){return{schemaVersion:1,sessions:{}}}function Vc(e){if(!xz(e))return kN();try{let t=JSON.parse(Lz(e,"utf8")),n=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},r=typeof t.script=="object"&&t.script!==null?t.script:void 0,s=typeof t.scriptContains=="object"&&t.scriptContains!==null?t.scriptContains:void 0,o=Yg(t.defaultDelayMs);return{schemaVersion:1,sessions:n,...o!==void 0?{defaultDelayMs:o}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return kN()}}function $N(e,t){Jg(Qg(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;Dz(n,`${JSON.stringify(t,null,2)}
2015
2015
  `,"utf8"),Cz(n,e)}var Uz=5e3,Fz=15,RN=1e4;function jz(e){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}function qz(e){let t=`${e}.lock`;Jg(Qg(e),{recursive:!0});let n=Date.now()+RN;for(;;)try{return Jg(t),t}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-Oz(t).mtimeMs>Uz){try{ON(t)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${RN}ms: ${t}`);jz(Fz)}}function Hz(e){try{ON(e)}catch{}}function MN(e,t){let n=qz(e);try{return t()}finally{Hz(n)}}function Wz(e){return{...e,timestamp:e.timestamp.toISOString()}}function Bz(e){return{...e,timestamp:new Date(e.timestamp)}}function Gz(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(Wz)}}function PN(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(Bz)}}function wf(e,t=process.cwd()){let n=Zi.get(e);if(n!==void 0)return n;let s=Vc(ea(t)).sessions[e];if(s===void 0)return;let o=PN(s);return Zi.set(o.sessionId,o),o}function NN(e){Zi.set(e.sessionId,e);let t=ea(e.cwd);MN(t,()=>{let n=Vc(t);n.sessions[e.sessionId]=Gz({...e,filePath:t}),$N(t,n)})}function Xz(e,t=process.cwd()){let n=ea(t);return MN(n,()=>{let r=Vc(n),s=r.sessions[e]!==void 0;return s&&(delete r.sessions[e],$N(n,r)),s})}function Vz(){let e=Vc(ea()),t=Object.values(e.sessions).map(PN);for(let n of t)Zi.set(n.sessionId,n);return t}function Yg(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function xN(e){if(typeof e=="string")return{kind:"success",text:e};if(e!==void 0&&typeof e.text=="string"&&typeof e.error!="string"){let t=Yg(e.delayMs);return{kind:"success",text:e.text,...t!==void 0?{delayMs:t}:{}}}if(e!==void 0&&typeof e.error=="string"&&typeof e.text!="string"){let t=Yg(e.delayMs);return{kind:"error",error:e.error,...t!==void 0?{delayMs:t}:{}}}}async function LN(e){e!==void 0&&e>0&&await new Promise(t=>setTimeout(t,e))}function Jz(e,t){let{script:n,scriptContains:r}=t;if(n!==void 0){let s=xN(n[e]??n[DN(e)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(e.includes(s)){let o=xN(r[s]);if(o!==void 0)return o}}}function CN(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}var Kg=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let n of Vz())t.set(n.sessionId,n);for(let n of Zi.values())t.set(n.sessionId,n);return[...t.values()].map(CN)}async loadSession(t){let n=wf(t);return n===void 0?null:{...CN(n),messages:n.messages.slice()}}async resolveSessionPath(t){return wf(t)?.filePath??null}async deleteSession(t){let n=Zi.delete(t),r=Xz(t);return n||r}},zg=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Kg;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,n){try{n?.onDispatch?.()}catch{}let r=Mz(Pz(t,n)),s=`mock-${r}-${$z(`${t}:${r}`)}`,o=new Date,i=ea(t),a=wf(s,t),c=n?.prompt??"ClaudeMock seed",l=yf(c),d={sessionId:s,cwd:t,filePath:i,createdAt:a?.createdAt??o,modifiedAt:o,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:o,content:c}),d.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=l,d.totalOutputTokens+=yf("ACK: ClaudeMock seeded"),NN(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,n){let r=Date.now(),s=wf(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let o=new Date,i=Vc(ea(n.cwd)),a=Jz(t,i),c=a?.delayMs??i.defaultDelayMs;if(a?.kind==="error")throw await LN(c),new Error(a.error);let l=a?.kind==="success"?a.text:`ClaudeMock ack: ${DN(t)}`;return s.messages.push({role:"user",timestamp:o,content:t}),s.messages.push({role:"assistant",timestamp:o,content:l,model:n.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=yf(t),s.totalOutputTokens+=yf(l),NN(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await LN(c),{text:l,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}};function Zg(){return new zg}function qs(e){let t=[B_({museDataHome:e?.museDataHome}),rg({miniplayerHome:e?.miniplayerHome}),og({claudeDir:e?.claudeDir}),lg({codexDir:e?.codexDir,codeDir:e?.codeDir}),mg({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),_g({copilotDir:e?.copilotDir}),Eg({dbPaths:e?.opencodeDbPaths}),vg({kimiHome:e?.kimiHome}),bg({lmplayerDbPath:e?.lmplayerDbPath,lmplayerDbPaths:e?.lmplayerDbPaths}),Ig({qwenDir:e?.qwenDir}),Ng({agyDir:e?.agyDir}),Ug({dshHome:e?.dshHome}),Hg({hermesHome:e?.hermesHome}),Xg({piDir:e?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(Zg()),t}var eE=null;function UN(){return eE===null&&(eE=Os(qs())),eE}function FN(e,t){Iu(t);let n=e.getAdapter(t);if(!n)throw new Error(`provider "${t}" is not registered in this registry`);return n}async function jN(e){let t=e.registry??UN(),n=FN(t,e.provider),r={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,holdOpen:e.holdOpen,requireResume:e.requireResume,bundleSession:e.bundleSession},s=e.bundleSession===void 0?await R_(n,{...r,execution:"per-turn",requireResume:e.requireResume??!1}):void 0,o;try{o=s?await s.sendTurn(e.prompt,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal}):await n.sendTurn(e.prompt,r)}finally{await s?.close()}return{text:o.text,...o.usage?{usage:o.usage}:{},sessionId:o.sessionId,durationMs:o.durationMs,stopReason:o.stopReason,numTurns:o.numTurns,status:o.status,stalledAfterMs:o.stalledAfterMs,...o.warnings!==void 0?{warnings:o.warnings}:{}}}async function qN(e){return R_(FN(e.registry??UN(),e.provider),e)}import{join as Wt}from"node:path";var HN=new WeakMap;function Jc(e){let t=HN.get(e);if(t)return t;let n=e.env.HOME;if(!n)return Os(qs());let r=e.env.XDG_DATA_HOME||Wt(n,".local/share"),s=e.env.XDG_CONFIG_HOME||Wt(n,".config");return t=Os(qs({museDataHome:r,miniplayerHome:e.env.MINIPLAYER_HOME||Wt(r,"miniplayer"),claudeDir:Wt(n,".claude"),codexDir:Wt(n,".codex"),codeDir:Wt(n,".code"),geminiDir:Wt(n,".gemini"),copilotDir:Wt(n,".copilot"),qwenDir:Wt(n,".qwen"),opencodeDbPaths:[Wt(r,"opencode/opencode.db"),Wt(s,"opencode/opencode.db")],agyDir:Wt(n,".gemini/antigravity-cli"),dshHome:Wt(n,".dsh"),hermesHome:e.env.HERMES_HOME??Wt(n,".hermes"),kimiHome:e.env.KIMI_CODE_HOME??Wt(n,".kimi-code"),piDir:Wt(n,".pi/agent/sessions"),lmplayerDbPaths:Z_(e.env,n)})),HN.set(e,t),t}var Ws=e=>{if(e&&typeof e=="object"){for(let t of Object.values(e))Ws(t);Object.freeze(e)}return e},ESe=Ws(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),ySe=Ws({status:"string",error:"string|null",code:"ErrorCode?"}),wSe=Ws(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),TSe=Ws(["Provider1.Provider","Provider1.Model1","Provider1.Model2","Provider1.Model3","Provider2.Provider","Provider2.Model1","Provider2.Model2","Provider2.Model3","Provider3.Provider","Provider3.Model1","Provider3.Model2","Provider3.Model3"]),vSe=Ws(["Provider1","Provider2","Provider3"]),SSe=Ws({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),De={name:"ctx",type:"context"},tE={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},wr={name:"teamfile",type:"string"},Tf={name:"alias",type:"string"},Hs={name:"prompt",type:"string"},vf={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"alias",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"},{name:"sessiondir",type:"string"},{name:"sessionid",type:"string"}]},bf=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],ta={name:"options",type:"map",optional:!0,keys:bf},WN={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},BN={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},GN={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},na={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},Sf={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0},{name:"sessiondir",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"}]},Yz=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"}],XN={name:"options",type:"map",optional:!0,keys:Yz},VN={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},Kz=Ws([{name:"resolveProfilePath",implemented:!0,params:[De,tE],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[De,tE],statuses:["ok","error"],results:{error:"string|null",profile:"{path,raw,config}",values:"{Provider1..3,Model1..3,Directory,NonInteractive}",path:"string?",line:"number?",column:"number?"},effects:["file-read"],summary:"Read and validate the complete init profile without discovery or writes."},{name:"profileValues",implemented:!0,params:[{name:"config",type:"map"}],statuses:["ok","error"],results:{error:"string|null",Provider1:"string",Provider2:"string",Provider3:"string",Model1:"string",Model2:"string",Model3:"string"},effects:[],summary:"Validate and map slots to first-model environment values."},{name:"readPrompts",implemented:!0,params:[De,{name:"path",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"single",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",prompts:"string[]"},effects:["file-read"],summary:"Read prompt records without exiting the caller.",scriptBinding:{name:"lm_read_prompts",params:[{name:"batchfile",type:"string"},{name:"single",type:"boolean",optional:!0}]}},{name:"listMembers",implemented:!0,params:[De,wr],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[wr]}},{name:"resolveMember",implemented:!0,params:[De,wr,Tf],statuses:["ok","not_found","error"],results:{error:"string|null",member:"Member",isLead:"boolean",teamfile:"string"},effects:["file-read","db"],summary:"Resolve a team member with an explicit missing outcome.",scriptBinding:{name:"lm_member",params:[wr,Tf]}},{name:"lintTeam",implemented:!0,params:[De,wr],statuses:["ok","error"],results:{error:"string|null",errors:"list",warnings:"list",counts:"map"},effects:["file-read","db"],summary:"Return structured lint findings.",scriptBinding:{name:"lm_lint",params:[wr]}},{name:"seedTeam",implemented:!0,params:[De,wr,WN],statuses:["ok","error"],results:{error:"string|null",seeded:"SeededMember[]"},effects:["provider","db","file-write"],summary:"Seed a team with explicit optional preambles.",scriptBinding:{name:"lm_seed",params:[wr,WN]}},{name:"promptAgent",implemented:!0,params:[De,vf,Hs,ta],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...VN,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[vf,Hs,ta]}},{name:"promptMember",implemented:!0,params:[De,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"prompt",type:"string",required:!0},{name:"messageType",type:"string"},...bf]}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn a team member through native team admission.",scriptBinding:{name:"lm_prompt",params:[wr,Tf,Hs,{name:"options",type:"map",optional:!0,keys:[...bf,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[De,{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"workspace",type:"string"},{name:"all",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",sessions:"Session[]"},effects:["file-read"],summary:"List native sessions in an explicit workspace.",scriptBinding:{name:"lm_session_list",params:[{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"sessiondir",type:"string"},{name:"all",type:"boolean"}]}]}},{name:"deleteSession",implemented:!0,params:[De,na,GN],statuses:["deleted","not_found","busy","error"],results:{error:"string|null"},effects:["provider","file-write"],summary:"Delete a session only with explicit force admission.",scriptBinding:{name:"lm_session_delete",params:[vf,{...GN,optional:!0}]}},{name:"getSession",implemented:!0,params:[De,na],statuses:["ok","not_found","error"],results:{error:"string|null",messages:"{role,content}[]"},effects:["provider","file-read"],summary:"Read native session messages.",scriptBinding:{name:"lm_session_get",params:[na]}},{name:"reserveSession",implemented:!0,params:[De,na],statuses:["ok","busy","error"],results:{error:"string|null",reservation:"SessionReservation"},effects:[],summary:"Reserve context-local handoff admission and return a capability."},{name:"releaseSession",implemented:!0,params:[De,na,{name:"reservation",type:"SessionReservation",optional:!0}],statuses:["ok","error"],results:{error:"string|null"},effects:[],summary:"Release context-local handoff admission; an optional capability makes owned cleanup idempotent and replacement-safe."},{name:"openTeamBatch",returnsResource:!0,implemented:!0,params:[De,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"label",type:"string",required:!0},{name:"promptCount",type:"number",required:!0},{name:"legacy",type:"boolean"},...bf]}],statuses:["ok","busy","error"],results:{error:"string|null",batch:"opaque context-bound BatchRef"},effects:["provider","db"],summary:"Open a managed team batch; member-map composition remains language-owned."},{name:"batchTurn",implemented:!0,params:[De,{name:"batch",type:"BatchRef"},Hs,{name:"index",type:"number"},{name:"total",type:"number"}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn an owned live batch reference."},{name:"closeBatch",implemented:!0,params:[De,{name:"batch",type:"BatchRef"},{name:"options",type:"map",keys:[{name:"status",type:"string",required:!0,values:["done","error","cancelled"]},{name:"error",type:"string"}]}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close an owned batch."},{name:"readRatelimits",implemented:!0,params:[De,BN],statuses:["ok","error"],results:{error:"string|null",readings:"list"},effects:["file-read","network"],summary:"Read provider rate-limit data.",scriptBinding:{name:"lm_ratelimit_readings",params:[BN]}},{name:"openTerminal",implemented:!0,params:[De,{name:"target",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0}]},{name:"streams",type:"map",keys:[{name:"stdin",type:"stream",required:!0},{name:"stdout",type:"stream",required:!0},{name:"stderr",type:"stream",required:!0}]}],statuses:["ok","error"],results:{error:"string|null",code:"number|null",signal:"string|null"},effects:["provider","db","tty"],summary:"Open a native terminal with caller-supplied streams.",scriptBinding:{name:"lm_terminal",params:[wr,Tf]}},{name:"sessionAdmission",implemented:!0,params:[De,na],statuses:["ok","busy","error"],results:{error:"string|null",busyReason:"turn|handoff?"},effects:[],summary:"Query context-local session admission without exposing mutable sets."},{name:"promptReservedAgent",implemented:!0,params:[De,{name:"reservation",type:"SessionReservation"},vf,Hs,ta],statuses:["ok","busy","stalled","empty","error"],results:{...VN,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[De,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Synchronously release one batch on a close deadline without cancelling unrelated batches."},{name:"inspectBatch",implemented:!0,params:[De,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null",id:"string",closed:"boolean",member:"Member",rootId:"number|null"},effects:[],summary:"Read batch metadata without exposing native transports or lease capabilities."},{name:"openNativeSession",returnsResource:!0,implemented:!0,params:[De,{name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0},{name:"sessiondir",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"}]},ta],statuses:["ok","busy","error"],results:{error:"string|null",session:"opaque context-bound NativeSessionRef"},effects:["provider","db","file-read"],summary:"Open a script-owned native conversation with existing receiver admission."},{name:"nativeSessionTurn",implemented:!0,params:[De,{name:"session",type:"NativeSessionRef"},Hs],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Record one unframed conversational turn through the existing recorder."},{name:"closeNativeSession",implemented:!0,params:[De,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close a script-owned native conversation and release its lease."},{name:"finalizeNativeSessionSync",implemented:!0,params:[De,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Critical synchronous native conversation lease release."},{name:"nativeSessionRequest",implemented:!0,params:[De,Sf,Hs,ta],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null",code:"ErrorCode?",outcome:"not_sent|completed|unknown?",service_epoch:"string|null?",connection_epoch:"number|null?",connection_state:"new|reused|reinitialized|null?"},effects:["provider","db","network"],summary:"Send a stateless native-id turn to a qualified conversation in the configured running lmbee service.",scriptBinding:{name:"lm_session_turn",params:[Sf,Hs,ta]}},{name:"nativeSessionClose",implemented:!0,params:[De,Sf],statuses:["ok","busy","error"],results:{error:"string|null",code:"ErrorCode?",outcome:"not_sent|completed|unknown?",service_epoch:"string|null?",connection_epoch:"number|null?",connection_state:"new|reused|reinitialized|null?"},effects:["provider","db","network"],summary:"Close an idle service-hosted native conversation; an absent entry is already closed.",scriptBinding:{name:"lm_session_close",params:[Sf]}},{name:"loadProperties",implemented:!0,params:[De,tE],statuses:["ok","error"],results:{error:"string|null",path:"string",properties:"map",flat:"map",line:"number?",column:"number?"},effects:["file-read"],summary:"Read the complete hierarchical init.toml properties document through the canonical reader."},{name:"listRunning",implemented:!0,params:[De,XN],statuses:["ok","error"],results:{error:"string|null",running:"RunningRow[]",dead:"DeadRow[]",idle:"IdleRow[]"},effects:["db"],summary:"DB-wide view of tracked invocation activity. Observation only; dispatch and branch on status busy, never gate on this.",scriptBinding:{name:"lm_running",params:[XN]}}]);function nE(e){if(!KI(e))return Be("invalid_argument","Expected a context created by createLmctlContext");if(e.closed)return Be("cancelled","Context is closed")}function JN(e,t){let n=r=>s=>{t?.(s,r),r==="stderr"&&s.startsWith("warning:")?e.onWarning(s):e.onProgress(s,r)};return{cwd:e.cwd,env:{...e.env,LMCTL_DB:e.dbPath},dal:e.dal,stdout:{write:n("stdout")},stderr:{write:n("stderr")}}}import{readFileSync as Qz,writeFileSync as DSe,renameSync as $Se,existsSync as Zz}from"node:fs";import{basename as e4,resolve as If,dirname as rE}from"node:path";var Af=["title","description","members"],zz=new Set(Af),Tr=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}};function YN(e){if(e.length===0||!e.startsWith("---"))throw new Tr("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
2016
2016
  `);if(t[0]!=="---")throw new Tr("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let i=1;i<t.length;i++){let a=t[i];if(a==="---"){r=i;break}if(a.trim()==="")continue;let c=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!c)throw new Tr(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let l=c[1],d=c[2].trim();if(!zz.has(l))throw new Tr(`unknown frontmatter key "${l}" \u2014 allowed keys: ${Af.join(", ")}`);n[l]=d}if(r===-1)throw new Tr("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Af)if(n[i]===void 0)throw new Tr(`missing required frontmatter key "${i}" \u2014 required: ${Af.join(", ")}`);let s=0;for(let i=0;i<=r;i++)s+=t[i].length+1;s>e.length&&(s=e.length);let o=n.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:n.title,description:n.description,members:o,bodyOffset:s}}var t4="Lead";function n4(e){let t={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(e))!==null;){let s=r[1],o=r[2]!==void 0?r[2]:r[3];t[s]=o}return t}function r4(e){return/^\s*_MEMBER_\s+\S/.test(e)}function s4(e){return/^\s*_SESSION_\s+\S/.test(e)}function o4(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function sE(e){return/\.(?:lmctl|lmc)$/i.test(e)}function oE(e){return e4(e).replace(/\.(?:lmctl|lmc)$/i,"")}function iE(e){let t=Qz(e,"utf-8"),n=rE(If(e)),r=aE(t,oE(e),{baseDir:n,sourcePath:If(e)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=If(n,s.sessiondir));return r}var KN=["alias","provider","sessionid","sessiondir","teamfile","model","effort"];function aE(e,t,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let o=e;if(o.startsWith("#teamfile:")){let c=o.indexOf(`
2017
2017
  `);o=c>=0?o.slice(c+1):""}let i=null;if(o.startsWith("---"))try{i=YN(o)}catch(c){if(c instanceof Tr)s.push(`frontmatter: ${c.message}`);else throw c}let a=e.split(`
2018
2018
  `);for(let c=0;c<a.length;c++){let l=a[c],d=c+1;if(s4(l))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${l.trim()})`);if(o4(l)||!r4(l))continue;let u=n4(l);for(let m of Object.keys(u))if(!KN.includes(m))throw new Error(`line ${d}: unknown key "${m}" on _MEMBER_ line: ${l.trim()}
2019
- allowed keys: ${KN.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${l.trim()}`);continue}if(!u.alias){s.push(`line ${d}: member line missing required alias: ${l.trim()}`);continue}let f={alias:u.alias,provider:u.provider||"",extra:{}};u.sessionid&&(f.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(f.sessiondir=u.sessiondir),u.teamfile&&(f.teamfile=u.teamfile),u.model&&(f.model=u.model),u.effort&&(f.effort=u.effort),r.push(f)}return{name:t,members:r,rawText:e,parseErrors:s,frontmatter:i}}function cE(e){return e.members.find(t=>t.alias.toLowerCase()===t4.toLowerCase())}function lE(e,t,n,r={}){let s=r.requireSession??!0;if(!e.teamfile)throw new Error(`Member "${e.alias}" is not a team reference`);let o=If(t,e.teamfile),i=n??new Set;if(i.has(o))throw new Error(`Circular team reference: ${e.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!Zz(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${e.alias}")`);let a=iE(o),c=cE(a);if(!c)throw new Error(`Team at ${o} has no lead session`);if(c.teamfile)return lE(c,rE(o),i,r);if(s&&!c.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:c.provider,session:c.session??"",sessiondir:c.sessiondir||rE(o),alias:e.alias,resolvedFrom:o,model:c.model,effort:c.effort}}function zN(e,t){return e.members.find(n=>n.alias===t)??e.members.find(n=>n.alias.toLowerCase()===t.toLowerCase())}import{existsSync as y4}from"node:fs";import{dirname as rx}from"node:path";import{createHash as i4}from"node:crypto";import{existsSync as QN,readFileSync as ZN,realpathSync as a4}from"node:fs";import{dirname as c4,resolve as ex}from"node:path";var dE=5,kf=class extends Error{constructor(t){super(t),this.name="ForeignSessionidOwnershipError"}};function Vr(e,t){let n=ex(e);if(QN(n))return a4(n);if(t!==void 0){let r=d4(e,n,t);if(r!==null)return r}return n}function tx(e,t){let n=c4(t),r=aE(e,oE(t),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=ex(n,s.sessiondir));return r}function ra(e,t,n=r=>{process.stderr.write(`warning: ${r}
2020
- `)}){let r=Vr(e,l4(t)?t:void 0);if(QN(r)){let o=ZN(r,"utf8"),i=tx(o,r);return t!==void 0&&"upsertRootTeam"in t&&t.getRootTeam(r)===null&&u4(i)&&p4(t,r,i,o,n),i}let s=t?.getRootTeam(r)??null;throw s!==null?new Error(`teamfile missing on disk: ${r} (registered ${s.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${e}`)}function l4(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function d4(e,t,n){let r=n.getRootTeam(e)??n.getRootTeam(t);return r===null?null:r.teamfile_path}function u4(e){return e.parseErrors.length>0?!1:e.members.every(t=>t.teamfile!==void 0?!0:t.session!==void 0&&t.session.length>=dE)}function f4(e,t,n){let r=Vr(t),s=n.members.filter(o=>o.teamfile===void 0&&o.session!==void 0&&o.session.length>=dE);if(s.length!==0)for(let o of e.listRootTeams()){let i,a;try{if(i=Vr(o.teamfile_path),i===r)continue;a=ZN(i,"utf8")}catch(l){if(m4(l))continue;throw l}let c=tx(a,i);for(let l of s){let d=c.members.find(u=>u.teamfile===void 0&&u.session===l.session&&(u.session?.length??0)>=dE);if(d!==void 0)throw new kf(`sessionid ownership conflict: ${r}:${l.alias} and ${i}:${d.alias} both use sessionid "${l.session}"`)}}}function m4(e){let t=e?.code;return t==="ENOENT"||t==="ENOTDIR"}function p4(e,t,n,r,s){try{f4(e,t,n)}catch(i){if(!(i instanceof kf))throw i;s(`${i.message}; skipping automatic registration`);return}let o={teamfile_path:t,name:n.name,raw_text:r,raw_sha256:i4("sha256").update(r).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};e.upsertRootTeam(o)}import{closeSync as XSe,openSync as VSe,readFileSync as h4,statSync as _4,unlinkSync as JSe,writeFileSync as YSe}from"node:fs";function g4(e,t){return`${e}.seed-${t.toLowerCase()}.lock`}function E4(e){let t;try{t=JSON.parse(h4(e,"utf8"))}catch(r){return r.code==="ENOENT"?!1:nx(e)}let n=typeof t=="object"&&t!==null&&"pid"in t?t.pid:void 0;if(typeof n!="number"||!Number.isInteger(n)||n<=0)return nx(e);try{return process.kill(n,0),!0}catch(r){return r.code!=="ESRCH"}}function nx(e){try{return Date.now()-_4(e).mtimeMs<3e5}catch{return!1}}function uE(e,t){return E4(g4(e,t))}var Bt=class extends Error{constructor(t,n){super(t),this.name="ChatTargetError",n&&Object.defineProperty(this,"kind",{value:n})}};var fE=/^[A-Za-z][A-Za-z0-9_-]*$/;function w4(e){return fE.test(e)}function mE(e){if(!e.includes(":"))return null;let t=e.lastIndexOf(":"),n=e.slice(0,t),r=e.slice(t+1);return!sE(n)||!fE.test(r)?null:{teamfile:n,alias:r}}function Wo(e,t,n){if(!sE(e))throw new Bt(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl or .lmc extension).`);if(!w4(t))throw new Bt(`lmctl: "${t}" is not a valid alias (must match ${fE.source}).`);let r=Vr(e,n);if(n===void 0&&!y4(r))throw new Bt(`lmctl: teamfile not found: ${e}`,"not_found");let s;try{s=ra(r,n)}catch(i){throw new Bt(`lmctl: ${e}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new Bt(`lmctl: ${e}: ${s.parseErrors.join("; ")}`);let o=zN(s,t);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new Bt(`lmctl: alias "${t}" not found in ${e}.
2019
+ allowed keys: ${KN.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${l.trim()}`);continue}if(!u.alias){s.push(`line ${d}: member line missing required alias: ${l.trim()}`);continue}let f={alias:u.alias,provider:u.provider||"",extra:{}};u.sessionid&&(f.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(f.sessiondir=u.sessiondir),u.teamfile&&(f.teamfile=u.teamfile),u.model&&(f.model=u.model),u.effort&&(f.effort=u.effort),r.push(f)}return{name:t,members:r,rawText:e,parseErrors:s,frontmatter:i}}function cE(e){return e.members.find(t=>t.alias.toLowerCase()===t4.toLowerCase())}function lE(e,t,n,r={}){let s=r.requireSession??!0;if(!e.teamfile)throw new Error(`Member "${e.alias}" is not a team reference`);let o=If(t,e.teamfile),i=n??new Set;if(i.has(o))throw new Error(`Circular team reference: ${e.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!Zz(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${e.alias}")`);let a=iE(o),c=cE(a);if(!c)throw new Error(`Team at ${o} has no lead session`);if(c.teamfile)return lE(c,rE(o),i,r);if(s&&!c.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:c.provider,session:c.session??"",sessiondir:c.sessiondir||rE(o),alias:e.alias,resolvedFrom:o,model:c.model,effort:c.effort}}function zN(e,t){return e.members.find(n=>n.alias===t)??e.members.find(n=>n.alias.toLowerCase()===t.toLowerCase())}import{existsSync as y4}from"node:fs";import{dirname as rx}from"node:path";import{createHash as i4}from"node:crypto";import{existsSync as QN,readFileSync as ZN,realpathSync as a4}from"node:fs";import{dirname as c4,resolve as ex}from"node:path";var dE=5,kf=class extends Error{constructor(t){super(t),this.name="ForeignSessionidOwnershipError"}};function Jr(e,t){let n=ex(e);if(QN(n))return a4(n);if(t!==void 0){let r=d4(e,n,t);if(r!==null)return r}return n}function tx(e,t){let n=c4(t),r=aE(e,oE(t),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=ex(n,s.sessiondir));return r}function ra(e,t,n=r=>{process.stderr.write(`warning: ${r}
2020
+ `)}){let r=Jr(e,l4(t)?t:void 0);if(QN(r)){let o=ZN(r,"utf8"),i=tx(o,r);return t!==void 0&&"upsertRootTeam"in t&&t.getRootTeam(r)===null&&u4(i)&&p4(t,r,i,o,n),i}let s=t?.getRootTeam(r)??null;throw s!==null?new Error(`teamfile missing on disk: ${r} (registered ${s.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${e}`)}function l4(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function d4(e,t,n){let r=n.getRootTeam(e)??n.getRootTeam(t);return r===null?null:r.teamfile_path}function u4(e){return e.parseErrors.length>0?!1:e.members.every(t=>t.teamfile!==void 0?!0:t.session!==void 0&&t.session.length>=dE)}function f4(e,t,n){let r=Jr(t),s=n.members.filter(o=>o.teamfile===void 0&&o.session!==void 0&&o.session.length>=dE);if(s.length!==0)for(let o of e.listRootTeams()){let i,a;try{if(i=Jr(o.teamfile_path),i===r)continue;a=ZN(i,"utf8")}catch(l){if(m4(l))continue;throw l}let c=tx(a,i);for(let l of s){let d=c.members.find(u=>u.teamfile===void 0&&u.session===l.session&&(u.session?.length??0)>=dE);if(d!==void 0)throw new kf(`sessionid ownership conflict: ${r}:${l.alias} and ${i}:${d.alias} both use sessionid "${l.session}"`)}}}function m4(e){let t=e?.code;return t==="ENOENT"||t==="ENOTDIR"}function p4(e,t,n,r,s){try{f4(e,t,n)}catch(i){if(!(i instanceof kf))throw i;s(`${i.message}; skipping automatic registration`);return}let o={teamfile_path:t,name:n.name,raw_text:r,raw_sha256:i4("sha256").update(r).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};e.upsertRootTeam(o)}import{closeSync as XSe,openSync as VSe,readFileSync as h4,statSync as _4,unlinkSync as JSe,writeFileSync as YSe}from"node:fs";function g4(e,t){return`${e}.seed-${t.toLowerCase()}.lock`}function E4(e){let t;try{t=JSON.parse(h4(e,"utf8"))}catch(r){return r.code==="ENOENT"?!1:nx(e)}let n=typeof t=="object"&&t!==null&&"pid"in t?t.pid:void 0;if(typeof n!="number"||!Number.isInteger(n)||n<=0)return nx(e);try{return process.kill(n,0),!0}catch(r){return r.code!=="ESRCH"}}function nx(e){try{return Date.now()-_4(e).mtimeMs<3e5}catch{return!1}}function uE(e,t){return E4(g4(e,t))}var Bt=class extends Error{constructor(t,n){super(t),this.name="ChatTargetError",n&&Object.defineProperty(this,"kind",{value:n})}};var fE=/^[A-Za-z][A-Za-z0-9_-]*$/;function w4(e){return fE.test(e)}function mE(e){if(!e.includes(":"))return null;let t=e.lastIndexOf(":"),n=e.slice(0,t),r=e.slice(t+1);return!sE(n)||!fE.test(r)?null:{teamfile:n,alias:r}}function Wo(e,t,n){if(!sE(e))throw new Bt(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl or .lmc extension).`);if(!w4(t))throw new Bt(`lmctl: "${t}" is not a valid alias (must match ${fE.source}).`);let r=Jr(e,n);if(n===void 0&&!y4(r))throw new Bt(`lmctl: teamfile not found: ${e}`,"not_found");let s;try{s=ra(r,n)}catch(i){throw new Bt(`lmctl: ${e}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new Bt(`lmctl: ${e}: ${s.parseErrors.join("; ")}`);let o=zN(s,t);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new Bt(`lmctl: alias "${t}" not found in ${e}.
2021
2021
  Known aliases: ${i}`,"not_found")}if(o.teamfile!==void 0){let i=lE(o,rx(r));return{teamfile:r,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(uE(r,o.alias))throw new Bt(`lmctl: alias "${o.alias}" is being seeded. Wait for the seed to finish, then retry this prompt.`);if(o.session===void 0)throw s.members.some(i=>uE(r,i.alias))?new Bt(`lmctl: alias "${o.alias}" has no session ID yet, and a seed is currently in progress for this team. Wait for the seed to finish, then retry this prompt.`):new Bt(`lmctl: alias "${o.alias}" in ${e} has no session ID yet.
2022
- Run: lmctl seed ${e}`);return{teamfile:r,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??rx(r),isLead:cE(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}import{hostname as T4,networkInterfaces as obe}from"node:os";var v4=12e4;function S4(e=process.env){return b4(e.LMCTL_TERMINAL_LOCK_STALE_MS,v4)}function pE(e,t={}){let n=t.now??new Date,r=t.localHost??T4(),s=t.staleMs??S4();if(e.holder_host===r)return(t.isProcessAlive??A4)(e.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(e.last_heartbeat);return Number.isFinite(o)?n.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Yc(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function b4(e,t){if(e===void 0||e.trim()==="")return t;let n=e.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?t:r}function A4(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}import{openSync as q4,closeSync as H4,fstatSync as W4,readSync as B4,constants as gx}from"node:fs";import{dirname as G4,join as Rf}from"node:path";import{createHash as X4}from"node:crypto";var j4=Cn(gE(),1);function Yr(e){let t=e.env?.LMCTL_DB;return t!==void 0&&t.length>0?t:Fi(void 0,{...process.env,...e.env})}async function Ye(e,t){if(e.dal!==void 0)return t(e.dal);let n=hr({path:Yr(e)});try{return await t(n)}finally{n.close()}}function _x(e){if(e===void 0)return null;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:null}var Kc={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null};var vx=e=>e.record_id??e.source+":"+e.source_model_id,Ex=e=>e===null||typeof e=="number"&&Number.isFinite(e)&&e>=0;function wE(e){if(!Ro(e.catalog)||!No(e.aliases)||!e.sha256||!/^[a-f0-9]{64}$/.test(e.sha256))throw Error("invalid or incomplete price snapshot (catalog, aliases and SHA-256 required)");if(!["network","cache","bundled","pinned"].includes(e.source)||e.generatedAt!==null&&typeof e.generatedAt!="string")throw Error("invalid price snapshot metadata");if(e.catalog.records.length>1e5||e.aliases.aliases.length>1e5||e.aliases.standards.length>1e5)throw Error("price snapshot exceeds the 100000-entry limit");let t=o=>{if(o.length>65536)throw Error("price identity exceeds the 65536-character limit")},n=new Set,r=new Set,s=new Set;for(let o of e.catalog.records){let i=vx(o);if(!i||n.has(i))throw Error("duplicate or missing price record id");n.add(i),t(i),t(o.source),t(o.source_model_id);for(let d of[o.source,o.source_model_id])if(typeof d!="string"||!d.trim())throw Error("invalid price record identity");let a=o;for(let d of[o.provider,o.mode,o.gateway_id,o.record_id,a.vendor_model_id,a.canonical_slug])if(d!=null&&typeof d!="string")throw Error("invalid price record metadata");for(let d of[o.pricing.input_per_1m_tokens,o.pricing.output_per_1m_tokens,o.pricing.input_cache_read_per_1m_tokens,o.pricing.input_cache_write_per_1m_tokens??null])if(!Ex(d))throw Error("price rates must be finite nonnegative numbers or null");let c=o.pricing.source_cost_fields;if(c!=null&&(typeof c!="object"||Array.isArray(c)))throw Error("invalid source cost fields");for(let d of["cache_creation_input_token_cost","cache_creation_input_token_cost_above_1hr"])if(c?.[d]!==void 0&&!Ex(c[d]))throw Error("source blend rates must be finite nonnegative numbers or null");let l=o.pricing.currency;if(l!=null&&l!=="USD")throw Error("price currency must be USD")}for(let o of e.aliases.standards){t(o.standard_slug),o.catalog_record_id!==null&&t(o.catalog_record_id);let i=o.standard_slug.toLowerCase();if(!i||r.has(i))throw Error("duplicate price standard");r.add(i)}for(let o of e.aliases.aliases){t(o.alias),o.standard_slug!==null&&t(o.standard_slug);let i=o.alias.toLowerCase();if(!i||s.has(i))throw Error("duplicate price alias");if(s.add(i),o.standard_slug!==null&&!r.has(o.standard_slug.toLowerCase()))throw Error("price alias references missing standard")}}var V4=64*1024*1024;function yx(e){let t=q4(e,gx.O_RDONLY|gx.O_NONBLOCK);try{let n=W4(t);if(!n.isFile()||n.size>V4)throw Error("price file must be a regular file within the 64 MiB size limit");let r=Buffer.alloc(n.size+1),s=0;for(;s<r.length;){let o=B4(t,r,s,r.length-s,null);if(o===0)break;s+=o}if(s!==n.size)throw Error("price file changed while reading; retry with a complete file");return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(r.subarray(0,s))}finally{H4(t)}}var wx=e=>JSON.parse(e.replace(/^\uFEFF/,""));function J4(e,t=Rf(G4(e),"aliases.json")){let n=yx(e),r=yx(t),s;try{s=wx(n)}catch{s=null}if(!s||!("records"in Object(s))){let a=n.trim().split(/\r?\n/).filter(l=>l.trim()).map(l=>JSON.parse(l)),c=a[0]?.schema_version!==void 0&&a[0]?.pricing===void 0&&a[0]?.source_model_id===void 0?a.shift():{};s={schema_version:c.schema_version??1,generated_at:c.generated_at??"",records:a}}let o=wx(r),i={catalog:s,aliases:o,source:"pinned",generatedAt:s?.generated_at||null,sha256:X4("sha256").update(n).update(r).digest("hex")};return wE(i),i}function yE(e){let t=e.pragma("busy_timeout",{simple:!0});try{return e.pragma("busy_timeout = 0"),e.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='price_snapshot'").get()?e.transaction(()=>{let n=e.prepare("SELECT * FROM price_snapshot").get();if(!n)return null;let r=e.prepare("SELECT * FROM price_record ORDER BY ordinal").all().map(i=>{if(typeof i.record_id!="string"||!i.record_id||i.currency!=="USD"||i.unit!=="per_1m_tokens")throw Error("invalid stored price identity, currency or unit");let a=JSON.parse(i.record_json);return{...a,record_id:i.record_id,pricing:{...a.pricing,input_per_1m_tokens:i.input_1m,output_per_1m_tokens:i.output_1m,input_cache_read_per_1m_tokens:i.cache_read_1m,input_cache_write_per_1m_tokens:i.cache_write_1m,source_cost_fields:JSON.parse(i.source_cost_fields??"{}")}}});if(r.length!==n.record_count)throw Error("incomplete stored price snapshot");let s=e.prepare("SELECT alias,standard_slug,evidence FROM price_alias ORDER BY alias").all(),o={catalog:{schema_version:1,generated_at:n.generated_at??"",records:r},aliases:{schema_version:1,standards:JSON.parse(n.standards_json),aliases:s},source:n.source,generatedAt:n.generated_at,sha256:n.sha256,fetchedAt:n.fetched_at,loadedAt:n.loaded_at,recordCount:n.record_count};return wE(o),o})():null}finally{e.pragma("busy_timeout = "+t)}}function Y4(e,t,n={}){wE(t);let r=()=>e.prepare("SELECT sha256 FROM price_snapshot").get()?.sha256===t.sha256,s=e.pragma("busy_timeout",{simple:!0});try{return e.pragma("busy_timeout = 0"),r()?"unchanged":e.transaction(()=>{if(r())return"unchanged";e.exec("DELETE FROM price_alias; DELETE FROM price_record; DELETE FROM price_snapshot;");let o=e.prepare("INSERT INTO price_record(record_id,source,provider,source_model_id,vendor_model_id,canonical_slug,currency,unit,input_1m,output_1m,cache_read_1m,cache_write_1m,source_cost_fields,record_json,ordinal) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");t.catalog.records.forEach((l,d)=>{let u=l;o.run(vx(l),l.source,l.provider??null,l.source_model_id,u.vendor_model_id??null,u.canonical_slug??null,"USD","per_1m_tokens",l.pricing.input_per_1m_tokens,l.pricing.output_per_1m_tokens,l.pricing.input_cache_read_per_1m_tokens,l.pricing.input_cache_write_per_1m_tokens??null,JSON.stringify(l.pricing.source_cost_fields??{}),JSON.stringify(l),d)});let i=e.prepare("INSERT INTO price_alias(alias,standard_slug,evidence,catalog_record_id) VALUES(?,?,?,?)"),a=new Map(t.aliases.standards.map(l=>[l.standard_slug.toLowerCase(),l]));for(let l of t.aliases.aliases){let d=a.get(l.standard_slug?.toLowerCase()??"");i.run(l.alias.toLowerCase(),l.standard_slug,l.evidence,d?.catalog_record_id??null)}let c=new Date(n.now??Date.now()).toISOString();return e.prepare("INSERT INTO price_snapshot(sha256,generated_at,source,fetched_at,loaded_at,record_count,standards_json) VALUES(?,?,?,?,?,?,?)").run(t.sha256,t.generatedAt,t.source,c,c,t.catalog.records.length,JSON.stringify(t.aliases.standards)),"updated"}).immediate()}catch(o){if(/^SQLITE_(BUSY|LOCKED|READONLY)(_|$)/.test(String(o?.code)))return"deferred";throw o}finally{e.pragma("busy_timeout = "+s)}}var EE=new WeakMap;async function K4(e,t={}){let n=t.now??Date.now(),r={...process.env,...t.env},s=yE(e),o=EE.get(e),i=o&&o.hash===s?.sha256?o.at:Date.parse(s?.fetchedAt??"");if(!t.force&&s&&n>=i&&n-i<uu(r))return{status:"unchanged",snapshot:s};let a=t.load??(()=>r.LMCTL_PRICE_DATA?Promise.resolve(J4(Rf(r.LMCTL_PRICE_DATA,"model_list.json"))):MA({cacheDir:r.LMCTL_HOME?Rf(r.LMCTL_HOME,"cache","lmprice"):r.HOME?Rf(r.HOME,".lmctl","cache","lmprice"):void 0,ttlMs:t.force?0:uu(r)})),c,l;try{l=await(t.budgetMs===void 0?a():Promise.race([a(),new Promise(f=>{c=setTimeout(()=>f(null),t.budgetMs)})]))}finally{clearTimeout(c)}if(EE.set(e,{hash:s?.sha256??null,at:n}),!l?.catalog||!l.aliases||!l.sha256||l.refreshFailed&&(s||l.source!=="bundled"))return{status:"unavailable",snapshot:s};let d=Y4(e,l,{now:n}),u=yE(e);return EE.set(e,{hash:u?.sha256??null,at:n}),{status:d,snapshot:u}}async function Tx(e,t){try{return(await K4(e,{env:t,budgetMs:900})).snapshot??Kc}catch(n){if(/^SQLITE_(BUSY|LOCKED)(_|$)/.test(String(n?.code)))return Kc;try{return yE(e)??Kc}catch{return Kc}}}async function TE(e){if(e.dal)return Tx(e.dal.db,e.env);let t;try{return t=hr({path:Yr(e),recover:!1}),await Tx(t.db,e.env)}catch{return Kc}finally{try{t?.close()}catch{}}}import{existsSync as z4,mkdirSync as Q4,readFileSync as Z4,renameSync as e5,unlinkSync as t5,writeFileSync as n5}from"node:fs";import{homedir as bx}from"node:os";import{dirname as zc,join as Yt,resolve as r5}from"node:path";var Nf="lmctl",xf="lmctl0",s5={existsSync:z4,mkdirSync:Q4,readFileSync:Z4,writeFileSync:n5,renameSync:e5,unlinkSync:t5},Pn=s5,vE;function Ax(e,t,n){let r=zc(r5(n)),s=new Set,o=new Map;for(let i of t.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??r,c=o.get(a)??new Set;c.add(i.provider),o.set(a,c)}for(let[i,a]of o.entries())Sr(Yt(i,".mcp.json"),"mcpServers",[Bs(),Gs()]),a.has("opencode")&&Sr(Yt(i,".opencode","opencode.json"),"mcp",[Ix(),kx()]),a.has("kimi")&&Sr(Yt(i,".kimi-code","mcp.json"),"mcpServers",[Bs(),Gs()]);for(let i of s)c5(i)}function o5(e=vE??bx()){return Yt(e,".copilot","mcp-config.json")}function i5(e,t){Pn.mkdirSync(zc(e),{recursive:!0});let n=Yt(zc(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Pn.writeFileSync(n,`${JSON.stringify(t,null,2)}
2022
+ Run: lmctl seed ${e}`);return{teamfile:r,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??rx(r),isLead:cE(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}import{hostname as T4,networkInterfaces as obe}from"node:os";var v4=12e4;function S4(e=process.env){return b4(e.LMCTL_TERMINAL_LOCK_STALE_MS,v4)}function pE(e,t={}){let n=t.now??new Date,r=t.localHost??T4(),s=t.staleMs??S4();if(e.holder_host===r)return(t.isProcessAlive??A4)(e.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(e.last_heartbeat);return Number.isFinite(o)?n.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Yc(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function b4(e,t){if(e===void 0||e.trim()==="")return t;let n=e.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?t:r}function A4(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}import{openSync as q4,closeSync as H4,fstatSync as W4,readSync as B4,constants as gx}from"node:fs";import{dirname as G4,join as Rf}from"node:path";import{createHash as X4}from"node:crypto";var j4=Cn(gE(),1);function Kr(e){let t=e.env?.LMCTL_DB;return t!==void 0&&t.length>0?t:Fi(void 0,{...process.env,...e.env})}async function Ye(e,t){if(e.dal!==void 0)return t(e.dal);let n=hr({path:Kr(e)});try{return await t(n)}finally{n.close()}}function _x(e){if(e===void 0)return null;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:null}var Kc={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null};var vx=e=>e.record_id??e.source+":"+e.source_model_id,Ex=e=>e===null||typeof e=="number"&&Number.isFinite(e)&&e>=0;function wE(e){if(!Ro(e.catalog)||!No(e.aliases)||!e.sha256||!/^[a-f0-9]{64}$/.test(e.sha256))throw Error("invalid or incomplete price snapshot (catalog, aliases and SHA-256 required)");if(!["network","cache","bundled","pinned"].includes(e.source)||e.generatedAt!==null&&typeof e.generatedAt!="string")throw Error("invalid price snapshot metadata");if(e.catalog.records.length>1e5||e.aliases.aliases.length>1e5||e.aliases.standards.length>1e5)throw Error("price snapshot exceeds the 100000-entry limit");let t=o=>{if(o.length>65536)throw Error("price identity exceeds the 65536-character limit")},n=new Set,r=new Set,s=new Set;for(let o of e.catalog.records){let i=vx(o);if(!i||n.has(i))throw Error("duplicate or missing price record id");n.add(i),t(i),t(o.source),t(o.source_model_id);for(let d of[o.source,o.source_model_id])if(typeof d!="string"||!d.trim())throw Error("invalid price record identity");let a=o;for(let d of[o.provider,o.mode,o.gateway_id,o.record_id,a.vendor_model_id,a.canonical_slug])if(d!=null&&typeof d!="string")throw Error("invalid price record metadata");for(let d of[o.pricing.input_per_1m_tokens,o.pricing.output_per_1m_tokens,o.pricing.input_cache_read_per_1m_tokens,o.pricing.input_cache_write_per_1m_tokens??null])if(!Ex(d))throw Error("price rates must be finite nonnegative numbers or null");let c=o.pricing.source_cost_fields;if(c!=null&&(typeof c!="object"||Array.isArray(c)))throw Error("invalid source cost fields");for(let d of["cache_creation_input_token_cost","cache_creation_input_token_cost_above_1hr"])if(c?.[d]!==void 0&&!Ex(c[d]))throw Error("source blend rates must be finite nonnegative numbers or null");let l=o.pricing.currency;if(l!=null&&l!=="USD")throw Error("price currency must be USD")}for(let o of e.aliases.standards){t(o.standard_slug),o.catalog_record_id!==null&&t(o.catalog_record_id);let i=o.standard_slug.toLowerCase();if(!i||r.has(i))throw Error("duplicate price standard");r.add(i)}for(let o of e.aliases.aliases){t(o.alias),o.standard_slug!==null&&t(o.standard_slug);let i=o.alias.toLowerCase();if(!i||s.has(i))throw Error("duplicate price alias");if(s.add(i),o.standard_slug!==null&&!r.has(o.standard_slug.toLowerCase()))throw Error("price alias references missing standard")}}var V4=64*1024*1024;function yx(e){let t=q4(e,gx.O_RDONLY|gx.O_NONBLOCK);try{let n=W4(t);if(!n.isFile()||n.size>V4)throw Error("price file must be a regular file within the 64 MiB size limit");let r=Buffer.alloc(n.size+1),s=0;for(;s<r.length;){let o=B4(t,r,s,r.length-s,null);if(o===0)break;s+=o}if(s!==n.size)throw Error("price file changed while reading; retry with a complete file");return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(r.subarray(0,s))}finally{H4(t)}}var wx=e=>JSON.parse(e.replace(/^\uFEFF/,""));function J4(e,t=Rf(G4(e),"aliases.json")){let n=yx(e),r=yx(t),s;try{s=wx(n)}catch{s=null}if(!s||!("records"in Object(s))){let a=n.trim().split(/\r?\n/).filter(l=>l.trim()).map(l=>JSON.parse(l)),c=a[0]?.schema_version!==void 0&&a[0]?.pricing===void 0&&a[0]?.source_model_id===void 0?a.shift():{};s={schema_version:c.schema_version??1,generated_at:c.generated_at??"",records:a}}let o=wx(r),i={catalog:s,aliases:o,source:"pinned",generatedAt:s?.generated_at||null,sha256:X4("sha256").update(n).update(r).digest("hex")};return wE(i),i}function yE(e){let t=e.pragma("busy_timeout",{simple:!0});try{return e.pragma("busy_timeout = 0"),e.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='price_snapshot'").get()?e.transaction(()=>{let n=e.prepare("SELECT * FROM price_snapshot").get();if(!n)return null;let r=e.prepare("SELECT * FROM price_record ORDER BY ordinal").all().map(i=>{if(typeof i.record_id!="string"||!i.record_id||i.currency!=="USD"||i.unit!=="per_1m_tokens")throw Error("invalid stored price identity, currency or unit");let a=JSON.parse(i.record_json);return{...a,record_id:i.record_id,pricing:{...a.pricing,input_per_1m_tokens:i.input_1m,output_per_1m_tokens:i.output_1m,input_cache_read_per_1m_tokens:i.cache_read_1m,input_cache_write_per_1m_tokens:i.cache_write_1m,source_cost_fields:JSON.parse(i.source_cost_fields??"{}")}}});if(r.length!==n.record_count)throw Error("incomplete stored price snapshot");let s=e.prepare("SELECT alias,standard_slug,evidence FROM price_alias ORDER BY alias").all(),o={catalog:{schema_version:1,generated_at:n.generated_at??"",records:r},aliases:{schema_version:1,standards:JSON.parse(n.standards_json),aliases:s},source:n.source,generatedAt:n.generated_at,sha256:n.sha256,fetchedAt:n.fetched_at,loadedAt:n.loaded_at,recordCount:n.record_count};return wE(o),o})():null}finally{e.pragma("busy_timeout = "+t)}}function Y4(e,t,n={}){wE(t);let r=()=>e.prepare("SELECT sha256 FROM price_snapshot").get()?.sha256===t.sha256,s=e.pragma("busy_timeout",{simple:!0});try{return e.pragma("busy_timeout = 0"),r()?"unchanged":e.transaction(()=>{if(r())return"unchanged";e.exec("DELETE FROM price_alias; DELETE FROM price_record; DELETE FROM price_snapshot;");let o=e.prepare("INSERT INTO price_record(record_id,source,provider,source_model_id,vendor_model_id,canonical_slug,currency,unit,input_1m,output_1m,cache_read_1m,cache_write_1m,source_cost_fields,record_json,ordinal) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");t.catalog.records.forEach((l,d)=>{let u=l;o.run(vx(l),l.source,l.provider??null,l.source_model_id,u.vendor_model_id??null,u.canonical_slug??null,"USD","per_1m_tokens",l.pricing.input_per_1m_tokens,l.pricing.output_per_1m_tokens,l.pricing.input_cache_read_per_1m_tokens,l.pricing.input_cache_write_per_1m_tokens??null,JSON.stringify(l.pricing.source_cost_fields??{}),JSON.stringify(l),d)});let i=e.prepare("INSERT INTO price_alias(alias,standard_slug,evidence,catalog_record_id) VALUES(?,?,?,?)"),a=new Map(t.aliases.standards.map(l=>[l.standard_slug.toLowerCase(),l]));for(let l of t.aliases.aliases){let d=a.get(l.standard_slug?.toLowerCase()??"");i.run(l.alias.toLowerCase(),l.standard_slug,l.evidence,d?.catalog_record_id??null)}let c=new Date(n.now??Date.now()).toISOString();return e.prepare("INSERT INTO price_snapshot(sha256,generated_at,source,fetched_at,loaded_at,record_count,standards_json) VALUES(?,?,?,?,?,?,?)").run(t.sha256,t.generatedAt,t.source,c,c,t.catalog.records.length,JSON.stringify(t.aliases.standards)),"updated"}).immediate()}catch(o){if(/^SQLITE_(BUSY|LOCKED|READONLY)(_|$)/.test(String(o?.code)))return"deferred";throw o}finally{e.pragma("busy_timeout = "+s)}}var EE=new WeakMap;async function K4(e,t={}){let n=t.now??Date.now(),r={...process.env,...t.env},s=yE(e),o=EE.get(e),i=o&&o.hash===s?.sha256?o.at:Date.parse(s?.fetchedAt??"");if(!t.force&&s&&n>=i&&n-i<uu(r))return{status:"unchanged",snapshot:s};let a=t.load??(()=>r.LMCTL_PRICE_DATA?Promise.resolve(J4(Rf(r.LMCTL_PRICE_DATA,"model_list.json"))):MA({cacheDir:r.LMCTL_HOME?Rf(r.LMCTL_HOME,"cache","lmprice"):r.HOME?Rf(r.HOME,".lmctl","cache","lmprice"):void 0,ttlMs:t.force?0:uu(r)})),c,l;try{l=await(t.budgetMs===void 0?a():Promise.race([a(),new Promise(f=>{c=setTimeout(()=>f(null),t.budgetMs)})]))}finally{clearTimeout(c)}if(EE.set(e,{hash:s?.sha256??null,at:n}),!l?.catalog||!l.aliases||!l.sha256||l.refreshFailed&&(s||l.source!=="bundled"))return{status:"unavailable",snapshot:s};let d=Y4(e,l,{now:n}),u=yE(e);return EE.set(e,{hash:u?.sha256??null,at:n}),{status:d,snapshot:u}}async function Tx(e,t){try{return(await K4(e,{env:t,budgetMs:900})).snapshot??Kc}catch(n){if(/^SQLITE_(BUSY|LOCKED)(_|$)/.test(String(n?.code)))return Kc;try{return yE(e)??Kc}catch{return Kc}}}async function TE(e){if(e.dal)return Tx(e.dal.db,e.env);let t;try{return t=hr({path:Kr(e),recover:!1}),await Tx(t.db,e.env)}catch{return Kc}finally{try{t?.close()}catch{}}}import{existsSync as z4,mkdirSync as Q4,readFileSync as Z4,renameSync as e5,unlinkSync as t5,writeFileSync as n5}from"node:fs";import{homedir as bx}from"node:os";import{dirname as zc,join as Yt,resolve as r5}from"node:path";var Nf="lmctl",xf="lmctl0",s5={existsSync:z4,mkdirSync:Q4,readFileSync:Z4,writeFileSync:n5,renameSync:e5,unlinkSync:t5},Pn=s5,vE;function Ax(e,t,n){let r=zc(r5(n)),s=new Set,o=new Map;for(let i of t.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??r,c=o.get(a)??new Set;c.add(i.provider),o.set(a,c)}for(let[i,a]of o.entries())Sr(Yt(i,".mcp.json"),"mcpServers",[Bs(),Gs()]),a.has("opencode")&&Sr(Yt(i,".opencode","opencode.json"),"mcp",[Ix(),kx()]),a.has("kimi")&&Sr(Yt(i,".kimi-code","mcp.json"),"mcpServers",[Bs(),Gs()]);for(let i of s)c5(i)}function o5(e=vE??bx()){return Yt(e,".copilot","mcp-config.json")}function i5(e,t){Pn.mkdirSync(zc(e),{recursive:!0});let n=Yt(zc(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Pn.writeFileSync(n,`${JSON.stringify(t,null,2)}
2023
2023
  `,"utf8"),Pn.renameSync(n,e)}catch(r){try{Pn.unlinkSync(n)}catch{}throw r}}function a5(e,t){Pn.mkdirSync(zc(e),{recursive:!0});let n=Yt(zc(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Pn.writeFileSync(n,t,"utf8"),Pn.renameSync(n,e)}catch(r){try{Pn.unlinkSync(n)}catch{}throw r}}function Sr(e,t,n){try{if(!Pn.existsSync(e))return;let r=JSON.parse(Pn.readFileSync(e,"utf8"));if(!oa(r)||!oa(r[t]))return;let s={...r[t]},o=[];for(let{name:i,shouldRemove:a}of n)Object.prototype.hasOwnProperty.call(s,i)&&a(s[i])&&(delete s[i],o.push(i));if(o.length===0)return;r[t]=s,i5(e,r),ne({event:"mcp_cleanup",path:e,removed:o})}catch{}}function Bs(){return{name:xf,shouldRemove:_5}}function Ix(){return{name:xf,shouldRemove:g5}}function Gs(){return{name:Nf,shouldRemove:p5}}function kx(){return{name:Nf,shouldRemove:h5}}function c5(e){let t=vE??bx();switch(e){case"copilot":Sr(o5(t),"mcpServers",[Bs(),Gs()]);return;case"claude":Sr(Yt(t,".claude.json"),"mcpServers",[Bs(),Gs()]);return;case"gemini":Sr(Yt(t,".gemini","settings.json"),"mcpServers",[Bs(),Gs()]);return;case"qwen":Sr(Yt(t,".qwen","settings.json"),"mcpServers",[Bs(),Gs()]);return;case"agy":Sr(Yt(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[Bs(),Gs()]);return;case"opencode":Sr(Yt(t,".config","opencode","opencode.json"),"mcp",[Ix(),kx()]);return;case"kimi":Sr(Yt(vE===void 0?process.env.KIMI_CODE_HOME??Yt(t,".kimi-code"):Yt(t,".kimi-code"),"mcp.json"),"mcpServers",[Bs(),Gs()]);return;case"codex":l5(Yt(t,".codex","config.toml"));return;default:return}}function l5(e){try{if(!Pn.existsSync(e))return;let t=Pn.readFileSync(e,"utf8"),n=d5(t);if(n===null)return;let r=t.split(/\n/),s=[],o=new Set,i=!1,a;for(let c of r){let l=Rx(c);if(l===null)return;if(l!==void 0){if(Sx(l,n)){i=!0,a=l[1],o.add(a);continue}i=!1,a=void 0,s.push(c);continue}if(i){if(/^\s*(?:#.*)?$/.test(c)){s.push(c);continue}a!==void 0&&o.add(a);continue}let d=f5(c);if(d===null)return;if(d!==void 0&&Sx(d,n)){o.add(d[1]);continue}s.push(c)}if(o.size===0)return;a5(e,s.join(`
2024
2024
  `)),ne({event:"mcp_cleanup",path:e,removed:[...o]})}catch{}}function Sx(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function d5(e){let t=new Map,n;for(let s of e.split(/\n/)){let o=Rx(s);if(o===null)return null;if(o!==void 0){n=o;continue}let i=s.indexOf("=");if(i<0)continue;let a=s.slice(0,i).trim(),c=s.slice(i+1).trim(),l=u5(a,n);if(l===null)return null;if(l===void 0||l.length!==3||l[0]!=="mcp_servers"||l[1]!==Nf&&l[1]!==xf)continue;let d=t.get(l[1])??{};if(l[2]==="command"){let u=Nx(c);if(u===null)return null;d.command=u}else if(l[2]==="args"){let u=m5(c);if(u===null)return null;d.args=u}t.set(l[1],d)}let r=new Set;for(let[s,o]of t.entries())s===Nf&&Lx(o.command,o.args)&&r.add(s),s===xf&&Cx(o.command,o.args)&&r.add(s);return r}function u5(e,t){if(e.startsWith("mcp_servers"))return Lf(e);if(t===void 0||t.length<2||t[0]!=="mcp_servers")return;let n=Lf(e);return n===null?null:[...t,...n]}function Rx(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:Lf(t[1])}function f5(e){let t=e.indexOf("=");if(t<0)return;let n=e.slice(0,t).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return Lf(n)}function Lf(e){let t=[],n=0,r=()=>{for(;n<e.length&&/\s/.test(e[n]);)n+=1};for(;n<e.length;){if(r(),n>=e.length)return null;if(e[n]==='"'){n+=1;let s="",o=!1;for(;n<e.length;){let i=e[n];if(i==="\\"){if(n+1>=e.length)return null;s+=e[n+1],n+=2;continue}if(i==='"'){n+=1,o=!0;break}s+=i,n+=1}if(!o)return null;t.push(s)}else{let s=n;for(;n<e.length&&/[A-Za-z0-9_-]/.test(e[n]);)n+=1;if(n===s)return null;t.push(e.slice(s,n))}if(r(),n>=e.length)break;if(e[n]!==".")return null;n+=1}return t.length>0?t:null}function Nx(e){let t=xx(e).trim();if(t.startsWith('"'))try{let n=JSON.parse(t);return typeof n=="string"?n:null}catch{return null}return t.startsWith("'")&&t.endsWith("'")&&t.length>=2?t.slice(1,-1):null}function m5(e){let t=xx(e).trim();if(!t.startsWith("[")||!t.endsWith("]"))return null;let n=t.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>Nx(s.trim()));return r.some(s=>s===null)?null:r}function xx(e){let t;for(let n=0;n<e.length;n+=1){let r=e[n];if(t!==void 0){if(t==='"'&&r==="\\"){n+=1;continue}r===t&&(t=void 0);continue}if(r==='"'||r==="'"){t=r;continue}if(r==="#")return e.slice(0,n)}return e}function p5(e){return oa(e)?e.type==="stdio"&&typeof e.command=="string"&&Lx(e.command,e.args):!1}function h5(e){return!oa(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&Dx(e.command[0])&&e.command[1]==="mcp"||e.command.length===3&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&typeof e.command[2]=="string"&&Ox(e.command[0],[e.command[1],e.command[2]])}function _5(e){return oa(e)?e.type==="stdio"&&Cx(e.command,e.args):!1}function g5(e){return!oa(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&$x(e.command[0])&&e.command[1]==="mcp"}function Lx(e,t){return Dx(e)&&Mx(t)||Ox(e,t)}function Cx(e,t){return $x(e)&&Mx(t)}function Ox(e,t){return E5(e)&&Array.isArray(t)&&t.length===2&&y5(t[0])&&t[1]==="mcp"}function Dx(e){return typeof e=="string"&&SE(e)==="lmctl"}function $x(e){return typeof e=="string"&&SE(e)==="lmctl0"}function E5(e){if(typeof e!="string")return!1;let t=SE(e).toLowerCase();return t==="node"||t==="node.exe"}function y5(e){if(typeof e!="string")return!1;let t=e.replace(/\\/g,"/");return t==="lmctl-cli/dist/index.js"||t.endsWith("/lmctl-cli/dist/index.js")}function SE(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(r=>r.length>0).at(-1)??t}function Mx(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function oa(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}import{basename as w5}from"node:path";var T5=6e4,v5=2,Px=8*60*60*1e3;function Fx(e,t){let n=new Date(t.now.getTime()-Cf()).toISOString(),r=Hx(e,n).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=b5(t.sender,r),o=A5(t.sender,r);o!==null&&o.teamfile===t.root&&!Ux(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:t.receiverTeamfile,alias:t.receiverAlias,at:t.now.getTime()},a=[...s,i],c=s.filter(m=>Ux(m,i)),l=c.map(m=>m.at).filter(m=>m!==null).sort((m,p)=>p-m)[0]??null,d=l!==null&&t.now.getTime()-l<T5,u=bE(t.sender,r).length;return{stop:c.length>=1&&d&&u>=v5,chain:I5(a)}}function jx(e,t){let n=new Date(t.now.getTime()-Cf()).toISOString(),r=Hx(e,n),s=bE(t.sender,r);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function Cf(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return Px;let n=Number(t);return!Number.isFinite(n)||n<=0?Px:n}function qx(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function S5(e){return{sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},at:Date.parse(e.started_at)}}function Hx(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(S5).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=t).sort((n,r)=>n.at-r.at)}function b5(e,t,n={}){let r=new Map;for(let a of t)r.set(Bo(a.receiver),a);let s=[{...e,at:null}],o=e,i=new Set([Bo(e)]);for(let a=0;a<64;a+=1){let c=r.get(Bo(o));if(c===void 0)break;s[0]={...s[0],at:s[0].at??c.at};let l={...c.sender,at:c.at};if(c.sender.teamfile.startsWith("prompt:")&&n.includePromptSender!==!0)break;let d=Bo(c.sender);if(i.has(d))break;s.unshift(l),i.add(d),o=c.sender}return s}function bE(e,t){let n=Bo(e),r=new Set([n]),s=[n],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let c of t){let l=Bo(c.sender),d=Bo(c.receiver);l!==a&&d!==a||(o.includes(c)||o.push(c),r.has(l)||(r.add(l),s.push(l)),r.has(d)||(r.add(d),s.push(d)))}}return o.sort((i,a)=>i.at-a.at)}function A5(e,t){let n=bE(e,t);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function Ux(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Bo(e){return`${e.teamfile}\0${e.alias}`}function I5(e){return e.map(t=>`${w5(t.teamfile)}:${t.alias}`).join(" \u2192 ")}function k5(e,t){if(yI(t)!=="dead")return null;let n=`holder process verified not alive; reconciled to aborted (invocation #${t.id}, holder pid ${t.holder_pid??"unknown"} on ${t.holder_host??"unknown"})`;return e.abortTrackedInvocationAndTerminalizeMessage(t.id,{holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at,last_heartbeat_at:t.last_heartbeat_at},n)}function Wx(e,t,n){let r=e.query(`SELECT id, status, holder_pid, holder_host, started_at, last_heartbeat_at
2025
2025
  FROM tracked_invocation
@@ -2028,23 +2028,23 @@ ${tt(m,{provider:"dsh"})}`:"(no output captured)")))},mN);s.stdout?.on("data",m=
2028
2028
  AND status = 'running'`,t,n),s=0;for(let o of r)k5(e,o)!==null&&(s+=1);return s}var R5={muse:["--yolo"],claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],pi:[],lmplayer:["--auto"],kimi:[],hermes:[]};var Cbe=new Set(Object.keys(R5));var AE=null;function Bx(){return AE===null&&(AE=Os(qs())),AE}function Gx(e,t){return Bx().getSession(e,t)}async function Xx(e){return(await Bx().resolveSessions(e)).map(n=>n.provider.name)}var Vx=36e5;function N5(e=process.env){let t=e.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(t===void 0||t.trim()==="")return Vx;let n=Number(t);return!Number.isFinite(n)||n<=0?Vx:n}async function x5(e,t,n){try{let r=Wo(t,n,e),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let o;if(typeof r.provider=="string"&&r.provider.trim()!=="")o=r.provider;else{let l=await Xx(s);if(l.length!==1)return null;o=l[0]}let i=await Gx(s,o);if(i===null)return null;let a=i.modifiedAt;if(!(a instanceof Date))return null;let c=a.getTime();return Number.isFinite(c)?Date.now()-c:null}catch{return null}}async function Jx(e,t,n,r,s){if(!t.busy||t.reason!=="in-flight")return!1;let o=s??N5(),i=await x5(e,n,r),a=i!==null&&i>=o;return a&&ne({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,idle_ms:i,idle_minutes:i===null?null:Math.round(i/6e4),threshold_ms:o,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var Yx=Cn(gE(),1);function L5(e){return e===null?null:Sn(e)?"live":"dead"}function IE(e){let t=e.nowMs??Date.now(),n=Date.parse(e.since);return{holder_pid:e.holderPid,holder_liveness:L5(e.holderPid),since:e.since,idle_ms:Number.isFinite(n)?Math.max(0,t-n):null}}function C5(e){return(0,Yx.formatDuration)(e)}function kE(e){let t=[];return e.idle_ms!==null&&t.push(`active ${C5(e.idle_ms)}`),t.push(`since ${e.since}`),t.push(e.holder_pid===null?"holder_pid=unavailable":`holder_pid=${e.holder_pid}, ${e.holder_liveness}`),`(${t.join("; ")})`}function Kx(e,t=process.env,n){let r=n?.db?.name??Fi(void 0,t),s=t.LMCTL_DB===r?t:{...t,LMCTL_DB:void 0};return`lmctl ${e}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2029
2029
  The session marker may be stale or the team may not be registered in this lmctl database.
2030
2030
  Consulted ${GI(r,s)}
2031
- To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function zx(e,t){let n=O5(e,t);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function O5(e,t){let n=e[F_];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let o of t.listRootTeams()){let i;try{i=ra(o.teamfile_path,t)}catch{continue}for(let a of i.members)a.teamfile===void 0&&a.session===n&&r.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}function Qx(e){let t=mE(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Qbe=60*60*1e3,D5=2e3,$5=5e3;function M5(e,t,n){let r=`${t.teamfile}:${t.alias}`,s=null,o=()=>e.dal!==void 0?e.dal:(s===null&&(s=hr({path:Yr(e)})),s),i=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>o().listAgentInflight().some(a=>a.sender_teamfile===t.teamfile&&a.sender_alias===t.alias&&!(a.receiver_teamfile===t.teamfile&&a.receiver_alias===t.alias)&&a.holder_pid!==null&&Sn(a.holder_pid)),pollMs:D5,settleMs:$5,maxHoldMs:Ls(n),onHold:()=>ne({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{i(),!(!a.held&&a.reason==="cleared")&&ne({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function Zx(e){let t=e.literalPrompt?e.newMessage:P5(e.newMessage,{newMessageFrom:e.newMessageFrom??U5(e.sender)});if(t.length===0)throw new Error(`no message to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);let n=!1,r=nt(),s=0,o=0,i=0,a={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:t,permissionMode:e.permissionMode,env:e.env,onDelta:l=>{n=!0,r&&(s+=1,i=Buffer.byteLength(l,"utf8"),o+=i),e.onDelta?.(l)},onProgress:l=>e.onProgress?.(l)};e.registry&&(a.registry=e.registry),e.signal&&(a.signal=e.signal),e.receiver.model!==void 0&&(a.model=e.receiver.model),e.receiver.effort!==void 0&&(a.effort=e.receiver.effort),a.alias=e.receiver.alias,a.isLead=e.receiver.isLead,e.idleTimeoutMs!==void 0&&(a.timeoutMs=e.idleTimeoutMs),e.requireResume!==void 0&&(a.requireResume=e.requireResume),e.bundleSession!==void 0&&(a.bundleSession=e.bundleSession),a.holdOpen=M5(e.io,e.receiver,e.env),await e.onPromptBuilt?.(t);let c=await jN(a);if(e.requireResume&&c.sessionId!==e.receiver.sessionId)throw Object.assign(new Error(`provider session changed: expected ${e.receiver.sessionId}, received ${c.sessionId??"(missing)"}`),{usage:c.usage,sessionId:c.sessionId});return r&&An(JSON.stringify({event:"chat_return",alias:e.receiver.alias,provider:e.receiver.provider,streamed:n,blockCount:s,streamedBytes:o,resultTextBytes:Buffer.byteLength(c.text,"utf8"),lastChunkBytes:i,tailPreview:c.text.slice(-200)})),c.status==="stalled"?{status:"stalled",receipt:c.text,sessionId:c.sessionId,...c.usage?{usage:c.usage}:{},prompt:t,wroteDelta:n,durationMs:c.durationMs,stalledAfterMs:c.stalledAfterMs,...c.warnings!==void 0?{warnings:c.warnings}:{}}:c.status==="empty"?{status:"empty",receipt:c.text,sessionId:c.sessionId,...c.usage?{usage:c.usage}:{},prompt:t,wroteDelta:n,durationMs:c.durationMs,...c.warnings!==void 0?{warnings:c.warnings}:{}}:{status:"ok",receipt:c.text,sessionId:c.sessionId,...c.usage?{usage:c.usage}:{},prompt:t,wroteDelta:n,durationMs:c.durationMs,...c.warnings!==void 0?{warnings:c.warnings}:{}}}function P5(e,t={}){return[`--- new prompt (from ${t.newMessageFrom??"operator"}) ---`,e].join(`
2032
- `)}function U5(e){return`${e.teamfile}:${e.alias}`}var eL=256*1024,sL=3e4;async function oL(e){let t=e.onEvent??(()=>{}),n=F5(e.io,t),r=null,s=null,o=null,i,a,c=null,l=!1,d=null,u=e.prompt,f,m=()=>{let p=e.signal?.reason;if(o===null||!["SIGINT","SIGTERM","SIGHUP"].includes(p))return;let h;try{h=n.dal??hr({path:Yr(n)}),h.finishTrackedInvocation(o,{status:"cancelled",signal:p,exit_code:p==="SIGINT"?130:p==="SIGTERM"?143:129,error:`prompt holder received ${p}`,team_chat_log_id:c}),s!==null&&h.releaseAgentInflight(s.row,s.leaseId)}catch(_){n.stderr.write(`error: failed to record holder ${p}: ${String(_)}
2033
- `)}finally{n.dal===void 0&&h?.close()}};e.signal?.addEventListener("abort",m,{once:!0});try{let p=e.resolvedNativeTarget,h=p!==void 0;if(h&&(e.heldLease===void 0||e.conversation===void 0))throw new Bt("native session turns require a caller-held lease and conversation");let _=h?p:await Ye(n,S=>Wo(e.teamfile,e.alias,S));if(e.expectedSession!==void 0&&(_.provider!==e.expectedSession.provider||_.sessionid!==e.expectedSession.sessionid))throw new Bt(`session changed for ${_.alias}; expected ${e.expectedSession.provider}:${e.expectedSession.sessionid}, found ${_.provider}:${_.sessionid}`);if(h&&(e.conversation.provider!==_.provider||e.conversation.sessionId!==_.sessionid))throw new Bt("native session changed for "+_.alias+"; expected "+_.provider+":"+_.sessionid+", found "+e.conversation.provider+":"+e.conversation.sessionId);let g=_.teamfile,w=await Ye(n,S=>K5(S,e.env??process.env)),y=w.sender,E=h?"native:"+_.provider+":"+_.sessionid:await z5(n,{explicitRoot:e.rootFlag,sender:y,receiverTeamfile:g,operatorOrigin:w.origin==="operator"}),T=e.env??process.env;if(!h){let S=await Ye(n,x=>x.getRootTeam(E)?.name??null);S!==null&&(T.LMBEE_TEAM_NAME=S)}if(o=await W5(n,{receiverTeamfile:g,receiverAlias:_.alias,sender:y,rootTeamfile:E,provider:_.provider,model:_.model,sessionId:_.sessionid,cwd:_.sessiondir,prompt:e.prompt,origin:w.origin,parentInvocationId:_x(T.LMCTL_INVOCATION_ID)}),i=V5(n,o),e.signal?.aborted)throw m(),Error("Chat turn cancelled");o!==null&&(T.LMCTL_INVOCATION_ID=String(o));try{h||Ax(n,iE(g),g)}catch{}r={root_teamfile:E,sender_teamfile:y?.teamfile??null,sender_alias:y?.alias??null,receiver_teamfile:g,receiver_alias:_.alias,receiver_provider:_.provider,receiver_session_id:_.sessionid,origin:w.origin,message_type:e.messageType??null};let b=await aL(n,g,_.alias);if(b!==null){let S=Yc(b);return Go(o,r,e.prompt,S,"unavailable"),d=RE(S,null),{status:"busy",message:S,teamChatLogId:null}}let A=!1;if(e.heldLease!==void 0){let S=e.heldLease;if(!await Ye(n,C=>{let q=C.getAgentInflight(g,_.alias);return q===null||q.sender_teamfile!==S.row.sender_teamfile||q.sender_alias!==S.row.sender_alias||q.started_at!==S.row.started_at||q.holder_pid!==process.pid?!1:C.heartbeatAgentInflight(S.row,S.leaseId,new Date().toISOString())})){let C=`bundle lease lost for ${_.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return Go(o,r,e.prompt,C,"unavailable"),d=Qc(C,null),{status:"error",errorKind:"provider",message:C,teamChatLogId:null,messageId:null}}}else{let S=await j5(n,g,_.alias);if(S.busy){let x=await q5(n,g,_.alias);return x+=await H5(n,g,_.alias),Go(o,r,e.prompt,x,"unavailable"),d=RE(x,null),{status:"busy",message:x,teamChatLogId:null}}A=S.idleReclaim}if(y!==null&&y.teamfile!==g){let S=await Ye(n,x=>Fx(x,{root:E,sender:y,receiverTeamfile:g,receiverAlias:_.alias,now:new Date}));if(S.stop){let x=qx(S.chain);return Go(o,r,e.prompt,x,"cycle"),d=Qc(x,null),{status:"error",errorKind:"cycle",message:x,teamChatLogId:null,messageId:null}}}if(e.heldLease===void 0){let S=await Q5(n,{receiver_teamfile:g,receiver_alias:_.alias,sender_teamfile:y?.teamfile??g,sender_alias:y?.alias??"operator",...A?{force:!0,reclaimReason:"session-idle"}:{}});if(!S.acquired){let x=cL(g,_.alias,S.current);return x+=` ${kE(IE({holderPid:S.current.holder_pid,since:S.current.started_at}))}`,Go(o,r,e.prompt,x,"unavailable"),d=RE(x,null),{status:"busy",message:x,teamChatLogId:null}}s={row:S.lease,leaseId:S.leaseId},e.onInflightAcquired?.(s),a=gu(x=>Ye(n,C=>C.heartbeatAgentInflight(s.row,s.leaseId,x)),{intervalMs:sL,onError:x=>{nt()&&An(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:x instanceof Error?x.message:String(x)}))}})}if(e.signal?.aborted)throw Error("Chat turn cancelled");f=QA({provider:_.provider,modelRequested:_.model??null,cwd:_.sessiondir,sessionId:_.sessionid}),r&&(r.started_at=f.startedAt);let I=await Zx({sender:y??{teamfile:g,alias:"operator"},receiver:{teamfile:g,alias:_.alias,provider:_.provider,sessionId:_.sessionid,cwd:_.sessiondir,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.isLead!==void 0?{isLead:_.isLead}:{}},signal:e.signal,newMessage:e.prompt,newMessageFrom:y===null?"operator":`${y.teamfile}:${y.alias}`,...h?{literalPrompt:!0}:{},io:n,permissionMode:e.permissionMode,...e.expectedSession!==void 0?{requireResume:!0}:{},...e.bundleSession!==void 0?{bundleSession:e.bundleSession}:{},...e.conversation!==void 0?{bundleSession:e.conversation}:{},...e.registry!==void 0?{registry:e.registry}:{},env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:S=>t({kind:"delta",chunk:S}),onProgress:S=>t({kind:"progress",alias:_.alias,event:S}),onPromptBuilt:async S=>{u=S,c===null&&(c=await e8(n,{...r,message:S,usage:f}),c!==null&&(e.onAccepted?.(Hr(c)),o!==null&&await X5(n,o,c))),o!==null&&await G5(n,o,S)}});u=I.prompt;let R=I.status==="stalled",L=I.status==="empty",N=null,k=R?`provider stalled${I.stalledAfterMs!==void 0?` after ${I.stalledAfterMs}ms`:""}`:L?"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":I.status==="error"?I.error??I.receipt:null,D=R||L||I.status==="error"?"error":"ok",O=await h_(f,{status:I.status,sessionId:I.sessionId,usage:I.usage},()=>TE(n),{db:n.dal?.db,dbPath:Yr(n),env:n.env});c!==null?(await nL(n,c,{...r,message:u,response:I.receipt,status:D,error_detail:k,usage:O}),l=!0,N=c):N=await rL(n,{...r,message:u,response:I.receipt,status:D,error_detail:k,usage:O});let v=I.status!=="error"?I.warnings:void 0;if(R||L){let S=k;Go(o,r,u,S,"error"),d=Qc(S,N,I.receipt,v)}else d=J5(I.receipt,N,v);return{status:R?"stalled":L?"empty":"ok",replyText:I.receipt,wroteDelta:I.wroteDelta,teamChatLogId:N,messageId:N===null?null:Hr(N),durationMs:I.durationMs}}catch(p){let h=p instanceof Error?p.message:String(p),_=p,g=f?await h_(f,{status:ZA(h,!!e.signal?.aborted),usage:_?.usage,sessionId:_?.sessionId},()=>TE(n),{db:n.dal?.db,dbPath:Yr(n),env:n.env}):void 0;return c!==null&&!l&&r!==null&&(await nL(n,c,{...r,message:u,response:null,status:"error",error_detail:h,usage:g}),l=!0),c===null&&r!==null&&g&&(c=await rL(n,{...r,message:u,response:null,status:"error",error_detail:h,usage:g})),Go(o,r,u,h,"error"),d={...Qc(h,c),signal:p?.signal??null,exit_code:p?.exitCode??null},{status:"error",errorKind:p instanceof Bt?"target":"provider",message:h,teamChatLogId:c,messageId:c===null?null:Hr(c)}}finally{e.signal?.removeEventListener("abort",m),i!==void 0&&clearInterval(i),a!==void 0&&clearInterval(a),c!==null&&await t8(n,r,Hr(c)),s!==null&&await Z5(n,s.row,s.leaseId)&&e.onInflightReleased?.(s.leaseId),o!==null&&await B5(n,o,d??Qc("chat turn exited without a terminal outcome",null))}}function F5(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:n=>{t({kind:"warning",message:n})}}}}async function j5(e,t,n){let r=await Ye(e,o=>(Wx(o,t,n),yu(o,t,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await Ye(e,o=>Jx(o,r,t,n));return{busy:!s,idleReclaim:s}}async function q5(e,t,n){let r=await aL(e,t,n);if(r!==null)return Yc(r);let s=await Ye(e,o=>o.getAgentInflight(t,n));return s!==null?cL(t,n,s):`${n} is busy; wait and retry`}async function H5(e,t,n){let r=await Ye(e,s=>s.getAgentInflight(t,n));return r===null?"":` ${kE(IE({holderPid:r.holder_pid,since:r.started_at}))}`}async function W5(e,t){try{return(await Ye(e,r=>r.startTrackedInvocation({kind:"chat",origin:t.origin,scope_teamfile:t.receiverTeamfile,from_identity:t.sender===null?"operator":`${t.sender.teamfile}:${t.sender.alias}`,target_teamfile:t.receiverTeamfile,target_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,cwd:t.cwd??null,command:Y5(t.receiverTeamfile,t.receiverAlias,t.prompt),holder_pid:process.pid,request_payload:t.prompt,parent_invocation_id:t.parentInvocationId,meta:JSON.stringify({provider:t.provider,model:t.model??null,sessionid:t.sessionId??null})}))).id}catch(n){return nt()&&An(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function B5(e,t,n){try{await Ye(e,r=>{r.finishTrackedInvocation(t,n)})}catch(r){nt()&&An(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:r instanceof Error?r.message:String(r)}))}}async function G5(e,t,n){try{await Ye(e,r=>{r.updateTrackedInvocationRequestPayload(t,n)})}catch(r){nt()&&An(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:r instanceof Error?r.message:String(r)}))}}async function X5(e,t,n){try{await Ye(e,r=>{r.linkTrackedInvocationMessage(t,n)})}catch(r){nt()&&An(JSON.stringify({event:"tracked_invocation_message_link_error",id:t,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function V5(e,t){if(t===null)return;let n=setInterval(()=>{Ye(e,r=>r.heartbeatTrackedInvocation(t)).catch(r=>{nt()&&An(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:r instanceof Error?r.message:String(r)}))})},sL);return n.unref?.(),n}function iL(e){return e!==void 0&&e.length>0?{config_warnings:JSON.stringify(e)}:{}}function J5(e,t,n){return{status:"done",result_summary:Of(e),error:null,team_chat_log_id:t,...iL(n)}}function RE(e,t){return{status:"busy",result_summary:Of(e),error:e,team_chat_log_id:t}}function Qc(e,t,n,r){return{status:"error",result_summary:n===void 0?ik(e,500):Of(n),error:e,team_chat_log_id:t,...iL(r)}}function Of(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function Y5(e,t,n){return`lmctl prompt ${JSON.stringify(e)} ${t} ${JSON.stringify(n)}`}function K5(e,t){let n=zx(t,e);if(n.ok)return{sender:Qx(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Kx("chat",t,e))}async function z5(e,t){if(t.explicitRoot!==void 0)return await Ye(e,r=>Vr(t.explicitRoot,r));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let n=t.sender;return await Ye(e,r=>jx(r,{sender:n,now:new Date})??t.receiverTeamfile)}async function Q5(e,t){return await Ye(e,n=>{let r=nt(),s=Eu(n,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:Cf(),...t.force===!0?{force:!0}:{},...t.reclaimReason===void 0?{}:{reclaimReason:t.reclaimReason}});return s.acquired?(r&&An(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:tL(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&An(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:"rejected",holder:tL(s.current)})),{acquired:!1,current:s.current})})}async function aL(e,t,n){return await Ye(e,r=>{for(let o=0;o<2;o+=1){let i=r.getTerminalLock(t,n);if(i===null)return null;if(pE(i).live)return i;let c=r.getAgentInflight(t,n);if(r.clearTerminalLock(t,n,i.lock_id))return c!==null&&c.sender_teamfile===t&&c.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(t,n,{sender_teamfile:c.sender_teamfile,sender_alias:c.sender_alias,started_at:c.started_at,holder_pid:c.holder_pid}),null}let s=r.getTerminalLock(t,n);return s===null?null:pE(s).live?s:null})}function tL(e){return e===null?null:{sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,holder_pid:e.holder_pid,started_at:e.started_at}}async function Z5(e,t,n){try{return await Ye(e,r=>r.releaseAgentInflight(t,n))}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2031
+ To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function zx(e,t){let n=O5(e,t);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function O5(e,t){let n=e[F_];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let o of t.listRootTeams()){let i;try{i=ra(o.teamfile_path,t)}catch{continue}for(let a of i.members)a.teamfile===void 0&&a.session===n&&r.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}function Qx(e){let t=mE(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Qbe=60*60*1e3,D5=2e3,$5=5e3;function M5(e,t,n){let r=`${t.teamfile}:${t.alias}`,s=null,o=()=>e.dal!==void 0?e.dal:(s===null&&(s=hr({path:Kr(e)})),s),i=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>o().listAgentInflight().some(a=>a.sender_teamfile===t.teamfile&&a.sender_alias===t.alias&&!(a.receiver_teamfile===t.teamfile&&a.receiver_alias===t.alias)&&a.holder_pid!==null&&Sn(a.holder_pid)),pollMs:D5,settleMs:$5,maxHoldMs:Ls(n),onHold:()=>ne({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{i(),!(!a.held&&a.reason==="cleared")&&ne({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function Zx(e){let t=e.literalPrompt?e.newMessage:P5(e.newMessage,{newMessageFrom:e.newMessageFrom??U5(e.sender)});if(t.length===0)throw new Error(`no message to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);let n=!1,r=nt(),s=0,o=0,i=0,a={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:t,permissionMode:e.permissionMode,env:e.env,onDelta:l=>{n=!0,r&&(s+=1,i=Buffer.byteLength(l,"utf8"),o+=i),e.onDelta?.(l)},onProgress:l=>e.onProgress?.(l)};e.registry&&(a.registry=e.registry),e.signal&&(a.signal=e.signal),e.receiver.model!==void 0&&(a.model=e.receiver.model),e.receiver.effort!==void 0&&(a.effort=e.receiver.effort),a.alias=e.receiver.alias,a.isLead=e.receiver.isLead,e.idleTimeoutMs!==void 0&&(a.timeoutMs=e.idleTimeoutMs),e.requireResume!==void 0&&(a.requireResume=e.requireResume),e.bundleSession!==void 0&&(a.bundleSession=e.bundleSession),a.holdOpen=M5(e.io,e.receiver,e.env),await e.onPromptBuilt?.(t);let c=await jN(a);if(e.requireResume&&c.sessionId!==e.receiver.sessionId)throw Object.assign(new Error(`provider session changed: expected ${e.receiver.sessionId}, received ${c.sessionId??"(missing)"}`),{usage:c.usage,sessionId:c.sessionId});return r&&An(JSON.stringify({event:"chat_return",alias:e.receiver.alias,provider:e.receiver.provider,streamed:n,blockCount:s,streamedBytes:o,resultTextBytes:Buffer.byteLength(c.text,"utf8"),lastChunkBytes:i,tailPreview:c.text.slice(-200)})),c.status==="stalled"?{status:"stalled",receipt:c.text,sessionId:c.sessionId,...c.usage?{usage:c.usage}:{},prompt:t,wroteDelta:n,durationMs:c.durationMs,stalledAfterMs:c.stalledAfterMs,...c.warnings!==void 0?{warnings:c.warnings}:{}}:c.status==="empty"?{status:"empty",receipt:c.text,sessionId:c.sessionId,...c.usage?{usage:c.usage}:{},prompt:t,wroteDelta:n,durationMs:c.durationMs,...c.warnings!==void 0?{warnings:c.warnings}:{}}:{status:"ok",receipt:c.text,sessionId:c.sessionId,...c.usage?{usage:c.usage}:{},prompt:t,wroteDelta:n,durationMs:c.durationMs,...c.warnings!==void 0?{warnings:c.warnings}:{}}}function P5(e,t={}){return[`--- new prompt (from ${t.newMessageFrom??"operator"}) ---`,e].join(`
2032
+ `)}function U5(e){return`${e.teamfile}:${e.alias}`}var eL=256*1024,sL=3e4;async function oL(e){let t=e.onEvent??(()=>{}),n=F5(e.io,t),r=null,s=null,o=null,i,a,c=null,l=!1,d=null,u=e.prompt,f,m=()=>{let p=e.signal?.reason;if(o===null||!["SIGINT","SIGTERM","SIGHUP"].includes(p))return;let h;try{h=n.dal??hr({path:Kr(n)}),h.finishTrackedInvocation(o,{status:"cancelled",signal:p,exit_code:p==="SIGINT"?130:p==="SIGTERM"?143:129,error:`prompt holder received ${p}`,team_chat_log_id:c}),s!==null&&h.releaseAgentInflight(s.row,s.leaseId)}catch(_){n.stderr.write(`error: failed to record holder ${p}: ${String(_)}
2033
+ `)}finally{n.dal===void 0&&h?.close()}};e.signal?.addEventListener("abort",m,{once:!0});try{let p=e.resolvedNativeTarget,h=p!==void 0;if(h&&(e.heldLease===void 0||e.conversation===void 0))throw new Bt("native session turns require a caller-held lease and conversation");let _=h?p:await Ye(n,S=>Wo(e.teamfile,e.alias,S));if(e.expectedSession!==void 0&&(_.provider!==e.expectedSession.provider||_.sessionid!==e.expectedSession.sessionid))throw new Bt(`session changed for ${_.alias}; expected ${e.expectedSession.provider}:${e.expectedSession.sessionid}, found ${_.provider}:${_.sessionid}`);if(h&&(e.conversation.provider!==_.provider||e.conversation.sessionId!==_.sessionid))throw new Bt("native session changed for "+_.alias+"; expected "+_.provider+":"+_.sessionid+", found "+e.conversation.provider+":"+e.conversation.sessionId);let g=_.teamfile,w=await Ye(n,S=>K5(S,e.env??process.env)),y=w.sender,E=h?"native:"+_.provider+":"+_.sessionid:await z5(n,{explicitRoot:e.rootFlag,sender:y,receiverTeamfile:g,operatorOrigin:w.origin==="operator"}),T=e.env??process.env;if(!h){let S=await Ye(n,x=>x.getRootTeam(E)?.name??null);S!==null&&(T.LMBEE_TEAM_NAME=S)}if(o=await W5(n,{receiverTeamfile:g,receiverAlias:_.alias,sender:y,rootTeamfile:E,provider:_.provider,model:_.model,sessionId:_.sessionid,cwd:_.sessiondir,prompt:e.prompt,origin:w.origin,parentInvocationId:_x(T.LMCTL_INVOCATION_ID)}),i=V5(n,o),e.signal?.aborted)throw m(),Error("Chat turn cancelled");o!==null&&(T.LMCTL_INVOCATION_ID=String(o));try{h||Ax(n,iE(g),g)}catch{}r={root_teamfile:E,sender_teamfile:y?.teamfile??null,sender_alias:y?.alias??null,receiver_teamfile:g,receiver_alias:_.alias,receiver_provider:_.provider,receiver_session_id:_.sessionid,origin:w.origin,message_type:e.messageType??null};let b=await aL(n,g,_.alias);if(b!==null){let S=Yc(b);return Go(o,r,e.prompt,S,"unavailable"),d=RE(S,null),{status:"busy",message:S,teamChatLogId:null}}let A=!1;if(e.heldLease!==void 0){let S=e.heldLease;if(!await Ye(n,C=>{let q=C.getAgentInflight(g,_.alias);return q===null||q.sender_teamfile!==S.row.sender_teamfile||q.sender_alias!==S.row.sender_alias||q.started_at!==S.row.started_at||q.holder_pid!==process.pid?!1:C.heartbeatAgentInflight(S.row,S.leaseId,new Date().toISOString())})){let C=`bundle lease lost for ${_.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return Go(o,r,e.prompt,C,"unavailable"),d=Qc(C,null),{status:"error",errorKind:"provider",message:C,teamChatLogId:null,messageId:null}}}else{let S=await j5(n,g,_.alias);if(S.busy){let x=await q5(n,g,_.alias);return x+=await H5(n,g,_.alias),Go(o,r,e.prompt,x,"unavailable"),d=RE(x,null),{status:"busy",message:x,teamChatLogId:null}}A=S.idleReclaim}if(y!==null&&y.teamfile!==g){let S=await Ye(n,x=>Fx(x,{root:E,sender:y,receiverTeamfile:g,receiverAlias:_.alias,now:new Date}));if(S.stop){let x=qx(S.chain);return Go(o,r,e.prompt,x,"cycle"),d=Qc(x,null),{status:"error",errorKind:"cycle",message:x,teamChatLogId:null,messageId:null}}}if(e.heldLease===void 0){let S=await Q5(n,{receiver_teamfile:g,receiver_alias:_.alias,sender_teamfile:y?.teamfile??g,sender_alias:y?.alias??"operator",...A?{force:!0,reclaimReason:"session-idle"}:{}});if(!S.acquired){let x=cL(g,_.alias,S.current);return x+=` ${kE(IE({holderPid:S.current.holder_pid,since:S.current.started_at}))}`,Go(o,r,e.prompt,x,"unavailable"),d=RE(x,null),{status:"busy",message:x,teamChatLogId:null}}s={row:S.lease,leaseId:S.leaseId},e.onInflightAcquired?.(s),a=gu(x=>Ye(n,C=>C.heartbeatAgentInflight(s.row,s.leaseId,x)),{intervalMs:sL,onError:x=>{nt()&&An(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:x instanceof Error?x.message:String(x)}))}})}if(e.signal?.aborted)throw Error("Chat turn cancelled");f=QA({provider:_.provider,modelRequested:_.model??null,cwd:_.sessiondir,sessionId:_.sessionid}),r&&(r.started_at=f.startedAt);let I=await Zx({sender:y??{teamfile:g,alias:"operator"},receiver:{teamfile:g,alias:_.alias,provider:_.provider,sessionId:_.sessionid,cwd:_.sessiondir,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.isLead!==void 0?{isLead:_.isLead}:{}},signal:e.signal,newMessage:e.prompt,newMessageFrom:y===null?"operator":`${y.teamfile}:${y.alias}`,...h?{literalPrompt:!0}:{},io:n,permissionMode:e.permissionMode,...e.expectedSession!==void 0?{requireResume:!0}:{},...e.bundleSession!==void 0?{bundleSession:e.bundleSession}:{},...e.conversation!==void 0?{bundleSession:e.conversation}:{},...e.registry!==void 0?{registry:e.registry}:{},env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:S=>t({kind:"delta",chunk:S}),onProgress:S=>t({kind:"progress",alias:_.alias,event:S}),onPromptBuilt:async S=>{u=S,c===null&&(c=await e8(n,{...r,message:S,usage:f}),c!==null&&(e.onAccepted?.(Wr(c)),o!==null&&await X5(n,o,c))),o!==null&&await G5(n,o,S)}});u=I.prompt;let R=I.status==="stalled",L=I.status==="empty",N=null,k=R?`provider stalled${I.stalledAfterMs!==void 0?` after ${I.stalledAfterMs}ms`:""}`:L?"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":I.status==="error"?I.error??I.receipt:null,D=R||L||I.status==="error"?"error":"ok",O=await h_(f,{status:I.status,sessionId:I.sessionId,usage:I.usage},()=>TE(n),{db:n.dal?.db,dbPath:Kr(n),env:n.env});c!==null?(await nL(n,c,{...r,message:u,response:I.receipt,status:D,error_detail:k,usage:O}),l=!0,N=c):N=await rL(n,{...r,message:u,response:I.receipt,status:D,error_detail:k,usage:O});let v=I.status!=="error"?I.warnings:void 0;if(R||L){let S=k;Go(o,r,u,S,"error"),d=Qc(S,N,I.receipt,v)}else d=J5(I.receipt,N,v);return{status:R?"stalled":L?"empty":"ok",replyText:I.receipt,wroteDelta:I.wroteDelta,teamChatLogId:N,messageId:N===null?null:Wr(N),durationMs:I.durationMs}}catch(p){let h=p instanceof Error?p.message:String(p),_=p,g=f?await h_(f,{status:ZA(h,!!e.signal?.aborted),usage:_?.usage,sessionId:_?.sessionId},()=>TE(n),{db:n.dal?.db,dbPath:Kr(n),env:n.env}):void 0;return c!==null&&!l&&r!==null&&(await nL(n,c,{...r,message:u,response:null,status:"error",error_detail:h,usage:g}),l=!0),c===null&&r!==null&&g&&(c=await rL(n,{...r,message:u,response:null,status:"error",error_detail:h,usage:g})),Go(o,r,u,h,"error"),d={...Qc(h,c),signal:p?.signal??null,exit_code:p?.exitCode??null},{status:"error",errorKind:p instanceof Bt?"target":"provider",message:h,teamChatLogId:c,messageId:c===null?null:Wr(c)}}finally{e.signal?.removeEventListener("abort",m),i!==void 0&&clearInterval(i),a!==void 0&&clearInterval(a),c!==null&&await t8(n,r,Wr(c)),s!==null&&await Z5(n,s.row,s.leaseId)&&e.onInflightReleased?.(s.leaseId),o!==null&&await B5(n,o,d??Qc("chat turn exited without a terminal outcome",null))}}function F5(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:n=>{t({kind:"warning",message:n})}}}}async function j5(e,t,n){let r=await Ye(e,o=>(Wx(o,t,n),yu(o,t,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await Ye(e,o=>Jx(o,r,t,n));return{busy:!s,idleReclaim:s}}async function q5(e,t,n){let r=await aL(e,t,n);if(r!==null)return Yc(r);let s=await Ye(e,o=>o.getAgentInflight(t,n));return s!==null?cL(t,n,s):`${n} is busy; wait and retry`}async function H5(e,t,n){let r=await Ye(e,s=>s.getAgentInflight(t,n));return r===null?"":` ${kE(IE({holderPid:r.holder_pid,since:r.started_at}))}`}async function W5(e,t){try{return(await Ye(e,r=>r.startTrackedInvocation({kind:"chat",origin:t.origin,scope_teamfile:t.receiverTeamfile,from_identity:t.sender===null?"operator":`${t.sender.teamfile}:${t.sender.alias}`,target_teamfile:t.receiverTeamfile,target_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,cwd:t.cwd??null,command:Y5(t.receiverTeamfile,t.receiverAlias,t.prompt),holder_pid:process.pid,request_payload:t.prompt,parent_invocation_id:t.parentInvocationId,meta:JSON.stringify({provider:t.provider,model:t.model??null,sessionid:t.sessionId??null})}))).id}catch(n){return nt()&&An(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function B5(e,t,n){try{await Ye(e,r=>{r.finishTrackedInvocation(t,n)})}catch(r){nt()&&An(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:r instanceof Error?r.message:String(r)}))}}async function G5(e,t,n){try{await Ye(e,r=>{r.updateTrackedInvocationRequestPayload(t,n)})}catch(r){nt()&&An(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:r instanceof Error?r.message:String(r)}))}}async function X5(e,t,n){try{await Ye(e,r=>{r.linkTrackedInvocationMessage(t,n)})}catch(r){nt()&&An(JSON.stringify({event:"tracked_invocation_message_link_error",id:t,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function V5(e,t){if(t===null)return;let n=setInterval(()=>{Ye(e,r=>r.heartbeatTrackedInvocation(t)).catch(r=>{nt()&&An(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:r instanceof Error?r.message:String(r)}))})},sL);return n.unref?.(),n}function iL(e){return e!==void 0&&e.length>0?{config_warnings:JSON.stringify(e)}:{}}function J5(e,t,n){return{status:"done",result_summary:Of(e),error:null,team_chat_log_id:t,...iL(n)}}function RE(e,t){return{status:"busy",result_summary:Of(e),error:e,team_chat_log_id:t}}function Qc(e,t,n,r){return{status:"error",result_summary:n===void 0?ik(e,500):Of(n),error:e,team_chat_log_id:t,...iL(r)}}function Of(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function Y5(e,t,n){return`lmctl prompt ${JSON.stringify(e)} ${t} ${JSON.stringify(n)}`}function K5(e,t){let n=zx(t,e);if(n.ok)return{sender:Qx(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Kx("chat",t,e))}async function z5(e,t){if(t.explicitRoot!==void 0)return await Ye(e,r=>Jr(t.explicitRoot,r));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let n=t.sender;return await Ye(e,r=>jx(r,{sender:n,now:new Date})??t.receiverTeamfile)}async function Q5(e,t){return await Ye(e,n=>{let r=nt(),s=Eu(n,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:Cf(),...t.force===!0?{force:!0}:{},...t.reclaimReason===void 0?{}:{reclaimReason:t.reclaimReason}});return s.acquired?(r&&An(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:tL(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&An(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:"rejected",holder:tL(s.current)})),{acquired:!1,current:s.current})})}async function aL(e,t,n){return await Ye(e,r=>{for(let o=0;o<2;o+=1){let i=r.getTerminalLock(t,n);if(i===null)return null;if(pE(i).live)return i;let c=r.getAgentInflight(t,n);if(r.clearTerminalLock(t,n,i.lock_id))return c!==null&&c.sender_teamfile===t&&c.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(t,n,{sender_teamfile:c.sender_teamfile,sender_alias:c.sender_alias,started_at:c.started_at,holder_pid:c.holder_pid}),null}let s=r.getTerminalLock(t,n);return s===null?null:pE(s).live?s:null})}function tL(e){return e===null?null:{sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,holder_pid:e.holder_pid,started_at:e.started_at}}async function Z5(e,t,n){try{return await Ye(e,r=>r.releaseAgentInflight(t,n))}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2034
2034
  `)}return!1}function cL(e,t,n){return`${t} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${e}" ${t}`}async function e8(e,t){let n=Zc(t.message);try{return await Ye(e,r=>r.beginTeamChatLog({usage:t.usage,root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,receiver_provider:t.receiver_provider,receiver_session_id:t.receiver_session_id,provider_prompt:t.message,message:n.text,response:null,origin:t.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,message_type:t.message_type??null,created_at:t.started_at??new Date().toISOString()}))}catch(r){return e.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
2035
2035
  `),null}}async function nL(e,t,n){let r=Zc(n.message),s=n.response===null?null:Zc(n.response);try{await Ye(e,o=>o.finishTeamChatLog(t,{usage:n.usage,root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,receiver_provider:n.receiver_provider,receiver_session_id:n.receiver_session_id,provider_prompt:n.message,message:r.text,response:s?.text??null,origin:n.origin,status:n.status,error_detail:n.error_detail,truncated:r.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(o){e.stderr.write(`warning: failed to finish chat log ${t}: ${o instanceof Error?o.message:String(o)}
2036
2036
  `)}}async function t8(e,t,n){if(t!==null)try{await Ye(e,r=>{r.clearCurrentlyHandlingMessage(t.receiver_teamfile,t.receiver_alias,n)})}catch(r){e.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
2037
2037
  `)}}async function rL(e,t){let n=Zc(t.message),r=t.response===null?null:Zc(t.response);try{return await Ye(e,s=>s.insertTeamChatLog({usage:t.usage,root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,receiver_provider:t.receiver_provider,receiver_session_id:t.receiver_session_id,provider_prompt:t.message,message:n.text,response:r?.text??null,origin:t.origin,status:t.status,error_detail:t.error_detail,truncated:n.truncated||r?.truncated?1:0,message_type:t.message_type??null,created_at:t.started_at??new Date().toISOString()}))}catch(s){return e.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2038
- `),null}}function Go(e,t,n,r,s){e!==null||t===null||ne({event:"chat_attempt_error",reason:s,root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,origin:t.origin,error_detail:r,message_preview:Of(n)})}function Zc(e){return e.length<=eL?{text:e,truncated:!1}:{text:e.slice(0,eL),truncated:!0}}var dL=new WeakMap;function uL(e,t){let n=t&&typeof t=="object"?dL.get(t):void 0;return n?.ctx===e?n:void 0}function xE(e,t,n,r){let s=new Set(t.listRootTeams().map(a=>a.teamfile_path));for(let a of new Set([e.cwd,r]))try{for(let c of n8(a,{withFileTypes:!0}))c.isFile()&&/\.(?:lmctl|lmc)$/i.test(c.name)&&s.add(lL(a,c.name))}catch(c){if(c.code!=="ENOENT")throw c}let o=new Map;for(let a of s){let c;try{c=ra(a,t)}catch(l){if(/missing on disk|teamfile not found/.test(dn(l)))continue;throw l}if(c.parseErrors.length)throw Error("Cannot resolve native ownership: "+c.parseErrors.join("; "));for(let l of c.members){if(l.teamfile===void 0&&(l.provider!==n.provider||l.session!==n.sessionid))continue;let d=Wo(a,l.alias,t);d.provider===n.provider&&d.sessionid===n.sessionid&&o.set(JSON.stringify([Vr(d.teamfile,t),d.alias]),d)}}if(o.size>1)throw Error("Native session owner is ambiguous");let i=o.values().next().value;return i?{member:{...i,...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{}},known:!0}:{member:{teamfile:"native:"+n.provider+":"+n.sessionid,alias:n.sessionid,provider:n.provider,sessionid:n.sessionid,sessiondir:r,isLead:!1,...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{}},known:!1}}function NE(e,t){return e.alias+" is servicing "+t.sender_alias+" ("+t.sender_teamfile+") since "+t.started_at+" \u2014 wait and retry"}function fL(e,t=!1){if(e.released)return;let n=t?e.dal.db.pragma("busy_timeout",{simple:!0}):void 0;t&&e.dal.db.pragma("busy_timeout=0");try{if(!e.dal.releaseAgentInflight(e.lease.row,e.lease.leaseId))throw Error("Native session lease release refused: ownership changed");e.released=!0}finally{t&&e.dal.db.pragma("busy_timeout="+n)}}async function Df(e){return e.closing||(e.closed=!0,e.serviceHosted||e.controller.abort(),e.closing=(async()=>{if(e.serviceHosted&&e.opening)try{e.conversation??=await e.opening}catch{}e.serviceHosted&&await e.active,await e.conversation?.close(),await e.active,e.stopHeartbeat(),fL(e,!0),e.untrack()})()),e.closing}function o8(e){if(e.serviceHosted)return e.controller.abort(),Df(e);e.closed=!0,e.stopHeartbeat(),e.controller.abort(),e.conversation&&e.conversation.close().catch(()=>{}),fL(e,!0),e.untrack()}async function mL(e,t,n={},r,s=!1){let o;try{let i=nE(e);if(i)return i;if(!t||typeof t!="object"||Array.isArray(t))return Be("invalid_argument","Native session member must be a map");for(let R of["provider","sessionid"])if(typeof t[R]!="string"||!t[R].trim())return Be("invalid_argument","Native session requires provider and sessionid");for(let R of["sessiondir","model","effort"])if(t[R]!==void 0&&(typeof t[R]!="string"||!t[R].trim()))return Be("invalid_argument","Native session "+R+" must be a nonempty string");if(!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).some(R=>!["permissionMode","idleTimeoutMs"].includes(R)))return Be("invalid_argument","Native session options must contain permissionMode or idleTimeoutMs");if(n.permissionMode!==void 0&&!["yolo","plan"].includes(n.permissionMode))return Be("invalid_argument","permissionMode must be yolo or plan");if(n.idleTimeoutMs!==void 0&&(!Number.isFinite(n.idleTimeoutMs)||n.idleTimeoutMs<0))return Be("invalid_argument","idleTimeoutMs must be finite and nonnegative");let a=Au(e),c=r8(e.cwd,t.sessiondir??e.cwd),l;try{l=xE(e,a,t,c)}catch(R){return Be("invalid_argument",dn(R))}let d=Jc(e);if(!await d.getSession(t.sessionid,t.provider))return Be("not_found","Native session was not found");if(e.closed)return Be("cancelled","Context is closed");let f=l.member,m=yu(a,f.teamfile,f.alias);if(m.busy)return{status:"busy",error:m.reason==="in-flight"?NE(f,m.inFlight):m.source==="terminal-lock"?Yc(m.terminalLock):f.alias+" is busy (interactive terminal); wait and retry"};let p={receiver_teamfile:f.teamfile,receiver_alias:f.alias,sender_teamfile:f.teamfile,sender_alias:"operator",started_at:new Date().toISOString()},h=a.getAgentInflight(f.teamfile,f.alias),_=h!==null&&(h.native_provider!==null&&h.native_provider!==void 0||h.native_session_id!==null&&h.native_session_id!==void 0);if(_&&!r)return{status:"busy",error:NE(f,h)};let g=r&&_?a.tryAcquireNativeHolder(p,r):void 0,w=g?g.acquired?{acquired:!0,lease:g.current,leaseId:g.lease_id}:{acquired:!1,current:g.current}:Eu(a,{...p,ttlMs:Ls(e.env),...r?{nativeHolder:r}:{}});if(!w.acquired)return{status:"busy",error:NE(f,w.current)};let y=Object.freeze({id:"native-session-"+s8()});o={ctx:e,dal:a,ref:y,member:f,ownerKnown:l.known,options:{...n},lease:{row:w.lease,leaseId:w.leaseId},controller:new AbortController,serviceHosted:s,closed:!1,released:!1,stopHeartbeat(){},untrack(){}};let E=o;E.untrack=JI(e,{close:()=>Df(E),finalizeSync:()=>o8(E)});let T=gu(R=>a.heartbeatAgentInflight(E.lease.row,E.lease.leaseId,R),{intervalMs:EI(e.env)});E.stopHeartbeat=()=>clearInterval(T);let b=qN({provider:t.provider,sessionId:t.sessionid,cwd:f.sessiondir,env:{...e.env},model:f.model,effort:f.effort,permissionMode:n.permissionMode??"yolo",timeoutMs:s?0:n.idleTimeoutMs??0,serviceHosted:s,execution:s?"persistent":"auto",requireResume:!0,registry:d,userConfig:Nu(e.env.HOME?lL(e.env.HOME,".lmctl/config.toml"):void 0)});E.opening=b,b.then(R=>{E.closed&&R.close().catch(()=>{})}).catch(()=>{});let A,I=new Promise((R,L)=>{A=()=>L(Error("Context is closed")),e.signal.addEventListener("abort",A,{once:!0}),e.signal.aborted&&A()});try{E.conversation=await Promise.race([b,I])}finally{e.signal.removeEventListener("abort",A)}if(e.closed||E.closed)throw Error("Context is closed");return dL.set(y,E),A_({session:y})}catch(i){if(o)try{await Df(o)}catch(a){return Be("provider",dn(i)+"; "+dn(a))}return Be(e?.closed?"cancelled":"provider",dn(i))}}async function pL(e,t,n,r=void 0){let s=(c,l="invalid_argument")=>({status:"error",reply:"",error:c,code:l,messageId:null,teamChatLogId:null}),o=nE(e);if(o)return s(o.error,o.code);let i=uL(e,t);if(!i||i.closed||!i.conversation)return s("Invalid or closed native session reference");if(typeof n!="string")return s("Native session prompt must be a string");if(i.active)return{status:"busy",reply:"",error:"Batch already has an active turn",messageId:null,teamChatLogId:null};let a;i.active=new Promise(c=>{a=c});try{if(i.ownerKnown){let l=Wo(i.member.teamfile,i.member.alias,i.dal);if(l.provider!==i.member.provider||l.sessionid!==i.member.sessionid)throw Error("Session binding changed; native turn cancelled")}let c=await oL({signal:AbortSignal.any([e.signal,i.controller.signal]),teamfile:i.member.teamfile,alias:i.member.alias,resolvedNativeTarget:i.member,prompt:n,expectedSession:{provider:i.member.provider,sessionid:i.member.sessionid},permissionMode:i.options.permissionMode??"yolo",idleTimeoutMs:i.serviceHosted?0:i.options.idleTimeoutMs,heldLease:i.lease,conversation:i.conversation,registry:Jc(e),onAccepted:r?.onAccepted,env:{...e.env,...r?.attribution},io:{...JN(e),dal:i.dal}});return{status:c.status,reply:"replyText"in c?c.replyText:"",error:c.status==="ok"?null:"message"in c?c.message:"provider "+c.status,messageId:"messageId"in c?c.messageId:null,teamChatLogId:c.teamChatLogId}}catch(c){return s(dn(c),"provider")}finally{a(),i.active=void 0}}async function LE(e,t){try{let n=uL(e,t);return n?(await Df(n),A_({})):Be("invalid_argument","Invalid native session reference")}catch(n){return Be("provider",dn(n))}}var c8={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)};function l8(e){if(!e||!["turn","close"].includes(e.operation))throw Error("Expected a native turn or close operation");let{member:t,options:n={}}=e;if(!t||typeof t!="object"||Array.isArray(t)||Object.keys(t).some(r=>!["provider","sessionid","sessiondir","model","effort"].includes(r)))throw Error("Native session member must be a map");for(let r of["provider","sessionid"])if(typeof t[r]!="string"||!t[r].trim())throw Error("Native session requires provider and sessionid");for(let r of["sessiondir","model","effort"])if(t[r]!==void 0&&(typeof t[r]!="string"||!t[r].trim()))throw Error("Invalid native session "+r);if(!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).some(r=>!["permissionMode","idleTimeoutMs"].includes(r)))throw Error("Unknown native session option");if(n.permissionMode!==void 0&&!["yolo","plan"].includes(n.permissionMode))throw Error("permissionMode must be yolo or plan");if(n.idleTimeoutMs!==void 0&&(!Number.isFinite(n.idleTimeoutMs)||n.idleTimeoutMs<0||n.idleTimeoutMs>2147483647))throw Error("idleTimeoutMs must be a nonnegative retention interval");if(e.operation==="turn"&&typeof e.prompt!="string")throw Error("Native session prompt must be a string");if(e.attribution!==void 0&&(!e.attribution||typeof e.attribution!="object"||Array.isArray(e.attribution)||Object.entries(e.attribution).some(([r,s])=>!["LMCTL_SELF_SESSIONID","LMCTL_INVOCATION_ID"].includes(r)||s!==void 0&&typeof s!="string")))throw Error("Invalid native request attribution")}var $f=class{entries=new Map;service_epoch=i8();nextEpoch=0;stopping=!1;drained;clock;idleMs;context;ownsContext;constructor(t){this.context=t.context,this.clock=t.clock??c8,this.idleMs=t.idleMs??3e5,this.ownsContext=t.ownsContext??!1}fields(t,n=null){return{outcome:"not_sent",service_epoch:this.service_epoch,connection_epoch:t?.epoch??null,connection_state:n}}async request(t){let n=(o,i,a="error",c)=>({...this.fields(c),status:a,code:o,reply:"",error:i,messageId:null,teamChatLogId:null});try{l8(t)}catch(o){return n("invalid_argument",String(o))}if(this.stopping)return n("closed","Native conversation service is shutting down");let r=JSON.stringify([t.member.provider,t.member.sessionid]),s=this.entries.get(r);if(s?.active||s?.closing)return n("busy","Native conversation has active or closing work","busy",s);if(t.operation==="close"){if(!s)return{...n("",""),status:"ok",code:void 0,error:null,outcome:"completed"};let o=this.fields(s);try{await this.closeEntry(r,s)}catch(i){return n("provider",String(i),"error",s)}return{...o,status:"ok",reply:"",error:null,messageId:null,teamChatLogId:null,outcome:"completed"}}try{let o=Jc(this.context).getAdapter(t.member.provider),i=Nu(this.context.env.HOME?a8(this.context.env.HOME,".lmctl/config.toml"):void 0);if(!o||!zI(o,i))return n("provider","Provider is not qualified for service-hosted native resume");if(s){let c=t.member,l=t.options??{};if(c.sessiondir!==void 0&&hL(this.context.cwd,c.sessiondir)!==s.member.sessiondir||["model","effort"].some(d=>c[d]!==void 0&&c[d]!==s.member[d])||l.permissionMode!==void 0&&l.permissionMode!==s.options.permissionMode||l.idleTimeoutMs!==void 0&&l.idleTimeoutMs!==s.options.idleTimeoutMs)return n("invalid_argument","Native conversation configuration conflicts with retained connection","error",s)}let a=s?s.session?"reused":"reinitialized":"new";if(!s){let c=xE(this.context,Au(this.context),t.member,hL(this.context.cwd,t.member.sessiondir??this.context.cwd));s={member:{...t.member,sessiondir:c.member.sessiondir,model:c.member.model,effort:c.member.effort},options:{permissionMode:t.options?.permissionMode??"yolo",idleTimeoutMs:t.options?.idleTimeoutMs??this.idleMs},epoch:0,active:!1,phase:"opening"},this.entries.set(r,s)}return s.active=!0,this.cancelIdle(s),s.work=this.perform(r,s,t,a),s.work}catch(o){return n("invalid_argument",String(o),"error",s)}}async perform(t,n,r,s){try{if(!n.session){n.phase="opening",n.epoch=++this.nextEpoch;let i=n.member,a=await mL(this.context,i,n.options,{provider:i.provider,sessionId:i.sessionid,endpoint:null,phase:"starting",processIdentity:null,configJson:null},!0);if(a.status!=="ok")return this.entries.get(t)===n&&this.entries.delete(t),{...this.fields(n,s),status:a.status,code:"code"in a?a.code:"busy",reply:"",error:a.error,messageId:null,teamChatLogId:null};n.session=a.session}n.phase="active";let o=await pL(this.context,n.session,r.prompt,{attribution:{LMCTL_SELF_SESSIONID:r.attribution?.LMCTL_SELF_SESSIONID,LMCTL_INVOCATION_ID:r.attribution?.LMCTL_INVOCATION_ID}});if(o.status==="error"){let i=await LE(this.context,n.session);return i.status!=="ok"?(n.phase="closing",n.closing=Promise.reject(Error(i.error)),n.closing.catch(()=>{}),{...o,...this.fields(n,s),code:o.messageId?"outcome_unknown":o.code??"provider",outcome:o.messageId?"unknown":"not_sent",error:(o.error??"Provider turn failed")+"; cleanup: "+i.error}):(n.session=void 0,n.phase="disconnected",{...o,...this.fields(n,s),code:o.messageId?"outcome_unknown":o.code??"provider",outcome:o.messageId?"unknown":"not_sent"})}return{...o,...this.fields(n,s),outcome:"completed",...o.status!=="ok"?{code:o.status==="busy"?"busy":o.code??"provider"}:{},...o.status==="busy"?{outcome:"not_sent"}:{}}}catch(o){return{...this.fields(n,s),status:"error",code:"provider",reply:"",error:String(o),messageId:null,teamChatLogId:null}}finally{n.active=!1,n.closing||(n.phase=n.session?"ready":"disconnected",this.stopping||this.armIdle(t,n))}}cancelIdle(t){t.idle!==void 0&&(this.clock.clearTimeout(t.idle),t.idle=void 0)}armIdle(t,n){if(this.cancelIdle(n),this.entries.get(t)!==n||n.active||n.closing)return;let r=n.options.idleTimeoutMs??this.idleMs;r>0&&(n.idle=this.clock.setTimeout(()=>{this.closeEntry(t,n).catch(s=>this.context.onWarning("Native conversation idle close failed: "+String(s)))},r))}closeEntry(t,n){return n.closing||(this.cancelIdle(n),n.phase="closing",n.closing=(async()=>{if(n.active&&await n.work,n.session){let r=await LE(this.context,n.session);if(r.status!=="ok")throw Error(r.error)}this.entries.get(t)===n&&this.entries.delete(t)})()),n.closing}shutdown(){return this.drained?this.drained:(this.stopping=!0,this.drained=Promise.allSettled([...this.entries].map(([t,n])=>this.closeEntry(t,n))).then(async t=>{let n=t.flatMap(r=>r.status==="rejected"?[r.reason]:[]);if(n.length)throw new AggregateError(n,"Native cleanup failed: "+n.map(String).join("; "));if(this.ownsContext){let r=await this.context.close();if(r.errors.length)throw Error(r.errors.join("; "))}}),this.drained)}cancel(){this.stopping=!0;for(let t of this.entries.values())this.cancelIdle(t);this.context.finalizeSync("SIGTERM")}};import{randomUUID as g8}from"node:crypto";import{spawn as f8}from"node:child_process";var Mf={name:"@lmctl-ai/mcp-client",version:"0.1.0",private:!0,type:"module",description:"Stateless HTTP MCP client",bin:{mcp:"./bin/mcp"},files:["bin","src","mcp.cli.schema.v1.json","README.md"],scripts:{build:"node --check src/cli.mjs",test:"node --test --test-concurrency=2 tests/*.test.mjs"},engines:{node:">=24.15.0"},dependencies:{"smol-toml":"1.9.0"},exports:{".":{types:"./src/index.d.mts",import:"./src/index.mjs"},"./mcp.cli.schema.v1.json":"./mcp.cli.schema.v1.json"}};function _L(e,t,n){let r=new TextDecoder("utf-8",{fatal:!0}),s=[],o=!1,i=l=>{o||(o=!0,n(l))},a=l=>{if(!o)try{let d=r.decode(l,{stream:!0}),u=0,f;for(;(f=d.indexOf(`
2038
+ `),null}}function Go(e,t,n,r,s){e!==null||t===null||ne({event:"chat_attempt_error",reason:s,root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,origin:t.origin,error_detail:r,message_preview:Of(n)})}function Zc(e){return e.length<=eL?{text:e,truncated:!1}:{text:e.slice(0,eL),truncated:!0}}var dL=new WeakMap;function uL(e,t){let n=t&&typeof t=="object"?dL.get(t):void 0;return n?.ctx===e?n:void 0}function xE(e,t,n,r){let s=new Set(t.listRootTeams().map(a=>a.teamfile_path));for(let a of new Set([e.cwd,r]))try{for(let c of n8(a,{withFileTypes:!0}))c.isFile()&&/\.(?:lmctl|lmc)$/i.test(c.name)&&s.add(lL(a,c.name))}catch(c){if(c.code!=="ENOENT")throw c}let o=new Map;for(let a of s){let c;try{c=ra(a,t)}catch(l){if(/missing on disk|teamfile not found/.test(dn(l)))continue;throw l}if(c.parseErrors.length)throw Error("Cannot resolve native ownership: "+c.parseErrors.join("; "));for(let l of c.members){if(l.teamfile===void 0&&(l.provider!==n.provider||l.session!==n.sessionid))continue;let d=Wo(a,l.alias,t);d.provider===n.provider&&d.sessionid===n.sessionid&&o.set(JSON.stringify([Jr(d.teamfile,t),d.alias]),d)}}if(o.size>1)throw Error("Native session owner is ambiguous");let i=o.values().next().value;return i?{member:{...i,...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{}},known:!0}:{member:{teamfile:"native:"+n.provider+":"+n.sessionid,alias:n.sessionid,provider:n.provider,sessionid:n.sessionid,sessiondir:r,isLead:!1,...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{}},known:!1}}function NE(e,t){return e.alias+" is servicing "+t.sender_alias+" ("+t.sender_teamfile+") since "+t.started_at+" \u2014 wait and retry"}function fL(e,t=!1){if(e.released)return;let n=t?e.dal.db.pragma("busy_timeout",{simple:!0}):void 0;t&&e.dal.db.pragma("busy_timeout=0");try{if(!e.dal.releaseAgentInflight(e.lease.row,e.lease.leaseId))throw Error("Native session lease release refused: ownership changed");e.released=!0}finally{t&&e.dal.db.pragma("busy_timeout="+n)}}async function Df(e){return e.closing||(e.closed=!0,e.serviceHosted||e.controller.abort(),e.closing=(async()=>{if(e.serviceHosted&&e.opening)try{e.conversation??=await e.opening}catch{}e.serviceHosted&&await e.active,await e.conversation?.close(),await e.active,e.stopHeartbeat(),fL(e,!0),e.untrack()})()),e.closing}function o8(e){if(e.serviceHosted)return e.controller.abort(),Df(e);e.closed=!0,e.stopHeartbeat(),e.controller.abort(),e.conversation&&e.conversation.close().catch(()=>{}),fL(e,!0),e.untrack()}async function mL(e,t,n={},r,s=!1){let o;try{let i=nE(e);if(i)return i;if(!t||typeof t!="object"||Array.isArray(t))return Be("invalid_argument","Native session member must be a map");for(let R of["provider","sessionid"])if(typeof t[R]!="string"||!t[R].trim())return Be("invalid_argument","Native session requires provider and sessionid");for(let R of["sessiondir","model","effort"])if(t[R]!==void 0&&(typeof t[R]!="string"||!t[R].trim()))return Be("invalid_argument","Native session "+R+" must be a nonempty string");if(!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).some(R=>!["permissionMode","idleTimeoutMs"].includes(R)))return Be("invalid_argument","Native session options must contain permissionMode or idleTimeoutMs");if(n.permissionMode!==void 0&&!["yolo","plan"].includes(n.permissionMode))return Be("invalid_argument","permissionMode must be yolo or plan");if(n.idleTimeoutMs!==void 0&&(!Number.isFinite(n.idleTimeoutMs)||n.idleTimeoutMs<0))return Be("invalid_argument","idleTimeoutMs must be finite and nonnegative");let a=Au(e),c=r8(e.cwd,t.sessiondir??e.cwd),l;try{l=xE(e,a,t,c)}catch(R){return Be("invalid_argument",dn(R))}let d=Jc(e);if(!await d.getSession(t.sessionid,t.provider))return Be("not_found","Native session was not found");if(e.closed)return Be("cancelled","Context is closed");let f=l.member,m=yu(a,f.teamfile,f.alias);if(m.busy)return{status:"busy",error:m.reason==="in-flight"?NE(f,m.inFlight):m.source==="terminal-lock"?Yc(m.terminalLock):f.alias+" is busy (interactive terminal); wait and retry"};let p={receiver_teamfile:f.teamfile,receiver_alias:f.alias,sender_teamfile:f.teamfile,sender_alias:"operator",started_at:new Date().toISOString()},h=a.getAgentInflight(f.teamfile,f.alias),_=h!==null&&(h.native_provider!==null&&h.native_provider!==void 0||h.native_session_id!==null&&h.native_session_id!==void 0);if(_&&!r)return{status:"busy",error:NE(f,h)};let g=r&&_?a.tryAcquireNativeHolder(p,r):void 0,w=g?g.acquired?{acquired:!0,lease:g.current,leaseId:g.lease_id}:{acquired:!1,current:g.current}:Eu(a,{...p,ttlMs:Ls(e.env),...r?{nativeHolder:r}:{}});if(!w.acquired)return{status:"busy",error:NE(f,w.current)};let y=Object.freeze({id:"native-session-"+s8()});o={ctx:e,dal:a,ref:y,member:f,ownerKnown:l.known,options:{...n},lease:{row:w.lease,leaseId:w.leaseId},controller:new AbortController,serviceHosted:s,closed:!1,released:!1,stopHeartbeat(){},untrack(){}};let E=o;E.untrack=JI(e,{close:()=>Df(E),finalizeSync:()=>o8(E)});let T=gu(R=>a.heartbeatAgentInflight(E.lease.row,E.lease.leaseId,R),{intervalMs:EI(e.env)});E.stopHeartbeat=()=>clearInterval(T);let b=qN({provider:t.provider,sessionId:t.sessionid,cwd:f.sessiondir,env:{...e.env},model:f.model,effort:f.effort,permissionMode:n.permissionMode??"yolo",timeoutMs:s?0:n.idleTimeoutMs??0,serviceHosted:s,execution:s?"persistent":"auto",requireResume:!0,registry:d,userConfig:Nu(e.env.HOME?lL(e.env.HOME,".lmctl/config.toml"):void 0)});E.opening=b,b.then(R=>{E.closed&&R.close().catch(()=>{})}).catch(()=>{});let A,I=new Promise((R,L)=>{A=()=>L(Error("Context is closed")),e.signal.addEventListener("abort",A,{once:!0}),e.signal.aborted&&A()});try{E.conversation=await Promise.race([b,I])}finally{e.signal.removeEventListener("abort",A)}if(e.closed||E.closed)throw Error("Context is closed");return dL.set(y,E),A_({session:y})}catch(i){if(o)try{await Df(o)}catch(a){return Be("provider",dn(i)+"; "+dn(a))}return Be(e?.closed?"cancelled":"provider",dn(i))}}async function pL(e,t,n,r=void 0){let s=(c,l="invalid_argument")=>({status:"error",reply:"",error:c,code:l,messageId:null,teamChatLogId:null}),o=nE(e);if(o)return s(o.error,o.code);let i=uL(e,t);if(!i||i.closed||!i.conversation)return s("Invalid or closed native session reference");if(typeof n!="string")return s("Native session prompt must be a string");if(i.active)return{status:"busy",reply:"",error:"Batch already has an active turn",messageId:null,teamChatLogId:null};let a;i.active=new Promise(c=>{a=c});try{if(i.ownerKnown){let l=Wo(i.member.teamfile,i.member.alias,i.dal);if(l.provider!==i.member.provider||l.sessionid!==i.member.sessionid)throw Error("Session binding changed; native turn cancelled")}let c=await oL({signal:AbortSignal.any([e.signal,i.controller.signal]),teamfile:i.member.teamfile,alias:i.member.alias,resolvedNativeTarget:i.member,prompt:n,expectedSession:{provider:i.member.provider,sessionid:i.member.sessionid},permissionMode:i.options.permissionMode??"yolo",idleTimeoutMs:i.serviceHosted?0:i.options.idleTimeoutMs,heldLease:i.lease,conversation:i.conversation,registry:Jc(e),onAccepted:r?.onAccepted,env:{...e.env,...r?.attribution},io:{...JN(e),dal:i.dal}});return{status:c.status,reply:"replyText"in c?c.replyText:"",error:c.status==="ok"?null:"message"in c?c.message:"provider "+c.status,messageId:"messageId"in c?c.messageId:null,teamChatLogId:c.teamChatLogId}}catch(c){return s(dn(c),"provider")}finally{a(),i.active=void 0}}async function LE(e,t){try{let n=uL(e,t);return n?(await Df(n),A_({})):Be("invalid_argument","Invalid native session reference")}catch(n){return Be("provider",dn(n))}}var c8={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)};function l8(e){if(!e||!["turn","close"].includes(e.operation))throw Error("Expected a native turn or close operation");let{member:t,options:n={}}=e;if(!t||typeof t!="object"||Array.isArray(t)||Object.keys(t).some(r=>!["provider","sessionid","sessiondir","model","effort"].includes(r)))throw Error("Native session member must be a map");for(let r of["provider","sessionid"])if(typeof t[r]!="string"||!t[r].trim())throw Error("Native session requires provider and sessionid");for(let r of["sessiondir","model","effort"])if(t[r]!==void 0&&(typeof t[r]!="string"||!t[r].trim()))throw Error("Invalid native session "+r);if(!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).some(r=>!["permissionMode","idleTimeoutMs"].includes(r)))throw Error("Unknown native session option");if(n.permissionMode!==void 0&&!["yolo","plan"].includes(n.permissionMode))throw Error("permissionMode must be yolo or plan");if(n.idleTimeoutMs!==void 0&&(!Number.isFinite(n.idleTimeoutMs)||n.idleTimeoutMs<0||n.idleTimeoutMs>2147483647))throw Error("idleTimeoutMs must be a nonnegative retention interval");if(e.operation==="turn"&&typeof e.prompt!="string")throw Error("Native session prompt must be a string");if(e.attribution!==void 0&&(!e.attribution||typeof e.attribution!="object"||Array.isArray(e.attribution)||Object.entries(e.attribution).some(([r,s])=>!["LMCTL_SELF_SESSIONID","LMCTL_INVOCATION_ID"].includes(r)||s!==void 0&&typeof s!="string")))throw Error("Invalid native request attribution")}var $f=class{entries=new Map;service_epoch=i8();nextEpoch=0;stopping=!1;drained;clock;idleMs;context;ownsContext;constructor(t){this.context=t.context,this.clock=t.clock??c8,this.idleMs=t.idleMs??3e5,this.ownsContext=t.ownsContext??!1}fields(t,n=null){return{outcome:"not_sent",service_epoch:this.service_epoch,connection_epoch:t?.epoch??null,connection_state:n}}async request(t){let n=(o,i,a="error",c)=>({...this.fields(c),status:a,code:o,reply:"",error:i,messageId:null,teamChatLogId:null});try{l8(t)}catch(o){return n("invalid_argument",String(o))}if(this.stopping)return n("closed","Native conversation service is shutting down");let r=JSON.stringify([t.member.provider,t.member.sessionid]),s=this.entries.get(r);if(s?.active||s?.closing)return n("busy","Native conversation has active or closing work","busy",s);if(t.operation==="close"){if(!s)return{...n("",""),status:"ok",code:void 0,error:null,outcome:"completed"};let o=this.fields(s);try{await this.closeEntry(r,s)}catch(i){return n("provider",String(i),"error",s)}return{...o,status:"ok",reply:"",error:null,messageId:null,teamChatLogId:null,outcome:"completed"}}try{let o=Jc(this.context).getAdapter(t.member.provider),i=Nu(this.context.env.HOME?a8(this.context.env.HOME,".lmctl/config.toml"):void 0);if(!o||!zI(o,i))return n("provider","Provider is not qualified for service-hosted native resume");if(s){let c=t.member,l=t.options??{};if(c.sessiondir!==void 0&&hL(this.context.cwd,c.sessiondir)!==s.member.sessiondir||["model","effort"].some(d=>c[d]!==void 0&&c[d]!==s.member[d])||l.permissionMode!==void 0&&l.permissionMode!==s.options.permissionMode||l.idleTimeoutMs!==void 0&&l.idleTimeoutMs!==s.options.idleTimeoutMs)return n("invalid_argument","Native conversation configuration conflicts with retained connection","error",s)}let a=s?s.session?"reused":"reinitialized":"new";if(!s){let c=xE(this.context,Au(this.context),t.member,hL(this.context.cwd,t.member.sessiondir??this.context.cwd));s={member:{...t.member,sessiondir:c.member.sessiondir,model:c.member.model,effort:c.member.effort},options:{permissionMode:t.options?.permissionMode??"yolo",idleTimeoutMs:t.options?.idleTimeoutMs??this.idleMs},epoch:0,active:!1,phase:"opening"},this.entries.set(r,s)}return s.active=!0,this.cancelIdle(s),s.work=this.perform(r,s,t,a),s.work}catch(o){return n("invalid_argument",String(o),"error",s)}}async perform(t,n,r,s){try{if(!n.session){n.phase="opening",n.epoch=++this.nextEpoch;let i=n.member,a=await mL(this.context,i,n.options,{provider:i.provider,sessionId:i.sessionid,endpoint:null,phase:"starting",processIdentity:null,configJson:null},!0);if(a.status!=="ok")return this.entries.get(t)===n&&this.entries.delete(t),{...this.fields(n,s),status:a.status,code:"code"in a?a.code:"busy",reply:"",error:a.error,messageId:null,teamChatLogId:null};n.session=a.session}n.phase="active";let o=await pL(this.context,n.session,r.prompt,{attribution:{LMCTL_SELF_SESSIONID:r.attribution?.LMCTL_SELF_SESSIONID,LMCTL_INVOCATION_ID:r.attribution?.LMCTL_INVOCATION_ID}});if(o.status==="error"){let i=await LE(this.context,n.session);return i.status!=="ok"?(n.phase="closing",n.closing=Promise.reject(Error(i.error)),n.closing.catch(()=>{}),{...o,...this.fields(n,s),code:o.messageId?"outcome_unknown":o.code??"provider",outcome:o.messageId?"unknown":"not_sent",error:(o.error??"Provider turn failed")+"; cleanup: "+i.error}):(n.session=void 0,n.phase="disconnected",{...o,...this.fields(n,s),code:o.messageId?"outcome_unknown":o.code??"provider",outcome:o.messageId?"unknown":"not_sent"})}return{...o,...this.fields(n,s),outcome:"completed",...o.status!=="ok"?{code:o.status==="busy"?"busy":o.code??"provider"}:{},...o.status==="busy"?{outcome:"not_sent"}:{}}}catch(o){return{...this.fields(n,s),status:"error",code:"provider",reply:"",error:String(o),messageId:null,teamChatLogId:null}}finally{n.active=!1,n.closing||(n.phase=n.session?"ready":"disconnected",this.stopping||this.armIdle(t,n))}}cancelIdle(t){t.idle!==void 0&&(this.clock.clearTimeout(t.idle),t.idle=void 0)}armIdle(t,n){if(this.cancelIdle(n),this.entries.get(t)!==n||n.active||n.closing)return;let r=n.options.idleTimeoutMs??this.idleMs;r>0&&(n.idle=this.clock.setTimeout(()=>{this.closeEntry(t,n).catch(s=>this.context.onWarning("Native conversation idle close failed: "+String(s)))},r))}closeEntry(t,n){return n.closing||(this.cancelIdle(n),n.phase="closing",n.closing=(async()=>{if(n.active&&await n.work,n.session){let r=await LE(this.context,n.session);if(r.status!=="ok")throw Error(r.error)}this.entries.get(t)===n&&this.entries.delete(t)})()),n.closing}shutdown(){return this.drained?this.drained:(this.stopping=!0,this.drained=Promise.allSettled([...this.entries].map(([t,n])=>this.closeEntry(t,n))).then(async t=>{let n=t.flatMap(r=>r.status==="rejected"?[r.reason]:[]);if(n.length)throw new AggregateError(n,"Native cleanup failed: "+n.map(String).join("; "));if(this.ownsContext){let r=await this.context.close();if(r.errors.length)throw Error(r.errors.join("; "))}}),this.drained)}cancel(){this.stopping=!0;for(let t of this.entries.values())this.cancelIdle(t);this.context.finalizeSync("SIGTERM")}};import{randomUUID as g8}from"node:crypto";import{spawn as f8}from"node:child_process";var Mf={name:"@lmctl-ai/mcp-client",version:"0.1.0",private:!0,type:"module",description:"Stateless HTTP MCP client",bin:{mcp:"./bin/mcp"},files:["bin","src","mcp.cli.schema.v1.json","README.md"],scripts:{build:"node --check src/cli.mjs",test:"node --test --test-concurrency=2 tests/*.test.mjs"},engines:{node:">=24.15.0"},dependencies:{"smol-toml":"1.9.0"},exports:{".":{types:"./src/index.d.mts",import:"./src/index.mjs"},"./mcp.cli.schema.v1.json":"./mcp.cli.schema.v1.json"}};function _L(e,t,n){let r=new TextDecoder("utf-8",{fatal:!0}),s=[],o=!1,i=l=>{o||(o=!0,n(l))},a=l=>{if(!o)try{let d=r.decode(l,{stream:!0}),u=0,f;for(;(f=d.indexOf(`
2039
2039
  `,u))>=0;){let p=s.join("")+d.slice(u,f);s=[],u=f+1,t(JSON.parse(p))}let m=d.slice(u);m&&s.push(m)}catch(d){i(d)}},c=()=>{try{let l=r.decode();l&&s.push(l),s.length&&i(new Error("Incomplete newline JSON frame"))}catch(l){i(l)}};return e.on("data",a),e.on("end",c),e.on("error",i),()=>{e.off("data",a),e.off("end",c),e.off("error",i),o=!0,s=[]}}function Pf(e,t){e.write(JSON.stringify(t)+`
2040
- `)}var u8=new Set(["invalid_argument","not_found","busy","service_unavailable","stopped","transport","protocol","unsupported","tool_error","outcome_unknown","events_lost","internal"]);function Kr(e,t=null,n=null,r=null,s="completed"){return t&&!u8.has(t)&&(t="internal"),{status:t==="busy"?"busy":t?"error":"ok",code:t,error:n,connection:e.connection??null,service_epoch:e.service_epoch??null,connection_epoch:e.connection_epoch??null,connection_state:e.connection_state??null,outcome:s,result:r}}var Ce=class extends Error{constructor(t,n,r=null,s="not_sent"){super(n),this.code=t,this.value=r,this.outcome=s}};var m8=Mf.version,ia="2025-11-25",Uf=class{constructor(t,n=()=>{},r=()=>{}){this.config=t,this.onNotification=n,this.onDisconnect=r,this.pending=new Map,this.nextId=0,this.connected=!1}async open(t=()=>{}){let n=this.child=f8(this.config.command,this.config.args,{cwd:this.config.cwd,env:this.config.env,shell:!1,stdio:["pipe","pipe","pipe"]});this.exited=new Promise(s=>n.once("close",()=>{this.disconnect(new Error("MCP server exited")),s()})),n.on("error",s=>this.disconnect(s)),n.stdin.on("error",s=>this.disconnect(s)),n.stderr.resume(),_L(n.stdout,s=>this.message(s),s=>this.disconnect(s)),n.stdout.once("end",()=>this.disconnect(new Error("MCP stdout ended"))),await new Promise((s,o)=>{n.once("spawn",s),n.once("error",i=>o(new Ce("transport",i.message)))}),this.connected=!0,await t(n.pid);let r=await this.request("initialize",{protocolVersion:ia,capabilities:{},clientInfo:{name:"mcp-client",version:m8}});if(r?.protocolVersion!==ia||!r.capabilities||typeof r.capabilities!="object"||Array.isArray(r.capabilities)||!r.serverInfo||typeof r.serverInfo.name!="string"||typeof r.serverInfo.version!="string")throw new Ce("protocol","MCP server did not negotiate the 2025-11-25 profile",r);return this.capabilities=r.capabilities,Pf(n.stdin,{jsonrpc:"2.0",method:"notifications/initialized"}),r}request(t,n){if(!this.connected)return Promise.reject(new Ce("transport","MCP server is disconnected"));let r=++this.nextId;return new Promise((s,o)=>{let i={resolve:s,reject:o,method:t,sent:!1};this.pending.set(r,i);try{i.sent=!0,Pf(this.child.stdin,{jsonrpc:"2.0",id:r,method:t,params:n})}catch(a){this.pending.delete(r),o(new Ce(i.sent&&i.method!=="initialize"?"outcome_unknown":"transport",a.message,null,i.sent&&i.method!=="initialize"?"unknown":"not_sent"))}})}message(t){if(!t||typeof t!="object"||t.jsonrpc!=="2.0"){this.disconnect(new Error("Invalid MCP JSON-RPC message"));return}if(typeof t.method=="string"){Object.hasOwn(t,"id")?Pf(this.child.stdin,t.method==="ping"?{jsonrpc:"2.0",id:t.id,result:{}}:{jsonrpc:"2.0",id:t.id,error:{code:-32601,message:"Unsupported server request: "+t.method}}):this.onNotification(t.method,t.params??{});return}let n=this.pending.get(t.id);n&&(this.pending.delete(t.id),Object.hasOwn(t,"error")?n.reject(new Ce("protocol",t.error?.message??"MCP JSON-RPC error",{error:t.error},"completed")):Object.hasOwn(t,"result")?n.resolve(t.result):n.reject(new Ce("protocol","MCP response has neither result nor error",t,"unknown")))}disconnect(t){if(!(!this.connected&&this.pending.size===0)){this.connected=!1;for(let n of this.pending.values())n.reject(new Ce(n.sent&&n.method!=="initialize"?"outcome_unknown":"transport",t.message,null,n.sent&&n.method!=="initialize"?"unknown":"not_sent"));this.pending.clear(),this.onDisconnect(t)}}async close(){this.child&&(this.child.stdin.end(),await this.exited)}};import{request as p8}from"node:http";import{request as h8}from"node:https";function _8(e){let t=[],n=[],r=!0,s=!1,o=a=>{if(a===""){if(n.length){let u=n.join(`
2040
+ `)}var u8=new Set(["invalid_argument","not_found","busy","service_unavailable","stopped","transport","protocol","unsupported","tool_error","outcome_unknown","events_lost","internal"]);function zr(e,t=null,n=null,r=null,s="completed"){return t&&!u8.has(t)&&(t="internal"),{status:t==="busy"?"busy":t?"error":"ok",code:t,error:n,connection:e.connection??null,service_epoch:e.service_epoch??null,connection_epoch:e.connection_epoch??null,connection_state:e.connection_state??null,outcome:s,result:r}}var Ce=class extends Error{constructor(t,n,r=null,s="not_sent"){super(n),this.code=t,this.value=r,this.outcome=s}};var m8=Mf.version,ia="2025-11-25",Uf=class{constructor(t,n=()=>{},r=()=>{}){this.config=t,this.onNotification=n,this.onDisconnect=r,this.pending=new Map,this.nextId=0,this.connected=!1}async open(t=()=>{}){let n=this.child=f8(this.config.command,this.config.args,{cwd:this.config.cwd,env:this.config.env,shell:!1,stdio:["pipe","pipe","pipe"]});this.exited=new Promise(s=>n.once("close",()=>{this.disconnect(new Error("MCP server exited")),s()})),n.on("error",s=>this.disconnect(s)),n.stdin.on("error",s=>this.disconnect(s)),n.stderr.resume(),_L(n.stdout,s=>this.message(s),s=>this.disconnect(s)),n.stdout.once("end",()=>this.disconnect(new Error("MCP stdout ended"))),await new Promise((s,o)=>{n.once("spawn",s),n.once("error",i=>o(new Ce("transport",i.message)))}),this.connected=!0,await t(n.pid);let r=await this.request("initialize",{protocolVersion:ia,capabilities:{},clientInfo:{name:"mcp-client",version:m8}});if(r?.protocolVersion!==ia||!r.capabilities||typeof r.capabilities!="object"||Array.isArray(r.capabilities)||!r.serverInfo||typeof r.serverInfo.name!="string"||typeof r.serverInfo.version!="string")throw new Ce("protocol","MCP server did not negotiate the 2025-11-25 profile",r);return this.capabilities=r.capabilities,Pf(n.stdin,{jsonrpc:"2.0",method:"notifications/initialized"}),r}request(t,n){if(!this.connected)return Promise.reject(new Ce("transport","MCP server is disconnected"));let r=++this.nextId;return new Promise((s,o)=>{let i={resolve:s,reject:o,method:t,sent:!1};this.pending.set(r,i);try{i.sent=!0,Pf(this.child.stdin,{jsonrpc:"2.0",id:r,method:t,params:n})}catch(a){this.pending.delete(r),o(new Ce(i.sent&&i.method!=="initialize"?"outcome_unknown":"transport",a.message,null,i.sent&&i.method!=="initialize"?"unknown":"not_sent"))}})}message(t){if(!t||typeof t!="object"||t.jsonrpc!=="2.0"){this.disconnect(new Error("Invalid MCP JSON-RPC message"));return}if(typeof t.method=="string"){Object.hasOwn(t,"id")?Pf(this.child.stdin,t.method==="ping"?{jsonrpc:"2.0",id:t.id,result:{}}:{jsonrpc:"2.0",id:t.id,error:{code:-32601,message:"Unsupported server request: "+t.method}}):this.onNotification(t.method,t.params??{});return}let n=this.pending.get(t.id);n&&(this.pending.delete(t.id),Object.hasOwn(t,"error")?n.reject(new Ce("protocol",t.error?.message??"MCP JSON-RPC error",{error:t.error},"completed")):Object.hasOwn(t,"result")?n.resolve(t.result):n.reject(new Ce("protocol","MCP response has neither result nor error",t,"unknown")))}disconnect(t){if(!(!this.connected&&this.pending.size===0)){this.connected=!1;for(let n of this.pending.values())n.reject(new Ce(n.sent&&n.method!=="initialize"?"outcome_unknown":"transport",t.message,null,n.sent&&n.method!=="initialize"?"unknown":"not_sent"));this.pending.clear(),this.onDisconnect(t)}}async close(){this.child&&(this.child.stdin.end(),await this.exited)}};import{request as p8}from"node:http";import{request as h8}from"node:https";function _8(e){let t=[],n=[],r=!0,s=!1,o=a=>{if(a===""){if(n.length){let u=n.join(`
2041
2041
  `);n=[],u!==""&&e(JSON.parse(u))}return}if(a.startsWith(":"))return;let c=a.indexOf(":"),l=c<0?a:a.slice(0,c),d=c<0?"":a.slice(c+1);d.startsWith(" ")&&(d=d.slice(1)),l==="data"&&n.push(d)};return{push:a=>{r&&a&&(r=!1,a=a.replace(/^\uFEFF/,""));let c=0;for(let l of a.matchAll(/[\r\n]/g)){let d=l.index;if(s&&d===c&&l[0]===`
2042
- `){s=!1,c=d+1;continue}t.push(a.slice(c,d)),o(t.join("")),t=[],c=d+1,s=l[0]==="\r"}c<a.length&&(t.push(a.slice(c)),s=!1)}}}var Ff=class{constructor(t,n=()=>{},r=()=>{}){this.config=t,this.onNotification=n,this.onDisconnect=r,this.nextId=0,this.connected=!1,this.requests=new Map,this.background=new Set}async open(){let t=new URL(this.config.url);if(!["http:","https:"].includes(t.protocol)||t.username||t.password||t.hash)throw new Ce("invalid_argument","HTTP MCP requires an explicit http(s) URL without credentials or fragment");this.connected=!0;let n=await this.request("initialize",{protocolVersion:ia,capabilities:{},clientInfo:{name:"mcp-client",version:Mf.version}});if(n?.protocolVersion!==ia||!n.capabilities||typeof n.capabilities!="object"||Array.isArray(n.capabilities)||!n.serverInfo||typeof n.serverInfo.name!="string"||typeof n.serverInfo.version!="string")throw new Ce("protocol","MCP server did not negotiate the 2025-11-25 profile",n);return this.capabilities=n.capabilities,this.protocolVersion=ia,await this.exchange("POST",{jsonrpc:"2.0",method:"notifications/initialized"}),this.listen=this.exchange("GET").catch(r=>{(r.code==="protocol"||r.value?.status===404)&&this.disconnect(r)}),n}request(t,n){return!this.connected||this.ending?Promise.reject(new Ce("transport","MCP server is disconnected")):this.exchange("POST",{jsonrpc:"2.0",id:++this.nextId,method:t,params:n})}serverMessage(t){if(!t||typeof t!="object"||Array.isArray(t)||t.jsonrpc!=="2.0"||typeof t.method!="string")throw new Ce("protocol","Invalid MCP server message",t,"unknown");if(this.ending)return;if(!Object.hasOwn(t,"id")){this.onNotification(t.method,t.params??{});return}let n=t.method==="ping"?{jsonrpc:"2.0",id:t.id,result:{}}:{jsonrpc:"2.0",id:t.id,error:{code:-32601,message:"Unsupported server request: "+t.method}},r=this.exchange("POST",n).catch(s=>this.disconnect(s));this.background.add(r),r.finally(()=>this.background.delete(r))}exchange(t,n){let r=n&&Object.hasOwn(n,"id")&&typeof n.method=="string",s=n?.method==="initialize",o=n===void 0?"":JSON.stringify(n),i={...this.config.headers,accept:t==="GET"?"text/event-stream":"application/json, text/event-stream",...t==="POST"?{"content-type":"application/json","content-length":Buffer.byteLength(o)}:{},...this.protocolVersion?{"MCP-Protocol-Version":this.protocolVersion}:{},...this.sessionId?{"MCP-Session-Id":this.sessionId}:{}},a=new URL(this.config.url),c=a.protocol==="https:"?h8:p8;return new Promise((l,d)=>{let u=!1,f=!1,m,p=(g,w)=>{u||(u=!0,this.requests.delete(_),g?d(g):l(w),m?.destroy(),g?.outcome==="unknown"&&!this.ending&&this.disconnect(g))},h=g=>{if(u)return;let w=f&&!s&&t!=="GET",y=new Ce(w?"outcome_unknown":"transport",g.message,null,w?"unknown":"not_sent");p(y),t!=="GET"&&!this.ending&&this.disconnect(y)},_=c(a,{method:t,headers:i,agent:!1},g=>{m=g,g.setTimeout(0),g.setEncoding("utf8");let w=g.statusCode??0,y=b=>{let A=w>=500&&!s&&t!=="GET";return new Ce(A?"outcome_unknown":w===404?"transport":"protocol","MCP HTTP "+w,b,A?"unknown":"not_sent")};if(w===404&&this.sessionId&&(this.sessionId=void 0,this.connected=!1,this.onDisconnect()),t==="DELETE"||t==="GET"&&w===405){g.resume(),g.on("end",()=>[200,202,204,404,405].includes(w)?p():p(y({status:w}))),g.on("error",h),g.on("aborted",()=>h(new Error("MCP HTTP response aborted")));return}if(w<200||w>=300){let b="";g.on("data",A=>b+=A),g.on("end",()=>{let A=b;try{A=JSON.parse(b)}catch{}p(y({status:w,body:A}))}),g.on("error",h),g.on("aborted",()=>h(new Error("MCP HTTP response aborted")));return}if(s&&g.headers["mcp-session-id"]!==void 0){let b=g.headers["mcp-session-id"];if(typeof b!="string"||!b||!/^[\x21-\x7e]+$/.test(b)){p(new Ce("protocol","Invalid MCP session ID",null,"not_sent"));return}this.sessionId=b}let E=b=>{if(!b||typeof b!="object"||Array.isArray(b)||b.jsonrpc!=="2.0")throw new Ce("protocol","Invalid MCP JSON-RPC message",b,"unknown");if(typeof b.method=="string"){this.serverMessage(b);return}if(!r||b.id!==n.id||Object.hasOwn(b,"result")===Object.hasOwn(b,"error"))throw new Ce("protocol","MCP response does not match the request",b,"unknown");Object.hasOwn(b,"error")?p(new Ce("protocol",b.error?.message??"MCP JSON-RPC error",{error:b.error},"completed")):p(null,b.result)},T=(g.headers["content-type"]??"").split(";")[0].trim().toLowerCase();if(!r&&t==="POST"){let b="";g.on("data",A=>b+=A),g.on("end",()=>w===202&&b===""?p():p(new Ce("protocol","MCP notification/response requires empty HTTP 202",{status:w,body:b},"not_sent")))}else if(T==="text/event-stream"){let b=_8(E);g.on("data",A=>{try{b.push(A)}catch(I){p(I instanceof Ce?I:new Ce("protocol",I.message,null,"unknown"))}}),g.on("end",()=>{t==="GET"?p():h(new Error("MCP SSE ended before its response"))})}else if(T==="application/json"&&r){let b="";g.on("data",A=>b+=A),g.on("end",()=>{try{if(E(JSON.parse(b)),!u)throw new Error("MCP JSON response is not a response")}catch(A){p(A instanceof Ce?A:new Ce("protocol",A.message,null,"unknown"))}})}else p(new Ce("protocol","Unsupported MCP HTTP content type: "+T,{status:w},"unknown"));g.on("error",h),g.on("aborted",()=>h(new Error("MCP HTTP response aborted")))});this.requests.set(_,t),_.setTimeout(0),_.on("socket",g=>g.setTimeout(0)),_.once("finish",()=>f=!0),_.on("error",h),_.end(o)})}disconnect(t){if(this.connected){this.connected=!1;for(let n of this.requests.keys())n.destroy(t);this.onDisconnect(t)}}close(){return this.closing?this.closing:(this.ending=!0,this.closing=(async()=>{for(let[t,n]of this.requests)n==="GET"&&t.destroy();await Promise.all([...this.background]);try{this.sessionId&&!this.cancelled&&await this.exchange("DELETE")}finally{this.cancel(),this.sessionId=void 0}})(),this.closing)}cancel(){this.cancelled=!0,this.ending=!0,this.connected=!1;for(let t of this.requests.keys())t.destroy(new Error("MCP transport cancelled"))}};var jf=class{constructor(t){this.epoch=t,this.events=[]}push(t,n){this.events.push({sequence:this.events.length+1,method:t,params:n})}read(t){let n=0;if(t!==void 0){if(typeof t!="string"||!t.startsWith(this.epoch+":"))throw new Ce("events_lost","Event cursor has a different connection epoch");let r=t.slice(this.epoch.length+1);if(n=Number(r),!/^\d+$/.test(r)||!Number.isSafeInteger(n)||n>this.events.length)throw new Ce("invalid_argument","Invalid event cursor")}return{events:this.events.slice(n),cursor:this.epoch+":"+this.events.length}}};var E8={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},EL={call:"tools/call",list_tools:"tools/list",list_resources:"resources/list",read_resource:"resources/read",list_resource_templates:"resources/templates/list",list_prompts:"prompts/list",get_prompt:"prompts/get"},gL=new Set(["list_tools","list_resources","list_resource_templates","list_prompts"]),y8=new Set([...Object.keys(EL),"status","events","close"]),el=class{constructor({connections:t={},clock:n=E8}={}){this.connections=Object.fromEntries(Object.entries(t).map(([r,s])=>[r,{...s,headers:{...s.headers},args:[...s.args??[]],env:{...process.env,...s.env},idle_ms:s.idle_ms??3e5}])),this.clock=n,this.service_epoch=g8(),this.entries=new Map,this.nextEpoch=0,this.stopping=!1}context(t,n,r){return{connection:t,service_epoch:this.service_epoch,connection_epoch:n?.epoch??null,connection_state:r??null}}async request(t){let{connection:n,operation:r,params:s={}}=t??{},o=()=>this.context(n,this.entries.get(n)),i=(d,u)=>Kr(o(),d,u,null,"not_sent");if(typeof n!="string"||!y8.has(r)||!s||typeof s!="object"||Array.isArray(s))return i("invalid_argument","Expected connection, operation and a params object");let a=r==="call"?["tool","arguments"]:r==="read_resource"?["uri"]:r==="get_prompt"?["name","arguments"]:gL.has(r)||r==="events"?["cursor"]:[];if(Object.keys(s).some(d=>!a.includes(d)))return i("invalid_argument","Unknown operation parameter");if(r==="call"&&(typeof s.tool!="string"||!s.tool||s.arguments!==void 0&&(!s.arguments||typeof s.arguments!="object"||Array.isArray(s.arguments))))return i("invalid_argument","call requires a tool string and argument map");if(gL.has(r)&&s.cursor!==void 0&&typeof s.cursor!="string")return i("invalid_argument","cursor must be a string");if(r==="read_resource"&&(typeof s.uri!="string"||!s.uri))return i("invalid_argument","read_resource requires a uri string");if(r==="get_prompt"&&(typeof s.name!="string"||!s.name||s.arguments!==void 0&&(!s.arguments||typeof s.arguments!="object"||Array.isArray(s.arguments)||Object.values(s.arguments).some(d=>typeof d!="string"))))return i("invalid_argument","get_prompt requires a name string and string-valued argument map");if(this.stopping)return i("stopped","MCP service is shutting down");if(!Object.hasOwn(this.connections,n))return i("not_found","Unknown MCP connection: "+n);let c=this.entries.get(n);if(r==="status")return Kr(o(),null,null,{phase:c?.phase??"absent",active:c?.active??!1});if(r==="events"){if(!c)return i("not_found","MCP connection is not open");try{return Kr(o(),null,null,c.events.read(s.cursor))}catch(d){return i(d.code,d.message)}}if(r==="close"){if(!c)return Kr(o());if(c.active||c.closing||c.phase==="closing")return i("busy","MCP connection has active work");let d=this.context(n,c);try{return await this.closeEntry(n,c),Kr(d)}catch(u){return Kr(d,u.code??"internal",u.message,u.value??null,u.outcome??"unknown")}}if(c?.active||c?.closing||c?.phase==="closing")return i("busy","MCP connection has active work");let l=c?c.transport?.connected?"reused":"reinitialized":"new";return c||(c={phase:"opening",active:!1,epoch:0},this.entries.set(n,c)),c.active=!0,this.cancelIdle(c),c.work=this.perform(n,c,r,s,l),c.work}async perform(t,n,r,s,o){try{if(!n.transport?.connected){n.transport&&await n.transport.close().catch(()=>{}),n.phase="opening",n.epoch=++this.nextEpoch,n.events=new jf(this.service_epoch+"/"+t+"/"+n.epoch);let u=this.connections[t].transport==="http"?Ff:Uf,f=new u(this.connections[t],(m,p)=>n.events.push(m,p),()=>{n.transport!==f||n.closing||(n.phase="disconnected")});n.transport=f;try{await n.transport.open()}catch(m){throw await n.transport.close().catch(()=>{}),this.entries.get(t)===n&&this.entries.delete(t),m}}n.phase="active";let i=EL[r],a=i.split("/")[0];if(!n.transport.capabilities[a])throw new Ce("unsupported","MCP server does not advertise "+a);let c=r==="call"?{name:s.tool,arguments:s.arguments??{}}:r==="read_resource"?{uri:s.uri}:r==="get_prompt"?{name:s.name,...s.arguments!==void 0?{arguments:s.arguments}:{}}:{...s.cursor!==void 0?{cursor:s.cursor}:{}},l=await n.transport.request(i,c),d=r==="call"&&l?.isError;return Kr(this.context(t,n,o),d?"tool_error":null,d?"MCP tool returned isError":null,l)}catch(i){return Kr(this.context(t,n,o),i.code??"internal",i.message,i.value??null,i.outcome??"not_sent")}finally{n.active=!1,n.closing||(n.phase=n.transport?.connected?"ready":"disconnected",this.stopping||this.armIdle(t,n))}}cancelIdle(t){t.idle!==void 0&&(this.clock.clearTimeout(t.idle),t.idle=void 0)}armIdle(t,n){if(this.cancelIdle(n),this.entries.get(t)!==n)return;let r=this.connections[t].idle_ms;r>0&&!n.active&&!n.closing&&["ready","disconnected"].includes(n.phase)&&(n.idle=this.clock.setTimeout(()=>{if(!n.active&&!n.closing&&["ready","disconnected"].includes(n.phase))return this.closeEntry(t,n).catch(()=>{})},r))}closeEntry(t,n){return n.closing||(this.cancelIdle(n),n.phase="closing",n.closing=(async()=>{n.active&&await n.work,n.phase="closing";try{await n.transport?.close()}finally{n.phase="closed",this.entries.get(t)===n&&this.entries.delete(t)}})()),n.closing}shutdown(){return this.shutdownPromise?this.shutdownPromise:(this.stopping=!0,this.shutdownPromise=Promise.all([...this.entries].map(([t,n])=>this.closeEntry(t,n))).then(()=>{}),this.shutdownPromise)}cancel(){this.stopping=!0;for(let t of this.entries.values())this.cancelIdle(t),t.transport?.cancel?.(),t.transport?.child?.kill("SIGTERM")}};import{readFileSync as I8}from"node:fs";import{validateHeaderName as k8,validateHeaderValue as R8}from"node:http";import{dirname as bL,resolve as AL}from"node:path";function w8(e,t){let n=e.slice(0,t).split(/\r?\n/);return[n.length,n.pop().length+1]}function T8(e,t,n){let r=e.split(/\r?\n/),s="",o=(Math.log10(t+1)|0)+1;for(let i=t-1;i<=t+1;i++){let a=r[i-1];a&&(s+=i.toString().padEnd(o," "),s+=": ",s+=a,s+=`
2042
+ `){s=!1,c=d+1;continue}t.push(a.slice(c,d)),o(t.join("")),t=[],c=d+1,s=l[0]==="\r"}c<a.length&&(t.push(a.slice(c)),s=!1)}}}var Ff=class{constructor(t,n=()=>{},r=()=>{}){this.config=t,this.onNotification=n,this.onDisconnect=r,this.nextId=0,this.connected=!1,this.requests=new Map,this.background=new Set}async open(){let t=new URL(this.config.url);if(!["http:","https:"].includes(t.protocol)||t.username||t.password||t.hash)throw new Ce("invalid_argument","HTTP MCP requires an explicit http(s) URL without credentials or fragment");this.connected=!0;let n=await this.request("initialize",{protocolVersion:ia,capabilities:{},clientInfo:{name:"mcp-client",version:Mf.version}});if(n?.protocolVersion!==ia||!n.capabilities||typeof n.capabilities!="object"||Array.isArray(n.capabilities)||!n.serverInfo||typeof n.serverInfo.name!="string"||typeof n.serverInfo.version!="string")throw new Ce("protocol","MCP server did not negotiate the 2025-11-25 profile",n);return this.capabilities=n.capabilities,this.protocolVersion=ia,await this.exchange("POST",{jsonrpc:"2.0",method:"notifications/initialized"}),this.listen=this.exchange("GET").catch(r=>{(r.code==="protocol"||r.value?.status===404)&&this.disconnect(r)}),n}request(t,n){return!this.connected||this.ending?Promise.reject(new Ce("transport","MCP server is disconnected")):this.exchange("POST",{jsonrpc:"2.0",id:++this.nextId,method:t,params:n})}serverMessage(t){if(!t||typeof t!="object"||Array.isArray(t)||t.jsonrpc!=="2.0"||typeof t.method!="string")throw new Ce("protocol","Invalid MCP server message",t,"unknown");if(this.ending)return;if(!Object.hasOwn(t,"id")){this.onNotification(t.method,t.params??{});return}let n=t.method==="ping"?{jsonrpc:"2.0",id:t.id,result:{}}:{jsonrpc:"2.0",id:t.id,error:{code:-32601,message:"Unsupported server request: "+t.method}},r=this.exchange("POST",n).catch(s=>this.disconnect(s));this.background.add(r),r.finally(()=>this.background.delete(r))}exchange(t,n){let r=n&&Object.hasOwn(n,"id")&&typeof n.method=="string",s=n?.method==="initialize",o=n===void 0?"":JSON.stringify(n),i={...this.config.headers,accept:t==="GET"?"text/event-stream":"application/json, text/event-stream",...t==="POST"?{"content-type":"application/json","content-length":Buffer.byteLength(o)}:{},...this.protocolVersion?{"MCP-Protocol-Version":this.protocolVersion}:{},...this.sessionId?{"MCP-Session-Id":this.sessionId}:{}},a=new URL(this.config.url),c=a.protocol==="https:"?h8:p8;return new Promise((l,d)=>{let u=!1,f=!1,m,p=(g,w)=>{u||(u=!0,this.requests.delete(_),g?d(g):l(w),m?.destroy(),g?.outcome==="unknown"&&!this.ending&&this.disconnect(g))},h=g=>{if(u)return;let w=f&&!s&&t!=="GET",y=new Ce(w?"outcome_unknown":"transport",g.message,null,w?"unknown":"not_sent");p(y),t!=="GET"&&!this.ending&&this.disconnect(y)},_=c(a,{method:t,headers:i,agent:!1},g=>{m=g,g.setTimeout(0),g.setEncoding("utf8");let w=g.statusCode??0,y=b=>{let A=w>=500&&!s&&t!=="GET";return new Ce(A?"outcome_unknown":w===404?"transport":"protocol","MCP HTTP "+w,b,A?"unknown":"not_sent")};if(w===404&&this.sessionId&&(this.sessionId=void 0,this.connected=!1,this.onDisconnect()),t==="DELETE"||t==="GET"&&w===405){g.resume(),g.on("end",()=>[200,202,204,404,405].includes(w)?p():p(y({status:w}))),g.on("error",h),g.on("aborted",()=>h(new Error("MCP HTTP response aborted")));return}if(w<200||w>=300){let b="";g.on("data",A=>b+=A),g.on("end",()=>{let A=b;try{A=JSON.parse(b)}catch{}p(y({status:w,body:A}))}),g.on("error",h),g.on("aborted",()=>h(new Error("MCP HTTP response aborted")));return}if(s&&g.headers["mcp-session-id"]!==void 0){let b=g.headers["mcp-session-id"];if(typeof b!="string"||!b||!/^[\x21-\x7e]+$/.test(b)){p(new Ce("protocol","Invalid MCP session ID",null,"not_sent"));return}this.sessionId=b}let E=b=>{if(!b||typeof b!="object"||Array.isArray(b)||b.jsonrpc!=="2.0")throw new Ce("protocol","Invalid MCP JSON-RPC message",b,"unknown");if(typeof b.method=="string"){this.serverMessage(b);return}if(!r||b.id!==n.id||Object.hasOwn(b,"result")===Object.hasOwn(b,"error"))throw new Ce("protocol","MCP response does not match the request",b,"unknown");Object.hasOwn(b,"error")?p(new Ce("protocol",b.error?.message??"MCP JSON-RPC error",{error:b.error},"completed")):p(null,b.result)},T=(g.headers["content-type"]??"").split(";")[0].trim().toLowerCase();if(!r&&t==="POST"){let b="";g.on("data",A=>b+=A),g.on("end",()=>w===202&&b===""?p():p(new Ce("protocol","MCP notification/response requires empty HTTP 202",{status:w,body:b},"not_sent")))}else if(T==="text/event-stream"){let b=_8(E);g.on("data",A=>{try{b.push(A)}catch(I){p(I instanceof Ce?I:new Ce("protocol",I.message,null,"unknown"))}}),g.on("end",()=>{t==="GET"?p():h(new Error("MCP SSE ended before its response"))})}else if(T==="application/json"&&r){let b="";g.on("data",A=>b+=A),g.on("end",()=>{try{if(E(JSON.parse(b)),!u)throw new Error("MCP JSON response is not a response")}catch(A){p(A instanceof Ce?A:new Ce("protocol",A.message,null,"unknown"))}})}else p(new Ce("protocol","Unsupported MCP HTTP content type: "+T,{status:w},"unknown"));g.on("error",h),g.on("aborted",()=>h(new Error("MCP HTTP response aborted")))});this.requests.set(_,t),_.setTimeout(0),_.on("socket",g=>g.setTimeout(0)),_.once("finish",()=>f=!0),_.on("error",h),_.end(o)})}disconnect(t){if(this.connected){this.connected=!1;for(let n of this.requests.keys())n.destroy(t);this.onDisconnect(t)}}close(){return this.closing?this.closing:(this.ending=!0,this.closing=(async()=>{for(let[t,n]of this.requests)n==="GET"&&t.destroy();await Promise.all([...this.background]);try{this.sessionId&&!this.cancelled&&await this.exchange("DELETE")}finally{this.cancel(),this.sessionId=void 0}})(),this.closing)}cancel(){this.cancelled=!0,this.ending=!0,this.connected=!1;for(let t of this.requests.keys())t.destroy(new Error("MCP transport cancelled"))}};var jf=class{constructor(t){this.epoch=t,this.events=[]}push(t,n){this.events.push({sequence:this.events.length+1,method:t,params:n})}read(t){let n=0;if(t!==void 0){if(typeof t!="string"||!t.startsWith(this.epoch+":"))throw new Ce("events_lost","Event cursor has a different connection epoch");let r=t.slice(this.epoch.length+1);if(n=Number(r),!/^\d+$/.test(r)||!Number.isSafeInteger(n)||n>this.events.length)throw new Ce("invalid_argument","Invalid event cursor")}return{events:this.events.slice(n),cursor:this.epoch+":"+this.events.length}}};var E8={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},EL={call:"tools/call",list_tools:"tools/list",list_resources:"resources/list",read_resource:"resources/read",list_resource_templates:"resources/templates/list",list_prompts:"prompts/list",get_prompt:"prompts/get"},gL=new Set(["list_tools","list_resources","list_resource_templates","list_prompts"]),y8=new Set([...Object.keys(EL),"status","events","close"]),el=class{constructor({connections:t={},clock:n=E8}={}){this.connections=Object.fromEntries(Object.entries(t).map(([r,s])=>[r,{...s,headers:{...s.headers},args:[...s.args??[]],env:{...process.env,...s.env},idle_ms:s.idle_ms??3e5}])),this.clock=n,this.service_epoch=g8(),this.entries=new Map,this.nextEpoch=0,this.stopping=!1}context(t,n,r){return{connection:t,service_epoch:this.service_epoch,connection_epoch:n?.epoch??null,connection_state:r??null}}async request(t){let{connection:n,operation:r,params:s={}}=t??{},o=()=>this.context(n,this.entries.get(n)),i=(d,u)=>zr(o(),d,u,null,"not_sent");if(typeof n!="string"||!y8.has(r)||!s||typeof s!="object"||Array.isArray(s))return i("invalid_argument","Expected connection, operation and a params object");let a=r==="call"?["tool","arguments"]:r==="read_resource"?["uri"]:r==="get_prompt"?["name","arguments"]:gL.has(r)||r==="events"?["cursor"]:[];if(Object.keys(s).some(d=>!a.includes(d)))return i("invalid_argument","Unknown operation parameter");if(r==="call"&&(typeof s.tool!="string"||!s.tool||s.arguments!==void 0&&(!s.arguments||typeof s.arguments!="object"||Array.isArray(s.arguments))))return i("invalid_argument","call requires a tool string and argument map");if(gL.has(r)&&s.cursor!==void 0&&typeof s.cursor!="string")return i("invalid_argument","cursor must be a string");if(r==="read_resource"&&(typeof s.uri!="string"||!s.uri))return i("invalid_argument","read_resource requires a uri string");if(r==="get_prompt"&&(typeof s.name!="string"||!s.name||s.arguments!==void 0&&(!s.arguments||typeof s.arguments!="object"||Array.isArray(s.arguments)||Object.values(s.arguments).some(d=>typeof d!="string"))))return i("invalid_argument","get_prompt requires a name string and string-valued argument map");if(this.stopping)return i("stopped","MCP service is shutting down");if(!Object.hasOwn(this.connections,n))return i("not_found","Unknown MCP connection: "+n);let c=this.entries.get(n);if(r==="status")return zr(o(),null,null,{phase:c?.phase??"absent",active:c?.active??!1});if(r==="events"){if(!c)return i("not_found","MCP connection is not open");try{return zr(o(),null,null,c.events.read(s.cursor))}catch(d){return i(d.code,d.message)}}if(r==="close"){if(!c)return zr(o());if(c.active||c.closing||c.phase==="closing")return i("busy","MCP connection has active work");let d=this.context(n,c);try{return await this.closeEntry(n,c),zr(d)}catch(u){return zr(d,u.code??"internal",u.message,u.value??null,u.outcome??"unknown")}}if(c?.active||c?.closing||c?.phase==="closing")return i("busy","MCP connection has active work");let l=c?c.transport?.connected?"reused":"reinitialized":"new";return c||(c={phase:"opening",active:!1,epoch:0},this.entries.set(n,c)),c.active=!0,this.cancelIdle(c),c.work=this.perform(n,c,r,s,l),c.work}async perform(t,n,r,s,o){try{if(!n.transport?.connected){n.transport&&await n.transport.close().catch(()=>{}),n.phase="opening",n.epoch=++this.nextEpoch,n.events=new jf(this.service_epoch+"/"+t+"/"+n.epoch);let u=this.connections[t].transport==="http"?Ff:Uf,f=new u(this.connections[t],(m,p)=>n.events.push(m,p),()=>{n.transport!==f||n.closing||(n.phase="disconnected")});n.transport=f;try{await n.transport.open()}catch(m){throw await n.transport.close().catch(()=>{}),this.entries.get(t)===n&&this.entries.delete(t),m}}n.phase="active";let i=EL[r],a=i.split("/")[0];if(!n.transport.capabilities[a])throw new Ce("unsupported","MCP server does not advertise "+a);let c=r==="call"?{name:s.tool,arguments:s.arguments??{}}:r==="read_resource"?{uri:s.uri}:r==="get_prompt"?{name:s.name,...s.arguments!==void 0?{arguments:s.arguments}:{}}:{...s.cursor!==void 0?{cursor:s.cursor}:{}},l=await n.transport.request(i,c),d=r==="call"&&l?.isError;return zr(this.context(t,n,o),d?"tool_error":null,d?"MCP tool returned isError":null,l)}catch(i){return zr(this.context(t,n,o),i.code??"internal",i.message,i.value??null,i.outcome??"not_sent")}finally{n.active=!1,n.closing||(n.phase=n.transport?.connected?"ready":"disconnected",this.stopping||this.armIdle(t,n))}}cancelIdle(t){t.idle!==void 0&&(this.clock.clearTimeout(t.idle),t.idle=void 0)}armIdle(t,n){if(this.cancelIdle(n),this.entries.get(t)!==n)return;let r=this.connections[t].idle_ms;r>0&&!n.active&&!n.closing&&["ready","disconnected"].includes(n.phase)&&(n.idle=this.clock.setTimeout(()=>{if(!n.active&&!n.closing&&["ready","disconnected"].includes(n.phase))return this.closeEntry(t,n).catch(()=>{})},r))}closeEntry(t,n){return n.closing||(this.cancelIdle(n),n.phase="closing",n.closing=(async()=>{n.active&&await n.work,n.phase="closing";try{await n.transport?.close()}finally{n.phase="closed",this.entries.get(t)===n&&this.entries.delete(t)}})()),n.closing}shutdown(){return this.shutdownPromise?this.shutdownPromise:(this.stopping=!0,this.shutdownPromise=Promise.all([...this.entries].map(([t,n])=>this.closeEntry(t,n))).then(()=>{}),this.shutdownPromise)}cancel(){this.stopping=!0;for(let t of this.entries.values())this.cancelIdle(t),t.transport?.cancel?.(),t.transport?.child?.kill("SIGTERM")}};import{readFileSync as I8}from"node:fs";import{validateHeaderName as k8,validateHeaderValue as R8}from"node:http";import{dirname as bL,resolve as AL}from"node:path";function w8(e,t){let n=e.slice(0,t).split(/\r?\n/);return[n.length,n.pop().length+1]}function T8(e,t,n){let r=e.split(/\r?\n/),s="",o=(Math.log10(t+1)|0)+1;for(let i=t-1;i<=t+1;i++){let a=r[i-1];a&&(s+=i.toString().padEnd(o," "),s+=": ",s+=a,s+=`
2043
2043
  `,i===t&&(s+=" ".repeat(o+n+2),s+=`^
2044
2044
  `))}return s}var me=class e extends Error{line;column;codeblock;constructor(t,n){let[r,s]=w8(n.toml,n.ptr),o=T8(n.toml,r,s);super(`Invalid TOML document: ${t}
2045
2045
 
2046
2046
  ${o}`,n),this.line=r,this.column=s,this.codeblock=o}static x(t,n,r){throw new e(t,{toml:n.s,ptr:r??n.p})}};function qf(e){let t=e.p,n=e.s.charCodeAt(e.p++),r=n,s=n===39,o=n===e.s.charCodeAt(e.p)&&n===e.s.charCodeAt(e.p+1);o&&((n=e.s.charCodeAt(e.p+=2))===10?e.p++:n===13&&e.s.charCodeAt(e.p+1)===10&&(e.p+=2));let i="",a=e.p,c=0;for(;e.p<e.s.length;e.p++)if(n=e.s.charCodeAt(e.p),o&&(n===10||n===13&&e.s.charCodeAt(e.p+1)===10))c=c&&3;else if(n<32&&n!==9||n===127)me.x("control characters are not allowed in strings",e);else if((!c||c===3)&&n===r&&(!o||e.s.charCodeAt(e.p+1)===r&&e.s.charCodeAt(e.p+2)===r)){if(o&&(e.s.charCodeAt(e.p+3)===r&&e.p++,e.s.charCodeAt(e.p+3)===r&&e.p++),!c){let l=e.s.slice(a,e.p);i=i?i+l:l}return e.p+=o?3:1,i}else if(!c)!s&&n===92&&(i+=e.s.slice(a,a=e.p),c=1);else if(c===1)if(n===120||n===117||n===85){let l=e.p++-1,d=0,u=n===120?2:n===117?4:8;for(let f=0;f<u;f++,e.p++){let m=e.s.charCodeAt(e.p),p=m>=48&&m<=57?m-48:m>=65&&m<=70?m-65+10:m>=97&&m<=102?m-97+10:-1;p<0&&me.x("invalid non-hex character in unicode escape",e),d=d<<4|p}(d<0||d>1114111||d>=55296&&d<=57343)&&me.x("invalid unicode escape",e,l),i+=String.fromCodePoint(d),a=e.p--,c=0}else o&&(n===32||n===9)?c=2:(n===98?i+="\b":n===116?i+=" ":n===110?i+=`
2047
- `:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":me.x("unrecognised escape sequence",e),a=e.p+1,c=0);else n!==32&&n!==9&&(c===2&&me.x("invalid escape: only line-ending whitespace may be escaped",e,a),c=!s&&n===92?1:0,a=e.p);me.x("unfinished string",e,t)}var v8=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,tl=class e extends Date{#t=!1;#e=!1;#n=null;constructor(t,n,r){let s=!0,o=!0,i="Z",a;if(typeof t=="string")if(n)e:{if(n<3){if(+t.slice(11,13)>23){t="";break e}n===2?(i=null,t+="Z"):(a=t.charCodeAt(t.length-1))!==90&&a!==122&&(i=t.slice(t.length-6)),r&&(t=t.slice(0,10)+"T"+t.slice(11))}else n===4&&(t=+t.slice(0,2)>23?"":`0000-01-01T${t}Z`);s=n!==4,o=n!==3}else{let c=t.match(v8);c?(c[1]||(s=!1,t=`0000-01-01T${t}`),o=!!c[2],o&&t[10]===" "&&(t=t.replace(" ","T")),c[2]&&+c[2]>23?t="":(i=c[3]||null,!i&&o&&(t+="Z"))):t=""}super(t),isNaN(this.getTime())||(this.#t=s,this.#e=o,this.#n=i)}isDateTime(){return this.#t&&this.#e}isLocal(){return!this.#t||!this.#e||!this.#n}isDate(){return this.#t&&!this.#e}isTime(){return this.#e&&!this.#t}isValid(){return this.#t||this.#e}toISOString(){let t=super.toISOString();if(this.isDate())return t.slice(0,10);if(this.isTime())return t.slice(11,23);if(this.#n===null)return t.slice(0,-1);if(this.#n==="Z"||this.#n==="z")return t;let n=+this.#n.slice(1,3)*60+ +this.#n.slice(4,6);return n=this.#n[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#n}static wrapAsOffsetDateTime(t,n="Z"){let r=new e(t);return r.#n=n,r}static wrapAsLocalDateTime(t){let n=new e(t);return n.#n=null,n}static wrapAsLocalDate(t){let n=new e(t);return n.#e=!1,n.#n=null,n}static wrapAsLocalTime(t){let n=new e(t);return n.#t=!1,n.#n=null,n}};function kn(e,t=10){return t===16?e>47&&e<58||e>64&&e<71||e>96&&e<103:e>47&&e<48+t}function OE(e,t){return e===32||e===9||e===10||e===13||t&&(e===t||e===44)||e===35}function rl(e,t){let n=e.p,r=e.s.charCodeAt(e.p);if(r===91||r===123){e.d--||me.x("document contains excessively nested structures. aborting.",e);let s=r===91?TL(e):wL(e);return e.d++,s}return r===34||r===39?qf(e):r===116?((e.s.charCodeAt(++e.p)!==114||e.s.charCodeAt(++e.p)!==117||e.s.charCodeAt(++e.p)!==101)&&me.x("invalid value",e,n),e.p++,!0):r===102?((e.s.charCodeAt(++e.p)!==97||e.s.charCodeAt(++e.p)!==108||e.s.charCodeAt(++e.p)!==115||e.s.charCodeAt(++e.p)!==101)&&me.x("invalid value",e,n),e.p++,!1):r===43||r===45?Hf(e,e.p,e.s.charCodeAt(++e.p),44-r,t):e.s.charCodeAt(e.p+4)===45&&e.s.charCodeAt(e.p+7)===45?S8(e,r,t):e.s.charCodeAt(e.p+2)===58?b8(e,r,t):Hf(e,e.p,r,0,t)}function Hf(e,t,n,r,s){let o=n,i=0,a=!1;if(o===105)return(e.s.charCodeAt(++e.p)!==110||e.s.charCodeAt(++e.p)!==102)&&me.x("invalid value",e,t),e.p++,(r||1)/0;if(o===110)return(e.s.charCodeAt(++e.p)!==97||e.s.charCodeAt(++e.p)!==110)&&me.x("invalid value",e,t),e.p++,NaN;if(o===48){if(++e.p>=e.s.length||OE(o=e.s.charCodeAt(e.p),s))return e.bi===!0?0n:0;if(!r){if(o===120)return CE(e,t,16,s);if(o===98)return CE(e,t,2,s);if(o===111)return CE(e,t,8,s)}o===46?i=2:o===101||o===69?i=4:me.x("illegal leading zero",e,t)}else kn(o)||me.x("invalid value",e,t);for(;++e.p<e.s.length&&(o=e.s.charCodeAt(e.p),!OE(o,s));)i||(i=1),o===95?(i&1||me.x("illegal underscore",e),i+=11,a=!0):i===1&&o===46?i=2:(i===1||i===3)&&(o===101||o===69)?i=4:i===4&&(o===43||o===45)||(kn(o)?i>9?i-=11:i&1||i++:me.x("illegal character in numeric literal",e));if(!i){let l=(n-48)*(r||1);return e.bi===!0?BigInt(l):l}i&1||me.x("unfinished numeric value",e,t);let c=e.s.slice(t,e.p);return a&&(c=c.replaceAll("_","")),i>1?parseFloat(c):yL(e,c,10,t)}function CE(e,t,n,r){let s,o=1;for(;++e.p<e.s.length&&(s=e.s.charCodeAt(e.p),!OE(s,r));)s===95?(o&1&&me.x("illegal underscore",e),o=3):kn(s,n)?o&1&&o--:me.x("illegal character in numeric literal",e);o&1&&me.x("unfinished numeric value",e);let i=e.s.slice(t+2,e.p);return o&&(i=i.replaceAll("_","")),yL(e,i,n,t)}function yL(e,t,n,r){if(e.bi!==!0)e:{let s=parseInt(t,n);if(!Number.isSafeInteger(s)){if(e.bi)break e;me.x("integer value cannot be represented losslessly",e,r)}return s}return BigInt(n===10?t:(n===2?"0b":n===8?"0o":"0x")+t)}function S8(e,t,n){let r=e.p++,s;if(!kn(t)||!kn(e.s.charCodeAt(e.p++))||!kn(e.s.charCodeAt(e.p++))||!kn(e.s.charCodeAt(e.p++)))return Hf(e,e.p=r,t,0,n);if(e.p+=5,kn(e.s.charCodeAt(e.p++))||me.x("invalid date-time: date part is malformed",e,r),e.p>=e.s.length||((t=e.s.charCodeAt(e.p))!==32||(s=!0,!kn(e.s.charCodeAt(e.p+1))))&&t!==84&&t!==116){let i=e.s.slice(r,e.p);return nl(e,i,3,!1,r)}if(e.s.charCodeAt(e.p+=3)!==58&&me.x("invalid date-time: time part is malformed",e,r),e.s.charCodeAt(e.p+=3)===58&&(e.p+=3),e.s.charCodeAt(e.p)===46)for(;kn(e.s.charCodeAt(++e.p)););if(t=e.s.charCodeAt(e.p)){if(t===90||t===122){let i=e.s.slice(r,++e.p);return nl(e,i,1,s,r,"[+00:00]")}if(t===43||t===45){let i=e.s.slice(r,e.p+=6);return nl(e,i,1,s,r,!e.ld&&"["+e.s.slice(e.p-6,e.p)+"]")}}let o=e.s.slice(r,e.p);return nl(e,o,2,s,r)}function b8(e,t,n){let r=e.p;if(!kn(t)||!kn(e.s.charCodeAt(++e.p)))return Hf(e,--e.p,t,0,n);if(e.s.charCodeAt(e.p+=4)===58&&(e.p+=3),e.s.charCodeAt(e.p)===46)for(;kn(e.s.charCodeAt(++e.p)););let s=e.s.slice(r,e.p);return nl(e,s,4,!1,r)}function nl(e,t,n,r,s,o){if(e.ld){let i=new tl(t,n,r);return i.isValid()||me.x("invalid date",e,s),i}try{switch(o&&(t+=o),n){case 1:return Temporal.ZonedDateTime.from(t);case 2:return Temporal.PlainDateTime.from(t);case 3:return Temporal.PlainDate.from(t);case 4:return Temporal.PlainTime.from(t)}}catch(i){me.x(i instanceof Error?i.message:""+i,e,s)}}function A8(e){for(;e.p<e.s.length;e.p++){let t=e.s.charCodeAt(e.p);if(t===10)break;if(t===13&&e.s.charCodeAt(e.p+1)===10){e.p++;break}(t<32&&t!==9||t===127)&&me.x("control characters are not allowed in comments",e)}}function Gn(e,t,n){let r;for(;e.p<e.s.length;){for(;e.p<e.s.length&&((r=e.s.charCodeAt(e.p))===32||r===9||!t&&(r===10||r===13&&e.s.charCodeAt(e.p+1)===10));)e.p++;if(n||r!==35)break;A8(e)}}function Wf(e,t=61){let n,r=0,s=[],o,i=e.s.charCodeAt(n=e.p);do{if(i===t)return r||me.x("unexpected end of key",e),r===1&&s.push(e.s.slice(o,e.p)),e.p++,s;i===46?(r||me.x("illegal empty bare key",e),r===1&&s.push(e.s.slice(o,e.p)),r=0):!r&&(i===34||i===39)?(i===e.s.charCodeAt(e.p+1)&&i===e.s.charCodeAt(e.p+2)&&me.x("illegal quoted key: multiline strings are not allowed",e),s.push(qf(e)),r=2,e.p--):i===32||i===9?r===1&&(s.push(e.s.slice(o,e.p)),r=2):r===2||i<48&&i!==45||i>57&&i<65||i>90&&i<97&&i!==95||i>122?me.x("illegal character in key",e):r||(r=1,o=e.p)}while(i=e.s.charCodeAt(++e.p));me.x("incomplete key-value: cannot find end of key",e,n)}function wL(e){let t=e.p++,n=Object.create(null),r=new Set,s;for(;e.p<e.s.length;){if(Gn(e),(s=e.s.charCodeAt(e.p))===125)return e.p++,n;let o,i=n,a=!1,c=e.p,l=Wf(e);for(let u=0;u<l.length;u++){u&&(i=a?i[o]:i[o]=Object.create(null)),o=l[u],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&me.x("trying to redefine an already defined value",e,c);let f=o==="__proto__";if(e.uk&&(f||o==="constructor")){i=e.uk!==1&&me.x("document contains an unsafe property",e,c);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&me.x("trying to redefine an already defined value",e,c),Gn(e,!0,!0);let d=rl(e,125);if(i&&typeof(i[o]=d)=="object"&&r.add(d),Gn(e),(s=e.s.charCodeAt(e.p++))===125)return n;s!==44&&me.x("expected comma or end of structure",e,e.p-1)}me.x("unfinished table",e,t)}function TL(e){let t=e.p++,n=[],r;for(;e.p<e.s.length;){if(Gn(e),(r=e.s.charCodeAt(e.p))===93)return e.p++,n;if(n.push(rl(e,93)),Gn(e),(r=e.s.charCodeAt(e.p++))===93)return n;r!==44&&me.x("expected comma or end of structure",e,e.p-1)}me.x("unfinished array",e,t)}function vL(e,t,n,r,s){let o=n,i=r,a,c=!1,l;for(let d=0;d<t.length;d++){if(d){if(o=c?o[a]:o[a]=Object.create(null),i=(l=i[a]).c,s===0&&(l.t===1||l.t===2))return null;if(l.t===2){let u=o.length-1;o=o[u],i=i[u].c}}if(a=t[d],(c=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!c){let u=a==="__proto__";if(e.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:d<t.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(l=i[a],l.t!==s&&!(s===1&&l.t===3)||(s===2&&(l.d||(l.d=!0,o[a]=[]),o[a].push(o=Object.create(null)),l.c[l.i++]=l={t:1,d:!1,i:0,c:Object.create(null)}),l.d))return null;if(l.d=!0,s===1)o=c?o[a]:o[a]=Object.create(null);else if(s===0&&c)return null;return[a,o,l.c]}function SL(e,t,n){(t===null||e.uk===2)&&me.x(t===null?"trying to redefine an already defined table or value":"document contains an unsafe property",e,n)}function DE(e,t={}){let n={s:e,p:0,d:t.maxDepth??1e3,bi:t.integersAsBigInt??!1,ld:t.useLegacyDate??!0,uk:t.unsafeKeyBehaviour==="throw"?2:t.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),o,i=!1,a=r,c=s;for(e.charCodeAt(0)===65279&&n.p++,Gn(n);n.p<e.length;){if(e.charCodeAt(n.p)===91){let l=e.charCodeAt(++n.p)===91;o=n.p+=+l,i=!1;let d=Wf(n,93);l&&(e.charCodeAt(n.p)!==93&&me.x("expected end of table array declaration",n),n.p++);let u=vL(n,d,r,s,l?2:1);u?(c=u[2],a=u[1]):(SL(n,u,o),i=!0)}else{o=n.p;let l=Wf(n),d=vL(n,l,a,c,0);!d&&!i&&SL(n,d,o),Gn(n,!0,!0);let u=rl(n,void 0);d&&!i&&(d[1][d[0]]=u)}Gn(n,!0),n.p<e.length&&(o=e.charCodeAt(n.p))!==10&&(o!==13||e.charCodeAt(n.p+1)!==10)&&me.x("each key-value declaration must be followed by an end-of-line",n),Gn(n)}return r}var OIe=!!"".isWellFormed;var N8=new Set(["endpoint"]),x8=new Set(["transport","command","args","cwd","env","url","headers","idle_ms"]),L8=new Set(["accept","content-type","content-length","mcp-session-id","mcp-protocol-version","last-event-id","host","connection","transfer-encoding"]);function Xe(e){let t=new Error(e);throw t.code="invalid_argument",t}function C8(e,t){return(!Array.isArray(e)||!e.every(n=>typeof n=="string"))&&Xe(`${t} must be an array of strings`),[...e]}function O8(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.values(e).some(n=>typeof n!="string"))&&Xe(`${t} must be a string map`);for(let[n,r]of Object.entries(e)){L8.has(n.toLowerCase())&&Xe(`${t}.${n} is reserved by HTTP transport`);try{k8(n),R8(n,r)}catch{Xe(`${t}.${n} is not a valid HTTP header`)}}return{...e}}function $E(e){(typeof e!="string"||e==="")&&Xe("config is required");let t=AL(e),n;try{n=DE(I8(t,"utf8"))}catch(o){throw o.code=o.code==="ENOENT"?"not_found":"invalid_argument",o}Object.keys(n).some(o=>!["service","connections"].includes(o))&&Xe("Unknown config table");let r=n.service;if(r!==void 0){(!r||typeof r!="object"||Array.isArray(r))&&Xe("[service] is required");for(let i of Object.keys(r))N8.has(i)||Xe(`unknown service field: ${i}`);(typeof r.endpoint!="string"||r.endpoint==="")&&Xe("service.endpoint is required");let o;try{o=new URL(r.endpoint)}catch{Xe("service.endpoint must be a URL")}["http:","https:"].includes(o.protocol)||Xe("service.endpoint must use http or https"),["localhost","127.0.0.1","[::1]","::1"].includes(o.hostname)||Xe("service.endpoint must be loopback"),(o.search||o.hash)&&Xe("service.endpoint cannot contain query or fragment")}let s=n.connections??{};(!s||typeof s!="object"||Array.isArray(s))&&Xe("[connections] must be a table");for(let[o,i]of Object.entries(s)){(!i||typeof i!="object"||Array.isArray(i))&&Xe(`connection ${o} must be a table`);for(let c of Object.keys(i))x8.has(c)||Xe(`unknown connection field: ${o}.${c}`);let a=i.idle_ms===void 0?3e5:i.idle_ms;if((!Number.isSafeInteger(a)||a<0||a>2147483647)&&Xe(`${o}.idle_ms must be a non-negative integer`),i.transport==="http"){for(let d of["command","args","cwd","env"])i[d]!==void 0&&Xe(`connection ${o}.${d} is only valid for stdio`);(typeof i.url!="string"||i.url==="")&&Xe(`connection ${o}.url is required`);let c;try{c=new URL(i.url)}catch{Xe(`connection ${o}.url must be a URL`)}["http:","https:"].includes(c.protocol)||Xe(`connection ${o}.url must use http or https`),(c.username||c.password)&&Xe(`connection ${o}.url cannot contain credentials`),c.hash&&Xe(`connection ${o}.url cannot contain a fragment`);let l=i.headers===void 0?{}:O8(i.headers,`${o}.headers`);i._normalized={transport:"http",url:i.url,headers:l,idle_ms:a}}else{i.transport!==void 0&&i.transport!=="stdio"&&Xe(`connection ${o} transport must be stdio or http`);for(let u of["url","headers"])i[u]!==void 0&&Xe(`connection ${o}.${u} is only valid for http`);(typeof i.command!="string"||i.command==="")&&Xe(`connection ${o} command is required`);let c=i.args===void 0?[]:C8(i.args,`${o}.args`),l=i.cwd===void 0?bL(t):typeof i.cwd=="string"&&i.cwd!==""?AL(bL(t),i.cwd):Xe(`${o}.cwd must be a path`),d=i.env??{};(!d||typeof d!="object"||Array.isArray(d)||Object.values(d).some(u=>typeof u!="string"))&&Xe(`${o}.env must be a string map`),i._normalized={transport:"stdio",command:i.command,args:c,cwd:l,env:{...d},idle_ms:a}}}return Object.freeze({configPath:t,service:r?{endpoint:r.endpoint}:void 0,connections:Object.freeze(Object.fromEntries(Object.entries(s).map(([o,i])=>[o,Object.freeze({name:o,...i._normalized})])))})}import{createServer as D8}from"http";import{Http2ServerRequest as RL,constants as $8}from"http2";import{Http2ServerRequest as ME}from"http2";import{Readable as IL}from"stream";import X8 from"crypto";var Xo=class extends Error{constructor(e,t){super(e,t),this.name="RequestError"}},M8=e=>e instanceof Xo?e:new Xo(e.message,{cause:e}),P8=global.Request,sl=class extends P8{constructor(e,t){typeof e=="object"&&la in e&&(e=e[la]()),typeof t?.body?.getReader<"u"&&(t.duplex??="half"),super(e,t)}},U8=e=>{let t=[],n=e.rawHeaders;for(let r=0;r<n.length;r+=2){let{[r]:s,[r+1]:o}=n;s.charCodeAt(0)!==58&&t.push([s,o])}return new Headers(t)},NL=Symbol("wrapBodyStream"),F8=(e,t,n,r,s)=>{let o={method:e,headers:n,signal:s.signal};if(e==="TRACE"){o.method="GET";let i=new sl(t,o);return Object.defineProperty(i,"method",{get(){return"TRACE"}}),i}if(!(e==="GET"||e==="HEAD"))if("rawBody"in r&&r.rawBody instanceof Buffer)o.body=new ReadableStream({start(i){i.enqueue(r.rawBody),i.close()}});else if(r[NL]){let i;o.body=new ReadableStream({async pull(a){try{i||=IL.toWeb(r).getReader();let{done:c,value:l}=await i.read();c?a.close():a.enqueue(l)}catch(c){a.error(c)}}})}else o.body=IL.toWeb(r);return new sl(t,o)},la=Symbol("getRequestCache"),xL=Symbol("requestCache"),Bf=Symbol("incomingKey"),Gf=Symbol("urlKey"),j8=Symbol("headersKey"),ca=Symbol("abortControllerKey"),q8=Symbol("getAbortController"),ol={get method(){return this[Bf].method||"GET"},get url(){return this[Gf]},get headers(){return this[j8]||=U8(this[Bf])},[q8](){return this[la](),this[ca]},[la](){return this[ca]||=new AbortController,this[xL]||=F8(this.method,this[Gf],this.headers,this[Bf],this[ca])}};["body","bodyUsed","cache","credentials","destination","integrity","mode","redirect","referrer","referrerPolicy","signal","keepalive"].forEach(e=>{Object.defineProperty(ol,e,{get(){return this[la]()[e]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach(e=>{Object.defineProperty(ol,e,{value:function(){return this[la]()[e]()}})});Object.defineProperty(ol,Symbol.for("nodejs.util.inspect.custom"),{value:function(e,t,n){let r={method:this.method,url:this.url,headers:this.headers,nativeRequest:this[xL]};return`Request (lightweight) ${n(r,{...t,depth:e==null?null:e-1})}`}});Object.setPrototypeOf(ol,sl.prototype);var H8=(e,t)=>{let n=Object.create(ol);n[Bf]=e;let r=e.url||"";if(r[0]!=="/"&&(r.startsWith("http://")||r.startsWith("https://"))){if(e instanceof ME)throw new Xo("Absolute URL for :path is not allowed in HTTP/2");try{let a=new URL(r);n[Gf]=a.href}catch(a){throw new Xo("Invalid absolute URL",{cause:a})}return n}let s=(e instanceof ME?e.authority:e.headers.host)||t;if(!s)throw new Xo("Missing host header");let o;if(e instanceof ME){if(o=e.scheme,!(o==="http"||o==="https"))throw new Xo("Unsupported scheme")}else o=e.socket&&e.socket.encrypted?"https":"http";let i=new URL(`${o}://${s}${r}`);if(i.hostname.length!==s.length&&i.hostname!==s.replace(/:\d+$/,""))throw new Xo("Invalid host header");return n[Gf]=i.href,n},UE=Symbol("responseCache"),aa=Symbol("getResponseCache"),Vo=Symbol("cache"),qE=global.Response,da=class LL{#t;#e;[aa](){return delete this[Vo],this[UE]||=new qE(this.#t,this.#e)}constructor(t,n){let r;if(this.#t=t,n instanceof LL){let s=n[UE];if(s){this.#e=s,this[aa]();return}else this.#e=n.#e,r=new Headers(n.#e.headers)}else this.#e=n;(typeof t=="string"||typeof t?.getReader<"u"||t instanceof Blob||t instanceof Uint8Array)&&(this[Vo]=[n?.status||200,t,r||n?.headers])}get headers(){let t=this[Vo];return t?(t[2]instanceof Headers||(t[2]=new Headers(t[2]||{"content-type":"text/plain; charset=UTF-8"})),t[2]):this[aa]().headers}get status(){return this[Vo]?.[0]??this[aa]().status}get ok(){let t=this.status;return t>=200&&t<300}};["body","bodyUsed","redirected","statusText","trailers","type","url"].forEach(e=>{Object.defineProperty(da.prototype,e,{get(){return this[aa]()[e]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach(e=>{Object.defineProperty(da.prototype,e,{value:function(){return this[aa]()[e]()}})});Object.defineProperty(da.prototype,Symbol.for("nodejs.util.inspect.custom"),{value:function(e,t,n){let r={status:this.status,headers:this.headers,ok:this.ok,nativeResponse:this[UE]};return`Response (lightweight) ${n(r,{...t,depth:e==null?null:e-1})}`}});Object.setPrototypeOf(da,qE);Object.setPrototypeOf(da.prototype,qE.prototype);async function W8(e){return Promise.race([e,Promise.resolve().then(()=>Promise.resolve(void 0))])}function CL(e,t,n){let r=a=>{e.cancel(a).catch(()=>{})};return t.on("close",r),t.on("error",r),(n??e.read()).then(i,s),e.closed.finally(()=>{t.off("close",r),t.off("error",r)});function s(a){a&&t.destroy(a)}function o(){e.read().then(i,s)}function i({done:a,value:c}){try{if(a)t.end();else if(!t.write(c))t.once("drain",o);else return e.read().then(i,s)}catch(l){s(l)}}}function B8(e,t){if(e.locked)throw new TypeError("ReadableStream is locked.");return t.destroyed?void 0:CL(e.getReader(),t)}var FE=e=>{let t={};e instanceof Headers||(e=new Headers(e??void 0));let n=[];for(let[r,s]of e)r==="set-cookie"?n.push(s):t[r]=s;return n.length>0&&(t["set-cookie"]=n),t["content-type"]??="text/plain; charset=UTF-8",t},G8="x-hono-already-sent";typeof global.crypto>"u"&&(global.crypto=X8);var HE=Symbol("outgoingEnded"),kL=Symbol("incomingDraining"),V8=500,J8=64*1024*1024,PE=e=>{let t=e;if(e.destroyed||t[kL])return;if(t[kL]=!0,e instanceof RL){try{e.stream?.close?.($8.NGHTTP2_NO_ERROR)}catch{}return}let n=0,r=()=>{clearTimeout(o),e.off("data",i),e.off("end",r),e.off("error",r)},s=()=>{r();let a=e.socket;a&&!a.destroyed&&a.destroySoon()},o=setTimeout(s,V8);o.unref?.();let i=a=>{n+=a.length,n>J8&&s()};e.on("data",i),e.on("end",r),e.on("error",r),e.resume()},Y8=()=>new Response(null,{status:400}),OL=e=>new Response(null,{status:e instanceof Error&&(e.name==="TimeoutError"||e.constructor.name==="TimeoutError")?504:500}),jE=(e,t)=>{let n=e instanceof Error?e:new Error("unknown error",{cause:e});n.code==="ERR_STREAM_PREMATURE_CLOSE"?console.info("The user aborted a request."):(console.error(e),t.headersSent||t.writeHead(500,{"Content-Type":"text/plain"}),t.end(`Error: ${n.message}`),t.destroy(n))},DL=e=>{"flushHeaders"in e&&e.writable&&e.flushHeaders()},$L=async(e,t)=>{let[n,r,s]=e[Vo],o=!1;if(!s)s={"content-type":"text/plain; charset=UTF-8"};else if(s instanceof Headers)o=s.has("content-length"),s=FE(s);else if(Array.isArray(s)){let i=new Headers(s);o=i.has("content-length"),s=FE(i)}else for(let i in s)if(i.length===14&&i.toLowerCase()==="content-length"){o=!0;break}o||(typeof r=="string"?s["Content-Length"]=Buffer.byteLength(r):r instanceof Uint8Array?s["Content-Length"]=r.byteLength:r instanceof Blob&&(s["Content-Length"]=r.size)),t.writeHead(n,s),typeof r=="string"||r instanceof Uint8Array?t.end(r):r instanceof Blob?t.end(new Uint8Array(await r.arrayBuffer())):(DL(t),await B8(r,t)?.catch(i=>jE(i,t))),t[HE]?.()},K8=e=>typeof e.then=="function",z8=async(e,t,n={})=>{if(K8(e))if(n.errorHandler)try{e=await e}catch(s){let o=await n.errorHandler(s);if(!o)return;e=o}else e=await e.catch(OL);if(Vo in e)return $L(e,t);let r=FE(e.headers);if(e.body){let s=e.body.getReader(),o=[],i=!1,a;if(r["transfer-encoding"]!=="chunked"){let c=2;for(let l=0;l<c;l++){a||=s.read();let d=await W8(a).catch(u=>{console.error(u),i=!0});if(!d){if(l===1){await new Promise(u=>setTimeout(u)),c=3;continue}break}if(a=void 0,d.value&&o.push(d.value),d.done){i=!0;break}}i&&!("content-length"in r)&&(r["content-length"]=o.reduce((l,d)=>l+d.length,0))}t.writeHead(e.status,r),o.forEach(c=>{t.write(c)}),i?t.end():(o.length===0&&DL(t),await CL(s,t,a))}else r[G8]||(t.writeHead(e.status,r),t.end());t[HE]?.()},Q8=(e,t={})=>{let n=t.autoCleanupIncoming??!0;return t.overrideGlobalObjects!==!1&&global.Request!==sl&&(Object.defineProperty(global,"Request",{value:sl}),Object.defineProperty(global,"Response",{value:da})),async(r,s)=>{let o,i;try{i=H8(r,t.hostname);let a=!n||r.method==="GET"||r.method==="HEAD";if(a||(r[NL]=!0,r.on("end",()=>{a=!0}),r instanceof RL&&(s[HE]=()=>{a||setTimeout(()=>{a||setTimeout(()=>{PE(r)})})}),s.on("finish",()=>{a||PE(r)})),s.on("close",()=>{i[ca]&&(r.errored?i[ca].abort(r.errored.toString()):s.writableFinished||i[ca].abort("Client connection prematurely closed.")),a||setTimeout(()=>{a||setTimeout(()=>{PE(r)})})}),o=e(i,{incoming:r,outgoing:s}),Vo in o)return $L(o,s)}catch(a){if(o)return jE(a,s);if(t.errorHandler){if(o=await t.errorHandler(i?a:M8(a)),!o)return}else i?o=OL(a):o=Y8()}try{return await z8(o,s,t)}catch(a){return jE(a,s)}}},Z8=e=>{let t=e.fetch,n=Q8(t,{hostname:e.hostname,overrideGlobalObjects:e.overrideGlobalObjects,autoCleanupIncoming:e.autoCleanupIncoming});return(e.createServer||D8)(e.serverOptions||{},n)},ML=(e,t)=>{let n=Z8(e);return n.listen(e?.port??3e3,e.hostname,()=>{let r=n.address();t&&t(r)}),n};var WE=(e,t,n)=>(r,s)=>{let o=-1;return i(0);async function i(a){if(a<=o)throw new Error("next() called multiple times");o=a;let c,l=!1,d;if(e[a]?(d=e[a][0][0],r.req.routeIndex=a):d=a===e.length&&s||void 0,d)try{c=await d(r,()=>i(a+1))}catch(u){if(u instanceof Error&&t)r.error=u,c=await t(u,r),l=!0;else throw u}else r.finalized===!1&&n&&(c=await n(r));return c&&(r.finalized===!1||l)&&(r.res=c),r}};var PL=Symbol();var UL=(e,t)=>new Response(e,{headers:{"Content-Type":t.replace(/^[^;]+/,r=>r.toLowerCase())}}).formData();var FL=32,e3=1e4,Xf=e=>"headers"in e,HL=async(e,t=Object.create(null))=>{let{all:n=!1,dot:r=!1}=t,i=(Xf(e)?e.headers:e.raw.headers).get("Content-Type")?.split(";")[0].trim().toLowerCase();return i==="multipart/form-data"||i==="application/x-www-form-urlencoded"?t3(e,{all:n,dot:r}):{}};async function t3(e,t){if(!Xf(e)&&e.bodyCache.formData)return jL(await e.bodyCache.formData,t);let n=Xf(e)?e.headers:e.raw.headers,r=await e.arrayBuffer(),s=UL(r,n.get("Content-Type")||"");Xf(e)||(e.bodyCache.formData=s);let o=await s;return o?jL(o,t):{}}function jL(e,t){let n=Object.create(null),r={count:0};return e.forEach((s,o)=>{t.all||o.endsWith("[]")?n3(n,o,s):n[o]=s}),t.dot&&Object.entries(n).forEach(([s,o])=>{s.includes(".")&&(r3(n,s,o,r),delete n[s])}),n}var n3=(e,t,n)=>{e[t]!==void 0?Array.isArray(e[t])?e[t].push(n):e[t]=[e[t],n]:t.endsWith("[]")?e[t]=[n]:e[t]=n},r3=(e,t,n,r)=>{if(/(?:^|\.)__proto__\./.test(t))return;let s=e,o=t.split(".",FL+2);o.length>FL+1&&qL(),o.forEach((i,a)=>{a===o.length-1?s[i]=n:((!s[i]||typeof s[i]!="object"||Array.isArray(s[i])||s[i]instanceof File)&&(r.count++>=e3&&qL(),s[i]=Object.create(null)),s=s[i])})},qL=()=>{throw new Error("Nesting limit exceeded")};var GE=e=>{let t=e.split("/");return t[0]===""&&t.shift(),t},WL=e=>{let{groups:t,path:n}=s3(e),r=GE(n);return o3(r,t)},s3=e=>{let t=[];return e=e.replace(/\{[^}]+\}/g,(n,r)=>{let s=`@${r}`;return t.push([s,n]),s}),{groups:t,path:e}},o3=(e,t)=>{for(let n=t.length-1;n>=0;n--){let[r]=t[n];for(let s=e.length-1;s>=0;s--)if(e[s].includes(r)){e[s]=e[s].replace(r,t[n][1]);break}}return e},Vf={},BL=(e,t)=>{if(e==="*")return"*";let n=e.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(n){let r=`${e}#${t}`;return Vf[r]||(n[2]?Vf[r]=t&&t[0]!==":"&&t[0]!=="*"?[r,n[1],new RegExp(`^${n[2]}(?=/${t})`)]:[e,n[1],new RegExp(`^${n[2]}$`)]:Vf[r]=[e,n[1],!0]),Vf[r]}return null},GL=(e,t)=>{try{return t(e)}catch{return e.replace(/(?:%[0-9A-Fa-f]{2})+/g,n=>{try{return t(n)}catch{return n}})}},i3=e=>GL(e,decodeURI),XE=e=>{let t=e.url,n=t.indexOf("/",t.indexOf(":")+4),r=n;for(;r<t.length;r++){let s=t.charCodeAt(r);if(s===37){let o=t.indexOf("?",r),i=t.indexOf("#",r),a=o===-1?i===-1?void 0:i:i===-1?o:Math.min(o,i),c=t.slice(n,a);return i3(c.includes("%25")?c.replace(/%25/g,"%2525"):c)}else if(s===63||s===35)break}return t.slice(n,r)};var XL=e=>{let t=XE(e);return t.length>1&&t.at(-1)==="/"?t.slice(0,-1):t},Xs=(e,t,...n)=>(n.length&&(t=Xs(t,...n)),`${e?.[0]==="/"?"":"/"}${e}${t==="/"?"":`${e?.at(-1)==="/"?"":"/"}${t?.[0]==="/"?t.slice(1):t}`}`),Jf=e=>{if(e.charCodeAt(e.length-1)!==63||!e.includes(":"))return null;let t=e.split("/"),n=[],r="";return t.forEach(s=>{if(s!==""&&!/\:/.test(s))r+="/"+s;else if(/\:/.test(s))if(s.charCodeAt(s.length-1)===63){n.length===0&&r===""?n.push("/"):n.push(r);let o=s.slice(0,-1);r+="/"+o,n.push(r)}else r+="/"+s}),n.filter((s,o,i)=>i.indexOf(s)===o)},Yf=e=>e.indexOf("%")!==-1?GL(e,a3):e,BE=e=>(e.indexOf("+")!==-1&&(e=e.replace(/\+/g," ")),Yf(e)),VL=(e,t,n)=>{let r=e.indexOf("#",8);r!==-1&&(e=e.slice(0,r));let s;if(!n&&t&&t.indexOf("%")===-1&&t.indexOf("+")===-1){let a=e.indexOf("?",8);if(a===-1)return;for(e.startsWith(t,a+1)||(a=e.indexOf(`&${t}`,a+1));a!==-1;){let c=e.charCodeAt(a+t.length+1);if(c===61){let l=a+t.length+2,d=e.indexOf("&",l);return BE(e.slice(l,d===-1?void 0:d))}else if(c==38||isNaN(c))return"";a=e.indexOf(`&${t}`,a+1)}if(s=/[%+]/.test(e),!s)return}let o=Object.create(null);s??=/[%+]/.test(e);let i=e.indexOf("?",8);for(;i!==-1;){let a=e.indexOf("&",i+1),c=e.indexOf("=",i);c>a&&a!==-1&&(c=-1);let l=e.slice(i+1,c===-1?a===-1?void 0:a:c);if(s&&(l=BE(l)),i=a,l==="")continue;let d;c===-1?d="":(d=e.slice(c+1,a===-1?void 0:a),s&&(d=BE(d))),n?(o[l]&&Array.isArray(o[l])||(o[l]=[]),o[l].push(d)):o[l]??=d}return t?o[t]:o},JL=VL,YL=(e,t)=>VL(e,t,!0),a3=decodeURIComponent;var KL=class{raw;#t;#e;routeIndex=0;path;bodyCache={};constructor(e,t="/",n=[[]]){this.raw=e,this.path=t,this.#e=n}param(e){return e?this.#n(e):this.#o()}#n(e){let t=this.#e[0][this.routeIndex]?.[1][e],n=this.#r(t);return n&&Yf(n)}#o(){let e={},t=Object.keys(this.#e[0][this.routeIndex]?.[1]??{});for(let n of t){let r=this.#r(this.#e[0][this.routeIndex][1][n]);r!==void 0&&(e[n]=Yf(r))}return e}#r(e){return this.#e[1]?this.#e[1][e]:e}query(e){return JL(this.url,e)}queries(e){return YL(this.url,e)}header(e){if(e)return this.raw.headers.get(e)??void 0;let t=Object.create(null);return this.raw.headers.forEach((n,r)=>{t[r]=n}),t}async parseBody(e){return HL(this,e)}#s=e=>{let{bodyCache:t,raw:n}=this,r=t[e];if(r)return r;for(let s in t)return t[s].then(o=>(s==="json"&&(o=JSON.stringify(o)),new Response(o)[e]()));return t[e]=n[e]()};json(){return this.#s("text").then(e=>JSON.parse(e))}text(){return this.#s("text")}arrayBuffer(){return this.#s("arrayBuffer")}bytes(){return this.#s("arrayBuffer").then(e=>new Uint8Array(e))}blob(){return this.#s("blob")}formData(){return this.#s("formData")}addValidatedData(e,t){(this.#t??={})[e]=t}valid(e){return this.#t?.[e]}get url(){return this.raw.url}get method(){return this.raw.method}get[PL](){return this.#e}get matchedRoutes(){return this.#e[0].map(([[,e]])=>e)}get routePath(){return this.#e[0].map(([[,e]])=>e)[this.routeIndex].path}};var zL={Stringify:1,BeforeStream:2,Stream:3},c3=(e,t)=>{let n=new String(e);return n.isEscaped=!0,n.callbacks=t,n};var VE=async(e,t,n,r,s)=>{typeof e=="object"&&!(e instanceof String)&&(e instanceof Promise||(e=e.toString()),e instanceof Promise&&(e=await e));let o=e.callbacks;if(!o?.length)return Promise.resolve(e);s?s[0]+=e:s=[e];let i=Promise.all(o.map(a=>a({phase:t,buffer:s,context:r}))).then(a=>Promise.all(a.filter(Boolean).map(c=>VE(c,t,!1,r,s))).then(()=>s[0]));return n?c3(await i,o):i};var l3="text/plain; charset=UTF-8",JE=(e,t)=>({"Content-Type":e,...t}),il=(e,t)=>new Response(e,t),YE=class{#t;#e;env={};#n;finalized=!1;error;#o;#r;#s;#d;#c;#l;#a;#u;#f;constructor(e,t){this.#t=e,t&&(this.#r=t.executionCtx,this.env=t.env,this.#l=t.notFoundHandler,this.#f=t.path,this.#u=t.matchResult)}get req(){return this.#e??=new KL(this.#t,this.#f,this.#u),this.#e}get event(){if(this.#r&&"respondWith"in this.#r)return this.#r;throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#r)return this.#r;throw Error("This context has no ExecutionContext")}get res(){return this.#s||=il(null,{headers:this.#a??=new Headers})}set res(e){if(this.#s&&e){e=il(e.body,e);for(let[t,n]of this.#s.headers.entries())if(t!=="content-type")if(t==="set-cookie"){let r=this.#s.headers.getSetCookie();e.headers.delete("set-cookie");for(let s of r)e.headers.append("set-cookie",s)}else e.headers.set(t,n)}this.#s=e,this.finalized=!0}render=(...e)=>(this.#c??=t=>this.html(t),this.#c(...e));setLayout=e=>this.#d=e;getLayout=()=>this.#d;setRenderer=e=>{this.#c=e};header=(e,t,n)=>{this.finalized&&(this.#s=il(this.#s.body,this.#s));let r=this.#s?this.#s.headers:this.#a??=new Headers;t===void 0?r.delete(e):n?.append?r.append(e,t):r.set(e,t)};status=e=>{this.#o=e};set=(e,t)=>{this.#n??=new Map,this.#n.set(e,t)};get=e=>this.#n?this.#n.get(e):void 0;get var(){return this.#n?Object.fromEntries(this.#n):{}}#i(e,t,n){let r=this.#s?new Headers(this.#s.headers):this.#a;if(typeof t=="object"&&t.headers){r??=new Headers;for(let[o,i]of new Headers(t.headers))o==="set-cookie"?r.append(o,i):r.set(o,i)}if(n){if(!r){let o=0;for(let i in n)if(++o>1||typeof n[i]!="string"){r=new Headers;break}}if(r)for(let o in n){let i=n[o];if(typeof i=="string")r.set(o,i);else{r.delete(o);for(let a of i)r.append(o,a)}}}let s=typeof t=="number"?t:t?.status??this.#o;return il(e,{status:s,headers:r??n})}newResponse=(...e)=>this.#i(...e);body=(e,t,n)=>this.#i(e,t,n);text=(e,t,n)=>!this.#a&&!this.#o&&!t&&!n&&!this.finalized?new Response(e):this.#i(e,t,JE(l3,n));json=(e,t,n)=>this.#i(JSON.stringify(e),t,JE("application/json",n));html=(e,t,n)=>{let r=s=>this.#i(s,t,JE("text/html; charset=UTF-8",n));return typeof e=="object"?VE(e,zL.Stringify,!1,{}).then(r):r(e)};redirect=(e,t)=>{let n=String(e);return this.header("Location",/[^\x00-\xFF]/.test(n)?encodeURI(n):n),this.newResponse(null,t??302)};notFound=()=>(this.#l??=()=>il(),this.#l(this))};var $t="ALL",QL="all",ZL=["get","post","put","delete","options","patch","query"],Kf="Can not add a route since the matcher is already built.",zf=class extends Error{};var e0="__COMPOSED_HANDLER";var d3=e=>e.text("404 Not Found",404),t0=(e,t)=>{if("getResponse"in e){let n=e.getResponse();return t.newResponse(n.body,n)}return console.error(e),t.text("Internal Server Error",500)},n0=class r0{get;post;put;delete;options;patch;query;all;on;use;router;getPath;_basePath="/";#t="/";routes=[];constructor(t={}){[...ZL,QL].forEach(o=>{this[o]=(i,...a)=>(typeof i=="string"?this.#t=i:this.#o(o,this.#t,i),a.forEach(c=>{this.#o(o,this.#t,c)}),this)}),this.on=(o,i,...a)=>{for(let c of[i].flat()){this.#t=c;for(let l of[o].flat())a.map(d=>{this.#o(l.toUpperCase(),this.#t,d)})}return this},this.use=(o,...i)=>(typeof o=="string"?this.#t=o:(this.#t="*",i.unshift(o)),i.forEach(a=>{this.#o($t,this.#t,a)}),this);let{strict:r,...s}=t;Object.assign(this,s),this.getPath=r??!0?t.getPath??XE:XL}#e(){let t=new r0({router:this.router,getPath:this.getPath});return t.errorHandler=this.errorHandler,t.#n=this.#n,t.routes=this.routes,t}#n=d3;errorHandler=t0;route(t,n){let r=this.basePath(t);return n.routes.map(s=>{let o;n.errorHandler===t0?o=s.handler:(o=async(i,a)=>(await WE([],n.errorHandler)(i,()=>s.handler(i,a))).res,o[e0]=s.handler),r.#o(s.method,s.path,o,s.basePath)}),this}basePath(t){let n=this.#e();return n._basePath=Xs(this._basePath,t),n}onError=t=>(this.errorHandler=t,this);notFound=t=>(this.#n=t,this);mount(t,n,r){let s,o;r&&(typeof r=="function"?o=r:(o=r.optionHandler,r.replaceRequest===!1?s=c=>c:s=r.replaceRequest));let i=o?c=>{let l=o(c);return Array.isArray(l)?l:[l]}:c=>{let l;try{l=c.executionCtx}catch{}return[c.env,l]};s||=(()=>{let c=Xs(this._basePath,t),l=c==="/"?0:c.length;return d=>{let u=new URL(d.url);return u.pathname=this.getPath(d).slice(l)||"/",new Request(u,d)}})();let a=async(c,l)=>{let d=await n(s(c.req.raw),...i(c));if(d)return d;await l()};return this.#o($t,Xs(t,"*"),a),this}#o(t,n,r,s){t=t.toUpperCase(),n=Xs(this._basePath,n);let o={basePath:s!==void 0?Xs(this._basePath,s):this._basePath,path:n,method:t,handler:r};this.router.add(t,n,[r,o]),this.routes.push(o)}#r(t,n){if(t instanceof Error)return this.errorHandler(t,n);throw t}#s(t,n,r,s){if(s==="HEAD")return(async()=>new Response(null,await this.#s(t,n,r,"GET")))();let o=this.getPath(t,{env:r}),i=this.router.match(s,o),a=new YE(t,{path:o,matchResult:i,env:r,executionCtx:n,notFoundHandler:this.#n});if(i[0].length===1){let l;try{l=i[0][0][0][0](a,async()=>{a.res=await this.#n(a)})}catch(d){return this.#r(d,a)}return l instanceof Promise?l.then(d=>d||(a.finalized?a.res:this.#n(a))).catch(d=>this.#r(d,a)):l??this.#n(a)}let c=WE(i[0],this.errorHandler,this.#n);return(async()=>{try{let l=await c(a);if(!l.finalized)throw new Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return l.res}catch(l){return this.#r(l,a)}})()}fetch=(t,...n)=>this.#s(t,n[1],n[0],t.method);request=(t,n,r,s)=>t instanceof Request?this.fetch(n?new Request(t,n):t,r,s):(t=t.toString(),this.fetch(new Request(/^https?:\/\//.test(t)?t:`http://localhost${Xs("/",t)}`,n),r,s));fire=()=>{addEventListener("fetch",t=>{t.respondWith(this.#s(t.request,t,void 0,t.request.method))})}};var Rt=()=>Object.create(null);var Qf=[];function KE(e,t){let n=this.buildAllMatchers(),r=(s,o)=>{let i=n[s]||n[$t],a=i[2][o];if(a)return a;let c=o.match(i[0]);if(!c)return[[],Qf];let l=c.indexOf("",1);return[i[1][l],c]};return this.match=r,r(e,t)}var ua="[^/]+",Js=".*",zr="(?:|/.*)",Vs=Symbol(),s0=new Set(".\\+*[^]$()");function u3(e,t){return e.length===1?t.length===1?e<t?-1:1:-1:t.length===1?1:e===Js||e===zr?t===zr?-1:1:t===Js||t===zr?-1:e===ua?1:t===ua?-1:e.length===t.length?e<t?-1:1:t.length-e.length}var o0=class zE{#t;#e;#n=Rt();insert(t,n,r,s,o){let i=this;for(let a=0,c=t.length;a<c;a++){let l=t[a],d=l.length===1?l==="*"?a===c-1?["","",Js]:["","",ua]:null:l==="/*"?["","",zr]:l.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),u;if(d){let f=d[1],m=d[2]||ua;if(f&&d[2]&&(m===".*"||(m=m.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(m))||m.length===1&&s0.has(m)))throw Vs;if(u=i.#n[m],!u){if(m!==Js&&m!==zr){for(let p in i.#n)if((m.length>1||p.length>1)&&p!==Js&&p!==zr)throw Vs}u=i.#n[m]=new zE}f!==""&&(u.#e??=s.varIndex++,r.push([f,u.#e]))}else if(u=i.#n[l],!u){for(let f in i.#n)if(f.length>1&&f!==Js&&f!==zr)throw Vs;u=i.#n[l]=new zE}i=u}if(i.#t!==void 0)throw Vs;i.#t=o?-1:n}buildRegExpStr(){let n=Object.keys(this.#n).sort(u3).map(r=>{let s=this.#n[r],o=s.buildRegExpStr();return o===""?"":(typeof s.#e=="number"?`(${r})@${s.#e}`:s0.has(r)?`\\${r}`:r)+o}).filter(Boolean);return typeof this.#t=="number"&&this.#t!==-1&&n.unshift(`#${this.#t}`),n.length===0?"":n.length===1?n[0]:"(?:"+n.join("|")+")"}};var QE=class{#t={varIndex:0};#e=new o0;#n=0;paths=Rt();insert(e,t){if(t){this.#e.insert(e.split(""),0,[],this.#t,!0);return}let n=[],r=[],s=e;for(let i=0;;){let a=!1;if(s=s.replace(/\{[^}]+\}/g,c=>{let l=`@\\${i}`;return r[i]=[l,c],i++,a=!0,l}),!a)break}let o=s.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let i=r.length-1;i>=0;i--){let[a]=r[i];for(let c=o.length-1;c>=0;c--)if(o[c].indexOf(a)!==-1){o[c]=o[c].replace(a,r[i][1]);break}}this.#e.insert(o,this.#n,n,this.#t,!1),this.paths[e]=[this.#n++,n]}buildRegExp(){let e=this.#e.buildRegExpStr();if(e==="")return[/^$/,[],[]];let t=0,n=[],r=[];return e=e.replace(/#(\d+)|@(\d+)|\.\*\$/g,(s,o,i)=>o!==void 0?(n[++t]=Number(o),"$()"):(i!==void 0&&(r[Number(i)]=++t),"")),[new RegExp(`^${e}`),n,r]}};var i0=Rt();function a0(e){return i0[e]??=new RegExp(`^${e.replace(/\/:[^/{}]+(?:\{\[\^\/]\+})?(?=[/{]|$)|\/?\*$|([.\\+*[^\]$()?{}|])/g,(t,n)=>n?`\\${n}`:t==="/*"?zr:t==="*"?Js:`/:${ua}`)}$`)}function Zf(e,t){for(let n of Object.keys(e).sort((r,s)=>s.length-r.length))if(a0(n).test(t))return[...e[n]]}var em=class{name="RegExpRouter";#t;#e;#n;constructor(){this.#t={[$t]:Rt()},this.#e={[$t]:Rt()},this.#n={[$t]:new QE}}#o(e,t){try{this.#n[e].insert(t,!/\*|\/:/.test(t))}catch(n){throw n===Vs?new zf(t):n}}add(e,t,n){let r=this.#t,s=this.#e;if(!r)throw new Error(Kf);if(!r[e]){this.#n[e]=new QE;for(let a of[r,s]){a[e]=Rt();for(let c in a[$t])a[e][c]=[...a[$t][c]],this.#o(e,c)}}t==="/*"&&(t="*");let o=e===$t?Object.keys(r):[e];if(/\*$/.test(t)){let a=a0(t);for(let c of o)r[c][t]||(this.#o(c,t),r[c][t]=Zf(r[c],t)||Zf(r[$t],t)||[]);for(let c of[r,s])for(let l of o)for(let d in c[l])a.test(d)&&c[l][d].push([n,t]);return}let i=Jf(t)||[t];for(let a of i)for(let c of o)s[c][a]||(this.#o(c,a),s[c][a]=Zf(r[c],a)||Zf(r[$t],a)||[]),s[c][a].push([n,a])}match=KE;buildAllMatchers(){let e=Rt();for(let t of Object.keys(this.#e))e[t]=this.#r(t);return this.#t=this.#e=this.#n=void 0,i0=Rt(),e}#r(e){let t=this.#t[e],n=this.#e[e],r=this.#n[e],s=Rt(),o=[],[i,a,c]=r.buildRegExp();for(let l of[t,n])for(let d in l){let u=l[d],f=r.paths[d];if(!f){s[d]=[u.map(([m])=>[m,Rt()]),Qf];continue}o[f[0]]=u.map(([m,p])=>[m,r.paths[p][1].reduceRight((h,[_],g)=>(h[_]=c[f[1][g][1]],h),Rt())])}return[i,a.map(l=>o[l]),s]}};var ZE=class{name="SmartRouter";#t=[];#e=[];constructor(e){this.#t=e.routers}add(e,t,n){if(!this.#e)throw new Error(Kf);this.#e.push([e,t,n])}match(e,t){if(!this.#e)throw new Error("Fatal error");let n=this.#t,r=this.#e,s=n.length,o=0,i;for(;o<s;o++){let a=n[o];try{for(let c=0,l=r.length;c<l;c++)a.add(...r[c]);i=a.match(e,t)}catch(c){if(c instanceof zf)continue;throw c}this.match=a.match.bind(a),this.#t=[a],this.#e=void 0;break}if(o===s)throw new Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,i}get activeRouter(){if(this.#e||this.#t.length!==1)throw new Error("No active router has been determined yet.");return this.#t[0]}};var ey=Rt(),f3=0,c0=class l0{#t=[];#e=Rt();#n=[];#o;#r=ey;insert(t,n,r){let s=this,o=WL(n),i=new Set,a=0;for(let c of o){let l=o[++a],d=BL(c,l)||(l===void 0&&c&&c.indexOf("*")===c.length-1?c:null),u=Array.isArray(d),f=u?d[0]:d||c,m=s.#e[f]||=new l0;d&&!m.#o&&(m.#o=d,s.#n.push(m)),s=m,u&&i.add(d[1])}s.#t.push({[t]:{handler:r,possibleKeys:[...i],score:++f3}})}#s(t,n,r,s,o){for(let i=0,a=n.#t.length;i<a;i++){let c=n.#t[i],l=c[r]||c[$t];if(l){l.params=Rt(),t.push(l);for(let d=0,u=l.possibleKeys.length;d<u;d++){let f=l.possibleKeys[d];l.params[f]=o?.[f]&&!d?o[f]:s[f]??o?.[f]}}}}search(t,n){let r=[];this.#r=ey;let o=[this],i=GE(n),a=[],c=i.length,l=null;for(let d=0;d<c;d++){let u=i[d],f=d===c-1,m=[];for(let h=0,_=o.length;h<_;h++){let g=o[h],w=g.#e[u];w&&(w.#r=g.#r,f?(w.#e["*"]&&this.#s(r,w.#e["*"],t,g.#r),this.#s(r,w,t,g.#r)):m.push(w));for(let y of g.#n){let E=y.#o,T=g.#r===ey?{}:{...g.#r};if(typeof E=="string"){(E==="*"||u.startsWith(E.slice(0,-1)))&&(this.#s(r,y,t,g.#r),E==="*"&&(y.#r=T,m.push(y)));continue}let[,b,A]=E;if(!(!u&&A===!0)){if(A!==!0){if(!l){l=[];let L=n[0]==="/"?1:0;for(let N=0;N<c;N++)l[N]=L,L+=i[N].length+1}let I=n.slice(l[d]),R=A.exec(I);if(R){T[b]=R[0],this.#s(r,y,t,g.#r,T),R[0].length===I.length&&y.#e["*"]&&this.#s(r,y.#e["*"],t,g.#r,T);for(let L in y.#e){y.#r=T;let N=R[0].match(/\//g)?.length??0;(a[N]||=[]).push(y);break}continue}}(A===!0||A.test(u))&&(T[b]=u,f?(this.#s(r,y,t,T,g.#r),y.#e["*"]&&this.#s(r,y.#e["*"],t,T,g.#r)):(y.#r=T,m.push(y)))}}}let p=a.shift();o=p?m.concat(p):m}return r[1]&&r.sort((d,u)=>d.score-u.score),[r.map(({handler:d,params:u})=>[d,u])]}};var ty=class{name="TrieRouter";#t=new c0;add(e,t,n){for(let r of Jf(t)||[t])this.#t.insert(e,r,n)}match(e,t){return this.#t.search(e,t)}};var Jo=class extends n0{constructor(e={}){super(e),this.router=e.router??new ZE({routers:[new em,new ty]})}};import{join as m3}from"node:path";function p3(e){return e||(process.env.LMBEE_TEAMS_CONF?process.env.LMBEE_TEAMS_CONF:m3(process.cwd(),"teams.conf"))}function h3(e,t){let n=process.env.LMBEE_TEAM_NAME;if(n===void 0)return;let r=t.find(s=>s.name===n);if(!(r===void 0||!K(r)))try{hv(e.db,n,new Date().toISOString())}catch{}}function tm(e={}){let t=ld(e.dbPath,{readOnly:e.readOnly??!1}),n=p3(e.teamsConfPath),r=_o(t.db,n);return e.readOnly||h3(t,r),{db:t,teamsConfPath:n,teams:r}}import{existsSync as qZ,readFileSync as HZ,statSync as WZ}from"node:fs";import{execFile as _3}from"node:child_process";import{promisify as g3}from"node:util";var nm=g3(_3),cl=3,al="auto_nudge_redirect:",ny=3,ry=5*60*6e4;function Un(e,t){let n=e.prepare("SELECT v FROM kv WHERE k = ?").get(al+t);if(n===void 0)return null;try{let r=JSON.parse(n.v);return typeof r.companionTeam!="string"||r.companionTeam.length===0?null:{companionTeam:r.companionTeam,workerAlias:typeof r.workerAlias=="string"&&r.workerAlias.length>0?r.workerAlias:"Worker",commitThreshold:typeof r.commitThreshold=="number"&&r.commitThreshold>0?r.commitThreshold:ny,hoursThresholdMs:typeof r.hoursThresholdMs=="number"&&r.hoursThresholdMs>0?r.hoursThresholdMs:ry,shiftStartedTs:typeof r.shiftStartedTs=="string"?r.shiftStartedTs:null,shiftStartedSha:typeof r.shiftStartedSha=="string"?r.shiftStartedSha:null,turnsDispatched:typeof r.turnsDispatched=="number"&&r.turnsDispatched>=0?r.turnsDispatched:0,lastReviewedTurn:typeof r.lastReviewedTurn=="number"&&r.lastReviewedTurn>=0?r.lastReviewedTurn:0}}catch{return null}}function sy(e){return e.prepare("SELECT k FROM kv WHERE k LIKE ?").all(al+"%").map(n=>n.k.slice(al.length))}function rm(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(al+t,JSON.stringify(n))}function d0(e,t){e.prepare("DELETE FROM kv WHERE k = ?").run(al+t)}async function u0(e,t){try{let{stdout:n}=await t("git",["-C",e,"rev-parse","HEAD"],{timeout:1e4});return n.trim()||null}catch{return null}}async function E3(e,t,n){try{let{stdout:r}=await n("git",["-C",e,"rev-list","--count",`${t}..HEAD`],{timeout:1e4}),s=Number.parseInt(r.trim(),10);return Number.isNaN(s)?null:s}catch{return null}}async function f0(e,t,n,r,s,o=nm){let i=n.shiftStartedTs!==null,a=i?n.shiftStartedSha:await u0(r,o);rm(e,t,{...n,turnsDispatched:n.turnsDispatched+1,shiftStartedTs:i?n.shiftStartedTs:s,shiftStartedSha:a})}async function m0(e,t,n=Date.now(),r=nm){let s=[];for(let o of sy(e)){let i=Un(e,o);if(i===null||i.shiftStartedTs===null)continue;let a=t.get(o);if(a===void 0)continue;let c=(n-Date.parse(i.shiftStartedTs))/(60*6e4),l=i.shiftStartedSha!==null?await E3(a,i.shiftStartedSha,r):null,d=i.turnsDispatched<=cl&&i.turnsDispatched>i.lastReviewedTurn,u=c*60*6e4>=i.hoursThresholdMs,f=l!==null&&l>=i.commitThreshold;(d||u||f)&&s.push({team:o,companionTeam:i.companionTeam,workerAlias:i.workerAlias,commitCount:l,hoursElapsed:c,shiftStartedTs:i.shiftStartedTs,shiftStartedSha:i.shiftStartedSha,isRampUp:d,turnNumber:i.turnsDispatched})}return s}async function p0(e,t,n,r,s=nm){let o=Un(e,t);if(o===null)return;let i=await u0(n,s);rm(e,t,{...o,shiftStartedTs:r,shiftStartedSha:i,lastReviewedTurn:o.turnsDispatched})}async function h0(e,t,n=nm){let r=e.hoursElapsed.toFixed(1),s=e.commitCount===null?"unknown (git check failed)":String(e.commitCount),o=null;if(e.shiftStartedSha!==null)try{let{stdout:a}=await n("git",["-C",t,"log","--oneline",`${e.shiftStartedSha}..HEAD`],{timeout:1e4});o=a.trim()}catch{o=null}let i=o!==null&&o.length>0?`
2047
+ `:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":me.x("unrecognised escape sequence",e),a=e.p+1,c=0);else n!==32&&n!==9&&(c===2&&me.x("invalid escape: only line-ending whitespace may be escaped",e,a),c=!s&&n===92?1:0,a=e.p);me.x("unfinished string",e,t)}var v8=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,tl=class e extends Date{#t=!1;#e=!1;#n=null;constructor(t,n,r){let s=!0,o=!0,i="Z",a;if(typeof t=="string")if(n)e:{if(n<3){if(+t.slice(11,13)>23){t="";break e}n===2?(i=null,t+="Z"):(a=t.charCodeAt(t.length-1))!==90&&a!==122&&(i=t.slice(t.length-6)),r&&(t=t.slice(0,10)+"T"+t.slice(11))}else n===4&&(t=+t.slice(0,2)>23?"":`0000-01-01T${t}Z`);s=n!==4,o=n!==3}else{let c=t.match(v8);c?(c[1]||(s=!1,t=`0000-01-01T${t}`),o=!!c[2],o&&t[10]===" "&&(t=t.replace(" ","T")),c[2]&&+c[2]>23?t="":(i=c[3]||null,!i&&o&&(t+="Z"))):t=""}super(t),isNaN(this.getTime())||(this.#t=s,this.#e=o,this.#n=i)}isDateTime(){return this.#t&&this.#e}isLocal(){return!this.#t||!this.#e||!this.#n}isDate(){return this.#t&&!this.#e}isTime(){return this.#e&&!this.#t}isValid(){return this.#t||this.#e}toISOString(){let t=super.toISOString();if(this.isDate())return t.slice(0,10);if(this.isTime())return t.slice(11,23);if(this.#n===null)return t.slice(0,-1);if(this.#n==="Z"||this.#n==="z")return t;let n=+this.#n.slice(1,3)*60+ +this.#n.slice(4,6);return n=this.#n[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#n}static wrapAsOffsetDateTime(t,n="Z"){let r=new e(t);return r.#n=n,r}static wrapAsLocalDateTime(t){let n=new e(t);return n.#n=null,n}static wrapAsLocalDate(t){let n=new e(t);return n.#e=!1,n.#n=null,n}static wrapAsLocalTime(t){let n=new e(t);return n.#t=!1,n.#n=null,n}};function kn(e,t=10){return t===16?e>47&&e<58||e>64&&e<71||e>96&&e<103:e>47&&e<48+t}function OE(e,t){return e===32||e===9||e===10||e===13||t&&(e===t||e===44)||e===35}function rl(e,t){let n=e.p,r=e.s.charCodeAt(e.p);if(r===91||r===123){e.d--||me.x("document contains excessively nested structures. aborting.",e);let s=r===91?TL(e):wL(e);return e.d++,s}return r===34||r===39?qf(e):r===116?((e.s.charCodeAt(++e.p)!==114||e.s.charCodeAt(++e.p)!==117||e.s.charCodeAt(++e.p)!==101)&&me.x("invalid value",e,n),e.p++,!0):r===102?((e.s.charCodeAt(++e.p)!==97||e.s.charCodeAt(++e.p)!==108||e.s.charCodeAt(++e.p)!==115||e.s.charCodeAt(++e.p)!==101)&&me.x("invalid value",e,n),e.p++,!1):r===43||r===45?Hf(e,e.p,e.s.charCodeAt(++e.p),44-r,t):e.s.charCodeAt(e.p+4)===45&&e.s.charCodeAt(e.p+7)===45?S8(e,r,t):e.s.charCodeAt(e.p+2)===58?b8(e,r,t):Hf(e,e.p,r,0,t)}function Hf(e,t,n,r,s){let o=n,i=0,a=!1;if(o===105)return(e.s.charCodeAt(++e.p)!==110||e.s.charCodeAt(++e.p)!==102)&&me.x("invalid value",e,t),e.p++,(r||1)/0;if(o===110)return(e.s.charCodeAt(++e.p)!==97||e.s.charCodeAt(++e.p)!==110)&&me.x("invalid value",e,t),e.p++,NaN;if(o===48){if(++e.p>=e.s.length||OE(o=e.s.charCodeAt(e.p),s))return e.bi===!0?0n:0;if(!r){if(o===120)return CE(e,t,16,s);if(o===98)return CE(e,t,2,s);if(o===111)return CE(e,t,8,s)}o===46?i=2:o===101||o===69?i=4:me.x("illegal leading zero",e,t)}else kn(o)||me.x("invalid value",e,t);for(;++e.p<e.s.length&&(o=e.s.charCodeAt(e.p),!OE(o,s));)i||(i=1),o===95?(i&1||me.x("illegal underscore",e),i+=11,a=!0):i===1&&o===46?i=2:(i===1||i===3)&&(o===101||o===69)?i=4:i===4&&(o===43||o===45)||(kn(o)?i>9?i-=11:i&1||i++:me.x("illegal character in numeric literal",e));if(!i){let l=(n-48)*(r||1);return e.bi===!0?BigInt(l):l}i&1||me.x("unfinished numeric value",e,t);let c=e.s.slice(t,e.p);return a&&(c=c.replaceAll("_","")),i>1?parseFloat(c):yL(e,c,10,t)}function CE(e,t,n,r){let s,o=1;for(;++e.p<e.s.length&&(s=e.s.charCodeAt(e.p),!OE(s,r));)s===95?(o&1&&me.x("illegal underscore",e),o=3):kn(s,n)?o&1&&o--:me.x("illegal character in numeric literal",e);o&1&&me.x("unfinished numeric value",e);let i=e.s.slice(t+2,e.p);return o&&(i=i.replaceAll("_","")),yL(e,i,n,t)}function yL(e,t,n,r){if(e.bi!==!0)e:{let s=parseInt(t,n);if(!Number.isSafeInteger(s)){if(e.bi)break e;me.x("integer value cannot be represented losslessly",e,r)}return s}return BigInt(n===10?t:(n===2?"0b":n===8?"0o":"0x")+t)}function S8(e,t,n){let r=e.p++,s;if(!kn(t)||!kn(e.s.charCodeAt(e.p++))||!kn(e.s.charCodeAt(e.p++))||!kn(e.s.charCodeAt(e.p++)))return Hf(e,e.p=r,t,0,n);if(e.p+=5,kn(e.s.charCodeAt(e.p++))||me.x("invalid date-time: date part is malformed",e,r),e.p>=e.s.length||((t=e.s.charCodeAt(e.p))!==32||(s=!0,!kn(e.s.charCodeAt(e.p+1))))&&t!==84&&t!==116){let i=e.s.slice(r,e.p);return nl(e,i,3,!1,r)}if(e.s.charCodeAt(e.p+=3)!==58&&me.x("invalid date-time: time part is malformed",e,r),e.s.charCodeAt(e.p+=3)===58&&(e.p+=3),e.s.charCodeAt(e.p)===46)for(;kn(e.s.charCodeAt(++e.p)););if(t=e.s.charCodeAt(e.p)){if(t===90||t===122){let i=e.s.slice(r,++e.p);return nl(e,i,1,s,r,"[+00:00]")}if(t===43||t===45){let i=e.s.slice(r,e.p+=6);return nl(e,i,1,s,r,!e.ld&&"["+e.s.slice(e.p-6,e.p)+"]")}}let o=e.s.slice(r,e.p);return nl(e,o,2,s,r)}function b8(e,t,n){let r=e.p;if(!kn(t)||!kn(e.s.charCodeAt(++e.p)))return Hf(e,--e.p,t,0,n);if(e.s.charCodeAt(e.p+=4)===58&&(e.p+=3),e.s.charCodeAt(e.p)===46)for(;kn(e.s.charCodeAt(++e.p)););let s=e.s.slice(r,e.p);return nl(e,s,4,!1,r)}function nl(e,t,n,r,s,o){if(e.ld){let i=new tl(t,n,r);return i.isValid()||me.x("invalid date",e,s),i}try{switch(o&&(t+=o),n){case 1:return Temporal.ZonedDateTime.from(t);case 2:return Temporal.PlainDateTime.from(t);case 3:return Temporal.PlainDate.from(t);case 4:return Temporal.PlainTime.from(t)}}catch(i){me.x(i instanceof Error?i.message:""+i,e,s)}}function A8(e){for(;e.p<e.s.length;e.p++){let t=e.s.charCodeAt(e.p);if(t===10)break;if(t===13&&e.s.charCodeAt(e.p+1)===10){e.p++;break}(t<32&&t!==9||t===127)&&me.x("control characters are not allowed in comments",e)}}function Gn(e,t,n){let r;for(;e.p<e.s.length;){for(;e.p<e.s.length&&((r=e.s.charCodeAt(e.p))===32||r===9||!t&&(r===10||r===13&&e.s.charCodeAt(e.p+1)===10));)e.p++;if(n||r!==35)break;A8(e)}}function Wf(e,t=61){let n,r=0,s=[],o,i=e.s.charCodeAt(n=e.p);do{if(i===t)return r||me.x("unexpected end of key",e),r===1&&s.push(e.s.slice(o,e.p)),e.p++,s;i===46?(r||me.x("illegal empty bare key",e),r===1&&s.push(e.s.slice(o,e.p)),r=0):!r&&(i===34||i===39)?(i===e.s.charCodeAt(e.p+1)&&i===e.s.charCodeAt(e.p+2)&&me.x("illegal quoted key: multiline strings are not allowed",e),s.push(qf(e)),r=2,e.p--):i===32||i===9?r===1&&(s.push(e.s.slice(o,e.p)),r=2):r===2||i<48&&i!==45||i>57&&i<65||i>90&&i<97&&i!==95||i>122?me.x("illegal character in key",e):r||(r=1,o=e.p)}while(i=e.s.charCodeAt(++e.p));me.x("incomplete key-value: cannot find end of key",e,n)}function wL(e){let t=e.p++,n=Object.create(null),r=new Set,s;for(;e.p<e.s.length;){if(Gn(e),(s=e.s.charCodeAt(e.p))===125)return e.p++,n;let o,i=n,a=!1,c=e.p,l=Wf(e);for(let u=0;u<l.length;u++){u&&(i=a?i[o]:i[o]=Object.create(null)),o=l[u],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&me.x("trying to redefine an already defined value",e,c);let f=o==="__proto__";if(e.uk&&(f||o==="constructor")){i=e.uk!==1&&me.x("document contains an unsafe property",e,c);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&me.x("trying to redefine an already defined value",e,c),Gn(e,!0,!0);let d=rl(e,125);if(i&&typeof(i[o]=d)=="object"&&r.add(d),Gn(e),(s=e.s.charCodeAt(e.p++))===125)return n;s!==44&&me.x("expected comma or end of structure",e,e.p-1)}me.x("unfinished table",e,t)}function TL(e){let t=e.p++,n=[],r;for(;e.p<e.s.length;){if(Gn(e),(r=e.s.charCodeAt(e.p))===93)return e.p++,n;if(n.push(rl(e,93)),Gn(e),(r=e.s.charCodeAt(e.p++))===93)return n;r!==44&&me.x("expected comma or end of structure",e,e.p-1)}me.x("unfinished array",e,t)}function vL(e,t,n,r,s){let o=n,i=r,a,c=!1,l;for(let d=0;d<t.length;d++){if(d){if(o=c?o[a]:o[a]=Object.create(null),i=(l=i[a]).c,s===0&&(l.t===1||l.t===2))return null;if(l.t===2){let u=o.length-1;o=o[u],i=i[u].c}}if(a=t[d],(c=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!c){let u=a==="__proto__";if(e.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:d<t.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(l=i[a],l.t!==s&&!(s===1&&l.t===3)||(s===2&&(l.d||(l.d=!0,o[a]=[]),o[a].push(o=Object.create(null)),l.c[l.i++]=l={t:1,d:!1,i:0,c:Object.create(null)}),l.d))return null;if(l.d=!0,s===1)o=c?o[a]:o[a]=Object.create(null);else if(s===0&&c)return null;return[a,o,l.c]}function SL(e,t,n){(t===null||e.uk===2)&&me.x(t===null?"trying to redefine an already defined table or value":"document contains an unsafe property",e,n)}function DE(e,t={}){let n={s:e,p:0,d:t.maxDepth??1e3,bi:t.integersAsBigInt??!1,ld:t.useLegacyDate??!0,uk:t.unsafeKeyBehaviour==="throw"?2:t.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),o,i=!1,a=r,c=s;for(e.charCodeAt(0)===65279&&n.p++,Gn(n);n.p<e.length;){if(e.charCodeAt(n.p)===91){let l=e.charCodeAt(++n.p)===91;o=n.p+=+l,i=!1;let d=Wf(n,93);l&&(e.charCodeAt(n.p)!==93&&me.x("expected end of table array declaration",n),n.p++);let u=vL(n,d,r,s,l?2:1);u?(c=u[2],a=u[1]):(SL(n,u,o),i=!0)}else{o=n.p;let l=Wf(n),d=vL(n,l,a,c,0);!d&&!i&&SL(n,d,o),Gn(n,!0,!0);let u=rl(n,void 0);d&&!i&&(d[1][d[0]]=u)}Gn(n,!0),n.p<e.length&&(o=e.charCodeAt(n.p))!==10&&(o!==13||e.charCodeAt(n.p+1)!==10)&&me.x("each key-value declaration must be followed by an end-of-line",n),Gn(n)}return r}var OIe=!!"".isWellFormed;var N8=new Set(["endpoint"]),x8=new Set(["transport","command","args","cwd","env","url","headers","idle_ms"]),L8=new Set(["accept","content-type","content-length","mcp-session-id","mcp-protocol-version","last-event-id","host","connection","transfer-encoding"]);function Xe(e){let t=new Error(e);throw t.code="invalid_argument",t}function C8(e,t){return(!Array.isArray(e)||!e.every(n=>typeof n=="string"))&&Xe(`${t} must be an array of strings`),[...e]}function O8(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.values(e).some(n=>typeof n!="string"))&&Xe(`${t} must be a string map`);for(let[n,r]of Object.entries(e)){L8.has(n.toLowerCase())&&Xe(`${t}.${n} is reserved by HTTP transport`);try{k8(n),R8(n,r)}catch{Xe(`${t}.${n} is not a valid HTTP header`)}}return{...e}}function $E(e){(typeof e!="string"||e==="")&&Xe("config is required");let t=AL(e),n;try{n=DE(I8(t,"utf8"))}catch(o){throw o.code=o.code==="ENOENT"?"not_found":"invalid_argument",o}Object.keys(n).some(o=>!["service","connections"].includes(o))&&Xe("Unknown config table");let r=n.service;if(r!==void 0){(!r||typeof r!="object"||Array.isArray(r))&&Xe("[service] is required");for(let i of Object.keys(r))N8.has(i)||Xe(`unknown service field: ${i}`);(typeof r.endpoint!="string"||r.endpoint==="")&&Xe("service.endpoint is required");let o;try{o=new URL(r.endpoint)}catch{Xe("service.endpoint must be a URL")}["http:","https:"].includes(o.protocol)||Xe("service.endpoint must use http or https"),["localhost","127.0.0.1","[::1]","::1"].includes(o.hostname)||Xe("service.endpoint must be loopback"),(o.search||o.hash)&&Xe("service.endpoint cannot contain query or fragment")}let s=n.connections??{};(!s||typeof s!="object"||Array.isArray(s))&&Xe("[connections] must be a table");for(let[o,i]of Object.entries(s)){(!i||typeof i!="object"||Array.isArray(i))&&Xe(`connection ${o} must be a table`);for(let c of Object.keys(i))x8.has(c)||Xe(`unknown connection field: ${o}.${c}`);let a=i.idle_ms===void 0?3e5:i.idle_ms;if((!Number.isSafeInteger(a)||a<0||a>2147483647)&&Xe(`${o}.idle_ms must be a non-negative integer`),i.transport==="http"){for(let d of["command","args","cwd","env"])i[d]!==void 0&&Xe(`connection ${o}.${d} is only valid for stdio`);(typeof i.url!="string"||i.url==="")&&Xe(`connection ${o}.url is required`);let c;try{c=new URL(i.url)}catch{Xe(`connection ${o}.url must be a URL`)}["http:","https:"].includes(c.protocol)||Xe(`connection ${o}.url must use http or https`),(c.username||c.password)&&Xe(`connection ${o}.url cannot contain credentials`),c.hash&&Xe(`connection ${o}.url cannot contain a fragment`);let l=i.headers===void 0?{}:O8(i.headers,`${o}.headers`);i._normalized={transport:"http",url:i.url,headers:l,idle_ms:a}}else{i.transport!==void 0&&i.transport!=="stdio"&&Xe(`connection ${o} transport must be stdio or http`);for(let u of["url","headers"])i[u]!==void 0&&Xe(`connection ${o}.${u} is only valid for http`);(typeof i.command!="string"||i.command==="")&&Xe(`connection ${o} command is required`);let c=i.args===void 0?[]:C8(i.args,`${o}.args`),l=i.cwd===void 0?bL(t):typeof i.cwd=="string"&&i.cwd!==""?AL(bL(t),i.cwd):Xe(`${o}.cwd must be a path`),d=i.env??{};(!d||typeof d!="object"||Array.isArray(d)||Object.values(d).some(u=>typeof u!="string"))&&Xe(`${o}.env must be a string map`),i._normalized={transport:"stdio",command:i.command,args:c,cwd:l,env:{...d},idle_ms:a}}}return Object.freeze({configPath:t,service:r?{endpoint:r.endpoint}:void 0,connections:Object.freeze(Object.fromEntries(Object.entries(s).map(([o,i])=>[o,Object.freeze({name:o,...i._normalized})])))})}import{createServer as D8}from"http";import{Http2ServerRequest as RL,constants as $8}from"http2";import{Http2ServerRequest as ME}from"http2";import{Readable as IL}from"stream";import X8 from"crypto";var Xo=class extends Error{constructor(e,t){super(e,t),this.name="RequestError"}},M8=e=>e instanceof Xo?e:new Xo(e.message,{cause:e}),P8=global.Request,sl=class extends P8{constructor(e,t){typeof e=="object"&&la in e&&(e=e[la]()),typeof t?.body?.getReader<"u"&&(t.duplex??="half"),super(e,t)}},U8=e=>{let t=[],n=e.rawHeaders;for(let r=0;r<n.length;r+=2){let{[r]:s,[r+1]:o}=n;s.charCodeAt(0)!==58&&t.push([s,o])}return new Headers(t)},NL=Symbol("wrapBodyStream"),F8=(e,t,n,r,s)=>{let o={method:e,headers:n,signal:s.signal};if(e==="TRACE"){o.method="GET";let i=new sl(t,o);return Object.defineProperty(i,"method",{get(){return"TRACE"}}),i}if(!(e==="GET"||e==="HEAD"))if("rawBody"in r&&r.rawBody instanceof Buffer)o.body=new ReadableStream({start(i){i.enqueue(r.rawBody),i.close()}});else if(r[NL]){let i;o.body=new ReadableStream({async pull(a){try{i||=IL.toWeb(r).getReader();let{done:c,value:l}=await i.read();c?a.close():a.enqueue(l)}catch(c){a.error(c)}}})}else o.body=IL.toWeb(r);return new sl(t,o)},la=Symbol("getRequestCache"),xL=Symbol("requestCache"),Bf=Symbol("incomingKey"),Gf=Symbol("urlKey"),j8=Symbol("headersKey"),ca=Symbol("abortControllerKey"),q8=Symbol("getAbortController"),ol={get method(){return this[Bf].method||"GET"},get url(){return this[Gf]},get headers(){return this[j8]||=U8(this[Bf])},[q8](){return this[la](),this[ca]},[la](){return this[ca]||=new AbortController,this[xL]||=F8(this.method,this[Gf],this.headers,this[Bf],this[ca])}};["body","bodyUsed","cache","credentials","destination","integrity","mode","redirect","referrer","referrerPolicy","signal","keepalive"].forEach(e=>{Object.defineProperty(ol,e,{get(){return this[la]()[e]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach(e=>{Object.defineProperty(ol,e,{value:function(){return this[la]()[e]()}})});Object.defineProperty(ol,Symbol.for("nodejs.util.inspect.custom"),{value:function(e,t,n){let r={method:this.method,url:this.url,headers:this.headers,nativeRequest:this[xL]};return`Request (lightweight) ${n(r,{...t,depth:e==null?null:e-1})}`}});Object.setPrototypeOf(ol,sl.prototype);var H8=(e,t)=>{let n=Object.create(ol);n[Bf]=e;let r=e.url||"";if(r[0]!=="/"&&(r.startsWith("http://")||r.startsWith("https://"))){if(e instanceof ME)throw new Xo("Absolute URL for :path is not allowed in HTTP/2");try{let a=new URL(r);n[Gf]=a.href}catch(a){throw new Xo("Invalid absolute URL",{cause:a})}return n}let s=(e instanceof ME?e.authority:e.headers.host)||t;if(!s)throw new Xo("Missing host header");let o;if(e instanceof ME){if(o=e.scheme,!(o==="http"||o==="https"))throw new Xo("Unsupported scheme")}else o=e.socket&&e.socket.encrypted?"https":"http";let i=new URL(`${o}://${s}${r}`);if(i.hostname.length!==s.length&&i.hostname!==s.replace(/:\d+$/,""))throw new Xo("Invalid host header");return n[Gf]=i.href,n},UE=Symbol("responseCache"),aa=Symbol("getResponseCache"),Vo=Symbol("cache"),qE=global.Response,da=class LL{#t;#e;[aa](){return delete this[Vo],this[UE]||=new qE(this.#t,this.#e)}constructor(t,n){let r;if(this.#t=t,n instanceof LL){let s=n[UE];if(s){this.#e=s,this[aa]();return}else this.#e=n.#e,r=new Headers(n.#e.headers)}else this.#e=n;(typeof t=="string"||typeof t?.getReader<"u"||t instanceof Blob||t instanceof Uint8Array)&&(this[Vo]=[n?.status||200,t,r||n?.headers])}get headers(){let t=this[Vo];return t?(t[2]instanceof Headers||(t[2]=new Headers(t[2]||{"content-type":"text/plain; charset=UTF-8"})),t[2]):this[aa]().headers}get status(){return this[Vo]?.[0]??this[aa]().status}get ok(){let t=this.status;return t>=200&&t<300}};["body","bodyUsed","redirected","statusText","trailers","type","url"].forEach(e=>{Object.defineProperty(da.prototype,e,{get(){return this[aa]()[e]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach(e=>{Object.defineProperty(da.prototype,e,{value:function(){return this[aa]()[e]()}})});Object.defineProperty(da.prototype,Symbol.for("nodejs.util.inspect.custom"),{value:function(e,t,n){let r={status:this.status,headers:this.headers,ok:this.ok,nativeResponse:this[UE]};return`Response (lightweight) ${n(r,{...t,depth:e==null?null:e-1})}`}});Object.setPrototypeOf(da,qE);Object.setPrototypeOf(da.prototype,qE.prototype);async function W8(e){return Promise.race([e,Promise.resolve().then(()=>Promise.resolve(void 0))])}function CL(e,t,n){let r=a=>{e.cancel(a).catch(()=>{})};return t.on("close",r),t.on("error",r),(n??e.read()).then(i,s),e.closed.finally(()=>{t.off("close",r),t.off("error",r)});function s(a){a&&t.destroy(a)}function o(){e.read().then(i,s)}function i({done:a,value:c}){try{if(a)t.end();else if(!t.write(c))t.once("drain",o);else return e.read().then(i,s)}catch(l){s(l)}}}function B8(e,t){if(e.locked)throw new TypeError("ReadableStream is locked.");return t.destroyed?void 0:CL(e.getReader(),t)}var FE=e=>{let t={};e instanceof Headers||(e=new Headers(e??void 0));let n=[];for(let[r,s]of e)r==="set-cookie"?n.push(s):t[r]=s;return n.length>0&&(t["set-cookie"]=n),t["content-type"]??="text/plain; charset=UTF-8",t},G8="x-hono-already-sent";typeof global.crypto>"u"&&(global.crypto=X8);var HE=Symbol("outgoingEnded"),kL=Symbol("incomingDraining"),V8=500,J8=64*1024*1024,PE=e=>{let t=e;if(e.destroyed||t[kL])return;if(t[kL]=!0,e instanceof RL){try{e.stream?.close?.($8.NGHTTP2_NO_ERROR)}catch{}return}let n=0,r=()=>{clearTimeout(o),e.off("data",i),e.off("end",r),e.off("error",r)},s=()=>{r();let a=e.socket;a&&!a.destroyed&&a.destroySoon()},o=setTimeout(s,V8);o.unref?.();let i=a=>{n+=a.length,n>J8&&s()};e.on("data",i),e.on("end",r),e.on("error",r),e.resume()},Y8=()=>new Response(null,{status:400}),OL=e=>new Response(null,{status:e instanceof Error&&(e.name==="TimeoutError"||e.constructor.name==="TimeoutError")?504:500}),jE=(e,t)=>{let n=e instanceof Error?e:new Error("unknown error",{cause:e});n.code==="ERR_STREAM_PREMATURE_CLOSE"?console.info("The user aborted a request."):(console.error(e),t.headersSent||t.writeHead(500,{"Content-Type":"text/plain"}),t.end(`Error: ${n.message}`),t.destroy(n))},DL=e=>{"flushHeaders"in e&&e.writable&&e.flushHeaders()},$L=async(e,t)=>{let[n,r,s]=e[Vo],o=!1;if(!s)s={"content-type":"text/plain; charset=UTF-8"};else if(s instanceof Headers)o=s.has("content-length"),s=FE(s);else if(Array.isArray(s)){let i=new Headers(s);o=i.has("content-length"),s=FE(i)}else for(let i in s)if(i.length===14&&i.toLowerCase()==="content-length"){o=!0;break}o||(typeof r=="string"?s["Content-Length"]=Buffer.byteLength(r):r instanceof Uint8Array?s["Content-Length"]=r.byteLength:r instanceof Blob&&(s["Content-Length"]=r.size)),t.writeHead(n,s),typeof r=="string"||r instanceof Uint8Array?t.end(r):r instanceof Blob?t.end(new Uint8Array(await r.arrayBuffer())):(DL(t),await B8(r,t)?.catch(i=>jE(i,t))),t[HE]?.()},K8=e=>typeof e.then=="function",z8=async(e,t,n={})=>{if(K8(e))if(n.errorHandler)try{e=await e}catch(s){let o=await n.errorHandler(s);if(!o)return;e=o}else e=await e.catch(OL);if(Vo in e)return $L(e,t);let r=FE(e.headers);if(e.body){let s=e.body.getReader(),o=[],i=!1,a;if(r["transfer-encoding"]!=="chunked"){let c=2;for(let l=0;l<c;l++){a||=s.read();let d=await W8(a).catch(u=>{console.error(u),i=!0});if(!d){if(l===1){await new Promise(u=>setTimeout(u)),c=3;continue}break}if(a=void 0,d.value&&o.push(d.value),d.done){i=!0;break}}i&&!("content-length"in r)&&(r["content-length"]=o.reduce((l,d)=>l+d.length,0))}t.writeHead(e.status,r),o.forEach(c=>{t.write(c)}),i?t.end():(o.length===0&&DL(t),await CL(s,t,a))}else r[G8]||(t.writeHead(e.status,r),t.end());t[HE]?.()},Q8=(e,t={})=>{let n=t.autoCleanupIncoming??!0;return t.overrideGlobalObjects!==!1&&global.Request!==sl&&(Object.defineProperty(global,"Request",{value:sl}),Object.defineProperty(global,"Response",{value:da})),async(r,s)=>{let o,i;try{i=H8(r,t.hostname);let a=!n||r.method==="GET"||r.method==="HEAD";if(a||(r[NL]=!0,r.on("end",()=>{a=!0}),r instanceof RL&&(s[HE]=()=>{a||setTimeout(()=>{a||setTimeout(()=>{PE(r)})})}),s.on("finish",()=>{a||PE(r)})),s.on("close",()=>{i[ca]&&(r.errored?i[ca].abort(r.errored.toString()):s.writableFinished||i[ca].abort("Client connection prematurely closed.")),a||setTimeout(()=>{a||setTimeout(()=>{PE(r)})})}),o=e(i,{incoming:r,outgoing:s}),Vo in o)return $L(o,s)}catch(a){if(o)return jE(a,s);if(t.errorHandler){if(o=await t.errorHandler(i?a:M8(a)),!o)return}else i?o=OL(a):o=Y8()}try{return await z8(o,s,t)}catch(a){return jE(a,s)}}},Z8=e=>{let t=e.fetch,n=Q8(t,{hostname:e.hostname,overrideGlobalObjects:e.overrideGlobalObjects,autoCleanupIncoming:e.autoCleanupIncoming});return(e.createServer||D8)(e.serverOptions||{},n)},ML=(e,t)=>{let n=Z8(e);return n.listen(e?.port??3e3,e.hostname,()=>{let r=n.address();t&&t(r)}),n};var WE=(e,t,n)=>(r,s)=>{let o=-1;return i(0);async function i(a){if(a<=o)throw new Error("next() called multiple times");o=a;let c,l=!1,d;if(e[a]?(d=e[a][0][0],r.req.routeIndex=a):d=a===e.length&&s||void 0,d)try{c=await d(r,()=>i(a+1))}catch(u){if(u instanceof Error&&t)r.error=u,c=await t(u,r),l=!0;else throw u}else r.finalized===!1&&n&&(c=await n(r));return c&&(r.finalized===!1||l)&&(r.res=c),r}};var PL=Symbol();var UL=(e,t)=>new Response(e,{headers:{"Content-Type":t.replace(/^[^;]+/,r=>r.toLowerCase())}}).formData();var FL=32,e3=1e4,Xf=e=>"headers"in e,HL=async(e,t=Object.create(null))=>{let{all:n=!1,dot:r=!1}=t,i=(Xf(e)?e.headers:e.raw.headers).get("Content-Type")?.split(";")[0].trim().toLowerCase();return i==="multipart/form-data"||i==="application/x-www-form-urlencoded"?t3(e,{all:n,dot:r}):{}};async function t3(e,t){if(!Xf(e)&&e.bodyCache.formData)return jL(await e.bodyCache.formData,t);let n=Xf(e)?e.headers:e.raw.headers,r=await e.arrayBuffer(),s=UL(r,n.get("Content-Type")||"");Xf(e)||(e.bodyCache.formData=s);let o=await s;return o?jL(o,t):{}}function jL(e,t){let n=Object.create(null),r={count:0};return e.forEach((s,o)=>{t.all||o.endsWith("[]")?n3(n,o,s):n[o]=s}),t.dot&&Object.entries(n).forEach(([s,o])=>{s.includes(".")&&(r3(n,s,o,r),delete n[s])}),n}var n3=(e,t,n)=>{e[t]!==void 0?Array.isArray(e[t])?e[t].push(n):e[t]=[e[t],n]:t.endsWith("[]")?e[t]=[n]:e[t]=n},r3=(e,t,n,r)=>{if(/(?:^|\.)__proto__\./.test(t))return;let s=e,o=t.split(".",FL+2);o.length>FL+1&&qL(),o.forEach((i,a)=>{a===o.length-1?s[i]=n:((!s[i]||typeof s[i]!="object"||Array.isArray(s[i])||s[i]instanceof File)&&(r.count++>=e3&&qL(),s[i]=Object.create(null)),s=s[i])})},qL=()=>{throw new Error("Nesting limit exceeded")};var GE=e=>{let t=e.split("/");return t[0]===""&&t.shift(),t},WL=e=>{let{groups:t,path:n}=s3(e),r=GE(n);return o3(r,t)},s3=e=>{let t=[];return e=e.replace(/\{[^}]+\}/g,(n,r)=>{let s=`@${r}`;return t.push([s,n]),s}),{groups:t,path:e}},o3=(e,t)=>{for(let n=t.length-1;n>=0;n--){let[r]=t[n];for(let s=e.length-1;s>=0;s--)if(e[s].includes(r)){e[s]=e[s].replace(r,t[n][1]);break}}return e},Vf={},BL=(e,t)=>{if(e==="*")return"*";let n=e.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(n){let r=`${e}#${t}`;return Vf[r]||(n[2]?Vf[r]=t&&t[0]!==":"&&t[0]!=="*"?[r,n[1],new RegExp(`^${n[2]}(?=/${t})`)]:[e,n[1],new RegExp(`^${n[2]}$`)]:Vf[r]=[e,n[1],!0]),Vf[r]}return null},GL=(e,t)=>{try{return t(e)}catch{return e.replace(/(?:%[0-9A-Fa-f]{2})+/g,n=>{try{return t(n)}catch{return n}})}},i3=e=>GL(e,decodeURI),XE=e=>{let t=e.url,n=t.indexOf("/",t.indexOf(":")+4),r=n;for(;r<t.length;r++){let s=t.charCodeAt(r);if(s===37){let o=t.indexOf("?",r),i=t.indexOf("#",r),a=o===-1?i===-1?void 0:i:i===-1?o:Math.min(o,i),c=t.slice(n,a);return i3(c.includes("%25")?c.replace(/%25/g,"%2525"):c)}else if(s===63||s===35)break}return t.slice(n,r)};var XL=e=>{let t=XE(e);return t.length>1&&t.at(-1)==="/"?t.slice(0,-1):t},Xs=(e,t,...n)=>(n.length&&(t=Xs(t,...n)),`${e?.[0]==="/"?"":"/"}${e}${t==="/"?"":`${e?.at(-1)==="/"?"":"/"}${t?.[0]==="/"?t.slice(1):t}`}`),Jf=e=>{if(e.charCodeAt(e.length-1)!==63||!e.includes(":"))return null;let t=e.split("/"),n=[],r="";return t.forEach(s=>{if(s!==""&&!/\:/.test(s))r+="/"+s;else if(/\:/.test(s))if(s.charCodeAt(s.length-1)===63){n.length===0&&r===""?n.push("/"):n.push(r);let o=s.slice(0,-1);r+="/"+o,n.push(r)}else r+="/"+s}),n.filter((s,o,i)=>i.indexOf(s)===o)},Yf=e=>e.indexOf("%")!==-1?GL(e,a3):e,BE=e=>(e.indexOf("+")!==-1&&(e=e.replace(/\+/g," ")),Yf(e)),VL=(e,t,n)=>{let r=e.indexOf("#",8);r!==-1&&(e=e.slice(0,r));let s;if(!n&&t&&t.indexOf("%")===-1&&t.indexOf("+")===-1){let a=e.indexOf("?",8);if(a===-1)return;for(e.startsWith(t,a+1)||(a=e.indexOf(`&${t}`,a+1));a!==-1;){let c=e.charCodeAt(a+t.length+1);if(c===61){let l=a+t.length+2,d=e.indexOf("&",l);return BE(e.slice(l,d===-1?void 0:d))}else if(c==38||isNaN(c))return"";a=e.indexOf(`&${t}`,a+1)}if(s=/[%+]/.test(e),!s)return}let o=Object.create(null);s??=/[%+]/.test(e);let i=e.indexOf("?",8);for(;i!==-1;){let a=e.indexOf("&",i+1),c=e.indexOf("=",i);c>a&&a!==-1&&(c=-1);let l=e.slice(i+1,c===-1?a===-1?void 0:a:c);if(s&&(l=BE(l)),i=a,l==="")continue;let d;c===-1?d="":(d=e.slice(c+1,a===-1?void 0:a),s&&(d=BE(d))),n?(o[l]&&Array.isArray(o[l])||(o[l]=[]),o[l].push(d)):o[l]??=d}return t?o[t]:o},JL=VL,YL=(e,t)=>VL(e,t,!0),a3=decodeURIComponent;var KL=class{raw;#t;#e;routeIndex=0;path;bodyCache={};constructor(e,t="/",n=[[]]){this.raw=e,this.path=t,this.#e=n}param(e){return e?this.#n(e):this.#o()}#n(e){let t=this.#e[0][this.routeIndex]?.[1][e],n=this.#r(t);return n&&Yf(n)}#o(){let e={},t=Object.keys(this.#e[0][this.routeIndex]?.[1]??{});for(let n of t){let r=this.#r(this.#e[0][this.routeIndex][1][n]);r!==void 0&&(e[n]=Yf(r))}return e}#r(e){return this.#e[1]?this.#e[1][e]:e}query(e){return JL(this.url,e)}queries(e){return YL(this.url,e)}header(e){if(e)return this.raw.headers.get(e)??void 0;let t=Object.create(null);return this.raw.headers.forEach((n,r)=>{t[r]=n}),t}async parseBody(e){return HL(this,e)}#s=e=>{let{bodyCache:t,raw:n}=this,r=t[e];if(r)return r;for(let s in t)return t[s].then(o=>(s==="json"&&(o=JSON.stringify(o)),new Response(o)[e]()));return t[e]=n[e]()};json(){return this.#s("text").then(e=>JSON.parse(e))}text(){return this.#s("text")}arrayBuffer(){return this.#s("arrayBuffer")}bytes(){return this.#s("arrayBuffer").then(e=>new Uint8Array(e))}blob(){return this.#s("blob")}formData(){return this.#s("formData")}addValidatedData(e,t){(this.#t??={})[e]=t}valid(e){return this.#t?.[e]}get url(){return this.raw.url}get method(){return this.raw.method}get[PL](){return this.#e}get matchedRoutes(){return this.#e[0].map(([[,e]])=>e)}get routePath(){return this.#e[0].map(([[,e]])=>e)[this.routeIndex].path}};var zL={Stringify:1,BeforeStream:2,Stream:3},c3=(e,t)=>{let n=new String(e);return n.isEscaped=!0,n.callbacks=t,n};var VE=async(e,t,n,r,s)=>{typeof e=="object"&&!(e instanceof String)&&(e instanceof Promise||(e=e.toString()),e instanceof Promise&&(e=await e));let o=e.callbacks;if(!o?.length)return Promise.resolve(e);s?s[0]+=e:s=[e];let i=Promise.all(o.map(a=>a({phase:t,buffer:s,context:r}))).then(a=>Promise.all(a.filter(Boolean).map(c=>VE(c,t,!1,r,s))).then(()=>s[0]));return n?c3(await i,o):i};var l3="text/plain; charset=UTF-8",JE=(e,t)=>({"Content-Type":e,...t}),il=(e,t)=>new Response(e,t),YE=class{#t;#e;env={};#n;finalized=!1;error;#o;#r;#s;#d;#c;#l;#a;#u;#f;constructor(e,t){this.#t=e,t&&(this.#r=t.executionCtx,this.env=t.env,this.#l=t.notFoundHandler,this.#f=t.path,this.#u=t.matchResult)}get req(){return this.#e??=new KL(this.#t,this.#f,this.#u),this.#e}get event(){if(this.#r&&"respondWith"in this.#r)return this.#r;throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#r)return this.#r;throw Error("This context has no ExecutionContext")}get res(){return this.#s||=il(null,{headers:this.#a??=new Headers})}set res(e){if(this.#s&&e){e=il(e.body,e);for(let[t,n]of this.#s.headers.entries())if(t!=="content-type")if(t==="set-cookie"){let r=this.#s.headers.getSetCookie();e.headers.delete("set-cookie");for(let s of r)e.headers.append("set-cookie",s)}else e.headers.set(t,n)}this.#s=e,this.finalized=!0}render=(...e)=>(this.#c??=t=>this.html(t),this.#c(...e));setLayout=e=>this.#d=e;getLayout=()=>this.#d;setRenderer=e=>{this.#c=e};header=(e,t,n)=>{this.finalized&&(this.#s=il(this.#s.body,this.#s));let r=this.#s?this.#s.headers:this.#a??=new Headers;t===void 0?r.delete(e):n?.append?r.append(e,t):r.set(e,t)};status=e=>{this.#o=e};set=(e,t)=>{this.#n??=new Map,this.#n.set(e,t)};get=e=>this.#n?this.#n.get(e):void 0;get var(){return this.#n?Object.fromEntries(this.#n):{}}#i(e,t,n){let r=this.#s?new Headers(this.#s.headers):this.#a;if(typeof t=="object"&&t.headers){r??=new Headers;for(let[o,i]of new Headers(t.headers))o==="set-cookie"?r.append(o,i):r.set(o,i)}if(n){if(!r){let o=0;for(let i in n)if(++o>1||typeof n[i]!="string"){r=new Headers;break}}if(r)for(let o in n){let i=n[o];if(typeof i=="string")r.set(o,i);else{r.delete(o);for(let a of i)r.append(o,a)}}}let s=typeof t=="number"?t:t?.status??this.#o;return il(e,{status:s,headers:r??n})}newResponse=(...e)=>this.#i(...e);body=(e,t,n)=>this.#i(e,t,n);text=(e,t,n)=>!this.#a&&!this.#o&&!t&&!n&&!this.finalized?new Response(e):this.#i(e,t,JE(l3,n));json=(e,t,n)=>this.#i(JSON.stringify(e),t,JE("application/json",n));html=(e,t,n)=>{let r=s=>this.#i(s,t,JE("text/html; charset=UTF-8",n));return typeof e=="object"?VE(e,zL.Stringify,!1,{}).then(r):r(e)};redirect=(e,t)=>{let n=String(e);return this.header("Location",/[^\x00-\xFF]/.test(n)?encodeURI(n):n),this.newResponse(null,t??302)};notFound=()=>(this.#l??=()=>il(),this.#l(this))};var $t="ALL",QL="all",ZL=["get","post","put","delete","options","patch","query"],Kf="Can not add a route since the matcher is already built.",zf=class extends Error{};var e0="__COMPOSED_HANDLER";var d3=e=>e.text("404 Not Found",404),t0=(e,t)=>{if("getResponse"in e){let n=e.getResponse();return t.newResponse(n.body,n)}return console.error(e),t.text("Internal Server Error",500)},n0=class r0{get;post;put;delete;options;patch;query;all;on;use;router;getPath;_basePath="/";#t="/";routes=[];constructor(t={}){[...ZL,QL].forEach(o=>{this[o]=(i,...a)=>(typeof i=="string"?this.#t=i:this.#o(o,this.#t,i),a.forEach(c=>{this.#o(o,this.#t,c)}),this)}),this.on=(o,i,...a)=>{for(let c of[i].flat()){this.#t=c;for(let l of[o].flat())a.map(d=>{this.#o(l.toUpperCase(),this.#t,d)})}return this},this.use=(o,...i)=>(typeof o=="string"?this.#t=o:(this.#t="*",i.unshift(o)),i.forEach(a=>{this.#o($t,this.#t,a)}),this);let{strict:r,...s}=t;Object.assign(this,s),this.getPath=r??!0?t.getPath??XE:XL}#e(){let t=new r0({router:this.router,getPath:this.getPath});return t.errorHandler=this.errorHandler,t.#n=this.#n,t.routes=this.routes,t}#n=d3;errorHandler=t0;route(t,n){let r=this.basePath(t);return n.routes.map(s=>{let o;n.errorHandler===t0?o=s.handler:(o=async(i,a)=>(await WE([],n.errorHandler)(i,()=>s.handler(i,a))).res,o[e0]=s.handler),r.#o(s.method,s.path,o,s.basePath)}),this}basePath(t){let n=this.#e();return n._basePath=Xs(this._basePath,t),n}onError=t=>(this.errorHandler=t,this);notFound=t=>(this.#n=t,this);mount(t,n,r){let s,o;r&&(typeof r=="function"?o=r:(o=r.optionHandler,r.replaceRequest===!1?s=c=>c:s=r.replaceRequest));let i=o?c=>{let l=o(c);return Array.isArray(l)?l:[l]}:c=>{let l;try{l=c.executionCtx}catch{}return[c.env,l]};s||=(()=>{let c=Xs(this._basePath,t),l=c==="/"?0:c.length;return d=>{let u=new URL(d.url);return u.pathname=this.getPath(d).slice(l)||"/",new Request(u,d)}})();let a=async(c,l)=>{let d=await n(s(c.req.raw),...i(c));if(d)return d;await l()};return this.#o($t,Xs(t,"*"),a),this}#o(t,n,r,s){t=t.toUpperCase(),n=Xs(this._basePath,n);let o={basePath:s!==void 0?Xs(this._basePath,s):this._basePath,path:n,method:t,handler:r};this.router.add(t,n,[r,o]),this.routes.push(o)}#r(t,n){if(t instanceof Error)return this.errorHandler(t,n);throw t}#s(t,n,r,s){if(s==="HEAD")return(async()=>new Response(null,await this.#s(t,n,r,"GET")))();let o=this.getPath(t,{env:r}),i=this.router.match(s,o),a=new YE(t,{path:o,matchResult:i,env:r,executionCtx:n,notFoundHandler:this.#n});if(i[0].length===1){let l;try{l=i[0][0][0][0](a,async()=>{a.res=await this.#n(a)})}catch(d){return this.#r(d,a)}return l instanceof Promise?l.then(d=>d||(a.finalized?a.res:this.#n(a))).catch(d=>this.#r(d,a)):l??this.#n(a)}let c=WE(i[0],this.errorHandler,this.#n);return(async()=>{try{let l=await c(a);if(!l.finalized)throw new Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return l.res}catch(l){return this.#r(l,a)}})()}fetch=(t,...n)=>this.#s(t,n[1],n[0],t.method);request=(t,n,r,s)=>t instanceof Request?this.fetch(n?new Request(t,n):t,r,s):(t=t.toString(),this.fetch(new Request(/^https?:\/\//.test(t)?t:`http://localhost${Xs("/",t)}`,n),r,s));fire=()=>{addEventListener("fetch",t=>{t.respondWith(this.#s(t.request,t,void 0,t.request.method))})}};var Nt=()=>Object.create(null);var Qf=[];function KE(e,t){let n=this.buildAllMatchers(),r=(s,o)=>{let i=n[s]||n[$t],a=i[2][o];if(a)return a;let c=o.match(i[0]);if(!c)return[[],Qf];let l=c.indexOf("",1);return[i[1][l],c]};return this.match=r,r(e,t)}var ua="[^/]+",Js=".*",Qr="(?:|/.*)",Vs=Symbol(),s0=new Set(".\\+*[^]$()");function u3(e,t){return e.length===1?t.length===1?e<t?-1:1:-1:t.length===1?1:e===Js||e===Qr?t===Qr?-1:1:t===Js||t===Qr?-1:e===ua?1:t===ua?-1:e.length===t.length?e<t?-1:1:t.length-e.length}var o0=class zE{#t;#e;#n=Nt();insert(t,n,r,s,o){let i=this;for(let a=0,c=t.length;a<c;a++){let l=t[a],d=l.length===1?l==="*"?a===c-1?["","",Js]:["","",ua]:null:l==="/*"?["","",Qr]:l.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),u;if(d){let f=d[1],m=d[2]||ua;if(f&&d[2]&&(m===".*"||(m=m.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(m))||m.length===1&&s0.has(m)))throw Vs;if(u=i.#n[m],!u){if(m!==Js&&m!==Qr){for(let p in i.#n)if((m.length>1||p.length>1)&&p!==Js&&p!==Qr)throw Vs}u=i.#n[m]=new zE}f!==""&&(u.#e??=s.varIndex++,r.push([f,u.#e]))}else if(u=i.#n[l],!u){for(let f in i.#n)if(f.length>1&&f!==Js&&f!==Qr)throw Vs;u=i.#n[l]=new zE}i=u}if(i.#t!==void 0)throw Vs;i.#t=o?-1:n}buildRegExpStr(){let n=Object.keys(this.#n).sort(u3).map(r=>{let s=this.#n[r],o=s.buildRegExpStr();return o===""?"":(typeof s.#e=="number"?`(${r})@${s.#e}`:s0.has(r)?`\\${r}`:r)+o}).filter(Boolean);return typeof this.#t=="number"&&this.#t!==-1&&n.unshift(`#${this.#t}`),n.length===0?"":n.length===1?n[0]:"(?:"+n.join("|")+")"}};var QE=class{#t={varIndex:0};#e=new o0;#n=0;paths=Nt();insert(e,t){if(t){this.#e.insert(e.split(""),0,[],this.#t,!0);return}let n=[],r=[],s=e;for(let i=0;;){let a=!1;if(s=s.replace(/\{[^}]+\}/g,c=>{let l=`@\\${i}`;return r[i]=[l,c],i++,a=!0,l}),!a)break}let o=s.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let i=r.length-1;i>=0;i--){let[a]=r[i];for(let c=o.length-1;c>=0;c--)if(o[c].indexOf(a)!==-1){o[c]=o[c].replace(a,r[i][1]);break}}this.#e.insert(o,this.#n,n,this.#t,!1),this.paths[e]=[this.#n++,n]}buildRegExp(){let e=this.#e.buildRegExpStr();if(e==="")return[/^$/,[],[]];let t=0,n=[],r=[];return e=e.replace(/#(\d+)|@(\d+)|\.\*\$/g,(s,o,i)=>o!==void 0?(n[++t]=Number(o),"$()"):(i!==void 0&&(r[Number(i)]=++t),"")),[new RegExp(`^${e}`),n,r]}};var i0=Nt();function a0(e){return i0[e]??=new RegExp(`^${e.replace(/\/:[^/{}]+(?:\{\[\^\/]\+})?(?=[/{]|$)|\/?\*$|([.\\+*[^\]$()?{}|])/g,(t,n)=>n?`\\${n}`:t==="/*"?Qr:t==="*"?Js:`/:${ua}`)}$`)}function Zf(e,t){for(let n of Object.keys(e).sort((r,s)=>s.length-r.length))if(a0(n).test(t))return[...e[n]]}var em=class{name="RegExpRouter";#t;#e;#n;constructor(){this.#t={[$t]:Nt()},this.#e={[$t]:Nt()},this.#n={[$t]:new QE}}#o(e,t){try{this.#n[e].insert(t,!/\*|\/:/.test(t))}catch(n){throw n===Vs?new zf(t):n}}add(e,t,n){let r=this.#t,s=this.#e;if(!r)throw new Error(Kf);if(!r[e]){this.#n[e]=new QE;for(let a of[r,s]){a[e]=Nt();for(let c in a[$t])a[e][c]=[...a[$t][c]],this.#o(e,c)}}t==="/*"&&(t="*");let o=e===$t?Object.keys(r):[e];if(/\*$/.test(t)){let a=a0(t);for(let c of o)r[c][t]||(this.#o(c,t),r[c][t]=Zf(r[c],t)||Zf(r[$t],t)||[]);for(let c of[r,s])for(let l of o)for(let d in c[l])a.test(d)&&c[l][d].push([n,t]);return}let i=Jf(t)||[t];for(let a of i)for(let c of o)s[c][a]||(this.#o(c,a),s[c][a]=Zf(r[c],a)||Zf(r[$t],a)||[]),s[c][a].push([n,a])}match=KE;buildAllMatchers(){let e=Nt();for(let t of Object.keys(this.#e))e[t]=this.#r(t);return this.#t=this.#e=this.#n=void 0,i0=Nt(),e}#r(e){let t=this.#t[e],n=this.#e[e],r=this.#n[e],s=Nt(),o=[],[i,a,c]=r.buildRegExp();for(let l of[t,n])for(let d in l){let u=l[d],f=r.paths[d];if(!f){s[d]=[u.map(([m])=>[m,Nt()]),Qf];continue}o[f[0]]=u.map(([m,p])=>[m,r.paths[p][1].reduceRight((h,[_],g)=>(h[_]=c[f[1][g][1]],h),Nt())])}return[i,a.map(l=>o[l]),s]}};var ZE=class{name="SmartRouter";#t=[];#e=[];constructor(e){this.#t=e.routers}add(e,t,n){if(!this.#e)throw new Error(Kf);this.#e.push([e,t,n])}match(e,t){if(!this.#e)throw new Error("Fatal error");let n=this.#t,r=this.#e,s=n.length,o=0,i;for(;o<s;o++){let a=n[o];try{for(let c=0,l=r.length;c<l;c++)a.add(...r[c]);i=a.match(e,t)}catch(c){if(c instanceof zf)continue;throw c}this.match=a.match.bind(a),this.#t=[a],this.#e=void 0;break}if(o===s)throw new Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,i}get activeRouter(){if(this.#e||this.#t.length!==1)throw new Error("No active router has been determined yet.");return this.#t[0]}};var ey=Nt(),f3=0,c0=class l0{#t=[];#e=Nt();#n=[];#o;#r=ey;insert(t,n,r){let s=this,o=WL(n),i=new Set,a=0;for(let c of o){let l=o[++a],d=BL(c,l)||(l===void 0&&c&&c.indexOf("*")===c.length-1?c:null),u=Array.isArray(d),f=u?d[0]:d||c,m=s.#e[f]||=new l0;d&&!m.#o&&(m.#o=d,s.#n.push(m)),s=m,u&&i.add(d[1])}s.#t.push({[t]:{handler:r,possibleKeys:[...i],score:++f3}})}#s(t,n,r,s,o){for(let i=0,a=n.#t.length;i<a;i++){let c=n.#t[i],l=c[r]||c[$t];if(l){l.params=Nt(),t.push(l);for(let d=0,u=l.possibleKeys.length;d<u;d++){let f=l.possibleKeys[d];l.params[f]=o?.[f]&&!d?o[f]:s[f]??o?.[f]}}}}search(t,n){let r=[];this.#r=ey;let o=[this],i=GE(n),a=[],c=i.length,l=null;for(let d=0;d<c;d++){let u=i[d],f=d===c-1,m=[];for(let h=0,_=o.length;h<_;h++){let g=o[h],w=g.#e[u];w&&(w.#r=g.#r,f?(w.#e["*"]&&this.#s(r,w.#e["*"],t,g.#r),this.#s(r,w,t,g.#r)):m.push(w));for(let y of g.#n){let E=y.#o,T=g.#r===ey?{}:{...g.#r};if(typeof E=="string"){(E==="*"||u.startsWith(E.slice(0,-1)))&&(this.#s(r,y,t,g.#r),E==="*"&&(y.#r=T,m.push(y)));continue}let[,b,A]=E;if(!(!u&&A===!0)){if(A!==!0){if(!l){l=[];let L=n[0]==="/"?1:0;for(let N=0;N<c;N++)l[N]=L,L+=i[N].length+1}let I=n.slice(l[d]),R=A.exec(I);if(R){T[b]=R[0],this.#s(r,y,t,g.#r,T),R[0].length===I.length&&y.#e["*"]&&this.#s(r,y.#e["*"],t,g.#r,T);for(let L in y.#e){y.#r=T;let N=R[0].match(/\//g)?.length??0;(a[N]||=[]).push(y);break}continue}}(A===!0||A.test(u))&&(T[b]=u,f?(this.#s(r,y,t,T,g.#r),y.#e["*"]&&this.#s(r,y.#e["*"],t,T,g.#r)):(y.#r=T,m.push(y)))}}}let p=a.shift();o=p?m.concat(p):m}return r[1]&&r.sort((d,u)=>d.score-u.score),[r.map(({handler:d,params:u})=>[d,u])]}};var ty=class{name="TrieRouter";#t=new c0;add(e,t,n){for(let r of Jf(t)||[t])this.#t.insert(e,r,n)}match(e,t){return this.#t.search(e,t)}};var Jo=class extends n0{constructor(e={}){super(e),this.router=e.router??new ZE({routers:[new em,new ty]})}};import{join as m3}from"node:path";function p3(e){return e||(process.env.LMBEE_TEAMS_CONF?process.env.LMBEE_TEAMS_CONF:m3(process.cwd(),"teams.conf"))}function h3(e,t){let n=process.env.LMBEE_TEAM_NAME;if(n===void 0)return;let r=t.find(s=>s.name===n);if(!(r===void 0||!K(r)))try{hv(e.db,n,new Date().toISOString())}catch{}}function tm(e={}){let t=ld(e.dbPath,{readOnly:e.readOnly??!1}),n=p3(e.teamsConfPath),r=_o(t.db,n);return e.readOnly||h3(t,r),{db:t,teamsConfPath:n,teams:r}}import{existsSync as qZ,readFileSync as HZ,statSync as WZ}from"node:fs";import{execFile as _3}from"node:child_process";import{promisify as g3}from"node:util";var nm=g3(_3),cl=3,al="auto_nudge_redirect:",ny=3,ry=5*60*6e4;function Un(e,t){let n=e.prepare("SELECT v FROM kv WHERE k = ?").get(al+t);if(n===void 0)return null;try{let r=JSON.parse(n.v);return typeof r.companionTeam!="string"||r.companionTeam.length===0?null:{companionTeam:r.companionTeam,workerAlias:typeof r.workerAlias=="string"&&r.workerAlias.length>0?r.workerAlias:"Worker",commitThreshold:typeof r.commitThreshold=="number"&&r.commitThreshold>0?r.commitThreshold:ny,hoursThresholdMs:typeof r.hoursThresholdMs=="number"&&r.hoursThresholdMs>0?r.hoursThresholdMs:ry,shiftStartedTs:typeof r.shiftStartedTs=="string"?r.shiftStartedTs:null,shiftStartedSha:typeof r.shiftStartedSha=="string"?r.shiftStartedSha:null,turnsDispatched:typeof r.turnsDispatched=="number"&&r.turnsDispatched>=0?r.turnsDispatched:0,lastReviewedTurn:typeof r.lastReviewedTurn=="number"&&r.lastReviewedTurn>=0?r.lastReviewedTurn:0}}catch{return null}}function sy(e){return e.prepare("SELECT k FROM kv WHERE k LIKE ?").all(al+"%").map(n=>n.k.slice(al.length))}function rm(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(al+t,JSON.stringify(n))}function d0(e,t){e.prepare("DELETE FROM kv WHERE k = ?").run(al+t)}async function u0(e,t){try{let{stdout:n}=await t("git",["-C",e,"rev-parse","HEAD"],{timeout:1e4});return n.trim()||null}catch{return null}}async function E3(e,t,n){try{let{stdout:r}=await n("git",["-C",e,"rev-list","--count",`${t}..HEAD`],{timeout:1e4}),s=Number.parseInt(r.trim(),10);return Number.isNaN(s)?null:s}catch{return null}}async function f0(e,t,n,r,s,o=nm){let i=n.shiftStartedTs!==null,a=i?n.shiftStartedSha:await u0(r,o);rm(e,t,{...n,turnsDispatched:n.turnsDispatched+1,shiftStartedTs:i?n.shiftStartedTs:s,shiftStartedSha:a})}async function m0(e,t,n=Date.now(),r=nm){let s=[];for(let o of sy(e)){let i=Un(e,o);if(i===null||i.shiftStartedTs===null)continue;let a=t.get(o);if(a===void 0)continue;let c=(n-Date.parse(i.shiftStartedTs))/(60*6e4),l=i.shiftStartedSha!==null?await E3(a,i.shiftStartedSha,r):null,d=i.turnsDispatched<=cl&&i.turnsDispatched>i.lastReviewedTurn,u=c*60*6e4>=i.hoursThresholdMs,f=l!==null&&l>=i.commitThreshold;(d||u||f)&&s.push({team:o,companionTeam:i.companionTeam,workerAlias:i.workerAlias,commitCount:l,hoursElapsed:c,shiftStartedTs:i.shiftStartedTs,shiftStartedSha:i.shiftStartedSha,isRampUp:d,turnNumber:i.turnsDispatched})}return s}async function p0(e,t,n,r,s=nm){let o=Un(e,t);if(o===null)return;let i=await u0(n,s);rm(e,t,{...o,shiftStartedTs:r,shiftStartedSha:i,lastReviewedTurn:o.turnsDispatched})}async function h0(e,t,n=nm){let r=e.hoursElapsed.toFixed(1),s=e.commitCount===null?"unknown (git check failed)":String(e.commitCount),o=null;if(e.shiftStartedSha!==null)try{let{stdout:a}=await n("git",["-C",t,"log","--oneline",`${e.shiftStartedSha}..HEAD`],{timeout:1e4});o=a.trim()}catch{o=null}let i=o!==null&&o.length>0?`
2048
2048
 
2049
2049
  Commits this shift:
2050
2050
  ${o}`:"";return e.isRampUp?`[auto-nudge-redirect] RAMP-UP turn ${e.turnNumber}/${cl} for your Worker (${e.companionTeam}:${e.workerAlias}) -- always reviewed during ramp-up, regardless of commits/time. Please review this turn's own work and correct/coach as needed, then note (in a task note or reply) specifically WHAT you had to correct, if anything -- that's the data point that decides whether this coaching transfers to the next team's Worker.${i}`:`[auto-nudge-redirect] Your Worker (${e.companionTeam}:${e.workerAlias}) shift is due for review -- ${s} commit(s), ${r}h elapsed (threshold: commits or hours, whichever came first). Please review the Worker's own work and tie it up.${i}`}import{execFile as v3}from"node:child_process";import{existsSync as S3,readdirSync as y0,readFileSync as w0,statSync as b3}from"node:fs";import{hostname as A3}from"node:os";import{promisify as I3}from"node:util";import{existsSync as y3,statSync as w3}from"node:fs";var FRe=15*6e4;function T3(e,t,n={}){let r=n.existsSyncImpl??y3,s=n.statSyncImpl??w3,o=n.nowMs??Date.now();if(!r(e))return!1;if(t===void 0)return!0;try{let i=s(e).mtime.getTime();return o-i<=t}catch{return!1}}function oy(e,t,n){if(e===null)return!1;let r=Date.parse(e);return Number.isNaN(r)?!1:n-r<=t}function _0(e,t){if(e===null)return null;let n=Date.parse(e);return Number.isNaN(n)?null:t-n}function fa(e,t,n,r,s={}){if(e!==void 0&&T3(e,t,s))return!0;if(r===void 0)return!1;let o=s.nowMs??Date.now();return oy(n,r,o)}var k3=I3(v3),R3=45*6e4,T0=100,g0=T0,N3=3;async function x3(e,t=3e4){try{let{stdout:n}=await k3("lmctl",["status",e,"--json"],{timeout:t}),r=JSON.parse(n);return typeof r!="object"||r===null||!Array.isArray(r.members)?null:r}catch{return null}}function sm(e,t){try{let n=w0(`${t}/${e}/stat`,"utf8"),r=n.lastIndexOf(")");if(r===-1)return null;let s=n.slice(r+1).trim().split(/\s+/),o=Number(s[1]),i=Number(s[11]),a=Number(s[12]);return!Number.isFinite(o)||!Number.isFinite(i)||!Number.isFinite(a)?null:{ppid:o,utime:i,stime:a}}catch{return null}}function v0(e,t="/proc"){let n=sm(e,t);return n===null?null:n.utime+n.stime}function E0(e,t){try{let n=w0(`${t}/${e}/io`,"utf8"),r=n.match(/^rchar:\s*(\d+)/m),s=n.match(/^wchar:\s*(\d+)/m);if(!r||!s)return null;let o=Number(r[1]),i=Number(s[1]);return!Number.isFinite(o)||!Number.isFinite(i)?null:o+i}catch{return null}}function iy(e,t="/proc"){let n=sm(e,t);if(n===null)return null;let r;try{r=y0(t)}catch{return n.utime+n.stime}let s=new Map,o=new Map;for(let l of r){if(!/^\d+$/.test(l))continue;let d=Number(l);if(d===e)continue;let u=sm(d,t);if(u===null)continue;o.set(d,u);let f=s.get(u.ppid);f?f.push(d):s.set(u.ppid,[d])}let i=n.utime+n.stime,a=[...s.get(e)??[]],c=new Set([e]);for(;a.length>0;){let l=a.shift();c.has(l)||(c.add(l),i+=o.get(l).utime+o.get(l).stime,a.push(...s.get(l)??[]))}return i}function S0(e,t="/proc"){let n=E0(e,t);if(n===null)return null;let r;try{r=y0(t)}catch{return n}let s=new Map;for(let c of r){if(!/^\d+$/.test(c))continue;let l=Number(c);if(l===e)continue;let d=sm(l,t);if(d===null)continue;let u=s.get(d.ppid);u?u.push(l):s.set(d.ppid,[l])}let o=n,i=[...s.get(e)??[]],a=new Set([e]);for(;i.length>0;){let c=i.shift();if(a.has(c))continue;a.add(c);let l=E0(c,t);l!==null&&(o+=l),i.push(...s.get(c)??[])}return o}function L3(e,t){if(e.state!=="busy")return null;if(e.inFlight!==null)return e.inFlight.holderPid!==null?{pid:e.inFlight.holderPid,startedAt:e.inFlight.startedAt}:null;if(e.terminalLock!==null)return e.terminalLock.holderHost!==t?null:{pid:e.terminalLock.holderPid,startedAt:e.terminalLock.startedAt};if(e.terminalInvocation!==null){let{holderPid:n,holderHost:r,startedAt:s}=e.terminalInvocation;return n===null||r!==t?null:{pid:n,startedAt:s}}return null}async function C3(e,t,n,r){let s=r.fetchHealthImpl??x3,o=r.readProcStatImpl??iy,i=r.hostnameImpl??A3,a=r.wallClockThresholdMs??R3,c=r.requiredLowCpuStreak??N3,l=await s(n);if(l===null)return;let d=l.members.find(b=>b.alias===t.leadAlias);if(d===void 0)return;let u=L3(d.liveness,i());if(u===null){let b=fe(e,t.name);(b?.holder_watch_pid!==null&&b?.holder_watch_pid!==void 0||b?.hung_holder_flagged_ts!==null&&b?.hung_holder_flagged_ts!==void 0)&&qp(e,t.name);return}let f=new Date().toISOString(),m=o(u.pid);if(m===null){jp(e,t.name,`${t.leadAlias}'s servicing lock has outlived its holder -- pid ${u.pid} (started ${u.startedAt}) is NOT RUNNING. Lock is leaked, not hung; nothing to kill, only the lock needs releasing.`,f);return}let p=fe(e,t.name);if(!(p?.holder_watch_pid===u.pid&&p?.holder_watch_started_at===u.startedAt)){Fp(e,t.name,u.pid,u.startedAt,m,f,0);return}let _=Date.now()-Date.parse(u.startedAt),g=p.holder_watch_cpu_ticks!==null?m-p.holder_watch_cpu_ticks:null,w=g!==null&&g<g0,y=p.holder_watch_low_cpu_streak??0,E=w?y+1:0;if(Fp(e,t.name,u.pid,u.startedAt,m,f,E),_<a||E<c)return;let T=Math.round(_/6e4);jp(e,t.name,`${t.leadAlias} has held its servicing lock for ~${T}m with under ${g0/T0}s of CPU time across ${E} consecutive checks -- possibly hung, not just slow.`,f)}async function b0(e,t,n={}){let r=n.existsSyncImpl??S3,s=n.statSyncImpl??b3,o=n.nowMs??Date.now();for(let i of t){if(!K(i))continue;if(n.sessionAliveExemptTeamName!==void 0&&i.name===n.sessionAliveExemptTeamName&&fa(n.sessionAliveExemptPath,n.sessionAliveFreshnessMs,n.activityFreshnessMs!==void 0?fe(e,i.name)?.last_cli_activity_ts??null:null,n.activityFreshnessMs,{existsSyncImpl:r,statSyncImpl:s,nowMs:o})){qp(e,i.name);continue}let a;try{a=re(i)}catch{continue}try{await C3(e,i,a,n)}catch{continue}}}var ll="provider_disabled:";function A0(e,t){try{let n=JSON.parse(t);return typeof n.disabledAt!="string"?null:{provider:e,disabledAt:n.disabledAt,reason:typeof n.reason=="string"?n.reason:null,expiresAt:typeof n.expiresAt=="string"?n.expiresAt:null}}catch{return null}}function om(e,t){let n=e.prepare("SELECT v FROM kv WHERE k = ?").get(ll+t);return n===void 0?null:A0(t,n.v)}function im(e,t,n={}){let r={provider:t,disabledAt:n.nowIso??new Date().toISOString(),reason:n.reason??null,expiresAt:n.expiresAt??null};e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(ll+t,JSON.stringify(r))}function I0(e,t){e.prepare("DELETE FROM kv WHERE k = ?").run(ll+t)}function dl(e){let t=e.prepare("SELECT k, v FROM kv WHERE k LIKE ?").all(`${ll}%`),n=[];for(let r of t){let s=r.k.slice(ll.length),o=A0(s,r.v);o!==null&&n.push(o)}return n}function Kt(e,t,n=Date.now()){let r;try{r=om(e,t)}catch{return{disabled:!0,config:null,failClosed:!0}}return r===null?{disabled:!1,config:null,failClosed:!1}:r.expiresAt!==null&&Date.parse(r.expiresAt)<=n?{disabled:!1,config:null,failClosed:!1}:{disabled:!0,config:r,failClosed:!1}}import{existsSync as O3,readFileSync as D3,readdirSync as $3,statSync as k0}from"node:fs";import{basename as am}from"node:path";var cy="orphan_would_reap",M3=5e3,P3=6e4,U3=100,F3=3,j3=45*6e4;function R0(e,t){try{let r=D3(`${e}/${t}/cmdline`,"utf8").split("\0").filter(a=>a.length>0),s=r.indexOf("chat");if(s<=0||s+1>=r.length)return null;let o=r[s-1]??"";if(!o.includes("lmctl")&&!o.includes("lctl"))return null;let i=r[s+1];return i.includes(".lmctl:")?i:null}catch{return null}}function N0(e,t){try{return k0(`${e}/${t}`).mtime.getTime()}catch{return null}}function ly(e){let t;try{t=$3(e)}catch{return[]}let n=[];for(let r of t){if(!/^\d+$/.test(r))continue;let s=Number(r),o=R0(e,s);if(o===null)continue;let i=N0(e,s);i!==null&&n.push({pid:s,target:o,startedAtMs:i})}return n.sort((r,s)=>r.pid-s.pid),n}function ay(e){let t=e.lastIndexOf(":");return t===-1?null:{teamfilePath:e.slice(0,t),alias:e.slice(t+1)}}function q3(e,t){if(t===null)return!1;let n=ay(e),r=ay(t);return n===null||r===null?!1:n.alias===r.alias&&am(n.teamfilePath)===am(r.teamfilePath)}function H3(e,t,n){return t.some(o=>o.pid!==e.pid&&o.target===e.target&&(o.startedAtMs>e.startedAtMs||o.startedAtMs===e.startedAtMs&&o.pid>e.pid))?{action:"reap",reason:`target "${e.target}" has a NEWER OS process for the same target -- this one is a leftover from a prior attempt`,requiresCpuCorroboration:!0}:n.running.find(o=>o.kind==="chat"&&q3(e.target,o.target))===void 0?{action:"reap",reason:`target "${e.target}" is not in lctl's own running (chat) bucket at all -- orphaned`,requiresCpuCorroboration:!0}:{action:"skip"}}function W3(e,t,n,r,s,o,i,a){let c=o(t.pid,a);if(c===null)return!1;let l=_v(e,t.target,t.startedAtMs,t.pid);if(l===null||l.cpu_ticks===null)return Hp(e,t.target,t.startedAtMs,t.pid,c,i,0),!1;let f=c-l.cpu_ticks<U3?l.low_cpu_streak+1:0;return Hp(e,t.target,t.startedAtMs,t.pid,c,i,f),s-t.startedAtMs<r?!1:f>=n}function B3(e,t){let n=e.find(r=>r.name===t);if(n===void 0||!K(n))return null;try{return re(n)}catch{return null}}function G3(e,t){let n=ay(t);if(n===null)return t;for(let r of e)if(K(r))try{let s=re(r);if(am(s)===am(n.teamfilePath))return r.name}catch{continue}return t}async function X3(e,t,n,r,s){if(R0(e,t.pid)!==t.target||N0(e,t.pid)!==t.startedAtMs)return!1;try{r(-t.pid,"SIGTERM")}catch{return!1}await s(n);try{r(-t.pid,0)}catch{return!0}try{r(-t.pid,"SIGKILL")}catch{}return!0}async function x0(e,t,n,r={}){let s=r.procPath??"/proc",o=r.safetyMarginMs??P3,i=r.sigkillGraceMs??M3,a=r.requiredLowCpuStreak??F3,c=r.minCorroborationWallClockMs??j3,l=r.existsSyncImpl??O3,d=r.statSyncImpl??k0,u=r.killImpl??process.kill.bind(process),f=r.sleepImpl??(b=>new Promise(A=>setTimeout(A,b))),m=r.readProcCpuTicksImpl??v0,p=r.insertEventImpl??Ht,h=r.dryRun??!1,_=r.nowMs??Date.now(),g=new Date(_).toISOString(),w=r.sessionAliveExemptTeamName!==void 0&&fa(r.sessionAliveExemptPath,r.sessionAliveFreshnessMs,r.activityFreshnessMs!==void 0?fe(e,r.sessionAliveExemptTeamName)?.last_cli_activity_ts??null:null,r.activityFreshnessMs,{existsSyncImpl:l,statSyncImpl:d,nowMs:_}),y=w?B3(t,r.sessionAliveExemptTeamName):null;w&&y===null&&process.stderr.write(`[orphan-reconciler] sessionAliveExemptTeamName "${r.sessionAliveExemptTeamName}" is configured and its session-alive file exists, but that team could not be resolved -- the exemption is NOT currently protecting it
@@ -2114,16 +2114,16 @@ Respond with EXACTLY one line of strict JSON, no other text before or after: {"l
2114
2114
  WHERE conversation_id = ? AND generation = ? AND job_id = ? AND phase = 'reserved' AND receipt_path = ?`).run(n,new Date().toISOString(),r.conversationId,r.generation,t,r.receiptPath).changes!==1)throw new Error("On-demand generation no longer owns this dispatch")}function U0(e,t,n,r){return e.prepare(`SELECT 1 FROM on_demand_launches WHERE conversation_id = ? AND generation = ?
2115
2115
  AND job_id = ? AND run_id = ? AND phase = 'dispatching'`).get(r.conversationId,r.generation,t,n)!==void 0}var G=class extends Error{code;exitCode;constructor(t,n,r=2){super(n),this.code=t,this.exitCode=r}};function uy(e){let t;try{if(typeof e!="string")throw new Error("expected a cron expression string");let n=e.trim().split(/\s+/);if(n.length!==5)throw new Error("expected five fields: minute hour day-of-month month day-of-week");t="minute";let r=fl(n[0],0,59);t="hour";let s=fl(n[1],0,23);t="dayOfMonth";let o=fl(n[2],1,31);t="month";let i=fl(n[3],1,12);t="dayOfWeek";let a=fl(n[4],0,7,l=>l===7?0:l);return{ok:!0,schedule:{__brand:"CronSchedule",minute:r,hour:s,dayOfMonth:o,month:i,dayOfWeek:a}}}catch(n){let r=n instanceof Error?n.message:String(n);return{ok:!1,error:t?{message:r,field:t}:{message:r}}}}function fl(e,t,n,r=s=>s){if(e.length===0)throw new Error("empty field");let s=new Set;for(let o of e.split(",")){if(o.length===0)throw new Error(`invalid list in "${e}"`);let i=o.split("/");if(i.length>2)throw new Error(`invalid step in "${o}"`);let a=i[0],c=i[1]===void 0?1:dy(i[1],1,n-t+1,o),l=a.split("-");if(l.length>2)throw new Error(`invalid range in "${o}"`);let d=a==="*"?t:dy(l[0],t,n,o),u=a==="*"?n:l[1]!==void 0?dy(l[1],t,n,o):i[1]?n:d;if(d>u)throw new Error(`range starts after it ends in "${o}"`);for(let f=d;f<=u;f+=c)s.add(r(f))}return{values:s,wildcard:e.split(",").some(o=>o.split("/")[0]==="*")}}function dy(e,t,n,r){if(!/^\d+$/.test(e))throw new Error(`expected an integer in "${r}"`);let s=Number(e);if(!Number.isSafeInteger(s)||s<t||s>n)throw new Error(`value ${e} is outside ${t}-${n}`);return s}function IQ(e,t){let n=e;if(!n.minute.values.has(t.getMinutes())||!n.hour.values.has(t.getHours())||!n.month.values.has(t.getMonth()+1))return!1;let r=n.dayOfMonth.values.has(t.getDate()),s=n.dayOfWeek.values.has(t.getDay());return n.dayOfMonth.wildcard?s:n.dayOfWeek.wildcard?r:r||s}function F0(e,t,n){let r=t.getTime(),s=n.getTime();if(s<r)throw new RangeError("untilInclusive must not precede sinceExclusive");for(let o=(Math.floor(r/6e4)+1)*6e4;o<=s;o+=6e4)if(IQ(e,new Date(o)))return!0;return!1}import{spawn as kQ}from"node:child_process";import{closeSync as RQ,existsSync as NQ,mkdirSync as xQ,openSync as LQ,readdirSync as CQ,unlinkSync as OQ}from"node:fs";import{homedir as DQ}from"node:os";import{join as dm}from"node:path";var j0=["systemd-run","--user","--scope","--collect","--quiet"],$Q=10,q0=50*6e4,MQ=5e3;function um(){return process.env.LMBEE_CRON_LOG_DIR?process.env.LMBEE_CRON_LOG_DIR:dm(DQ(),".lmbee","cron-logs")}function PQ(e,t){try{let n=CQ(e).sort();for(let r of n.slice(0,Math.max(0,n.length-t)))try{OQ(dm(e,r))}catch{}}catch{}}function UQ(e,t){return[...t.spawnPrefix??(t.systemdUnitName!==void 0?[...j0,"--unit",t.systemdUnitName,"--"]:[...j0,"--"]),"sh","-c",e]}function ml(e,t={}){let n=dm(t.logDir??um(),String(e.id));NQ(n)||xQ(n,{recursive:!0});let r=dm(n,`${new Date().toISOString().replace(/[:.]/g,"-")}.log`),s=LQ(r,"a"),o=UQ(e.action_payload,t),[i,...a]=o,c;try{c=kQ(i,a,{detached:!0,stdio:["ignore",s,s],...t.cwd!==void 0?{cwd:t.cwd}:{},...t.env!==void 0?{env:t.env}:{}})}finally{RQ(s)}c.unref();let l=c.pid??null,d=!1,u=t.timeoutMs===void 0?q0:t.timeoutMs,f=t.sigkillGraceMs??MQ,m=u===null?void 0:setTimeout(()=>{if(d)return;let h=c.pid;if(h!==void 0){try{process.kill(-h,"SIGTERM")}catch{}setTimeout(()=>{try{process.kill(-h,0)}catch{return}try{process.kill(-h,"SIGKILL")}catch{}},f).unref()}process.stderr.write(`[lmcron] job ${e.id} timed out after ${u}ms, sending SIGTERM
2116
2116
  `)},u??q0);m?.unref();let p=(h,_)=>{d||(d=!0,m!==void 0&&clearTimeout(m),PQ(n,$Q),t.onExit?.(h,_,l,r))};c.on("error",h=>{process.stderr.write(`[lmcron] job ${e.id} spawn error: ${h.message}
2117
- `),p(null,h)}),c.on("exit",h=>{p(h)})}import{createHash as FQ,randomUUID as jQ}from"node:crypto";var Yo=16*1024,hl=16*1024,fy=512,fm=100,my=4096,py=1024*1024,_l="('pending','running')",qQ="execution_state != 'gone' OR (status = 'escalated' AND escalation_resolved_at IS NULL)";function gl(e){let{run_token_hash:t,...n}=e;return n}function H0(e){return FQ("sha256").update(e,"utf8").digest("hex")}function Fn(e){try{return e()}catch(t){if(t instanceof G)throw t;if(t instanceof H)throw new G(t.code,t.message,t.exitCode);let n=t&&typeof t=="object"&&"code"in t?String(t.code):void 0,r=t instanceof Error?t.message:String(t);throw n!==void 0&&(n.startsWith("SQLITE_BUSY")||n.startsWith("SQLITE_LOCKED"))?new G("DB_BUSY","Database busy; retry after the current writer completes",5):n!==void 0&&n.startsWith("SQLITE_CONSTRAINT")?new G("STRUCTURAL_ERROR",r,2):new G("STORAGE_ERROR",r,1)}}function W0(e,t){return Fn(()=>e.prepare("SELECT * FROM cron_runs WHERE id = ?").get(t)??null)}function St(e,t){let n=W0(e,t);if(n===null)throw new G("NOT_FOUND",`Cron run ${t} does not exist`,3);return n}function HQ(e,t){return e.prepare("SELECT * FROM cron_runs WHERE run_token_hash = ?").get(t)??null}function Xn(e,t){return Fn(()=>e.prepare(`SELECT * FROM cron_runs WHERE job_id = ? AND (${qQ}) ORDER BY id DESC LIMIT 1`).get(t)??null)}function El(e,t,n,r){return Fn(()=>{let s=Xn(e,t);if(s!==null)return s.status==="escalated"?{kind:"escalation",run:s}:{kind:"overlap",run:s};let o=jQ(),i=Te();try{let a=e.prepare(`INSERT INTO cron_runs(job_id, run_token_hash, status, execution_state, trigger_kind, config_snapshot, created_at, updated_at)
2118
- VALUES (?, ?, 'pending', 'active', ?, ?, ?, ?)`).run(t,H0(o),n,r,i,i);return{kind:"claimed",run:St(e,Number(a.lastInsertRowid)),token:o}}catch(a){let c=a&&typeof a=="object"&&"code"in a?String(a.code):void 0;if(c!==void 0&&c.startsWith("SQLITE_CONSTRAINT")){let l=Xn(e,t);if(l!==null)return l.status==="escalated"?{kind:"escalation",run:l}:{kind:"overlap",run:l}}throw a}})}function pa(e,t,n,r){Fn(()=>e.prepare(`UPDATE cron_runs SET status = 'running', execution_identity = ?, pid = ?, started_at = ?, updated_at = ?
2117
+ `),p(null,h)}),c.on("exit",h=>{p(h)})}import{createHash as FQ,randomUUID as jQ}from"node:crypto";var Yo=16*1024,hl=16*1024,fy=512,fm=100,my=4096,py=1024*1024,_l="('pending','running')",qQ="execution_state != 'gone' OR (status = 'escalated' AND escalation_resolved_at IS NULL)";function gl(e){let{run_token_hash:t,...n}=e;return n}function H0(e){return FQ("sha256").update(e,"utf8").digest("hex")}function Fn(e){try{return e()}catch(t){if(t instanceof G)throw t;if(t instanceof H)throw new G(t.code,t.message,t.exitCode);let n=t&&typeof t=="object"&&"code"in t?String(t.code):void 0,r=t instanceof Error?t.message:String(t);throw n!==void 0&&(n.startsWith("SQLITE_BUSY")||n.startsWith("SQLITE_LOCKED"))?new G("DB_BUSY","Database busy; retry after the current writer completes",5):n!==void 0&&n.startsWith("SQLITE_CONSTRAINT")?new G("STRUCTURAL_ERROR",r,2):new G("STORAGE_ERROR",r,1)}}function W0(e,t){return Fn(()=>e.prepare("SELECT * FROM cron_runs WHERE id = ?").get(t)??null)}function bt(e,t){let n=W0(e,t);if(n===null)throw new G("NOT_FOUND",`Cron run ${t} does not exist`,3);return n}function HQ(e,t){return e.prepare("SELECT * FROM cron_runs WHERE run_token_hash = ?").get(t)??null}function Xn(e,t){return Fn(()=>e.prepare(`SELECT * FROM cron_runs WHERE job_id = ? AND (${qQ}) ORDER BY id DESC LIMIT 1`).get(t)??null)}function El(e,t,n,r){return Fn(()=>{let s=Xn(e,t);if(s!==null)return s.status==="escalated"?{kind:"escalation",run:s}:{kind:"overlap",run:s};let o=jQ(),i=Te();try{let a=e.prepare(`INSERT INTO cron_runs(job_id, run_token_hash, status, execution_state, trigger_kind, config_snapshot, created_at, updated_at)
2118
+ VALUES (?, ?, 'pending', 'active', ?, ?, ?, ?)`).run(t,H0(o),n,r,i,i);return{kind:"claimed",run:bt(e,Number(a.lastInsertRowid)),token:o}}catch(a){let c=a&&typeof a=="object"&&"code"in a?String(a.code):void 0;if(c!==void 0&&c.startsWith("SQLITE_CONSTRAINT")){let l=Xn(e,t);if(l!==null)return l.status==="escalated"?{kind:"escalation",run:l}:{kind:"overlap",run:l}}throw a}})}function pa(e,t,n,r){Fn(()=>e.prepare(`UPDATE cron_runs SET status = 'running', execution_identity = ?, pid = ?, started_at = ?, updated_at = ?
2119
2119
  WHERE id = ? AND status = 'pending'`).run(JSON.stringify(n),r,Te(),Te(),t))}function yl(e,t,n,r){e.prepare("UPDATE cron_runs SET execution_identity = ?, pid = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(n),r,Te(),t)}function WQ(e,t){Fn(()=>e.prepare(`UPDATE cron_runs SET execution_state = 'gone', execution_gone_at = ?, execution_uncertain_reason = NULL, updated_at = ?
2120
2120
  WHERE id = ? AND execution_state != 'gone'`).run(Te(),Te(),t))}function wl(e,t,n){Fn(()=>e.prepare(`UPDATE cron_runs SET execution_state = 'uncertain', execution_uncertain_reason = ?, updated_at = ?
2121
2121
  WHERE id = ? AND execution_state != 'gone'`).run(n.slice(0,1024),Te(),t))}function pl(e,t,n){let r=Le(e,t);if(Buffer.byteLength(r,"utf8")>n)throw new G("INVALID_ARGUMENT",`${t} exceeds ${n} bytes`);return r}function BQ(e){if(e===void 0)return[];if(!Array.isArray(e))throw new G("INVALID_ARGUMENT","artifacts must be an array");if(e.length>fm)throw new G("INVALID_ARGUMENT",`at most ${fm} artifacts are allowed`);return e.map(t=>{if(typeof t!="string")throw new G("INVALID_ARGUMENT","artifacts must be strings");return pl(t,"artifact",my)})}function B0(e,t){if(e.status!=="succeeded"&&e.status!=="failed"&&e.status!=="escalated")throw new G("INVALID_ARGUMENT",'status must be "succeeded", "failed", or "escalated"');let n=pl(e.summary,"summary",Yo),r=BQ(e.artifacts),s=null,o=null,i=null;if(e.status==="escalated"){s=pl(e.action??"","requested action",hl),i=e.reason!==void 0?pl(e.reason,"escalation reason",hl):n;let a=e.owner!==void 0?pl(e.owner,"owner",fy):t;if(a===null||a.trim().length===0)throw new G("INVALID_ARGUMENT","an escalation requires an owner or a job with a configured default escalation owner");o=a}return{status:e.status,summary:n,artifacts:JSON.stringify(r),escalationAction:s,escalationOwner:o,escalationReason:i}}function G0(e,t){return e.status===t.status&&e.summary===t.summary&&e.artifacts===t.artifacts&&e.escalation_action===t.escalationAction&&e.escalation_owner===t.escalationOwner&&e.escalation_reason===t.escalationReason}function X0(e){try{let t=JSON.parse(e.config_snapshot);return typeof t.escalationOwner=="string"&&t.escalationOwner.trim().length>0?t.escalationOwner:null}catch{return null}}function hy(e,t,n){let r=B0(n,X0(t)),s=Te();if(e.prepare(`UPDATE cron_runs SET status = ?, summary = ?, artifacts = ?, escalation_reason = ?, escalation_action = ?,
2122
2122
  escalation_owner = ?, reported_at = ?, finished_at = ?, updated_at = ?
2123
- WHERE id = ? AND status IN ${_l} AND reported_at IS NULL`).run(r.status,r.summary,r.artifacts,r.escalationReason,r.escalationAction,r.escalationOwner,s,s,s,t.id).changes===0){let i=St(e,t.id);if(G0(i,r))return i;throw new G("CONFLICTING_REPORT",`Cron run ${t.id} already has a different terminal report`,4)}return St(e,t.id)}function V0(e,t,n){return Fn(()=>{let r=HQ(e,H0(t));if(r===null)throw new G("NOT_FOUND","No cron run matches the supplied report token",3);if(r.reported_at!==null||r.status!=="pending"&&r.status!=="running"){let s=B0(n,X0(r));if(G0(r,s))return r;throw new G("CONFLICTING_REPORT",`Cron run ${r.id} already has a different terminal report`,4)}return hy(e,r,n)})}function Qr(e,t,n){let r=e.transaction(()=>{let s=St(e,t);s.reported_at===null&&(s.status==="pending"||s.status==="running")&&n.report!==void 0&&hy(e,s,n.report);let o=St(e,t);if(o.reported_at===null&&(o.status==="pending"||o.status==="running")&&n.fallback!==void 0){let i=n.fallback.ok?"succeeded":"failed";e.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${_l} AND reported_at IS NULL`).run(i,n.fallback.summary.slice(0,Yo),Te(),Te(),t)}return WQ(e,t),St(e,t)});return Fn(()=>r.immediate())}function J0(e,t,n){let r=e.transaction(()=>{let s=St(e,t);s.reported_at===null&&(s.status==="pending"||s.status==="running")&&n.report!==void 0&&hy(e,s,n.report);let o=St(e,t);if(o.reported_at===null&&(o.status==="pending"||o.status==="running")&&n.fallback!==void 0){let i=n.fallback.ok?"succeeded":"failed";e.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${_l} AND reported_at IS NULL`).run(i,n.fallback.summary.slice(0,Yo),Te(),Te(),t)}return St(e,t)});return Fn(()=>r.immediate())}function _y(e,t,n){return Fn(()=>{let r=W0(e,t);if(r===null)return null;if(r.reported_at!==null||r.status!=="pending"&&r.status!=="running")return r;let s=n.ok?"succeeded":"failed";return e.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${_l} AND reported_at IS NULL`).run(s,n.summary.slice(0,Yo),Te(),Te(),r.id),St(e,r.id)})}function Y0(e,t,n={}){let r=e.transaction(()=>{let s=St(e,t),o=n.resolution!==void 0?n.resolution.trim():"",i=n.actor!==void 0?n.actor.trim():"",a=n.note!==void 0?n.note.trim():"",c=!1;if(s.execution_state!=="gone"){if(n.confirmStopped!==!0)throw new G("EXECUTION_FENCED",`Cron run ${t} execution state is "${s.execution_state}"; verify the process is gone and retry with --confirm-stopped`,4);e.prepare(`UPDATE cron_runs SET execution_state = 'gone', execution_gone_at = ?, execution_uncertain_reason = NULL,
2123
+ WHERE id = ? AND status IN ${_l} AND reported_at IS NULL`).run(r.status,r.summary,r.artifacts,r.escalationReason,r.escalationAction,r.escalationOwner,s,s,s,t.id).changes===0){let i=bt(e,t.id);if(G0(i,r))return i;throw new G("CONFLICTING_REPORT",`Cron run ${t.id} already has a different terminal report`,4)}return bt(e,t.id)}function V0(e,t,n){return Fn(()=>{let r=HQ(e,H0(t));if(r===null)throw new G("NOT_FOUND","No cron run matches the supplied report token",3);if(r.reported_at!==null||r.status!=="pending"&&r.status!=="running"){let s=B0(n,X0(r));if(G0(r,s))return r;throw new G("CONFLICTING_REPORT",`Cron run ${r.id} already has a different terminal report`,4)}return hy(e,r,n)})}function Zr(e,t,n){let r=e.transaction(()=>{let s=bt(e,t);s.reported_at===null&&(s.status==="pending"||s.status==="running")&&n.report!==void 0&&hy(e,s,n.report);let o=bt(e,t);if(o.reported_at===null&&(o.status==="pending"||o.status==="running")&&n.fallback!==void 0){let i=n.fallback.ok?"succeeded":"failed";e.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${_l} AND reported_at IS NULL`).run(i,n.fallback.summary.slice(0,Yo),Te(),Te(),t)}return WQ(e,t),bt(e,t)});return Fn(()=>r.immediate())}function J0(e,t,n){let r=e.transaction(()=>{let s=bt(e,t);s.reported_at===null&&(s.status==="pending"||s.status==="running")&&n.report!==void 0&&hy(e,s,n.report);let o=bt(e,t);if(o.reported_at===null&&(o.status==="pending"||o.status==="running")&&n.fallback!==void 0){let i=n.fallback.ok?"succeeded":"failed";e.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${_l} AND reported_at IS NULL`).run(i,n.fallback.summary.slice(0,Yo),Te(),Te(),t)}return bt(e,t)});return Fn(()=>r.immediate())}function _y(e,t,n){return Fn(()=>{let r=W0(e,t);if(r===null)return null;if(r.reported_at!==null||r.status!=="pending"&&r.status!=="running")return r;let s=n.ok?"succeeded":"failed";return e.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${_l} AND reported_at IS NULL`).run(s,n.summary.slice(0,Yo),Te(),Te(),r.id),bt(e,r.id)})}function Y0(e,t,n={}){let r=e.transaction(()=>{let s=bt(e,t),o=n.resolution!==void 0?n.resolution.trim():"",i=n.actor!==void 0?n.actor.trim():"",a=n.note!==void 0?n.note.trim():"",c=!1;if(s.execution_state!=="gone"){if(n.confirmStopped!==!0)throw new G("EXECUTION_FENCED",`Cron run ${t} execution state is "${s.execution_state}"; verify the process is gone and retry with --confirm-stopped`,4);e.prepare(`UPDATE cron_runs SET execution_state = 'gone', execution_gone_at = ?, execution_uncertain_reason = NULL,
2124
2124
  execution_confirmation_note = ?, updated_at = ? WHERE id = ? AND execution_state != 'gone'`).run(Te(),a||o||"confirmed stopped by operator",Te(),t),c=!0}s.status==="escalated"&&s.escalation_resolved_at===null&&(e.prepare(`UPDATE cron_runs SET escalation_resolved_at = ?, escalation_resolution = ?, escalation_resolution_actor = ?,
2125
- escalation_resolution_note = ?, updated_at = ? WHERE id = ? AND escalation_resolved_at IS NULL`).run(Te(),o||"resolved",i||"operator",a||o||"resolved",Te(),t),c=!0);let l=St(e,t);if(l.reported_at===null&&(l.status==="pending"||l.status==="running")&&(e.prepare(`UPDATE cron_runs SET status = 'failed', summary = ?, finished_at = ?, updated_at = ?
2126
- WHERE id = ? AND status IN ${_l} AND reported_at IS NULL`).run(`reconciled by operator without a worker report: ${a||o||"execution confirmed stopped"}`.slice(0,Yo),Te(),Te(),t),c=!0),!c)throw new G("INVALID_ARGUMENT",`Cron run ${t} has no fenced execution or unresolved escalation to resolve`);let d=Te();return e.prepare("UPDATE cron_jobs SET last_checked_ts = ?, updated_at = ? WHERE id = ? AND (last_checked_ts IS NULL OR last_checked_ts < ?)").run(d,d,s.job_id,d),St(e,t)});return Fn(()=>r.immediate())}function mm(e,t){if(!Number.isSafeInteger(t.limit)||t.limit<1||t.limit>et)throw new G("INVALID_ARGUMENT",`limit must be a positive integer <= ${et}`);return Fn(()=>{let n=["id > ?"],r=[t.after];t.jobId!==void 0&&(n.push("job_id = ?"),r.push(t.jobId)),t.status!==void 0&&(n.push("status = ?"),r.push(t.status));let s=e.prepare(`SELECT * FROM cron_runs WHERE ${n.join(" AND ")} ORDER BY id LIMIT ?`).all(...r,t.limit+1),o=s.length>t.limit,i=o?s.slice(0,t.limit):s;return{rows:i,next_cursor:o?i[i.length-1].id:null}})}import{spawn as gy}from"node:child_process";import{fileURLToPath as GQ}from"node:url";import{createHash as XQ}from"node:crypto";import{existsSync as VQ,mkdirSync as JQ,mkdtempSync as YQ,readFileSync as KQ,rmSync as K0,writeFileSync as tC}from"node:fs";import{homedir as zQ,tmpdir as QQ}from"node:os";import{isAbsolute as ZQ,join as Sl,resolve as Ko}from"node:path";var e9=["lmctl"],t9=["miniplayer"],n9=10*6e4,r9=50*6e4,s9=50*6e4,z0=24*60*6e4,nC=5e3,pm=1024*1024;function Tl(){return{text:"",overflow:!1}}function vl(e,t){if(e.overflow)return;let n=e.text+t.toString("utf8");n.length>pm?(e.text=n.slice(0,pm),e.overflow=!0):e.text=n}function Mt(e){return e instanceof Error?e.message:String(e)}function o9(e,t,n){try{wl(e,t,n)}catch{}}function Nt(e,t,n){try{return Qr(e,t,n),!0}catch(r){return process.stderr.write(`[lmcron] run ${t} completion could not be committed (fence retained): ${Mt(r)}
2125
+ escalation_resolution_note = ?, updated_at = ? WHERE id = ? AND escalation_resolved_at IS NULL`).run(Te(),o||"resolved",i||"operator",a||o||"resolved",Te(),t),c=!0);let l=bt(e,t);if(l.reported_at===null&&(l.status==="pending"||l.status==="running")&&(e.prepare(`UPDATE cron_runs SET status = 'failed', summary = ?, finished_at = ?, updated_at = ?
2126
+ WHERE id = ? AND status IN ${_l} AND reported_at IS NULL`).run(`reconciled by operator without a worker report: ${a||o||"execution confirmed stopped"}`.slice(0,Yo),Te(),Te(),t),c=!0),!c)throw new G("INVALID_ARGUMENT",`Cron run ${t} has no fenced execution or unresolved escalation to resolve`);let d=Te();return e.prepare("UPDATE cron_jobs SET last_checked_ts = ?, updated_at = ? WHERE id = ? AND (last_checked_ts IS NULL OR last_checked_ts < ?)").run(d,d,s.job_id,d),bt(e,t)});return Fn(()=>r.immediate())}function mm(e,t){if(!Number.isSafeInteger(t.limit)||t.limit<1||t.limit>et)throw new G("INVALID_ARGUMENT",`limit must be a positive integer <= ${et}`);return Fn(()=>{let n=["id > ?"],r=[t.after];t.jobId!==void 0&&(n.push("job_id = ?"),r.push(t.jobId)),t.status!==void 0&&(n.push("status = ?"),r.push(t.status));let s=e.prepare(`SELECT * FROM cron_runs WHERE ${n.join(" AND ")} ORDER BY id LIMIT ?`).all(...r,t.limit+1),o=s.length>t.limit,i=o?s.slice(0,t.limit):s;return{rows:i,next_cursor:o?i[i.length-1].id:null}})}import{spawn as gy}from"node:child_process";import{fileURLToPath as GQ}from"node:url";import{createHash as XQ}from"node:crypto";import{existsSync as VQ,mkdirSync as JQ,mkdtempSync as YQ,readFileSync as KQ,rmSync as K0,writeFileSync as tC}from"node:fs";import{homedir as zQ,tmpdir as QQ}from"node:os";import{isAbsolute as ZQ,join as Sl,resolve as Ko}from"node:path";var e9=["lmctl"],t9=["miniplayer"],n9=10*6e4,r9=50*6e4,s9=50*6e4,z0=24*60*6e4,nC=5e3,pm=1024*1024;function Tl(){return{text:"",overflow:!1}}function vl(e,t){if(e.overflow)return;let n=e.text+t.toString("utf8");n.length>pm?(e.text=n.slice(0,pm),e.overflow=!0):e.text=n}function Mt(e){return e instanceof Error?e.message:String(e)}function o9(e,t,n){try{wl(e,t,n)}catch{}}function xt(e,t,n){try{return Zr(e,t,n),!0}catch(r){return process.stderr.write(`[lmcron] run ${t} completion could not be committed (fence retained): ${Mt(r)}
2127
2127
  `),!1}}function Rn(e,t,n,r){o9(e,t,n);try{J0(e,t,r)}catch(s){process.stderr.write(`[lmcron] run ${t} outcome could not be persisted (fence retained): ${Mt(s)}
2128
2128
  `)}}function Ey(e,t,n){if(e===null)throw new Error(`${n}: disabling timeout is supported only for script workers`);let r=e??t;if(!Number.isFinite(r)||r<=0||r>z0)throw new Error(`${n} must be a positive number of milliseconds <= ${z0}`);return r}var Q0=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","ClaudeMock"]),i9=/^[A-Za-z0-9][A-Za-z0-9._:@/+~-]*$/;function wy(e){if(!Q0.has(e))throw new G("INVALID_ARGUMENT",`provider "${e}" is not one of lmctl's supported providers (${[...Q0].join(", ")})`);return e}function Ty(e){if(!i9.test(e))throw new G("INVALID_ARGUMENT",`model "${e}" is not a safe lmctl model token (no whitespace, quotes, '=' or control characters)`);return e}function hm(e){if(!ZQ(e))throw new G("INVALID_ARGUMENT",`sessiondir "${e}" must be an absolute path`);if(/["\u0000-\u001f\u007f]/.test(e))throw new G("INVALID_ARGUMENT",`sessiondir contains a quote, newline, or control character that lmctl cannot represent: ${JSON.stringify(e)}`);return e}function a9(e){let t=["_MEMBER_",`alias=${e.alias}`,`provider=${wy(e.provider)}`];return e.model!==null&&e.model!==void 0&&t.push(`model=${Ty(e.model)}`),t.push(`sessiondir="${hm(e.sessiondir)}"`),t.join(" ")}function c9(e){let t=e.name,n=t!==void 0&&t.length>0?Ko(t):":memory:";return XQ("sha256").update(n,"utf8").digest("hex").slice(0,16)}function l9(){return process.env.LMBEE_CRON_SESSION_DIR?process.env.LMBEE_CRON_SESSION_DIR:Sl(zQ(),".lmbee","cron-sessions")}function d9(e){return`'${e.replace(/'/g,"'\\''")}'`}function u9(e){let t=e.name;return t!==void 0&&t.length>0&&t!==":memory:"?`LMBEE_DB=${d9(Ko(t))} `:""}function f9(e,t,n){let r=u9(n);return`${e}
2129
2129
 
@@ -2149,20 +2149,20 @@ succeeded.`}var p9=new Set(["run_token","status","summary","artifacts","escalati
2149
2149
 
2150
2150
  ${a}
2151
2151
  `,{mode:384}),e.prepare("UPDATE cron_jobs SET session_teamfile = ?, session_alias = ?, updated_at = ? WHERE id = ?").run(i,r,new Date().toISOString(),t.id),{teamfile:i,alias:r}}function vy(e){try{return process.kill(-e,0),!0}catch{return!1}}function yy(e,t){if(e.pid===void 0)return;let n=e.pid;try{process.kill(-n,"SIGTERM")}catch{return}setTimeout(()=>{try{process.kill(-n,0)}catch{return}try{process.kill(-n,"SIGKILL")}catch{}},t).unref()}function g9(e){let t=null,n=null,r=null,s=null;for(let o of e.split(`
2152
- `)){let i=o.trim();if(i.length===0)continue;let a;try{a=JSON.parse(i)}catch{continue}if(typeof a!="object"||a===null)continue;let c=a,l=typeof c.message=="string"?c.message:String(c.status);c.status==="ok"&&typeof c.replyText=="string"?t=c.replyText:c.status==="stalled"?n=l:c.status==="busy"?r=l:(c.status==="error"||c.status==="failed")&&(s=l)}return n!==null?{kind:"stalled",message:n}:r!==null?{kind:"busy",message:r}:s!==null?{kind:"error",message:s}:t!==null?{kind:"completed",text:t}:{kind:"none"}}function Sy(e,t){try{let n=KQ(e,"utf8").trim();return n.length>t?n.slice(-t):n}catch{return""}}var E9=500,Z0=75;function eC(e){let{db:t,job:n,run:r}=e,s=e.onDemand===void 0?n.action_payload:[process.execPath,GQ(new URL("./on-demand-worker.cjs",import.meta.url)),Ko(t.name),e.onDemand.conversationId,String(e.onDemand.generation),String(n.id),String(r.id),n.action_payload,e.onDemand.receiptPath].map(o=>`'${o.replaceAll("'","'\\''")}'`).join(" ");try{pa(t,r.id,{kind:"script",cwd:n.working_directory},null)}catch(o){Nt(t,r.id,{fallback:{ok:!1,summary:`script setup failed before spawn: ${Mt(o)}`}});return}try{ml({id:n.id,action_payload:s},{...e.logDir!==void 0?{logDir:e.logDir}:{},...n.working_directory!==null?{cwd:n.working_directory}:{},...e.spawnPrefixes?.script!==void 0?{spawnPrefix:e.spawnPrefixes.script}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},...e.sigkillGraceMs!==void 0?{sigkillGraceMs:e.sigkillGraceMs}:{},...t.name!==void 0&&t.name!==":memory:"?{env:{...process.env,LMBEE_DB:Ko(t.name)}}:{},onExit:(o,i,a,c)=>{let l=()=>{if(i!==void 0){Nt(t,r.id,{fallback:{ok:!1,summary:`script spawn error: ${i.message}`}});return}let d=o===0||o===Z0,u=Sy(c,E9),f=o===Z0?`script no-op (exit ${o})${u?`: ${u}`:""}`:`script exited with code ${o}${u?`: ${u}`:""}`;a!==null&&vy(a)?Rn(t,r.id,"process group still alive after exit",{fallback:{ok:d,summary:f}}):Nt(t,r.id,{fallback:{ok:d,summary:f}})};if(e.onDemand===void 0)return l();try{br(t,l)}catch{}}})}catch(o){Nt(t,r.id,{fallback:{ok:!1,summary:`script spawn error: ${Mt(o)}`}})}}function y9(e){let{db:t,job:n,run:r}=e,s,o,i,a;try{s=Ey(e.timeoutMs,n9,"timeoutMs"),o=e.sigkillGraceMs??nC,i=[...e.spawnPrefixes?.miniplayer??t9,"run",...n.model!==null?["-m",n.model]:[]],a=m9(n.action_payload,e.runToken)}catch(_){Nt(t,r.id,{fallback:{ok:!1,summary:`miniplayer setup failed before spawn: ${Mt(_)}`}});return}let[c,...l]=i,d;try{d=gy(c,l,{detached:!0,stdio:["pipe","pipe","pipe"],...n.working_directory!==null?{cwd:n.working_directory}:{},...t.name!==void 0&&t.name!==":memory:"?{env:{...process.env,LMBEE_DB:Ko(t.name)}}:{}})}catch(_){Nt(t,r.id,{fallback:{ok:!1,summary:`miniplayer spawn error: ${Mt(_)}`}});return}d.unref();let u=Tl(),f=Tl(),m=!1,p=!1,h=setTimeout(()=>{m||(m=!0,yy(d,o),Rn(t,r.id,`miniplayer timed out after ${s}ms`,{fallback:{ok:!1,summary:`miniplayer timed out after ${s}ms`}}))},s);h.unref(),d.on("spawn",()=>p=!0),d.stdout?.on("data",_=>vl(u,_)),d.stderr?.on("data",_=>vl(f,_)),d.stdin?.on("error",()=>{}),d.on("error",_=>{if(m)return;m=!0,clearTimeout(h);let g={fallback:{ok:!1,summary:`miniplayer spawn error: ${_.message}`}};p?Rn(t,r.id,`miniplayer post-spawn error: ${_.message}`,g):Nt(t,r.id,g)}),d.on("close",(_,g)=>{if(m)return;m=!0,clearTimeout(h);let w=d.pid??null,y=w!==null&&vy(w),E=u.overflow?{ok:!1,reason:`output exceeded the ${pm}-byte capture limit`}:rC(u.text,e.runToken),T=E.ok?{report:E.result}:{fallback:{ok:!1,summary:`miniplayer produced no valid structured result (${E.reason})`+(_!==0||g!==null?`; exit ${g??_}: ${f.text.trim().slice(-300)}`:"")}};y?Rn(t,r.id,"miniplayer process group still alive after wrapper exit",T):u.overflow?Rn(t,r.id,"miniplayer output exceeded the capture limit; result not trusted",T):Nt(t,r.id,T)});try{pa(t,r.id,{kind:"miniplayer",model:n.model},d.pid??null)}catch(_){process.stderr.write(`[lmcron] miniplayer run ${r.id} state write failed after spawn: ${Mt(_)}
2152
+ `)){let i=o.trim();if(i.length===0)continue;let a;try{a=JSON.parse(i)}catch{continue}if(typeof a!="object"||a===null)continue;let c=a,l=typeof c.message=="string"?c.message:String(c.status);c.status==="ok"&&typeof c.replyText=="string"?t=c.replyText:c.status==="stalled"?n=l:c.status==="busy"?r=l:(c.status==="error"||c.status==="failed")&&(s=l)}return n!==null?{kind:"stalled",message:n}:r!==null?{kind:"busy",message:r}:s!==null?{kind:"error",message:s}:t!==null?{kind:"completed",text:t}:{kind:"none"}}function Sy(e,t){try{let n=KQ(e,"utf8").trim();return n.length>t?n.slice(-t):n}catch{return""}}var E9=500,Z0=75;function eC(e){let{db:t,job:n,run:r}=e,s=e.onDemand===void 0?n.action_payload:[process.execPath,GQ(new URL("./on-demand-worker.cjs",import.meta.url)),Ko(t.name),e.onDemand.conversationId,String(e.onDemand.generation),String(n.id),String(r.id),n.action_payload,e.onDemand.receiptPath].map(o=>`'${o.replaceAll("'","'\\''")}'`).join(" ");try{pa(t,r.id,{kind:"script",cwd:n.working_directory},null)}catch(o){xt(t,r.id,{fallback:{ok:!1,summary:`script setup failed before spawn: ${Mt(o)}`}});return}try{ml({id:n.id,action_payload:s},{...e.logDir!==void 0?{logDir:e.logDir}:{},...n.working_directory!==null?{cwd:n.working_directory}:{},...e.spawnPrefixes?.script!==void 0?{spawnPrefix:e.spawnPrefixes.script}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},...e.sigkillGraceMs!==void 0?{sigkillGraceMs:e.sigkillGraceMs}:{},...t.name!==void 0&&t.name!==":memory:"?{env:{...process.env,LMBEE_DB:Ko(t.name)}}:{},onExit:(o,i,a,c)=>{let l=()=>{if(i!==void 0){xt(t,r.id,{fallback:{ok:!1,summary:`script spawn error: ${i.message}`}});return}let d=o===0||o===Z0,u=Sy(c,E9),f=o===Z0?`script no-op (exit ${o})${u?`: ${u}`:""}`:`script exited with code ${o}${u?`: ${u}`:""}`;a!==null&&vy(a)?Rn(t,r.id,"process group still alive after exit",{fallback:{ok:d,summary:f}}):xt(t,r.id,{fallback:{ok:d,summary:f}})};if(e.onDemand===void 0)return l();try{br(t,l)}catch{}}})}catch(o){xt(t,r.id,{fallback:{ok:!1,summary:`script spawn error: ${Mt(o)}`}})}}function y9(e){let{db:t,job:n,run:r}=e,s,o,i,a;try{s=Ey(e.timeoutMs,n9,"timeoutMs"),o=e.sigkillGraceMs??nC,i=[...e.spawnPrefixes?.miniplayer??t9,"run",...n.model!==null?["-m",n.model]:[]],a=m9(n.action_payload,e.runToken)}catch(_){xt(t,r.id,{fallback:{ok:!1,summary:`miniplayer setup failed before spawn: ${Mt(_)}`}});return}let[c,...l]=i,d;try{d=gy(c,l,{detached:!0,stdio:["pipe","pipe","pipe"],...n.working_directory!==null?{cwd:n.working_directory}:{},...t.name!==void 0&&t.name!==":memory:"?{env:{...process.env,LMBEE_DB:Ko(t.name)}}:{}})}catch(_){xt(t,r.id,{fallback:{ok:!1,summary:`miniplayer spawn error: ${Mt(_)}`}});return}d.unref();let u=Tl(),f=Tl(),m=!1,p=!1,h=setTimeout(()=>{m||(m=!0,yy(d,o),Rn(t,r.id,`miniplayer timed out after ${s}ms`,{fallback:{ok:!1,summary:`miniplayer timed out after ${s}ms`}}))},s);h.unref(),d.on("spawn",()=>p=!0),d.stdout?.on("data",_=>vl(u,_)),d.stderr?.on("data",_=>vl(f,_)),d.stdin?.on("error",()=>{}),d.on("error",_=>{if(m)return;m=!0,clearTimeout(h);let g={fallback:{ok:!1,summary:`miniplayer spawn error: ${_.message}`}};p?Rn(t,r.id,`miniplayer post-spawn error: ${_.message}`,g):xt(t,r.id,g)}),d.on("close",(_,g)=>{if(m)return;m=!0,clearTimeout(h);let w=d.pid??null,y=w!==null&&vy(w),E=u.overflow?{ok:!1,reason:`output exceeded the ${pm}-byte capture limit`}:rC(u.text,e.runToken),T=E.ok?{report:E.result}:{fallback:{ok:!1,summary:`miniplayer produced no valid structured result (${E.reason})`+(_!==0||g!==null?`; exit ${g??_}: ${f.text.trim().slice(-300)}`:"")}};y?Rn(t,r.id,"miniplayer process group still alive after wrapper exit",T):u.overflow?Rn(t,r.id,"miniplayer output exceeded the capture limit; result not trusted",T):xt(t,r.id,T)});try{pa(t,r.id,{kind:"miniplayer",model:n.model},d.pid??null)}catch(_){process.stderr.write(`[lmcron] miniplayer run ${r.id} state write failed after spawn: ${Mt(_)}
2153
2153
  `)}try{d.stdin?.write(a),d.stdin?.end()}catch(_){process.stderr.write(`[lmcron] miniplayer run ${r.id} stdin write failed: ${Mt(_)}
2154
- `)}}function w9(e){let{db:t,job:n,run:r}=e,s,o,i;try{s=Ey(e.timeoutMs,r9,"timeoutMs"),o=Ey(e.seedTimeoutMs,s9,"seedTimeoutMs"),i=e.sigkillGraceMs??nC}catch(y){Nt(t,r.id,{fallback:{ok:!1,summary:`session setup failed before spawn: ${Mt(y)}`}});return}let a,c;try{({teamfile:a,alias:c}=_9(t,n,e.sessionDir))}catch(y){Nt(t,r.id,{fallback:{ok:!1,summary:`session teamfile creation failed: ${Mt(y)}`}});return}let l=()=>{let y=e.spawnPrefixes?.chat??go,E,T,b;try{let S=f9(n.action_payload,e.runToken,t);E=YQ(Sl(QQ(),"lmbee-cron-session-")),T=Sl(E,`${r.id}.md`),tC(T,S,{mode:384}),b=[...y,"chat",`${a}:${c}`,"--prompt-file",T,"--json"]}catch(S){Nt(t,r.id,{fallback:{ok:!1,summary:`session dispatch setup failed before spawn: ${Mt(S)}`}});return}let[A,...I]=b,R;try{R=gy(A,I,{detached:!0,stdio:["ignore","pipe","pipe"],...n.working_directory!==null?{cwd:n.working_directory}:{},...t.name!==void 0&&t.name!==":memory:"?{env:{...process.env,LMBEE_DB:Ko(t.name)}}:{}})}catch(S){try{K0(E,{recursive:!0,force:!0})}catch{}Nt(t,r.id,{fallback:{ok:!1,summary:`session dispatch spawn error: ${Mt(S)}`}});return}R.unref();let L=Tl(),N=Tl(),k=!1,D=!1,O=()=>{try{K0(E,{recursive:!0,force:!0})}catch{}},v=setTimeout(()=>{k||(k=!0,yy(R,i),Rn(t,r.id,`session timed out after ${s}ms`,{fallback:{ok:!1,summary:`session timed out after ${s}ms`}}))},s);v.unref(),R.on("spawn",()=>D=!0),R.stdout?.on("data",S=>vl(L,S)),R.stderr?.on("data",S=>vl(N,S)),R.on("error",S=>{if(k)return;k=!0,clearTimeout(v);let x={fallback:{ok:!1,summary:`session dispatch spawn error: ${S.message}`}};D?Rn(t,r.id,`session post-spawn error: ${S.message}`,x):(O(),Nt(t,r.id,x))}),R.on("close",S=>{if(k)return;k=!0,clearTimeout(v);let x=R.pid??null,C=x!==null&&vy(x),q=L.overflow?{kind:"overflow"}:g9(L.text),F=q.kind==="completed"?rC(q.text,e.runToken):null,M=q.kind==="completed"&&!C&&!L.overflow,$=F!==null&&F.ok?{report:F.result}:{fallback:{ok:!1,summary:(q.kind==="completed"?"session ended without a valid report":q.kind==="stalled"?"session stalled (native turn still running)":q.kind==="busy"?"session was busy; not started":q.kind==="error"?`session provider error: ${q.message}`:q.kind==="overflow"?`session output exceeded the ${pm}-byte capture limit`:"session ended without positive completion")+(S!==0?` (exit ${S}: ${N.text.trim().slice(-300)})`:"")}};if(M){if(F!==null&&!F.ok){O(),Nt(t,r.id,$);return}if(Nt(t,r.id,$)){O();return}return}let U=q.kind==="stalled"?`session stalled (native turn still running): ${q.message}`:q.kind==="busy"?`session busy (a live worker may own it): ${q.message}`:q.kind==="error"?`session provider error (termination unconfirmed): ${q.message}`:q.kind==="overflow"?"session output exceeded the capture limit; result not trusted":C?"session process group still alive after wrapper exit":`session wrapper exited without positive completion (code ${S})`;Rn(t,r.id,U,$)});try{pa(t,r.id,{kind:"session",provider:n.provider,model:n.model,teamfile:a,alias:c},R.pid??null)}catch(S){process.stderr.write(`[lmcron] session run ${r.id} state write failed after spawn: ${Mt(S)}
2155
- `)}try{yl(t,r.id,{kind:"session",phase:"dispatch",teamfile:a,alias:c},R.pid??null)}catch{}};if(n.session_seeded_at!==null){l();return}let u=[...e.spawnPrefixes?.seed??e9,"seed",a],f=u[0],m=u.slice(1),p;try{p=gy(f,m,{detached:!0,stdio:["ignore","ignore","pipe"],...t.name!==void 0&&t.name!==":memory:"?{env:{...process.env,LMBEE_DB:Ko(t.name)}}:{}})}catch(y){Nt(t,r.id,{fallback:{ok:!1,summary:`session seed spawn error: ${Mt(y)}`}});return}p.unref();let h=Tl(),_=!1,g=!1,w=setTimeout(()=>{_||(_=!0,yy(p,i),Rn(t,r.id,`session seed timed out after ${o}ms; provider initialization may still be running`,{fallback:{ok:!1,summary:`session seed timed out after ${o}ms`}}))},o);w.unref(),p.on("spawn",()=>g=!0),p.stderr?.on("data",y=>vl(h,y)),p.on("error",y=>{if(_)return;_=!0,clearTimeout(w);let E={fallback:{ok:!1,summary:`session seed spawn error: ${y.message}`}};g?Rn(t,r.id,`session seed post-spawn error: ${y.message}`,E):Nt(t,r.id,E)}),p.on("close",y=>{if(!_){if(_=!0,clearTimeout(w),y!==0){Rn(t,r.id,`session seed failed (exit ${y}); provider initialization may still be running`,{fallback:{ok:!1,summary:`session seed failed (exit ${y}): ${h.text.trim().slice(-300)}`}});return}try{t.prepare("UPDATE cron_jobs SET session_seeded_at = ?, updated_at = ? WHERE id = ?").run(new Date().toISOString(),new Date().toISOString(),n.id)}catch(E){Rn(t,r.id,`session seeded but recording identity failed: ${Mt(E)}`,{fallback:{ok:!1,summary:"session seeded but recording seed state failed; will recover on retry"}});return}l()}});try{yl(t,r.id,{kind:"session",phase:"seed",teamfile:a,alias:c},p.pid??null)}catch{}}function by(e){if(ul(e.db,e.job.id)){if(e.onDemand===void 0||!U0(e.db,e.job.id,e.run.id,e.onDemand))return;br(e.db,()=>eC(e));return}try{switch(e.job.action_kind){case"script":eC(e);return;case"miniplayer":y9(e);return;case"session":w9(e);return;default:Nt(e.db,e.run.id,{fallback:{ok:!1,summary:`unsupported run worker kind: ${e.job.action_kind}`}})}}catch(t){Rn(e.db,e.run.id,`unexpected worker dispatch failure: ${Mt(t)}`,{fallback:{ok:!1,summary:`worker dispatch error: ${Mt(t)}`}})}}function v9(e){return e==="enqueue"||e==="command"||e==="script"||e==="session"||e==="miniplayer"}function S9(e){return e==="script"||e==="session"||e==="miniplayer"}function Nn(e){return e instanceof Error?e.message:String(e)}function ha(e){let t=e&&typeof e=="object"&&"code"in e?String(e.code):void 0;if(t!==void 0&&(t.startsWith("SQLITE_BUSY")||t.startsWith("SQLITE_LOCKED")))throw new G("DB_BUSY","Database busy; retry after the current writer completes",5);let n=e instanceof Error?e.message:String(e);throw t!==void 0&&t.startsWith("SQLITE_CONSTRAINT")?new G("STRUCTURAL_ERROR",n,2):new G("STORAGE_ERROR",n,1)}function Zr(e){try{return e()}catch(t){if(t instanceof G)throw t;if(t instanceof H)throw new G(t.code,t.message,t.exitCode);return ha(t)}}function _m(e,t){e.prepare("UPDATE cron_jobs SET revision = revision + 1, updated_at = ? WHERE id = ?").run(Te(),t)}function gm(e,t){return Zr(()=>e.prepare("SELECT * FROM cron_jobs WHERE id = ?").get(t)??null)}function ot(e,t){let n=gm(e,t);if(n===null)throw new G("NOT_FOUND",`Cron job ${t} does not exist`,3);return n}function b9(e){let t;try{t=JSON.parse(e)}catch{throw new G("INVALID_ARGUMENT","enqueue action_payload must be valid JSON")}if(typeof t!="object"||t===null)throw new G("INVALID_ARGUMENT","enqueue action_payload must be a JSON object");let{to:n,prompt:r,from:s}=t;if(typeof n!="string"||n.trim().length===0)throw new G("INVALID_ARGUMENT",'enqueue action_payload requires a nonblank "to"');if(typeof r!="string"||r.trim().length===0)throw new G("INVALID_ARGUMENT",'enqueue action_payload requires a nonblank "prompt"');if(s!==void 0&&(typeof s!="string"||s.trim().length===0))throw new G("INVALID_ARGUMENT",'enqueue action_payload "from", if given, must be a nonblank string')}function iC(e,t){Le(t,"action_payload"),e==="enqueue"&&b9(t)}function aC(e){let{actionKind:t}=e;if(t==="session"){if(e.provider===void 0||e.provider===null||e.provider.trim().length===0)throw new G("INVALID_ARGUMENT","a session job requires a nonblank provider");if(wy(e.provider),e.workingDirectory===void 0||e.workingDirectory===null||e.workingDirectory.trim().length===0)throw new G("INVALID_ARGUMENT","a session job requires an absolute working_directory (--cwd)");hm(e.workingDirectory)}else if(e.provider!==void 0&&e.provider!==null&&e.provider.trim().length>0)throw new G("INVALID_ARGUMENT",`provider is only valid for session jobs (not ${t})`);if(e.model!==void 0&&e.model!==null&&e.model.trim().length===0)throw new G("INVALID_ARGUMENT","model, if given, must be nonblank");if(e.model!==void 0&&e.model!==null&&e.model.trim().length>0&&t!=="session"&&t!=="miniplayer")throw new G("INVALID_ARGUMENT",`model is only valid for session/miniplayer jobs (not ${t})`);if(e.model!==void 0&&e.model!==null&&e.model.trim().length>0&&Ty(e.model),e.workingDirectory!==void 0&&e.workingDirectory!==null&&e.workingDirectory.trim().length>0&&t==="enqueue")throw new G("INVALID_ARGUMENT","working_directory is not valid for enqueue jobs");if(e.workingDirectory!==void 0&&e.workingDirectory!==null&&e.workingDirectory.trim().length===0)throw new G("INVALID_ARGUMENT","working_directory, if given, must be nonblank");if(e.escalationOwner!==void 0&&e.escalationOwner!==null&&e.escalationOwner.trim().length===0)throw new G("INVALID_ARGUMENT","escalation_owner, if given, must be nonblank")}function cC(e){let t=Le(e,"timezone");try{new Intl.DateTimeFormat(void 0,{timeZone:t})}catch{throw new G("INVALID_ARGUMENT",`timezone "${t}" is not a recognized IANA zone name`)}return t}function lC(e){let t=uy(e);if(!t.ok){let n=t.error.field?` (field: ${t.error.field})`:"";throw new G("INVALID_SCHEDULE",`${t.error.message}${n}`)}}function _a(e,t){let n=e.transaction(()=>{if(t.id!==void 0&&(!Number.isSafeInteger(t.id)||t.id<1))throw new G("INVALID_ARGUMENT","id, if given, must be a positive safe integer");let r=Le(t.title,"title");if(!v9(t.actionKind))throw new G("INVALID_ARGUMENT",'action_kind must be "enqueue", "command", "script", "session", or "miniplayer"');lC(t.scheduleExpr),iC(t.actionKind,t.actionPayload),aC({actionKind:t.actionKind,provider:t.provider??null,model:t.model??null,workingDirectory:t.workingDirectory??null,escalationOwner:t.escalationOwner??null});let s=t.timezone!==void 0?cC(t.timezone):null,o=Te();try{let i=e.prepare(t.id!==void 0?`INSERT INTO cron_jobs(id, title, schedule_expr, action_kind, action_payload, provider, model,
2154
+ `)}}function w9(e){let{db:t,job:n,run:r}=e,s,o,i;try{s=Ey(e.timeoutMs,r9,"timeoutMs"),o=Ey(e.seedTimeoutMs,s9,"seedTimeoutMs"),i=e.sigkillGraceMs??nC}catch(y){xt(t,r.id,{fallback:{ok:!1,summary:`session setup failed before spawn: ${Mt(y)}`}});return}let a,c;try{({teamfile:a,alias:c}=_9(t,n,e.sessionDir))}catch(y){xt(t,r.id,{fallback:{ok:!1,summary:`session teamfile creation failed: ${Mt(y)}`}});return}let l=()=>{let y=e.spawnPrefixes?.chat??go,E,T,b;try{let S=f9(n.action_payload,e.runToken,t);E=YQ(Sl(QQ(),"lmbee-cron-session-")),T=Sl(E,`${r.id}.md`),tC(T,S,{mode:384}),b=[...y,"chat",`${a}:${c}`,"--prompt-file",T,"--json"]}catch(S){xt(t,r.id,{fallback:{ok:!1,summary:`session dispatch setup failed before spawn: ${Mt(S)}`}});return}let[A,...I]=b,R;try{R=gy(A,I,{detached:!0,stdio:["ignore","pipe","pipe"],...n.working_directory!==null?{cwd:n.working_directory}:{},...t.name!==void 0&&t.name!==":memory:"?{env:{...process.env,LMBEE_DB:Ko(t.name)}}:{}})}catch(S){try{K0(E,{recursive:!0,force:!0})}catch{}xt(t,r.id,{fallback:{ok:!1,summary:`session dispatch spawn error: ${Mt(S)}`}});return}R.unref();let L=Tl(),N=Tl(),k=!1,D=!1,O=()=>{try{K0(E,{recursive:!0,force:!0})}catch{}},v=setTimeout(()=>{k||(k=!0,yy(R,i),Rn(t,r.id,`session timed out after ${s}ms`,{fallback:{ok:!1,summary:`session timed out after ${s}ms`}}))},s);v.unref(),R.on("spawn",()=>D=!0),R.stdout?.on("data",S=>vl(L,S)),R.stderr?.on("data",S=>vl(N,S)),R.on("error",S=>{if(k)return;k=!0,clearTimeout(v);let x={fallback:{ok:!1,summary:`session dispatch spawn error: ${S.message}`}};D?Rn(t,r.id,`session post-spawn error: ${S.message}`,x):(O(),xt(t,r.id,x))}),R.on("close",S=>{if(k)return;k=!0,clearTimeout(v);let x=R.pid??null,C=x!==null&&vy(x),q=L.overflow?{kind:"overflow"}:g9(L.text),F=q.kind==="completed"?rC(q.text,e.runToken):null,M=q.kind==="completed"&&!C&&!L.overflow,$=F!==null&&F.ok?{report:F.result}:{fallback:{ok:!1,summary:(q.kind==="completed"?"session ended without a valid report":q.kind==="stalled"?"session stalled (native turn still running)":q.kind==="busy"?"session was busy; not started":q.kind==="error"?`session provider error: ${q.message}`:q.kind==="overflow"?`session output exceeded the ${pm}-byte capture limit`:"session ended without positive completion")+(S!==0?` (exit ${S}: ${N.text.trim().slice(-300)})`:"")}};if(M){if(F!==null&&!F.ok){O(),xt(t,r.id,$);return}if(xt(t,r.id,$)){O();return}return}let U=q.kind==="stalled"?`session stalled (native turn still running): ${q.message}`:q.kind==="busy"?`session busy (a live worker may own it): ${q.message}`:q.kind==="error"?`session provider error (termination unconfirmed): ${q.message}`:q.kind==="overflow"?"session output exceeded the capture limit; result not trusted":C?"session process group still alive after wrapper exit":`session wrapper exited without positive completion (code ${S})`;Rn(t,r.id,U,$)});try{pa(t,r.id,{kind:"session",provider:n.provider,model:n.model,teamfile:a,alias:c},R.pid??null)}catch(S){process.stderr.write(`[lmcron] session run ${r.id} state write failed after spawn: ${Mt(S)}
2155
+ `)}try{yl(t,r.id,{kind:"session",phase:"dispatch",teamfile:a,alias:c},R.pid??null)}catch{}};if(n.session_seeded_at!==null){l();return}let u=[...e.spawnPrefixes?.seed??e9,"seed",a],f=u[0],m=u.slice(1),p;try{p=gy(f,m,{detached:!0,stdio:["ignore","ignore","pipe"],...t.name!==void 0&&t.name!==":memory:"?{env:{...process.env,LMBEE_DB:Ko(t.name)}}:{}})}catch(y){xt(t,r.id,{fallback:{ok:!1,summary:`session seed spawn error: ${Mt(y)}`}});return}p.unref();let h=Tl(),_=!1,g=!1,w=setTimeout(()=>{_||(_=!0,yy(p,i),Rn(t,r.id,`session seed timed out after ${o}ms; provider initialization may still be running`,{fallback:{ok:!1,summary:`session seed timed out after ${o}ms`}}))},o);w.unref(),p.on("spawn",()=>g=!0),p.stderr?.on("data",y=>vl(h,y)),p.on("error",y=>{if(_)return;_=!0,clearTimeout(w);let E={fallback:{ok:!1,summary:`session seed spawn error: ${y.message}`}};g?Rn(t,r.id,`session seed post-spawn error: ${y.message}`,E):xt(t,r.id,E)}),p.on("close",y=>{if(!_){if(_=!0,clearTimeout(w),y!==0){Rn(t,r.id,`session seed failed (exit ${y}); provider initialization may still be running`,{fallback:{ok:!1,summary:`session seed failed (exit ${y}): ${h.text.trim().slice(-300)}`}});return}try{t.prepare("UPDATE cron_jobs SET session_seeded_at = ?, updated_at = ? WHERE id = ?").run(new Date().toISOString(),new Date().toISOString(),n.id)}catch(E){Rn(t,r.id,`session seeded but recording identity failed: ${Mt(E)}`,{fallback:{ok:!1,summary:"session seeded but recording seed state failed; will recover on retry"}});return}l()}});try{yl(t,r.id,{kind:"session",phase:"seed",teamfile:a,alias:c},p.pid??null)}catch{}}function by(e){if(ul(e.db,e.job.id)){if(e.onDemand===void 0||!U0(e.db,e.job.id,e.run.id,e.onDemand))return;br(e.db,()=>eC(e));return}try{switch(e.job.action_kind){case"script":eC(e);return;case"miniplayer":y9(e);return;case"session":w9(e);return;default:xt(e.db,e.run.id,{fallback:{ok:!1,summary:`unsupported run worker kind: ${e.job.action_kind}`}})}}catch(t){Rn(e.db,e.run.id,`unexpected worker dispatch failure: ${Mt(t)}`,{fallback:{ok:!1,summary:`worker dispatch error: ${Mt(t)}`}})}}function v9(e){return e==="enqueue"||e==="command"||e==="script"||e==="session"||e==="miniplayer"}function S9(e){return e==="script"||e==="session"||e==="miniplayer"}function Nn(e){return e instanceof Error?e.message:String(e)}function ha(e){let t=e&&typeof e=="object"&&"code"in e?String(e.code):void 0;if(t!==void 0&&(t.startsWith("SQLITE_BUSY")||t.startsWith("SQLITE_LOCKED")))throw new G("DB_BUSY","Database busy; retry after the current writer completes",5);let n=e instanceof Error?e.message:String(e);throw t!==void 0&&t.startsWith("SQLITE_CONSTRAINT")?new G("STRUCTURAL_ERROR",n,2):new G("STORAGE_ERROR",n,1)}function es(e){try{return e()}catch(t){if(t instanceof G)throw t;if(t instanceof H)throw new G(t.code,t.message,t.exitCode);return ha(t)}}function _m(e,t){e.prepare("UPDATE cron_jobs SET revision = revision + 1, updated_at = ? WHERE id = ?").run(Te(),t)}function gm(e,t){return es(()=>e.prepare("SELECT * FROM cron_jobs WHERE id = ?").get(t)??null)}function ot(e,t){let n=gm(e,t);if(n===null)throw new G("NOT_FOUND",`Cron job ${t} does not exist`,3);return n}function b9(e){let t;try{t=JSON.parse(e)}catch{throw new G("INVALID_ARGUMENT","enqueue action_payload must be valid JSON")}if(typeof t!="object"||t===null)throw new G("INVALID_ARGUMENT","enqueue action_payload must be a JSON object");let{to:n,prompt:r,from:s}=t;if(typeof n!="string"||n.trim().length===0)throw new G("INVALID_ARGUMENT",'enqueue action_payload requires a nonblank "to"');if(typeof r!="string"||r.trim().length===0)throw new G("INVALID_ARGUMENT",'enqueue action_payload requires a nonblank "prompt"');if(s!==void 0&&(typeof s!="string"||s.trim().length===0))throw new G("INVALID_ARGUMENT",'enqueue action_payload "from", if given, must be a nonblank string')}function iC(e,t){Le(t,"action_payload"),e==="enqueue"&&b9(t)}function aC(e){let{actionKind:t}=e;if(t==="session"){if(e.provider===void 0||e.provider===null||e.provider.trim().length===0)throw new G("INVALID_ARGUMENT","a session job requires a nonblank provider");if(wy(e.provider),e.workingDirectory===void 0||e.workingDirectory===null||e.workingDirectory.trim().length===0)throw new G("INVALID_ARGUMENT","a session job requires an absolute working_directory (--cwd)");hm(e.workingDirectory)}else if(e.provider!==void 0&&e.provider!==null&&e.provider.trim().length>0)throw new G("INVALID_ARGUMENT",`provider is only valid for session jobs (not ${t})`);if(e.model!==void 0&&e.model!==null&&e.model.trim().length===0)throw new G("INVALID_ARGUMENT","model, if given, must be nonblank");if(e.model!==void 0&&e.model!==null&&e.model.trim().length>0&&t!=="session"&&t!=="miniplayer")throw new G("INVALID_ARGUMENT",`model is only valid for session/miniplayer jobs (not ${t})`);if(e.model!==void 0&&e.model!==null&&e.model.trim().length>0&&Ty(e.model),e.workingDirectory!==void 0&&e.workingDirectory!==null&&e.workingDirectory.trim().length>0&&t==="enqueue")throw new G("INVALID_ARGUMENT","working_directory is not valid for enqueue jobs");if(e.workingDirectory!==void 0&&e.workingDirectory!==null&&e.workingDirectory.trim().length===0)throw new G("INVALID_ARGUMENT","working_directory, if given, must be nonblank");if(e.escalationOwner!==void 0&&e.escalationOwner!==null&&e.escalationOwner.trim().length===0)throw new G("INVALID_ARGUMENT","escalation_owner, if given, must be nonblank")}function cC(e){let t=Le(e,"timezone");try{new Intl.DateTimeFormat(void 0,{timeZone:t})}catch{throw new G("INVALID_ARGUMENT",`timezone "${t}" is not a recognized IANA zone name`)}return t}function lC(e){let t=uy(e);if(!t.ok){let n=t.error.field?` (field: ${t.error.field})`:"";throw new G("INVALID_SCHEDULE",`${t.error.message}${n}`)}}function _a(e,t){let n=e.transaction(()=>{if(t.id!==void 0&&(!Number.isSafeInteger(t.id)||t.id<1))throw new G("INVALID_ARGUMENT","id, if given, must be a positive safe integer");let r=Le(t.title,"title");if(!v9(t.actionKind))throw new G("INVALID_ARGUMENT",'action_kind must be "enqueue", "command", "script", "session", or "miniplayer"');lC(t.scheduleExpr),iC(t.actionKind,t.actionPayload),aC({actionKind:t.actionKind,provider:t.provider??null,model:t.model??null,workingDirectory:t.workingDirectory??null,escalationOwner:t.escalationOwner??null});let s=t.timezone!==void 0?cC(t.timezone):null,o=Te();try{let i=e.prepare(t.id!==void 0?`INSERT INTO cron_jobs(id, title, schedule_expr, action_kind, action_payload, provider, model,
2156
2156
  working_directory, escalation_owner, enabled, timezone, created_at, updated_at)
2157
2157
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`:`INSERT INTO cron_jobs(title, schedule_expr, action_kind, action_payload, provider, model,
2158
2158
  working_directory, escalation_owner, enabled, timezone, created_at, updated_at)
2159
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(...t.id!==void 0?[t.id]:[],r,t.scheduleExpr,t.actionKind,t.actionPayload,t.provider??null,t.model??null,t.workingDirectory??null,t.escalationOwner??null,t.enabled===!1?0:1,s,o,o);return ot(e,Number(i.lastInsertRowid))}catch(i){ha(i)}});return Zr(()=>n.immediate())}function Em(e,t){if(!Number.isSafeInteger(t.limit)||t.limit<1||t.limit>et)throw new G("INVALID_ARGUMENT",`limit must be a positive integer <= ${et}`);return Zr(()=>{let n=["id > ?"],r=[t.after];t.enabled!==void 0&&(n.push("enabled = ?"),r.push(t.enabled?1:0));let s=e.prepare(`SELECT * FROM cron_jobs WHERE ${n.join(" AND ")} ORDER BY id LIMIT ?`).all(...r,t.limit+1),o=s.length>t.limit,i=o?s.slice(0,t.limit):s;return{rows:i,meta:{next_cursor:o?i[i.length-1].id:null}}})}function dC(e,t,n){let r=e.transaction(()=>{let s=ot(e,t);if(n.ifRevision!==void 0&&s.revision!==n.ifRevision)throw new G("REVISION_CONFLICT",`Expected revision ${n.ifRevision}; current is ${s.revision}`,4);let o={};if(n.title!==void 0&&(o.title=Le(n.title,"title")),n.scheduleExpr!==void 0&&(lC(n.scheduleExpr),o.schedule_expr=n.scheduleExpr),n.actionPayload!==void 0&&(iC(s.action_kind,n.actionPayload),o.action_payload=n.actionPayload),n.timezone!==void 0&&(o.timezone=n.timezone===null?null:cC(n.timezone)),s.session_teamfile!==null&&(n.provider!==void 0&&n.provider!==s.provider||n.model!==void 0&&n.model!==s.model||n.workingDirectory!==void 0&&n.workingDirectory!==s.working_directory))throw new G("SESSION_IMMUTABLE","provider/model/cwd cannot change while a session is seeded; run `cron reset-session` first",2);if(n.provider!==void 0&&(o.provider=n.provider),n.model!==void 0&&(o.model=n.model),(n.provider!==void 0||n.model!==void 0)&&aC({actionKind:s.action_kind,provider:n.provider??s.provider,model:n.model??s.model,workingDirectory:n.workingDirectory!==void 0?n.workingDirectory:s.working_directory}),n.workingDirectory!==void 0){if(s.action_kind==="enqueue")throw new G("INVALID_ARGUMENT","working_directory is not valid for enqueue jobs");if(n.workingDirectory===null){if(s.action_kind==="session")throw new G("INVALID_ARGUMENT","a session job requires an absolute working_directory");o.working_directory=null}else{let i=Le(n.workingDirectory,"working_directory");s.action_kind==="session"&&hm(i),o.working_directory=i}}if(n.escalationOwner!==void 0&&(o.escalation_owner=n.escalationOwner===null?null:Le(n.escalationOwner,"escalation_owner")),Object.keys(o).length===0)throw new G("INVALID_ARGUMENT","Update requires at least one field");try{e.prepare(`UPDATE cron_jobs SET ${Object.keys(o).map(i=>`${i} = ?`).join(",")} WHERE id = ?`).run(...Object.values(o),t)}catch(i){ha(i)}return _m(e,t),ot(e,t)});return Zr(r)}function uC(e,t,n){let r=e.transaction(()=>{ot(e,t);try{e.prepare("UPDATE cron_jobs SET enabled = ? WHERE id = ?").run(n?1:0,t)}catch(s){ha(s)}return _m(e,t),ot(e,t)});return Zr(()=>r.immediate())}function fC(e,t){let n=e.transaction(()=>{let r=ot(e,t);if(Xn(e,t)!==null)throw new G("EXECUTION_FENCED",`Cron job ${t} has a fenced execution or unresolved escalation; resolve it before removing the job`,4);try{e.prepare("DELETE FROM cron_jobs WHERE id = ?").run(t)}catch(s){ha(s)}return r});return Zr(n)}function mC(e,t){let n=e.transaction(()=>{if(ot(e,t).action_kind!=="session")throw new G("INVALID_ARGUMENT",`Cron job ${t} is not a session job`);if(Xn(e,t)!==null)throw new G("SESSION_ACTIVE",`Cron job ${t} has an active run; resolve it before resetting the session`,4);return e.prepare(`UPDATE cron_jobs SET session_teamfile = NULL, session_seeded_at = NULL, session_alias = NULL,
2160
- session_generation = session_generation + 1 WHERE id = ?`).run(t),_m(e,t),ot(e,t)});return Zr(n)}var A9=24*60*60*1e3;function pC(e,t=T9){try{return t("systemctl",["--user","is-active","--quiet",e]),"active"}catch(n){return n.status===3?"confirmed-gone":"unknown"}}async function hC(e,t,n,r={}){let s=r.enqueueImpl??Ne,o=r.spawnCommandImpl??ml,i=r.isUnitStillRunningImpl??pC,a=new Date(n).toISOString(),c=[],l=Zr(()=>e.prepare("SELECT * FROM cron_jobs WHERE enabled = 1 ORDER BY id").all());for(let d of l)try{N9(e,d,t,n,a,s,o,i,r.logDir,c,r.onJobError,{...r.runSpawnPrefixes!==void 0?{runSpawnPrefixes:r.runSpawnPrefixes}:{},...r.sessionDir!==void 0?{sessionDir:r.sessionDir}:{},...r.runTimeoutMs!==void 0?{runTimeoutMs:r.runTimeoutMs}:{},...r.runSeedTimeoutMs!==void 0?{runSeedTimeoutMs:r.runSeedTimeoutMs}:{},executeRunImpl:r.executeRunImpl??by})}catch(u){try{r.onJobError?.(d.id,u)}catch{}try{Ys(e,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",Nn(u),a],d)}catch{}}return c}function sC(e,t){let n=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(e),r=s=>Number(n.find(o=>o.type===s).value);return new Date(r("year"),r("month")-1,r("day"),r("hour"),r("minute"),r("second"))}var I9=500;function k9(e){return JSON.stringify({kind:"command",payload:e.action_payload,provider:e.provider,model:e.model,workingDirectory:e.working_directory,escalationOwner:e.escalation_owner})}function R9(e){if(e.execution_identity===null)return null;try{let t=JSON.parse(e.execution_identity);return typeof t.systemdUnit=="string"?t.systemdUnit:null}catch{return null}}function Ay(e,t,n){let r=Xn(e,t);if(r!==null)try{Qr(e,r.id,{fallback:{ok:!1,summary:n}})}catch{}}function _C(e,t,n,r,s){try{let o=k9(t),i=El(e,t.id,n,o);if(i.kind!=="claimed"){let a=R9(i.run);a!==null&&s(a)==="confirmed-gone"&&(Ay(e,t.id,"reconciled: previous command execution confirmed gone before a new fire"),i=El(e,t.id,n,o))}return i.kind!=="claimed"?null:(pa(e,i.run.id,{kind:"command",systemdUnit:r},null),i.run.id)}catch{return null}}function gC(e,t,n,r,s,o,i){if(t!==null)try{if(s!==null)try{yl(e,t,{kind:"command",systemdUnit:i},s)}catch{}let a=Sy(o,I9),c=r?`command spawn error: ${r.message}`:`command exited with code ${n}${a?`: ${a}`:""}`;Qr(e,t,{fallback:{ok:r===void 0&&n===0,summary:c}})}catch{}}function EC(e,t,n){if(t!==null)try{Qr(e,t,{fallback:{ok:!1,summary:`command spawn failed: ${Nn(n)}`}})}catch{}}function N9(e,t,n,r,s,o,i,a,c,l,d,u){let f=uy(t.schedule_expr);if(!f.ok){Ys(e,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",`Unparseable schedule_expr: ${f.error.message}`,s],t);return}let m=f.schedule;if(t.action_kind==="command"&&t.running_since_ts!==null){if(t.running_systemd_unit!==null&&a(t.running_systemd_unit)==="confirmed-gone"){e.prepare(`UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?,
2159
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(...t.id!==void 0?[t.id]:[],r,t.scheduleExpr,t.actionKind,t.actionPayload,t.provider??null,t.model??null,t.workingDirectory??null,t.escalationOwner??null,t.enabled===!1?0:1,s,o,o);return ot(e,Number(i.lastInsertRowid))}catch(i){ha(i)}});return es(()=>n.immediate())}function Em(e,t){if(!Number.isSafeInteger(t.limit)||t.limit<1||t.limit>et)throw new G("INVALID_ARGUMENT",`limit must be a positive integer <= ${et}`);return es(()=>{let n=["id > ?"],r=[t.after];t.enabled!==void 0&&(n.push("enabled = ?"),r.push(t.enabled?1:0));let s=e.prepare(`SELECT * FROM cron_jobs WHERE ${n.join(" AND ")} ORDER BY id LIMIT ?`).all(...r,t.limit+1),o=s.length>t.limit,i=o?s.slice(0,t.limit):s;return{rows:i,meta:{next_cursor:o?i[i.length-1].id:null}}})}function dC(e,t,n){let r=e.transaction(()=>{let s=ot(e,t);if(n.ifRevision!==void 0&&s.revision!==n.ifRevision)throw new G("REVISION_CONFLICT",`Expected revision ${n.ifRevision}; current is ${s.revision}`,4);let o={};if(n.title!==void 0&&(o.title=Le(n.title,"title")),n.scheduleExpr!==void 0&&(lC(n.scheduleExpr),o.schedule_expr=n.scheduleExpr),n.actionPayload!==void 0&&(iC(s.action_kind,n.actionPayload),o.action_payload=n.actionPayload),n.timezone!==void 0&&(o.timezone=n.timezone===null?null:cC(n.timezone)),s.session_teamfile!==null&&(n.provider!==void 0&&n.provider!==s.provider||n.model!==void 0&&n.model!==s.model||n.workingDirectory!==void 0&&n.workingDirectory!==s.working_directory))throw new G("SESSION_IMMUTABLE","provider/model/cwd cannot change while a session is seeded; run `cron reset-session` first",2);if(n.provider!==void 0&&(o.provider=n.provider),n.model!==void 0&&(o.model=n.model),(n.provider!==void 0||n.model!==void 0)&&aC({actionKind:s.action_kind,provider:n.provider??s.provider,model:n.model??s.model,workingDirectory:n.workingDirectory!==void 0?n.workingDirectory:s.working_directory}),n.workingDirectory!==void 0){if(s.action_kind==="enqueue")throw new G("INVALID_ARGUMENT","working_directory is not valid for enqueue jobs");if(n.workingDirectory===null){if(s.action_kind==="session")throw new G("INVALID_ARGUMENT","a session job requires an absolute working_directory");o.working_directory=null}else{let i=Le(n.workingDirectory,"working_directory");s.action_kind==="session"&&hm(i),o.working_directory=i}}if(n.escalationOwner!==void 0&&(o.escalation_owner=n.escalationOwner===null?null:Le(n.escalationOwner,"escalation_owner")),Object.keys(o).length===0)throw new G("INVALID_ARGUMENT","Update requires at least one field");try{e.prepare(`UPDATE cron_jobs SET ${Object.keys(o).map(i=>`${i} = ?`).join(",")} WHERE id = ?`).run(...Object.values(o),t)}catch(i){ha(i)}return _m(e,t),ot(e,t)});return es(r)}function uC(e,t,n){let r=e.transaction(()=>{ot(e,t);try{e.prepare("UPDATE cron_jobs SET enabled = ? WHERE id = ?").run(n?1:0,t)}catch(s){ha(s)}return _m(e,t),ot(e,t)});return es(()=>r.immediate())}function fC(e,t){let n=e.transaction(()=>{let r=ot(e,t);if(Xn(e,t)!==null)throw new G("EXECUTION_FENCED",`Cron job ${t} has a fenced execution or unresolved escalation; resolve it before removing the job`,4);try{e.prepare("DELETE FROM cron_jobs WHERE id = ?").run(t)}catch(s){ha(s)}return r});return es(n)}function mC(e,t){let n=e.transaction(()=>{if(ot(e,t).action_kind!=="session")throw new G("INVALID_ARGUMENT",`Cron job ${t} is not a session job`);if(Xn(e,t)!==null)throw new G("SESSION_ACTIVE",`Cron job ${t} has an active run; resolve it before resetting the session`,4);return e.prepare(`UPDATE cron_jobs SET session_teamfile = NULL, session_seeded_at = NULL, session_alias = NULL,
2160
+ session_generation = session_generation + 1 WHERE id = ?`).run(t),_m(e,t),ot(e,t)});return es(n)}var A9=24*60*60*1e3;function pC(e,t=T9){try{return t("systemctl",["--user","is-active","--quiet",e]),"active"}catch(n){return n.status===3?"confirmed-gone":"unknown"}}async function hC(e,t,n,r={}){let s=r.enqueueImpl??Ne,o=r.spawnCommandImpl??ml,i=r.isUnitStillRunningImpl??pC,a=new Date(n).toISOString(),c=[],l=es(()=>e.prepare("SELECT * FROM cron_jobs WHERE enabled = 1 ORDER BY id").all());for(let d of l)try{N9(e,d,t,n,a,s,o,i,r.logDir,c,r.onJobError,{...r.runSpawnPrefixes!==void 0?{runSpawnPrefixes:r.runSpawnPrefixes}:{},...r.sessionDir!==void 0?{sessionDir:r.sessionDir}:{},...r.runTimeoutMs!==void 0?{runTimeoutMs:r.runTimeoutMs}:{},...r.runSeedTimeoutMs!==void 0?{runSeedTimeoutMs:r.runSeedTimeoutMs}:{},executeRunImpl:r.executeRunImpl??by})}catch(u){try{r.onJobError?.(d.id,u)}catch{}try{Ys(e,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",Nn(u),a],d)}catch{}}return c}function sC(e,t){let n=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(e),r=s=>Number(n.find(o=>o.type===s).value);return new Date(r("year"),r("month")-1,r("day"),r("hour"),r("minute"),r("second"))}var I9=500;function k9(e){return JSON.stringify({kind:"command",payload:e.action_payload,provider:e.provider,model:e.model,workingDirectory:e.working_directory,escalationOwner:e.escalation_owner})}function R9(e){if(e.execution_identity===null)return null;try{let t=JSON.parse(e.execution_identity);return typeof t.systemdUnit=="string"?t.systemdUnit:null}catch{return null}}function Ay(e,t,n){let r=Xn(e,t);if(r!==null)try{Zr(e,r.id,{fallback:{ok:!1,summary:n}})}catch{}}function _C(e,t,n,r,s){try{let o=k9(t),i=El(e,t.id,n,o);if(i.kind!=="claimed"){let a=R9(i.run);a!==null&&s(a)==="confirmed-gone"&&(Ay(e,t.id,"reconciled: previous command execution confirmed gone before a new fire"),i=El(e,t.id,n,o))}return i.kind!=="claimed"?null:(pa(e,i.run.id,{kind:"command",systemdUnit:r},null),i.run.id)}catch{return null}}function gC(e,t,n,r,s,o,i){if(t!==null)try{if(s!==null)try{yl(e,t,{kind:"command",systemdUnit:i},s)}catch{}let a=Sy(o,I9),c=r?`command spawn error: ${r.message}`:`command exited with code ${n}${a?`: ${a}`:""}`;Zr(e,t,{fallback:{ok:r===void 0&&n===0,summary:c}})}catch{}}function EC(e,t,n){if(t!==null)try{Zr(e,t,{fallback:{ok:!1,summary:`command spawn failed: ${Nn(n)}`}})}catch{}}function N9(e,t,n,r,s,o,i,a,c,l,d,u){let f=uy(t.schedule_expr);if(!f.ok){Ys(e,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",`Unparseable schedule_expr: ${f.error.message}`,s],t);return}let m=f.schedule;if(t.action_kind==="command"&&t.running_since_ts!==null){if(t.running_systemd_unit!==null&&a(t.running_systemd_unit)==="confirmed-gone"){e.prepare(`UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?,
2161
2161
  last_fire_error = NULL, updated_at = ?
2162
2162
  WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts = ? AND running_systemd_unit = ?`).run("reconciled",s,t.id,t.revision,t.running_since_ts,t.running_systemd_unit),Ay(e,t.id,"reconciled: command execution confirmed gone by systemd probe; no exit callback survived the restart");return}e.prepare("UPDATE cron_jobs SET last_fire_status = ?, updated_at = ? WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts = ?").run("skipped_overlap",s,t.id,t.revision,t.running_since_ts);return}let p=t.last_checked_ts!==null?Date.parse(t.last_checked_ts):Date.parse(t.created_at);if(p>r){Ys(e,"UPDATE cron_jobs SET last_checked_ts = ?, last_fire_status = ?, last_fire_error = ?, updated_at = ?",[s,"error",`last_checked_ts (${t.last_checked_ts??t.created_at}) is after the current tick time -- checkpoint reset without firing`,s],t);return}let h=new Date(p),_=new Date(r);if(r-p>A9){Ys(e,"UPDATE cron_jobs SET last_checked_ts = ?, last_fire_status = ?, updated_at = ?",[s,"skipped_stale",s],t);return}let g=t.timezone!==null?sC(h,t.timezone):h,w=t.timezone!==null?sC(_,t.timezone):_;if(!F0(m,g,w)){Ys(e,"UPDATE cron_jobs SET last_checked_ts = ?, updated_at = ?",[s,s],t);return}let E=gm(e,t.id);if(!(E===null||E.enabled===0||E.revision!==t.revision)){if(S9(t.action_kind)){x9(e,t,s,l,d,u);return}if(t.action_kind==="enqueue")try{let T=JSON.parse(t.action_payload),b={from:T.from??"autopilot",dedupeKey:`cron:${t.id}:${h.toISOString()}`};e.transaction(()=>{let I=e.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(t.id);return I===void 0||I.enabled===0||I.revision!==t.revision||I.last_checked_ts!==t.last_checked_ts?!1:(o(e,n,T.to,T.prompt,b),e.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(s,s,"ok",s,t.id),!0)}).immediate()&&l.push(t.title)}catch(T){try{d?.(t.id,T)}catch{}try{Ys(e,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",Nn(T),s],t)}catch{}}else{let T=s,b=`lmcron-job-${t.id}-${T.replace(/[:.]/g,"-")}.scope`;if(e.prepare(`UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, running_since_ts = ?, running_systemd_unit = ?, updated_at = ?
2163
2163
  WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?) AND (running_since_ts IS ?)`).run(s,s,"ok",s,b,s,t.id,t.revision,t.last_checked_ts,t.running_since_ts).changes===0)return;let I=_C(e,t,t.action_kind,b,a),R={logDir:c,systemdUnitName:b,onExit:(L,N,k,D)=>{let O=L===0?"ok":"error",v=O==="ok"?null:N?Nn(N):`Command exited with code ${L} -- see ${c??um()}/${t.id}/ for output`;if(N)try{d?.(t.id,N)}catch{}try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(O,v,new Date().toISOString(),t.id,T)}catch{}gC(e,I,L,N,k,D,b)}};try{i({id:t.id,action_payload:t.action_payload},R),l.push(t.title)}catch(L){try{d?.(t.id,L)}catch{}try{e.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",Nn(L),s,t.id,T)}catch{}EC(e,I,L)}}}}async function oC(e,t){for(;!e();)await new Promise(n=>setTimeout(n,t))}async function bl(e,t,n,r={}){let s=r.enqueueImpl??Ne,o=r.spawnCommandImpl??ml,i=r.isUnitStillRunningImpl??pC,a=r.executeRunImpl??by,c=r.logDir,l=r.pollMs??250,d=ot(e,t);if(ul(e,t)&&r.onDemand===void 0)return{kind:"skipped_overlap",job:d};if(d.enabled===0)throw new G("DISABLED",`Cron job ${t} is disabled -- enable it first (\`cron enable ${t}\`), or a manual trigger would silently exercise a job the operator turned off on purpose`,4);let u=Te();if(d.action_kind==="command"){if(d.running_since_ts!==null)return d.running_systemd_unit!==null&&i(d.running_systemd_unit)==="confirmed-gone"?(e.prepare(`UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = NULL, updated_at = ?
2164
2164
  WHERE id = ? AND revision = ? AND running_since_ts = ? AND running_systemd_unit = ?`).run("reconciled",u,d.id,d.revision,d.running_since_ts,d.running_systemd_unit),Ay(e,d.id,"reconciled: command execution confirmed gone by systemd probe; no exit callback survived the restart"),await bl(e,t,n,r)):{kind:"skipped_overlap",job:d};let p=u,h=`lmcron-job-${d.id}-${p.replace(/[:.]/g,"-")}-manual.scope`;if(e.prepare(`UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, running_since_ts = ?, running_systemd_unit = ?, updated_at = ?
2165
- WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts IS ?`).run(u,"ok",p,h,u,d.id,d.revision,d.running_since_ts).changes===0)return{kind:"skipped_overlap",job:ot(e,t)};let g=_C(e,d,`${d.action_kind}:manual`,h,i),w={logDir:c,systemdUnitName:h,onExit:(y,E,T,b)=>{let A=y===0?"ok":"error",I=A==="ok"?null:E?Nn(E):`Command exited with code ${y} -- see ${c??um()}/${d.id}/ for output`;try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(A,I,new Date().toISOString(),d.id,p)}catch{}gC(e,g,y,E,T,b,h)}};try{o({id:d.id,action_payload:d.action_payload},w)}catch(y){EC(e,g,y);try{e.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",Nn(y),u,d.id,p)}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to spawn: ${Nn(y)}`,1)}return await oC(()=>ot(e,t).running_since_ts!==p,l),{kind:"fired",job:ot(e,t)}}if(d.action_kind==="enqueue"){let p=JSON.parse(d.action_payload);return s(e,n,p.to,p.prompt,{from:p.from??"autopilot"}),e.prepare("UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(u,"ok",u,d.id),{kind:"fired",job:ot(e,t)}}let f=JSON.stringify({kind:d.action_kind,payload:d.action_payload,provider:d.provider,model:d.model,workingDirectory:d.working_directory,escalationOwner:d.escalation_owner}),m=e.transaction(()=>{let p=e.prepare("SELECT enabled, revision FROM cron_jobs WHERE id = ?").get(d.id);if(p===void 0||p.enabled===0||p.revision!==d.revision)return null;let h=El(e,d.id,`${d.action_kind}:manual`,f);if(h.kind==="claimed"){r.onDemand!==void 0&&P0(e,d.id,h.run.id,r.onDemand);let _=r.disableOnClaim?"enabled = 0, ":"";e.prepare(`UPDATE cron_jobs SET ${_}last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?`).run(u,"ok",u,d.id)}return h}).immediate();if(m===null)throw new G("CONFLICT",`Cron job ${t} was modified concurrently -- re-run \`cron trigger ${t}\``,5);if(m.kind==="escalation")return{kind:"blocked_escalation",job:ot(e,t)};if(m.kind==="overlap")return{kind:"skipped_overlap",job:ot(e,t)};try{a({db:e,job:d,run:m.run,runToken:m.token,...r.onDemand!==void 0?{onDemand:r.onDemand}:{},...r.runSpawnPrefixes!==void 0?{spawnPrefixes:r.runSpawnPrefixes}:{},...r.sessionDir!==void 0?{sessionDir:r.sessionDir}:{},...r.runTimeoutMs!==void 0?{timeoutMs:r.runTimeoutMs}:{},...r.runSeedTimeoutMs!==void 0?{seedTimeoutMs:r.runSeedTimeoutMs}:{}})}catch(p){try{wl(e,m.run.id,`worker dispatch threw: ${Nn(p)}`),_y(e,m.run.id,{ok:!1,summary:`worker dispatch error: ${Nn(p)}`})}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to dispatch: ${Nn(p)}`,1)}if(r.waitForCompletion===!1){let p=d;try{p=ot(e,t)}catch(h){console.warn(`[triggerCronJobNow] post-dispatch getCronJob read failed for job ${t}:`,h)}return{kind:"fired",job:p,runId:m.run.id}}return await oC(()=>{let p=St(e,m.run.id);return p.status!=="pending"&&p.status!=="running"},l),{kind:"fired",job:ot(e,t),runId:m.run.id}}function x9(e,t,n,r,s,o){if(ul(e,t.id))return;let i=JSON.stringify({kind:t.action_kind,payload:t.action_payload,provider:t.provider,model:t.model,workingDirectory:t.working_directory,escalationOwner:t.escalation_owner}),a=e.transaction(()=>{let c=e.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(t.id);if(c===void 0||c.enabled===0||c.revision!==t.revision||c.last_checked_ts!==t.last_checked_ts)return null;let l=El(e,t.id,t.action_kind,i);return l.kind==="claimed"&&e.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(n,n,"ok",n,t.id),l}).immediate();if(a!==null){if(a.kind==="escalation"){Ys(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["blocked_escalation",n],t);return}if(a.kind==="overlap"){Ys(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["skipped_overlap",n],t);return}r.push(t.title);try{o.executeRunImpl({db:e,job:t,run:a.run,runToken:a.token,...o.runSpawnPrefixes!==void 0?{spawnPrefixes:o.runSpawnPrefixes}:{},...o.sessionDir!==void 0?{sessionDir:o.sessionDir}:{},...o.runTimeoutMs!==void 0?{timeoutMs:o.runTimeoutMs}:{},...o.runSeedTimeoutMs!==void 0?{seedTimeoutMs:o.runSeedTimeoutMs}:{}})}catch(c){try{wl(e,a.run.id,`worker dispatch threw: ${Nn(c)}`),_y(e,a.run.id,{ok:!1,summary:`worker dispatch error: ${Nn(c)}`})}catch{}try{s?.(t.id,c)}catch{}}}}function Ys(e,t,n,r){e.prepare(`${t} WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?)`).run(...n,r.id,r.revision,r.last_checked_ts)}function yC(e,t){let n=e.transaction(()=>{ot(e,t);try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL WHERE id = ?").run(t)}catch(r){ha(r)}return _m(e,t),ot(e,t)});return Zr(n)}import{execFileSync as L9}from"node:child_process";import{existsSync as C9,readFileSync as wC}from"node:fs";import{homedir as TC}from"node:os";import{join as vC}from"node:path";function Ea(){return process.env.LMBEE_HEAVY_STATUS??vC(TC(),".lmbee","heavy.status")}function ya(){return process.env.LMBEE_HEAVY_LOCK??vC(TC(),".lmbee","heavy.lock")}var ga=class extends Error{};function O9(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.holder=="string"&&typeof t.pid=="number"&&typeof t.command=="string"&&typeof t.startedAt=="string"}function D9(e){let t;try{t=wC(e,"utf8")}catch{return null}try{let n=JSON.parse(t);return O9(n)?n:null}catch{return null}}function $9(e,t){return e===null||t===null?e===t:e.holder===t.holder&&e.pid===t.pid&&e.command===t.command&&e.startedAt===t.startedAt}function M9(e){try{let t=wC(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[0]==="Z"}catch{return!1}}function P9(e){try{process.kill(e,0)}catch(t){return t.code==="EPERM"}return!M9(e)}function U9(e,t=L9){if(!C9(e))return!1;try{return t("flock",["-n",e,"-c","true"],{stdio:"ignore"}),!1}catch(n){if((n&&typeof n=="object"?n.status:void 0)===1)return!0;let s=n instanceof Error?n.message:String(n);throw new ga(`heavy-lock probe failed (flock did not run or exited abnormally): ${s}`)}}function Iy(e=Ea(),t=ya(),n=D9,r=U9,s=P9){for(let o=0;o<3;o++){let i=n(e),a=r(t),c=n(e);if(i!==null&&$9(i,c)){if(!a)return{held:!1,holder:null};if(s(i.pid))return{held:!0,holder:i}}}return{held:r(t),holder:null}}function fn(e=Ea(),t=ya(),n=Iy,r){try{return n(e,t)}catch(s){if(!(s instanceof ga))throw s;return r?.(s),{held:!0,holder:null}}}var ym={observedAt:null,report:null,lastErrorAt:null,lastError:null};function SC(e,t){ym={observedAt:t,report:e,lastErrorAt:null,lastError:null}}function bC(e,t){ym={...ym,lastErrorAt:t,lastError:e}}function Al(){return ym}import{execFile as F9}from"node:child_process";import{promisify as j9}from"node:util";function ve(e){if(!Number.isFinite(e)||e<0)return"?";if(e<1e3)return"0s";if(e<6e4)return`${Math.floor(e/1e3)}s`;if(e<36e5)return`${Math.floor(e/6e4)}m`;if(e<864e5*2)return`${Math.floor(e/36e5)}h`;let t=Math.floor(e/864e5),n=Math.floor(e%864e5/36e5);return n===0?`${t}d`:`${t}d ${n}h`}function ke(e,t=Date.now()){let n=Date.parse(e);if(Number.isNaN(n))return"?";let r=t-n;return r<6e4?"just now":`${ve(r)} ago`}var q9=j9(F9);function H9(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return(typeof t.target=="string"||t.target===null)&&typeof t.from_identity=="string"}function W9(e){let t=JSON.parse(e);if(typeof t!="object"||t===null||!Array.isArray(t.running)||!Array.isArray(t.dead)||!Array.isArray(t.idle))throw new Error("unexpected `lmctl running --json` shape: missing running/dead/idle arrays");let n=t;for(let r of["running","dead","idle"])if(!n[r].every(H9))throw new Error(`unexpected \`lmctl running --json\` shape: a malformed element (bad/missing target or from_identity) in \`${r}\``);return n}async function Je(e=3e4){let{stdout:t}=await q9("lmctl",["running","--json"],{timeout:e});return W9(t)}function ky(e,t=Date.now()){return{schema_version:e.schema_version,running:e.running.map(n=>({...n,running_for_human:ve(n.running_for_ms),started_human:ke(n.started_at,t)})),dead:e.dead.map(n=>({...n,stale_for_human:ve(n.stale_for_ms),started_human:ke(n.started_at,t)})),idle:e.idle.map(n=>({...n,ran_human:ve(n.ran_ms)}))}}import{readFileSync as B9}from"node:fs";import{randomUUID as G9}from"node:crypto";var Ry={staleThresholdMs:2*60*6e4,escalationCooldownMs:60*6e4,digestTimeoutMs:9e4,leaseTimeoutMs:10*6e4,providerQuotaBackoffMs:24*60*6e4,operatorStaleThresholdMs:6e4,operatorEscalationCooldownMs:6e4};function X9(e){return/usage limit/i.test(e)&&/quota/i.test(e)}function V9(e){let t=[];for(let n of e)try{t.push({row:n,content:B9(n.prompt_file,"utf8")})}catch{continue}return t}function J9(e){let t=e.map(({row:n,content:r})=>`--- from "${n.from_id}", queued ${n.created_ts} ---
2165
+ WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts IS ?`).run(u,"ok",p,h,u,d.id,d.revision,d.running_since_ts).changes===0)return{kind:"skipped_overlap",job:ot(e,t)};let g=_C(e,d,`${d.action_kind}:manual`,h,i),w={logDir:c,systemdUnitName:h,onExit:(y,E,T,b)=>{let A=y===0?"ok":"error",I=A==="ok"?null:E?Nn(E):`Command exited with code ${y} -- see ${c??um()}/${d.id}/ for output`;try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(A,I,new Date().toISOString(),d.id,p)}catch{}gC(e,g,y,E,T,b,h)}};try{o({id:d.id,action_payload:d.action_payload},w)}catch(y){EC(e,g,y);try{e.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",Nn(y),u,d.id,p)}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to spawn: ${Nn(y)}`,1)}return await oC(()=>ot(e,t).running_since_ts!==p,l),{kind:"fired",job:ot(e,t)}}if(d.action_kind==="enqueue"){let p=JSON.parse(d.action_payload);return s(e,n,p.to,p.prompt,{from:p.from??"autopilot"}),e.prepare("UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(u,"ok",u,d.id),{kind:"fired",job:ot(e,t)}}let f=JSON.stringify({kind:d.action_kind,payload:d.action_payload,provider:d.provider,model:d.model,workingDirectory:d.working_directory,escalationOwner:d.escalation_owner}),m=e.transaction(()=>{let p=e.prepare("SELECT enabled, revision FROM cron_jobs WHERE id = ?").get(d.id);if(p===void 0||p.enabled===0||p.revision!==d.revision)return null;let h=El(e,d.id,`${d.action_kind}:manual`,f);if(h.kind==="claimed"){r.onDemand!==void 0&&P0(e,d.id,h.run.id,r.onDemand);let _=r.disableOnClaim?"enabled = 0, ":"";e.prepare(`UPDATE cron_jobs SET ${_}last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?`).run(u,"ok",u,d.id)}return h}).immediate();if(m===null)throw new G("CONFLICT",`Cron job ${t} was modified concurrently -- re-run \`cron trigger ${t}\``,5);if(m.kind==="escalation")return{kind:"blocked_escalation",job:ot(e,t)};if(m.kind==="overlap")return{kind:"skipped_overlap",job:ot(e,t)};try{a({db:e,job:d,run:m.run,runToken:m.token,...r.onDemand!==void 0?{onDemand:r.onDemand}:{},...r.runSpawnPrefixes!==void 0?{spawnPrefixes:r.runSpawnPrefixes}:{},...r.sessionDir!==void 0?{sessionDir:r.sessionDir}:{},...r.runTimeoutMs!==void 0?{timeoutMs:r.runTimeoutMs}:{},...r.runSeedTimeoutMs!==void 0?{seedTimeoutMs:r.runSeedTimeoutMs}:{}})}catch(p){try{wl(e,m.run.id,`worker dispatch threw: ${Nn(p)}`),_y(e,m.run.id,{ok:!1,summary:`worker dispatch error: ${Nn(p)}`})}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to dispatch: ${Nn(p)}`,1)}if(r.waitForCompletion===!1){let p=d;try{p=ot(e,t)}catch(h){console.warn(`[triggerCronJobNow] post-dispatch getCronJob read failed for job ${t}:`,h)}return{kind:"fired",job:p,runId:m.run.id}}return await oC(()=>{let p=bt(e,m.run.id);return p.status!=="pending"&&p.status!=="running"},l),{kind:"fired",job:ot(e,t),runId:m.run.id}}function x9(e,t,n,r,s,o){if(ul(e,t.id))return;let i=JSON.stringify({kind:t.action_kind,payload:t.action_payload,provider:t.provider,model:t.model,workingDirectory:t.working_directory,escalationOwner:t.escalation_owner}),a=e.transaction(()=>{let c=e.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(t.id);if(c===void 0||c.enabled===0||c.revision!==t.revision||c.last_checked_ts!==t.last_checked_ts)return null;let l=El(e,t.id,t.action_kind,i);return l.kind==="claimed"&&e.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(n,n,"ok",n,t.id),l}).immediate();if(a!==null){if(a.kind==="escalation"){Ys(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["blocked_escalation",n],t);return}if(a.kind==="overlap"){Ys(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["skipped_overlap",n],t);return}r.push(t.title);try{o.executeRunImpl({db:e,job:t,run:a.run,runToken:a.token,...o.runSpawnPrefixes!==void 0?{spawnPrefixes:o.runSpawnPrefixes}:{},...o.sessionDir!==void 0?{sessionDir:o.sessionDir}:{},...o.runTimeoutMs!==void 0?{timeoutMs:o.runTimeoutMs}:{},...o.runSeedTimeoutMs!==void 0?{seedTimeoutMs:o.runSeedTimeoutMs}:{}})}catch(c){try{wl(e,a.run.id,`worker dispatch threw: ${Nn(c)}`),_y(e,a.run.id,{ok:!1,summary:`worker dispatch error: ${Nn(c)}`})}catch{}try{s?.(t.id,c)}catch{}}}}function Ys(e,t,n,r){e.prepare(`${t} WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?)`).run(...n,r.id,r.revision,r.last_checked_ts)}function yC(e,t){let n=e.transaction(()=>{ot(e,t);try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL WHERE id = ?").run(t)}catch(r){ha(r)}return _m(e,t),ot(e,t)});return es(n)}import{execFileSync as L9}from"node:child_process";import{existsSync as C9,readFileSync as wC}from"node:fs";import{homedir as TC}from"node:os";import{join as vC}from"node:path";function Ea(){return process.env.LMBEE_HEAVY_STATUS??vC(TC(),".lmbee","heavy.status")}function ya(){return process.env.LMBEE_HEAVY_LOCK??vC(TC(),".lmbee","heavy.lock")}var ga=class extends Error{};function O9(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.holder=="string"&&typeof t.pid=="number"&&typeof t.command=="string"&&typeof t.startedAt=="string"}function D9(e){let t;try{t=wC(e,"utf8")}catch{return null}try{let n=JSON.parse(t);return O9(n)?n:null}catch{return null}}function $9(e,t){return e===null||t===null?e===t:e.holder===t.holder&&e.pid===t.pid&&e.command===t.command&&e.startedAt===t.startedAt}function M9(e){try{let t=wC(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[0]==="Z"}catch{return!1}}function P9(e){try{process.kill(e,0)}catch(t){return t.code==="EPERM"}return!M9(e)}function U9(e,t=L9){if(!C9(e))return!1;try{return t("flock",["-n",e,"-c","true"],{stdio:"ignore"}),!1}catch(n){if((n&&typeof n=="object"?n.status:void 0)===1)return!0;let s=n instanceof Error?n.message:String(n);throw new ga(`heavy-lock probe failed (flock did not run or exited abnormally): ${s}`)}}function Iy(e=Ea(),t=ya(),n=D9,r=U9,s=P9){for(let o=0;o<3;o++){let i=n(e),a=r(t),c=n(e);if(i!==null&&$9(i,c)){if(!a)return{held:!1,holder:null};if(s(i.pid))return{held:!0,holder:i}}}return{held:r(t),holder:null}}function fn(e=Ea(),t=ya(),n=Iy,r){try{return n(e,t)}catch(s){if(!(s instanceof ga))throw s;return r?.(s),{held:!0,holder:null}}}var ym={observedAt:null,report:null,lastErrorAt:null,lastError:null};function SC(e,t){ym={observedAt:t,report:e,lastErrorAt:null,lastError:null}}function bC(e,t){ym={...ym,lastErrorAt:t,lastError:e}}function Al(){return ym}import{execFile as F9}from"node:child_process";import{promisify as j9}from"node:util";function ve(e){if(!Number.isFinite(e)||e<0)return"?";if(e<1e3)return"0s";if(e<6e4)return`${Math.floor(e/1e3)}s`;if(e<36e5)return`${Math.floor(e/6e4)}m`;if(e<864e5*2)return`${Math.floor(e/36e5)}h`;let t=Math.floor(e/864e5),n=Math.floor(e%864e5/36e5);return n===0?`${t}d`:`${t}d ${n}h`}function ke(e,t=Date.now()){let n=Date.parse(e);if(Number.isNaN(n))return"?";let r=t-n;return r<6e4?"just now":`${ve(r)} ago`}var q9=j9(F9);function H9(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return(typeof t.target=="string"||t.target===null)&&typeof t.from_identity=="string"}function W9(e){let t=JSON.parse(e);if(typeof t!="object"||t===null||!Array.isArray(t.running)||!Array.isArray(t.dead)||!Array.isArray(t.idle))throw new Error("unexpected `lmctl running --json` shape: missing running/dead/idle arrays");let n=t;for(let r of["running","dead","idle"])if(!n[r].every(H9))throw new Error(`unexpected \`lmctl running --json\` shape: a malformed element (bad/missing target or from_identity) in \`${r}\``);return n}async function Je(e=3e4){let{stdout:t}=await q9("lmctl",["running","--json"],{timeout:e});return W9(t)}function ky(e,t=Date.now()){return{schema_version:e.schema_version,running:e.running.map(n=>({...n,running_for_human:ve(n.running_for_ms),started_human:ke(n.started_at,t)})),dead:e.dead.map(n=>({...n,stale_for_human:ve(n.stale_for_ms),started_human:ke(n.started_at,t)})),idle:e.idle.map(n=>({...n,ran_human:ve(n.ran_ms)}))}}import{readFileSync as B9}from"node:fs";import{randomUUID as G9}from"node:crypto";var Ry={staleThresholdMs:2*60*6e4,escalationCooldownMs:60*6e4,digestTimeoutMs:9e4,leaseTimeoutMs:10*6e4,providerQuotaBackoffMs:24*60*6e4,operatorStaleThresholdMs:6e4,operatorEscalationCooldownMs:6e4};function X9(e){return/usage limit/i.test(e)&&/quota/i.test(e)}function V9(e){let t=[];for(let n of e)try{t.push({row:n,content:B9(n.prompt_file,"utf8")})}catch{continue}return t}function J9(e){let t=e.map(({row:n,content:r})=>`--- from "${n.from_id}", queued ${n.created_ts} ---
2166
2166
  ${r}`);return`You have ${e.length} queued message(s) that couldn't be delivered automatically (presence-gated for a while) -- bundled here as a digest:
2167
2167
 
2168
2168
  ${t.join(`
@@ -2222,9 +2222,9 @@ ${t.join(`
2222
2222
  `)}
2223
2223
  )`}async function q7(e,t){try{let n=re(e),{turns:r}=await t(n,e.leadAlias,{lines:6}),s=[...r].reverse().find(o=>o.role==="assistant");return s?{text:s.text,ts:s.ts}:null}catch(n){return process.stderr.write(`[auto-continue] tail check failed for ${e.name} (treating as no reply available): ${n instanceof Error?n.message:String(n)}
2224
2224
  `),null}}function H7(e,t,n){if(e===null)return!0;let r=Date.parse(e.replace(" ","T"));return Number.isFinite(r)?n-r>=t:!0}async function iO(e,t,n,r={}){let s=r.config??Ie,o=r.nowMs??Date.now(),i=r.fetchTailImpl??cm,a=km(r.promptsDir),c=r.readHeavyLockStatusImpl??fn;function l(){return c(r.heavyLockStatusPath,r.heavyLockPath,void 0,h=>{process.stderr.write(`[auto-continue] heavy-lock probe failed, treating conservatively as held: ${h.message}
2225
- `)})}let d=new Set(r.stalledTeamNames??await wi(e,t,n,r.heavyLock??l(),s,o)),u=[];function f(h){let _=yt(e,h.name);if(_===null||_.status==="BLOCKED"||fe(e,h.name)?.confirmed_done_ts||Tt(e,h.name,{fromAutopilot:!0}).length>0)return!1;let g=l();if(g.held&&(g.holder===null||g.holder.holder===h.name))return!1;try{let w=`${re(h)}:${h.leadAlias}`;if(Im(n,w,r.providerExhaustionBackoffMs))return!1}catch{}return!0}let m=r.clearAutoNudgeSuspendedImpl??lv,p=r.recordAutoNudgeSuspendedImpl??cv;for(let h of t)if(!d.has(h.name)){m(e,h.name);continue}for(let h of t){if(!d.has(h.name)||(m(e,h.name),!f(h)))continue;let _=await q7(h,i);if(_!==null&&$7.test(_.text)&&!H7(_.ts,r.standbyStaleMs??M7,o)){p(e,h.name,"standby_reply_active",`last reply matches the standby pattern and is not yet stale: "${_.text.slice(0,200)}"`,new Date(o).toISOString());continue}if(!f(h))continue;let g=r.loadTeamTaskStateImpl??Ke,w=r.deriveTaskAwareNudgeImpl??GS,y=null;try{y=g(e,re(h),h.leadAlias)}catch{}let E,T;if(y!==null){let C=await w(e,y,{backoffMs:s.cooldownMs});if(C===null||(E=C.message,T=C.onSent,!f(h)))continue}else try{E=Rm(a,h)}catch{continue}let A=(r.findOwedResponsesImpl??Qo)(e,h.name,o);E+=P7(A,h.name);let R=(r.findRecentlyAnsweredForSenderImpl??Nm)(e,h.name,U7,o);E+=j7(R);let N=(r.loadAutoNudgeRedirectImpl??Un)(e,h.name),k=N===null?h.name:`${N.companionTeam}:${N.workerAlias}`,D=N===null?h.name:N.companionTeam,O=N===null?h.leadAlias:N.workerAlias,v=N===null?h.repoPath:t.find(C=>C.name===D)?.repoPath??h.repoPath,x=(r.resolveMemberProviderImpl??ir)({repoPath:v,name:D},O);if(!(x!==null&&(r.checkProviderDisabledImpl??Kt)(e,x,o).disabled)){if(Ne(e,t,k,E,{from:"autopilot"}),N!==null){let C=r.recordRedirectedDispatchImpl??f0;try{await C(e,h.name,N,h.repoPath,new Date(o).toISOString())}catch(q){process.stderr.write(`[auto-continue] failed to record redirected dispatch for ${h.name}'s redirect to ${N.companionTeam}:${N.workerAlias} (nudge already sent, continuing): ${q instanceof Error?q.message:String(q)}
2225
+ `)})}let d=new Set(r.stalledTeamNames??await wi(e,t,n,r.heavyLock??l(),s,o)),u=[];function f(h){let _=wt(e,h.name);if(_===null||_.status==="BLOCKED"||fe(e,h.name)?.confirmed_done_ts||vt(e,h.name,{fromAutopilot:!0}).length>0)return!1;let g=l();if(g.held&&(g.holder===null||g.holder.holder===h.name))return!1;try{let w=`${re(h)}:${h.leadAlias}`;if(Im(n,w,r.providerExhaustionBackoffMs))return!1}catch{}return!0}let m=r.clearAutoNudgeSuspendedImpl??lv,p=r.recordAutoNudgeSuspendedImpl??cv;for(let h of t)if(!d.has(h.name)){m(e,h.name);continue}for(let h of t){if(!d.has(h.name)||(m(e,h.name),!f(h)))continue;let _=await q7(h,i);if(_!==null&&$7.test(_.text)&&!H7(_.ts,r.standbyStaleMs??M7,o)){p(e,h.name,"standby_reply_active",`last reply matches the standby pattern and is not yet stale: "${_.text.slice(0,200)}"`,new Date(o).toISOString());continue}if(!f(h))continue;let g=r.loadTeamTaskStateImpl??Ke,w=r.deriveTaskAwareNudgeImpl??GS,y=null;try{y=g(e,re(h),h.leadAlias)}catch{}let E,T;if(y!==null){let C=await w(e,y,{backoffMs:s.cooldownMs});if(C===null||(E=C.message,T=C.onSent,!f(h)))continue}else try{E=Rm(a,h)}catch{continue}let A=(r.findOwedResponsesImpl??Qo)(e,h.name,o);E+=P7(A,h.name);let R=(r.findRecentlyAnsweredForSenderImpl??Nm)(e,h.name,U7,o);E+=j7(R);let N=(r.loadAutoNudgeRedirectImpl??Un)(e,h.name),k=N===null?h.name:`${N.companionTeam}:${N.workerAlias}`,D=N===null?h.name:N.companionTeam,O=N===null?h.leadAlias:N.workerAlias,v=N===null?h.repoPath:t.find(C=>C.name===D)?.repoPath??h.repoPath,x=(r.resolveMemberProviderImpl??ir)({repoPath:v,name:D},O);if(!(x!==null&&(r.checkProviderDisabledImpl??Kt)(e,x,o).disabled)){if(Ne(e,t,k,E,{from:"autopilot"}),N!==null){let C=r.recordRedirectedDispatchImpl??f0;try{await C(e,h.name,N,h.repoPath,new Date(o).toISOString())}catch(q){process.stderr.write(`[auto-continue] failed to record redirected dispatch for ${h.name}'s redirect to ${N.companionTeam}:${N.workerAlias} (nudge already sent, continuing): ${q instanceof Error?q.message:String(q)}
2226
2226
  `)}}try{T?.()}catch(C){process.stderr.write(`[auto-continue] onSent bookkeeping failed for ${h.name} (nudge already sent, continuing): ${C instanceof Error?C.message:String(C)}
2227
- `)}ac(e,h.name,new Date().toISOString()),u.push(h.name)}}return u}import{readFileSync as W7}from"node:fs";function aO(e){return`last_maintainer_wake:${e}`}function B7(e,t){return e.prepare("SELECT v FROM kv WHERE k = ?").get(aO(t))?.v??null}function G7(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(aO(t),n)}function X7(e,t,n,r){for(let s of t)if(s.autoNudge&&s.name!==r&&!fe(e,s.name)?.confirmed_done_ts&&!wt(s,n))return!0;return!1}function cO(e,t,n,r,s=a=>W7(a,"utf8"),o=Date.now(),i){let a=t.find(f=>f.name===r.teamName);if(!a||!K(a)||!(i??X7(e,t.filter(K),n,r.teamName))||wt(a,n)||Tt(e,r.teamName,{fromAutopilot:!0}).length>0)return!1;let l=r.cooldownMs??Ie.cooldownMs,d=B7(e,r.teamName);if(d!==null&&o-Date.parse(d)<=l)return!1;let u;try{u=s(r.promptFile)}catch{return!1}return Ne(e,t,r.teamName,u,{from:"autopilot"}),G7(e,r.teamName,new Date(o).toISOString()),!0}function xm(e){return`blocked:${e}`}function lO(e,t,n,r){let s=n.map(o=>{let i=_i(e,o.id),a=i!==null?`note: "${i.body}"`:"no note recorded";return`#${o.id} ("${o.title}", ${a})`});return`Team "${t}" has ${n.length} task(s) awaiting ${r}: ${s.join(", ")} -- \`lmauto tasks show <id>\` for full context. Resolve then \`lmauto tasks update <id> --status todo\` (or \`in_progress\`) to unblock, or escalate to the operator.`}async function dO(e,t,n,r,s=Ie,o=Date.now()){if(!r.some(a=>a.name===n))return[];let i=[];for(let a of t){if(a.name===n)continue;let c=fe(e,a.name),l=c?.blocked_surfaced_ts?Date.parse(c.blocked_surfaced_ts):null;if(l!==null&&o-l<=s.cooldownMs)continue;let d;try{d=re(a)}catch{continue}let u=Ke(e,d,a.leadAlias);if(u===null)continue;let f=yi(e,u);if(f.length===0)continue;let m=[],p=new Map;for(let _ of f)if(_.blocked_on!=="operator"){if(_.blocked_on===null){m.push(_);continue}if(r.some(g=>g.name===_.blocked_on)){let g=p.get(_.blocked_on)??[];g.push(_),p.set(_.blocked_on,g)}else m.push(_)}let h=!1;m.length>0&&(new Set(Tt(e,n).map(g=>g.subject_id).filter(g=>g!==null)).has(xm(a.name))||(Ne(e,r,n,lO(e,a.name,m,"your decision"),{from:"autopilot",subject:xm(a.name)}),h=!0));for(let[_,g]of p)new Set(Tt(e,_).map(y=>y.subject_id).filter(y=>y!==null)).has(xm(a.name))||(Ne(e,r,_,lO(e,a.name,g,"your decision"),{from:"autopilot",subject:xm(a.name)}),h=!0);h&&(rv(e,a.name,new Date().toISOString()),i.push(a.name))}return i}var V7=30*6e4;function J7(e){return`unresolvable-teamfile:${e}`}async function uO(e,t,n,r,s=Ie,o=Date.now(),i=V7,a=()=>new Date().toISOString()){if(!r.some(l=>l.name===n))return[];let c=[];for(let l of t){if(l.name===n)continue;try{re(l),fv(e,l.name);continue}catch{}uv(e,l.name,a());let d=mv(e,l.name);if(d===null)continue;let u=o-Date.parse(d.first_observed_ts);if(u<i)continue;let f=d.surfaced_ts!==null?Date.parse(d.surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m=J7(l.name);if(Tt(e,n).map(g=>g.subject_id).filter(g=>g!==null).includes(m))continue;let h=Math.round(u/6e4),_=`[status-engine] Team "${l.name}" has had an unresolvable teamfile for over ${h} minutes -- expected "${l.name}.lmctl" under repo_path "${l.repoPath}" to exist. Every other per-team check silently skips this team until the registry entry or teamfile is fixed. \`lmauto teams\` to review the current registry.`;Ne(e,r,n,_,{from:"autopilot",subject:m}),pv(e,l.name,a()),c.push(l.name)}return c}var Py="epic_closed_surfaced_ts";function Lm(e,t){return e.transaction(()=>{let r=nn(e,t);if(r===null)return null;let s=e.prepare("SELECT * FROM notes WHERE entity_id = ? ORDER BY id DESC").all(t),o=!1;for(let i of s){let a=lr(i.body);if(a!==null){if(a[hs]===!0)break;typeof a[Py]=="string"&&(o=!0)}}return{entity:r,status:r.status,alreadySurfacedThisEpisode:o}})()}function fO(e){return`epic-closed:${e}`}async function mO(e,t,n,r,s=Ie,o=Date.now(),i={}){let a=r.find(d=>d.name===n);if(!a)return[];if(!K(a))return[];let c=new Set(Tt(e,n).map(d=>d.subject_id).filter(d=>d!==null)),l=[];for(let d of t){if(d.name===n||c.has(fO(d.name)))continue;let u=fe(e,d.name),f=u?.epic_closed_surfaced_ts?Date.parse(u.epic_closed_surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m;try{m=re(d)}catch{continue}let p=Ke(e,m,d.leadAlias);if(p===null)continue;let h=p.entities.filter(y=>y.kind==="epic"&&Ei.has(we(y.status)));if(h.length===0)continue;i.beforeRevalidate?.();let _=qn(re(d)),g=!1;e.transaction(()=>{let y=[];for(let A of h){let I=Lm(e,A.id);if(I===null)continue;let R=I.entity;Ei.has(we(R.status))&&(R.owner_team_path!==_||R.owner_alias!==d.leadAlias||I.alreadySurfacedThisEpisode||y.push(R))}if(y.length===0)return;let E=y.map(A=>`#${A.id} ("${A.title}")`),T=`Team "${d.name}" closed ${y.length} epic(s): ${E.join(", ")} -- review with \`lmauto tasks show <id>\`. If more work remains, add task(s) + \`lmauto tasks update <id> --status open\` to reopen; otherwise no action needed, it stays closed.`;Ne(e,r,n,T,{from:"autopilot",subject:fO(d.name),escalationOnly:!0});let b=new Date().toISOString();for(let A of y)cr(e,A.id,{body:JSON.stringify({[Py]:b})});ov(e,d.name,b),g=!0}).immediate(),g&&l.push(d.name)}return l}function pO(e){return`done-check:${e}`}var _O="consistency_alert_ts";function hO(e,t){return e.transaction(()=>{let r=nn(e,t);if(r===null)return null;let s=e.prepare("SELECT * FROM notes WHERE entity_id = ? ORDER BY id DESC").all(t),o=null,i=r.updated_at,a=!1;for(let c of s){let l=lr(c.body);if(l!==null){if(l[hs]===!0){o=c.id,typeof l.to=="string"&&we(l.to)==="done"&&(i=c.created_at);break}typeof l[_O]=="string"&&(a=!0)}}return{entity:r,status:r.status,epochId:o,doneTransitionIso:i,alreadyAlertedThisEpisode:a}})()}async function Y7(e,t,n){let r=new Date(Date.parse(t)-n).toISOString();for(let s of e)if(await Bp(s,r))return!0;return!1}async function gO(e,t,n,r,s=Ie,o={}){let i=o.hasEvidenceAroundDoneImpl??Y7,a=r.find(d=>d.name===n);if(!a)return[];if(!K(a))return[];let c=new Set(Tt(e,n).map(d=>d.subject_id).filter(d=>d!==null)),l=[];for(let d of t){if(d.name===n||c.has(pO(d.name)))continue;let u;try{u=re(d)}catch{continue}let f=Ke(e,u,d.leadAlias);if(f===null)continue;let m=new Map(f.entities.map(T=>[T.id,T])),p=f.entities.filter(T=>(T.kind==="task"||T.kind==="subtask")&&we(T.status)==="done"&&!ur(e,T,m));if(p.length===0)continue;let h=d.folders&&d.folders.length>0?d.folders:[d.repoPath],_=[];for(let T of p){let b=hO(e,T.id);if(b===null||b.alreadyAlertedThisEpisode)continue;await i(h,b.doneTransitionIso,s.idleThresholdMs)||_.push({entity:T,epochId:b.epochId})}if(_.length===0)continue;let g=qn(u),w=new Date().toISOString(),y=!1;e.transaction(()=>{let T=[];for(let{entity:I,epochId:R}of _){let L=hO(e,I.id);if(L===null)continue;let N=L.entity;we(N.status)==="done"&&(N.owner_team_path!==g||N.owner_alias!==d.leadAlias||ur(e,N,new Map)||L.epochId!==R||L.alreadyAlertedThisEpisode||T.push(N))}if(T.length===0)return;let b=T.map(I=>`#${I.id} ("${I.title}")`),A=`Team "${d.name}" reported ${T.length} task(s) done with no commit/file-write found in its tracked path(s) around that time: ${b.join(", ")} -- please verify (\`lmauto tasks show <id>\` for details). This is a soft signal only; no action is needed if the work is genuinely fileless (design/coordination, or landed outside the team's tracked folders).`;Ne(e,r,n,A,{from:"autopilot",subject:pO(d.name),escalationOnly:!0});for(let I of T)cr(e,I.id,{body:JSON.stringify({[_O]:w})});y=!0}).immediate(),y&&l.push(d.name)}return l}function EO(e){return`fault:${e}`}async function yO(e,t,n,r,s=Ie,o=Date.now(),i={}){if(!r.some(l=>l.name===n))return[];let a=new Set(Tt(e,n).map(l=>l.subject_id).filter(l=>l!==null)),c=[];for(let l of t){if(l.name===n||a.has(EO(l.name)))continue;let d=fe(e,l.name),u=d?.fault_surfaced_ts?Date.parse(d.fault_surfaced_ts):null;if(u!==null&&o-u<=s.cooldownMs)continue;let f;try{f=re(l)}catch{continue}let m=Ke(e,f,l.leadAlias);if(m===null)continue;let p=ic(e,m,s.cooldownMs,o);if(p.length===0)continue;i.beforeRevalidate?.();let h=!1;e.transaction(()=>{let g=[];for(let E of p){let T=nn(e,E.id);if(T===null)continue;let b=ic(e,{entities:[T]},s.cooldownMs,o,{team:re(l),alias:l.leadAlias});b.length!==0&&g.push(b[0])}if(g.length===0)return;let w=g.map(E=>{let T=_i(e,E.id),b=T!==null?`note: "${T.body}"`:"no note recorded";return`#${E.id} ("${E.title}", ${E.status}, ${b})`}),y=`Team "${l.name}" has ${g.length} task(s) stuck in a fault state past expected recovery: ${w.join(", ")} -- \`lmauto tasks show <id>\` for full context. The team is still being nudged with a back-off template on its own cadence; this is a distinct heads-up that the fault has persisted, not a request to intervene on the team's behalf.`;Ne(e,r,n,y,{from:"autopilot",subject:EO(l.name)}),sv(e,l.name,new Date().toISOString()),h=!0}).immediate(),h&&c.push(l.name)}return c}function wO(e,t,n,r,s,o=288e5){let i=new Date(s-r).toISOString(),a=new Date(s-o).toISOString();return e.prepare(`SELECT EXISTS(
2227
+ `)}ac(e,h.name,new Date().toISOString()),u.push(h.name)}}return u}import{readFileSync as W7}from"node:fs";function aO(e){return`last_maintainer_wake:${e}`}function B7(e,t){return e.prepare("SELECT v FROM kv WHERE k = ?").get(aO(t))?.v??null}function G7(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(aO(t),n)}function X7(e,t,n,r){for(let s of t)if(s.autoNudge&&s.name!==r&&!fe(e,s.name)?.confirmed_done_ts&&!Tt(s,n))return!0;return!1}function cO(e,t,n,r,s=a=>W7(a,"utf8"),o=Date.now(),i){let a=t.find(f=>f.name===r.teamName);if(!a||!K(a)||!(i??X7(e,t.filter(K),n,r.teamName))||Tt(a,n)||vt(e,r.teamName,{fromAutopilot:!0}).length>0)return!1;let l=r.cooldownMs??Ie.cooldownMs,d=B7(e,r.teamName);if(d!==null&&o-Date.parse(d)<=l)return!1;let u;try{u=s(r.promptFile)}catch{return!1}return Ne(e,t,r.teamName,u,{from:"autopilot"}),G7(e,r.teamName,new Date(o).toISOString()),!0}function xm(e){return`blocked:${e}`}function lO(e,t,n,r){let s=n.map(o=>{let i=_i(e,o.id),a=i!==null?`note: "${i.body}"`:"no note recorded";return`#${o.id} ("${o.title}", ${a})`});return`Team "${t}" has ${n.length} task(s) awaiting ${r}: ${s.join(", ")} -- \`lmauto tasks show <id>\` for full context. Resolve then \`lmauto tasks update <id> --status todo\` (or \`in_progress\`) to unblock, or escalate to the operator.`}async function dO(e,t,n,r,s=Ie,o=Date.now()){if(!r.some(a=>a.name===n))return[];let i=[];for(let a of t){if(a.name===n)continue;let c=fe(e,a.name),l=c?.blocked_surfaced_ts?Date.parse(c.blocked_surfaced_ts):null;if(l!==null&&o-l<=s.cooldownMs)continue;let d;try{d=re(a)}catch{continue}let u=Ke(e,d,a.leadAlias);if(u===null)continue;let f=yi(e,u);if(f.length===0)continue;let m=[],p=new Map;for(let _ of f)if(_.blocked_on!=="operator"){if(_.blocked_on===null){m.push(_);continue}if(r.some(g=>g.name===_.blocked_on)){let g=p.get(_.blocked_on)??[];g.push(_),p.set(_.blocked_on,g)}else m.push(_)}let h=!1;m.length>0&&(new Set(vt(e,n).map(g=>g.subject_id).filter(g=>g!==null)).has(xm(a.name))||(Ne(e,r,n,lO(e,a.name,m,"your decision"),{from:"autopilot",subject:xm(a.name)}),h=!0));for(let[_,g]of p)new Set(vt(e,_).map(y=>y.subject_id).filter(y=>y!==null)).has(xm(a.name))||(Ne(e,r,_,lO(e,a.name,g,"your decision"),{from:"autopilot",subject:xm(a.name)}),h=!0);h&&(rv(e,a.name,new Date().toISOString()),i.push(a.name))}return i}var V7=30*6e4;function J7(e){return`unresolvable-teamfile:${e}`}async function uO(e,t,n,r,s=Ie,o=Date.now(),i=V7,a=()=>new Date().toISOString()){if(!r.some(l=>l.name===n))return[];let c=[];for(let l of t){if(l.name===n)continue;try{re(l),fv(e,l.name);continue}catch{}uv(e,l.name,a());let d=mv(e,l.name);if(d===null)continue;let u=o-Date.parse(d.first_observed_ts);if(u<i)continue;let f=d.surfaced_ts!==null?Date.parse(d.surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m=J7(l.name);if(vt(e,n).map(g=>g.subject_id).filter(g=>g!==null).includes(m))continue;let h=Math.round(u/6e4),_=`[status-engine] Team "${l.name}" has had an unresolvable teamfile for over ${h} minutes -- expected "${l.name}.lmctl" under repo_path "${l.repoPath}" to exist. Every other per-team check silently skips this team until the registry entry or teamfile is fixed. \`lmauto teams\` to review the current registry.`;Ne(e,r,n,_,{from:"autopilot",subject:m}),pv(e,l.name,a()),c.push(l.name)}return c}var Py="epic_closed_surfaced_ts";function Lm(e,t){return e.transaction(()=>{let r=nn(e,t);if(r===null)return null;let s=e.prepare("SELECT * FROM notes WHERE entity_id = ? ORDER BY id DESC").all(t),o=!1;for(let i of s){let a=lr(i.body);if(a!==null){if(a[hs]===!0)break;typeof a[Py]=="string"&&(o=!0)}}return{entity:r,status:r.status,alreadySurfacedThisEpisode:o}})()}function fO(e){return`epic-closed:${e}`}async function mO(e,t,n,r,s=Ie,o=Date.now(),i={}){let a=r.find(d=>d.name===n);if(!a)return[];if(!K(a))return[];let c=new Set(vt(e,n).map(d=>d.subject_id).filter(d=>d!==null)),l=[];for(let d of t){if(d.name===n||c.has(fO(d.name)))continue;let u=fe(e,d.name),f=u?.epic_closed_surfaced_ts?Date.parse(u.epic_closed_surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m;try{m=re(d)}catch{continue}let p=Ke(e,m,d.leadAlias);if(p===null)continue;let h=p.entities.filter(y=>y.kind==="epic"&&Ei.has(we(y.status)));if(h.length===0)continue;i.beforeRevalidate?.();let _=qn(re(d)),g=!1;e.transaction(()=>{let y=[];for(let A of h){let I=Lm(e,A.id);if(I===null)continue;let R=I.entity;Ei.has(we(R.status))&&(R.owner_team_path!==_||R.owner_alias!==d.leadAlias||I.alreadySurfacedThisEpisode||y.push(R))}if(y.length===0)return;let E=y.map(A=>`#${A.id} ("${A.title}")`),T=`Team "${d.name}" closed ${y.length} epic(s): ${E.join(", ")} -- review with \`lmauto tasks show <id>\`. If more work remains, add task(s) + \`lmauto tasks update <id> --status open\` to reopen; otherwise no action needed, it stays closed.`;Ne(e,r,n,T,{from:"autopilot",subject:fO(d.name),escalationOnly:!0});let b=new Date().toISOString();for(let A of y)cr(e,A.id,{body:JSON.stringify({[Py]:b})});ov(e,d.name,b),g=!0}).immediate(),g&&l.push(d.name)}return l}function pO(e){return`done-check:${e}`}var _O="consistency_alert_ts";function hO(e,t){return e.transaction(()=>{let r=nn(e,t);if(r===null)return null;let s=e.prepare("SELECT * FROM notes WHERE entity_id = ? ORDER BY id DESC").all(t),o=null,i=r.updated_at,a=!1;for(let c of s){let l=lr(c.body);if(l!==null){if(l[hs]===!0){o=c.id,typeof l.to=="string"&&we(l.to)==="done"&&(i=c.created_at);break}typeof l[_O]=="string"&&(a=!0)}}return{entity:r,status:r.status,epochId:o,doneTransitionIso:i,alreadyAlertedThisEpisode:a}})()}async function Y7(e,t,n){let r=new Date(Date.parse(t)-n).toISOString();for(let s of e)if(await Bp(s,r))return!0;return!1}async function gO(e,t,n,r,s=Ie,o={}){let i=o.hasEvidenceAroundDoneImpl??Y7,a=r.find(d=>d.name===n);if(!a)return[];if(!K(a))return[];let c=new Set(vt(e,n).map(d=>d.subject_id).filter(d=>d!==null)),l=[];for(let d of t){if(d.name===n||c.has(pO(d.name)))continue;let u;try{u=re(d)}catch{continue}let f=Ke(e,u,d.leadAlias);if(f===null)continue;let m=new Map(f.entities.map(T=>[T.id,T])),p=f.entities.filter(T=>(T.kind==="task"||T.kind==="subtask")&&we(T.status)==="done"&&!ur(e,T,m));if(p.length===0)continue;let h=d.folders&&d.folders.length>0?d.folders:[d.repoPath],_=[];for(let T of p){let b=hO(e,T.id);if(b===null||b.alreadyAlertedThisEpisode)continue;await i(h,b.doneTransitionIso,s.idleThresholdMs)||_.push({entity:T,epochId:b.epochId})}if(_.length===0)continue;let g=qn(u),w=new Date().toISOString(),y=!1;e.transaction(()=>{let T=[];for(let{entity:I,epochId:R}of _){let L=hO(e,I.id);if(L===null)continue;let N=L.entity;we(N.status)==="done"&&(N.owner_team_path!==g||N.owner_alias!==d.leadAlias||ur(e,N,new Map)||L.epochId!==R||L.alreadyAlertedThisEpisode||T.push(N))}if(T.length===0)return;let b=T.map(I=>`#${I.id} ("${I.title}")`),A=`Team "${d.name}" reported ${T.length} task(s) done with no commit/file-write found in its tracked path(s) around that time: ${b.join(", ")} -- please verify (\`lmauto tasks show <id>\` for details). This is a soft signal only; no action is needed if the work is genuinely fileless (design/coordination, or landed outside the team's tracked folders).`;Ne(e,r,n,A,{from:"autopilot",subject:pO(d.name),escalationOnly:!0});for(let I of T)cr(e,I.id,{body:JSON.stringify({[_O]:w})});y=!0}).immediate(),y&&l.push(d.name)}return l}function EO(e){return`fault:${e}`}async function yO(e,t,n,r,s=Ie,o=Date.now(),i={}){if(!r.some(l=>l.name===n))return[];let a=new Set(vt(e,n).map(l=>l.subject_id).filter(l=>l!==null)),c=[];for(let l of t){if(l.name===n||a.has(EO(l.name)))continue;let d=fe(e,l.name),u=d?.fault_surfaced_ts?Date.parse(d.fault_surfaced_ts):null;if(u!==null&&o-u<=s.cooldownMs)continue;let f;try{f=re(l)}catch{continue}let m=Ke(e,f,l.leadAlias);if(m===null)continue;let p=ic(e,m,s.cooldownMs,o);if(p.length===0)continue;i.beforeRevalidate?.();let h=!1;e.transaction(()=>{let g=[];for(let E of p){let T=nn(e,E.id);if(T===null)continue;let b=ic(e,{entities:[T]},s.cooldownMs,o,{team:re(l),alias:l.leadAlias});b.length!==0&&g.push(b[0])}if(g.length===0)return;let w=g.map(E=>{let T=_i(e,E.id),b=T!==null?`note: "${T.body}"`:"no note recorded";return`#${E.id} ("${E.title}", ${E.status}, ${b})`}),y=`Team "${l.name}" has ${g.length} task(s) stuck in a fault state past expected recovery: ${w.join(", ")} -- \`lmauto tasks show <id>\` for full context. The team is still being nudged with a back-off template on its own cadence; this is a distinct heads-up that the fault has persisted, not a request to intervene on the team's behalf.`;Ne(e,r,n,y,{from:"autopilot",subject:EO(l.name)}),sv(e,l.name,new Date().toISOString()),h=!0}).immediate(),h&&c.push(l.name)}return c}function wO(e,t,n,r,s,o=288e5){let i=new Date(s-r).toISOString(),a=new Date(s-o).toISOString();return e.prepare(`SELECT EXISTS(
2228
2228
  SELECT 1 FROM tracked_invocation
2229
2229
  WHERE target_teamfile = ? AND target_alias = ?
2230
2230
  AND (
@@ -2232,13 +2232,13 @@ ${t.join(`
2232
2232
  OR started_at >= ?
2233
2233
  OR ended_at >= ?
2234
2234
  )
2235
- ) AS found`).get(t,n,a,i,i).found===1}function TO(e){return`unknown:${e}`}async function vO(e,t,n,r,s=Ie,o=Date.now(),i=ma){if(!r.some(l=>l.name===n))return[];let a;function c(){return a??=i(),a}try{return await K7(e,t,n,r,s,o,c)}finally{a!==void 0&&a.close()}}async function K7(e,t,n,r,s,o,i){let a=new Map(r.map(d=>[d.name,d])),c=new Set(Tt(e,n).map(d=>d.subject_id).filter(d=>d!==null)),l=[];for(let d of t){if(d===n||c.has(TO(d))||c.has(d))continue;let u=fe(e,d),f=u?.surfaced_ts?Date.parse(u.surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m=a.get(d);if(m?.repoPath!==void 0&&m?.leadAlias!==void 0){let E;try{E=re({name:d,repoPath:m.repoPath})}catch{E=""}if(E!==""&&wO(i(),E,m.leadAlias,s.idleThresholdMs,o))continue}let p=a.get(d),h=p?.repoPath!==void 0&&p?.leadAlias!==void 0,_=h?Ah(e,{name:d,repoPath:p.repoPath,leadAlias:p.leadAlias}):yt(e,d)===null,g=u===null||u.progress_status==="ACTIVE",w=!_&&h&&g&&Sh(e,{name:d,repoPath:p.repoPath,leadAlias:p.leadAlias},s.idleThresholdMs,o);if(!_&&!w)continue;let y=_?`[status-engine] Team "${d}" is registered but has never been dispatched to -- needs S1 prep / a first dispatch, not a "no progress" investigation.`:`[status-engine] Team "${d}" has an in-progress lmtasks entity with no recent activity for over ${Math.round(s.idleThresholdMs/6e4)} minutes, though its own file-scan progress does not itself show stalled evidence (no scan yet, or last reported ACTIVE). This is OBJECTIVE lmtasks-activity evidence only -- please investigate (\`lmauto oversee ${d}\`) and either re-prep/re-dispatch it or confirm it is truly done.`;Ne(e,r,n,y,{from:"autopilot",subject:TO(d)}),nv(e,d,new Date().toISOString()),l.push(d)}return l}import{execFile as z7}from"node:child_process";import{promisify as Q7}from"node:util";function Rl(e){switch(e.kind){case"provider_disabled":return`provider ${e.provider} disabled (no dispatch attempted)`;case"parked":return"parked, confirmed done (no dispatch attempted)";case"presence_gated":return"a session is currently held (actively observed right now)";case"auto_nudge_disabled":return"auto-nudge disabled for this team (on-demand)";case"fleet_scan_paused":return"fleet-wide auto-scan paused";case"provider_exhausted_backoff":return`provider ${e.provider} in quota backoff (no dispatch attempted)`;case"no_continuous_observer":return"nothing has classified this team since (no continuous observer)"}}function Cm(e,t,n,r,s={}){let o=s.resolveMemberProviderImpl??ir,i=s.checkProviderDisabledImpl??Kt,a=s.isProviderExhaustedImpl??Im,c=s.allLocalTeams??[t],l=Un(e,t.name),d=l===null?t.name:l.companionTeam,u=l===null?t.leadAlias:l.workerAlias,f=l===null?t.repoPath:c.find(p=>p.name===d)?.repoPath??t.repoPath,m=o({repoPath:f,name:d},u);if(m!==null&&i(e,m,r).disabled)return{kind:"provider_disabled",provider:m};if(fe(e,t.name)?.confirmed_done_ts)return{kind:"parked"};if(wt(t,n))return{kind:"presence_gated"};if(!t.autoNudge)return{kind:"auto_nudge_disabled"};if(Ks(e)!==null)return{kind:"fleet_scan_paused"};try{let p=`${re(t)}:${t.leadAlias}`;if(a(n,p))return{kind:"provider_exhausted_backoff",provider:o(t,t.leadAlias)??"unknown"}}catch{}return{kind:"no_continuous_observer"}}var SO=Q7(z7),Z7=new Set(["ENV-ERROR","NO-OUTPUT"]),eZ=24*60*6e4,tZ=3;async function Nl(e,t,n=SO){try{return await n("lmctl",["tail",e,t,"--lines","1"],{timeout:1e4}),{sessionResolves:!0,provider:null,detail:"dispatch completes, session resolves; cause unknown"}}catch(r){let s=r&&typeof r=="object"&&"stderr"in r?String(r.stderr).trim():"",o=/session not found/i.test(s),i=/provider=([\w.-]+)/.exec(s);return{sessionResolves:!o,provider:o?i?.[1]??null:null,detail:s.length>0?s:"lmctl tail failed with no output"}}}async function bO(e,t,n,r,s,o={}){let i=o.execImpl??SO,a=o.whyNotObservedImpl??Cm,c=o.flappingWindowMs??eZ,l=o.flappingOccurrenceThreshold??tZ,d=o.listRecentEventsByStatusImpl??dd,u=[],f=[];for(let m of t){let p=ev(e,m.name);if(p.kind==="never-observed")continue;let h=a(e,m,n,r,o.whyNotObservedOptions);if(h.kind==="presence_gated")continue;let{value:_,observedAt:g,changedAt:w}=p,y=r-Date.parse(g),E=new Date(r-c).toISOString(),T=[...d(e,"ENV-ERROR",E,100),...d(e,"NO-OUTPUT",E,100)].filter(R=>R.team===m.name).sort((R,L)=>Date.parse(L.ts)-Date.parse(R.ts)),b=T.length>=l,A=Z7.has(_.status)&&!Number.isNaN(y)&&y>=s;if(!A&&!b)continue;if(b&&!A){let R=T[0],L={kind:"flapping",team:m.name,mostRecentStatus:R.status,mostRecentAt:R.ts,occurrenceCount:T.length,windowMs:c};h.kind==="no_continuous_observer"?u.push(L):f.push({team:m.name,status:R.status,changedAt:R.ts,observedAt:g,ageMs:y,suspension:h});continue}let I=_.status;if(h.kind==="no_continuous_observer"){let R=null;if(I==="NO-OUTPUT")try{R=await Nl(re(m),m.leadAlias,i)}catch{R=null}u.push({kind:"continuous",team:m.name,status:I,changedAt:w,observedAt:g,ageMs:y,cause:R})}else f.push({team:m.name,status:I,changedAt:w,observedAt:g,ageMs:y,suspension:h})}return u.sort((m,p)=>m.kind==="continuous"&&p.kind==="continuous"?p.ageMs-m.ageMs:0),f.sort((m,p)=>p.ageMs-m.ageMs),{unreachable:u,notObserved:f}}import{execFile as nZ}from"node:child_process";import{promisify as rZ}from"node:util";var sZ=rZ(nZ);async function AO(e,t=sZ){try{let{stdout:n}=await t("git",["-C",e,"status","--porcelain"],{timeout:1e4});return n.split(`
2235
+ ) AS found`).get(t,n,a,i,i).found===1}function TO(e){return`unknown:${e}`}async function vO(e,t,n,r,s=Ie,o=Date.now(),i=ma){if(!r.some(l=>l.name===n))return[];let a;function c(){return a??=i(),a}try{return await K7(e,t,n,r,s,o,c)}finally{a!==void 0&&a.close()}}async function K7(e,t,n,r,s,o,i){let a=new Map(r.map(d=>[d.name,d])),c=new Set(vt(e,n).map(d=>d.subject_id).filter(d=>d!==null)),l=[];for(let d of t){if(d===n||c.has(TO(d))||c.has(d))continue;let u=fe(e,d),f=u?.surfaced_ts?Date.parse(u.surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m=a.get(d);if(m?.repoPath!==void 0&&m?.leadAlias!==void 0){let E;try{E=re({name:d,repoPath:m.repoPath})}catch{E=""}if(E!==""&&wO(i(),E,m.leadAlias,s.idleThresholdMs,o))continue}let p=a.get(d),h=p?.repoPath!==void 0&&p?.leadAlias!==void 0,_=h?Ah(e,{name:d,repoPath:p.repoPath,leadAlias:p.leadAlias}):wt(e,d)===null,g=u===null||u.progress_status==="ACTIVE",w=!_&&h&&g&&Sh(e,{name:d,repoPath:p.repoPath,leadAlias:p.leadAlias},s.idleThresholdMs,o);if(!_&&!w)continue;let y=_?`[status-engine] Team "${d}" is registered but has never been dispatched to -- needs S1 prep / a first dispatch, not a "no progress" investigation.`:`[status-engine] Team "${d}" has an in-progress lmtasks entity with no recent activity for over ${Math.round(s.idleThresholdMs/6e4)} minutes, though its own file-scan progress does not itself show stalled evidence (no scan yet, or last reported ACTIVE). This is OBJECTIVE lmtasks-activity evidence only -- please investigate (\`lmauto oversee ${d}\`) and either re-prep/re-dispatch it or confirm it is truly done.`;Ne(e,r,n,y,{from:"autopilot",subject:TO(d)}),nv(e,d,new Date().toISOString()),l.push(d)}return l}import{execFile as z7}from"node:child_process";import{promisify as Q7}from"node:util";function Rl(e){switch(e.kind){case"provider_disabled":return`provider ${e.provider} disabled (no dispatch attempted)`;case"parked":return"parked, confirmed done (no dispatch attempted)";case"presence_gated":return"a session is currently held (actively observed right now)";case"auto_nudge_disabled":return"auto-nudge disabled for this team (on-demand)";case"fleet_scan_paused":return"fleet-wide auto-scan paused";case"provider_exhausted_backoff":return`provider ${e.provider} in quota backoff (no dispatch attempted)`;case"no_continuous_observer":return"nothing has classified this team since (no continuous observer)"}}function Cm(e,t,n,r,s={}){let o=s.resolveMemberProviderImpl??ir,i=s.checkProviderDisabledImpl??Kt,a=s.isProviderExhaustedImpl??Im,c=s.allLocalTeams??[t],l=Un(e,t.name),d=l===null?t.name:l.companionTeam,u=l===null?t.leadAlias:l.workerAlias,f=l===null?t.repoPath:c.find(p=>p.name===d)?.repoPath??t.repoPath,m=o({repoPath:f,name:d},u);if(m!==null&&i(e,m,r).disabled)return{kind:"provider_disabled",provider:m};if(fe(e,t.name)?.confirmed_done_ts)return{kind:"parked"};if(Tt(t,n))return{kind:"presence_gated"};if(!t.autoNudge)return{kind:"auto_nudge_disabled"};if(Ks(e)!==null)return{kind:"fleet_scan_paused"};try{let p=`${re(t)}:${t.leadAlias}`;if(a(n,p))return{kind:"provider_exhausted_backoff",provider:o(t,t.leadAlias)??"unknown"}}catch{}return{kind:"no_continuous_observer"}}var SO=Q7(z7),Z7=new Set(["ENV-ERROR","NO-OUTPUT"]),eZ=24*60*6e4,tZ=3;async function Nl(e,t,n=SO){try{return await n("lmctl",["tail",e,t,"--lines","1"],{timeout:1e4}),{sessionResolves:!0,provider:null,detail:"dispatch completes, session resolves; cause unknown"}}catch(r){let s=r&&typeof r=="object"&&"stderr"in r?String(r.stderr).trim():"",o=/session not found/i.test(s),i=/provider=([\w.-]+)/.exec(s);return{sessionResolves:!o,provider:o?i?.[1]??null:null,detail:s.length>0?s:"lmctl tail failed with no output"}}}async function bO(e,t,n,r,s,o={}){let i=o.execImpl??SO,a=o.whyNotObservedImpl??Cm,c=o.flappingWindowMs??eZ,l=o.flappingOccurrenceThreshold??tZ,d=o.listRecentEventsByStatusImpl??dd,u=[],f=[];for(let m of t){let p=ev(e,m.name);if(p.kind==="never-observed")continue;let h=a(e,m,n,r,o.whyNotObservedOptions);if(h.kind==="presence_gated")continue;let{value:_,observedAt:g,changedAt:w}=p,y=r-Date.parse(g),E=new Date(r-c).toISOString(),T=[...d(e,"ENV-ERROR",E,100),...d(e,"NO-OUTPUT",E,100)].filter(R=>R.team===m.name).sort((R,L)=>Date.parse(L.ts)-Date.parse(R.ts)),b=T.length>=l,A=Z7.has(_.status)&&!Number.isNaN(y)&&y>=s;if(!A&&!b)continue;if(b&&!A){let R=T[0],L={kind:"flapping",team:m.name,mostRecentStatus:R.status,mostRecentAt:R.ts,occurrenceCount:T.length,windowMs:c};h.kind==="no_continuous_observer"?u.push(L):f.push({team:m.name,status:R.status,changedAt:R.ts,observedAt:g,ageMs:y,suspension:h});continue}let I=_.status;if(h.kind==="no_continuous_observer"){let R=null;if(I==="NO-OUTPUT")try{R=await Nl(re(m),m.leadAlias,i)}catch{R=null}u.push({kind:"continuous",team:m.name,status:I,changedAt:w,observedAt:g,ageMs:y,cause:R})}else f.push({team:m.name,status:I,changedAt:w,observedAt:g,ageMs:y,suspension:h})}return u.sort((m,p)=>m.kind==="continuous"&&p.kind==="continuous"?p.ageMs-m.ageMs:0),f.sort((m,p)=>p.ageMs-m.ageMs),{unreachable:u,notObserved:f}}import{execFile as nZ}from"node:child_process";import{promisify as rZ}from"node:util";var sZ=rZ(nZ);async function AO(e,t=sZ){try{let{stdout:n}=await t("git",["-C",e,"status","--porcelain"],{timeout:1e4});return n.split(`
2236
2236
  `).filter(r=>r.trim().length>0).length}catch{return null}}import{execFile as oZ}from"node:child_process";import{promisify as iZ}from"node:util";var aZ=iZ(oZ);async function kO(e,t=aZ){try{let{stderr:n}=await t("lmctl",["lint",e],{timeout:15e3});return IO(n)}catch(n){let r=n&&typeof n=="object"&&"stderr"in n?String(n.stderr):"",s=IO(r);return s.length>0?s:null}}function IO(e){return e.split(`
2237
2237
  `).map(t=>t.trim()).filter(t=>t.startsWith("warning:")||t.startsWith("error:"))}import{existsSync as Uy}from"node:fs";function Fy(e,t,n=new Set){if(t.owner_team_path!==null)return{ownerTeamPath:t.owner_team_path,ownerAlias:t.owner_alias,explicit:!0};if(t.parent_id===null||n.has(t.id))return null;n.add(t.id);let r=nn(e,t.parent_id);if(r===null)return null;let s=Fy(e,r,n);return s===null?null:{...s,explicit:!1}}function Om(e,t){if(t===null)return null;for(let n of e)if(K(n))try{if(re(n)===t)return n.name}catch{continue}return null}function RO(e){return e.prepare("SELECT * FROM entities WHERE kind = 'epic' AND owner_team_path IS NULL").all().filter(n=>!En(n.status))}function NO(e,t,n=Uy){return Om(e,t)!==null?"registered":n(t)?"on_demand":"dangling"}function xO(e,t,n={}){let r=n.existsSyncImpl??Uy,s=e.prepare("SELECT * FROM entities WHERE kind IN ('task', 'subtask')").all(),o=[];for(let i of s){if(En(i.status))continue;let a=Fy(e,i);if(a===null){o.push({entity:i,reason:i.parent_id===null?"no owner, and no parent epic to inherit from":"no owner, and its parent epic has none to inherit either"});continue}NO(t,a.ownerTeamPath,r)==="dangling"&&o.push({entity:i,reason:a.explicit?`owner "${a.ownerTeamPath}" does not resolve to any known team (no registered entry, no on-disk teamfile)`:`inherited owner "${a.ownerTeamPath}" (from its epic) does not resolve to any known team`})}return o}function LO(e){return e.prepare("SELECT * FROM entities WHERE status = 'blocked'").all().filter(n=>(rn(e,n.id,"outgoing").outgoing??[]).length===0)}function cZ(e,t){return e.prepare("SELECT 1 FROM queue WHERE to_id = ? LIMIT 1").get(t)!==void 0}function CO(e,t,n,r=Uy){let s=Fy(e,n);if(s===null)return{ownerKind:"dangling",everContacted:null};let o=NO(t,s.ownerTeamPath,r);if(o==="dangling")return{ownerKind:o,everContacted:null};if(o==="on_demand")return{ownerKind:o,everContacted:!1};let i=Om(t,s.ownerTeamPath);return{ownerKind:o,everContacted:cZ(e,i)}}function DO(e,t){let n=rn(e,t,"outgoing").outgoing??[];return new Set(n.filter(r=>!En(r.status)).map(r=>r.id))}function Dm(e,t,n=new Set){if(n.has(t))return[];n.add(t);let s=(rn(e,t,"outgoing").outgoing??[]).filter(a=>!En(a.status)),o=[];for(let a of s)(rn(e,a.id,"outgoing").outgoing??[]).filter(d=>!En(d.status)).length===0?o.push(it(e,a.id)):o.push(...Dm(e,a.id,n));let i=new Set;return o.filter(a=>i.has(a.id)?!1:(i.add(a.id),!0))}function lZ(e,t){let n=new Set([t]),r=(rn(e,t,"incoming").incoming??[]).map(o=>o.id),s=[];for(;r.length>0;){let o=r.pop();if(n.has(o))continue;n.add(o);let i=it(e,o);En(i.status)||(s.push(i),r.push(...(rn(e,o,"incoming").incoming??[]).map(a=>a.id)))}return s}function OO(e){let t=e.trim().toLowerCase();return t==="todo"?0:t==="in_progress"||t==="in-progress"?1:2}function $O(e,t,n){let r=new Map;for(let o of t)for(let i of Dm(e,o.id))r.set(i.id,i);let s=[];for(let o of r.values()){let i=lZ(e,o.id),a=new Set;for(let l of i){let d=Om(n,l.owner_team_path);d!==null&&a.add(d)}let c=CO(e,n,o);s.push({entity:o,downstreamCount:i.length,downstreamTeams:[...a].sort(),ownerKind:c.ownerKind,everContacted:c.everContacted})}return s.sort((o,i)=>{if(o.downstreamTeams.length!==i.downstreamTeams.length)return i.downstreamTeams.length-o.downstreamTeams.length;if(o.downstreamCount!==i.downstreamCount)return i.downstreamCount-o.downstreamCount;let a=OO(o.entity.status)-OO(i.entity.status);return a!==0?a:o.entity.id-i.entity.id}),s}import{execFile as dZ}from"node:child_process";import{readFileSync as uZ}from"node:fs";import{basename as fZ,resolve as mZ}from"node:path";import{promisify as pZ}from"node:util";var jy=pZ(dZ),hZ=[/\.env\.(example|sample|template)$/i],_Z=[/\.pem$/,/\.key$/,/(^|\/)id_rsa$/,/(^|\/)id_ed25519$/,/(^|\/)id_ecdsa$/],gZ=[/(^|\/)\.env(\..+)?$/,/(^|\/)\.mcp\.json$/,/(^|\/)\.netrc$/,/(^|\/)\.npmrc$/],PO=[/\b(?:api[_-]?key|app[_-]?key|secret|token|password|passwd|access[_-]?key)\b\s*[:=]\s*['"]?[A-Za-z0-9+/_.\-]{12,}/i,/\bsk-[A-Za-z0-9]{20,}\b/,/\bghp_[A-Za-z0-9]{30,}\b/,/\bAKIA[0-9A-Z]{16}\b/,/\bBearer\s+[A-Za-z0-9\-_.]{20,}/],EZ=[...PO,/\b_(?:authToken|auth|password)\b\s*[:=]\s*['"]?[A-Za-z0-9+/_.\-]{8,}/i,/\bmachine\s+\S+[\s\S]{0,200}?\blogin\s+\S+[\s\S]{0,200}?\bpassword\s+\S+/i,/\bAWS_SECRET_ACCESS_KEY\b\s*[:=]?\s*['"]?[A-Za-z0-9+/]{20,}/i],$m=20*1024*1024;async function UO(e,t){try{let{stdout:n}=await t("git",["-C",e,"ls-files"],{timeout:1e4,maxBuffer:$m});return n.split(`
2238
2238
  `).filter(r=>r.length>0)}catch{return null}}async function qy(e,t,n){try{let{stdout:r}=await n("git",["-C",e,"show",`HEAD:${t}`],{timeout:1e4,maxBuffer:$m});return r}catch{return null}}async function FO(e,t=jy){let n=await UO(e,t);if(n===null)return null;let r=a=>!hZ.some(c=>c.test(a)),s=n.filter(a=>_Z.some(c=>c.test(a))&&r(a)),o=n.filter(a=>gZ.some(c=>c.test(a))&&r(a)),i=[];for(let a of o){let c=await qy(e,a,t);c!==null&&EZ.some(l=>l.test(c))&&i.push(a)}return[...s,...i]}async function jO(e,t=jy){let n=await UO(e,t);if(n===null)return null;let r=n.filter(o=>o.endsWith(".lmctl")),s=[];for(let o of r){let i=await qy(e,o,t);if(i===null)continue;let a=PO.reduce((c,l)=>c+(l.test(i)?1:0),0);a>0&&s.push({path:o,matchCount:a})}return s}var yZ=[/(^|\/)template\.lmctl$/i,/(^|\/)examples\/.*\.lmctl$/i],MO=/_MEMBER_\b|\bsessionid\s*=\s*\S/;async function qO(e,t=jy){try{let[n,r]=await Promise.all([t("git",["-C",e,"ls-files"],{timeout:1e4,maxBuffer:$m}),t("git",["-C",e,"ls-files","--others","--exclude-standard"],{timeout:1e4,maxBuffer:$m})]),s=d=>!yZ.some(u=>u.test(d)),o=d=>fZ(d).includes(".lmctl")&&s(d),i=n.stdout.split(`
2239
2239
  `).filter(d=>d.length>0&&o(d)),a=r.stdout.split(`
2240
2240
  `).filter(d=>d.length>0&&o(d)),c=[];for(let d of i){let u=await qy(e,d,t);u!==null&&MO.test(u)&&c.push(d)}let l=[];for(let d of a){let u;try{u=uZ(mZ(e,d),"utf8")}catch{continue}MO.test(u)&&l.push(d)}return{tracked:c,unprotected:l}}catch{return null}}import{execFile as wZ}from"node:child_process";import{statSync as HO}from"node:fs";import{homedir as TZ}from"node:os";import{join as WO}from"node:path";import{promisify as vZ}from"node:util";var Hy=vZ(wZ);var SZ="mike.ma@lmctl.com",Wy="mike-lmctl";async function BO(e,t=Hy){let n,r;try{n=(await t("git",["-C",e,"config","user.name"],{timeout:1e4})).stdout.trim()||null}catch{n=null}try{r=(await t("git",["-C",e,"config","user.email"],{timeout:1e4})).stdout.trim()||null}catch{r=null}return n===null&&r===null?null:{name:n,email:r,matchesPolicy:r===SZ}}var bZ=6e4,Mm;async function Pm(e=Hy,t=Date.now(),n=HO){let r=e===Hy&&n===HO;if(r&&Mm!==void 0&&t-Mm.atMs<bZ)return Mm.result;let s=await IZ(e,n);return r&&(Mm={result:s,atMs:t}),s}function AZ(){let e=process.env.GH_CONFIG_DIR;return e?WO(e,"hosts.yml"):WO(TZ(),".config","gh","hosts.yml")}async function IZ(e,t){let n;try{n=(await e("gh",["auth","status"],{timeout:1e4})).stdout}catch(l){let d=l&&typeof l=="object"&&"stdout"in l?String(l.stdout):"";if(d.length===0)return null;n=d}let r=n.split(`
2241
- `),s=r.findIndex(l=>/Active account: true/.test(l));if(s===-1)return null;let a=r.slice(0,s).reverse().find(l=>/Logged in to .* account /.test(l))?.match(/account\s+(\S+)/)?.[1]??null;if(a===null)return null;let c;try{c=t(AZ()).mtime.toISOString()}catch{c=null}return{account:a,matchesPolicy:a===Wy,hostsFileChangedAt:c}}var kZ=7*24*60*6e4,RZ=500,NZ=3*60*6e4,xZ=3*60*6e4,xl=4*60*6e4,LZ=24*60*6e4,CZ=48*60*6e4,OZ=24*60*6e4,DZ=20,Gy=24*60*6e4;function $Z(e,t){let n=ve(t);return`${t>Gy?`possible ${e}`:e} as of ${n} ago (not re-observed)`}var MZ=7*24*60*6e4,PZ=24*60*6e4;function UZ(e,t,n,r,s){if(e?.confirmed_done_ts)return{kind:"confirmed-done",confirmedDoneTs:e.confirmed_done_ts};if(n!==null){let i=r-Date.parse(n);if(Number.isFinite(i)&&i<=PZ)return null}else return s!==void 0&&eh(s)===0?{kind:"unseeded"}:{kind:"never-active"};if(t===null)return{kind:"no-state"};if(t.status!=="ACTIVE")return{kind:"self-report",status:t.status,changedTs:t.changed_ts};let o=r-Date.parse(t.changed_ts);return!Number.isFinite(o)||o>MZ?{kind:"self-report",status:t.status,changedTs:t.changed_ts}:null}function FZ(e,t){let n=e.teams.filter(K);return t===void 0?n:n.filter(r=>r.name===t)}function jZ(e,t,n){let r=n(e);if(r.length===0)return null;let s=[],o=[];for(let i of r)i.provider!==null&&t.has(i.provider)?s.push({alias:i.alias,provider:i.provider}):o.push({alias:i.alias,provider:i.provider});return{totalMembers:r.length,quiescedMembers:s,liveMembers:o}}async function Um(e,t={}){let n=e.db.db,r=t.config??Ie,s=t.nowMs??Date.now(),o=FZ(e,t.team),i=t.awaitingReviewThresholdMs??Th,a=[],c=[],l=[],d=[],u=[],f=new Set(kl(n,s).map(Y=>Y.row.subject_id).filter(Y=>Y!==null)),m=[],p=[],h=[],_=[],g=[],w=[],y=t.countDirtyGitFilesImpl??AO,E=[],T=t.lintTeamfileWarningsImpl??kO,b=[],A=[],I=[],R=[],L=[],N=t.findNeverTrackFilesImpl??FO,k=t.findSecretBearingTeamfilesImpl??jO,D=t.checkTeamfileTrackingImpl??qO,O=t.checkRepoGitIdentityImpl??BO,v=t.resolveMemberProviderImpl??ir,S=t.listTeamMembersImpl??ho,x=[],C=!1;try{x=dl(n).filter(Y=>Kt(n,Y.provider,s).disabled)}catch{C=!0}let q=MC(n,s),F=PC(n),M=null;try{M=UC(n,s)}catch{M=null}let $=new Set(x.map(Y=>Y.provider)),U=[],B=e.teams.filter(K),W=e.teams.map(Y=>Y.name);for(let Y of o){let Re;try{Re=re(Y)}catch{continue}let Et=await T(Re);Et!==null&&Et.length>0&&E.push({team:Y.name,warnings:Et});let en=await N(Y.repoPath);en!==null&&en.length>0&&b.push({team:Y.name,files:en});let ii=await k(Y.repoPath);ii!==null&&ii.length>0&&A.push({team:Y.name,files:ii});let er=await D(Y.repoPath);er!==null&&(er.tracked.length>0&&I.push({team:Y.name,files:er.tracked}),er.unprotected.length>0&&R.push({team:Y.name,files:er.unprotected}));let fo=await O(Y.repoPath);fo!==null&&!fo.matchesPolicy&&L.push({team:Y.name,identity:{name:fo.name,email:fo.email}});let tr=$.size>0?jZ(Y,$,S):null;if($.size>0){let _e=Un(n,Y.name),nr=_e===null?Y.name:_e.companionTeam,kp=_e===null?Y.leadAlias:_e.workerAlias,Qa=_e===null?Y.repoPath:B.find(Za=>Za.name===nr)?.repoPath??Y.repoPath,mo=v({repoPath:Qa,name:nr},kp);if(mo!==null&&$.has(mo)){let Za=x.find(pq=>pq.provider===mo)?.expiresAt??null;U.push({team:Y.name,provider:mo,expiresAt:Za,totalMembers:tr?.totalMembers??1,liveMembers:tr?.liveMembers??[]})}}let Ap=Qo(n,Y.name,s,W);Ap.length>0&&l.push({team:Y.name,rows:Ap,...tr!==null&&tr.quiescedMembers.length>0?{quiescedMembers:tr.quiescedMembers,totalMembers:tr.totalMembers}:{}});let PT=Ap.filter(_e=>_e.row.status==="sent"||_e.row.status==="retrieved");if(PT.length>0){let _e=n.prepare("SELECT MAX(created_ts) AS ts FROM queue WHERE from_id = ?").get(Y.name),nr=UZ(fe(n,Y.name),yt(n,Y.name),_e.ts,s,Y);nr!==null&&u.push({team:Y.name,rows:PT,reason:nr})}let UT=Nm(n,Y.name,xl,s);UT.length>0&&d.push({team:Y.name,rows:UT});let us=Ke(n,Re,Y.leadAlias);if(us===null)continue;for(let _e of yi(n,us)){let nr;try{let Qa=DO(n,_e.id),mo=Dm(n,_e.id).filter(Za=>!Qa.has(Za.id));mo.length>0&&(nr=mo)}catch{nr=void 0}let kp=Dd(n,_e.id);a.push({team:Y.name,entity:_e,blockedSinceTs:kp,...nr!==void 0?{roots:nr}:{}}),_e.blocked_on==="operator"?f.has(`task:${_e.id}`)||c.push({team:Y.name,entity:_e,blockedOn:"operator",reason:"operator-uncorrelated"}):_e.blocked_on!==null&&!e.teams.some(Qa=>Qa.name===_e.blocked_on)&&c.push({team:Y.name,entity:_e,blockedOn:_e.blocked_on,reason:"team-unresolvable"})}for(let _e of ic(n,us,r.cooldownMs,s))m.push({team:Y.name,entity:_e});for(let _e of WS(n,us,i,s))p.push({team:Y.name,task:_e});for(let _e of BS(n,us,s))h.push({team:Y.name,task:_e});for(let _e of us.entities)_e.kind==="epic"&&_e.needs_review===1&&jd(_e)&&_.push({team:Y.name,entity:_e});for(let _e of us.entities)_e.kind!=="epic"||!Ei.has(we(_e.status))||Lm(n,_e.id)?.alreadySurfacedThisEpisode||g.push({team:Y.name,entity:_e});let Ip=us.entities.filter(_e=>we(_e.status)==="todo");if(Ip.length>0){let _e=await y(Y.repoPath);_e!==null&&_e>0&&w.push({team:Y.name,dirtyCount:_e,todoCount:Ip.length,exampleEntity:Ip[0]})}}let z=await(t.fetchReportImpl??Je)(),ue=t.heavyLockImpl?t.heavyLockImpl():fn(void 0,void 0,void 0,()=>{}),J=await wi(n,o,z,ue,r,s,{readOnly:!0}),V=new Set(U.map(Y=>Y.team)),j=J.filter(Y=>!V.has(Y)),X=t.findPersistentDispatchFailuresImpl??bO,{unreachable:Q,notObserved:ee}=await X(n,o,z,s,xl),ce=[];for(let Y of j){let Re=fe(n,Y);if(Re?.miniplayer_verdict_label&&Re.miniplayer_verdict_reason&&Re.miniplayer_verdict_ts){let Et=yt(n,Y),en=Re.miniplayer_verdict_label!=="genuinely_done"&&Et?.status==="DONE"?{changedTs:Et.changed_ts}:void 0;ce.push({team:Y,label:Re.miniplayer_verdict_label,reason:Re.miniplayer_verdict_reason,ts:Re.miniplayer_verdict_ts,...en!==void 0?{selfReportedDone:en}:{}})}}let le=[];for(let Y of o){let Re=fe(n,Y.name);Re?.hung_holder_flagged_ts&&Re.hung_holder_reason&&le.push({team:Y.name,reason:Re.hung_holder_reason,flaggedTs:Re.hung_holder_flagged_ts})}let Ee=dv(n).map(Y=>({team:Y.team,reason:Y.reason,detail:Y.detail,suspendedAt:Y.suspended_at})),He=t.blockedSelfReportUrgentThresholdMs??LZ,Ue=t.blockedSelfReportUnconfirmedThresholdMs??CZ,te=[];for(let Y of o){let Re=yt(n,Y.name);if(Re?.status==="BLOCKED"){let Et=s-Date.parse(Re.changed_ts),en=Et>=Ue;te.push({team:Y.name,changedTs:Re.changed_ts,ageMs:Et,urgent:!en&&Et>=He,unconfirmed:en})}}te.sort((Y,Re)=>Re.ageMs-Y.ageMs);let Oe=t.orphanReapCandidateWindowMs??kZ,Ct=new Date(s-Oe).toISOString(),Zn=dd(n,cy,Ct,RZ).filter(Y=>t.team===void 0||Y.team===t.team).map(Y=>({team:Y.team,ts:Y.ts,reason:Y.note??"(no reason recorded)"})),Z=t.maintainer===void 0?null:[...Tt(n,t.maintainer),...xd(n,t.maintainer)].sort((Y,Re)=>Y.id-Re.id).filter(Y=>Y.from_id!=="autopilot"),xe=t.maintainer===void 0?[]:JC(n,t.maintainer,s).map(Y=>({row:Y.row,constituentCount:zo(n,Y.row)})),Zt=t.maintainer===void 0?[]:kl(n,s).map(Y=>{let Re=zo(n,Y.row),Et=Il(n,Y.row),en=Y.ageMs>=xl||Re>=2&&Y.row.sent_ts===null;return{row:Y.row,constituentCount:Re,retractedCount:Et,urgent:en}}),jt=t.maintainerStaleThresholdMs??NZ,_n=[];if(t.maintainer!==void 0&&Z!==null){let Re=fe(n,t.maintainer)?.last_cli_activity_ts??null,Et=_0(Re,s),en=!oy(Re,jt,s),ii=Z[0],er=ii?s-Date.parse(ii.created_ts):null,fo=er!==null&&er>jt;if(en||fo){let tr=[];en&&tr.push(Re===null?"no CLI activity ever recorded":`no CLI activity in ${ve(Et)}`),fo&&tr.push(`oldest queued item is ${ve(er)} old`),_n.push({team:t.maintainer,reason:tr.join("; "),ageMs:Et===null?1/0:Math.max(Et,er??0)})}}let Ot;if(t.team===void 0)Ot=a.map(Y=>Y.entity);else{Ot=[];for(let Y of e.teams.filter(K)){let Re;try{Re=re(Y)}catch{continue}let Et=Ke(n,Re,Y.leadAlias);Et!==null&&Ot.push(...yi(n,Et))}}let oi=$O(n,Ot,e.teams),ls=RO(n),Mr=xO(n,e.teams),qt=LO(n),ds=[];for(let Y of e.teams.filter(K)){try{re(Y)}catch{continue}eh(Y)===0&&ds.push({team:Y.name,repoPath:Y.repoPath})}let za=t.stuckProcessingThresholdMs??xZ,rd=t.stuckProcessingMaxAgeMs??OZ,bp=t.maintainer!==void 0&&t.stuckProcessingFleetWide!==!0?t.maintainer:void 0,mq=VC(n,{minAgeMs:za,maxAgeMs:rd,fromId:bp},s).map(Y=>({queueId:Y.row.id,fromId:Y.row.from_id,toId:Y.row.to_id,ageMs:Y.ageMs,constituentCount:zo(n,Y.row)}));return{blocked:a,blockedOnUnresolved:c,owedAnswers:l,recentlyAnsweredForSender:d,parkedTeamsWithOwedPrompts:u,awaitingDecision:m,awaitingReview:p,stalled:j,stalledVerdicts:ce,hungHolders:le,autoNudgeSuspended:Ee,blockedSelfReports:te,flaggedEpics:_,closedEpicsToReview:g,orphanReapCandidates:Zn,maintainerStale:_n,blockingRoots:oi,epicsWithoutOwner:ls,unresolvableOwnerEntities:Mr,untrackedBlockers:qt,unseededTeams:ds,stuckProcessing:mq,inbox:Z,memory:(t.readMemoryAvailabilityImpl??sc)(),operatorPrompts:xe,operatorEscalations:Zt,uncommittedWork:w,teamfileLintWarnings:E,expiredHolds:h,neverTrackFiles:b,secretBearingTeamfiles:A,trackedTeamfiles:I,unprotectedTeamfiles:R,gitIdentityMismatches:L,activeGhAccount:await(t.checkActiveGhAccountImpl??Pm)(),disabledProviders:x,providerDisableReadFailed:C,quiescedByProviderDisable:U,staleAutoScanPause:M,persistentDispatchFailures:Q,notObserved:ee,rateLimitPolicyHealth:q,rateLimitLevelWarnings:F}}function By(e){return` ${e.team}: #${e.entity.id} ("${e.entity.title}")`}function GO(e){return e.length===0?"":`
2241
+ `),s=r.findIndex(l=>/Active account: true/.test(l));if(s===-1)return null;let a=r.slice(0,s).reverse().find(l=>/Logged in to .* account /.test(l))?.match(/account\s+(\S+)/)?.[1]??null;if(a===null)return null;let c;try{c=t(AZ()).mtime.toISOString()}catch{c=null}return{account:a,matchesPolicy:a===Wy,hostsFileChangedAt:c}}var kZ=7*24*60*6e4,RZ=500,NZ=3*60*6e4,xZ=3*60*6e4,xl=4*60*6e4,LZ=24*60*6e4,CZ=48*60*6e4,OZ=24*60*6e4,DZ=20,Gy=24*60*6e4;function $Z(e,t){let n=ve(t);return`${t>Gy?`possible ${e}`:e} as of ${n} ago (not re-observed)`}var MZ=7*24*60*6e4,PZ=24*60*6e4;function UZ(e,t,n,r,s){if(e?.confirmed_done_ts)return{kind:"confirmed-done",confirmedDoneTs:e.confirmed_done_ts};if(n!==null){let i=r-Date.parse(n);if(Number.isFinite(i)&&i<=PZ)return null}else return s!==void 0&&eh(s)===0?{kind:"unseeded"}:{kind:"never-active"};if(t===null)return{kind:"no-state"};if(t.status!=="ACTIVE")return{kind:"self-report",status:t.status,changedTs:t.changed_ts};let o=r-Date.parse(t.changed_ts);return!Number.isFinite(o)||o>MZ?{kind:"self-report",status:t.status,changedTs:t.changed_ts}:null}function FZ(e,t){let n=e.teams.filter(K);return t===void 0?n:n.filter(r=>r.name===t)}function jZ(e,t,n){let r=n(e);if(r.length===0)return null;let s=[],o=[];for(let i of r)i.provider!==null&&t.has(i.provider)?s.push({alias:i.alias,provider:i.provider}):o.push({alias:i.alias,provider:i.provider});return{totalMembers:r.length,quiescedMembers:s,liveMembers:o}}async function Um(e,t={}){let n=e.db.db,r=t.config??Ie,s=t.nowMs??Date.now(),o=FZ(e,t.team),i=t.awaitingReviewThresholdMs??Th,a=[],c=[],l=[],d=[],u=[],f=new Set(kl(n,s).map(Y=>Y.row.subject_id).filter(Y=>Y!==null)),m=[],p=[],h=[],_=[],g=[],w=[],y=t.countDirtyGitFilesImpl??AO,E=[],T=t.lintTeamfileWarningsImpl??kO,b=[],A=[],I=[],R=[],L=[],N=t.findNeverTrackFilesImpl??FO,k=t.findSecretBearingTeamfilesImpl??jO,D=t.checkTeamfileTrackingImpl??qO,O=t.checkRepoGitIdentityImpl??BO,v=t.resolveMemberProviderImpl??ir,S=t.listTeamMembersImpl??ho,x=[],C=!1;try{x=dl(n).filter(Y=>Kt(n,Y.provider,s).disabled)}catch{C=!0}let q=MC(n,s),F=PC(n),M=null;try{M=UC(n,s)}catch{M=null}let $=new Set(x.map(Y=>Y.provider)),U=[],B=e.teams.filter(K),W=e.teams.map(Y=>Y.name);for(let Y of o){let Re;try{Re=re(Y)}catch{continue}let yt=await T(Re);yt!==null&&yt.length>0&&E.push({team:Y.name,warnings:yt});let en=await N(Y.repoPath);en!==null&&en.length>0&&b.push({team:Y.name,files:en});let ii=await k(Y.repoPath);ii!==null&&ii.length>0&&A.push({team:Y.name,files:ii});let er=await D(Y.repoPath);er!==null&&(er.tracked.length>0&&I.push({team:Y.name,files:er.tracked}),er.unprotected.length>0&&R.push({team:Y.name,files:er.unprotected}));let fo=await O(Y.repoPath);fo!==null&&!fo.matchesPolicy&&L.push({team:Y.name,identity:{name:fo.name,email:fo.email}});let tr=$.size>0?jZ(Y,$,S):null;if($.size>0){let _e=Un(n,Y.name),nr=_e===null?Y.name:_e.companionTeam,kp=_e===null?Y.leadAlias:_e.workerAlias,Qa=_e===null?Y.repoPath:B.find(Za=>Za.name===nr)?.repoPath??Y.repoPath,mo=v({repoPath:Qa,name:nr},kp);if(mo!==null&&$.has(mo)){let Za=x.find(pq=>pq.provider===mo)?.expiresAt??null;U.push({team:Y.name,provider:mo,expiresAt:Za,totalMembers:tr?.totalMembers??1,liveMembers:tr?.liveMembers??[]})}}let Ap=Qo(n,Y.name,s,W);Ap.length>0&&l.push({team:Y.name,rows:Ap,...tr!==null&&tr.quiescedMembers.length>0?{quiescedMembers:tr.quiescedMembers,totalMembers:tr.totalMembers}:{}});let PT=Ap.filter(_e=>_e.row.status==="sent"||_e.row.status==="retrieved");if(PT.length>0){let _e=n.prepare("SELECT MAX(created_ts) AS ts FROM queue WHERE from_id = ?").get(Y.name),nr=UZ(fe(n,Y.name),wt(n,Y.name),_e.ts,s,Y);nr!==null&&u.push({team:Y.name,rows:PT,reason:nr})}let UT=Nm(n,Y.name,xl,s);UT.length>0&&d.push({team:Y.name,rows:UT});let us=Ke(n,Re,Y.leadAlias);if(us===null)continue;for(let _e of yi(n,us)){let nr;try{let Qa=DO(n,_e.id),mo=Dm(n,_e.id).filter(Za=>!Qa.has(Za.id));mo.length>0&&(nr=mo)}catch{nr=void 0}let kp=Dd(n,_e.id);a.push({team:Y.name,entity:_e,blockedSinceTs:kp,...nr!==void 0?{roots:nr}:{}}),_e.blocked_on==="operator"?f.has(`task:${_e.id}`)||c.push({team:Y.name,entity:_e,blockedOn:"operator",reason:"operator-uncorrelated"}):_e.blocked_on!==null&&!e.teams.some(Qa=>Qa.name===_e.blocked_on)&&c.push({team:Y.name,entity:_e,blockedOn:_e.blocked_on,reason:"team-unresolvable"})}for(let _e of ic(n,us,r.cooldownMs,s))m.push({team:Y.name,entity:_e});for(let _e of WS(n,us,i,s))p.push({team:Y.name,task:_e});for(let _e of BS(n,us,s))h.push({team:Y.name,task:_e});for(let _e of us.entities)_e.kind==="epic"&&_e.needs_review===1&&jd(_e)&&_.push({team:Y.name,entity:_e});for(let _e of us.entities)_e.kind!=="epic"||!Ei.has(we(_e.status))||Lm(n,_e.id)?.alreadySurfacedThisEpisode||g.push({team:Y.name,entity:_e});let Ip=us.entities.filter(_e=>we(_e.status)==="todo");if(Ip.length>0){let _e=await y(Y.repoPath);_e!==null&&_e>0&&w.push({team:Y.name,dirtyCount:_e,todoCount:Ip.length,exampleEntity:Ip[0]})}}let z=await(t.fetchReportImpl??Je)(),ue=t.heavyLockImpl?t.heavyLockImpl():fn(void 0,void 0,void 0,()=>{}),J=await wi(n,o,z,ue,r,s,{readOnly:!0}),V=new Set(U.map(Y=>Y.team)),j=J.filter(Y=>!V.has(Y)),X=t.findPersistentDispatchFailuresImpl??bO,{unreachable:Q,notObserved:ee}=await X(n,o,z,s,xl),ce=[];for(let Y of j){let Re=fe(n,Y);if(Re?.miniplayer_verdict_label&&Re.miniplayer_verdict_reason&&Re.miniplayer_verdict_ts){let yt=wt(n,Y),en=Re.miniplayer_verdict_label!=="genuinely_done"&&yt?.status==="DONE"?{changedTs:yt.changed_ts}:void 0;ce.push({team:Y,label:Re.miniplayer_verdict_label,reason:Re.miniplayer_verdict_reason,ts:Re.miniplayer_verdict_ts,...en!==void 0?{selfReportedDone:en}:{}})}}let le=[];for(let Y of o){let Re=fe(n,Y.name);Re?.hung_holder_flagged_ts&&Re.hung_holder_reason&&le.push({team:Y.name,reason:Re.hung_holder_reason,flaggedTs:Re.hung_holder_flagged_ts})}let Ee=dv(n).map(Y=>({team:Y.team,reason:Y.reason,detail:Y.detail,suspendedAt:Y.suspended_at})),He=t.blockedSelfReportUrgentThresholdMs??LZ,Ue=t.blockedSelfReportUnconfirmedThresholdMs??CZ,te=[];for(let Y of o){let Re=wt(n,Y.name);if(Re?.status==="BLOCKED"){let yt=s-Date.parse(Re.changed_ts),en=yt>=Ue;te.push({team:Y.name,changedTs:Re.changed_ts,ageMs:yt,urgent:!en&&yt>=He,unconfirmed:en})}}te.sort((Y,Re)=>Re.ageMs-Y.ageMs);let Oe=t.orphanReapCandidateWindowMs??kZ,Ct=new Date(s-Oe).toISOString(),Zn=dd(n,cy,Ct,RZ).filter(Y=>t.team===void 0||Y.team===t.team).map(Y=>({team:Y.team,ts:Y.ts,reason:Y.note??"(no reason recorded)"})),Z=t.maintainer===void 0?null:[...vt(n,t.maintainer),...xd(n,t.maintainer)].sort((Y,Re)=>Y.id-Re.id).filter(Y=>Y.from_id!=="autopilot"),xe=t.maintainer===void 0?[]:JC(n,t.maintainer,s).map(Y=>({row:Y.row,constituentCount:zo(n,Y.row)})),Zt=t.maintainer===void 0?[]:kl(n,s).map(Y=>{let Re=zo(n,Y.row),yt=Il(n,Y.row),en=Y.ageMs>=xl||Re>=2&&Y.row.sent_ts===null;return{row:Y.row,constituentCount:Re,retractedCount:yt,urgent:en}}),jt=t.maintainerStaleThresholdMs??NZ,_n=[];if(t.maintainer!==void 0&&Z!==null){let Re=fe(n,t.maintainer)?.last_cli_activity_ts??null,yt=_0(Re,s),en=!oy(Re,jt,s),ii=Z[0],er=ii?s-Date.parse(ii.created_ts):null,fo=er!==null&&er>jt;if(en||fo){let tr=[];en&&tr.push(Re===null?"no CLI activity ever recorded":`no CLI activity in ${ve(yt)}`),fo&&tr.push(`oldest queued item is ${ve(er)} old`),_n.push({team:t.maintainer,reason:tr.join("; "),ageMs:yt===null?1/0:Math.max(yt,er??0)})}}let Ot;if(t.team===void 0)Ot=a.map(Y=>Y.entity);else{Ot=[];for(let Y of e.teams.filter(K)){let Re;try{Re=re(Y)}catch{continue}let yt=Ke(n,Re,Y.leadAlias);yt!==null&&Ot.push(...yi(n,yt))}}let oi=$O(n,Ot,e.teams),ls=RO(n),Pr=xO(n,e.teams),qt=LO(n),ds=[];for(let Y of e.teams.filter(K)){try{re(Y)}catch{continue}eh(Y)===0&&ds.push({team:Y.name,repoPath:Y.repoPath})}let za=t.stuckProcessingThresholdMs??xZ,rd=t.stuckProcessingMaxAgeMs??OZ,bp=t.maintainer!==void 0&&t.stuckProcessingFleetWide!==!0?t.maintainer:void 0,mq=VC(n,{minAgeMs:za,maxAgeMs:rd,fromId:bp},s).map(Y=>({queueId:Y.row.id,fromId:Y.row.from_id,toId:Y.row.to_id,ageMs:Y.ageMs,constituentCount:zo(n,Y.row)}));return{blocked:a,blockedOnUnresolved:c,owedAnswers:l,recentlyAnsweredForSender:d,parkedTeamsWithOwedPrompts:u,awaitingDecision:m,awaitingReview:p,stalled:j,stalledVerdicts:ce,hungHolders:le,autoNudgeSuspended:Ee,blockedSelfReports:te,flaggedEpics:_,closedEpicsToReview:g,orphanReapCandidates:Zn,maintainerStale:_n,blockingRoots:oi,epicsWithoutOwner:ls,unresolvableOwnerEntities:Pr,untrackedBlockers:qt,unseededTeams:ds,stuckProcessing:mq,inbox:Z,memory:(t.readMemoryAvailabilityImpl??sc)(),operatorPrompts:xe,operatorEscalations:Zt,uncommittedWork:w,teamfileLintWarnings:E,expiredHolds:h,neverTrackFiles:b,secretBearingTeamfiles:A,trackedTeamfiles:I,unprotectedTeamfiles:R,gitIdentityMismatches:L,activeGhAccount:await(t.checkActiveGhAccountImpl??Pm)(),disabledProviders:x,providerDisableReadFailed:C,quiescedByProviderDisable:U,staleAutoScanPause:M,persistentDispatchFailures:Q,notObserved:ee,rateLimitPolicyHealth:q,rateLimitLevelWarnings:F}}function By(e){return` ${e.team}: #${e.entity.id} ("${e.entity.title}")`}function GO(e){return e.length===0?"":`
2242
2242
  later traffic worth checking before ruling on this (not proof it was answered): ${e.map(n=>`#${n.row.id} ${n.row.from_id}->${n.row.to_id} (${ke(n.row.created_ts)}, via ${n.matchedTeam})`).join("; ")}`}function Ll(e,t={}){if(t.json)return JSON.stringify(e);let n=[];if(e.operatorPrompts.length>0){let c=Date.now(),l=e.operatorPrompts.map(f=>` #${f.row.id} -- sent ${ve(c-Date.parse(f.row.created_ts))} ago, unanswered`+(f.constituentCount>1?` (${f.constituentCount} merged into this one)`:"")),d=e.operatorPrompts.reduce((f,m)=>f+m.constituentCount,0),u=d===e.operatorPrompts.length?`${e.operatorPrompts.length}`:`${d} in ${e.operatorPrompts.length} thread${e.operatorPrompts.length===1?"":"s"}`;n.push(`OPERATOR MESSAGE, UNANSWERED (${u}):
2243
2243
  ${l.join(`
2244
2244
  `)}`)}if(e.operatorEscalations.length>0){let c=Date.now(),l=m=>{let p=m.constituentCount>1?` (${m.constituentCount} merged into this one${m.retractedCount>0?`, ${m.retractedCount} retracted`:""})`:"";return` #${m.row.id} from ${m.row.from_id} -- sent ${ve(c-Date.parse(m.row.created_ts))} ago, unanswered${p}`},d=m=>{let p=m.reduce((h,_)=>h+_.constituentCount,0);return p===m.length?`${m.length}`:`${p} in ${m.length} thread${m.length===1?"":"s"}`},u=e.operatorEscalations.filter(m=>m.urgent),f=e.operatorEscalations.filter(m=>!m.urgent);u.length>0&&n.push(`ESCALATED TO OPERATOR, URGENT (${d(u)}) -- past 4h old or an undelivered pileup:
@@ -2327,17 +2327,17 @@ ${s}`;if(e.activeGhAccount===null||e.activeGhAccount.matchesPolicy)return o;let
2327
2327
 
2328
2328
  ${o}`}async function XO(e,t,n,r={}){let s={db:{path:"",db:e,close:()=>{}},teamsConfPath:"",teams:[...t]},o=await Um(s,{maintainer:n,...r.config!==void 0?{config:r.config}:{},...r.nowMs!==void 0?{nowMs:r.nowMs}:{},...r.awaitingReviewThresholdMs!==void 0?{awaitingReviewThresholdMs:r.awaitingReviewThresholdMs}:{},...r.maintainerStaleThresholdMs!==void 0?{maintainerStaleThresholdMs:r.maintainerStaleThresholdMs}:{},...r.fetchReportImpl!==void 0?{fetchReportImpl:r.fetchReportImpl}:{},...r.heavyLockImpl!==void 0?{heavyLockImpl:r.heavyLockImpl}:{},...r.findNeverTrackFilesImpl!==void 0?{findNeverTrackFilesImpl:r.findNeverTrackFilesImpl}:{},...r.findSecretBearingTeamfilesImpl!==void 0?{findSecretBearingTeamfilesImpl:r.findSecretBearingTeamfilesImpl}:{},...r.checkRepoGitIdentityImpl!==void 0?{checkRepoGitIdentityImpl:r.checkRepoGitIdentityImpl}:{},...r.checkActiveGhAccountImpl!==void 0?{checkActiveGhAccountImpl:r.checkActiveGhAccountImpl}:{},...r.resolveMemberProviderImpl!==void 0?{resolveMemberProviderImpl:r.resolveMemberProviderImpl}:{},...r.lintTeamfileWarningsImpl!==void 0?{lintTeamfileWarningsImpl:r.lintTeamfileWarningsImpl}:{}}),i=(r.readMemoryAvailabilityImpl??sc)(),a=o.blocked.length===0&&o.awaitingDecision.length===0&&o.awaitingReview.length===0&&o.stalled.length===0&&o.hungHolders.length===0&&o.flaggedEpics.length===0&&o.closedEpicsToReview.length===0&&(o.inbox===null||o.inbox.length===0)&&o.operatorPrompts.length===0&&o.operatorEscalations.length===0&&o.uncommittedWork.length===0&&o.expiredHolds.length===0&&o.neverTrackFiles.length===0&&o.secretBearingTeamfiles.length===0&&o.gitIdentityMismatches.length===0&&(o.activeGhAccount===null||o.activeGhAccount.matchesPolicy)&&!o.providerDisableReadFailed&&o.quiescedByProviderDisable.length===0&&o.blockedOnUnresolved.length===0&&o.staleAutoScanPause===null&&o.persistentDispatchFailures.every(d=>d.kind!=="continuous")&&o.parkedTeamsWithOwedPrompts.length===0&&o.rateLimitPolicyHealth===null,c=kd(i),l=c===null?Ll(o):`${Ll(o)}
2329
2329
 
2330
- ${c}`;return{attention:o,memory:i,isEmpty:a,rendered:l}}var BZ=18e5,GZ={watch:{first:!1,active:[],wentIdle:[],newlyActive:[],wake:!1,why:"nochange"},stalled:[],maintainerWoken:!1,autoContinued:[],surfacedUnknown:[],surfacedBlocked:[],surfacedDoneConsistency:[],surfacedUnresolvableTeamfiles:[],surfacedFault:[],surfacedClosedEpics:[],escalated:[],autoRedelivered:[],woken:[],firedCronJobs:[],rateLimitCollected:null,rateLimitPolicyEvaluations:[]};function VO(e){let t=e.fetchReport??Je,n=e.readHeavyLockStatusImpl??fn,r=e.heavyLockStatusPath??Ea(),s=e.heavyLockPath??ya(),o=e.maintainerWakeImpl??cO,i=e.autoContinueImpl??iO,a=e.surfaceUnknownImpl??vO,c=e.surfaceBlockedImpl??dO,l=e.surfaceDoneConsistencyImpl??gO,d=e.surfaceUnresolvableTeamfilesImpl??uO,u=e.surfaceFaultImpl??yO,f=e.surfaceClosedEpicsImpl??mO,m=e.escalateImpl??AC,p=e.autoRedeliverImpl??IC,h=e.wakeImpl??kC,_=e.evaluateCronJobsImpl??hC,g=e.miniplayerVerifyImpl??M0,w=e.hungHolderCheckImpl??b0,y=e.epicReviewImpl??O0,E=e.orphanReconcilerImpl??x0,T=e.hangProbeCollectImpl??C0,b=e.rateLimitCollectImpl??LC,A=e.rateLimitPolicyImpl??DC,I=e.assembleWakeReportImpl??XO,R=e.existsSyncImpl??qZ,L=e.statSyncImpl??WZ,N=e.config??Ie,k=e.escalation??Ry,D=e.autoRedeliver??Ny,O=e.wake??xy,v=e.intervalMs??BZ,S=null,x=!1;async function C(){if(x)return GZ;x=!0;try{let q=e.getTeams(),F=q.filter(K),M;try{M=await t(),SC(M,new Date().toISOString())}catch(Z){throw bC(Z instanceof Error?Z.message:String(Z),new Date().toISOString()),Z}let $=Date.now(),U=n(r,s,void 0,Z=>{e.onError?.(Z)}),B=yd(e.db,F,M),{stalled:W,continueEligible:se}=await YS(e.db,F,M,U,N,$);if(e.miniplayerVerify)try{await g(e.db,W,F,e.miniplayerVerify)}catch(Z){e.onError?.(Z)}let z=new Set(W);for(let Z of F)!z.has(Z.name)&&fe(e.db,Z.name)?.miniplayer_verdict_label&&av(e.db,Z.name);if(e.hungHolderCheck)try{let Z=e.maintainerWake?.sessionAlivePath!==void 0||e.maintainerWake?.activityFreshnessMs!==void 0?{sessionAliveExemptTeamName:e.maintainerWake.teamName,sessionAliveExemptPath:e.maintainerWake.sessionAlivePath,sessionAliveFreshnessMs:e.maintainerWake.sessionAliveFreshnessMs,activityFreshnessMs:e.maintainerWake.activityFreshnessMs}:{};await w(e.db,F,{...Z,...e.hungHolderCheck})}catch(Z){e.onError?.(Z)}if(e.orphanReconciler)try{let Z=e.maintainerWake?.sessionAlivePath!==void 0||e.maintainerWake?.activityFreshnessMs!==void 0?{sessionAliveExemptTeamName:e.maintainerWake.teamName,sessionAliveExemptPath:e.maintainerWake.sessionAlivePath,sessionAliveFreshnessMs:e.maintainerWake.sessionAliveFreshnessMs,activityFreshnessMs:e.maintainerWake.activityFreshnessMs}:{};await E(e.db,q,M,{...Z,...e.orphanReconciler})}catch(Z){e.onError?.(Z)}if(e.hangProbeCollect)try{T(e.db,e.hangProbeCollect)}catch(Z){e.onError?.(Z)}if(e.autoNudgeRedirectReview)try{let Z=e.findDueAutoNudgeReviewsImpl??m0,xe=new Map(F.map(qt=>[qt.name,qt.repoPath])),Zt=new Map(F.map(qt=>[qt.name,qt])),jt=await Z(e.db,xe,$),_n=e.buildReviewMessageImpl??h0,Ot=e.resetShiftImpl??p0,oi=e.enqueueImpl??Ne,ls=e.checkProviderDisabledImpl??Kt,Mr=e.resolveMemberProviderImpl??ir;for(let qt of jt)try{let ds=xe.get(qt.team);if(ds===void 0)continue;let za=Zt.get(qt.team),rd=za===void 0?null:Mr(za,za.leadAlias);if(rd!==null&&ls(e.db,rd,$).disabled)continue;let bp=await _n(qt,ds);oi(e.db,q,qt.team,bp,{from:"autopilot"}),await Ot(e.db,qt.team,ds,new Date($).toISOString())}catch(ds){e.onError?.(ds)}}catch(Z){e.onError?.(Z)}if(e.epicReview)try{await y(e.db,q,e.epicReview)}catch(Z){e.onError?.(Z)}let ue=!1;if(e.maintainerWake)try{let Z={cooldownMs:N.cooldownMs,...e.maintainerWake};if(Z.sessionAlivePath!==void 0){let xe=fa(Z.sessionAlivePath,Z.sessionAliveFreshnessMs,Z.activityFreshnessMs!==void 0?fe(e.db,Z.teamName)?.last_cli_activity_ts??null:null,Z.activityFreshnessMs,{existsSyncImpl:R,statSyncImpl:L,nowMs:$}),Zt,jt;try{let Ot=await I(e.db,q,Z.teamName,{nowMs:$,config:N,fetchReportImpl:async()=>M,heavyLockImpl:()=>U,...Z.maintainerStaleThresholdMs!==void 0?{maintainerStaleThresholdMs:Z.maintainerStaleThresholdMs}:{}});Zt=Ot.rendered,jt=Ot.isEmpty}catch(Ot){e.onError?.(Ot),Zt="wake-report assembly failed this tick -- waking conservatively; check server logs for the error.",jt=!1}let _n=Ot=>`${HZ(Ot,"utf8")}
2330
+ ${c}`;return{attention:o,memory:i,isEmpty:a,rendered:l}}var BZ=18e5,GZ={watch:{first:!1,active:[],wentIdle:[],newlyActive:[],wake:!1,why:"nochange"},stalled:[],maintainerWoken:!1,autoContinued:[],surfacedUnknown:[],surfacedBlocked:[],surfacedDoneConsistency:[],surfacedUnresolvableTeamfiles:[],surfacedFault:[],surfacedClosedEpics:[],escalated:[],autoRedelivered:[],woken:[],firedCronJobs:[],rateLimitCollected:null,rateLimitPolicyEvaluations:[]};function VO(e){let t=e.fetchReport??Je,n=e.readHeavyLockStatusImpl??fn,r=e.heavyLockStatusPath??Ea(),s=e.heavyLockPath??ya(),o=e.maintainerWakeImpl??cO,i=e.autoContinueImpl??iO,a=e.surfaceUnknownImpl??vO,c=e.surfaceBlockedImpl??dO,l=e.surfaceDoneConsistencyImpl??gO,d=e.surfaceUnresolvableTeamfilesImpl??uO,u=e.surfaceFaultImpl??yO,f=e.surfaceClosedEpicsImpl??mO,m=e.escalateImpl??AC,p=e.autoRedeliverImpl??IC,h=e.wakeImpl??kC,_=e.evaluateCronJobsImpl??hC,g=e.miniplayerVerifyImpl??M0,w=e.hungHolderCheckImpl??b0,y=e.epicReviewImpl??O0,E=e.orphanReconcilerImpl??x0,T=e.hangProbeCollectImpl??C0,b=e.rateLimitCollectImpl??LC,A=e.rateLimitPolicyImpl??DC,I=e.assembleWakeReportImpl??XO,R=e.existsSyncImpl??qZ,L=e.statSyncImpl??WZ,N=e.config??Ie,k=e.escalation??Ry,D=e.autoRedeliver??Ny,O=e.wake??xy,v=e.intervalMs??BZ,S=null,x=!1;async function C(){if(x)return GZ;x=!0;try{let q=e.getTeams(),F=q.filter(K),M;try{M=await t(),SC(M,new Date().toISOString())}catch(Z){throw bC(Z instanceof Error?Z.message:String(Z),new Date().toISOString()),Z}let $=Date.now(),U=n(r,s,void 0,Z=>{e.onError?.(Z)}),B=yd(e.db,F,M),{stalled:W,continueEligible:se}=await YS(e.db,F,M,U,N,$);if(e.miniplayerVerify)try{await g(e.db,W,F,e.miniplayerVerify)}catch(Z){e.onError?.(Z)}let z=new Set(W);for(let Z of F)!z.has(Z.name)&&fe(e.db,Z.name)?.miniplayer_verdict_label&&av(e.db,Z.name);if(e.hungHolderCheck)try{let Z=e.maintainerWake?.sessionAlivePath!==void 0||e.maintainerWake?.activityFreshnessMs!==void 0?{sessionAliveExemptTeamName:e.maintainerWake.teamName,sessionAliveExemptPath:e.maintainerWake.sessionAlivePath,sessionAliveFreshnessMs:e.maintainerWake.sessionAliveFreshnessMs,activityFreshnessMs:e.maintainerWake.activityFreshnessMs}:{};await w(e.db,F,{...Z,...e.hungHolderCheck})}catch(Z){e.onError?.(Z)}if(e.orphanReconciler)try{let Z=e.maintainerWake?.sessionAlivePath!==void 0||e.maintainerWake?.activityFreshnessMs!==void 0?{sessionAliveExemptTeamName:e.maintainerWake.teamName,sessionAliveExemptPath:e.maintainerWake.sessionAlivePath,sessionAliveFreshnessMs:e.maintainerWake.sessionAliveFreshnessMs,activityFreshnessMs:e.maintainerWake.activityFreshnessMs}:{};await E(e.db,q,M,{...Z,...e.orphanReconciler})}catch(Z){e.onError?.(Z)}if(e.hangProbeCollect)try{T(e.db,e.hangProbeCollect)}catch(Z){e.onError?.(Z)}if(e.autoNudgeRedirectReview)try{let Z=e.findDueAutoNudgeReviewsImpl??m0,xe=new Map(F.map(qt=>[qt.name,qt.repoPath])),Zt=new Map(F.map(qt=>[qt.name,qt])),jt=await Z(e.db,xe,$),_n=e.buildReviewMessageImpl??h0,Ot=e.resetShiftImpl??p0,oi=e.enqueueImpl??Ne,ls=e.checkProviderDisabledImpl??Kt,Pr=e.resolveMemberProviderImpl??ir;for(let qt of jt)try{let ds=xe.get(qt.team);if(ds===void 0)continue;let za=Zt.get(qt.team),rd=za===void 0?null:Pr(za,za.leadAlias);if(rd!==null&&ls(e.db,rd,$).disabled)continue;let bp=await _n(qt,ds);oi(e.db,q,qt.team,bp,{from:"autopilot"}),await Ot(e.db,qt.team,ds,new Date($).toISOString())}catch(ds){e.onError?.(ds)}}catch(Z){e.onError?.(Z)}if(e.epicReview)try{await y(e.db,q,e.epicReview)}catch(Z){e.onError?.(Z)}let ue=!1;if(e.maintainerWake)try{let Z={cooldownMs:N.cooldownMs,...e.maintainerWake};if(Z.sessionAlivePath!==void 0){let xe=fa(Z.sessionAlivePath,Z.sessionAliveFreshnessMs,Z.activityFreshnessMs!==void 0?fe(e.db,Z.teamName)?.last_cli_activity_ts??null:null,Z.activityFreshnessMs,{existsSyncImpl:R,statSyncImpl:L,nowMs:$}),Zt,jt;try{let Ot=await I(e.db,q,Z.teamName,{nowMs:$,config:N,fetchReportImpl:async()=>M,heavyLockImpl:()=>U,...Z.maintainerStaleThresholdMs!==void 0?{maintainerStaleThresholdMs:Z.maintainerStaleThresholdMs}:{}});Zt=Ot.rendered,jt=Ot.isEmpty}catch(Ot){e.onError?.(Ot),Zt="wake-report assembly failed this tick -- waking conservatively; check server logs for the error.",jt=!1}let _n=Ot=>`${HZ(Ot,"utf8")}
2331
2331
 
2332
2332
  ---
2333
- ${Zt}`;ue=o(e.db,F,M,Z,_n,$,xe?void 0:!jt)}else ue=o(e.db,F,M,Z,void 0,$)}catch(Z){e.onError?.(Z)}let J=[];if(e.autoContinue&&Ks(e.db)===null)try{J=await i(e.db,F,M,{config:N,...e.autoContinue,nowMs:$,stalledTeamNames:se,heavyLockStatusPath:r,heavyLockPath:s,readHeavyLockStatusImpl:n})}catch(Z){e.onError?.(Z)}let V=[];if(e.maintainerWake)try{V=await a(e.db,W,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let j=[];if(e.maintainerWake)try{j=await c(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let X=[];if(e.maintainerWake)try{X=await l(e.db,F,e.maintainerWake.teamName,q,N)}catch(Z){e.onError?.(Z)}let Q=[];if(e.maintainerWake)try{Q=await u(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let ee=[];if(e.maintainerWake)try{ee=await f(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let ce=[];if(e.maintainerWake)try{ce=await d(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let le=[];try{le=await _(e.db,q,$,{onJobError:(Z,xe)=>e.onError?.(xe)})}catch(Z){e.onError?.(Z)}let Ee=[];try{Ee=await m(e.db,F,k,$)}catch(Z){e.onError?.(Z)}let He=[];try{He=p(e.db,F,D,$)}catch(Z){e.onError?.(Z)}let Ue=[];try{Ue=h(e.db,F,M,O,$)}catch(Z){e.onError?.(Z)}let te=null,Oe=[],Ct=e.rateLimitPolicy??e.rateLimitAutomation,bt=e.rateLimitCollect??Ct;if(bt!==void 0){let Z=Date.now();try{te=await b(e.db,{nowMs:Z,...bt})}catch(xe){e.onError?.(xe)}try{Oe=A(e.db,{nowMs:Z,...Ct,dryRun:Ct===void 0})}catch(xe){e.onError?.(xe)}}let Zn={watch:B,stalled:W,maintainerWoken:ue,autoContinued:J,surfacedUnknown:V,surfacedBlocked:j,surfacedDoneConsistency:X,surfacedUnresolvableTeamfiles:ce,surfacedFault:Q,surfacedClosedEpics:ee,escalated:Ee,autoRedelivered:He,woken:Ue,firedCronJobs:le,rateLimitCollected:te,rateLimitPolicyEvaluations:Oe};return e.onTick?.(Zn),Zn}catch(q){throw e.onError?.(q),q}finally{x=!1}}return{start(){S||(S=setInterval(()=>{C().catch(()=>{})},v),S.unref())},stop(){S&&(clearInterval(S),S=null)},runTickNow:C,isRunning:()=>S!==null,isTicking:()=>x}}import{closeSync as XZ,linkSync as VZ,openSync as JZ,readdirSync as YZ,readFileSync as jm,readlinkSync as KZ,realpathSync as zZ,renameSync as JO,unlinkSync as Vy,writeSync as QZ}from"node:fs";import{dirname as ZZ,join as eee}from"node:path";var Ta=class extends Error{holder;lockPath;constructor(t,n){super(`site lock held by "${t.ownerLabel}" (pid ${t.pid}, started ${t.startedAt}) at ${n} -- only one process (standalone \`lmauto serve\` or \`lmt site start\`) may run lmauto's scheduler against this DB at a time`),this.holder=t,this.lockPath=n,this.name="SiteLockHeldError"}};function Cl(e){return e===":memory:"?null:`${e}.lock`}function QO(e){let t=Ol(e);return t.kind==="held"?t.identity:null}function YO(e){let t;try{t=jm(e,"utf8")}catch(s){return s.code==="ENOENT"?{kind:"free"}:{kind:"unknown"}}let n=Yp(t);if(!n)return{kind:"unknown"};let r={...n,bootId:n.bootId??null};return Xy(r)?{kind:"held",identity:r}:{kind:"free"}}function tee(e,t){let n;try{n=zZ(t)}catch{return!1}let r;try{r=YZ(`/proc/${e}/fd`)}catch{return!1}for(let s of r)try{if(KZ(`/proc/${e}/fd/${s}`)===n)return!0}catch{}return!1}function Ol(e){let t=Cl(e);if(t===null)return{kind:"free"};let n=YO(t);if(n.kind==="held")return n;let r=eee(ZZ(e),"site.lock");if(r===t)return n;let s=YO(r);return s.kind==="held"&&tee(s.identity.pid,e)?s:n}function Fm(e){try{let t=Yp(jm(e,"utf8"));return t?{...t,bootId:t.bootId??null}:null}catch{return null}}function ZO(){try{let e=jm("/proc/sys/kernel/random/boot_id","utf8").trim();return Kp(e)?e:null}catch{return null}}function eD(e){try{let t=jm(`/proc/${e}/stat`,"utf8"),s=t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[19];if(s===void 0)return null;let o=Number(s);return Number.isFinite(o)?o:null}catch{return null}}function Xy(e){let t;try{process.kill(e.pid,0),t=!0}catch(r){t=r.code==="EPERM"}if(!t)return!1;if(e.bootId!==null){let r=ZO();if(r!==null&&r!==e.bootId)return!1}if(e.pidStartTicks===null)return!0;let n=eD(e.pid);return n===null?!0:n===e.pidStartTicks}function KO(e,t){let n=`${e}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`,r=JZ(n,"wx");try{QZ(r,JSON.stringify(t))}finally{XZ(r)}try{return VZ(n,e),!0}catch(s){if(s.code!=="EEXIST")throw s;return!1}finally{Vy(n)}}function qm(e,t){let n={pid:process.pid,ownerLabel:t,startedAt:new Date().toISOString(),pidStartTicks:eD(process.pid),bootId:ZO()};if(KO(e,n))return zO(e,n);let r=Fm(e);if(r!==null&&Xy(r))throw new Ta(r,e);let s=`${e}.reclaim.${process.pid}.${Math.random().toString(36).slice(2)}`,o=!1;try{JO(e,s);let a=Fm(s);r===null&&a===null||r!==null&&a!==null&&a.pid===r.pid&&a.startedAt===r.startedAt?(Vy(s),o=!0):JO(s,e)}catch{}if(o&&KO(e,n))return zO(e,n);let i=Fm(e);throw i!==null&&Xy(i)?new Ta(i,e):new Error(`failed to acquire site lock at ${e} (lost a reclaim race)`)}function zO(e,t){let n=!1;return{release(){if(!n){n=!0;try{let r=Fm(e);r!==null&&r.pid===t.pid&&r.startedAt===t.startedAt&&Vy(e)}catch{}}}}}import{closeSync as Jy,existsSync as nee,fstatSync as ree,mkdirSync as see,openSync as tD,readFileSync as nD,renameSync as oee,unlinkSync as iee,writeSync as aee}from"node:fs";import{dirname as rD,join as cee}from"node:path";import{createHash as lee,randomBytes as dee}from"node:crypto";var uee=32;function va(e){return e===":memory:"?null:cee(rD(e),"localweb-passcode")}function fee(){return dee(uee).toString("base64url")}function Yy(e,t){let n=rD(e);nee(n)||see(n,{recursive:!0});let r=`${e}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`,s;try{s=tD(r,"wx",384);let o=Buffer.from(t,"utf8"),i=0;for(;i<o.length;){let a=aee(s,o,i,o.length-i);if(a<=0)throw new Error("passcode file write made no progress");i+=a}Jy(s),s=void 0,oee(r,e)}catch(o){if(s!==void 0)try{Jy(s)}catch{}try{iee(r)}catch{}throw o}}function sD(e){let t;try{t=tD(e,"r")}catch(n){if(n.code==="ENOENT")return null;throw n}try{let n=ree(t,{bigint:!0}),r=nD(t,"utf8"),s=lee("sha256").update(`${n.dev}:${n.ino}:${n.ctimeNs}:${n.mtimeNs}:${n.size}:`).update(r,"utf8").digest("base64url");return{passcode:r,generation:s}}finally{Jy(t)}}function oD(e){try{return nD(e,"utf8")}catch(t){if(t.code==="ENOENT")return null;throw t}}function Hm(e){let t=fee();return Yy(e,t),t}import{randomUUID as mee}from"node:crypto";function Ky(e){return`remote:${e.from.team?`${e.from.site}:${e.from.team}:${e.from.alias}`:`${e.from.site}:${e.from.alias}`}`}function iD(e,t,n){let r=t.find(s=>s.name===n.to.team);if(!r)throw new Error(`no local team registered for remote envelope's to.team "${n.to.team}"`);if(!K(r))throw new Error(`remote envelope addressed to "${n.to.team}", which is itself a remote (channel=lmmail) team -- not locally dispatchable`);Ne(e,t,r.name,n.payload,{from:Ky(n),dedupeKey:n.msgId})}var pee=new Set(["dispatched","queued","failed"]);function hee(e){let t;try{t=JSON.parse(e)}catch{return!1}if(typeof t!="object"||t===null||Array.isArray(t))return!1;let n=t.state;return typeof n=="string"&&pee.has(n)}var _ee="reply-surfaced:";function gee(e,t,n,r){let s=n.inReplyTo;if(!s)throw new Error("recordReplyOrAck: envelope has no in_reply_to");let o=gS(e,s);if(!o)return"orphan";if(hee(n.payload))return ES(e,s,r),"acked";yS(e,s,r);let i=t.find(a=>K(a)&&a.name===o.from_alias);if(i)try{Ne(e,t,i.name,n.payload,{from:Ky(n),dedupeKey:`${_ee}${n.msgId}`})}catch(a){process.stderr.write(`[mail] failed to surface reply to ${i.name}'s inbox (in_reply_to ${s}): ${a instanceof Error?a.message:String(a)}
2333
+ ${Zt}`;ue=o(e.db,F,M,Z,_n,$,xe?void 0:!jt)}else ue=o(e.db,F,M,Z,void 0,$)}catch(Z){e.onError?.(Z)}let J=[];if(e.autoContinue&&Ks(e.db)===null)try{J=await i(e.db,F,M,{config:N,...e.autoContinue,nowMs:$,stalledTeamNames:se,heavyLockStatusPath:r,heavyLockPath:s,readHeavyLockStatusImpl:n})}catch(Z){e.onError?.(Z)}let V=[];if(e.maintainerWake)try{V=await a(e.db,W,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let j=[];if(e.maintainerWake)try{j=await c(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let X=[];if(e.maintainerWake)try{X=await l(e.db,F,e.maintainerWake.teamName,q,N)}catch(Z){e.onError?.(Z)}let Q=[];if(e.maintainerWake)try{Q=await u(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let ee=[];if(e.maintainerWake)try{ee=await f(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let ce=[];if(e.maintainerWake)try{ce=await d(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let le=[];try{le=await _(e.db,q,$,{onJobError:(Z,xe)=>e.onError?.(xe)})}catch(Z){e.onError?.(Z)}let Ee=[];try{Ee=await m(e.db,F,k,$)}catch(Z){e.onError?.(Z)}let He=[];try{He=p(e.db,F,D,$)}catch(Z){e.onError?.(Z)}let Ue=[];try{Ue=h(e.db,F,M,O,$)}catch(Z){e.onError?.(Z)}let te=null,Oe=[],Ct=e.rateLimitPolicy??e.rateLimitAutomation,At=e.rateLimitCollect??Ct;if(At!==void 0){let Z=Date.now();try{te=await b(e.db,{nowMs:Z,...At})}catch(xe){e.onError?.(xe)}try{Oe=A(e.db,{nowMs:Z,...Ct,dryRun:Ct===void 0})}catch(xe){e.onError?.(xe)}}let Zn={watch:B,stalled:W,maintainerWoken:ue,autoContinued:J,surfacedUnknown:V,surfacedBlocked:j,surfacedDoneConsistency:X,surfacedUnresolvableTeamfiles:ce,surfacedFault:Q,surfacedClosedEpics:ee,escalated:Ee,autoRedelivered:He,woken:Ue,firedCronJobs:le,rateLimitCollected:te,rateLimitPolicyEvaluations:Oe};return e.onTick?.(Zn),Zn}catch(q){throw e.onError?.(q),q}finally{x=!1}}return{start(){S||(S=setInterval(()=>{C().catch(()=>{})},v),S.unref())},stop(){S&&(clearInterval(S),S=null)},runTickNow:C,isRunning:()=>S!==null,isTicking:()=>x}}import{closeSync as XZ,linkSync as VZ,openSync as JZ,readdirSync as YZ,readFileSync as jm,readlinkSync as KZ,realpathSync as zZ,renameSync as JO,unlinkSync as Vy,writeSync as QZ}from"node:fs";import{dirname as ZZ,join as eee}from"node:path";var Ta=class extends Error{holder;lockPath;constructor(t,n){super(`site lock held by "${t.ownerLabel}" (pid ${t.pid}, started ${t.startedAt}) at ${n} -- only one process (standalone \`lmauto serve\` or \`lmt site start\`) may run lmauto's scheduler against this DB at a time`),this.holder=t,this.lockPath=n,this.name="SiteLockHeldError"}};function Cl(e){return e===":memory:"?null:`${e}.lock`}function QO(e){let t=Ol(e);return t.kind==="held"?t.identity:null}function YO(e){let t;try{t=jm(e,"utf8")}catch(s){return s.code==="ENOENT"?{kind:"free"}:{kind:"unknown"}}let n=Yp(t);if(!n)return{kind:"unknown"};let r={...n,bootId:n.bootId??null};return Xy(r)?{kind:"held",identity:r}:{kind:"free"}}function tee(e,t){let n;try{n=zZ(t)}catch{return!1}let r;try{r=YZ(`/proc/${e}/fd`)}catch{return!1}for(let s of r)try{if(KZ(`/proc/${e}/fd/${s}`)===n)return!0}catch{}return!1}function Ol(e){let t=Cl(e);if(t===null)return{kind:"free"};let n=YO(t);if(n.kind==="held")return n;let r=eee(ZZ(e),"site.lock");if(r===t)return n;let s=YO(r);return s.kind==="held"&&tee(s.identity.pid,e)?s:n}function Fm(e){try{let t=Yp(jm(e,"utf8"));return t?{...t,bootId:t.bootId??null}:null}catch{return null}}function ZO(){try{let e=jm("/proc/sys/kernel/random/boot_id","utf8").trim();return Kp(e)?e:null}catch{return null}}function eD(e){try{let t=jm(`/proc/${e}/stat`,"utf8"),s=t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[19];if(s===void 0)return null;let o=Number(s);return Number.isFinite(o)?o:null}catch{return null}}function Xy(e){let t;try{process.kill(e.pid,0),t=!0}catch(r){t=r.code==="EPERM"}if(!t)return!1;if(e.bootId!==null){let r=ZO();if(r!==null&&r!==e.bootId)return!1}if(e.pidStartTicks===null)return!0;let n=eD(e.pid);return n===null?!0:n===e.pidStartTicks}function KO(e,t){let n=`${e}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`,r=JZ(n,"wx");try{QZ(r,JSON.stringify(t))}finally{XZ(r)}try{return VZ(n,e),!0}catch(s){if(s.code!=="EEXIST")throw s;return!1}finally{Vy(n)}}function qm(e,t){let n={pid:process.pid,ownerLabel:t,startedAt:new Date().toISOString(),pidStartTicks:eD(process.pid),bootId:ZO()};if(KO(e,n))return zO(e,n);let r=Fm(e);if(r!==null&&Xy(r))throw new Ta(r,e);let s=`${e}.reclaim.${process.pid}.${Math.random().toString(36).slice(2)}`,o=!1;try{JO(e,s);let a=Fm(s);r===null&&a===null||r!==null&&a!==null&&a.pid===r.pid&&a.startedAt===r.startedAt?(Vy(s),o=!0):JO(s,e)}catch{}if(o&&KO(e,n))return zO(e,n);let i=Fm(e);throw i!==null&&Xy(i)?new Ta(i,e):new Error(`failed to acquire site lock at ${e} (lost a reclaim race)`)}function zO(e,t){let n=!1;return{release(){if(!n){n=!0;try{let r=Fm(e);r!==null&&r.pid===t.pid&&r.startedAt===t.startedAt&&Vy(e)}catch{}}}}}import{closeSync as Jy,existsSync as nee,fstatSync as ree,mkdirSync as see,openSync as tD,readFileSync as nD,renameSync as oee,unlinkSync as iee,writeSync as aee}from"node:fs";import{dirname as rD,join as cee}from"node:path";import{createHash as lee,randomBytes as dee}from"node:crypto";var uee=32;function va(e){return e===":memory:"?null:cee(rD(e),"localweb-passcode")}function fee(){return dee(uee).toString("base64url")}function Yy(e,t){let n=rD(e);nee(n)||see(n,{recursive:!0});let r=`${e}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`,s;try{s=tD(r,"wx",384);let o=Buffer.from(t,"utf8"),i=0;for(;i<o.length;){let a=aee(s,o,i,o.length-i);if(a<=0)throw new Error("passcode file write made no progress");i+=a}Jy(s),s=void 0,oee(r,e)}catch(o){if(s!==void 0)try{Jy(s)}catch{}try{iee(r)}catch{}throw o}}function sD(e){let t;try{t=tD(e,"r")}catch(n){if(n.code==="ENOENT")return null;throw n}try{let n=ree(t,{bigint:!0}),r=nD(t,"utf8"),s=lee("sha256").update(`${n.dev}:${n.ino}:${n.ctimeNs}:${n.mtimeNs}:${n.size}:`).update(r,"utf8").digest("base64url");return{passcode:r,generation:s}}finally{Jy(t)}}function oD(e){try{return nD(e,"utf8")}catch(t){if(t.code==="ENOENT")return null;throw t}}function Hm(e){let t=fee();return Yy(e,t),t}import{randomUUID as mee}from"node:crypto";function Ky(e){return`remote:${e.from.team?`${e.from.site}:${e.from.team}:${e.from.alias}`:`${e.from.site}:${e.from.alias}`}`}function iD(e,t,n){let r=t.find(s=>s.name===n.to.team);if(!r)throw new Error(`no local team registered for remote envelope's to.team "${n.to.team}"`);if(!K(r))throw new Error(`remote envelope addressed to "${n.to.team}", which is itself a remote (channel=lmmail) team -- not locally dispatchable`);Ne(e,t,r.name,n.payload,{from:Ky(n),dedupeKey:n.msgId})}var pee=new Set(["dispatched","queued","failed"]);function hee(e){let t;try{t=JSON.parse(e)}catch{return!1}if(typeof t!="object"||t===null||Array.isArray(t))return!1;let n=t.state;return typeof n=="string"&&pee.has(n)}var _ee="reply-surfaced:";function gee(e,t,n,r){let s=n.inReplyTo;if(!s)throw new Error("recordReplyOrAck: envelope has no in_reply_to");let o=gS(e,s);if(!o)return"orphan";if(hee(n.payload))return ES(e,s,r),"acked";yS(e,s,r);let i=t.find(a=>K(a)&&a.name===o.from_alias);if(i)try{Ne(e,t,i.name,n.payload,{from:Ky(n),dedupeKey:`${_ee}${n.msgId}`})}catch(a){process.stderr.write(`[mail] failed to surface reply to ${i.name}'s inbox (in_reply_to ${s}): ${a instanceof Error?a.message:String(a)}
2334
2334
  `)}return"replied"}function Eee(e,t,n,r,s){let o=e.now??(()=>new Date().toISOString()),i={v:1,msgId:mee(),to:t,from:{site:e.localSiteId,team:"",alias:"lmauto"},sentAt:o(),payload:JSON.stringify({state:r,...s?{note:s}:{}}),inReplyTo:n},a=Eo(t.site),c=new TextEncoder().encode(rc(i));e.client.sendMessage({mailbox:a,subject:`lmauto ack ${i.msgId}`,body:{name:"body.txt",contentType:"text/plain; charset=utf-8",bytes:c}}).catch(l=>{process.stderr.write(`[mail] failed to send ack to mailbox ${a} (in_reply_to ${n}): ${l instanceof Error?l.message:String(l)}
2335
2335
  `)})}function aD(e,t,n,r){if(n.inReplyTo){gee(e,t,n,(r.now??(()=>new Date().toISOString()))());return}let s;try{iD(e,t,n)}catch(i){s=i}let o=r.now??(()=>new Date().toISOString());if(pS(e,n.msgId,o())){let i=s?(s instanceof Error?s.message:String(s)).slice(0,500):void 0;Eee(r,n.from,n.msgId,s?"failed":"dispatched",i)}if(s)throw s}var uD=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,yee=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,wee="text/plain; charset=utf-8",zy="exec",fD="exec-result";var Tee="exec-result";var vee=`
2336
2336
  ... [lmexec output truncated; middle elided, see attachment] ...
2337
2337
  `;function mD(e){return Qy(gD(e))}function pD(e){return hD(gD(e))}function Qy(e){let t=ED(e),n=yD(t.type,"type",zy),r=wD(t.id,"id"),s=ew(t.command,"command"),o=kee(t.timeout_s,"timeout_s"),i=Iee(t.reply_to,"reply_to"),a=bee(t.from,"from");return{v:1,type:n,id:r,command:s,timeout_s:o,reply_to:i,...a===void 0?{}:{from:a}}}function hD(e){let t=ED(e),n=See(t.v),r=yD(t.type,"type",fD),s=wD(t.id,"id"),o=Nee(t.exit_code,"exit_code"),i=lD(t.stdout,"stdout"),a=lD(t.stderr,"stderr"),c=Ree(t.duration_ms,"duration_ms"),l=dD(t.timed_out,"timed_out"),d=dD(t.truncated,"truncated");if(l&&o!==null)throw new Error("invalid exec result: exit_code must be null when timed_out is true");if(!l&&o===null)throw new Error("invalid exec result: exit_code must be a number when timed_out is false");let u={type:r,id:s,exit_code:o,stdout:i,stderr:a,duration_ms:c,timed_out:l,truncated:d};if(n===1)return{v:n,...u};let f=Aee(t.sender_trust),m=ew(t.sender,"sender");return{v:n,...u,sender_trust:f,sender:m}}function Zy(e){if(!uD.test(e))throw new Error(`invalid exec id: ${e}`);return`${Tee} ${e}`}function cD(e,t,n){let r=Buffer.isBuffer(t)?t:Buffer.from(t,"utf8"),s=n?.capBytes??49152,o=n?.marker??vee;if(!Number.isInteger(s)||s<1)throw new Error("inline cap must be a positive integer");if(r.byteLength<=s)return{inline:r.toString("utf8"),truncated:!1};let i=Buffer.byteLength(o,"utf8");if(i>=s)throw new Error("elision marker must be smaller than the inline cap");let a=r.toString("utf8"),c=s-i,l=Math.ceil(c/2),d=Math.floor(c/2);return{inline:`${xee(a,l)}${o}${Lee(a,d)}`,truncated:!0,attachment:{name:e==="stdout"?"stdout.txt":"stderr.txt",content_type:wee,data:r}}}function _D(e,t){let n=cD("stdout",e.stdout,t),r=cD("stderr",e.stderr,t),s=hD({v:2,type:fD,id:e.id,exit_code:e.exit_code,stdout:n.inline,stderr:r.inline,duration_ms:e.duration_ms,timed_out:e.timed_out,truncated:n.truncated||r.truncated,sender_trust:e.sender_trust,sender:e.sender});return{subject:Zy(e.id),envelope:s,attachments:[n.attachment,r.attachment].filter(o=>o!==void 0)}}function gD(e){try{return JSON.parse(e)}catch(t){throw new Error(`invalid JSON: ${Cee(t)}`)}}function ED(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("expected object");return e}function yD(e,t,n){if(e!==n)throw new Error(`invalid ${t}: expected ${n}`);return n}function See(e){if(e===void 0||e===1)return 1;if(e===2)return 2;throw new Error("invalid v: expected 1 or 2")}function wD(e,t){if(typeof e!="string"||!uD.test(e))throw new Error(`invalid ${t}: expected UUID v4`);return e}function ew(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`invalid ${t}: expected non-empty string`);return e}function bee(e,t){if(e!==void 0)return ew(e,t)}function Aee(e){if(e==="admin"||e==="registered"||e==="anonymous")return e;throw new Error("invalid sender_trust: expected admin, registered, or anonymous")}function Iee(e,t){if(typeof e!="string"||e.includes("/")||e.includes("\\")||e.includes("..")||e.endsWith(".")||/[\u0000-\u001f\u007f]/.test(e)||!yee.test(e))throw new Error(`invalid ${t}: expected mailbox name`);return e}function lD(e,t){if(typeof e!="string")throw new Error(`invalid ${t}: expected string`);return e}function kee(e,t){if(typeof e!="number"||!Number.isSafeInteger(e)||e<1)throw new Error(`invalid ${t}: expected positive integer`);return e}function Ree(e,t){if(typeof e!="number"||!Number.isSafeInteger(e)||e<0)throw new Error(`invalid ${t}: expected non-negative integer`);return e}function Nee(e,t){if(e===null)return null;if(typeof e!="number"||!Number.isSafeInteger(e)||e<0)throw new Error(`invalid ${t}: expected non-negative integer or null`);return e}function dD(e,t){if(typeof e!="boolean")throw new Error(`invalid ${t}: expected boolean`);return e}function xee(e,t){if(t<=0||e.length===0)return"";let n=0,r="";for(let s of e){let o=Buffer.byteLength(s,"utf8");if(n+o>t)break;r+=s,n+=o}return r}function Lee(e,t){if(t<=0||e.length===0)return"";let n=0,r=[],s=Array.from(e);for(let o=s.length-1;o>=0;o-=1){let i=s[o],a=Buffer.byteLength(i,"utf8");if(n+a>t)break;r.push(i),n+=a}return r.reverse().join("")}function Cee(e){return e instanceof Error&&e.message?e.message:String(e)}var Oee=/[;&|`$<>(){}\\]/,TD=/[\x00-\x1f\x7f]/;function SD(e){let t=[],n=0,r=e.length;for(;n<r;){for(;n<r&&e[n]===" ";)n+=1;if(n>=r)break;let s;if(e[n]==='"'||e[n]==="'"){let o=e[n];n+=1,s="";let i=n;for(;;){for(;n<r&&e[n]!==o;){if(TD.test(e[n])||o==="'"&&e[n]==="\\")return null;n+=1}if(n>=r)return null;if(s+=e.slice(i,n),o==="'"&&e[n+1]==="\\"&&e[n+2]==="'"&&e[n+3]==="'"){s+="'",n+=4,i=n;continue}n+=1;break}if(n<r&&e[n]!==" ")return null}else{let o=n;for(;n<r&&e[n]!==" ";){if(TD.test(e[n])||Oee.test(e[n]))return null;n+=1}if(s=e.slice(o,n),s.includes('"')||s.includes("'"))return null}t.push(s)}return t.length>0?t:null}function tw(e){if(!e.includes("--json"))return"requires --json when run via exec (plain-text output has no machine-readable contract)"}function Dee(e){return e.includes("--watch")?"tail --watch is a long-running stream, not a fit for a single bounded exec call":e.includes("--lines")?tw(e):"tail requires --lines N when run via exec (unbounded --max-bytes/no-limit output is not allowed)"}var $ee=[{prefix:["lmbee","status"]},{prefix:["lmbee","teams"]},{prefix:["lmbee","queue","list"]},{prefix:["lmbee","queue","get"]},{prefix:["lmbee","queue","inbox"]},{prefix:["lmbee","history"]},{prefix:["lmbee","state","list"]},{prefix:["lmbee","state","get"]},{prefix:["lmbee","state","active"]},{prefix:["lmbee","source","list"]},{prefix:["lmctl","health"],validate:tw},{prefix:["lmctl","running"],validate:tw},{prefix:["lmctl","tail"],validate:Dee}],Mee=[{prefix:["lmbee","enqueue"]},{prefix:["lmbee","send"]},{prefix:["lmbee","nudge"]},{prefix:["lmbee","state","set"]},{prefix:["lmbee","queue","deliver"]},{prefix:["lmbee","queue","retrieve"]},{prefix:["lmbee","queue","gc"]},{prefix:["lmbee","source","add"]},{prefix:["lmbee","source","remove"]}];function Pee(e,t){return e.length<t.prefix.length?!1:t.prefix.every((n,r)=>e[r]===n)}function vD(e,t){return t.find(n=>Pee(e,n))}function bD(e,t){let n=vD(e,$ee);if(n){let s=n.validate?.(e);return s?{allowed:!1,code:"command_not_allowed",message:s}:{allowed:!0}}let r=vD(e,Mee);if(r){let s=r.validate?.(e);return s?{allowed:!1,code:"command_not_allowed",message:s}:t!=="admin"?{allowed:!1,code:"insufficient_trust",message:`write command requires the operator (admin) trust tier; sender is ${t}`}:{allowed:!0}}return{allowed:!1,code:"command_not_allowed",message:`command is not exec-able from the web: ${e.join(" ")}`}}import{spawn as AD}from"node:child_process";var Uee=5e3,Fee="/bin/sh";function ID(e){if(!Number.isInteger(e.timeoutMs)||e.timeoutMs<1)throw new Error("timeoutMs must be a positive integer");let t=e.killGraceMs??Uee;if(!Number.isInteger(t)||t<0)throw new Error("killGraceMs must be a non-negative integer");return{killGraceMs:t,now:e.now??Date.now}}function kD(e,t,n,r){return new Promise((s,o)=>{let i=r(),a=[],c=[],l=!1,d=!1,u,f,m=h=>{d||(d=!0,u&&clearTimeout(u),f&&clearTimeout(f),s(h))},p=h=>{d||(d=!0,u&&clearTimeout(u),f&&clearTimeout(f),o(h))};e.stdout.on("data",h=>{a.push(Buffer.isBuffer(h)?h:Buffer.from(h))}),e.stderr.on("data",h=>{c.push(Buffer.isBuffer(h)?h:Buffer.from(h))}),e.on("error",h=>{p(h)}),e.on("close",h=>{m({exit_code:l?null:typeof h=="number"?h:null,stdout:Buffer.concat(a),stderr:Buffer.concat(c),duration_ms:Math.max(0,Math.round(r()-i)),timed_out:l})}),u=setTimeout(()=>{l=!0,nw(e.pid,"SIGTERM"),n>0?f=setTimeout(()=>{nw(e.pid,"SIGKILL")},n):nw(e.pid,"SIGKILL")},t)})}async function RD(e,t){if(e.trim().length===0)throw new Error("command must be non-empty");let{killGraceMs:n,now:r}=ID(t),s=t.shellPath??Fee,o=AD(s,["-c",e],{cwd:t.cwd,env:t.env,detached:!0,stdio:["ignore","pipe","pipe"]});return kD(o,t.timeoutMs,n,r)}async function ND(e,t){if(e.length===0)throw new Error("argv must be non-empty");let{killGraceMs:n,now:r}=ID(t),s=AD(e[0],e.slice(1),{cwd:t.cwd,env:t.env,detached:!0,stdio:["ignore","pipe","pipe"]});return kD(s,t.timeoutMs,n,r)}function nw(e,t){if(e)try{process.kill(-e,t)}catch(n){if(!jee(n))throw n}}function jee(e){return!!e&&typeof e=="object"&&"code"in e&&e.code==="ESRCH"}var xD=1e3,Hee=6e4,Wee=20,Bee=1e3;async function CD(e,t){let n=t.runCommand??RD,r=t.runCommandArgv??ND,s=t.sleep??Xee,o=t.pollNow??Date.now,i=t.now??(()=>new Date),a=t.stderr??(u=>process.stderr.write(`${u}
2338
2338
  `)),c=t.shouldStop??(()=>!1),l=xD,d=!1;for(Vn(a,i,"info","daemon_started",{mailbox:e.mailbox}),e.allowAnonymous&&Vn(a,i,"warn","anonymous_execution_enabled",{mailbox:e.mailbox,warning:"REMOTE SHELL OPEN TO EVERY AUTHENTICATED LMMAIL USER"});!c();)try{let u=o(),f=await t.client.listMessages(e.mailbox,{status:"unread",after:0,...e.once?{}:{wait_s:Wee}}),m=Math.max(0,o()-u);for(let p of f.messages){if(c())break;let h=Gee(e,p.sender);if(h==="anonymous"&&!e.allowAnonymous){await t.client.getMessageMetadata(e.mailbox,p.seq),Vn(a,i,"warn","message_rejected",{seq:p.seq,sender:p.sender,sender_trust:h,reason:"anonymous_not_allowed"});continue}let _=await t.client.getMessage(e.mailbox,p.seq),g=Buffer.from(await t.client.download(_.body.download_url)).toString("utf8"),w;try{w=mD(g)}catch(A){Vn(a,i,"warn","message_rejected",{seq:p.seq,sender:p.sender,sender_trust:h,reason:"malformed_request",error:rw(A)});continue}let y=e.execAllowlist?SD(w.command):void 0,E=e.execAllowlist?y?bD(y,h):{allowed:!1,code:"malformed_command",message:"command could not be safely tokenized into arguments"}:{allowed:!0};if(!E.allowed){Vn(a,i,"warn","command_rejected",{id:w.id,sender:p.sender,sender_trust:h,...w.from===void 0?{}:{asserted_from:w.from},code:E.code,seq:p.seq}),await LD(t.client,w.reply_to,{id:w.id,exit_code:126,stdout:"",stderr:JSON.stringify({error:{code:E.code,message:E.message}}),duration_ms:0,timed_out:!1,sender_trust:h,sender:p.sender});continue}Vn(a,i,"info","command_started",{id:w.id,sender:p.sender,sender_trust:h,...w.from===void 0?{}:{asserted_from:w.from},seq:p.seq});let T;try{T=y?await r(y,{timeoutMs:Math.min(w.timeout_s,e.timeoutCapSeconds)*1e3}):await n(w.command,{timeoutMs:Math.min(w.timeout_s,e.timeoutCapSeconds)*1e3})}catch(A){Vn(a,i,"error","command_failed",{id:w.id,sender:p.sender,sender_trust:h,...w.from===void 0?{}:{asserted_from:w.from},error:rw(A)});continue}let b=await LD(t.client,w.reply_to,{id:w.id,...T,sender_trust:h,sender:p.sender});Vn(a,i,"info","command_finished",{id:w.id,sender:p.sender,sender_trust:h,...w.from===void 0?{}:{asserted_from:w.from},duration_ms:T.duration_ms,exit_code:T.exit_code,timed_out:T.timed_out,truncated:b.envelope.truncated})}if(l=xD,e.once||c())break;f.messages.length===0&&m<Bee&&(d||(Vn(a,i,"warn","long_poll_unsupported",{elapsed_ms:m,fallback_interval_ms:e.pollIntervalMs}),d=!0),await s(e.pollIntervalMs))}catch(u){if(Vn(a,i,"error","api_error",{error:rw(u),retry_ms:l}),c())break;await s(l),l=Math.min(l*2,Hee)}Vn(a,i,"info","daemon_stopped",{mailbox:e.mailbox})}function Gee(e,t){return e.adminUsers.has(t)?"admin":e.allowUsers.has(t)?"registered":"anonymous"}async function LD(e,t,n){let r=_D(n);return await e.sendMessage({mailbox:t,subject:r.subject,body:{name:"body.txt",contentType:"text/plain; charset=utf-8",bytes:Buffer.from(JSON.stringify(r.envelope),"utf8")},attachments:r.attachments.map(s=>({name:s.name,contentType:s.content_type,bytes:s.data}))}),r}function Vn(e,t,n,r,s){e(JSON.stringify({ts:t().toISOString(),level:n,event:r,...s}))}function Xee(e){return new Promise(t=>setTimeout(t,e))}function rw(e){return e instanceof Error?e.message:String(e)}var Vee=5e3,Jee=300;async function OD(e,t){await e.createMailbox(t,{tolerate409:!0})}function DD(e){let t=!1,n=!1,r=Promise.resolve(),s=e.stderr??(c=>process.stderr.write(`${c}
2339
- `)),o=e.runDaemonLoopImpl??CD,i={mailbox:e.mailbox,allowUsers:e.allowUsers,adminUsers:e.adminUsers,allowAnonymous:e.allowAnonymous,apiUrl:"",pollIntervalMs:e.pollIntervalMs??Vee,timeoutCapSeconds:e.timeoutCapSeconds??Jee,once:!1,execAllowlist:!0},a={client:e.client,shouldStop:()=>t,stderr:s};return{start(){n||t||(n=!0,r=o(i,a).catch(c=>{s(`[exec-worker] unexpected top-level failure, worker stopped: ${c instanceof Error?c.message:String(c)}`)}))},stop(){t=!0},isRunning:()=>n&&!t,whenIdle:()=>r}}var Yee=64*1024;function $D(e){return{v:1,msgId:e.msg_id,to:{site:e.to_site,team:e.to_team,alias:e.to_alias},from:{site:e.from_site,team:e.from_team,alias:e.from_alias},sentAt:e.sent_at,payload:e.payload}}async function sw(e,t,n,r,s,o){if(n.to.site!==t.localSiteId){pi(e,n.msgId,`${yo}addressed to a different site: ${n.to.site}`,s()),o.rejected++;return}if(!t.allowlist.includes(r)){pi(e,n.msgId,`sender not allowlisted: ${r}`,s()),o.rejected++;return}try{await t.dispatch(n,r),dS(e,n.msgId,s()),o.dispatched++}catch(i){pi(e,n.msgId,i instanceof Error?i.message:String(i),s()),o.failed++}}async function MD(e,t,n,r){let s=r.now??(()=>new Date().toISOString()),o=r.maxBodyBytes??Yee,i={recovered:0,retriedFailed:0,listed:0,recorded:0,dispatched:0,rejected:0,failed:0,stoppedEarly:!1};for(let u of cS(e))i.recovered++,await sw(e,r,$D(u),u.sender_user_id,s,i);let a=r.retryPolicy??ah;for(let u of Ad(e,s(),a))mS(e,u.msg_id)&&(i.retriedFailed++,await sw(e,r,$D(u),u.sender_user_id,s,i));let c=lS(e)??0,{messages:l}=await t.listMessages(n,{after:c});i.listed=l.length;let d=[...l].sort((u,f)=>u.seq-f.seq);for(let u of d){let f;try{f=await t.getMessage(n,u.seq)}catch{i.stoppedEarly=!0;break}if(f.body.size>o){i.stoppedEarly=!0;break}let m;try{m=await t.download(f.body.download_url)}catch{i.stoppedEarly=!0;break}let p;try{p=iS(Buffer.from(m).toString("utf8"))}catch{i.stoppedEarly=!0;break}let h=s(),_=aS(e,{msgId:p.msgId,seq:u.seq,to:p.to,from:p.from,senderUserId:f.sender,sentAt:p.sentAt,payload:p.payload},h);if(_!=="duplicate"){if(_==="conflict"){i.rejected++;continue}i.recorded++,await sw(e,r,p,f.sender,s,i)}}return i}async function PD(e,t){await e.createMailbox(t,{tolerate409:!0})}var Kee=6e4,zee={recovered:0,retriedFailed:0,listed:0,recorded:0,dispatched:0,rejected:0,failed:0,stoppedEarly:!1};function UD(e){let t=e.intervalMs??Kee,n=null,r=!1;async function s(){if(r)return zee;r=!0;try{let o=await MD(e.db,e.client,e.mailbox,e.worker);return e.onPoll?.(o),o}catch(o){throw e.onError?.(o),o}finally{r=!1}}return{start(){n||(n=setInterval(()=>{s().catch(()=>{})},t),n.unref())},stop(){n&&(clearInterval(n),n=null)},pollNow:s,isRunning:()=>n!==null,isPolling:()=>r}}var Qee=5e3;function FD(e){let t=e.intervalMs??Qee,n=e.fetchReport??Je,r=e.deliverImpl??ps,s=null,o=!1;async function i(){if(o)return 0;o=!0;try{let a=e.getTeams(),c=await n(),l=r(e.db,{teams:a,report:c,...e.remoteMail?{remoteMail:e.remoteMail}:{},...e.minMemoryPercent!==void 0?{minMemoryPercent:e.minMemoryPercent}:{}});return e.onDeliver?.(l),l}catch(a){throw e.onError?.(a),a}finally{o=!1}}return{start(){s||(s=setInterval(()=>{i().catch(()=>{})},t),s.unref())},stop(){s&&(clearInterval(s),s=null)},deliverNow:i,isRunning:()=>s!==null,isDelivering:()=>o}}import{createHash as Zee,randomUUID as ete}from"node:crypto";import{readFileSync as BD,mkdtempSync as tte,writeFileSync as nte,renameSync as rte,rmSync as GD,rmdirSync as ste}from"node:fs";import{tmpdir as ote}from"node:os";import{join as jD,dirname as qD,basename as HD}from"node:path";import{isAbsolute as WD,resolve as Bm}from"node:path";function XD(e){try{let t=BD(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[19]??null}catch{return null}}function ite(e,t){try{process.kill(e,0)}catch(r){if(r.code==="ESRCH"||r.code!=="EPERM")return!1}let n=XD(e);return n===null||n===t}function ate(e){return{...e,db:Bm(e.db),script:Bm(e.script),localScope:e.localScope.trim()}}function cte(e,t){return Zee("sha256").update(JSON.stringify({conversationId:t,db:e.db,localScope:e.localScope,script:e.script,args:e.args})).digest("hex")}function lte(e,t){if(!WD(t.db)||Bm(t.db)!==Bm(e))throw new G("INVALID_ARGUMENT","db must select the running daemon database");let n=t.conversationId?.trim()||ete();if(t.localScope.trim()==="")throw new G("INVALID_ARGUMENT","local_scope is required");if(!WD(t.script))throw new G("INVALID_ARGUMENT","script must be an absolute path");if(!t.args.every(s=>typeof s=="string"))throw new G("INVALID_ARGUMENT","args must be strings");let r=ate(t);return{conversationId:n,requestHash:cte(r,n),normalizedInput:r}}function dte(e,t){return[process.env.LMSCRIPT_BIN||"lmscript",e.script,e.db,e.localScope,t,...e.args].map(n=>`'${n.replaceAll("'","'\\''")}'`).join(" ")}function Wm(e,t){return e.prepare("SELECT * FROM on_demand_launches WHERE conversation_id = ?").get(t)??null}function VD(e){return e===null||typeof e!="object"||!("code"in e)?!1:String(e.code).startsWith("SQLITE_BUSY")||String(e.code).startsWith("SQLITE_LOCKED")}function JD(e){let t=jD(tte(jD(ote(),"lmbee-adoption-")),"receipt.json");return e.push(t),t}function Gm(e){if(!(e===null||HD(e)!=="receipt.json"||!HD(qD(e)).startsWith("lmbee-adoption-")))try{GD(e,{force:!0}),ste(qD(e))}catch{}}function ute(e){let t=e.receiptPath+".tmp-"+process.pid,n={adopted:!1,conversationId:e.conversationId,generation:e.generation,jobId:e.jobId,runId:null};try{nte(t,JSON.stringify(n),{mode:384,flag:"wx"}),rte(t,e.receiptPath)}finally{try{GD(t,{force:!0})}catch{}}}function fte(e){try{return e===null?null:JSON.parse(BD(e,"utf8"))}catch{return null}}function ow(e){let t=fte(e.receipt_path);return t?.adopted===!1&&t.conversationId===e.conversation_id&&t.generation===e.generation&&t.jobId===e.job_id&&t.runId===e.run_id}function mte(e,t,n,r,s){if(t.phase==="worker_adopted"&&t.run_id!==null)return s.push(t.receipt_path),{kind:"adopted",conversationId:t.conversation_id,jobId:t.job_id,runId:t.run_id};let o=ow(t);if(t.phase==="dispatching"&&t.run_id!==null&&o&&(Qr(e,t.run_id,{fallback:{ok:!1,summary:"worker refused before payload"}}),e.prepare("UPDATE on_demand_launches SET phase = 'reserved', state = 'retryable', run_id = NULL WHERE conversation_id = ? AND generation = ?").run(t.conversation_id,t.generation),t={...t,phase:"reserved",state:"retryable",run_id:null}),t.phase!=="reserved"||Xn(e,t.job_id)!==null)return{kind:"busy",conversationId:t.conversation_id,jobId:t.job_id,outcome:"unknown"};if(t.state==="claimed"&&ite(t.owner_pid,t.owner_start)&&!o)return{kind:"busy",conversationId:t.conversation_id,jobId:t.job_id,outcome:"not_sent"};e.prepare("UPDATE cron_jobs SET enabled = 1, updated_at = ? WHERE id = ?").run(new Date().toISOString(),t.job_id);let i=t.generation+1,a=JD(r);return e.prepare("UPDATE on_demand_launches SET generation = ?, receipt_path = ?, run_id = NULL, state = 'claimed', owner_pid = ?, owner_start = ?, updated_at = ? WHERE conversation_id = ? AND generation = ? AND phase = 'reserved'").run(i,a,n.pid,n.start,new Date().toISOString(),t.conversation_id,t.generation),s.push(t.receipt_path),{kind:"claimed",conversationId:t.conversation_id,requestHash:t.request_hash,jobId:t.job_id,generation:i,receiptPath:a}}function pte(e,t,n){let{conversationId:r,requestHash:s,normalizedInput:o}=lte(t,n),i={pid:process.pid,start:XD(process.pid)??"unavailable"},a=dte(o,r),c=[],l=[],d=Number(e.pragma("busy_timeout",{simple:!0}));e.pragma("busy_timeout = 0");try{let f=e.transaction(()=>{let m=Wm(e,r);if(m!==null){if(m.request_hash!==s)throw new G("CONFLICT",`conversationid ${r} is already bound to a different on-demand request`);return mte(e,m,i,c,l)}let p=_a(e,{title:`on-demand conversation ${r}`,scheduleExpr:"0 0 31 2 *",actionKind:"script",actionPayload:a,enabled:!0}),h=new Date().toISOString(),_=JD(c);return e.prepare(`INSERT INTO on_demand_launches(conversation_id, request_hash, generation, job_id, run_id, state, owner_pid, owner_start, created_at, updated_at, receipt_path)
2340
- VALUES (?, ?, 1, ?, NULL, 'claimed', ?, ?, ?, ?, ?)`).run(r,s,p.id,i.pid,i.start,h,h,_),{kind:"claimed",conversationId:r,requestHash:s,jobId:p.id,generation:1,receiptPath:_}}).immediate();return l.forEach(Gm),f}catch(u){throw c.forEach(Gm),VD(u)?new G("DB_BUSY","Database busy; on-demand start was not sent",5):u}finally{e.pragma(`busy_timeout = ${Math.max(0,Math.trunc(d))}`)}}async function YD(e,t,n,r){let s;try{s=pte(e,t,r)}catch(c){if(c instanceof G&&c.code==="DB_BUSY")return{conversationid:r.conversationId?.trim()||"",job_id:null,status:"busy",outcome:"not_sent"};throw c}if(s.kind==="busy")return{conversationid:s.conversationId,job_id:s.jobId,status:"busy",outcome:s.outcome};if(s.kind==="adopted")return{conversationid:s.conversationId,job_id:s.jobId,run_id:s.runId};let o=s.receiptPath,i=c=>({conversationid:s.conversationId,job_id:s.jobId,status:"busy",outcome:c}),a;try{a=await br(e,()=>bl(e,s.jobId,n,{runTimeoutMs:null,waitForCompletion:!1,disableOnClaim:!0,onDemand:{conversationId:s.conversationId,generation:s.generation,receiptPath:o}}))}catch(c){let l=!1;try{let d=br(e,()=>Wm(e,s.conversationId));l=d?.phase==="reserved"&&d.generation===s.generation&&d.run_id===null,l&&(ute(s),br(e,()=>e.prepare("UPDATE on_demand_launches SET state = 'retryable' WHERE conversation_id = ? AND generation = ? AND phase = 'reserved'").run(s.conversationId,s.generation)))}catch{}if(VD(c)||c instanceof G&&c.code==="DB_BUSY")return i(l?"not_sent":"unknown");if(!l)return i("unknown");throw c}if(a.kind!=="fired"||a.runId===void 0)return i("unknown");for(;;){let c;try{c=br(e,()=>Wm(e,s.conversationId))}catch{return i("unknown")}if(c?.phase==="worker_adopted"&&c.run_id!==null)return Gm(o),{conversationid:s.conversationId,job_id:s.jobId,run_id:c.run_id};if(c?.phase==="dispatching"&&c.generation===s.generation&&ow(c)){try{br(e,()=>e.transaction(()=>{let l=Wm(e,s.conversationId);l?.phase!=="dispatching"||l.generation!==s.generation||!ow(l)||(Qr(e,a.runId,{fallback:{ok:!1,summary:"worker refused before payload"}}),e.prepare("UPDATE on_demand_launches SET phase = 'reserved', state = 'retryable', run_id = NULL, receipt_path = NULL WHERE conversation_id = ? AND generation = ?").run(s.conversationId,s.generation))}).immediate()),Gm(o)}catch{}return i("not_sent")}try{let l=br(e,()=>St(e,a.runId));if(l.execution_state==="gone"||l.execution_state==="uncertain")return i("unknown")}catch{return i("unknown")}await new Promise(l=>setTimeout(l,5))}}import{posix as zD,win32 as QD}from"node:path";var iw=[{name:"db",type:"string",required:!0},{name:"local_scope",type:"string",required:!0},{name:"conversationid",type:"string",required:!0},{name:"escalationid",type:"string"}],hte=[{name:"lmbee_job_read",description:"Read live parent or child rows, including claimed rows.",keys:[...iw,{name:"row",type:"string",required:!0,values:["job","escalation"]}]},{name:"lmbee_job_write",description:"Insert or conditionally update one exact parent or child; commit before returning.",keys:[...iw,{name:"row",type:"string",required:!0,values:["job","escalation"]},{name:"operation",type:"string",required:!0,values:["insert","update"]},{name:"values",type:"map",required:!0},{name:"where",type:"map"}]},{name:"lmbee_job_claim",description:"Reserve one eligible unclaimed child in an immediate transaction; eligibility is script-defined.",keys:[...iw,{name:"where",type:"map",required:!0},{name:"state",type:"string",required:!0}]}];function KD(e){e.exec(`CREATE TABLE IF NOT EXISTS workflow_jobs (
2339
+ `)),o=e.runDaemonLoopImpl??CD,i={mailbox:e.mailbox,allowUsers:e.allowUsers,adminUsers:e.adminUsers,allowAnonymous:e.allowAnonymous,apiUrl:"",pollIntervalMs:e.pollIntervalMs??Vee,timeoutCapSeconds:e.timeoutCapSeconds??Jee,once:!1,execAllowlist:!0},a={client:e.client,shouldStop:()=>t,stderr:s};return{start(){n||t||(n=!0,r=o(i,a).catch(c=>{s(`[exec-worker] unexpected top-level failure, worker stopped: ${c instanceof Error?c.message:String(c)}`)}))},stop(){t=!0},isRunning:()=>n&&!t,whenIdle:()=>r}}var Yee=64*1024;function $D(e){return{v:1,msgId:e.msg_id,to:{site:e.to_site,team:e.to_team,alias:e.to_alias},from:{site:e.from_site,team:e.from_team,alias:e.from_alias},sentAt:e.sent_at,payload:e.payload}}async function sw(e,t,n,r,s,o){if(n.to.site!==t.localSiteId){pi(e,n.msgId,`${yo}addressed to a different site: ${n.to.site}`,s()),o.rejected++;return}if(!t.allowlist.includes(r)){pi(e,n.msgId,`sender not allowlisted: ${r}`,s()),o.rejected++;return}try{await t.dispatch(n,r),dS(e,n.msgId,s()),o.dispatched++}catch(i){pi(e,n.msgId,i instanceof Error?i.message:String(i),s()),o.failed++}}async function MD(e,t,n,r){let s=r.now??(()=>new Date().toISOString()),o=r.maxBodyBytes??Yee,i={recovered:0,retriedFailed:0,listed:0,recorded:0,dispatched:0,rejected:0,failed:0,stoppedEarly:!1};for(let u of cS(e))i.recovered++,await sw(e,r,$D(u),u.sender_user_id,s,i);let a=r.retryPolicy??ah;for(let u of Ad(e,s(),a))mS(e,u.msg_id)&&(i.retriedFailed++,await sw(e,r,$D(u),u.sender_user_id,s,i));let c=lS(e)??0,{messages:l}=await t.listMessages(n,{after:c});i.listed=l.length;let d=[...l].sort((u,f)=>u.seq-f.seq);for(let u of d){let f;try{f=await t.getMessage(n,u.seq)}catch{i.stoppedEarly=!0;break}if(f.body.size>o){i.stoppedEarly=!0;break}let m;try{m=await t.download(f.body.download_url)}catch{i.stoppedEarly=!0;break}let p;try{p=iS(Buffer.from(m).toString("utf8"))}catch{i.stoppedEarly=!0;break}let h=s(),_=aS(e,{msgId:p.msgId,seq:u.seq,to:p.to,from:p.from,senderUserId:f.sender,sentAt:p.sentAt,payload:p.payload},h);if(_!=="duplicate"){if(_==="conflict"){i.rejected++;continue}i.recorded++,await sw(e,r,p,f.sender,s,i)}}return i}async function PD(e,t){await e.createMailbox(t,{tolerate409:!0})}var Kee=6e4,zee={recovered:0,retriedFailed:0,listed:0,recorded:0,dispatched:0,rejected:0,failed:0,stoppedEarly:!1};function UD(e){let t=e.intervalMs??Kee,n=null,r=!1;async function s(){if(r)return zee;r=!0;try{let o=await MD(e.db,e.client,e.mailbox,e.worker);return e.onPoll?.(o),o}catch(o){throw e.onError?.(o),o}finally{r=!1}}return{start(){n||(n=setInterval(()=>{s().catch(()=>{})},t),n.unref())},stop(){n&&(clearInterval(n),n=null)},pollNow:s,isRunning:()=>n!==null,isPolling:()=>r}}var Qee=5e3;function FD(e){let t=e.intervalMs??Qee,n=e.fetchReport??Je,r=e.deliverImpl??ps,s=null,o=!1;async function i(){if(o)return 0;o=!0;try{let a=e.getTeams(),c=await n(),l=r(e.db,{teams:a,report:c,...e.remoteMail?{remoteMail:e.remoteMail}:{},...e.minMemoryPercent!==void 0?{minMemoryPercent:e.minMemoryPercent}:{}});return e.onDeliver?.(l),l}catch(a){throw e.onError?.(a),a}finally{o=!1}}return{start(){s||(s=setInterval(()=>{i().catch(()=>{})},t),s.unref())},stop(){s&&(clearInterval(s),s=null)},deliverNow:i,isRunning:()=>s!==null,isDelivering:()=>o}}import{createHash as Zee,randomUUID as ete}from"node:crypto";import{readFileSync as BD,mkdtempSync as tte,writeFileSync as nte,renameSync as rte,rmSync as GD,rmdirSync as ste}from"node:fs";import{tmpdir as ote}from"node:os";import{join as jD,dirname as qD,basename as HD}from"node:path";import{isAbsolute as WD,resolve as Bm}from"node:path";function XD(e){try{let t=BD(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[19]??null}catch{return null}}function ite(e,t){try{process.kill(e,0)}catch(r){if(r.code==="ESRCH"||r.code!=="EPERM")return!1}let n=XD(e);return n===null||n===t}function ate(e){return{...e,db:Bm(e.db),script:Bm(e.script),localScope:e.localScope.trim()}}function cte(e,t){return Zee("sha256").update(JSON.stringify({conversationId:t,db:e.db,localScope:e.localScope,script:e.script,args:e.args})).digest("hex")}function lte(e,t){if(!WD(t.db)||Bm(t.db)!==Bm(e))throw new G("INVALID_ARGUMENT","db must select the running daemon database");let n=t.conversationId?.trim()||ete();if(t.localScope.trim()==="")throw new G("INVALID_ARGUMENT","local_scope is required");if(!WD(t.script))throw new G("INVALID_ARGUMENT","script must be an absolute path");if(!t.args.every(s=>typeof s=="string"))throw new G("INVALID_ARGUMENT","args must be strings");let r=ate(t);return{conversationId:n,requestHash:cte(r,n),normalizedInput:r}}function dte(e,t){return[process.env.LMSCRIPT_BIN||"lmscript",e.script,e.db,e.localScope,t,...e.args].map(n=>`'${n.replaceAll("'","'\\''")}'`).join(" ")}function Wm(e,t){return e.prepare("SELECT * FROM on_demand_launches WHERE conversation_id = ?").get(t)??null}function VD(e){return e===null||typeof e!="object"||!("code"in e)?!1:String(e.code).startsWith("SQLITE_BUSY")||String(e.code).startsWith("SQLITE_LOCKED")}function JD(e){let t=jD(tte(jD(ote(),"lmbee-adoption-")),"receipt.json");return e.push(t),t}function Gm(e){if(!(e===null||HD(e)!=="receipt.json"||!HD(qD(e)).startsWith("lmbee-adoption-")))try{GD(e,{force:!0}),ste(qD(e))}catch{}}function ute(e){let t=e.receiptPath+".tmp-"+process.pid,n={adopted:!1,conversationId:e.conversationId,generation:e.generation,jobId:e.jobId,runId:null};try{nte(t,JSON.stringify(n),{mode:384,flag:"wx"}),rte(t,e.receiptPath)}finally{try{GD(t,{force:!0})}catch{}}}function fte(e){try{return e===null?null:JSON.parse(BD(e,"utf8"))}catch{return null}}function ow(e){let t=fte(e.receipt_path);return t?.adopted===!1&&t.conversationId===e.conversation_id&&t.generation===e.generation&&t.jobId===e.job_id&&t.runId===e.run_id}function mte(e,t,n,r,s){if(t.phase==="worker_adopted"&&t.run_id!==null)return s.push(t.receipt_path),{kind:"adopted",conversationId:t.conversation_id,jobId:t.job_id,runId:t.run_id};let o=ow(t);if(t.phase==="dispatching"&&t.run_id!==null&&o&&(Zr(e,t.run_id,{fallback:{ok:!1,summary:"worker refused before payload"}}),e.prepare("UPDATE on_demand_launches SET phase = 'reserved', state = 'retryable', run_id = NULL WHERE conversation_id = ? AND generation = ?").run(t.conversation_id,t.generation),t={...t,phase:"reserved",state:"retryable",run_id:null}),t.phase!=="reserved"||Xn(e,t.job_id)!==null)return{kind:"busy",conversationId:t.conversation_id,jobId:t.job_id,outcome:"unknown"};if(t.state==="claimed"&&ite(t.owner_pid,t.owner_start)&&!o)return{kind:"busy",conversationId:t.conversation_id,jobId:t.job_id,outcome:"not_sent"};e.prepare("UPDATE cron_jobs SET enabled = 1, updated_at = ? WHERE id = ?").run(new Date().toISOString(),t.job_id);let i=t.generation+1,a=JD(r);return e.prepare("UPDATE on_demand_launches SET generation = ?, receipt_path = ?, run_id = NULL, state = 'claimed', owner_pid = ?, owner_start = ?, updated_at = ? WHERE conversation_id = ? AND generation = ? AND phase = 'reserved'").run(i,a,n.pid,n.start,new Date().toISOString(),t.conversation_id,t.generation),s.push(t.receipt_path),{kind:"claimed",conversationId:t.conversation_id,requestHash:t.request_hash,jobId:t.job_id,generation:i,receiptPath:a}}function pte(e,t,n){let{conversationId:r,requestHash:s,normalizedInput:o}=lte(t,n),i={pid:process.pid,start:XD(process.pid)??"unavailable"},a=dte(o,r),c=[],l=[],d=Number(e.pragma("busy_timeout",{simple:!0}));e.pragma("busy_timeout = 0");try{let f=e.transaction(()=>{let m=Wm(e,r);if(m!==null){if(m.request_hash!==s)throw new G("CONFLICT",`conversationid ${r} is already bound to a different on-demand request`);return mte(e,m,i,c,l)}let p=_a(e,{title:`on-demand conversation ${r}`,scheduleExpr:"0 0 31 2 *",actionKind:"script",actionPayload:a,enabled:!0}),h=new Date().toISOString(),_=JD(c);return e.prepare(`INSERT INTO on_demand_launches(conversation_id, request_hash, generation, job_id, run_id, state, owner_pid, owner_start, created_at, updated_at, receipt_path)
2340
+ VALUES (?, ?, 1, ?, NULL, 'claimed', ?, ?, ?, ?, ?)`).run(r,s,p.id,i.pid,i.start,h,h,_),{kind:"claimed",conversationId:r,requestHash:s,jobId:p.id,generation:1,receiptPath:_}}).immediate();return l.forEach(Gm),f}catch(u){throw c.forEach(Gm),VD(u)?new G("DB_BUSY","Database busy; on-demand start was not sent",5):u}finally{e.pragma(`busy_timeout = ${Math.max(0,Math.trunc(d))}`)}}async function YD(e,t,n,r){let s;try{s=pte(e,t,r)}catch(c){if(c instanceof G&&c.code==="DB_BUSY")return{conversationid:r.conversationId?.trim()||"",job_id:null,status:"busy",outcome:"not_sent"};throw c}if(s.kind==="busy")return{conversationid:s.conversationId,job_id:s.jobId,status:"busy",outcome:s.outcome};if(s.kind==="adopted")return{conversationid:s.conversationId,job_id:s.jobId,run_id:s.runId};let o=s.receiptPath,i=c=>({conversationid:s.conversationId,job_id:s.jobId,status:"busy",outcome:c}),a;try{a=await br(e,()=>bl(e,s.jobId,n,{runTimeoutMs:null,waitForCompletion:!1,disableOnClaim:!0,onDemand:{conversationId:s.conversationId,generation:s.generation,receiptPath:o}}))}catch(c){let l=!1;try{let d=br(e,()=>Wm(e,s.conversationId));l=d?.phase==="reserved"&&d.generation===s.generation&&d.run_id===null,l&&(ute(s),br(e,()=>e.prepare("UPDATE on_demand_launches SET state = 'retryable' WHERE conversation_id = ? AND generation = ? AND phase = 'reserved'").run(s.conversationId,s.generation)))}catch{}if(VD(c)||c instanceof G&&c.code==="DB_BUSY")return i(l?"not_sent":"unknown");if(!l)return i("unknown");throw c}if(a.kind!=="fired"||a.runId===void 0)return i("unknown");for(;;){let c;try{c=br(e,()=>Wm(e,s.conversationId))}catch{return i("unknown")}if(c?.phase==="worker_adopted"&&c.run_id!==null)return Gm(o),{conversationid:s.conversationId,job_id:s.jobId,run_id:c.run_id};if(c?.phase==="dispatching"&&c.generation===s.generation&&ow(c)){try{br(e,()=>e.transaction(()=>{let l=Wm(e,s.conversationId);l?.phase!=="dispatching"||l.generation!==s.generation||!ow(l)||(Zr(e,a.runId,{fallback:{ok:!1,summary:"worker refused before payload"}}),e.prepare("UPDATE on_demand_launches SET phase = 'reserved', state = 'retryable', run_id = NULL, receipt_path = NULL WHERE conversation_id = ? AND generation = ?").run(s.conversationId,s.generation))}).immediate()),Gm(o)}catch{}return i("not_sent")}try{let l=br(e,()=>bt(e,a.runId));if(l.execution_state==="gone"||l.execution_state==="uncertain")return i("unknown")}catch{return i("unknown")}await new Promise(l=>setTimeout(l,5))}}import{posix as zD,win32 as QD}from"node:path";var iw=[{name:"db",type:"string",required:!0},{name:"local_scope",type:"string",required:!0},{name:"conversationid",type:"string",required:!0},{name:"escalationid",type:"string"}],hte=[{name:"lmbee_job_read",description:"Read live parent or child rows, including claimed rows.",keys:[...iw,{name:"row",type:"string",required:!0,values:["job","escalation"]}]},{name:"lmbee_job_write",description:"Insert or conditionally update one exact parent or child; commit before returning.",keys:[...iw,{name:"row",type:"string",required:!0,values:["job","escalation"]},{name:"operation",type:"string",required:!0,values:["insert","update"]},{name:"values",type:"map",required:!0},{name:"where",type:"map"}]},{name:"lmbee_job_claim",description:"Reserve one eligible unclaimed child in an immediate transaction; eligibility is script-defined.",keys:[...iw,{name:"where",type:"map",required:!0},{name:"state",type:"string",required:!0}]}];function KD(e){e.exec(`CREATE TABLE IF NOT EXISTS workflow_jobs (
2341
2341
  local_scope TEXT NOT NULL, conversationid TEXT NOT NULL, status TEXT NOT NULL,
2342
2342
  PRIMARY KEY (local_scope, conversationid)
2343
2343
  );
@@ -2347,7 +2347,7 @@ ${Zt}`;ue=o(e.db,F,M,Z,_n,$,xe?void 0:!jt)}else ue=o(e.db,F,M,Z,void 0,$)}catch(
2347
2347
  state TEXT NOT NULL, attempts INTEGER NOT NULL DEFAULT 0,
2348
2348
  PRIMARY KEY (local_scope, conversationid, escalationid),
2349
2349
  FOREIGN KEY (local_scope, conversationid) REFERENCES workflow_jobs(local_scope, conversationid)
2350
- )`)}function es(e=null,t=!1,n=[]){return{status:"ok",code:null,error:null,id:e?.id??null,escalation:e,escalations:n,origin:e?.origin??null,applied:t}}function lt(e,t,n=null){return{...es(n),status:"error",code:e,error:t}}function aw(e){return e.code===null?200:e.code==="invalid_argument"?400:e.code==="not_found"?404:e.code==="conflict"?409:e.code==="database_unavailable"||e.code==="service_unavailable"?503:500}var zs=class extends Error{code;row;constructor(t,n,r=null){super(n),this.code=t,this.row=r}},Sa=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),ZD="local_scope = ? AND conversationid = ? AND escalationid = ?",Xm=["local_scope","conversationid","script_file","script_prefix","tag","run_id"],_te=["source_kind","script_file","source_name","run_id","parent_run_id","local_scope","conversationid","member_alias","parent_invocation_id","tag"],xt=e=>{throw new zs("invalid_argument",e)},ts=(e,t,n=!1)=>typeof e=="string"&&(n||e.length>0)?e:xt(t+" must be a "+(n?"":"nonempty ")+"string"),t$=e=>zD.isAbsolute(e)&&zD.normalize(e)===e||QD.isAbsolute(e)&&QD.normalize(e)===e;function Vm(e,t=new Set){let n=r=>{if(r===null||typeof r=="string"||typeof r=="boolean"||typeof r=="number"&&Number.isFinite(r))return r;if(typeof r!="object"||r===null||t.has(r))return xt("payload must contain JSON values");if(!Array.isArray(r)&&Object.getPrototypeOf(r)!==Object.prototype&&Object.getPrototypeOf(r)!==null)return xt("payload must contain JSON objects");t.add(r);let s=Array.isArray(r)?Array.from(r,o=>n(o)):Object.fromEntries(Object.keys(r).sort().map(o=>[o,n(r[o])]));return t.delete(r),s};return JSON.stringify(n(e))}var n$=e=>"e1."+Buffer.from(JSON.stringify(e),"utf8").toString("base64url");function gte(e){let t=ts(e,"id");try{if(!/^e1\.[A-Za-z0-9_-]+$/.test(t))return xt("Invalid escalation handle");let n=JSON.parse(Buffer.from(t.slice(3),"base64url").toString("utf8"));return!Array.isArray(n)||n.length!==3||!n.every(r=>typeof r=="string"&&r.length>0)||n$(n)!==t?xt("Invalid escalation handle"):n}catch{return xt("Invalid escalation handle")}}function e$(e){let t=JSON.parse(e.payload),n=Sa(t)&&Sa(t.origin)?t.origin:null;return{id:n$([e.local_scope,e.conversationid,e.escalationid]),local_scope:e.local_scope,conversationid:e.conversationid,escalationid:e.escalationid,payload:t,origin:n,state:e.state,answer_text:e.answer_text,answer_present:e.answer_text!==null}}function Ete(e){for(let t of Xm)Object.hasOwn(e,t)&&ts(e[t],t,t==="tag");e.script_file!==void 0&&e.script_prefix!==void 0&&xt("Choose script_file or script_prefix");for(let t of["script_file","script_prefix"])typeof e[t]=="string"&&!t$(e[t])&&xt(t+" must be an absolute normalized path")}function yte(e,t){if(typeof e!="string")return!1;let n=t.startsWith("/")?"/":"\\",r=t.replace(t.startsWith("/")?/\/+$/:/\\+$/,"")||n;return e===r||e.startsWith(r.endsWith(n)?r:r+n)}function cw(e,t){let n=[];return t.local_scope!==void 0&&n.push(e.local_scope===t.local_scope),t.conversationid!==void 0&&n.push(e.conversationid===t.conversationid),t.script_file!==void 0&&n.push(e.origin!==null&&e.origin.script_file===t.script_file),t.script_prefix!==void 0&&n.push(e.origin!==null&&yte(e.origin.script_file,t.script_prefix)),t.tag!==void 0&&n.push(e.origin!==null&&e.origin.tag===t.tag),t.run_id!==void 0&&n.push(e.origin!==null&&e.origin.run_id===t.run_id),n.every(Boolean)}function wte(e){let t=ts(e.local_scope,"local_scope"),n=ts(e.conversationid,"conversationid"),r=ts(e.request_key,"request_key");(!Sa(e.payload)||typeof e.payload.question!="string"||!e.payload.question.trim())&&xt("payload requires a nonempty question string");let s=e.payload;Object.hasOwn(s,"origin")&&xt("payload.origin is reserved; supply origin separately"),Vm(s);let o=e.tag===void 0||e.tag===null?null:ts(e.tag,"tag",!0);e.origin!==void 0&&!Sa(e.origin)&&xt("origin must be an object");let i=e.origin??{};Object.keys(i).some(l=>!_te.includes(l))&&xt("Unknown origin field");let a=i.source_kind===void 0?"unknown":i.source_kind;["file","stdin","inline","unknown"].includes(a)||xt("Invalid origin source_kind");let c={source_kind:a,script_file:null,source_name:null,run_id:null,parent_run_id:null,local_scope:t,conversationid:n,member_alias:null,parent_invocation_id:null,tag:o};for(let l of["script_file","source_name","run_id","parent_run_id","member_alias","parent_invocation_id"])i[l]!==void 0&&i[l]!==null&&(c[l]=ts(i[l],"origin."+l));a==="file"?(typeof c.script_file!="string"||!t$(c.script_file))&&xt("File origin requires an absolute normalized script_file"):c.script_file!==null&&xt("Non-file origin must have a null script_file");for(let l of["local_scope","conversationid","tag"])Object.hasOwn(i,l)&&i[l]!==c[l]&&xt("Origin "+l+" contradicts creation selection");return{tuple:[t,n,r],payload:s,origin:c,tag:o}}function Tte(e){if(!Sa(e))return e;let{origin:t,...n}=e;return n}function Dl(e,t,n){let r,s=t==="create"||t==="answer";try{if(!Sa(n))return xt("Expected an escalation options object");let o=t==="create"?["local_scope","conversationid","request_key","payload","origin","tag"]:t==="list_open"?Xm:t==="answer"?["id","answer_text",...Xm]:["id",...Xm];(!["create","status","list_open","answer"].includes(t)||Object.keys(n).some(d=>!o.includes(d)))&&xt("Unknown escalation option or operation");let i=t==="create"?wte(n):void 0;i||Ete(n);let a=t==="status"||t==="answer"?gte(n.id):i?.tuple;if(t==="list_open"&&ts(n.local_scope,"local_scope"),t==="answer"&&ts(n.answer_text,"answer_text",!0),!e.open||e.inTransaction)return lt("database_unavailable","Escalation database unavailable");r=e.pragma("busy_timeout",{simple:!0}),e.pragma("busy_timeout = 0");let c=()=>{let d=e.prepare(`SELECT local_scope,conversationid,escalationid,payload,state,answer_text FROM workflow_escalations WHERE ${ZD}`).get(...a);return d?e$(d):null};if(!s){if(!e.prepare("SELECT name FROM sqlite_master WHERE name='workflow_escalations'").get())return t==="list_open"?es():lt("not_found","Escalation not found");if(t==="status"){let m=c();return m&&cw(m,n)?es(m):lt("not_found","Escalation not found")}let d=e.prepare("SELECT local_scope,conversationid,escalationid,payload,state,answer_text FROM workflow_escalations WHERE local_scope = ? AND answer_text IS NULL ORDER BY conversationid,escalationid").all(n.local_scope).map(e$),{local_scope:u,...f}=n;return es(null,!1,d.filter(m=>cw(m,f)))}let l=()=>{if(KD(e),i){e.prepare("INSERT OR IGNORE INTO workflow_jobs(local_scope,conversationid,status) VALUES(?,?,'open')").run(...i.tuple.slice(0,2));let f=c();if(f){if(Vm(Tte(f.payload))!==Vm(i.payload)||(f.origin?.tag??null)!==i.tag)throw new zs("conflict","Request key already identifies a different question or tag",f);return es(f)}let m=Vm({...i.payload,origin:i.origin});return e.prepare("INSERT INTO workflow_escalations(local_scope,conversationid,escalationid,payload,state,answer_text) VALUES(?,?,?,?,'waiting',NULL)").run(...i.tuple,m),es(c(),!0)}let d=c();if(!d||!cw(d,n))throw new zs("not_found","Escalation not found");if(d.answer_text!==null){if(d.answer_text!==n.answer_text)throw new zs("conflict","Escalation already has a different answer",d);return es(d)}if(e.prepare(`UPDATE workflow_escalations SET answer_text = ?, state = 'answered' WHERE ${ZD} AND answer_text IS NULL`).run(n.answer_text,...a).changes!==1)throw new zs("conflict","Escalation answer was not applied",c());return es(c(),!0)};return e.transaction(l).immediate()}catch(o){if(o instanceof zs)return lt(o.code,o.message,o.row);let i=o?.code??"";return/^SQLITE_(BUSY|LOCKED|CANTOPEN|CORRUPT|NOTADB|IOERR|MISUSE)/.test(i)?lt("database_unavailable","Escalation database unavailable"):lt(s?"write_rejected":"database_unavailable",s?"Escalation write rejected":"Escalation database unavailable")}finally{r!==void 0&&e.pragma("busy_timeout = "+r)}}import{readFileSync as Fre}from"node:fs";var vte=10*6e4,Ste=60*6e4;function r$(e,t,n={},r=Date.now()){let s=n.ackDeadlineMs??vte,o=n.replyThresholdMs??Ste,i=[];for(let a of t){let c=Id(e,{site:a.peerSite,team:a.name,alias:a.alias});if(!c)continue;let l=Date.parse(c.sent_ts);if(c.state==="sent"){r-l>=s&&i.push(a.name);continue}c.state!=="replied"&&r-l>=o&&i.push(a.name)}return i}var bte=[/^\S+'s turn has finished and exited; resubmit/i,/^resubmit .*lmctl chat/i];function Ate(e){let t=e.split(/\r?\n/).filter(r=>r.trim().length>0).filter(r=>!bte.some(s=>s.test(r.trim()))),n=(t[t.length-1]??"").trim();return n==="BLOCKED"?"BLOCKED":n==="DONE"?"DONE":null}function s$(e){if(e.trim()==="")return{status:"NO-OUTPUT",wake:"env"};let t=Ate(e);return t==="BLOCKED"?{status:"BLOCKED",wake:"blocked"}:t==="DONE"?{status:"DONE",wake:null}:{status:"IDLE",wake:null}}function ba(e){switch(e.kind){case"ok":return s$(e.replyText);case"stalled":{let t=s$(e.replyText);return t.status==="BLOCKED"||t.status==="DONE"?t:{status:"NO-OUTPUT",wake:"env"}}case"busy":return{status:"RUNNING(busy)",wake:null};case"timeout":case"no-signal":return{status:"NO-OUTPUT",wake:"env"};case"error":return{status:"ENV-ERROR",wake:"env"}}}var Aa=Cn(Jn(),1);function je(e,t){return{error:{code:e,message:t}}}var f$=1e4;function dw(e,t,n){let r=20;if(n!==void 0){let o=typeof n=="number"?n:n.trim()===""?NaN:Number(n);if(!Number.isSafeInteger(o)||o<0||o>f$)return je("invalid_limit",`invalid limit "${n}" -- must be an integer from 0 to ${f$}`);r=o}return{events:t?e.db.db.prepare("SELECT * FROM events WHERE team = ? ORDER BY id DESC LIMIT ?").all(t,r):e.db.db.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(r)}}function m$(e,t,n,r={}){let s=dw(e,t,n);return r.json?JSON.stringify(s):"error"in s?s.error.message:(0,Aa.formatTable)([["ID","TS","TEAM","STATUS","NOTE"],...s.events.map(o=>[String(o.id),ke(o.ts),(0,Aa.escapeCell)(o.team),(0,Aa.escapeCell)(o.status),(0,Aa.escapeCell)(o.note??"")])])}var p$=Cn(Jn(),1);function uw(e){let t=e.db.db,n=fS(t),r=ch(t),s=r.filter(c=>c.failure_reason?.startsWith(yo)).length,o=r.length-s,i=Ad(t,new Date().toISOString()).length,a=_S(t);return{counts:n,retryEligibleCount:o,permanentCount:s,dueNowCount:i,deliveryErrorCount:a}}function h$(e,t={}){let n=uw(e);if(t.json)return JSON.stringify(n);let r=[["persisted (awaiting dispatch)",String(n.counts.persisted)],["dispatched",String(n.counts.dispatched)],["replied",String(n.counts.replied)],["failed -- retry-eligible (backoff pending)",String(n.retryEligibleCount)],["failed -- permanent (never retried)",String(n.permanentCount)]],s=(0,p$.formatTable)([["STATE","COUNT"],...r]),o=n.deliveryErrorCount>0?`
2350
+ )`)}function ts(e=null,t=!1,n=[]){return{status:"ok",code:null,error:null,id:e?.id??null,escalation:e,escalations:n,origin:e?.origin??null,applied:t}}function lt(e,t,n=null){return{...ts(n),status:"error",code:e,error:t}}function aw(e){return e.code===null?200:e.code==="invalid_argument"?400:e.code==="not_found"?404:e.code==="conflict"?409:e.code==="database_unavailable"||e.code==="service_unavailable"?503:500}var zs=class extends Error{code;row;constructor(t,n,r=null){super(n),this.code=t,this.row=r}},Sa=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),ZD="local_scope = ? AND conversationid = ? AND escalationid = ?",Xm=["local_scope","conversationid","script_file","script_prefix","tag","run_id"],_te=["source_kind","script_file","source_name","run_id","parent_run_id","local_scope","conversationid","member_alias","parent_invocation_id","tag"],_t=e=>{throw new zs("invalid_argument",e)},Ar=(e,t,n=!1)=>typeof e!="string"||!n&&e.length===0?_t(t+" must be a "+(n?"":"nonempty ")+"string"):/[\uD800-\uDFFF]/u.test(e)?_t(t+" must contain well-formed UTF-16"):e,t$=e=>zD.isAbsolute(e)&&zD.normalize(e)===e||QD.isAbsolute(e)&&QD.normalize(e)===e;function Vm(e,t=new Set){let n=r=>{if(r===null||typeof r=="string"||typeof r=="boolean"||typeof r=="number"&&Number.isFinite(r))return r;if(typeof r!="object"||r===null||t.has(r))return _t("payload must contain JSON values");if(!Array.isArray(r)&&Object.getPrototypeOf(r)!==Object.prototype&&Object.getPrototypeOf(r)!==null)return _t("payload must contain JSON objects");t.add(r);let s=Array.isArray(r)?Array.from(r,o=>n(o)):Object.fromEntries(Object.keys(r).sort().map(o=>[o,n(r[o])]));return t.delete(r),s};return JSON.stringify(n(e))}var n$=e=>"e1."+Buffer.from(JSON.stringify(e),"utf8").toString("base64url");function gte(e){let t=Ar(e,"id");try{if(!/^e1\.[A-Za-z0-9_-]+$/.test(t))return _t("Invalid escalation handle");let n=JSON.parse(Buffer.from(t.slice(3),"base64url").toString("utf8"));if(!Array.isArray(n)||n.length!==3)return _t("Invalid escalation handle");let r=n.map(s=>Ar(s,"id component"));return n$(r)!==t?_t("Invalid escalation handle"):r}catch{return _t("Invalid escalation handle")}}function e$(e){let t=JSON.parse(e.payload),n=Sa(t)&&Sa(t.origin)?t.origin:null;return{id:n$([e.local_scope,e.conversationid,e.escalationid]),local_scope:e.local_scope,conversationid:e.conversationid,escalationid:e.escalationid,payload:t,origin:n,state:e.state,answer_text:e.answer_text,answer_present:e.answer_text!==null}}function Ete(e){for(let t of Xm)Object.hasOwn(e,t)&&Ar(e[t],t,t==="tag");e.script_file!==void 0&&e.script_prefix!==void 0&&_t("Choose script_file or script_prefix");for(let t of["script_file","script_prefix"])typeof e[t]=="string"&&!t$(e[t])&&_t(t+" must be an absolute normalized path")}function yte(e,t){if(typeof e!="string")return!1;let n=t.startsWith("/")?"/":"\\",r=t.replace(t.startsWith("/")?/\/+$/:/\\+$/,"")||n;return e===r||e.startsWith(r.endsWith(n)?r:r+n)}function cw(e,t){let n=[];return t.local_scope!==void 0&&n.push(e.local_scope===t.local_scope),t.conversationid!==void 0&&n.push(e.conversationid===t.conversationid),t.script_file!==void 0&&n.push(e.origin!==null&&e.origin.script_file===t.script_file),t.script_prefix!==void 0&&n.push(e.origin!==null&&yte(e.origin.script_file,t.script_prefix)),t.tag!==void 0&&n.push(e.origin!==null&&e.origin.tag===t.tag),t.run_id!==void 0&&n.push(e.origin!==null&&e.origin.run_id===t.run_id),n.every(Boolean)}function wte(e){let t=Ar(e.local_scope,"local_scope"),n=Ar(e.conversationid,"conversationid"),r=Ar(e.request_key,"request_key");(!Sa(e.payload)||typeof e.payload.question!="string"||!e.payload.question.trim())&&_t("payload requires a nonempty question string");let s=e.payload;Object.hasOwn(s,"origin")&&_t("payload.origin is reserved; supply origin separately"),Vm(s);let o=e.tag===void 0||e.tag===null?null:Ar(e.tag,"tag",!0);e.origin!==void 0&&!Sa(e.origin)&&_t("origin must be an object");let i=e.origin??{};Object.keys(i).some(l=>!_te.includes(l))&&_t("Unknown origin field");let a=i.source_kind===void 0?"unknown":i.source_kind;["file","stdin","inline","unknown"].includes(a)||_t("Invalid origin source_kind");let c={source_kind:a,script_file:null,source_name:null,run_id:null,parent_run_id:null,local_scope:t,conversationid:n,member_alias:null,parent_invocation_id:null,tag:o};for(let l of["script_file","source_name","run_id","parent_run_id","member_alias","parent_invocation_id"])i[l]!==void 0&&i[l]!==null&&(c[l]=Ar(i[l],"origin."+l));a==="file"?(typeof c.script_file!="string"||!t$(c.script_file))&&_t("File origin requires an absolute normalized script_file"):c.script_file!==null&&_t("Non-file origin must have a null script_file");for(let l of["local_scope","conversationid","tag"])Object.hasOwn(i,l)&&i[l]!==c[l]&&_t("Origin "+l+" contradicts creation selection");return{tuple:[t,n,r],payload:s,origin:c,tag:o}}function Tte(e){if(!Sa(e))return e;let{origin:t,...n}=e;return n}function Dl(e,t,n){let r,s=t==="create"||t==="answer";try{if(!Sa(n))return _t("Expected an escalation options object");let o=t==="create"?["local_scope","conversationid","request_key","payload","origin","tag"]:t==="list_open"?Xm:t==="answer"?["id","answer_text",...Xm]:["id",...Xm];(!["create","status","list_open","answer"].includes(t)||Object.keys(n).some(d=>!o.includes(d)))&&_t("Unknown escalation option or operation");let i=t==="create"?wte(n):void 0;i||Ete(n);let a=t==="status"||t==="answer"?gte(n.id):i?.tuple;if(t==="list_open"&&Ar(n.local_scope,"local_scope"),t==="answer"&&Ar(n.answer_text,"answer_text",!0),!e.open||e.inTransaction)return lt("database_unavailable","Escalation database unavailable");r=e.pragma("busy_timeout",{simple:!0}),e.pragma("busy_timeout = 0");let c=()=>{let d=e.prepare(`SELECT local_scope,conversationid,escalationid,payload,state,answer_text FROM workflow_escalations WHERE ${ZD}`).get(...a);return d?e$(d):null};if(!s){if(!e.prepare("SELECT name FROM sqlite_master WHERE name='workflow_escalations'").get())return t==="list_open"?ts():lt("not_found","Escalation not found");if(t==="status"){let m=c();return m&&cw(m,n)?ts(m):lt("not_found","Escalation not found")}let d=e.prepare("SELECT local_scope,conversationid,escalationid,payload,state,answer_text FROM workflow_escalations WHERE local_scope = ? AND answer_text IS NULL ORDER BY conversationid,escalationid").all(n.local_scope).map(e$),{local_scope:u,...f}=n;return ts(null,!1,d.filter(m=>cw(m,f)))}let l=()=>{if(KD(e),i){e.prepare("INSERT OR IGNORE INTO workflow_jobs(local_scope,conversationid,status) VALUES(?,?,'open')").run(...i.tuple.slice(0,2));let f=c();if(f){if(Vm(Tte(f.payload))!==Vm(i.payload)||(f.origin?.tag??null)!==i.tag)throw new zs("conflict","Request key already identifies a different question or tag",f);return ts(f)}let m=Vm({...i.payload,origin:i.origin});return e.prepare("INSERT INTO workflow_escalations(local_scope,conversationid,escalationid,payload,state,answer_text) VALUES(?,?,?,?,'waiting',NULL)").run(...i.tuple,m),ts(c(),!0)}let d=c();if(!d||!cw(d,n))throw new zs("not_found","Escalation not found");if(d.answer_text!==null){if(d.answer_text!==n.answer_text)throw new zs("conflict","Escalation already has a different answer",d);return ts(d)}if(e.prepare(`UPDATE workflow_escalations SET answer_text = ?, state = 'answered' WHERE ${ZD} AND answer_text IS NULL`).run(n.answer_text,...a).changes!==1)throw new zs("conflict","Escalation answer was not applied",c());return ts(c(),!0)};return e.transaction(l).immediate()}catch(o){if(o instanceof zs)return lt(o.code,o.message,o.row);let i=o?.code??"";return/^SQLITE_(BUSY|LOCKED|CANTOPEN|CORRUPT|NOTADB|IOERR|MISUSE)/.test(i)?lt("database_unavailable","Escalation database unavailable"):lt(s?"write_rejected":"database_unavailable",s?"Escalation write rejected":"Escalation database unavailable")}finally{r!==void 0&&e.pragma("busy_timeout = "+r)}}import{readFileSync as Fre}from"node:fs";var vte=10*6e4,Ste=60*6e4;function r$(e,t,n={},r=Date.now()){let s=n.ackDeadlineMs??vte,o=n.replyThresholdMs??Ste,i=[];for(let a of t){let c=Id(e,{site:a.peerSite,team:a.name,alias:a.alias});if(!c)continue;let l=Date.parse(c.sent_ts);if(c.state==="sent"){r-l>=s&&i.push(a.name);continue}c.state!=="replied"&&r-l>=o&&i.push(a.name)}return i}var bte=[/^\S+'s turn has finished and exited; resubmit/i,/^resubmit .*lmctl chat/i];function Ate(e){let t=e.split(/\r?\n/).filter(r=>r.trim().length>0).filter(r=>!bte.some(s=>s.test(r.trim()))),n=(t[t.length-1]??"").trim();return n==="BLOCKED"?"BLOCKED":n==="DONE"?"DONE":null}function s$(e){if(e.trim()==="")return{status:"NO-OUTPUT",wake:"env"};let t=Ate(e);return t==="BLOCKED"?{status:"BLOCKED",wake:"blocked"}:t==="DONE"?{status:"DONE",wake:null}:{status:"IDLE",wake:null}}function ba(e){switch(e.kind){case"ok":return s$(e.replyText);case"stalled":{let t=s$(e.replyText);return t.status==="BLOCKED"||t.status==="DONE"?t:{status:"NO-OUTPUT",wake:"env"}}case"busy":return{status:"RUNNING(busy)",wake:null};case"timeout":case"no-signal":return{status:"NO-OUTPUT",wake:"env"};case"error":return{status:"ENV-ERROR",wake:"env"}}}var Aa=Cn(Jn(),1);function je(e,t){return{error:{code:e,message:t}}}var f$=1e4;function dw(e,t,n){let r=20;if(n!==void 0){let o=typeof n=="number"?n:n.trim()===""?NaN:Number(n);if(!Number.isSafeInteger(o)||o<0||o>f$)return je("invalid_limit",`invalid limit "${n}" -- must be an integer from 0 to ${f$}`);r=o}return{events:t?e.db.db.prepare("SELECT * FROM events WHERE team = ? ORDER BY id DESC LIMIT ?").all(t,r):e.db.db.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(r)}}function m$(e,t,n,r={}){let s=dw(e,t,n);return r.json?JSON.stringify(s):"error"in s?s.error.message:(0,Aa.formatTable)([["ID","TS","TEAM","STATUS","NOTE"],...s.events.map(o=>[String(o.id),ke(o.ts),(0,Aa.escapeCell)(o.team),(0,Aa.escapeCell)(o.status),(0,Aa.escapeCell)(o.note??"")])])}var p$=Cn(Jn(),1);function uw(e){let t=e.db.db,n=fS(t),r=ch(t),s=r.filter(c=>c.failure_reason?.startsWith(yo)).length,o=r.length-s,i=Ad(t,new Date().toISOString()).length,a=_S(t);return{counts:n,retryEligibleCount:o,permanentCount:s,dueNowCount:i,deliveryErrorCount:a}}function h$(e,t={}){let n=uw(e);if(t.json)return JSON.stringify(n);let r=[["persisted (awaiting dispatch)",String(n.counts.persisted)],["dispatched",String(n.counts.dispatched)],["replied",String(n.counts.replied)],["failed -- retry-eligible (backoff pending)",String(n.retryEligibleCount)],["failed -- permanent (never retried)",String(n.permanentCount)]],s=(0,p$.formatTable)([["STATE","COUNT"],...r]),o=n.deliveryErrorCount>0?`
2351
2351
  ${n.deliveryErrorCount} row(s) with a recorded delivery error (invocation failed to spawn -- see delivery_error)`:"";return`${s}
2352
2352
  ${n.dueNowCount} failed row(s) due for retry now${o}`}import{closeSync as tne,existsSync as nne,openSync as rne,readFileSync as Tw,readSync as sne,realpathSync as one,statSync as ine}from"node:fs";var qte="member_health:";function fw(e,t){return`${qte}${e}:${t}`}function _$(e,t,n,r){let s={kind:r.kind,observedAt:r.nowIso??new Date().toISOString(),remedy:r.remedy};e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(fw(t,n),JSON.stringify(s))}function $l(e,t,n){let r=e.prepare("SELECT v FROM kv WHERE k = ?").get(fw(t,n));if(r===void 0)return null;try{let s=JSON.parse(r.v);return s.kind!=="evicted"||typeof s.observedAt!="string"||typeof s.remedy!="string"?null:{kind:"evicted",observedAt:s.observedAt,remedy:s.remedy}}catch{return null}}function g$(e,t,n){e.prepare("DELETE FROM kv WHERE k = ?").run(fw(t,n))}function E$(e,t){let n=t.title.trim();if(n.length===0)throw new Error("prompt: task title must not be blank");let r=new Date().toISOString(),s=e.prepare("INSERT INTO prompt_tasks(title, description, created_at) VALUES (?, ?, ?)").run(n,t.description??"",r);return e.prepare("SELECT * FROM prompt_tasks WHERE id = ?").get(s.lastInsertRowid)}function Ml(e,t){return e.prepare("SELECT * FROM prompt_tasks WHERE id = ?").get(t)??null}function y$(e,t){let n=t.prompt.trim();if(n.length===0)throw new Error("prompt: prompt must not be blank");let r=new Date().toISOString(),s=e.prepare("INSERT INTO task_prompts(task_id, from_id, to_id, prompt, created_at) VALUES (?, ?, ?, ?, ?)").run(t.taskId,t.fromId,t.toId,n,r);return e.prepare("SELECT * FROM task_prompts WHERE id = ?").get(s.lastInsertRowid)}function w$(e,t){return e.prepare("SELECT * FROM task_prompts WHERE task_id = ? ORDER BY id ASC").all(t)}function T$(e,t){return e.prepare("SELECT * FROM task_prompts WHERE to_id = ? AND retrieved_ts IS NULL ORDER BY id ASC").all(t)}function v$(e,t){return e.transaction(r=>{let s=e.prepare("SELECT * FROM task_prompts WHERE to_id = ? AND retrieved_ts IS NULL ORDER BY id").all(r);if(s.length===0)return s;let o=new Date().toISOString(),i=e.prepare("UPDATE task_prompts SET retrieved_ts = ? WHERE id = ? AND retrieved_ts IS NULL");for(let a of s)i.run(o,a.id),a.retrieved_ts=o;return s})(t)}function S$(e,t){return e.prepare("SELECT task_id FROM task_prompts WHERE from_id = ? OR to_id = ? ORDER BY id DESC LIMIT 1").get(t,t)?.task_id??null}function b$(e,t){let n=e.prepare("SELECT * FROM task_prompts WHERE id = ?").get(t.promptId);if(n===void 0)throw new Error(`prompt: prompt #${t.promptId} does not exist`);if(Ml(e,t.toTaskId)===null)throw new Error(`prompt: --task ${t.toTaskId} does not refer to an existing prompt task`);return e.transaction(()=>{e.prepare("INSERT INTO prompt_task_reassignments(prompt_id, from_task_id, to_task_id, reassigned_by, reassigned_at) VALUES (?, ?, ?, ?, ?)").run(t.promptId,n.task_id,t.toTaskId,t.reassignedBy,new Date().toISOString()),e.prepare("UPDATE task_prompts SET task_id = ? WHERE id = ?").run(t.toTaskId,t.promptId)}).immediate(),e.prepare("SELECT * FROM task_prompts WHERE id = ?").get(t.promptId)}function A$(e,t){return e.prepare("SELECT * FROM prompt_task_reassignments WHERE prompt_id = ? ORDER BY id ASC").all(t)}function I$(e,t){return e.prepare(`SELECT task_id, MAX(created_at) AS last_message_at, COUNT(*) AS message_count
2353
2353
  FROM task_prompts
@@ -2360,12 +2360,12 @@ ${n.dueNowCount} failed row(s) due for retry now${o}`}import{closeSync as tne,ex
2360
2360
  FROM queue q
2361
2361
  LEFT JOIN answers r ON r.prompt_queue_id = q.id AND r.superseded_at IS NULL
2362
2362
  WHERE q.from_id = ?
2363
- `,s=[t];return n&&n.length>0&&(r+=` AND q.id IN (${n.map(()=>"?").join(",")})`,s.push(...n)),r+=" ORDER BY q.id DESC",e.prepare(r).all(...s).map(i=>({row:i,answer:i.ans_id===null?null:{id:i.ans_id,answeredAt:i.ans_answered_at,text:i.ans_text,supersededCount:i.ans_superseded}}))}function O$(e){return e.filter(t=>t.answer===null&&t.row.retracted_ts===null&&t.row.merged_into_id===null)}function D$(e,t){let n=t??process.env.LMBEE_SENDER_PULL_SEEN_DIR??C$(zte(),".lmbee","sender-pull-seen");return C$(n,`${e}.json`)}function gw(e){try{let t=JSON.parse(Jte(e,"utf8"));return new Map(Object.entries(t).map(([n,r])=>[Number(n),r]))}catch{return new Map}}function $$(e,t){let n=Qte(e);Xte(n)||Vte(n,{recursive:!0});let r={};for(let[o,i]of t)r[String(o)]=i;let s=`${e}.tmp`;Kte(s,JSON.stringify(r,null,1)),Yte(s,e)}var Zte=["team","escalation_attempt_count","last_escalation_attempt_ts","quota_exhausted_last_seen_ts","quota_exhausted_message"],Ew=Zte.join(", ");function ene(e,t){return e.prepare(`SELECT ${Ew} FROM team_progress WHERE team = ?`).get(t)??null}function M$(e,t){let n=e-Date.parse(t);return Number.isFinite(n)?n:null}function P$(e,t,n){function r(m,p){return t?e.prepare(`SELECT to_id, ${p} AS ts FROM queue WHERE status = ? AND to_id = ?`).all(m,t):e.prepare(`SELECT to_id, ${p} AS ts FROM queue WHERE status = ?`).all(m)}function s(m){let p=new Map;for(let h of m){let _=p.get(h.to_id);_?_.push(h.ts):p.set(h.to_id,[h.ts])}return p}let o=m=>{let p=m.reduce((h,_)=>h===null||_!==null&&_<h?_:h,null);return p===null?null:M$(n,p)},i=m=>{let p=m.filter(_=>_!==null);if(p.length===0)return 0;let h=o(p);return h===null||!m.includes(null)?h:Math.max(0,h)},a=s(r("pending","created_ts")),c=s(r("escalating","escalation_claimed_ts")),l=m=>({escalationAttemptCount:m?.escalation_attempt_count??0,lastEscalationAttemptTs:m?.last_escalation_attempt_ts??null,quotaExhaustedLastSeenAgeMs:m?.quota_exhausted_last_seen_ts?M$(n,m.quota_exhausted_last_seen_ts):null,quotaExhaustedMessage:m?.quota_exhausted_message??null}),d=new Set([...a.keys(),...c.keys()]),u=[...d].map(m=>{let p=a.get(m)??[],h=c.get(m)??[];return{toId:m,pendingCount:p.length,oldestPendingAgeMs:p.length>0?o(p):null,escalatingCount:h.length,oldestEscalatingAgeMs:h.length>0?i(h):null,...l(ene(e,m))}}),f=t?e.prepare(`SELECT ${Ew} FROM team_progress WHERE team = ? AND escalation_attempt_count > 0`).all(t):e.prepare(`SELECT ${Ew} FROM team_progress WHERE escalation_attempt_count > 0`).all();for(let m of f)d.has(m.team)||u.push({toId:m.team,pendingCount:0,oldestPendingAgeMs:null,escalatingCount:0,oldestEscalatingAgeMs:null,...l(m)});return u.sort((m,p)=>(p.oldestPendingAgeMs??-1)-(m.oldestPendingAgeMs??-1)),u}var Ir=Cn(Jn(),1);var ane=[".md",".txt",".json",".log",".yaml",".yml",".csv",".html",".htm",".xml"];function cne(e){if(/\s/.test(e)||!(e.startsWith("/")||e.startsWith("./")||ane.some(n=>e.toLowerCase().endsWith(n))))return!1;try{return nne(e)}catch{return!1}}function lne(e,t){return new Error(`${e}: prompt body looks like a file path that exists on disk: "${t}"
2363
+ `,s=[t];return n&&n.length>0&&(r+=` AND q.id IN (${n.map(()=>"?").join(",")})`,s.push(...n)),r+=" ORDER BY q.id DESC",e.prepare(r).all(...s).map(i=>({row:i,answer:i.ans_id===null?null:{id:i.ans_id,answeredAt:i.ans_answered_at,text:i.ans_text,supersededCount:i.ans_superseded}}))}function O$(e){return e.filter(t=>t.answer===null&&t.row.retracted_ts===null&&t.row.merged_into_id===null)}function D$(e,t){let n=t??process.env.LMBEE_SENDER_PULL_SEEN_DIR??C$(zte(),".lmbee","sender-pull-seen");return C$(n,`${e}.json`)}function gw(e){try{let t=JSON.parse(Jte(e,"utf8"));return new Map(Object.entries(t).map(([n,r])=>[Number(n),r]))}catch{return new Map}}function $$(e,t){let n=Qte(e);Xte(n)||Vte(n,{recursive:!0});let r={};for(let[o,i]of t)r[String(o)]=i;let s=`${e}.tmp`;Kte(s,JSON.stringify(r,null,1)),Yte(s,e)}var Zte=["team","escalation_attempt_count","last_escalation_attempt_ts","quota_exhausted_last_seen_ts","quota_exhausted_message"],Ew=Zte.join(", ");function ene(e,t){return e.prepare(`SELECT ${Ew} FROM team_progress WHERE team = ?`).get(t)??null}function M$(e,t){let n=e-Date.parse(t);return Number.isFinite(n)?n:null}function P$(e,t,n){function r(m,p){return t?e.prepare(`SELECT to_id, ${p} AS ts FROM queue WHERE status = ? AND to_id = ?`).all(m,t):e.prepare(`SELECT to_id, ${p} AS ts FROM queue WHERE status = ?`).all(m)}function s(m){let p=new Map;for(let h of m){let _=p.get(h.to_id);_?_.push(h.ts):p.set(h.to_id,[h.ts])}return p}let o=m=>{let p=m.reduce((h,_)=>h===null||_!==null&&_<h?_:h,null);return p===null?null:M$(n,p)},i=m=>{let p=m.filter(_=>_!==null);if(p.length===0)return 0;let h=o(p);return h===null||!m.includes(null)?h:Math.max(0,h)},a=s(r("pending","created_ts")),c=s(r("escalating","escalation_claimed_ts")),l=m=>({escalationAttemptCount:m?.escalation_attempt_count??0,lastEscalationAttemptTs:m?.last_escalation_attempt_ts??null,quotaExhaustedLastSeenAgeMs:m?.quota_exhausted_last_seen_ts?M$(n,m.quota_exhausted_last_seen_ts):null,quotaExhaustedMessage:m?.quota_exhausted_message??null}),d=new Set([...a.keys(),...c.keys()]),u=[...d].map(m=>{let p=a.get(m)??[],h=c.get(m)??[];return{toId:m,pendingCount:p.length,oldestPendingAgeMs:p.length>0?o(p):null,escalatingCount:h.length,oldestEscalatingAgeMs:h.length>0?i(h):null,...l(ene(e,m))}}),f=t?e.prepare(`SELECT ${Ew} FROM team_progress WHERE team = ? AND escalation_attempt_count > 0`).all(t):e.prepare(`SELECT ${Ew} FROM team_progress WHERE escalation_attempt_count > 0`).all();for(let m of f)d.has(m.team)||u.push({toId:m.team,pendingCount:0,oldestPendingAgeMs:null,escalatingCount:0,oldestEscalatingAgeMs:null,...l(m)});return u.sort((m,p)=>(p.oldestPendingAgeMs??-1)-(m.oldestPendingAgeMs??-1)),u}var kr=Cn(Jn(),1);var ane=[".md",".txt",".json",".log",".yaml",".yml",".csv",".html",".htm",".xml"];function cne(e){if(/\s/.test(e)||!(e.startsWith("/")||e.startsWith("./")||ane.some(n=>e.toLowerCase().endsWith(n))))return!1;try{return nne(e)}catch{return!1}}function lne(e,t){return new Error(`${e}: prompt body looks like a file path that exists on disk: "${t}"
2364
2364
  Did you mean @${t} ?
2365
2365
  Pass --literal if you really meant to send the path as text.`)}function Zs(e,t,n){if(t.startsWith("@"))return Tw(t.slice(1),"utf8");if(!n&&cne(t))throw lne(e,t);return t}async function q$(e,t,n,r){let{baseId:s,alias:o}=wo(t);if(s!=="operator"&&!e.teams.some(y=>y.name===s)){let y=Pl(e.db.db,e.teams,s);y!==null&&(s=y.team,o=o??y.alias,t=o!==null?`${s}:${o}`:s)}let i=`pending; the cron will deliver it -- or run: queue deliver ${s}`,a=e.teams.find(y=>y.name===s);if(a&&K(a)){let y=o??a.leadAlias,E=ho(a);if(E.length>0&&!E.some(T=>T.alias===y))throw new Error(`enqueue: "${y}" is not a configured member of team "${s}" -- actual members: ${E.map(T=>T.alias).join(", ")}`)}if(r.inReplyTo!==void 0&&ms(e.db.db,r.inReplyTo)===null)throw new Error(`enqueue: --in-reply-to ${r.inReplyTo} does not refer to an existing queue prompt`);let c=r.isInteractiveTerminal??(process.stdin.isTTY===!0&&process.stdout.isTTY===!0),l=r.from==="operator"&&c,d=Zs("enqueue",n,r.literal),u=Ne(e.db.db,e.teams,t,d,{from:r.from,...r.expectsResponse!==void 0?{expectsResponse:r.expectsResponse}:{},...r.inReplyTo!==void 0?{inReplyTo:r.inReplyTo}:{},...l?{operatorPriority:!0}:{}}),m=(r.readSiteLockStateImpl??Ol)(e.db.path),p=m.kind==="free"?"warning: no lmbee daemon appears to be running against this database -- queue delivery, mail polling, and anti-churn nudging are all offline; this prompt will sit undelivered until `lmbee serve` is started (or deliver it manually with `queue deliver`).\n":m.kind==="unknown"?`warning: could not confirm whether an lmbee daemon is running against this database (the site lock could not be read) -- this is not evidence it is down.
2366
2366
  `:"",h=a&&K(a)?dne(e,a,o??a.leadAlias,t):"",g=(r.inReplyTo===void 0?ms(e.db.db,u):null)?.expects_response===1&&!une(d)?`warning: expects-response is set but this prompt does not look like it is asking a question (no "?") -- consider --expects-response false if this is informational.
2367
- `:"",w=p+h+g;if(a&&K(a))try{let E=await(r.fetchReport??Je)();if(wt(a,E))return`${w}queued#${u} -> ${t} (pending; ${s} is presence-gated right now -- it won't push-deliver until that interactive session ends. ${s} can pull it early with \`queue retrieve ${s}\`, or you can check back later with \`queue deliver ${s}\`)`}catch{}return`${w}queued#${u} -> ${t} (${i})`}function dne(e,t,n,r){let s;try{s=re(t)}catch{return""}let o=ir(t,n),i=o!==null?Kt(e.db.db,o):null,a=$l(e.db.db,s,n);if((i===null||!i.disabled)&&a===null)return"";let c=[];if(i!==null&&i.disabled){let f=i.config?.expiresAt?`disabled until ${i.config.expiresAt}`:"disabled indefinitely";c.push(`${r} is on ${o}, ${f}`)}a!==null&&c.push(`${r} was last observed evicted at ${a.observedAt} -- remedy: ${a.remedy}`);let l=f=>f.alias===n||f.provider===null||Kt(e.db.db,f.provider).disabled?!1:$l(e.db.db,s,f.alias)===null,d=ho(t).filter(l).map(f=>f.alias),u=d.length>0?`live seats on this team: ${d.join(", ")}`:"no other known-live seats on this team";return`warning: ${c.join("; ")}; ${u}.
2368
- `}function une(e){return e.includes("?")}function vw(e,t){return{queue:uh(e.db.db,t)}}function H$(e,t,n={}){if(n.json)return JSON.stringify(vw(e,t));let r=uh(e.db.db,t).map(s=>[String(s.id),(0,Ir.escapeCell)(s.from_id),(0,Ir.escapeCell)(s.to_id),(0,Ir.escapeCell)(s.status),ke(s.created_ts),s.sent_ts!==null?ke(s.sent_ts):s.retrieved_ts!==null?ke(s.retrieved_ts):"-"]);return(0,Ir.formatTable)([["ID","FROM","TO","STATUS","CREATED","SENT/RETRIEVED"],...r])}function Ia(e,t){return ms(e.db.db,t)}function W$(e,t,n={}){let r=Ia(e,t);return n.json?JSON.stringify(r?{queue:r}:je("queue_not_found",`no queue entry ${t}`)):r?`queue#${r.id} ${r.from_id} -> ${r.to_id} [${r.status}] prompt=${r.prompt_file} created ${r.created_ts} sent ${r.sent_ts??"-"} retrieved ${r.retrieved_ts??"-"}`:`no queue entry ${t}`}var yw=64*1024;function U$(e){if(e===null)return null;let t=Buffer.byteLength(e.answer_text,"utf8");if(t<=yw)return{...e,byteLength:t,totalBytes:t,truncated:!1};let n=Buffer.from(e.answer_text,"utf8").subarray(0,yw).toString("utf8");for(;Buffer.byteLength(n,"utf8")>yw;)n=n.slice(0,-1);return{...e,answer_text:n,byteLength:Buffer.byteLength(n,"utf8"),totalBytes:t,truncated:!0}}function Ul(e,t){let n=ms(e.db.db,t);if(n===null)return null;let r=ut(e.db.db,t),s=GC(e.db.db,t).map(o=>U$(o)).filter(o=>o!==null);return{id:n.id,createdAt:n.created_ts,answer:U$(r),answerHistory:s,mergedInto:n.status==="merged"?My(e.db.db,n)?.id??null:null,...jn(n,r)}}function B$(e,t,n={}){let r=Ul(e,t);if(n.json)return JSON.stringify(r?{state:r}:je("queue_not_found",`no queue entry ${t}`));if(r===null)return`no queue entry ${t}`;let s;if(r.answerHistory.length>1){let i=r.answerHistory.map(a=>{let c=a.superseded_at!==null?`superseded ${a.superseded_at}`:"current";return` answered ${a.answered_at} (${c}): ${a.answer_text}${a.truncated?` \u2026 [truncated, ${a.totalBytes} bytes total]`:""}`});s=`
2367
+ `:"",w=p+h+g;if(a&&K(a))try{let E=await(r.fetchReport??Je)();if(Tt(a,E))return`${w}queued#${u} -> ${t} (pending; ${s} is presence-gated right now -- it won't push-deliver until that interactive session ends. ${s} can pull it early with \`queue retrieve ${s}\`, or you can check back later with \`queue deliver ${s}\`)`}catch{}return`${w}queued#${u} -> ${t} (${i})`}function dne(e,t,n,r){let s;try{s=re(t)}catch{return""}let o=ir(t,n),i=o!==null?Kt(e.db.db,o):null,a=$l(e.db.db,s,n);if((i===null||!i.disabled)&&a===null)return"";let c=[];if(i!==null&&i.disabled){let f=i.config?.expiresAt?`disabled until ${i.config.expiresAt}`:"disabled indefinitely";c.push(`${r} is on ${o}, ${f}`)}a!==null&&c.push(`${r} was last observed evicted at ${a.observedAt} -- remedy: ${a.remedy}`);let l=f=>f.alias===n||f.provider===null||Kt(e.db.db,f.provider).disabled?!1:$l(e.db.db,s,f.alias)===null,d=ho(t).filter(l).map(f=>f.alias),u=d.length>0?`live seats on this team: ${d.join(", ")}`:"no other known-live seats on this team";return`warning: ${c.join("; ")}; ${u}.
2368
+ `}function une(e){return e.includes("?")}function vw(e,t){return{queue:uh(e.db.db,t)}}function H$(e,t,n={}){if(n.json)return JSON.stringify(vw(e,t));let r=uh(e.db.db,t).map(s=>[String(s.id),(0,kr.escapeCell)(s.from_id),(0,kr.escapeCell)(s.to_id),(0,kr.escapeCell)(s.status),ke(s.created_ts),s.sent_ts!==null?ke(s.sent_ts):s.retrieved_ts!==null?ke(s.retrieved_ts):"-"]);return(0,kr.formatTable)([["ID","FROM","TO","STATUS","CREATED","SENT/RETRIEVED"],...r])}function Ia(e,t){return ms(e.db.db,t)}function W$(e,t,n={}){let r=Ia(e,t);return n.json?JSON.stringify(r?{queue:r}:je("queue_not_found",`no queue entry ${t}`)):r?`queue#${r.id} ${r.from_id} -> ${r.to_id} [${r.status}] prompt=${r.prompt_file} created ${r.created_ts} sent ${r.sent_ts??"-"} retrieved ${r.retrieved_ts??"-"}`:`no queue entry ${t}`}var yw=64*1024;function U$(e){if(e===null)return null;let t=Buffer.byteLength(e.answer_text,"utf8");if(t<=yw)return{...e,byteLength:t,totalBytes:t,truncated:!1};let n=Buffer.from(e.answer_text,"utf8").subarray(0,yw).toString("utf8");for(;Buffer.byteLength(n,"utf8")>yw;)n=n.slice(0,-1);return{...e,answer_text:n,byteLength:Buffer.byteLength(n,"utf8"),totalBytes:t,truncated:!0}}function Ul(e,t){let n=ms(e.db.db,t);if(n===null)return null;let r=ut(e.db.db,t),s=GC(e.db.db,t).map(o=>U$(o)).filter(o=>o!==null);return{id:n.id,createdAt:n.created_ts,answer:U$(r),answerHistory:s,mergedInto:n.status==="merged"?My(e.db.db,n)?.id??null:null,...jn(n,r)}}function B$(e,t,n={}){let r=Ul(e,t);if(n.json)return JSON.stringify(r?{state:r}:je("queue_not_found",`no queue entry ${t}`));if(r===null)return`no queue entry ${t}`;let s;if(r.answerHistory.length>1){let i=r.answerHistory.map(a=>{let c=a.superseded_at!==null?`superseded ${a.superseded_at}`:"current";return` answered ${a.answered_at} (${c}): ${a.answer_text}${a.truncated?` \u2026 [truncated, ${a.totalBytes} bytes total]`:""}`});s=`
2369
2369
  answer history (${i.length} answers, amended ${i.length-1}x):
2370
2370
  ${i.join(`
2371
2371
  `)}`}else s=r.answer?`
@@ -2391,15 +2391,15 @@ close with: queue answer ${r.map(o=>o.row.id).join(",")} <text|@file> --from ${t
2391
2391
  ... (--full for the rest)`),a.push(d.split(`
2392
2392
  `).map(u=>` ${u}`).join(`
2393
2393
  `)),a.push("")}}return!o&&!n.all&&!n.open&&a.push(`-- ${i.length} unpulled answer(s). \`--mark\` to clear, \`--full\` for whole text.`),a.join(`
2394
- `).replace(/\n+$/,"")}function Aw(e,t,n=Date.now()){return{stats:P$(e.db.db,t,n)}}function mne(e){let t=e/36e5;return t<24?`${Math.round(t)}h ago`:`${Math.round(t/24)}d ago`}function iM(e,t,n={}){let r=Aw(e,t);if(n.json)return JSON.stringify(r);if(r.stats.length===0)return t?`queue stats ${t}: nothing pending`:"queue stats: nothing pending anywhere";let s=r.stats.map(o=>[(0,Ir.escapeCell)(o.toId),String(o.pendingCount),o.oldestPendingAgeMs!==null?ve(o.oldestPendingAgeMs):"-",String(o.escalatingCount),o.oldestEscalatingAgeMs!==null?ve(o.oldestEscalatingAgeMs):"-",String(o.escalationAttemptCount),o.lastEscalationAttemptTs!==null?ke(o.lastEscalationAttemptTs):"-",o.quotaExhaustedLastSeenAgeMs!==null?mne(o.quotaExhaustedLastSeenAgeMs):"-"]);return(0,Ir.formatTable)([["TO","PENDING","OLDEST AGE","ESCALATING","ESCALATING AGE","ESCALATION ATTEMPTS","LAST ESCALATION","QUOTA EXHAUSTED"],...s])}function aM(e,t){let n=(t??7)*24*60*6e4;return`queue gc: removed ${RS(e.db.db,{retentionMs:n})} prompt file(s) older than ${t??7} day(s)`}function pne(e,t,n){let r=R$(e.db.db,t);if(n)return JSON.stringify(r.map(({row:o,canonical:i})=>({id:o.id,from:o.from_id,to:o.to_id,created_ts:o.created_ts,merged_into_id:i.id})));if(r.length===0)return`queue doctor${t?` ${t}`:""} --swallowed: no expects_response rows silently absorbed by a false-canonical merge`;let s=[`queue doctor${t?` ${t}`:""} --swallowed: ${r.length} expects_response row(s) folded into a canonical that itself reads as "nothing owed" -- REPORT ONLY, triage each before repairing anything:`,""];for(let{row:o,canonical:i}of r){let a="(prompt file unreadable)";try{a=Tw(o.prompt_file,"utf8").split(`
2394
+ `).replace(/\n+$/,"")}function Aw(e,t,n=Date.now()){return{stats:P$(e.db.db,t,n)}}function mne(e){let t=e/36e5;return t<24?`${Math.round(t)}h ago`:`${Math.round(t/24)}d ago`}function iM(e,t,n={}){let r=Aw(e,t);if(n.json)return JSON.stringify(r);if(r.stats.length===0)return t?`queue stats ${t}: nothing pending`:"queue stats: nothing pending anywhere";let s=r.stats.map(o=>[(0,kr.escapeCell)(o.toId),String(o.pendingCount),o.oldestPendingAgeMs!==null?ve(o.oldestPendingAgeMs):"-",String(o.escalatingCount),o.oldestEscalatingAgeMs!==null?ve(o.oldestEscalatingAgeMs):"-",String(o.escalationAttemptCount),o.lastEscalationAttemptTs!==null?ke(o.lastEscalationAttemptTs):"-",o.quotaExhaustedLastSeenAgeMs!==null?mne(o.quotaExhaustedLastSeenAgeMs):"-"]);return(0,kr.formatTable)([["TO","PENDING","OLDEST AGE","ESCALATING","ESCALATING AGE","ESCALATION ATTEMPTS","LAST ESCALATION","QUOTA EXHAUSTED"],...s])}function aM(e,t){let n=(t??7)*24*60*6e4;return`queue gc: removed ${RS(e.db.db,{retentionMs:n})} prompt file(s) older than ${t??7} day(s)`}function pne(e,t,n){let r=R$(e.db.db,t);if(n)return JSON.stringify(r.map(({row:o,canonical:i})=>({id:o.id,from:o.from_id,to:o.to_id,created_ts:o.created_ts,merged_into_id:i.id})));if(r.length===0)return`queue doctor${t?` ${t}`:""} --swallowed: no expects_response rows silently absorbed by a false-canonical merge`;let s=[`queue doctor${t?` ${t}`:""} --swallowed: ${r.length} expects_response row(s) folded into a canonical that itself reads as "nothing owed" -- REPORT ONLY, triage each before repairing anything:`,""];for(let{row:o,canonical:i}of r){let a="(prompt file unreadable)";try{a=Tw(o.prompt_file,"utf8").split(`
2395
2395
  `)[0]??""}catch{}s.push(` #${o.id} from ${o.from_id} to ${o.to_id}, ${ke(o.created_ts)} -- merged into #${i.id}: "${a}"`)}return s.join(`
2396
2396
  `)}function cM(e,t,n={}){if(n.swallowed===!0)return pne(e,t,n.json);if(n.repair===!0){let l=k$(e.db.db,t);if(n.json)return JSON.stringify({repaired:l.repaired,unverified:l.unverified.map(u=>u.id)});let d=[`queue doctor${t?` ${t}`:""}: repaired ${l.repaired} row(s) with a verified merge target`];return l.unverified.length>0&&(d.push(`${l.unverified.length} row(s) could NOT be verified (left untouched, original content still in their own prompt_file):`),d.push(...l.unverified.map(u=>` #${u.id} from ${u.from_id} to ${u.to_id} (${u.created_ts}) prompt=${u.prompt_file}`))),d.join(`
2397
- `)}let r=mw(e.db.db,t);if(n.json)return JSON.stringify(r.map(({row:l,verifiedTarget:d})=>({id:l.id,from:l.from_id,to:l.to_id,created_ts:l.created_ts,verifiedTarget:d?.id??null})));if(r.length===0)return`queue doctor${t?` ${t}`:""}: no orphan-merged rows (status='merged' AND merged_into_id IS NULL)`;let s=r.filter(l=>l.verifiedTarget!==null),o=r.filter(l=>l.verifiedTarget===null),i=new Map;for(let{row:l,verifiedTarget:d}of r){let u=i.get(l.to_id)??{verified:0,unverified:0};d!==null?u.verified++:u.unverified++,i.set(l.to_id,u)}let a=[...i.entries()].sort((l,d)=>d[1].unverified-l[1].unverified||d[1].verified-l[1].verified),c=[`queue doctor${t?` ${t}`:""}: ${r.length} orphan-merged row(s) -- ${s.length} verified delivered (run --repair to record), ${o.length} genuine unknown(s)`,...(0,Ir.formatTable)([["RECIPIENT","VERIFIED","UNVERIFIED"],...a.map(([l,d])=>[(0,Ir.escapeCell)(l),String(d.verified),String(d.unverified)])]).split(`
2397
+ `)}let r=mw(e.db.db,t);if(n.json)return JSON.stringify(r.map(({row:l,verifiedTarget:d})=>({id:l.id,from:l.from_id,to:l.to_id,created_ts:l.created_ts,verifiedTarget:d?.id??null})));if(r.length===0)return`queue doctor${t?` ${t}`:""}: no orphan-merged rows (status='merged' AND merged_into_id IS NULL)`;let s=r.filter(l=>l.verifiedTarget!==null),o=r.filter(l=>l.verifiedTarget===null),i=new Map;for(let{row:l,verifiedTarget:d}of r){let u=i.get(l.to_id)??{verified:0,unverified:0};d!==null?u.verified++:u.unverified++,i.set(l.to_id,u)}let a=[...i.entries()].sort((l,d)=>d[1].unverified-l[1].unverified||d[1].verified-l[1].verified),c=[`queue doctor${t?` ${t}`:""}: ${r.length} orphan-merged row(s) -- ${s.length} verified delivered (run --repair to record), ${o.length} genuine unknown(s)`,...(0,kr.formatTable)([["RECIPIENT","VERIFIED","UNVERIFIED"],...a.map(([l,d])=>[(0,kr.escapeCell)(l),String(d.verified),String(d.unverified)])]).split(`
2398
2398
  `)];return o.length>0&&(c.push("","Unverified rows (no delivered target found anywhere; original content still in their own prompt_file):"),c.push(...o.map(({row:l})=>` #${l.id} from ${l.from_id} to ${l.to_id} (${l.created_ts}) prompt=${l.prompt_file}`))),c.join(`
2399
- `)}import{readFileSync as hne,statSync as _ne}from"node:fs";var ka=Cn(Jn(),1);function zm(e,t,n){let r;try{r=_ne(t)}catch{return{output:`error: source not found: ${t}`,ok:!1}}if(!r.isFile())return{output:`error: source must be a regular file (a teams.conf-style TSV or a teams.md), not a directory: ${t}`,ok:!1};let s=t.toLowerCase(),o=s.endsWith(".md");if(!o&&!s.endsWith(".conf"))return{output:`error: source must end in .conf or .md: ${t}`,ok:!1};let i;try{i=hne(t,"utf8")}catch(l){return{output:`error: could not read source ${t}: ${l instanceof Error?l.message:String(l)}`,ok:!1}}let a=o?Qp(i):nc(i);if(a.length===0)return{output:`error: source parsed to zero teams, not registered: ${t}`,ok:!1};_d(e.db.db,t,n??null);let c=a.map(l=>l.name).join(", ");return{output:`source added: ${t} (${a.length} team${a.length===1?"":"s"}: ${c})`,ok:!0}}function Iw(e){return{defaultTeamsConfPath:e.teamsConfPath,sources:Zp(e.db.db)}}function lM(e,t={}){let n=Iw(e);if(t.json)return JSON.stringify(n);let r=["-",(0,ka.escapeCell)(n.defaultTeamsConfPath),"(default, always scanned)"],s=n.sources.map(o=>[String(o.id),(0,ka.escapeCell)(o.path),(0,ka.escapeCell)(o.label??"")]);return(0,ka.formatTable)([["ID","PATH","LABEL"],r,...s])}function dM(e,t){return gd(e.db.db,t),`source removed: ${t}`}import{execFile as gne}from"node:child_process";import{promisify as Ene}from"node:util";var Ra=Cn(Jn(),1);var yne=Ene(gne);function uM(e,t){return{team:t,state:yt(e.db.db,t),progress:fe(e.db.db,t),last_nudged:Ih(e.db.db,t)}}function kw(e){let t=e.teams.map(r=>uM(e,r.name)),n=Ed(e.db.db)??[];return{teams:t,active:n}}function Rw(e,t){return{team:uM(e,t)}}var wne=new Set(["DONE"]);function fM(e,t={}){let n=kw(e),r=t.nonDone?n.teams.filter(i=>!wne.has(i.state?.status??"")):n.teams;if(t.json)return JSON.stringify({...n,teams:r});let s=r.map(i=>[(0,Ra.escapeCell)(i.team),(0,Ra.escapeCell)(i.state?.status??"?"),i.state?.changed_ts?ke(i.state.changed_ts):"-",i.state?.last_ts?ke(i.state.last_ts):"-",(0,Ra.escapeCell)(i.progress?.progress_status??"?"),i.progress?.confirmed_done_ts?"yes":"-"]);return`${(0,Ra.formatTable)([["TEAM","STATUS(self-report)","CHANGED","LAST","PROGRESS","CONFIRMED-DONE"],...s])}
2399
+ `)}import{readFileSync as hne,statSync as _ne}from"node:fs";var ka=Cn(Jn(),1);function zm(e,t,n){let r;try{r=_ne(t)}catch{return{output:`error: source not found: ${t}`,ok:!1}}if(!r.isFile())return{output:`error: source must be a regular file (a teams.conf-style TSV or a teams.md), not a directory: ${t}`,ok:!1};let s=t.toLowerCase(),o=s.endsWith(".md");if(!o&&!s.endsWith(".conf"))return{output:`error: source must end in .conf or .md: ${t}`,ok:!1};let i;try{i=hne(t,"utf8")}catch(l){return{output:`error: could not read source ${t}: ${l instanceof Error?l.message:String(l)}`,ok:!1}}let a=o?Qp(i):nc(i);if(a.length===0)return{output:`error: source parsed to zero teams, not registered: ${t}`,ok:!1};_d(e.db.db,t,n??null);let c=a.map(l=>l.name).join(", ");return{output:`source added: ${t} (${a.length} team${a.length===1?"":"s"}: ${c})`,ok:!0}}function Iw(e){return{defaultTeamsConfPath:e.teamsConfPath,sources:Zp(e.db.db)}}function lM(e,t={}){let n=Iw(e);if(t.json)return JSON.stringify(n);let r=["-",(0,ka.escapeCell)(n.defaultTeamsConfPath),"(default, always scanned)"],s=n.sources.map(o=>[String(o.id),(0,ka.escapeCell)(o.path),(0,ka.escapeCell)(o.label??"")]);return(0,ka.formatTable)([["ID","PATH","LABEL"],r,...s])}function dM(e,t){return gd(e.db.db,t),`source removed: ${t}`}import{execFile as gne}from"node:child_process";import{promisify as Ene}from"node:util";var Ra=Cn(Jn(),1);var yne=Ene(gne);function uM(e,t){return{team:t,state:wt(e.db.db,t),progress:fe(e.db.db,t),last_nudged:Ih(e.db.db,t)}}function kw(e){let t=e.teams.map(r=>uM(e,r.name)),n=Ed(e.db.db)??[];return{teams:t,active:n}}function Rw(e,t){return{team:uM(e,t)}}var wne=new Set(["DONE"]);function fM(e,t={}){let n=kw(e),r=t.nonDone?n.teams.filter(i=>!wne.has(i.state?.status??"")):n.teams;if(t.json)return JSON.stringify({...n,teams:r});let s=r.map(i=>[(0,Ra.escapeCell)(i.team),(0,Ra.escapeCell)(i.state?.status??"?"),i.state?.changed_ts?ke(i.state.changed_ts):"-",i.state?.last_ts?ke(i.state.last_ts):"-",(0,Ra.escapeCell)(i.progress?.progress_status??"?"),i.progress?.confirmed_done_ts?"yes":"-"]);return`${(0,Ra.formatTable)([["TEAM","STATUS(self-report)","CHANGED","LAST","PROGRESS","CONFIRMED-DONE"],...s])}
2400
2400
  active: ${n.active.length?n.active.join(","):"(none)"}`}function mM(e,t,n={}){let{team:r}=Rw(e,t);if(n.json)return JSON.stringify({team:r});let s=r.state?`self-report: ${r.state.status} (changed ${r.state.changed_ts}, last ${r.state.last_ts})`:"self-report: (no state)",o=`progress: ${r.progress?.progress_status??"(never scanned)"}`+(r.progress?.confirmed_done_ts?` -- MAINTAINER-CONFIRMED DONE at ${r.progress.confirmed_done_ts}`:"");return`${t}: ${s}
2401
- ${o}`}function pM(e,t,n,r,s=Date.now()){return Ur(e.db.db,t,n,s),Ht(e.db.db,t,n,s,{note:r||"manual state set"}),`state set ${t} -> ${n}`}function hM(e,t,n,r=Date.now()){let s=new Date(r).toISOString();return Up(e.db.db,t,s),Ht(e.db.db,t,"confirmed-done",r,{note:n||"maintainer confirmed done"}),`${t}: confirmed done at ${s} -- stalled-flagging and auto-nudge suppressed until new work or \`state reopen ${t}\``}async function _M(e,t,n,r=Date.now(),s=yne){let o=fe(e.db.db,t)?.confirmed_done_ts!=null;Up(e.db.db,t,null),Ht(e.db.db,t,"reopened",r,{note:n||"maintainer reopened"});let i=o?`${t}: reopened -- confirmed-done cleared`:`${t}: reopened -- was not confirmed-done, nothing to clear`,a=e.teams.find(c=>c.name===t);if(a===void 0||!K(a))return i;try{let c=await Nl(re(a),a.leadAlias,s);if(!c.sessionResolves){let l=c.provider?` (provider=${c.provider})`:"";return`${i}
2402
- WARNING: ${a.leadAlias}'s own session does not resolve -- session not found${l}. Reopening alone will NOT make this team reachable; run \`lmctl refresh ${t}.lmctl ${a.leadAlias}\` first.`}}catch{}return i}function Nw(e){return{active:Ed(e.db.db)??[]}}function gM(e,t={}){let n=Nw(e);return t.json?JSON.stringify(n):`active: ${n.active.length?n.active.join(","):"(none)"}`}var Na=Cn(Jn(),1);function Tne(e,t){return K(e)?wt(e,t)?"Running":To(e,t)?"Dead(reclaimable)":"Idle":"remote -- delivery only"}async function xw(e,t={}){let n=null;t.live&&(n=await(t.fetchReport??Je)());let r=e.teams.map(d=>{let u=yt(e.db.db,d.name),f=IS(e.db.db,d.name).length,m={team:d.name,status:u?.status??null,changedTs:u?.changed_ts??null,pending:f};return t.live&&n&&(m.live=Tne(d,n)),m}),o=await(t.checkActiveGhAccountImpl??Pm)(),i=o!==null&&!o.matchesPolicy?o:null,c=(t.readSiteLockStateImpl??Ol)(e.db.path),l=c.kind==="held"?{running:!0,pid:c.identity.pid,ownerLabel:c.identity.ownerLabel,startedAt:c.identity.startedAt,unconfirmed:!1}:{running:!1,pid:null,ownerLabel:null,startedAt:null,unconfirmed:c.kind==="unknown"};return{live:t.live===!0,teams:r,ghAccountMismatch:i,daemon:l}}async function EM(e,t={}){let n=await xw(e,t);if(t.json)return JSON.stringify(n);let r=n.live?["TEAM","LAST-STATUS","CHANGED","PENDING","LIVE"]:["TEAM","LAST-STATUS","CHANGED","PENDING"],s=n.teams.map(a=>{let c=[(0,Na.escapeCell)(a.team),(0,Na.escapeCell)(a.status??"?"),a.changedTs===null?"-":ke(a.changedTs),String(a.pending)];return n.live?[...c,(0,Na.escapeCell)(a.live??"")]:c}),o=(0,Na.formatTable)([r,...s]),i=[];return i.push(n.daemon.unconfirmed?"!!! DAEMON STATE COULD NOT BE CONFIRMED -- the site lock could not be read (a transient error, or a race with a concurrent lock operation). This is NOT evidence the daemon is down -- do not act on it as if it were; re-run status, or check `systemctl --user status lmbee.service`. !!!":n.daemon.running?`daemon: running (pid ${n.daemon.pid}, ${n.daemon.ownerLabel}, started ${n.daemon.startedAt})`:"!!! DAEMON NOT RUNNING -- queue delivery, mail polling, and anti-churn nudging are all OFFLINE. A prompt accepted by `enqueue` will sit undelivered until `lmbee serve` is started. !!!"),n.ghAccountMismatch!==null&&i.push(`!!! GH ACCOUNT POLICY MISMATCH: "${n.ghAccountMismatch.account}" is the active account on this machine -- policy requires "${Wy}". DO NOT PUSH until this is switched back. !!!`),i.push(o),i.join(`
2401
+ ${o}`}function pM(e,t,n,r,s=Date.now()){return Fr(e.db.db,t,n,s),Ht(e.db.db,t,n,s,{note:r||"manual state set"}),`state set ${t} -> ${n}`}function hM(e,t,n,r=Date.now()){let s=new Date(r).toISOString();return Up(e.db.db,t,s),Ht(e.db.db,t,"confirmed-done",r,{note:n||"maintainer confirmed done"}),`${t}: confirmed done at ${s} -- stalled-flagging and auto-nudge suppressed until new work or \`state reopen ${t}\``}async function _M(e,t,n,r=Date.now(),s=yne){let o=fe(e.db.db,t)?.confirmed_done_ts!=null;Up(e.db.db,t,null),Ht(e.db.db,t,"reopened",r,{note:n||"maintainer reopened"});let i=o?`${t}: reopened -- confirmed-done cleared`:`${t}: reopened -- was not confirmed-done, nothing to clear`,a=e.teams.find(c=>c.name===t);if(a===void 0||!K(a))return i;try{let c=await Nl(re(a),a.leadAlias,s);if(!c.sessionResolves){let l=c.provider?` (provider=${c.provider})`:"";return`${i}
2402
+ WARNING: ${a.leadAlias}'s own session does not resolve -- session not found${l}. Reopening alone will NOT make this team reachable; run \`lmctl refresh ${t}.lmctl ${a.leadAlias}\` first.`}}catch{}return i}function Nw(e){return{active:Ed(e.db.db)??[]}}function gM(e,t={}){let n=Nw(e);return t.json?JSON.stringify(n):`active: ${n.active.length?n.active.join(","):"(none)"}`}var Na=Cn(Jn(),1);function Tne(e,t){return K(e)?Tt(e,t)?"Running":To(e,t)?"Dead(reclaimable)":"Idle":"remote -- delivery only"}async function xw(e,t={}){let n=null;t.live&&(n=await(t.fetchReport??Je)());let r=e.teams.map(d=>{let u=wt(e.db.db,d.name),f=IS(e.db.db,d.name).length,m={team:d.name,status:u?.status??null,changedTs:u?.changed_ts??null,pending:f};return t.live&&n&&(m.live=Tne(d,n)),m}),o=await(t.checkActiveGhAccountImpl??Pm)(),i=o!==null&&!o.matchesPolicy?o:null,c=(t.readSiteLockStateImpl??Ol)(e.db.path),l=c.kind==="held"?{running:!0,pid:c.identity.pid,ownerLabel:c.identity.ownerLabel,startedAt:c.identity.startedAt,unconfirmed:!1}:{running:!1,pid:null,ownerLabel:null,startedAt:null,unconfirmed:c.kind==="unknown"};return{live:t.live===!0,teams:r,ghAccountMismatch:i,daemon:l}}async function EM(e,t={}){let n=await xw(e,t);if(t.json)return JSON.stringify(n);let r=n.live?["TEAM","LAST-STATUS","CHANGED","PENDING","LIVE"]:["TEAM","LAST-STATUS","CHANGED","PENDING"],s=n.teams.map(a=>{let c=[(0,Na.escapeCell)(a.team),(0,Na.escapeCell)(a.status??"?"),a.changedTs===null?"-":ke(a.changedTs),String(a.pending)];return n.live?[...c,(0,Na.escapeCell)(a.live??"")]:c}),o=(0,Na.formatTable)([r,...s]),i=[];return i.push(n.daemon.unconfirmed?"!!! DAEMON STATE COULD NOT BE CONFIRMED -- the site lock could not be read (a transient error, or a race with a concurrent lock operation). This is NOT evidence the daemon is down -- do not act on it as if it were; re-run status, or check `systemctl --user status lmbee.service`. !!!":n.daemon.running?`daemon: running (pid ${n.daemon.pid}, ${n.daemon.ownerLabel}, started ${n.daemon.startedAt})`:"!!! DAEMON NOT RUNNING -- queue delivery, mail polling, and anti-churn nudging are all OFFLINE. A prompt accepted by `enqueue` will sit undelivered until `lmbee serve` is started. !!!"),n.ghAccountMismatch!==null&&i.push(`!!! GH ACCOUNT POLICY MISMATCH: "${n.ghAccountMismatch.account}" is the active account on this machine -- policy requires "${Wy}". DO NOT PUSH until this is switched back. !!!`),i.push(o),i.join(`
2403
2403
 
2404
2404
  `)}var to=Cn(Jn(),1);function Lw(e){return{teams:e.teams}}function yM(e,t={}){if(t.json)return JSON.stringify(Lw(e));let n=e.teams.map(r=>K(r)?[(0,to.escapeCell)(r.name),(0,to.escapeCell)(r.leadAlias),(0,to.escapeCell)(r.promptName),(0,to.escapeCell)(r.description)]:[(0,to.escapeCell)(r.name),"(remote)","--","--"]);return(0,to.formatTable)([["TEAM","LEAD","PROMPT","WHAT-IT-DOES"],...n])}function vne(e){let t=e.LMCTL_AUTH_URL?.trim()||e.LMCTL_AUTH_BASE_URL?.trim();return t?t.replace(/\/+$/,""):void 0}async function Cw(e={}){let t=e.env??process.env,n=e.resolveAppkeyImpl??Fe,r=e.validateAppkeyImpl??WT,s=vne(t),o;try{o=n({env:t})}catch(a){return{data:je("no_appkey",a instanceof Error?a.message:String(a)),exitCode:3}}let i;try{i=await r(o.appkey,{env:t,...s!==void 0?{authBaseUrl:s}:{}})}catch(a){return{data:je("auth_unreachable",`could not validate appkey: ${a instanceof Error?a.message:String(a)}`),exitCode:4}}return i.valid?{data:{userId:i.userId,label:i.label,appkeySource:o.source},exitCode:0}:{data:je("invalid_appkey",`appkey is invalid (source: ${o.source})`),exitCode:3}}async function wM(e={}){let{data:t,exitCode:n}=await Cw(e);return e.json?{output:JSON.stringify(t),exitCode:n}:"error"in t?{output:t.error.message,exitCode:n}:{output:`user_id: ${t.userId}
2405
2405
  label: ${t.label}
@@ -2411,7 +2411,7 @@ ${a?`<base href="${P(i)}/" />`:""}
2411
2411
  WHERE a.target = ? AND d.status = ? ORDER BY d.decided_at DESC`).all(t.affects,n):e.prepare("SELECT * FROM decisions WHERE status = ? ORDER BY decided_at DESC").all(n),s=e.prepare("SELECT target FROM decision_affects WHERE decision_id = ? ORDER BY target");return r.map(o=>({...o,affects:s.all(o.id).map(i=>i.target)}))}function BM(e){return e.prepare("SELECT * FROM asks WHERE status = 'open' ORDER BY raised_at ASC").all()}function GM(e,t){return e.prepare("SELECT * FROM asks WHERE id = ?").get(t)??null}function XM(e){return e.prepare("SELECT * FROM blocked WHERE status = 'open' ORDER BY raised_at ASC").all()}function ure(){let e=!1,t=0,n=new Set,r=U=>!e&&!document.hidden&&U===t,s=U=>document.getElementById(U),o=(U,B)=>{let W=s(U);W&&(W.textContent=B)},i=(U,B="")=>{let W=document.createElement(U);return W.textContent=B,W},a=U=>U!==null&&typeof U=="object"&&!Array.isArray(U),c=U=>Number.isSafeInteger(U)&&Number(U)>0,l=U=>typeof U=="string"&&Number.isFinite(Date.parse(U)),d=U=>U===null||l(U);async function u(U,B,W,se){n.add(W);let z,ue,J=new Promise((X,Q)=>{z=()=>{ue?.cancel().catch(()=>{}),Q(new Error("Request cancelled or timed out"))},W.signal.addEventListener("abort",z,{once:!0})}),V=setTimeout(()=>W.abort(),15e3),j=async()=>{W.signal.throwIfAborted();let X=await fetch(U,{method:se===void 0?"GET":"POST",signal:W.signal,credentials:"same-origin",cache:"no-store",redirect:"error",headers:{Accept:B==="json"?"application/json":"text/html",...se===void 0?{}:{"Content-Type":"application/x-www-form-urlencoded"}},...se===void 0?{}:{body:se}});if(W.signal.throwIfAborted(),X.status!==200||X.redirected||!X.headers.get("content-type")?.includes(B==="json"?"application/json":"text/html")){let Ee;if(B==="html"&&!X.redirected&&X.headers.get("content-type")?.includes("text/html")){let Ue=await X.text().catch(()=>""),te=/<h1>[^<]*<\/h1>\s*<p>([^<]*)<\/p>/.exec(Ue);te&&te[1]&&(Ee=te[1].replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'"))}else X.body?.cancel().catch(()=>{});let He=new Error(Ee??"Unexpected server response");throw He.status=X.status,He}let Q=X.body?.getReader();if(ue=Q,!Q)throw new Error("Missing response body");let ee=new TextDecoder,ce=0,le="";try{for(;;){let Ee=await Q.read();if(W.signal.throwIfAborted(),Ee.done)break;if(ce+=Ee.value.byteLength,ce>(B==="json"?262144:2e6))throw new Error("Response exceeds safety limit");le+=ee.decode(Ee.value,{stream:!0})}return le+ee.decode()}catch(Ee){throw Q.cancel().catch(()=>{}),Ee}};try{return await Promise.race([j(),J])}finally{clearTimeout(V),W.signal.removeEventListener("abort",z),n.delete(W)}}function f(U,B){if(!a(U)||U.id!==B||!l(U.createdAt)||!d(U.pulledAt)||!d(U.answeredAt))throw new Error("Invalid queue state");let W=U.lifecycle,se=U.lifecycleBasis,z=U.answer;if(!(W==="queued"?se==="dispatched":W==="processing"?se==="confirmed"||se==="dispatched":W==="finished"&&["answer","merged","informational"].includes(String(se))))throw new Error("Invalid lifecycle evidence");if(se==="answer"){if(!a(z)||!c(z.id)||z.prompt_queue_id!==B||typeof z.answer_text!="string"||!l(z.answered_at)||z.answered_at!==U.answeredAt||!l(z.created_at)||typeof z.truncated!="boolean")throw new Error("Invalid correlated answer");let J=new TextEncoder().encode(z.answer_text).length;if(!Number.isSafeInteger(z.byteLength)||z.byteLength!==J||J>65536||!Number.isSafeInteger(z.totalBytes)||Number(z.totalBytes)<J||(z.truncated?Number(z.totalBytes)<=J:z.totalBytes!==J))throw new Error("Invalid response coverage")}else if(z!==null||U.answeredAt!==null)throw new Error("Unexpected answer");if(W==="queued"&&U.pulledAt!==null)throw new Error("Unexpected handling time");return U}let m=s("comm-state"),p=Number(m?.dataset.queueId),h=m?.dataset.mount??"",_,g=null,w=0,y=m?.dataset.lifecycle==="finished";function E(){if(clearTimeout(_),!(!m||!c(p)||e||document.hidden||y||g)){if(w>=60){o("comm-poll-notice","Automatic checks paused after 60 reads. Use Refresh state to check again.");return}_=setTimeout(()=>void T(),Math.min(1e3*1.5**w,1e4))}}async function T(){if(!m||g||e||document.hidden||y||w>=60)return;let U=new AbortController,B=t;g=U,w++;try{let W=await u(`${h}/api/queue/${p}/state`,"json",U);if(!r(B))return;let se=f(JSON.parse(W),p),z=se.lifecycleBasis,ue=se.answer,J=se.lifecycle==="queued"?"Queued":se.lifecycle==="processing"?"Processing":z==="merged"?"Combined":z==="informational"?"Informational":"Replied",V=se.lifecycle==="queued"?"Queued \u2014 waiting for handling":se.lifecycle==="processing"?z==="confirmed"?"Processing \u2014 picked up by inbox":"Processing \u2014 delivery attempted; read not confirmed":z==="merged"?"Finished \u2014 combined with another prompt":z==="informational"?"Finished \u2014 informational, no answer expected":"Finished \u2014 answer recorded",j=z==="merged"?"No separate answer: prompt combined into another prompt.":"No answer expected: this was an informational send.",X=m.dataset.sender??"sender not recorded",Q=m.dataset.recipient??"inbox not recorded",ee=ue?`Answer recorded in the ${Q} inbox for prompt #${p} from ${X}.`:se.lifecycle==="finished"?j:`No answer recorded for prompt #${p} from ${X} to ${Q}.`,ce=i("span",J);ce.className=`status-chip status-${se.lifecycle==="finished"?ue?"replied":"muted":se.lifecycle}`,ce.title=V,m.replaceChildren(ce,i("span",` \xB7 ${V}`)),m.dataset.lifecycle=se.lifecycle,m.dataset.lifecycleBasis=z,o("comm-receipt-summary",ue?"An answer is recorded below.":se.lifecycle==="finished"?j:"No answer recorded yet."),o("comm-response-status",ee),o("comm-response-none",!ue&&se.lifecycle!=="finished"?"No correlated answer recorded yet. Refresh to check again.":""),o("comm-response-meta",ue?`Recorded ${ue.answered_at} \xB7 answer #${ue.id} to prompt #${ue.prompt_queue_id}`:""),o("comm-response",ue?.answer_text??"");let le=s("comm-response");le&&(le.hidden=!ue),o("comm-response-truncation",ue?ue.truncated?`Truncated: ${ue.byteLength} of ${ue.totalBytes} bytes. No continuation endpoint is available.`:`${ue.byteLength} bytes returned.`:""),o("comm-reply-time",ue?.answered_at??"not recorded"),o("comm-handling-observation",`Latest handling evidence: ${se.pulledAt??"not recorded"}${se.pulledAt?z==="confirmed"?" (picked up)":z==="dispatched"?" (delivery attempted)":" (transport or pickup time)":""}`),o("comm-poll-notice",`State checked ${new Date().toISOString()}.`),y=se.lifecycle==="finished"}catch(W){r(B)&&o("comm-poll-notice",`State unavailable; displayed records may be stale. ${W instanceof Error?W.message:String(W)}. Use Refresh state.`)}finally{g===U&&(g=null),E()}}let b=s("comm-composer-container"),A=s("comm-draft-form"),I=null,R=!1,L=!1,N=!1,k=null,D=null,O=U=>Array.from(U.querySelectorAll("input, textarea")),v=(U,B)=>{let W=O(U).filter(se=>se.name===B);if(W.length!==1)throw new Error("Invalid review fields");return W[0]};function S(U,B){let W=O(U).map(se=>({input:se,value:se.value}));k=U,D=U.querySelector('button[type="submit"]'),U.addEventListener("submit",se=>{if(L||e||document.hidden){se.preventDefault();return}for(let z of W)z.input.value=z.value;L=!0,N=!0,B&&(B.disabled=!0),D&&(D.disabled=!0),o("comm-send-status","Submitting through the browser. If the outcome is uncertain, return here and retry this same confirmation.")})}let x=s("comm-confirm-form");if(x&&S(x,s("comm-edit-button")),A?.addEventListener("submit",U=>{N&&U.preventDefault()}),b&&A&&s("compose")){let U=Array.from(b.childNodes),B=A.querySelector('textarea[name="prompt"]'),W=A.querySelector('button[type="submit"]');A.addEventListener("submit",async se=>{if(!B||(se.preventDefault(),I||N||e||document.hidden))return;let z=B.value.replace(/\r\n?/g,`
2412
2412
  `);if(!z.trim()||new TextEncoder().encode(z.replace(/\n/g,`\r
2413
2413
  `)).length>65536){o("comm-composer-notice","Enter a nonblank prompt of at most 64 KiB UTF-8.");return}let ue=t,J=new AbortController;I=J,R=!1,W&&(W.disabled=!0),o("comm-composer-notice","Reviewing prompt\u2026");try{let V=new URL(A.action,window.location.href),j=s("compose")?.dataset.base;if(!j||V.origin!==new URL(window.location.href).origin||V.pathname!==`${j}/review`||V.search||V.hash)throw new Error("Unexpected review destination");let X=()=>{let Z=new URLSearchParams;for(let xe of O(A))xe.name&&!xe.disabled&&Z.append(xe.name,xe.value.replace(/\r\n|\r|\n/g,`\r
2414
- `));return Z.toString()},Q;try{Q=await u(V.href,"html",J,X())}catch(Z){if((Z instanceof Error?Z.status:void 0)!==409||!r(ue))throw Z;o("comm-composer-notice","Session renewing\u2026");let Zt=await u(window.location.href,"html",J);if(!r(ue))return;let jt=new DOMParser().parseFromString(Zt,"text/html").getElementById("comm-draft-form"),_n="";try{jt&&(_n=v(jt,"csrf").value)}catch{}if(!_n)throw Z;v(A,"csrf").value=_n,Q=await u(V.href,"html",J,X())}if(!r(ue))return;let ce=new DOMParser().parseFromString(Q,"text/html").getElementById("comm-confirm-form");if(!ce)throw new Error("Review unavailable; use the native review form after reloading");let le=new URL(ce.getAttribute("action")??"",V.href),Ee=v(ce,"confirmation").value;if(ce.method.toLowerCase()!=="post"||le.origin!==V.origin||le.pathname!==`${j}/prompts`||le.search||le.hash||!Ee||Ee.length>4096||v(ce,"prompt").value!==z)throw new Error("Review did not match the exact prompt");let He=i("div");He.id="comm-review-panel",He.append(i("p","Review prompt to math:Lead"),i("pre",z));let Ue=document.createElement("form");Ue.id="comm-confirm-form",Ue.method="post",Ue.action=le.href;let te=document.createElement("input");te.type="hidden",te.name="confirmation",te.value=Ee;let Oe=document.createElement("textarea");Oe.name="prompt",Oe.hidden=!0,Oe.value=z;let Ct=document.createElement("button");Ct.type="submit",Ct.id="comm-confirm-submit",Ct.textContent="Confirm and queue";let bt=document.createElement("button");bt.type="button",bt.id="comm-edit-button",bt.textContent="Edit prompt";let Zn=i("p");Zn.id="comm-send-status",Zn.setAttribute("role","status"),Ue.append(te,Oe,Ct),He.append(Ue,bt,Zn),bt.addEventListener("click",()=>{N||bt.disabled||(B.value=z,b.replaceChildren(...U),k=null)}),S(Ue,bt),b.replaceChildren(He)}catch(V){r(ue)&&o("comm-composer-notice",`Review unavailable: ${V instanceof Error?V.message:String(V)}. Draft retained; retry review or reload to renew the form. The native flow also works without JavaScript.`)}finally{I===J&&(I=null,W&&!e&&!document.hidden&&(W.disabled=!1),!e&&!document.hidden&&R&&o("comm-composer-notice","Review interrupted; draft retained. Review again when ready."))}})}function C(){I&&(R=!0),t++,clearTimeout(_);for(let U of n)U.abort()}let q=()=>{if(!I&&!N){let U=A?.querySelector('button[type="submit"]');U&&(U.disabled=!1),R&&o("comm-composer-notice","Review interrupted; draft retained. Review again when ready.")}E()},F=()=>{document.hidden?C():q()},M=()=>{e=!0,C()},$=U=>{U.persisted&&(e=!1,k&&L&&(L=!1,D&&(D.disabled=!1,D.textContent="Retry this same confirmation"),o("comm-send-status","Outcome may be uncertain. Retry only this same confirmation, or check the inbox.")),q())};return document.addEventListener("visibilitychange",F),window.addEventListener("pagehide",M),window.addEventListener("pageshow",$),E(),()=>{M(),document.removeEventListener("visibilitychange",F),window.removeEventListener("pagehide",M),window.removeEventListener("pageshow",$)}}var np=`(function () {
2414
+ `));return Z.toString()},Q;try{Q=await u(V.href,"html",J,X())}catch(Z){if((Z instanceof Error?Z.status:void 0)!==409||!r(ue))throw Z;o("comm-composer-notice","Session renewing\u2026");let Zt=await u(window.location.href,"html",J);if(!r(ue))return;let jt=new DOMParser().parseFromString(Zt,"text/html").getElementById("comm-draft-form"),_n="";try{jt&&(_n=v(jt,"csrf").value)}catch{}if(!_n)throw Z;v(A,"csrf").value=_n,Q=await u(V.href,"html",J,X())}if(!r(ue))return;let ce=new DOMParser().parseFromString(Q,"text/html").getElementById("comm-confirm-form");if(!ce)throw new Error("Review unavailable; use the native review form after reloading");let le=new URL(ce.getAttribute("action")??"",V.href),Ee=v(ce,"confirmation").value;if(ce.method.toLowerCase()!=="post"||le.origin!==V.origin||le.pathname!==`${j}/prompts`||le.search||le.hash||!Ee||Ee.length>4096||v(ce,"prompt").value!==z)throw new Error("Review did not match the exact prompt");let He=i("div");He.id="comm-review-panel",He.append(i("p","Review prompt to math:Lead"),i("pre",z));let Ue=document.createElement("form");Ue.id="comm-confirm-form",Ue.method="post",Ue.action=le.href;let te=document.createElement("input");te.type="hidden",te.name="confirmation",te.value=Ee;let Oe=document.createElement("textarea");Oe.name="prompt",Oe.hidden=!0,Oe.value=z;let Ct=document.createElement("button");Ct.type="submit",Ct.id="comm-confirm-submit",Ct.textContent="Confirm and queue";let At=document.createElement("button");At.type="button",At.id="comm-edit-button",At.textContent="Edit prompt";let Zn=i("p");Zn.id="comm-send-status",Zn.setAttribute("role","status"),Ue.append(te,Oe,Ct),He.append(Ue,At,Zn),At.addEventListener("click",()=>{N||At.disabled||(B.value=z,b.replaceChildren(...U),k=null)}),S(Ue,At),b.replaceChildren(He)}catch(V){r(ue)&&o("comm-composer-notice",`Review unavailable: ${V instanceof Error?V.message:String(V)}. Draft retained; retry review or reload to renew the form. The native flow also works without JavaScript.`)}finally{I===J&&(I=null,W&&!e&&!document.hidden&&(W.disabled=!1),!e&&!document.hidden&&R&&o("comm-composer-notice","Review interrupted; draft retained. Review again when ready."))}})}function C(){I&&(R=!0),t++,clearTimeout(_);for(let U of n)U.abort()}let q=()=>{if(!I&&!N){let U=A?.querySelector('button[type="submit"]');U&&(U.disabled=!1),R&&o("comm-composer-notice","Review interrupted; draft retained. Review again when ready.")}E()},F=()=>{document.hidden?C():q()},M=()=>{e=!0,C()},$=U=>{U.persisted&&(e=!1,k&&L&&(L=!1,D&&(D.disabled=!1,D.textContent="Retry this same confirmation"),o("comm-send-status","Outcome may be uncertain. Retry only this same confirmation, or check the inbox.")),q())};return document.addEventListener("visibilitychange",F),window.addEventListener("pagehide",M),window.addEventListener("pageshow",$),E(),()=>{M(),document.removeEventListener("visibilitychange",F),window.removeEventListener("pagehide",M),window.removeEventListener("pageshow",$)}}var np=`(function () {
2415
2415
  function __name(value) { return value; }
2416
2416
  return (${ure.toString()})();
2417
2417
  })();`;var VM=qe("","","").match(/<style>([\s\S]*?)<\/style>/),hre=Uw("sha256").update(VM?VM[1]:"").digest("base64"),_re=Uw("sha256").update(np).digest("base64"),gre=`default-src 'none'; style-src 'sha256-${hre}'; form-action 'self'; base-uri 'none'; frame-ancestors 'none'; script-src 'sha256-${_re}'; connect-src 'self'`,Pw="lmbee_comm_browser",Ere=64*1024,yre=256*1024,La=class extends Error{};function JM(e){let t=new Jo,{context:n}=e,r=(e.mountPath??"").replace(/\/$/,"");if(r&&(!/^\/[A-Za-z0-9_./~-]+$/.test(r)||r.startsWith("//")))throw new Error("Invalid mount path");let s=`${r}/comm/math`,o=e.now??Date.now,i=Mw(32),a=new Map,c=M=>Uw("sha256").update(M).digest("hex"),l=M=>fre("sha256",i).update(M).digest("base64url"),d=M=>{let $=Buffer.from(JSON.stringify(M)).toString("base64url");return`${$}.${l($)}`};function u(M){let $=M.split(".");if($.length!==2||M.length>4096)throw new Error("Invalid confirmation. Review the prompt again.");let U=Buffer.from(l($[0])),B=Buffer.from($[1]);if(U.length!==B.length||!mre(U,B))throw new Error("Invalid confirmation. Review the prompt again.");return JSON.parse(Buffer.from($[0],"base64url").toString("utf8"))}function f(M,$=!1){let U=(M.req.header("cookie")??"").split(";").map(W=>W.trim()).filter(W=>W.startsWith(`${Pw}=`));if(U.length===1)try{let W=u(U[0].slice(Pw.length+1));if(typeof W.browser=="string"&&/^[a-f0-9]{48}$/.test(W.browser))return W.browser}catch{}if(!$)throw new Error("Browser confirmation expired. Open the Math inbox and review again.");let B=Mw(24).toString("hex");return M.header("Set-Cookie",`${Pw}=${d({browser:B})}; Path=${s}; HttpOnly; SameSite=Strict${new URL(M.req.url).protocol==="https:"?"; Secure":""}`),B}function m(){let M=n.teams.find($=>$.name==="math");if(!M||!K(M)||M.leadAlias!=="Lead")throw new Error("The local math Lead inbox is unavailable.");return`${re(M)}:Lead`}function p(M){return M==="merged"||M==="informational"||M==="retracted"}function h(M){return M.answeredAt?`<a href="${s}/prompts/${M.id}#comm-response">Answer to #${M.id}</a> \xB7 ${Ae(M.answeredAt)}`:M.lifecycleBasis==="merged"?"No separate answer (merged)":M.lifecycleBasis==="informational"?"No answer expected (informational)":M.lifecycleBasis==="retracted"?`No answer expected (retracted): ${P(M.retracted_reason??"no reason recorded")}`:"No answer recorded"}function _(M){for(let $ of M.split(`
@@ -2455,10 +2455,10 @@ function __name(value) { return value; }
2455
2455
  return (${Ure.toString()})();
2456
2456
  })();</script>`}function Ure(){let e=document.getElementById("session-detail"),{team:t="",alias:n="",mount:r="",history:s="",canonicalTeamfile:o="",commEnabled:i="false",commPageEnabled:a="false"}=e.dataset,c=j=>document.getElementById(j),l=(j,X)=>{c(j).textContent=X},d=(j,X)=>{let Q=document.createElement(j);return Q.textContent=X,Q},u=new Map,f=!1,m=0,p,h=null,_=0,g=0,w=null,y=null,E=j=>!f&&!document.hidden&&j===m,T=()=>{},b=[],A=!1;function I(j){let X=d("span",j),Q=b.find(ee=>ee.name===j);if(!Q){let ee=A?"Recorded label; current actor unresolved":"Recorded label; current team list unavailable";return X.title=`${j} \u2014 ${ee}`,/[\\/]/.test(j)&&(X.textContent=j.split(/[\\/]/).at(-1).replace(/\.lmctl(?=:|$)/,"")),X}if(Q.channel==="lmmail")return X.textContent+=" (remote inbox)",X;if(Q.channel==="local"&&Q.leadAlias&&j!=="operator"){let ee=d("a",`${Q.name}:${Q.leadAlias}`);ee.title="Current configured inbox lead; not a historical sender session",X.textContent="",ee.href=`${r}/sessions/${encodeURIComponent(Q.name)}/${encodeURIComponent(Q.leadAlias)}`,X.append(ee)}return X}function R(j,X){let Q=d("span","");return Q.append(I(j),d("span"," \u2192 "),I(X)),Q}let L=j=>`${r}/sessions/${encodeURIComponent(t)}/${encodeURIComponent(n)}?queue=${j}`,N=j=>j instanceof Error?j.message:String(j);async function k(j,X){let Q=new AbortController;u.set(Q,X===void 0);let ee=setTimeout(()=>Q.abort(),15e3);try{let ce=await fetch(j,{method:X===void 0?"GET":"POST",signal:Q.signal,credentials:"same-origin",cache:"no-store",redirect:"error",headers:{Accept:"application/json",...X===void 0?{}:{"Content-Type":"application/json"}},...X===void 0?{}:{body:JSON.stringify(X)}});if(!ce.ok)throw new Error(`HTTP ${ce.status}; request unsuccessful`);if(!ce.headers.get("content-type")?.includes("application/json"))throw new Error("Expected JSON response");let le=ce.body.getReader(),Ee=new TextDecoder,He=0,Ue="";for(;;){let te=await le.read();if(te.done)break;if(He+=te.value.byteLength,He>2e6)throw await le.cancel(),new Error("Response exceeds 2 MB limit");Ue+=Ee.decode(te.value,{stream:!0})}return JSON.parse(Ue+Ee.decode())}finally{clearTimeout(ee),u.delete(Q)}}function D(j){return j==="merged"||j==="informational"||j==="retracted"}function O(j,X=!1){if(X){if(j.lifecycle==="queued")return"queued";if(j.lifecycle==="finished")return j.lifecycleBasis==="merged"?"finished \xB7 merged into an earlier message":j.lifecycleBasis==="informational"?"finished \xB7 informational, no reply expected":j.lifecycleBasis==="retracted"?"finished \xB7 retracted, no reply expected":"finished \xB7 reply recorded";if(j.lifecycle==="processing")return j.lifecycleBasis==="confirmed"?"processing \xB7 picked up":"processing \xB7 attempted"}if(j.lifecycle==="finished")return j.lifecycleBasis==="merged"?"finished \u2014 merged into an earlier message, no separate response":j.lifecycleBasis==="informational"?"finished \u2014 informational, no response expected":j.lifecycleBasis==="retracted"?"finished \u2014 retracted, no response expected":"finished \u2014 response recorded";if(j.lifecycle==="queued")return"queued \u2014 waiting for handling";if(j.lifecycle==="processing")return j.lifecycleBasis==="confirmed"?"processing \u2014 picked up by inbox":"processing \u2014 delivery attempted; read not confirmed";throw new Error("Unknown lifecycle in owner response")}let v=null,S=j=>j!==null&&typeof j=="object"&&!Array.isArray(j),x=(j,X)=>typeof j=="string"&&j.trim()?j:X,C=!1;async function q(){if(!C||v===m||f||document.hidden)return;let j=m;v=j,c("session-refresh").disabled=!0;try{let X=await k(s);if(!E(j))return;if(!S(X)||!Array.isArray(X.messages))throw new Error("Recent messages were not supplied by the history source");let Q=X.messages.slice(-20).map(ee=>{let ce=S(ee)?ee:{},le=ce.content==null?"Message content not recorded.":typeof ce.content=="string"?ce.content:JSON.stringify(ce.content),Ee=d("article","");return Ee.append(d("h3",x(ce.role,"Unknown role")),d("p",x(ce.timestamp,"Time not recorded.")),d("pre",le)),Ee});c("session-history").dataset.state="ready",c("session-history").replaceChildren(...Q.length?Q:[d("p","No recent messages returned.")]),l("session-history-status",`Latest ${Q.length} messages.${X.truncated===!0?" Older messages are not shown.":""}`),l("session-source",`Provider ${x(X.provider,"not recorded")}; session ${x(X.sessionId,"not recorded")}. Optional bounded provider tail. ${X.truncated===!0?"Older output truncated. ":""}Fetched ${new Date().toISOString()}.`)}catch(X){E(j)&&(c("session-history").dataset.state="error",c("session-history").children.length===0&&c("session-history").replaceChildren(d("p","Recent messages unavailable.")),l("session-history-status","Recent messages unavailable. Try Refresh transcript."),l("session-source",`History unavailable; previous content may be stale. ${N(X)}`))}finally{v===j&&(v=null),E(j)&&(c("session-refresh").disabled=!1)}}async function F(){if(!o||f||document.hidden)return;let j=m;try{let X=new URLSearchParams({ownerTeam:o,ownerAlias:n,limit:"20"}),Q=await k(`${r}/api/tasks?${X}`);if(!E(j))return;if(!Array.isArray(Q.rows))throw new Error("Invalid task response");c("session-tasks").replaceChildren(d("p","Up to 20 assigned work items."),...Q.rows.slice(0,20).map(ee=>{let ce=d("a",`#${ee.id} ${ee.title} \u2014 ${ee.kind}, ${ee.status}`);ce.href=`${r}/tasks/${Number(ee.id)}`;let le=d("p","");if(le.append(ce),Number.isSafeInteger(ee.parent_id)&&ee.parent_id>0){let Ee=d("a",` Parent work item #${ee.parent_id}`);Ee.href=`${r}/tasks/${ee.parent_id}`,le.append(Ee)}return le}),...Q.rows.length?[]:[d("p","No recorded assignment for this session.")])}catch(X){E(j)&&l("session-tasks",`Assigned work unavailable: ${N(X)}`)}}async function M(){if(w===_||h===null||f||document.hidden)return;w=_;let j=h,X=_,Q=m;try{let ee=await k(`${r}/api/queue/${j}/state`);if(X!==_||!E(Q))return;if(ee.id!==j)throw new Error("Queue identity mismatch");if(ee.lifecycle==="finished"&&!D(ee.lifecycleBasis)&&!ee.answer)throw new Error("Finished state has no correlated response");if(ee.answer&&ee.answer.prompt_queue_id!==j)throw new Error("Answer correlation mismatch");c("comm-state").dataset.queueId=String(j),c("comm-state").dataset.lifecycle=ee.lifecycle,c("comm-state").dataset.lifecycleBasis=ee.lifecycleBasis,l("comm-state",`Queue #${j}: ${O(ee)}. Created ${ee.createdAt}. Last checked ${new Date().toISOString()}.`),ee.answer?l("comm-response",`${ee.answer.answer_text}
2457
2457
  ${ee.answer.truncated?`Truncated response; ${ee.answer.totalBytes} total bytes. No continuation endpoint available.`:""}`):l("comm-response",ee.lifecycleBasis==="merged"?"No separate answer: prompt merged into another prompt.":ee.lifecycleBasis==="informational"?"No answer expected: this was an informational prompt.":ee.lifecycleBasis==="retracted"?"No answer expected: this prompt was retracted.":"Outcome unknown: no reply recorded. This does not establish failure or unread work."),ee.lifecycle!=="finished"&&++g<60?p=setTimeout(()=>void M(),5e3):ee.lifecycle!=="finished"&&l("comm-state",`Queue #${j}: observation stalled \u2014 automatic checks paused after 60 reads; last state ${O(ee)}. Check again manually. This does not establish execution failure.`)}catch(ee){X===_&&E(Q)&&l("comm-state",`State check failed; last content may be stale. ${N(ee)}. Check again manually.`)}finally{w===X&&(w=null)}}async function $(j,X=!1){if(!Number.isSafeInteger(j)||j<1||f||document.hidden)return;c("comm-reading-panel").hidden=!1,y={id:j,admitted:X},clearTimeout(p),h=null,_++,g=0;let Q=_,ee=m;delete c("comm-state").dataset.queueId,delete c("comm-state").dataset.lifecycle,delete c("comm-state").dataset.lifecycleBasis,l("comm-context","Loading recorded endpoints. Related task: not recorded; assigned work shown separately."),l("comm-state",`Loading queue #${j}\u2026`),l("comm-response",""),l("comm-preview","Loading request preview\u2026"),c("comm-check").hidden=!1;let ce=new URL(location.href);ce.searchParams.set("queue",String(j)),window.history.replaceState(null,"",ce);try{let le=await k(`${r}/api/queue/${j}`);if(Q!==_||!E(ee))return;if(le.queue.id!==j)throw new Error("Queue envelope identity mismatch");if(X&&le.queue.to_id!=="math")throw new Error("Admitted receipt is not addressed to math");if(le.queue.to_id!==t&&le.queue.from_id!==t)throw new Error("Queue message does not belong to this team");h=j;let Ee=c("comm-context");if(Ee.replaceChildren(d("span",`Request #${j}: `),R(le.queue.from_id,le.queue.to_id),d("span",". Expected reply context: "),I(le.queue.to_id),d("span",` inbox for prompt #${j} from `),I(le.queue.from_id),d("span",". Check the response status below; a reply may not be recorded. Related task: not recorded; assigned work shown separately.")),typeof le.queue.retracted_reason=="string"&&le.queue.retracted_reason&&Ee.append(d("span",` Retraction reason: ${le.queue.retracted_reason}.`)),a==="true"&&le.queue.to_id==="math"){let Ue=d("a","Open full prompt and answer");Ue.href=`${r}/comm/math/prompts/${j}`,Ee.append(Ue)}let He=await k(`${r}/api/queue/${j}/preview`);if(Q!==_||!E(ee))return;if(He.id!==j)throw new Error("Preview identity mismatch");l("comm-preview",He.status==="available"?`${He.text??""}${He.truncated?`
2458
- [Prompt preview truncated]`:""}`:`Prompt preview ${He.status}; content unavailable.`)}catch(le){Q===_&&E(ee)&&(l("comm-preview",`Prompt preview unavailable: ${N(le)}`),h===null&&l("comm-state","Queue selection unavailable; select a message from this team."))}await M()}let U=null;async function B(){if(U===m||f||document.hidden)return;let j=m;U=j,c("comm-refresh").disabled=!0;try{let X=await k(`${r}/api/teams`).catch(()=>null);if(!E(j))return;b=X?.teams??[],A=X!==null;let Q=b.find(te=>te.name===t),ee=Q?.channel==="local"&&typeof Q.description=="string"?Q.description.trim():"";l("session-purpose",X===null?"Team purpose unavailable.":ee?`Recorded team description: \u201C${ee}\u201D`:"No team purpose recorded.");let ce=await Promise.all(["to","from"].map(async te=>{let Oe=await k(`${r}/api/queue/prompts?${te}=${encodeURIComponent(t)}&limit=20`);if(!Array.isArray(Oe.rows))throw new Error("Invalid message list");return Oe}));if(!E(j))return;let le=new Map;for(let te of ce)for(let Oe of te.rows.slice(0,20)){if(!Number.isSafeInteger(Oe.id)||Oe.id<1)throw new Error("Invalid queue identity");if(Oe.to_id!==t&&Oe.from_id!==t)throw new Error("Message outside current team");let Ct=le.get(Oe.id);(!Ct||Oe.lifecycle==="finished"&&Ct.lifecycle!=="finished")&&le.set(Oe.id,Oe)}let Ee=te=>Number.isFinite(Date.parse(te))?Date.parse(te):Number.MAX_VALUE,Ue=[...le.values()].sort((te,Oe)=>Ee(te.created_ts)-Ee(Oe.created_ts)||te.id-Oe.id).map(te=>{let Oe=d("li","");Oe.dataset.queueId=String(te.id);let Ct=d("a",`Read exchange #${te.id}`);Ct.href=L(te.id),Ct.addEventListener("click",xe=>{xe.defaultPrevented||xe.button!==0||xe.metaKey||xe.ctrlKey||xe.shiftKey||xe.altKey||(xe.preventDefault(),$(te.id))}),Oe.append(Ct);let bt=d("div","");bt.dataset.queueId=String(te.id),bt.dataset.event="request";let Zn=Number.isFinite(Date.parse(te.created_ts))?te.created_ts:"Time not recorded; placed last by request ID",Z=d("span",te.lifecycle==="queued"?"Queued":te.lifecycle==="processing"?"Processing":te.lifecycleBasis==="merged"?"Combined":te.lifecycleBasis==="informational"?"Informational":te.lifecycleBasis==="retracted"?"Retracted":"Replied");if(Z.className=`status-chip status-${te.lifecycle==="queued"?"queued":te.lifecycle==="processing"?"processing":D(te.lifecycleBasis)?"muted":"replied"}`,Z.title=O(te),bt.append(d("p",`Request recorded: ${Zn}`),R(te.from_id,te.to_id),Z),te.from_id===te.to_id&&bt.append(d("p","Self-addressed request.")),te.subject_id!=null&&bt.append(d("p",`Recorded subject label: ${te.subject_id}`)),Oe.append(bt),te.lifecycle==="finished"&&!D(te.lifecycleBasis)){let xe=d("div","");xe.dataset.queueId=String(te.id),xe.dataset.event="response",xe.append(d("span","Answer recorded in "),I(te.to_id),d("span",` inbox for prompt #${te.id} from `),I(te.from_id),d("p",`Recorded reply time: ${te.answeredAt??"Time not recorded"}`));let Zt=d("details",""),jt=d("pre","Open to load the recorded reply.");Zt.append(d("summary","Show reply"),jt);let _n=!1,Ot=!1;Zt.addEventListener("toggle",async()=>{if(!Zt.open||_n||Ot||f||document.hidden)return;let oi=m;Ot=!0,jt.textContent="Loading reply\u2026";try{let ls=await k(`${r}/api/queue/${te.id}/state`);if(!E(oi))return;let Mr=ls.answer;if(ls.id!==te.id||Mr===null||Mr.prompt_queue_id!==te.id)throw new Error("Answer identity mismatch");if(typeof Mr.answer_text!="string")throw new Error("Reply text unavailable");let qt=Array.from(Mr.answer_text);jt.textContent=qt.slice(0,1200).join("")+(qt.length>1200||Mr.truncated?`
2458
+ [Prompt preview truncated]`:""}`:`Prompt preview ${He.status}; content unavailable.`)}catch(le){Q===_&&E(ee)&&(l("comm-preview",`Prompt preview unavailable: ${N(le)}`),h===null&&l("comm-state","Queue selection unavailable; select a message from this team."))}await M()}let U=null;async function B(){if(U===m||f||document.hidden)return;let j=m;U=j,c("comm-refresh").disabled=!0;try{let X=await k(`${r}/api/teams`).catch(()=>null);if(!E(j))return;b=X?.teams??[],A=X!==null;let Q=b.find(te=>te.name===t),ee=Q?.channel==="local"&&typeof Q.description=="string"?Q.description.trim():"";l("session-purpose",X===null?"Team purpose unavailable.":ee?`Recorded team description: \u201C${ee}\u201D`:"No team purpose recorded.");let ce=await Promise.all(["to","from"].map(async te=>{let Oe=await k(`${r}/api/queue/prompts?${te}=${encodeURIComponent(t)}&limit=20`);if(!Array.isArray(Oe.rows))throw new Error("Invalid message list");return Oe}));if(!E(j))return;let le=new Map;for(let te of ce)for(let Oe of te.rows.slice(0,20)){if(!Number.isSafeInteger(Oe.id)||Oe.id<1)throw new Error("Invalid queue identity");if(Oe.to_id!==t&&Oe.from_id!==t)throw new Error("Message outside current team");let Ct=le.get(Oe.id);(!Ct||Oe.lifecycle==="finished"&&Ct.lifecycle!=="finished")&&le.set(Oe.id,Oe)}let Ee=te=>Number.isFinite(Date.parse(te))?Date.parse(te):Number.MAX_VALUE,Ue=[...le.values()].sort((te,Oe)=>Ee(te.created_ts)-Ee(Oe.created_ts)||te.id-Oe.id).map(te=>{let Oe=d("li","");Oe.dataset.queueId=String(te.id);let Ct=d("a",`Read exchange #${te.id}`);Ct.href=L(te.id),Ct.addEventListener("click",xe=>{xe.defaultPrevented||xe.button!==0||xe.metaKey||xe.ctrlKey||xe.shiftKey||xe.altKey||(xe.preventDefault(),$(te.id))}),Oe.append(Ct);let At=d("div","");At.dataset.queueId=String(te.id),At.dataset.event="request";let Zn=Number.isFinite(Date.parse(te.created_ts))?te.created_ts:"Time not recorded; placed last by request ID",Z=d("span",te.lifecycle==="queued"?"Queued":te.lifecycle==="processing"?"Processing":te.lifecycleBasis==="merged"?"Combined":te.lifecycleBasis==="informational"?"Informational":te.lifecycleBasis==="retracted"?"Retracted":"Replied");if(Z.className=`status-chip status-${te.lifecycle==="queued"?"queued":te.lifecycle==="processing"?"processing":D(te.lifecycleBasis)?"muted":"replied"}`,Z.title=O(te),At.append(d("p",`Request recorded: ${Zn}`),R(te.from_id,te.to_id),Z),te.from_id===te.to_id&&At.append(d("p","Self-addressed request.")),te.subject_id!=null&&At.append(d("p",`Recorded subject label: ${te.subject_id}`)),Oe.append(At),te.lifecycle==="finished"&&!D(te.lifecycleBasis)){let xe=d("div","");xe.dataset.queueId=String(te.id),xe.dataset.event="response",xe.append(d("span","Answer recorded in "),I(te.to_id),d("span",` inbox for prompt #${te.id} from `),I(te.from_id),d("p",`Recorded reply time: ${te.answeredAt??"Time not recorded"}`));let Zt=d("details",""),jt=d("pre","Open to load the recorded reply.");Zt.append(d("summary","Show reply"),jt);let _n=!1,Ot=!1;Zt.addEventListener("toggle",async()=>{if(!Zt.open||_n||Ot||f||document.hidden)return;let oi=m;Ot=!0,jt.textContent="Loading reply\u2026";try{let ls=await k(`${r}/api/queue/${te.id}/state`);if(!E(oi))return;let Pr=ls.answer;if(ls.id!==te.id||Pr===null||Pr.prompt_queue_id!==te.id)throw new Error("Answer identity mismatch");if(typeof Pr.answer_text!="string")throw new Error("Reply text unavailable");let qt=Array.from(Pr.answer_text);jt.textContent=qt.slice(0,1200).join("")+(qt.length>1200||Pr.truncated?`
2459
2459
  [Reply excerpt; open the full exchange for available text.]`:""),_n=!0}catch(ls){E(oi)&&(jt.textContent=`Reply unavailable: ${N(ls)}. Close and reopen to retry.`)}finally{Ot=!1}}),xe.append(Zt),Oe.append(xe)}else Oe.append(d("p",te.lifecycleBasis==="merged"?"No separate answer: prompt merged into another prompt.":te.lifecycleBasis==="informational"?"No answer expected: this was an informational prompt.":te.lifecycleBasis==="retracted"?`No answer expected: this prompt was retracted. Reason: ${te.retracted_reason??"no reason recorded"}.`:"Reply: not recorded"));return Oe});c("comm-sequence").replaceChildren(...Ue.slice(-5)),c("comm-older-sequence").replaceChildren(...Ue.slice(0,-5)),c("comm-older").hidden=Ue.length<=5,l("comm-older-label",`Show ${Math.max(0,Ue.length-5)} older loaded prompts`),l("comm-coverage",`Showing newest ${Math.min(5,Ue.length)} of ${le.size} loaded prompts, ordered by arrival, oldest first; answers are grouped with their prompts. ${ce.some(te=>te.meta.next_cursor!==null)?"This is a limited sample; additional records have not been loaded.":"All prompts from the returned pages are available here."}`)}catch(X){E(j)&&l("comm-coverage",`Message context unavailable; previous events may be stale. ${N(X)}`)}finally{U===j&&(U=null),E(j)&&(c("comm-refresh").disabled=!1)}}let W=c("comm-form");if(W&&i==="true"&&t==="math"&&n==="Lead"){let j=c("comm-draft"),X=c("comm-submit"),Q=c("comm-confirm"),ee=c("comm-edit"),ce=null,le=!1,Ee=!1,He="Page paused during admission";T=()=>{f||document.hidden||!ce||!Ee||(Q.disabled=le,le||(l("comm-send-status",`Admission uncertain or failed: ${He}. Retry preserves the exact prompt and dedupe key. Keep this page open until resolved.`),Q.textContent="Retry same prompt safely"))},W.addEventListener("submit",Ue=>{if(Ue.preventDefault(),!(f||document.hidden||le||ce)){if(!j.value.trim()||new TextEncoder().encode(j.value).length>65536){l("comm-send-status","Enter a nonblank prompt of at most 64 KiB UTF-8.");return}ce={to:"math",prompt:j.value,dedupeKey:`localweb:${crypto.randomUUID()}`},j.disabled=!0,X.disabled=!0,l("comm-review",`To math, from operator:
2460
- ${ce.prompt}`),c("comm-review").hidden=!1,Q.hidden=!1,ee.hidden=!1,l("comm-send-status","Review the exact prompt before confirming.")}}),ee.addEventListener("click",()=>{le||Ee||(ce=null,j.disabled=!1,X.disabled=!1,Q.hidden=!0,ee.hidden=!0,c("comm-review").hidden=!0)}),Q.addEventListener("click",async()=>{if(!ce||le||f||document.hidden)return;let Ue=m;le=!0,Ee=!0,Q.disabled=!0,ee.hidden=!0,l("comm-send-status","Submitting; waiting for confirmation that the prompt was queued\u2026");try{let te=await k(`${r}/api/comm/send`,ce);if(!E(Ue))throw new Error("Page paused before receipt could be shown");if(!Number.isSafeInteger(te.queueId)||te.queueId<1)throw new Error("Missing queue receipt");l("comm-send-status",`Accepted as queue #${te.queueId}${te.replayed?" (existing prompt recovered)":""}.`),ce=null,Ee=!1,j.value="",j.disabled=!1,X.disabled=!1,Q.hidden=!0,Q.textContent="Confirm send to math",c("comm-review").hidden=!0,$(te.queueId,!0),B()}catch(te){He=N(te)}finally{le=!1,!f&&!document.hidden&&(Q.disabled=!1),T()}})}c("session-refresh").addEventListener("click",()=>{C=!0,l("session-refresh","Refresh transcript"),q()}),c("comm-refresh").addEventListener("click",()=>void B()),c("comm-check").addEventListener("click",()=>{clearTimeout(p),g=0,M()});let se=j=>{m++,_++,clearTimeout(p),v=null,U=null;for(let[X,Q]of u)(j||Q)&&X.abort()},z=()=>{f||document.hidden||(C&&q(),F(),B(),y&&$(y.id,y.admitted),T())},ue=()=>{document.hidden?se(!1):z()};document.addEventListener("visibilitychange",ue);let J=()=>{f=!0,se(!0),document.removeEventListener("visibilitychange",ue)};window.addEventListener("pagehide",J),window.addEventListener("pageshow",j=>{j.persisted&&(f=!1,document.addEventListener("visibilitychange",ue),z())}),F(),B();let V=Number(new URL(location.href).searchParams.get("queue"));return Number.isSafeInteger(V)&&V>0&&$(V),J}function yP(e){let{context:t}=e,n=e.config??Ie,r=e.remoteStalledConfig??{},s=e.fetchReport??Je,o=e.send??ar,i=e.whoami??Cw,a=e.fetchHealth??TM,c=e.heavyLockStatusPath??Ea(),l=e.heavyLockPath??ya(),d=e.tail??cm,u=e.tailJson??lm,f=new Jo;if(e.publish===!0){let v=e.passcodeFilePath!==void 0?e.passcodeFilePath:va(t.db.path),S=e.readPasscodeAuthority??(()=>v===null?null:sD(v));DM(f,{allowedOrigins:e.allowedOrigins,mountPath:e.mountPath,readAuthority:S,...e.remoteKey!==void 0?{remoteKey:e.remoteKey}:{}})}else f.use("*",async(v,S)=>{v.header("Cache-Control","no-store");let x=v.req.header("origin");if(x!==void 0&&!e.allowedOrigins.includes(x))return v.json({error:"origin not allowed"},403);await S()});f.route("/",JM({context:t,allowedOrigins:e.allowedOrigins,mountPath:e.mountPath,enabled:!0})),gP(f,t,e.mountPath),HM(f,{webDistDir:e.webDistDir,mountPath:e.mountPath}),nP(f,t,e.mountPath),lP(f,t,e.mountPath),_P(f,t,e.mountPath),f.post("/api/native-session/request",async v=>{let S;try{S=await v.req.json()}catch{return v.json({error:"Expected a JSON native request"},400)}if(!S||typeof S!="object"||Array.isArray(S))return v.json({error:"Expected a JSON native request"},400);let x=S;return!["turn","close"].includes(x.operation)||!x.member||typeof x.member!="object"||Array.isArray(x.member)||typeof x.member.provider!="string"||typeof x.member.sessionid!="string"||x.operation==="turn"&&typeof x.prompt!="string"?v.json({error:"Expected native identity and operation"},400):e.nativeManager?v.json(await e.nativeManager.request(x)):v.json({status:"error",code:"service_unavailable",error:"Native conversations are not configured; start lmbee serve",outcome:"not_sent",service_epoch:null,connection_epoch:null,connection_state:null,reply:"",messageId:null,teamChatLogId:null})}),f.post("/api/mcp/request",async v=>{let S;try{S=await v.req.json()}catch{return v.json({error:"Expected a JSON request object"},400)}if(!S||typeof S!="object"||Array.isArray(S))return v.json({error:"Expected a JSON request object"},400);let x=S;return typeof x.connection!="string"||typeof x.operation!="string"||x.params!==void 0&&(!x.params||typeof x.params!="object"||Array.isArray(x.params))?v.json({error:"Expected connection, operation and a params object"},400):e.mcpManager?v.json(await e.mcpManager.request({connection:x.connection,operation:x.operation,params:x.params})):v.json({status:"error",code:"service_unavailable",error:"MCP is not configured in this lmbee service; set LMBEE_MCP_CONFIG and restart lmbee",outcome:"not_sent",result:null})});let m=v=>lt("invalid_argument",v),p=(v,S)=>v.json(S,aw(S)),h=v=>{let S=new URL(v.req.url).searchParams,x=Object.create(null);for(let[C,q]of S.entries()){if(Object.hasOwn(x,C))return v.json(m(`Query parameter ${C} must occur once`),400);x[C]=q}return x};f.post("/api/escalations",async v=>{let S;try{S=await v.req.json()}catch{return p(v,m("Expected a JSON escalation object"))}if(!S||typeof S!="object"||Array.isArray(S))return p(v,m("Expected a JSON escalation object"));try{return p(v,Dl(t.db.db,"create",S))}catch{return p(v,lt("outcome_unknown","Escalation operation outcome is unknown"))}}),f.get("/api/escalations/status",v=>{let S=h(v);if(S instanceof Response)return S;try{return p(v,Dl(t.db.db,"status",S))}catch{return p(v,lt("database_unavailable","Escalation database is unavailable"))}}),f.get("/api/escalations/open",v=>{let S=h(v);if(S instanceof Response)return S;try{return p(v,Dl(t.db.db,"list_open",S))}catch{return p(v,lt("database_unavailable","Escalation database is unavailable"))}}),f.post("/api/escalations/answer",async v=>{let S;try{S=await v.req.json()}catch{return p(v,m("Expected a JSON answer object"))}if(!S||typeof S!="object"||Array.isArray(S))return p(v,m("Expected a JSON answer object"));try{return p(v,Dl(t.db.db,"answer",S))}catch{return p(v,lt("outcome_unknown","Escalation operation outcome is unknown"))}}),f.post("/api/jobs/on-demand",async v=>{let S;try{S=await v.req.json()}catch{return v.json({error:"invalid JSON"},400)}if(S===null||typeof S!="object"||Array.isArray(S))return v.json({error:"expected object"},400);let x=S;if(typeof x.db!="string"||typeof x.local_scope!="string"||typeof x.script!="string"||!Array.isArray(x.args)||!x.args.every(C=>typeof C=="string")||x.conversationid!==void 0&&typeof x.conversationid!="string")return v.json({error:"invalid on-demand request"},400);try{let C=await YD(t.db.db,t.db.path,t.teams,{db:x.db,localScope:x.local_scope,script:x.script,args:x.args,...typeof x.conversationid=="string"?{conversationId:x.conversationid}:{}});return"status"in C&&C.status==="busy"?v.json(C,503):v.json(C,202)}catch(C){if(C instanceof G||C instanceof H){let q=C.code==="INVALID_ARGUMENT"||C.code==="INVALID_SCHEDULE"?400:C.code==="NOT_FOUND"?404:C.code==="CONFLICT"?409:C.code==="DB_BUSY"?503:500;return q===503&&v.header("Retry-After","1"),v.json({error:C.message},q)}return v.json({error:C instanceof Error?C.message:String(C)},500)}}),f.get("/api/teams",v=>v.json(Lw(t))),f.get("/api/identities/:key",v=>v.json(hd(t.teams,v.req.param("key")))),f.get("/api/state",v=>{let S=v.req.query("team");return S!==void 0?v.json(Rw(t,S)):v.req.query("active")!==void 0?v.json(Nw(t)):v.json(kw(t))}),f.get("/api/status",async v=>{let S=v.req.query("live")==="1"||v.req.query("live")==="true",x=await xw(t,{live:S,fetchReport:s});return v.json(x)}),f.get("/api/liveness",async v=>{let S=await s(),x=t.teams.map(C=>{let q=K(C)?null:Id(t.db.db,{site:C.peerSite,team:C.name,alias:C.alias});return{team:C.name,running:K(C)?wt(C,S):!1,deadReclaimable:K(C)?To(C,S):!1,remoteOutbound:q?{state:q.state,sentTs:q.sent_ts,ackedTs:q.acked_ts,repliedTs:q.replied_ts}:null}});return v.json({report:S,teams:x})}),f.get("/api/stalled",async v=>{let S=await s(),x=fn(c,l,void 0,F=>{process.stderr.write(`[api/stalled] heavy-lock probe failed, treating conservatively as held: ${F.message}
2461
- `)}),C=await wi(t.db.db,t.teams.filter(K),S,x,n,void 0,{readOnly:!0}),q=r$(t.db.db,t.teams.filter(F=>!K(F)),r);return v.json({stalled:C,remoteStalled:q})});function _(v){let S=t.teams.find(C=>C.name===v);if(!S)return{error:`unknown team "${v}"`,status:404};if(!K(S))return{error:`team "${v}" is a remote team (channel=lmmail) -- not reachable via lctl`,status:400};let x;try{x=re(S)}catch(C){return{error:C instanceof Error?C.message:String(C),status:500}}return{teamfilePath:x}}function g(v,S,x,C){return u(v,S,{lines:x?Number(x):20,...C?{since:C}:{}})}let w=(e.mountPath??"").replace(/\/$/,"");f.get("/running",v=>{try{let S=Al(),x=S.report===null?"<p>Activity has not yet been observed; running, dead, and idle counts are unknown.</p>":`<p>Cached observation taken ${S.observedAt?Ae(S.observedAt):"at an unknown time"}. Refreshing this page does not run a new activity scan.</p>`,C=S.lastError?`<p class="warning">Observer failed${S.lastErrorAt?` ${Ae(S.lastErrorAt)}`:""}: ${P(S.lastError)}. ${S.report?"Showing the last successful observation.":"No successful observation is available."}</p>`:"",q=S.report===null?"":IM(ky(S.report),no(t.teams),w);return ft(v,qe("Running","<p>This page loaded just now; activity data comes from a separate scheduled observation and may be older.</p>"+x+C+q,w))}catch(S){return ft(v,qe("Running unavailable",`<p>${P(S instanceof Error?S.message:String(S))}</p>`,w),502)}}),f.get("/sessions/:team/:alias",v=>{let S=v.req.param("team"),x=v.req.param("alias"),C=`Session: ${S} / ${x}`,q={"data-page":"session","data-team":S,"data-alias":x},F=_(S);if("error"in F)return ft(v,qe(C,`<p role="alert">${P(F.error)}</p>`,w,q),F.status);let M=EP(S,x,w,{canonicalTeamfile:F.teamfilePath,commPageEnabled:!0}),$=Array.from(M.matchAll(/<script>([\s\S]*?)<\/script>/g),U=>U[1]);return ft(v,qe(C,M,w,q,$))}),f.get("/api/session/:team/:alias",async v=>{let S=v.req.param("team"),x=v.req.param("alias"),C=_(S);if("error"in C)return v.json({error:C.error},C.status);let{teamfilePath:q}=C,F=v.req.query("since"),M=v.req.query("limit");try{let $=await g(q,x,M,F);return v.json($)}catch($){return v.json({error:$ instanceof Error?$.message:String($)},404)}}),f.get("/api/transcript",async v=>{let S=v.req.query("team");if(!S)return v.json({error:"team is required"},400);let x=t.teams.find($=>$.name===S);if(!x)return v.json({error:`unknown team "${S}"`},404);if(!K(x))return v.json({error:`team "${S}" is a remote team (channel=lmmail) -- not reachable via lctl`},400);let C=v.req.query("alias")??x.leadAlias,q;try{q=re(x)}catch($){return v.json({error:$ instanceof Error?$.message:String($)},500)}let F=v.req.query("lines"),M=v.req.query("since");try{let $=await d(q,C,{...F?{lines:Number(F)}:{},...M?{since:M}:{}});return v.json({team:S,alias:C,...$})}catch($){return v.json({error:$ instanceof Error?$.message:String($)},502)}}),f.get("/api/queue",v=>{let S=v.req.query("to");return v.json(vw(t,S))}),f.get("/api/queue/stats",v=>{try{let S=L(v.req.query("to"),"to");return v.json(Aw(t,S))}catch(S){return E(v,S)}});let y=v=>{try{let S=v.req.query(),x={fromId:L(S.from,"from"),toId:L(S.to,"to"),status:k(S.status),since:D(S.since,"since"),until:D(S.until,"until"),after:b(S.after,"after"),limit:b(S.limit,"limit",200)};return v.json(Km(t,x))}catch(S){return E(v,S)}};f.get("/api/queue/prompts",y),f.get("/api/queue/:id",v=>{let S=Number(v.req.param("id")),x=Ia(t,S);return x?v.json({queue:x}):v.json(je("queue_not_found",`no queue entry ${S}`),404)}),f.get("/api/queue/:id/state",v=>{let S=Number(v.req.param("id")),x=Ul(t,S);return x?v.json(x):v.json(je("queue_not_found",`no queue entry ${S}`),404)}),f.post("/api/queue/:id/answer",async v=>{try{let S=I(v.req.param("id"),"id"),x=await v.req.json().catch(()=>({})),C=L(x.from,"from"),q=L(x.text,"text");if(C===void 0||q===void 0)return v.json(je("invalid_argument","from and text are required"),400);let F=Zo(t.db.db,S,C,q);return v.json({answer:F},202)}catch(S){return E(v,S)}}),f.get("/api/queue/:id/preview",v=>{try{let S=I(v.req.param("id"),"id"),x=eo(t,S);return x?v.json(x):v.json(je("queue_not_found",`no queue entry ${S}`),404)}catch(S){return E(v,S)}}),f.post("/api/enqueue",async v=>{let S=await v.req.json().catch(()=>({})),x=S.prompt;if(!S.to||!x||!S.from)return v.json({error:"to, prompt, and from are required"},400);if(S.from==="autopilot")return v.json({error:"from: 'autopilot' is reserved for the tool's own automated enqueues"},400);try{let C=e.publish===!0&&S.from==="operator",q=Ne(t.db.db,t.teams,S.to,x,{from:S.from,...C?{operatorPriority:!0}:{}});return v.json({id:q})}catch(C){return v.json({error:C instanceof Error?C.message:String(C)},400)}}),f.post("/api/comm/send",async v=>{try{let S=await v.req.json().catch(()=>({})),x=L(S.to,"to"),C=L(S.prompt,"prompt"),q=L(S.dedupeKey,"dedupeKey");if(x===void 0||C===void 0||q===void 0)return v.json(je("invalid_argument","to, prompt, and dedupeKey are required"),400);let F=ep(t.db.db,t.teams,{to:x,prompt:C,dedupeKey:q});return v.json(F,F.replayed?200:202)}catch(S){return E(v,S)}}),f.post("/api/queue/deliver",async v=>{let S=await s(),x=ps(t.db.db,{teams:t.teams,report:S,...e.remoteMail?{remoteMail:e.remoteMail}:{}});return v.json({delivered:x})}),f.post("/api/queue/retrieve",async v=>{let S=await v.req.json().catch(()=>({}));if(!S.to)return v.json({error:"to is required"},400);if(S.id!==void 0&&(!Number.isInteger(S.id)||S.id<=0))return v.json({error:"id must be a positive integer"},400);try{let C=Ld(t.db.db,S.to,S.id).map(q=>{let F;try{F=Fre(q.prompt_file,"utf8")}catch{F="(could not read prompt file)"}return{...q,content:F}});return v.json({retrieved:C})}catch(x){return E(v,x)}}),f.get("/api/inbox",v=>{let S=v.req.query("to");return S?v.json(bw(t,S)):v.json(je("to_required","to is required"),400)});function E(v,S){if(S instanceof H){let x=S.code==="NOT_FOUND"?404:S.code==="CONFLICT"?409:S.code==="DB_BUSY"?503:S.code==="STORAGE_ERROR"?500:400;return v.json(je(S.code,S.message),x)}return v.json(je("internal_error",S instanceof Error?S.message:String(S)),500)}let T=new Set(["epic","task","subtask"]);function b(v,S,x){if(v===void 0)return;let C=Number(v);if(!/^[1-9]\d*$/.test(v)||!Number.isSafeInteger(C)||x!==void 0&&C>x)throw new H("INVALID_ARGUMENT",x!==void 0?`${S} must be a positive integer <= ${x}`:`${S} must be a positive integer`);return C}function A(v,S){if(v===void 0)return;let x=Number(v);if(!/^\d+$/.test(v)||!Number.isSafeInteger(x))throw new H("INVALID_ARGUMENT",`${S} must be a nonnegative integer`);return x}function I(v,S){let x=Number(v);if(!/^[1-9]\d*$/.test(v)||!Number.isSafeInteger(x))throw new H("INVALID_ARGUMENT",`${S} must be a positive integer`);return x}function R(v){if(v!==void 0){if(!T.has(v))throw new H("INVALID_ARGUMENT","kind must be 'epic', 'task', or 'subtask'");return v}}function L(v,S){if(v!==void 0){if(v.trim()==="")throw new H("INVALID_ARGUMENT",`${S} must not be blank`);return v}}function N(v,S){if(v!==void 0){if(v==="1"||v==="true")return!0;if(v==="0"||v==="false")return!1;throw new H("INVALID_ARGUMENT",`${S} must be '1'/'true' or '0'/'false'`)}}function k(v){if(v!==void 0){if(!fh.includes(v))throw new H("INVALID_ARGUMENT",`status must be one of: ${fh.join(", ")}`);return v}}function D(v,S){if(v===void 0)return;let x=v.trim()===""?NaN:Date.parse(v);if(Number.isNaN(x))throw new H("INVALID_ARGUMENT",`${S} must be a valid ISO8601 date-time string`);return new Date(x).toISOString()}function O(v,S){let x=L(v,"ownerTeam"),C=L(S,"ownerAlias");if(!(x===void 0&&C===void 0)){if(x===void 0||C===void 0)throw new H("INVALID_ARGUMENT","ownerTeam and ownerAlias must both be given");return{team:x,alias:C}}}return f.get("/api/tasks",v=>{let S=v.req.query();try{let x={project:L(S.project,"project"),kind:R(S.kind),status:L(S.status,"status"),parentId:b(S.parentId,"parentId"),owner:O(S.ownerTeam,S.ownerAlias),unassigned:N(S.unassigned,"unassigned"),limit:b(S.limit,"limit",et),after:A(S.after,"after")};return v.json(_s(t.db.db,x))}catch(x){return E(v,x)}}),f.get("/api/tasks/summary",v=>{try{let S=b(v.req.query("id"),"id"),x=L(v.req.query("project"),"project");return v.json(ys(t.db.db,{id:S,project:x}))}catch(S){return E(v,S)}}),f.get("/api/tasks/:id",v=>{try{let S=I(v.req.param("id"),"id");return v.json(gs(t.db.db,S))}catch(S){return E(v,S)}}),f.get("/api/tasks/:id/tree",v=>{try{let S=I(v.req.param("id"),"id");return v.json(Es(t.db.db,S))}catch(S){return E(v,S)}}),f.get("/api/tasks/:id/notes",v=>{try{let S=I(v.req.param("id"),"id"),x=A(v.req.query("after"),"after"),C=b(v.req.query("limit"),"limit",et);return v.json(US(t.db.db,S,{limit:C,after:x}))}catch(S){return E(v,S)}}),f.post("/api/send",async v=>{let S=await v.req.json().catch(()=>({})),x=S.prompt;if(!S.team||!x)return v.json({error:"team and prompt are required"},400);let C=t.teams.find($=>$.name===S.team);if(!C)return v.json({error:`unknown team "${S.team}"`},404);if(!K(C))return v.json({error:`team "${S.team}" is a remote team (channel=lmmail) -- not reachable via lctl`},400);let q=await o({teamfilePath:re(C),alias:C.leadAlias},x),F=ba(q),M=Date.now();return Ur(t.db.db,C.name,F.status,M),Ht(t.db.db,C.name,F.status,M,{note:"web send"}),v.json({status:F.status,outcome:q})}),f.get("/api/history",v=>{let S=v.req.query("team"),x=v.req.query("limit"),C=dw(t,S,x);return"error"in C?v.json(C,400):v.json(C)}),f.get("/api/sources",v=>v.json(Iw(t))),f.get("/api/mail/status",v=>v.json(uw(t))),f.get("/api/subscriptions",async v=>{let{status:S,body:x}=await vM();return v.json(x,S)}),f.get("/api/whoami",async v=>{let{data:S,exitCode:x}=await i();return"error"in S?v.json(S,x===4?502:400):v.json(S)}),f.get("/api/running",async v=>v.json(await s())),f.get("/api/running/humanized",async v=>v.json(ky(await s()))),f.get("/api/running/observed",v=>v.json(Al())),f.get("/api/heavy-lock",v=>{try{return v.json(Iy(c,l))}catch(S){if(S instanceof ga)return v.json(je("heavy_lock_probe_failed",S.message),502);throw S}}),f.get("/api/health",async v=>{let S=v.req.query("target");if(!S)return v.json(je("target_required","target is required"),400);try{let x=await a(S);return v.json(x)}catch(x){return v.json(je("health_fetch_failed",x instanceof Error?x.message:String(x)),502)}}),f.post("/api/sources",async v=>{let S=await v.req.json().catch(()=>({}));if(!S.path)return v.json({error:"path is required"},400);let x=zm(t,S.path,S.label??void 0);return x.ok?(t.teams=_o(t.db.db,t.teamsConfPath),v.json({ok:!0})):v.json({error:x.output},400)}),f.delete("/api/sources",v=>{let S=v.req.query("path");return S?(gd(t.db.db,S),t.teams=_o(t.db.db,t.teamsConfPath),v.json({ok:!0})):v.json({error:"path is required"},400)}),f}function Bw(e){return e.teams=_o(e.db.db,e.teamsConfPath),e.teams}var jre=4173,qre="127.0.0.1";function wP(e){if(process.env.LMBEE_SITE_UUID!==void 0)try{let g=mi(e.context.db.db,void 0,process.env.LMBEE_SITE_UUID);if(e.remoteMail&&e.remoteMail.localSiteId!==g)throw new Error("Remote mail site identity conflicts with the database binding")}catch(g){return Promise.reject(g)}let t=e.port??jre,n=e.hostname??qre,r=e.publish??!1;if(!["127.0.0.1","::1","localhost"].includes(n)&&!r)return Promise.reject(new Error("LocalWeb refuses a non-loopback bind without --publish (which also requires passcode auth)"));let s=n==="::1"?"[::1]":n,o=Cl(e.context.db.path),i=null;if(o!==null)try{i=qm(o,e.lockOwnerLabel??"lmbee-serve")}catch(g){return Promise.reject(g)}let a=t===0?[]:[`http://${s}:${t}`,`http://localhost:${t}`,`http://[::1]:${t}`],c=e.remoteMail?{client:e.remoteMail.client,localSiteId:e.remoteMail.localSiteId}:void 0,l,d,u,f,m,p,h=null,_=null;try{let g=e.passcodeFilePath??va(e.context.db.path);r&&g!==null&&Hm(g);let w=e.mcpConfigPath??process.env.LMBEE_MCP_CONFIG;if(l=e.mcpManager??(w?new el({connections:$E(w).connections}):void 0),e.nativeManager)d=e.nativeManager;else{let E=k_({env:{...process.env},cwd:process.cwd(),dbPath:e.context.db.path,interactive:!1});if(E.status!=="ok")throw Error(E.error);d=new $f({context:E,ownsContext:!0})}u=yP({nativeManager:d,mcpManager:l,context:e.context,allowedOrigins:a,publish:r,passcodeFilePath:g,...e.config!==void 0?{config:e.config}:{},...e.fetchReport!==void 0?{fetchReport:e.fetchReport}:{},...e.mountPath!==void 0?{mountPath:e.mountPath}:{},...e.webDistDir!==void 0?{webDistDir:e.webDistDir}:{},...c?{remoteMail:c}:{},...e.remoteStalledConfig!==void 0?{remoteStalledConfig:e.remoteStalledConfig}:{}});let y=e.mountPath?.endsWith("/")?e.mountPath.slice(0,-1):e.mountPath;if(y?f=new Jo().route(y,u).get(`${y}/`,async E=>{let T=new URL(E.req.url);T.pathname="/",T.search="";let b=await u.fetch(new Request(T,{method:"GET",headers:E.req.raw.headers}));return b.ok?E.redirect(y,302):b}):f=u,m=VO({db:e.context.db.db,getTeams:()=>Bw(e.context),...e.intervalMs!==void 0?{intervalMs:e.intervalMs}:{},...e.config!==void 0?{config:e.config}:{},...e.fetchReport!==void 0?{fetchReport:e.fetchReport}:{},...e.maintainerWake!==void 0?{maintainerWake:e.maintainerWake}:{},...e.autoContinue!==void 0?{autoContinue:e.autoContinue}:{},...e.miniplayerVerify!==void 0?{miniplayerVerify:e.miniplayerVerify}:{},...e.hungHolderCheck!==void 0?{hungHolderCheck:e.hungHolderCheck}:{},...e.epicReview!==void 0?{epicReview:e.epicReview}:{},...e.orphanReconciler!==void 0?{orphanReconciler:e.orphanReconciler}:{},...e.hangProbeCollect!==void 0?{hangProbeCollect:e.hangProbeCollect}:{},...e.autoNudgeRedirectReview!==void 0?{autoNudgeRedirectReview:e.autoNudgeRedirectReview}:{},...e.rateLimitCollect!==void 0?{rateLimitCollect:e.rateLimitCollect}:{},...e.rateLimitPolicy!==void 0?{rateLimitPolicy:e.rateLimitPolicy}:{},...e.rateLimitAutomation!==void 0?{rateLimitAutomation:e.rateLimitAutomation}:{},onTick:E=>{process.stderr.write(`[cron] tick: watch=${E.watch.why}, ${E.stalled.length} stalled (${E.stalled.join(", ")||"none"})${E.maintainerWoken?", maintainer woken":""}${E.autoContinued.length?`, auto-continued (${E.autoContinued.join(", ")})`:""}
2460
+ ${ce.prompt}`),c("comm-review").hidden=!1,Q.hidden=!1,ee.hidden=!1,l("comm-send-status","Review the exact prompt before confirming.")}}),ee.addEventListener("click",()=>{le||Ee||(ce=null,j.disabled=!1,X.disabled=!1,Q.hidden=!0,ee.hidden=!0,c("comm-review").hidden=!0)}),Q.addEventListener("click",async()=>{if(!ce||le||f||document.hidden)return;let Ue=m;le=!0,Ee=!0,Q.disabled=!0,ee.hidden=!0,l("comm-send-status","Submitting; waiting for confirmation that the prompt was queued\u2026");try{let te=await k(`${r}/api/comm/send`,ce);if(!E(Ue))throw new Error("Page paused before receipt could be shown");if(!Number.isSafeInteger(te.queueId)||te.queueId<1)throw new Error("Missing queue receipt");l("comm-send-status",`Accepted as queue #${te.queueId}${te.replayed?" (existing prompt recovered)":""}.`),ce=null,Ee=!1,j.value="",j.disabled=!1,X.disabled=!1,Q.hidden=!0,Q.textContent="Confirm send to math",c("comm-review").hidden=!0,$(te.queueId,!0),B()}catch(te){He=N(te)}finally{le=!1,!f&&!document.hidden&&(Q.disabled=!1),T()}})}c("session-refresh").addEventListener("click",()=>{C=!0,l("session-refresh","Refresh transcript"),q()}),c("comm-refresh").addEventListener("click",()=>void B()),c("comm-check").addEventListener("click",()=>{clearTimeout(p),g=0,M()});let se=j=>{m++,_++,clearTimeout(p),v=null,U=null;for(let[X,Q]of u)(j||Q)&&X.abort()},z=()=>{f||document.hidden||(C&&q(),F(),B(),y&&$(y.id,y.admitted),T())},ue=()=>{document.hidden?se(!1):z()};document.addEventListener("visibilitychange",ue);let J=()=>{f=!0,se(!0),document.removeEventListener("visibilitychange",ue)};window.addEventListener("pagehide",J),window.addEventListener("pageshow",j=>{j.persisted&&(f=!1,document.addEventListener("visibilitychange",ue),z())}),F(),B();let V=Number(new URL(location.href).searchParams.get("queue"));return Number.isSafeInteger(V)&&V>0&&$(V),J}function yP(e){let{context:t}=e,n=e.config??Ie,r=e.remoteStalledConfig??{},s=e.fetchReport??Je,o=e.send??ar,i=e.whoami??Cw,a=e.fetchHealth??TM,c=e.heavyLockStatusPath??Ea(),l=e.heavyLockPath??ya(),d=e.tail??cm,u=e.tailJson??lm,f=new Jo;if(e.publish===!0){let v=e.passcodeFilePath!==void 0?e.passcodeFilePath:va(t.db.path),S=e.readPasscodeAuthority??(()=>v===null?null:sD(v));DM(f,{allowedOrigins:e.allowedOrigins,mountPath:e.mountPath,readAuthority:S,...e.remoteKey!==void 0?{remoteKey:e.remoteKey}:{}})}else f.use("*",async(v,S)=>{v.header("Cache-Control","no-store");let x=v.req.header("origin");if(x!==void 0&&!e.allowedOrigins.includes(x))return v.json({error:"origin not allowed"},403);await S()});f.route("/",JM({context:t,allowedOrigins:e.allowedOrigins,mountPath:e.mountPath,enabled:!0})),gP(f,t,e.mountPath),HM(f,{webDistDir:e.webDistDir,mountPath:e.mountPath}),nP(f,t,e.mountPath),lP(f,t,e.mountPath),_P(f,t,e.mountPath),f.post("/api/native-session/request",async v=>{let S;try{S=await v.req.json()}catch{return v.json({error:"Expected a JSON native request"},400)}if(!S||typeof S!="object"||Array.isArray(S))return v.json({error:"Expected a JSON native request"},400);let x=S;return!["turn","close"].includes(x.operation)||!x.member||typeof x.member!="object"||Array.isArray(x.member)||typeof x.member.provider!="string"||typeof x.member.sessionid!="string"||x.operation==="turn"&&typeof x.prompt!="string"?v.json({error:"Expected native identity and operation"},400):e.nativeManager?v.json(await e.nativeManager.request(x)):v.json({status:"error",code:"service_unavailable",error:"Native conversations are not configured; start lmbee serve",outcome:"not_sent",service_epoch:null,connection_epoch:null,connection_state:null,reply:"",messageId:null,teamChatLogId:null})}),f.post("/api/mcp/request",async v=>{let S;try{S=await v.req.json()}catch{return v.json({error:"Expected a JSON request object"},400)}if(!S||typeof S!="object"||Array.isArray(S))return v.json({error:"Expected a JSON request object"},400);let x=S;return typeof x.connection!="string"||typeof x.operation!="string"||x.params!==void 0&&(!x.params||typeof x.params!="object"||Array.isArray(x.params))?v.json({error:"Expected connection, operation and a params object"},400):e.mcpManager?v.json(await e.mcpManager.request({connection:x.connection,operation:x.operation,params:x.params})):v.json({status:"error",code:"service_unavailable",error:"MCP is not configured in this lmbee service; set LMBEE_MCP_CONFIG and restart lmbee",outcome:"not_sent",result:null})});let m=v=>lt("invalid_argument",v),p=(v,S)=>v.json(S,aw(S)),h=v=>{let S=new URL(v.req.url).searchParams,x=Object.create(null);for(let[C,q]of S.entries()){if(Object.hasOwn(x,C))return v.json(m(`Query parameter ${C} must occur once`),400);x[C]=q}return x};f.post("/api/escalations",async v=>{let S;try{S=await v.req.json()}catch{return p(v,m("Expected a JSON escalation object"))}if(!S||typeof S!="object"||Array.isArray(S))return p(v,m("Expected a JSON escalation object"));try{return p(v,Dl(t.db.db,"create",S))}catch{return p(v,lt("outcome_unknown","Escalation operation outcome is unknown"))}}),f.get("/api/escalations/status",v=>{let S=h(v);if(S instanceof Response)return S;try{return p(v,Dl(t.db.db,"status",S))}catch{return p(v,lt("database_unavailable","Escalation database is unavailable"))}}),f.get("/api/escalations/open",v=>{let S=h(v);if(S instanceof Response)return S;try{return p(v,Dl(t.db.db,"list_open",S))}catch{return p(v,lt("database_unavailable","Escalation database is unavailable"))}}),f.post("/api/escalations/answer",async v=>{let S;try{S=await v.req.json()}catch{return p(v,m("Expected a JSON answer object"))}if(!S||typeof S!="object"||Array.isArray(S))return p(v,m("Expected a JSON answer object"));try{return p(v,Dl(t.db.db,"answer",S))}catch{return p(v,lt("outcome_unknown","Escalation operation outcome is unknown"))}}),f.post("/api/jobs/on-demand",async v=>{let S;try{S=await v.req.json()}catch{return v.json({error:"invalid JSON"},400)}if(S===null||typeof S!="object"||Array.isArray(S))return v.json({error:"expected object"},400);let x=S;if(typeof x.db!="string"||typeof x.local_scope!="string"||typeof x.script!="string"||!Array.isArray(x.args)||!x.args.every(C=>typeof C=="string")||x.conversationid!==void 0&&typeof x.conversationid!="string")return v.json({error:"invalid on-demand request"},400);try{let C=await YD(t.db.db,t.db.path,t.teams,{db:x.db,localScope:x.local_scope,script:x.script,args:x.args,...typeof x.conversationid=="string"?{conversationId:x.conversationid}:{}});return"status"in C&&C.status==="busy"?v.json(C,503):v.json(C,202)}catch(C){if(C instanceof G||C instanceof H){let q=C.code==="INVALID_ARGUMENT"||C.code==="INVALID_SCHEDULE"?400:C.code==="NOT_FOUND"?404:C.code==="CONFLICT"?409:C.code==="DB_BUSY"?503:500;return q===503&&v.header("Retry-After","1"),v.json({error:C.message},q)}return v.json({error:C instanceof Error?C.message:String(C)},500)}}),f.get("/api/teams",v=>v.json(Lw(t))),f.get("/api/identities/:key",v=>v.json(hd(t.teams,v.req.param("key")))),f.get("/api/state",v=>{let S=v.req.query("team");return S!==void 0?v.json(Rw(t,S)):v.req.query("active")!==void 0?v.json(Nw(t)):v.json(kw(t))}),f.get("/api/status",async v=>{let S=v.req.query("live")==="1"||v.req.query("live")==="true",x=await xw(t,{live:S,fetchReport:s});return v.json(x)}),f.get("/api/liveness",async v=>{let S=await s(),x=t.teams.map(C=>{let q=K(C)?null:Id(t.db.db,{site:C.peerSite,team:C.name,alias:C.alias});return{team:C.name,running:K(C)?Tt(C,S):!1,deadReclaimable:K(C)?To(C,S):!1,remoteOutbound:q?{state:q.state,sentTs:q.sent_ts,ackedTs:q.acked_ts,repliedTs:q.replied_ts}:null}});return v.json({report:S,teams:x})}),f.get("/api/stalled",async v=>{let S=await s(),x=fn(c,l,void 0,F=>{process.stderr.write(`[api/stalled] heavy-lock probe failed, treating conservatively as held: ${F.message}
2461
+ `)}),C=await wi(t.db.db,t.teams.filter(K),S,x,n,void 0,{readOnly:!0}),q=r$(t.db.db,t.teams.filter(F=>!K(F)),r);return v.json({stalled:C,remoteStalled:q})});function _(v){let S=t.teams.find(C=>C.name===v);if(!S)return{error:`unknown team "${v}"`,status:404};if(!K(S))return{error:`team "${v}" is a remote team (channel=lmmail) -- not reachable via lctl`,status:400};let x;try{x=re(S)}catch(C){return{error:C instanceof Error?C.message:String(C),status:500}}return{teamfilePath:x}}function g(v,S,x,C){return u(v,S,{lines:x?Number(x):20,...C?{since:C}:{}})}let w=(e.mountPath??"").replace(/\/$/,"");f.get("/running",v=>{try{let S=Al(),x=S.report===null?"<p>Activity has not yet been observed; running, dead, and idle counts are unknown.</p>":`<p>Cached observation taken ${S.observedAt?Ae(S.observedAt):"at an unknown time"}. Refreshing this page does not run a new activity scan.</p>`,C=S.lastError?`<p class="warning">Observer failed${S.lastErrorAt?` ${Ae(S.lastErrorAt)}`:""}: ${P(S.lastError)}. ${S.report?"Showing the last successful observation.":"No successful observation is available."}</p>`:"",q=S.report===null?"":IM(ky(S.report),no(t.teams),w);return ft(v,qe("Running","<p>This page loaded just now; activity data comes from a separate scheduled observation and may be older.</p>"+x+C+q,w))}catch(S){return ft(v,qe("Running unavailable",`<p>${P(S instanceof Error?S.message:String(S))}</p>`,w),502)}}),f.get("/sessions/:team/:alias",v=>{let S=v.req.param("team"),x=v.req.param("alias"),C=`Session: ${S} / ${x}`,q={"data-page":"session","data-team":S,"data-alias":x},F=_(S);if("error"in F)return ft(v,qe(C,`<p role="alert">${P(F.error)}</p>`,w,q),F.status);let M=EP(S,x,w,{canonicalTeamfile:F.teamfilePath,commPageEnabled:!0}),$=Array.from(M.matchAll(/<script>([\s\S]*?)<\/script>/g),U=>U[1]);return ft(v,qe(C,M,w,q,$))}),f.get("/api/session/:team/:alias",async v=>{let S=v.req.param("team"),x=v.req.param("alias"),C=_(S);if("error"in C)return v.json({error:C.error},C.status);let{teamfilePath:q}=C,F=v.req.query("since"),M=v.req.query("limit");try{let $=await g(q,x,M,F);return v.json($)}catch($){return v.json({error:$ instanceof Error?$.message:String($)},404)}}),f.get("/api/transcript",async v=>{let S=v.req.query("team");if(!S)return v.json({error:"team is required"},400);let x=t.teams.find($=>$.name===S);if(!x)return v.json({error:`unknown team "${S}"`},404);if(!K(x))return v.json({error:`team "${S}" is a remote team (channel=lmmail) -- not reachable via lctl`},400);let C=v.req.query("alias")??x.leadAlias,q;try{q=re(x)}catch($){return v.json({error:$ instanceof Error?$.message:String($)},500)}let F=v.req.query("lines"),M=v.req.query("since");try{let $=await d(q,C,{...F?{lines:Number(F)}:{},...M?{since:M}:{}});return v.json({team:S,alias:C,...$})}catch($){return v.json({error:$ instanceof Error?$.message:String($)},502)}}),f.get("/api/queue",v=>{let S=v.req.query("to");return v.json(vw(t,S))}),f.get("/api/queue/stats",v=>{try{let S=L(v.req.query("to"),"to");return v.json(Aw(t,S))}catch(S){return E(v,S)}});let y=v=>{try{let S=v.req.query(),x={fromId:L(S.from,"from"),toId:L(S.to,"to"),status:k(S.status),since:D(S.since,"since"),until:D(S.until,"until"),after:b(S.after,"after"),limit:b(S.limit,"limit",200)};return v.json(Km(t,x))}catch(S){return E(v,S)}};f.get("/api/queue/prompts",y),f.get("/api/queue/:id",v=>{let S=Number(v.req.param("id")),x=Ia(t,S);return x?v.json({queue:x}):v.json(je("queue_not_found",`no queue entry ${S}`),404)}),f.get("/api/queue/:id/state",v=>{let S=Number(v.req.param("id")),x=Ul(t,S);return x?v.json(x):v.json(je("queue_not_found",`no queue entry ${S}`),404)}),f.post("/api/queue/:id/answer",async v=>{try{let S=I(v.req.param("id"),"id"),x=await v.req.json().catch(()=>({})),C=L(x.from,"from"),q=L(x.text,"text");if(C===void 0||q===void 0)return v.json(je("invalid_argument","from and text are required"),400);let F=Zo(t.db.db,S,C,q);return v.json({answer:F},202)}catch(S){return E(v,S)}}),f.get("/api/queue/:id/preview",v=>{try{let S=I(v.req.param("id"),"id"),x=eo(t,S);return x?v.json(x):v.json(je("queue_not_found",`no queue entry ${S}`),404)}catch(S){return E(v,S)}}),f.post("/api/enqueue",async v=>{let S=await v.req.json().catch(()=>({})),x=S.prompt;if(!S.to||!x||!S.from)return v.json({error:"to, prompt, and from are required"},400);if(S.from==="autopilot")return v.json({error:"from: 'autopilot' is reserved for the tool's own automated enqueues"},400);try{let C=e.publish===!0&&S.from==="operator",q=Ne(t.db.db,t.teams,S.to,x,{from:S.from,...C?{operatorPriority:!0}:{}});return v.json({id:q})}catch(C){return v.json({error:C instanceof Error?C.message:String(C)},400)}}),f.post("/api/comm/send",async v=>{try{let S=await v.req.json().catch(()=>({})),x=L(S.to,"to"),C=L(S.prompt,"prompt"),q=L(S.dedupeKey,"dedupeKey");if(x===void 0||C===void 0||q===void 0)return v.json(je("invalid_argument","to, prompt, and dedupeKey are required"),400);let F=ep(t.db.db,t.teams,{to:x,prompt:C,dedupeKey:q});return v.json(F,F.replayed?200:202)}catch(S){return E(v,S)}}),f.post("/api/queue/deliver",async v=>{let S=await s(),x=ps(t.db.db,{teams:t.teams,report:S,...e.remoteMail?{remoteMail:e.remoteMail}:{}});return v.json({delivered:x})}),f.post("/api/queue/retrieve",async v=>{let S=await v.req.json().catch(()=>({}));if(!S.to)return v.json({error:"to is required"},400);if(S.id!==void 0&&(!Number.isInteger(S.id)||S.id<=0))return v.json({error:"id must be a positive integer"},400);try{let C=Ld(t.db.db,S.to,S.id).map(q=>{let F;try{F=Fre(q.prompt_file,"utf8")}catch{F="(could not read prompt file)"}return{...q,content:F}});return v.json({retrieved:C})}catch(x){return E(v,x)}}),f.get("/api/inbox",v=>{let S=v.req.query("to");return S?v.json(bw(t,S)):v.json(je("to_required","to is required"),400)});function E(v,S){if(S instanceof H){let x=S.code==="NOT_FOUND"?404:S.code==="CONFLICT"?409:S.code==="DB_BUSY"?503:S.code==="STORAGE_ERROR"?500:400;return v.json(je(S.code,S.message),x)}return v.json(je("internal_error",S instanceof Error?S.message:String(S)),500)}let T=new Set(["epic","task","subtask"]);function b(v,S,x){if(v===void 0)return;let C=Number(v);if(!/^[1-9]\d*$/.test(v)||!Number.isSafeInteger(C)||x!==void 0&&C>x)throw new H("INVALID_ARGUMENT",x!==void 0?`${S} must be a positive integer <= ${x}`:`${S} must be a positive integer`);return C}function A(v,S){if(v===void 0)return;let x=Number(v);if(!/^\d+$/.test(v)||!Number.isSafeInteger(x))throw new H("INVALID_ARGUMENT",`${S} must be a nonnegative integer`);return x}function I(v,S){let x=Number(v);if(!/^[1-9]\d*$/.test(v)||!Number.isSafeInteger(x))throw new H("INVALID_ARGUMENT",`${S} must be a positive integer`);return x}function R(v){if(v!==void 0){if(!T.has(v))throw new H("INVALID_ARGUMENT","kind must be 'epic', 'task', or 'subtask'");return v}}function L(v,S){if(v!==void 0){if(v.trim()==="")throw new H("INVALID_ARGUMENT",`${S} must not be blank`);return v}}function N(v,S){if(v!==void 0){if(v==="1"||v==="true")return!0;if(v==="0"||v==="false")return!1;throw new H("INVALID_ARGUMENT",`${S} must be '1'/'true' or '0'/'false'`)}}function k(v){if(v!==void 0){if(!fh.includes(v))throw new H("INVALID_ARGUMENT",`status must be one of: ${fh.join(", ")}`);return v}}function D(v,S){if(v===void 0)return;let x=v.trim()===""?NaN:Date.parse(v);if(Number.isNaN(x))throw new H("INVALID_ARGUMENT",`${S} must be a valid ISO8601 date-time string`);return new Date(x).toISOString()}function O(v,S){let x=L(v,"ownerTeam"),C=L(S,"ownerAlias");if(!(x===void 0&&C===void 0)){if(x===void 0||C===void 0)throw new H("INVALID_ARGUMENT","ownerTeam and ownerAlias must both be given");return{team:x,alias:C}}}return f.get("/api/tasks",v=>{let S=v.req.query();try{let x={project:L(S.project,"project"),kind:R(S.kind),status:L(S.status,"status"),parentId:b(S.parentId,"parentId"),owner:O(S.ownerTeam,S.ownerAlias),unassigned:N(S.unassigned,"unassigned"),limit:b(S.limit,"limit",et),after:A(S.after,"after")};return v.json(_s(t.db.db,x))}catch(x){return E(v,x)}}),f.get("/api/tasks/summary",v=>{try{let S=b(v.req.query("id"),"id"),x=L(v.req.query("project"),"project");return v.json(ys(t.db.db,{id:S,project:x}))}catch(S){return E(v,S)}}),f.get("/api/tasks/:id",v=>{try{let S=I(v.req.param("id"),"id");return v.json(gs(t.db.db,S))}catch(S){return E(v,S)}}),f.get("/api/tasks/:id/tree",v=>{try{let S=I(v.req.param("id"),"id");return v.json(Es(t.db.db,S))}catch(S){return E(v,S)}}),f.get("/api/tasks/:id/notes",v=>{try{let S=I(v.req.param("id"),"id"),x=A(v.req.query("after"),"after"),C=b(v.req.query("limit"),"limit",et);return v.json(US(t.db.db,S,{limit:C,after:x}))}catch(S){return E(v,S)}}),f.post("/api/send",async v=>{let S=await v.req.json().catch(()=>({})),x=S.prompt;if(!S.team||!x)return v.json({error:"team and prompt are required"},400);let C=t.teams.find($=>$.name===S.team);if(!C)return v.json({error:`unknown team "${S.team}"`},404);if(!K(C))return v.json({error:`team "${S.team}" is a remote team (channel=lmmail) -- not reachable via lctl`},400);let q=await o({teamfilePath:re(C),alias:C.leadAlias},x),F=ba(q),M=Date.now();return Fr(t.db.db,C.name,F.status,M),Ht(t.db.db,C.name,F.status,M,{note:"web send"}),v.json({status:F.status,outcome:q})}),f.get("/api/history",v=>{let S=v.req.query("team"),x=v.req.query("limit"),C=dw(t,S,x);return"error"in C?v.json(C,400):v.json(C)}),f.get("/api/sources",v=>v.json(Iw(t))),f.get("/api/mail/status",v=>v.json(uw(t))),f.get("/api/subscriptions",async v=>{let{status:S,body:x}=await vM();return v.json(x,S)}),f.get("/api/whoami",async v=>{let{data:S,exitCode:x}=await i();return"error"in S?v.json(S,x===4?502:400):v.json(S)}),f.get("/api/running",async v=>v.json(await s())),f.get("/api/running/humanized",async v=>v.json(ky(await s()))),f.get("/api/running/observed",v=>v.json(Al())),f.get("/api/heavy-lock",v=>{try{return v.json(Iy(c,l))}catch(S){if(S instanceof ga)return v.json(je("heavy_lock_probe_failed",S.message),502);throw S}}),f.get("/api/health",async v=>{let S=v.req.query("target");if(!S)return v.json(je("target_required","target is required"),400);try{let x=await a(S);return v.json(x)}catch(x){return v.json(je("health_fetch_failed",x instanceof Error?x.message:String(x)),502)}}),f.post("/api/sources",async v=>{let S=await v.req.json().catch(()=>({}));if(!S.path)return v.json({error:"path is required"},400);let x=zm(t,S.path,S.label??void 0);return x.ok?(t.teams=_o(t.db.db,t.teamsConfPath),v.json({ok:!0})):v.json({error:x.output},400)}),f.delete("/api/sources",v=>{let S=v.req.query("path");return S?(gd(t.db.db,S),t.teams=_o(t.db.db,t.teamsConfPath),v.json({ok:!0})):v.json({error:"path is required"},400)}),f}function Bw(e){return e.teams=_o(e.db.db,e.teamsConfPath),e.teams}var jre=4173,qre="127.0.0.1";function wP(e){if(process.env.LMBEE_SITE_UUID!==void 0)try{let g=mi(e.context.db.db,void 0,process.env.LMBEE_SITE_UUID);if(e.remoteMail&&e.remoteMail.localSiteId!==g)throw new Error("Remote mail site identity conflicts with the database binding")}catch(g){return Promise.reject(g)}let t=e.port??jre,n=e.hostname??qre,r=e.publish??!1;if(!["127.0.0.1","::1","localhost"].includes(n)&&!r)return Promise.reject(new Error("LocalWeb refuses a non-loopback bind without --publish (which also requires passcode auth)"));let s=n==="::1"?"[::1]":n,o=Cl(e.context.db.path),i=null;if(o!==null)try{i=qm(o,e.lockOwnerLabel??"lmbee-serve")}catch(g){return Promise.reject(g)}let a=t===0?[]:[`http://${s}:${t}`,`http://localhost:${t}`,`http://[::1]:${t}`],c=e.remoteMail?{client:e.remoteMail.client,localSiteId:e.remoteMail.localSiteId}:void 0,l,d,u,f,m,p,h=null,_=null;try{let g=e.passcodeFilePath??va(e.context.db.path);r&&g!==null&&Hm(g);let w=e.mcpConfigPath??process.env.LMBEE_MCP_CONFIG;if(l=e.mcpManager??(w?new el({connections:$E(w).connections}):void 0),e.nativeManager)d=e.nativeManager;else{let E=k_({env:{...process.env},cwd:process.cwd(),dbPath:e.context.db.path,interactive:!1});if(E.status!=="ok")throw Error(E.error);d=new $f({context:E,ownsContext:!0})}u=yP({nativeManager:d,mcpManager:l,context:e.context,allowedOrigins:a,publish:r,passcodeFilePath:g,...e.config!==void 0?{config:e.config}:{},...e.fetchReport!==void 0?{fetchReport:e.fetchReport}:{},...e.mountPath!==void 0?{mountPath:e.mountPath}:{},...e.webDistDir!==void 0?{webDistDir:e.webDistDir}:{},...c?{remoteMail:c}:{},...e.remoteStalledConfig!==void 0?{remoteStalledConfig:e.remoteStalledConfig}:{}});let y=e.mountPath?.endsWith("/")?e.mountPath.slice(0,-1):e.mountPath;if(y?f=new Jo().route(y,u).get(`${y}/`,async E=>{let T=new URL(E.req.url);T.pathname="/",T.search="";let b=await u.fetch(new Request(T,{method:"GET",headers:E.req.raw.headers}));return b.ok?E.redirect(y,302):b}):f=u,m=VO({db:e.context.db.db,getTeams:()=>Bw(e.context),...e.intervalMs!==void 0?{intervalMs:e.intervalMs}:{},...e.config!==void 0?{config:e.config}:{},...e.fetchReport!==void 0?{fetchReport:e.fetchReport}:{},...e.maintainerWake!==void 0?{maintainerWake:e.maintainerWake}:{},...e.autoContinue!==void 0?{autoContinue:e.autoContinue}:{},...e.miniplayerVerify!==void 0?{miniplayerVerify:e.miniplayerVerify}:{},...e.hungHolderCheck!==void 0?{hungHolderCheck:e.hungHolderCheck}:{},...e.epicReview!==void 0?{epicReview:e.epicReview}:{},...e.orphanReconciler!==void 0?{orphanReconciler:e.orphanReconciler}:{},...e.hangProbeCollect!==void 0?{hangProbeCollect:e.hangProbeCollect}:{},...e.autoNudgeRedirectReview!==void 0?{autoNudgeRedirectReview:e.autoNudgeRedirectReview}:{},...e.rateLimitCollect!==void 0?{rateLimitCollect:e.rateLimitCollect}:{},...e.rateLimitPolicy!==void 0?{rateLimitPolicy:e.rateLimitPolicy}:{},...e.rateLimitAutomation!==void 0?{rateLimitAutomation:e.rateLimitAutomation}:{},onTick:E=>{process.stderr.write(`[cron] tick: watch=${E.watch.why}, ${E.stalled.length} stalled (${E.stalled.join(", ")||"none"})${E.maintainerWoken?", maintainer woken":""}${E.autoContinued.length?`, auto-continued (${E.autoContinued.join(", ")})`:""}
2462
2462
  `)},onError:E=>{process.stderr.write(`[cron] tick failed: ${E instanceof Error?E.stack??E.message:String(E)}
2463
2463
  `)}}),p=FD({db:e.context.db.db,getTeams:()=>Bw(e.context),...e.queueIntervalMs!==void 0?{intervalMs:e.queueIntervalMs}:{},...e.fetchReport!==void 0?{fetchReport:e.fetchReport}:{},...c?{remoteMail:c}:{},...e.deliverImpl!==void 0?{deliverImpl:e.deliverImpl}:{},...e.minMemoryPercent!==void 0?{minMemoryPercent:e.minMemoryPercent}:{},onDeliver:E=>{E>0&&process.stderr.write(`[queue] delivered ${E}
2464
2464
  `)},onError:E=>{process.stderr.write(`[queue] delivery pass failed: ${E instanceof Error?E.stack??E.message:String(E)}
@@ -2476,8 +2476,8 @@ ${SP}`);let o=Kre();try{let i=Yre(o.db,s,o.path);return r?{output:JSON.stringify
2476
2476
  `)}else typeof e=="string"?n=e:n=JSON.stringify(e,null,2);let r=t.next_cursor;return r!=null?`${n}
2477
2477
  More records: --after ${String(r)}`:n}var OP=`usage: lmbee cron create --title TEXT --schedule "m h dom mon dow" --kind enqueue|command|script|session|miniplayer [--payload TEXT | --prompt TEXT | --prompt-file PATH] [--provider P] [--model M] [--cwd DIR] [--owner NAME] [--disabled] [--timezone IANA-name] | show ID | list [--enabled true|false] [--limit N] [--after ID] | update ID [--title T] [--schedule EXPR] [--payload TEXT|--prompt TEXT|--prompt-file PATH] [--provider P] [--model M] [--cwd DIR] [--owner NAME] [--timezone IANA-name|""] [--if-revision N] | enable ID | disable ID | remove ID | reset ID | reset-session ID | export PATH | import PATH | runs [--job ID] [--status pending|running|succeeded|failed|escalated] [--limit N] [--after ID] | run RUN-ID | trigger ID | report RUN-TOKEN --status succeeded|failed|escalated --summary TEXT [--artifact A[,B]] [--requested-action TEXT] [--owner NAME] | resolve RUN-ID [--resolution TEXT] [--actor NAME] [--note TEXT] [--confirm-stopped]
2478
2478
  NOTE: a job fires at most once per daemon tick interval (default 30 minutes), regardless of how frequent its own schedule expression is -- lmcron catches up a missed window, coalesced to one fire, never one fire per missed minute.
2479
- NOTE: export/import carry job DEFINITIONS only (ids preserved), NEVER execution state -- runtime/session columns reset on import, historical timestamps are deliberately omitted, and the overlap fences live in cron_runs, which is not migrated. At scheduler cutover, stop the old daemon BEFORE the new one ticks; never run both schedules concurrently.`;async function DP(e,t,n,r,s=[]){try{let[o,...i]=t;switch(o){case"create":{let a=n.title;if(typeof a!="string")throw new G("INVALID_ARGUMENT","--title is required");let c=n.schedule;if(typeof c!="string")throw new G("INVALID_ARGUMENT","--schedule is required");let l=n.kind;if(typeof l!="string"||!tse(l))throw new G("INVALID_ARGUMENT",'--kind must be "enqueue", "command", "script", "session", or "miniplayer"');let d=LP(n);if(d===void 0)throw new G("INVALID_ARGUMENT",l==="session"||l==="miniplayer"?"--prompt or --prompt-file is required":"--payload is required");let u=_a(e,{title:a,scheduleExpr:c,actionKind:l,actionPayload:d,enabled:n.disabled!==!0,timezone:typeof n.timezone=="string"?n.timezone:void 0,...Lt(n.provider)!==void 0?{provider:Lt(n.provider)}:{},...Lt(n.model)!==void 0?{model:Lt(n.model)}:{},...Lt(n.cwd)!==void 0?{workingDirectory:Lt(n.cwd)}:{},...Lt(n.owner)!==void 0?{escalationOwner:Lt(n.owner)}:{}});return{output:pn(r,u),exitCode:0}}case"show":{let a=ns(i[0],"id");return{output:pn(r,ot(e,a)),exitCode:0}}case"list":{let a=n.enabled,c;if(a!==void 0){if(a!=="true"&&a!=="false")throw new G("INVALID_ARGUMENT",'--enabled must be "true" or "false"');c=a==="true"}let{rows:l,meta:d}=Em(e,{enabled:c,limit:ti(n.limit,"--limit",{maximum:et})??100,after:ti(n.after,"--after",{minimum:0})??0});return{output:pn(r,l,d),exitCode:0}}case"update":{let a=ns(i[0],"id"),c=LP(n),l=dC(e,a,{title:typeof n.title=="string"?n.title:void 0,scheduleExpr:typeof n.schedule=="string"?n.schedule:void 0,actionPayload:c,timezone:typeof n.timezone=="string"?n.timezone===""?null:n.timezone:void 0,provider:Lt(n.provider),model:Lt(n.model),workingDirectory:typeof n.cwd=="string"?n.cwd===""?null:n.cwd:void 0,escalationOwner:typeof n.owner=="string"?n.owner===""?null:n.owner:void 0,ifRevision:ti(n["if-revision"],"--if-revision")});return{output:pn(r,l),exitCode:0}}case"enable":case"disable":{let a=ns(i[0],"id"),c=uC(e,a,o==="enable");return{output:pn(r,c),exitCode:0}}case"remove":{let a=ns(i[0],"id"),c=fC(e,a);return{output:pn(r,c),exitCode:0}}case"reset":{let a=ns(i[0],"id"),c=yC(e,a);return{output:pn(r,c),exitCode:0}}case"reset-session":{let a=ns(i[0],"id"),c=mC(e,a);return{output:pn(r,c),exitCode:0}}case"runs":{let a=n.status;if(a!==void 0&&(typeof a!="string"||!rse(a)))throw new G("INVALID_ARGUMENT","--status must be one of pending|running|succeeded|failed|escalated");let c=n.job!==void 0?ti(n.job,"--job"):void 0,{rows:l,next_cursor:d}=mm(e,{...c!==void 0?{jobId:c}:{},...a!==void 0?{status:a}:{},limit:ti(n.limit,"--limit",{maximum:et})??100,after:ti(n.after,"--after",{minimum:0})??0});return{output:pn(r,l.map(gl),{next_cursor:d}),exitCode:0}}case"run":{let a=ns(i[0],"id");return{output:pn(r,gl(St(e,a))),exitCode:0}}case"trigger":{let a=ns(i[0],"id"),c=await bl(e,a,s);return{output:pn(r,{trigger:c.kind,job:c.job}),exitCode:0}}case"report":{let a=i[0];if(a===void 0)throw new G("INVALID_ARGUMENT","a run token is required");let c=n.status;if(typeof c!="string"||c!=="succeeded"&&c!=="failed"&&c!=="escalated")throw new G("INVALID_ARGUMENT",'--status must be "succeeded", "failed", or "escalated"');let l=n.summary;if(typeof l!="string")throw new G("INVALID_ARGUMENT","--summary is required");let d=typeof n.artifact=="string"?n.artifact:void 0,u=d!==void 0?d.split(",").map(p=>p.trim()).filter(p=>p.length>0):void 0,f=typeof n["requested-action"]=="string"?n["requested-action"]:Lt(n.action),m=V0(e,a,{status:c,summary:l,...u!==void 0?{artifacts:u}:{},...f!==void 0?{action:f}:{},...Lt(n.owner)!==void 0?{owner:Lt(n.owner)}:{},...Lt(n.reason)!==void 0?{reason:Lt(n.reason)}:{}});return{output:pn(r,gl(m)),exitCode:0}}case"import":{jl("import",i,n);let a=i[0];if(a===void 0)throw new G("INVALID_ARGUMENT","an import PATH is required");let c=RP(e,a);return{output:r?pn(!0,c):NP(c),exitCode:0}}case"resolve":{let a=ns(i[0],"id"),c=Y0(e,a,{resolution:Lt(n.resolution),actor:Lt(n.actor),note:Lt(n.note),confirmStopped:n["confirm-stopped"]===!0});return{output:pn(r,gl(c)),exitCode:0}}default:return r?CP(r,new G("INVALID_ARGUMENT",OP)):{output:OP,exitCode:1}}}catch(o){if(o instanceof G)return CP(r,o);throw o}}var $P=["disabled","confirm-stopped"];async function MP(e){let t=e.send??ar,n=e.config??Ie,r=e.nowMs??Date.now(),s=e.maxParallel??4,o=e.readHeavyLockStatusImpl??fn,i=e.teams.filter(l=>!fe(e.db,l.name)?.confirmed_done_ts),a=await ose(i,s,async l=>{if(!await kh(e.db,l,e.report,e.heavyLock,n,r))return{team:l.name,dispatched:!1,status:null,wake:null};let u;try{u=re(l)}catch(h){let _=h instanceof Error?h.message:String(h);return Ur(e.db,l.name,"ENV-ERROR",r),ac(e.db,l.name,new Date(r).toISOString()),Ht(e.db,l.name,"ENV-ERROR",r,{note:_}),{team:l.name,dispatched:!0,status:"ENV-ERROR",wake:"env"}}let f=o(e.heavyLockStatusPath,e.heavyLockPath,void 0,h=>{process.stderr.write(`[scan] heavy-lock probe failed for ${l.name}, treating conservatively as held: ${h.message}
2480
- `)});if(f.held&&(f.holder===null||f.holder.holder===l.name))return{team:l.name,dispatched:!1,status:null,wake:null};if(vd(e.db,l.name,l.leadAlias,r))return{team:l.name,dispatched:!1,status:null,wake:null};let m=await t({teamfilePath:u,alias:l.leadAlias},e.resolveNudgeMessage(l)),p=ba(m);return Ur(e.db,l.name,p.status,r),ac(e.db,l.name,new Date(r).toISOString()),Ht(e.db,l.name,p.status,r),{team:l.name,dispatched:!0,status:p.status,wake:p.wake}}),c=a.find(l=>l.wake!==null)?.wake??null;return{results:a,wake:c}}async function ose(e,t,n){let r=new Array(e.length),s=0;async function o(){for(;;){let a=s++;if(a>=e.length)return;r[a]=await n(e[a])}}let i=Math.max(1,Math.min(t,e.length));return await Promise.all(Array.from({length:i},()=>o())),r}async function ql(e,t,n={}){let s=await(n.fetchReport??Je)(),o=n.readHeavyLockStatusImpl??fn,i=o(void 0,void 0,void 0,l=>{process.stderr.write(`[scan] heavy-lock probe failed, treating conservatively as held: ${l.message}
2479
+ NOTE: export/import carry job DEFINITIONS only (ids preserved), NEVER execution state -- runtime/session columns reset on import, historical timestamps are deliberately omitted, and the overlap fences live in cron_runs, which is not migrated. At scheduler cutover, stop the old daemon BEFORE the new one ticks; never run both schedules concurrently.`;async function DP(e,t,n,r,s=[]){try{let[o,...i]=t;switch(o){case"create":{let a=n.title;if(typeof a!="string")throw new G("INVALID_ARGUMENT","--title is required");let c=n.schedule;if(typeof c!="string")throw new G("INVALID_ARGUMENT","--schedule is required");let l=n.kind;if(typeof l!="string"||!tse(l))throw new G("INVALID_ARGUMENT",'--kind must be "enqueue", "command", "script", "session", or "miniplayer"');let d=LP(n);if(d===void 0)throw new G("INVALID_ARGUMENT",l==="session"||l==="miniplayer"?"--prompt or --prompt-file is required":"--payload is required");let u=_a(e,{title:a,scheduleExpr:c,actionKind:l,actionPayload:d,enabled:n.disabled!==!0,timezone:typeof n.timezone=="string"?n.timezone:void 0,...Lt(n.provider)!==void 0?{provider:Lt(n.provider)}:{},...Lt(n.model)!==void 0?{model:Lt(n.model)}:{},...Lt(n.cwd)!==void 0?{workingDirectory:Lt(n.cwd)}:{},...Lt(n.owner)!==void 0?{escalationOwner:Lt(n.owner)}:{}});return{output:pn(r,u),exitCode:0}}case"show":{let a=ns(i[0],"id");return{output:pn(r,ot(e,a)),exitCode:0}}case"list":{let a=n.enabled,c;if(a!==void 0){if(a!=="true"&&a!=="false")throw new G("INVALID_ARGUMENT",'--enabled must be "true" or "false"');c=a==="true"}let{rows:l,meta:d}=Em(e,{enabled:c,limit:ti(n.limit,"--limit",{maximum:et})??100,after:ti(n.after,"--after",{minimum:0})??0});return{output:pn(r,l,d),exitCode:0}}case"update":{let a=ns(i[0],"id"),c=LP(n),l=dC(e,a,{title:typeof n.title=="string"?n.title:void 0,scheduleExpr:typeof n.schedule=="string"?n.schedule:void 0,actionPayload:c,timezone:typeof n.timezone=="string"?n.timezone===""?null:n.timezone:void 0,provider:Lt(n.provider),model:Lt(n.model),workingDirectory:typeof n.cwd=="string"?n.cwd===""?null:n.cwd:void 0,escalationOwner:typeof n.owner=="string"?n.owner===""?null:n.owner:void 0,ifRevision:ti(n["if-revision"],"--if-revision")});return{output:pn(r,l),exitCode:0}}case"enable":case"disable":{let a=ns(i[0],"id"),c=uC(e,a,o==="enable");return{output:pn(r,c),exitCode:0}}case"remove":{let a=ns(i[0],"id"),c=fC(e,a);return{output:pn(r,c),exitCode:0}}case"reset":{let a=ns(i[0],"id"),c=yC(e,a);return{output:pn(r,c),exitCode:0}}case"reset-session":{let a=ns(i[0],"id"),c=mC(e,a);return{output:pn(r,c),exitCode:0}}case"runs":{let a=n.status;if(a!==void 0&&(typeof a!="string"||!rse(a)))throw new G("INVALID_ARGUMENT","--status must be one of pending|running|succeeded|failed|escalated");let c=n.job!==void 0?ti(n.job,"--job"):void 0,{rows:l,next_cursor:d}=mm(e,{...c!==void 0?{jobId:c}:{},...a!==void 0?{status:a}:{},limit:ti(n.limit,"--limit",{maximum:et})??100,after:ti(n.after,"--after",{minimum:0})??0});return{output:pn(r,l.map(gl),{next_cursor:d}),exitCode:0}}case"run":{let a=ns(i[0],"id");return{output:pn(r,gl(bt(e,a))),exitCode:0}}case"trigger":{let a=ns(i[0],"id"),c=await bl(e,a,s);return{output:pn(r,{trigger:c.kind,job:c.job}),exitCode:0}}case"report":{let a=i[0];if(a===void 0)throw new G("INVALID_ARGUMENT","a run token is required");let c=n.status;if(typeof c!="string"||c!=="succeeded"&&c!=="failed"&&c!=="escalated")throw new G("INVALID_ARGUMENT",'--status must be "succeeded", "failed", or "escalated"');let l=n.summary;if(typeof l!="string")throw new G("INVALID_ARGUMENT","--summary is required");let d=typeof n.artifact=="string"?n.artifact:void 0,u=d!==void 0?d.split(",").map(p=>p.trim()).filter(p=>p.length>0):void 0,f=typeof n["requested-action"]=="string"?n["requested-action"]:Lt(n.action),m=V0(e,a,{status:c,summary:l,...u!==void 0?{artifacts:u}:{},...f!==void 0?{action:f}:{},...Lt(n.owner)!==void 0?{owner:Lt(n.owner)}:{},...Lt(n.reason)!==void 0?{reason:Lt(n.reason)}:{}});return{output:pn(r,gl(m)),exitCode:0}}case"import":{jl("import",i,n);let a=i[0];if(a===void 0)throw new G("INVALID_ARGUMENT","an import PATH is required");let c=RP(e,a);return{output:r?pn(!0,c):NP(c),exitCode:0}}case"resolve":{let a=ns(i[0],"id"),c=Y0(e,a,{resolution:Lt(n.resolution),actor:Lt(n.actor),note:Lt(n.note),confirmStopped:n["confirm-stopped"]===!0});return{output:pn(r,gl(c)),exitCode:0}}default:return r?CP(r,new G("INVALID_ARGUMENT",OP)):{output:OP,exitCode:1}}}catch(o){if(o instanceof G)return CP(r,o);throw o}}var $P=["disabled","confirm-stopped"];async function MP(e){let t=e.send??ar,n=e.config??Ie,r=e.nowMs??Date.now(),s=e.maxParallel??4,o=e.readHeavyLockStatusImpl??fn,i=e.teams.filter(l=>!fe(e.db,l.name)?.confirmed_done_ts),a=await ose(i,s,async l=>{if(!await kh(e.db,l,e.report,e.heavyLock,n,r))return{team:l.name,dispatched:!1,status:null,wake:null};let u;try{u=re(l)}catch(h){let _=h instanceof Error?h.message:String(h);return Fr(e.db,l.name,"ENV-ERROR",r),ac(e.db,l.name,new Date(r).toISOString()),Ht(e.db,l.name,"ENV-ERROR",r,{note:_}),{team:l.name,dispatched:!0,status:"ENV-ERROR",wake:"env"}}let f=o(e.heavyLockStatusPath,e.heavyLockPath,void 0,h=>{process.stderr.write(`[scan] heavy-lock probe failed for ${l.name}, treating conservatively as held: ${h.message}
2480
+ `)});if(f.held&&(f.holder===null||f.holder.holder===l.name))return{team:l.name,dispatched:!1,status:null,wake:null};if(vd(e.db,l.name,l.leadAlias,r))return{team:l.name,dispatched:!1,status:null,wake:null};let m=await t({teamfilePath:u,alias:l.leadAlias},e.resolveNudgeMessage(l)),p=ba(m);return Fr(e.db,l.name,p.status,r),ac(e.db,l.name,new Date(r).toISOString()),Ht(e.db,l.name,p.status,r),{team:l.name,dispatched:!0,status:p.status,wake:p.wake}}),c=a.find(l=>l.wake!==null)?.wake??null;return{results:a,wake:c}}async function ose(e,t,n){let r=new Array(e.length),s=0;async function o(){for(;;){let a=s++;if(a>=e.length)return;r[a]=await n(e[a])}}let i=Math.max(1,Math.min(t,e.length));return await Promise.all(Array.from({length:i},()=>o())),r}async function ql(e,t,n={}){let s=await(n.fetchReport??Je)(),o=n.readHeavyLockStatusImpl??fn,i=o(void 0,void 0,void 0,l=>{process.stderr.write(`[scan] heavy-lock probe failed, treating conservatively as held: ${l.message}
2481
2481
  `)}),a=km(n.promptsDir);return(n.scanOnceImpl??MP)({db:e,teams:t.filter(K),report:s,heavyLock:i,readHeavyLockStatusImpl:o,resolveNudgeMessage:l=>Rm(a,l)})}function Hl(e){let t=e.results.map(n=>`${n.team}: ${n.dispatched?n.status:"skipped (not stalled)"}`);return t.length?t.join(`
2482
2482
  `):"(no eligible teams)"}async function PP(e,t,n={}){if(t.length===0)throw new Error("usage: lmbee nudge <team> [team2 ...]");let r=e.teams.filter(o=>t.includes(o.name));if(r.length===0)throw new Error(`nudge: no matching teams for: ${t.join(", ")}`);let s=await ql(e.db.db,r,n);return Hl(s)}function UP(e,t,n){let r=Un(e.db.db,t),s={companionTeam:n.companionTeam,workerAlias:n.workerAlias??"Worker",commitThreshold:n.commitThreshold??ny,hoursThresholdMs:n.hoursThresholdMs??ry,shiftStartedTs:r?.companionTeam===n.companionTeam?r?.shiftStartedTs??null:null,shiftStartedSha:r?.companionTeam===n.companionTeam?r?.shiftStartedSha??null:null,turnsDispatched:r?.companionTeam===n.companionTeam?r?.turnsDispatched??0:0,lastReviewedTurn:r?.companionTeam===n.companionTeam?r?.lastReviewedTurn??0:0};return rm(e.db.db,t,s),n.json?JSON.stringify({team:t,...s}):`auto-nudge for ${t} now redirects to ${s.companionTeam}:${s.workerAlias} (review due after ${s.commitThreshold} commits or ${(s.hoursThresholdMs/36e5).toFixed(1)}h, whichever first).
2483
2483
  Manual nudge/enqueue/lctl chat and queue delivery to ${t} are unaffected.`}function FP(e,t,n={}){let r=Un(e.db.db,t)!==null;return d0(e.db.db,t),n.json?JSON.stringify({team:t,redirected:!1}):r?`auto-nudge for ${t} no longer redirects -- back to nudging ${t} directly.`:`auto-nudge for ${t} was not redirected (no-op).`}function ise(e,t){let n=t!==void 0?[t]:sy(e.db.db),r=[];for(let s of n){let o=Un(e.db.db,s);o!==null&&r.push({team:s,config:o})}return r}function jP(e,t,n={}){let r=ise(e,t);return n.json?JSON.stringify(r):r.length===0?t!==void 0?`${t}: not redirected.`:"no teams are currently redirected.":r.map(s=>{let o=s.config.shiftStartedTs!==null?`shift started ${s.config.shiftStartedTs}`:"no shift started yet (redirect configured, auto-continue has not fired for this team since)",i=s.config.turnsDispatched<cl?`, ramp-up turn ${s.config.turnsDispatched}/${cl} (every turn always reviewed)`:"";return`${s.team} -> ${s.config.companionTeam}:${s.config.workerAlias} (${s.config.commitThreshold} commits or ${(s.config.hoursThresholdMs/36e5).toFixed(1)}h) -- ${o}${i}`}).join(`
@@ -2520,22 +2520,22 @@ ${c.join(`
2520
2520
  `)}${l}`}import{readFileSync as xse,statSync as oU}from"node:fs";function sp(e,t=xse){try{let n=t(`/proc/${e}/stat`,"utf8");return n.slice(n.lastIndexOf(")")+2).trim().split(/\s+/)[19]??null}catch{return null}}function Lse(e,t=process.kill,n=sp){let r;try{t(e.pid,0),r=!0}catch(o){r=o.code==="EPERM"}return r?e.startTicks===null?{alive:!0,identityVerified:!1}:n(e.pid)===e.startTicks?{alive:!0,identityVerified:!0}:{alive:!1,identityVerified:!0}:{alive:!1,identityVerified:e.startTicks!==null}}function Cse(e,t=oU){let n=[],r=[],s=[];for(let o of e){let i;try{i=t(o).size}catch{s.push(o);continue}i>0?n.push(o):r.push(o)}return{complete:n,empty:r,missing:s}}function iU(e,t,n=process.kill,r=sp,s=oU){let o=Lse(e,n,r),i=Cse(t,s),a;return o.alive?a="running":t.length===0?a="unknown":i.missing.length===0&&i.empty.length===0?a="finished":i.complete.length>0||i.empty.length>0?a="finished-partial":a="unknown",{status:a,process:o,artifacts:i}}function aU(e,t={}){let n=sp(e);return t.json?JSON.stringify({pid:e,startTicks:n}):n===null?`could not capture an identity for pid ${e} -- process may not exist, or /proc is unavailable (non-Linux)`:`pid ${e} startTicks=${n} -- save this and pass it back as --start-ticks to \`dispatch-status check\` later`}function Ose(e,t){let n=[`status: ${t.status}`];return n.push(`process: pid ${e}, alive=${t.process.alive}, identityVerified=${t.process.identityVerified}`),!t.process.identityVerified&&t.process.alive&&n.push(' (no start-ticks identity was given -- "alive" reflects raw pid existence only, PID reuse cannot be ruled out)'),t.artifacts.complete.length>0&&n.push(` complete: ${t.artifacts.complete.join(", ")}`),t.artifacts.empty.length>0&&n.push(` empty (exists, zero bytes): ${t.artifacts.empty.join(", ")}`),t.artifacts.missing.length>0&&n.push(` missing: ${t.artifacts.missing.join(", ")}`),n.join(`
2521
2521
  `)}function cU(e,t,n={}){let r=iU({pid:e,startTicks:n.startTicks??null},t);return n.json?JSON.stringify({pid:e,...r}):Ose(e,r)}function lU(e,t,n,r,s={}){return N$(e.db.db,t,n,r),s.json?JSON.stringify({name:t,teamfilePath:n,alias:r}):`logical name "${t}" -> ${n}:${r}`}function dU(e,t,n={}){let r=Ym(e.db.db,t);return n.json?JSON.stringify(r):r===null?`"${t}" is not registered`:`"${t}" -> ${r.teamfilePath}:${r.alias}`}function uU(e,t={}){let n=x$(e.db.db);return t.json?JSON.stringify(n):n.length===0?"no logical names registered":n.map(r=>`${r.name} -> ${r.teamfilePath}:${r.alias} (updated ${r.updatedAt})`).join(`
2522
2522
  `)}function fU(e,t,n={}){let r=Ym(e.db.db,t)!==null;return L$(e.db.db,t),n.json?JSON.stringify({name:t,cleared:r}):r?`logical name "${t}" cleared`:`"${t}" was not registered (no-op)`}import{execFile as Dse}from"node:child_process";import{promisify as $se}from"node:util";var rs=Cn(Jn(),1),mU=$se(Dse);async function Mse(e){try{let[{stdout:t},{stdout:n}]=await Promise.all([mU("git",["-C",e,"log","--oneline","-1"],{timeout:1e4}),mU("git",["-C",e,"status","--porcelain"],{timeout:1e4})]),r=n.split(`
2523
- `).filter(s=>s.trim().length>0).length;return{head:t.trim().slice(0,48)||"(empty)",dirty:String(r)}}catch{return{head:"(no git)",dirty:"-"}}}function Pse(e,t){return K(e)?wt(e,t)?"Running":To(e,t)?"Dead":"Idle":"remote -- delivery only"}async function pU(e,t={}){let r=await(t.fetchReport??Je)(),s=t.only&&t.only.length>0?new Set(t.only):null,o=s?e.teams.filter(c=>s.has(c.name)):e.teams,i=["TEAM","LIVE","STATUS(self-report)","PROGRESS","GIT-HEAD","UNCOMMITTED"],a=await Promise.all(o.map(async c=>{let l=yt(e.db.db,c.name),d=fe(e.db.db,c.name),u=K(c)?await Mse(c.repoPath):{head:"(remote)",dirty:"-"},f=d?.confirmed_done_ts?"DONE(confirmed)":d?.progress_status??"?";return[(0,rs.escapeCell)(c.name),(0,rs.escapeCell)(Pse(c,r)),(0,rs.escapeCell)(l?.status??"?"),(0,rs.escapeCell)(f),(0,rs.escapeCell)(u.head),(0,rs.escapeCell)(u.dirty)]}));return(0,rs.formatTable)([i,...a])}var Use=8,Fse=18e5;function Vw(e){return e.teams.filter(K).filter(t=>t.autoNudge)}function jse(e){let t=Vw(e);return t.length>0&&t.every(n=>fe(e.db.db,n.name)?.confirmed_done_ts)}async function hU(e,t={}){let n=await ql(e.db.db,Vw(e),t);return Hl(n)}async function _U(e,t={}){let n=t.maxScans??Use,r=t.scanIntervalMs??Fse,s=t.sleep??(i=>new Promise(a=>setTimeout(a,i))),o="(no scans ran)";for(let i=1;i<=n;i++){let a=await ql(e.db.db,Vw(e),t);if(o=Hl(a),a.wake)return`AUTOPILOT WAKE [${a.wake}]:
2523
+ `).filter(s=>s.trim().length>0).length;return{head:t.trim().slice(0,48)||"(empty)",dirty:String(r)}}catch{return{head:"(no git)",dirty:"-"}}}function Pse(e,t){return K(e)?Tt(e,t)?"Running":To(e,t)?"Dead":"Idle":"remote -- delivery only"}async function pU(e,t={}){let r=await(t.fetchReport??Je)(),s=t.only&&t.only.length>0?new Set(t.only):null,o=s?e.teams.filter(c=>s.has(c.name)):e.teams,i=["TEAM","LIVE","STATUS(self-report)","PROGRESS","GIT-HEAD","UNCOMMITTED"],a=await Promise.all(o.map(async c=>{let l=wt(e.db.db,c.name),d=fe(e.db.db,c.name),u=K(c)?await Mse(c.repoPath):{head:"(remote)",dirty:"-"},f=d?.confirmed_done_ts?"DONE(confirmed)":d?.progress_status??"?";return[(0,rs.escapeCell)(c.name),(0,rs.escapeCell)(Pse(c,r)),(0,rs.escapeCell)(l?.status??"?"),(0,rs.escapeCell)(f),(0,rs.escapeCell)(u.head),(0,rs.escapeCell)(u.dirty)]}));return(0,rs.formatTable)([i,...a])}var Use=8,Fse=18e5;function Vw(e){return e.teams.filter(K).filter(t=>t.autoNudge)}function jse(e){let t=Vw(e);return t.length>0&&t.every(n=>fe(e.db.db,n.name)?.confirmed_done_ts)}async function hU(e,t={}){let n=await ql(e.db.db,Vw(e),t);return Hl(n)}async function _U(e,t={}){let n=t.maxScans??Use,r=t.scanIntervalMs??Fse,s=t.sleep??(i=>new Promise(a=>setTimeout(a,i))),o="(no scans ran)";for(let i=1;i<=n;i++){let a=await ql(e.db.db,Vw(e),t);if(o=Hl(a),a.wake)return`AUTOPILOT WAKE [${a.wake}]:
2524
2524
  ${o}`;if(jse(e))return`AUTOPILOT WAKE [all-done]:
2525
2525
  ${o}`;i<n&&await s(r)}return`AUTOPILOT WAKE [heartbeat]: exhausted ${n} scans with no wake condition
2526
2526
  ${o}`}function qse(e){let t=Ks(e.db.db);return{paused:t!==null,state:t}}function gU(e,t={}){let n=qse(e);if(t.json)return JSON.stringify(n);if(!n.paused)return"auto-scan: running (auto-continue nudges active)";let r=n.state;return`auto-scan: paused${` since ${r.paused_at}`+(r.actor!==null?`, by ${r.actor}`:"")+(r.note!==null?` -- ${r.note}`:"")+(r.resume_after!==null?` (resume_after: ${r.resume_after})`:"")}
2527
2527
  (manual nudge and queue delivery are unaffected)`}function EU(e,t={}){let n={paused_at:new Date().toISOString(),actor:t.actor??null,note:t.note??null,resume_after:t.resumeAfter??null};if(n.resume_after!==null&&Number.isNaN(Date.parse(n.resume_after)))throw new Error(`--resume-after "${n.resume_after}" is not a parseable timestamp`);if(FC(e.db.db,n),t.json)return JSON.stringify({paused:!0,state:n});let r=n.resume_after!==null?` (flagged stale if still paused past ${n.resume_after})`:"";return`auto-scan paused at ${n.paused_at}${r} -- the daemon stops auto-continue nudging within one tick.
2528
- (manual nudge and queue delivery are unaffected; \`lmbee scan start\` resumes)`}function yU(e,t={}){let n=Ks(e.db.db)!==null;return jC(e.db.db),t.json?JSON.stringify({paused:!1,state:null}):n?"auto-scan resumed -- the daemon picks it up within one tick.":"auto-scan is already running (no pause was in effect)."}async function wU(e,t,n,r={}){let{baseId:s,alias:o}=wo(t),i=e.teams.find(w=>w.name===s);if(!i)throw new Error(`send: unknown team "${s}"`);if(!K(i))throw new Error(`send: team "${s}" is a remote team (channel=lmmail) -- not reachable via lctl`);let a=o??i.leadAlias,c=re(i),l=ho(i);if(l.length>0&&!l.some(w=>w.alias===a))throw new Error(`send: "${a}" is not a configured member of team "${s}" -- actual members: ${l.map(w=>w.alias).join(", ")}`);let d=Zs("send",n,r.literal),u=r.send??ar,f=r.probe??Nl,m=r.nowMs??Date.now(),p=await u({teamfilePath:c,alias:a},d),h=ba(p);if(Ur(e.db.db,i.name,h.status,m),Ht(e.db.db,i.name,h.status,m,{note:"send"}),h.status==="ENV-ERROR"||h.status==="NO-OUTPUT")try{(await f(c,a)).sessionResolves||_$(e.db.db,c,a,{kind:"evicted",remedy:`lctl refresh ${c} ${a}`})}catch{}else $l(e.db.db,c,a)!==null&&g$(e.db.db,c,a);let _=p.kind==="ok"?p.replyText.split(`
2528
+ (manual nudge and queue delivery are unaffected; \`lmbee scan start\` resumes)`}function yU(e,t={}){let n=Ks(e.db.db)!==null;return jC(e.db.db),t.json?JSON.stringify({paused:!1,state:null}):n?"auto-scan resumed -- the daemon picks it up within one tick.":"auto-scan is already running (no pause was in effect)."}async function wU(e,t,n,r={}){let{baseId:s,alias:o}=wo(t),i=e.teams.find(w=>w.name===s);if(!i)throw new Error(`send: unknown team "${s}"`);if(!K(i))throw new Error(`send: team "${s}" is a remote team (channel=lmmail) -- not reachable via lctl`);let a=o??i.leadAlias,c=re(i),l=ho(i);if(l.length>0&&!l.some(w=>w.alias===a))throw new Error(`send: "${a}" is not a configured member of team "${s}" -- actual members: ${l.map(w=>w.alias).join(", ")}`);let d=Zs("send",n,r.literal),u=r.send??ar,f=r.probe??Nl,m=r.nowMs??Date.now(),p=await u({teamfilePath:c,alias:a},d),h=ba(p);if(Fr(e.db.db,i.name,h.status,m),Ht(e.db.db,i.name,h.status,m,{note:"send"}),h.status==="ENV-ERROR"||h.status==="NO-OUTPUT")try{(await f(c,a)).sessionResolves||_$(e.db.db,c,a,{kind:"evicted",remedy:`lctl refresh ${c} ${a}`})}catch{}else $l(e.db.db,c,a)!==null&&g$(e.db.db,c,a);let _=p.kind==="ok"?p.replyText.split(`
2529
2529
  `).slice(-6).join(`
2530
2530
  `):"";return`${a===i.leadAlias?i.name:`${i.name}:${a}`}: ${h.status}${_?`
2531
2531
  ${_}`:""}`}import{spawnSync as Wse}from"node:child_process";var Bse=2e3,Gse=3e4;async function TU(e,t,n,r={}){let{baseId:s,alias:o}=wo(t),i=s.endsWith(".lmctl")?s.slice(0,-6):null,a=i??s,c=n??o,l=e.teams.find(N=>N.name===a);if(l===void 0||!K(l)){if(i!==null)return{output:`terminal: "${s}" is not a known local team -- did you mean "${i}"?
2532
2532
  (lctl takes a teamfile path; lmbee takes a team name)`,exitCode:1};let N=e.teams.filter(K).map(k=>k.name).sort();return{output:`terminal: "${s}" is not a known local team -- known local teams: ${N.length>0?N.join(", "):"(none configured)"}`,exitCode:1}}let d=c??l.leadAlias,u;try{u=re(l)}catch(N){return{output:`terminal: could not resolve ${a}'s teamfile: ${N instanceof Error?N.message:String(N)}`,exitCode:1}}let f=r.pollIntervalMs??Bse,m=r.leaseMs??6e4,p=r.maxWaitMs??Gse,h=r.fetchReport??Je,_=r.spawnSyncImpl??Wse,g=r.sleep??(N=>new Promise(k=>setTimeout(k,N))),w=r.now??Date.now,y=r.reason??null,E=r.pid??process.pid,T=w();if(Zv(e.db.db,a,d,E,new Date(T).toISOString(),y,m)===null){let N=sh(e.db.db,a,d,T),k=N?`held by pid ${N.holderPid} since ${N.reservedAt}${N.reason?` (${N.reason})`:""}`:"held by another acquirer";return{output:`terminal: ${a}:${d} is already reserved -- ${k}`,exitCode:1}}let A=[`reserved ${a}:${d} -- no other automated dispatch (queue delivery, auto-scan, escalation) will claim it while this runs`],I=!1;try{for(;;){let N=await h();if(!$v(u,d,N))break;if(w()-T>=p){I=!0;break}await g(f)}}finally{tS(e.db.db,a,d,E)}if(I)return A.push(`${a}:${d} is still busy after ${ve(p)} -- reservation released, try again`),{output:A.join(`
2533
2533
  `),exitCode:1};A.push(`${a}:${d} is available -- launching terminal now (reservation released)`);let R=_("lmctl",["terminal",u,d],{stdio:"inherit"}),L=R.status??(R.error?1:0);return{output:A.join(`
2534
2534
  `),exitCode:L}}import{readFileSync as IU}from"node:fs";import{basename as Kse}from"node:path";import{execFileSync as vU}from"node:child_process";import{dirname as Xse}from"node:path";var Vse=new Set(["done","closed","cancelled"]);function Jse(e){return e.trim().toLowerCase().replace(/[\s_]+/g,"-")}function Yse(e){return Xse(e)}function SU(e,t,n=vU){let r=it(e,t);return bU(r,n)}function bU(e,t){let n={id:e.id,title:e.title,status:e.status};if(Vse.has(Jse(e.status)))return{...n,repoRoot:null,commits:[],checkError:"already terminal -- nothing to audit"};if(e.owner_team_path===null)return{...n,repoRoot:null,commits:[],checkError:"unowned -- no repo to check"};let r=Yse(e.owner_team_path),s=`#${e.id}([^0-9]|$)`;try{let i=t("git",["-C",r,"log","--oneline","--date=short","--pretty=format:%h %ad %s","-i","-E",`--grep=${s}`,`--since=${e.created_at}`],{encoding:"utf8"}).split(`
2535
- `).filter(a=>a.trim().length>0).map(a=>{let[c,l,...d]=a.split(" ");return{hash:c??"",date:l??"",subject:d.join(" ")}});return{...n,repoRoot:r,commits:i,checkError:null}}catch(o){let i=o instanceof Error?o.message:String(o);return{...n,repoRoot:r,commits:[],checkError:`could not check ${r}: ${i}`}}}function AU(e,t,n=vU){let r=Es(e,t),s=[],o=i=>{s.push(i);for(let a of i.children)o(a)};return o(r),s.map(i=>bU(i,n))}var NU=["unassigned","clear-parent","clear-owner","attention","clear-blocked-on"];function ro(e,t,n,r){let s=e[t],o=e[n];if(s!==void 0&&o!==void 0)throw new H("INVALID_ARGUMENT",`--${t} and --${n} are mutually exclusive`);if(typeof s=="string")return s;if(typeof o=="string"){if(o==="-"){if(r.used)throw new H("INVALID_ARGUMENT","At most one input may read stdin");r.used=!0;try{return IU(0,"utf8")}catch(i){throw new H("INPUT_ERROR",`Cannot read UTF-8 input from stdin: ${i instanceof Error?i.message:String(i)}`)}}try{return IU(o,"utf8")}catch(i){throw new H("INPUT_ERROR",`Cannot read UTF-8 input from ${o}: ${i instanceof Error?i.message:String(i)}`)}}}function Rr(e,t,n={}){if(e===void 0)return;if(typeof e!="string"||!/^\d+$/.test(e))throw new H("INVALID_ARGUMENT",`${t} must be a nonnegative integer`);let r=Number(e),s=n.minimum??1;if(!Number.isSafeInteger(r)||r<s||n.maximum!==void 0&&r>n.maximum){let o=n.maximum!==void 0?`between ${s} and ${n.maximum}`:`>= ${s}`;throw new H("INVALID_ARGUMENT",`${t} must be an integer ${o}`)}return r}function kr(e,t){let n=Rr(e,t,{minimum:1});if(n===void 0)throw new H("INVALID_ARGUMENT",`${t} is required`);return n}function op(e,t){let n=e[`${t}-team`],r=e[`${t}-alias`];if(!(n===void 0&&r===void 0)){if(n===void 0||r===void 0)throw new H("INVALID_ARGUMENT",`--${t}-team and --${t}-alias must both be given`);if(typeof n!="string"||typeof r!="string")throw new H("INVALID_ARGUMENT",`--${t}-team and --${t}-alias require values`);return{team:n,alias:r}}}function kU(e,t,n){let r=typeof e["blocked-on"]=="string"?e["blocked-on"]:void 0;if(r!==void 0&&r!=="operator"&&!t.some(s=>s.name===r))throw new H("INVALID_ARGUMENT",`--blocked-on "${r}" is not "operator" or a registered team name`);if(r!==void 0&&r!=="operator"&&n&&Kse(n)===`${r}.lmctl`)throw new H("INVALID_ARGUMENT",`--blocked-on "${r}" is this task's own owner team -- a team cannot be blocked on itself`);return r}function RU(e){return e==="epic"||e==="task"||e==="subtask"}function Yn(e,t,n={}){return e?JSON.stringify({schema_version:1,ok:!0,data:t,meta:n}):Qse(t,n)}function zse(e,t){return e?{output:JSON.stringify({schema_version:1,ok:!1,error:{code:t.code,message:t.message}}),exitCode:t.exitCode}:{output:`${t.code}: ${t.message}`,exitCode:t.exitCode}}function Qse(e,t){let n;Array.isArray(e)?n=e.length===0?"(empty)":e.map(s=>s&&typeof s=="object"&&"title"in s?[..."attentionReason"in s?["attentionReason"]:[],"id","kind","status","project","title"].map(o=>String(s[o]??"")).join(" "):JSON.stringify(s)).join(`
2535
+ `).filter(a=>a.trim().length>0).map(a=>{let[c,l,...d]=a.split(" ");return{hash:c??"",date:l??"",subject:d.join(" ")}});return{...n,repoRoot:r,commits:i,checkError:null}}catch(o){let i=o instanceof Error?o.message:String(o);return{...n,repoRoot:r,commits:[],checkError:`could not check ${r}: ${i}`}}}function AU(e,t,n=vU){let r=Es(e,t),s=[],o=i=>{s.push(i);for(let a of i.children)o(a)};return o(r),s.map(i=>bU(i,n))}var NU=["unassigned","clear-parent","clear-owner","attention","clear-blocked-on"];function ro(e,t,n,r){let s=e[t],o=e[n];if(s!==void 0&&o!==void 0)throw new H("INVALID_ARGUMENT",`--${t} and --${n} are mutually exclusive`);if(typeof s=="string")return s;if(typeof o=="string"){if(o==="-"){if(r.used)throw new H("INVALID_ARGUMENT","At most one input may read stdin");r.used=!0;try{return IU(0,"utf8")}catch(i){throw new H("INPUT_ERROR",`Cannot read UTF-8 input from stdin: ${i instanceof Error?i.message:String(i)}`)}}try{return IU(o,"utf8")}catch(i){throw new H("INPUT_ERROR",`Cannot read UTF-8 input from ${o}: ${i instanceof Error?i.message:String(i)}`)}}}function Nr(e,t,n={}){if(e===void 0)return;if(typeof e!="string"||!/^\d+$/.test(e))throw new H("INVALID_ARGUMENT",`${t} must be a nonnegative integer`);let r=Number(e),s=n.minimum??1;if(!Number.isSafeInteger(r)||r<s||n.maximum!==void 0&&r>n.maximum){let o=n.maximum!==void 0?`between ${s} and ${n.maximum}`:`>= ${s}`;throw new H("INVALID_ARGUMENT",`${t} must be an integer ${o}`)}return r}function Rr(e,t){let n=Nr(e,t,{minimum:1});if(n===void 0)throw new H("INVALID_ARGUMENT",`${t} is required`);return n}function op(e,t){let n=e[`${t}-team`],r=e[`${t}-alias`];if(!(n===void 0&&r===void 0)){if(n===void 0||r===void 0)throw new H("INVALID_ARGUMENT",`--${t}-team and --${t}-alias must both be given`);if(typeof n!="string"||typeof r!="string")throw new H("INVALID_ARGUMENT",`--${t}-team and --${t}-alias require values`);return{team:n,alias:r}}}function kU(e,t,n){let r=typeof e["blocked-on"]=="string"?e["blocked-on"]:void 0;if(r!==void 0&&r!=="operator"&&!t.some(s=>s.name===r))throw new H("INVALID_ARGUMENT",`--blocked-on "${r}" is not "operator" or a registered team name`);if(r!==void 0&&r!=="operator"&&n&&Kse(n)===`${r}.lmctl`)throw new H("INVALID_ARGUMENT",`--blocked-on "${r}" is this task's own owner team -- a team cannot be blocked on itself`);return r}function RU(e){return e==="epic"||e==="task"||e==="subtask"}function Yn(e,t,n={}){return e?JSON.stringify({schema_version:1,ok:!0,data:t,meta:n}):Qse(t,n)}function zse(e,t){return e?{output:JSON.stringify({schema_version:1,ok:!1,error:{code:t.code,message:t.message}}),exitCode:t.exitCode}:{output:`${t.code}: ${t.message}`,exitCode:t.exitCode}}function Qse(e,t){let n;Array.isArray(e)?n=e.length===0?"(empty)":e.map(s=>s&&typeof s=="object"&&"title"in s?[..."attentionReason"in s?["attentionReason"]:[],"id","kind","status","project","title"].map(o=>String(s[o]??"")).join(" "):JSON.stringify(s)).join(`
2536
2536
  `):typeof e=="string"?n=e:n=JSON.stringify(e,null,2);let r=t.next_cursor;return r!=null?`${n}
2537
2537
  More records: --after ${String(r)}`:n}function Zse(e){return e.length===0?"(no non-terminal tasks in scope)":e.map(n=>{if(n.checkError!==null)return`#${n.id} [${n.status}] ${n.title} -- ${n.checkError}`;if(n.commits.length===0)return`#${n.id} [${n.status}] ${n.title} -- no commits mention #${n.id} in ${n.repoRoot} since it was created`;let r=n.commits[0];return`#${n.id} [${n.status}] ${n.title} -- POSSIBLY DONE: ${n.commits.length} commit(s) mention #${n.id} in ${n.repoRoot} since creation, most recent ${r.hash} (${r.date}) ${r.subject}`}).join(`
2538
- `)}var eoe="usage: lmbee tasks create <epic|task|subtask> --title TEXT [--parent ID] [--project LABEL] [--status TEXT] [--blocked-on operator|TEAM] [--owner-team PATH --owner-alias ALIAS | --unassigned] (--blocked-on without --status implies --status blocked) | show ID | list [--project L] [--kind K] [--status S] [--parent ID] [--owner-team P --owner-alias A | --unassigned] [--limit N] [--after ID] | list --attention [--project L] | update ID [--title T] [--status S] [--parent ID | --clear-parent] [--owner-team P --owner-alias A | --clear-owner] [--if-revision N] [--blocked-on operator|TEAM | --clear-blocked-on] (--blocked-on without --status implies --status blocked) | tree ID | summary [ID] [--project L] | audit ID | audit --epic ID | note add ID --body T|--body-file P | note list ID | dep add|remove ID REQUIRED_ID | dep list ID [--direction D]";function xU(e,t,n,r,s=[]){try{let[o,...i]=t,a={used:!1};switch(o){case"create":{let c=i[0];if(c===void 0||!RU(c))throw new H("INVALID_ARGUMENT","create requires a kind: epic, task, or subtask");let l=n.title;if(typeof l!="string")throw new H("INVALID_ARGUMENT","--title is required");let d=op(n,"owner"),u=kU(n,s,d?.team),f=typeof n.status=="string"?n.status:void 0,m=DS(e,{kind:c,title:l,parentId:Rr(n.parent,"--parent"),project:typeof n.project=="string"?n.project:void 0,status:f??(u!==void 0?"blocked":void 0),blockedOn:u,owner:d,unassigned:n.unassigned===!0,description:ro(n,"description","description-file",a),requirements:ro(n,"requirements","requirements-file",a),acceptanceCriteria:ro(n,"acceptance-criteria","acceptance-criteria-file",a)});return{output:Yn(r,m),exitCode:0}}case"show":{let c=kr(i[0],"id");return{output:Yn(r,gs(e,c)),exitCode:0}}case"tree":{let c=kr(i[0],"id");return{output:Yn(r,Es(e,c)),exitCode:0}}case"list":{if(n.attention===!0){let f=typeof n.project=="string"?n.project:void 0,m=HS(e,{project:f});return{output:Yn(r,m),exitCode:0}}let c=op(n,"owner"),l=n.kind;if(l!==void 0&&(typeof l!="string"||!RU(l)))throw new H("INVALID_ARGUMENT","--kind must be epic, task, or subtask");let{rows:d,meta:u}=_s(e,{project:typeof n.project=="string"?n.project:void 0,kind:typeof l=="string"?l:void 0,status:typeof n.status=="string"?n.status:void 0,parentId:Rr(n.parent,"--parent"),owner:c,unassigned:n.unassigned===!0,limit:Rr(n.limit,"--limit",{maximum:et})??100,after:Rr(n.after,"--after",{minimum:0})??0});return{output:Yn(r,d,u),exitCode:0}}case"audit":{let c=Rr(n.epic,"--epic"),l=i[0];if(c===void 0==(l===void 0))throw new H("INVALID_ARGUMENT","audit requires exactly one of: an id, or --epic ID");let d=c!==void 0?AU(e,c):[SU(e,kr(l,"id"))];return r?{output:JSON.stringify({schema_version:1,ok:!0,data:d}),exitCode:0}:{output:Zse(d),exitCode:0}}case"summary":{let c=i[0]!==void 0?kr(i[0],"id"):void 0,l=typeof n.project=="string"?n.project:void 0;return{output:Yn(r,ys(e,{id:c,project:l})),exitCode:0}}case"update":{let c=kr(i[0],"id"),l=op(n,"owner"),d=Rr(n.parent,"--parent");if(d!==void 0&&n["clear-parent"]===!0)throw new H("INVALID_ARGUMENT","--parent and --clear-parent are exclusive");let u=l?.team??(n["clear-owner"]===!0?null:it(e,c).owner_team_path),f=kU(n,s,u),m=typeof n.status=="string"?n.status:void 0,p=Od(e,c,{title:typeof n.title=="string"?n.title:void 0,status:m??(f!==void 0?"blocked":void 0),parentId:d,clearParent:n["clear-parent"]===!0,owner:l,clearOwner:n["clear-owner"]===!0,ifRevision:Rr(n["if-revision"],"--if-revision"),description:ro(n,"description","description-file",a),requirements:ro(n,"requirements","requirements-file",a),acceptanceCriteria:ro(n,"acceptance-criteria","acceptance-criteria-file",a),holdUntil:typeof n["hold-until"]=="string"?n["hold-until"]:void 0,holdReason:ro(n,"hold-reason","hold-reason-file",a),clearHold:n["clear-hold"]===!0,blockedOn:f,clearBlockedOn:n["clear-blocked-on"]===!0});return{output:Yn(r,p),exitCode:0}}case"note":{let[c,...l]=i;if(c==="add"){let d=kr(l[0],"id"),u=ro(n,"body","body-file",a);if(u===void 0)throw new H("INVALID_ARGUMENT","--body or --body-file is required");let f=op(n,"author");return{output:Yn(r,cr(e,d,{body:u,author:f})),exitCode:0}}if(c==="list"){let d=kr(l[0],"id"),{rows:u,meta:f}=gh(e,d,{limit:Rr(n.limit,"--limit",{maximum:et})??100,after:Rr(n.after,"--after",{minimum:0})??0});return{output:Yn(r,u,f),exitCode:0}}throw new H("INVALID_ARGUMENT","note requires add or list")}case"dep":{let[c,...l]=i;if(c==="add"||c==="remove"){let d=kr(l[0],"id"),u=kr(l[1],"required_id"),f=c==="add"?jS(e,d,u):qS(e,d,u);return{output:Yn(r,f),exitCode:0}}if(c==="list"){let d=kr(l[0],"id"),u=n.direction;if(u!==void 0&&u!=="outgoing"&&u!=="incoming"&&u!=="both")throw new H("INVALID_ARGUMENT","--direction must be outgoing, incoming, or both");return it(e,d),{output:Yn(r,rn(e,d,u??"outgoing")),exitCode:0}}throw new H("INVALID_ARGUMENT","dep requires add, remove, or list")}default:return{output:eoe,exitCode:r?2:1}}}catch(o){if(o instanceof H)return zse(r,o);throw o}}var hn=Cn(Jn(),1);var toe=20;function noe(e,t,n={}){let r=hd(e.teams,t),s=n.limit??toe,o=Sw(e,{toId:t,limit:s}).rows,i=Sw(e,{fromId:t,limit:s}).rows,a=null;if(r.kind==="local"&&r.repoPath!==void 0&&r.leadAlias!==void 0)try{let c=re({name:r.key,repoPath:r.repoPath});a=Ke(e.db.db,c,r.leadAlias)?.entities??[]}catch{a=null}return{team:{key:r.key,kind:r.kind},messagesTo:o,messagesFrom:i,ownedTasks:a,invocationHistoryCoverage:"unavailable"}}function LU(e,t,n={}){let r=noe(e,t,n);if(n.json)return JSON.stringify(r);let s=[];s.push(`Team: ${r.team.key} (${r.team.kind})`);let o=[],i=r.messagesTo.map(d=>[String(d.id),(0,hn.escapeCell)(d.from_id),(0,hn.escapeCell)(d.status),ke(d.created_ts)]),a=r.messagesFrom.map(d=>[String(d.id),(0,hn.escapeCell)(d.to_id),(0,hn.escapeCell)(d.status),ke(d.created_ts)]),c=(r.ownedTasks??[]).map(d=>[String(d.id),(0,hn.escapeCell)(d.kind),(0,hn.escapeCell)(d.status),(0,hn.escapeCell)(d.title)]);i.length>0&&o.push({rows:i,headers:["ID","FROM","STATUS","CREATED"]}),a.length>0&&o.push({rows:a,headers:["ID","TO","STATUS","CREATED"]}),c.length>0&&o.push({rows:c,headers:["ID","KIND","STATUS","TITLE"]});let l=(0,hn.measureColumns)(o);return s.push(`
2538
+ `)}var eoe="usage: lmbee tasks create <epic|task|subtask> --title TEXT [--parent ID] [--project LABEL] [--status TEXT] [--blocked-on operator|TEAM] [--owner-team PATH --owner-alias ALIAS | --unassigned] (--blocked-on without --status implies --status blocked) | show ID | list [--project L] [--kind K] [--status S] [--parent ID] [--owner-team P --owner-alias A | --unassigned] [--limit N] [--after ID] | list --attention [--project L] | update ID [--title T] [--status S] [--parent ID | --clear-parent] [--owner-team P --owner-alias A | --clear-owner] [--if-revision N] [--blocked-on operator|TEAM | --clear-blocked-on] (--blocked-on without --status implies --status blocked) | tree ID | summary [ID] [--project L] | audit ID | audit --epic ID | note add ID --body T|--body-file P | note list ID | dep add|remove ID REQUIRED_ID | dep list ID [--direction D]";function xU(e,t,n,r,s=[]){try{let[o,...i]=t,a={used:!1};switch(o){case"create":{let c=i[0];if(c===void 0||!RU(c))throw new H("INVALID_ARGUMENT","create requires a kind: epic, task, or subtask");let l=n.title;if(typeof l!="string")throw new H("INVALID_ARGUMENT","--title is required");let d=op(n,"owner"),u=kU(n,s,d?.team),f=typeof n.status=="string"?n.status:void 0,m=DS(e,{kind:c,title:l,parentId:Nr(n.parent,"--parent"),project:typeof n.project=="string"?n.project:void 0,status:f??(u!==void 0?"blocked":void 0),blockedOn:u,owner:d,unassigned:n.unassigned===!0,description:ro(n,"description","description-file",a),requirements:ro(n,"requirements","requirements-file",a),acceptanceCriteria:ro(n,"acceptance-criteria","acceptance-criteria-file",a)});return{output:Yn(r,m),exitCode:0}}case"show":{let c=Rr(i[0],"id");return{output:Yn(r,gs(e,c)),exitCode:0}}case"tree":{let c=Rr(i[0],"id");return{output:Yn(r,Es(e,c)),exitCode:0}}case"list":{if(n.attention===!0){let f=typeof n.project=="string"?n.project:void 0,m=HS(e,{project:f});return{output:Yn(r,m),exitCode:0}}let c=op(n,"owner"),l=n.kind;if(l!==void 0&&(typeof l!="string"||!RU(l)))throw new H("INVALID_ARGUMENT","--kind must be epic, task, or subtask");let{rows:d,meta:u}=_s(e,{project:typeof n.project=="string"?n.project:void 0,kind:typeof l=="string"?l:void 0,status:typeof n.status=="string"?n.status:void 0,parentId:Nr(n.parent,"--parent"),owner:c,unassigned:n.unassigned===!0,limit:Nr(n.limit,"--limit",{maximum:et})??100,after:Nr(n.after,"--after",{minimum:0})??0});return{output:Yn(r,d,u),exitCode:0}}case"audit":{let c=Nr(n.epic,"--epic"),l=i[0];if(c===void 0==(l===void 0))throw new H("INVALID_ARGUMENT","audit requires exactly one of: an id, or --epic ID");let d=c!==void 0?AU(e,c):[SU(e,Rr(l,"id"))];return r?{output:JSON.stringify({schema_version:1,ok:!0,data:d}),exitCode:0}:{output:Zse(d),exitCode:0}}case"summary":{let c=i[0]!==void 0?Rr(i[0],"id"):void 0,l=typeof n.project=="string"?n.project:void 0;return{output:Yn(r,ys(e,{id:c,project:l})),exitCode:0}}case"update":{let c=Rr(i[0],"id"),l=op(n,"owner"),d=Nr(n.parent,"--parent");if(d!==void 0&&n["clear-parent"]===!0)throw new H("INVALID_ARGUMENT","--parent and --clear-parent are exclusive");let u=l?.team??(n["clear-owner"]===!0?null:it(e,c).owner_team_path),f=kU(n,s,u),m=typeof n.status=="string"?n.status:void 0,p=Od(e,c,{title:typeof n.title=="string"?n.title:void 0,status:m??(f!==void 0?"blocked":void 0),parentId:d,clearParent:n["clear-parent"]===!0,owner:l,clearOwner:n["clear-owner"]===!0,ifRevision:Nr(n["if-revision"],"--if-revision"),description:ro(n,"description","description-file",a),requirements:ro(n,"requirements","requirements-file",a),acceptanceCriteria:ro(n,"acceptance-criteria","acceptance-criteria-file",a),holdUntil:typeof n["hold-until"]=="string"?n["hold-until"]:void 0,holdReason:ro(n,"hold-reason","hold-reason-file",a),clearHold:n["clear-hold"]===!0,blockedOn:f,clearBlockedOn:n["clear-blocked-on"]===!0});return{output:Yn(r,p),exitCode:0}}case"note":{let[c,...l]=i;if(c==="add"){let d=Rr(l[0],"id"),u=ro(n,"body","body-file",a);if(u===void 0)throw new H("INVALID_ARGUMENT","--body or --body-file is required");let f=op(n,"author");return{output:Yn(r,cr(e,d,{body:u,author:f})),exitCode:0}}if(c==="list"){let d=Rr(l[0],"id"),{rows:u,meta:f}=gh(e,d,{limit:Nr(n.limit,"--limit",{maximum:et})??100,after:Nr(n.after,"--after",{minimum:0})??0});return{output:Yn(r,u,f),exitCode:0}}throw new H("INVALID_ARGUMENT","note requires add or list")}case"dep":{let[c,...l]=i;if(c==="add"||c==="remove"){let d=Rr(l[0],"id"),u=Rr(l[1],"required_id"),f=c==="add"?jS(e,d,u):qS(e,d,u);return{output:Yn(r,f),exitCode:0}}if(c==="list"){let d=Rr(l[0],"id"),u=n.direction;if(u!==void 0&&u!=="outgoing"&&u!=="incoming"&&u!=="both")throw new H("INVALID_ARGUMENT","--direction must be outgoing, incoming, or both");return it(e,d),{output:Yn(r,rn(e,d,u??"outgoing")),exitCode:0}}throw new H("INVALID_ARGUMENT","dep requires add, remove, or list")}default:return{output:eoe,exitCode:r?2:1}}}catch(o){if(o instanceof H)return zse(r,o);throw o}}var hn=Cn(Jn(),1);var toe=20;function noe(e,t,n={}){let r=hd(e.teams,t),s=n.limit??toe,o=Sw(e,{toId:t,limit:s}).rows,i=Sw(e,{fromId:t,limit:s}).rows,a=null;if(r.kind==="local"&&r.repoPath!==void 0&&r.leadAlias!==void 0)try{let c=re({name:r.key,repoPath:r.repoPath});a=Ke(e.db.db,c,r.leadAlias)?.entities??[]}catch{a=null}return{team:{key:r.key,kind:r.kind},messagesTo:o,messagesFrom:i,ownedTasks:a,invocationHistoryCoverage:"unavailable"}}function LU(e,t,n={}){let r=noe(e,t,n);if(n.json)return JSON.stringify(r);let s=[];s.push(`Team: ${r.team.key} (${r.team.kind})`);let o=[],i=r.messagesTo.map(d=>[String(d.id),(0,hn.escapeCell)(d.from_id),(0,hn.escapeCell)(d.status),ke(d.created_ts)]),a=r.messagesFrom.map(d=>[String(d.id),(0,hn.escapeCell)(d.to_id),(0,hn.escapeCell)(d.status),ke(d.created_ts)]),c=(r.ownedTasks??[]).map(d=>[String(d.id),(0,hn.escapeCell)(d.kind),(0,hn.escapeCell)(d.status),(0,hn.escapeCell)(d.title)]);i.length>0&&o.push({rows:i,headers:["ID","FROM","STATUS","CREATED"]}),a.length>0&&o.push({rows:a,headers:["ID","TO","STATUS","CREATED"]}),c.length>0&&o.push({rows:c,headers:["ID","KIND","STATUS","TITLE"]});let l=(0,hn.measureColumns)(o);return s.push(`
2539
2539
  Messages to this team (queue, newest first):
2540
2540
  ${i.length===0?"(none)":(0,hn.renderGrid)(i,{widths:l,headers:["ID","FROM","STATUS","CREATED"]})}`),s.push(`
2541
2541
  Messages from this team (queue, newest first):
@@ -2741,11 +2741,11 @@ ${d}`);let m;if(o.mark!==void 0)if(typeof o.mark!="string")m=!0;else{let p=o.mar
2741
2741
  ${d}`);m=p}return{output:oM(e,u,{...f!==void 0?{ids:f}:{},all:o.all===!0,open:o.open===!0,...m!==void 0?{mark:m}:{},json:i,full:o.full===!0}),exitCode:0}}if(a==="close-answered")return c[0]===void 0?oe("usage: lmbee queue close-answered <team> [--ids]"):{output:sM(e,c[0],{json:i,idsOnly:o.ids===!0}),exitCode:0};if(a==="redeliver-check")return c[0]===void 0?oe("usage: lmbee queue redeliver-check <team>"):Y$(e,c[0],{json:i});if(a==="redeliver"){let[d,...u]=c,f="usage: lmbee queue redeliver <id> --reason <text>";if(d===void 0)return oe(f);let p=(typeof o.reason=="string"?o.reason:void 0)??(u.length>0?u.join(" "):void 0);return p===void 0?oe(f):K$(e,Number(d),p,{json:i})}return o.help===!0?{output:`${MU}
2742
2742
  `,exitCode:0}:oe(MU)}case"nudge":return s.length===0?oe("usage: lmbee nudge <team> [team2 ...]"):{output:await PP(e,s),exitCode:0};case"send":{let[a,...c]=s;return a===void 0||c.length===0?oe("usage: lmbee send <team> <prompt|@file> [--literal]"):{output:await wU(e,a,c.join(" "),{literal:o.literal===!0}),exitCode:0}}case"terminal":{let[a,c]=s;if(a===void 0)return oe("usage: lmbee terminal <team>[:<alias>] [<alias>] [--reason <text>]");let l=typeof o.reason=="string"?o.reason:void 0;return TU(e,a,c,{reason:l})}case"history":{let a=s[0]!==void 0&&/^\d+$/.test(s[0]),c=a?void 0:s[0],l=a?s[0]:s[1];return{output:m$(e,c,l,{json:i}),exitCode:0}}case"teams":return{output:yM(e,{json:i}),exitCode:0};case"in-flight":{let a=typeof o.exclude=="string"?o.exclude:void 0;return{output:await sU(e,{...a!==void 0?{exclude:a}:{},json:i}),exitCode:0}}case"dispatch-status":{let[a]=s,c=typeof o.pid=="string"?Number.parseInt(o.pid,10):NaN;if(Number.isNaN(c))return oe("usage: lmbee dispatch-status capture --pid N | check --pid N [--start-ticks T] --artifacts P1,P2,...");if(a==="capture")return{output:aU(c,{json:i}),exitCode:0};if(a==="check"){let l=typeof o.artifacts=="string"?o.artifacts.split(",").map(u=>u.trim()).filter(u=>u.length>0):[],d=typeof o["start-ticks"]=="string"?o["start-ticks"]:void 0;return{output:cU(c,l,{...d!==void 0?{startTicks:d}:{},json:i}),exitCode:0}}return oe("usage: lmbee dispatch-status capture --pid N | check --pid N [--start-ticks T] --artifacts P1,P2,...")}case"logical-name":{let[a,c]=s;if(a==="set"){let l=typeof o.teamfile=="string"?o.teamfile:void 0,d=typeof o.alias=="string"?o.alias:void 0;if(c===void 0||l===void 0||d===void 0)return oe("usage: lmbee logical-name set <name> --teamfile PATH --alias ALIAS");try{return{output:lU(e,c,l,d,{json:i}),exitCode:0}}catch(u){return{output:u instanceof Error?u.message:String(u),exitCode:1}}}return a==="get"?c===void 0?oe("usage: lmbee logical-name get <name>"):{output:dU(e,c,{json:i}),exitCode:0}:a==="list"?{output:uU(e,{json:i}),exitCode:0}:a==="clear"?c===void 0?oe("usage: lmbee logical-name clear <name>"):{output:fU(e,c,{json:i}),exitCode:0}:oe("usage: lmbee logical-name set <name> --teamfile PATH --alias ALIAS | get <name> | list | clear <name>")}case"attention":{let a=typeof o.team=="string"?o.team:void 0,c=typeof o.maintainer=="string"?o.maintainer:void 0,l=o["stuck-processing-all"]===!0,d=await Um(e,{team:a,maintainer:c,stuckProcessingFleetWide:l});return{output:Ll(d,{json:i}),exitCode:0}}case"stalled":{if(s.length>1)return oe("usage: lmbee stalled [team] [--json]");let a=Oa(o["idle-threshold-ms"],"--idle-threshold-ms"),c=Oa(o["cooldown-ms"],"--cooldown-ms");if(a instanceof Error)return oe(a.message);if(c instanceof Error)return oe(c.message);let l=await xP(e,{team:s[0],config:{idleThresholdMs:a??Ie.idleThresholdMs,cooldownMs:c??Ie.cooldownMs}});return{output:i?JSON.stringify(l):l.teams.map(({team:d,stalled:u})=>`${d} ${u}`).join(`
2743
2743
  `),exitCode:0}}case"team":{if(s[0]==="register"){let l=s[1],d=typeof o.teamfile=="string"?o.teamfile:void 0;if(l===void 0||d===void 0)return oe("usage: lmbee team register <name> --teamfile <path> [--alias <alias>]");let u=typeof o.alias=="string"?o.alias:void 0,f=DU(e,l,d,{alias:u});return{output:f.output,exitCode:f.ok?0:1}}let[a]=s;if(a===void 0||o.timeline!==!0)return oe("usage: lmbee team <name> --timeline [--limit N] | lmbee team register <name> --teamfile <path> [--alias <alias>]");let c=Oa(o.limit,"--limit");return c instanceof Error?{output:`error: ${c.message}`,exitCode:1}:c!==void 0&&(c<1||c>oc)?{output:`error: --limit must be a positive integer <= ${oc}`,exitCode:1}:{output:LU(e,a,{limit:c,json:i}),exitCode:0}}case"source":{let[a,...c]=s;if(a==="add"){if(c[0]===void 0)return oe("usage: lmbee source add <path> [label...]");let l=zm(e,c[0],c.slice(1).join(" ")||void 0);return{output:l.output,exitCode:l.ok?0:1}}return a==="list"?{output:lM(e,{json:i}),exitCode:0}:a==="remove"?c[0]===void 0?oe("usage: lmbee source remove <path>"):{output:dM(e,c[0]),exitCode:0}:oe("usage: lmbee source add <path> [label...] | list | remove <path>")}case"mail":{let[a]=s;return a==="status"?{output:h$(e,{json:i}),exitCode:0}:oe("usage: lmbee mail status")}case"scan":{let[a]=s;if(a==="status")return{output:gU(e,{json:i}),exitCode:0};if(a==="pause"){let c=typeof o.actor=="string"?o.actor:void 0,l=typeof o.note=="string"?o.note:void 0,d=typeof o["resume-after"]=="string"?o["resume-after"]:void 0;return{output:EU(e,{...c!==void 0?{actor:c}:{},...l!==void 0?{note:l}:{},...d!==void 0?{resumeAfter:d}:{},json:i}),exitCode:0}}return a==="start"?{output:yU(e,{json:i}),exitCode:0}:oe("usage: lmbee scan pause [--actor NAME] [--note TEXT] [--resume-after ISO] | start | status")}case"auto-nudge-redirect":{let[a,c]=s;if(a==="status")return{output:jP(e,c,{json:i}),exitCode:0};if(a==="clear")return c===void 0?oe("usage: lmbee auto-nudge-redirect clear <team>"):{output:FP(e,c,{json:i}),exitCode:0};if(a==="set"){if(c===void 0||typeof o.companion!="string")return oe("usage: lmbee auto-nudge-redirect set <team> --companion <team> [--worker-alias A] [--commit-threshold N] [--hours-threshold-ms N]");let l=typeof o["worker-alias"]=="string"?o["worker-alias"]:void 0,d=typeof o["commit-threshold"]=="string"?Number.parseInt(o["commit-threshold"],10):void 0,u=typeof o["hours-threshold-ms"]=="string"?Number.parseInt(o["hours-threshold-ms"],10):void 0;return{output:UP(e,c,{companionTeam:o.companion,...l!==void 0?{workerAlias:l}:{},...d!==void 0&&!Number.isNaN(d)?{commitThreshold:d}:{},...u!==void 0&&!Number.isNaN(u)?{hoursThresholdMs:u}:{},json:i}),exitCode:0}}return oe("usage: lmbee auto-nudge-redirect set <team> --companion <team> [...] | clear <team> | status [<team>]")}case"provider":{let[a,c]=s;if(a==="status")return{output:JP(e,c,{json:i}),exitCode:0};if(a==="enable")return c===void 0?oe("usage: lmbee provider enable <name>"):{output:VP(e,c,{json:i}),exitCode:0};if(a==="disable"){if(c===void 0)return oe("usage: lmbee provider disable <name> [--reason TEXT] [--expires-at ISO]");let l=typeof o.reason=="string"?o.reason:void 0,d=typeof o["expires-at"]=="string"?o["expires-at"]:void 0;return{output:XP(e,c,{...l!==void 0?{reason:l}:{},...d!==void 0?{expiresAt:d}:{},json:i}),exitCode:0}}return oe("usage: lmbee provider disable <name> [--reason TEXT] [--expires-at ISO] | enable <name> | status [<name>]")}case"rate-limit":{let[a]=s;if(a==="status")return{output:YP(e,{json:i}),exitCode:0};if(a==="log"){let c=typeof o.provider=="string"?o.provider:void 0,l=typeof o.limit=="string"?Number.parseInt(o.limit,10):void 0,d=l!==void 0&&!Number.isNaN(l)?l:void 0;return{output:KP(e,{...c!==void 0?{provider:c}:{},...d!==void 0?{limit:d}:{},json:i}),exitCode:0}}return oe("usage: lmbee rate-limit status | log [--provider NAME] [--limit N]")}case"reliability-report":try{return{output:eU(e,{json:i}),exitCode:0}}catch(a){return{output:`reliability-report: ${a instanceof Error?a.message:String(a)}`,exitCode:1}}case"subscriptions":{let a=typeof o.config=="string"?o.config:void 0;if(a===void 0)return oe("usage: lmbee subscriptions --config <path> [--json]");try{return{output:await tU(a,{json:i}),exitCode:0}}catch(c){return{output:`subscriptions: ${c instanceof Error?c.message:String(c)}`,exitCode:1}}}case"tasks":{let a=xn(r,["json",...NU]),c=xU(e.db.db,a.positionals,a.flags,a.flags.json===!0||i,e.teams);return{output:c.output,exitCode:c.exitCode}}case"cron":{let a=xn(r,["json",...$P]),c=await DP(e.db.db,a.positionals,a.flags,a.flags.json===!0||i,e.teams);return{output:c.output,exitCode:c.exitCode}}default:return{output:`unknown command: ${n}
2744
- ${so}`,exitCode:1}}}function oe(e){return{output:e,exitCode:1}}import{mkdir as Lae,readFile as Cae,stat as Oae,writeFile as Dae}from"node:fs/promises";import{mkdir as Soe,readFile as rF,stat as boe,writeFile as Aoe}from"node:fs/promises";import{readFileSync as Ioe}from"node:fs";import{homedir as koe}from"node:os";import{dirname as Roe,extname as Noe}from"node:path";var iF="https://lmctl.ai/tools/lmchat";async function aF(e,t={}){let n=Hoe(t),r=zw(e);if(r.kind==="whoami"){n.stdout(qoe(n.env,r.api));return}if(r.kind==="login"){let{runLogin:o}=await Promise.resolve().then(()=>(nF(),tF));if(await o({io:{stdout:{write:a=>n.stdout(a.replace(/\n$/,""))},stderr:{write:a=>n.stderr(a.replace(/\n$/,""))}},env:n.env})!==0)throw new Nr("login failed");return}let s=Uoe(r.api,n.env);if(r.kind==="register-room"){await oo(n.fetch,`${s}/rooms`,{method:"POST",headers:{...ss(n.env),"content-type":"application/json"},body:JSON.stringify({room_name:r.roomName})}),n.stdout(`created ${r.roomName}`);return}if(r.kind==="rooms"){let o=await oo(n.fetch,`${s}/rooms`,{method:"GET",headers:ss(n.env)});if(r.json)n.stdout(JSON.stringify(o.rooms));else{n.stdout("room next_seq created_at");for(let i of o.rooms)n.stdout(`${i.room_name} ${i.next_seq} ${i.created_at}`)}return}if(r.kind==="read"&&await sF(n,s,r),r.kind==="post"){let o=await xoe(n,s,r);n.stdout(String(o));return}if(r.kind==="say"){let o=await Loe(n,s,r);n.stdout(String(o));return}if(r.kind==="list"){await sF(n,s,{...r,kind:"read"});return}if(r.kind==="get"){await Ooe(n,s,r),n.stdout(`saved ${r.out}`);return}if(r.kind==="delete"){let o=await Doe(n,s,r);n.stdout(`deleted ${o}`);return}if(r.kind==="delete-room"){let o=await $oe(n,s,r);n.stdout(`deleted room ${o}`);return}}function zw(e){let t=[...e],n=_t(t,"--api"),r=t.shift();if(!r||r==="help"||r==="--help"||r==="-h")throw new Nr(oF());if(r==="whoami"){let s=_t(t,"--api")??n;return zn(t),{kind:"whoami",...s?{api:s}:{}}}if(r==="login"){let s=_t(t,"--api")??n;return zn(t),{kind:"login",...s?{api:s}:{}}}if(r==="rooms"){let s=_t(t,"--api")??n,o=ap(t,"--json");return zn(t),{kind:"rooms",...o?{json:!0}:{},...s?{api:s}:{}}}if(r==="read"){let s=_t(t,"--api")??n,o=Kn(t,"room_name"),i=_t(t,"--after"),a=_t(t,"--limit"),c=_t(t,"--interval"),l=ap(t,"--follow"),d=ap(t,"--json");return zn(t),{kind:"read",roomName:o,...i!==void 0?{after:i}:{},...a!==void 0?{limit:a}:{},...c!==void 0?{interval:c}:{},...l?{follow:!0}:{},...d?{json:!0}:{},...s?{api:s}:{}}}if(r==="register-room"||r==="create"){let s=_t(t,"--api")??n,o=Kn(t,"room_name");return zn(t),{kind:"register-room",roomName:o,...s?{api:s}:{}}}if(r==="post"){let s=_t(t,"--api")??n,o=Kn(t,"room_name"),i=Yw(t,"--name"),a=Yw(t,"--file"),c=_t(t,"--content-type");return zn(t),{kind:"post",roomName:o,name:i,file:a,...c?{contentType:c}:{},...s?{api:s}:{}}}if(r==="say"){let s=_t(t,"--api")??n,o=Kn(t,"room_name"),i=_t(t,"--title"),a=Kn(t,"text");return zn(t),{kind:"say",roomName:o,text:a,...i?{title:i}:{},...s?{api:s}:{}}}if(r==="list"){let s=_t(t,"--api")??n,o=Kn(t,"room_name"),i=_t(t,"--after"),a=_t(t,"--limit"),c=ap(t,"--json");return zn(t),{kind:"list",roomName:o,...i!==void 0?{after:i}:{},...a!==void 0?{limit:a}:{},...c?{json:!0}:{},...s?{api:s}:{}}}if(r==="get"){let s=_t(t,"--api")??n,o=Kn(t,"room_name"),i=Kn(t,"seq"),a=Yw(t,"--out");return zn(t),{kind:"get",roomName:o,seq:i,out:a,...s?{api:s}:{}}}if(r==="delete"){let s=_t(t,"--api")??n,o=Kn(t,"room_name"),i=Kn(t,"seq");return zn(t),{kind:"delete",roomName:o,seq:i,...s?{api:s}:{}}}if(r==="delete-room"){let s=_t(t,"--api")??n,o=Kn(t,"room_name");return zn(t),{kind:"delete-room",roomName:o,...s?{api:s}:{}}}throw new Nr(`unknown command: ${r}
2744
+ ${so}`,exitCode:1}}}function oe(e){return{output:e,exitCode:1}}import{mkdir as Lae,readFile as Cae,stat as Oae,writeFile as Dae}from"node:fs/promises";import{mkdir as Soe,readFile as rF,stat as boe,writeFile as Aoe}from"node:fs/promises";import{readFileSync as Ioe}from"node:fs";import{homedir as koe}from"node:os";import{dirname as Roe,extname as Noe}from"node:path";var iF="https://lmctl.ai/tools/lmchat";async function aF(e,t={}){let n=Hoe(t),r=zw(e);if(r.kind==="whoami"){n.stdout(qoe(n.env,r.api));return}if(r.kind==="login"){let{runLogin:o}=await Promise.resolve().then(()=>(nF(),tF));if(await o({io:{stdout:{write:a=>n.stdout(a.replace(/\n$/,""))},stderr:{write:a=>n.stderr(a.replace(/\n$/,""))}},env:n.env})!==0)throw new xr("login failed");return}let s=Uoe(r.api,n.env);if(r.kind==="register-room"){await oo(n.fetch,`${s}/rooms`,{method:"POST",headers:{...ss(n.env),"content-type":"application/json"},body:JSON.stringify({room_name:r.roomName})}),n.stdout(`created ${r.roomName}`);return}if(r.kind==="rooms"){let o=await oo(n.fetch,`${s}/rooms`,{method:"GET",headers:ss(n.env)});if(r.json)n.stdout(JSON.stringify(o.rooms));else{n.stdout("room next_seq created_at");for(let i of o.rooms)n.stdout(`${i.room_name} ${i.next_seq} ${i.created_at}`)}return}if(r.kind==="read"&&await sF(n,s,r),r.kind==="post"){let o=await xoe(n,s,r);n.stdout(String(o));return}if(r.kind==="say"){let o=await Loe(n,s,r);n.stdout(String(o));return}if(r.kind==="list"){await sF(n,s,{...r,kind:"read"});return}if(r.kind==="get"){await Ooe(n,s,r),n.stdout(`saved ${r.out}`);return}if(r.kind==="delete"){let o=await Doe(n,s,r);n.stdout(`deleted ${o}`);return}if(r.kind==="delete-room"){let o=await $oe(n,s,r);n.stdout(`deleted room ${o}`);return}}function zw(e){let t=[...e],n=gt(t,"--api"),r=t.shift();if(!r||r==="help"||r==="--help"||r==="-h")throw new xr(oF());if(r==="whoami"){let s=gt(t,"--api")??n;return zn(t),{kind:"whoami",...s?{api:s}:{}}}if(r==="login"){let s=gt(t,"--api")??n;return zn(t),{kind:"login",...s?{api:s}:{}}}if(r==="rooms"){let s=gt(t,"--api")??n,o=ap(t,"--json");return zn(t),{kind:"rooms",...o?{json:!0}:{},...s?{api:s}:{}}}if(r==="read"){let s=gt(t,"--api")??n,o=Kn(t,"room_name"),i=gt(t,"--after"),a=gt(t,"--limit"),c=gt(t,"--interval"),l=ap(t,"--follow"),d=ap(t,"--json");return zn(t),{kind:"read",roomName:o,...i!==void 0?{after:i}:{},...a!==void 0?{limit:a}:{},...c!==void 0?{interval:c}:{},...l?{follow:!0}:{},...d?{json:!0}:{},...s?{api:s}:{}}}if(r==="register-room"||r==="create"){let s=gt(t,"--api")??n,o=Kn(t,"room_name");return zn(t),{kind:"register-room",roomName:o,...s?{api:s}:{}}}if(r==="post"){let s=gt(t,"--api")??n,o=Kn(t,"room_name"),i=Yw(t,"--name"),a=Yw(t,"--file"),c=gt(t,"--content-type");return zn(t),{kind:"post",roomName:o,name:i,file:a,...c?{contentType:c}:{},...s?{api:s}:{}}}if(r==="say"){let s=gt(t,"--api")??n,o=Kn(t,"room_name"),i=gt(t,"--title"),a=Kn(t,"text");return zn(t),{kind:"say",roomName:o,text:a,...i?{title:i}:{},...s?{api:s}:{}}}if(r==="list"){let s=gt(t,"--api")??n,o=Kn(t,"room_name"),i=gt(t,"--after"),a=gt(t,"--limit"),c=ap(t,"--json");return zn(t),{kind:"list",roomName:o,...i!==void 0?{after:i}:{},...a!==void 0?{limit:a}:{},...c?{json:!0}:{},...s?{api:s}:{}}}if(r==="get"){let s=gt(t,"--api")??n,o=Kn(t,"room_name"),i=Kn(t,"seq"),a=Yw(t,"--out");return zn(t),{kind:"get",roomName:o,seq:i,out:a,...s?{api:s}:{}}}if(r==="delete"){let s=gt(t,"--api")??n,o=Kn(t,"room_name"),i=Kn(t,"seq");return zn(t),{kind:"delete",roomName:o,seq:i,...s?{api:s}:{}}}if(r==="delete-room"){let s=gt(t,"--api")??n,o=Kn(t,"room_name");return zn(t),{kind:"delete-room",roomName:o,...s?{api:s}:{}}}throw new xr(`unknown command: ${r}
2745
2745
 
2746
- ${oF()}`)}async function xoe(e,t,n){let r=await e.stat(n.file);if(!r.isFile())throw new Error(`not a file: ${n.file}`);let s=n.contentType??joe(n.name),o=await oo(e.fetch,`${t}/rooms/${encodeURIComponent(n.roomName)}/files`,{method:"POST",headers:{...ss(e.env),"content-type":"application/json"},body:JSON.stringify({name:n.name,content_type:s,size:r.size})}),i=await e.readFile(n.file),a=typeof i=="string"?Buffer.from(i):i,c=new FormData;for(let[u,f]of Object.entries(o.fields))c.append(u,f);c.append("file",new Blob([a],{type:o.content_type}),o.name);let l=await e.fetch(o.upload_url,{method:"POST",body:c});if(!l.ok)throw new Error(`S3 upload failed: ${l.status} ${await l.text().catch(()=>"")}`.trim());return(await oo(e.fetch,`${t}/rooms/${encodeURIComponent(n.roomName)}/files/${encodeURIComponent(String(o.seq))}/commit`,{method:"POST",headers:{...ss(e.env),"content-type":"application/json"},body:JSON.stringify({name:o.name})})).seq}async function Loe(e,t,n){return(await oo(e.fetch,`${t}/rooms/${encodeURIComponent(n.roomName)}/messages`,{method:"POST",headers:{...ss(e.env),"content-type":"application/json"},body:JSON.stringify({text:n.text,...n.title?{title:n.title}:{}})})).seq}async function sF(e,t,n){let r=n.after,s=Number(n.interval??"5");if(!Number.isFinite(s)||s<1)throw new Nr(`--interval must be a finite number >= 1 seconds (got "${n.interval}")`);let o=s*1e3,i=!1,a=[];for(;;){let c=await Coe(e,t,n.roomName,r,n.limit);n.follow?n.json?c.files.length>0&&e.stdout(JSON.stringify(c.files)):(i||(lF(e.stdout),i=!0),dF(e.stdout,c.files)):a.push(...c.files);let l=typeof c.next_after=="number"?String(c.next_after):r,d=l!==void 0&&l!==r;if(d&&(r=l),!c.has_more||!d){if(!n.follow){n.json?e.stdout(JSON.stringify(a)):Foe(e.stdout,a);return}await Moe(o)}}}async function Coe(e,t,n,r,s){let o=new URLSearchParams;r!==void 0&&o.set("after",r),s!==void 0&&o.set("limit",s);let i=o.toString();return oo(e.fetch,`${t}/rooms/${encodeURIComponent(n)}/files${i?`?${i}`:""}`,{method:"GET",headers:ss(e.env)})}async function Ooe(e,t,n){let r=await e.fetch(`${t}/rooms/${encodeURIComponent(n.roomName)}/files/${encodeURIComponent(n.seq)}`,{method:"GET",headers:ss(e.env),redirect:"manual"});if(r.status!==302)throw await Kw(r,"download request failed"),new Error(`download request did not return a redirect: ${r.status}`);let s=r.headers.get("location");if(!s)throw new Error("download redirect missing Location header");let o=await e.fetch(s,{method:"GET"});await Kw(o,"presigned download failed");let i=new Uint8Array(await o.arrayBuffer());await e.mkdir(Roe(n.out),{recursive:!0}),await e.writeFile(n.out,i)}async function Doe(e,t,n){return(await oo(e.fetch,`${t}/rooms/${encodeURIComponent(n.roomName)}/files/${encodeURIComponent(n.seq)}`,{method:"DELETE",headers:ss(e.env)})).seq}async function $oe(e,t,n){return(await oo(e.fetch,`${t}/rooms/${encodeURIComponent(n.roomName)}`,{method:"DELETE",headers:ss(e.env)})).room_name}function Moe(e){return new Promise(t=>setTimeout(t,e))}async function oo(e,t,n){let r=await e(t,n);return await Kw(r,"API request failed"),await r.json()}async function Kw(e,t){if(e.ok)return;let n=await e.text().catch(()=>"");throw new Error(`${t}: ${e.status}${n?` ${n}`:""}`)}function Poe(e){return cF(e).appkey}function cF(e){if(cp(e.LMCTL_APPKEY))return{appkey:e.LMCTL_APPKEY,source:"LMCTL_APPKEY"};let t=e.LMCTL_APPKEY_FILE?.trim();if(t){let o=Jw(t);if(o)return{appkey:o,source:"LMCTL_APPKEY_FILE"}}let n=e.XDG_CONFIG_HOME?.trim()||`${koe()}/.config`,r=Jw(`${n}/lmctl/appkey.json`);if(r)return{appkey:r,source:"~/.config/lmctl/appkey.json"};let s=Jw(`${n}/lmctl/lmchat-apikey`);if(s)return{appkey:s,source:"~/.config/lmctl/lmchat-apikey (legacy)"};if(cp(e.LMCHAT_APP_KEY))return{appkey:e.LMCHAT_APP_KEY,source:"LMCHAT_APP_KEY (legacy)"};throw new Error("no appkey found; run `lmchat login` (or put a key in ~/.config/lmctl/appkey.json or ~/.config/lmctl/lmchat-apikey)")}function cp(e){return!!(e&&e===e.trim()&&!/[\u0000-\u001f\u007f]/.test(e))}function Jw(e){let t;try{t=Ioe(e,"utf8")}catch{return}let n=t.trim();if(n){if(n.startsWith("{"))try{let r=JSON.parse(n),s=typeof r.appkey=="string"?r.appkey.trim():void 0;return cp(s)?s:void 0}catch{return}return cp(n)?n:void 0}}function ss(e){return{authorization:`Bearer ${Poe(e)}`}}function Uoe(e,t){return(e??t.LMCHAT_API_URL??iF).replace(/\/+$/,"")}function Foe(e,t){lF(e),dF(e,t)}function lF(e){e("seq name size content_type created_at")}function dF(e,t){for(let n of t)e(`${n.seq} ${n.name} ${n.size} ${n.content_type} ${n.created_at}`)}function joe(e){let t=Noe(e).toLowerCase();return{".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".json":"application/json",".md":"text/markdown",".pdf":"application/pdf",".png":"image/png",".txt":"text/plain",".webp":"image/webp",".zip":"application/zip"}[t]??"application/octet-stream"}function qoe(e,t){let n="unset";try{n=cF(e).source}catch{n="unset"}return[`API: ${t??e.LMCHAT_API_URL??iF}`,`appkey source: ${n}`,"","All commands authenticate with the ONE shared appkey (Authorization: Bearer <appkey>).","Get a key with `lmchat login`; it is resolved from LMCTL_APPKEY, LMCTL_APPKEY_FILE,","~/.config/lmctl/appkey.json, or ~/.config/lmctl/lmchat-apikey.","LMCHAT_APP_KEY is still accepted for compatibility.","The server derives your user from the appkey \u2014 the client never sends a user id."].join(`
2747
- `)}function ap(e,t){let n=e.indexOf(t);return n===-1?!1:(e.splice(n,1),!0)}function _t(e,t){let n=e.indexOf(t);if(n===-1)return;let r=e[n+1];if(!r||r.startsWith("--"))throw new Nr(`missing value for ${t}`);return e.splice(n,2),r}function Yw(e,t){let n=_t(e,t);if(!n)throw new Nr(`missing required ${t}`);return n}function Kn(e,t){let n=e.shift();if(!n||n.startsWith("--"))throw new Nr(`missing ${t}`);return n}function zn(e){if(e.length>0)throw new Nr(`unexpected argument: ${e[0]}`)}function Hoe(e){return{fetch:e.fetch??fetch,env:e.env??process.env,stdout:e.stdout??(t=>console.log(t)),stderr:e.stderr??(t=>console.error(t)),readFile:e.readFile??((t,n)=>n?rF(t,{encoding:n}):rF(t)),writeFile:e.writeFile??((t,n)=>Aoe(t,n)),mkdir:e.mkdir??((t,n)=>Soe(t,n)),stat:e.stat??(t=>boe(t))}}function oF(){return["usage: (all commands use the shared appkey \u2014 run `lmchat login` first)"," lmchat login # browser sign-in -> saves ~/.config/lmctl/appkey.json"," lmchat whoami [--api URL]"," lmchat rooms [--json] [--api URL] # list your rooms"," lmchat create <room_name> [--api URL] # create a room"," lmchat say <room_name> <text> [--title title] # post a text message"," lmchat read <room_name> [--after N] [--limit N] [--follow] [--interval S] [--json] # read/poll new messages"," lmchat list <room_name> [--after N] [--limit N] [--json] # alias for read"," lmchat post <room_name> --name <filename> --file <path> [--content-type type] # upload a file"," lmchat get <room_name> <seq> --out <path> # download"," lmchat delete <room_name> <seq> # remove a handled message"," lmchat delete-room <room_name> # remove a room and its files"," (register-room is an alias for create; list is an alias for read)"].join(`
2748
- `)}var Nr=class extends Error{};import{mkdir as tie,readFile as nie,stat as rie,writeFile as sie}from"node:fs/promises";import{basename as oie,extname as iie,join as aie}from"node:path";async function NF(e,t={}){let n=_ie(t),r=Qw(e);if(r.kind==="whoami"){n.stdout(fie(n.env,r.api));return}if(r.kind==="login"){let{runLogin:a}=await Promise.resolve().then(()=>(IF(),AF));if(await a({env:n.env})!==0)throw new Error("login failed");return}let s=uie(r.api,n.env),o=Fe({env:n.env}).appkey,i=gn({apiUrl:s,appkey:o,fetch:n.fetch});if(r.kind==="mailboxes"){let a=await ni(()=>i.listMailboxes());n.stdout("mailbox created_at");for(let c of a)n.stdout(`${c.mailbox_name} ${c.created_at}`);return}if(r.kind==="create"){await ni(()=>i.createMailbox(r.mailbox,{tolerate409:!1})),n.stdout(`created ${r.mailbox}`);return}if(r.kind==="send"){let a=await ni(()=>cie(n,i,r));n.stdout(String(a));return}if(r.kind==="list"){let a=await ni(()=>i.listMessages(r.mailbox,{...r.status?{status:r.status}:{},...r.after?{after:lie(r.after)}:{}}));n.stdout("seq status sender subject attachments created_at");for(let c of a.messages)n.stdout(`${c.seq} ${c.read?"read":"unread"} ${c.sender} ${c.subject} ${c.attachments.length} ${c.created_at}`);return}if(r.kind==="read"){let a=kF(r.seq),c=await ni(()=>i.getMessage(r.mailbox,a));await n.mkdir(r.out,{recursive:!0});let l=new Set;for(let[d,u]of[c.body,...c.attachments].entries()){let f=u.name;l.has(f)&&(f=`${String(d).padStart(3,"0")}_${f}`),l.add(f);let m=aie(r.out,f);await n.writeFile(m,await ni(()=>i.download(u.download_url),"presigned download failed")),n.stdout(`saved ${m}`)}return}r.kind==="delete"&&(await ni(()=>i.deleteMessage(r.mailbox,kF(r.seq))),n.stdout(`deleted ${r.seq}`))}function Qw(e){let t=[...e],n=$a(t,"--api"),r=t.shift();if(!r||["help","--help","-h"].includes(r))throw new os(RF());if(r==="login"||r==="whoami"||r==="mailboxes")return Da(t),{kind:r,...n?{api:n}:{}};if(r==="create"){let s=ri(t,"mailbox");return Da(t),{kind:"create",mailbox:s,...n?{api:n}:{}}}if(r==="send"){let s=ri(t,"mailbox"),o=hie(t,"--file"),i=$a(t,"--subject"),a=pie(t,"--attach");return Da(t),{kind:"send",mailbox:s,file:o,attachments:a,...i?{subject:i}:{},...n?{api:n}:{}}}if(r==="list"){let s=ri(t,"mailbox"),o=$a(t,"--status"),i=$a(t,"--after");return Da(t),{kind:"list",mailbox:s,...o?{status:o}:{},...i?{after:i}:{},...n?{api:n}:{}}}if(r==="read"){let s=ri(t,"mailbox"),o=ri(t,"seq"),i=$a(t,"--out")??".";return Da(t),{kind:"read",mailbox:s,seq:o,out:i,...n?{api:n}:{}}}if(r==="delete"){let s=ri(t,"mailbox"),o=ri(t,"seq");return Da(t),{kind:"delete",mailbox:s,seq:o,...n?{api:n}:{}}}throw new os(`unknown command: ${r}
2746
+ ${oF()}`)}async function xoe(e,t,n){let r=await e.stat(n.file);if(!r.isFile())throw new Error(`not a file: ${n.file}`);let s=n.contentType??joe(n.name),o=await oo(e.fetch,`${t}/rooms/${encodeURIComponent(n.roomName)}/files`,{method:"POST",headers:{...ss(e.env),"content-type":"application/json"},body:JSON.stringify({name:n.name,content_type:s,size:r.size})}),i=await e.readFile(n.file),a=typeof i=="string"?Buffer.from(i):i,c=new FormData;for(let[u,f]of Object.entries(o.fields))c.append(u,f);c.append("file",new Blob([a],{type:o.content_type}),o.name);let l=await e.fetch(o.upload_url,{method:"POST",body:c});if(!l.ok)throw new Error(`S3 upload failed: ${l.status} ${await l.text().catch(()=>"")}`.trim());return(await oo(e.fetch,`${t}/rooms/${encodeURIComponent(n.roomName)}/files/${encodeURIComponent(String(o.seq))}/commit`,{method:"POST",headers:{...ss(e.env),"content-type":"application/json"},body:JSON.stringify({name:o.name})})).seq}async function Loe(e,t,n){return(await oo(e.fetch,`${t}/rooms/${encodeURIComponent(n.roomName)}/messages`,{method:"POST",headers:{...ss(e.env),"content-type":"application/json"},body:JSON.stringify({text:n.text,...n.title?{title:n.title}:{}})})).seq}async function sF(e,t,n){let r=n.after,s=Number(n.interval??"5");if(!Number.isFinite(s)||s<1)throw new xr(`--interval must be a finite number >= 1 seconds (got "${n.interval}")`);let o=s*1e3,i=!1,a=[];for(;;){let c=await Coe(e,t,n.roomName,r,n.limit);n.follow?n.json?c.files.length>0&&e.stdout(JSON.stringify(c.files)):(i||(lF(e.stdout),i=!0),dF(e.stdout,c.files)):a.push(...c.files);let l=typeof c.next_after=="number"?String(c.next_after):r,d=l!==void 0&&l!==r;if(d&&(r=l),!c.has_more||!d){if(!n.follow){n.json?e.stdout(JSON.stringify(a)):Foe(e.stdout,a);return}await Moe(o)}}}async function Coe(e,t,n,r,s){let o=new URLSearchParams;r!==void 0&&o.set("after",r),s!==void 0&&o.set("limit",s);let i=o.toString();return oo(e.fetch,`${t}/rooms/${encodeURIComponent(n)}/files${i?`?${i}`:""}`,{method:"GET",headers:ss(e.env)})}async function Ooe(e,t,n){let r=await e.fetch(`${t}/rooms/${encodeURIComponent(n.roomName)}/files/${encodeURIComponent(n.seq)}`,{method:"GET",headers:ss(e.env),redirect:"manual"});if(r.status!==302)throw await Kw(r,"download request failed"),new Error(`download request did not return a redirect: ${r.status}`);let s=r.headers.get("location");if(!s)throw new Error("download redirect missing Location header");let o=await e.fetch(s,{method:"GET"});await Kw(o,"presigned download failed");let i=new Uint8Array(await o.arrayBuffer());await e.mkdir(Roe(n.out),{recursive:!0}),await e.writeFile(n.out,i)}async function Doe(e,t,n){return(await oo(e.fetch,`${t}/rooms/${encodeURIComponent(n.roomName)}/files/${encodeURIComponent(n.seq)}`,{method:"DELETE",headers:ss(e.env)})).seq}async function $oe(e,t,n){return(await oo(e.fetch,`${t}/rooms/${encodeURIComponent(n.roomName)}`,{method:"DELETE",headers:ss(e.env)})).room_name}function Moe(e){return new Promise(t=>setTimeout(t,e))}async function oo(e,t,n){let r=await e(t,n);return await Kw(r,"API request failed"),await r.json()}async function Kw(e,t){if(e.ok)return;let n=await e.text().catch(()=>"");throw new Error(`${t}: ${e.status}${n?` ${n}`:""}`)}function Poe(e){return cF(e).appkey}function cF(e){if(cp(e.LMCTL_APPKEY))return{appkey:e.LMCTL_APPKEY,source:"LMCTL_APPKEY"};let t=e.LMCTL_APPKEY_FILE?.trim();if(t){let o=Jw(t);if(o)return{appkey:o,source:"LMCTL_APPKEY_FILE"}}let n=e.XDG_CONFIG_HOME?.trim()||`${koe()}/.config`,r=Jw(`${n}/lmctl/appkey.json`);if(r)return{appkey:r,source:"~/.config/lmctl/appkey.json"};let s=Jw(`${n}/lmctl/lmchat-apikey`);if(s)return{appkey:s,source:"~/.config/lmctl/lmchat-apikey (legacy)"};if(cp(e.LMCHAT_APP_KEY))return{appkey:e.LMCHAT_APP_KEY,source:"LMCHAT_APP_KEY (legacy)"};throw new Error("no appkey found; run `lmchat login` (or put a key in ~/.config/lmctl/appkey.json or ~/.config/lmctl/lmchat-apikey)")}function cp(e){return!!(e&&e===e.trim()&&!/[\u0000-\u001f\u007f]/.test(e))}function Jw(e){let t;try{t=Ioe(e,"utf8")}catch{return}let n=t.trim();if(n){if(n.startsWith("{"))try{let r=JSON.parse(n),s=typeof r.appkey=="string"?r.appkey.trim():void 0;return cp(s)?s:void 0}catch{return}return cp(n)?n:void 0}}function ss(e){return{authorization:`Bearer ${Poe(e)}`}}function Uoe(e,t){return(e??t.LMCHAT_API_URL??iF).replace(/\/+$/,"")}function Foe(e,t){lF(e),dF(e,t)}function lF(e){e("seq name size content_type created_at")}function dF(e,t){for(let n of t)e(`${n.seq} ${n.name} ${n.size} ${n.content_type} ${n.created_at}`)}function joe(e){let t=Noe(e).toLowerCase();return{".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".json":"application/json",".md":"text/markdown",".pdf":"application/pdf",".png":"image/png",".txt":"text/plain",".webp":"image/webp",".zip":"application/zip"}[t]??"application/octet-stream"}function qoe(e,t){let n="unset";try{n=cF(e).source}catch{n="unset"}return[`API: ${t??e.LMCHAT_API_URL??iF}`,`appkey source: ${n}`,"","All commands authenticate with the ONE shared appkey (Authorization: Bearer <appkey>).","Get a key with `lmchat login`; it is resolved from LMCTL_APPKEY, LMCTL_APPKEY_FILE,","~/.config/lmctl/appkey.json, or ~/.config/lmctl/lmchat-apikey.","LMCHAT_APP_KEY is still accepted for compatibility.","The server derives your user from the appkey \u2014 the client never sends a user id."].join(`
2747
+ `)}function ap(e,t){let n=e.indexOf(t);return n===-1?!1:(e.splice(n,1),!0)}function gt(e,t){let n=e.indexOf(t);if(n===-1)return;let r=e[n+1];if(!r||r.startsWith("--"))throw new xr(`missing value for ${t}`);return e.splice(n,2),r}function Yw(e,t){let n=gt(e,t);if(!n)throw new xr(`missing required ${t}`);return n}function Kn(e,t){let n=e.shift();if(!n||n.startsWith("--"))throw new xr(`missing ${t}`);return n}function zn(e){if(e.length>0)throw new xr(`unexpected argument: ${e[0]}`)}function Hoe(e){return{fetch:e.fetch??fetch,env:e.env??process.env,stdout:e.stdout??(t=>console.log(t)),stderr:e.stderr??(t=>console.error(t)),readFile:e.readFile??((t,n)=>n?rF(t,{encoding:n}):rF(t)),writeFile:e.writeFile??((t,n)=>Aoe(t,n)),mkdir:e.mkdir??((t,n)=>Soe(t,n)),stat:e.stat??(t=>boe(t))}}function oF(){return["usage: (all commands use the shared appkey \u2014 run `lmchat login` first)"," lmchat login # browser sign-in -> saves ~/.config/lmctl/appkey.json"," lmchat whoami [--api URL]"," lmchat rooms [--json] [--api URL] # list your rooms"," lmchat create <room_name> [--api URL] # create a room"," lmchat say <room_name> <text> [--title title] # post a text message"," lmchat read <room_name> [--after N] [--limit N] [--follow] [--interval S] [--json] # read/poll new messages"," lmchat list <room_name> [--after N] [--limit N] [--json] # alias for read"," lmchat post <room_name> --name <filename> --file <path> [--content-type type] # upload a file"," lmchat get <room_name> <seq> --out <path> # download"," lmchat delete <room_name> <seq> # remove a handled message"," lmchat delete-room <room_name> # remove a room and its files"," (register-room is an alias for create; list is an alias for read)"].join(`
2748
+ `)}var xr=class extends Error{};import{mkdir as tie,readFile as nie,stat as rie,writeFile as sie}from"node:fs/promises";import{basename as oie,extname as iie,join as aie}from"node:path";async function NF(e,t={}){let n=_ie(t),r=Qw(e);if(r.kind==="whoami"){n.stdout(fie(n.env,r.api));return}if(r.kind==="login"){let{runLogin:a}=await Promise.resolve().then(()=>(IF(),AF));if(await a({env:n.env})!==0)throw new Error("login failed");return}let s=uie(r.api,n.env),o=Fe({env:n.env}).appkey,i=gn({apiUrl:s,appkey:o,fetch:n.fetch});if(r.kind==="mailboxes"){let a=await ni(()=>i.listMailboxes());n.stdout("mailbox created_at");for(let c of a)n.stdout(`${c.mailbox_name} ${c.created_at}`);return}if(r.kind==="create"){await ni(()=>i.createMailbox(r.mailbox,{tolerate409:!1})),n.stdout(`created ${r.mailbox}`);return}if(r.kind==="send"){let a=await ni(()=>cie(n,i,r));n.stdout(String(a));return}if(r.kind==="list"){let a=await ni(()=>i.listMessages(r.mailbox,{...r.status?{status:r.status}:{},...r.after?{after:lie(r.after)}:{}}));n.stdout("seq status sender subject attachments created_at");for(let c of a.messages)n.stdout(`${c.seq} ${c.read?"read":"unread"} ${c.sender} ${c.subject} ${c.attachments.length} ${c.created_at}`);return}if(r.kind==="read"){let a=kF(r.seq),c=await ni(()=>i.getMessage(r.mailbox,a));await n.mkdir(r.out,{recursive:!0});let l=new Set;for(let[d,u]of[c.body,...c.attachments].entries()){let f=u.name;l.has(f)&&(f=`${String(d).padStart(3,"0")}_${f}`),l.add(f);let m=aie(r.out,f);await n.writeFile(m,await ni(()=>i.download(u.download_url),"presigned download failed")),n.stdout(`saved ${m}`)}return}r.kind==="delete"&&(await ni(()=>i.deleteMessage(r.mailbox,kF(r.seq))),n.stdout(`deleted ${r.seq}`))}function Qw(e){let t=[...e],n=$a(t,"--api"),r=t.shift();if(!r||["help","--help","-h"].includes(r))throw new os(RF());if(r==="login"||r==="whoami"||r==="mailboxes")return Da(t),{kind:r,...n?{api:n}:{}};if(r==="create"){let s=ri(t,"mailbox");return Da(t),{kind:"create",mailbox:s,...n?{api:n}:{}}}if(r==="send"){let s=ri(t,"mailbox"),o=hie(t,"--file"),i=$a(t,"--subject"),a=pie(t,"--attach");return Da(t),{kind:"send",mailbox:s,file:o,attachments:a,...i?{subject:i}:{},...n?{api:n}:{}}}if(r==="list"){let s=ri(t,"mailbox"),o=$a(t,"--status"),i=$a(t,"--after");return Da(t),{kind:"list",mailbox:s,...o?{status:o}:{},...i?{after:i}:{},...n?{api:n}:{}}}if(r==="read"){let s=ri(t,"mailbox"),o=ri(t,"seq"),i=$a(t,"--out")??".";return Da(t),{kind:"read",mailbox:s,seq:o,out:i,...n?{api:n}:{}}}if(r==="delete"){let s=ri(t,"mailbox"),o=ri(t,"seq");return Da(t),{kind:"delete",mailbox:s,seq:o,...n?{api:n}:{}}}throw new os(`unknown command: ${r}
2749
2749
 
2750
2750
  ${RF()}`)}async function cie(e,t,n){let r=[n.file,...n.attachments],s=await Promise.all(r.map(async o=>{if(!(await e.stat(o)).isFile())throw new Error(`not a file: ${o}`);return{name:oie(o),contentType:mie(o),bytes:await e.readFile(o)}}));return t.sendMessage({mailbox:n.mailbox,...n.subject?{subject:n.subject}:{},body:s[0],attachments:s.slice(1)})}async function ni(e,t){try{return await e()}catch(n){if(!(n instanceof sr))throw n;let r=/^upload failed for (.+?): HTTP/.exec(n.message),s=t??(r?`S3 upload failed for ${r[1]}`:"API request failed");throw xF(s,n.status,n.responseBody)}}function kF(e){if(!/^[1-9]\d*$/.test(e))throw dp("seq_invalid");let t=Number(e);if(!Number.isSafeInteger(t))throw dp("seq_invalid");return t}function lie(e){if(!/^(0|[1-9]\d*)$/.test(e))throw dp("after_invalid");let t=Number(e);if(!Number.isSafeInteger(t))throw dp("after_invalid");return t}function dp(e){return xF("API request failed",400,JSON.stringify({error:e}))}function xF(e,t,n){return new Error(`${e}: ${t}${n?` ${n}`:""}`)}function die(e){try{let{source:t}=Fe({env:e});return t==="env:LMCTL_APPKEY"?"LMCTL_APPKEY":t==="env:LMCTL_APPKEY_FILE"?"LMCTL_APPKEY_FILE":t==="file:default"?"~/.config/lmctl/appkey.json":t}catch{return"unset"}}function uie(e,t){let n=e??t.LMMAIL_API_URL;if(!n)throw new Error("missing LMMAIL_API_URL or --api");return n.replace(/\/+$/,"")}function fie(e,t){return[`API: ${t??e.LMMAIL_API_URL??"unset (set --api or LMMAIL_API_URL)"}`,`appkey source: ${die(e)}`,"identity: derived server-side from the shared appkey"].join(`
2751
2751
  `)}function mie(e){return{".txt":"text/plain",".md":"text/markdown",".html":"text/html",".json":"application/json",".pdf":"application/pdf",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".zip":"application/zip"}[iie(e).toLowerCase()]??"application/octet-stream"}function $a(e,t){let n=e.indexOf(t);if(n<0)return;let r=e[n+1];if(!r||r.startsWith("--"))throw new os(`missing value for ${t}`);return e.splice(n,2),r}function pie(e,t){let n=e.indexOf(t);if(n<0)return[];let r=[],s=n+1;for(;s<e.length&&!e[s].startsWith("--");)r.push(e[s]),s+=1;if(!r.length)throw new os(`missing value for ${t}`);return e.splice(n,r.length+1),r}function hie(e,t){let n=$a(e,t);if(!n)throw new os(`missing required ${t}`);return n}function ri(e,t){let n=e.shift();if(!n||n.startsWith("--"))throw new os(`missing ${t}`);return n}function Da(e){if(e.length)throw new os(`unexpected argument: ${e[0]}`)}function _ie(e){return{fetch:e.fetch??fetch,env:e.env??process.env,stdout:e.stdout??(t=>console.log(t)),readFile:e.readFile??(t=>nie(t)),writeFile:e.writeFile??((t,n)=>sie(t,n)),mkdir:e.mkdir??((t,n)=>tie(t,n)),stat:e.stat??(t=>rie(t))}}function RF(){return["usage:"," lmmail login"," lmmail whoami [--api URL]"," lmmail mailboxes [--api URL]"," lmmail create <name> [--api URL]"," lmmail send <mailbox> --file <body.txt|md|html> [--attach <file...>] [--subject text]"," lmmail list <mailbox> [--status all|unread|read] [--after N]"," lmmail read <mailbox> <seq> [--out dir]"," lmmail delete <mailbox> <seq>"].join(`
@@ -2753,11 +2753,11 @@ ${RF()}`)}async function cie(e,t,n){let r=[n.file,...n.attachments],s=await Prom
2753
2753
 
2754
2754
  ${VF()}`)}async function $ie(e,t,n,r){let s=await e.stat(r.file);if(!s.isFile())throw new Error(`not a file: ${r.file}`);let o=qie(r.file),i=r.kind==="push"?`${t}/notes`:`${t}/notes/${encodeURIComponent(r.name)}`,a=await Jl(e.fetch,i,{method:r.kind==="push"?"POST":"PUT",headers:{...n,"content-type":"application/json"},body:JSON.stringify({...r.kind==="push"?{name:r.name}:{},content_type:o,size:s.size})}),c=await e.readFile(r.file),l=new FormData;for(let[f,m]of Object.entries(a.fields))l.append(f,m);l.append("file",new Blob([c],{type:a.content_type}),a.name);let d=await e.fetch(a.upload_url,{method:"POST",body:l});await tT(d,"S3 upload failed");let u=a.finalize_url.startsWith("http")?a.finalize_url:`${t}${a.finalize_url.startsWith("/")?"":"/"}${a.finalize_url}`;await Jl(e.fetch,u,{method:"POST",headers:{...n,"content-type":"application/json"},body:JSON.stringify({operation_token:a.operation_token})})}function Mie(e){try{return Fe({env:e}).appkey}catch{throw new Error("no appkey found; run `lmnote login` (or set LMCTL_APPKEY / copy ~/.config/lmctl/appkey.json here)")}}function Pie(e){try{let t=Fe({env:e}).source;return t==="env:LMCTL_APPKEY"?"LMCTL_APPKEY":t==="env:LMCTL_APPKEY_FILE"?"LMCTL_APPKEY_FILE":t==="file:default"?"~/.config/lmctl/appkey.json":t}catch{return"unset"}}function Uie(e,t){let n=e??t.LMNOTE_API_URL;if(!n)throw new Error("missing LMNOTE_API_URL or --api");return n.replace(/\/+$/,"")}function Fie(e){return{authorization:`Bearer ${Mie(e)}`}}function jie(e,t){return[`API: ${t??e.LMNOTE_API_URL??"unset (set --api or LMNOTE_API_URL)"}`,`appkey source: ${Pie(e)}`,"notebook identity: derived server-side from the shared appkey"].join(`
2755
2755
  `)}function qie(e){return{".txt":"text/plain",".md":"text/markdown",".html":"text/html",".json":"application/json",".pdf":"application/pdf",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".zip":"application/zip"}[Die(e).toLowerCase()]??"application/octet-stream"}async function Jl(e,t,n){let r=await e(t,n);return await tT(r,"API request failed"),r.json()}async function tT(e,t){if(e.ok)return;let n=await e.text().catch(()=>"");throw new Error(`${t}: ${e.status}${n?` ${n}`:""}`)}function Vl(e,t){let n=e.indexOf(t);if(n<0)return;let r=e[n+1];if(!r||r.startsWith("--"))throw new io(`missing value for ${t}`);return e.splice(n,2),r}function Hie(e,t){let n=Vl(e,t);if(!n)throw new io(`missing required ${t}`);return n}function Zw(e,t){let n=e.shift();if(!n||n.startsWith("--"))throw new io(`missing ${t}`);return n}function Xl(e){if(e.length)throw new io(`unexpected argument: ${e[0]}`)}function Wie(e){return{fetch:e.fetch??fetch,env:e.env??process.env,stdout:e.stdout??(t=>console.log(t)),readFile:e.readFile??(t=>xie(t)),writeFile:e.writeFile??((t,n)=>Cie(t,n)),mkdir:e.mkdir??((t,n)=>Nie(t,n)),stat:e.stat??(t=>Lie(t))}}function VF(){return["usage:"," lmnote login"," lmnote whoami [--api URL]"," lmnote push <name> --file <path>"," lmnote list [--after name] [--limit N]"," lmnote read <name> [--out path]"," lmnote update <name> --file <path>"," lmnote delete <name>"].join(`
2756
- `)}var io=class extends Error{};async function hj(e,t={}){let n=t.fetch??fetch,r=t.env??process.env,s=t.stdout??(l=>console.log(l)),o=nT(e);if(o.kind==="whoami"){s(iae(r,o.api));return}if(o.kind==="login"){let{runLogin:l}=await Promise.resolve().then(()=>(dj(),lj));if(await l({env:r})!==0)throw new Error("login failed");return}let i=sae(o.api,r),a=oae(r),c={...a,"content-type":"application/json"};if(o.kind==="create"){await xr(n,`${i}/sheets`,{method:"POST",headers:c,body:JSON.stringify({name:o.name,columns:o.columns})}),s(`created ${o.name}`);return}if(o.kind==="sheets"){s("name columns next_row created_at updated_at");let l="";for(let d=0;d<100;d+=1){let u=await xr(n,`${i}/sheets${l?`?after=${encodeURIComponent(l)}`:""}`,{method:"GET",headers:a});for(let f of u.sheets)s(`${f.name} ${uj(f.columns)} ${f.next_row} ${f.created_at} ${f.updated_at}`);if(!u.has_more){s(`next_after=${u.next_after} has_more=false`);return}if(!u.next_after||u.next_after===l)throw new Error("sheet list cursor did not advance");l=u.next_after}throw new Error("sheet listing did not finish")}if(o.kind==="add-column"){let l=await xr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/columns`,{method:"POST",headers:c,body:JSON.stringify({label:o.label})});s(`added ${l.column.letter} ${l.column.label}`);return}if(o.kind==="read"){let l=new URLSearchParams;o.after&&l.set("after",o.after),o.limit&&l.set("limit",o.limit);let d=await xr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/rows${l.size?`?${l}`:""}`,{method:"GET",headers:a});s(`columns ${uj(d.sheet.columns)}`),s("row_num created_at updated_at cells");for(let u of d.rows)s(`${u.row_num} ${u.created_at} ${u.updated_at} ${JSON.stringify(u.cells)}`);s(`next_after=${d.next_after} has_more=${d.has_more}`);return}if(o.kind==="add-row"){let l=await xr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/rows`,{method:"POST",headers:c,body:JSON.stringify({cells:o.cells,...o.row?{row_num:Number(o.row)}:{}})});s(`added row ${l.row_num}`);return}if(o.kind==="update-row"){await xr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/rows/${o.row}`,{method:"PUT",headers:c,body:JSON.stringify({cells:o.cells})}),s(`updated ${o.sheet} row ${o.row}`);return}if(o.kind==="set-cell"){await xr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/cells/${encodeURIComponent(o.address)}`,{method:"PUT",headers:c,body:JSON.stringify({value:o.value})}),s(`set ${o.sheet} ${o.address}`);return}if(o.kind==="clear-cell"){await xr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/cells/${encodeURIComponent(o.address)}`,{method:"DELETE",headers:a}),s(`cleared ${o.sheet} ${o.address}`);return}if(o.kind==="delete-row"){await xr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/rows/${o.row}`,{method:"DELETE",headers:a}),s(`deleted ${o.sheet} row ${o.row}`);return}if(o.kind==="delete-sheet"){for(let l=0;l<100;l+=1)if((await xr(n,`${i}/sheets/${encodeURIComponent(o.name)}`,{method:"DELETE",headers:a})).deleted){s(`deleted ${o.name}`);return}throw new Error("sheet deletion did not finish")}}function nT(e){let t=[...e],n=Ma(t,"--api"),r=t.shift();if(!r||["help","--help","-h"].includes(r))throw new Cr(pj());if(r==="login"||r==="whoami"||r==="sheets")return Lr(t),{kind:r,...n?{api:n}:{}};if(r==="create"){let s=Qt(t,"name"),o=aae(t,"--cols").split(",").map(i=>i.trim());return Lr(t),{kind:"create",name:s,columns:o,...n?{api:n}:{}}}if(r==="add-column"){let s=Qt(t,"sheet"),o=Qt(t,"label");return Lr(t),{kind:"add-column",sheet:s,label:o,...n?{api:n}:{}}}if(r==="read"){let s=Qt(t,"sheet"),o=Ma(t,"--after"),i=Ma(t,"--limit");return Lr(t),{kind:"read",sheet:s,...o?{after:o}:{},...i?{limit:i}:{},...n?{api:n}:{}}}if(r==="add-row"){let s=Qt(t,"sheet"),o=Ma(t,"--row"),i=fj(mj(t,"--set"));return Lr(t),{kind:"add-row",sheet:s,cells:i,...o?{row:o}:{},...n?{api:n}:{}}}if(r==="update-row"){let s=Qt(t,"sheet"),o=Qt(t,"row"),i=fj(mj(t,"--set"),!0);return Lr(t),{kind:"update-row",sheet:s,row:o,cells:i,...n?{api:n}:{}}}if(r==="set-cell"){let s=Qt(t,"sheet"),o=Qt(t,"cell"),i=Qt(t,"value");return Lr(t),{kind:"set-cell",sheet:s,address:o,value:i,...n?{api:n}:{}}}if(r==="clear-cell"){let s=Qt(t,"sheet"),o=Qt(t,"cell");return Lr(t),{kind:"clear-cell",sheet:s,address:o,...n?{api:n}:{}}}if(r==="delete-row"){let s=Qt(t,"sheet"),o=Qt(t,"row");return Lr(t),{kind:"delete-row",sheet:s,row:o,...n?{api:n}:{}}}if(r==="delete-sheet"){let s=Qt(t,"name");return Lr(t),{kind:"delete-sheet",name:s,...n?{api:n}:{}}}throw new Cr(`unknown command: ${r}
2756
+ `)}var io=class extends Error{};async function hj(e,t={}){let n=t.fetch??fetch,r=t.env??process.env,s=t.stdout??(l=>console.log(l)),o=nT(e);if(o.kind==="whoami"){s(iae(r,o.api));return}if(o.kind==="login"){let{runLogin:l}=await Promise.resolve().then(()=>(dj(),lj));if(await l({env:r})!==0)throw new Error("login failed");return}let i=sae(o.api,r),a=oae(r),c={...a,"content-type":"application/json"};if(o.kind==="create"){await Lr(n,`${i}/sheets`,{method:"POST",headers:c,body:JSON.stringify({name:o.name,columns:o.columns})}),s(`created ${o.name}`);return}if(o.kind==="sheets"){s("name columns next_row created_at updated_at");let l="";for(let d=0;d<100;d+=1){let u=await Lr(n,`${i}/sheets${l?`?after=${encodeURIComponent(l)}`:""}`,{method:"GET",headers:a});for(let f of u.sheets)s(`${f.name} ${uj(f.columns)} ${f.next_row} ${f.created_at} ${f.updated_at}`);if(!u.has_more){s(`next_after=${u.next_after} has_more=false`);return}if(!u.next_after||u.next_after===l)throw new Error("sheet list cursor did not advance");l=u.next_after}throw new Error("sheet listing did not finish")}if(o.kind==="add-column"){let l=await Lr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/columns`,{method:"POST",headers:c,body:JSON.stringify({label:o.label})});s(`added ${l.column.letter} ${l.column.label}`);return}if(o.kind==="read"){let l=new URLSearchParams;o.after&&l.set("after",o.after),o.limit&&l.set("limit",o.limit);let d=await Lr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/rows${l.size?`?${l}`:""}`,{method:"GET",headers:a});s(`columns ${uj(d.sheet.columns)}`),s("row_num created_at updated_at cells");for(let u of d.rows)s(`${u.row_num} ${u.created_at} ${u.updated_at} ${JSON.stringify(u.cells)}`);s(`next_after=${d.next_after} has_more=${d.has_more}`);return}if(o.kind==="add-row"){let l=await Lr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/rows`,{method:"POST",headers:c,body:JSON.stringify({cells:o.cells,...o.row?{row_num:Number(o.row)}:{}})});s(`added row ${l.row_num}`);return}if(o.kind==="update-row"){await Lr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/rows/${o.row}`,{method:"PUT",headers:c,body:JSON.stringify({cells:o.cells})}),s(`updated ${o.sheet} row ${o.row}`);return}if(o.kind==="set-cell"){await Lr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/cells/${encodeURIComponent(o.address)}`,{method:"PUT",headers:c,body:JSON.stringify({value:o.value})}),s(`set ${o.sheet} ${o.address}`);return}if(o.kind==="clear-cell"){await Lr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/cells/${encodeURIComponent(o.address)}`,{method:"DELETE",headers:a}),s(`cleared ${o.sheet} ${o.address}`);return}if(o.kind==="delete-row"){await Lr(n,`${i}/sheets/${encodeURIComponent(o.sheet)}/rows/${o.row}`,{method:"DELETE",headers:a}),s(`deleted ${o.sheet} row ${o.row}`);return}if(o.kind==="delete-sheet"){for(let l=0;l<100;l+=1)if((await Lr(n,`${i}/sheets/${encodeURIComponent(o.name)}`,{method:"DELETE",headers:a})).deleted){s(`deleted ${o.name}`);return}throw new Error("sheet deletion did not finish")}}function nT(e){let t=[...e],n=Ma(t,"--api"),r=t.shift();if(!r||["help","--help","-h"].includes(r))throw new Or(pj());if(r==="login"||r==="whoami"||r==="sheets")return Cr(t),{kind:r,...n?{api:n}:{}};if(r==="create"){let s=Qt(t,"name"),o=aae(t,"--cols").split(",").map(i=>i.trim());return Cr(t),{kind:"create",name:s,columns:o,...n?{api:n}:{}}}if(r==="add-column"){let s=Qt(t,"sheet"),o=Qt(t,"label");return Cr(t),{kind:"add-column",sheet:s,label:o,...n?{api:n}:{}}}if(r==="read"){let s=Qt(t,"sheet"),o=Ma(t,"--after"),i=Ma(t,"--limit");return Cr(t),{kind:"read",sheet:s,...o?{after:o}:{},...i?{limit:i}:{},...n?{api:n}:{}}}if(r==="add-row"){let s=Qt(t,"sheet"),o=Ma(t,"--row"),i=fj(mj(t,"--set"));return Cr(t),{kind:"add-row",sheet:s,cells:i,...o?{row:o}:{},...n?{api:n}:{}}}if(r==="update-row"){let s=Qt(t,"sheet"),o=Qt(t,"row"),i=fj(mj(t,"--set"),!0);return Cr(t),{kind:"update-row",sheet:s,row:o,cells:i,...n?{api:n}:{}}}if(r==="set-cell"){let s=Qt(t,"sheet"),o=Qt(t,"cell"),i=Qt(t,"value");return Cr(t),{kind:"set-cell",sheet:s,address:o,value:i,...n?{api:n}:{}}}if(r==="clear-cell"){let s=Qt(t,"sheet"),o=Qt(t,"cell");return Cr(t),{kind:"clear-cell",sheet:s,address:o,...n?{api:n}:{}}}if(r==="delete-row"){let s=Qt(t,"sheet"),o=Qt(t,"row");return Cr(t),{kind:"delete-row",sheet:s,row:o,...n?{api:n}:{}}}if(r==="delete-sheet"){let s=Qt(t,"name");return Cr(t),{kind:"delete-sheet",name:s,...n?{api:n}:{}}}throw new Or(`unknown command: ${r}
2757
2757
 
2758
2758
  ${pj()}`)}function nae(e){try{return Fe({env:e}).appkey}catch{throw new Error("no appkey found; run `lmsheet login` (or set LMCTL_APPKEY / copy ~/.config/lmctl/appkey.json here)")}}function rae(e){try{let t=Fe({env:e}).source;return t==="env:LMCTL_APPKEY"?"LMCTL_APPKEY":t==="env:LMCTL_APPKEY_FILE"?"LMCTL_APPKEY_FILE":t==="file:default"?"~/.config/lmctl/appkey.json":t}catch{return"unset"}}function sae(e,t){let n=e??t.LMSHEET_API_URL;if(!n)throw new Error("missing LMSHEET_API_URL or --api");return n.replace(/\/+$/,"")}function oae(e){return{authorization:`Bearer ${nae(e)}`}}function iae(e,t){return[`API: ${t??e.LMSHEET_API_URL??"unset (set --api or LMSHEET_API_URL)"}`,`appkey source: ${rae(e)}`,"sheet identity: derived server-side from the shared appkey"].join(`
2759
- `)}function uj(e){return e.map(t=>`${t.letter}:${t.label}`).join(",")}function fj(e,t=!1){if(t&&e.length===0)throw new Cr("at least one --set is required");let n={};for(let r of e){let s=r.indexOf("="),o=s>0?r.slice(0,s):"";if(!/^[A-Z]+$/.test(o))throw new Cr(`invalid --set: ${r}`);n[o]=r.slice(s+1)}return n}async function xr(e,t,n){let r=await e(t,n);if(!r.ok){let s=await r.text().catch(()=>"");throw new Error(`API request failed: ${r.status}${s?` ${s}`:""}`)}return r.json()}function Ma(e,t){let n=e.indexOf(t);if(n<0)return;let r=e[n+1];if(!r||r.startsWith("--"))throw new Cr(`missing value for ${t}`);return e.splice(n,2),r}function mj(e,t){let n=[];for(;e.includes(t);){let r=Ma(e,t);r!==void 0&&n.push(r)}return n}function aae(e,t){let n=Ma(e,t);if(!n)throw new Cr(`missing required ${t}`);return n}function Qt(e,t){let n=e.shift();if(!n||n.startsWith("--"))throw new Cr(`missing ${t}`);return n}function Lr(e){if(e.length)throw new Cr(`unexpected argument: ${e[0]}`)}function pj(){return["usage:"," lmsheet login"," lmsheet whoami [--api URL]",' lmsheet create <name> --cols "Name,Email,Age"'," lmsheet sheets"," lmsheet add-column <sheet> <label>"," lmsheet read <sheet> [--after N] [--limit N]"," lmsheet add-row <sheet> [--set A=value ...] [--row N]"," lmsheet update-row <sheet> <row> --set A=value [--set B=value ...]"," lmsheet set-cell <sheet> <A1> <value>"," lmsheet clear-cell <sheet> <A1>"," lmsheet delete-row <sheet> <row>"," lmsheet delete-sheet <name>"].join(`
2760
- `)}var Cr=class extends Error{};import{readFile as wae,stat as Tae}from"node:fs/promises";import{basename as Cj,extname as vae}from"node:path";async function Oj(e,t={}){let n=xae(t);if(!e.length||["help","-h","--help"].includes(e[0]??"")){n.stdout(sT());return}let r=oT(e);if(r.kind==="login"){let{runLogin:i}=await Promise.resolve().then(()=>(Lj(),xj));if(await i({env:n.env})!==0)throw new Error("login failed");return}if(r.kind==="whoami"){let i=Sae(n.env);n.stdout(`API: ${r.api??n.env.LMTEXT_API_URL??"unset (set --api or LMTEXT_API_URL)"}`),n.stdout(`appkey source: ${i.source}`),n.stdout("identity: derived server-side from the shared appkey");return}let s=bae(r.api,n.env),o=Aae(n.env);if(r.kind==="transcribe"){let i=await n.stat(r.file);if(!i.isFile())throw new Error(`not a file: ${r.file}`);if(i.size<1||i.size>25*1024*1024)throw new Error("audio file must be between 1 byte and 25 MB");let a=Rae(r.file),c=await Pa(n.fetch,`${s}/transcriptions`,{method:"POST",headers:{...o,"content-type":"application/json"},body:JSON.stringify({file_name:Cj(r.file),content_type:a,...r.language?{language_code:r.language}:{}})}),l=await n.readFile(r.file),d=new FormData;for(let[f,m]of Object.entries(c.upload_fields))d.append(f,m);d.append("file",new Blob([new Uint8Array(l)],{type:a}),Cj(r.file));let u=await n.fetch(c.upload_url,{method:"POST",body:d});if(await kae(u,"S3 upload failed"),await Pa(n.fetch,`${s}/transcriptions/${encodeURIComponent(c.transcription_id)}/finalize`,{method:"POST",headers:o}),!r.wait){n.stdout(c.transcription_id);return}for(;;){let f=await Pa(n.fetch,`${s}/transcriptions/${encodeURIComponent(c.transcription_id)}`,{method:"GET",headers:o});if(f.status==="completed"){n.stdout(f.transcript??"");return}if(f.status==="failed")throw new Error(f.failure_reason??"transcription_failed");await n.sleep(3e3)}}if(r.kind==="list"){let i=new URLSearchParams;r.status&&i.set("status",r.status),r.after&&i.set("after",r.after),r.limit&&i.set("limit",r.limit);let a=await Pa(n.fetch,`${s}/transcriptions${i.size?`?${i}`:""}`,{method:"GET",headers:o});n.stdout("transcription_id status created_at duration_ms");for(let c of a.transcriptions)n.stdout(`${c.transcription_id} ${c.status} ${c.created_at} ${c.duration_ms??""}`);a.has_more&&a.next_after&&n.stdout(`next_after=${a.next_after} has_more=true`),a.truncated&&n.stderr("warning: list results are truncated at the 1,000-object scan ceiling; older matching transcriptions may be omitted");return}if(r.kind==="get"){let i=await Pa(n.fetch,`${s}/transcriptions/${encodeURIComponent(r.id)}`,{method:"GET",headers:o});n.stdout(JSON.stringify(i,null,2));return}if(r.kind==="delete"){let i=await Pa(n.fetch,`${s}/transcriptions/${encodeURIComponent(r.id)}`,{method:"DELETE",headers:o});n.stdout(JSON.stringify(i,null,2));return}}function oT(e){let t=[...e],n=zl(t,"--api"),r=t.shift();if(!r||["help","-h","--help"].includes(r))throw new si(sT());if(r==="login"||r==="whoami")return Ql(t),{kind:r,...n?{api:n}:{}};if(r==="transcribe"){let s=rT(t,"file"),o=zl(t,"--language"),i=Nae(t,"--wait");return Ql(t),{kind:"transcribe",file:s,...o?{language:o}:{},wait:i,...n?{api:n}:{}}}if(r==="list"){let s=zl(t,"--status"),o=zl(t,"--after"),i=zl(t,"--limit");return Ql(t),{kind:"list",...s?{status:s}:{},...o?{after:o}:{},...i?{limit:i}:{},...n?{api:n}:{}}}if(r==="get"){let s=rT(t,"id");return Ql(t),{kind:"get",id:s,...n?{api:n}:{}}}if(r==="delete"){let s=rT(t,"id");return Ql(t),{kind:"delete",id:s,...n?{api:n}:{}}}throw new si(`unknown command: ${r}
2759
+ `)}function uj(e){return e.map(t=>`${t.letter}:${t.label}`).join(",")}function fj(e,t=!1){if(t&&e.length===0)throw new Or("at least one --set is required");let n={};for(let r of e){let s=r.indexOf("="),o=s>0?r.slice(0,s):"";if(!/^[A-Z]+$/.test(o))throw new Or(`invalid --set: ${r}`);n[o]=r.slice(s+1)}return n}async function Lr(e,t,n){let r=await e(t,n);if(!r.ok){let s=await r.text().catch(()=>"");throw new Error(`API request failed: ${r.status}${s?` ${s}`:""}`)}return r.json()}function Ma(e,t){let n=e.indexOf(t);if(n<0)return;let r=e[n+1];if(!r||r.startsWith("--"))throw new Or(`missing value for ${t}`);return e.splice(n,2),r}function mj(e,t){let n=[];for(;e.includes(t);){let r=Ma(e,t);r!==void 0&&n.push(r)}return n}function aae(e,t){let n=Ma(e,t);if(!n)throw new Or(`missing required ${t}`);return n}function Qt(e,t){let n=e.shift();if(!n||n.startsWith("--"))throw new Or(`missing ${t}`);return n}function Cr(e){if(e.length)throw new Or(`unexpected argument: ${e[0]}`)}function pj(){return["usage:"," lmsheet login"," lmsheet whoami [--api URL]",' lmsheet create <name> --cols "Name,Email,Age"'," lmsheet sheets"," lmsheet add-column <sheet> <label>"," lmsheet read <sheet> [--after N] [--limit N]"," lmsheet add-row <sheet> [--set A=value ...] [--row N]"," lmsheet update-row <sheet> <row> --set A=value [--set B=value ...]"," lmsheet set-cell <sheet> <A1> <value>"," lmsheet clear-cell <sheet> <A1>"," lmsheet delete-row <sheet> <row>"," lmsheet delete-sheet <name>"].join(`
2760
+ `)}var Or=class extends Error{};import{readFile as wae,stat as Tae}from"node:fs/promises";import{basename as Cj,extname as vae}from"node:path";async function Oj(e,t={}){let n=xae(t);if(!e.length||["help","-h","--help"].includes(e[0]??"")){n.stdout(sT());return}let r=oT(e);if(r.kind==="login"){let{runLogin:i}=await Promise.resolve().then(()=>(Lj(),xj));if(await i({env:n.env})!==0)throw new Error("login failed");return}if(r.kind==="whoami"){let i=Sae(n.env);n.stdout(`API: ${r.api??n.env.LMTEXT_API_URL??"unset (set --api or LMTEXT_API_URL)"}`),n.stdout(`appkey source: ${i.source}`),n.stdout("identity: derived server-side from the shared appkey");return}let s=bae(r.api,n.env),o=Aae(n.env);if(r.kind==="transcribe"){let i=await n.stat(r.file);if(!i.isFile())throw new Error(`not a file: ${r.file}`);if(i.size<1||i.size>25*1024*1024)throw new Error("audio file must be between 1 byte and 25 MB");let a=Rae(r.file),c=await Pa(n.fetch,`${s}/transcriptions`,{method:"POST",headers:{...o,"content-type":"application/json"},body:JSON.stringify({file_name:Cj(r.file),content_type:a,...r.language?{language_code:r.language}:{}})}),l=await n.readFile(r.file),d=new FormData;for(let[f,m]of Object.entries(c.upload_fields))d.append(f,m);d.append("file",new Blob([new Uint8Array(l)],{type:a}),Cj(r.file));let u=await n.fetch(c.upload_url,{method:"POST",body:d});if(await kae(u,"S3 upload failed"),await Pa(n.fetch,`${s}/transcriptions/${encodeURIComponent(c.transcription_id)}/finalize`,{method:"POST",headers:o}),!r.wait){n.stdout(c.transcription_id);return}for(;;){let f=await Pa(n.fetch,`${s}/transcriptions/${encodeURIComponent(c.transcription_id)}`,{method:"GET",headers:o});if(f.status==="completed"){n.stdout(f.transcript??"");return}if(f.status==="failed")throw new Error(f.failure_reason??"transcription_failed");await n.sleep(3e3)}}if(r.kind==="list"){let i=new URLSearchParams;r.status&&i.set("status",r.status),r.after&&i.set("after",r.after),r.limit&&i.set("limit",r.limit);let a=await Pa(n.fetch,`${s}/transcriptions${i.size?`?${i}`:""}`,{method:"GET",headers:o});n.stdout("transcription_id status created_at duration_ms");for(let c of a.transcriptions)n.stdout(`${c.transcription_id} ${c.status} ${c.created_at} ${c.duration_ms??""}`);a.has_more&&a.next_after&&n.stdout(`next_after=${a.next_after} has_more=true`),a.truncated&&n.stderr("warning: list results are truncated at the 1,000-object scan ceiling; older matching transcriptions may be omitted");return}if(r.kind==="get"){let i=await Pa(n.fetch,`${s}/transcriptions/${encodeURIComponent(r.id)}`,{method:"GET",headers:o});n.stdout(JSON.stringify(i,null,2));return}if(r.kind==="delete"){let i=await Pa(n.fetch,`${s}/transcriptions/${encodeURIComponent(r.id)}`,{method:"DELETE",headers:o});n.stdout(JSON.stringify(i,null,2));return}}function oT(e){let t=[...e],n=zl(t,"--api"),r=t.shift();if(!r||["help","-h","--help"].includes(r))throw new si(sT());if(r==="login"||r==="whoami")return Ql(t),{kind:r,...n?{api:n}:{}};if(r==="transcribe"){let s=rT(t,"file"),o=zl(t,"--language"),i=Nae(t,"--wait");return Ql(t),{kind:"transcribe",file:s,...o?{language:o}:{},wait:i,...n?{api:n}:{}}}if(r==="list"){let s=zl(t,"--status"),o=zl(t,"--after"),i=zl(t,"--limit");return Ql(t),{kind:"list",...s?{status:s}:{},...o?{after:o}:{},...i?{limit:i}:{},...n?{api:n}:{}}}if(r==="get"){let s=rT(t,"id");return Ql(t),{kind:"get",id:s,...n?{api:n}:{}}}if(r==="delete"){let s=rT(t,"id");return Ql(t),{kind:"delete",id:s,...n?{api:n}:{}}}throw new si(`unknown command: ${r}
2761
2761
 
2762
2762
  ${sT()}`)}function Sae(e){try{return{source:Fe({env:e}).source}}catch(t){return t instanceof po?{source:"unset"}:{source:"unset"}}}function bae(e,t){let n=e??t.LMTEXT_API_URL;if(!n)throw new Error("missing LMTEXT_API_URL or --api");return n.replace(/\/+$/,"")}function Aae(e){return{authorization:`Bearer ${Iae(e)}`}}function Iae(e){return Fe({env:e}).appkey}async function Pa(e,t,n){let r=await e(t,n);if(!r.ok){let s=await r.text().catch(()=>"");throw new Error(`API request failed: ${r.status} ${s}`)}return await r.json()}async function kae(e,t){if(!e.ok){let n=await e.text().catch(()=>"");throw new Error(`${t}: ${e.status} ${n}`)}}function Rae(e){return{".mp3":"audio/mpeg",".mp4":"audio/mp4",".m4a":"audio/mp4",".wav":"audio/wav",".flac":"audio/flac",".ogg":"audio/ogg",".webm":"audio/webm",".amr":"audio/amr"}[vae(e).toLowerCase()]??"application/octet-stream"}function zl(e,t){let n=e.indexOf(t);if(n<0)return;let r=e[n+1];if(!r||r.startsWith("--"))throw new si(`missing value for ${t}`);return e.splice(n,2),r}function Nae(e,t){let n=e.indexOf(t);return n<0?!1:(e.splice(n,1),!0)}function rT(e,t){let n=e.shift();if(!n||n.startsWith("--"))throw new si(`missing ${t}`);return n}function Ql(e){if(e.length)throw new si(`unexpected argument: ${e[0]}`)}function sT(){return["usage:"," lmtext login"," lmtext whoami [--api URL]"," lmtext transcribe <file> [--language LANG] [--wait] [--api URL]"," lmtext list [--status all|uploading|in_progress|completed|failed] [--after CURSOR] [--limit N] [--api URL]"," lmtext get <id> [--api URL]"," lmtext delete <id> [--api URL]"].join(`
2763
2763
  `)}function xae(e){return{fetch:e.fetch??fetch,env:e.env??process.env,stdout:e.stdout??(t=>process.stdout.write(`${t}
@@ -2769,13 +2769,13 @@ ${sT()}`)}function Sae(e){try{return{source:Fe({env:e}).source}}catch(t){return
2769
2769
  `),sleep:s=>new Promise(o=>setTimeout(o,s)),readFile:(s,o)=>Cae(s,o),writeFile:(s,o)=>Dae(s,o),mkdir:(s,o)=>Lae(s,o),stat:s=>Oae(s)}}function Fae(e){return!!(e&&typeof e=="object"&&"status"in e&&typeof e.status=="number")}function jae(e){return e instanceof Error?e.message:String(e)}import{writeFile as qae}from"node:fs/promises";function Ha(e,t,n){let r=e.indexOf(t);if(r<0)return;let s=e[r+1];if(!s||s.startsWith("--"))throw n(`${t} requires a value`);return e.splice(r,2),s}var is=class extends Error{};function Hae(){return["usage:",' lmbee lmsound speak "text" [--voice ID] [--engine ENGINE] [--format FORMAT] [--out FILE]'," lmbee lmsound voices"].join(`
2770
2770
  `)}function hp(e,t){return Ha(e,t,n=>new is(n))}function Wae(e){let t=[...e],n=t.shift();if(n==="voices"){if(t.length)throw new is(`unexpected argument: ${t[0]}`);return{kind:"voices"}}if(n==="speak"){let r=t.shift();if(!r)throw new is("lmsound speak requires text");let s=hp(t,"--voice"),o=hp(t,"--engine"),i=hp(t,"--format"),a=hp(t,"--out");if(t.length)throw new is(`unexpected argument: ${t[0]}`);return{kind:"speak",text:r,...s?{voice:s}:{},...o?{engine:o}:{},...i?{format:i}:{},...a?{out:a}:{}}}throw new is(`unknown lmsound command: ${n??""}`)}async function Pj(e,t={}){if(e.length===0||e.length===1&&(e[0]==="--help"||e[0]==="-h"))return Hae();let n=t.env??process.env,r=t.resolveAppkeyImpl??Fe,s=t.fetchImpl??fetch,o=t.writeFileImpl??qae,i=Wae(e),a=r({env:n}).appkey,c=iT("lmsound",n),l={authorization:`Bearer ${a}`};if(i.kind==="voices"){let m=await s(`${c}/voices`,{headers:l});await pp(m);let p=await m.json(),h=["id name language gender engines"];for(let _ of p.voices??[])h.push(`${_.id} ${_.name} ${_.language_code} ${_.gender} ${_.supported_engines.join(",")}`);return h.join(`
2771
2771
  `)}let d=await s(`${c}/speak`,{method:"POST",headers:{...l,"content-type":"application/json"},body:JSON.stringify({text:i.text,...i.voice?{voice_id:i.voice}:{},...i.engine?{engine:i.engine}:{},...i.format?{format:i.format}:{}})});await pp(d);let u=await d.json();if(typeof u.download_url!="string")throw new Error("lmsound response missing download_url");if(!i.out)return u.download_url;let f=await s(u.download_url);return await pp(f),await o(i.out,new Uint8Array(await f.arrayBuffer())),`saved ${i.out}`}var Bae=new Set(["lmchat","lmmail","lmnote","lmsheet","lmtext"]);function Uj(e){return Bae.has(e)}async function Fj(e,t){try{return await Mj(e,[...t])}catch(n){return process.stderr.write(`${n instanceof Error?n.message:String(n)}
2772
- `),qj(n)}}async function jj(e){try{return{output:await Pj(e),exitCode:0}}catch(t){return{output:t instanceof Error?t.message:String(t),exitCode:qj(t)}}}function qj(e){if(e instanceof Fa||e instanceof is)return 2;if(e instanceof ja)return Gae(e.exitCode);if(e instanceof po||e instanceof sd)return 3;if(e instanceof Pr||e instanceof od)return 4;let t=e instanceof Zl||e instanceof Ua?e.status:void 0;return t===401||t===403?3:Xae(e)?4:1}function Gae(e){return Number.isInteger(e)&&e>0&&e<=255?e:1}function Xae(e){if(!(e instanceof Error))return!1;let t=e.code,n=e.cause,r=typeof t=="string"?t:typeof n?.code=="string"?n.code:"";return/^(ECONNREFUSED|ECONNRESET|ENOTFOUND|EAI_AGAIN|ETIMEDOUT|UND_ERR_)/.test(r)}import{randomUUID as Tce}from"node:crypto";import{randomUUID as Jae}from"node:crypto";import{hostname as Yae,userInfo as Kae}from"node:os";var zae=120,Hj=60,Qae=20,Zae=1e3,ece=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;async function aT(e,t,n){try{await e.createMailbox(t,{tolerate409:!1});return}catch(s){if(!tce(s))throw s}let r=5;for(let s=1;s<=r;s+=1){if((await e.listMailboxes()).some(i=>i.mailbox_name===t))return;s<r&&await n(100*2**(s-1))}throw new Error(`refusing exec: reply mailbox ${t} is not owned by the current user`)}function tce(e){if(!e||typeof e!="object")return!1;let t=e;return t.status===409&&t.code==="mailbox_exists"}async function cT(e,t){let n=Qy({v:1,type:zy,id:t.id,command:t.command,timeout_s:t.timeoutSeconds??Hj,reply_to:t.replyMailbox});await e.sendMessage({mailbox:t.daemonMailbox,subject:`exec ${t.id}`,body:{name:"body.txt",contentType:"text/plain; charset=utf-8",bytes:Buffer.from(JSON.stringify(n),"utf8")}})}async function lT(e,t,n,r,s,o={}){let i=new Set(n),a=new Map,c=o.longPoll??{supported:!0};for(;i.size>0&&s.now()<r;){let l=0;for(;i.size>0;){let u=r-s.now();if(u<=0)return a;let f=await nce(e,t,l,u,c);for(let m of f.messages){let p=ice(m.subject,i);if(p)try{let h=await oce(e,t,m.seq,p,s.now);a.set(p,h),i.delete(p)}catch(h){o.onMalformed?.(h)}}if(i.size===0)return a;if(f.messages.length===0||f.next_after<=l)break;l=f.next_after}let d=r-s.now();if(d<=0)break;await s.sleep(Math.min(Zae,d))}return a}async function nce(e,t,n,r,s){let o=s.supported?Math.min(Qae,Math.floor(r/1e3)):0,i={status:"unread",after:n,...o>0?{wait_s:o}:{}};try{return await e.listMessages(t,i)}catch(a){if(!s.supported||o===0||!rce(a))throw a;return s.supported=!1,await e.listMessages(t,{status:"unread",after:n})}}function rce(e){let t=e;return t?.status===400&&t.code==="wait_s_invalid"}function Wj(e,t){return`lmexec-replies-${`${e}-${t}`.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^[^A-Za-z0-9]+/,"").replace(/[.-]+$/,"")||"user-host"}`.slice(0,128).replace(/[.-]+$/,"")}function Bj(e){return Wj(e,"fleet")}function sce(e){return ece.test(e)?fi(e.toLowerCase()):e}async function oce(e,t,n,r,s){let o=await e.getMessage(t,n),i=Buffer.from(await e.download(o.body.download_url)).toString("utf8"),a=pD(i);if(a.id!==r)throw new Error("reply body id does not match subject id");let c=new Map(await Promise.all(o.attachments.map(async u=>[u.name,Buffer.from(await e.download(u.download_url)).toString("utf8")]))),l=c.get("stdout.txt")??a.stdout,d=c.get("stderr.txt")??a.stderr;return{result:a,stdout:l,stderr:d,receivedAt:s()}}function ice(e,t){for(let n of t)if(e===Zy(n))return n}var Qn=class extends Error{};async function Gj(e,t,n={}){let r=n.env??process.env,s=n.resolveAppkeyImpl??Fe,o=n.createMailClientImpl??gn,i=n.now??Date.now,a=n.sleep??(T=>new Promise(b=>setTimeout(b,T))),c=n.username??(()=>Kae().username),l=n.hostname??Yae,d=n.waitSeconds??zae;if(!Number.isFinite(d)||d<=0)throw new Qn("--wait-s must be positive");let u=n.replyMailbox??(r.LMEXEC_REPLY_MAILBOX?.trim()||Wj(c(),l())),{appkey:f}=s({env:r}),m=o({apiUrl:Hn(r),appkey:f}),p=Jae();await aT(m,u,a),await cT(m,{id:p,daemonMailbox:sce(e),command:t,replyMailbox:u,timeoutSeconds:Hj});let h=[],_=i()+Math.round(d*1e3),w=(await lT(m,u,new Set([p]),_,{now:i,sleep:a},{onMalformed:T=>h.push(`[lmbee exec] ignored malformed matching reply: ${T instanceof Error?T.message:String(T)}
2772
+ `),qj(n)}}async function jj(e){try{return{output:await Pj(e),exitCode:0}}catch(t){return{output:t instanceof Error?t.message:String(t),exitCode:qj(t)}}}function qj(e){if(e instanceof Fa||e instanceof is)return 2;if(e instanceof ja)return Gae(e.exitCode);if(e instanceof po||e instanceof sd)return 3;if(e instanceof Ur||e instanceof od)return 4;let t=e instanceof Zl||e instanceof Ua?e.status:void 0;return t===401||t===403?3:Xae(e)?4:1}function Gae(e){return Number.isInteger(e)&&e>0&&e<=255?e:1}function Xae(e){if(!(e instanceof Error))return!1;let t=e.code,n=e.cause,r=typeof t=="string"?t:typeof n?.code=="string"?n.code:"";return/^(ECONNREFUSED|ECONNRESET|ENOTFOUND|EAI_AGAIN|ETIMEDOUT|UND_ERR_)/.test(r)}import{randomUUID as Tce}from"node:crypto";import{randomUUID as Jae}from"node:crypto";import{hostname as Yae,userInfo as Kae}from"node:os";var zae=120,Hj=60,Qae=20,Zae=1e3,ece=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;async function aT(e,t,n){try{await e.createMailbox(t,{tolerate409:!1});return}catch(s){if(!tce(s))throw s}let r=5;for(let s=1;s<=r;s+=1){if((await e.listMailboxes()).some(i=>i.mailbox_name===t))return;s<r&&await n(100*2**(s-1))}throw new Error(`refusing exec: reply mailbox ${t} is not owned by the current user`)}function tce(e){if(!e||typeof e!="object")return!1;let t=e;return t.status===409&&t.code==="mailbox_exists"}async function cT(e,t){let n=Qy({v:1,type:zy,id:t.id,command:t.command,timeout_s:t.timeoutSeconds??Hj,reply_to:t.replyMailbox});await e.sendMessage({mailbox:t.daemonMailbox,subject:`exec ${t.id}`,body:{name:"body.txt",contentType:"text/plain; charset=utf-8",bytes:Buffer.from(JSON.stringify(n),"utf8")}})}async function lT(e,t,n,r,s,o={}){let i=new Set(n),a=new Map,c=o.longPoll??{supported:!0};for(;i.size>0&&s.now()<r;){let l=0;for(;i.size>0;){let u=r-s.now();if(u<=0)return a;let f=await nce(e,t,l,u,c);for(let m of f.messages){let p=ice(m.subject,i);if(p)try{let h=await oce(e,t,m.seq,p,s.now);a.set(p,h),i.delete(p)}catch(h){o.onMalformed?.(h)}}if(i.size===0)return a;if(f.messages.length===0||f.next_after<=l)break;l=f.next_after}let d=r-s.now();if(d<=0)break;await s.sleep(Math.min(Zae,d))}return a}async function nce(e,t,n,r,s){let o=s.supported?Math.min(Qae,Math.floor(r/1e3)):0,i={status:"unread",after:n,...o>0?{wait_s:o}:{}};try{return await e.listMessages(t,i)}catch(a){if(!s.supported||o===0||!rce(a))throw a;return s.supported=!1,await e.listMessages(t,{status:"unread",after:n})}}function rce(e){let t=e;return t?.status===400&&t.code==="wait_s_invalid"}function Wj(e,t){return`lmexec-replies-${`${e}-${t}`.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^[^A-Za-z0-9]+/,"").replace(/[.-]+$/,"")||"user-host"}`.slice(0,128).replace(/[.-]+$/,"")}function Bj(e){return Wj(e,"fleet")}function sce(e){return ece.test(e)?fi(e.toLowerCase()):e}async function oce(e,t,n,r,s){let o=await e.getMessage(t,n),i=Buffer.from(await e.download(o.body.download_url)).toString("utf8"),a=pD(i);if(a.id!==r)throw new Error("reply body id does not match subject id");let c=new Map(await Promise.all(o.attachments.map(async u=>[u.name,Buffer.from(await e.download(u.download_url)).toString("utf8")]))),l=c.get("stdout.txt")??a.stdout,d=c.get("stderr.txt")??a.stderr;return{result:a,stdout:l,stderr:d,receivedAt:s()}}function ice(e,t){for(let n of t)if(e===Zy(n))return n}var Qn=class extends Error{};async function Gj(e,t,n={}){let r=n.env??process.env,s=n.resolveAppkeyImpl??Fe,o=n.createMailClientImpl??gn,i=n.now??Date.now,a=n.sleep??(T=>new Promise(b=>setTimeout(b,T))),c=n.username??(()=>Kae().username),l=n.hostname??Yae,d=n.waitSeconds??zae;if(!Number.isFinite(d)||d<=0)throw new Qn("--wait-s must be positive");let u=n.replyMailbox??(r.LMEXEC_REPLY_MAILBOX?.trim()||Wj(c(),l())),{appkey:f}=s({env:r}),m=o({apiUrl:Hn(r),appkey:f}),p=Jae();await aT(m,u,a),await cT(m,{id:p,daemonMailbox:sce(e),command:t,replyMailbox:u,timeoutSeconds:Hj});let h=[],_=i()+Math.round(d*1e3),w=(await lT(m,u,new Set([p]),_,{now:i,sleep:a},{onMalformed:T=>h.push(`[lmbee exec] ignored malformed matching reply: ${T instanceof Error?T.message:String(T)}
2773
2773
  `)})).get(p);if(!w)return{stdout:"",stderr:`${h.join("")}[lmbee exec] timed out waiting for a reply
2774
2774
  `,exitCode:124};let y=w.result.v===2?` trust=${w.result.sender_trust} sender=${w.result.sender}`:"",E=`[lmbee exec] exit=${w.result.exit_code===null?"timeout":w.result.exit_code} duration_ms=${w.result.duration_ms} truncated=${w.result.truncated}${y}
2775
- `;return{stdout:w.stdout,stderr:`${w.stderr}${E}`,exitCode:w.result.exit_code??124}}import{randomUUID as ace}from"node:crypto";import{mkdir as cce,readFile as lce,rename as dce,rm as uce,writeFile as fce}from"node:fs/promises";import{dirname as Jj,join as mce}from"node:path";var Yj=2,pce=/^[A-Za-z0-9_-]+$/,dT=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,gt=class extends Error{};function Kj(){return mce(Jj(fs()),"lmt-peers.json")}function Or(e,t){if(!dT.test(e))throw new gt(`${t} must be a UUID`);return e.toLowerCase()}function uT(e){return dT.test(e)}function zj(e){return _p(e,"peer alias")}function _p(e,t){if(e.length>128||!pce.test(e))throw new gt(`${t} must match [A-Za-z0-9_-]+`);if(dT.test(e))throw new gt(`${t} must not be a UUID`);return e}function ed(e,t){try{return xv(e,t)}catch(n){throw new gt(n instanceof Error?n.message:String(n))}}function Xj(){return Object.create(null)}async function td(){let e=Kj(),t;try{t=await lce(e,"utf8")}catch(i){if(i.code==="ENOENT")return Xj();throw i}let n;try{n=JSON.parse(t)}catch{throw new Error(`peer registry is invalid JSON: ${e}`)}if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`peer registry is invalid: ${e}`);let r=n;if(r.v!==Yj||!r.peers||typeof r.peers!="object"||Array.isArray(r.peers))throw new Error(`peer registry is invalid: ${e}`);let s=Xj(),o=new Set;for(let[i,a]of Object.entries(r.peers)){if(!a||typeof a!="object"||Array.isArray(a))throw new Error(`peer registry has invalid entry for ${i}`);let c=a;try{let l=Or(i,"peer registry site-uuid"),d=ed(l,Vj(c.mailbox,`peer registry has invalid mailbox for ${i}`)),u=c.alias===void 0?void 0:zj(Vj(c.alias,`peer registry has invalid alias for ${i}`));if(u){if(o.has(u))throw new Error(`peer registry has duplicate alias: ${u}`);o.add(u)}s[l]=u===void 0?{mailbox:d}:{mailbox:d,alias:u}}catch{throw new Error(`peer registry has invalid entry for ${i}`)}}return s}async function Qj(e){let t=Kj(),n={v:Yj,peers:e},r=`${t}.${process.pid}.${ace()}.tmp`;await cce(Jj(t),{recursive:!0});let s=!1;try{await fce(r,`${JSON.stringify(n,null,2)}
2776
- `),await dce(r,t),s=!0}finally{if(!s)try{await uce(r)}catch(o){if(o.code!=="ENOENT")throw o}}}function hce(e,t,n){if(n!==void 0){for(let[r,s]of Object.entries(e))if(r!==t&&s.alias===n)throw new Error(`peer alias already registered: ${n}`)}}function Zj(e,t){for(let[n,r]of Object.entries(t))if(r.alias===e)return{siteUuid:Or(n,"wire site-uuid"),mailbox:ed(n,r.mailbox)}}function Vj(e,t){if(typeof e!="string")throw new Error(t);return e}async function e1(){let e=await td(),t=["site-uuid alias mailbox"];for(let n of Object.keys(e).sort()){let r=e[n];t.push(`${n} ${r.alias??""} ${r.mailbox}`)}return t.join(`
2777
- `)}async function t1(e,t,n){let r=Or(e,"site-uuid"),s=ed(r,t),o=await td(),i=o[r],a=n===void 0?i?.alias:zj(n);return hce(o,r,a),o[r]=a===void 0?{mailbox:s}:{mailbox:s,alias:a},await Qj(o),`peer ${r}${a?` (${a})`:""} -> ${s}`}async function n1(e){let t=Or(e,"site-uuid"),n=await td();if(!Object.hasOwn(n,t))throw new Error(`unknown peer site-uuid: ${t}`);return delete n[t],await Qj(n),`removed peer ${t}`}function Wa(e){let t=e.env??process.env,n=e.resolveAppkeyImpl??Fe,r=e.createMailClientImpl??gn,{appkey:s}=n({env:t});return r({apiUrl:Hn(t),appkey:s})}function mT(e){try{return Xp(e)}catch(t){throw new gt(t instanceof Error?t.message:String(t))}}function _ce(e){if(e.includes("..")||e.endsWith(".")||!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e))throw new gt("--mailbox must be a valid mailbox name");return e}async function r1(e,t={}){let n=mT(e),r=t.siteUuid===void 0?await Sd(fs()):Or(t.siteUuid,"--site-uuid"),s=t.mailbox??ci(r),o=Wa(t),i;try{i=await o.registerSite(n,r,s)}catch(a){throw a instanceof sr&&a.code==="site_name_taken"?new Error(`site name already registered to a different site in this account: ${n}`):a}return`registered ${i.site_name} -> ${i.site_uuid} (${i.mailbox})`}async function s1(e,t={}){let n=mT(e),r=Wa(t),s;try{s=await r.resolveSite(n)}catch(o){if(!(o instanceof sr&&o.status===404))throw o}return s?{output:`${s.site_name} ${s.site_uuid} ${s.mailbox}`,exitCode:0}:{output:`unknown site name in this account: ${n}`,exitCode:1}}async function gp(e){let t=new Map,n=new Map,r=new Set,s;do{let o=await e.listSites({limit:50,...s?{cursor:s}:{}});for(let i of o.sites)t.set(i.site_uuid.toLowerCase(),i);for(let i of o.discovered){let a=o1(i),c=n.get(a);(!c||i.last_seen_at>c.last_seen_at)&&n.set(a,i)}if(s=o.next_cursor,s){if(r.has(s))throw new Error("site listing returned a repeated cursor");r.add(s)}}while(s);return{sites:[...t.values()],discovered:[...n.values()]}}function o1(e){return e.site_uuid?`uuid#${e.site_uuid.toLowerCase()}`:`mailbox#${e.mailbox}#${e.owner_user_id}`}function gce(e){let t=[`uuid#${e.site_uuid.toLowerCase()}`],n=e.content_mailbox??e.mailbox,r=e.content_mailbox_owner_user_id??e.mailbox_owner_user_id;return r&&t.push(`mailbox#${n}#${r}`),e.exec_mailbox&&e.exec_mailbox_owner_user_id&&t.push(`mailbox#${e.exec_mailbox}#${e.exec_mailbox_owner_user_id}`),t}function Ece(e,t){let n=new Set(e.flatMap(gce));return t.filter(r=>!n.has(o1(r))&&!n.has(`mailbox#${r.mailbox}#${r.owner_user_id}`))}function fT(e){return e.display_name??e.registered_name??e.site_name}function yce(e,t){let n=["REGISTERED","display-name registered-name site-uuid content-mailbox exec-mailbox"];for(let r of e.sort((s,o)=>fT(s).localeCompare(fT(o))))n.push([fT(r),r.registered_name??r.site_name,r.site_uuid,r.content_mailbox??r.mailbox,r.exec_mailbox??"-"].join(" "));n.push("","DISCOVERED","display-name site-uuid mailbox owner-user-id last-seen-at");for(let r of t.sort((s,o)=>o.last_seen_at-s.last_seen_at))n.push([r.name??"-",r.site_uuid??"-",r.mailbox,r.owner_user_id,r.last_seen_at].join(" "));return n.join(`
2778
- `)}async function i1(e={}){let t=Wa(e),n=await gp(t);return yce(n.sites,Ece(n.sites,n.discovered))}async function wce(e,t){let n=await gp(e),r=[...new Set(n.discovered.filter(s=>s.mailbox===t).map(s=>s.owner_user_id))];if(r.length===0)throw new Error(`mailbox is not present in site discovery: ${t}`);if(r.length>1)throw new Error(`mailbox ownership changed during site discovery; retry: ${t}`);return{kind:"mailbox",value:t,owner_user_id:r[0]}}async function a1(e,t,n){return t!==void 0?{kind:"uuid",value:Or(t,"--uuid")}:await wce(e,_ce(n))}async function c1(e,t){let n=e.trim();if(!n)throw new gt("site display name must be non-empty");let r=Wa(t),s=await a1(r,t.uuid,t.mailbox),o=await r.setSiteName(s,n);return`named ${o.site_key} -> ${o.name}`}async function l1(e){let t=Wa(e),n=await a1(t,e.uuid,e.mailbox);return`cleared ${(await t.deleteSiteName(n)).site_key}`}async function d1(e,t={}){let n=mT(e);return await Wa(t).deleteSite(n),`removed ${n}`}function ao(){return"usage: lmbee sites register <name> [--site-uuid <uuid>] [--mailbox <name>] | resolve <name> | list | set-name (--uuid <uuid> | --mailbox <name>) <name> | clear-name (--uuid <uuid> | --mailbox <name>) | remove <name>"}var vce=15,Sce=60,bce="lmbee status --live --json";async function u1(e={}){let t=e.env??process.env,n=e.resolveAppkeyImpl??Fe,r=e.createMailClientImpl??gn,s=e.now??Date.now,o=e.sleep??(f=>new Promise(m=>setTimeout(m,f))),i=e.username??(()=>process.env.USER??process.env.USERNAME??"user"),a=e.waitSeconds??vce;if(!Number.isFinite(a)||a<=0)throw new Error("--wait-s must be positive");let{appkey:c}=n({env:t}),l=r({apiUrl:Hn(t),appkey:c}),d=(await gp(l)).sites.sort((f,m)=>f.site_name.localeCompare(m.site_name)),u=Bj(i());await aT(l,u,o);try{let f=d.map(E=>({site:E,execMailbox:fi(E.site_uuid),id:Tce(),sentAt:s()}));await Promise.all(f.map(async E=>{try{await cT(l,{id:E.id,daemonMailbox:E.execMailbox,command:bce,replyMailbox:u,timeoutSeconds:Sce})}catch(T){E.sendError=T instanceof Error?T.message:String(T)}}));let m=s()+Math.round(a*1e3),p=new Set(f.filter(E=>E.sendError===void 0).map(E=>E.id)),h=await lT(l,u,p,m,{now:s,sleep:o}),_=f.filter(E=>E.sendError===void 0).length,g=h.size,w=d.length===0?"empty":g===d.length?"all":g===0?"none":"partial";return{verdict:w,exit_code:w==="none"?2:w==="partial"?3:0,sent:_,answered:g,sites:f.map(E=>Ace(E,h.get(E.id))),generated_at:new Date(s()).toISOString()}}finally{await l.deleteMailbox(u)}}function Ace(e,t){let n={site_name:e.site.site_name,site_uuid:e.site.site_uuid,mailbox:e.execMailbox};if(!t)return{...n,liveness:"stale",error:e.sendError??"no_reply"};let r={...n,liveness:"live",latency_ms:Math.max(0,t.receivedAt-e.sentAt)},s=Ice(t);if(s)return{...r,error:s};if(t.result.exit_code!==0)return{...r,error:t.result.timed_out?"remote_timeout":`remote_exit_${t.result.exit_code}`};try{let o=JSON.parse(t.stdout);if(!o||typeof o!="object"||Array.isArray(o))throw new Error("expected JSON object");return{...r,status:o}}catch{return{...r,error:"invalid_status_json"}}}function Ice(e){if(e.result.exit_code===126)try{let t=JSON.parse(e.stderr);return typeof t.error?.code=="string"?t.error.code:"remote_rejected"}catch{return"remote_rejected"}}function f1(e){let t=["SITE LIVENESS LATENCY_MS TEAMS DAEMON ERROR"];for(let n of e.sites)t.push([n.site_name||n.site_uuid,n.liveness,n.latency_ms??"-",kce(n.status)??"-",Rce(n.status)??"-",n.error??"-"].join(" "));return t.push(`Fleet: ${e.verdict} (sent ${e.sent}/${e.sites.length}, answered ${e.answered}/${e.sites.length}; exit ${e.exit_code})`),t.join(`
2775
+ `;return{stdout:w.stdout,stderr:`${w.stderr}${E}`,exitCode:w.result.exit_code??124}}import{randomUUID as ace}from"node:crypto";import{mkdir as cce,readFile as lce,rename as dce,rm as uce,writeFile as fce}from"node:fs/promises";import{dirname as Jj,join as mce}from"node:path";var Yj=2,pce=/^[A-Za-z0-9_-]+$/,dT=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Et=class extends Error{};function Kj(){return mce(Jj(fs()),"lmt-peers.json")}function Dr(e,t){if(!dT.test(e))throw new Et(`${t} must be a UUID`);return e.toLowerCase()}function uT(e){return dT.test(e)}function zj(e){return _p(e,"peer alias")}function _p(e,t){if(e.length>128||!pce.test(e))throw new Et(`${t} must match [A-Za-z0-9_-]+`);if(dT.test(e))throw new Et(`${t} must not be a UUID`);return e}function ed(e,t){try{return xv(e,t)}catch(n){throw new Et(n instanceof Error?n.message:String(n))}}function Xj(){return Object.create(null)}async function td(){let e=Kj(),t;try{t=await lce(e,"utf8")}catch(i){if(i.code==="ENOENT")return Xj();throw i}let n;try{n=JSON.parse(t)}catch{throw new Error(`peer registry is invalid JSON: ${e}`)}if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`peer registry is invalid: ${e}`);let r=n;if(r.v!==Yj||!r.peers||typeof r.peers!="object"||Array.isArray(r.peers))throw new Error(`peer registry is invalid: ${e}`);let s=Xj(),o=new Set;for(let[i,a]of Object.entries(r.peers)){if(!a||typeof a!="object"||Array.isArray(a))throw new Error(`peer registry has invalid entry for ${i}`);let c=a;try{let l=Dr(i,"peer registry site-uuid"),d=ed(l,Vj(c.mailbox,`peer registry has invalid mailbox for ${i}`)),u=c.alias===void 0?void 0:zj(Vj(c.alias,`peer registry has invalid alias for ${i}`));if(u){if(o.has(u))throw new Error(`peer registry has duplicate alias: ${u}`);o.add(u)}s[l]=u===void 0?{mailbox:d}:{mailbox:d,alias:u}}catch{throw new Error(`peer registry has invalid entry for ${i}`)}}return s}async function Qj(e){let t=Kj(),n={v:Yj,peers:e},r=`${t}.${process.pid}.${ace()}.tmp`;await cce(Jj(t),{recursive:!0});let s=!1;try{await fce(r,`${JSON.stringify(n,null,2)}
2776
+ `),await dce(r,t),s=!0}finally{if(!s)try{await uce(r)}catch(o){if(o.code!=="ENOENT")throw o}}}function hce(e,t,n){if(n!==void 0){for(let[r,s]of Object.entries(e))if(r!==t&&s.alias===n)throw new Error(`peer alias already registered: ${n}`)}}function Zj(e,t){for(let[n,r]of Object.entries(t))if(r.alias===e)return{siteUuid:Dr(n,"wire site-uuid"),mailbox:ed(n,r.mailbox)}}function Vj(e,t){if(typeof e!="string")throw new Error(t);return e}async function e1(){let e=await td(),t=["site-uuid alias mailbox"];for(let n of Object.keys(e).sort()){let r=e[n];t.push(`${n} ${r.alias??""} ${r.mailbox}`)}return t.join(`
2777
+ `)}async function t1(e,t,n){let r=Dr(e,"site-uuid"),s=ed(r,t),o=await td(),i=o[r],a=n===void 0?i?.alias:zj(n);return hce(o,r,a),o[r]=a===void 0?{mailbox:s}:{mailbox:s,alias:a},await Qj(o),`peer ${r}${a?` (${a})`:""} -> ${s}`}async function n1(e){let t=Dr(e,"site-uuid"),n=await td();if(!Object.hasOwn(n,t))throw new Error(`unknown peer site-uuid: ${t}`);return delete n[t],await Qj(n),`removed peer ${t}`}function Wa(e){let t=e.env??process.env,n=e.resolveAppkeyImpl??Fe,r=e.createMailClientImpl??gn,{appkey:s}=n({env:t});return r({apiUrl:Hn(t),appkey:s})}function mT(e){try{return Xp(e)}catch(t){throw new Et(t instanceof Error?t.message:String(t))}}function _ce(e){if(e.includes("..")||e.endsWith(".")||!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e))throw new Et("--mailbox must be a valid mailbox name");return e}async function r1(e,t={}){let n=mT(e),r=t.siteUuid===void 0?await Sd(fs()):Dr(t.siteUuid,"--site-uuid"),s=t.mailbox??ci(r),o=Wa(t),i;try{i=await o.registerSite(n,r,s)}catch(a){throw a instanceof sr&&a.code==="site_name_taken"?new Error(`site name already registered to a different site in this account: ${n}`):a}return`registered ${i.site_name} -> ${i.site_uuid} (${i.mailbox})`}async function s1(e,t={}){let n=mT(e),r=Wa(t),s;try{s=await r.resolveSite(n)}catch(o){if(!(o instanceof sr&&o.status===404))throw o}return s?{output:`${s.site_name} ${s.site_uuid} ${s.mailbox}`,exitCode:0}:{output:`unknown site name in this account: ${n}`,exitCode:1}}async function gp(e){let t=new Map,n=new Map,r=new Set,s;do{let o=await e.listSites({limit:50,...s?{cursor:s}:{}});for(let i of o.sites)t.set(i.site_uuid.toLowerCase(),i);for(let i of o.discovered){let a=o1(i),c=n.get(a);(!c||i.last_seen_at>c.last_seen_at)&&n.set(a,i)}if(s=o.next_cursor,s){if(r.has(s))throw new Error("site listing returned a repeated cursor");r.add(s)}}while(s);return{sites:[...t.values()],discovered:[...n.values()]}}function o1(e){return e.site_uuid?`uuid#${e.site_uuid.toLowerCase()}`:`mailbox#${e.mailbox}#${e.owner_user_id}`}function gce(e){let t=[`uuid#${e.site_uuid.toLowerCase()}`],n=e.content_mailbox??e.mailbox,r=e.content_mailbox_owner_user_id??e.mailbox_owner_user_id;return r&&t.push(`mailbox#${n}#${r}`),e.exec_mailbox&&e.exec_mailbox_owner_user_id&&t.push(`mailbox#${e.exec_mailbox}#${e.exec_mailbox_owner_user_id}`),t}function Ece(e,t){let n=new Set(e.flatMap(gce));return t.filter(r=>!n.has(o1(r))&&!n.has(`mailbox#${r.mailbox}#${r.owner_user_id}`))}function fT(e){return e.display_name??e.registered_name??e.site_name}function yce(e,t){let n=["REGISTERED","display-name registered-name site-uuid content-mailbox exec-mailbox"];for(let r of e.sort((s,o)=>fT(s).localeCompare(fT(o))))n.push([fT(r),r.registered_name??r.site_name,r.site_uuid,r.content_mailbox??r.mailbox,r.exec_mailbox??"-"].join(" "));n.push("","DISCOVERED","display-name site-uuid mailbox owner-user-id last-seen-at");for(let r of t.sort((s,o)=>o.last_seen_at-s.last_seen_at))n.push([r.name??"-",r.site_uuid??"-",r.mailbox,r.owner_user_id,r.last_seen_at].join(" "));return n.join(`
2778
+ `)}async function i1(e={}){let t=Wa(e),n=await gp(t);return yce(n.sites,Ece(n.sites,n.discovered))}async function wce(e,t){let n=await gp(e),r=[...new Set(n.discovered.filter(s=>s.mailbox===t).map(s=>s.owner_user_id))];if(r.length===0)throw new Error(`mailbox is not present in site discovery: ${t}`);if(r.length>1)throw new Error(`mailbox ownership changed during site discovery; retry: ${t}`);return{kind:"mailbox",value:t,owner_user_id:r[0]}}async function a1(e,t,n){return t!==void 0?{kind:"uuid",value:Dr(t,"--uuid")}:await wce(e,_ce(n))}async function c1(e,t){let n=e.trim();if(!n)throw new Et("site display name must be non-empty");let r=Wa(t),s=await a1(r,t.uuid,t.mailbox),o=await r.setSiteName(s,n);return`named ${o.site_key} -> ${o.name}`}async function l1(e){let t=Wa(e),n=await a1(t,e.uuid,e.mailbox);return`cleared ${(await t.deleteSiteName(n)).site_key}`}async function d1(e,t={}){let n=mT(e);return await Wa(t).deleteSite(n),`removed ${n}`}function ao(){return"usage: lmbee sites register <name> [--site-uuid <uuid>] [--mailbox <name>] | resolve <name> | list | set-name (--uuid <uuid> | --mailbox <name>) <name> | clear-name (--uuid <uuid> | --mailbox <name>) | remove <name>"}var vce=15,Sce=60,bce="lmbee status --live --json";async function u1(e={}){let t=e.env??process.env,n=e.resolveAppkeyImpl??Fe,r=e.createMailClientImpl??gn,s=e.now??Date.now,o=e.sleep??(f=>new Promise(m=>setTimeout(m,f))),i=e.username??(()=>process.env.USER??process.env.USERNAME??"user"),a=e.waitSeconds??vce;if(!Number.isFinite(a)||a<=0)throw new Error("--wait-s must be positive");let{appkey:c}=n({env:t}),l=r({apiUrl:Hn(t),appkey:c}),d=(await gp(l)).sites.sort((f,m)=>f.site_name.localeCompare(m.site_name)),u=Bj(i());await aT(l,u,o);try{let f=d.map(E=>({site:E,execMailbox:fi(E.site_uuid),id:Tce(),sentAt:s()}));await Promise.all(f.map(async E=>{try{await cT(l,{id:E.id,daemonMailbox:E.execMailbox,command:bce,replyMailbox:u,timeoutSeconds:Sce})}catch(T){E.sendError=T instanceof Error?T.message:String(T)}}));let m=s()+Math.round(a*1e3),p=new Set(f.filter(E=>E.sendError===void 0).map(E=>E.id)),h=await lT(l,u,p,m,{now:s,sleep:o}),_=f.filter(E=>E.sendError===void 0).length,g=h.size,w=d.length===0?"empty":g===d.length?"all":g===0?"none":"partial";return{verdict:w,exit_code:w==="none"?2:w==="partial"?3:0,sent:_,answered:g,sites:f.map(E=>Ace(E,h.get(E.id))),generated_at:new Date(s()).toISOString()}}finally{await l.deleteMailbox(u)}}function Ace(e,t){let n={site_name:e.site.site_name,site_uuid:e.site.site_uuid,mailbox:e.execMailbox};if(!t)return{...n,liveness:"stale",error:e.sendError??"no_reply"};let r={...n,liveness:"live",latency_ms:Math.max(0,t.receivedAt-e.sentAt)},s=Ice(t);if(s)return{...r,error:s};if(t.result.exit_code!==0)return{...r,error:t.result.timed_out?"remote_timeout":`remote_exit_${t.result.exit_code}`};try{let o=JSON.parse(t.stdout);if(!o||typeof o!="object"||Array.isArray(o))throw new Error("expected JSON object");return{...r,status:o}}catch{return{...r,error:"invalid_status_json"}}}function Ice(e){if(e.result.exit_code===126)try{let t=JSON.parse(e.stderr);return typeof t.error?.code=="string"?t.error.code:"remote_rejected"}catch{return"remote_rejected"}}function f1(e){let t=["SITE LIVENESS LATENCY_MS TEAMS DAEMON ERROR"];for(let n of e.sites)t.push([n.site_name||n.site_uuid,n.liveness,n.latency_ms??"-",kce(n.status)??"-",Rce(n.status)??"-",n.error??"-"].join(" "));return t.push(`Fleet: ${e.verdict} (sent ${e.sent}/${e.sites.length}, answered ${e.answered}/${e.sites.length}; exit ${e.exit_code})`),t.join(`
2779
2779
  `)}function kce(e){return Array.isArray(e?.teams)?e.teams.length:void 0}function Rce(e){return typeof e?.live=="boolean"?`live:${e.live}`:void 0}function m1(){return"usage: lmbee exec <site-uuid-or-mailbox> [--wait-s N] <command...> | lmbee exec <site-uuid-or-mailbox> [--wait-s N] -- <literal command...>"}function pT(){return"usage: lmbee fleet status [--json] [--wait-s N]"}function p1(e,t){return Ha(e,t,n=>new Qn(n))}function Nce(e){let t=e.indexOf("--"),n=t<0?[...e]:[...e.slice(0,t)],r=t<0?void 0:e.slice(t+1),s=p1(n,"--wait-s"),o=s===void 0?void 0:Number(s);if(o!==void 0&&(!Number.isFinite(o)||o<=0))throw new Qn("--wait-s must be positive");let i=n.shift();if(!i)throw new Qn(m1());let a=r??n;if(r&&n.length>0)throw new Qn(`unexpected argument before --: ${n[0]}`);if(a.length===0)throw new Qn(m1());return{target:i,command:a.join(" "),...o===void 0?{}:{waitSeconds:o}}}async function h1(e){try{let{target:t,command:n,waitSeconds:r}=Nce(e),s=await Gj(t,n,{waitSeconds:r});return{output:`${s.stdout}${s.stderr}`.replace(/\n$/,""),exitCode:s.exitCode}}catch(t){return{output:t instanceof Error?t.message:String(t),exitCode:t instanceof Qn?1:2}}}async function _1(e){let[t,...n]=e;if(t!=="status")return{output:pT(),exitCode:1};let r=n.includes("--json");try{let s=[...n],o=s.indexOf("--json");r&&s.splice(o,1);let i=p1(s,"--wait-s"),a=i===void 0?void 0:Number(i);if(a!==void 0&&(!Number.isFinite(a)||a<=0))return{output:pT(),exitCode:1};if(s.length>0)return{output:pT(),exitCode:1};let c=await u1({waitSeconds:a});return{output:r?JSON.stringify(c,null,2):f1(c),exitCode:c.exit_code}}catch(s){let o=s instanceof Error?s.message:String(s),i=s instanceof Qn?1:2;return{output:r?JSON.stringify({verdict:"error",exit_code:i,error:o},null,2):o,exitCode:i}}}import{cpSync as Ep,existsSync as co,mkdirSync as xce,readFileSync as hT,readdirSync as Lce,rmSync as g1,statSync as E1}from"node:fs";import{homedir as T1}from"node:os";import{join as Ut,sep as _T}from"node:path";var Ba=class extends Error{constructor(t){super(`migrate-home: refusing to run -- an lmauto daemon appears to be live (${t}). Stop it first (systemctl --user stop lmauto.service if it runs as a service, or kill the pid) before re-running.`),this.name="DaemonLiveError"}},gT=class extends Error{targetDbPath;sizeBytes;constructor(t,n){super(`migrate-home: refusing to replace an existing target database: ${t} already exists (${n} bytes). migrate-home never deletes a database it did not create this run. If this file is debris from an interrupted migrate-home run, or you are certain it is disposable, re-run with --replace-existing-target-db; otherwise move it aside yourself (e.g. \`mv ${t} ${t}.bak\`) and re-run.`),this.targetDbPath=t,this.sizeBytes=n,this.name="TargetDbExistsError"}};function v1(){return Ut(T1(),".lmauto")}function S1(){return Ut(process.env.LMCTL_HOME??Ut(T1(),".lmctl"),"lmauto")}function Cce(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}async function Oce(e){try{return(await fetch(`http://127.0.0.1:${e}/api/teams`,{signal:AbortSignal.timeout(1e3)})).body?.cancel(),!0}catch{return!1}}function Dce(e,t){let n=Ut(e,"serve.pid");if(!co(n))return null;let r=hT(n,"utf8").trim(),s=Number(r);return!Number.isInteger(s)||s<=0?null:t(s)?s:null}var y1=["team_state","kv","events","queue","sources","team_progress","mail_ledger","mail_outbound_ledger"];function w1(e,t){return e.prepare(`SELECT COUNT(*) as n FROM ${t}`).get().n}function ET(e){if(!co(e))return 0;let t=0;for(let n of Lce(e,{withFileTypes:!0}))n.isDirectory()?t+=ET(Ut(e,n.name)):t+=1;return t}function $ce(e,t,n){let r=t.endsWith(_T)?t:t+_T,s=e.prepare("SELECT id, prompt_file FROM queue").all(),o=new Map(s.map(l=>[l.id,l.prompt_file])),i=s.filter(l=>l.prompt_file.startsWith(r)),a=e.prepare("UPDATE queue SET prompt_file = ? WHERE id = ?");return e.transaction(l=>{for(let d of l){let u=n+d.prompt_file.slice(t.length);a.run(u,d.id)}})(i),{rewrittenCount:i.length,originalPathById:o}}async function b1(e){let{sourceDir:t,targetDir:n,port:r=4173}=e,s=e.isDaemonAlive??Cce,o=e.probeHttpAlive??Oce,i=e.checkSiteLock??QO,a=Ut(t,"state.db"),c=Ut(n,"state.db"),l=i(a);if(l!==null)throw new Ba(`${l.ownerLabel} pid ${l.pid} (site lock for ${a})`);let d=Dce(t,s);if(d!==null)throw new Ba(`pid ${d}, ${Ut(t,"serve.pid")}`);if(await o(r))throw new Ba(`something is listening on port ${r}`);if(t===n||n.startsWith(t+_T))throw new Error(`migrate-home: target (${n}) must not be, or be nested inside, source (${t})`);let u=e.acquireSiteLock??qm,f=Cl(a),m=[];try{m.push(u(f,"migrate-home")),m.push(u(Ut(t,"site.lock"),"migrate-home"))}catch(p){for(let h of m.splice(0))h.release();throw p instanceof Ta?new Ba(`${p.holder.ownerLabel} pid ${p.holder.pid}, ${p.lockPath}`):p}try{xce(n,{recursive:!0});let p=!1,h=!1;if(co(a)){let C=co(c);if(C&&e.replaceExistingTargetDb!==!0)throw new gT(c,E1(c).size);let q=new tn(a);try{if(q.prepare("SELECT COUNT(*) AS n FROM sqlite_master").get(),C){process.stderr.write(`migrate-home: replacing existing target database ${c} (${E1(c).size} bytes) with a snapshot of ${a} (explicit replaceExistingTargetDb consent)
2780
2780
  `);for(let F of["","-wal","-shm"])g1(c+F,{force:!0});h=!0}else for(let F of["-wal","-shm"])g1(c+F,{force:!0});q.prepare("VACUUM INTO ?").run(c)}finally{q.close()}p=!0}let _=Ut(t,"queue"),g=Ut(n,"queue"),w=ET(_);w>0&&Ep(_,g,{recursive:!0});let y=Ut(t,"prompts"),E=Ut(n,"prompts"),T=ET(y);T>0&&Ep(y,E,{recursive:!0});let b=Ut(t,"site-uuid"),A=Ut(n,"site-uuid"),I=!1,R=!1;co(b)&&(Ep(b,A),I=!0,R=hT(b,"utf8")!==hT(A,"utf8"));let L=Ut(t,"lmt-peers.json"),N=Ut(n,"lmt-peers.json"),k=!1;co(L)&&(Ep(L,N),k=!0);let D=0,O=0,v=[],S=[],x={};if(p){let C=new tn(a,{readonly:!0});try{for(let F of y1)x[F]={source:w1(C,F),target:0}}finally{C.close()}let q=new tn(c);try{for(let U of y1)x[U].target=w1(q,U);let{rewrittenCount:F,originalPathById:M}=$ce(q,_,g);D=F;let $=q.prepare("SELECT id, prompt_file FROM queue").all();O=$.length;for(let U of $){if(co(U.prompt_file))continue;let B=M.get(U.id);co(B)?v.push(`#${U.id} -> ${U.prompt_file}`):S.push(`#${U.id} -> ${U.prompt_file}`)}}finally{q.close()}}return{sourceDir:t,targetDir:n,stateDbCopied:p,replacedExistingTargetDb:h,queueFilesCopied:w,promptFilesCopied:T,rewrittenPromptPaths:D,queueRowCount:O,missingPromptFiles:v,preExistingMissingPromptFiles:S,siteIdentityCopied:I,siteIdentityMismatch:R,lmtPeersCopied:k,rowCountParity:x}}finally{for(let p of m.splice(0))p.release()}}async function A1(e={}){let t=e.source??v1(),n=e.target??S1(),r=await b1({sourceDir:t,targetDir:n,replaceExistingTargetDb:e.replaceExistingTargetDb});return{output:Fce(r),exitCode:Mce(r)}}function Mce(e){return e.missingPromptFiles.length>0||e.siteIdentityMismatch||Pce(e)?1:0}function Pce(e){return Object.values(e.rowCountParity).some(t=>t.source!==t.target)}function Uce(e){let t=Object.entries(e).filter(([,n])=>n.source!==n.target);return t.length===0?` table row-count parity: OK (${Object.keys(e).length} table(s) checked, all match)`:` PARITY CHECK FAILED -- ${t.length} table(s) with a source/target row-count mismatch:
2781
2781
  `+t.map(([n,r])=>` ${n}: source=${r.source}, target=${r.target}`).join(`
@@ -2835,7 +2835,7 @@ run: lmbee module --help
2835
2835
  `}return{stdout:c,stderr:l,exitCode:a}}async function dle(e,t,n,r){let s=[];for(let c of e){let l=lo(c);if(!l.ok){s.push({spec:c,status:"failed",channels:[],error:{code:l.code,message:l.message}});continue}let d=l.value,u=t?`@${d.owner}/${d.repo}`:d.key,f=["latest","dev"].filter(p=>{if(!t&&p!==d.channel)return!1;try{return NT(Ga(r,{...d,channel:p}))}catch{return!1}}),m=await V1(d,{root:r,allChannels:t});if(!m.ok){let p=m.code==="NOT_INSTALLED"?`${u} is not installed`:m.message;s.push({spec:u,status:"failed",channels:[],error:{code:m.code,message:p}});continue}s.push({spec:u,status:"deleted",channels:f,error:null})}let o=s.some(c=>c.status==="failed")?1:0;if(n)return{stdout:`${JSON.stringify({root:r,results:s})}
2836
2836
  `,stderr:"",exitCode:o};let i="",a="";for(let c of s)c.error?a+=`error: ${c.spec}: ${c.error.message}
2837
2837
  `:i+=`deleted ${c.spec}${t?` (channels: ${c.channels.length>0?c.channels.join(", "):"none"})`:""}
2838
- `;return{stdout:i,stderr:a,exitCode:o}}function LT(e){return{output:e,exitCode:0}}function Ya(e){return{output:e,exitCode:1}}function CT(){return"usage: lmbee localweb passcode get | set | rotate"}var z1=32;async function ule(){let e=[],t=0;for await(let n of process.stdin){let r=Buffer.from(n);if(t+=r.length,t>4096)throw new Error("passcode input exceeds 4096 bytes");e.push(r)}return Buffer.concat(e).toString("utf8")}async function Q1(e,t={}){let[n,r,...s]=e;if(n!=="passcode")return Ya(CT());if(s.length)return Ya(`unexpected argument; ${CT()}`);let o=tc(),i=va(o);if(i===null)return{output:`no passcode file for an in-memory DB (${o})`,exitCode:2};if(r==="get"){let a=oD(i);return a===null?{output:"no passcode set yet -- start the daemon or run `lmbee localweb passcode rotate`",exitCode:1}:LT(a)}if(r==="set"){let a=t.readStdin??ule,c;try{c=(await a()).trim()}catch{return Ya("passcode input rejected")}let l=Buffer.byteLength(c,"utf8");return l===0||l>4096?Ya("usage: lmbee localweb passcode set (reads a nonempty value of at most 4096 bytes from stdin)"):l<z1?Ya(`passcode rejected: at least ${z1} bytes required (got ${l}) -- a short value meaningfully weakens the 256-bit guarantee rotate/startup generation otherwise provide; use \`lmbee localweb passcode rotate\` for a strong random value instead`):(Yy(i,c),LT("passcode updated"))}return r==="rotate"?LT(Hm(i)):Ya(CT())}import{randomUUID as fle}from"node:crypto";import{readFile as mle}from"node:fs/promises";function ple(e){try{let t=bv(e);return hle(t.site),t}catch(t){throw new gt(t instanceof Error?t.message:String(t))}}function hle(e){return uT(e)?e.toLowerCase():_p(e,"peer alias")}function Z1(e,t,n,r,s=!1){let o=e??(t===void 0||t===""?n:t);return s&&o===""?o:_p(o,r)}async function _le(e,t){return e==="-"?t():mle(e,"utf8")}async function gle(){let e=[];for await(let t of process.stdin)e.push(Buffer.from(t));return Buffer.concat(e).toString("utf8")}async function Ele(e,t,n){if(uT(e)){let o=Or(e,"site-uuid"),i=t[o];if(!i)throw new Error(`unknown peer site-uuid: ${o}; add it with lmbee peers add ${o} <mailbox>`);return{siteUuid:o,mailbox:ed(o,i.mailbox)}}let r=Zj(e,t);if(r)return r;try{let o=await n.resolveSite(e);return{siteUuid:Or(o.site_uuid,"resolved site-uuid"),mailbox:o.mailbox}}catch(o){if(!(o instanceof sr&&o.status===404))throw o}let s=Object.values(t).map(o=>o.alias).filter(o=>o!==void 0).sort();throw new Error(`unknown peer alias or site name: ${e}; registered local aliases: ${s.length?s.join(", "):"(none)"}; not found in the account's site registry either`)}function eq(){return"usage: lmbee tell <site-uuid-or-alias:team-id:alias> (<prompt...> | --prompt-file <path|->) [--from-team <team>] [--from-alias <alias>]"}async function tq(e,t,n={}){let r=n.env??process.env,s=n.promptFile;if(!e||s===void 0&&t.length===0)throw new gt(eq());if(s!==void 0&&t.length>0)throw new gt("positional prompt and --prompt-file are mutually exclusive");let o=ple(e),i=s===void 0?t.join(" "):await _le(s,n.readStdin??gle);if(!i.trim())throw new gt("tell prompt must be non-empty");let a=Z1(n.fromTeam,r.LMT_FROM_TEAM,"","from-team",!0),c=Z1(n.fromAlias,r.LMT_FROM_ALIAS,"operator","from-alias"),l=n.resolveAppkeyImpl??Fe,d=n.createMailClientImpl??gn,{appkey:u}=l({env:r}),f=d({apiUrl:Hn(r),appkey:u}),m=await td(),{siteUuid:p,mailbox:h}=await Ele(o.site,m,f),_={...o,site:p},g=await Sd(fs()),w=fle(),y={v:1,msg_id:w,to:_,from:{site:g,team:a,alias:c},sent_at:new Date().toISOString(),payload:i},E=await f.sendMessage({mailbox:h,subject:`delivery ${w}`,body:{name:"body.txt",contentType:"text/plain; charset=utf-8",bytes:Buffer.from(JSON.stringify(y),"utf8")}});return`sent ${w} from ${g}:${a}:${c} to ${e} via ${h} (seq ${E})`}function cs(e){return{output:e,exitCode:0}}function Dr(e){return{output:e,exitCode:1}}function OT(e){return{output:e instanceof Error?e.message:String(e),exitCode:e instanceof gt?1:2}}function yle(){return"usage: lmbee peers list | add <site-uuid> <mailbox> [--alias <name>] | remove <site-uuid>"}function $r(e,t){return Ha(e,t,n=>new gt(n))}async function nq(e){let[t,...n]=e;try{if(t==="list"){if(n.length)throw new gt(`unexpected argument: ${n[0]}`);return cs(await e1())}if(t==="add"){let r=$r(n,"--alias");return n.length!==2?Dr("usage: lmbee peers add <site-uuid> <mailbox> [--alias <name>]"):cs(await t1(n[0],n[1],r))}return t==="remove"?n.length!==1?Dr("usage: lmbee peers remove <site-uuid>"):cs(await n1(n[0])):Dr(yle())}catch(r){return OT(r)}}function wle(e){let t=[...e];if(t.includes("--message-file"))throw new gt("unknown option --message-file; use --prompt-file");let n=$r(t,"--prompt-file"),r=$r(t,"--from-team"),s=$r(t,"--from-alias"),[o,...i]=t;return{rawAddress:o,messageParts:i,promptFile:n,fromTeam:r,fromAlias:s}}async function rq(e){try{let{rawAddress:t,messageParts:n,promptFile:r,fromTeam:s,fromAlias:o}=wle(e);return cs(await tq(t,n,{promptFile:r,fromTeam:s,fromAlias:o}))}catch(t){return OT(t)}}async function sq(e){let[t,...n]=e;try{if(t==="register"){let r=$r(n,"--site-uuid"),s=$r(n,"--mailbox");return n.length!==1?Dr(ao()):cs(await r1(n[0],{siteUuid:r,mailbox:s}))}if(t==="resolve")return n.length!==1?Dr(ao()):await s1(n[0]);if(t==="list")return n.length?Dr(ao()):cs(await i1());if(t==="set-name"){let r=$r(n,"--uuid"),s=$r(n,"--mailbox");return r===void 0==(s===void 0)||n.length!==1?Dr(ao()):cs(await c1(n[0],{uuid:r,mailbox:s}))}if(t==="clear-name"){let r=$r(n,"--uuid"),s=$r(n,"--mailbox");return r===void 0==(s===void 0)||n.length!==0?Dr(ao()):cs(await l1({uuid:r,mailbox:s}))}return t==="remove"?n.length!==1?Dr(ao()):cs(await d1(n[0])):Dr(ao())}catch(r){return OT(r)}}import{execFile as Tle}from"node:child_process";import{promisify as vle}from"node:util";var Sle=vle(Tle),ble="lmbee.service";function Ale(){return process.env.LMBEE_SYSTEMD_UNIT??ble}async function oq(e={}){let t=Ale();if(!e.force)return{output:`lmbee shutdown: refusing to stop ${t} without --force -- this immediately stops queue delivery, mail polling, and anti-churn nudging. Re-run as \`lmbee shutdown --force\` to proceed.
2838
+ `;return{stdout:i,stderr:a,exitCode:o}}function LT(e){return{output:e,exitCode:0}}function Ya(e){return{output:e,exitCode:1}}function CT(){return"usage: lmbee localweb passcode get | set | rotate"}var z1=32;async function ule(){let e=[],t=0;for await(let n of process.stdin){let r=Buffer.from(n);if(t+=r.length,t>4096)throw new Error("passcode input exceeds 4096 bytes");e.push(r)}return Buffer.concat(e).toString("utf8")}async function Q1(e,t={}){let[n,r,...s]=e;if(n!=="passcode")return Ya(CT());if(s.length)return Ya(`unexpected argument; ${CT()}`);let o=tc(),i=va(o);if(i===null)return{output:`no passcode file for an in-memory DB (${o})`,exitCode:2};if(r==="get"){let a=oD(i);return a===null?{output:"no passcode set yet -- start the daemon or run `lmbee localweb passcode rotate`",exitCode:1}:LT(a)}if(r==="set"){let a=t.readStdin??ule,c;try{c=(await a()).trim()}catch{return Ya("passcode input rejected")}let l=Buffer.byteLength(c,"utf8");return l===0||l>4096?Ya("usage: lmbee localweb passcode set (reads a nonempty value of at most 4096 bytes from stdin)"):l<z1?Ya(`passcode rejected: at least ${z1} bytes required (got ${l}) -- a short value meaningfully weakens the 256-bit guarantee rotate/startup generation otherwise provide; use \`lmbee localweb passcode rotate\` for a strong random value instead`):(Yy(i,c),LT("passcode updated"))}return r==="rotate"?LT(Hm(i)):Ya(CT())}import{randomUUID as fle}from"node:crypto";import{readFile as mle}from"node:fs/promises";function ple(e){try{let t=bv(e);return hle(t.site),t}catch(t){throw new Et(t instanceof Error?t.message:String(t))}}function hle(e){return uT(e)?e.toLowerCase():_p(e,"peer alias")}function Z1(e,t,n,r,s=!1){let o=e??(t===void 0||t===""?n:t);return s&&o===""?o:_p(o,r)}async function _le(e,t){return e==="-"?t():mle(e,"utf8")}async function gle(){let e=[];for await(let t of process.stdin)e.push(Buffer.from(t));return Buffer.concat(e).toString("utf8")}async function Ele(e,t,n){if(uT(e)){let o=Dr(e,"site-uuid"),i=t[o];if(!i)throw new Error(`unknown peer site-uuid: ${o}; add it with lmbee peers add ${o} <mailbox>`);return{siteUuid:o,mailbox:ed(o,i.mailbox)}}let r=Zj(e,t);if(r)return r;try{let o=await n.resolveSite(e);return{siteUuid:Dr(o.site_uuid,"resolved site-uuid"),mailbox:o.mailbox}}catch(o){if(!(o instanceof sr&&o.status===404))throw o}let s=Object.values(t).map(o=>o.alias).filter(o=>o!==void 0).sort();throw new Error(`unknown peer alias or site name: ${e}; registered local aliases: ${s.length?s.join(", "):"(none)"}; not found in the account's site registry either`)}function eq(){return"usage: lmbee tell <site-uuid-or-alias:team-id:alias> (<prompt...> | --prompt-file <path|->) [--from-team <team>] [--from-alias <alias>]"}async function tq(e,t,n={}){let r=n.env??process.env,s=n.promptFile;if(!e||s===void 0&&t.length===0)throw new Et(eq());if(s!==void 0&&t.length>0)throw new Et("positional prompt and --prompt-file are mutually exclusive");let o=ple(e),i=s===void 0?t.join(" "):await _le(s,n.readStdin??gle);if(!i.trim())throw new Et("tell prompt must be non-empty");let a=Z1(n.fromTeam,r.LMT_FROM_TEAM,"","from-team",!0),c=Z1(n.fromAlias,r.LMT_FROM_ALIAS,"operator","from-alias"),l=n.resolveAppkeyImpl??Fe,d=n.createMailClientImpl??gn,{appkey:u}=l({env:r}),f=d({apiUrl:Hn(r),appkey:u}),m=await td(),{siteUuid:p,mailbox:h}=await Ele(o.site,m,f),_={...o,site:p},g=await Sd(fs()),w=fle(),y={v:1,msg_id:w,to:_,from:{site:g,team:a,alias:c},sent_at:new Date().toISOString(),payload:i},E=await f.sendMessage({mailbox:h,subject:`delivery ${w}`,body:{name:"body.txt",contentType:"text/plain; charset=utf-8",bytes:Buffer.from(JSON.stringify(y),"utf8")}});return`sent ${w} from ${g}:${a}:${c} to ${e} via ${h} (seq ${E})`}function cs(e){return{output:e,exitCode:0}}function $r(e){return{output:e,exitCode:1}}function OT(e){return{output:e instanceof Error?e.message:String(e),exitCode:e instanceof Et?1:2}}function yle(){return"usage: lmbee peers list | add <site-uuid> <mailbox> [--alias <name>] | remove <site-uuid>"}function Mr(e,t){return Ha(e,t,n=>new Et(n))}async function nq(e){let[t,...n]=e;try{if(t==="list"){if(n.length)throw new Et(`unexpected argument: ${n[0]}`);return cs(await e1())}if(t==="add"){let r=Mr(n,"--alias");return n.length!==2?$r("usage: lmbee peers add <site-uuid> <mailbox> [--alias <name>]"):cs(await t1(n[0],n[1],r))}return t==="remove"?n.length!==1?$r("usage: lmbee peers remove <site-uuid>"):cs(await n1(n[0])):$r(yle())}catch(r){return OT(r)}}function wle(e){let t=[...e];if(t.includes("--message-file"))throw new Et("unknown option --message-file; use --prompt-file");let n=Mr(t,"--prompt-file"),r=Mr(t,"--from-team"),s=Mr(t,"--from-alias"),[o,...i]=t;return{rawAddress:o,messageParts:i,promptFile:n,fromTeam:r,fromAlias:s}}async function rq(e){try{let{rawAddress:t,messageParts:n,promptFile:r,fromTeam:s,fromAlias:o}=wle(e);return cs(await tq(t,n,{promptFile:r,fromTeam:s,fromAlias:o}))}catch(t){return OT(t)}}async function sq(e){let[t,...n]=e;try{if(t==="register"){let r=Mr(n,"--site-uuid"),s=Mr(n,"--mailbox");return n.length!==1?$r(ao()):cs(await r1(n[0],{siteUuid:r,mailbox:s}))}if(t==="resolve")return n.length!==1?$r(ao()):await s1(n[0]);if(t==="list")return n.length?$r(ao()):cs(await i1());if(t==="set-name"){let r=Mr(n,"--uuid"),s=Mr(n,"--mailbox");return r===void 0==(s===void 0)||n.length!==1?$r(ao()):cs(await c1(n[0],{uuid:r,mailbox:s}))}if(t==="clear-name"){let r=Mr(n,"--uuid"),s=Mr(n,"--mailbox");return r===void 0==(s===void 0)||n.length!==0?$r(ao()):cs(await l1({uuid:r,mailbox:s}))}return t==="remove"?n.length!==1?$r(ao()):cs(await d1(n[0])):$r(ao())}catch(r){return OT(r)}}import{execFile as Tle}from"node:child_process";import{promisify as vle}from"node:util";var Sle=vle(Tle),ble="lmbee.service";function Ale(){return process.env.LMBEE_SYSTEMD_UNIT??ble}async function oq(e={}){let t=Ale();if(!e.force)return{output:`lmbee shutdown: refusing to stop ${t} without --force -- this immediately stops queue delivery, mail polling, and anti-churn nudging. Re-run as \`lmbee shutdown --force\` to proceed.
2839
2839
  `,exitCode:1};let n=e.execFileImpl??Sle;try{await n("systemctl",["--user","stop",t])}catch(s){let o=s instanceof Error?s.message:String(s);return{output:`lmbee shutdown: systemctl --user stop ${t} failed: ${o}
2840
2840
  `,exitCode:1}}let r;try{let{stdout:s}=await n("systemctl",["--user","is-active",t]);r=s.trim()}catch(s){let o=s&&typeof s=="object"&&"stdout"in s?String(s.stdout).trim():"";if(o.length===0){let i=s instanceof Error?s.message:String(s);return{output:`lmbee shutdown: ${t}: stop was issued, but its state could not be confirmed -- is-active check failed: ${i}
2841
2841
  `,exitCode:1}}r=o}switch(r){case"inactive":return{output:`lmbee shutdown: ${t} stopped (state: ${r})