@lmctl-ai/lmctl 0.2.434 → 0.2.436

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
@@ -4,12 +4,12 @@ var YB=Object.create;var Rh=Object.defineProperty;var KB=Object.getOwnPropertyDe
4
4
  `).join(`
5
5
  ${u}`)}`}Zt.renderGrid=t0;function n0(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:c}={}){return t0(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:c})}function f3(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:c,stream:l=process.stdout}={}){let u=n0(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:c});u&&l.write(`${u}
6
6
  `)}Zt.formatTable=n0;Zt.printTable=f3;function VL(e){return e instanceof Date?e.getTime():typeof e=="number"?e:typeof e=="string"&&e.trim()?Date.parse(e):NaN}function m3(e,{now:t=Date.now()}={}){let n=VL(t);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=VL(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":""}`}Zt.formatRelativeTime=m3;function p3(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`}Zt.formatCount=p3;var Sy=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function h3(e,{maxUnit:t="w",style:n="spaced"}={}){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let r=Sy.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=Sy.slice(r).filter(([d])=>d!=="s");if(a.length===0||s<60)return"<1m";let c=[],l=s,u=!1;for(let[d,f]of a){let m=Math.floor(l/f);if(l-=m*f,m>0&&!u){let p=d==="d"||d==="w"?`${m}${d}`:`${Fr(m)}${d}`;c.push({text:p,zero:!1}),u=!0}else u&&c.push({text:`${Fr(m)}${d}`,zero:m===0})}for(;c.length>0&&c[c.length-1].zero;)c.pop();return c.map(d=>d.text).join("")}let o=s,i=[];for(let[a,c]of Sy.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(" ")}Zt.formatDuration=h3;function r0(e){return e===void 0?new Date:e instanceof Date?e:typeof e=="number"||typeof e=="string"?new Date(e):new Date(NaN)}function Fr(e){return String(e).padStart(2,"0")}function s0(e){let t=r0(e);return Number.isNaN(t.getTime())?"unknown":`${Fr(t.getHours())}:${Fr(t.getMinutes())}:${Fr(t.getSeconds())}`}Zt.formatClock=s0;function _3(e){let t=r0(e);return Number.isNaN(t.getTime())?"unknown":`${`${t.getFullYear()}-${Fr(t.getMonth()+1)}-${Fr(t.getDate())}`} ${s0(t)}`}Zt.formatLocalTimestamp=_3;function g3(e){return typeof e=="number"&&Number.isFinite(e)?`${Math.round(e*100)}%`:"?%"}Zt.formatPercent=g3;function E3(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)||_s(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)}`}Zt.formatBar=E3;function y3(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=`${Fr(r)}:${Fr(s)}:${Fr(t)}`;return n>0?`${n}d ${o}`:o}Zt.formatTimer=y3;function w3(e){return(e==null?"":String(e)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
7
- `?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}Zt.escapeCell=w3});var fr=yS(Sn=>{"use strict";function Gp(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 Mse(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 To(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 TP(e,t,n){let r=" ".repeat(Math.max(0,t-To(e)));return n?r+e:e+r}function Pse(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 Use(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 Fse(e,t,n="\u2026"){if(To(e)<=t)return e;let r=To(n)>t?"\u2026":n,s=To(r);if(t<=s)return r;let o="",i=0;for(let a of e){let c=To(a);if(i+c>t-s)break;o+=a,i+=c}return`${o}${r}`}function jse(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 SP(e,{max:t}={}){if(!Array.isArray(e))throw new TypeError("grids must be an array of grids");let n=jse(t),r=[],s=(o,i)=>{r[o]=Math.max(r[o]??0,i)};for(let o of e){let i=Pse(o);i.headers!==void 0&&Gp(i.headers).forEach((a,c)=>{s(c,To(a))});for(let a of i.rows.map(Gp))a.forEach((c,l)=>{s(l,To(c))})}return r.map((o,i)=>{let a=n[i];return a===void 0?o:Math.min(o,a)})}Sn.measureColumns=SP;function Hse(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 bP(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=Hse(i),u=Mse(r),d=Use(c),f=t??SP([{rows:e,headers:n}],{max:a}),m=e.map(Gp);n!==void 0&&m.unshift(Gp(n));let p=m.map(h=>{let _=h.length-1;for(;_>=0&&h[_]==="";)_--;return h.slice(0,_+1).map((g,w)=>{let E=f[w]||0,y=s&&E>0&&(w!==_||o)?Fse(g,E,d):g;return u[w]==="right"?TP(y,E,!0):w===_?y:TP(y,E,!1)}).join(" ")}).join(`
7
+ `?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}Zt.escapeCell=w3});var fr=yS(Sn=>{"use strict";function Gp(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 $se(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 To(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 TP(e,t,n){let r=" ".repeat(Math.max(0,t-To(e)));return n?r+e:e+r}function Mse(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 Pse(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 Use(e,t,n="\u2026"){if(To(e)<=t)return e;let r=To(n)>t?"\u2026":n,s=To(r);if(t<=s)return r;let o="",i=0;for(let a of e){let c=To(a);if(i+c>t-s)break;o+=a,i+=c}return`${o}${r}`}function Fse(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 SP(e,{max:t}={}){if(!Array.isArray(e))throw new TypeError("grids must be an array of grids");let n=Fse(t),r=[],s=(o,i)=>{r[o]=Math.max(r[o]??0,i)};for(let o of e){let i=Mse(o);i.headers!==void 0&&Gp(i.headers).forEach((a,c)=>{s(c,To(a))});for(let a of i.rows.map(Gp))a.forEach((c,l)=>{s(l,To(c))})}return r.map((o,i)=>{let a=n[i];return a===void 0?o:Math.min(o,a)})}Sn.measureColumns=SP;function jse(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 bP(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=jse(i),u=$se(r),d=Pse(c),f=t??SP([{rows:e,headers:n}],{max:a}),m=e.map(Gp);n!==void 0&&m.unshift(Gp(n));let p=m.map(h=>{let _=h.length-1;for(;_>=0&&h[_]==="";)_--;return h.slice(0,_+1).map((g,w)=>{let E=f[w]||0,y=s&&E>0&&(w!==_||o)?Use(g,E,d):g;return u[w]==="right"?TP(y,E,!0):w===_?y:TP(y,E,!1)}).join(" ")}).join(`
8
8
  `);return p===""||l===""?p:`${l}${p.split(`
9
9
  `).join(`
10
- ${l}`)}`}Sn.renderGrid=bP;function AP(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a}={}){return bP(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a})}function qse(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,stream:c=process.stdout}={}){let l=AP(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a});l&&c.write(`${l}
11
- `)}Sn.formatTable=AP;Sn.printTable=qse;function vP(e){return e instanceof Date?e.getTime():typeof e=="number"?e:typeof e=="string"&&e.trim()?Date.parse(e):NaN}function Bse(e,{now:t=Date.now()}={}){let n=vP(t);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=vP(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":""}`}Sn.formatRelativeTime=Bse;function Wse(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`}Sn.formatCount=Wse;var PT=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function Gse(e,{maxUnit:t="w",style:n="spaced"}={}){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let r=PT.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=PT.slice(r).filter(([d])=>d!=="s");if(a.length===0||s<60)return"<1m";let c=[],l=s,u=!1;for(let[d,f]of a){let m=Math.floor(l/f);if(l-=m*f,m>0&&!u){let p=d==="d"||d==="w"?`${m}${d}`:`${Br(m)}${d}`;c.push({text:p,zero:!1}),u=!0}else u&&c.push({text:`${Br(m)}${d}`,zero:m===0})}for(;c.length>0&&c[c.length-1].zero;)c.pop();return c.map(d=>d.text).join("")}let o=s,i=[];for(let[a,c]of PT.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(" ")}Sn.formatDuration=Gse;function IP(e){return e===void 0?new Date:e instanceof Date?e:typeof e=="number"||typeof e=="string"?new Date(e):new Date(NaN)}function Br(e){return String(e).padStart(2,"0")}function kP(e){let t=IP(e);return Number.isNaN(t.getTime())?"unknown":`${Br(t.getHours())}:${Br(t.getMinutes())}:${Br(t.getSeconds())}`}Sn.formatClock=kP;function Xse(e){let t=IP(e);return Number.isNaN(t.getTime())?"unknown":`${`${t.getFullYear()}-${Br(t.getMonth()+1)}-${Br(t.getDate())}`} ${kP(t)}`}Sn.formatLocalTimestamp=Xse;function Vse(e){return typeof e=="number"&&Number.isFinite(e)?`${Math.round(e*100)}%`:"?%"}Sn.formatPercent=Vse;function Jse(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)||To(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)}`}Sn.formatBar=Jse;function Yse(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=`${Br(r)}:${Br(s)}:${Br(t)}`;return n>0?`${n}d ${o}`:o}Sn.formatTimer=Yse;function Kse(e){return(e==null?"":String(e)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
12
- `?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}Sn.escapeCell=Kse});import{createHash as Sce,randomBytes as o1}from"node:crypto";function i1(e=process.env){return{domain:e.LMCTL_AUTH_DOMAIN?.trim()||ku.domain,clientId:e.LMCTL_CLI_CLIENT_ID?.trim()||ku.clientId,scope:e.LMCTL_AUTH_SCOPE?.trim()||ku.scope,ports:ku.ports,authUrl:(e.LMCTL_AUTH_URL?.trim()||ku.authUrl).replace(/\/+$/,"")}}function a1(e=o1){let t=e(32).toString("base64url"),n=Sce("sha256").update(t).digest("base64url");return{verifier:t,challenge:n}}function c1(e=o1){return e(16).toString("base64url")}function l1(e){return`http://127.0.0.1:${e}/callback`}function u1(e,t){let n=new URLSearchParams({response_type:"code",client_id:e.clientId,redirect_uri:l1(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 d1(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 f1(e,t,n=fetch){let r=new URLSearchParams({grant_type:"authorization_code",client_id:e.clientId,code:t.code,redirect_uri:l1(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 p1(s)}`);let o=await s.json();if(!o.id_token)throw new Error("token exchange returned no id_token");return o}async function m1(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 p1(r)}`);return await r.json()}async function p1(e){try{return(await e.text()).slice(0,300)}catch{return""}}var ku,h1=Tr(()=>{ku={domain:"auth.lmctl.ai",clientId:"lpla33du6p451g9ohb0su9c5u",scope:"openid email profile",ports:[8976,8977,8978,8979],authUrl:"https://lmctl.ai/auth"}});var y1={};Lc(y1,{appkeyDir:()=>g1,persistCredentials:()=>E1,runLogin:()=>Dce});import{createServer as bce}from"node:http";import{spawn as Ace}from"node:child_process";import{hostname as Ice}from"node:os";import{mkdir as kce,rename as Rce,writeFile as Nce}from"node:fs/promises";import{homedir as xce}from"node:os";import{join as sh}from"node:path";function g1(e=process.env){let t=e.XDG_CONFIG_HOME?.trim()||sh(xce(),".config");return sh(t,"lmctl")}async function E1(e,t,n,r=process.env){let s=g1(r);await kce(s,{recursive:!0,mode:448});let o=sh(s,"appkey.json"),i={version:1,appkey:e.appkey,user_id:e.user_id,label:e.label,issued_at:e.created_at};await _1(o,JSON.stringify(i,null,2)+`
10
+ ${l}`)}`}Sn.renderGrid=bP;function AP(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a}={}){return bP(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a})}function Hse(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,stream:c=process.stdout}={}){let l=AP(e,{headers:t,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a});l&&c.write(`${l}
11
+ `)}Sn.formatTable=AP;Sn.printTable=Hse;function vP(e){return e instanceof Date?e.getTime():typeof e=="number"?e:typeof e=="string"&&e.trim()?Date.parse(e):NaN}function qse(e,{now:t=Date.now()}={}){let n=vP(t);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=vP(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":""}`}Sn.formatRelativeTime=qse;function Bse(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`}Sn.formatCount=Bse;var PT=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function Wse(e,{maxUnit:t="w",style:n="spaced"}={}){if(typeof e!="number"||!Number.isFinite(e))return"unknown";let r=PT.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=PT.slice(r).filter(([d])=>d!=="s");if(a.length===0||s<60)return"<1m";let c=[],l=s,u=!1;for(let[d,f]of a){let m=Math.floor(l/f);if(l-=m*f,m>0&&!u){let p=d==="d"||d==="w"?`${m}${d}`:`${Br(m)}${d}`;c.push({text:p,zero:!1}),u=!0}else u&&c.push({text:`${Br(m)}${d}`,zero:m===0})}for(;c.length>0&&c[c.length-1].zero;)c.pop();return c.map(d=>d.text).join("")}let o=s,i=[];for(let[a,c]of PT.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(" ")}Sn.formatDuration=Wse;function IP(e){return e===void 0?new Date:e instanceof Date?e:typeof e=="number"||typeof e=="string"?new Date(e):new Date(NaN)}function Br(e){return String(e).padStart(2,"0")}function kP(e){let t=IP(e);return Number.isNaN(t.getTime())?"unknown":`${Br(t.getHours())}:${Br(t.getMinutes())}:${Br(t.getSeconds())}`}Sn.formatClock=kP;function Gse(e){let t=IP(e);return Number.isNaN(t.getTime())?"unknown":`${`${t.getFullYear()}-${Br(t.getMonth()+1)}-${Br(t.getDate())}`} ${kP(t)}`}Sn.formatLocalTimestamp=Gse;function Xse(e){return typeof e=="number"&&Number.isFinite(e)?`${Math.round(e*100)}%`:"?%"}Sn.formatPercent=Xse;function Vse(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)||To(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)}`}Sn.formatBar=Vse;function Jse(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=`${Br(r)}:${Br(s)}:${Br(t)}`;return n>0?`${n}d ${o}`:o}Sn.formatTimer=Jse;function Yse(e){return(e==null?"":String(e)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
12
+ `?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}Sn.escapeCell=Yse});import{createHash as Sce,randomBytes as o1}from"node:crypto";function i1(e=process.env){return{domain:e.LMCTL_AUTH_DOMAIN?.trim()||ku.domain,clientId:e.LMCTL_CLI_CLIENT_ID?.trim()||ku.clientId,scope:e.LMCTL_AUTH_SCOPE?.trim()||ku.scope,ports:ku.ports,authUrl:(e.LMCTL_AUTH_URL?.trim()||ku.authUrl).replace(/\/+$/,"")}}function a1(e=o1){let t=e(32).toString("base64url"),n=Sce("sha256").update(t).digest("base64url");return{verifier:t,challenge:n}}function c1(e=o1){return e(16).toString("base64url")}function l1(e){return`http://127.0.0.1:${e}/callback`}function u1(e,t){let n=new URLSearchParams({response_type:"code",client_id:e.clientId,redirect_uri:l1(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 d1(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 f1(e,t,n=fetch){let r=new URLSearchParams({grant_type:"authorization_code",client_id:e.clientId,code:t.code,redirect_uri:l1(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 p1(s)}`);let o=await s.json();if(!o.id_token)throw new Error("token exchange returned no id_token");return o}async function m1(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 p1(r)}`);return await r.json()}async function p1(e){try{return(await e.text()).slice(0,300)}catch{return""}}var ku,h1=Tr(()=>{ku={domain:"auth.lmctl.ai",clientId:"lpla33du6p451g9ohb0su9c5u",scope:"openid email profile",ports:[8976,8977,8978,8979],authUrl:"https://lmctl.ai/auth"}});var y1={};Lc(y1,{appkeyDir:()=>g1,persistCredentials:()=>E1,runLogin:()=>Dce});import{createServer as bce}from"node:http";import{spawn as Ace}from"node:child_process";import{hostname as Ice}from"node:os";import{mkdir as kce,rename as Rce,writeFile as Nce}from"node:fs/promises";import{homedir as xce}from"node:os";import{join as sh}from"node:path";function g1(e=process.env){let t=e.XDG_CONFIG_HOME?.trim()||sh(xce(),".config");return sh(t,"lmctl")}async function E1(e,t,n,r=process.env){let s=g1(r);await kce(s,{recursive:!0,mode:448});let o=sh(s,"appkey.json"),i={version:1,appkey:e.appkey,user_id:e.user_id,label:e.label,issued_at:e.created_at};await _1(o,JSON.stringify(i,null,2)+`
13
13
  `);let a=null;if(t.refresh_token){a=sh(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 _1(a,JSON.stringify(c,null,2)+`
14
14
  `)}return{appkeyPath:o,identityPath:a}}async function _1(e,t){let n=`${e}.tmp-${process.pid}`;await Nce(n,t,{mode:384}),await Rce(n,e)}async function Lce(e){let t,n=new Promise(s=>t=s),r=bce((s,o)=>{if(!s.url?.startsWith("/callback")){o.writeHead(404).end();return}let i=d1(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 Cce(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 Cce(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 Oce(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=Ace(n,r,{stdio:"ignore",detached:!0});s.on("error",()=>{}),s.unref()}catch{}t.stdout.write(`
15
15
  If your browser didn't open, visit:
@@ -2051,7 +2051,7 @@ To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}
2051
2051
  `))}return s}var pe=class e extends Error{line;column;codeblock;constructor(t,n){let[r,s]=n9(n.toml,n.ptr),o=r9(n.toml,r,s);super(`Invalid TOML document: ${t}
2052
2052
 
2053
2053
  ${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 xm(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)pe.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,u=0,d=n===120?2:n===117?4:8;for(let f=0;f<d;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&&pe.x("invalid non-hex character in unicode escape",e),u=u<<4|p}(u<0||u>1114111||u>=55296&&u<=57343)&&pe.x("invalid unicode escape",e,l),i+=String.fromCodePoint(u),a=e.p--,c=0}else o&&(n===32||n===9)?c=2:(n===98?i+="\b":n===116?i+=" ":n===110?i+=`
2054
- `:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":pe.x("unrecognised escape sequence",e),a=e.p+1,c=0);else n!==32&&n!==9&&(c===2&&pe.x("invalid escape: only line-ending whitespace may be escaped",e,a),c=!s&&n===92?1:0,a=e.p);pe.x("unfinished string",e,t)}var s9=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,Ol=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(s9);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 Mn(e,t=10){return t===16?e>47&&e<58||e>64&&e<71||e>96&&e<103:e>47&&e<48+t}function jy(e,t){return e===32||e===9||e===10||e===13||t&&(e===t||e===44)||e===35}function $l(e,t){let n=e.p,r=e.s.charCodeAt(e.p);if(r===91||r===123){e.d--||pe.x("document contains excessively nested structures. aborting.",e);let s=r===91?fC(e):dC(e);return e.d++,s}return r===34||r===39?xm(e):r===116?((e.s.charCodeAt(++e.p)!==114||e.s.charCodeAt(++e.p)!==117||e.s.charCodeAt(++e.p)!==101)&&pe.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)&&pe.x("invalid value",e,n),e.p++,!1):r===43||r===45?Lm(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?o9(e,r,t):e.s.charCodeAt(e.p+2)===58?i9(e,r,t):Lm(e,e.p,r,0,t)}function Lm(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)&&pe.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)&&pe.x("invalid value",e,t),e.p++,NaN;if(o===48){if(++e.p>=e.s.length||jy(o=e.s.charCodeAt(e.p),s))return e.bi===!0?0n:0;if(!r){if(o===120)return Fy(e,t,16,s);if(o===98)return Fy(e,t,2,s);if(o===111)return Fy(e,t,8,s)}o===46?i=2:o===101||o===69?i=4:pe.x("illegal leading zero",e,t)}else Mn(o)||pe.x("invalid value",e,t);for(;++e.p<e.s.length&&(o=e.s.charCodeAt(e.p),!jy(o,s));)i||(i=1),o===95?(i&1||pe.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)||(Mn(o)?i>9?i-=11:i&1||i++:pe.x("illegal character in numeric literal",e));if(!i){let l=(n-48)*(r||1);return e.bi===!0?BigInt(l):l}i&1||pe.x("unfinished numeric value",e,t);let c=e.s.slice(t,e.p);return a&&(c=c.replaceAll("_","")),i>1?parseFloat(c):uC(e,c,10,t)}function Fy(e,t,n,r){let s,o=1;for(;++e.p<e.s.length&&(s=e.s.charCodeAt(e.p),!jy(s,r));)s===95?(o&1&&pe.x("illegal underscore",e),o=3):Mn(s,n)?o&1&&o--:pe.x("illegal character in numeric literal",e);o&1&&pe.x("unfinished numeric value",e);let i=e.s.slice(t+2,e.p);return o&&(i=i.replaceAll("_","")),uC(e,i,n,t)}function uC(e,t,n,r){if(e.bi!==!0)e:{let s=parseInt(t,n);if(!Number.isSafeInteger(s)){if(e.bi)break e;pe.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 o9(e,t,n){let r=e.p++,s;if(!Mn(t)||!Mn(e.s.charCodeAt(e.p++))||!Mn(e.s.charCodeAt(e.p++))||!Mn(e.s.charCodeAt(e.p++)))return Lm(e,e.p=r,t,0,n);if(e.p+=5,Mn(e.s.charCodeAt(e.p++))||pe.x("invalid date-time: date part is malformed",e,r),e.p>=e.s.length||((t=e.s.charCodeAt(e.p))!==32||(s=!0,!Mn(e.s.charCodeAt(e.p+1))))&&t!==84&&t!==116){let i=e.s.slice(r,e.p);return Dl(e,i,3,!1,r)}if(e.s.charCodeAt(e.p+=3)!==58&&pe.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(;Mn(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 Dl(e,i,1,s,r,"[+00:00]")}if(t===43||t===45){let i=e.s.slice(r,e.p+=6);return Dl(e,i,1,s,r,!e.ld&&"["+e.s.slice(e.p-6,e.p)+"]")}}let o=e.s.slice(r,e.p);return Dl(e,o,2,s,r)}function i9(e,t,n){let r=e.p;if(!Mn(t)||!Mn(e.s.charCodeAt(++e.p)))return Lm(e,--e.p,t,0,n);if(e.s.charCodeAt(e.p+=4)===58&&(e.p+=3),e.s.charCodeAt(e.p)===46)for(;Mn(e.s.charCodeAt(++e.p)););let s=e.s.slice(r,e.p);return Dl(e,s,4,!1,r)}function Dl(e,t,n,r,s,o){if(e.ld){let i=new Ol(t,n,r);return i.isValid()||pe.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){pe.x(i instanceof Error?i.message:""+i,e,s)}}function a9(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)&&pe.x("control characters are not allowed in comments",e)}}function ar(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;a9(e)}}function Cm(e,t=61){let n,r=0,s=[],o,i=e.s.charCodeAt(n=e.p);do{if(i===t)return r||pe.x("unexpected end of key",e),r===1&&s.push(e.s.slice(o,e.p)),e.p++,s;i===46?(r||pe.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)&&pe.x("illegal quoted key: multiline strings are not allowed",e),s.push(xm(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?pe.x("illegal character in key",e):r||(r=1,o=e.p)}while(i=e.s.charCodeAt(++e.p));pe.x("incomplete key-value: cannot find end of key",e,n)}function dC(e){let t=e.p++,n=Object.create(null),r=new Set,s;for(;e.p<e.s.length;){if(ar(e),(s=e.s.charCodeAt(e.p))===125)return e.p++,n;let o,i=n,a=!1,c=e.p,l=Cm(e);for(let d=0;d<l.length;d++){d&&(i=a?i[o]:i[o]=Object.create(null)),o=l[d],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&pe.x("trying to redefine an already defined value",e,c);let f=o==="__proto__";if(e.uk&&(f||o==="constructor")){i=e.uk!==1&&pe.x("document contains an unsafe property",e,c);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&pe.x("trying to redefine an already defined value",e,c),ar(e,!0,!0);let u=$l(e,125);if(i&&typeof(i[o]=u)=="object"&&r.add(u),ar(e),(s=e.s.charCodeAt(e.p++))===125)return n;s!==44&&pe.x("expected comma or end of structure",e,e.p-1)}pe.x("unfinished table",e,t)}function fC(e){let t=e.p++,n=[],r;for(;e.p<e.s.length;){if(ar(e),(r=e.s.charCodeAt(e.p))===93)return e.p++,n;if(n.push($l(e,93)),ar(e),(r=e.s.charCodeAt(e.p++))===93)return n;r!==44&&pe.x("expected comma or end of structure",e,e.p-1)}pe.x("unfinished array",e,t)}function mC(e,t,n,r,s){let o=n,i=r,a,c=!1,l;for(let u=0;u<t.length;u++){if(u){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 d=o.length-1;o=o[d],i=i[d].c}}if(a=t[u],(c=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!c){let d=a==="__proto__";if(e.uk&&(d||a==="constructor"))return!1;d&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:u<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 pC(e,t,n){(t===null||e.uk===2)&&pe.x(t===null?"trying to redefine an already defined table or value":"document contains an unsafe property",e,n)}function Hy(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++,ar(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 u=Cm(n,93);l&&(e.charCodeAt(n.p)!==93&&pe.x("expected end of table array declaration",n),n.p++);let d=mC(n,u,r,s,l?2:1);d?(c=d[2],a=d[1]):(pC(n,d,o),i=!0)}else{o=n.p;let l=Cm(n),u=mC(n,l,a,c,0);!u&&!i&&pC(n,u,o),ar(n,!0,!0);let d=$l(n,void 0);u&&!i&&(u[1][u[0]]=d)}ar(n,!0),n.p<e.length&&(o=e.charCodeAt(n.p))!==10&&(o!==13||e.charCodeAt(n.p+1)!==10)&&pe.x("each key-value declaration must be followed by an end-of-line",n),ar(n)}return r}var Pxe=!!"".isWellFormed;var d9=new Set(["endpoint"]),f9=new Set(["transport","command","args","cwd","env","url","headers","idle_ms"]),m9=new Set(["accept","content-type","content-length","mcp-session-id","mcp-protocol-version","last-event-id","host","connection","transfer-encoding"]);function Ve(e){let t=new Error(e);throw t.code="invalid_argument",t}function p9(e,t){return(!Array.isArray(e)||!e.every(n=>typeof n=="string"))&&Ve(`${t} must be an array of strings`),[...e]}function h9(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.values(e).some(n=>typeof n!="string"))&&Ve(`${t} must be a string map`);for(let[n,r]of Object.entries(e)){m9.has(n.toLowerCase())&&Ve(`${t}.${n} is reserved by HTTP transport`);try{l9(n),u9(n,r)}catch{Ve(`${t}.${n} is not a valid HTTP header`)}}return{...e}}function qy(e){(typeof e!="string"||e==="")&&Ve("config is required");let t=_C(e),n;try{n=Hy(c9(t,"utf8"))}catch(o){throw o.code=o.code==="ENOENT"?"not_found":"invalid_argument",o}Object.keys(n).some(o=>!["service","connections"].includes(o))&&Ve("Unknown config table");let r=n.service;if(r!==void 0){(!r||typeof r!="object"||Array.isArray(r))&&Ve("[service] is required");for(let i of Object.keys(r))d9.has(i)||Ve(`unknown service field: ${i}`);(typeof r.endpoint!="string"||r.endpoint==="")&&Ve("service.endpoint is required");let o;try{o=new URL(r.endpoint)}catch{Ve("service.endpoint must be a URL")}["http:","https:"].includes(o.protocol)||Ve("service.endpoint must use http or https"),["localhost","127.0.0.1","[::1]","::1"].includes(o.hostname)||Ve("service.endpoint must be loopback"),(o.search||o.hash)&&Ve("service.endpoint cannot contain query or fragment")}let s=n.connections??{};(!s||typeof s!="object"||Array.isArray(s))&&Ve("[connections] must be a table");for(let[o,i]of Object.entries(s)){(!i||typeof i!="object"||Array.isArray(i))&&Ve(`connection ${o} must be a table`);for(let c of Object.keys(i))f9.has(c)||Ve(`unknown connection field: ${o}.${c}`);let a=i.idle_ms===void 0?3e5:i.idle_ms;if((!Number.isSafeInteger(a)||a<0||a>2147483647)&&Ve(`${o}.idle_ms must be a non-negative integer`),i.transport==="http"){for(let u of["command","args","cwd","env"])i[u]!==void 0&&Ve(`connection ${o}.${u} is only valid for stdio`);(typeof i.url!="string"||i.url==="")&&Ve(`connection ${o}.url is required`);let c;try{c=new URL(i.url)}catch{Ve(`connection ${o}.url must be a URL`)}["http:","https:"].includes(c.protocol)||Ve(`connection ${o}.url must use http or https`),(c.username||c.password)&&Ve(`connection ${o}.url cannot contain credentials`),c.hash&&Ve(`connection ${o}.url cannot contain a fragment`);let l=i.headers===void 0?{}:h9(i.headers,`${o}.headers`);i._normalized={transport:"http",url:i.url,headers:l,idle_ms:a}}else{i.transport!==void 0&&i.transport!=="stdio"&&Ve(`connection ${o} transport must be stdio or http`);for(let d of["url","headers"])i[d]!==void 0&&Ve(`connection ${o}.${d} is only valid for http`);(typeof i.command!="string"||i.command==="")&&Ve(`connection ${o} command is required`);let c=i.args===void 0?[]:p9(i.args,`${o}.args`),l=i.cwd===void 0?hC(t):typeof i.cwd=="string"&&i.cwd!==""?_C(hC(t),i.cwd):Ve(`${o}.cwd must be a path`),u=i.env??{};(!u||typeof u!="object"||Array.isArray(u)||Object.values(u).some(d=>typeof d!="string"))&&Ve(`${o}.env must be a string map`),i._normalized={transport:"stdio",command:i.command,args:c,cwd:l,env:{...u},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 _9}from"http";import{Http2ServerRequest as yC,constants as g9}from"http2";import{Http2ServerRequest as By}from"http2";import{Readable as gC}from"stream";import R9 from"crypto";var mi=class extends Error{constructor(e,t){super(e,t),this.name="RequestError"}},E9=e=>e instanceof mi?e:new mi(e.message,{cause:e}),y9=global.Request,Ml=class extends y9{constructor(e,t){typeof e=="object"&&Ca in e&&(e=e[Ca]()),typeof t?.body?.getReader<"u"&&(t.duplex??="half"),super(e,t)}},w9=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)},wC=Symbol("wrapBodyStream"),T9=(e,t,n,r,s)=>{let o={method:e,headers:n,signal:s.signal};if(e==="TRACE"){o.method="GET";let i=new Ml(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[wC]){let i;o.body=new ReadableStream({async pull(a){try{i||=gC.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=gC.toWeb(r);return new Ml(t,o)},Ca=Symbol("getRequestCache"),TC=Symbol("requestCache"),Om=Symbol("incomingKey"),Dm=Symbol("urlKey"),v9=Symbol("headersKey"),La=Symbol("abortControllerKey"),S9=Symbol("getAbortController"),Pl={get method(){return this[Om].method||"GET"},get url(){return this[Dm]},get headers(){return this[v9]||=w9(this[Om])},[S9](){return this[Ca](),this[La]},[Ca](){return this[La]||=new AbortController,this[TC]||=T9(this.method,this[Dm],this.headers,this[Om],this[La])}};["body","bodyUsed","cache","credentials","destination","integrity","mode","redirect","referrer","referrerPolicy","signal","keepalive"].forEach(e=>{Object.defineProperty(Pl,e,{get(){return this[Ca]()[e]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach(e=>{Object.defineProperty(Pl,e,{value:function(){return this[Ca]()[e]()}})});Object.defineProperty(Pl,Symbol.for("nodejs.util.inspect.custom"),{value:function(e,t,n){let r={method:this.method,url:this.url,headers:this.headers,nativeRequest:this[TC]};return`Request (lightweight) ${n(r,{...t,depth:e==null?null:e-1})}`}});Object.setPrototypeOf(Pl,Ml.prototype);var b9=(e,t)=>{let n=Object.create(Pl);n[Om]=e;let r=e.url||"";if(r[0]!=="/"&&(r.startsWith("http://")||r.startsWith("https://"))){if(e instanceof By)throw new mi("Absolute URL for :path is not allowed in HTTP/2");try{let a=new URL(r);n[Dm]=a.href}catch(a){throw new mi("Invalid absolute URL",{cause:a})}return n}let s=(e instanceof By?e.authority:e.headers.host)||t;if(!s)throw new mi("Missing host header");let o;if(e instanceof By){if(o=e.scheme,!(o==="http"||o==="https"))throw new mi("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 mi("Invalid host header");return n[Dm]=i.href,n},Gy=Symbol("responseCache"),xa=Symbol("getResponseCache"),pi=Symbol("cache"),Jy=global.Response,Oa=class vC{#t;#e;[xa](){return delete this[pi],this[Gy]||=new Jy(this.#t,this.#e)}constructor(t,n){let r;if(this.#t=t,n instanceof vC){let s=n[Gy];if(s){this.#e=s,this[xa]();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[pi]=[n?.status||200,t,r||n?.headers])}get headers(){let t=this[pi];return t?(t[2]instanceof Headers||(t[2]=new Headers(t[2]||{"content-type":"text/plain; charset=UTF-8"})),t[2]):this[xa]().headers}get status(){return this[pi]?.[0]??this[xa]().status}get ok(){let t=this.status;return t>=200&&t<300}};["body","bodyUsed","redirected","statusText","trailers","type","url"].forEach(e=>{Object.defineProperty(Oa.prototype,e,{get(){return this[xa]()[e]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach(e=>{Object.defineProperty(Oa.prototype,e,{value:function(){return this[xa]()[e]()}})});Object.defineProperty(Oa.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[Gy]};return`Response (lightweight) ${n(r,{...t,depth:e==null?null:e-1})}`}});Object.setPrototypeOf(Oa,Jy);Object.setPrototypeOf(Oa.prototype,Jy.prototype);async function A9(e){return Promise.race([e,Promise.resolve().then(()=>Promise.resolve(void 0))])}function SC(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 I9(e,t){if(e.locked)throw new TypeError("ReadableStream is locked.");return t.destroyed?void 0:SC(e.getReader(),t)}var Xy=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},k9="x-hono-already-sent";typeof global.crypto>"u"&&(global.crypto=R9);var Yy=Symbol("outgoingEnded"),EC=Symbol("incomingDraining"),N9=500,x9=64*1024*1024,Wy=e=>{let t=e;if(e.destroyed||t[EC])return;if(t[EC]=!0,e instanceof yC){try{e.stream?.close?.(g9.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,N9);o.unref?.();let i=a=>{n+=a.length,n>x9&&s()};e.on("data",i),e.on("end",r),e.on("error",r),e.resume()},L9=()=>new Response(null,{status:400}),bC=e=>new Response(null,{status:e instanceof Error&&(e.name==="TimeoutError"||e.constructor.name==="TimeoutError")?504:500}),Vy=(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))},AC=e=>{"flushHeaders"in e&&e.writable&&e.flushHeaders()},IC=async(e,t)=>{let[n,r,s]=e[pi],o=!1;if(!s)s={"content-type":"text/plain; charset=UTF-8"};else if(s instanceof Headers)o=s.has("content-length"),s=Xy(s);else if(Array.isArray(s)){let i=new Headers(s);o=i.has("content-length"),s=Xy(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())):(AC(t),await I9(r,t)?.catch(i=>Vy(i,t))),t[Yy]?.()},C9=e=>typeof e.then=="function",O9=async(e,t,n={})=>{if(C9(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(bC);if(pi in e)return IC(e,t);let r=Xy(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 u=await A9(a).catch(d=>{console.error(d),i=!0});if(!u){if(l===1){await new Promise(d=>setTimeout(d)),c=3;continue}break}if(a=void 0,u.value&&o.push(u.value),u.done){i=!0;break}}i&&!("content-length"in r)&&(r["content-length"]=o.reduce((l,u)=>l+u.length,0))}t.writeHead(e.status,r),o.forEach(c=>{t.write(c)}),i?t.end():(o.length===0&&AC(t),await SC(s,t,a))}else r[k9]||(t.writeHead(e.status,r),t.end());t[Yy]?.()},D9=(e,t={})=>{let n=t.autoCleanupIncoming??!0;return t.overrideGlobalObjects!==!1&&global.Request!==Ml&&(Object.defineProperty(global,"Request",{value:Ml}),Object.defineProperty(global,"Response",{value:Oa})),async(r,s)=>{let o,i;try{i=b9(r,t.hostname);let a=!n||r.method==="GET"||r.method==="HEAD";if(a||(r[wC]=!0,r.on("end",()=>{a=!0}),r instanceof yC&&(s[Yy]=()=>{a||setTimeout(()=>{a||setTimeout(()=>{Wy(r)})})}),s.on("finish",()=>{a||Wy(r)})),s.on("close",()=>{i[La]&&(r.errored?i[La].abort(r.errored.toString()):s.writableFinished||i[La].abort("Client connection prematurely closed.")),a||setTimeout(()=>{a||setTimeout(()=>{Wy(r)})})}),o=e(i,{incoming:r,outgoing:s}),pi in o)return IC(o,s)}catch(a){if(o)return Vy(a,s);if(t.errorHandler){if(o=await t.errorHandler(i?a:E9(a)),!o)return}else i?o=bC(a):o=L9()}try{return await O9(o,s,t)}catch(a){return Vy(a,s)}}},$9=e=>{let t=e.fetch,n=D9(t,{hostname:e.hostname,overrideGlobalObjects:e.overrideGlobalObjects,autoCleanupIncoming:e.autoCleanupIncoming});return(e.createServer||_9)(e.serverOptions||{},n)},kC=(e,t)=>{let n=$9(e);return n.listen(e?.port??3e3,e.hostname,()=>{let r=n.address();t&&t(r)}),n};var Ky=(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,u;if(e[a]?(u=e[a][0][0],r.req.routeIndex=a):u=a===e.length&&s||void 0,u)try{c=await u(r,()=>i(a+1))}catch(d){if(d instanceof Error&&t)r.error=d,c=await t(d,r),l=!0;else throw d}else r.finalized===!1&&n&&(c=await n(r));return c&&(r.finalized===!1||l)&&(r.res=c),r}};var RC=Symbol();var NC=(e,t)=>new Response(e,{headers:{"Content-Type":t.replace(/^[^;]+/,r=>r.toLowerCase())}}).formData();var xC=32,M9=1e4,$m=e=>"headers"in e,OC=async(e,t=Object.create(null))=>{let{all:n=!1,dot:r=!1}=t,i=($m(e)?e.headers:e.raw.headers).get("Content-Type")?.split(";")[0].trim().toLowerCase();return i==="multipart/form-data"||i==="application/x-www-form-urlencoded"?P9(e,{all:n,dot:r}):{}};async function P9(e,t){if(!$m(e)&&e.bodyCache.formData)return LC(await e.bodyCache.formData,t);let n=$m(e)?e.headers:e.raw.headers,r=await e.arrayBuffer(),s=NC(r,n.get("Content-Type")||"");$m(e)||(e.bodyCache.formData=s);let o=await s;return o?LC(o,t):{}}function LC(e,t){let n=Object.create(null),r={count:0};return e.forEach((s,o)=>{t.all||o.endsWith("[]")?U9(n,o,s):n[o]=s}),t.dot&&Object.entries(n).forEach(([s,o])=>{s.includes(".")&&(F9(n,s,o,r),delete n[s])}),n}var U9=(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},F9=(e,t,n,r)=>{if(/(?:^|\.)__proto__\./.test(t))return;let s=e,o=t.split(".",xC+2);o.length>xC+1&&CC(),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++>=M9&&CC(),s[i]=Object.create(null)),s=s[i])})},CC=()=>{throw new Error("Nesting limit exceeded")};var Qy=e=>{let t=e.split("/");return t[0]===""&&t.shift(),t},DC=e=>{let{groups:t,path:n}=j9(e),r=Qy(n);return H9(r,t)},j9=e=>{let t=[];return e=e.replace(/\{[^}]+\}/g,(n,r)=>{let s=`@${r}`;return t.push([s,n]),s}),{groups:t,path:e}},H9=(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},Mm={},$C=(e,t)=>{if(e==="*")return"*";let n=e.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(n){let r=`${e}#${t}`;return Mm[r]||(n[2]?Mm[r]=t&&t[0]!==":"&&t[0]!=="*"?[r,n[1],new RegExp(`^${n[2]}(?=/${t})`)]:[e,n[1],new RegExp(`^${n[2]}$`)]:Mm[r]=[e,n[1],!0]),Mm[r]}return null},MC=(e,t)=>{try{return t(e)}catch{return e.replace(/(?:%[0-9A-Fa-f]{2})+/g,n=>{try{return t(n)}catch{return n}})}},q9=e=>MC(e,decodeURI),Zy=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 q9(c.includes("%25")?c.replace(/%25/g,"%2525"):c)}else if(s===63||s===35)break}return t.slice(n,r)};var PC=e=>{let t=Zy(e);return t.length>1&&t.at(-1)==="/"?t.slice(0,-1):t},po=(e,t,...n)=>(n.length&&(t=po(t,...n)),`${e?.[0]==="/"?"":"/"}${e}${t==="/"?"":`${e?.at(-1)==="/"?"":"/"}${t?.[0]==="/"?t.slice(1):t}`}`),Pm=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)},Um=e=>e.indexOf("%")!==-1?MC(e,B9):e,zy=e=>(e.indexOf("+")!==-1&&(e=e.replace(/\+/g," ")),Um(e)),UC=(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,u=e.indexOf("&",l);return zy(e.slice(l,u===-1?void 0:u))}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=zy(l)),i=a,l==="")continue;let u;c===-1?u="":(u=e.slice(c+1,a===-1?void 0:a),s&&(u=zy(u))),n?(o[l]&&Array.isArray(o[l])||(o[l]=[]),o[l].push(u)):o[l]??=u}return t?o[t]:o},FC=UC,jC=(e,t)=>UC(e,t,!0),B9=decodeURIComponent;var HC=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&&Um(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]=Um(r))}return e}#r(e){return this.#e[1]?this.#e[1][e]:e}query(e){return FC(this.url,e)}queries(e){return jC(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 OC(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[RC](){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 qC={Stringify:1,BeforeStream:2,Stream:3},W9=(e,t)=>{let n=new String(e);return n.isEscaped=!0,n.callbacks=t,n};var ew=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=>ew(c,t,!1,r,s))).then(()=>s[0]));return n?W9(await i,o):i};var G9="text/plain; charset=UTF-8",tw=(e,t)=>({"Content-Type":e,...t}),Ul=(e,t)=>new Response(e,t),nw=class{#t;#e;env={};#n;finalized=!1;error;#o;#r;#s;#u;#c;#l;#a;#d;#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.#d=t.matchResult)}get req(){return this.#e??=new HC(this.#t,this.#f,this.#d),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||=Ul(null,{headers:this.#a??=new Headers})}set res(e){if(this.#s&&e){e=Ul(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.#u=e;getLayout=()=>this.#u;setRenderer=e=>{this.#c=e};header=(e,t,n)=>{this.finalized&&(this.#s=Ul(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 Ul(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,tw(G9,n));json=(e,t,n)=>this.#i(JSON.stringify(e),t,tw("application/json",n));html=(e,t,n)=>{let r=s=>this.#i(s,t,tw("text/html; charset=UTF-8",n));return typeof e=="object"?ew(e,qC.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??=()=>Ul(),this.#l(this))};var Ft="ALL",BC="all",WC=["get","post","put","delete","options","patch","query"],Fm="Can not add a route since the matcher is already built.",jm=class extends Error{};var GC="__COMPOSED_HANDLER";var X9=e=>e.text("404 Not Found",404),XC=(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)},VC=class JC{get;post;put;delete;options;patch;query;all;on;use;router;getPath;_basePath="/";#t="/";routes=[];constructor(t={}){[...WC,BC].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(u=>{this.#o(l.toUpperCase(),this.#t,u)})}return this},this.use=(o,...i)=>(typeof o=="string"?this.#t=o:(this.#t="*",i.unshift(o)),i.forEach(a=>{this.#o(Ft,this.#t,a)}),this);let{strict:r,...s}=t;Object.assign(this,s),this.getPath=r??!0?t.getPath??Zy:PC}#e(){let t=new JC({router:this.router,getPath:this.getPath});return t.errorHandler=this.errorHandler,t.#n=this.#n,t.routes=this.routes,t}#n=X9;errorHandler=XC;route(t,n){let r=this.basePath(t);return n.routes.map(s=>{let o;n.errorHandler===XC?o=s.handler:(o=async(i,a)=>(await Ky([],n.errorHandler)(i,()=>s.handler(i,a))).res,o[GC]=s.handler),r.#o(s.method,s.path,o,s.basePath)}),this}basePath(t){let n=this.#e();return n._basePath=po(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=po(this._basePath,t),l=c==="/"?0:c.length;return u=>{let d=new URL(u.url);return d.pathname=this.getPath(u).slice(l)||"/",new Request(d,u)}})();let a=async(c,l)=>{let u=await n(s(c.req.raw),...i(c));if(u)return u;await l()};return this.#o(Ft,po(t,"*"),a),this}#o(t,n,r,s){t=t.toUpperCase(),n=po(this._basePath,n);let o={basePath:s!==void 0?po(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 nw(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(u){return this.#r(u,a)}return l instanceof Promise?l.then(u=>u||(a.finalized?a.res:this.#n(a))).catch(u=>this.#r(u,a)):l??this.#n(a)}let c=Ky(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${po("/",t)}`,n),r,s));fire=()=>{addEventListener("fetch",t=>{t.respondWith(this.#s(t.request,t,void 0,t.request.method))})}};var $t=()=>Object.create(null);var Hm=[];function rw(e,t){let n=this.buildAllMatchers(),r=(s,o)=>{let i=n[s]||n[Ft],a=i[2][o];if(a)return a;let c=o.match(i[0]);if(!c)return[[],Hm];let l=c.indexOf("",1);return[i[1][l],c]};return this.match=r,r(e,t)}var Da="[^/]+",_o=".*",ys="(?:|/.*)",ho=Symbol(),YC=new Set(".\\+*[^]$()");function V9(e,t){return e.length===1?t.length===1?e<t?-1:1:-1:t.length===1?1:e===_o||e===ys?t===ys?-1:1:t===_o||t===ys?-1:e===Da?1:t===Da?-1:e.length===t.length?e<t?-1:1:t.length-e.length}var KC=class sw{#t;#e;#n=$t();insert(t,n,r,s,o){let i=this;for(let a=0,c=t.length;a<c;a++){let l=t[a],u=l.length===1?l==="*"?a===c-1?["","",_o]:["","",Da]:null:l==="/*"?["","",ys]:l.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),d;if(u){let f=u[1],m=u[2]||Da;if(f&&u[2]&&(m===".*"||(m=m.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(m))||m.length===1&&YC.has(m)))throw ho;if(d=i.#n[m],!d){if(m!==_o&&m!==ys){for(let p in i.#n)if((m.length>1||p.length>1)&&p!==_o&&p!==ys)throw ho}d=i.#n[m]=new sw}f!==""&&(d.#e??=s.varIndex++,r.push([f,d.#e]))}else if(d=i.#n[l],!d){for(let f in i.#n)if(f.length>1&&f!==_o&&f!==ys)throw ho;d=i.#n[l]=new sw}i=d}if(i.#t!==void 0)throw ho;i.#t=o?-1:n}buildRegExpStr(){let n=Object.keys(this.#n).sort(V9).map(r=>{let s=this.#n[r],o=s.buildRegExpStr();return o===""?"":(typeof s.#e=="number"?`(${r})@${s.#e}`:YC.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 ow=class{#t={varIndex:0};#e=new KC;#n=0;paths=$t();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 zC=$t();function QC(e){return zC[e]??=new RegExp(`^${e.replace(/\/:[^/{}]+(?:\{\[\^\/]\+})?(?=[/{]|$)|\/?\*$|([.\\+*[^\]$()?{}|])/g,(t,n)=>n?`\\${n}`:t==="/*"?ys:t==="*"?_o:`/:${Da}`)}$`)}function qm(e,t){for(let n of Object.keys(e).sort((r,s)=>s.length-r.length))if(QC(n).test(t))return[...e[n]]}var Bm=class{name="RegExpRouter";#t;#e;#n;constructor(){this.#t={[Ft]:$t()},this.#e={[Ft]:$t()},this.#n={[Ft]:new ow}}#o(e,t){try{this.#n[e].insert(t,!/\*|\/:/.test(t))}catch(n){throw n===ho?new jm(t):n}}add(e,t,n){let r=this.#t,s=this.#e;if(!r)throw new Error(Fm);if(!r[e]){this.#n[e]=new ow;for(let a of[r,s]){a[e]=$t();for(let c in a[Ft])a[e][c]=[...a[Ft][c]],this.#o(e,c)}}t==="/*"&&(t="*");let o=e===Ft?Object.keys(r):[e];if(/\*$/.test(t)){let a=QC(t);for(let c of o)r[c][t]||(this.#o(c,t),r[c][t]=qm(r[c],t)||qm(r[Ft],t)||[]);for(let c of[r,s])for(let l of o)for(let u in c[l])a.test(u)&&c[l][u].push([n,t]);return}let i=Pm(t)||[t];for(let a of i)for(let c of o)s[c][a]||(this.#o(c,a),s[c][a]=qm(r[c],a)||qm(r[Ft],a)||[]),s[c][a].push([n,a])}match=rw;buildAllMatchers(){let e=$t();for(let t of Object.keys(this.#e))e[t]=this.#r(t);return this.#t=this.#e=this.#n=void 0,zC=$t(),e}#r(e){let t=this.#t[e],n=this.#e[e],r=this.#n[e],s=$t(),o=[],[i,a,c]=r.buildRegExp();for(let l of[t,n])for(let u in l){let d=l[u],f=r.paths[u];if(!f){s[u]=[d.map(([m])=>[m,$t()]),Hm];continue}o[f[0]]=d.map(([m,p])=>[m,r.paths[p][1].reduceRight((h,[_],g)=>(h[_]=c[f[1][g][1]],h),$t())])}return[i,a.map(l=>o[l]),s]}};var iw=class{name="SmartRouter";#t=[];#e=[];constructor(e){this.#t=e.routers}add(e,t,n){if(!this.#e)throw new Error(Fm);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 jm)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 aw=$t(),J9=0,ZC=class eO{#t=[];#e=$t();#n=[];#o;#r=aw;insert(t,n,r){let s=this,o=DC(n),i=new Set,a=0;for(let c of o){let l=o[++a],u=$C(c,l)||(l===void 0&&c&&c.indexOf("*")===c.length-1?c:null),d=Array.isArray(u),f=d?u[0]:u||c,m=s.#e[f]||=new eO;u&&!m.#o&&(m.#o=u,s.#n.push(m)),s=m,d&&i.add(u[1])}s.#t.push({[t]:{handler:r,possibleKeys:[...i],score:++J9}})}#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[Ft];if(l){l.params=$t(),t.push(l);for(let u=0,d=l.possibleKeys.length;u<d;u++){let f=l.possibleKeys[u];l.params[f]=o?.[f]&&!u?o[f]:s[f]??o?.[f]}}}}search(t,n){let r=[];this.#r=aw;let o=[this],i=Qy(n),a=[],c=i.length,l=null;for(let u=0;u<c;u++){let d=i[u],f=u===c-1,m=[];for(let h=0,_=o.length;h<_;h++){let g=o[h],w=g.#e[d];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 E of g.#n){let y=E.#o,T=g.#r===aw?{}:{...g.#r};if(typeof y=="string"){(y==="*"||d.startsWith(y.slice(0,-1)))&&(this.#s(r,E,t,g.#r),y==="*"&&(E.#r=T,m.push(E)));continue}let[,v,A]=y;if(!(!d&&A===!0)){if(A!==!0){if(!l){l=[];let x=n[0]==="/"?1:0;for(let R=0;R<c;R++)l[R]=x,x+=i[R].length+1}let I=n.slice(l[u]),N=A.exec(I);if(N){T[v]=N[0],this.#s(r,E,t,g.#r,T),N[0].length===I.length&&E.#e["*"]&&this.#s(r,E.#e["*"],t,g.#r,T);for(let x in E.#e){E.#r=T;let R=N[0].match(/\//g)?.length??0;(a[R]||=[]).push(E);break}continue}}(A===!0||A.test(d))&&(T[v]=d,f?(this.#s(r,E,t,T,g.#r),E.#e["*"]&&this.#s(r,E.#e["*"],t,T,g.#r)):(E.#r=T,m.push(E)))}}}let p=a.shift();o=p?m.concat(p):m}return r[1]&&r.sort((u,d)=>u.score-d.score),[r.map(({handler:u,params:d})=>[u,d])]}};var cw=class{name="TrieRouter";#t=new ZC;add(e,t,n){for(let r of Pm(t)||[t])this.#t.insert(e,r,n)}match(e,t){return this.#t.search(e,t)}};var hi=class extends VC{constructor(e={}){super(e),this.router=e.router??new iw({routers:[new Bm,new cw]})}};import{join as Y9}from"node:path";function tO(e){return e||(process.env.LMBEE_TEAMS_CONF?process.env.LMBEE_TEAMS_CONF:Y9(process.cwd(),"teams.conf"))}function nO(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||!Q(r)))try{ob(e.db,n,new Date().toISOString())}catch{}}function lw(e={}){let t=typeof e=="string"?{dbPath:e}:e,n=Cs(t.dbPath,{readOnly:t.readOnly??!1,origin:t.origin}),r=tO(t.teamsConfPath),s=Os(n.db,r);return t.readOnly||nO(n,s),{db:n,teamsConfPath:r,teams:s}}function uw(e={}){let t=typeof e=="string"?{dbPath:e}:e,n,r,s=tO(t.teamsConfPath),o=()=>(n||(n=Cs(t.dbPath,{readOnly:t.readOnly??!1,origin:t.origin})),n),i=()=>{if(!r){let a=o();r=Os(a.db,s),t.readOnly||nO(a,r)}return r};return{get db(){return o()},teamsConfPath:s,get teams(){return i()},close(){n?.close()},isOpened(){return n!==void 0}}}import{existsSync as Lne,readFileSync as Cne,statSync as One}from"node:fs";import{execFile as K9}from"node:child_process";import{promisify as z9}from"node:util";var Wm=z9(K9),jl=3,Fl="auto_nudge_redirect:",dw=3,fw=5*60*6e4;function Yn(e,t){let n=e.prepare("SELECT v FROM kv WHERE k = ?").get(Fl+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:dw,hoursThresholdMs:typeof r.hoursThresholdMs=="number"&&r.hoursThresholdMs>0?r.hoursThresholdMs:fw,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 mw(e){return e.prepare("SELECT k FROM kv WHERE k LIKE ?").all(Fl+"%").map(n=>n.k.slice(Fl.length))}function Gm(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(Fl+t,JSON.stringify(n))}function rO(e,t){e.prepare("DELETE FROM kv WHERE k = ?").run(Fl+t)}async function sO(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 Q9(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 oO(e,t,n,r,s,o=Wm){let i=n.shiftStartedTs!==null,a=i?n.shiftStartedSha:await sO(r,o);Gm(e,t,{...n,turnsDispatched:n.turnsDispatched+1,shiftStartedTs:i?n.shiftStartedTs:s,shiftStartedSha:a})}async function iO(e,t,n=Date.now(),r=Wm){let s=[];for(let o of mw(e)){let i=Yn(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 Q9(a,i.shiftStartedSha,r):null,u=i.turnsDispatched<=jl&&i.turnsDispatched>i.lastReviewedTurn,d=c*60*6e4>=i.hoursThresholdMs,f=l!==null&&l>=i.commitThreshold;(u||d||f)&&s.push({team:o,companionTeam:i.companionTeam,workerAlias:i.workerAlias,commitCount:l,hoursElapsed:c,shiftStartedTs:i.shiftStartedTs,shiftStartedSha:i.shiftStartedSha,isRampUp:u,turnNumber:i.turnsDispatched})}return s}async function aO(e,t,n,r,s=Wm){let o=Yn(e,t);if(o===null)return;let i=await sO(n,s);Gm(e,t,{...o,shiftStartedTs:r,shiftStartedSha:i,lastReviewedTurn:o.turnsDispatched})}async function cO(e,t,n=Wm){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?`
2054
+ `:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":pe.x("unrecognised escape sequence",e),a=e.p+1,c=0);else n!==32&&n!==9&&(c===2&&pe.x("invalid escape: only line-ending whitespace may be escaped",e,a),c=!s&&n===92?1:0,a=e.p);pe.x("unfinished string",e,t)}var s9=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,Ol=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(s9);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 Mn(e,t=10){return t===16?e>47&&e<58||e>64&&e<71||e>96&&e<103:e>47&&e<48+t}function jy(e,t){return e===32||e===9||e===10||e===13||t&&(e===t||e===44)||e===35}function $l(e,t){let n=e.p,r=e.s.charCodeAt(e.p);if(r===91||r===123){e.d--||pe.x("document contains excessively nested structures. aborting.",e);let s=r===91?fC(e):dC(e);return e.d++,s}return r===34||r===39?xm(e):r===116?((e.s.charCodeAt(++e.p)!==114||e.s.charCodeAt(++e.p)!==117||e.s.charCodeAt(++e.p)!==101)&&pe.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)&&pe.x("invalid value",e,n),e.p++,!1):r===43||r===45?Lm(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?o9(e,r,t):e.s.charCodeAt(e.p+2)===58?i9(e,r,t):Lm(e,e.p,r,0,t)}function Lm(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)&&pe.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)&&pe.x("invalid value",e,t),e.p++,NaN;if(o===48){if(++e.p>=e.s.length||jy(o=e.s.charCodeAt(e.p),s))return e.bi===!0?0n:0;if(!r){if(o===120)return Fy(e,t,16,s);if(o===98)return Fy(e,t,2,s);if(o===111)return Fy(e,t,8,s)}o===46?i=2:o===101||o===69?i=4:pe.x("illegal leading zero",e,t)}else Mn(o)||pe.x("invalid value",e,t);for(;++e.p<e.s.length&&(o=e.s.charCodeAt(e.p),!jy(o,s));)i||(i=1),o===95?(i&1||pe.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)||(Mn(o)?i>9?i-=11:i&1||i++:pe.x("illegal character in numeric literal",e));if(!i){let l=(n-48)*(r||1);return e.bi===!0?BigInt(l):l}i&1||pe.x("unfinished numeric value",e,t);let c=e.s.slice(t,e.p);return a&&(c=c.replaceAll("_","")),i>1?parseFloat(c):uC(e,c,10,t)}function Fy(e,t,n,r){let s,o=1;for(;++e.p<e.s.length&&(s=e.s.charCodeAt(e.p),!jy(s,r));)s===95?(o&1&&pe.x("illegal underscore",e),o=3):Mn(s,n)?o&1&&o--:pe.x("illegal character in numeric literal",e);o&1&&pe.x("unfinished numeric value",e);let i=e.s.slice(t+2,e.p);return o&&(i=i.replaceAll("_","")),uC(e,i,n,t)}function uC(e,t,n,r){if(e.bi!==!0)e:{let s=parseInt(t,n);if(!Number.isSafeInteger(s)){if(e.bi)break e;pe.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 o9(e,t,n){let r=e.p++,s;if(!Mn(t)||!Mn(e.s.charCodeAt(e.p++))||!Mn(e.s.charCodeAt(e.p++))||!Mn(e.s.charCodeAt(e.p++)))return Lm(e,e.p=r,t,0,n);if(e.p+=5,Mn(e.s.charCodeAt(e.p++))||pe.x("invalid date-time: date part is malformed",e,r),e.p>=e.s.length||((t=e.s.charCodeAt(e.p))!==32||(s=!0,!Mn(e.s.charCodeAt(e.p+1))))&&t!==84&&t!==116){let i=e.s.slice(r,e.p);return Dl(e,i,3,!1,r)}if(e.s.charCodeAt(e.p+=3)!==58&&pe.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(;Mn(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 Dl(e,i,1,s,r,"[+00:00]")}if(t===43||t===45){let i=e.s.slice(r,e.p+=6);return Dl(e,i,1,s,r,!e.ld&&"["+e.s.slice(e.p-6,e.p)+"]")}}let o=e.s.slice(r,e.p);return Dl(e,o,2,s,r)}function i9(e,t,n){let r=e.p;if(!Mn(t)||!Mn(e.s.charCodeAt(++e.p)))return Lm(e,--e.p,t,0,n);if(e.s.charCodeAt(e.p+=4)===58&&(e.p+=3),e.s.charCodeAt(e.p)===46)for(;Mn(e.s.charCodeAt(++e.p)););let s=e.s.slice(r,e.p);return Dl(e,s,4,!1,r)}function Dl(e,t,n,r,s,o){if(e.ld){let i=new Ol(t,n,r);return i.isValid()||pe.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){pe.x(i instanceof Error?i.message:""+i,e,s)}}function a9(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)&&pe.x("control characters are not allowed in comments",e)}}function ar(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;a9(e)}}function Cm(e,t=61){let n,r=0,s=[],o,i=e.s.charCodeAt(n=e.p);do{if(i===t)return r||pe.x("unexpected end of key",e),r===1&&s.push(e.s.slice(o,e.p)),e.p++,s;i===46?(r||pe.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)&&pe.x("illegal quoted key: multiline strings are not allowed",e),s.push(xm(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?pe.x("illegal character in key",e):r||(r=1,o=e.p)}while(i=e.s.charCodeAt(++e.p));pe.x("incomplete key-value: cannot find end of key",e,n)}function dC(e){let t=e.p++,n=Object.create(null),r=new Set,s;for(;e.p<e.s.length;){if(ar(e),(s=e.s.charCodeAt(e.p))===125)return e.p++,n;let o,i=n,a=!1,c=e.p,l=Cm(e);for(let d=0;d<l.length;d++){d&&(i=a?i[o]:i[o]=Object.create(null)),o=l[d],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&pe.x("trying to redefine an already defined value",e,c);let f=o==="__proto__";if(e.uk&&(f||o==="constructor")){i=e.uk!==1&&pe.x("document contains an unsafe property",e,c);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&pe.x("trying to redefine an already defined value",e,c),ar(e,!0,!0);let u=$l(e,125);if(i&&typeof(i[o]=u)=="object"&&r.add(u),ar(e),(s=e.s.charCodeAt(e.p++))===125)return n;s!==44&&pe.x("expected comma or end of structure",e,e.p-1)}pe.x("unfinished table",e,t)}function fC(e){let t=e.p++,n=[],r;for(;e.p<e.s.length;){if(ar(e),(r=e.s.charCodeAt(e.p))===93)return e.p++,n;if(n.push($l(e,93)),ar(e),(r=e.s.charCodeAt(e.p++))===93)return n;r!==44&&pe.x("expected comma or end of structure",e,e.p-1)}pe.x("unfinished array",e,t)}function mC(e,t,n,r,s){let o=n,i=r,a,c=!1,l;for(let u=0;u<t.length;u++){if(u){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 d=o.length-1;o=o[d],i=i[d].c}}if(a=t[u],(c=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!c){let d=a==="__proto__";if(e.uk&&(d||a==="constructor"))return!1;d&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:u<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 pC(e,t,n){(t===null||e.uk===2)&&pe.x(t===null?"trying to redefine an already defined table or value":"document contains an unsafe property",e,n)}function Hy(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++,ar(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 u=Cm(n,93);l&&(e.charCodeAt(n.p)!==93&&pe.x("expected end of table array declaration",n),n.p++);let d=mC(n,u,r,s,l?2:1);d?(c=d[2],a=d[1]):(pC(n,d,o),i=!0)}else{o=n.p;let l=Cm(n),u=mC(n,l,a,c,0);!u&&!i&&pC(n,u,o),ar(n,!0,!0);let d=$l(n,void 0);u&&!i&&(u[1][u[0]]=d)}ar(n,!0),n.p<e.length&&(o=e.charCodeAt(n.p))!==10&&(o!==13||e.charCodeAt(n.p+1)!==10)&&pe.x("each key-value declaration must be followed by an end-of-line",n),ar(n)}return r}var Pxe=!!"".isWellFormed;var d9=new Set(["endpoint"]),f9=new Set(["transport","command","args","cwd","env","url","headers","idle_ms"]),m9=new Set(["accept","content-type","content-length","mcp-session-id","mcp-protocol-version","last-event-id","host","connection","transfer-encoding"]);function Ve(e){let t=new Error(e);throw t.code="invalid_argument",t}function p9(e,t){return(!Array.isArray(e)||!e.every(n=>typeof n=="string"))&&Ve(`${t} must be an array of strings`),[...e]}function h9(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.values(e).some(n=>typeof n!="string"))&&Ve(`${t} must be a string map`);for(let[n,r]of Object.entries(e)){m9.has(n.toLowerCase())&&Ve(`${t}.${n} is reserved by HTTP transport`);try{l9(n),u9(n,r)}catch{Ve(`${t}.${n} is not a valid HTTP header`)}}return{...e}}function qy(e){(typeof e!="string"||e==="")&&Ve("config is required");let t=_C(e),n;try{n=Hy(c9(t,"utf8"))}catch(o){throw o.code=o.code==="ENOENT"?"not_found":"invalid_argument",o}Object.keys(n).some(o=>!["service","connections"].includes(o))&&Ve("Unknown config table");let r=n.service;if(r!==void 0){(!r||typeof r!="object"||Array.isArray(r))&&Ve("[service] is required");for(let i of Object.keys(r))d9.has(i)||Ve(`unknown service field: ${i}`);(typeof r.endpoint!="string"||r.endpoint==="")&&Ve("service.endpoint is required");let o;try{o=new URL(r.endpoint)}catch{Ve("service.endpoint must be a URL")}["http:","https:"].includes(o.protocol)||Ve("service.endpoint must use http or https"),["localhost","127.0.0.1","[::1]","::1"].includes(o.hostname)||Ve("service.endpoint must be loopback"),(o.search||o.hash)&&Ve("service.endpoint cannot contain query or fragment")}let s=n.connections??{};(!s||typeof s!="object"||Array.isArray(s))&&Ve("[connections] must be a table");for(let[o,i]of Object.entries(s)){(!i||typeof i!="object"||Array.isArray(i))&&Ve(`connection ${o} must be a table`);for(let c of Object.keys(i))f9.has(c)||Ve(`unknown connection field: ${o}.${c}`);let a=i.idle_ms===void 0?3e5:i.idle_ms;if((!Number.isSafeInteger(a)||a<0||a>2147483647)&&Ve(`${o}.idle_ms must be a non-negative integer`),i.transport==="http"){for(let u of["command","args","cwd","env"])i[u]!==void 0&&Ve(`connection ${o}.${u} is only valid for stdio`);(typeof i.url!="string"||i.url==="")&&Ve(`connection ${o}.url is required`);let c;try{c=new URL(i.url)}catch{Ve(`connection ${o}.url must be a URL`)}["http:","https:"].includes(c.protocol)||Ve(`connection ${o}.url must use http or https`),(c.username||c.password)&&Ve(`connection ${o}.url cannot contain credentials`),c.hash&&Ve(`connection ${o}.url cannot contain a fragment`);let l=i.headers===void 0?{}:h9(i.headers,`${o}.headers`);i._normalized={transport:"http",url:i.url,headers:l,idle_ms:a}}else{i.transport!==void 0&&i.transport!=="stdio"&&Ve(`connection ${o} transport must be stdio or http`);for(let d of["url","headers"])i[d]!==void 0&&Ve(`connection ${o}.${d} is only valid for http`);(typeof i.command!="string"||i.command==="")&&Ve(`connection ${o} command is required`);let c=i.args===void 0?[]:p9(i.args,`${o}.args`),l=i.cwd===void 0?hC(t):typeof i.cwd=="string"&&i.cwd!==""?_C(hC(t),i.cwd):Ve(`${o}.cwd must be a path`),u=i.env??{};(!u||typeof u!="object"||Array.isArray(u)||Object.values(u).some(d=>typeof d!="string"))&&Ve(`${o}.env must be a string map`),i._normalized={transport:"stdio",command:i.command,args:c,cwd:l,env:{...u},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 _9}from"http";import{Http2ServerRequest as yC,constants as g9}from"http2";import{Http2ServerRequest as By}from"http2";import{Readable as gC}from"stream";import R9 from"crypto";var mi=class extends Error{constructor(e,t){super(e,t),this.name="RequestError"}},E9=e=>e instanceof mi?e:new mi(e.message,{cause:e}),y9=global.Request,Ml=class extends y9{constructor(e,t){typeof e=="object"&&Ca in e&&(e=e[Ca]()),typeof t?.body?.getReader<"u"&&(t.duplex??="half"),super(e,t)}},w9=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)},wC=Symbol("wrapBodyStream"),T9=(e,t,n,r,s)=>{let o={method:e,headers:n,signal:s.signal};if(e==="TRACE"){o.method="GET";let i=new Ml(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[wC]){let i;o.body=new ReadableStream({async pull(a){try{i||=gC.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=gC.toWeb(r);return new Ml(t,o)},Ca=Symbol("getRequestCache"),TC=Symbol("requestCache"),Om=Symbol("incomingKey"),Dm=Symbol("urlKey"),v9=Symbol("headersKey"),La=Symbol("abortControllerKey"),S9=Symbol("getAbortController"),Pl={get method(){return this[Om].method||"GET"},get url(){return this[Dm]},get headers(){return this[v9]||=w9(this[Om])},[S9](){return this[Ca](),this[La]},[Ca](){return this[La]||=new AbortController,this[TC]||=T9(this.method,this[Dm],this.headers,this[Om],this[La])}};["body","bodyUsed","cache","credentials","destination","integrity","mode","redirect","referrer","referrerPolicy","signal","keepalive"].forEach(e=>{Object.defineProperty(Pl,e,{get(){return this[Ca]()[e]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach(e=>{Object.defineProperty(Pl,e,{value:function(){return this[Ca]()[e]()}})});Object.defineProperty(Pl,Symbol.for("nodejs.util.inspect.custom"),{value:function(e,t,n){let r={method:this.method,url:this.url,headers:this.headers,nativeRequest:this[TC]};return`Request (lightweight) ${n(r,{...t,depth:e==null?null:e-1})}`}});Object.setPrototypeOf(Pl,Ml.prototype);var b9=(e,t)=>{let n=Object.create(Pl);n[Om]=e;let r=e.url||"";if(r[0]!=="/"&&(r.startsWith("http://")||r.startsWith("https://"))){if(e instanceof By)throw new mi("Absolute URL for :path is not allowed in HTTP/2");try{let a=new URL(r);n[Dm]=a.href}catch(a){throw new mi("Invalid absolute URL",{cause:a})}return n}let s=(e instanceof By?e.authority:e.headers.host)||t;if(!s)throw new mi("Missing host header");let o;if(e instanceof By){if(o=e.scheme,!(o==="http"||o==="https"))throw new mi("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 mi("Invalid host header");return n[Dm]=i.href,n},Gy=Symbol("responseCache"),xa=Symbol("getResponseCache"),pi=Symbol("cache"),Jy=global.Response,Oa=class vC{#t;#e;[xa](){return delete this[pi],this[Gy]||=new Jy(this.#t,this.#e)}constructor(t,n){let r;if(this.#t=t,n instanceof vC){let s=n[Gy];if(s){this.#e=s,this[xa]();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[pi]=[n?.status||200,t,r||n?.headers])}get headers(){let t=this[pi];return t?(t[2]instanceof Headers||(t[2]=new Headers(t[2]||{"content-type":"text/plain; charset=UTF-8"})),t[2]):this[xa]().headers}get status(){return this[pi]?.[0]??this[xa]().status}get ok(){let t=this.status;return t>=200&&t<300}};["body","bodyUsed","redirected","statusText","trailers","type","url"].forEach(e=>{Object.defineProperty(Oa.prototype,e,{get(){return this[xa]()[e]}})});["arrayBuffer","blob","clone","formData","json","text"].forEach(e=>{Object.defineProperty(Oa.prototype,e,{value:function(){return this[xa]()[e]()}})});Object.defineProperty(Oa.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[Gy]};return`Response (lightweight) ${n(r,{...t,depth:e==null?null:e-1})}`}});Object.setPrototypeOf(Oa,Jy);Object.setPrototypeOf(Oa.prototype,Jy.prototype);async function A9(e){return Promise.race([e,Promise.resolve().then(()=>Promise.resolve(void 0))])}function SC(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 I9(e,t){if(e.locked)throw new TypeError("ReadableStream is locked.");return t.destroyed?void 0:SC(e.getReader(),t)}var Xy=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},k9="x-hono-already-sent";typeof global.crypto>"u"&&(global.crypto=R9);var Yy=Symbol("outgoingEnded"),EC=Symbol("incomingDraining"),N9=500,x9=64*1024*1024,Wy=e=>{let t=e;if(e.destroyed||t[EC])return;if(t[EC]=!0,e instanceof yC){try{e.stream?.close?.(g9.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,N9);o.unref?.();let i=a=>{n+=a.length,n>x9&&s()};e.on("data",i),e.on("end",r),e.on("error",r),e.resume()},L9=()=>new Response(null,{status:400}),bC=e=>new Response(null,{status:e instanceof Error&&(e.name==="TimeoutError"||e.constructor.name==="TimeoutError")?504:500}),Vy=(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))},AC=e=>{"flushHeaders"in e&&e.writable&&e.flushHeaders()},IC=async(e,t)=>{let[n,r,s]=e[pi],o=!1;if(!s)s={"content-type":"text/plain; charset=UTF-8"};else if(s instanceof Headers)o=s.has("content-length"),s=Xy(s);else if(Array.isArray(s)){let i=new Headers(s);o=i.has("content-length"),s=Xy(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())):(AC(t),await I9(r,t)?.catch(i=>Vy(i,t))),t[Yy]?.()},C9=e=>typeof e.then=="function",O9=async(e,t,n={})=>{if(C9(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(bC);if(pi in e)return IC(e,t);let r=Xy(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 u=await A9(a).catch(d=>{console.error(d),i=!0});if(!u){if(l===1){await new Promise(d=>setTimeout(d)),c=3;continue}break}if(a=void 0,u.value&&o.push(u.value),u.done){i=!0;break}}i&&!("content-length"in r)&&(r["content-length"]=o.reduce((l,u)=>l+u.length,0))}t.writeHead(e.status,r),o.forEach(c=>{t.write(c)}),i?t.end():(o.length===0&&AC(t),await SC(s,t,a))}else r[k9]||(t.writeHead(e.status,r),t.end());t[Yy]?.()},D9=(e,t={})=>{let n=t.autoCleanupIncoming??!0;return t.overrideGlobalObjects!==!1&&global.Request!==Ml&&(Object.defineProperty(global,"Request",{value:Ml}),Object.defineProperty(global,"Response",{value:Oa})),async(r,s)=>{let o,i;try{i=b9(r,t.hostname);let a=!n||r.method==="GET"||r.method==="HEAD";if(a||(r[wC]=!0,r.on("end",()=>{a=!0}),r instanceof yC&&(s[Yy]=()=>{a||setTimeout(()=>{a||setTimeout(()=>{Wy(r)})})}),s.on("finish",()=>{a||Wy(r)})),s.on("close",()=>{i[La]&&(r.errored?i[La].abort(r.errored.toString()):s.writableFinished||i[La].abort("Client connection prematurely closed.")),a||setTimeout(()=>{a||setTimeout(()=>{Wy(r)})})}),o=e(i,{incoming:r,outgoing:s}),pi in o)return IC(o,s)}catch(a){if(o)return Vy(a,s);if(t.errorHandler){if(o=await t.errorHandler(i?a:E9(a)),!o)return}else i?o=bC(a):o=L9()}try{return await O9(o,s,t)}catch(a){return Vy(a,s)}}},$9=e=>{let t=e.fetch,n=D9(t,{hostname:e.hostname,overrideGlobalObjects:e.overrideGlobalObjects,autoCleanupIncoming:e.autoCleanupIncoming});return(e.createServer||_9)(e.serverOptions||{},n)},kC=(e,t)=>{let n=$9(e);return n.listen(e?.port??3e3,e.hostname,()=>{let r=n.address();t&&t(r)}),n};var Ky=(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,u;if(e[a]?(u=e[a][0][0],r.req.routeIndex=a):u=a===e.length&&s||void 0,u)try{c=await u(r,()=>i(a+1))}catch(d){if(d instanceof Error&&t)r.error=d,c=await t(d,r),l=!0;else throw d}else r.finalized===!1&&n&&(c=await n(r));return c&&(r.finalized===!1||l)&&(r.res=c),r}};var RC=Symbol();var NC=(e,t)=>new Response(e,{headers:{"Content-Type":t.replace(/^[^;]+/,r=>r.toLowerCase())}}).formData();var xC=32,M9=1e4,$m=e=>"headers"in e,OC=async(e,t=Object.create(null))=>{let{all:n=!1,dot:r=!1}=t,i=($m(e)?e.headers:e.raw.headers).get("Content-Type")?.split(";")[0].trim().toLowerCase();return i==="multipart/form-data"||i==="application/x-www-form-urlencoded"?P9(e,{all:n,dot:r}):{}};async function P9(e,t){if(!$m(e)&&e.bodyCache.formData)return LC(await e.bodyCache.formData,t);let n=$m(e)?e.headers:e.raw.headers,r=await e.arrayBuffer(),s=NC(r,n.get("Content-Type")||"");$m(e)||(e.bodyCache.formData=s);let o=await s;return o?LC(o,t):{}}function LC(e,t){let n=Object.create(null),r={count:0};return e.forEach((s,o)=>{t.all||o.endsWith("[]")?U9(n,o,s):n[o]=s}),t.dot&&Object.entries(n).forEach(([s,o])=>{s.includes(".")&&(F9(n,s,o,r),delete n[s])}),n}var U9=(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},F9=(e,t,n,r)=>{if(/(?:^|\.)__proto__\./.test(t))return;let s=e,o=t.split(".",xC+2);o.length>xC+1&&CC(),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++>=M9&&CC(),s[i]=Object.create(null)),s=s[i])})},CC=()=>{throw new Error("Nesting limit exceeded")};var Qy=e=>{let t=e.split("/");return t[0]===""&&t.shift(),t},DC=e=>{let{groups:t,path:n}=j9(e),r=Qy(n);return H9(r,t)},j9=e=>{let t=[];return e=e.replace(/\{[^}]+\}/g,(n,r)=>{let s=`@${r}`;return t.push([s,n]),s}),{groups:t,path:e}},H9=(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},Mm={},$C=(e,t)=>{if(e==="*")return"*";let n=e.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(n){let r=`${e}#${t}`;return Mm[r]||(n[2]?Mm[r]=t&&t[0]!==":"&&t[0]!=="*"?[r,n[1],new RegExp(`^${n[2]}(?=/${t})`)]:[e,n[1],new RegExp(`^${n[2]}$`)]:Mm[r]=[e,n[1],!0]),Mm[r]}return null},MC=(e,t)=>{try{return t(e)}catch{return e.replace(/(?:%[0-9A-Fa-f]{2})+/g,n=>{try{return t(n)}catch{return n}})}},q9=e=>MC(e,decodeURI),Zy=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 q9(c.includes("%25")?c.replace(/%25/g,"%2525"):c)}else if(s===63||s===35)break}return t.slice(n,r)};var PC=e=>{let t=Zy(e);return t.length>1&&t.at(-1)==="/"?t.slice(0,-1):t},po=(e,t,...n)=>(n.length&&(t=po(t,...n)),`${e?.[0]==="/"?"":"/"}${e}${t==="/"?"":`${e?.at(-1)==="/"?"":"/"}${t?.[0]==="/"?t.slice(1):t}`}`),Pm=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)},Um=e=>e.indexOf("%")!==-1?MC(e,B9):e,zy=e=>(e.indexOf("+")!==-1&&(e=e.replace(/\+/g," ")),Um(e)),UC=(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,u=e.indexOf("&",l);return zy(e.slice(l,u===-1?void 0:u))}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=zy(l)),i=a,l==="")continue;let u;c===-1?u="":(u=e.slice(c+1,a===-1?void 0:a),s&&(u=zy(u))),n?(o[l]&&Array.isArray(o[l])||(o[l]=[]),o[l].push(u)):o[l]??=u}return t?o[t]:o},FC=UC,jC=(e,t)=>UC(e,t,!0),B9=decodeURIComponent;var HC=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&&Um(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]=Um(r))}return e}#r(e){return this.#e[1]?this.#e[1][e]:e}query(e){return FC(this.url,e)}queries(e){return jC(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 OC(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[RC](){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 qC={Stringify:1,BeforeStream:2,Stream:3},W9=(e,t)=>{let n=new String(e);return n.isEscaped=!0,n.callbacks=t,n};var ew=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=>ew(c,t,!1,r,s))).then(()=>s[0]));return n?W9(await i,o):i};var G9="text/plain; charset=UTF-8",tw=(e,t)=>({"Content-Type":e,...t}),Ul=(e,t)=>new Response(e,t),nw=class{#t;#e;env={};#n;finalized=!1;error;#o;#r;#s;#u;#c;#l;#a;#d;#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.#d=t.matchResult)}get req(){return this.#e??=new HC(this.#t,this.#f,this.#d),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||=Ul(null,{headers:this.#a??=new Headers})}set res(e){if(this.#s&&e){e=Ul(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.#u=e;getLayout=()=>this.#u;setRenderer=e=>{this.#c=e};header=(e,t,n)=>{this.finalized&&(this.#s=Ul(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 Ul(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,tw(G9,n));json=(e,t,n)=>this.#i(JSON.stringify(e),t,tw("application/json",n));html=(e,t,n)=>{let r=s=>this.#i(s,t,tw("text/html; charset=UTF-8",n));return typeof e=="object"?ew(e,qC.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??=()=>Ul(),this.#l(this))};var Ft="ALL",BC="all",WC=["get","post","put","delete","options","patch","query"],Fm="Can not add a route since the matcher is already built.",jm=class extends Error{};var GC="__COMPOSED_HANDLER";var X9=e=>e.text("404 Not Found",404),XC=(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)},VC=class JC{get;post;put;delete;options;patch;query;all;on;use;router;getPath;_basePath="/";#t="/";routes=[];constructor(t={}){[...WC,BC].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(u=>{this.#o(l.toUpperCase(),this.#t,u)})}return this},this.use=(o,...i)=>(typeof o=="string"?this.#t=o:(this.#t="*",i.unshift(o)),i.forEach(a=>{this.#o(Ft,this.#t,a)}),this);let{strict:r,...s}=t;Object.assign(this,s),this.getPath=r??!0?t.getPath??Zy:PC}#e(){let t=new JC({router:this.router,getPath:this.getPath});return t.errorHandler=this.errorHandler,t.#n=this.#n,t.routes=this.routes,t}#n=X9;errorHandler=XC;route(t,n){let r=this.basePath(t);return n.routes.map(s=>{let o;n.errorHandler===XC?o=s.handler:(o=async(i,a)=>(await Ky([],n.errorHandler)(i,()=>s.handler(i,a))).res,o[GC]=s.handler),r.#o(s.method,s.path,o,s.basePath)}),this}basePath(t){let n=this.#e();return n._basePath=po(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=po(this._basePath,t),l=c==="/"?0:c.length;return u=>{let d=new URL(u.url);return d.pathname=this.getPath(u).slice(l)||"/",new Request(d,u)}})();let a=async(c,l)=>{let u=await n(s(c.req.raw),...i(c));if(u)return u;await l()};return this.#o(Ft,po(t,"*"),a),this}#o(t,n,r,s){t=t.toUpperCase(),n=po(this._basePath,n);let o={basePath:s!==void 0?po(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 nw(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(u){return this.#r(u,a)}return l instanceof Promise?l.then(u=>u||(a.finalized?a.res:this.#n(a))).catch(u=>this.#r(u,a)):l??this.#n(a)}let c=Ky(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${po("/",t)}`,n),r,s));fire=()=>{addEventListener("fetch",t=>{t.respondWith(this.#s(t.request,t,void 0,t.request.method))})}};var $t=()=>Object.create(null);var Hm=[];function rw(e,t){let n=this.buildAllMatchers(),r=(s,o)=>{let i=n[s]||n[Ft],a=i[2][o];if(a)return a;let c=o.match(i[0]);if(!c)return[[],Hm];let l=c.indexOf("",1);return[i[1][l],c]};return this.match=r,r(e,t)}var Da="[^/]+",_o=".*",ys="(?:|/.*)",ho=Symbol(),YC=new Set(".\\+*[^]$()");function V9(e,t){return e.length===1?t.length===1?e<t?-1:1:-1:t.length===1?1:e===_o||e===ys?t===ys?-1:1:t===_o||t===ys?-1:e===Da?1:t===Da?-1:e.length===t.length?e<t?-1:1:t.length-e.length}var KC=class sw{#t;#e;#n=$t();insert(t,n,r,s,o){let i=this;for(let a=0,c=t.length;a<c;a++){let l=t[a],u=l.length===1?l==="*"?a===c-1?["","",_o]:["","",Da]:null:l==="/*"?["","",ys]:l.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),d;if(u){let f=u[1],m=u[2]||Da;if(f&&u[2]&&(m===".*"||(m=m.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(m))||m.length===1&&YC.has(m)))throw ho;if(d=i.#n[m],!d){if(m!==_o&&m!==ys){for(let p in i.#n)if((m.length>1||p.length>1)&&p!==_o&&p!==ys)throw ho}d=i.#n[m]=new sw}f!==""&&(d.#e??=s.varIndex++,r.push([f,d.#e]))}else if(d=i.#n[l],!d){for(let f in i.#n)if(f.length>1&&f!==_o&&f!==ys)throw ho;d=i.#n[l]=new sw}i=d}if(i.#t!==void 0)throw ho;i.#t=o?-1:n}buildRegExpStr(){let n=Object.keys(this.#n).sort(V9).map(r=>{let s=this.#n[r],o=s.buildRegExpStr();return o===""?"":(typeof s.#e=="number"?`(${r})@${s.#e}`:YC.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 ow=class{#t={varIndex:0};#e=new KC;#n=0;paths=$t();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 zC=$t();function QC(e){return zC[e]??=new RegExp(`^${e.replace(/\/:[^/{}]+(?:\{\[\^\/]\+})?(?=[/{]|$)|\/?\*$|([.\\+*[^\]$()?{}|])/g,(t,n)=>n?`\\${n}`:t==="/*"?ys:t==="*"?_o:`/:${Da}`)}$`)}function qm(e,t){for(let n of Object.keys(e).sort((r,s)=>s.length-r.length))if(QC(n).test(t))return[...e[n]]}var Bm=class{name="RegExpRouter";#t;#e;#n;constructor(){this.#t={[Ft]:$t()},this.#e={[Ft]:$t()},this.#n={[Ft]:new ow}}#o(e,t){try{this.#n[e].insert(t,!/\*|\/:/.test(t))}catch(n){throw n===ho?new jm(t):n}}add(e,t,n){let r=this.#t,s=this.#e;if(!r)throw new Error(Fm);if(!r[e]){this.#n[e]=new ow;for(let a of[r,s]){a[e]=$t();for(let c in a[Ft])a[e][c]=[...a[Ft][c]],this.#o(e,c)}}t==="/*"&&(t="*");let o=e===Ft?Object.keys(r):[e];if(/\*$/.test(t)){let a=QC(t);for(let c of o)r[c][t]||(this.#o(c,t),r[c][t]=qm(r[c],t)||qm(r[Ft],t)||[]);for(let c of[r,s])for(let l of o)for(let u in c[l])a.test(u)&&c[l][u].push([n,t]);return}let i=Pm(t)||[t];for(let a of i)for(let c of o)s[c][a]||(this.#o(c,a),s[c][a]=qm(r[c],a)||qm(r[Ft],a)||[]),s[c][a].push([n,a])}match=rw;buildAllMatchers(){let e=$t();for(let t of Object.keys(this.#e))e[t]=this.#r(t);return this.#t=this.#e=this.#n=void 0,zC=$t(),e}#r(e){let t=this.#t[e],n=this.#e[e],r=this.#n[e],s=$t(),o=[],[i,a,c]=r.buildRegExp();for(let l of[t,n])for(let u in l){let d=l[u],f=r.paths[u];if(!f){s[u]=[d.map(([m])=>[m,$t()]),Hm];continue}o[f[0]]=d.map(([m,p])=>[m,r.paths[p][1].reduceRight((h,[_],g)=>(h[_]=c[f[1][g][1]],h),$t())])}return[i,a.map(l=>o[l]),s]}};var iw=class{name="SmartRouter";#t=[];#e=[];constructor(e){this.#t=e.routers}add(e,t,n){if(!this.#e)throw new Error(Fm);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 jm)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 aw=$t(),J9=0,ZC=class eO{#t=[];#e=$t();#n=[];#o;#r=aw;insert(t,n,r){let s=this,o=DC(n),i=new Set,a=0;for(let c of o){let l=o[++a],u=$C(c,l)||(l===void 0&&c&&c.indexOf("*")===c.length-1?c:null),d=Array.isArray(u),f=d?u[0]:u||c,m=s.#e[f]||=new eO;u&&!m.#o&&(m.#o=u,s.#n.push(m)),s=m,d&&i.add(u[1])}s.#t.push({[t]:{handler:r,possibleKeys:[...i],score:++J9}})}#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[Ft];if(l){l.params=$t(),t.push(l);for(let u=0,d=l.possibleKeys.length;u<d;u++){let f=l.possibleKeys[u];l.params[f]=o?.[f]&&!u?o[f]:s[f]??o?.[f]}}}}search(t,n){let r=[];this.#r=aw;let o=[this],i=Qy(n),a=[],c=i.length,l=null;for(let u=0;u<c;u++){let d=i[u],f=u===c-1,m=[];for(let h=0,_=o.length;h<_;h++){let g=o[h],w=g.#e[d];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 E of g.#n){let y=E.#o,T=g.#r===aw?{}:{...g.#r};if(typeof y=="string"){(y==="*"||d.startsWith(y.slice(0,-1)))&&(this.#s(r,E,t,g.#r),y==="*"&&(E.#r=T,m.push(E)));continue}let[,v,A]=y;if(!(!d&&A===!0)){if(A!==!0){if(!l){l=[];let x=n[0]==="/"?1:0;for(let R=0;R<c;R++)l[R]=x,x+=i[R].length+1}let I=n.slice(l[u]),N=A.exec(I);if(N){T[v]=N[0],this.#s(r,E,t,g.#r,T),N[0].length===I.length&&E.#e["*"]&&this.#s(r,E.#e["*"],t,g.#r,T);for(let x in E.#e){E.#r=T;let R=N[0].match(/\//g)?.length??0;(a[R]||=[]).push(E);break}continue}}(A===!0||A.test(d))&&(T[v]=d,f?(this.#s(r,E,t,T,g.#r),E.#e["*"]&&this.#s(r,E.#e["*"],t,T,g.#r)):(E.#r=T,m.push(E)))}}}let p=a.shift();o=p?m.concat(p):m}return r[1]&&r.sort((u,d)=>u.score-d.score),[r.map(({handler:u,params:d})=>[u,d])]}};var cw=class{name="TrieRouter";#t=new ZC;add(e,t,n){for(let r of Pm(t)||[t])this.#t.insert(e,r,n)}match(e,t){return this.#t.search(e,t)}};var hi=class extends VC{constructor(e={}){super(e),this.router=e.router??new iw({routers:[new Bm,new cw]})}};import{join as Y9}from"node:path";function tO(e){return e||(process.env.LMBEE_TEAMS_CONF?process.env.LMBEE_TEAMS_CONF:Y9(process.cwd(),"teams.conf"))}function nO(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||!Q(r)))try{ob(e.db,n,new Date().toISOString())}catch{}}function lw(e={}){let t=typeof e=="string"?{dbPath:e}:e,n=Cs(t.dbPath,{readOnly:t.readOnly??!1,origin:t.origin}),r=tO(t.teamsConfPath),s=Os(n.db,r);return t.readOnly||nO(n,s),{db:n,teamsConfPath:r,teams:s}}function uw(e={}){let t=typeof e=="string"?{dbPath:e}:e,n,r,s=tO(t.teamsConfPath),o=()=>(n||(n=Cs(t.dbPath,{readOnly:t.readOnly??!1,origin:t.origin})),n),i=()=>{if(!r){let a=o();r=Os(a.db,s),t.readOnly||nO(a,r)}return r};return{get db(){return o()},teamsConfPath:s,get teams(){return i()},close(){n?.close()},isOpened(){return n!==void 0}}}import{existsSync as xne,readFileSync as Lne,statSync as Cne}from"node:fs";import{execFile as K9}from"node:child_process";import{promisify as z9}from"node:util";var Wm=z9(K9),jl=3,Fl="auto_nudge_redirect:",dw=3,fw=5*60*6e4;function Yn(e,t){let n=e.prepare("SELECT v FROM kv WHERE k = ?").get(Fl+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:dw,hoursThresholdMs:typeof r.hoursThresholdMs=="number"&&r.hoursThresholdMs>0?r.hoursThresholdMs:fw,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 mw(e){return e.prepare("SELECT k FROM kv WHERE k LIKE ?").all(Fl+"%").map(n=>n.k.slice(Fl.length))}function Gm(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(Fl+t,JSON.stringify(n))}function rO(e,t){e.prepare("DELETE FROM kv WHERE k = ?").run(Fl+t)}async function sO(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 Q9(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 oO(e,t,n,r,s,o=Wm){let i=n.shiftStartedTs!==null,a=i?n.shiftStartedSha:await sO(r,o);Gm(e,t,{...n,turnsDispatched:n.turnsDispatched+1,shiftStartedTs:i?n.shiftStartedTs:s,shiftStartedSha:a})}async function iO(e,t,n=Date.now(),r=Wm){let s=[];for(let o of mw(e)){let i=Yn(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 Q9(a,i.shiftStartedSha,r):null,u=i.turnsDispatched<=jl&&i.turnsDispatched>i.lastReviewedTurn,d=c*60*6e4>=i.hoursThresholdMs,f=l!==null&&l>=i.commitThreshold;(u||d||f)&&s.push({team:o,companionTeam:i.companionTeam,workerAlias:i.workerAlias,commitCount:l,hoursElapsed:c,shiftStartedTs:i.shiftStartedTs,shiftStartedSha:i.shiftStartedSha,isRampUp:u,turnNumber:i.turnsDispatched})}return s}async function aO(e,t,n,r,s=Wm){let o=Yn(e,t);if(o===null)return;let i=await sO(n,s);Gm(e,t,{...o,shiftStartedTs:r,shiftStartedSha:i,lastReviewedTurn:o.turnsDispatched})}async function cO(e,t,n=Wm){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?`
2055
2055
 
2056
2056
  Commits this shift:
2057
2057
  ${o}`:"";return e.isRampUp?`[auto-nudge-redirect] RAMP-UP turn ${e.turnNumber}/${jl} 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 n7}from"node:child_process";import{existsSync as r7,readdirSync as fO,readFileSync as mO,statSync as s7}from"node:fs";import{hostname as o7}from"node:os";import{promisify as i7}from"node:util";import{existsSync as Z9,statSync as e7}from"node:fs";var B0e=15*6e4;function t7(e,t,n={}){let r=n.existsSyncImpl??Z9,s=n.statSyncImpl??e7,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 pw(e,t,n){if(e===null)return!1;let r=Date.parse(e);return Number.isNaN(r)?!1:n-r<=t}function lO(e,t){if(e===null)return null;let n=Date.parse(e);return Number.isNaN(n)?null:t-n}function $a(e,t,n,r,s={}){if(e!==void 0&&t7(e,t,s))return!0;if(r===void 0)return!1;let o=s.nowMs??Date.now();return pw(n,r,o)}var a7=i7(n7),c7=45*6e4,pO=100,uO=pO,l7=3;async function u7(e,t=3e4){try{let{stdout:n}=await a7("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 Xm(e,t){try{let n=mO(`${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 hO(e,t="/proc"){let n=Xm(e,t);return n===null?null:n.utime+n.stime}function dO(e,t){try{let n=mO(`${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 hw(e,t="/proc"){let n=Xm(e,t);if(n===null)return null;let r;try{r=fO(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 u=Number(l);if(u===e)continue;let d=Xm(u,t);if(d===null)continue;o.set(u,d);let f=s.get(d.ppid);f?f.push(u):s.set(d.ppid,[u])}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 _O(e,t="/proc"){let n=dO(e,t);if(n===null)return null;let r;try{r=fO(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 u=Xm(l,t);if(u===null)continue;let d=s.get(u.ppid);d?d.push(l):s.set(u.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=dO(c,t);l!==null&&(o+=l),i.push(...s.get(c)??[])}return o}function d7(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 f7(e,t,n,r){let s=r.fetchHealthImpl??u7,o=r.readProcStatImpl??hw,i=r.hostnameImpl??o7,a=r.wallClockThresholdMs??c7,c=r.requiredLowCpuStreak??l7,l=await s(n);if(l===null)return;let u=l.members.find(v=>v.alias===t.leadAlias);if(u===void 0)return;let d=d7(u.liveness,i());if(d===null){let v=me(e,t.name);(v?.holder_watch_pid!==null&&v?.holder_watch_pid!==void 0||v?.hung_holder_flagged_ts!==null&&v?.hung_holder_flagged_ts!==void 0)&&Gh(e,t.name);return}let f=new Date().toISOString(),m=o(d.pid);if(m===null){Wh(e,t.name,`${t.leadAlias}'s servicing lock has outlived its holder -- pid ${d.pid} (started ${d.startedAt}) is NOT RUNNING. Lock is leaked, not hung; nothing to kill, only the lock needs releasing.`,f);return}let p=me(e,t.name);if(!(p?.holder_watch_pid===d.pid&&p?.holder_watch_started_at===d.startedAt)){Bh(e,t.name,d.pid,d.startedAt,m,f,0);return}let _=Date.now()-Date.parse(d.startedAt),g=p.holder_watch_cpu_ticks!==null?m-p.holder_watch_cpu_ticks:null,w=g!==null&&g<uO,E=p.holder_watch_low_cpu_streak??0,y=w?E+1:0;if(Bh(e,t.name,d.pid,d.startedAt,m,f,y),_<a||y<c)return;let T=Math.round(_/6e4);Wh(e,t.name,`${t.leadAlias} has held its servicing lock for ~${T}m with under ${uO/pO}s of CPU time across ${y} consecutive checks -- possibly hung, not just slow.`,f)}async function gO(e,t,n={}){let r=n.existsSyncImpl??r7,s=n.statSyncImpl??s7,o=n.nowMs??Date.now();for(let i of t){if(!Q(i))continue;if(n.sessionAliveExemptTeamName!==void 0&&i.name===n.sessionAliveExemptTeamName&&$a(n.sessionAliveExemptPath,n.sessionAliveFreshnessMs,n.activityFreshnessMs!==void 0?me(e,i.name)?.last_cli_activity_ts??null:null,n.activityFreshnessMs,{existsSyncImpl:r,statSyncImpl:s,nowMs:o})){Gh(e,i.name);continue}let a;try{a=se(i)}catch{continue}try{await f7(e,i,a,n)}catch{continue}}}var Hl="provider_disabled:";function EO(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 Vm(e,t){let n=e.prepare("SELECT v FROM kv WHERE k = ?").get(Hl+t);return n===void 0?null:EO(t,n.v)}function Jm(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(Hl+t,JSON.stringify(r))}function yO(e,t){e.prepare("DELETE FROM kv WHERE k = ?").run(Hl+t)}function ql(e){let t=e.prepare("SELECT k, v FROM kv WHERE k LIKE ?").all(`${Hl}%`),n=[];for(let r of t){let s=r.k.slice(Hl.length),o=EO(s,r.v);o!==null&&n.push(o)}return n}function tn(e,t,n=Date.now()){let r;try{r=Vm(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 m7,readFileSync as p7,readdirSync as h7,statSync as wO}from"node:fs";import{basename as Ym}from"node:path";var gw="orphan_would_reap",_7=5e3,g7=6e4,E7=100,y7=3,w7=45*6e4;function TO(e,t){try{let r=p7(`${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 vO(e,t){try{return wO(`${e}/${t}`).mtime.getTime()}catch{return null}}function Ew(e){let t;try{t=h7(e)}catch{return[]}let n=[];for(let r of t){if(!/^\d+$/.test(r))continue;let s=Number(r),o=TO(e,s);if(o===null)continue;let i=vO(e,s);i!==null&&n.push({pid:s,target:o,startedAtMs:i})}return n.sort((r,s)=>r.pid-s.pid),n}function _w(e){let t=e.lastIndexOf(":");return t===-1?null:{teamfilePath:e.slice(0,t),alias:e.slice(t+1)}}function T7(e,t){if(t===null)return!1;let n=_w(e),r=_w(t);return n===null||r===null?!1:n.alias===r.alias&&Ym(n.teamfilePath)===Ym(r.teamfilePath)}function v7(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"&&T7(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 S7(e,t,n,r,s,o,i,a){let c=o(t.pid,a);if(c===null)return!1;let l=ib(e,t.target,t.startedAtMs,t.pid);if(l===null||l.cpu_ticks===null)return Xh(e,t.target,t.startedAtMs,t.pid,c,i,0),!1;let f=c-l.cpu_ticks<E7?l.low_cpu_streak+1:0;return Xh(e,t.target,t.startedAtMs,t.pid,c,i,f),s-t.startedAtMs<r?!1:f>=n}function b7(e,t){let n=e.find(r=>r.name===t);if(n===void 0||!Q(n))return null;try{return se(n)}catch{return null}}function A7(e,t){let n=_w(t);if(n===null)return t;for(let r of e)if(Q(r))try{let s=se(r);if(Ym(s)===Ym(n.teamfilePath))return r.name}catch{continue}return t}async function I7(e,t,n,r,s){if(TO(e,t.pid)!==t.target||vO(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 SO(e,t,n,r={}){let s=r.procPath??"/proc",o=r.safetyMarginMs??g7,i=r.sigkillGraceMs??_7,a=r.requiredLowCpuStreak??y7,c=r.minCorroborationWallClockMs??w7,l=r.existsSyncImpl??m7,u=r.statSyncImpl??wO,d=r.killImpl??process.kill.bind(process),f=r.sleepImpl??(v=>new Promise(A=>setTimeout(A,v))),m=r.readProcCpuTicksImpl??hO,p=r.insertEventImpl??Wt,h=r.dryRun??!1,_=r.nowMs??Date.now(),g=new Date(_).toISOString(),w=r.sessionAliveExemptTeamName!==void 0&&$a(r.sessionAliveExemptPath,r.sessionAliveFreshnessMs,r.activityFreshnessMs!==void 0?me(e,r.sessionAliveExemptTeamName)?.last_cli_activity_ts??null:null,r.activityFreshnessMs,{existsSyncImpl:l,statSyncImpl:u,nowMs:_}),E=w?b7(t,r.sessionAliveExemptTeamName):null;w&&E===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
@@ -2176,23 +2176,23 @@ ${a}
2176
2176
  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),jw(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){go(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>_ee){go(e,"UPDATE cron_jobs SET last_checked_ts = ?, last_fire_status = ?, updated_at = ?",[s,"skipped_stale",s],t);return}let g=t.timezone!==null?tD(h,t.timezone):h,w=t.timezone!==null?tD(_,t.timezone):_;if(!PO(m,g,w)){go(e,"UPDATE cron_jobs SET last_checked_ts = ?, updated_at = ?",[s,s],t);return}let y=ap(e,t.id);if(!(y===null||y.enabled===0||y.revision!==t.revision)){if(pee(t.action_kind)){Tee(e,t,s,l,u,d);return}if(t.action_kind==="enqueue")try{let T=JSON.parse(t.action_payload),v={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,v),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{u?.(t.id,T)}catch{}try{go(e,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",Fn(T),s],t)}catch{}}else{let T=s,v=`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 = ?
2177
2177
  WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?) AND (running_since_ts IS ?)`).run(s,s,"ok",s,v,s,t.id,t.revision,t.last_checked_ts,t.running_since_ts).changes===0)return;let I=lD(e,t,t.action_kind,v,a),N={logDir:c,systemdUnitName:v,onExit:(x,R,k,O)=>{let D=x===0?"ok":"error",S=D==="ok"?null:R?Fn(R):`Command exited with code ${x} -- see ${c??ep()}/${t.id}/ for output`;if(R)try{u?.(t.id,R)}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(D,S,new Date().toISOString(),t.id,T)}catch{}uD(e,I,x,R,k,O,v)}};try{i({id:t.id,action_payload:t.action_payload},N),l.push(t.title)}catch(x){try{u?.(t.id,x)}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",Fn(x),s,t.id,T)}catch{}dD(e,I,x)}}}}async function nD(e,t){for(;!e();)await new Promise(n=>setTimeout(n,t))}async function su(e,t,n,r={}){let s=r.enqueueImpl??De,o=r.spawnCommandImpl??Xl,i=r.isUnitStillRunningImpl??aD,a=r.executeRunImpl??Fw,c=r.logDir,l=r.pollMs??250,u=it(e,t);if(Pa(e,t)&&r.onDemand===void 0)return{kind:"skipped_overlap",job:u};if(u.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 d=ve();if(u.action_kind==="command"){if(u.running_since_ts!==null)return u.running_systemd_unit!==null&&i(u.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 = ?
2178
2178
  WHERE id = ? AND revision = ? AND running_since_ts = ? AND running_systemd_unit = ?`).run("reconciled",d,u.id,u.revision,u.running_since_ts,u.running_systemd_unit),jw(e,u.id,"reconciled: command execution confirmed gone by systemd probe; no exit callback survived the restart"),await su(e,t,n,r)):{kind:"skipped_overlap",job:u};let p=d,h=`lmcron-job-${u.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 = ?
2179
- WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts IS ?`).run(d,"ok",p,h,d,u.id,u.revision,u.running_since_ts).changes===0)return{kind:"skipped_overlap",job:it(e,t)};let g=lD(e,u,`${u.action_kind}:manual`,h,i),w={logDir:c,systemdUnitName:h,onExit:(E,y,T,v)=>{let A=E===0?"ok":"error",I=A==="ok"?null:y?Fn(y):`Command exited with code ${E} -- see ${c??ep()}/${u.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(),u.id,p)}catch{}uD(e,g,E,y,T,v,h)}};try{o({id:u.id,action_payload:u.action_payload},w)}catch(E){dD(e,g,E);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",Fn(E),d,u.id,p)}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to spawn: ${Fn(E)}`,1)}return await nD(()=>it(e,t).running_since_ts!==p,l),{kind:"fired",job:it(e,t)}}if(u.action_kind==="enqueue"){let p=JSON.parse(u.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(d,"ok",d,u.id),{kind:"fired",job:it(e,t)}}let f=JSON.stringify({kind:u.action_kind,payload:u.action_payload,provider:u.provider,model:u.model,workingDirectory:u.working_directory,escalationOwner:u.escalation_owner}),m=e.transaction(()=>{let p=e.prepare("SELECT enabled, revision FROM cron_jobs WHERE id = ?").get(u.id);if(p===void 0||p.enabled===0||p.revision!==u.revision)return null;let h=zl(e,u.id,`${u.action_kind}:manual`,f);if(h.kind==="claimed"){r.onDemand!==void 0&&xO(e,u.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(d,"ok",d,u.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:it(e,t)};if(m.kind==="overlap")return{kind:"skipped_overlap",job:it(e,t)};try{a({db:e,job:u,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{Ql(e,m.run.id,`worker dispatch threw: ${Fn(p)}`),kw(e,m.run.id,{ok:!1,summary:`worker dispatch error: ${Fn(p)}`})}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to dispatch: ${Fn(p)}`,1)}if(r.waitForCompletion===!1){let p=u;try{p=it(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 nD(()=>{let p=xt(e,m.run.id);return p.status!=="pending"&&p.status!=="running"},l),{kind:"fired",job:it(e,t),runId:m.run.id}}function Tee(e,t,n,r,s,o){if(Pa(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=zl(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"){go(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["blocked_escalation",n],t);return}if(a.kind==="overlap"){go(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{Ql(e,a.run.id,`worker dispatch threw: ${Fn(c)}`),kw(e,a.run.id,{ok:!1,summary:`worker dispatch error: ${Fn(c)}`})}catch{}try{s?.(t.id,c)}catch{}}}}function go(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 fD(e,t){let n=e.transaction(()=>{it(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 ip(e,t),it(e,t)});return ws(n)}import{execFileSync as vee}from"node:child_process";import{existsSync as See,readFileSync as mD}from"node:fs";import{homedir as pD}from"node:os";import{join as hD}from"node:path";function Wa(){return process.env.LMBEE_HEAVY_STATUS??hD(pD(),".lmbee","heavy.status")}function Ga(){return process.env.LMBEE_HEAVY_LOCK??hD(pD(),".lmbee","heavy.lock")}var Ba=class extends Error{};function bee(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 Aee(e){let t;try{t=mD(e,"utf8")}catch{return null}try{let n=JSON.parse(t);return bee(n)?n:null}catch{return null}}function Iee(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 kee(e){try{let t=mD(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[0]==="Z"}catch{return!1}}function Ree(e){try{process.kill(e,0)}catch(t){return t.code==="EPERM"}return!kee(e)}function Nee(e,t=vee){if(!See(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 Ba(`heavy-lock probe failed (flock did not run or exited abnormally): ${s}`)}}function Hw(e=Wa(),t=Ga(),n=Aee,r=Nee,s=Ree){for(let o=0;o<3;o++){let i=n(e),a=r(t),c=n(e);if(i!==null&&Iee(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 vn(e=Wa(),t=Ga(),n=Hw,r){try{return n(e,t)}catch(s){if(!(s instanceof Ba))throw s;return r?.(s),{held:!0,holder:null}}}var dp={observedAt:null,report:null,lastErrorAt:null,lastError:null};function _D(e,t){dp={observedAt:t,report:e,lastErrorAt:null,lastError:null}}function gD(e,t){dp={...dp,lastErrorAt:t,lastError:e}}function ou(){return dp}import{execFile as xee}from"node:child_process";import{promisify as Lee}from"node:util";function Ae(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 Le(e,t=Date.now()){let n=Date.parse(e);if(Number.isNaN(n))return"?";let r=t-n;return r<6e4?"just now":`${Ae(r)} ago`}var Cee=Lee(xee);function Oee(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 Dee(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(Oee))throw new Error(`unexpected \`lmctl running --json\` shape: a malformed element (bad/missing target or from_identity) in \`${r}\``);return n}async function qe(e=3e4,t={}){let n=t.reconcile===!0?["running","--json-legacy","--reconcile"]:["running","--json-legacy"],{stdout:r}=await Cee("lmctl",n,{timeout:e});return Dee(r)}function qw(e,t=Date.now()){return{schema_version:e.schema_version,running:e.running.map(n=>({...n,running_for_human:Ae(n.running_for_ms),started_human:Le(n.started_at,t)})),dead:e.dead.map(n=>({...n,age_human:Ae(n.age_ms),started_human:Le(n.started_at,t)})),idle:e.idle.map(n=>({...n,ran_human:Ae(n.ran_ms)}))}}import{readFileSync as $ee}from"node:fs";import{randomUUID as Mee}from"node:crypto";var Bw={staleThresholdMs:2*60*6e4,escalationCooldownMs:60*6e4,digestTimeoutMs:9e4,leaseTimeoutMs:10*6e4,providerQuotaBackoffMs:24*60*6e4,operatorStaleThresholdMs:6e4,operatorEscalationCooldownMs:6e4};function Pee(e){return/usage limit/i.test(e)&&/quota/i.test(e)}function Uee(e){let t=[];for(let n of e)try{t.push({row:n,content:$ee(n.prompt_file,"utf8")})}catch{continue}return t}function Fee(e){let t=e.map(({row:n,content:r})=>`--- from "${n.from_id}", queued ${n.created_ts} ---
2179
+ WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts IS ?`).run(d,"ok",p,h,d,u.id,u.revision,u.running_since_ts).changes===0)return{kind:"skipped_overlap",job:it(e,t)};let g=lD(e,u,`${u.action_kind}:manual`,h,i),w={logDir:c,systemdUnitName:h,onExit:(E,y,T,v)=>{let A=E===0?"ok":"error",I=A==="ok"?null:y?Fn(y):`Command exited with code ${E} -- see ${c??ep()}/${u.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(),u.id,p)}catch{}uD(e,g,E,y,T,v,h)}};try{o({id:u.id,action_payload:u.action_payload},w)}catch(E){dD(e,g,E);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",Fn(E),d,u.id,p)}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to spawn: ${Fn(E)}`,1)}return await nD(()=>it(e,t).running_since_ts!==p,l),{kind:"fired",job:it(e,t)}}if(u.action_kind==="enqueue"){let p=JSON.parse(u.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(d,"ok",d,u.id),{kind:"fired",job:it(e,t)}}let f=JSON.stringify({kind:u.action_kind,payload:u.action_payload,provider:u.provider,model:u.model,workingDirectory:u.working_directory,escalationOwner:u.escalation_owner}),m=e.transaction(()=>{let p=e.prepare("SELECT enabled, revision FROM cron_jobs WHERE id = ?").get(u.id);if(p===void 0||p.enabled===0||p.revision!==u.revision)return null;let h=zl(e,u.id,`${u.action_kind}:manual`,f);if(h.kind==="claimed"){r.onDemand!==void 0&&xO(e,u.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(d,"ok",d,u.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:it(e,t)};if(m.kind==="overlap")return{kind:"skipped_overlap",job:it(e,t)};try{a({db:e,job:u,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{Ql(e,m.run.id,`worker dispatch threw: ${Fn(p)}`),kw(e,m.run.id,{ok:!1,summary:`worker dispatch error: ${Fn(p)}`})}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to dispatch: ${Fn(p)}`,1)}if(r.waitForCompletion===!1){let p=u;try{p=it(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 nD(()=>{let p=xt(e,m.run.id);return p.status!=="pending"&&p.status!=="running"},l),{kind:"fired",job:it(e,t),runId:m.run.id}}function Tee(e,t,n,r,s,o){if(Pa(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=zl(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"){go(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["blocked_escalation",n],t);return}if(a.kind==="overlap"){go(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{Ql(e,a.run.id,`worker dispatch threw: ${Fn(c)}`),kw(e,a.run.id,{ok:!1,summary:`worker dispatch error: ${Fn(c)}`})}catch{}try{s?.(t.id,c)}catch{}}}}function go(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 fD(e,t){let n=e.transaction(()=>{it(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 ip(e,t),it(e,t)});return ws(n)}import{execFileSync as vee}from"node:child_process";import{existsSync as See,readFileSync as mD}from"node:fs";import{homedir as pD}from"node:os";import{join as hD}from"node:path";function Wa(){return process.env.LMBEE_HEAVY_STATUS??hD(pD(),".lmbee","heavy.status")}function Ga(){return process.env.LMBEE_HEAVY_LOCK??hD(pD(),".lmbee","heavy.lock")}var Ba=class extends Error{};function bee(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 Aee(e){let t;try{t=mD(e,"utf8")}catch{return null}try{let n=JSON.parse(t);return bee(n)?n:null}catch{return null}}function Iee(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 kee(e){try{let t=mD(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[0]==="Z"}catch{return!1}}function Ree(e){try{process.kill(e,0)}catch(t){return t.code==="EPERM"}return!kee(e)}function Nee(e,t=vee){if(!See(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 Ba(`heavy-lock probe failed (flock did not run or exited abnormally): ${s}`)}}function Hw(e=Wa(),t=Ga(),n=Aee,r=Nee,s=Ree){for(let o=0;o<3;o++){let i=n(e),a=r(t),c=n(e);if(i!==null&&Iee(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 vn(e=Wa(),t=Ga(),n=Hw,r){try{return n(e,t)}catch(s){if(!(s instanceof Ba))throw s;return r?.(s),{held:!0,holder:null}}}var dp={observedAt:null,report:null,lastErrorAt:null,lastError:null};function _D(e,t){dp={observedAt:t,report:e,lastErrorAt:null,lastError:null}}function gD(e,t){dp={...dp,lastErrorAt:t,lastError:e}}function ou(){return dp}import{execFile as xee}from"node:child_process";import{promisify as Lee}from"node:util";function Ae(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 Le(e,t=Date.now()){let n=Date.parse(e);if(Number.isNaN(n))return"?";let r=t-n;return r<6e4?"just now":`${Ae(r)} ago`}var Cee=Lee(xee);function Oee(e){let t=JSON.parse(e),n=typeof t=="object"&&t!==null?t.sessions:void 0;if(typeof t!="object"||t===null||typeof t.generated_at!="string"||!Array.isArray(n))throw new Error("unexpected `lmctl running --json` shape: missing generated_at or sessions array");let r=Date.parse(t.generated_at),s=[],o=[],i=[];for(let a of n){if(typeof a!="object"||a===null||Array.isArray(a))throw new Error("unexpected `lmctl running --json` shape: malformed sessions element");let c=a;if(typeof c.team_path!="string"||typeof c.member!="string"||typeof c.sender_identity!="string"||typeof c.started_at!="string"&&c.started_at!==null||typeof c.last_activity_at!="string"&&c.last_activity_at!==null||!["chat","exec"].includes(String(c.kind))||!["running","done","error"].includes(String(c.state)))throw new Error("unexpected `lmctl running --json` shape: malformed session identity or state fields");let l=`${c.team_path}:${c.member}`,u=c.completed_run&&typeof c.completed_run=="object"?c.completed_run:null,d=c.started_at??c.last_activity_at??t.generated_at,f=c.sender_identity;c.state==="running"&&c.liveness!=="dead"?s.push({kind:c.kind,origin:"unknown",from_identity:f,target:l,started_at:d,running_for_ms:Math.max(0,r-Date.parse(d)),holder_liveness:c.liveness==="live"?"live":"unknown"}):c.liveness==="dead"?o.push({kind:c.kind,origin:"unknown",from_identity:f,target:l,started_at:d,age_ms:Math.max(0,r-Date.parse(d))}):u&&typeof u.ended_at=="string"&&typeof u.elapsed_ms=="number"&&i.push({kind:c.kind,origin:"unknown",from_identity:f,target:l,status:c.state==="done"?"done":"error",started_at:d,ended_at:u.ended_at,idle_ms:Math.max(0,r-Date.parse(u.ended_at)),ran_ms:u.elapsed_ms,error:typeof u.error=="string"?u.error:null,parent_invocation_id:null})}return{schema_version:3,running:s,dead:o,idle:i}}async function qe(e=3e4,t={}){let n=t.reconcile===!0?["running","--json","--reconcile"]:["running","--json"],{stdout:r}=await Cee("lmctl",n,{timeout:e});return Oee(r)}function qw(e,t=Date.now()){return{schema_version:e.schema_version,running:e.running.map(n=>({...n,running_for_human:Ae(n.running_for_ms),started_human:Le(n.started_at,t)})),dead:e.dead.map(n=>({...n,age_human:Ae(n.age_ms),started_human:Le(n.started_at,t)})),idle:e.idle.map(n=>({...n,ran_human:Ae(n.ran_ms)}))}}import{readFileSync as Dee}from"node:fs";import{randomUUID as $ee}from"node:crypto";var Bw={staleThresholdMs:2*60*6e4,escalationCooldownMs:60*6e4,digestTimeoutMs:9e4,leaseTimeoutMs:10*6e4,providerQuotaBackoffMs:24*60*6e4,operatorStaleThresholdMs:6e4,operatorEscalationCooldownMs:6e4};function Mee(e){return/usage limit/i.test(e)&&/quota/i.test(e)}function Pee(e){let t=[];for(let n of e)try{t.push({row:n,content:Dee(n.prompt_file,"utf8")})}catch{continue}return t}function Uee(e){let t=e.map(({row:n,content:r})=>`--- from "${n.from_id}", queued ${n.created_ts} ---
2180
2180
  ${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:
2181
2181
 
2182
2182
  ${t.join(`
2183
2183
 
2184
- `)}`}function jee(e,t,n){let r=new Date(n-t).toISOString();e.prepare(`UPDATE queue SET status = 'pending', escalation_claimed_ts = NULL, escalation_claim_token = NULL
2185
- WHERE status = 'escalating' AND (escalation_claimed_ts IS NULL OR escalation_claimed_ts < ?)`).run(r)}function Hee(e,t){let n=new Set,r=new Date().toISOString(),s=Mee();return e.transaction(()=>{for(let i of t)e.prepare("UPDATE queue SET status = 'escalating', escalation_claimed_ts = ?, escalation_claim_token = ? WHERE id = ? AND status = 'pending'").run(r,s,i).changes>0&&n.add(i)}).immediate(),{claimed:n,token:s}}function fp(e,t,n,r,s){let o=new Date().toISOString(),i=!1;e.transaction(()=>{for(let c of t)(r?e.prepare(`UPDATE queue SET status = 'sent', sent_ts = ?, delivered_via_escalation = 1, escalation_claimed_ts = NULL, escalation_claim_token = NULL
2184
+ `)}`}function Fee(e,t,n){let r=new Date(n-t).toISOString();e.prepare(`UPDATE queue SET status = 'pending', escalation_claimed_ts = NULL, escalation_claim_token = NULL
2185
+ WHERE status = 'escalating' AND (escalation_claimed_ts IS NULL OR escalation_claimed_ts < ?)`).run(r)}function jee(e,t){let n=new Set,r=new Date().toISOString(),s=$ee();return e.transaction(()=>{for(let i of t)e.prepare("UPDATE queue SET status = 'escalating', escalation_claimed_ts = ?, escalation_claim_token = ? WHERE id = ? AND status = 'pending'").run(r,s,i).changes>0&&n.add(i)}).immediate(),{claimed:n,token:s}}function fp(e,t,n,r,s){let o=new Date().toISOString(),i=!1;e.transaction(()=>{for(let c of t)(r?e.prepare(`UPDATE queue SET status = 'sent', sent_ts = ?, delivered_via_escalation = 1, escalation_claimed_ts = NULL, escalation_claim_token = NULL
2186
2186
  WHERE id = ? AND status = 'escalating' AND escalation_claim_token = ?`).run(o,c,n):e.prepare(`UPDATE queue SET status = 'pending', escalation_claimed_ts = NULL, escalation_claim_token = NULL
2187
- WHERE id = ? AND status = 'escalating' AND escalation_claim_token = ?`).run(c,n)).changes>0&&(i=!0);i&&s?.()}).immediate()}async function ED(e,t,n=Bw,r=Date.now(),s={}){let o=s.sendAwaited??br,i=[];jee(e,n.leaseTimeoutMs,r);let a=e.prepare("SELECT * FROM queue WHERE status = 'pending' ORDER BY to_id, id").all(),c=new Map;for(let u of a){let d=c.get(u.to_id);d?d.push(u):c.set(u.to_id,[u])}let l=[...c.entries()].sort(([,u],[,d])=>{let f=u.some(p=>p.operator_priority===1)?0:1,m=d.some(p=>p.operator_priority===1)?0:1;return f-m});for(let[u,d]of l){let f=t.find(R=>R.name===u);if(f===void 0)continue;let m=d.some(R=>R.operator_priority===1),p=m?n.operatorStaleThresholdMs:n.staleThresholdMs,h=m?n.operatorEscalationCooldownMs:n.escalationCooldownMs,_=d[0];if(r-Date.parse(_.created_ts)<p)continue;let w=me(e,u),E=w?.last_escalation_attempt_ts?Date.parse(w.last_escalation_attempt_ts):null;if(E!==null&&r-E<h)continue;let y=w?.quota_exhausted_last_seen_ts?Date.parse(w.quota_exhausted_last_seen_ts):null;if(y!==null){let R=E!==null?Math.max(y,E):y;if(r-R<n.providerQuotaBackoffMs)continue}if(cd(e,u,f.leadAlias,r))continue;let T;try{T=se(f)}catch{continue}let v=Uee(d);if(v.length===0)continue;let{claimed:A,token:I}=Hee(e,v.map(R=>R.row.id)),N=v.filter(R=>A.has(R.row.id));if(N.length===0)continue;let x=!1;try{let R=Fee(N);mb(e,u,new Date().toISOString());let k=await o({teamfilePath:T,alias:f.leadAlias},R,{timeoutMs:n.digestTimeoutMs});if(k.kind==="ok"||k.kind==="stalled")fp(e,A,I,!0,()=>fb(e,u)),x=!0,i.push(u);else if(k.kind==="error"&&Pee(k.message)){let O=new Date().toISOString();fp(e,A,I,!1,()=>db(e,u,O,k.message)),x=!0}else fp(e,A,I,!1),x=!0}catch{}finally{if(!x)try{fp(e,A,I,!1)}catch{}}}return i}var Ww={minStaleMs:12e5,maxTotalAgeMs:144e5};function yD(e,t,n=Ww,r=Date.now()){return[]}var Gw={staleMs:72e5,maxAgeMs:864e5,cooldownMs:36e5};function wD(e,t,n,r=Gw,s=Date.now()){return[]}import{execFile as Xee}from"node:child_process";import{promisify as Vee}from"node:util";var qee=["ok","provider_unavailable","auth_expired","not_applicable","reader_throttled"];function Bee(e){return typeof e=="string"&&qee.includes(e)}function Xw(e){return typeof e=="object"&&e!==null}function Wee(e){if(!Xw(e))return null;let t=e.bucket_id,n=e.used_fraction;if(typeof t!="string"||t.length===0||typeof n!="number"||!Number.isFinite(n))return null;let r={bucket_id:t,used_fraction:n};return typeof e.window_type=="string"&&(r.window_type=e.window_type),typeof e.group_name=="string"&&(r.group_name=e.group_name),typeof e.resets_at=="number"&&Number.isFinite(e.resets_at)&&(r.resets_at=e.resets_at),typeof e.resets_at_iso=="string"&&(r.resets_at_iso=e.resets_at_iso),typeof e.is_exhausted=="boolean"&&(r.is_exhausted=e.is_exhausted),"raw_value"in e&&(r.raw_value=e.raw_value),typeof e.raw_scale=="string"&&(r.raw_scale=e.raw_scale),r}function Gee(e){if(!Xw(e))return null;let t=e.provider,n=e.status,r=e.read_at;if(typeof t!="string"||t.length===0||!Bee(n)||typeof r!="number"||!Number.isFinite(r))return null;let s={provider:t,status:n,read_at:r};return typeof e.source=="string"&&(s.source=e.source),Array.isArray(e.buckets)&&(s.buckets=e.buckets.map(Wee).filter(o=>o!==null)),typeof e.reason=="string"&&(s.reason=e.reason),typeof e.detail=="string"&&(s.detail=e.detail),typeof e.retry_after_seconds=="number"&&(s.retry_after_seconds=e.retry_after_seconds),s}function TD(e){let t;try{t=JSON.parse(e)}catch{return null}return!Xw(t)||!Array.isArray(t.readings)?null:t.readings.map(Gee).filter(n=>n!==null)}var Jee=Vee(Xee);function vD(){return process.env.LMBEE_RATE_LIMIT_BIN??"lmctl"}async function Yee(e=vD(),t=Jee){try{let{stdout:n}=await t(e,["ratelimit","--json"]);return TD(n)}catch{return null}}function Kee(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function zee(e,t,n){let r=e.prepare(`INSERT INTO rate_limit_readings (provider, status, source, read_at, reason, detail, retry_after_seconds, inserted_at)
2187
+ WHERE id = ? AND status = 'escalating' AND escalation_claim_token = ?`).run(c,n)).changes>0&&(i=!0);i&&s?.()}).immediate()}async function ED(e,t,n=Bw,r=Date.now(),s={}){let o=s.sendAwaited??br,i=[];Fee(e,n.leaseTimeoutMs,r);let a=e.prepare("SELECT * FROM queue WHERE status = 'pending' ORDER BY to_id, id").all(),c=new Map;for(let u of a){let d=c.get(u.to_id);d?d.push(u):c.set(u.to_id,[u])}let l=[...c.entries()].sort(([,u],[,d])=>{let f=u.some(p=>p.operator_priority===1)?0:1,m=d.some(p=>p.operator_priority===1)?0:1;return f-m});for(let[u,d]of l){let f=t.find(R=>R.name===u);if(f===void 0)continue;let m=d.some(R=>R.operator_priority===1),p=m?n.operatorStaleThresholdMs:n.staleThresholdMs,h=m?n.operatorEscalationCooldownMs:n.escalationCooldownMs,_=d[0];if(r-Date.parse(_.created_ts)<p)continue;let w=me(e,u),E=w?.last_escalation_attempt_ts?Date.parse(w.last_escalation_attempt_ts):null;if(E!==null&&r-E<h)continue;let y=w?.quota_exhausted_last_seen_ts?Date.parse(w.quota_exhausted_last_seen_ts):null;if(y!==null){let R=E!==null?Math.max(y,E):y;if(r-R<n.providerQuotaBackoffMs)continue}if(cd(e,u,f.leadAlias,r))continue;let T;try{T=se(f)}catch{continue}let v=Pee(d);if(v.length===0)continue;let{claimed:A,token:I}=jee(e,v.map(R=>R.row.id)),N=v.filter(R=>A.has(R.row.id));if(N.length===0)continue;let x=!1;try{let R=Uee(N);mb(e,u,new Date().toISOString());let k=await o({teamfilePath:T,alias:f.leadAlias},R,{timeoutMs:n.digestTimeoutMs});if(k.kind==="ok"||k.kind==="stalled")fp(e,A,I,!0,()=>fb(e,u)),x=!0,i.push(u);else if(k.kind==="error"&&Mee(k.message)){let O=new Date().toISOString();fp(e,A,I,!1,()=>db(e,u,O,k.message)),x=!0}else fp(e,A,I,!1),x=!0}catch{}finally{if(!x)try{fp(e,A,I,!1)}catch{}}}return i}var Ww={minStaleMs:12e5,maxTotalAgeMs:144e5};function yD(e,t,n=Ww,r=Date.now()){return[]}var Gw={staleMs:72e5,maxAgeMs:864e5,cooldownMs:36e5};function wD(e,t,n,r=Gw,s=Date.now()){return[]}import{execFile as Gee}from"node:child_process";import{promisify as Xee}from"node:util";var Hee=["ok","provider_unavailable","auth_expired","not_applicable","reader_throttled"];function qee(e){return typeof e=="string"&&Hee.includes(e)}function Xw(e){return typeof e=="object"&&e!==null}function Bee(e){if(!Xw(e))return null;let t=e.bucket_id,n=e.used_fraction;if(typeof t!="string"||t.length===0||typeof n!="number"||!Number.isFinite(n))return null;let r={bucket_id:t,used_fraction:n};return typeof e.window_type=="string"&&(r.window_type=e.window_type),typeof e.group_name=="string"&&(r.group_name=e.group_name),typeof e.resets_at=="number"&&Number.isFinite(e.resets_at)&&(r.resets_at=e.resets_at),typeof e.resets_at_iso=="string"&&(r.resets_at_iso=e.resets_at_iso),typeof e.is_exhausted=="boolean"&&(r.is_exhausted=e.is_exhausted),"raw_value"in e&&(r.raw_value=e.raw_value),typeof e.raw_scale=="string"&&(r.raw_scale=e.raw_scale),r}function Wee(e){if(!Xw(e))return null;let t=e.provider,n=e.status,r=e.read_at;if(typeof t!="string"||t.length===0||!qee(n)||typeof r!="number"||!Number.isFinite(r))return null;let s={provider:t,status:n,read_at:r};return typeof e.source=="string"&&(s.source=e.source),Array.isArray(e.buckets)&&(s.buckets=e.buckets.map(Bee).filter(o=>o!==null)),typeof e.reason=="string"&&(s.reason=e.reason),typeof e.detail=="string"&&(s.detail=e.detail),typeof e.retry_after_seconds=="number"&&(s.retry_after_seconds=e.retry_after_seconds),s}function TD(e){let t;try{t=JSON.parse(e)}catch{return null}return!Xw(t)||!Array.isArray(t.readings)?null:t.readings.map(Wee).filter(n=>n!==null)}var Vee=Xee(Gee);function vD(){return process.env.LMBEE_RATE_LIMIT_BIN??"lmctl"}async function Jee(e=vD(),t=Vee){try{let{stdout:n}=await t(e,["ratelimit","--json"]);return TD(n)}catch{return null}}function Yee(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function Kee(e,t,n){let r=e.prepare(`INSERT INTO rate_limit_readings (provider, status, source, read_at, reason, detail, retry_after_seconds, inserted_at)
2188
2188
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(t.provider,t.status,t.source??null,t.read_at,t.reason??null,t.detail??null,t.retry_after_seconds??null,n);if(t.status!=="ok")return;let s=r.lastInsertRowid,o=e.prepare(`INSERT INTO rate_limit_bucket_samples
2189
2189
  (reading_id, provider, bucket_id, window_type, group_name, used_fraction, resets_at, resets_at_iso, raw_value, raw_scale, is_exhausted, read_at)
2190
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);for(let i of t.buckets??[]){if(typeof i.resets_at!="number")continue;let a=i.window_type==="five_hour"||i.window_type==="weekly"?i.window_type:"unknown";o.run(s,t.provider,i.bucket_id,a,i.group_name??null,i.used_fraction??0,i.resets_at,i.resets_at_iso??null,Kee(i.raw_value),i.raw_scale??null,i.is_exhausted===!0?1:i.is_exhausted===!1?0:null,t.read_at)}}var SD="rate_limit_collect:last_run_ms",Qee=5*6e4;function Zee(e,t,n){let r=e.prepare("SELECT v FROM kv WHERE k = ?").get(SD);if(r===void 0)return!0;let s=Number(r.v);return Number.isFinite(s)?t-s>=n:!0}function ete(e,t){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(SD,String(t))}async function bD(e,t={}){let n=t.nowMs??Date.now(),r=t.cooldownMs??Qee;if(!Zee(e,n,r))return{outcome:"skipped-cooldown"};let o=await(t.fetchImpl??Yee)(t.binPath??vD());if(o===null)return{outcome:"fetch-failed"};let i=Math.floor(n/1e3);return e.transaction(c=>{for(let l of c)zee(e,l,i)})(o),ete(e,n),{outcome:"collected",readingsStored:o.length}}var Vw={five_hour:9e5,weekly:36e5},mp={five_hour:"five_hour_15m",weekly:"weekly_1h"};function pp(e,t){if(e.length<3)return{kind:"insufficient_data",reason:`only ${e.length} sample(s), need >= 3`};let n=[...e].sort((g,w)=>g.readAt-w.readAt),r=n[0],s=n[n.length-1],o=(s.readAt-r.readAt)*1e3;if(o<6e5)return{kind:"insufficient_data",reason:`samples span only ${Math.round(o/1e3)}s, need >= ${6e5/1e3}s`};let i=t-s.readAt*1e3;if(i>9e5)return{kind:"insufficient_data",reason:`freshest sample is ${Math.round(i/1e3)}s old, exceeds ${9e5/1e3}s staleness limit`};let a=n.length,c=n.reduce((g,w)=>g+w.readAt,0)/a,l=n.reduce((g,w)=>g+w.usedFraction,0)/a,u=0,d=0;for(let g of n){let w=g.readAt-c;u+=w*(g.usedFraction-l),d+=w*w}if(d===0)return{kind:"insufficient_data",reason:"samples have no time spread"};let f=u/d;if(f<=0)return{kind:"no_forecast"};let h=(1-(l-f*c+f*s.readAt))/f;return{kind:"forecast",forecastAtMs:s.readAt*1e3+h*1e3,burnFractionPerMin:f*60,latestReadAtMs:s.readAt*1e3}}function AD(e,t,n){return e.kind!=="forecast"?!1:e.forecastAtMs-n<=Vw[t]}var tte=new Set(["claude:week-scoped-Fable","codex:codex_bengalfox-5h","codex:codex_bengalfox-weekly"]);function ID(e,t){return tte.has(`${e}:${t}`)}var nte=Vw.weekly;function rte(e){let t=[...e].sort((s,o)=>s.readAt-o.readAt),n=t[0],r=t[t.length-1];return{count:t.length,spanMinutes:Math.round((r.readAt-n.readAt)/60*10)/10,latestUsedFraction:r.usedFraction}}function ste(e){return new Date(e*1e3).toISOString()}function ote(e,t,n,r,s,o){let i=new Date(r.forecastAtMs).toISOString(),a=Math.round((r.forecastAtMs-o)/6e4),c=Math.round(r.burnFractionPerMin*100*100)/100;return`auto-disable: ${e} bucket=${t} (${n}) forecast reaches 100% at ${i} (~${a}m); burn rate ${c}%/min over ${s.count} samples spanning ${s.spanMinutes}m; current used_fraction=${s.latestUsedFraction}; rule=${mp[n]}`}function Xa(e,t,n,r,s,o,i){e.prepare("INSERT INTO rate_limit_policy_log (ts, provider, bucket_id, window_type, outcome, detail) VALUES (?, ?, ?, ?, ?, ?)").run(t,n,r,s,o,i)}function hp(e,t,n,r){e.prepare("DELETE FROM rate_limit_policy_arm WHERE provider = ? AND bucket_id = ? AND resets_at = ?").run(t,n,r)}function ite(e,t,n,r){return e.prepare("SELECT rule, armed_at, armed_latest_read_at, armed_used_fraction, forecast_at FROM rate_limit_policy_arm WHERE provider = ? AND bucket_id = ? AND resets_at = ?").get(t,n,r)??null}function ate(e,t,n,r,s,o,i,a,c){e.prepare(`INSERT INTO rate_limit_policy_arm (provider, bucket_id, resets_at, rule, armed_at, armed_latest_read_at, armed_used_fraction, forecast_at)
2190
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);for(let i of t.buckets??[]){if(typeof i.resets_at!="number")continue;let a=i.window_type==="five_hour"||i.window_type==="weekly"?i.window_type:"unknown";o.run(s,t.provider,i.bucket_id,a,i.group_name??null,i.used_fraction??0,i.resets_at,i.resets_at_iso??null,Yee(i.raw_value),i.raw_scale??null,i.is_exhausted===!0?1:i.is_exhausted===!1?0:null,t.read_at)}}var SD="rate_limit_collect:last_run_ms",zee=5*6e4;function Qee(e,t,n){let r=e.prepare("SELECT v FROM kv WHERE k = ?").get(SD);if(r===void 0)return!0;let s=Number(r.v);return Number.isFinite(s)?t-s>=n:!0}function Zee(e,t){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(SD,String(t))}async function bD(e,t={}){let n=t.nowMs??Date.now(),r=t.cooldownMs??zee;if(!Qee(e,n,r))return{outcome:"skipped-cooldown"};let o=await(t.fetchImpl??Jee)(t.binPath??vD());if(o===null)return{outcome:"fetch-failed"};let i=Math.floor(n/1e3);return e.transaction(c=>{for(let l of c)Kee(e,l,i)})(o),Zee(e,n),{outcome:"collected",readingsStored:o.length}}var Vw={five_hour:9e5,weekly:36e5},mp={five_hour:"five_hour_15m",weekly:"weekly_1h"};function pp(e,t){if(e.length<3)return{kind:"insufficient_data",reason:`only ${e.length} sample(s), need >= 3`};let n=[...e].sort((g,w)=>g.readAt-w.readAt),r=n[0],s=n[n.length-1],o=(s.readAt-r.readAt)*1e3;if(o<6e5)return{kind:"insufficient_data",reason:`samples span only ${Math.round(o/1e3)}s, need >= ${6e5/1e3}s`};let i=t-s.readAt*1e3;if(i>9e5)return{kind:"insufficient_data",reason:`freshest sample is ${Math.round(i/1e3)}s old, exceeds ${9e5/1e3}s staleness limit`};let a=n.length,c=n.reduce((g,w)=>g+w.readAt,0)/a,l=n.reduce((g,w)=>g+w.usedFraction,0)/a,u=0,d=0;for(let g of n){let w=g.readAt-c;u+=w*(g.usedFraction-l),d+=w*w}if(d===0)return{kind:"insufficient_data",reason:"samples have no time spread"};let f=u/d;if(f<=0)return{kind:"no_forecast"};let h=(1-(l-f*c+f*s.readAt))/f;return{kind:"forecast",forecastAtMs:s.readAt*1e3+h*1e3,burnFractionPerMin:f*60,latestReadAtMs:s.readAt*1e3}}function AD(e,t,n){return e.kind!=="forecast"?!1:e.forecastAtMs-n<=Vw[t]}var ete=new Set(["claude:week-scoped-Fable","codex:codex_bengalfox-5h","codex:codex_bengalfox-weekly"]);function ID(e,t){return ete.has(`${e}:${t}`)}var tte=Vw.weekly;function nte(e){let t=[...e].sort((s,o)=>s.readAt-o.readAt),n=t[0],r=t[t.length-1];return{count:t.length,spanMinutes:Math.round((r.readAt-n.readAt)/60*10)/10,latestUsedFraction:r.usedFraction}}function rte(e){return new Date(e*1e3).toISOString()}function ste(e,t,n,r,s,o){let i=new Date(r.forecastAtMs).toISOString(),a=Math.round((r.forecastAtMs-o)/6e4),c=Math.round(r.burnFractionPerMin*100*100)/100;return`auto-disable: ${e} bucket=${t} (${n}) forecast reaches 100% at ${i} (~${a}m); burn rate ${c}%/min over ${s.count} samples spanning ${s.spanMinutes}m; current used_fraction=${s.latestUsedFraction}; rule=${mp[n]}`}function Xa(e,t,n,r,s,o,i){e.prepare("INSERT INTO rate_limit_policy_log (ts, provider, bucket_id, window_type, outcome, detail) VALUES (?, ?, ?, ?, ?, ?)").run(t,n,r,s,o,i)}function hp(e,t,n,r){e.prepare("DELETE FROM rate_limit_policy_arm WHERE provider = ? AND bucket_id = ? AND resets_at = ?").run(t,n,r)}function ote(e,t,n,r){return e.prepare("SELECT rule, armed_at, armed_latest_read_at, armed_used_fraction, forecast_at FROM rate_limit_policy_arm WHERE provider = ? AND bucket_id = ? AND resets_at = ?").get(t,n,r)??null}function ite(e,t,n,r,s,o,i,a,c){e.prepare(`INSERT INTO rate_limit_policy_arm (provider, bucket_id, resets_at, rule, armed_at, armed_latest_read_at, armed_used_fraction, forecast_at)
2191
2191
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
2192
2192
  ON CONFLICT(provider, bucket_id, resets_at) DO UPDATE SET
2193
2193
  rule = excluded.rule, armed_at = excluded.armed_at, armed_latest_read_at = excluded.armed_latest_read_at,
2194
2194
  armed_used_fraction = excluded.armed_used_fraction, forecast_at = excluded.forecast_at`).run(t,n,r,s,o,i,a,c)}function kD(e,t={}){let n=t.nowMs??Date.now(),r=t.dryRun??!0,s=t.checkProviderDisabledImpl??tn,o=t.setProviderDisableImpl??Jm,i=e.prepare("SELECT DISTINCT provider, bucket_id AS bucketId, window_type AS windowType FROM rate_limit_bucket_samples WHERE window_type IN ('five_hour', 'weekly')").all(),a=[];for(let{provider:c,bucketId:l,windowType:u}of i){if(ID(c,l)){a.push({provider:c,bucketId:l,windowType:u,outcome:"excluded-non-representative",detail:"scoped sub-limit or retired bucket -- never independently disable-eligible"});continue}let f=e.prepare("SELECT MAX(resets_at) AS resetsAt FROM rate_limit_bucket_samples WHERE provider = ? AND bucket_id = ?").get(c,l).resetsAt;if(f===null)continue;let m=e.prepare("SELECT resets_at AS resetsAt, rule FROM rate_limit_policy_arm WHERE provider = ? AND bucket_id = ? AND resets_at != ?").all(c,l,f);for(let I of m)hp(e,c,l,I.resetsAt),Xa(e,n,c,l,u,"disarmed",`window rolled over (resets_at advanced from ${I.resetsAt} to ${f}) while armed under rule=${I.rule} -- orphaned arm swept, never confirmed`);let p=Math.floor((n-18e5)/1e3),h=e.prepare(`SELECT id AS readingId, used_fraction AS usedFraction, read_at AS readAt, resets_at_iso AS resetsAtIso
2195
- FROM rate_limit_bucket_samples WHERE provider = ? AND bucket_id = ? AND resets_at = ? AND read_at >= ? ORDER BY read_at ASC`).all(c,l,f,p),_=h.map(I=>({readAt:I.readAt,usedFraction:I.usedFraction})),g=pp(_,n);if(g.kind==="insufficient_data"){a.push({provider:c,bucketId:l,windowType:u,outcome:"insufficient-data",detail:g.reason});continue}let w=ite(e,c,l,f);if(g.kind==="no_forecast"||!AD(g,u,n)){w!==null&&(hp(e,c,l,f),Xa(e,n,c,l,u,"disarmed",`forecast no longer crosses the ${mp[u]} threshold`)),a.push({provider:c,bucketId:l,windowType:u,outcome:g.kind==="no_forecast"?"no-forecast":"below-threshold",detail:""});continue}let E=_[_.length-1].usedFraction;if(w===null){ate(e,c,l,f,mp[u],n,g.latestReadAtMs,E,g.forecastAtMs);let I=`armed on first crossing, forecast ${new Date(g.forecastAtMs).toISOString()}`;Xa(e,n,c,l,u,"armed",I),a.push({provider:c,bucketId:l,windowType:u,outcome:"armed",detail:I});continue}if(g.latestReadAtMs<=w.armed_latest_read_at){a.push({provider:c,bucketId:l,windowType:u,outcome:"still-armed",detail:"awaiting a newer sample to confirm"});continue}if(E<=w.armed_used_fraction){a.push({provider:c,bucketId:l,windowType:u,outcome:"still-armed",detail:`newer sample available (used_fraction=${E}) but no increase over the armed reference (${w.armed_used_fraction}) -- awaiting real movement to confirm`});continue}let y=s(e,c,n),T=rte(_),v=ote(c,l,u,g,T,n);if(y.disabled){let I=y.config?`reason=${JSON.stringify(y.config.reason)}, expiresAt=${y.config.expiresAt??"indefinite"}`:"fail-closed (read error)",N=`would have fired (${v}) but ${c} is already disabled (${I}) -- deferring, never shortening or overwriting an existing hold`;Xa(e,n,c,l,u,"confirmed_deferred_existing_disable",N),a.push({provider:c,bucketId:l,windowType:u,outcome:"confirmed-deferred",detail:N});continue}if(r){hp(e,c,l,f);let I=`would have fired (policy step is disabled -- collection only): ${v}`;Xa(e,n,c,l,u,"confirmed_would_fire_policy_disabled",I),a.push({provider:c,bucketId:l,windowType:u,outcome:"confirmed-would-fire",detail:I});continue}let A=u==="weekly"?new Date(n+nte).toISOString():h[h.length-1]?.resetsAtIso??ste(f);o(e,c,{reason:v,expiresAt:A}),hp(e,c,l,f),Xa(e,n,c,l,u,"confirmed_fired",v),a.push({provider:c,bucketId:l,windowType:u,outcome:"confirmed-fired",detail:v})}return cte(e,n,a),a}var RD="rate_limit_policy_heartbeat";function cte(e,t,n){let r={};for(let o of n)r[o.outcome]=(r[o.outcome]??0)+1;let s={lastRunAtMs:t,seriesEvaluated:n.length,outcomeCounts:r};e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(RD,JSON.stringify(s))}function gp(e){let t=e.prepare("SELECT v FROM kv WHERE k = ?").get(RD);if(t===void 0)return null;try{return JSON.parse(t.v)}catch{return null}}var lte=15*6e4;function ND(e,t=Date.now(),n=lte){let r=e.prepare("SELECT MAX(read_at) AS readAt FROM rate_limit_bucket_samples").get();if(r.readAt===null||t-r.readAt*1e3>n)return null;let o=gp(e);if(o===null)return{status:"never-run",reason:"rate-limit policy has never completed an evaluation while collection is active",ageMs:1/0};let i=t-o.lastRunAtMs;return i>n?{status:"stale",reason:`rate-limit policy last ran ${Math.round(i/6e4)}m ago while collection is active`,ageMs:i}:null}var ute=.85;function xD(e,t=ute){return e.prepare(`SELECT s.provider AS provider, s.bucket_id AS bucketId, s.window_type AS windowType, s.used_fraction AS usedFraction, s.resets_at_iso AS resetsAtIso
2195
+ FROM rate_limit_bucket_samples WHERE provider = ? AND bucket_id = ? AND resets_at = ? AND read_at >= ? ORDER BY read_at ASC`).all(c,l,f,p),_=h.map(I=>({readAt:I.readAt,usedFraction:I.usedFraction})),g=pp(_,n);if(g.kind==="insufficient_data"){a.push({provider:c,bucketId:l,windowType:u,outcome:"insufficient-data",detail:g.reason});continue}let w=ote(e,c,l,f);if(g.kind==="no_forecast"||!AD(g,u,n)){w!==null&&(hp(e,c,l,f),Xa(e,n,c,l,u,"disarmed",`forecast no longer crosses the ${mp[u]} threshold`)),a.push({provider:c,bucketId:l,windowType:u,outcome:g.kind==="no_forecast"?"no-forecast":"below-threshold",detail:""});continue}let E=_[_.length-1].usedFraction;if(w===null){ite(e,c,l,f,mp[u],n,g.latestReadAtMs,E,g.forecastAtMs);let I=`armed on first crossing, forecast ${new Date(g.forecastAtMs).toISOString()}`;Xa(e,n,c,l,u,"armed",I),a.push({provider:c,bucketId:l,windowType:u,outcome:"armed",detail:I});continue}if(g.latestReadAtMs<=w.armed_latest_read_at){a.push({provider:c,bucketId:l,windowType:u,outcome:"still-armed",detail:"awaiting a newer sample to confirm"});continue}if(E<=w.armed_used_fraction){a.push({provider:c,bucketId:l,windowType:u,outcome:"still-armed",detail:`newer sample available (used_fraction=${E}) but no increase over the armed reference (${w.armed_used_fraction}) -- awaiting real movement to confirm`});continue}let y=s(e,c,n),T=nte(_),v=ste(c,l,u,g,T,n);if(y.disabled){let I=y.config?`reason=${JSON.stringify(y.config.reason)}, expiresAt=${y.config.expiresAt??"indefinite"}`:"fail-closed (read error)",N=`would have fired (${v}) but ${c} is already disabled (${I}) -- deferring, never shortening or overwriting an existing hold`;Xa(e,n,c,l,u,"confirmed_deferred_existing_disable",N),a.push({provider:c,bucketId:l,windowType:u,outcome:"confirmed-deferred",detail:N});continue}if(r){hp(e,c,l,f);let I=`would have fired (policy step is disabled -- collection only): ${v}`;Xa(e,n,c,l,u,"confirmed_would_fire_policy_disabled",I),a.push({provider:c,bucketId:l,windowType:u,outcome:"confirmed-would-fire",detail:I});continue}let A=u==="weekly"?new Date(n+tte).toISOString():h[h.length-1]?.resetsAtIso??rte(f);o(e,c,{reason:v,expiresAt:A}),hp(e,c,l,f),Xa(e,n,c,l,u,"confirmed_fired",v),a.push({provider:c,bucketId:l,windowType:u,outcome:"confirmed-fired",detail:v})}return ate(e,n,a),a}var RD="rate_limit_policy_heartbeat";function ate(e,t,n){let r={};for(let o of n)r[o.outcome]=(r[o.outcome]??0)+1;let s={lastRunAtMs:t,seriesEvaluated:n.length,outcomeCounts:r};e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(RD,JSON.stringify(s))}function gp(e){let t=e.prepare("SELECT v FROM kv WHERE k = ?").get(RD);if(t===void 0)return null;try{return JSON.parse(t.v)}catch{return null}}var cte=15*6e4;function ND(e,t=Date.now(),n=cte){let r=e.prepare("SELECT MAX(read_at) AS readAt FROM rate_limit_bucket_samples").get();if(r.readAt===null||t-r.readAt*1e3>n)return null;let o=gp(e);if(o===null)return{status:"never-run",reason:"rate-limit policy has never completed an evaluation while collection is active",ageMs:1/0};let i=t-o.lastRunAtMs;return i>n?{status:"stale",reason:`rate-limit policy last ran ${Math.round(i/6e4)}m ago while collection is active`,ageMs:i}:null}var lte=.85;function xD(e,t=lte){return e.prepare(`SELECT s.provider AS provider, s.bucket_id AS bucketId, s.window_type AS windowType, s.used_fraction AS usedFraction, s.resets_at_iso AS resetsAtIso
2196
2196
  FROM rate_limit_bucket_samples s
2197
2197
  INNER JOIN (
2198
2198
  SELECT provider, bucket_id, MAX(read_at) AS maxReadAt
@@ -2200,7 +2200,7 @@ ${t.join(`
2200
2200
  WHERE window_type = 'weekly'
2201
2201
  GROUP BY provider, bucket_id
2202
2202
  ) latest ON latest.provider = s.provider AND latest.bucket_id = s.bucket_id AND latest.maxReadAt = s.read_at
2203
- WHERE s.window_type = 'weekly'`).all().filter(r=>!ID(r.provider,r.bucketId)&&r.usedFraction>=t)}var Jw="auto_scan_paused";function Eo(e){let t=e.prepare("SELECT v FROM kv WHERE k = ?").get(Jw);if(t===void 0)return null;try{let n=JSON.parse(t.v);return{paused_at:typeof n.paused_at=="string"?n.paused_at:"unknown",actor:typeof n.actor=="string"?n.actor:null,note:typeof n.note=="string"?n.note:null,resume_after:typeof n.resume_after=="string"?n.resume_after:null}}catch{return{paused_at:"unknown",actor:null,note:null,resume_after:null}}}var dte=3*24*60*6e4;function LD(e,t=Date.now()){let n=Eo(e);if(n===null)return null;let r=Date.parse(n.paused_at);if(Number.isNaN(r))return{status:"unevaluable",state:n,reason:"corrupt-paused-at"};let s=t-r;if(n.resume_after!==null){let o=Date.parse(n.resume_after);return Number.isNaN(o)?{status:"unevaluable",state:n,reason:"corrupt-resume-after"}:t>=o?{status:"stale",state:n,ageMs:s,resumeAfterPassed:!0}:null}return s>=dte?{status:"stale",state:n,ageMs:s,resumeAfterPassed:!1}:null}function CD(e,t){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(Jw,JSON.stringify(t))}function OD(e){e.prepare("DELETE FROM kv WHERE k = ?").run(Jw)}var fte=/usage limit|rate limit|too many requests|quota exceeded|insufficient_quota/i;function Ep(e,t,n=36e5,r=Date.now()){let s=e.idle.find(i=>i.target===t);if(s===void 0||s.error===null||s.error===void 0||!fte.test(s.error))return!1;let o=Date.parse(s.ended_at);return Number.isFinite(o)?r-o<n:!1}import{existsSync as Yw,mkdirSync as mte,readFileSync as pte,writeFileSync as hte}from"node:fs";import{homedir as _te}from"node:os";import{join as DD}from"node:path";var gte=`# Autopilot check-in -- advance your work, then report status
2203
+ WHERE s.window_type = 'weekly'`).all().filter(r=>!ID(r.provider,r.bucketId)&&r.usedFraction>=t)}var Jw="auto_scan_paused";function Eo(e){let t=e.prepare("SELECT v FROM kv WHERE k = ?").get(Jw);if(t===void 0)return null;try{let n=JSON.parse(t.v);return{paused_at:typeof n.paused_at=="string"?n.paused_at:"unknown",actor:typeof n.actor=="string"?n.actor:null,note:typeof n.note=="string"?n.note:null,resume_after:typeof n.resume_after=="string"?n.resume_after:null}}catch{return{paused_at:"unknown",actor:null,note:null,resume_after:null}}}var ute=3*24*60*6e4;function LD(e,t=Date.now()){let n=Eo(e);if(n===null)return null;let r=Date.parse(n.paused_at);if(Number.isNaN(r))return{status:"unevaluable",state:n,reason:"corrupt-paused-at"};let s=t-r;if(n.resume_after!==null){let o=Date.parse(n.resume_after);return Number.isNaN(o)?{status:"unevaluable",state:n,reason:"corrupt-resume-after"}:t>=o?{status:"stale",state:n,ageMs:s,resumeAfterPassed:!0}:null}return s>=ute?{status:"stale",state:n,ageMs:s,resumeAfterPassed:!1}:null}function CD(e,t){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(Jw,JSON.stringify(t))}function OD(e){e.prepare("DELETE FROM kv WHERE k = ?").run(Jw)}var dte=/usage limit|rate limit|too many requests|quota exceeded|insufficient_quota/i;function Ep(e,t,n=36e5,r=Date.now()){let s=e.idle.find(i=>i.target===t);if(s===void 0||s.error===null||s.error===void 0||!dte.test(s.error))return!1;let o=Date.parse(s.ended_at);return Number.isFinite(o)?r-o<n:!1}import{existsSync as Yw,mkdirSync as fte,readFileSync as mte,writeFileSync as pte}from"node:fs";import{homedir as hte}from"node:os";import{join as DD}from"node:path";var _te=`# Autopilot check-in -- advance your work, then report status
2204
2204
 
2205
2205
  You are being polled. Advance the work you have established (see your own durable memory for what that
2206
2206
  is) -- do a REAL unit of work this turn, not just a status echo. Before reporting DONE or going idle,
@@ -2216,29 +2216,29 @@ On the VERY LAST LINE, emit ONE flag ONLY when it applies:
2216
2216
  - BLOCKED -- you need a decision/escalation, or are holding on a go-ahead before proceeding.
2217
2217
  - DONE -- everything is complete AND verified AND committed+pushed+tested, nothing pending.
2218
2218
  If neither applies, reply normally describing what you advanced and omit the flag.
2219
- `;function yp(e){return e||(process.env.LMBEE_PROMPTS_DIR?process.env.LMBEE_PROMPTS_DIR:DD(_te(),".lmbee","prompts"))}function $D(e,t){return DD(e,`${t}.md`)}function Ete(e){Yw(e)||mte(e,{recursive:!0});let t=$D(e,"default");Yw(t)||hte(t,gte)}function yte(e,t){let n=$D(e,t);if(!Yw(n))if(t==="default")Ete(e);else throw new Error(`loadPromptTemplate: no prompt file for "${t}" at ${n} -- prepare it (S1) before this team can be auto-nudged`);return pte(n,"utf8")}function wp(e,t){return yte(e,t.promptName)}import{existsSync as MD,readFileSync as PD,rmSync as wte}from"node:fs";import{resolve as Kw,sep as Tte}from"node:path";function zn(e,t){if(t!==null)return{lifecycle:"finished",lifecycleBasis:"answer",pulledAt:e.sent_ts??e.retrieved_ts,answeredAt:t.answered_at};if(e.retracted_ts!==null)return{lifecycle:"finished",lifecycleBasis:"retracted",pulledAt:e.sent_ts??e.retrieved_ts,answeredAt:null};if(e.status==="merged")return{lifecycle:"finished",lifecycleBasis:"merged",pulledAt:null,answeredAt:null};if(e.in_reply_to!=null){let n=e.status==="sent"||e.status==="retrieved";return{lifecycle:n?"finished":"queued",lifecycleBasis:"reply",pulledAt:n?e.sent_ts??e.retrieved_ts:null,answeredAt:null}}return!e.expects_response&&(e.status==="sent"||e.status==="retrieved")?{lifecycle:"finished",lifecycleBasis:"informational",pulledAt:e.sent_ts??e.retrieved_ts,answeredAt:null}:e.status==="retrieved"?{lifecycle:"processing",lifecycleBasis:"confirmed",pulledAt:e.retrieved_ts,answeredAt:null}:e.status==="sent"?{lifecycle:"processing",lifecycleBasis:"dispatched",pulledAt:e.sent_ts,answeredAt:null}:{lifecycle:"queued",lifecycleBasis:"dispatched",pulledAt:null,answeredAt:null}}function mt(e,t){return e.prepare("SELECT * FROM answers WHERE prompt_queue_id = ? AND superseded_at IS NULL").get(t)??null}function UD(e,t){return e.prepare("SELECT * FROM answers WHERE prompt_queue_id = ? ORDER BY created_at ASC, id ASC").all(t)}var vte=`q.status != 'merged'
2219
+ `;function yp(e){return e||(process.env.LMBEE_PROMPTS_DIR?process.env.LMBEE_PROMPTS_DIR:DD(hte(),".lmbee","prompts"))}function $D(e,t){return DD(e,`${t}.md`)}function gte(e){Yw(e)||fte(e,{recursive:!0});let t=$D(e,"default");Yw(t)||pte(t,_te)}function Ete(e,t){let n=$D(e,t);if(!Yw(n))if(t==="default")gte(e);else throw new Error(`loadPromptTemplate: no prompt file for "${t}" at ${n} -- prepare it (S1) before this team can be auto-nudged`);return mte(n,"utf8")}function wp(e,t){return Ete(e,t.promptName)}import{existsSync as MD,readFileSync as PD,rmSync as yte}from"node:fs";import{resolve as Kw,sep as wte}from"node:path";function zn(e,t){if(t!==null)return{lifecycle:"finished",lifecycleBasis:"answer",pulledAt:e.sent_ts??e.retrieved_ts,answeredAt:t.answered_at};if(e.retracted_ts!==null)return{lifecycle:"finished",lifecycleBasis:"retracted",pulledAt:e.sent_ts??e.retrieved_ts,answeredAt:null};if(e.status==="merged")return{lifecycle:"finished",lifecycleBasis:"merged",pulledAt:null,answeredAt:null};if(e.in_reply_to!=null){let n=e.status==="sent"||e.status==="retrieved";return{lifecycle:n?"finished":"queued",lifecycleBasis:"reply",pulledAt:n?e.sent_ts??e.retrieved_ts:null,answeredAt:null}}return!e.expects_response&&(e.status==="sent"||e.status==="retrieved")?{lifecycle:"finished",lifecycleBasis:"informational",pulledAt:e.sent_ts??e.retrieved_ts,answeredAt:null}:e.status==="retrieved"?{lifecycle:"processing",lifecycleBasis:"confirmed",pulledAt:e.retrieved_ts,answeredAt:null}:e.status==="sent"?{lifecycle:"processing",lifecycleBasis:"dispatched",pulledAt:e.sent_ts,answeredAt:null}:{lifecycle:"queued",lifecycleBasis:"dispatched",pulledAt:null,answeredAt:null}}function mt(e,t){return e.prepare("SELECT * FROM answers WHERE prompt_queue_id = ? AND superseded_at IS NULL").get(t)??null}function UD(e,t){return e.prepare("SELECT * FROM answers WHERE prompt_queue_id = ? ORDER BY created_at ASC, id ASC").all(t)}var Tte=`q.status != 'merged'
2220
2220
  AND q.retracted_ts IS NULL
2221
2221
  AND NOT EXISTS (SELECT 1 FROM answers r WHERE r.prompt_queue_id = q.id)
2222
2222
  AND NOT ((q.expects_response = 0 OR q.in_reply_to IS NOT NULL) AND q.status IN ('sent', 'retrieved'))`;function FD(e,t){return e.prepare(`SELECT q.* FROM queue q
2223
2223
  WHERE q.to_id = ?
2224
- AND ${vte}
2225
- ORDER BY q.id`).all(t)}function jD(e,t,n){let r=new Date(n-t.maxAgeMs).toISOString(),s=["status IN ('sent', 'retrieved')","from_id != 'autopilot'","COALESCE(sent_ts, retrieved_ts) >= ?"],o=[r];t.fromId!==void 0&&(s.push("from_id = ?"),o.push(t.fromId));let i=e.prepare(`SELECT * FROM queue WHERE ${s.join(" AND ")}`).all(...o),a=[];for(let c of i){let l=zn(c,mt(e,c.id));if(l.lifecycle!=="processing"||l.pulledAt===null)continue;let u=n-Date.parse(l.pulledAt);u>=t.minAgeMs&&u<=t.maxAgeMs&&a.push({row:c,ageMs:u})}return a.sort((c,l)=>l.ageMs-c.ageMs),a}function HD(e,t,n){let r=e.prepare("SELECT * FROM queue WHERE from_id = 'operator' AND to_id = ? AND status IN ('pending', 'escalating', 'sent', 'retrieved')").all(t),s=[];for(let o of r)zn(o,mt(e,o.id)).lifecycle!=="finished"&&s.push({row:o,ageMs:n-Date.parse(o.created_ts)});return s.sort((o,i)=>i.ageMs-o.ageMs),s}function zw(e,t){let n=[t.from_id,t.to_id,t.escalation_only,t.to_alias],s=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(...n,t.id).id??Number.MAX_SAFE_INTEGER;return 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 < ?").all(...n,t.id,s)}function Qw(e,t){if(t.status!=="merged")return null;if(t.merged_into_id!==null){let s=e.prepare("SELECT * FROM queue WHERE id = ?").get(t.merged_into_id);if(s)return s}let n=e.prepare("SELECT * FROM queue WHERE to_id = ? AND status != 'merged' AND id < ? ORDER BY id").all(t.to_id,t.id),r=`--- addendum, ${t.created_ts} ---`;for(let s of n){let o;try{o=PD(s.prompt_file,"utf8")}catch{continue}if(o.includes(r))return s}return null}function Ei(e,t){return 1+zw(e,t).length}function iu(e,t){return(t.retracted_ts!==null?1:0)+zw(e,t).filter(r=>r.retracted_ts!==null).length}function qD(e,t,n,r,s={}){let o=$e(r,"reason");return e.transaction(()=>{let a=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(a===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(a.from_id!==n)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} was not sent by "${n}" -- cannot retract another team's claim`,2);if(a.retracted_ts!==null)throw new q("CONFLICT",`Queue prompt ${t} was already retracted: ${a.retracted_reason??"(no reason recorded)"}`,4);if(a.status!=="merged"){let m=zw(e,a).filter(p=>p.retracted_ts===null);if(m.length>0)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} has ${m.length} still-live merged escalation(s) (ids: ${m.map(p=>p.id).join(", ")}) folded into it -- retract those individually first, or the whole coalesced thread would silently disappear`,2)}let c=mt(e,t)!==null;if(!c&&a.status==="pending"){Wt(e,n,"queue_retracted_deleted",Date.parse(ve()),{note:`queue#${t} (was ${a.from_id} -> ${a.to_id}, sent ${a.created_ts}, never retrieved): ${o}`}),e.prepare("DELETE FROM queue WHERE id = ?").run(t);let m=Kw(gd()),p=Kw(a.prompt_file);if((p===m||p.startsWith(m+Tte))&&MD(p))try{wte(p,{force:!0})}catch{}return{kind:"deleted",id:t,reason:o}}let l=ve();e.prepare("UPDATE queue SET retracted_ts = ?, retracted_reason = ? WHERE id = ?").run(l,o,t);let u=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(c||u.status==="merged"||s.noNotice===!0)return{kind:"retracted",row:u};let d=u.to_alias===null?u.to_id:`${u.to_id}:${u.to_alias}`,f=De(e,[{name:u.to_id}],d,`RETRACTED: queue#${t} -- ${o}`,{from:u.from_id,expectsResponse:!1,retractionNotice:!0});return{kind:"retracted-with-notice",row:u,noticeId:f}}).immediate()}function au(e,t){let n=e.prepare("SELECT * FROM queue WHERE to_id = 'operator' AND status IN ('pending', 'escalating', 'sent', 'retrieved')").all(),r=[];for(let s of n)zn(s,mt(e,s.id)).lifecycle!=="finished"&&r.push({row:s,ageMs:t-Date.parse(s.created_ts)});return r.sort((s,o)=>o.ageMs-s.ageMs),r}var Ste=5;function bte(e,t,n){let r=new Set([t.from_id,t.to_id]);if(n.length>0){let a="";try{a=PD(t.prompt_file,"utf8").split(`
2226
- `)[0]??""}catch{}for(let c of n)a.includes(c)&&r.add(c)}let s=e.prepare("SELECT * FROM queue WHERE (from_id = ? OR to_id = ?) AND created_ts > ? AND id != ? ORDER BY created_ts ASC"),o=new Set([t.id]),i=[];for(let a of r)for(let c of s.all(a,a,t.created_ts,t.id))o.has(c.id)||(o.add(c.id),i.push({row:c,matchedTeam:a}));return i.sort((a,c)=>Date.parse(a.row.created_ts)-Date.parse(c.row.created_ts)),i.slice(0,Ste)}function yi(e,t,n,r=[]){let s=e.prepare("SELECT * FROM queue WHERE to_id = ? AND status IN ('pending', 'escalating', 'sent', 'retrieved') AND retraction_notice = 0 AND in_reply_to IS NULL").all(t),o=[];for(let i of s){if(zn(i,mt(e,i.id)).lifecycle==="finished")continue;let c=e.prepare("SELECT 1 FROM queue WHERE from_id = ? AND to_id = ? AND created_ts > ? LIMIT 1").get(t,i.from_id,i.created_ts)!==void 0,l=bte(e,i,r);o.push({row:i,ageMs:n-Date.parse(i.created_ts),hasReplyTrafficSince:c,laterRelatedTraffic:l})}return o.sort((i,a)=>a.ageMs-i.ageMs),o}function BD(e,t,n){let r=e.prepare("SELECT * FROM queue WHERE to_id = ? AND status = 'sent' AND escalation_only = 0").all(t),s=[];for(let o of r)zn(o,mt(e,o.id)).lifecycleBasis==="dispatched"&&s.push({row:o,ageMs:n-Date.parse(o.sent_ts??o.created_ts)});return s.sort((o,i)=>i.ageMs-o.ageMs),s}function WD(e,t,n){let r=$e(n,"reason"),o=e.transaction(()=>{let i=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(i===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(i.status!=="sent")throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is not in a redeliverable state (status: ${i.status}) -- only a dispatched-but-unconfirmed ('sent') row can be redelivered`,2);if(i.escalation_only)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is an operator-escalation row -- redelivery does not apply to that lane`,2);if(mt(e,t)!==null)throw new q("CONFLICT",`Queue prompt ${t} already has a recorded answer -- nothing to redeliver`,4);if(i.retracted_ts!==null)throw new q("CONFLICT",`Queue prompt ${t} was retracted: ${i.retracted_reason??"(no reason recorded)"} -- nothing to redeliver`,4);if(!MD(Kw(i.prompt_file)))throw new q("CONFLICT",`Queue prompt ${t} has no prompt body left (${i.prompt_file} is gone, e.g. removed by \`queue gc\`) -- nothing to redeliver; send it again with enqueue`,4);return e.prepare("UPDATE queue SET status = 'pending', sent_ts = NULL WHERE id = ?").run(t),e.prepare("SELECT * FROM queue WHERE id = ?").get(t)}).immediate();return Wt(e,o.to_id,"redelivery-requeued",Date.parse(ve()),{note:`queue#${t}: ${r}`}),o}function Tp(e,t,n,r){let s=e.prepare("SELECT * FROM queue WHERE from_id = ?").all(t),o=[];for(let i of s){let a=mt(e,i.id);if(a===null)continue;let c=r-Date.parse(a.answered_at);Number.isNaN(c)||c>n||o.push({row:i,answer:a,ageMs:c})}return o.sort((i,a)=>i.ageMs-a.ageMs),o}function GD(e,t,n){e.prepare("UPDATE queue SET status = 'retrieved', retrieved_ts = COALESCE(retrieved_ts, ?) WHERE id = ?").run(n,t)}function XD(e,t,n){let r=t.subject_id!==null?/^task:(\d+)$/.exec(t.subject_id):null;if(r!==null)try{let s=Number(r[1]),o=mn(e,s);o!==null&&o.blocked_on===t.to_id&&(Td(e,s,{clearBlockedOn:!0}),Ir(e,s,{body:`blocked_on ("${t.to_id}") auto-cleared: escalation #${n} was answered.`}))}catch{}}function wi(e,t,n,r){let s=$e(r,"answer");return e.transaction(()=>{let i=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(i===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(i.to_id!==n)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is not addressed to "${n}" -- cannot answer on another team's behalf`,2);if(i.status!=="pending"&&i.status!=="escalating"&&i.status!=="sent"&&i.status!=="retrieved")throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is not in an answerable state (status: ${i.status}) -- cannot finish a prompt that is not currently open`,2);if(i.retracted_ts!==null)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} was retracted by its sender (${i.retracted_reason??"no reason recorded"}) -- cannot answer a withdrawn prompt`,2);if(mt(e,t)!==null)throw new q("CONFLICT",`Queue prompt ${t} already has a recorded answer`,4);let c=ve();try{return e.prepare("INSERT INTO answers(prompt_queue_id, answer_text, answered_at, created_at) VALUES (?, ?, ?, ?)").run(t,s,c,c),GD(e,t,c),XD(e,i,t),mt(e,t)}catch(l){if(l instanceof q)throw l;let u=l&&typeof l=="object"&&"code"in l?String(l.code):void 0;throw u!==void 0&&u.startsWith("SQLITE_CONSTRAINT")?new q("CONFLICT",`Queue prompt ${t} already has a recorded answer`,4):new q("STORAGE_ERROR",l instanceof Error?l.message:String(l),1)}}).immediate()}function VD(e,t,n,r){let s=$e(r,"reason");return e.transaction(()=>{let i=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(i===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(i.to_id!=="operator")throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is addressed to "${i.to_id}", not "operator" -- proxy resolution only exists for the operator's own un-owned inbox; ${i.to_id} must answer for itself via \`queue answer\``,2);if(i.status!=="pending"&&i.status!=="escalating"&&i.status!=="sent"&&i.status!=="retrieved")throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is not in an answerable state (status: ${i.status}) -- cannot resolve a prompt that is not currently open`,2);if(i.retracted_ts!==null)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} was retracted by its sender (${i.retracted_reason??"no reason recorded"}) -- cannot resolve a withdrawn prompt`,2);if(mt(e,t)!==null)throw new q("CONFLICT",`Queue prompt ${t} already has a recorded answer`,4);let c=ve();try{return e.prepare("INSERT INTO answers(prompt_queue_id, answer_text, answered_at, created_at) VALUES (?, ?, ?, ?)").run(t,`[resolved by proxy ${n}]: ${s}`,c,c),GD(e,t,c),XD(e,i,t),mt(e,t)}catch(l){if(l instanceof q)throw l;let u=l&&typeof l=="object"&&"code"in l?String(l.code):void 0;throw u!==void 0&&u.startsWith("SQLITE_CONSTRAINT")?new q("CONFLICT",`Queue prompt ${t} already has a recorded answer`,4):new q("STORAGE_ERROR",l instanceof Error?l.message:String(l),1)}}).immediate()}function JD(e,t,n,r){let s=$e(r,"answer");return e.transaction(()=>{let i=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(i===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(i.to_id!==n)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is not addressed to "${n}" -- cannot amend an answer on another team's behalf`,2);if(i.retracted_ts!==null)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} was retracted by its sender (${i.retracted_reason??"no reason recorded"}) -- cannot amend an answer to a withdrawn prompt`,2);return KD(e,t,s)}).immediate()}function YD(e,t,n,r){let s=$e(r,"reason");return e.transaction(()=>{let i=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(i===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(i.to_id!=="operator")throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is addressed to "${i.to_id}", not "operator" -- proxy amendment only exists for the operator's own un-owned inbox; ${i.to_id} must amend for itself via \`queue answer --amend\``,2);if(i.retracted_ts!==null)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} was retracted by its sender (${i.retracted_reason??"no reason recorded"}) -- cannot amend a resolution to a withdrawn prompt`,2);return KD(e,t,`[resolved by proxy ${n}]: ${s}`)}).immediate()}function KD(e,t,n){let r=mt(e,t);if(r===null)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} has no current answer to amend -- use \`queue answer\`/\`queue resolve\` for a first answer`,2);let s=ve();return e.prepare("UPDATE answers SET superseded_at = ? WHERE id = ?").run(s,r.id),e.prepare("INSERT INTO answers(prompt_queue_id, answer_text, answered_at, created_at) VALUES (?, ?, ?, ?)").run(t,n,s,s),mt(e,t)}var Ate=/standing by|standby|\bready\b|on-call/i,Ite=4*60*6e4,QD=5;function kte(e,t){if(e.length===0)return"";let n=e.slice(0,QD),r=n.map(({row:s,ageMs:o})=>` #${s.id} from ${s.from_id} (${Ae(o)} ago) -- \`lmbee queue answer ${s.id} "<your reply>" --from ${t}\``);return e.length>n.length&&r.push(` ...and ${e.length-n.length} more (\`lmbee queue inbox ${t}\` lists all of them)`),`
2224
+ AND ${Tte}
2225
+ ORDER BY q.id`).all(t)}function jD(e,t,n){let r=new Date(n-t.maxAgeMs).toISOString(),s=["status IN ('sent', 'retrieved')","from_id != 'autopilot'","COALESCE(sent_ts, retrieved_ts) >= ?"],o=[r];t.fromId!==void 0&&(s.push("from_id = ?"),o.push(t.fromId));let i=e.prepare(`SELECT * FROM queue WHERE ${s.join(" AND ")}`).all(...o),a=[];for(let c of i){let l=zn(c,mt(e,c.id));if(l.lifecycle!=="processing"||l.pulledAt===null)continue;let u=n-Date.parse(l.pulledAt);u>=t.minAgeMs&&u<=t.maxAgeMs&&a.push({row:c,ageMs:u})}return a.sort((c,l)=>l.ageMs-c.ageMs),a}function HD(e,t,n){let r=e.prepare("SELECT * FROM queue WHERE from_id = 'operator' AND to_id = ? AND status IN ('pending', 'escalating', 'sent', 'retrieved')").all(t),s=[];for(let o of r)zn(o,mt(e,o.id)).lifecycle!=="finished"&&s.push({row:o,ageMs:n-Date.parse(o.created_ts)});return s.sort((o,i)=>i.ageMs-o.ageMs),s}function zw(e,t){let n=[t.from_id,t.to_id,t.escalation_only,t.to_alias],s=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(...n,t.id).id??Number.MAX_SAFE_INTEGER;return 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 < ?").all(...n,t.id,s)}function Qw(e,t){if(t.status!=="merged")return null;if(t.merged_into_id!==null){let s=e.prepare("SELECT * FROM queue WHERE id = ?").get(t.merged_into_id);if(s)return s}let n=e.prepare("SELECT * FROM queue WHERE to_id = ? AND status != 'merged' AND id < ? ORDER BY id").all(t.to_id,t.id),r=`--- addendum, ${t.created_ts} ---`;for(let s of n){let o;try{o=PD(s.prompt_file,"utf8")}catch{continue}if(o.includes(r))return s}return null}function Ei(e,t){return 1+zw(e,t).length}function iu(e,t){return(t.retracted_ts!==null?1:0)+zw(e,t).filter(r=>r.retracted_ts!==null).length}function qD(e,t,n,r,s={}){let o=$e(r,"reason");return e.transaction(()=>{let a=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(a===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(a.from_id!==n)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} was not sent by "${n}" -- cannot retract another team's claim`,2);if(a.retracted_ts!==null)throw new q("CONFLICT",`Queue prompt ${t} was already retracted: ${a.retracted_reason??"(no reason recorded)"}`,4);if(a.status!=="merged"){let m=zw(e,a).filter(p=>p.retracted_ts===null);if(m.length>0)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} has ${m.length} still-live merged escalation(s) (ids: ${m.map(p=>p.id).join(", ")}) folded into it -- retract those individually first, or the whole coalesced thread would silently disappear`,2)}let c=mt(e,t)!==null;if(!c&&a.status==="pending"){Wt(e,n,"queue_retracted_deleted",Date.parse(ve()),{note:`queue#${t} (was ${a.from_id} -> ${a.to_id}, sent ${a.created_ts}, never retrieved): ${o}`}),e.prepare("DELETE FROM queue WHERE id = ?").run(t);let m=Kw(gd()),p=Kw(a.prompt_file);if((p===m||p.startsWith(m+wte))&&MD(p))try{yte(p,{force:!0})}catch{}return{kind:"deleted",id:t,reason:o}}let l=ve();e.prepare("UPDATE queue SET retracted_ts = ?, retracted_reason = ? WHERE id = ?").run(l,o,t);let u=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(c||u.status==="merged"||s.noNotice===!0)return{kind:"retracted",row:u};let d=u.to_alias===null?u.to_id:`${u.to_id}:${u.to_alias}`,f=De(e,[{name:u.to_id}],d,`RETRACTED: queue#${t} -- ${o}`,{from:u.from_id,expectsResponse:!1,retractionNotice:!0});return{kind:"retracted-with-notice",row:u,noticeId:f}}).immediate()}function au(e,t){let n=e.prepare("SELECT * FROM queue WHERE to_id = 'operator' AND status IN ('pending', 'escalating', 'sent', 'retrieved')").all(),r=[];for(let s of n)zn(s,mt(e,s.id)).lifecycle!=="finished"&&r.push({row:s,ageMs:t-Date.parse(s.created_ts)});return r.sort((s,o)=>o.ageMs-s.ageMs),r}var vte=5;function Ste(e,t,n){let r=new Set([t.from_id,t.to_id]);if(n.length>0){let a="";try{a=PD(t.prompt_file,"utf8").split(`
2226
+ `)[0]??""}catch{}for(let c of n)a.includes(c)&&r.add(c)}let s=e.prepare("SELECT * FROM queue WHERE (from_id = ? OR to_id = ?) AND created_ts > ? AND id != ? ORDER BY created_ts ASC"),o=new Set([t.id]),i=[];for(let a of r)for(let c of s.all(a,a,t.created_ts,t.id))o.has(c.id)||(o.add(c.id),i.push({row:c,matchedTeam:a}));return i.sort((a,c)=>Date.parse(a.row.created_ts)-Date.parse(c.row.created_ts)),i.slice(0,vte)}function yi(e,t,n,r=[]){let s=e.prepare("SELECT * FROM queue WHERE to_id = ? AND status IN ('pending', 'escalating', 'sent', 'retrieved') AND retraction_notice = 0 AND in_reply_to IS NULL").all(t),o=[];for(let i of s){if(zn(i,mt(e,i.id)).lifecycle==="finished")continue;let c=e.prepare("SELECT 1 FROM queue WHERE from_id = ? AND to_id = ? AND created_ts > ? LIMIT 1").get(t,i.from_id,i.created_ts)!==void 0,l=Ste(e,i,r);o.push({row:i,ageMs:n-Date.parse(i.created_ts),hasReplyTrafficSince:c,laterRelatedTraffic:l})}return o.sort((i,a)=>a.ageMs-i.ageMs),o}function BD(e,t,n){let r=e.prepare("SELECT * FROM queue WHERE to_id = ? AND status = 'sent' AND escalation_only = 0").all(t),s=[];for(let o of r)zn(o,mt(e,o.id)).lifecycleBasis==="dispatched"&&s.push({row:o,ageMs:n-Date.parse(o.sent_ts??o.created_ts)});return s.sort((o,i)=>i.ageMs-o.ageMs),s}function WD(e,t,n){let r=$e(n,"reason"),o=e.transaction(()=>{let i=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(i===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(i.status!=="sent")throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is not in a redeliverable state (status: ${i.status}) -- only a dispatched-but-unconfirmed ('sent') row can be redelivered`,2);if(i.escalation_only)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is an operator-escalation row -- redelivery does not apply to that lane`,2);if(mt(e,t)!==null)throw new q("CONFLICT",`Queue prompt ${t} already has a recorded answer -- nothing to redeliver`,4);if(i.retracted_ts!==null)throw new q("CONFLICT",`Queue prompt ${t} was retracted: ${i.retracted_reason??"(no reason recorded)"} -- nothing to redeliver`,4);if(!MD(Kw(i.prompt_file)))throw new q("CONFLICT",`Queue prompt ${t} has no prompt body left (${i.prompt_file} is gone, e.g. removed by \`queue gc\`) -- nothing to redeliver; send it again with enqueue`,4);return e.prepare("UPDATE queue SET status = 'pending', sent_ts = NULL WHERE id = ?").run(t),e.prepare("SELECT * FROM queue WHERE id = ?").get(t)}).immediate();return Wt(e,o.to_id,"redelivery-requeued",Date.parse(ve()),{note:`queue#${t}: ${r}`}),o}function Tp(e,t,n,r){let s=e.prepare("SELECT * FROM queue WHERE from_id = ?").all(t),o=[];for(let i of s){let a=mt(e,i.id);if(a===null)continue;let c=r-Date.parse(a.answered_at);Number.isNaN(c)||c>n||o.push({row:i,answer:a,ageMs:c})}return o.sort((i,a)=>i.ageMs-a.ageMs),o}function GD(e,t,n){e.prepare("UPDATE queue SET status = 'retrieved', retrieved_ts = COALESCE(retrieved_ts, ?) WHERE id = ?").run(n,t)}function XD(e,t,n){let r=t.subject_id!==null?/^task:(\d+)$/.exec(t.subject_id):null;if(r!==null)try{let s=Number(r[1]),o=mn(e,s);o!==null&&o.blocked_on===t.to_id&&(Td(e,s,{clearBlockedOn:!0}),Ir(e,s,{body:`blocked_on ("${t.to_id}") auto-cleared: escalation #${n} was answered.`}))}catch{}}function wi(e,t,n,r){let s=$e(r,"answer");return e.transaction(()=>{let i=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(i===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(i.to_id!==n)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is not addressed to "${n}" -- cannot answer on another team's behalf`,2);if(i.status!=="pending"&&i.status!=="escalating"&&i.status!=="sent"&&i.status!=="retrieved")throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is not in an answerable state (status: ${i.status}) -- cannot finish a prompt that is not currently open`,2);if(i.retracted_ts!==null)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} was retracted by its sender (${i.retracted_reason??"no reason recorded"}) -- cannot answer a withdrawn prompt`,2);if(mt(e,t)!==null)throw new q("CONFLICT",`Queue prompt ${t} already has a recorded answer`,4);let c=ve();try{return e.prepare("INSERT INTO answers(prompt_queue_id, answer_text, answered_at, created_at) VALUES (?, ?, ?, ?)").run(t,s,c,c),GD(e,t,c),XD(e,i,t),mt(e,t)}catch(l){if(l instanceof q)throw l;let u=l&&typeof l=="object"&&"code"in l?String(l.code):void 0;throw u!==void 0&&u.startsWith("SQLITE_CONSTRAINT")?new q("CONFLICT",`Queue prompt ${t} already has a recorded answer`,4):new q("STORAGE_ERROR",l instanceof Error?l.message:String(l),1)}}).immediate()}function VD(e,t,n,r){let s=$e(r,"reason");return e.transaction(()=>{let i=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(i===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(i.to_id!=="operator")throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is addressed to "${i.to_id}", not "operator" -- proxy resolution only exists for the operator's own un-owned inbox; ${i.to_id} must answer for itself via \`queue answer\``,2);if(i.status!=="pending"&&i.status!=="escalating"&&i.status!=="sent"&&i.status!=="retrieved")throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is not in an answerable state (status: ${i.status}) -- cannot resolve a prompt that is not currently open`,2);if(i.retracted_ts!==null)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} was retracted by its sender (${i.retracted_reason??"no reason recorded"}) -- cannot resolve a withdrawn prompt`,2);if(mt(e,t)!==null)throw new q("CONFLICT",`Queue prompt ${t} already has a recorded answer`,4);let c=ve();try{return e.prepare("INSERT INTO answers(prompt_queue_id, answer_text, answered_at, created_at) VALUES (?, ?, ?, ?)").run(t,`[resolved by proxy ${n}]: ${s}`,c,c),GD(e,t,c),XD(e,i,t),mt(e,t)}catch(l){if(l instanceof q)throw l;let u=l&&typeof l=="object"&&"code"in l?String(l.code):void 0;throw u!==void 0&&u.startsWith("SQLITE_CONSTRAINT")?new q("CONFLICT",`Queue prompt ${t} already has a recorded answer`,4):new q("STORAGE_ERROR",l instanceof Error?l.message:String(l),1)}}).immediate()}function JD(e,t,n,r){let s=$e(r,"answer");return e.transaction(()=>{let i=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(i===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(i.to_id!==n)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is not addressed to "${n}" -- cannot amend an answer on another team's behalf`,2);if(i.retracted_ts!==null)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} was retracted by its sender (${i.retracted_reason??"no reason recorded"}) -- cannot amend an answer to a withdrawn prompt`,2);return KD(e,t,s)}).immediate()}function YD(e,t,n,r){let s=$e(r,"reason");return e.transaction(()=>{let i=e.prepare("SELECT * FROM queue WHERE id = ?").get(t);if(i===void 0)throw new q("NOT_FOUND",`Queue prompt ${t} does not exist`,3);if(i.to_id!=="operator")throw new q("INVALID_ARGUMENT",`Queue prompt ${t} is addressed to "${i.to_id}", not "operator" -- proxy amendment only exists for the operator's own un-owned inbox; ${i.to_id} must amend for itself via \`queue answer --amend\``,2);if(i.retracted_ts!==null)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} was retracted by its sender (${i.retracted_reason??"no reason recorded"}) -- cannot amend a resolution to a withdrawn prompt`,2);return KD(e,t,`[resolved by proxy ${n}]: ${s}`)}).immediate()}function KD(e,t,n){let r=mt(e,t);if(r===null)throw new q("INVALID_ARGUMENT",`Queue prompt ${t} has no current answer to amend -- use \`queue answer\`/\`queue resolve\` for a first answer`,2);let s=ve();return e.prepare("UPDATE answers SET superseded_at = ? WHERE id = ?").run(s,r.id),e.prepare("INSERT INTO answers(prompt_queue_id, answer_text, answered_at, created_at) VALUES (?, ?, ?, ?)").run(t,n,s,s),mt(e,t)}var bte=/standing by|standby|\bready\b|on-call/i,Ate=4*60*6e4,QD=5;function Ite(e,t){if(e.length===0)return"";let n=e.slice(0,QD),r=n.map(({row:s,ageMs:o})=>` #${s.id} from ${s.from_id} (${Ae(o)} ago) -- \`lmbee queue answer ${s.id} "<your reply>" --from ${t}\``);return e.length>n.length&&r.push(` ...and ${e.length-n.length} more (\`lmbee queue inbox ${t}\` lists all of them)`),`
2227
2227
 
2228
2228
  (Also: you have ${e.length} request(s) awaiting a DURABLE response -- replying in chat/prose alone does NOT close these, only \`queue answer\` does:
2229
2229
  ${r.join(`
2230
2230
  `)}
2231
- )`}var zD=140,Rte=4*60*6e4;function Nte(e){let t=e.trim().split(`
2232
- `)[0]??"";return t.length>zD?`${t.slice(0,zD)}\u2026`:t}function xte(e){if(e.length===0)return"";let t=e.slice(0,QD).map(({row:n,answer:r,ageMs:s})=>` #${n.id} to ${n.to_id} (${Ae(s)} ago) -- "${Nte(r.answer_text)}"`);return e.length>t.length&&t.push(` ...and ${e.length-t.length} more`),`
2231
+ )`}var zD=140,kte=4*60*6e4;function Rte(e){let t=e.trim().split(`
2232
+ `)[0]??"";return t.length>zD?`${t.slice(0,zD)}\u2026`:t}function Nte(e){if(e.length===0)return"";let t=e.slice(0,QD).map(({row:n,answer:r,ageMs:s})=>` #${n.id} to ${n.to_id} (${Ae(s)} ago) -- "${Rte(r.answer_text)}"`);return e.length>t.length&&t.push(` ...and ${e.length-t.length} more`),`
2233
2233
 
2234
2234
  (Also: ${e.length} of your own request(s) received an answer recently:
2235
2235
  ${t.join(`
2236
2236
  `)}
2237
- )`}async function Lte(e,t){try{let n=se(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)}
2238
- `),null}}function Cte(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 ZD(e,t,n,r={}){let s=r.config??xe,o=r.nowMs??Date.now(),i=r.fetchTailImpl??Km,a=yp(r.promptsDir),c=r.readHeavyLockStatusImpl??vn;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}
2239
- `)})}let u=new Set(r.stalledTeamNames??await Bi(e,t,n,r.heavyLock??l(),s,o)),d=[];function f(h){let _=It(e,h.name);if(_===null||_.status==="BLOCKED"||me(e,h.name)?.confirmed_done_ts||Rt(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=`${se(h)}:${h.leadAlias}`;if(Ep(n,w,r.providerExhaustionBackoffMs))return!1}catch{}return!0}let m=r.clearAutoNudgeSuspendedImpl??ZS,p=r.recordAutoNudgeSuspendedImpl??QS;for(let h of t)if(!u.has(h.name)){m(e,h.name);continue}for(let h of t){if(!u.has(h.name)||(m(e,h.name),!f(h)))continue;let _=await Lte(h,i);if(_!==null&&Ate.test(_.text)&&!Cte(_.ts,r.standbyStaleMs??Ite,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??ze,w=r.deriveTaskAwareNudgeImpl??MA,E=null;try{E=g(e,se(h),h.leadAlias)}catch{}let y,T;if(E!==null){let $=await w(e,E,{backoffMs:s.cooldownMs});if($===null||(y=$.message,T=$.onSent,!f(h)))continue}else try{y=wp(a,h)}catch{continue}let A=(r.findOwedResponsesImpl??yi)(e,h.name,o);y+=kte(A,h.name);let N=(r.findRecentlyAnsweredForSenderImpl??Tp)(e,h.name,Rte,o);y+=xte(N);let R=(r.loadAutoNudgeRedirectImpl??Yn)(e,h.name),k=R===null?h.name:`${R.companionTeam}:${R.workerAlias}`,O=R===null?h.name:R.companionTeam,D=R===null?h.leadAlias:R.workerAlias,S=R===null?h.repoPath:t.find($=>$.name===O)?.repoPath??h.repoPath,L=(r.resolveMemberProviderImpl??Sr)({repoPath:S,name:O},D);if(!(L!==null&&(r.checkProviderDisabledImpl??tn)(e,L,o).disabled)){if(De(e,t,k,y,{from:"autopilot"}),R!==null){let $=r.recordRedirectedDispatchImpl??oO;try{await $(e,h.name,R,h.repoPath,new Date(o).toISOString())}catch(j){process.stderr.write(`[auto-continue] failed to record redirected dispatch for ${h.name}'s redirect to ${R.companionTeam}:${R.workerAlias} (nudge already sent, continuing): ${j instanceof Error?j.message:String(j)}
2237
+ )`}async function xte(e,t){try{let n=se(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)}
2238
+ `),null}}function Lte(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 ZD(e,t,n,r={}){let s=r.config??xe,o=r.nowMs??Date.now(),i=r.fetchTailImpl??Km,a=yp(r.promptsDir),c=r.readHeavyLockStatusImpl??vn;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}
2239
+ `)})}let u=new Set(r.stalledTeamNames??await Bi(e,t,n,r.heavyLock??l(),s,o)),d=[];function f(h){let _=It(e,h.name);if(_===null||_.status==="BLOCKED"||me(e,h.name)?.confirmed_done_ts||Rt(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=`${se(h)}:${h.leadAlias}`;if(Ep(n,w,r.providerExhaustionBackoffMs))return!1}catch{}return!0}let m=r.clearAutoNudgeSuspendedImpl??ZS,p=r.recordAutoNudgeSuspendedImpl??QS;for(let h of t)if(!u.has(h.name)){m(e,h.name);continue}for(let h of t){if(!u.has(h.name)||(m(e,h.name),!f(h)))continue;let _=await xte(h,i);if(_!==null&&bte.test(_.text)&&!Lte(_.ts,r.standbyStaleMs??Ate,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??ze,w=r.deriveTaskAwareNudgeImpl??MA,E=null;try{E=g(e,se(h),h.leadAlias)}catch{}let y,T;if(E!==null){let $=await w(e,E,{backoffMs:s.cooldownMs});if($===null||(y=$.message,T=$.onSent,!f(h)))continue}else try{y=wp(a,h)}catch{continue}let A=(r.findOwedResponsesImpl??yi)(e,h.name,o);y+=Ite(A,h.name);let N=(r.findRecentlyAnsweredForSenderImpl??Tp)(e,h.name,kte,o);y+=Nte(N);let R=(r.loadAutoNudgeRedirectImpl??Yn)(e,h.name),k=R===null?h.name:`${R.companionTeam}:${R.workerAlias}`,O=R===null?h.name:R.companionTeam,D=R===null?h.leadAlias:R.workerAlias,S=R===null?h.repoPath:t.find($=>$.name===O)?.repoPath??h.repoPath,L=(r.resolveMemberProviderImpl??Sr)({repoPath:S,name:O},D);if(!(L!==null&&(r.checkProviderDisabledImpl??tn)(e,L,o).disabled)){if(De(e,t,k,y,{from:"autopilot"}),R!==null){let $=r.recordRedirectedDispatchImpl??oO;try{await $(e,h.name,R,h.repoPath,new Date(o).toISOString())}catch(j){process.stderr.write(`[auto-continue] failed to record redirected dispatch for ${h.name}'s redirect to ${R.companionTeam}:${R.workerAlias} (nudge already sent, continuing): ${j instanceof Error?j.message:String(j)}
2240
2240
  `)}}try{T?.()}catch($){process.stderr.write(`[auto-continue] onSent bookkeeping failed for ${h.name} (nudge already sent, continuing): ${$ instanceof Error?$.message:String($)}
2241
- `)}jc(e,h.name,new Date().toISOString()),d.push(h.name)}}return d}import{readFileSync as Ote}from"node:fs";function e$(e){return`last_maintainer_wake:${e}`}function Dte(e,t){return e.prepare("SELECT v FROM kv WHERE k = ?").get(e$(t))?.v??null}function $te(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(e$(t),n)}function Mte(e,t,n,r){for(let s of t)if(s.autoNudge&&s.name!==r&&!me(e,s.name)?.confirmed_done_ts&&!kt(s,n))return!0;return!1}function t$(e,t,n,r,s=a=>Ote(a,"utf8"),o=Date.now(),i){let a=t.find(f=>f.name===r.teamName);if(!a||!Q(a)||!(i??Mte(e,t.filter(Q),n,r.teamName))||kt(a,n)||Rt(e,r.teamName,{fromAutopilot:!0}).length>0)return!1;let l=r.cooldownMs??xe.cooldownMs,u=Dte(e,r.teamName);if(u!==null&&o-Date.parse(u)<=l)return!1;let d;try{d=s(r.promptFile)}catch{return!1}return De(e,t,r.teamName,d,{from:"autopilot"}),$te(e,r.teamName,new Date(o).toISOString()),!0}function vp(e){return`blocked:${e}`}function n$(e,t,n,r){let s=n.map(o=>{let i=Fi(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 r$(e,t,n,r,s=xe,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=me(e,a.name),l=c?.blocked_surfaced_ts?Date.parse(c.blocked_surfaced_ts):null;if(l!==null&&o-l<=s.cooldownMs)continue;let u;try{u=se(a)}catch{continue}let d=ze(e,u,a.leadAlias);if(d===null)continue;let f=qi(e,d);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(Rt(e,n).map(g=>g.subject_id).filter(g=>g!==null)).has(vp(a.name))||(De(e,r,n,n$(e,a.name,m,"your decision"),{from:"autopilot",subject:vp(a.name)}),h=!0));for(let[_,g]of p)new Set(Rt(e,_).map(E=>E.subject_id).filter(E=>E!==null)).has(vp(a.name))||(De(e,r,_,n$(e,a.name,g,"your decision"),{from:"autopilot",subject:vp(a.name)}),h=!0);h&&(VS(e,a.name,new Date().toISOString()),i.push(a.name))}return i}var Pte=30*6e4;function Ute(e){return`unresolvable-teamfile:${e}`}async function s$(e,t,n,r,s=xe,o=Date.now(),i=Pte,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{se(l),nb(e,l.name);continue}catch{}tb(e,l.name,a());let u=rb(e,l.name);if(u===null)continue;let d=o-Date.parse(u.first_observed_ts);if(d<i)continue;let f=u.surfaced_ts!==null?Date.parse(u.surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m=Ute(l.name);if(Rt(e,n).map(g=>g.subject_id).filter(g=>g!==null).includes(m))continue;let h=Math.round(d/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.`;De(e,r,n,_,{from:"autopilot",subject:m}),sb(e,l.name,a()),c.push(l.name)}return c}var Zw="epic_closed_surfaced_ts";function Sp(e,t){return e.transaction(()=>{let r=mn(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=kr(i.body);if(a!==null){if(a[Ms]===!0)break;typeof a[Zw]=="string"&&(o=!0)}}return{entity:r,status:r.status,alreadySurfacedThisEpisode:o}})()}function o$(e){return`epic-closed:${e}`}async function i$(e,t,n,r,s=xe,o=Date.now(),i={}){let a=r.find(u=>u.name===n);if(!a)return[];if(!Q(a))return[];let c=new Set(Rt(e,n).map(u=>u.subject_id).filter(u=>u!==null)),l=[];for(let u of t){if(u.name===n||c.has(o$(u.name)))continue;let d=me(e,u.name),f=d?.epic_closed_surfaced_ts?Date.parse(d.epic_closed_surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m;try{m=se(u)}catch{continue}let p=ze(e,m,u.leadAlias);if(p===null)continue;let h=p.entities.filter(E=>E.kind==="epic"&&Hi.has(be(E.status)));if(h.length===0)continue;i.beforeRevalidate?.();let _=tr(se(u)),g=!1;e.transaction(()=>{let E=[];for(let A of h){let I=Sp(e,A.id);if(I===null)continue;let N=I.entity;Hi.has(be(N.status))&&(N.owner_team_path!==_||N.owner_alias!==u.leadAlias||I.alreadySurfacedThisEpisode||E.push(N))}if(E.length===0)return;let y=E.map(A=>`#${A.id} ("${A.title}")`),T=`Team "${u.name}" closed ${E.length} epic(s): ${y.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.`;De(e,r,n,T,{from:"autopilot",subject:o$(u.name),escalationOnly:!0});let v=new Date().toISOString();for(let A of E)Ir(e,A.id,{body:JSON.stringify({[Zw]:v})});YS(e,u.name,v),g=!0}).immediate(),g&&l.push(u.name)}return l}function a$(e){return`done-check:${e}`}var l$="consistency_alert_ts";function c$(e,t){return e.transaction(()=>{let r=mn(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=kr(c.body);if(l!==null){if(l[Ms]===!0){o=c.id,typeof l.to=="string"&&be(l.to)==="done"&&(i=c.created_at);break}typeof l[l$]=="string"&&(a=!0)}}return{entity:r,status:r.status,epochId:o,doneTransitionIso:i,alreadyAlertedThisEpisode:a}})()}async function Fte(e,t,n){let r=new Date(Date.parse(t)-n).toISOString();for(let s of e)if(await Jh(s,r))return!0;return!1}async function u$(e,t,n,r,s=xe,o={}){let i=o.hasEvidenceAroundDoneImpl??Fte,a=r.find(u=>u.name===n);if(!a)return[];if(!Q(a))return[];let c=new Set(Rt(e,n).map(u=>u.subject_id).filter(u=>u!==null)),l=[];for(let u of t){if(u.name===n||c.has(a$(u.name)))continue;let d;try{d=se(u)}catch{continue}let f=ze(e,d,u.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")&&be(T.status)==="done"&&!Nr(e,T,m));if(p.length===0)continue;let h=u.folders&&u.folders.length>0?u.folders:[u.repoPath],_=[];for(let T of p){let v=c$(e,T.id);if(v===null||v.alreadyAlertedThisEpisode)continue;await i(h,v.doneTransitionIso,s.idleThresholdMs)||_.push({entity:T,epochId:v.epochId})}if(_.length===0)continue;let g=tr(d),w=new Date().toISOString(),E=!1;e.transaction(()=>{let T=[];for(let{entity:I,epochId:N}of _){let x=c$(e,I.id);if(x===null)continue;let R=x.entity;be(R.status)==="done"&&(R.owner_team_path!==g||R.owner_alias!==u.leadAlias||Nr(e,R,new Map)||x.epochId!==N||x.alreadyAlertedThisEpisode||T.push(R))}if(T.length===0)return;let v=T.map(I=>`#${I.id} ("${I.title}")`),A=`Team "${u.name}" reported ${T.length} task(s) done with no commit/file-write found in its tracked path(s) around that time: ${v.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).`;De(e,r,n,A,{from:"autopilot",subject:a$(u.name),escalationOnly:!0});for(let I of T)Ir(e,I.id,{body:JSON.stringify({[l$]:w})});E=!0}).immediate(),E&&l.push(u.name)}return l}function d$(e){return`fault:${e}`}async function f$(e,t,n,r,s=xe,o=Date.now(),i={}){if(!r.some(l=>l.name===n))return[];let a=new Set(Rt(e,n).map(l=>l.subject_id).filter(l=>l!==null)),c=[];for(let l of t){if(l.name===n||a.has(d$(l.name)))continue;let u=me(e,l.name),d=u?.fault_surfaced_ts?Date.parse(u.fault_surfaced_ts):null;if(d!==null&&o-d<=s.cooldownMs)continue;let f;try{f=se(l)}catch{continue}let m=ze(e,f,l.leadAlias);if(m===null)continue;let p=Fc(e,m,s.cooldownMs,o);if(p.length===0)continue;i.beforeRevalidate?.();let h=!1;e.transaction(()=>{let g=[];for(let y of p){let T=mn(e,y.id);if(T===null)continue;let v=Fc(e,{entities:[T]},s.cooldownMs,o,{team:se(l),alias:l.leadAlias});v.length!==0&&g.push(v[0])}if(g.length===0)return;let w=g.map(y=>{let T=Fi(e,y.id),v=T!==null?`note: "${T.body}"`:"no note recorded";return`#${y.id} ("${y.title}", ${y.status}, ${v})`}),E=`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.`;De(e,r,n,E,{from:"autopilot",subject:d$(l.name)}),JS(e,l.name,new Date().toISOString()),h=!0}).immediate(),h&&c.push(l.name)}return c}function m$(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(
2241
+ `)}jc(e,h.name,new Date().toISOString()),d.push(h.name)}}return d}import{readFileSync as Cte}from"node:fs";function e$(e){return`last_maintainer_wake:${e}`}function Ote(e,t){return e.prepare("SELECT v FROM kv WHERE k = ?").get(e$(t))?.v??null}function Dte(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(e$(t),n)}function $te(e,t,n,r){for(let s of t)if(s.autoNudge&&s.name!==r&&!me(e,s.name)?.confirmed_done_ts&&!kt(s,n))return!0;return!1}function t$(e,t,n,r,s=a=>Cte(a,"utf8"),o=Date.now(),i){let a=t.find(f=>f.name===r.teamName);if(!a||!Q(a)||!(i??$te(e,t.filter(Q),n,r.teamName))||kt(a,n)||Rt(e,r.teamName,{fromAutopilot:!0}).length>0)return!1;let l=r.cooldownMs??xe.cooldownMs,u=Ote(e,r.teamName);if(u!==null&&o-Date.parse(u)<=l)return!1;let d;try{d=s(r.promptFile)}catch{return!1}return De(e,t,r.teamName,d,{from:"autopilot"}),Dte(e,r.teamName,new Date(o).toISOString()),!0}function vp(e){return`blocked:${e}`}function n$(e,t,n,r){let s=n.map(o=>{let i=Fi(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 r$(e,t,n,r,s=xe,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=me(e,a.name),l=c?.blocked_surfaced_ts?Date.parse(c.blocked_surfaced_ts):null;if(l!==null&&o-l<=s.cooldownMs)continue;let u;try{u=se(a)}catch{continue}let d=ze(e,u,a.leadAlias);if(d===null)continue;let f=qi(e,d);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(Rt(e,n).map(g=>g.subject_id).filter(g=>g!==null)).has(vp(a.name))||(De(e,r,n,n$(e,a.name,m,"your decision"),{from:"autopilot",subject:vp(a.name)}),h=!0));for(let[_,g]of p)new Set(Rt(e,_).map(E=>E.subject_id).filter(E=>E!==null)).has(vp(a.name))||(De(e,r,_,n$(e,a.name,g,"your decision"),{from:"autopilot",subject:vp(a.name)}),h=!0);h&&(VS(e,a.name,new Date().toISOString()),i.push(a.name))}return i}var Mte=30*6e4;function Pte(e){return`unresolvable-teamfile:${e}`}async function s$(e,t,n,r,s=xe,o=Date.now(),i=Mte,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{se(l),nb(e,l.name);continue}catch{}tb(e,l.name,a());let u=rb(e,l.name);if(u===null)continue;let d=o-Date.parse(u.first_observed_ts);if(d<i)continue;let f=u.surfaced_ts!==null?Date.parse(u.surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m=Pte(l.name);if(Rt(e,n).map(g=>g.subject_id).filter(g=>g!==null).includes(m))continue;let h=Math.round(d/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.`;De(e,r,n,_,{from:"autopilot",subject:m}),sb(e,l.name,a()),c.push(l.name)}return c}var Zw="epic_closed_surfaced_ts";function Sp(e,t){return e.transaction(()=>{let r=mn(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=kr(i.body);if(a!==null){if(a[Ms]===!0)break;typeof a[Zw]=="string"&&(o=!0)}}return{entity:r,status:r.status,alreadySurfacedThisEpisode:o}})()}function o$(e){return`epic-closed:${e}`}async function i$(e,t,n,r,s=xe,o=Date.now(),i={}){let a=r.find(u=>u.name===n);if(!a)return[];if(!Q(a))return[];let c=new Set(Rt(e,n).map(u=>u.subject_id).filter(u=>u!==null)),l=[];for(let u of t){if(u.name===n||c.has(o$(u.name)))continue;let d=me(e,u.name),f=d?.epic_closed_surfaced_ts?Date.parse(d.epic_closed_surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m;try{m=se(u)}catch{continue}let p=ze(e,m,u.leadAlias);if(p===null)continue;let h=p.entities.filter(E=>E.kind==="epic"&&Hi.has(be(E.status)));if(h.length===0)continue;i.beforeRevalidate?.();let _=tr(se(u)),g=!1;e.transaction(()=>{let E=[];for(let A of h){let I=Sp(e,A.id);if(I===null)continue;let N=I.entity;Hi.has(be(N.status))&&(N.owner_team_path!==_||N.owner_alias!==u.leadAlias||I.alreadySurfacedThisEpisode||E.push(N))}if(E.length===0)return;let y=E.map(A=>`#${A.id} ("${A.title}")`),T=`Team "${u.name}" closed ${E.length} epic(s): ${y.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.`;De(e,r,n,T,{from:"autopilot",subject:o$(u.name),escalationOnly:!0});let v=new Date().toISOString();for(let A of E)Ir(e,A.id,{body:JSON.stringify({[Zw]:v})});YS(e,u.name,v),g=!0}).immediate(),g&&l.push(u.name)}return l}function a$(e){return`done-check:${e}`}var l$="consistency_alert_ts";function c$(e,t){return e.transaction(()=>{let r=mn(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=kr(c.body);if(l!==null){if(l[Ms]===!0){o=c.id,typeof l.to=="string"&&be(l.to)==="done"&&(i=c.created_at);break}typeof l[l$]=="string"&&(a=!0)}}return{entity:r,status:r.status,epochId:o,doneTransitionIso:i,alreadyAlertedThisEpisode:a}})()}async function Ute(e,t,n){let r=new Date(Date.parse(t)-n).toISOString();for(let s of e)if(await Jh(s,r))return!0;return!1}async function u$(e,t,n,r,s=xe,o={}){let i=o.hasEvidenceAroundDoneImpl??Ute,a=r.find(u=>u.name===n);if(!a)return[];if(!Q(a))return[];let c=new Set(Rt(e,n).map(u=>u.subject_id).filter(u=>u!==null)),l=[];for(let u of t){if(u.name===n||c.has(a$(u.name)))continue;let d;try{d=se(u)}catch{continue}let f=ze(e,d,u.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")&&be(T.status)==="done"&&!Nr(e,T,m));if(p.length===0)continue;let h=u.folders&&u.folders.length>0?u.folders:[u.repoPath],_=[];for(let T of p){let v=c$(e,T.id);if(v===null||v.alreadyAlertedThisEpisode)continue;await i(h,v.doneTransitionIso,s.idleThresholdMs)||_.push({entity:T,epochId:v.epochId})}if(_.length===0)continue;let g=tr(d),w=new Date().toISOString(),E=!1;e.transaction(()=>{let T=[];for(let{entity:I,epochId:N}of _){let x=c$(e,I.id);if(x===null)continue;let R=x.entity;be(R.status)==="done"&&(R.owner_team_path!==g||R.owner_alias!==u.leadAlias||Nr(e,R,new Map)||x.epochId!==N||x.alreadyAlertedThisEpisode||T.push(R))}if(T.length===0)return;let v=T.map(I=>`#${I.id} ("${I.title}")`),A=`Team "${u.name}" reported ${T.length} task(s) done with no commit/file-write found in its tracked path(s) around that time: ${v.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).`;De(e,r,n,A,{from:"autopilot",subject:a$(u.name),escalationOnly:!0});for(let I of T)Ir(e,I.id,{body:JSON.stringify({[l$]:w})});E=!0}).immediate(),E&&l.push(u.name)}return l}function d$(e){return`fault:${e}`}async function f$(e,t,n,r,s=xe,o=Date.now(),i={}){if(!r.some(l=>l.name===n))return[];let a=new Set(Rt(e,n).map(l=>l.subject_id).filter(l=>l!==null)),c=[];for(let l of t){if(l.name===n||a.has(d$(l.name)))continue;let u=me(e,l.name),d=u?.fault_surfaced_ts?Date.parse(u.fault_surfaced_ts):null;if(d!==null&&o-d<=s.cooldownMs)continue;let f;try{f=se(l)}catch{continue}let m=ze(e,f,l.leadAlias);if(m===null)continue;let p=Fc(e,m,s.cooldownMs,o);if(p.length===0)continue;i.beforeRevalidate?.();let h=!1;e.transaction(()=>{let g=[];for(let y of p){let T=mn(e,y.id);if(T===null)continue;let v=Fc(e,{entities:[T]},s.cooldownMs,o,{team:se(l),alias:l.leadAlias});v.length!==0&&g.push(v[0])}if(g.length===0)return;let w=g.map(y=>{let T=Fi(e,y.id),v=T!==null?`note: "${T.body}"`:"no note recorded";return`#${y.id} ("${y.title}", ${y.status}, ${v})`}),E=`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.`;De(e,r,n,E,{from:"autopilot",subject:d$(l.name)}),JS(e,l.name,new Date().toISOString()),h=!0}).immediate(),h&&c.push(l.name)}return c}function m$(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(
2242
2242
  SELECT 1 FROM tracked_invocation
2243
2243
  WHERE target_teamfile = ? AND target_alias = ?
2244
2244
  AND (
@@ -2246,20 +2246,20 @@ ${t.join(`
2246
2246
  OR started_at >= ?
2247
2247
  OR ended_at >= ?
2248
2248
  )
2249
- ) AS found`).get(t,n,a,i,i).found===1}function p$(e){return`unknown:${e}`}async function h$(e,t,n,r,s=xe,o=Date.now(),i=Ma){if(!r.some(l=>l.name===n))return[];let a;function c(){return a??=i(),a}try{return await jte(e,t,n,r,s,o,c)}finally{a!==void 0&&a.close()}}async function jte(e,t,n,r,s,o,i){let a=new Map(r.map(u=>[u.name,u])),c=new Set(Rt(e,n).map(u=>u.subject_id).filter(u=>u!==null)),l=[];for(let u of t){if(u===n||c.has(p$(u))||c.has(u))continue;let d=me(e,u),f=d?.surfaced_ts?Date.parse(d.surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m=a.get(u);if(m?.repoPath!==void 0&&m?.leadAlias!==void 0){let y;try{y=se({name:u,repoPath:m.repoPath})}catch{y=""}if(y!==""&&m$(i(),y,m.leadAlias,s.idleThresholdMs,o))continue}let p=a.get(u),h=p?.repoPath!==void 0&&p?.leadAlias!==void 0,_=h?x_(e,{name:u,repoPath:p.repoPath,leadAlias:p.leadAlias}):It(e,u)===null,g=d===null||d.progress_status==="ACTIVE",w=!_&&h&&g&&R_(e,{name:u,repoPath:p.repoPath,leadAlias:p.leadAlias},s.idleThresholdMs,o);if(!_&&!w)continue;let E=_?`[status-engine] Team "${u}" is registered but has never been dispatched to -- needs S1 prep / a first dispatch, not a "no progress" investigation.`:`[status-engine] Team "${u}" 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 ${u}\`) and either re-prep/re-dispatch it or confirm it is truly done.`;De(e,r,n,E,{from:"autopilot",subject:p$(u)}),XS(e,u,new Date().toISOString()),l.push(u)}return l}import{execFile as Hte}from"node:child_process";import{promisify as qte}from"node:util";function cu(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 bp(e,t,n,r,s={}){let o=s.resolveMemberProviderImpl??Sr,i=s.checkProviderDisabledImpl??tn,a=s.isProviderExhaustedImpl??Ep,c=s.allLocalTeams??[t],l=Yn(e,t.name),u=l===null?t.name:l.companionTeam,d=l===null?t.leadAlias:l.workerAlias,f=l===null?t.repoPath:c.find(p=>p.name===u)?.repoPath??t.repoPath,m=o({repoPath:f,name:u},d);if(m!==null&&i(e,m,r).disabled)return{kind:"provider_disabled",provider:m};if(me(e,t.name)?.confirmed_done_ts)return{kind:"parked"};if(kt(t,n))return{kind:"presence_gated"};if(!t.autoNudge)return{kind:"auto_nudge_disabled"};if(Eo(e)!==null)return{kind:"fleet_scan_paused"};try{let p=`${se(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 _$=qte(Hte),Bte=new Set(["ENV-ERROR","NO-OUTPUT"]),Wte=24*60*6e4,Gte=3;async function lu(e,t,n=_$){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 g$(e,t,n,r,s,o={}){let i=o.execImpl??_$,a=o.whyNotObservedImpl??bp,c=o.flappingWindowMs??Wte,l=o.flappingOccurrenceThreshold??Gte,u=o.listRecentEventsByStatusImpl??Ku,d=[],f=[];for(let m of t){let p=WS(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,E=r-Date.parse(g),y=new Date(r-c).toISOString(),T=[...u(e,"ENV-ERROR",y,100),...u(e,"NO-OUTPUT",y,100)].filter(N=>N.team===m.name).sort((N,x)=>Date.parse(x.ts)-Date.parse(N.ts)),v=T.length>=l,A=Bte.has(_.status)&&!Number.isNaN(E)&&E>=s;if(!A&&!v)continue;if(v&&!A){let N=T[0],x={kind:"flapping",team:m.name,mostRecentStatus:N.status,mostRecentAt:N.ts,occurrenceCount:T.length,windowMs:c};h.kind==="no_continuous_observer"?d.push(x):f.push({team:m.name,status:N.status,changedAt:N.ts,observedAt:g,ageMs:E,suspension:h});continue}let I=_.status;if(h.kind==="no_continuous_observer"){let N=null;if(I==="NO-OUTPUT")try{N=await lu(se(m),m.leadAlias,i)}catch{N=null}d.push({kind:"continuous",team:m.name,status:I,changedAt:w,observedAt:g,ageMs:E,cause:N})}else f.push({team:m.name,status:I,changedAt:w,observedAt:g,ageMs:E,suspension:h})}return d.sort((m,p)=>m.kind==="continuous"&&p.kind==="continuous"?p.ageMs-m.ageMs:0),f.sort((m,p)=>p.ageMs-m.ageMs),{unreachable:d,notObserved:f}}import{execFile as Xte}from"node:child_process";import{promisify as Vte}from"node:util";var Jte=Vte(Xte);async function E$(e,t=Jte){try{let{stdout:n}=await t("git",["-C",e,"status","--porcelain"],{timeout:1e4});return n.split(`
2250
- `).filter(r=>r.trim().length>0).length}catch{return null}}import{execFile as Yte}from"node:child_process";import{promisify as Kte}from"node:util";var zte=Kte(Yte);async function w$(e,t=zte){try{let{stderr:n}=await t("lmctl",["lint",e],{timeout:15e3});return y$(n)}catch(n){let r=n&&typeof n=="object"&&"stderr"in n?String(n.stderr):"",s=y$(r);return s.length>0?s:null}}function y$(e){return e.split(`
2251
- `).map(t=>t.trim()).filter(t=>t.startsWith("warning:")||t.startsWith("error:"))}import{existsSync as eT}from"node:fs";function tT(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=mn(e,t.parent_id);if(r===null)return null;let s=tT(e,r,n);return s===null?null:{...s,explicit:!1}}function Ap(e,t){if(t===null)return null;for(let n of e)if(Q(n))try{if(se(n)===t)return n.name}catch{continue}return null}function T$(e){return e.prepare("SELECT * FROM entities WHERE kind = 'epic' AND owner_team_path IS NULL").all().filter(n=>!kn(n.status))}function v$(e,t,n=eT){return Ap(e,t)!==null?"registered":n(t)?"on_demand":"dangling"}function S$(e,t,n={}){let r=n.existsSyncImpl??eT,s=e.prepare("SELECT * FROM entities WHERE kind IN ('task', 'subtask')").all(),o=[];for(let i of s){if(kn(i.status))continue;let a=tT(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}v$(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 b$(e){return e.prepare("SELECT * FROM entities WHERE status = 'blocked'").all().filter(n=>(pn(e,n.id,"outgoing").outgoing??[]).length===0)}function Qte(e,t){return e.prepare("SELECT 1 FROM queue WHERE to_id = ? LIMIT 1").get(t)!==void 0}function A$(e,t,n,r=eT){let s=tT(e,n);if(s===null)return{ownerKind:"dangling",everContacted:null};let o=v$(t,s.ownerTeamPath,r);if(o==="dangling")return{ownerKind:o,everContacted:null};if(o==="on_demand")return{ownerKind:o,everContacted:!1};let i=Ap(t,s.ownerTeamPath);return{ownerKind:o,everContacted:Qte(e,i)}}function k$(e,t){let n=pn(e,t,"outgoing").outgoing??[];return new Set(n.filter(r=>!kn(r.status)).map(r=>r.id))}function Ip(e,t,n=new Set){if(n.has(t))return[];n.add(t);let s=(pn(e,t,"outgoing").outgoing??[]).filter(a=>!kn(a.status)),o=[];for(let a of s)(pn(e,a.id,"outgoing").outgoing??[]).filter(u=>!kn(u.status)).length===0?o.push(ct(e,a.id)):o.push(...Ip(e,a.id,n));let i=new Set;return o.filter(a=>i.has(a.id)?!1:(i.add(a.id),!0))}function Zte(e,t){let n=new Set([t]),r=(pn(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=ct(e,o);kn(i.status)||(s.push(i),r.push(...(pn(e,o,"incoming").incoming??[]).map(a=>a.id)))}return s}function I$(e){let t=e.trim().toLowerCase();return t==="todo"?0:t==="in_progress"||t==="in-progress"?1:2}function R$(e,t,n){let r=new Map;for(let o of t)for(let i of Ip(e,o.id))r.set(i.id,i);let s=[];for(let o of r.values()){let i=Zte(e,o.id),a=new Set;for(let l of i){let u=Ap(n,l.owner_team_path);u!==null&&a.add(u)}let c=A$(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=I$(o.entity.status)-I$(i.entity.status);return a!==0?a:o.entity.id-i.entity.id}),s}import{execFile as ene}from"node:child_process";import{readFileSync as tne}from"node:fs";import{basename as nne,resolve as rne}from"node:path";import{promisify as sne}from"node:util";var nT=sne(ene),one=[/\.env\.(example|sample|template)$/i],ine=[/\.pem$/,/\.key$/,/(^|\/)id_rsa$/,/(^|\/)id_ed25519$/,/(^|\/)id_ecdsa$/],ane=[/(^|\/)\.env(\..+)?$/,/(^|\/)\.mcp\.json$/,/(^|\/)\.netrc$/,/(^|\/)\.npmrc$/],x$=[/\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,}/],cne=[...x$,/\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],kp=20*1024*1024;async function L$(e,t){try{let{stdout:n}=await t("git",["-C",e,"ls-files"],{timeout:1e4,maxBuffer:kp});return n.split(`
2252
- `).filter(r=>r.length>0)}catch{return null}}async function rT(e,t,n){try{let{stdout:r}=await n("git",["-C",e,"show",`HEAD:${t}`],{timeout:1e4,maxBuffer:kp});return r}catch{return null}}async function C$(e,t=nT){let n=await L$(e,t);if(n===null)return null;let r=a=>!one.some(c=>c.test(a)),s=n.filter(a=>ine.some(c=>c.test(a))&&r(a)),o=n.filter(a=>ane.some(c=>c.test(a))&&r(a)),i=[];for(let a of o){let c=await rT(e,a,t);c!==null&&cne.some(l=>l.test(c))&&i.push(a)}return[...s,...i]}async function O$(e,t=nT){let n=await L$(e,t);if(n===null)return null;let r=n.filter(o=>o.endsWith(".lmctl")),s=[];for(let o of r){let i=await rT(e,o,t);if(i===null)continue;let a=x$.reduce((c,l)=>c+(l.test(i)?1:0),0);a>0&&s.push({path:o,matchCount:a})}return s}var lne=[/(^|\/)template\.lmctl$/i,/(^|\/)examples\/.*\.lmctl$/i],N$=/_(?:MEMBER|AGENT)_\b|\bsessionid\s*=\s*\S/;async function D$(e,t=nT){try{let[n,r]=await Promise.all([t("git",["-C",e,"ls-files"],{timeout:1e4,maxBuffer:kp}),t("git",["-C",e,"ls-files","--others","--exclude-standard"],{timeout:1e4,maxBuffer:kp})]),s=u=>!lne.some(d=>d.test(u)),o=u=>nne(u).includes(".lmctl")&&s(u),i=n.stdout.split(`
2249
+ ) AS found`).get(t,n,a,i,i).found===1}function p$(e){return`unknown:${e}`}async function h$(e,t,n,r,s=xe,o=Date.now(),i=Ma){if(!r.some(l=>l.name===n))return[];let a;function c(){return a??=i(),a}try{return await Fte(e,t,n,r,s,o,c)}finally{a!==void 0&&a.close()}}async function Fte(e,t,n,r,s,o,i){let a=new Map(r.map(u=>[u.name,u])),c=new Set(Rt(e,n).map(u=>u.subject_id).filter(u=>u!==null)),l=[];for(let u of t){if(u===n||c.has(p$(u))||c.has(u))continue;let d=me(e,u),f=d?.surfaced_ts?Date.parse(d.surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m=a.get(u);if(m?.repoPath!==void 0&&m?.leadAlias!==void 0){let y;try{y=se({name:u,repoPath:m.repoPath})}catch{y=""}if(y!==""&&m$(i(),y,m.leadAlias,s.idleThresholdMs,o))continue}let p=a.get(u),h=p?.repoPath!==void 0&&p?.leadAlias!==void 0,_=h?x_(e,{name:u,repoPath:p.repoPath,leadAlias:p.leadAlias}):It(e,u)===null,g=d===null||d.progress_status==="ACTIVE",w=!_&&h&&g&&R_(e,{name:u,repoPath:p.repoPath,leadAlias:p.leadAlias},s.idleThresholdMs,o);if(!_&&!w)continue;let E=_?`[status-engine] Team "${u}" is registered but has never been dispatched to -- needs S1 prep / a first dispatch, not a "no progress" investigation.`:`[status-engine] Team "${u}" 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 ${u}\`) and either re-prep/re-dispatch it or confirm it is truly done.`;De(e,r,n,E,{from:"autopilot",subject:p$(u)}),XS(e,u,new Date().toISOString()),l.push(u)}return l}import{execFile as jte}from"node:child_process";import{promisify as Hte}from"node:util";function cu(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 bp(e,t,n,r,s={}){let o=s.resolveMemberProviderImpl??Sr,i=s.checkProviderDisabledImpl??tn,a=s.isProviderExhaustedImpl??Ep,c=s.allLocalTeams??[t],l=Yn(e,t.name),u=l===null?t.name:l.companionTeam,d=l===null?t.leadAlias:l.workerAlias,f=l===null?t.repoPath:c.find(p=>p.name===u)?.repoPath??t.repoPath,m=o({repoPath:f,name:u},d);if(m!==null&&i(e,m,r).disabled)return{kind:"provider_disabled",provider:m};if(me(e,t.name)?.confirmed_done_ts)return{kind:"parked"};if(kt(t,n))return{kind:"presence_gated"};if(!t.autoNudge)return{kind:"auto_nudge_disabled"};if(Eo(e)!==null)return{kind:"fleet_scan_paused"};try{let p=`${se(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 _$=Hte(jte),qte=new Set(["ENV-ERROR","NO-OUTPUT"]),Bte=24*60*6e4,Wte=3;async function lu(e,t,n=_$){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 g$(e,t,n,r,s,o={}){let i=o.execImpl??_$,a=o.whyNotObservedImpl??bp,c=o.flappingWindowMs??Bte,l=o.flappingOccurrenceThreshold??Wte,u=o.listRecentEventsByStatusImpl??Ku,d=[],f=[];for(let m of t){let p=WS(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,E=r-Date.parse(g),y=new Date(r-c).toISOString(),T=[...u(e,"ENV-ERROR",y,100),...u(e,"NO-OUTPUT",y,100)].filter(N=>N.team===m.name).sort((N,x)=>Date.parse(x.ts)-Date.parse(N.ts)),v=T.length>=l,A=qte.has(_.status)&&!Number.isNaN(E)&&E>=s;if(!A&&!v)continue;if(v&&!A){let N=T[0],x={kind:"flapping",team:m.name,mostRecentStatus:N.status,mostRecentAt:N.ts,occurrenceCount:T.length,windowMs:c};h.kind==="no_continuous_observer"?d.push(x):f.push({team:m.name,status:N.status,changedAt:N.ts,observedAt:g,ageMs:E,suspension:h});continue}let I=_.status;if(h.kind==="no_continuous_observer"){let N=null;if(I==="NO-OUTPUT")try{N=await lu(se(m),m.leadAlias,i)}catch{N=null}d.push({kind:"continuous",team:m.name,status:I,changedAt:w,observedAt:g,ageMs:E,cause:N})}else f.push({team:m.name,status:I,changedAt:w,observedAt:g,ageMs:E,suspension:h})}return d.sort((m,p)=>m.kind==="continuous"&&p.kind==="continuous"?p.ageMs-m.ageMs:0),f.sort((m,p)=>p.ageMs-m.ageMs),{unreachable:d,notObserved:f}}import{execFile as Gte}from"node:child_process";import{promisify as Xte}from"node:util";var Vte=Xte(Gte);async function E$(e,t=Vte){try{let{stdout:n}=await t("git",["-C",e,"status","--porcelain"],{timeout:1e4});return n.split(`
2250
+ `).filter(r=>r.trim().length>0).length}catch{return null}}import{execFile as Jte}from"node:child_process";import{promisify as Yte}from"node:util";var Kte=Yte(Jte);async function w$(e,t=Kte){try{let{stderr:n}=await t("lmctl",["lint",e],{timeout:15e3});return y$(n)}catch(n){let r=n&&typeof n=="object"&&"stderr"in n?String(n.stderr):"",s=y$(r);return s.length>0?s:null}}function y$(e){return e.split(`
2251
+ `).map(t=>t.trim()).filter(t=>t.startsWith("warning:")||t.startsWith("error:"))}import{existsSync as eT}from"node:fs";function tT(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=mn(e,t.parent_id);if(r===null)return null;let s=tT(e,r,n);return s===null?null:{...s,explicit:!1}}function Ap(e,t){if(t===null)return null;for(let n of e)if(Q(n))try{if(se(n)===t)return n.name}catch{continue}return null}function T$(e){return e.prepare("SELECT * FROM entities WHERE kind = 'epic' AND owner_team_path IS NULL").all().filter(n=>!kn(n.status))}function v$(e,t,n=eT){return Ap(e,t)!==null?"registered":n(t)?"on_demand":"dangling"}function S$(e,t,n={}){let r=n.existsSyncImpl??eT,s=e.prepare("SELECT * FROM entities WHERE kind IN ('task', 'subtask')").all(),o=[];for(let i of s){if(kn(i.status))continue;let a=tT(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}v$(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 b$(e){return e.prepare("SELECT * FROM entities WHERE status = 'blocked'").all().filter(n=>(pn(e,n.id,"outgoing").outgoing??[]).length===0)}function zte(e,t){return e.prepare("SELECT 1 FROM queue WHERE to_id = ? LIMIT 1").get(t)!==void 0}function A$(e,t,n,r=eT){let s=tT(e,n);if(s===null)return{ownerKind:"dangling",everContacted:null};let o=v$(t,s.ownerTeamPath,r);if(o==="dangling")return{ownerKind:o,everContacted:null};if(o==="on_demand")return{ownerKind:o,everContacted:!1};let i=Ap(t,s.ownerTeamPath);return{ownerKind:o,everContacted:zte(e,i)}}function k$(e,t){let n=pn(e,t,"outgoing").outgoing??[];return new Set(n.filter(r=>!kn(r.status)).map(r=>r.id))}function Ip(e,t,n=new Set){if(n.has(t))return[];n.add(t);let s=(pn(e,t,"outgoing").outgoing??[]).filter(a=>!kn(a.status)),o=[];for(let a of s)(pn(e,a.id,"outgoing").outgoing??[]).filter(u=>!kn(u.status)).length===0?o.push(ct(e,a.id)):o.push(...Ip(e,a.id,n));let i=new Set;return o.filter(a=>i.has(a.id)?!1:(i.add(a.id),!0))}function Qte(e,t){let n=new Set([t]),r=(pn(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=ct(e,o);kn(i.status)||(s.push(i),r.push(...(pn(e,o,"incoming").incoming??[]).map(a=>a.id)))}return s}function I$(e){let t=e.trim().toLowerCase();return t==="todo"?0:t==="in_progress"||t==="in-progress"?1:2}function R$(e,t,n){let r=new Map;for(let o of t)for(let i of Ip(e,o.id))r.set(i.id,i);let s=[];for(let o of r.values()){let i=Qte(e,o.id),a=new Set;for(let l of i){let u=Ap(n,l.owner_team_path);u!==null&&a.add(u)}let c=A$(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=I$(o.entity.status)-I$(i.entity.status);return a!==0?a:o.entity.id-i.entity.id}),s}import{execFile as Zte}from"node:child_process";import{readFileSync as ene}from"node:fs";import{basename as tne,resolve as nne}from"node:path";import{promisify as rne}from"node:util";var nT=rne(Zte),sne=[/\.env\.(example|sample|template)$/i],one=[/\.pem$/,/\.key$/,/(^|\/)id_rsa$/,/(^|\/)id_ed25519$/,/(^|\/)id_ecdsa$/],ine=[/(^|\/)\.env(\..+)?$/,/(^|\/)\.mcp\.json$/,/(^|\/)\.netrc$/,/(^|\/)\.npmrc$/],x$=[/\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,}/],ane=[...x$,/\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],kp=20*1024*1024;async function L$(e,t){try{let{stdout:n}=await t("git",["-C",e,"ls-files"],{timeout:1e4,maxBuffer:kp});return n.split(`
2252
+ `).filter(r=>r.length>0)}catch{return null}}async function rT(e,t,n){try{let{stdout:r}=await n("git",["-C",e,"show",`HEAD:${t}`],{timeout:1e4,maxBuffer:kp});return r}catch{return null}}async function C$(e,t=nT){let n=await L$(e,t);if(n===null)return null;let r=a=>!sne.some(c=>c.test(a)),s=n.filter(a=>one.some(c=>c.test(a))&&r(a)),o=n.filter(a=>ine.some(c=>c.test(a))&&r(a)),i=[];for(let a of o){let c=await rT(e,a,t);c!==null&&ane.some(l=>l.test(c))&&i.push(a)}return[...s,...i]}async function O$(e,t=nT){let n=await L$(e,t);if(n===null)return null;let r=n.filter(o=>o.endsWith(".lmctl")),s=[];for(let o of r){let i=await rT(e,o,t);if(i===null)continue;let a=x$.reduce((c,l)=>c+(l.test(i)?1:0),0);a>0&&s.push({path:o,matchCount:a})}return s}var cne=[/(^|\/)template\.lmctl$/i,/(^|\/)examples\/.*\.lmctl$/i],N$=/_(?:MEMBER|AGENT)_\b|\bsessionid\s*=\s*\S/;async function D$(e,t=nT){try{let[n,r]=await Promise.all([t("git",["-C",e,"ls-files"],{timeout:1e4,maxBuffer:kp}),t("git",["-C",e,"ls-files","--others","--exclude-standard"],{timeout:1e4,maxBuffer:kp})]),s=u=>!cne.some(d=>d.test(u)),o=u=>tne(u).includes(".lmctl")&&s(u),i=n.stdout.split(`
2253
2253
  `).filter(u=>u.length>0&&o(u)),a=r.stdout.split(`
2254
- `).filter(u=>u.length>0&&o(u)),c=[];for(let u of i){let d=await rT(e,u,t);d!==null&&N$.test(d)&&c.push(u)}let l=[];for(let u of a){let d;try{d=tne(rne(e,u),"utf8")}catch{continue}N$.test(d)&&l.push(u)}return{tracked:c,unprotected:l}}catch{return null}}import{execFile as une}from"node:child_process";import{statSync as $$}from"node:fs";import{homedir as dne}from"node:os";import{join as M$}from"node:path";import{promisify as fne}from"node:util";var sT=fne(une);var mne="mike.ma@lmctl.com",oT="mike-lmctl";async function P$(e,t=sT){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===mne}}var pne=6e4,Rp;async function Np(e=sT,t=Date.now(),n=$$){let r=e===sT&&n===$$;if(r&&Rp!==void 0&&t-Rp.atMs<pne)return Rp.result;let s=await _ne(e,n);return r&&(Rp={result:s,atMs:t}),s}function hne(){let e=process.env.GH_CONFIG_DIR;return e?M$(e,"hosts.yml"):M$(dne(),".config","gh","hosts.yml")}async function _ne(e,t){let n;try{n=(await e("gh",["auth","status"],{timeout:1e4})).stdout}catch(l){let u=l&&typeof l=="object"&&"stdout"in l?String(l.stdout):"";if(u.length===0)return null;n=u}let r=n.split(`
2255
- `),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(hne()).mtime.toISOString()}catch{c=null}return{account:a,matchesPolicy:a===oT,hostsFileChangedAt:c}}var gne=7*24*60*6e4,Ene=500,yne=3*60*6e4,wne=3*60*6e4,uu=4*60*6e4,Tne=24*60*6e4,vne=48*60*6e4,Sne=24*60*6e4,bne=20,aT=24*60*6e4;function Ane(e,t){let n=Ae(t);return`${t>aT?`possible ${e}`:e} as of ${n} ago (not re-observed)`}var Ine=7*24*60*6e4,kne=24*60*6e4;function Rne(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<=kne)return null}else return s!==void 0&&s_(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>Ine?{kind:"self-report",status:t.status,changedTs:t.changed_ts}:null}function Nne(e,t){let n=e.teams.filter(Q);return t===void 0?n:n.filter(r=>r.name===t)}function xne(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 xp(e,t={}){let n=e.db.db,r=t.config??xe,s=t.nowMs??Date.now(),o=Nne(e,t.team),i=t.awaitingReviewThresholdMs??I_,a=[],c=[],l=[],u=[],d=[],f=new Set(au(n,s).map(J=>J.row.subject_id).filter(J=>J!==null)),m=[],p=[],h=[],_=[],g=[],w=[],E=t.countDirtyGitFilesImpl??E$,y=[],T=t.lintTeamfileWarningsImpl??w$,v=[],A=[],I=[],N=[],x=[],R=t.findNeverTrackFilesImpl??C$,k=t.findSecretBearingTeamfilesImpl??O$,O=t.checkTeamfileTrackingImpl??D$,D=t.checkRepoGitIdentityImpl??P$,S=t.resolveMemberProviderImpl??Sr,b=t.listTeamMembersImpl??Uo,L=[],$=!1;try{L=ql(n).filter(J=>tn(n,J.provider,s).disabled)}catch{$=!0}let j=ND(n,s),F=xD(n),C=null;try{C=LD(n,s)}catch{C=null}let P=new Set(L.map(J=>J.provider)),M=[],B=e.teams.filter(Q),W=e.teams.map(J=>J.name);for(let J of o){let Ce;try{Ce=se(J)}catch{continue}let bt=await T(Ce);bt!==null&&bt.length>0&&y.push({team:J.name,warnings:bt});let ln=await R(J.repoPath);ln!==null&&ln.length>0&&v.push({team:J.name,files:ln});let Ni=await k(J.repoPath);Ni!==null&&Ni.length>0&&A.push({team:J.name,files:Ni});let Er=await O(J.repoPath);Er!==null&&(Er.tracked.length>0&&I.push({team:J.name,files:Er.tracked}),Er.unprotected.length>0&&N.push({team:J.name,files:Er.unprotected}));let Mo=await D(J.repoPath);Mo!==null&&!Mo.matchesPolicy&&x.push({team:J.name,identity:{name:Mo.name,email:Mo.email}});let yr=P.size>0?xne(J,P,b):null;if(P.size>0){let we=Yn(n,J.name),wr=we===null?J.name:we.companionTeam,kh=we===null?J.leadAlias:we.workerAlias,Nc=we===null?J.repoPath:B.find(xc=>xc.name===wr)?.repoPath??J.repoPath,Po=S({repoPath:Nc,name:wr},kh);if(Po!==null&&P.has(Po)){let xc=L.find(JB=>JB.provider===Po)?.expiresAt??null;M.push({team:J.name,provider:Po,expiresAt:xc,totalMembers:yr?.totalMembers??1,liveMembers:yr?.liveMembers??[]})}}let Ah=yi(n,J.name,s,W);Ah.length>0&&l.push({team:J.name,rows:Ah,...yr!==null&&yr.quiescedMembers.length>0?{quiescedMembers:yr.quiescedMembers,totalMembers:yr.totalMembers}:{}});let gS=Ah.filter(we=>we.row.status==="sent"||we.row.status==="retrieved");if(gS.length>0){let we=n.prepare("SELECT MAX(created_ts) AS ts FROM queue WHERE from_id = ?").get(J.name),wr=Rne(me(n,J.name),It(n,J.name),we.ts,s,J);wr!==null&&d.push({team:J.name,rows:gS,reason:wr})}let ES=Tp(n,J.name,uu,s);ES.length>0&&u.push({team:J.name,rows:ES});let xs=ze(n,Ce,J.leadAlias);if(xs===null)continue;for(let we of qi(n,xs)){let wr;try{let Nc=k$(n,we.id),Po=Ip(n,we.id).filter(xc=>!Nc.has(xc.id));Po.length>0&&(wr=Po)}catch{wr=void 0}let kh=vd(n,we.id);a.push({team:J.name,entity:we,blockedSinceTs:kh,...wr!==void 0?{roots:wr}:{}}),we.blocked_on==="operator"?f.has(`task:${we.id}`)||c.push({team:J.name,entity:we,blockedOn:"operator",reason:"operator-uncorrelated"}):we.blocked_on!==null&&!e.teams.some(Nc=>Nc.name===we.blocked_on)&&c.push({team:J.name,entity:we,blockedOn:we.blocked_on,reason:"team-unresolvable"})}for(let we of Fc(n,xs,r.cooldownMs,s))m.push({team:J.name,entity:we});for(let we of DA(n,xs,i,s))p.push({team:J.name,task:we});for(let we of $A(n,xs,s))h.push({team:J.name,task:we});for(let we of xs.entities)we.kind==="epic"&&we.needs_review===1&&Rd(we)&&_.push({team:J.name,entity:we});for(let we of xs.entities)we.kind!=="epic"||!Hi.has(be(we.status))||Sp(n,we.id)?.alreadySurfacedThisEpisode||g.push({team:J.name,entity:we});let Ih=xs.entities.filter(we=>be(we.status)==="todo");if(Ih.length>0){let we=await E(J.repoPath);we!==null&&we>0&&w.push({team:J.name,dirtyCount:we,todoCount:Ih.length,exampleEntity:Ih[0]})}}let z=await(t.fetchReportImpl??qe)(),ue=t.heavyLockImpl?t.heavyLockImpl():vn(void 0,void 0,void 0,()=>{}),X=await Bi(n,o,z,ue,r,s,{readOnly:!0}),Y=new Set(M.map(J=>J.team)),H=X.filter(J=>!Y.has(J)),V=t.findPersistentDispatchFailuresImpl??g$,{unreachable:Z,notObserved:re}=await V(n,o,z,s,uu),de=[];for(let J of H){let Ce=me(n,J);if(Ce?.miniplayer_verdict_label&&Ce.miniplayer_verdict_reason&&Ce.miniplayer_verdict_ts){let bt=It(n,J),ln=Ce.miniplayer_verdict_label!=="genuinely_done"&&bt?.status==="DONE"?{changedTs:bt.changed_ts}:void 0;de.push({team:J,label:Ce.miniplayer_verdict_label,reason:Ce.miniplayer_verdict_reason,ts:Ce.miniplayer_verdict_ts,...ln!==void 0?{selfReportedDone:ln}:{}})}}let le=[];for(let J of o){let Ce=me(n,J.name);Ce?.hung_holder_flagged_ts&&Ce.hung_holder_reason&&le.push({team:J.name,reason:Ce.hung_holder_reason,flaggedTs:Ce.hung_holder_flagged_ts})}let ie=eb(n).map(J=>({team:J.team,reason:J.reason,detail:J.detail,suspendedAt:J.suspended_at})),ye=t.blockedSelfReportUrgentThresholdMs??Tne,_e=t.blockedSelfReportUnconfirmedThresholdMs??vne,ee=[];for(let J of o){let Ce=It(n,J.name);if(Ce?.status==="BLOCKED"){let bt=s-Date.parse(Ce.changed_ts),ln=bt>=_e;ee.push({team:J.name,changedTs:Ce.changed_ts,ageMs:bt,urgent:!ln&&bt>=ye,unconfirmed:ln})}}ee.sort((J,Ce)=>Ce.ageMs-J.ageMs);let ge=t.orphanReapCandidateWindowMs??gne,at=new Date(s-ge).toISOString(),gr=Ku(n,gw,at,Ene).filter(J=>t.team===void 0||J.team===t.team).map(J=>({team:J.team,ts:J.ts,reason:J.note??"(no reason recorded)"})),Lt=t.maintainer===void 0?null:[...Rt(n,t.maintainer),...Ed(n,t.maintainer)].sort((J,Ce)=>J.id-Ce.id).filter(J=>J.from_id!=="autopilot"),K=t.maintainer===void 0?[]:HD(n,t.maintainer,s).map(J=>({row:J.row,constituentCount:Ei(n,J.row)})),St=t.maintainer===void 0?[]:au(n,s).map(J=>{let Ce=Ei(n,J.row),bt=iu(n,J.row),ln=J.ageMs>=uu||Ce>=2&&J.row.sent_ts===null;return{row:J.row,constituentCount:Ce,retractedCount:bt,urgent:ln}}),Bt=t.maintainerStaleThresholdMs??yne,Jt=[];if(t.maintainer!==void 0&&Lt!==null){let Ce=me(n,t.maintainer)?.last_cli_activity_ts??null,bt=lO(Ce,s),ln=!pw(Ce,Bt,s),Ni=Lt[0],Er=Ni?s-Date.parse(Ni.created_ts):null,Mo=Er!==null&&Er>Bt;if(ln||Mo){let yr=[];ln&&yr.push(Ce===null?"no CLI activity ever recorded":`no CLI activity in ${Ae(bt)}`),Mo&&yr.push(`oldest queued item is ${Ae(Er)} old`),Jt.push({team:t.maintainer,reason:yr.join("; "),ageMs:bt===null?1/0:Math.max(bt,Er??0)})}}let Hn;if(t.team===void 0)Hn=a.map(J=>J.entity);else{Hn=[];for(let J of e.teams.filter(Q)){let Ce;try{Ce=se(J)}catch{continue}let bt=ze(n,Ce,J.leadAlias);bt!==null&&Hn.push(...qi(n,bt))}}let An=R$(n,Hn,e.teams),Ns=T$(n),ts=S$(n,e.teams),Ri=b$(n),cn=[];for(let J of e.teams.filter(Q)){try{se(J)}catch{continue}s_(J)===0&&cn.push({team:J.name,repoPath:J.repoPath})}let $o=t.stuckProcessingThresholdMs??wne,Rc=t.stuckProcessingMaxAgeMs??Sne,Wu=t.maintainer!==void 0&&t.stuckProcessingFleetWide!==!0?t.maintainer:void 0,bh=jD(n,{minAgeMs:$o,maxAgeMs:Rc,fromId:Wu},s).map(J=>({queueId:J.row.id,fromId:J.row.from_id,toId:J.row.to_id,ageMs:J.ageMs,constituentCount:Ei(n,J.row)}));return{blocked:a,blockedOnUnresolved:c,owedAnswers:l,recentlyAnsweredForSender:u,parkedTeamsWithOwedPrompts:d,awaitingDecision:m,awaitingReview:p,stalled:H,stalledVerdicts:de,hungHolders:le,autoNudgeSuspended:ie,blockedSelfReports:ee,flaggedEpics:_,closedEpicsToReview:g,orphanReapCandidates:gr,maintainerStale:Jt,blockingRoots:An,epicsWithoutOwner:Ns,unresolvableOwnerEntities:ts,untrackedBlockers:Ri,unseededTeams:cn,stuckProcessing:bh,inbox:Lt,memory:(t.readMemoryAvailabilityImpl??Pc)(),operatorPrompts:K,operatorEscalations:St,uncommittedWork:w,teamfileLintWarnings:y,expiredHolds:h,neverTrackFiles:v,secretBearingTeamfiles:A,trackedTeamfiles:I,unprotectedTeamfiles:N,gitIdentityMismatches:x,activeGhAccount:await(t.checkActiveGhAccountImpl??Np)(),disabledProviders:L,providerDisableReadFailed:$,quiescedByProviderDisable:M,staleAutoScanPause:C,persistentDispatchFailures:Z,notObserved:re,rateLimitPolicyHealth:j,rateLimitLevelWarnings:F}}function iT(e){return` ${e.team}: #${e.entity.id} ("${e.entity.title}")`}function U$(e){return e.length===0?"":`
2254
+ `).filter(u=>u.length>0&&o(u)),c=[];for(let u of i){let d=await rT(e,u,t);d!==null&&N$.test(d)&&c.push(u)}let l=[];for(let u of a){let d;try{d=ene(nne(e,u),"utf8")}catch{continue}N$.test(d)&&l.push(u)}return{tracked:c,unprotected:l}}catch{return null}}import{execFile as lne}from"node:child_process";import{statSync as $$}from"node:fs";import{homedir as une}from"node:os";import{join as M$}from"node:path";import{promisify as dne}from"node:util";var sT=dne(lne);var fne="mike.ma@lmctl.com",oT="mike-lmctl";async function P$(e,t=sT){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===fne}}var mne=6e4,Rp;async function Np(e=sT,t=Date.now(),n=$$){let r=e===sT&&n===$$;if(r&&Rp!==void 0&&t-Rp.atMs<mne)return Rp.result;let s=await hne(e,n);return r&&(Rp={result:s,atMs:t}),s}function pne(){let e=process.env.GH_CONFIG_DIR;return e?M$(e,"hosts.yml"):M$(une(),".config","gh","hosts.yml")}async function hne(e,t){let n;try{n=(await e("gh",["auth","status"],{timeout:1e4})).stdout}catch(l){let u=l&&typeof l=="object"&&"stdout"in l?String(l.stdout):"";if(u.length===0)return null;n=u}let r=n.split(`
2255
+ `),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(pne()).mtime.toISOString()}catch{c=null}return{account:a,matchesPolicy:a===oT,hostsFileChangedAt:c}}var _ne=7*24*60*6e4,gne=500,Ene=3*60*6e4,yne=3*60*6e4,uu=4*60*6e4,wne=24*60*6e4,Tne=48*60*6e4,vne=24*60*6e4,Sne=20,aT=24*60*6e4;function bne(e,t){let n=Ae(t);return`${t>aT?`possible ${e}`:e} as of ${n} ago (not re-observed)`}var Ane=7*24*60*6e4,Ine=24*60*6e4;function kne(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<=Ine)return null}else return s!==void 0&&s_(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>Ane?{kind:"self-report",status:t.status,changedTs:t.changed_ts}:null}function Rne(e,t){let n=e.teams.filter(Q);return t===void 0?n:n.filter(r=>r.name===t)}function Nne(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 xp(e,t={}){let n=e.db.db,r=t.config??xe,s=t.nowMs??Date.now(),o=Rne(e,t.team),i=t.awaitingReviewThresholdMs??I_,a=[],c=[],l=[],u=[],d=[],f=new Set(au(n,s).map(J=>J.row.subject_id).filter(J=>J!==null)),m=[],p=[],h=[],_=[],g=[],w=[],E=t.countDirtyGitFilesImpl??E$,y=[],T=t.lintTeamfileWarningsImpl??w$,v=[],A=[],I=[],N=[],x=[],R=t.findNeverTrackFilesImpl??C$,k=t.findSecretBearingTeamfilesImpl??O$,O=t.checkTeamfileTrackingImpl??D$,D=t.checkRepoGitIdentityImpl??P$,S=t.resolveMemberProviderImpl??Sr,b=t.listTeamMembersImpl??Uo,L=[],$=!1;try{L=ql(n).filter(J=>tn(n,J.provider,s).disabled)}catch{$=!0}let j=ND(n,s),F=xD(n),C=null;try{C=LD(n,s)}catch{C=null}let P=new Set(L.map(J=>J.provider)),M=[],B=e.teams.filter(Q),W=e.teams.map(J=>J.name);for(let J of o){let Ce;try{Ce=se(J)}catch{continue}let bt=await T(Ce);bt!==null&&bt.length>0&&y.push({team:J.name,warnings:bt});let ln=await R(J.repoPath);ln!==null&&ln.length>0&&v.push({team:J.name,files:ln});let Ni=await k(J.repoPath);Ni!==null&&Ni.length>0&&A.push({team:J.name,files:Ni});let Er=await O(J.repoPath);Er!==null&&(Er.tracked.length>0&&I.push({team:J.name,files:Er.tracked}),Er.unprotected.length>0&&N.push({team:J.name,files:Er.unprotected}));let Mo=await D(J.repoPath);Mo!==null&&!Mo.matchesPolicy&&x.push({team:J.name,identity:{name:Mo.name,email:Mo.email}});let yr=P.size>0?Nne(J,P,b):null;if(P.size>0){let we=Yn(n,J.name),wr=we===null?J.name:we.companionTeam,kh=we===null?J.leadAlias:we.workerAlias,Nc=we===null?J.repoPath:B.find(xc=>xc.name===wr)?.repoPath??J.repoPath,Po=S({repoPath:Nc,name:wr},kh);if(Po!==null&&P.has(Po)){let xc=L.find(JB=>JB.provider===Po)?.expiresAt??null;M.push({team:J.name,provider:Po,expiresAt:xc,totalMembers:yr?.totalMembers??1,liveMembers:yr?.liveMembers??[]})}}let Ah=yi(n,J.name,s,W);Ah.length>0&&l.push({team:J.name,rows:Ah,...yr!==null&&yr.quiescedMembers.length>0?{quiescedMembers:yr.quiescedMembers,totalMembers:yr.totalMembers}:{}});let gS=Ah.filter(we=>we.row.status==="sent"||we.row.status==="retrieved");if(gS.length>0){let we=n.prepare("SELECT MAX(created_ts) AS ts FROM queue WHERE from_id = ?").get(J.name),wr=kne(me(n,J.name),It(n,J.name),we.ts,s,J);wr!==null&&d.push({team:J.name,rows:gS,reason:wr})}let ES=Tp(n,J.name,uu,s);ES.length>0&&u.push({team:J.name,rows:ES});let xs=ze(n,Ce,J.leadAlias);if(xs===null)continue;for(let we of qi(n,xs)){let wr;try{let Nc=k$(n,we.id),Po=Ip(n,we.id).filter(xc=>!Nc.has(xc.id));Po.length>0&&(wr=Po)}catch{wr=void 0}let kh=vd(n,we.id);a.push({team:J.name,entity:we,blockedSinceTs:kh,...wr!==void 0?{roots:wr}:{}}),we.blocked_on==="operator"?f.has(`task:${we.id}`)||c.push({team:J.name,entity:we,blockedOn:"operator",reason:"operator-uncorrelated"}):we.blocked_on!==null&&!e.teams.some(Nc=>Nc.name===we.blocked_on)&&c.push({team:J.name,entity:we,blockedOn:we.blocked_on,reason:"team-unresolvable"})}for(let we of Fc(n,xs,r.cooldownMs,s))m.push({team:J.name,entity:we});for(let we of DA(n,xs,i,s))p.push({team:J.name,task:we});for(let we of $A(n,xs,s))h.push({team:J.name,task:we});for(let we of xs.entities)we.kind==="epic"&&we.needs_review===1&&Rd(we)&&_.push({team:J.name,entity:we});for(let we of xs.entities)we.kind!=="epic"||!Hi.has(be(we.status))||Sp(n,we.id)?.alreadySurfacedThisEpisode||g.push({team:J.name,entity:we});let Ih=xs.entities.filter(we=>be(we.status)==="todo");if(Ih.length>0){let we=await E(J.repoPath);we!==null&&we>0&&w.push({team:J.name,dirtyCount:we,todoCount:Ih.length,exampleEntity:Ih[0]})}}let z=await(t.fetchReportImpl??qe)(),ue=t.heavyLockImpl?t.heavyLockImpl():vn(void 0,void 0,void 0,()=>{}),X=await Bi(n,o,z,ue,r,s,{readOnly:!0}),Y=new Set(M.map(J=>J.team)),H=X.filter(J=>!Y.has(J)),V=t.findPersistentDispatchFailuresImpl??g$,{unreachable:Z,notObserved:re}=await V(n,o,z,s,uu),de=[];for(let J of H){let Ce=me(n,J);if(Ce?.miniplayer_verdict_label&&Ce.miniplayer_verdict_reason&&Ce.miniplayer_verdict_ts){let bt=It(n,J),ln=Ce.miniplayer_verdict_label!=="genuinely_done"&&bt?.status==="DONE"?{changedTs:bt.changed_ts}:void 0;de.push({team:J,label:Ce.miniplayer_verdict_label,reason:Ce.miniplayer_verdict_reason,ts:Ce.miniplayer_verdict_ts,...ln!==void 0?{selfReportedDone:ln}:{}})}}let le=[];for(let J of o){let Ce=me(n,J.name);Ce?.hung_holder_flagged_ts&&Ce.hung_holder_reason&&le.push({team:J.name,reason:Ce.hung_holder_reason,flaggedTs:Ce.hung_holder_flagged_ts})}let ie=eb(n).map(J=>({team:J.team,reason:J.reason,detail:J.detail,suspendedAt:J.suspended_at})),ye=t.blockedSelfReportUrgentThresholdMs??wne,_e=t.blockedSelfReportUnconfirmedThresholdMs??Tne,ee=[];for(let J of o){let Ce=It(n,J.name);if(Ce?.status==="BLOCKED"){let bt=s-Date.parse(Ce.changed_ts),ln=bt>=_e;ee.push({team:J.name,changedTs:Ce.changed_ts,ageMs:bt,urgent:!ln&&bt>=ye,unconfirmed:ln})}}ee.sort((J,Ce)=>Ce.ageMs-J.ageMs);let ge=t.orphanReapCandidateWindowMs??_ne,at=new Date(s-ge).toISOString(),gr=Ku(n,gw,at,gne).filter(J=>t.team===void 0||J.team===t.team).map(J=>({team:J.team,ts:J.ts,reason:J.note??"(no reason recorded)"})),Lt=t.maintainer===void 0?null:[...Rt(n,t.maintainer),...Ed(n,t.maintainer)].sort((J,Ce)=>J.id-Ce.id).filter(J=>J.from_id!=="autopilot"),K=t.maintainer===void 0?[]:HD(n,t.maintainer,s).map(J=>({row:J.row,constituentCount:Ei(n,J.row)})),St=t.maintainer===void 0?[]:au(n,s).map(J=>{let Ce=Ei(n,J.row),bt=iu(n,J.row),ln=J.ageMs>=uu||Ce>=2&&J.row.sent_ts===null;return{row:J.row,constituentCount:Ce,retractedCount:bt,urgent:ln}}),Bt=t.maintainerStaleThresholdMs??Ene,Jt=[];if(t.maintainer!==void 0&&Lt!==null){let Ce=me(n,t.maintainer)?.last_cli_activity_ts??null,bt=lO(Ce,s),ln=!pw(Ce,Bt,s),Ni=Lt[0],Er=Ni?s-Date.parse(Ni.created_ts):null,Mo=Er!==null&&Er>Bt;if(ln||Mo){let yr=[];ln&&yr.push(Ce===null?"no CLI activity ever recorded":`no CLI activity in ${Ae(bt)}`),Mo&&yr.push(`oldest queued item is ${Ae(Er)} old`),Jt.push({team:t.maintainer,reason:yr.join("; "),ageMs:bt===null?1/0:Math.max(bt,Er??0)})}}let Hn;if(t.team===void 0)Hn=a.map(J=>J.entity);else{Hn=[];for(let J of e.teams.filter(Q)){let Ce;try{Ce=se(J)}catch{continue}let bt=ze(n,Ce,J.leadAlias);bt!==null&&Hn.push(...qi(n,bt))}}let An=R$(n,Hn,e.teams),Ns=T$(n),ts=S$(n,e.teams),Ri=b$(n),cn=[];for(let J of e.teams.filter(Q)){try{se(J)}catch{continue}s_(J)===0&&cn.push({team:J.name,repoPath:J.repoPath})}let $o=t.stuckProcessingThresholdMs??yne,Rc=t.stuckProcessingMaxAgeMs??vne,Wu=t.maintainer!==void 0&&t.stuckProcessingFleetWide!==!0?t.maintainer:void 0,bh=jD(n,{minAgeMs:$o,maxAgeMs:Rc,fromId:Wu},s).map(J=>({queueId:J.row.id,fromId:J.row.from_id,toId:J.row.to_id,ageMs:J.ageMs,constituentCount:Ei(n,J.row)}));return{blocked:a,blockedOnUnresolved:c,owedAnswers:l,recentlyAnsweredForSender:u,parkedTeamsWithOwedPrompts:d,awaitingDecision:m,awaitingReview:p,stalled:H,stalledVerdicts:de,hungHolders:le,autoNudgeSuspended:ie,blockedSelfReports:ee,flaggedEpics:_,closedEpicsToReview:g,orphanReapCandidates:gr,maintainerStale:Jt,blockingRoots:An,epicsWithoutOwner:Ns,unresolvableOwnerEntities:ts,untrackedBlockers:Ri,unseededTeams:cn,stuckProcessing:bh,inbox:Lt,memory:(t.readMemoryAvailabilityImpl??Pc)(),operatorPrompts:K,operatorEscalations:St,uncommittedWork:w,teamfileLintWarnings:y,expiredHolds:h,neverTrackFiles:v,secretBearingTeamfiles:A,trackedTeamfiles:I,unprotectedTeamfiles:N,gitIdentityMismatches:x,activeGhAccount:await(t.checkActiveGhAccountImpl??Np)(),disabledProviders:L,providerDisableReadFailed:$,quiescedByProviderDisable:M,staleAutoScanPause:C,persistentDispatchFailures:Z,notObserved:re,rateLimitPolicyHealth:j,rateLimitLevelWarnings:F}}function iT(e){return` ${e.team}: #${e.entity.id} ("${e.entity.title}")`}function U$(e){return e.length===0?"":`
2256
2256
  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} (${Le(n.row.created_ts)}, via ${n.matchedTeam})`).join("; ")}`}function du(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 ${Ae(c-Date.parse(f.row.created_ts))} ago, unanswered`+(f.constituentCount>1?` (${f.constituentCount} merged into this one)`:"")),u=e.operatorPrompts.reduce((f,m)=>f+m.constituentCount,0),d=u===e.operatorPrompts.length?`${e.operatorPrompts.length}`:`${u} in ${e.operatorPrompts.length} thread${e.operatorPrompts.length===1?"":"s"}`;n.push(`OPERATOR MESSAGE, UNANSWERED (${d}):
2257
2257
  ${l.join(`
2258
2258
  `)}`)}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 ${Ae(c-Date.parse(m.row.created_ts))} ago, unanswered${p}`},u=m=>{let p=m.reduce((h,_)=>h+_.constituentCount,0);return p===m.length?`${m.length}`:`${p} in ${m.length} thread${m.length===1?"":"s"}`},d=e.operatorEscalations.filter(m=>m.urgent),f=e.operatorEscalations.filter(m=>!m.urgent);d.length>0&&n.push(`ESCALATED TO OPERATOR, URGENT (${u(d)}) -- past 4h old or an undelivered pileup:
2259
2259
  ${d.map(l).join(`
2260
2260
  `)}`),f.length>0&&n.push(`ESCALATED TO OPERATOR, UNANSWERED (${u(f)}):
2261
2261
  ${f.map(l).join(`
2262
- `)}`)}if(e.persistentDispatchFailures.length>0){let c=e.persistentDispatchFailures.map(l=>{if(l.kind==="flapping"){let d=Ae(l.windowMs);return` ${l.team}: flapping -- ${l.occurrenceCount} occurrences of ${l.mostRecentStatus} in the last ${d}, most recently at ${l.mostRecentAt}`}let u=Ane(l.status,l.ageMs);if(l.status==="NO-OUTPUT"&&l.cause!==null){let d=l.cause.sessionResolves?"dispatch completes, session resolves; cause unknown":`session not found${l.cause.provider?` (provider=${l.cause.provider})`:""}; member needs a refresh`;return` ${l.team}: ${u} -- ${d}`}return` ${l.team}: ${u}`});n.push(`UNREACHABLE (${e.persistentDispatchFailures.length}):
2262
+ `)}`)}if(e.persistentDispatchFailures.length>0){let c=e.persistentDispatchFailures.map(l=>{if(l.kind==="flapping"){let d=Ae(l.windowMs);return` ${l.team}: flapping -- ${l.occurrenceCount} occurrences of ${l.mostRecentStatus} in the last ${d}, most recently at ${l.mostRecentAt}`}let u=bne(l.status,l.ageMs);if(l.status==="NO-OUTPUT"&&l.cause!==null){let d=l.cause.sessionResolves?"dispatch completes, session resolves; cause unknown":`session not found${l.cause.provider?` (provider=${l.cause.provider})`:""}; member needs a refresh`;return` ${l.team}: ${u} -- ${d}`}return` ${l.team}: ${u}`});n.push(`UNREACHABLE (${e.persistentDispatchFailures.length}):
2263
2263
  ${c.join(`
2264
2264
  `)}`)}if(e.notObserved.length>0){let c=e.notObserved.map(l=>{let u=Ae(l.ageMs),d=l.ageMs>aT?`possible ${l.status}`:l.status;return` ${l.team}: last checked ${u} ago, ${d} then -- ${cu(l.suspension)}`});n.push(`NOT OBSERVED (${e.notObserved.length}):
2265
2265
  ${c.join(`
@@ -2326,7 +2326,7 @@ ${c.join(`
2326
2326
  ${c.join(`
2327
2327
  `)}`)}if(e.unseededTeams.length>0){let c=e.unseededTeams.map(l=>` ${l.team} (${l.repoPath}) -- seed it (\`lctl seed\`), not a nudge or state set`);n.push(`UNSEEDED (${e.unseededTeams.length}) -- no sessionid on any _MEMBER_ line, nothing can ever reach these:
2328
2328
  ${c.join(`
2329
- `)}`)}if(e.stuckProcessing.length>0){let c=e.stuckProcessing.slice(0,bne),l=c.map(f=>` #${f.queueId} ${f.fromId} -> ${f.toId} -- processing for ${Ae(f.ageMs)}, no answer`+(f.constituentCount>1?` (${f.constituentCount} merged into this one)`:"")),u=e.stuckProcessing.length-c.length,d=u>0?`
2329
+ `)}`)}if(e.stuckProcessing.length>0){let c=e.stuckProcessing.slice(0,Sne),l=c.map(f=>` #${f.queueId} ${f.fromId} -> ${f.toId} -- processing for ${Ae(f.ageMs)}, no answer`+(f.constituentCount>1?` (${f.constituentCount} merged into this one)`:"")),u=e.stuckProcessing.length-c.length,d=u>0?`
2330
2330
  ...and ${u} more (use --json for the full list)`:"";n.push(`stuck processing (${e.stuckProcessing.length}):
2331
2331
  ${l.join(`
2332
2332
  `)}${d}`)}if(e.maintainerStale.length>0){let c=e.maintainerStale.map(l=>` ${l.team}: ${l.reason}`);n.push(`maintainer stale (${e.maintainerStale.length}):
@@ -2341,22 +2341,22 @@ ${s}`;if(e.activeGhAccount===null||e.activeGhAccount.matchesPolicy)return o;let
2341
2341
 
2342
2342
  ${o}`}async function F$(e,t,n,r={}){let s={db:{path:"",db:e,close:()=>{}},teamsConfPath:"",teams:[...t]},o=await xp(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??Pc)(),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(u=>u.kind!=="continuous")&&o.parkedTeamsWithOwedPrompts.length===0&&o.rateLimitPolicyHealth===null,c=hd(i),l=c===null?du(o):`${du(o)}
2343
2343
 
2344
- ${c}`;return{attention:o,memory:i,isEmpty:a,rendered:l}}var Dne=18e5,$ne={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 j$(e){let t=e.fetchReport??qe,n=e.readHeavyLockStatusImpl??vn,r=e.heavyLockStatusPath??Wa(),s=e.heavyLockPath??Ga(),o=e.maintainerWakeImpl??t$,i=e.autoContinueImpl??ZD,a=e.surfaceUnknownImpl??h$,c=e.surfaceBlockedImpl??r$,l=e.surfaceDoneConsistencyImpl??u$,u=e.surfaceUnresolvableTeamfilesImpl??s$,d=e.surfaceFaultImpl??f$,f=e.surfaceClosedEpicsImpl??i$,m=e.escalateImpl??ED,p=e.autoRedeliverImpl??yD,h=e.wakeImpl??wD,_=e.evaluateCronJobsImpl??cD,g=e.miniplayerVerifyImpl??NO,w=e.hungHolderCheckImpl??gO,E=e.epicReviewImpl??IO,y=e.orphanReconcilerImpl??SO,T=e.hangProbeCollectImpl??AO,v=e.rateLimitCollectImpl??bD,A=e.rateLimitPolicyImpl??kD,I=e.assembleWakeReportImpl??F$,N=e.existsSyncImpl??Lne,x=e.statSyncImpl??One,R=e.config??xe,k=e.escalation??Bw,O=e.autoRedeliver??Ww,D=e.wake??Gw,S=e.intervalMs??Dne,b=null,L=!1,$=0;async function j(){if(L)return $+=1,($===1||$%12===0)&&process.stderr.write(`[cron] tick skipped: the previous tick is still running (${$} interval fire${$===1?"":"s"} dropped since cron last evaluated)
2345
- `),$ne;L=!0;try{let F=e.getTeams(),C=F.filter(Q),P;try{P=await t(void 0,{reconcile:!0}),_D(P,new Date().toISOString())}catch(K){throw gD(K instanceof Error?K.message:String(K),new Date().toISOString()),K}let M=Date.now(),B=n(r,s,void 0,K=>{e.onError?.(K)}),W=od(e.db,C,P),{stalled:ne,continueEligible:z}=await jA(e.db,C,P,B,R,M);if(e.miniplayerVerify)try{await g(e.db,ne,C,e.miniplayerVerify)}catch(K){e.onError?.(K)}let ue=new Set(ne);for(let K of C)!ue.has(K.name)&&me(e.db,K.name)?.miniplayer_verdict_label&&zS(e.db,K.name);if(e.hungHolderCheck)try{let K=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,C,{...K,...e.hungHolderCheck})}catch(K){e.onError?.(K)}if(e.orphanReconciler)try{let K=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 y(e.db,F,P,{...K,...e.orphanReconciler})}catch(K){e.onError?.(K)}if(e.hangProbeCollect)try{T(e.db,e.hangProbeCollect)}catch(K){e.onError?.(K)}if(e.autoNudgeRedirectReview)try{let K=e.findDueAutoNudgeReviewsImpl??iO,St=new Map(C.map(cn=>[cn.name,cn.repoPath])),Bt=new Map(C.map(cn=>[cn.name,cn])),Jt=await K(e.db,St,M),Hn=e.buildReviewMessageImpl??cO,An=e.resetShiftImpl??aO,Ns=e.enqueueImpl??De,ts=e.checkProviderDisabledImpl??tn,Ri=e.resolveMemberProviderImpl??Sr;for(let cn of Jt)try{let $o=St.get(cn.team);if($o===void 0)continue;let Rc=Bt.get(cn.team),Wu=Rc===void 0?null:Ri(Rc,Rc.leadAlias);if(Wu!==null&&ts(e.db,Wu,M).disabled)continue;let bh=await Hn(cn,$o);Ns(e.db,F,cn.team,bh,{from:"autopilot"}),await An(e.db,cn.team,$o,new Date(M).toISOString())}catch($o){e.onError?.($o)}}catch(K){e.onError?.(K)}if(e.epicReview)try{await E(e.db,F,e.epicReview)}catch(K){e.onError?.(K)}let X=!1;if(e.maintainerWake)try{let K={cooldownMs:R.cooldownMs,...e.maintainerWake};if(K.sessionAlivePath!==void 0){let St=$a(K.sessionAlivePath,K.sessionAliveFreshnessMs,K.activityFreshnessMs!==void 0?me(e.db,K.teamName)?.last_cli_activity_ts??null:null,K.activityFreshnessMs,{existsSyncImpl:N,statSyncImpl:x,nowMs:M}),Bt,Jt;try{let An=await I(e.db,F,K.teamName,{nowMs:M,config:R,fetchReportImpl:async()=>P,heavyLockImpl:()=>B,...K.maintainerStaleThresholdMs!==void 0?{maintainerStaleThresholdMs:K.maintainerStaleThresholdMs}:{}});Bt=An.rendered,Jt=An.isEmpty}catch(An){e.onError?.(An),Bt="wake-report assembly failed this tick -- waking conservatively; check server logs for the error.",Jt=!1}let Hn=An=>`${Cne(An,"utf8")}
2344
+ ${c}`;return{attention:o,memory:i,isEmpty:a,rendered:l}}var One=18e5,Dne={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 j$(e){let t=e.fetchReport??qe,n=e.readHeavyLockStatusImpl??vn,r=e.heavyLockStatusPath??Wa(),s=e.heavyLockPath??Ga(),o=e.maintainerWakeImpl??t$,i=e.autoContinueImpl??ZD,a=e.surfaceUnknownImpl??h$,c=e.surfaceBlockedImpl??r$,l=e.surfaceDoneConsistencyImpl??u$,u=e.surfaceUnresolvableTeamfilesImpl??s$,d=e.surfaceFaultImpl??f$,f=e.surfaceClosedEpicsImpl??i$,m=e.escalateImpl??ED,p=e.autoRedeliverImpl??yD,h=e.wakeImpl??wD,_=e.evaluateCronJobsImpl??cD,g=e.miniplayerVerifyImpl??NO,w=e.hungHolderCheckImpl??gO,E=e.epicReviewImpl??IO,y=e.orphanReconcilerImpl??SO,T=e.hangProbeCollectImpl??AO,v=e.rateLimitCollectImpl??bD,A=e.rateLimitPolicyImpl??kD,I=e.assembleWakeReportImpl??F$,N=e.existsSyncImpl??xne,x=e.statSyncImpl??Cne,R=e.config??xe,k=e.escalation??Bw,O=e.autoRedeliver??Ww,D=e.wake??Gw,S=e.intervalMs??One,b=null,L=!1,$=0;async function j(){if(L)return $+=1,($===1||$%12===0)&&process.stderr.write(`[cron] tick skipped: the previous tick is still running (${$} interval fire${$===1?"":"s"} dropped since cron last evaluated)
2345
+ `),Dne;L=!0;try{let F=e.getTeams(),C=F.filter(Q),P;try{P=await t(void 0,{reconcile:!0}),_D(P,new Date().toISOString())}catch(K){throw gD(K instanceof Error?K.message:String(K),new Date().toISOString()),K}let M=Date.now(),B=n(r,s,void 0,K=>{e.onError?.(K)}),W=od(e.db,C,P),{stalled:ne,continueEligible:z}=await jA(e.db,C,P,B,R,M);if(e.miniplayerVerify)try{await g(e.db,ne,C,e.miniplayerVerify)}catch(K){e.onError?.(K)}let ue=new Set(ne);for(let K of C)!ue.has(K.name)&&me(e.db,K.name)?.miniplayer_verdict_label&&zS(e.db,K.name);if(e.hungHolderCheck)try{let K=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,C,{...K,...e.hungHolderCheck})}catch(K){e.onError?.(K)}if(e.orphanReconciler)try{let K=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 y(e.db,F,P,{...K,...e.orphanReconciler})}catch(K){e.onError?.(K)}if(e.hangProbeCollect)try{T(e.db,e.hangProbeCollect)}catch(K){e.onError?.(K)}if(e.autoNudgeRedirectReview)try{let K=e.findDueAutoNudgeReviewsImpl??iO,St=new Map(C.map(cn=>[cn.name,cn.repoPath])),Bt=new Map(C.map(cn=>[cn.name,cn])),Jt=await K(e.db,St,M),Hn=e.buildReviewMessageImpl??cO,An=e.resetShiftImpl??aO,Ns=e.enqueueImpl??De,ts=e.checkProviderDisabledImpl??tn,Ri=e.resolveMemberProviderImpl??Sr;for(let cn of Jt)try{let $o=St.get(cn.team);if($o===void 0)continue;let Rc=Bt.get(cn.team),Wu=Rc===void 0?null:Ri(Rc,Rc.leadAlias);if(Wu!==null&&ts(e.db,Wu,M).disabled)continue;let bh=await Hn(cn,$o);Ns(e.db,F,cn.team,bh,{from:"autopilot"}),await An(e.db,cn.team,$o,new Date(M).toISOString())}catch($o){e.onError?.($o)}}catch(K){e.onError?.(K)}if(e.epicReview)try{await E(e.db,F,e.epicReview)}catch(K){e.onError?.(K)}let X=!1;if(e.maintainerWake)try{let K={cooldownMs:R.cooldownMs,...e.maintainerWake};if(K.sessionAlivePath!==void 0){let St=$a(K.sessionAlivePath,K.sessionAliveFreshnessMs,K.activityFreshnessMs!==void 0?me(e.db,K.teamName)?.last_cli_activity_ts??null:null,K.activityFreshnessMs,{existsSyncImpl:N,statSyncImpl:x,nowMs:M}),Bt,Jt;try{let An=await I(e.db,F,K.teamName,{nowMs:M,config:R,fetchReportImpl:async()=>P,heavyLockImpl:()=>B,...K.maintainerStaleThresholdMs!==void 0?{maintainerStaleThresholdMs:K.maintainerStaleThresholdMs}:{}});Bt=An.rendered,Jt=An.isEmpty}catch(An){e.onError?.(An),Bt="wake-report assembly failed this tick -- waking conservatively; check server logs for the error.",Jt=!1}let Hn=An=>`${Lne(An,"utf8")}
2346
2346
 
2347
2347
  ---
2348
- ${Bt}`;X=o(e.db,C,P,K,Hn,M,St?void 0:!Jt)}else X=o(e.db,C,P,K,void 0,M)}catch(K){e.onError?.(K)}let Y=[];if(e.autoContinue&&Eo(e.db)===null)try{Y=await i(e.db,C,P,{config:R,...e.autoContinue,nowMs:M,stalledTeamNames:z,heavyLockStatusPath:r,heavyLockPath:s,readHeavyLockStatusImpl:n})}catch(K){e.onError?.(K)}let H=[];if(e.maintainerWake)try{H=await a(e.db,ne,e.maintainerWake.teamName,F,R,M)}catch(K){e.onError?.(K)}let V=[];if(e.maintainerWake)try{V=await c(e.db,C,e.maintainerWake.teamName,F,R,M)}catch(K){e.onError?.(K)}let Z=[];if(e.maintainerWake)try{Z=await l(e.db,C,e.maintainerWake.teamName,F,R)}catch(K){e.onError?.(K)}let re=[];if(e.maintainerWake)try{re=await d(e.db,C,e.maintainerWake.teamName,F,R,M)}catch(K){e.onError?.(K)}let de=[];if(e.maintainerWake)try{de=await f(e.db,C,e.maintainerWake.teamName,F,R,M)}catch(K){e.onError?.(K)}let le=[];if(e.maintainerWake)try{le=await u(e.db,C,e.maintainerWake.teamName,F,R,M)}catch(K){e.onError?.(K)}let ie=[];try{ie=await _(e.db,F,M,{onJobError:(K,St)=>e.onError?.(St),tick:{intervalMs:S,skippedOverlaps:$,atMs:Date.now()}}),$=0}catch(K){e.onError?.(K)}let ye=[];try{ye=await m(e.db,C,k,M)}catch(K){e.onError?.(K)}let _e=[];try{_e=p(e.db,C,O,M)}catch(K){e.onError?.(K)}let ee=[];try{ee=h(e.db,C,P,D,M)}catch(K){e.onError?.(K)}let ge=null,at=[],_t=e.rateLimitPolicy??e.rateLimitAutomation,gr=e.rateLimitCollect??_t;if(gr!==void 0){let K=Date.now();try{ge=await v(e.db,{nowMs:K,...gr})}catch(St){e.onError?.(St)}try{at=A(e.db,{nowMs:K,..._t,dryRun:_t===void 0})}catch(St){e.onError?.(St)}}let Lt={watch:W,stalled:ne,maintainerWoken:X,autoContinued:Y,surfacedUnknown:H,surfacedBlocked:V,surfacedDoneConsistency:Z,surfacedUnresolvableTeamfiles:le,surfacedFault:re,surfacedClosedEpics:de,escalated:ye,autoRedelivered:_e,woken:ee,firedCronJobs:ie,rateLimitCollected:ge,rateLimitPolicyEvaluations:at};return e.onTick?.(Lt),Lt}catch(F){throw e.onError?.(F),F}finally{L=!1}}return{start(){b||(b=setInterval(()=>{j().catch(()=>{})},S),b.unref())},stop(){b&&(clearInterval(b),b=null)},runTickNow:j,isRunning:()=>b!==null,isTicking:()=>L}}import{closeSync as Mne,linkSync as Pne,openSync as Une,readdirSync as Fne,readFileSync as Cp,readlinkSync as jne,realpathSync as Hne,renameSync as H$,unlinkSync as dT,writeSync as qne}from"node:fs";import{dirname as Bne,join as Wne}from"node:path";var yo=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 fu(e){return e===":memory:"?null:`${e}.lock`}function B$(e){let t=lr(e);return t.kind==="held"?t.identity:null}function q$(e){let t;try{t=Cp(e,"utf8")}catch(s){return s.code==="ENOENT"?{kind:"free"}:{kind:"unknown"}}let n=Zh(t);if(!n)return{kind:"unknown"};let r={...n,bootId:n.bootId??null};return uT(r)?{kind:"held",identity:r}:{kind:"free"}}function Gne(e,t){let n;try{n=Hne(t)}catch{return!1}let r;try{r=Fne(`/proc/${e}/fd`)}catch{return!1}for(let s of r)try{if(jne(`/proc/${e}/fd/${s}`)===n)return!0}catch{}return!1}function lr(e){let t=fu(e);if(t===null)return{kind:"free"};let n=q$(t);if(n.kind==="held")return n;let r=Wne(Bne(e),"site.lock");if(r===t)return n;let s=q$(r);return s.kind==="held"&&Gne(s.identity.pid,e)?s:n}function Lp(e){try{let t=Zh(Cp(e,"utf8"));return t?{...t,bootId:t.bootId??null}:null}catch{return null}}function W$(){try{let e=Cp("/proc/sys/kernel/random/boot_id","utf8").trim();return e_(e)?e:null}catch{return null}}function G$(e){try{let t=Cp(`/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 uT(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=W$();if(r!==null&&r!==e.bootId)return!1}if(e.pidStartTicks===null)return!0;let n=G$(e.pid);return n===null?!0:n===e.pidStartTicks}function cT(e,t){let n=`${e}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`,r=Une(n,"wx");try{qne(r,JSON.stringify(t))}finally{Mne(r)}try{return Pne(n,e),!0}catch(s){if(s.code!=="EEXIST")throw s;return!1}finally{dT(n)}}function Va(e,t){let n={pid:process.pid,ownerLabel:t,startedAt:new Date().toISOString(),pidStartTicks:G$(process.pid),bootId:W$()};if(cT(e,n))return lT(e,n);let r=Lp(e);if(r!==null&&uT(r))throw new yo(r,e);let s=`${e}.reclaim.${process.pid}.${Math.random().toString(36).slice(2)}`,o=!1;try{H$(e,s);let i=Lp(s);r===null&&i===null||r!==null&&i!==null&&i.pid===r.pid&&i.startedAt===r.startedAt?(dT(s),o=!0):H$(s,e)}catch{}if(o&&cT(e,n))return lT(e,n);for(let i=0;i<8;i+=1){let a=Lp(e);if(a!==null&&uT(a))throw new yo(a,e);if(a!==null)break;if(Xne(5+i*5),cT(e,n))return lT(e,n)}throw new Error(`failed to acquire site lock at ${e} (lost a reclaim race)`)}function Xne(e){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}function lT(e,t){let n=!1;return{release(){if(!n){n=!0;try{let r=Lp(e);r!==null&&r.pid===t.pid&&r.startedAt===t.startedAt&&dT(e)}catch{}}}}}import{closeSync as fT,existsSync as Vne,fstatSync as Jne,mkdirSync as Yne,openSync as X$,readFileSync as V$,renameSync as Kne,unlinkSync as zne,writeSync as Qne}from"node:fs";import{dirname as J$,join as Zne}from"node:path";import{createHash as ere,randomBytes as tre}from"node:crypto";var nre=32;function Ja(e){return e===":memory:"?null:Zne(J$(e),"localweb-passcode")}function rre(){return tre(nre).toString("base64url")}function mT(e,t){let n=J$(e);Vne(n)||Yne(n,{recursive:!0});let r=`${e}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`,s;try{s=X$(r,"wx",384);let o=Buffer.from(t,"utf8"),i=0;for(;i<o.length;){let a=Qne(s,o,i,o.length-i);if(a<=0)throw new Error("passcode file write made no progress");i+=a}fT(s),s=void 0,Kne(r,e)}catch(o){if(s!==void 0)try{fT(s)}catch{}try{zne(r)}catch{}throw o}}function Y$(e){let t;try{t=X$(e,"r")}catch(n){if(n.code==="ENOENT")return null;throw n}try{let n=Jne(t,{bigint:!0}),r=V$(t,"utf8"),s=ere("sha256").update(`${n.dev}:${n.ino}:${n.ctimeNs}:${n.mtimeNs}:${n.size}:`).update(r,"utf8").digest("base64url");return{passcode:r,generation:s}}finally{fT(t)}}function K$(e){try{return V$(e,"utf8")}catch(t){if(t.code==="ENOENT")return null;throw t}}function Op(e){let t=rre();return mT(e,t),t}import{randomUUID as sre}from"node:crypto";function pT(e){return`remote:${e.from.team?`${e.from.site}:${e.from.team}:${e.from.alias}`:`${e.from.site}:${e.from.alias}`}`}function z$(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(!Q(r))throw new Error(`remote envelope addressed to "${n.to.team}", which is itself a remote (channel=lmmail) team -- not locally dispatchable`);De(e,t,r.name,n.payload,{from:pT(n),dedupeKey:n.msgId})}var ore=new Set(["dispatched","queued","failed"]);function ire(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"&&ore.has(n)}var are="reply-surfaced:";function cre(e,t,n,r){let s=n.inReplyTo;if(!s)throw new Error("recordReplyOrAck: envelope has no in_reply_to");let o=cA(e,s);if(!o)return"orphan";if(ire(n.payload))return lA(e,s,r),"acked";uA(e,s,r);let i=t.find(a=>Q(a)&&a.name===o.from_alias);if(i)try{De(e,t,i.name,n.payload,{from:pT(n),dedupeKey:`${are}${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)}
2349
- `)}return"replied"}function lre(e,t,n,r,s){let o=e.now??(()=>new Date().toISOString()),i={v:1,msgId:sre(),to:t,from:{site:e.localSiteId,team:"",alias:"lmauto"},sentAt:o(),payload:JSON.stringify({state:r,...s?{note:s}:{}}),inReplyTo:n},a=Zn(t.site),c=new TextEncoder().encode(Mc(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)}
2350
- `)})}function Q$(e,t,n,r){if(n.inReplyTo){cre(e,t,n,(r.now??(()=>new Date().toISOString()))());return}let s;try{z$(e,t,n)}catch(i){s=i}let o=r.now??(()=>new Date().toISOString());if(oA(e,n.msgId,o())){let i=s?(s instanceof Error?s.message:String(s)).slice(0,500):void 0;lre(r,n.from,n.msgId,s?"failed":"dispatched",i)}if(s)throw s}var nM=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,ure=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,dre="text/plain; charset=utf-8",hT="exec",rM="exec-result";var fre="exec-result";var mre=`
2348
+ ${Bt}`;X=o(e.db,C,P,K,Hn,M,St?void 0:!Jt)}else X=o(e.db,C,P,K,void 0,M)}catch(K){e.onError?.(K)}let Y=[];if(e.autoContinue&&Eo(e.db)===null)try{Y=await i(e.db,C,P,{config:R,...e.autoContinue,nowMs:M,stalledTeamNames:z,heavyLockStatusPath:r,heavyLockPath:s,readHeavyLockStatusImpl:n})}catch(K){e.onError?.(K)}let H=[];if(e.maintainerWake)try{H=await a(e.db,ne,e.maintainerWake.teamName,F,R,M)}catch(K){e.onError?.(K)}let V=[];if(e.maintainerWake)try{V=await c(e.db,C,e.maintainerWake.teamName,F,R,M)}catch(K){e.onError?.(K)}let Z=[];if(e.maintainerWake)try{Z=await l(e.db,C,e.maintainerWake.teamName,F,R)}catch(K){e.onError?.(K)}let re=[];if(e.maintainerWake)try{re=await d(e.db,C,e.maintainerWake.teamName,F,R,M)}catch(K){e.onError?.(K)}let de=[];if(e.maintainerWake)try{de=await f(e.db,C,e.maintainerWake.teamName,F,R,M)}catch(K){e.onError?.(K)}let le=[];if(e.maintainerWake)try{le=await u(e.db,C,e.maintainerWake.teamName,F,R,M)}catch(K){e.onError?.(K)}let ie=[];try{ie=await _(e.db,F,M,{onJobError:(K,St)=>e.onError?.(St),tick:{intervalMs:S,skippedOverlaps:$,atMs:Date.now()}}),$=0}catch(K){e.onError?.(K)}let ye=[];try{ye=await m(e.db,C,k,M)}catch(K){e.onError?.(K)}let _e=[];try{_e=p(e.db,C,O,M)}catch(K){e.onError?.(K)}let ee=[];try{ee=h(e.db,C,P,D,M)}catch(K){e.onError?.(K)}let ge=null,at=[],_t=e.rateLimitPolicy??e.rateLimitAutomation,gr=e.rateLimitCollect??_t;if(gr!==void 0){let K=Date.now();try{ge=await v(e.db,{nowMs:K,...gr})}catch(St){e.onError?.(St)}try{at=A(e.db,{nowMs:K,..._t,dryRun:_t===void 0})}catch(St){e.onError?.(St)}}let Lt={watch:W,stalled:ne,maintainerWoken:X,autoContinued:Y,surfacedUnknown:H,surfacedBlocked:V,surfacedDoneConsistency:Z,surfacedUnresolvableTeamfiles:le,surfacedFault:re,surfacedClosedEpics:de,escalated:ye,autoRedelivered:_e,woken:ee,firedCronJobs:ie,rateLimitCollected:ge,rateLimitPolicyEvaluations:at};return e.onTick?.(Lt),Lt}catch(F){throw e.onError?.(F),F}finally{L=!1}}return{start(){b||(b=setInterval(()=>{j().catch(()=>{})},S),b.unref())},stop(){b&&(clearInterval(b),b=null)},runTickNow:j,isRunning:()=>b!==null,isTicking:()=>L}}import{closeSync as $ne,linkSync as Mne,openSync as Pne,readdirSync as Une,readFileSync as Cp,readlinkSync as Fne,realpathSync as jne,renameSync as H$,unlinkSync as dT,writeSync as Hne}from"node:fs";import{dirname as qne,join as Bne}from"node:path";var yo=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 fu(e){return e===":memory:"?null:`${e}.lock`}function B$(e){let t=lr(e);return t.kind==="held"?t.identity:null}function q$(e){let t;try{t=Cp(e,"utf8")}catch(s){return s.code==="ENOENT"?{kind:"free"}:{kind:"unknown"}}let n=Zh(t);if(!n)return{kind:"unknown"};let r={...n,bootId:n.bootId??null};return uT(r)?{kind:"held",identity:r}:{kind:"free"}}function Wne(e,t){let n;try{n=jne(t)}catch{return!1}let r;try{r=Une(`/proc/${e}/fd`)}catch{return!1}for(let s of r)try{if(Fne(`/proc/${e}/fd/${s}`)===n)return!0}catch{}return!1}function lr(e){let t=fu(e);if(t===null)return{kind:"free"};let n=q$(t);if(n.kind==="held")return n;let r=Bne(qne(e),"site.lock");if(r===t)return n;let s=q$(r);return s.kind==="held"&&Wne(s.identity.pid,e)?s:n}function Lp(e){try{let t=Zh(Cp(e,"utf8"));return t?{...t,bootId:t.bootId??null}:null}catch{return null}}function W$(){try{let e=Cp("/proc/sys/kernel/random/boot_id","utf8").trim();return e_(e)?e:null}catch{return null}}function G$(e){try{let t=Cp(`/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 uT(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=W$();if(r!==null&&r!==e.bootId)return!1}if(e.pidStartTicks===null)return!0;let n=G$(e.pid);return n===null?!0:n===e.pidStartTicks}function cT(e,t){let n=`${e}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`,r=Pne(n,"wx");try{Hne(r,JSON.stringify(t))}finally{$ne(r)}try{return Mne(n,e),!0}catch(s){if(s.code!=="EEXIST")throw s;return!1}finally{dT(n)}}function Va(e,t){let n={pid:process.pid,ownerLabel:t,startedAt:new Date().toISOString(),pidStartTicks:G$(process.pid),bootId:W$()};if(cT(e,n))return lT(e,n);let r=Lp(e);if(r!==null&&uT(r))throw new yo(r,e);let s=`${e}.reclaim.${process.pid}.${Math.random().toString(36).slice(2)}`,o=!1;try{H$(e,s);let i=Lp(s);r===null&&i===null||r!==null&&i!==null&&i.pid===r.pid&&i.startedAt===r.startedAt?(dT(s),o=!0):H$(s,e)}catch{}if(o&&cT(e,n))return lT(e,n);for(let i=0;i<8;i+=1){let a=Lp(e);if(a!==null&&uT(a))throw new yo(a,e);if(a!==null)break;if(Gne(5+i*5),cT(e,n))return lT(e,n)}throw new Error(`failed to acquire site lock at ${e} (lost a reclaim race)`)}function Gne(e){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}function lT(e,t){let n=!1;return{release(){if(!n){n=!0;try{let r=Lp(e);r!==null&&r.pid===t.pid&&r.startedAt===t.startedAt&&dT(e)}catch{}}}}}import{closeSync as fT,existsSync as Xne,fstatSync as Vne,mkdirSync as Jne,openSync as X$,readFileSync as V$,renameSync as Yne,unlinkSync as Kne,writeSync as zne}from"node:fs";import{dirname as J$,join as Qne}from"node:path";import{createHash as Zne,randomBytes as ere}from"node:crypto";var tre=32;function Ja(e){return e===":memory:"?null:Qne(J$(e),"localweb-passcode")}function nre(){return ere(tre).toString("base64url")}function mT(e,t){let n=J$(e);Xne(n)||Jne(n,{recursive:!0});let r=`${e}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`,s;try{s=X$(r,"wx",384);let o=Buffer.from(t,"utf8"),i=0;for(;i<o.length;){let a=zne(s,o,i,o.length-i);if(a<=0)throw new Error("passcode file write made no progress");i+=a}fT(s),s=void 0,Yne(r,e)}catch(o){if(s!==void 0)try{fT(s)}catch{}try{Kne(r)}catch{}throw o}}function Y$(e){let t;try{t=X$(e,"r")}catch(n){if(n.code==="ENOENT")return null;throw n}try{let n=Vne(t,{bigint:!0}),r=V$(t,"utf8"),s=Zne("sha256").update(`${n.dev}:${n.ino}:${n.ctimeNs}:${n.mtimeNs}:${n.size}:`).update(r,"utf8").digest("base64url");return{passcode:r,generation:s}}finally{fT(t)}}function K$(e){try{return V$(e,"utf8")}catch(t){if(t.code==="ENOENT")return null;throw t}}function Op(e){let t=nre();return mT(e,t),t}import{randomUUID as rre}from"node:crypto";function pT(e){return`remote:${e.from.team?`${e.from.site}:${e.from.team}:${e.from.alias}`:`${e.from.site}:${e.from.alias}`}`}function z$(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(!Q(r))throw new Error(`remote envelope addressed to "${n.to.team}", which is itself a remote (channel=lmmail) team -- not locally dispatchable`);De(e,t,r.name,n.payload,{from:pT(n),dedupeKey:n.msgId})}var sre=new Set(["dispatched","queued","failed"]);function ore(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"&&sre.has(n)}var ire="reply-surfaced:";function are(e,t,n,r){let s=n.inReplyTo;if(!s)throw new Error("recordReplyOrAck: envelope has no in_reply_to");let o=cA(e,s);if(!o)return"orphan";if(ore(n.payload))return lA(e,s,r),"acked";uA(e,s,r);let i=t.find(a=>Q(a)&&a.name===o.from_alias);if(i)try{De(e,t,i.name,n.payload,{from:pT(n),dedupeKey:`${ire}${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)}
2349
+ `)}return"replied"}function cre(e,t,n,r,s){let o=e.now??(()=>new Date().toISOString()),i={v:1,msgId:rre(),to:t,from:{site:e.localSiteId,team:"",alias:"lmauto"},sentAt:o(),payload:JSON.stringify({state:r,...s?{note:s}:{}}),inReplyTo:n},a=Zn(t.site),c=new TextEncoder().encode(Mc(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)}
2350
+ `)})}function Q$(e,t,n,r){if(n.inReplyTo){are(e,t,n,(r.now??(()=>new Date().toISOString()))());return}let s;try{z$(e,t,n)}catch(i){s=i}let o=r.now??(()=>new Date().toISOString());if(oA(e,n.msgId,o())){let i=s?(s instanceof Error?s.message:String(s)).slice(0,500):void 0;cre(r,n.from,n.msgId,s?"failed":"dispatched",i)}if(s)throw s}var nM=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,lre=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,ure="text/plain; charset=utf-8",hT="exec",rM="exec-result";var dre="exec-result";var fre=`
2351
2351
  ... [lmexec output truncated; middle elided, see attachment] ...
2352
- `;function sM(e){return _T(cM(e))}function oM(e){return iM(cM(e))}function _T(e){let t=lM(e),n=uM(t.type,"type",hT),r=dM(t.id,"id"),s=ET(t.command,"command"),o=Ere(t.timeout_s,"timeout_s"),i=gre(t.reply_to,"reply_to"),a=hre(t.from,"from");return{v:1,type:n,id:r,command:s,timeout_s:o,reply_to:i,...a===void 0?{}:{from:a}}}function iM(e){let t=lM(e),n=pre(t.v),r=uM(t.type,"type",rM),s=dM(t.id,"id"),o=wre(t.exit_code,"exit_code"),i=eM(t.stdout,"stdout"),a=eM(t.stderr,"stderr"),c=yre(t.duration_ms,"duration_ms"),l=tM(t.timed_out,"timed_out"),u=tM(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 d={type:r,id:s,exit_code:o,stdout:i,stderr:a,duration_ms:c,timed_out:l,truncated:u};if(n===1)return{v:n,...d};let f=_re(t.sender_trust),m=ET(t.sender,"sender");return{v:n,...d,sender_trust:f,sender:m}}function gT(e){if(!nM.test(e))throw new Error(`invalid exec id: ${e}`);return`${fre} ${e}`}function Z$(e,t,n){let r=Buffer.isBuffer(t)?t:Buffer.from(t,"utf8"),s=n?.capBytes??49152,o=n?.marker??mre;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),u=Math.floor(c/2);return{inline:`${Tre(a,l)}${o}${vre(a,u)}`,truncated:!0,attachment:{name:e==="stdout"?"stdout.txt":"stderr.txt",content_type:dre,data:r}}}function aM(e,t){let n=Z$("stdout",e.stdout,t),r=Z$("stderr",e.stderr,t),s=iM({v:2,type:rM,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:gT(e.id),envelope:s,attachments:[n.attachment,r.attachment].filter(o=>o!==void 0)}}function cM(e){try{return JSON.parse(e)}catch(t){throw new Error(`invalid JSON: ${Sre(t)}`)}}function lM(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("expected object");return e}function uM(e,t,n){if(e!==n)throw new Error(`invalid ${t}: expected ${n}`);return n}function pre(e){if(e===void 0||e===1)return 1;if(e===2)return 2;throw new Error("invalid v: expected 1 or 2")}function dM(e,t){if(typeof e!="string"||!nM.test(e))throw new Error(`invalid ${t}: expected UUID v4`);return e}function ET(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`invalid ${t}: expected non-empty string`);return e}function hre(e,t){if(e!==void 0)return ET(e,t)}function _re(e){if(e==="admin"||e==="registered"||e==="anonymous")return e;throw new Error("invalid sender_trust: expected admin, registered, or anonymous")}function gre(e,t){if(typeof e!="string"||e.includes("/")||e.includes("\\")||e.includes("..")||e.endsWith(".")||/[\u0000-\u001f\u007f]/.test(e)||!ure.test(e))throw new Error(`invalid ${t}: expected mailbox name`);return e}function eM(e,t){if(typeof e!="string")throw new Error(`invalid ${t}: expected string`);return e}function Ere(e,t){if(typeof e!="number"||!Number.isSafeInteger(e)||e<1)throw new Error(`invalid ${t}: expected positive integer`);return e}function yre(e,t){if(typeof e!="number"||!Number.isSafeInteger(e)||e<0)throw new Error(`invalid ${t}: expected non-negative integer`);return e}function wre(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 tM(e,t){if(typeof e!="boolean")throw new Error(`invalid ${t}: expected boolean`);return e}function Tre(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 vre(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 Sre(e){return e instanceof Error&&e.message?e.message:String(e)}var bre=/[;&|`$<>(){}\\]/,fM=/[\x00-\x1f\x7f]/;function pM(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(fM.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(fM.test(e[n])||bre.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 hM(e){if(!e.includes("--json"))return"requires --json when run via exec (plain-text output has no machine-readable contract)"}function yT(e,t,n,r,s){let o=new Set,i=[];for(let a=0;a<t.length;a+=1){let c=t[a];if(c==="")return`${e}: an empty argument is not accepted`;if(!c.startsWith("-")){i.push(c);continue}let l=Object.hasOwn(n,c)?n[c]:void 0;if(l===void 0)return`${e} via exec does not accept ${c}: only ${Object.keys(n).join(", ")} and ${r.max===0?"no positionals":"its positional arguments"} are admitted`;if(o.has(c))return`${e}: ${c} given twice`;if(o.add(c),l==="bool")continue;let u=t[a+1];if(u===void 0||u===""||u.startsWith("-"))return`${e} ${c} requires a value that does not start with '-'`;if(l==="positiveInt"&&!/^[1-9][0-9]*$/.test(u))return`${e} ${c} requires a positive integer`;a+=1}return i.length<r.min||i.length>r.max?r.max===0?`${e} via exec takes no positional arguments`:`${e} via exec takes a team and an optional alias (${r.min} or ${r.max} positionals)`:s?.(i)}var Are=/\.(?:lmctl|lmc)$/i,Ire=/^(?:.+)\.(?:lmctl|lmc):[A-Za-z][A-Za-z0-9_-]*$/i,kre=/^[A-Za-z][A-Za-z0-9_-]*$/;function Rre(e){let[t,n]=e,r=Ire.test(t);if(!r&&!Are.test(t))return"tail via exec requires a teamfile (<path>.lmctl or <path>.lmctl:<alias>) as its target, not a session id or other name";if(n!==void 0){if(r)return"tail: an alias was given both as <teamfile>:<alias> and as a second argument";if(!kre.test(n))return"tail: the alias must start with a letter and contain only letters, digits, '_' and '-'"}}function Nre(e){let t=e.slice(2);return t.includes("--watch")?"tail --watch is a long-running stream, not a fit for a single bounded exec call":t.includes("--lines")?yT("tail",t,{"--lines":"positiveInt","--json":"bool","--since":"value"},{min:1,max:2},Rre)??hM(e):"tail requires --lines N when run via exec (unbounded --max-bytes/no-limit output is not allowed)"}function xre(e){return yT("running",e.slice(2),{"--json":"bool","--tree":"bool","--team":"value","--member":"value","--since":"value"},{min:0,max:0})??hM(e)}var Ya=void 0;function Ti(e,t,n,r,s){return o=>yT(e,o.slice(t),n,r,s)}var Lre=Ti("lmctl status",2,{"--json":"bool","--live":"bool"},{min:0,max:0},Ya),Cre=Ti("lmctl teams",2,{"--json":"bool"},{min:0,max:0},Ya),Ore=Ti("lmctl history",2,{"--json":"bool"},{min:0,max:2},e=>{if(e.length===2&&/^[0-9]+$/.test(e[0]))return"lmctl history: a numeric first argument is the limit, so a second argument would be ignored";if(e.length===2&&!/^[0-9]+$/.test(e[1]))return"lmctl history: the second argument is a limit and must be a non-negative integer"}),Dre=Ti("lmctl state list",3,{"--json":"bool","--non-done":"bool"},{min:0,max:0},Ya),$re=Ti("lmctl state get",3,{"--json":"bool"},{min:1,max:1},Ya),Mre=Ti("lmctl state active",3,{"--json":"bool"},{min:0,max:0},Ya),Pre=Ti("lmctl source list",3,{"--json":"bool"},{min:0,max:0},Ya),_M=[{prefix:["lmctl","status"],validate:Lre},{prefix:["lmctl","teams"],validate:Cre},{prefix:["lmctl","history"],validate:Ore},{prefix:["lmctl","state","list"],validate:Dre},{prefix:["lmctl","state","get"],validate:$re},{prefix:["lmctl","state","active"],validate:Mre},{prefix:["lmctl","source","list"],validate:Pre},{prefix:["lmctl","running"],validate:xre},{prefix:["lmctl","tail"],validate:Nre}],gM=[{prefix:["lmctl","state","set"]},{prefix:["lmctl","source","add"]},{prefix:["lmctl","source","remove"]}],$Pe=Object.freeze([..._M,...gM].map(e=>Object.freeze([...e.prefix])));function Ure(e,t){return e.length<t.prefix.length?!1:t.prefix.every((n,r)=>e[r]===n)}function mM(e,t){return t.find(n=>Ure(e,n))}function EM(e,t){if(e[0]==="lmbee"&&(e[1]==="enqueue"||e[1]==="queue")||e[0]==="lmctl"&&e[1]==="queue")return{allowed:!1,code:"command_not_allowed",message:"the former lmbee prompt queue is retired; use lmctl prompt, lmctl cron, mailbox remote execution for cross-site work, or lmchat"};let n=mM(e,_M);if(n){let s=n.validate?.(e);return s?{allowed:!1,code:"command_not_allowed",message:s}:{allowed:!0}}let r=mM(e,gM);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 yM}from"node:child_process";var Fre=5e3,jre="/bin/sh";function wM(e){if(!Number.isInteger(e.timeoutMs)||e.timeoutMs<1)throw new Error("timeoutMs must be a positive integer");let t=e.killGraceMs??Fre;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 TM(e,t,n,r){return new Promise((s,o)=>{let i=r(),a=[],c=[],l=!1,u=!1,d,f,m=h=>{u||(u=!0,d&&clearTimeout(d),f&&clearTimeout(f),s(h))},p=h=>{u||(u=!0,d&&clearTimeout(d),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})}),d=setTimeout(()=>{l=!0,wT(e.pid,"SIGTERM"),n>0?f=setTimeout(()=>{wT(e.pid,"SIGKILL")},n):wT(e.pid,"SIGKILL")},t)})}async function vM(e,t){if(e.trim().length===0)throw new Error("command must be non-empty");let{killGraceMs:n,now:r}=wM(t),s=t.shellPath??jre,o=yM(s,["-c",e],{cwd:t.cwd,env:t.env,detached:!0,stdio:["ignore","pipe","pipe"]});return TM(o,t.timeoutMs,n,r)}async function SM(e,t){if(e.length===0)throw new Error("argv must be non-empty");let{killGraceMs:n,now:r}=wM(t),s=yM(e[0],e.slice(1),{cwd:t.cwd,env:t.env,detached:!0,stdio:["ignore","pipe","pipe"]});return TM(s,t.timeoutMs,n,r)}function wT(e,t){if(e)try{process.kill(-e,t)}catch(n){if(!Hre(n))throw n}}function Hre(e){return!!e&&typeof e=="object"&&"code"in e&&e.code==="ESRCH"}var bM=1e3,Bre=6e4,Wre=20,Gre=1e3;async function IM(e,t){let n=t.runCommand??vM,r=t.runCommandArgv??SM,s=t.sleep??Vre,o=t.pollNow??Date.now,i=t.now??(()=>new Date),a=t.stderr??(d=>process.stderr.write(`${d}
2353
- `)),c=t.shouldStop??(()=>!1),l=bM,u=!1;for(ur(a,i,"info","daemon_started",{mailbox:e.mailbox}),e.allowAnonymous&&ur(a,i,"warn","anonymous_execution_enabled",{mailbox:e.mailbox,warning:"REMOTE SHELL OPEN TO EVERY AUTHENTICATED LMMAIL USER"});!c();)try{let d=o(),f=await t.client.listMessages(e.mailbox,{status:"unread",after:0,...e.once?{}:{wait_s:Wre}}),m=Math.max(0,o()-d);for(let p of f.messages){if(c())break;let h=Xre(e,p.sender);if(h==="anonymous"&&!e.allowAnonymous){await t.client.getMessageMetadata(e.mailbox,p.seq),ur(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=sM(g)}catch(A){ur(a,i,"warn","message_rejected",{seq:p.seq,sender:p.sender,sender_trust:h,reason:"malformed_request",error:TT(A)});continue}let E=e.execAllowlist?pM(w.command):void 0,y=e.execAllowlist?E?EM(E,h):{allowed:!1,code:"malformed_command",message:"command could not be safely tokenized into arguments"}:{allowed:!0};if(!y.allowed){ur(a,i,"warn","command_rejected",{id:w.id,sender:p.sender,sender_trust:h,...w.from===void 0?{}:{asserted_from:w.from},code:y.code,seq:p.seq}),await AM(t.client,w.reply_to,{id:w.id,exit_code:126,stdout:"",stderr:JSON.stringify({error:{code:y.code,message:y.message}}),duration_ms:0,timed_out:!1,sender_trust:h,sender:p.sender});continue}ur(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=E?await r(E,{timeoutMs:Math.min(w.timeout_s,e.timeoutCapSeconds)*1e3}):await n(w.command,{timeoutMs:Math.min(w.timeout_s,e.timeoutCapSeconds)*1e3})}catch(A){ur(a,i,"error","command_failed",{id:w.id,sender:p.sender,sender_trust:h,...w.from===void 0?{}:{asserted_from:w.from},error:TT(A)});continue}let v=await AM(t.client,w.reply_to,{id:w.id,...T,sender_trust:h,sender:p.sender});ur(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:v.envelope.truncated})}if(l=bM,e.once||c())break;f.messages.length===0&&m<Gre&&(u||(ur(a,i,"warn","long_poll_unsupported",{elapsed_ms:m,fallback_interval_ms:e.pollIntervalMs}),u=!0),await s(e.pollIntervalMs))}catch(d){if(ur(a,i,"error","api_error",{error:TT(d),retry_ms:l}),c())break;await s(l),l=Math.min(l*2,Bre)}ur(a,i,"info","daemon_stopped",{mailbox:e.mailbox})}function Xre(e,t){return e.adminUsers.has(t)?"admin":e.allowUsers.has(t)?"registered":"anonymous"}async function AM(e,t,n){let r=aM(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 ur(e,t,n,r,s){e(JSON.stringify({ts:t().toISOString(),level:n,event:r,...s}))}function Vre(e){return new Promise(t=>setTimeout(t,e))}function TT(e){return e instanceof Error?e.message:String(e)}var Jre=5e3,Yre=300;async function kM(e,t){await e.createMailbox(t,{tolerate409:!0})}function Dp(e){let t=!1,n=!1,r=Promise.resolve(),s=e.stderr??(c=>process.stderr.write(`${c}
2354
- `)),o=e.runDaemonLoopImpl??IM,i={mailbox:e.mailbox,allowUsers:e.allowUsers,adminUsers:e.adminUsers,allowAnonymous:e.allowAnonymous,apiUrl:"",pollIntervalMs:e.pollIntervalMs??Jre,timeoutCapSeconds:e.timeoutCapSeconds??Yre,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 vT="remote_execute",xM="remote_execute.runtime",Kre="https://lmctl.ai/lmmail",LM=1e4;function wo(e){return(e.LMCTL_LMMAIL_API_URL?.trim()||e.LMMAIL_API_URL?.trim()||Kre).replace(/\/+$/,"")}function ST(e){return(e??"").split(",").map(t=>t.trim()).filter(t=>t.length>0)}function RM(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")?e:null}function Ka(e){let t=e.prepare("SELECT v FROM kv WHERE k = ?").get(vT);if(!t)return null;try{let n=JSON.parse(t.v),r=RM(n.adminUsers),s=RM(n.allowUsers);return n.revision===void 0&&(n.revision=0),typeof n.revision!="number"||!Number.isInteger(n.revision)||n.revision<0||typeof n.enabled!="boolean"||r===null||s===null||typeof n.allowAnonymous!="boolean"||typeof n.apiUrl!="string"||typeof n.updatedAt!="string"?null:{revision:n.revision,enabled:n.enabled,adminUsers:r,allowUsers:s,allowAnonymous:n.allowAnonymous,apiUrl:n.apiUrl,updatedAt:n.updatedAt}}catch{return null}}function zre(e){return e.prepare("SELECT v FROM kv WHERE k = ?").get(vT)!==void 0&&Ka(e)===null}function CM(e,t){e.transaction(()=>{let n=Ka(e),r={...t,revision:(n?.revision??0)+1};e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(vT,JSON.stringify(r))}).immediate()}function Qre(e){let t=e.prepare("SELECT v FROM kv WHERE k = ?").get(xM);if(!t)return null;try{let n=JSON.parse(t.v);return typeof n.pid!="number"||typeof n.running!="boolean"||typeof n.ts!="string"||typeof n.mailbox!="string"?null:{pid:n.pid,running:n.running,mailbox:n.mailbox,lastError:typeof n.lastError=="string"?n.lastError:null,ts:n.ts}}catch{return null}}function NM(e,t){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(xM,JSON.stringify(t))}var $p=(e,t)=>Ut({apiUrl:dn(e,"the lmmail endpoint"),appkey:t,fetch:ss()});async function OM(e){let t=e.env??process.env;dn(wo(t),"the lmmail endpoint");let n=await e.acquire(),r=[...new Set(e.policy?.adminUsers??[])],s=[...new Set(e.policy?.allowUsers??[])],o=e.policy?.allowAnonymous===!0;if(r.length===0&&s.length===0&&!o){let u=n.envelope?.user_id;if(typeof u!="string"||u.length===0)throw new Error("cannot tell which user id is yours from this appkey (it came from the environment, not a key file); name who may execute with --exec-allow <user_id[,user_id...]> (read-only commands) and/or --exec-admin");s=[u]}let i=wo(t),a=(e.createClient??$p)(i,n.appkey),c=Zn(e.siteId),l=er(e.siteId);return await a.createMailbox(c,{tolerate409:!0}),await a.createMailbox(l,{tolerate409:!0}),CM(e.db,{enabled:!0,adminUsers:r,allowUsers:s,allowAnonymous:o,apiUrl:i,updatedAt:(e.now?.()??new Date).toISOString()}),{siteId:e.siteId,contentMailbox:c,execMailbox:l,apiUrl:i,adminUsers:r,allowUsers:s,allowAnonymous:o}}async function DM(e){let t=e.env??process.env,n=Ka(e.db);CM(e.db,{enabled:!1,adminUsers:n?.adminUsers??[],allowUsers:n?.allowUsers??[],allowAnonymous:n?.allowAnonymous??!1,apiUrl:n?.apiUrl??wo(t),updatedAt:(e.now?.()??new Date).toISOString()});let r=await e.acquire(),s=(e.createClient??$p)(n?.apiUrl??wo(t),r.appkey),o=er(e.siteId);try{let i=await s.deleteMailbox(o);return{siteId:e.siteId,execMailbox:o,mailboxDeleted:!0,messagesDiscarded:i.messages_deleted}}catch(i){if(i instanceof In&&i.status===404)return{siteId:e.siteId,execMailbox:o,mailboxDeleted:!1,messagesDiscarded:0};throw i}}async function $M(e){let t=e.env??process.env,n=Ka(e.db),r=zre(e.db),s=n?.apiUrl??wo(t),o=er(e.siteId),i=null,a=null,c=e.resolveKey();if(c===null)a="no appkey on this machine, so the server was not asked (run `lmbee whoami` to sign in)";else try{i=(await(e.createClient??$p)(s,c.appkey).listMailboxes()).some(_=>_.mailbox_name===o)}catch(h){a=`could not ask the server: ${h instanceof Error?h.message:String(h)}`}let l=(e.readLock??lr)(e.dbPath),u=l.kind==="held"?{running:!0,pid:l.identity.pid}:{running:!1,pid:null},d=Qre(e.db),f=(e.now??Date.now)(),m=!1,p=null;return u.running?d===null?p=n?.enabled?"the daemon has not reported on remote execution yet":null:d.pid!==u.pid?p="the last report is from a previous daemon process":f-Date.parse(d.ts)>3*LM?p="the daemon has stopped reporting (stale heartbeat)":(m=d.running,p=d.lastError!==null?`daemon reports: ${d.lastError}`:null):p="no `lmbee serve` daemon is running, so nothing answers exec requests",{siteId:e.siteId,enabled:n?.enabled??(r?!1:null),settingUnreadable:r,policy:n?{adminUsers:n.adminUsers,allowUsers:n.allowUsers,allowAnonymous:n.allowAnonymous}:null,apiUrl:s,execMailbox:o,execMailboxExists:i,execMailboxNote:a,daemon:u,workerRunning:m,workerNote:p}}function bT(e){let t=[];if(t.push(`remote_execute: ${e.enabled===null?"never enabled":e.enabled?"enabled":"disabled"}${e.settingUnreadable?" (the stored setting is unreadable; treated as disabled)":""}`),t.push(`site: ${e.siteId}`),t.push(`exec mailbox: ${e.execMailbox} (${e.execMailboxExists===null?"unknown":e.execMailboxExists?"exists":"does not exist"}${e.execMailboxNote?`; ${e.execMailboxNote}`:""})`),t.push(`daemon: ${e.daemon.running?`running (pid ${e.daemon.pid})`:"not running"}`),t.push(`worker: ${e.workerRunning?"running":"not running"}${e.workerNote?` (${e.workerNote})`:""}`),e.policy){let n=[e.policy.adminUsers.length?`admin: ${e.policy.adminUsers.join(", ")}`:"",e.policy.allowUsers.length?`allow: ${e.policy.allowUsers.join(", ")}`:"",e.policy.allowAnonymous?"anonymous":""].filter(Boolean).join("; ");t.push(`who may run: ${n||"(nobody)"}`)}return t.push(`server: ${e.apiUrl}`),t.join(`
2352
+ `;function sM(e){return _T(cM(e))}function oM(e){return iM(cM(e))}function _T(e){let t=lM(e),n=uM(t.type,"type",hT),r=dM(t.id,"id"),s=ET(t.command,"command"),o=gre(t.timeout_s,"timeout_s"),i=_re(t.reply_to,"reply_to"),a=pre(t.from,"from");return{v:1,type:n,id:r,command:s,timeout_s:o,reply_to:i,...a===void 0?{}:{from:a}}}function iM(e){let t=lM(e),n=mre(t.v),r=uM(t.type,"type",rM),s=dM(t.id,"id"),o=yre(t.exit_code,"exit_code"),i=eM(t.stdout,"stdout"),a=eM(t.stderr,"stderr"),c=Ere(t.duration_ms,"duration_ms"),l=tM(t.timed_out,"timed_out"),u=tM(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 d={type:r,id:s,exit_code:o,stdout:i,stderr:a,duration_ms:c,timed_out:l,truncated:u};if(n===1)return{v:n,...d};let f=hre(t.sender_trust),m=ET(t.sender,"sender");return{v:n,...d,sender_trust:f,sender:m}}function gT(e){if(!nM.test(e))throw new Error(`invalid exec id: ${e}`);return`${dre} ${e}`}function Z$(e,t,n){let r=Buffer.isBuffer(t)?t:Buffer.from(t,"utf8"),s=n?.capBytes??49152,o=n?.marker??fre;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),u=Math.floor(c/2);return{inline:`${wre(a,l)}${o}${Tre(a,u)}`,truncated:!0,attachment:{name:e==="stdout"?"stdout.txt":"stderr.txt",content_type:ure,data:r}}}function aM(e,t){let n=Z$("stdout",e.stdout,t),r=Z$("stderr",e.stderr,t),s=iM({v:2,type:rM,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:gT(e.id),envelope:s,attachments:[n.attachment,r.attachment].filter(o=>o!==void 0)}}function cM(e){try{return JSON.parse(e)}catch(t){throw new Error(`invalid JSON: ${vre(t)}`)}}function lM(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("expected object");return e}function uM(e,t,n){if(e!==n)throw new Error(`invalid ${t}: expected ${n}`);return n}function mre(e){if(e===void 0||e===1)return 1;if(e===2)return 2;throw new Error("invalid v: expected 1 or 2")}function dM(e,t){if(typeof e!="string"||!nM.test(e))throw new Error(`invalid ${t}: expected UUID v4`);return e}function ET(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`invalid ${t}: expected non-empty string`);return e}function pre(e,t){if(e!==void 0)return ET(e,t)}function hre(e){if(e==="admin"||e==="registered"||e==="anonymous")return e;throw new Error("invalid sender_trust: expected admin, registered, or anonymous")}function _re(e,t){if(typeof e!="string"||e.includes("/")||e.includes("\\")||e.includes("..")||e.endsWith(".")||/[\u0000-\u001f\u007f]/.test(e)||!lre.test(e))throw new Error(`invalid ${t}: expected mailbox name`);return e}function eM(e,t){if(typeof e!="string")throw new Error(`invalid ${t}: expected string`);return e}function gre(e,t){if(typeof e!="number"||!Number.isSafeInteger(e)||e<1)throw new Error(`invalid ${t}: expected positive integer`);return e}function Ere(e,t){if(typeof e!="number"||!Number.isSafeInteger(e)||e<0)throw new Error(`invalid ${t}: expected non-negative integer`);return e}function yre(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 tM(e,t){if(typeof e!="boolean")throw new Error(`invalid ${t}: expected boolean`);return e}function wre(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 Tre(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 vre(e){return e instanceof Error&&e.message?e.message:String(e)}var Sre=/[;&|`$<>(){}\\]/,fM=/[\x00-\x1f\x7f]/;function pM(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(fM.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(fM.test(e[n])||Sre.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 hM(e){if(!e.includes("--json"))return"requires --json when run via exec (plain-text output has no machine-readable contract)"}function yT(e,t,n,r,s){let o=new Set,i=[];for(let a=0;a<t.length;a+=1){let c=t[a];if(c==="")return`${e}: an empty argument is not accepted`;if(!c.startsWith("-")){i.push(c);continue}let l=Object.hasOwn(n,c)?n[c]:void 0;if(l===void 0)return`${e} via exec does not accept ${c}: only ${Object.keys(n).join(", ")} and ${r.max===0?"no positionals":"its positional arguments"} are admitted`;if(o.has(c))return`${e}: ${c} given twice`;if(o.add(c),l==="bool")continue;let u=t[a+1];if(u===void 0||u===""||u.startsWith("-"))return`${e} ${c} requires a value that does not start with '-'`;if(l==="positiveInt"&&!/^[1-9][0-9]*$/.test(u))return`${e} ${c} requires a positive integer`;a+=1}return i.length<r.min||i.length>r.max?r.max===0?`${e} via exec takes no positional arguments`:`${e} via exec takes a team and an optional alias (${r.min} or ${r.max} positionals)`:s?.(i)}var bre=/\.(?:lmctl|lmc)$/i,Are=/^(?:.+)\.(?:lmctl|lmc):[A-Za-z][A-Za-z0-9_-]*$/i,Ire=/^[A-Za-z][A-Za-z0-9_-]*$/;function kre(e){let[t,n]=e,r=Are.test(t);if(!r&&!bre.test(t))return"tail via exec requires a teamfile (<path>.lmctl or <path>.lmctl:<alias>) as its target, not a session id or other name";if(n!==void 0){if(r)return"tail: an alias was given both as <teamfile>:<alias> and as a second argument";if(!Ire.test(n))return"tail: the alias must start with a letter and contain only letters, digits, '_' and '-'"}}function Rre(e){let t=e.slice(2);return t.includes("--watch")?"tail --watch is a long-running stream, not a fit for a single bounded exec call":t.includes("--lines")?yT("tail",t,{"--lines":"positiveInt","--json":"bool","--since":"value"},{min:1,max:2},kre)??hM(e):"tail requires --lines N when run via exec (unbounded --max-bytes/no-limit output is not allowed)"}function Nre(e){return yT("running",e.slice(2),{"--json":"bool","--tree":"bool","--team":"value","--member":"value","--since":"value"},{min:0,max:0})??hM(e)}var Ya=void 0;function Ti(e,t,n,r,s){return o=>yT(e,o.slice(t),n,r,s)}var xre=Ti("lmctl status",2,{"--json":"bool","--live":"bool"},{min:0,max:0},Ya),Lre=Ti("lmctl teams",2,{"--json":"bool"},{min:0,max:0},Ya),Cre=Ti("lmctl history",2,{"--json":"bool"},{min:0,max:2},e=>{if(e.length===2&&/^[0-9]+$/.test(e[0]))return"lmctl history: a numeric first argument is the limit, so a second argument would be ignored";if(e.length===2&&!/^[0-9]+$/.test(e[1]))return"lmctl history: the second argument is a limit and must be a non-negative integer"}),Ore=Ti("lmctl state list",3,{"--json":"bool","--non-done":"bool"},{min:0,max:0},Ya),Dre=Ti("lmctl state get",3,{"--json":"bool"},{min:1,max:1},Ya),$re=Ti("lmctl state active",3,{"--json":"bool"},{min:0,max:0},Ya),Mre=Ti("lmctl source list",3,{"--json":"bool"},{min:0,max:0},Ya),_M=[{prefix:["lmctl","status"],validate:xre},{prefix:["lmctl","teams"],validate:Lre},{prefix:["lmctl","history"],validate:Cre},{prefix:["lmctl","state","list"],validate:Ore},{prefix:["lmctl","state","get"],validate:Dre},{prefix:["lmctl","state","active"],validate:$re},{prefix:["lmctl","source","list"],validate:Mre},{prefix:["lmctl","running"],validate:Nre},{prefix:["lmctl","tail"],validate:Rre}],gM=[{prefix:["lmctl","state","set"]},{prefix:["lmctl","source","add"]},{prefix:["lmctl","source","remove"]}],$Pe=Object.freeze([..._M,...gM].map(e=>Object.freeze([...e.prefix])));function Pre(e,t){return e.length<t.prefix.length?!1:t.prefix.every((n,r)=>e[r]===n)}function mM(e,t){return t.find(n=>Pre(e,n))}function EM(e,t){if(e[0]==="lmbee"&&(e[1]==="enqueue"||e[1]==="queue")||e[0]==="lmctl"&&e[1]==="queue")return{allowed:!1,code:"command_not_allowed",message:"the former lmbee prompt queue is retired; use lmctl prompt, lmctl cron, mailbox remote execution for cross-site work, or lmchat"};let n=mM(e,_M);if(n){let s=n.validate?.(e);return s?{allowed:!1,code:"command_not_allowed",message:s}:{allowed:!0}}let r=mM(e,gM);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 yM}from"node:child_process";var Ure=5e3,Fre="/bin/sh";function wM(e){if(!Number.isInteger(e.timeoutMs)||e.timeoutMs<1)throw new Error("timeoutMs must be a positive integer");let t=e.killGraceMs??Ure;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 TM(e,t,n,r){return new Promise((s,o)=>{let i=r(),a=[],c=[],l=!1,u=!1,d,f,m=h=>{u||(u=!0,d&&clearTimeout(d),f&&clearTimeout(f),s(h))},p=h=>{u||(u=!0,d&&clearTimeout(d),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})}),d=setTimeout(()=>{l=!0,wT(e.pid,"SIGTERM"),n>0?f=setTimeout(()=>{wT(e.pid,"SIGKILL")},n):wT(e.pid,"SIGKILL")},t)})}async function vM(e,t){if(e.trim().length===0)throw new Error("command must be non-empty");let{killGraceMs:n,now:r}=wM(t),s=t.shellPath??Fre,o=yM(s,["-c",e],{cwd:t.cwd,env:t.env,detached:!0,stdio:["ignore","pipe","pipe"]});return TM(o,t.timeoutMs,n,r)}async function SM(e,t){if(e.length===0)throw new Error("argv must be non-empty");let{killGraceMs:n,now:r}=wM(t),s=yM(e[0],e.slice(1),{cwd:t.cwd,env:t.env,detached:!0,stdio:["ignore","pipe","pipe"]});return TM(s,t.timeoutMs,n,r)}function wT(e,t){if(e)try{process.kill(-e,t)}catch(n){if(!jre(n))throw n}}function jre(e){return!!e&&typeof e=="object"&&"code"in e&&e.code==="ESRCH"}var bM=1e3,qre=6e4,Bre=20,Wre=1e3;async function IM(e,t){let n=t.runCommand??vM,r=t.runCommandArgv??SM,s=t.sleep??Xre,o=t.pollNow??Date.now,i=t.now??(()=>new Date),a=t.stderr??(d=>process.stderr.write(`${d}
2353
+ `)),c=t.shouldStop??(()=>!1),l=bM,u=!1;for(ur(a,i,"info","daemon_started",{mailbox:e.mailbox}),e.allowAnonymous&&ur(a,i,"warn","anonymous_execution_enabled",{mailbox:e.mailbox,warning:"REMOTE SHELL OPEN TO EVERY AUTHENTICATED LMMAIL USER"});!c();)try{let d=o(),f=await t.client.listMessages(e.mailbox,{status:"unread",after:0,...e.once?{}:{wait_s:Bre}}),m=Math.max(0,o()-d);for(let p of f.messages){if(c())break;let h=Gre(e,p.sender);if(h==="anonymous"&&!e.allowAnonymous){await t.client.getMessageMetadata(e.mailbox,p.seq),ur(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=sM(g)}catch(A){ur(a,i,"warn","message_rejected",{seq:p.seq,sender:p.sender,sender_trust:h,reason:"malformed_request",error:TT(A)});continue}let E=e.execAllowlist?pM(w.command):void 0,y=e.execAllowlist?E?EM(E,h):{allowed:!1,code:"malformed_command",message:"command could not be safely tokenized into arguments"}:{allowed:!0};if(!y.allowed){ur(a,i,"warn","command_rejected",{id:w.id,sender:p.sender,sender_trust:h,...w.from===void 0?{}:{asserted_from:w.from},code:y.code,seq:p.seq}),await AM(t.client,w.reply_to,{id:w.id,exit_code:126,stdout:"",stderr:JSON.stringify({error:{code:y.code,message:y.message}}),duration_ms:0,timed_out:!1,sender_trust:h,sender:p.sender});continue}ur(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=E?await r(E,{timeoutMs:Math.min(w.timeout_s,e.timeoutCapSeconds)*1e3}):await n(w.command,{timeoutMs:Math.min(w.timeout_s,e.timeoutCapSeconds)*1e3})}catch(A){ur(a,i,"error","command_failed",{id:w.id,sender:p.sender,sender_trust:h,...w.from===void 0?{}:{asserted_from:w.from},error:TT(A)});continue}let v=await AM(t.client,w.reply_to,{id:w.id,...T,sender_trust:h,sender:p.sender});ur(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:v.envelope.truncated})}if(l=bM,e.once||c())break;f.messages.length===0&&m<Wre&&(u||(ur(a,i,"warn","long_poll_unsupported",{elapsed_ms:m,fallback_interval_ms:e.pollIntervalMs}),u=!0),await s(e.pollIntervalMs))}catch(d){if(ur(a,i,"error","api_error",{error:TT(d),retry_ms:l}),c())break;await s(l),l=Math.min(l*2,qre)}ur(a,i,"info","daemon_stopped",{mailbox:e.mailbox})}function Gre(e,t){return e.adminUsers.has(t)?"admin":e.allowUsers.has(t)?"registered":"anonymous"}async function AM(e,t,n){let r=aM(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 ur(e,t,n,r,s){e(JSON.stringify({ts:t().toISOString(),level:n,event:r,...s}))}function Xre(e){return new Promise(t=>setTimeout(t,e))}function TT(e){return e instanceof Error?e.message:String(e)}var Vre=5e3,Jre=300;async function kM(e,t){await e.createMailbox(t,{tolerate409:!0})}function Dp(e){let t=!1,n=!1,r=Promise.resolve(),s=e.stderr??(c=>process.stderr.write(`${c}
2354
+ `)),o=e.runDaemonLoopImpl??IM,i={mailbox:e.mailbox,allowUsers:e.allowUsers,adminUsers:e.adminUsers,allowAnonymous:e.allowAnonymous,apiUrl:"",pollIntervalMs:e.pollIntervalMs??Vre,timeoutCapSeconds:e.timeoutCapSeconds??Jre,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 vT="remote_execute",xM="remote_execute.runtime",Yre="https://lmctl.ai/lmmail",LM=1e4;function wo(e){return(e.LMCTL_LMMAIL_API_URL?.trim()||e.LMMAIL_API_URL?.trim()||Yre).replace(/\/+$/,"")}function ST(e){return(e??"").split(",").map(t=>t.trim()).filter(t=>t.length>0)}function RM(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")?e:null}function Ka(e){let t=e.prepare("SELECT v FROM kv WHERE k = ?").get(vT);if(!t)return null;try{let n=JSON.parse(t.v),r=RM(n.adminUsers),s=RM(n.allowUsers);return n.revision===void 0&&(n.revision=0),typeof n.revision!="number"||!Number.isInteger(n.revision)||n.revision<0||typeof n.enabled!="boolean"||r===null||s===null||typeof n.allowAnonymous!="boolean"||typeof n.apiUrl!="string"||typeof n.updatedAt!="string"?null:{revision:n.revision,enabled:n.enabled,adminUsers:r,allowUsers:s,allowAnonymous:n.allowAnonymous,apiUrl:n.apiUrl,updatedAt:n.updatedAt}}catch{return null}}function Kre(e){return e.prepare("SELECT v FROM kv WHERE k = ?").get(vT)!==void 0&&Ka(e)===null}function CM(e,t){e.transaction(()=>{let n=Ka(e),r={...t,revision:(n?.revision??0)+1};e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(vT,JSON.stringify(r))}).immediate()}function zre(e){let t=e.prepare("SELECT v FROM kv WHERE k = ?").get(xM);if(!t)return null;try{let n=JSON.parse(t.v);return typeof n.pid!="number"||typeof n.running!="boolean"||typeof n.ts!="string"||typeof n.mailbox!="string"?null:{pid:n.pid,running:n.running,mailbox:n.mailbox,lastError:typeof n.lastError=="string"?n.lastError:null,ts:n.ts}}catch{return null}}function NM(e,t){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(xM,JSON.stringify(t))}var $p=(e,t)=>Ut({apiUrl:dn(e,"the lmmail endpoint"),appkey:t,fetch:ss()});async function OM(e){let t=e.env??process.env;dn(wo(t),"the lmmail endpoint");let n=await e.acquire(),r=[...new Set(e.policy?.adminUsers??[])],s=[...new Set(e.policy?.allowUsers??[])],o=e.policy?.allowAnonymous===!0;if(r.length===0&&s.length===0&&!o){let u=n.envelope?.user_id;if(typeof u!="string"||u.length===0)throw new Error("cannot tell which user id is yours from this appkey (it came from the environment, not a key file); name who may execute with --exec-allow <user_id[,user_id...]> (read-only commands) and/or --exec-admin");s=[u]}let i=wo(t),a=(e.createClient??$p)(i,n.appkey),c=Zn(e.siteId),l=er(e.siteId);return await a.createMailbox(c,{tolerate409:!0}),await a.createMailbox(l,{tolerate409:!0}),CM(e.db,{enabled:!0,adminUsers:r,allowUsers:s,allowAnonymous:o,apiUrl:i,updatedAt:(e.now?.()??new Date).toISOString()}),{siteId:e.siteId,contentMailbox:c,execMailbox:l,apiUrl:i,adminUsers:r,allowUsers:s,allowAnonymous:o}}async function DM(e){let t=e.env??process.env,n=Ka(e.db);CM(e.db,{enabled:!1,adminUsers:n?.adminUsers??[],allowUsers:n?.allowUsers??[],allowAnonymous:n?.allowAnonymous??!1,apiUrl:n?.apiUrl??wo(t),updatedAt:(e.now?.()??new Date).toISOString()});let r=await e.acquire(),s=(e.createClient??$p)(n?.apiUrl??wo(t),r.appkey),o=er(e.siteId);try{let i=await s.deleteMailbox(o);return{siteId:e.siteId,execMailbox:o,mailboxDeleted:!0,messagesDiscarded:i.messages_deleted}}catch(i){if(i instanceof In&&i.status===404)return{siteId:e.siteId,execMailbox:o,mailboxDeleted:!1,messagesDiscarded:0};throw i}}async function $M(e){let t=e.env??process.env,n=Ka(e.db),r=Kre(e.db),s=n?.apiUrl??wo(t),o=er(e.siteId),i=null,a=null,c=e.resolveKey();if(c===null)a="no appkey on this machine, so the server was not asked (run `lmbee whoami` to sign in)";else try{i=(await(e.createClient??$p)(s,c.appkey).listMailboxes()).some(_=>_.mailbox_name===o)}catch(h){a=`could not ask the server: ${h instanceof Error?h.message:String(h)}`}let l=(e.readLock??lr)(e.dbPath),u=l.kind==="held"?{running:!0,pid:l.identity.pid}:{running:!1,pid:null},d=zre(e.db),f=(e.now??Date.now)(),m=!1,p=null;return u.running?d===null?p=n?.enabled?"the daemon has not reported on remote execution yet":null:d.pid!==u.pid?p="the last report is from a previous daemon process":f-Date.parse(d.ts)>3*LM?p="the daemon has stopped reporting (stale heartbeat)":(m=d.running,p=d.lastError!==null?`daemon reports: ${d.lastError}`:null):p="no `lmbee serve` daemon is running, so nothing answers exec requests",{siteId:e.siteId,enabled:n?.enabled??(r?!1:null),settingUnreadable:r,policy:n?{adminUsers:n.adminUsers,allowUsers:n.allowUsers,allowAnonymous:n.allowAnonymous}:null,apiUrl:s,execMailbox:o,execMailboxExists:i,execMailboxNote:a,daemon:u,workerRunning:m,workerNote:p}}function bT(e){let t=[];if(t.push(`remote_execute: ${e.enabled===null?"never enabled":e.enabled?"enabled":"disabled"}${e.settingUnreadable?" (the stored setting is unreadable; treated as disabled)":""}`),t.push(`site: ${e.siteId}`),t.push(`exec mailbox: ${e.execMailbox} (${e.execMailboxExists===null?"unknown":e.execMailboxExists?"exists":"does not exist"}${e.execMailboxNote?`; ${e.execMailboxNote}`:""})`),t.push(`daemon: ${e.daemon.running?`running (pid ${e.daemon.pid})`:"not running"}`),t.push(`worker: ${e.workerRunning?"running":"not running"}${e.workerNote?` (${e.workerNote})`:""}`),e.policy){let n=[e.policy.adminUsers.length?`admin: ${e.policy.adminUsers.join(", ")}`:"",e.policy.allowUsers.length?`allow: ${e.policy.allowUsers.join(", ")}`:"",e.policy.allowAnonymous?"anonymous":""].filter(Boolean).join("; ");t.push(`who may run: ${n||"(nobody)"}`)}return t.push(`server: ${e.apiUrl}`),t.join(`
2355
2355
  `)}function MM(e){let t=e.stderr??(C=>process.stderr.write(`${C}
2356
- `)),n=e.intervalMs??LM,r=e.healthCheckMs??5*6e4,s=e.healthTimeoutMs??15e3,o=e.createWorker??Dp,i=e.createClient??$p,a=e.reauthorize??e.acquire,c=e.pid??process.pid,l=er(e.siteId),u=e.monotonicMs??(()=>performance.now()),d=null,f="",m="",p=null,h=0,_=!1,g=0,w=-1,E=null,y=!1,T=null,v=!1,A=Promise.resolve(),I=[],N=null,x=null,R=0,k=0,O=-1,D=C=>{N=C,C!==x&&(x=C,t(`[remote_execute] ${C}`))},S=()=>{try{NM(e.db,{pid:c,running:d?.isRunning()===!0,mailbox:l,lastError:N,ts:(e.now?.()??new Date).toISOString()})}catch{}},b=()=>{d&&(d.stop(),I.push(d.whenIdle()),d=null,f="",m="",p=null,t("[remote_execute] worker stopped"))},L=C=>JSON.stringify([C.adminUsers,C.allowUsers,C.allowAnonymous,C.apiUrl]),$=C=>{try{let P=Ka(e.db);return!v&&P!==null&&P.enabled&&P.revision===C}catch{return!1}};async function j(){if(v)return;let C;try{C=Ka(e.db)}catch(M){b(),D(`cannot read the setting, worker stopped: ${M instanceof Error?M.message:String(M)}`),S();return}if(C===null||!C.enabled){b(),N=null,x=null,y=!1,S();return}C.revision!==O&&(R=0,k=0);let P=L(C);if(d&&P!==f&&(t("[remote_execute] policy changed; restarting the worker"),b()),d&&e.peekKey){let M=e.peekKey();M!==null&&M!==m&&(t("[remote_execute] the appkey on disk changed; restarting the worker with it"),b(),y=!1)}if(E!==null&&d&&w===g){let M=E;E=null,b(),y=!0,R=0,D(`the server rejected the appkey (HTTP ${M}); worker stopped, signing in again (the link is in the daemon log)`),S()}if(E=null,d&&p&&!_&&u()>=h){h=u()+r,_=!0;let M=p,B=g,W,ne=new Promise((ue,X)=>{W=setTimeout(()=>X(new Error("health check timed out")),s),W.unref?.()}),z=M.listMailboxes();z.then(()=>{},()=>{}).finally(()=>{_=!1}),Promise.race([z,ne]).catch(ue=>{ue instanceof In&&(ue.status===401||ue.status===403)&&(E=ue.status,w=B)}).finally(()=>{W&&clearTimeout(W)})}if(!d&&u()>=R)try{let M=await(y?a():e.acquire());if(!$(C.revision)){S();return}let B=i(C.apiUrl,M.appkey);d=o({client:B,mailbox:l,adminUsers:new Set(C.adminUsers),allowUsers:new Set(C.allowUsers),allowAnonymous:C.allowAnonymous}),f=P,m=M.appkey,p=B,g+=1,h=u()+r,y=!1,d.start(),N=null,x=null,k=0,R=0,t(`[remote_execute] worker started on ${l}`)}catch(M){k=k===0?6e4:Math.min(k*2,15*6e4),R=u()+k,O=C.revision,D(`cannot start the worker (next try in ${Math.round(k/1e3)}s): ${M instanceof Error?M.message:String(M)}`)}S()}let F=()=>(A=A.then(()=>j()).catch(C=>{D(`unexpected failure: ${C instanceof Error?C.message:String(C)}`)}),A);return{start(){T||v||(F(),T=setInterval(()=>void F(),n),T.unref?.())},stop(){v=!0,T&&clearInterval(T),T=null,d&&(d.stop(),I.push(d.whenIdle()),d=null);try{NM(e.db,{pid:c,running:!1,mailbox:l,lastError:N,ts:(e.now?.()??new Date).toISOString()})}catch{}},tick:F,isWorkerRunning:()=>d?.isRunning()===!0,whenIdle:async()=>{await Promise.allSettled(I)}}}import{basename as Zre}from"node:path";function Mp(e,t,n){let r=e.prepare("SELECT v FROM kv WHERE k = ?").get(t);if(!r)return null;try{let s=JSON.parse(r.v);if(typeof s!="object"||s===null||Array.isArray(s))return null;let o=s.revision===void 0?0:s.revision;if(typeof o!="number"||!Number.isInteger(o)||o<0)return null;let i=n(s);return i===null?null:{...i,revision:o}}catch{return null}}function PM(e,t,n){return e.prepare("SELECT 1 FROM kv WHERE k = ?").get(t)!==void 0&&Mp(e,t,n)===null}function UM(e,t,n,r){let s=0;return e.transaction(()=>{s=(Mp(e,t,r)?.revision??0)+1,e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(t,JSON.stringify({...n,revision:s}))}).immediate(),s}function Pp(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(t,JSON.stringify(n))}function AT(e,t,n){let r=e.prepare("SELECT v FROM kv WHERE k = ?").get(t);if(!r)return null;try{let s=JSON.parse(r.v);return typeof s=="object"&&s!==null?n(s):null}catch{return null}}var IT="recent_agents",jM="recent_agents.runtime",ese="https://lmctl.ai/auth",HM=6e4,Up=200,FM=/^[A-Za-z0-9._:/-]{1,128}$/,tse=32,kT=e=>typeof e.enabled=="boolean"&&typeof e.authBaseUrl=="string"&&typeof e.mailApiUrl=="string"&&typeof e.updatedAt=="string"?{enabled:e.enabled,authBaseUrl:e.authBaseUrl,mailApiUrl:e.mailApiUrl,updatedAt:e.updatedAt}:null,za=e=>Mp(e,IT,kT),nse=e=>PM(e,IT,kT),qM=(e,t)=>UM(e,IT,t,kT),rse=e=>AT(e,jM,t=>typeof t.pid=="number"&&typeof t.ts=="string"?{pid:t.pid,ts:t.ts,lastPublishedAt:typeof t.lastPublishedAt=="string"?t.lastPublishedAt:null,agentCount:typeof t.agentCount=="number"?t.agentCount:null,lastError:typeof t.lastError=="string"?t.lastError:null}:null),RT="recent_agents.published",Fp=6e4;function hu(e){return AT(e,RT,t=>typeof t.dirty=="boolean"&&typeof t.lastNonEmptyAt=="number"?(()=>{let n=typeof t.authBaseUrl=="string"?t.authBaseUrl:"",r=Array.isArray(t.authBaseUrls)?t.authBaseUrls.filter(s=>typeof s=="string"&&s!==""):[];return{dirty:t.dirty,lastNonEmptyAt:t.lastNonEmptyAt,authBaseUrl:n,authBaseUrls:r.length>0?r:n!==""?[n]:[]}})():null)}function BM(e,t,n){e.transaction(()=>{let r=hu(e),o=[...(r?.dirty?r.authBaseUrls:[]).filter(i=>i!==n),n].slice(-8);Pp(e,RT,{dirty:!0,lastNonEmptyAt:t,authBaseUrl:n,authBaseUrls:o})}).immediate()}function WM(e,t,n,r=!0){let s=!1;return e.transaction(()=>{let o=hu(e);if(o===null||!o.dirty){s=!0;return}n!==void 0&&o.lastNonEmptyAt!==n||t-o.lastNonEmptyAt<Fp||!r||(Pp(e,RT,{...o,dirty:!1}),s=!0)}).immediate(),s}function GM(e,t,n){return e?.dirty&&e.authBaseUrls.length>0?e.authBaseUrls:[t?.authBaseUrl??_u(n)]}function _u(e){return(e.LMCTL_AUTH_BASE_URL?.trim()||e.LMCTL_AUTH_URL?.trim()||ese).replace(/\/+$/,"")}function sse(e){if(e===null)return null;let t=e.lastIndexOf(":");if(t<=0||t===e.length-1)return null;let n=e.slice(0,t);return/\.(?:lmctl|lmc)$/i.test(n)?{team:Zre(n).replace(/\.(?:lmctl|lmc)$/i,""),alias:e.slice(t+1)}:null}function XM(e){let t={notATeamTarget:0,invalidName:0,overCap:0},n=new Map,r=(i,a)=>{let c=sse(i);if(c===null){t.notATeamTarget+=1;return}if(!FM.test(c.team)||!FM.test(c.alias)){t.invalidName+=1;return}let l=`${c.team}\0${c.alias}`;n.has(l)||n.set(l,{team:c.team,alias:c.alias,state:a})};for(let i of e.running)r(i.target,"running");for(let i of e.dead)r(i.target,"dead");for(let i of[...e.idle].sort((a,c)=>Date.parse(c.ended_at)-Date.parse(a.ended_at)))r(i.target,"idle");let s=[...n.values()];s.length>Up&&(t.overCap=s.length-Up);let o=s.slice(0,Up);for(let i of o)if(i.state.length>tse)throw new Error("internal: roster state exceeds the server limit");return{agents:o,skipped:t}}var pu=e=>String(e??"").replace(/[\u0000-\u001f\u007f-\u009f\u2028\u2029]/g,"?"),vi=class extends Error{status;constructor(t,n,r){super(pu(r)),this.status=t,this.name="FleetHttpError",this.code=pu(n)}code};async function NT(e,t,n,r){dn(n.authBaseUrl,"the fleet endpoint");let s=AbortSignal.timeout(n.timeoutMs??2e4),o=await(n.fetchImpl??ss())(`${n.authBaseUrl.replace(/\/+$/,"")}${t}`,{method:e,headers:{authorization:`Bearer ${n.appkey}`,...r===void 0?{}:{"content-type":"application/json"}},...r===void 0?{}:{body:JSON.stringify(r)},signal:n.signal?AbortSignal.any([s,n.signal]):s}),i=await o.text(),a=null;try{a=i===""?null:JSON.parse(i)}catch{a=null}if(!o.ok){let c=a?.error,l=typeof c=="string"?c.split(":")[0]:typeof c?.code=="string"?c.code:`http_${o.status}`,u=typeof c=="string"?c:"";throw new vi(o.status,l,`${e} ${t} -> HTTP ${o.status} ${l}${u&&u!==l?` (${u})`:""}`)}return a}var mu=(e,t,n)=>NT("PUT",`/fleet/sites/${encodeURIComponent(t)}/report`,e,{agents:n}),xT=e=>NT("GET","/fleet",e);function VM(e,t={}){let n=new URLSearchParams;return t.site&&n.set("site",t.site),t.liveness&&n.set("liveness",t.liveness),NT("GET",`/fleet/agents${n.size>0?`?${n}`:""}`,e)}var ose=(e,t)=>Ut({apiUrl:dn(e,"the lmmail endpoint"),appkey:t,fetch:ss()});async function JM(e){let t=e.env??process.env,n=dn(_u(t),"the fleet endpoint"),r=dn(wo(t),"the lmmail endpoint"),s=await e.acquire();await(e.createClient??ose)(r,s.appkey).createMailbox(Zn(e.siteId),{tolerate409:!0});let o=XM(await(e.loadReport??(()=>qe()))());o.agents.length>0&&BM(e.db,(e.now?.()??new Date).getTime(),n);let i=await mu({authBaseUrl:n,appkey:s.appkey,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}},e.siteId,o.agents);return qM(e.db,{enabled:!0,authBaseUrl:n,mailApiUrl:r,updatedAt:(e.now?.()??new Date).toISOString()}),{siteId:e.siteId,agentCount:i.agent_count,reportedAt:i.reported_at,skipped:o.skipped,authBaseUrl:n}}async function YM(e){let t=e.env??process.env,n=za(e.db),r=hu(e.db),s=GM(r,n,t),o=s[s.length-1];qM(e.db,{enabled:!1,authBaseUrl:o,mailApiUrl:n?.mailApiUrl??wo(t),updatedAt:(e.now?.()??new Date).toISOString()});let i=e.resolveKey();if(i===null)return{siteId:e.siteId,emptied:!1,note:"no appkey on this machine, so the published roster was not emptied; it goes stale within 3 minutes"};try{for(let l of s)await mu({authBaseUrl:l,appkey:i.appkey,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}},e.siteId,[]);let c=!(e.daemonRunning?.()??!1)&&WM(e.db,(e.now?.()??new Date).getTime(),r?.lastNonEmptyAt);return{siteId:e.siteId,emptied:!0,note:c?null:"a running daemon may still have a report in flight; it will confirm the retraction after the quiet period"}}catch(a){return{siteId:e.siteId,emptied:!1,note:`could not empty the published roster (${a instanceof Error?a.message:String(a)}); it goes stale within 3 minutes`}}}async function KM(e){let t=e.env??process.env,n=za(e.db),r=nse(e.db),s=n?.authBaseUrl??_u(t),o=(e.readLock??lr)(e.dbPath),i=o.kind==="held"?{running:!0,pid:o.identity.pid}:{running:!1,pid:null},a=rse(e.db),c=null,l=null,u=null,d=null;i.running?a===null?c=n?.enabled?"the daemon has not reported yet":null:a.pid!==i.pid?c="the last report is from a previous daemon process":(e.now??Date.now)()-Date.parse(a.ts)>3*HM?c="the daemon has stopped reporting (stale heartbeat)":(l=a.lastPublishedAt,u=a.agentCount,d=a.lastError):c=n?.enabled?"no `lmbee serve` daemon is running, so nothing is being published":null;let f=null,m=null,p=e.resolveKey();if(p===null)m="no appkey on this machine, so the server was not asked (run `lmbee whoami` to sign in)";else try{let g=(await xT({authBaseUrl:s,appkey:p.appkey,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}})).sites.find(w=>w.site_uuid===e.siteId);f=g?{liveness:g.liveness,reportedAt:g.reported_at,agents:g.agents.length}:null,g||(m="the server does not list this site yet")}catch(_){m=`could not ask the server: ${_ instanceof Error?_.message:String(_)}`}let h=n?.enabled!==!0&&hu(e.db)?.dirty===!0;return{siteId:e.siteId,enabled:n?.enabled??(r?!1:null),settingUnreadable:r,authBaseUrl:s,daemon:i,lastPublishedAt:l,agentCount:u,lastError:d,server:f,serverNote:m,note:c,retractionPending:h}}function LT(e){let t=[`recent_agents: ${e.enabled===null?"never enabled":e.enabled?"enabled":"disabled"}${e.settingUnreadable?" (the stored setting is unreadable; treated as disabled)":""}`,` publishing: ${e.lastPublishedAt?`last at ${e.lastPublishedAt} (${e.agentCount??"?"} agents)`:"nothing published by the daemon yet"}${e.note?` (${e.note})`:""}${e.lastError?`; last error: ${e.lastError}`:""}`,` server view: ${e.server?`${e.server.liveness}, ${e.server.agents} agents${e.server.reportedAt?`, reported ${e.server.reportedAt}`:""}`:"unknown"}${e.serverNote?` (${e.serverNote})`:""}`,` server: ${e.authBaseUrl}`];return e.retractionPending&&t.splice(2,0," retraction: PENDING -- a non-empty roster may still be published; a running `lmbee serve` keeps sending an empty one until it is confirmed gone"),t.join(`
2356
+ `)),n=e.intervalMs??LM,r=e.healthCheckMs??5*6e4,s=e.healthTimeoutMs??15e3,o=e.createWorker??Dp,i=e.createClient??$p,a=e.reauthorize??e.acquire,c=e.pid??process.pid,l=er(e.siteId),u=e.monotonicMs??(()=>performance.now()),d=null,f="",m="",p=null,h=0,_=!1,g=0,w=-1,E=null,y=!1,T=null,v=!1,A=Promise.resolve(),I=[],N=null,x=null,R=0,k=0,O=-1,D=C=>{N=C,C!==x&&(x=C,t(`[remote_execute] ${C}`))},S=()=>{try{NM(e.db,{pid:c,running:d?.isRunning()===!0,mailbox:l,lastError:N,ts:(e.now?.()??new Date).toISOString()})}catch{}},b=()=>{d&&(d.stop(),I.push(d.whenIdle()),d=null,f="",m="",p=null,t("[remote_execute] worker stopped"))},L=C=>JSON.stringify([C.adminUsers,C.allowUsers,C.allowAnonymous,C.apiUrl]),$=C=>{try{let P=Ka(e.db);return!v&&P!==null&&P.enabled&&P.revision===C}catch{return!1}};async function j(){if(v)return;let C;try{C=Ka(e.db)}catch(M){b(),D(`cannot read the setting, worker stopped: ${M instanceof Error?M.message:String(M)}`),S();return}if(C===null||!C.enabled){b(),N=null,x=null,y=!1,S();return}C.revision!==O&&(R=0,k=0);let P=L(C);if(d&&P!==f&&(t("[remote_execute] policy changed; restarting the worker"),b()),d&&e.peekKey){let M=e.peekKey();M!==null&&M!==m&&(t("[remote_execute] the appkey on disk changed; restarting the worker with it"),b(),y=!1)}if(E!==null&&d&&w===g){let M=E;E=null,b(),y=!0,R=0,D(`the server rejected the appkey (HTTP ${M}); worker stopped, signing in again (the link is in the daemon log)`),S()}if(E=null,d&&p&&!_&&u()>=h){h=u()+r,_=!0;let M=p,B=g,W,ne=new Promise((ue,X)=>{W=setTimeout(()=>X(new Error("health check timed out")),s),W.unref?.()}),z=M.listMailboxes();z.then(()=>{},()=>{}).finally(()=>{_=!1}),Promise.race([z,ne]).catch(ue=>{ue instanceof In&&(ue.status===401||ue.status===403)&&(E=ue.status,w=B)}).finally(()=>{W&&clearTimeout(W)})}if(!d&&u()>=R)try{let M=await(y?a():e.acquire());if(!$(C.revision)){S();return}let B=i(C.apiUrl,M.appkey);d=o({client:B,mailbox:l,adminUsers:new Set(C.adminUsers),allowUsers:new Set(C.allowUsers),allowAnonymous:C.allowAnonymous}),f=P,m=M.appkey,p=B,g+=1,h=u()+r,y=!1,d.start(),N=null,x=null,k=0,R=0,t(`[remote_execute] worker started on ${l}`)}catch(M){k=k===0?6e4:Math.min(k*2,15*6e4),R=u()+k,O=C.revision,D(`cannot start the worker (next try in ${Math.round(k/1e3)}s): ${M instanceof Error?M.message:String(M)}`)}S()}let F=()=>(A=A.then(()=>j()).catch(C=>{D(`unexpected failure: ${C instanceof Error?C.message:String(C)}`)}),A);return{start(){T||v||(F(),T=setInterval(()=>void F(),n),T.unref?.())},stop(){v=!0,T&&clearInterval(T),T=null,d&&(d.stop(),I.push(d.whenIdle()),d=null);try{NM(e.db,{pid:c,running:!1,mailbox:l,lastError:N,ts:(e.now?.()??new Date).toISOString()})}catch{}},tick:F,isWorkerRunning:()=>d?.isRunning()===!0,whenIdle:async()=>{await Promise.allSettled(I)}}}import{basename as Qre}from"node:path";function Mp(e,t,n){let r=e.prepare("SELECT v FROM kv WHERE k = ?").get(t);if(!r)return null;try{let s=JSON.parse(r.v);if(typeof s!="object"||s===null||Array.isArray(s))return null;let o=s.revision===void 0?0:s.revision;if(typeof o!="number"||!Number.isInteger(o)||o<0)return null;let i=n(s);return i===null?null:{...i,revision:o}}catch{return null}}function PM(e,t,n){return e.prepare("SELECT 1 FROM kv WHERE k = ?").get(t)!==void 0&&Mp(e,t,n)===null}function UM(e,t,n,r){let s=0;return e.transaction(()=>{s=(Mp(e,t,r)?.revision??0)+1,e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(t,JSON.stringify({...n,revision:s}))}).immediate(),s}function Pp(e,t,n){e.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(t,JSON.stringify(n))}function AT(e,t,n){let r=e.prepare("SELECT v FROM kv WHERE k = ?").get(t);if(!r)return null;try{let s=JSON.parse(r.v);return typeof s=="object"&&s!==null?n(s):null}catch{return null}}var IT="recent_agents",jM="recent_agents.runtime",Zre="https://lmctl.ai/auth",HM=6e4,Up=200,FM=/^[A-Za-z0-9._:/-]{1,128}$/,ese=32,kT=e=>typeof e.enabled=="boolean"&&typeof e.authBaseUrl=="string"&&typeof e.mailApiUrl=="string"&&typeof e.updatedAt=="string"?{enabled:e.enabled,authBaseUrl:e.authBaseUrl,mailApiUrl:e.mailApiUrl,updatedAt:e.updatedAt}:null,za=e=>Mp(e,IT,kT),tse=e=>PM(e,IT,kT),qM=(e,t)=>UM(e,IT,t,kT),nse=e=>AT(e,jM,t=>typeof t.pid=="number"&&typeof t.ts=="string"?{pid:t.pid,ts:t.ts,lastPublishedAt:typeof t.lastPublishedAt=="string"?t.lastPublishedAt:null,agentCount:typeof t.agentCount=="number"?t.agentCount:null,lastError:typeof t.lastError=="string"?t.lastError:null}:null),RT="recent_agents.published",Fp=6e4;function hu(e){return AT(e,RT,t=>typeof t.dirty=="boolean"&&typeof t.lastNonEmptyAt=="number"?(()=>{let n=typeof t.authBaseUrl=="string"?t.authBaseUrl:"",r=Array.isArray(t.authBaseUrls)?t.authBaseUrls.filter(s=>typeof s=="string"&&s!==""):[];return{dirty:t.dirty,lastNonEmptyAt:t.lastNonEmptyAt,authBaseUrl:n,authBaseUrls:r.length>0?r:n!==""?[n]:[]}})():null)}function BM(e,t,n){e.transaction(()=>{let r=hu(e),o=[...(r?.dirty?r.authBaseUrls:[]).filter(i=>i!==n),n].slice(-8);Pp(e,RT,{dirty:!0,lastNonEmptyAt:t,authBaseUrl:n,authBaseUrls:o})}).immediate()}function WM(e,t,n,r=!0){let s=!1;return e.transaction(()=>{let o=hu(e);if(o===null||!o.dirty){s=!0;return}n!==void 0&&o.lastNonEmptyAt!==n||t-o.lastNonEmptyAt<Fp||!r||(Pp(e,RT,{...o,dirty:!1}),s=!0)}).immediate(),s}function GM(e,t,n){return e?.dirty&&e.authBaseUrls.length>0?e.authBaseUrls:[t?.authBaseUrl??_u(n)]}function _u(e){return(e.LMCTL_AUTH_BASE_URL?.trim()||e.LMCTL_AUTH_URL?.trim()||Zre).replace(/\/+$/,"")}function rse(e){if(e===null)return null;let t=e.lastIndexOf(":");if(t<=0||t===e.length-1)return null;let n=e.slice(0,t);return/\.(?:lmctl|lmc)$/i.test(n)?{team:Qre(n).replace(/\.(?:lmctl|lmc)$/i,""),alias:e.slice(t+1)}:null}function XM(e){let t={notATeamTarget:0,invalidName:0,overCap:0},n=new Map,r=(i,a)=>{let c=rse(i);if(c===null){t.notATeamTarget+=1;return}if(!FM.test(c.team)||!FM.test(c.alias)){t.invalidName+=1;return}let l=`${c.team}\0${c.alias}`;n.has(l)||n.set(l,{team:c.team,alias:c.alias,state:a})};for(let i of e.running)r(i.target,"running");for(let i of e.dead)r(i.target,"dead");for(let i of[...e.idle].sort((a,c)=>Date.parse(c.ended_at)-Date.parse(a.ended_at)))r(i.target,"idle");let s=[...n.values()];s.length>Up&&(t.overCap=s.length-Up);let o=s.slice(0,Up);for(let i of o)if(i.state.length>ese)throw new Error("internal: roster state exceeds the server limit");return{agents:o,skipped:t}}var pu=e=>String(e??"").replace(/[\u0000-\u001f\u007f-\u009f\u2028\u2029]/g,"?"),vi=class extends Error{status;constructor(t,n,r){super(pu(r)),this.status=t,this.name="FleetHttpError",this.code=pu(n)}code};async function NT(e,t,n,r){dn(n.authBaseUrl,"the fleet endpoint");let s=AbortSignal.timeout(n.timeoutMs??2e4),o=await(n.fetchImpl??ss())(`${n.authBaseUrl.replace(/\/+$/,"")}${t}`,{method:e,headers:{authorization:`Bearer ${n.appkey}`,...r===void 0?{}:{"content-type":"application/json"}},...r===void 0?{}:{body:JSON.stringify(r)},signal:n.signal?AbortSignal.any([s,n.signal]):s}),i=await o.text(),a=null;try{a=i===""?null:JSON.parse(i)}catch{a=null}if(!o.ok){let c=a?.error,l=typeof c=="string"?c.split(":")[0]:typeof c?.code=="string"?c.code:`http_${o.status}`,u=typeof c=="string"?c:"";throw new vi(o.status,l,`${e} ${t} -> HTTP ${o.status} ${l}${u&&u!==l?` (${u})`:""}`)}return a}var mu=(e,t,n)=>NT("PUT",`/fleet/sites/${encodeURIComponent(t)}/report`,e,{agents:n}),xT=e=>NT("GET","/fleet",e);function VM(e,t={}){let n=new URLSearchParams;return t.site&&n.set("site",t.site),t.liveness&&n.set("liveness",t.liveness),NT("GET",`/fleet/agents${n.size>0?`?${n}`:""}`,e)}var sse=(e,t)=>Ut({apiUrl:dn(e,"the lmmail endpoint"),appkey:t,fetch:ss()});async function JM(e){let t=e.env??process.env,n=dn(_u(t),"the fleet endpoint"),r=dn(wo(t),"the lmmail endpoint"),s=await e.acquire();await(e.createClient??sse)(r,s.appkey).createMailbox(Zn(e.siteId),{tolerate409:!0});let o=XM(await(e.loadReport??(()=>qe()))());o.agents.length>0&&BM(e.db,(e.now?.()??new Date).getTime(),n);let i=await mu({authBaseUrl:n,appkey:s.appkey,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}},e.siteId,o.agents);return qM(e.db,{enabled:!0,authBaseUrl:n,mailApiUrl:r,updatedAt:(e.now?.()??new Date).toISOString()}),{siteId:e.siteId,agentCount:i.agent_count,reportedAt:i.reported_at,skipped:o.skipped,authBaseUrl:n}}async function YM(e){let t=e.env??process.env,n=za(e.db),r=hu(e.db),s=GM(r,n,t),o=s[s.length-1];qM(e.db,{enabled:!1,authBaseUrl:o,mailApiUrl:n?.mailApiUrl??wo(t),updatedAt:(e.now?.()??new Date).toISOString()});let i=e.resolveKey();if(i===null)return{siteId:e.siteId,emptied:!1,note:"no appkey on this machine, so the published roster was not emptied; it goes stale within 3 minutes"};try{for(let l of s)await mu({authBaseUrl:l,appkey:i.appkey,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}},e.siteId,[]);let c=!(e.daemonRunning?.()??!1)&&WM(e.db,(e.now?.()??new Date).getTime(),r?.lastNonEmptyAt);return{siteId:e.siteId,emptied:!0,note:c?null:"a running daemon may still have a report in flight; it will confirm the retraction after the quiet period"}}catch(a){return{siteId:e.siteId,emptied:!1,note:`could not empty the published roster (${a instanceof Error?a.message:String(a)}); it goes stale within 3 minutes`}}}async function KM(e){let t=e.env??process.env,n=za(e.db),r=tse(e.db),s=n?.authBaseUrl??_u(t),o=(e.readLock??lr)(e.dbPath),i=o.kind==="held"?{running:!0,pid:o.identity.pid}:{running:!1,pid:null},a=nse(e.db),c=null,l=null,u=null,d=null;i.running?a===null?c=n?.enabled?"the daemon has not reported yet":null:a.pid!==i.pid?c="the last report is from a previous daemon process":(e.now??Date.now)()-Date.parse(a.ts)>3*HM?c="the daemon has stopped reporting (stale heartbeat)":(l=a.lastPublishedAt,u=a.agentCount,d=a.lastError):c=n?.enabled?"no `lmbee serve` daemon is running, so nothing is being published":null;let f=null,m=null,p=e.resolveKey();if(p===null)m="no appkey on this machine, so the server was not asked (run `lmbee whoami` to sign in)";else try{let g=(await xT({authBaseUrl:s,appkey:p.appkey,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}})).sites.find(w=>w.site_uuid===e.siteId);f=g?{liveness:g.liveness,reportedAt:g.reported_at,agents:g.agents.length}:null,g||(m="the server does not list this site yet")}catch(_){m=`could not ask the server: ${_ instanceof Error?_.message:String(_)}`}let h=n?.enabled!==!0&&hu(e.db)?.dirty===!0;return{siteId:e.siteId,enabled:n?.enabled??(r?!1:null),settingUnreadable:r,authBaseUrl:s,daemon:i,lastPublishedAt:l,agentCount:u,lastError:d,server:f,serverNote:m,note:c,retractionPending:h}}function LT(e){let t=[`recent_agents: ${e.enabled===null?"never enabled":e.enabled?"enabled":"disabled"}${e.settingUnreadable?" (the stored setting is unreadable; treated as disabled)":""}`,` publishing: ${e.lastPublishedAt?`last at ${e.lastPublishedAt} (${e.agentCount??"?"} agents)`:"nothing published by the daemon yet"}${e.note?` (${e.note})`:""}${e.lastError?`; last error: ${e.lastError}`:""}`,` server view: ${e.server?`${e.server.liveness}, ${e.server.agents} agents${e.server.reportedAt?`, reported ${e.server.reportedAt}`:""}`:"unknown"}${e.serverNote?` (${e.serverNote})`:""}`,` server: ${e.authBaseUrl}`];return e.retractionPending&&t.splice(2,0," retraction: PENDING -- a non-empty roster may still be published; a running `lmbee serve` keeps sending an empty one until it is confirmed gone"),t.join(`
2357
2357
  `)}function zM(e){let t=e.stderr??(R=>process.stderr.write(`${R}
2358
- `)),n=e.intervalMs??HM,r=e.loadReport??(()=>qe()),s=e.reauthorize??e.acquire,o=e.pid??process.pid,i=e.monotonicMs??(()=>performance.now()),a=null,c=!1,l=Promise.resolve(),u=new AbortController,d=null,f=null,m=null,p=null,h=!1,_=Number.NEGATIVE_INFINITY,g=0,w=0,E=-1,y=R=>{m=R,R!==p&&(p=R,t(`[recent_agents] ${R}`))},T=()=>{try{Pp(e.db,jM,{pid:o,lastPublishedAt:d,agentCount:f,lastError:m,ts:(e.now?.()??new Date).toISOString()})}catch{}},v=R=>{try{let k=za(e.db);return!c&&k!==null&&k.enabled&&k.revision===R}catch{return!1}},A=()=>(e.now?.()??new Date).getTime();async function I(R){let k=R?.revision??-2,O=hu(e.db);if(O===null||!O.dirty){m=null,p=null,h=!1;return}let D=GM(O,R,process.env);if(k!==E&&(g=0,w=0),i()<g||A()-O.lastNonEmptyAt<Fp||i()-_<Fp)return;let S=e.resolveKey?.()??null;if(S!==null)try{let b=za(e.db);if(c||(b?.enabled??!1)||(b?.revision??-2)!==k)return;for(let L of D)await mu({authBaseUrl:L,appkey:S.appkey,signal:u.signal,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{},...e.publishTimeoutMs?{timeoutMs:e.publishTimeoutMs}:{}},e.siteId,[]);d=null,f=0,m=null,p=null,w=0,g=0,WM(e.db,A(),O.lastNonEmptyAt,i()-_>=Fp)}catch(b){w=w===0?6e4:Math.min(w*2,15*6e4),g=i()+w,E=k,y(`cannot retract the published roster (next try in ${Math.round(w/1e3)}s): ${b instanceof Error?b.message:String(b)}`)}}async function N(){if(c)return;let R;try{R=za(e.db)}catch(k){y(`cannot read the setting, not publishing: ${k instanceof Error?k.message:String(k)}`),T();return}if(R===null||!R.enabled){await I(R),T();return}if(R.revision!==E&&(g=0,w=0),i()<g){T();return}try{let k=await(h?s():e.acquire()),O=XM(await r());if(!v(R.revision)){T();return}let D={authBaseUrl:R.authBaseUrl,appkey:k.appkey,signal:u.signal,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{},...e.publishTimeoutMs?{timeoutMs:e.publishTimeoutMs}:{}};O.agents.length>0&&(BM(e.db,A(),R.authBaseUrl),_=i());let S=await mu(D,e.siteId,O.agents);if(h=!1,d=S.reported_at,f=S.agent_count,m=null,p=null,w=0,g=0,O.skipped.invalidName>0&&t(`[recent_agents] ${O.skipped.invalidName} agent name(s) outside [A-Za-z0-9._:/-] (or over 128 chars) were left out of the report`),O.skipped.overCap>0&&t(`[recent_agents] ${O.skipped.overCap} agent(s) over the server's ${Up}-agent limit were left out of the report`),!v(R.revision)){let b=!0;try{b=za(e.db)?.enabled!==!0}catch{b=!0}if(b&&!c)try{await mu(D,e.siteId,[]),d=null,f=0}catch{}}}catch(k){k instanceof vi&&(k.status===401||k.status===403)&&(h=!0);let O=k instanceof vi&&k.code==="site_not_found"?" (this site is not registered with the server: run `lmbee serve enable recent_agents` again)":"";w=w===0?6e4:Math.min(w*2,15*6e4),g=i()+w,E=R.revision,y(`cannot publish the roster (next try in ${Math.round(w/1e3)}s): ${k instanceof Error?k.message:String(k)}${O}`)}T()}let x=()=>(l=l.then(()=>N()).catch(R=>{y(`unexpected failure: ${R instanceof Error?R.message:String(R)}`)}),l);return{start(){a||c||(x(),a=setInterval(()=>void x(),n),a.unref?.())},stop(){c=!0,a&&clearInterval(a),a=null,u.abort()},tick:x,whenIdle:async()=>{await Promise.race([l,new Promise(R=>setTimeout(R,2e3))])}}}var ise=64*1024;function QM(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 CT(e,t,n,r,s,o){if(n.to.site!==t.localSiteId){Pi(e,n.msgId,`${jo}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),tA(e,n.msgId,s()),o.dispatched++}catch(i){Pi(e,n.msgId,i instanceof Error?i.message:String(i),s()),o.failed++}}async function ZM(e,t,n,r){let s=r.now??(()=>new Date().toISOString()),o=r.maxBodyBytes??ise,i={recovered:0,retriedFailed:0,listed:0,recorded:0,dispatched:0,rejected:0,failed:0,stoppedEarly:!1};for(let d of Zb(e))i.recovered++,await CT(e,r,QM(d),d.sender_user_id,s,i);let a=r.retryPolicy??f_;for(let d of md(e,s(),a))sA(e,d.msg_id)&&(i.retriedFailed++,await CT(e,r,QM(d),d.sender_user_id,s,i));let c=eA(e)??0,{messages:l}=await t.listMessages(n,{after:c});i.listed=l.length;let u=[...l].sort((d,f)=>d.seq-f.seq);for(let d of u){let f;try{f=await t.getMessage(n,d.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=zb(Buffer.from(m).toString("utf8"))}catch{i.stoppedEarly=!0;break}let h=s(),_=Qb(e,{msgId:p.msgId,seq:d.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 CT(e,r,p,f.sender,s,i)}}return i}async function eP(e,t){await e.createMailbox(t,{tolerate409:!0})}var ase=6e4,cse={recovered:0,retriedFailed:0,listed:0,recorded:0,dispatched:0,rejected:0,failed:0,stoppedEarly:!1};function tP(e){let t=e.intervalMs??ase,n=null,r=!1;async function s(){if(r)return cse;r=!0;try{let o=await ZM(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 lse=5e3;function nP(e){let t=e.intervalMs??lse,n=e.fetchReport??qe,r=e.deliverImpl??$s,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 use,randomUUID as dse}from"node:crypto";import{readFileSync as aP,mkdtempSync as fse,writeFileSync as mse,renameSync as pse,rmSync as cP,rmdirSync as hse,existsSync as jp}from"node:fs";import{tmpdir as _se}from"node:os";import{join as rP,dirname as sP,basename as oP}from"node:path";import{isAbsolute as iP,resolve as qp}from"node:path";function lP(e){try{let t=aP(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[19]??null}catch{return null}}function gse(e,t){try{process.kill(e,0)}catch(r){if(r.code==="ESRCH"||r.code!=="EPERM")return!1}let n=lP(e);return n===null||n===t}function Ese(e){return{...e,db:qp(e.db),script:qp(e.script),localScope:e.localScope.trim()}}function yse(e,t){return use("sha256").update(JSON.stringify({conversationId:t,db:e.db,localScope:e.localScope,script:e.script,args:e.args})).digest("hex")}function wse(e,t){if(!iP(t.db)||qp(t.db)!==qp(e))throw new G("INVALID_ARGUMENT","db must select the running daemon database");let n=t.conversationId?.trim()||dse();if(t.localScope.trim()==="")throw new G("INVALID_ARGUMENT","local_scope is required");if(!iP(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=Ese(t);return{conversationId:n,requestHash:yse(r,n),normalizedInput:r}}function Tse(e,t){return[process.env.LMSCRIPT_BIN||"lmscript",e.script,e.db,e.localScope,t,...e.args].map(n=>`'${n.replaceAll("'","'\\''")}'`).join(" ")}function gu(e,t){return e.prepare("SELECT * FROM on_demand_launches WHERE conversation_id = ?").get(t)??null}function Hp(e){if(e===null||typeof e!="object")return!1;let t="code"in e?String(e.code):"",n="message"in e?String(e.message):"";return t==="DB_BUSY"||e instanceof G&&e.code==="DB_BUSY"||t.startsWith("SQLITE_BUSY")||t.startsWith("SQLITE_LOCKED")||t==="ERR_SQLITE_ERROR"&&/database (?:table |schema )?is (?:locked|busy)/i.test(n)||/database (?:table |schema )?(?:is )?(?:locked|busy)/i.test(n)}function uP(e){let t=rP(fse(rP(_se(),"lmbee-adoption-")),"receipt.json");return e.push(t),t}function Eu(e){if(!(e===null||oP(e)!=="receipt.json"||!oP(sP(e)).startsWith("lmbee-adoption-")))try{cP(e,{force:!0}),hse(sP(e))}catch{}}function vse(e){let t=e.receiptPath+".tmp-"+process.pid,n={adopted:!1,conversationId:e.conversationId,generation:e.generation,jobId:e.jobId,runId:null};try{mse(t,JSON.stringify(n),{mode:384,flag:"wx"}),pse(t,e.receiptPath)}finally{try{cP(t,{force:!0})}catch{}}}function dP(e){try{return e===null?null:JSON.parse(aP(e,"utf8"))}catch{return null}}function Qa(e){if(e===null)return!1;let t=dP(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 Sse(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=Qa(t);if(o&&t.phase==="dispatching"&&(t.run_id!==null&&Hr(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"||cr(e,t.job_id)!==null)return{kind:"busy",conversationId:t.conversation_id,jobId:t.job_id,outcome:"unknown"};if(t.state==="claimed"&&gse(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=uP(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 bse(e,t,n){let{conversationId:r,requestHash:s,normalizedInput:o}=wse(t,n),i={pid:process.pid,start:lP(process.pid)??"unavailable"},a=Tse(o,r),c=[],l=[],u=Number(e.pragma("busy_timeout",{simple:!0}));e.pragma("busy_timeout = 0");try{let f=e.transaction(()=>{let m=gu(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 Sse(e,m,i,c,l)}let p=qa(e,{title:`on-demand conversation ${r}`,scheduleExpr:"0 0 31 2 *",actionKind:"script",actionPayload:a,enabled:!0}),h=new Date().toISOString(),_=uP(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)
2359
- 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(Eu),f}catch(d){throw c.forEach(Eu),Hp(d)?new G("DB_BUSY","Database busy; on-demand start was not sent",5):d}finally{e.pragma(`busy_timeout = ${Math.max(0,Math.trunc(u))}`)}}async function fP(e,t,n,r,s){let o=s?.now??Date.now,i=s?.deadlineMs??4e3,a=o()+i,c=2,l=0,u=null,d=r,f=10;for(;;){let m;try{m=bse(e,t,d)}catch(E){if(E instanceof G&&E.code==="DB_BUSY"){if(o()>=a)return{conversationid:d.conversationId?.trim()||"",job_id:u,status:"busy",outcome:"not_sent"};if(await new Promise(y=>setTimeout(y,f)),f=Math.min(f*2,100),o()>=a)return{conversationid:d.conversationId?.trim()||"",job_id:u,status:"busy",outcome:"not_sent"};continue}throw E}if(m.kind==="busy")return{conversationid:m.conversationId,job_id:m.jobId,status:"busy",outcome:m.outcome};if(m.kind==="adopted")return{conversationid:m.conversationId,job_id:m.jobId,run_id:m.runId};u=m.jobId,f=10,d={...r,conversationId:m.conversationId};let p=m.receiptPath,h=E=>({conversationid:m.conversationId,job_id:m.jobId,status:"busy",outcome:E}),_;try{_=await Kn(e,()=>su(e,m.jobId,n,{runTimeoutMs:null,waitForCompletion:!1,disableOnClaim:!0,onDemand:{conversationId:m.conversationId,generation:m.generation,receiptPath:p}}))}catch(E){let y=!1,T=!1;try{let v=Kn(e,()=>gu(e,m.conversationId));T=v?.phase==="reserved"&&v.generation===m.generation&&v.run_id===null,T&&(vse(m),y=Number(Kn(e,()=>e.prepare("UPDATE on_demand_launches SET state = 'retryable' WHERE conversation_id = ? AND generation = ? AND phase = 'reserved'").run(m.conversationId,m.generation)).changes)===1)}catch{}if(T&&!y&&o()<a)for(let v=0;v<5&&!y&&o()<a;v++){await new Promise(A=>setTimeout(A,10));try{y=Number(Kn(e,()=>e.prepare("UPDATE on_demand_launches SET state = 'retryable' WHERE conversation_id = ? AND generation = ? AND phase = 'reserved'").run(m.conversationId,m.generation)).changes)===1}catch{}}if(Hp(E)||E instanceof G&&E.code==="DB_BUSY"){if(o()>=a)return h("unknown");if(T&&y&&l<c){if(l++,await new Promise(v=>setTimeout(v,20)),o()>=a)return h("unknown");continue}return h(T?"not_sent":"unknown")}if(!T)return h("unknown");throw E}if(_.kind!=="fired"||_.runId===void 0)return h("unknown");let g=!1,w=a;for(;;){let E;try{E=Kn(e,()=>gu(e,m.conversationId))}catch(y){if(Hp(y)&&o()<w){if(await new Promise(T=>setTimeout(T,5)),o()>=w)return h("unknown");continue}return h("unknown")}if(E?.phase==="worker_adopted"&&E.run_id!==null){if(!jp(p)){let y=Math.min(o()+100,a);for(;!jp(p)&&o()<y;)await new Promise(T=>setTimeout(T,2))}return Eu(p),{conversationid:m.conversationId,job_id:m.jobId,run_id:E.run_id}}if(E?.phase==="dispatching"&&E.generation===m.generation&&Qa(E)){let y=dP(E.receipt_path),T=typeof y?.error=="string"&&/(?:database(?: table| schema)? (?:is )?(?:locked|busy)|SQLITE_(?:BUSY|LOCKED)|DB_BUSY)/i.test(y.error),v=!1;try{v=Kn(e,()=>e.transaction(()=>{let A=gu(e,m.conversationId);return A?.phase!=="dispatching"||A.generation!==m.generation||!Qa(A)?!1:(Hr(e,_.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(m.conversationId,m.generation),!0)}).immediate()),v&&Eu(p)}catch{}if(!v&&T&&l<c&&jp(p))for(let A=0;A<5&&!v&&jp(p)&&o()<w;A++){await new Promise(I=>setTimeout(I,10));try{v=Kn(e,()=>e.transaction(()=>{let I=gu(e,m.conversationId);return I?.phase!=="dispatching"||I.generation!==m.generation||!Qa(I)?!1:(Hr(e,_.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(m.conversationId,m.generation),!0)}).immediate()),v&&Eu(p)}catch{}}if(o()>=w)return h("unknown");if(v&&T&&l<c){g=!0;break}return h("not_sent")}try{let y=Kn(e,()=>xt(e,_.runId));if(y.execution_state==="gone"||y.execution_state==="uncertain"){let T=Math.min(w,o()+100);for(;!Qa(E)&&o()<T;)await new Promise(v=>setTimeout(v,5));if(Qa(E))continue;return h("unknown")}}catch(y){if(Hp(y)&&o()<w){if(await new Promise(T=>setTimeout(T,5)),o()>=w)return h("unknown");continue}return h("unknown")}if(o()>=w)return h("unknown");await new Promise(y=>setTimeout(y,5))}if(g){if(o()>=a||(l++,await new Promise(E=>setTimeout(E,20)),o()>=a))return h("unknown");continue}}}import{posix as pP,win32 as hP}from"node:path";var OT=[{name:"db",type:"string",required:!0},{name:"local_scope",type:"string",required:!0},{name:"conversationid",type:"string",required:!0},{name:"escalationid",type:"string"}],Ase=[{name:"lmbee_job_read",description:"Read live parent or child rows, including claimed rows.",keys:[...OT,{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:[...OT,{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:[...OT,{name:"where",type:"map",required:!0},{name:"state",type:"string",required:!0}]}];function mP(e){e.exec(`CREATE TABLE IF NOT EXISTS workflow_jobs (
2358
+ `)),n=e.intervalMs??HM,r=e.loadReport??(()=>qe()),s=e.reauthorize??e.acquire,o=e.pid??process.pid,i=e.monotonicMs??(()=>performance.now()),a=null,c=!1,l=Promise.resolve(),u=new AbortController,d=null,f=null,m=null,p=null,h=!1,_=Number.NEGATIVE_INFINITY,g=0,w=0,E=-1,y=R=>{m=R,R!==p&&(p=R,t(`[recent_agents] ${R}`))},T=()=>{try{Pp(e.db,jM,{pid:o,lastPublishedAt:d,agentCount:f,lastError:m,ts:(e.now?.()??new Date).toISOString()})}catch{}},v=R=>{try{let k=za(e.db);return!c&&k!==null&&k.enabled&&k.revision===R}catch{return!1}},A=()=>(e.now?.()??new Date).getTime();async function I(R){let k=R?.revision??-2,O=hu(e.db);if(O===null||!O.dirty){m=null,p=null,h=!1;return}let D=GM(O,R,process.env);if(k!==E&&(g=0,w=0),i()<g||A()-O.lastNonEmptyAt<Fp||i()-_<Fp)return;let S=e.resolveKey?.()??null;if(S!==null)try{let b=za(e.db);if(c||(b?.enabled??!1)||(b?.revision??-2)!==k)return;for(let L of D)await mu({authBaseUrl:L,appkey:S.appkey,signal:u.signal,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{},...e.publishTimeoutMs?{timeoutMs:e.publishTimeoutMs}:{}},e.siteId,[]);d=null,f=0,m=null,p=null,w=0,g=0,WM(e.db,A(),O.lastNonEmptyAt,i()-_>=Fp)}catch(b){w=w===0?6e4:Math.min(w*2,15*6e4),g=i()+w,E=k,y(`cannot retract the published roster (next try in ${Math.round(w/1e3)}s): ${b instanceof Error?b.message:String(b)}`)}}async function N(){if(c)return;let R;try{R=za(e.db)}catch(k){y(`cannot read the setting, not publishing: ${k instanceof Error?k.message:String(k)}`),T();return}if(R===null||!R.enabled){await I(R),T();return}if(R.revision!==E&&(g=0,w=0),i()<g){T();return}try{let k=await(h?s():e.acquire()),O=XM(await r());if(!v(R.revision)){T();return}let D={authBaseUrl:R.authBaseUrl,appkey:k.appkey,signal:u.signal,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{},...e.publishTimeoutMs?{timeoutMs:e.publishTimeoutMs}:{}};O.agents.length>0&&(BM(e.db,A(),R.authBaseUrl),_=i());let S=await mu(D,e.siteId,O.agents);if(h=!1,d=S.reported_at,f=S.agent_count,m=null,p=null,w=0,g=0,O.skipped.invalidName>0&&t(`[recent_agents] ${O.skipped.invalidName} agent name(s) outside [A-Za-z0-9._:/-] (or over 128 chars) were left out of the report`),O.skipped.overCap>0&&t(`[recent_agents] ${O.skipped.overCap} agent(s) over the server's ${Up}-agent limit were left out of the report`),!v(R.revision)){let b=!0;try{b=za(e.db)?.enabled!==!0}catch{b=!0}if(b&&!c)try{await mu(D,e.siteId,[]),d=null,f=0}catch{}}}catch(k){k instanceof vi&&(k.status===401||k.status===403)&&(h=!0);let O=k instanceof vi&&k.code==="site_not_found"?" (this site is not registered with the server: run `lmbee serve enable recent_agents` again)":"";w=w===0?6e4:Math.min(w*2,15*6e4),g=i()+w,E=R.revision,y(`cannot publish the roster (next try in ${Math.round(w/1e3)}s): ${k instanceof Error?k.message:String(k)}${O}`)}T()}let x=()=>(l=l.then(()=>N()).catch(R=>{y(`unexpected failure: ${R instanceof Error?R.message:String(R)}`)}),l);return{start(){a||c||(x(),a=setInterval(()=>void x(),n),a.unref?.())},stop(){c=!0,a&&clearInterval(a),a=null,u.abort()},tick:x,whenIdle:async()=>{await Promise.race([l,new Promise(R=>setTimeout(R,2e3))])}}}var ose=64*1024;function QM(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 CT(e,t,n,r,s,o){if(n.to.site!==t.localSiteId){Pi(e,n.msgId,`${jo}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),tA(e,n.msgId,s()),o.dispatched++}catch(i){Pi(e,n.msgId,i instanceof Error?i.message:String(i),s()),o.failed++}}async function ZM(e,t,n,r){let s=r.now??(()=>new Date().toISOString()),o=r.maxBodyBytes??ose,i={recovered:0,retriedFailed:0,listed:0,recorded:0,dispatched:0,rejected:0,failed:0,stoppedEarly:!1};for(let d of Zb(e))i.recovered++,await CT(e,r,QM(d),d.sender_user_id,s,i);let a=r.retryPolicy??f_;for(let d of md(e,s(),a))sA(e,d.msg_id)&&(i.retriedFailed++,await CT(e,r,QM(d),d.sender_user_id,s,i));let c=eA(e)??0,{messages:l}=await t.listMessages(n,{after:c});i.listed=l.length;let u=[...l].sort((d,f)=>d.seq-f.seq);for(let d of u){let f;try{f=await t.getMessage(n,d.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=zb(Buffer.from(m).toString("utf8"))}catch{i.stoppedEarly=!0;break}let h=s(),_=Qb(e,{msgId:p.msgId,seq:d.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 CT(e,r,p,f.sender,s,i)}}return i}async function eP(e,t){await e.createMailbox(t,{tolerate409:!0})}var ise=6e4,ase={recovered:0,retriedFailed:0,listed:0,recorded:0,dispatched:0,rejected:0,failed:0,stoppedEarly:!1};function tP(e){let t=e.intervalMs??ise,n=null,r=!1;async function s(){if(r)return ase;r=!0;try{let o=await ZM(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 cse=5e3;function nP(e){let t=e.intervalMs??cse,n=e.fetchReport??qe,r=e.deliverImpl??$s,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 lse,randomUUID as use}from"node:crypto";import{readFileSync as aP,mkdtempSync as dse,writeFileSync as fse,renameSync as mse,rmSync as cP,rmdirSync as pse,existsSync as jp}from"node:fs";import{tmpdir as hse}from"node:os";import{join as rP,dirname as sP,basename as oP}from"node:path";import{isAbsolute as iP,resolve as qp}from"node:path";function lP(e){try{let t=aP(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[19]??null}catch{return null}}function _se(e,t){try{process.kill(e,0)}catch(r){if(r.code==="ESRCH"||r.code!=="EPERM")return!1}let n=lP(e);return n===null||n===t}function gse(e){return{...e,db:qp(e.db),script:qp(e.script),localScope:e.localScope.trim()}}function Ese(e,t){return lse("sha256").update(JSON.stringify({conversationId:t,db:e.db,localScope:e.localScope,script:e.script,args:e.args})).digest("hex")}function yse(e,t){if(!iP(t.db)||qp(t.db)!==qp(e))throw new G("INVALID_ARGUMENT","db must select the running daemon database");let n=t.conversationId?.trim()||use();if(t.localScope.trim()==="")throw new G("INVALID_ARGUMENT","local_scope is required");if(!iP(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=gse(t);return{conversationId:n,requestHash:Ese(r,n),normalizedInput:r}}function wse(e,t){return[process.env.LMSCRIPT_BIN||"lmscript",e.script,e.db,e.localScope,t,...e.args].map(n=>`'${n.replaceAll("'","'\\''")}'`).join(" ")}function gu(e,t){return e.prepare("SELECT * FROM on_demand_launches WHERE conversation_id = ?").get(t)??null}function Hp(e){if(e===null||typeof e!="object")return!1;let t="code"in e?String(e.code):"",n="message"in e?String(e.message):"";return t==="DB_BUSY"||e instanceof G&&e.code==="DB_BUSY"||t.startsWith("SQLITE_BUSY")||t.startsWith("SQLITE_LOCKED")||t==="ERR_SQLITE_ERROR"&&/database (?:table |schema )?is (?:locked|busy)/i.test(n)||/database (?:table |schema )?(?:is )?(?:locked|busy)/i.test(n)}function uP(e){let t=rP(dse(rP(hse(),"lmbee-adoption-")),"receipt.json");return e.push(t),t}function Eu(e){if(!(e===null||oP(e)!=="receipt.json"||!oP(sP(e)).startsWith("lmbee-adoption-")))try{cP(e,{force:!0}),pse(sP(e))}catch{}}function Tse(e){let t=e.receiptPath+".tmp-"+process.pid,n={adopted:!1,conversationId:e.conversationId,generation:e.generation,jobId:e.jobId,runId:null};try{fse(t,JSON.stringify(n),{mode:384,flag:"wx"}),mse(t,e.receiptPath)}finally{try{cP(t,{force:!0})}catch{}}}function dP(e){try{return e===null?null:JSON.parse(aP(e,"utf8"))}catch{return null}}function Qa(e){if(e===null)return!1;let t=dP(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 vse(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=Qa(t);if(o&&t.phase==="dispatching"&&(t.run_id!==null&&Hr(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"||cr(e,t.job_id)!==null)return{kind:"busy",conversationId:t.conversation_id,jobId:t.job_id,outcome:"unknown"};if(t.state==="claimed"&&_se(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=uP(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 Sse(e,t,n){let{conversationId:r,requestHash:s,normalizedInput:o}=yse(t,n),i={pid:process.pid,start:lP(process.pid)??"unavailable"},a=wse(o,r),c=[],l=[],u=Number(e.pragma("busy_timeout",{simple:!0}));e.pragma("busy_timeout = 0");try{let f=e.transaction(()=>{let m=gu(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 vse(e,m,i,c,l)}let p=qa(e,{title:`on-demand conversation ${r}`,scheduleExpr:"0 0 31 2 *",actionKind:"script",actionPayload:a,enabled:!0}),h=new Date().toISOString(),_=uP(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)
2359
+ 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(Eu),f}catch(d){throw c.forEach(Eu),Hp(d)?new G("DB_BUSY","Database busy; on-demand start was not sent",5):d}finally{e.pragma(`busy_timeout = ${Math.max(0,Math.trunc(u))}`)}}async function fP(e,t,n,r,s){let o=s?.now??Date.now,i=s?.deadlineMs??4e3,a=o()+i,c=2,l=0,u=null,d=r,f=10;for(;;){let m;try{m=Sse(e,t,d)}catch(E){if(E instanceof G&&E.code==="DB_BUSY"){if(o()>=a)return{conversationid:d.conversationId?.trim()||"",job_id:u,status:"busy",outcome:"not_sent"};if(await new Promise(y=>setTimeout(y,f)),f=Math.min(f*2,100),o()>=a)return{conversationid:d.conversationId?.trim()||"",job_id:u,status:"busy",outcome:"not_sent"};continue}throw E}if(m.kind==="busy")return{conversationid:m.conversationId,job_id:m.jobId,status:"busy",outcome:m.outcome};if(m.kind==="adopted")return{conversationid:m.conversationId,job_id:m.jobId,run_id:m.runId};u=m.jobId,f=10,d={...r,conversationId:m.conversationId};let p=m.receiptPath,h=E=>({conversationid:m.conversationId,job_id:m.jobId,status:"busy",outcome:E}),_;try{_=await Kn(e,()=>su(e,m.jobId,n,{runTimeoutMs:null,waitForCompletion:!1,disableOnClaim:!0,onDemand:{conversationId:m.conversationId,generation:m.generation,receiptPath:p}}))}catch(E){let y=!1,T=!1;try{let v=Kn(e,()=>gu(e,m.conversationId));T=v?.phase==="reserved"&&v.generation===m.generation&&v.run_id===null,T&&(Tse(m),y=Number(Kn(e,()=>e.prepare("UPDATE on_demand_launches SET state = 'retryable' WHERE conversation_id = ? AND generation = ? AND phase = 'reserved'").run(m.conversationId,m.generation)).changes)===1)}catch{}if(T&&!y&&o()<a)for(let v=0;v<5&&!y&&o()<a;v++){await new Promise(A=>setTimeout(A,10));try{y=Number(Kn(e,()=>e.prepare("UPDATE on_demand_launches SET state = 'retryable' WHERE conversation_id = ? AND generation = ? AND phase = 'reserved'").run(m.conversationId,m.generation)).changes)===1}catch{}}if(Hp(E)||E instanceof G&&E.code==="DB_BUSY"){if(o()>=a)return h("unknown");if(T&&y&&l<c){if(l++,await new Promise(v=>setTimeout(v,20)),o()>=a)return h("unknown");continue}return h(T?"not_sent":"unknown")}if(!T)return h("unknown");throw E}if(_.kind!=="fired"||_.runId===void 0)return h("unknown");let g=!1,w=a;for(;;){let E;try{E=Kn(e,()=>gu(e,m.conversationId))}catch(y){if(Hp(y)&&o()<w){if(await new Promise(T=>setTimeout(T,5)),o()>=w)return h("unknown");continue}return h("unknown")}if(E?.phase==="worker_adopted"&&E.run_id!==null){if(!jp(p)){let y=Math.min(o()+100,a);for(;!jp(p)&&o()<y;)await new Promise(T=>setTimeout(T,2))}return Eu(p),{conversationid:m.conversationId,job_id:m.jobId,run_id:E.run_id}}if(E?.phase==="dispatching"&&E.generation===m.generation&&Qa(E)){let y=dP(E.receipt_path),T=typeof y?.error=="string"&&/(?:database(?: table| schema)? (?:is )?(?:locked|busy)|SQLITE_(?:BUSY|LOCKED)|DB_BUSY)/i.test(y.error),v=!1;try{v=Kn(e,()=>e.transaction(()=>{let A=gu(e,m.conversationId);return A?.phase!=="dispatching"||A.generation!==m.generation||!Qa(A)?!1:(Hr(e,_.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(m.conversationId,m.generation),!0)}).immediate()),v&&Eu(p)}catch{}if(!v&&T&&l<c&&jp(p))for(let A=0;A<5&&!v&&jp(p)&&o()<w;A++){await new Promise(I=>setTimeout(I,10));try{v=Kn(e,()=>e.transaction(()=>{let I=gu(e,m.conversationId);return I?.phase!=="dispatching"||I.generation!==m.generation||!Qa(I)?!1:(Hr(e,_.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(m.conversationId,m.generation),!0)}).immediate()),v&&Eu(p)}catch{}}if(o()>=w)return h("unknown");if(v&&T&&l<c){g=!0;break}return h("not_sent")}try{let y=Kn(e,()=>xt(e,_.runId));if(y.execution_state==="gone"||y.execution_state==="uncertain"){let T=Math.min(w,o()+100);for(;!Qa(E)&&o()<T;)await new Promise(v=>setTimeout(v,5));if(Qa(E))continue;return h("unknown")}}catch(y){if(Hp(y)&&o()<w){if(await new Promise(T=>setTimeout(T,5)),o()>=w)return h("unknown");continue}return h("unknown")}if(o()>=w)return h("unknown");await new Promise(y=>setTimeout(y,5))}if(g){if(o()>=a||(l++,await new Promise(E=>setTimeout(E,20)),o()>=a))return h("unknown");continue}}}import{posix as pP,win32 as hP}from"node:path";var OT=[{name:"db",type:"string",required:!0},{name:"local_scope",type:"string",required:!0},{name:"conversationid",type:"string",required:!0},{name:"escalationid",type:"string"}],bse=[{name:"lmbee_job_read",description:"Read live parent or child rows, including claimed rows.",keys:[...OT,{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:[...OT,{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:[...OT,{name:"where",type:"map",required:!0},{name:"state",type:"string",required:!0}]}];function mP(e){e.exec(`CREATE TABLE IF NOT EXISTS workflow_jobs (
2360
2360
  local_scope TEXT NOT NULL, conversationid TEXT NOT NULL, status TEXT NOT NULL,
2361
2361
  PRIMARY KEY (local_scope, conversationid)
2362
2362
  );
@@ -2373,25 +2373,25 @@ ${Bt}`;X=o(e.db,C,P,K,Hn,M,St?void 0:!Jt)}else X=o(e.db,C,P,K,void 0,M)}catch(K)
2373
2373
  UPDATE workflow_escalations
2374
2374
  SET created_at_ms = CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER)
2375
2375
  WHERE local_scope = NEW.local_scope AND conversationid = NEW.conversationid AND escalationid = NEW.escalationid;
2376
- END`)}function dr(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 Ze(e,t,n=null){return{...dr(n),status:"error",code:e,error:t}}function DT(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 Ts=class extends Error{code;row;constructor(t,n,r=null){super(n),this.code=t,this.row=r}},Za=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),$T="local_scope = ? AND conversationid = ? AND escalationid = ?",Bp=["local_scope","conversationid","script_file","script_prefix","tag","run_id"],Ise=["source_kind","script_file","source_name","run_id","parent_run_id","local_scope","conversationid","member_alias","parent_invocation_id","tag"],wt=e=>{throw new Ts("invalid_argument",e)},qr=(e,t,n=!1)=>typeof e!="string"||!n&&e.length===0?wt(t+" must be a "+(n?"":"nonempty ")+"string"):/[\uD800-\uDFFF]/u.test(e)?wt(t+" must contain well-formed UTF-16"):e,gP=e=>pP.isAbsolute(e)&&pP.normalize(e)===e||hP.isAbsolute(e)&&hP.normalize(e)===e;function Wp(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 wt("payload must contain JSON values");if(!Array.isArray(r)&&Object.getPrototypeOf(r)!==Object.prototype&&Object.getPrototypeOf(r)!==null)return wt("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 EP=e=>"e1."+Buffer.from(JSON.stringify(e),"utf8").toString("base64url");function kse(e){let t=qr(e,"id");try{if(!/^e1\.[A-Za-z0-9_-]+$/.test(t))return wt("Invalid escalation handle");let n=JSON.parse(Buffer.from(t.slice(3),"base64url").toString("utf8"));if(!Array.isArray(n)||n.length!==3)return wt("Invalid escalation handle");let r=n.map(s=>qr(s,"id component"));return EP(r)!==t?wt("Invalid escalation handle"):r}catch{return wt("Invalid escalation handle")}}function _P(e){let t=JSON.parse(e.payload),n=Za(t)&&Za(t.origin)?t.origin:null;return{id:EP([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 Rse(e){for(let t of Bp)Object.hasOwn(e,t)&&qr(e[t],t,t==="tag");e.script_file!==void 0&&e.script_prefix!==void 0&&wt("Choose script_file or script_prefix");for(let t of["script_file","script_prefix"])typeof e[t]=="string"&&!gP(e[t])&&wt(t+" must be an absolute normalized path")}function Nse(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 MT(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&&Nse(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 xse(e){let t=qr(e.local_scope,"local_scope"),n=qr(e.conversationid,"conversationid"),r=qr(e.request_key,"request_key");(!Za(e.payload)||typeof e.payload.question!="string"||!e.payload.question.trim())&&wt("payload requires a nonempty question string");let s=e.payload;Object.hasOwn(s,"origin")&&wt("payload.origin is reserved; supply origin separately"),Wp(s);let o=e.tag===void 0||e.tag===null?null:qr(e.tag,"tag",!0);e.origin!==void 0&&!Za(e.origin)&&wt("origin must be an object");let i=e.origin??{};Object.keys(i).some(l=>!Ise.includes(l))&&wt("Unknown origin field");let a=i.source_kind===void 0?"unknown":i.source_kind;["file","stdin","inline","unknown"].includes(a)||wt("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]=qr(i[l],"origin."+l,l==="source_name"));a==="file"?(typeof c.script_file!="string"||!gP(c.script_file))&&wt("File origin requires an absolute normalized script_file"):c.script_file!==null&&wt("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]&&wt("Origin "+l+" contradicts creation selection");return{tuple:[t,n,r],payload:s,origin:c,tag:o}}function Lse(e){if(!Za(e))return e;let{origin:t,...n}=e;return n}function ec(e,t,n){let r,s=t==="create"||t==="answer"||t==="withdraw";try{if(!Za(n))return wt("Expected an escalation options object");let o=t==="create"?["local_scope","conversationid","request_key","payload","origin","tag"]:t==="list_open"?Bp:t==="answer"?["id","answer_text",...Bp]:["id",...Bp];(!["create","status","list_open","answer","withdraw"].includes(t)||Object.keys(n).some(u=>!o.includes(u)))&&wt("Unknown escalation option or operation");let i=t==="create"?xse(n):void 0;i||Rse(n);let a=t==="status"||t==="answer"||t==="withdraw"?kse(n.id):i?.tuple;if(t==="list_open"&&qr(n.local_scope,"local_scope"),t==="answer"&&qr(n.answer_text,"answer_text",!0),!e.open||e.inTransaction)return Ze("database_unavailable","Escalation database unavailable");r=e.pragma("busy_timeout",{simple:!0}),e.pragma("busy_timeout = 0");let c=()=>{let u=e.prepare(`SELECT local_scope,conversationid,escalationid,payload,state,answer_text FROM workflow_escalations WHERE ${$T}`).get(...a);return u?_P(u):null};if(!s){if(!e.prepare("SELECT name FROM sqlite_master WHERE name='workflow_escalations'").get())return t==="list_open"?dr():Ze("not_found","Escalation not found");if(t==="status"){let m=c();return m&&MT(m,n)?dr(m):Ze("not_found","Escalation not found")}let u=e.prepare("SELECT local_scope,conversationid,escalationid,payload,state,answer_text FROM workflow_escalations WHERE local_scope = ? AND answer_text IS NULL AND state != 'withdrawn' ORDER BY conversationid,escalationid").all(n.local_scope).map(_P),{local_scope:d,...f}=n;return dr(null,!1,u.filter(m=>MT(m,f)))}let l=()=>{if(mP(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(Wp(Lse(f.payload))!==Wp(i.payload)||(f.origin?.tag??null)!==i.tag)throw new Ts("conflict","Request key already identifies a different question or tag",f);return dr(f)}let m=Wp({...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),dr(c(),!0)}let u=c();if(!u||!MT(u,n))throw new Ts("not_found","Escalation not found");if(t==="withdraw"){if(u.state!=="waiting"||u.answer_text!==null)return dr(u);let f=e.prepare(`UPDATE workflow_escalations SET state = 'withdrawn' WHERE ${$T} AND state = 'waiting' AND answer_text IS NULL`).run(...a).changes;return dr(c(),f===1)}if(u.state==="withdrawn")throw new Ts("conflict","A withdrawn escalation cannot be answered",u);if(u.answer_text!==null){if(u.answer_text!==n.answer_text)throw new Ts("conflict","Escalation already has a different answer",u);return dr(u)}if(e.prepare(`UPDATE workflow_escalations SET answer_text = ?, state = 'answered' WHERE ${$T} AND answer_text IS NULL`).run(n.answer_text,...a).changes!==1)throw new Ts("conflict","Escalation answer was not applied",c());return dr(c(),!0)};return e.transaction(l).immediate()}catch(o){if(o instanceof Ts)return Ze(o.code,o.message,o.row);let i=o?.code??"";return/^SQLITE_(BUSY|LOCKED|CANTOPEN|CORRUPT|NOTADB|IOERR|MISUSE)/.test(i)?Ze("database_unavailable","Escalation database unavailable"):Ze(s?"write_rejected":"database_unavailable",s?"Escalation write rejected":"Escalation database unavailable")}finally{r!==void 0&&e.pragma("busy_timeout = "+r)}}import{readFileSync as Yie}from"node:fs";var Cse=10*6e4,Ose=60*6e4;function yP(e,t,n={},r=Date.now()){let s=n.ackDeadlineMs??Cse,o=n.replyThresholdMs??Ose,i=[];for(let a of t){let c=pd(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 Dse=[/^\S+'s turn has finished and exited; resubmit/i,/^resubmit .*lmctl chat/i];function $se(e){let t=e.split(/\r?\n/).filter(r=>r.trim().length>0).filter(r=>!Dse.some(s=>s.test(r.trim()))),n=(t[t.length-1]??"").trim();return n==="BLOCKED"?"BLOCKED":n==="DONE"?"DONE":null}function wP(e){if(e.trim()==="")return{status:"NO-OUTPUT",wake:"env"};let t=$se(e);return t==="BLOCKED"?{status:"BLOCKED",wake:"blocked"}:t==="DONE"?{status:"DONE",wake:null}:{status:"IDLE",wake:null}}function tc(e){switch(e.kind){case"ok":return wP(e.replyText);case"stalled":{let t=wP(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 nc=qn(fr(),1);function Ue(e,t){return{error:{code:e,message:t}}}var RP=1e4;function UT(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>RP)return Ue("invalid_limit",`invalid limit "${n}" -- must be an integer from 0 to ${RP}`);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 NP(e,t,n,r={}){let s=UT(e,t,n);return r.json?JSON.stringify(s):"error"in s?s.error.message:(0,nc.formatTable)([["ID","TS","TEAM","STATUS","NOTE"],...s.events.map(o=>[String(o.id),Le(o.ts),(0,nc.escapeCell)(o.team),(0,nc.escapeCell)(o.status),(0,nc.escapeCell)(o.note??"")])])}var xP=qn(fr(),1);function FT(e){let t=e.db.db,n=rA(t),r=m_(t),s=r.filter(c=>c.failure_reason?.startsWith(jo)).length,o=r.length-s,i=md(t,new Date().toISOString()).length,a=aA(t);return{counts:n,retryEligibleCount:o,permanentCount:s,dueNowCount:i,deliveryErrorCount:a}}function LP(e,t={}){let n=FT(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,xP.formatTable)([["STATE","COUNT"],...r]),o=n.deliveryErrorCount>0?`
2376
+ END`)}function dr(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 Ze(e,t,n=null){return{...dr(n),status:"error",code:e,error:t}}function DT(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 Ts=class extends Error{code;row;constructor(t,n,r=null){super(n),this.code=t,this.row=r}},Za=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),$T="local_scope = ? AND conversationid = ? AND escalationid = ?",Bp=["local_scope","conversationid","script_file","script_prefix","tag","run_id"],Ase=["source_kind","script_file","source_name","run_id","parent_run_id","local_scope","conversationid","member_alias","parent_invocation_id","tag"],wt=e=>{throw new Ts("invalid_argument",e)},qr=(e,t,n=!1)=>typeof e!="string"||!n&&e.length===0?wt(t+" must be a "+(n?"":"nonempty ")+"string"):/[\uD800-\uDFFF]/u.test(e)?wt(t+" must contain well-formed UTF-16"):e,gP=e=>pP.isAbsolute(e)&&pP.normalize(e)===e||hP.isAbsolute(e)&&hP.normalize(e)===e;function Wp(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 wt("payload must contain JSON values");if(!Array.isArray(r)&&Object.getPrototypeOf(r)!==Object.prototype&&Object.getPrototypeOf(r)!==null)return wt("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 EP=e=>"e1."+Buffer.from(JSON.stringify(e),"utf8").toString("base64url");function Ise(e){let t=qr(e,"id");try{if(!/^e1\.[A-Za-z0-9_-]+$/.test(t))return wt("Invalid escalation handle");let n=JSON.parse(Buffer.from(t.slice(3),"base64url").toString("utf8"));if(!Array.isArray(n)||n.length!==3)return wt("Invalid escalation handle");let r=n.map(s=>qr(s,"id component"));return EP(r)!==t?wt("Invalid escalation handle"):r}catch{return wt("Invalid escalation handle")}}function _P(e){let t=JSON.parse(e.payload),n=Za(t)&&Za(t.origin)?t.origin:null;return{id:EP([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 kse(e){for(let t of Bp)Object.hasOwn(e,t)&&qr(e[t],t,t==="tag");e.script_file!==void 0&&e.script_prefix!==void 0&&wt("Choose script_file or script_prefix");for(let t of["script_file","script_prefix"])typeof e[t]=="string"&&!gP(e[t])&&wt(t+" must be an absolute normalized path")}function Rse(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 MT(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&&Rse(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 Nse(e){let t=qr(e.local_scope,"local_scope"),n=qr(e.conversationid,"conversationid"),r=qr(e.request_key,"request_key");(!Za(e.payload)||typeof e.payload.question!="string"||!e.payload.question.trim())&&wt("payload requires a nonempty question string");let s=e.payload;Object.hasOwn(s,"origin")&&wt("payload.origin is reserved; supply origin separately"),Wp(s);let o=e.tag===void 0||e.tag===null?null:qr(e.tag,"tag",!0);e.origin!==void 0&&!Za(e.origin)&&wt("origin must be an object");let i=e.origin??{};Object.keys(i).some(l=>!Ase.includes(l))&&wt("Unknown origin field");let a=i.source_kind===void 0?"unknown":i.source_kind;["file","stdin","inline","unknown"].includes(a)||wt("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]=qr(i[l],"origin."+l,l==="source_name"));a==="file"?(typeof c.script_file!="string"||!gP(c.script_file))&&wt("File origin requires an absolute normalized script_file"):c.script_file!==null&&wt("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]&&wt("Origin "+l+" contradicts creation selection");return{tuple:[t,n,r],payload:s,origin:c,tag:o}}function xse(e){if(!Za(e))return e;let{origin:t,...n}=e;return n}function ec(e,t,n){let r,s=t==="create"||t==="answer"||t==="withdraw";try{if(!Za(n))return wt("Expected an escalation options object");let o=t==="create"?["local_scope","conversationid","request_key","payload","origin","tag"]:t==="list_open"?Bp:t==="answer"?["id","answer_text",...Bp]:["id",...Bp];(!["create","status","list_open","answer","withdraw"].includes(t)||Object.keys(n).some(u=>!o.includes(u)))&&wt("Unknown escalation option or operation");let i=t==="create"?Nse(n):void 0;i||kse(n);let a=t==="status"||t==="answer"||t==="withdraw"?Ise(n.id):i?.tuple;if(t==="list_open"&&qr(n.local_scope,"local_scope"),t==="answer"&&qr(n.answer_text,"answer_text",!0),!e.open||e.inTransaction)return Ze("database_unavailable","Escalation database unavailable");r=e.pragma("busy_timeout",{simple:!0}),e.pragma("busy_timeout = 0");let c=()=>{let u=e.prepare(`SELECT local_scope,conversationid,escalationid,payload,state,answer_text FROM workflow_escalations WHERE ${$T}`).get(...a);return u?_P(u):null};if(!s){if(!e.prepare("SELECT name FROM sqlite_master WHERE name='workflow_escalations'").get())return t==="list_open"?dr():Ze("not_found","Escalation not found");if(t==="status"){let m=c();return m&&MT(m,n)?dr(m):Ze("not_found","Escalation not found")}let u=e.prepare("SELECT local_scope,conversationid,escalationid,payload,state,answer_text FROM workflow_escalations WHERE local_scope = ? AND answer_text IS NULL AND state != 'withdrawn' ORDER BY conversationid,escalationid").all(n.local_scope).map(_P),{local_scope:d,...f}=n;return dr(null,!1,u.filter(m=>MT(m,f)))}let l=()=>{if(mP(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(Wp(xse(f.payload))!==Wp(i.payload)||(f.origin?.tag??null)!==i.tag)throw new Ts("conflict","Request key already identifies a different question or tag",f);return dr(f)}let m=Wp({...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),dr(c(),!0)}let u=c();if(!u||!MT(u,n))throw new Ts("not_found","Escalation not found");if(t==="withdraw"){if(u.state!=="waiting"||u.answer_text!==null)return dr(u);let f=e.prepare(`UPDATE workflow_escalations SET state = 'withdrawn' WHERE ${$T} AND state = 'waiting' AND answer_text IS NULL`).run(...a).changes;return dr(c(),f===1)}if(u.state==="withdrawn")throw new Ts("conflict","A withdrawn escalation cannot be answered",u);if(u.answer_text!==null){if(u.answer_text!==n.answer_text)throw new Ts("conflict","Escalation already has a different answer",u);return dr(u)}if(e.prepare(`UPDATE workflow_escalations SET answer_text = ?, state = 'answered' WHERE ${$T} AND answer_text IS NULL`).run(n.answer_text,...a).changes!==1)throw new Ts("conflict","Escalation answer was not applied",c());return dr(c(),!0)};return e.transaction(l).immediate()}catch(o){if(o instanceof Ts)return Ze(o.code,o.message,o.row);let i=o?.code??"";return/^SQLITE_(BUSY|LOCKED|CANTOPEN|CORRUPT|NOTADB|IOERR|MISUSE)/.test(i)?Ze("database_unavailable","Escalation database unavailable"):Ze(s?"write_rejected":"database_unavailable",s?"Escalation write rejected":"Escalation database unavailable")}finally{r!==void 0&&e.pragma("busy_timeout = "+r)}}import{readFileSync as Jie}from"node:fs";var Lse=10*6e4,Cse=60*6e4;function yP(e,t,n={},r=Date.now()){let s=n.ackDeadlineMs??Lse,o=n.replyThresholdMs??Cse,i=[];for(let a of t){let c=pd(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 Ose=[/^\S+'s turn has finished and exited; resubmit/i,/^resubmit .*lmctl chat/i];function Dse(e){let t=e.split(/\r?\n/).filter(r=>r.trim().length>0).filter(r=>!Ose.some(s=>s.test(r.trim()))),n=(t[t.length-1]??"").trim();return n==="BLOCKED"?"BLOCKED":n==="DONE"?"DONE":null}function wP(e){if(e.trim()==="")return{status:"NO-OUTPUT",wake:"env"};let t=Dse(e);return t==="BLOCKED"?{status:"BLOCKED",wake:"blocked"}:t==="DONE"?{status:"DONE",wake:null}:{status:"IDLE",wake:null}}function tc(e){switch(e.kind){case"ok":return wP(e.replyText);case"stalled":{let t=wP(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 nc=qn(fr(),1);function Ue(e,t){return{error:{code:e,message:t}}}var RP=1e4;function UT(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>RP)return Ue("invalid_limit",`invalid limit "${n}" -- must be an integer from 0 to ${RP}`);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 NP(e,t,n,r={}){let s=UT(e,t,n);return r.json?JSON.stringify(s):"error"in s?s.error.message:(0,nc.formatTable)([["ID","TS","TEAM","STATUS","NOTE"],...s.events.map(o=>[String(o.id),Le(o.ts),(0,nc.escapeCell)(o.team),(0,nc.escapeCell)(o.status),(0,nc.escapeCell)(o.note??"")])])}var xP=qn(fr(),1);function FT(e){let t=e.db.db,n=rA(t),r=m_(t),s=r.filter(c=>c.failure_reason?.startsWith(jo)).length,o=r.length-s,i=md(t,new Date().toISOString()).length,a=aA(t);return{counts:n,retryEligibleCount:o,permanentCount:s,dueNowCount:i,deliveryErrorCount:a}}function LP(e,t={}){let n=FT(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,xP.formatTable)([["STATE","COUNT"],...r]),o=n.deliveryErrorCount>0?`
2377
2377
  ${n.deliveryErrorCount} row(s) with a recorded delivery error (invocation failed to spawn -- see delivery_error)`:"";return`${s}
2378
- ${n.dueNowCount} failed row(s) due for retry now${o}`}import{closeSync as doe,existsSync as foe,openSync as moe,readFileSync as YT,readSync as poe,realpathSync as hoe,statSync as _oe}from"node:fs";var zse="member_health:";function jT(e,t){return`${zse}${e}:${t}`}function CP(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(jT(t,n),JSON.stringify(s))}function yu(e,t,n){let r=e.prepare("SELECT v FROM kv WHERE k = ?").get(jT(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 OP(e,t,n){e.prepare("DELETE FROM kv WHERE k = ?").run(jT(t,n))}function DP(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 wu(e,t){return e.prepare("SELECT * FROM prompt_tasks WHERE id = ?").get(t)??null}function $P(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 MP(e,t){return e.prepare("SELECT * FROM task_prompts WHERE task_id = ? ORDER BY id ASC").all(t)}function PP(e,t){return e.prepare("SELECT * FROM task_prompts WHERE to_id = ? AND retrieved_ts IS NULL ORDER BY id ASC").all(t)}function UP(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 FP(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 jP(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(wu(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 HP(e,t){return e.prepare("SELECT * FROM prompt_task_reassignments WHERE prompt_id = ? ORDER BY id ASC").all(t)}function qP(e,t){return e.prepare(`SELECT task_id, MAX(created_at) AS last_message_at, COUNT(*) AS message_count
2378
+ ${n.dueNowCount} failed row(s) due for retry now${o}`}import{closeSync as uoe,existsSync as doe,openSync as foe,readFileSync as YT,readSync as moe,realpathSync as poe,statSync as hoe}from"node:fs";var Kse="member_health:";function jT(e,t){return`${Kse}${e}:${t}`}function CP(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(jT(t,n),JSON.stringify(s))}function yu(e,t,n){let r=e.prepare("SELECT v FROM kv WHERE k = ?").get(jT(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 OP(e,t,n){e.prepare("DELETE FROM kv WHERE k = ?").run(jT(t,n))}function DP(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 wu(e,t){return e.prepare("SELECT * FROM prompt_tasks WHERE id = ?").get(t)??null}function $P(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 MP(e,t){return e.prepare("SELECT * FROM task_prompts WHERE task_id = ? ORDER BY id ASC").all(t)}function PP(e,t){return e.prepare("SELECT * FROM task_prompts WHERE to_id = ? AND retrieved_ts IS NULL ORDER BY id ASC").all(t)}function UP(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 FP(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 jP(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(wu(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 HP(e,t){return e.prepare("SELECT * FROM prompt_task_reassignments WHERE prompt_id = ? ORDER BY id ASC").all(t)}function qP(e,t){return e.prepare(`SELECT task_id, MAX(created_at) AS last_message_at, COUNT(*) AS message_count
2379
2379
  FROM task_prompts
2380
2380
  WHERE task_id IS NOT NULL AND (from_id = ? OR to_id = ?)
2381
2381
  GROUP BY task_id
2382
- ORDER BY last_message_at DESC`).all(t,t).map(r=>{let s=wu(e,r.task_id);if(s===null)throw new Error(`prompt: task #${r.task_id} referenced by task_prompts but missing from prompt_tasks`);return{task:s,lastPromptAt:r.last_message_at,promptCount:r.message_count}})}import{readFileSync as Qse}from"node:fs";function Zse(e,t){return t?e.prepare("SELECT * FROM queue WHERE status = 'merged' AND merged_into_id IS NULL AND to_id = ? ORDER BY id").all(t):e.prepare("SELECT * FROM queue WHERE status = 'merged' AND merged_into_id IS NULL ORDER BY id").all()}function eoe(e,t){let n=e.prepare("SELECT * FROM queue WHERE to_id = ? AND status IN ('sent', 'retrieved') ORDER BY id").all(t.to_id),r=y_(t);for(let s of n){let o;try{o=Qse(s.prompt_file,"utf8")}catch{continue}if(o.includes(r))return s}return null}function HT(e,t){return Zse(e,t).map(n=>({row:n,verifiedTarget:eoe(e,n)}))}function BP(e,t){let n=HT(e,t),r=e.prepare("UPDATE queue SET merged_into_id = ? WHERE id = ?"),s=0,o=[];for(let{row:i,verifiedTarget:a}of n)a?(r.run(a.id,i.id),s++):o.push(i);return{repaired:s,unverified:o}}function WP(e,t){let n=t?e.prepare("SELECT * FROM queue WHERE status = 'merged' AND merged_into_id IS NOT NULL AND expects_response = 1 AND to_id = ? ORDER BY id").all(t):e.prepare("SELECT * FROM queue WHERE status = 'merged' AND merged_into_id IS NOT NULL AND expects_response = 1 ORDER BY id").all(),r=[];for(let s of n){let o=e.prepare("SELECT * FROM queue WHERE id = ?").get(s.merged_into_id);o===void 0||o.expects_response||r.push({row:s,canonical:o})}return r}var qT="operator";function toe(e){if(e===qT)throw new Error(`logical_names: "${qT}" is reserved for the real operator entity (epic #162's #164) -- never a re-routable logical name`)}function GP(e,t,n,r,s=new Date().toISOString()){toe(t),e.prepare(`INSERT INTO logical_names(name, teamfile_path, alias, updated_at) VALUES (?, ?, ?, ?)
2383
- ON CONFLICT(name) DO UPDATE SET teamfile_path = excluded.teamfile_path, alias = excluded.alias, updated_at = excluded.updated_at`).run(t,n,r,s)}function Xp(e,t){return t===qT?null:e.prepare("SELECT teamfile_path AS teamfilePath, alias FROM logical_names WHERE name = ?").get(t)??null}function XP(e){return e.prepare("SELECT name, teamfile_path AS teamfilePath, alias, updated_at AS updatedAt FROM logical_names ORDER BY name").all()}function VP(e,t){e.prepare("DELETE FROM logical_names WHERE name = ?").run(t)}function Tu(e,t,n){let r=Xp(e,n);if(r===null)return null;for(let s of t){if(!Q(s))continue;let o;try{o=se(s)}catch{continue}if(o===r.teamfilePath)return{team:s.name,alias:r.alias}}return null}import{existsSync as noe,mkdirSync as roe,readFileSync as soe,renameSync as ooe,writeFileSync as ioe}from"node:fs";import{homedir as aoe}from"node:os";import{dirname as coe,join as JP}from"node:path";function BT(e){let{row:t,answer:n}=e;return t.retracted_ts!==null?"RETRACTED":t.merged_into_id!==null?`MERGED->#${t.merged_into_id}`:n!==null?"ANSWERED":t.retrieved_ts!==null?"READ, no answer":t.status==="sent"?"NEVER RECEIVED":t.status.toUpperCase()}function WT(e,t,n){let r=`
2382
+ ORDER BY last_message_at DESC`).all(t,t).map(r=>{let s=wu(e,r.task_id);if(s===null)throw new Error(`prompt: task #${r.task_id} referenced by task_prompts but missing from prompt_tasks`);return{task:s,lastPromptAt:r.last_message_at,promptCount:r.message_count}})}import{readFileSync as zse}from"node:fs";function Qse(e,t){return t?e.prepare("SELECT * FROM queue WHERE status = 'merged' AND merged_into_id IS NULL AND to_id = ? ORDER BY id").all(t):e.prepare("SELECT * FROM queue WHERE status = 'merged' AND merged_into_id IS NULL ORDER BY id").all()}function Zse(e,t){let n=e.prepare("SELECT * FROM queue WHERE to_id = ? AND status IN ('sent', 'retrieved') ORDER BY id").all(t.to_id),r=y_(t);for(let s of n){let o;try{o=zse(s.prompt_file,"utf8")}catch{continue}if(o.includes(r))return s}return null}function HT(e,t){return Qse(e,t).map(n=>({row:n,verifiedTarget:Zse(e,n)}))}function BP(e,t){let n=HT(e,t),r=e.prepare("UPDATE queue SET merged_into_id = ? WHERE id = ?"),s=0,o=[];for(let{row:i,verifiedTarget:a}of n)a?(r.run(a.id,i.id),s++):o.push(i);return{repaired:s,unverified:o}}function WP(e,t){let n=t?e.prepare("SELECT * FROM queue WHERE status = 'merged' AND merged_into_id IS NOT NULL AND expects_response = 1 AND to_id = ? ORDER BY id").all(t):e.prepare("SELECT * FROM queue WHERE status = 'merged' AND merged_into_id IS NOT NULL AND expects_response = 1 ORDER BY id").all(),r=[];for(let s of n){let o=e.prepare("SELECT * FROM queue WHERE id = ?").get(s.merged_into_id);o===void 0||o.expects_response||r.push({row:s,canonical:o})}return r}var qT="operator";function eoe(e){if(e===qT)throw new Error(`logical_names: "${qT}" is reserved for the real operator entity (epic #162's #164) -- never a re-routable logical name`)}function GP(e,t,n,r,s=new Date().toISOString()){eoe(t),e.prepare(`INSERT INTO logical_names(name, teamfile_path, alias, updated_at) VALUES (?, ?, ?, ?)
2383
+ ON CONFLICT(name) DO UPDATE SET teamfile_path = excluded.teamfile_path, alias = excluded.alias, updated_at = excluded.updated_at`).run(t,n,r,s)}function Xp(e,t){return t===qT?null:e.prepare("SELECT teamfile_path AS teamfilePath, alias FROM logical_names WHERE name = ?").get(t)??null}function XP(e){return e.prepare("SELECT name, teamfile_path AS teamfilePath, alias, updated_at AS updatedAt FROM logical_names ORDER BY name").all()}function VP(e,t){e.prepare("DELETE FROM logical_names WHERE name = ?").run(t)}function Tu(e,t,n){let r=Xp(e,n);if(r===null)return null;for(let s of t){if(!Q(s))continue;let o;try{o=se(s)}catch{continue}if(o===r.teamfilePath)return{team:s.name,alias:r.alias}}return null}import{existsSync as toe,mkdirSync as noe,readFileSync as roe,renameSync as soe,writeFileSync as ooe}from"node:fs";import{homedir as ioe}from"node:os";import{dirname as aoe,join as JP}from"node:path";function BT(e){let{row:t,answer:n}=e;return t.retracted_ts!==null?"RETRACTED":t.merged_into_id!==null?`MERGED->#${t.merged_into_id}`:n!==null?"ANSWERED":t.retrieved_ts!==null?"READ, no answer":t.status==="sent"?"NEVER RECEIVED":t.status.toUpperCase()}function WT(e,t,n){let r=`
2384
2384
  SELECT q.*, r.id AS ans_id, r.answered_at AS ans_answered_at, r.answer_text AS ans_text,
2385
2385
  (SELECT COUNT(*) FROM answers s WHERE s.prompt_queue_id = q.id AND s.superseded_at IS NOT NULL) AS ans_superseded
2386
2386
  FROM queue q
2387
2387
  LEFT JOIN answers r ON r.prompt_queue_id = q.id AND r.superseded_at IS NULL
2388
2388
  WHERE q.from_id = ?
2389
- `,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 YP(e){return e.filter(t=>t.answer===null&&t.row.retracted_ts===null&&t.row.merged_into_id===null)}function KP(e,t){let n=t??process.env.LMBEE_SENDER_PULL_SEEN_DIR??JP(aoe(),".lmbee","sender-pull-seen");return JP(n,`${e}.json`)}function GT(e){try{let t=JSON.parse(soe(e,"utf8"));return new Map(Object.entries(t).map(([n,r])=>[Number(n),r]))}catch{return new Map}}function zP(e,t){let n=coe(e);noe(n)||roe(n,{recursive:!0});let r={};for(let[o,i]of t)r[String(o)]=i;let s=`${e}.tmp`;ioe(s,JSON.stringify(r,null,1)),ooe(s,e)}var loe=["team","escalation_attempt_count","last_escalation_attempt_ts","quota_exhausted_last_seen_ts","quota_exhausted_message"],XT=loe.join(", ");function uoe(e,t){return e.prepare(`SELECT ${XT} FROM team_progress WHERE team = ?`).get(t)??null}function QP(e,t){let n=e-Date.parse(t);return Number.isFinite(n)?n:null}function ZP(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:QP(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?QP(n,m.quota_exhausted_last_seen_ts):null,quotaExhaustedMessage:m?.quota_exhausted_message??null}),u=new Set([...a.keys(),...c.keys()]),d=[...u].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(uoe(e,m))}}),f=t?e.prepare(`SELECT ${XT} FROM team_progress WHERE team = ? AND escalation_attempt_count > 0`).all(t):e.prepare(`SELECT ${XT} FROM team_progress WHERE escalation_attempt_count > 0`).all();for(let m of f)u.has(m.team)||d.push({toId:m.team,pendingCount:0,oldestPendingAgeMs:null,escalatingCount:0,oldestEscalatingAgeMs:null,...l(m)});return d.sort((m,p)=>(p.oldestPendingAgeMs??-1)-(m.oldestPendingAgeMs??-1)),d}var Wr=qn(fr(),1);var goe=[".md",".txt",".json",".log",".yaml",".yml",".csv",".html",".htm",".xml"];function Eoe(e){if(/\s/.test(e)||!(e.startsWith("/")||e.startsWith("./")||goe.some(n=>e.toLowerCase().endsWith(n))))return!1;try{return foe(e)}catch{return!1}}function yoe(e,t){return new Error(`${e}: prompt body looks like a file path that exists on disk: "${t}"
2389
+ `,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 YP(e){return e.filter(t=>t.answer===null&&t.row.retracted_ts===null&&t.row.merged_into_id===null)}function KP(e,t){let n=t??process.env.LMBEE_SENDER_PULL_SEEN_DIR??JP(ioe(),".lmbee","sender-pull-seen");return JP(n,`${e}.json`)}function GT(e){try{let t=JSON.parse(roe(e,"utf8"));return new Map(Object.entries(t).map(([n,r])=>[Number(n),r]))}catch{return new Map}}function zP(e,t){let n=aoe(e);toe(n)||noe(n,{recursive:!0});let r={};for(let[o,i]of t)r[String(o)]=i;let s=`${e}.tmp`;ooe(s,JSON.stringify(r,null,1)),soe(s,e)}var coe=["team","escalation_attempt_count","last_escalation_attempt_ts","quota_exhausted_last_seen_ts","quota_exhausted_message"],XT=coe.join(", ");function loe(e,t){return e.prepare(`SELECT ${XT} FROM team_progress WHERE team = ?`).get(t)??null}function QP(e,t){let n=e-Date.parse(t);return Number.isFinite(n)?n:null}function ZP(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:QP(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?QP(n,m.quota_exhausted_last_seen_ts):null,quotaExhaustedMessage:m?.quota_exhausted_message??null}),u=new Set([...a.keys(),...c.keys()]),d=[...u].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(loe(e,m))}}),f=t?e.prepare(`SELECT ${XT} FROM team_progress WHERE team = ? AND escalation_attempt_count > 0`).all(t):e.prepare(`SELECT ${XT} FROM team_progress WHERE escalation_attempt_count > 0`).all();for(let m of f)u.has(m.team)||d.push({toId:m.team,pendingCount:0,oldestPendingAgeMs:null,escalatingCount:0,oldestEscalatingAgeMs:null,...l(m)});return d.sort((m,p)=>(p.oldestPendingAgeMs??-1)-(m.oldestPendingAgeMs??-1)),d}var Wr=qn(fr(),1);var _oe=[".md",".txt",".json",".log",".yaml",".yml",".csv",".html",".htm",".xml"];function goe(e){if(/\s/.test(e)||!(e.startsWith("/")||e.startsWith("./")||_oe.some(n=>e.toLowerCase().endsWith(n))))return!1;try{return doe(e)}catch{return!1}}function Eoe(e,t){return new Error(`${e}: prompt body looks like a file path that exists on disk: "${t}"
2390
2390
  Did you mean @${t} ?
2391
- Pass --literal if you really meant to send the path as text.`)}function vo(e,t,n){if(t.startsWith("@"))return YT(t.slice(1),"utf8");if(!n&&Eoe(t))throw yoe(e,t);return t}async function rU(e,t,n,r){let{baseId:s,alias:o}=Ho(t);if(s!=="operator"&&!e.teams.some(E=>E.name===s)){let E=Tu(e.db.db,e.teams,s);E!==null&&(s=E.team,o=o??E.alias,t=o!==null?`${s}:${o}`:s)}let i=`pending; the cron will deliver it -- or run: queue deliver ${s}`,a=e.teams.find(E=>E.name===s);if(a&&Q(a)){let E=o??a.leadAlias,y=Uo(a);if(y.length>0&&!y.some(T=>T.alias===E))throw new Error(`enqueue: "${E}" is not a configured member of team "${s}" -- actual members: ${y.map(T=>T.alias).join(", ")}`)}if(r.inReplyTo!==void 0&&Ds(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,u=vo("enqueue",n,r.literal),d=De(e.db.db,e.teams,t,u,{from:r.from,...r.expectsResponse!==void 0?{expectsResponse:r.expectsResponse}:{},...r.inReplyTo!==void 0?{inReplyTo:r.inReplyTo}:{},...l?{operatorPriority:!0}:{}}),m=(r.readSiteLockStateImpl??lr)(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.
2392
- `:"",h=a&&Q(a)?woe(e,a,o??a.leadAlias,t):"",g=(r.inReplyTo===void 0?Ds(e.db.db,d):null)?.expects_response===1&&!Toe(u)?`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.
2393
- `:"",w=p+h+g;if(a&&Q(a))try{let y=await(r.fetchReport??qe)();if(kt(a,y))return`${w}queued#${d} -> ${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#${d} -> ${t} (${i})`}function woe(e,t,n,r){let s;try{s=se(t)}catch{return""}let o=Sr(t,n),i=o!==null?tn(e.db.db,o):null,a=yu(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||tn(e.db.db,f.provider).disabled?!1:yu(e.db.db,s,f.alias)===null,u=Uo(t).filter(l).map(f=>f.alias),d=u.length>0?`live seats on this team: ${u.join(", ")}`:"no other known-live seats on this team";return`warning: ${c.join("; ")}; ${d}.
2394
- `}function Toe(e){return e.includes("?")}function KT(e,t){return{queue:__(e.db.db,t)}}function sU(e,t,n={}){if(n.json)return JSON.stringify(KT(e,t));let r=__(e.db.db,t).map(s=>[String(s.id),(0,Wr.escapeCell)(s.from_id),(0,Wr.escapeCell)(s.to_id),(0,Wr.escapeCell)(s.status),Le(s.created_ts),s.sent_ts!==null?Le(s.sent_ts):s.retrieved_ts!==null?Le(s.retrieved_ts):"-"]);return(0,Wr.formatTable)([["ID","FROM","TO","STATUS","CREATED","SENT/RETRIEVED"],...r])}function rc(e,t){return Ds(e.db.db,t)}function oU(e,t,n={}){let r=rc(e,t);return n.json?JSON.stringify(r?{queue:r}:Ue("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 VT=64*1024;function eU(e){if(e===null)return null;let t=Buffer.byteLength(e.answer_text,"utf8");if(t<=VT)return{...e,byteLength:t,totalBytes:t,truncated:!1};let n=Buffer.from(e.answer_text,"utf8").subarray(0,VT).toString("utf8");for(;Buffer.byteLength(n,"utf8")>VT;)n=n.slice(0,-1);return{...e,answer_text:n,byteLength:Buffer.byteLength(n,"utf8"),totalBytes:t,truncated:!0}}function vu(e,t){let n=Ds(e.db.db,t);if(n===null)return null;let r=mt(e.db.db,t),s=UD(e.db.db,t).map(o=>eU(o)).filter(o=>o!==null);return{id:n.id,createdAt:n.created_ts,answer:eU(r),answerHistory:s,mergedInto:n.status==="merged"?Qw(e.db.db,n)?.id??null:null,...zn(n,r)}}function iU(e,t,n={}){let r=vu(e,t);if(n.json)return JSON.stringify(r?{state:r}:Ue("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=`
2391
+ Pass --literal if you really meant to send the path as text.`)}function vo(e,t,n){if(t.startsWith("@"))return YT(t.slice(1),"utf8");if(!n&&goe(t))throw Eoe(e,t);return t}async function rU(e,t,n,r){let{baseId:s,alias:o}=Ho(t);if(s!=="operator"&&!e.teams.some(E=>E.name===s)){let E=Tu(e.db.db,e.teams,s);E!==null&&(s=E.team,o=o??E.alias,t=o!==null?`${s}:${o}`:s)}let i=`pending; the cron will deliver it -- or run: queue deliver ${s}`,a=e.teams.find(E=>E.name===s);if(a&&Q(a)){let E=o??a.leadAlias,y=Uo(a);if(y.length>0&&!y.some(T=>T.alias===E))throw new Error(`enqueue: "${E}" is not a configured member of team "${s}" -- actual members: ${y.map(T=>T.alias).join(", ")}`)}if(r.inReplyTo!==void 0&&Ds(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,u=vo("enqueue",n,r.literal),d=De(e.db.db,e.teams,t,u,{from:r.from,...r.expectsResponse!==void 0?{expectsResponse:r.expectsResponse}:{},...r.inReplyTo!==void 0?{inReplyTo:r.inReplyTo}:{},...l?{operatorPriority:!0}:{}}),m=(r.readSiteLockStateImpl??lr)(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.
2392
+ `:"",h=a&&Q(a)?yoe(e,a,o??a.leadAlias,t):"",g=(r.inReplyTo===void 0?Ds(e.db.db,d):null)?.expects_response===1&&!woe(u)?`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.
2393
+ `:"",w=p+h+g;if(a&&Q(a))try{let y=await(r.fetchReport??qe)();if(kt(a,y))return`${w}queued#${d} -> ${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#${d} -> ${t} (${i})`}function yoe(e,t,n,r){let s;try{s=se(t)}catch{return""}let o=Sr(t,n),i=o!==null?tn(e.db.db,o):null,a=yu(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||tn(e.db.db,f.provider).disabled?!1:yu(e.db.db,s,f.alias)===null,u=Uo(t).filter(l).map(f=>f.alias),d=u.length>0?`live seats on this team: ${u.join(", ")}`:"no other known-live seats on this team";return`warning: ${c.join("; ")}; ${d}.
2394
+ `}function woe(e){return e.includes("?")}function KT(e,t){return{queue:__(e.db.db,t)}}function sU(e,t,n={}){if(n.json)return JSON.stringify(KT(e,t));let r=__(e.db.db,t).map(s=>[String(s.id),(0,Wr.escapeCell)(s.from_id),(0,Wr.escapeCell)(s.to_id),(0,Wr.escapeCell)(s.status),Le(s.created_ts),s.sent_ts!==null?Le(s.sent_ts):s.retrieved_ts!==null?Le(s.retrieved_ts):"-"]);return(0,Wr.formatTable)([["ID","FROM","TO","STATUS","CREATED","SENT/RETRIEVED"],...r])}function rc(e,t){return Ds(e.db.db,t)}function oU(e,t,n={}){let r=rc(e,t);return n.json?JSON.stringify(r?{queue:r}:Ue("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 VT=64*1024;function eU(e){if(e===null)return null;let t=Buffer.byteLength(e.answer_text,"utf8");if(t<=VT)return{...e,byteLength:t,totalBytes:t,truncated:!1};let n=Buffer.from(e.answer_text,"utf8").subarray(0,VT).toString("utf8");for(;Buffer.byteLength(n,"utf8")>VT;)n=n.slice(0,-1);return{...e,answer_text:n,byteLength:Buffer.byteLength(n,"utf8"),totalBytes:t,truncated:!0}}function vu(e,t){let n=Ds(e.db.db,t);if(n===null)return null;let r=mt(e.db.db,t),s=UD(e.db.db,t).map(o=>eU(o)).filter(o=>o!==null);return{id:n.id,createdAt:n.created_ts,answer:eU(r),answerHistory:s,mergedInto:n.status==="merged"?Qw(e.db.db,n)?.id??null:null,...zn(n,r)}}function iU(e,t,n={}){let r=vu(e,t);if(n.json)return JSON.stringify(r?{state:r}:Ue("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=`
2395
2395
  answer history (${i.length} answers, amended ${i.length-1}x):
2396
2396
  ${i.join(`
2397
2397
  `)}`}else s=r.answer?`
@@ -2400,13 +2400,13 @@ answer: ${r.answer.answer_text}${r.answer.truncated?` \u2026 [truncated, ${r.ans
2400
2400
  ${o.join(`
2401
2401
  `)}`,exitCode:0}}function fU(e,t,n,r={}){try{let s=WD(e.db.db,t,n);return{output:r.json?JSON.stringify({row:s}):`requeued queue#${t} for redelivery (status: ${s.status})`,exitCode:0}}catch(s){if(s instanceof q)return{output:r.json?JSON.stringify(Ue(s.code,s.message)):`${s.code}: ${s.message}`,exitCode:s.exitCode};throw s}}function mU(e,t,n,r={}){let s=new Date().toISOString();return Hb(e.db.db,t,n??null,s),{output:r.json?JSON.stringify({team:t,pausedAt:s,reason:n??null}):`${t}: queue delivery paused${n?` (${n})`:""} -- manual lctl chat/nudge/enqueue unaffected; \`lmbee queue resume ${t}\` to lift`,exitCode:0}}function pU(e,t,n={}){let r=qb(e.db.db,t);return{output:n.json?JSON.stringify({team:t,wasPaused:r}):r?`${t}: queue delivery resumed`:`${t}: queue delivery was not paused`,exitCode:0}}function hU(e,t,n={}){if(t!==void 0){let o=Fb(e.db.db,t);return n.json?{output:JSON.stringify({team:t,paused:o!==null,state:o}),exitCode:0}:o===null?{output:`${t}: queue delivery is not paused`,exitCode:0}:{output:`${t}: queue delivery PAUSED since ${o.pausedAt}${o.reason?` (${o.reason})`:""}`,exitCode:0}}let r=jb(e.db.db);if(n.json)return{output:JSON.stringify({paused:r}),exitCode:0};if(r.length===0)return{output:"no teams have queue delivery paused",exitCode:0};let s=r.map(o=>` ${o.team}: paused since ${o.pausedAt}${o.reason?` (${o.reason})`:""}`);return{output:`queue delivery paused (${r.length}):
2402
2402
  ${s.join(`
2403
- `)}`,exitCode:0}}function Vp(e,t={}){let{rows:n,meta:r}=E_(e.db.db,t);return{rows:n.map(s=>({...s,...zn(s,mt(e.db.db,s.id))})),meta:r}}function zT(e,t={}){return E_(e.db.db,t)}var JT=32*1024;function So(e,t){let n=Ds(e.db.db,t);if(!n)return null;let r=new Date().toISOString(),s=u=>({id:t,status:u,text:null,byteLength:null,truncated:!1,sourceModifiedAt:null,fetchedAt:r}),o=u=>u.code==="ENOENT",i;try{i=hoe(n.prompt_file)}catch(u){return s(o(u)?"missing":"unreadable")}let a,c;try{let u=_oe(i);if(!u.isFile())return s("unreadable");a=u.size,c=u.mtime.toISOString()}catch(u){return s(o(u)?"missing":"unreadable")}let l;try{l=moe(i,"r")}catch{return s("unreadable")}try{let u=Buffer.alloc(JT),d=poe(l,u,0,JT,0);return{id:t,status:"available",text:u.subarray(0,d).toString("utf8"),byteLength:d,truncated:a>JT,sourceModifiedAt:c,fetchedAt:r}}catch{return s("unreadable")}finally{doe(l)}}async function _U(e,t,n={}){let s=await(n.fetchReport??qe)();return`queue deliver: dispatched ${$s(e.db.db,{teams:e.teams,teamName:t,report:s})} pending prompt(s)`}function gU(e,t,n={}){let r=yd(e.db.db,t,n.id),s=n.id===void 0?UP(e.db.db,t):[];if(r.length===0&&s.length===0)return`queue retrieve ${t}: nothing pending`;let o=r.map(c=>{let l;try{l=YT(c.prompt_file,"utf8")}catch{l="(could not read prompt file)"}return`#${c.id} from ${c.from_id} (${c.created_ts}):
2403
+ `)}`,exitCode:0}}function Vp(e,t={}){let{rows:n,meta:r}=E_(e.db.db,t);return{rows:n.map(s=>({...s,...zn(s,mt(e.db.db,s.id))})),meta:r}}function zT(e,t={}){return E_(e.db.db,t)}var JT=32*1024;function So(e,t){let n=Ds(e.db.db,t);if(!n)return null;let r=new Date().toISOString(),s=u=>({id:t,status:u,text:null,byteLength:null,truncated:!1,sourceModifiedAt:null,fetchedAt:r}),o=u=>u.code==="ENOENT",i;try{i=poe(n.prompt_file)}catch(u){return s(o(u)?"missing":"unreadable")}let a,c;try{let u=hoe(i);if(!u.isFile())return s("unreadable");a=u.size,c=u.mtime.toISOString()}catch(u){return s(o(u)?"missing":"unreadable")}let l;try{l=foe(i,"r")}catch{return s("unreadable")}try{let u=Buffer.alloc(JT),d=moe(l,u,0,JT,0);return{id:t,status:"available",text:u.subarray(0,d).toString("utf8"),byteLength:d,truncated:a>JT,sourceModifiedAt:c,fetchedAt:r}}catch{return s("unreadable")}finally{uoe(l)}}async function _U(e,t,n={}){let s=await(n.fetchReport??qe)();return`queue deliver: dispatched ${$s(e.db.db,{teams:e.teams,teamName:t,report:s})} pending prompt(s)`}function gU(e,t,n={}){let r=yd(e.db.db,t,n.id),s=n.id===void 0?UP(e.db.db,t):[];if(r.length===0&&s.length===0)return`queue retrieve ${t}: nothing pending`;let o=r.map(c=>{let l;try{l=YT(c.prompt_file,"utf8")}catch{l="(could not read prompt file)"}return`#${c.id} from ${c.from_id} (${c.created_ts}):
2404
2404
  ${l}`}),i=s.map(c=>`[task-prompt] #${c.id} from ${c.from_id} (${c.created_at}):
2405
2405
  ${c.prompt}`),a=r.length+s.length;return`queue retrieve ${t}${n.id===void 0?"":` #${n.id}`}: ${a} prompt(s)
2406
2406
 
2407
2407
  ${[...o,...i].join(`
2408
2408
 
2409
- `)}`}function voe(e,t){if(t==="operator"||e.teams.some(r=>r.name===t))return t;let n=Tu(e.db.db,e.teams,t);if(n!==null)return n.team;throw new Error(`queue inbox: "${t}" is not a registered team, "operator", or a resolvable logical name`)}function QT(e,t){let n=voe(e,t),r=[...FD(e.db.db,n),...Ed(e.db.db,n)];r.sort((o,i)=>o.id-i.id);let s=PP(e.db.db,n);return{pending:r,taskPrompts:s}}function EU(e,t,n={}){let r=QT(e,t),s=n.promptsOnly===!0?r.pending.filter(a=>a.in_reply_to===null):r.pending;if(n.json)return JSON.stringify({pending:s,taskPrompts:r.taskPrompts});let o=s.length+r.taskPrompts.length;if(o===0)return`queue inbox ${t}: nothing pending (queue or task prompts)`;let i=s.map(a=>{let c=a.in_reply_to!==null?`PROMPT -> #${a.in_reply_to}`:"PROMPT";if(a.status==="merged"){let d=Qw(e.db.db,a),f=d!==null?` -> #${d.id}`:"";return{ts:a.created_ts,text:`[queue] #${a.id} from ${a.from_id} (${Le(a.created_ts)}) ${c} status=merged${f} prompt=${a.prompt_file}`}}let l=zn(a,mt(e.db.db,a.id)),u=l.lifecycle==="queued"?"Queued":l.lifecycle==="processing"?"Processing":"Finished";return{ts:a.created_ts,text:`[queue] #${a.id} from ${a.from_id} (${Le(a.created_ts)}) ${c} status=${u} prompt=${a.prompt_file}`}});for(let a of r.taskPrompts){let c=a.task_id!==null?`task #${a.task_id}`:"no task";i.push({ts:a.created_at,text:`[task-prompt] #${a.id} from ${a.from_id} (${Le(a.created_at)}) ${c}: ${a.prompt}`})}return i.sort((a,c)=>a.ts.localeCompare(c.ts)),`queue inbox ${t}: ${o} pending (${s.length} queue, ${r.taskPrompts.length} task prompts)
2409
+ `)}`}function Toe(e,t){if(t==="operator"||e.teams.some(r=>r.name===t))return t;let n=Tu(e.db.db,e.teams,t);if(n!==null)return n.team;throw new Error(`queue inbox: "${t}" is not a registered team, "operator", or a resolvable logical name`)}function QT(e,t){let n=Toe(e,t),r=[...FD(e.db.db,n),...Ed(e.db.db,n)];r.sort((o,i)=>o.id-i.id);let s=PP(e.db.db,n);return{pending:r,taskPrompts:s}}function EU(e,t,n={}){let r=QT(e,t),s=n.promptsOnly===!0?r.pending.filter(a=>a.in_reply_to===null):r.pending;if(n.json)return JSON.stringify({pending:s,taskPrompts:r.taskPrompts});let o=s.length+r.taskPrompts.length;if(o===0)return`queue inbox ${t}: nothing pending (queue or task prompts)`;let i=s.map(a=>{let c=a.in_reply_to!==null?`PROMPT -> #${a.in_reply_to}`:"PROMPT";if(a.status==="merged"){let d=Qw(e.db.db,a),f=d!==null?` -> #${d.id}`:"";return{ts:a.created_ts,text:`[queue] #${a.id} from ${a.from_id} (${Le(a.created_ts)}) ${c} status=merged${f} prompt=${a.prompt_file}`}}let l=zn(a,mt(e.db.db,a.id)),u=l.lifecycle==="queued"?"Queued":l.lifecycle==="processing"?"Processing":"Finished";return{ts:a.created_ts,text:`[queue] #${a.id} from ${a.from_id} (${Le(a.created_ts)}) ${c} status=${u} prompt=${a.prompt_file}`}});for(let a of r.taskPrompts){let c=a.task_id!==null?`task #${a.task_id}`:"no task";i.push({ts:a.created_at,text:`[task-prompt] #${a.id} from ${a.from_id} (${Le(a.created_at)}) ${c}: ${a.prompt}`})}return i.sort((a,c)=>a.ts.localeCompare(c.ts)),`queue inbox ${t}: ${o} pending (${s.length} queue, ${r.taskPrompts.length} task prompts)
2410
2410
  ${i.map(a=>a.text).join(`
2411
2411
  `)}`}function yU(e,t,n={}){let r=yi(e.db.db,t,Date.now(),e.teams.map(o=>o.name));if(n.idsOnly)return r.map(o=>o.row.id).join(",");if(n.json)return JSON.stringify({owed:r});if(r.length===0)return`${t}: nothing owed`;let s=r.map(o=>` #${o.row.id} from ${o.row.from_id}, ${Ae(o.ageMs)} ago${o.hasReplyTrafficSince?" (likely answered in prose, row still open)":""}`);return`${t}: ${r.length} owed answer(s):
2412
2412
  ${s.join(`
@@ -2417,50 +2417,50 @@ close with: queue answer ${r.map(o=>o.row.id).join(",")} <text|@file> --from ${t
2417
2417
  ... (--full for the rest)`),a.push(u.split(`
2418
2418
  `).map(d=>` ${d}`).join(`
2419
2419
  `)),a.push("")}}return!o&&!n.all&&!n.open&&a.push(`-- ${i.length} unpulled answer(s). \`--mark\` to clear, \`--full\` for whole text.`),a.join(`
2420
- `).replace(/\n+$/,"")}function ZT(e,t,n=Date.now()){return{stats:ZP(e.db.db,t,n)}}function Soe(e){let t=e/36e5;return t<24?`${Math.round(t)}h ago`:`${Math.round(t/24)}d ago`}function vU(e,t,n={}){let r=ZT(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,Wr.escapeCell)(o.toId),String(o.pendingCount),o.oldestPendingAgeMs!==null?Ae(o.oldestPendingAgeMs):"-",String(o.escalatingCount),o.oldestEscalatingAgeMs!==null?Ae(o.oldestEscalatingAgeMs):"-",String(o.escalationAttemptCount),o.lastEscalationAttemptTs!==null?Le(o.lastEscalationAttemptTs):"-",o.quotaExhaustedLastSeenAgeMs!==null?Soe(o.quotaExhaustedLastSeenAgeMs):"-"]);return(0,Wr.formatTable)([["TO","PENDING","OLDEST AGE","ESCALATING","ESCALATING AGE","ESCALATION ATTEMPTS","LAST ESCALATION","QUOTA EXHAUSTED"],...s])}function SU(e,t){let n=(t??7)*24*60*6e4;return`queue gc: removed ${yA(e.db.db,{retentionMs:n})} prompt file(s) older than ${t??7} day(s)`}function boe(e,t,n){let r=WP(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=YT(o.prompt_file,"utf8").split(`
2420
+ `).replace(/\n+$/,"")}function ZT(e,t,n=Date.now()){return{stats:ZP(e.db.db,t,n)}}function voe(e){let t=e/36e5;return t<24?`${Math.round(t)}h ago`:`${Math.round(t/24)}d ago`}function vU(e,t,n={}){let r=ZT(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,Wr.escapeCell)(o.toId),String(o.pendingCount),o.oldestPendingAgeMs!==null?Ae(o.oldestPendingAgeMs):"-",String(o.escalatingCount),o.oldestEscalatingAgeMs!==null?Ae(o.oldestEscalatingAgeMs):"-",String(o.escalationAttemptCount),o.lastEscalationAttemptTs!==null?Le(o.lastEscalationAttemptTs):"-",o.quotaExhaustedLastSeenAgeMs!==null?voe(o.quotaExhaustedLastSeenAgeMs):"-"]);return(0,Wr.formatTable)([["TO","PENDING","OLDEST AGE","ESCALATING","ESCALATING AGE","ESCALATION ATTEMPTS","LAST ESCALATION","QUOTA EXHAUSTED"],...s])}function SU(e,t){let n=(t??7)*24*60*6e4;return`queue gc: removed ${yA(e.db.db,{retentionMs:n})} prompt file(s) older than ${t??7} day(s)`}function Soe(e,t,n){let r=WP(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=YT(o.prompt_file,"utf8").split(`
2421
2421
  `)[0]??""}catch{}s.push(` #${o.id} from ${o.from_id} to ${o.to_id}, ${Le(o.created_ts)} -- merged into #${i.id}: "${a}"`)}return s.join(`
2422
- `)}function bU(e,t,n={}){if(n.swallowed===!0)return boe(e,t,n.json);if(n.repair===!0){let l=BP(e.db.db,t);if(n.json)return JSON.stringify({repaired:l.repaired,unverified:l.unverified.map(d=>d.id)});let u=[`queue doctor${t?` ${t}`:""}: repaired ${l.repaired} row(s) with a verified merge target`];return l.unverified.length>0&&(u.push(`${l.unverified.length} row(s) could NOT be verified (left untouched, original content still in their own prompt_file):`),u.push(...l.unverified.map(d=>` #${d.id} from ${d.from_id} to ${d.to_id} (${d.created_ts}) prompt=${d.prompt_file}`))),u.join(`
2422
+ `)}function bU(e,t,n={}){if(n.swallowed===!0)return Soe(e,t,n.json);if(n.repair===!0){let l=BP(e.db.db,t);if(n.json)return JSON.stringify({repaired:l.repaired,unverified:l.unverified.map(d=>d.id)});let u=[`queue doctor${t?` ${t}`:""}: repaired ${l.repaired} row(s) with a verified merge target`];return l.unverified.length>0&&(u.push(`${l.unverified.length} row(s) could NOT be verified (left untouched, original content still in their own prompt_file):`),u.push(...l.unverified.map(d=>` #${d.id} from ${d.from_id} to ${d.to_id} (${d.created_ts}) prompt=${d.prompt_file}`))),u.join(`
2423
2423
  `)}let r=HT(e.db.db,t);if(n.json)return JSON.stringify(r.map(({row:l,verifiedTarget:u})=>({id:l.id,from:l.from_id,to:l.to_id,created_ts:l.created_ts,verifiedTarget:u?.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:u}of r){let d=i.get(l.to_id)??{verified:0,unverified:0};u!==null?d.verified++:d.unverified++,i.set(l.to_id,d)}let a=[...i.entries()].sort((l,u)=>u[1].unverified-l[1].unverified||u[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,Wr.formatTable)([["RECIPIENT","VERIFIED","UNVERIFIED"],...a.map(([l,u])=>[(0,Wr.escapeCell)(l),String(u.verified),String(u.unverified)])]).split(`
2424
2424
  `)];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(`
2425
- `)}import{readFileSync as Aoe,statSync as Ioe}from"node:fs";var sc=qn(fr(),1);function Jp(e,t,n){let r;try{r=Ioe(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=Aoe(t,"utf8")}catch(l){return{output:`error: could not read source ${t}: ${l instanceof Error?l.message:String(l)}`,ok:!1}}let a=o?n_(i):Dc(i);if(a.length===0)return{output:`error: source parsed to zero teams, not registered: ${t}`,ok:!1};nd(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 ev(e){return{defaultTeamsConfPath:e.teamsConfPath,sources:r_(e.db.db)}}function AU(e,t={}){let n=ev(e);if(t.json)return JSON.stringify(n);let r=["-",(0,sc.escapeCell)(n.defaultTeamsConfPath),"(default, always scanned)"],s=n.sources.map(o=>[String(o.id),(0,sc.escapeCell)(o.path),(0,sc.escapeCell)(o.label??"")]);return(0,sc.formatTable)([["ID","PATH","LABEL"],r,...s])}function IU(e,t){return rd(e.db.db,t),`source removed: ${t}`}import{execFile as koe}from"node:child_process";import{promisify as Roe}from"node:util";var oc=qn(fr(),1);var Noe=Roe(koe);function kU(e,t){return{team:t,state:It(e.db.db,t),progress:me(e.db.db,t),last_nudged:L_(e.db.db,t)}}function tv(e){let t=e.teams.map(r=>kU(e,r.name)),n=sd(e.db.db)??[];return{teams:t,active:n}}function nv(e,t){return{team:kU(e,t)}}var xoe=new Set(["DONE"]);function RU(e,t={}){let n=tv(e),r=t.nonDone?n.teams.filter(i=>!xoe.has(i.state?.status??"")):n.teams;if(t.json)return JSON.stringify({...n,teams:r});let s=r.map(i=>[(0,oc.escapeCell)(i.team),(0,oc.escapeCell)(i.state?.status??"?"),i.state?.changed_ts?Le(i.state.changed_ts):"-",i.state?.last_ts?Le(i.state.last_ts):"-",(0,oc.escapeCell)(i.progress?.progress_status??"?"),i.progress?.confirmed_done_ts?"yes":"-"]);return`${(0,oc.formatTable)([["TEAM","STATUS(self-report)","CHANGED","LAST","PROGRESS","CONFIRMED-DONE"],...s])}
2425
+ `)}import{readFileSync as boe,statSync as Aoe}from"node:fs";var sc=qn(fr(),1);function Jp(e,t,n){let r;try{r=Aoe(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=boe(t,"utf8")}catch(l){return{output:`error: could not read source ${t}: ${l instanceof Error?l.message:String(l)}`,ok:!1}}let a=o?n_(i):Dc(i);if(a.length===0)return{output:`error: source parsed to zero teams, not registered: ${t}`,ok:!1};nd(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 ev(e){return{defaultTeamsConfPath:e.teamsConfPath,sources:r_(e.db.db)}}function AU(e,t={}){let n=ev(e);if(t.json)return JSON.stringify(n);let r=["-",(0,sc.escapeCell)(n.defaultTeamsConfPath),"(default, always scanned)"],s=n.sources.map(o=>[String(o.id),(0,sc.escapeCell)(o.path),(0,sc.escapeCell)(o.label??"")]);return(0,sc.formatTable)([["ID","PATH","LABEL"],r,...s])}function IU(e,t){return rd(e.db.db,t),`source removed: ${t}`}import{execFile as Ioe}from"node:child_process";import{promisify as koe}from"node:util";var oc=qn(fr(),1);var Roe=koe(Ioe);function kU(e,t){return{team:t,state:It(e.db.db,t),progress:me(e.db.db,t),last_nudged:L_(e.db.db,t)}}function tv(e){let t=e.teams.map(r=>kU(e,r.name)),n=sd(e.db.db)??[];return{teams:t,active:n}}function nv(e,t){return{team:kU(e,t)}}var Noe=new Set(["DONE"]);function RU(e,t={}){let n=tv(e),r=t.nonDone?n.teams.filter(i=>!Noe.has(i.state?.status??"")):n.teams;if(t.json)return JSON.stringify({...n,teams:r});let s=r.map(i=>[(0,oc.escapeCell)(i.team),(0,oc.escapeCell)(i.state?.status??"?"),i.state?.changed_ts?Le(i.state.changed_ts):"-",i.state?.last_ts?Le(i.state.last_ts):"-",(0,oc.escapeCell)(i.progress?.progress_status??"?"),i.progress?.confirmed_done_ts?"yes":"-"]);return`${(0,oc.formatTable)([["TEAM","STATUS(self-report)","CHANGED","LAST","PROGRESS","CONFIRMED-DONE"],...s])}
2426
2426
  active: ${n.active.length?n.active.join(","):"(none)"}`}function NU(e,t,n={}){let{team:r}=nv(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}
2427
- ${o}`}function xU(e,t,n,r,s=Date.now()){return os(e.db.db,t,n,s),Wt(e.db.db,t,n,s,{note:r||"manual state set"}),`state set ${t} -> ${n}`}function LU(e,t,n,r=Date.now()){let s=new Date(r).toISOString();return qh(e.db.db,t,s),Wt(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 CU(e,t,n,r=Date.now(),s=Noe){let o=me(e.db.db,t)?.confirmed_done_ts!=null;qh(e.db.db,t,null),Wt(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||!Q(a))return i;try{let c=await lu(se(a),a.leadAlias,s);if(!c.sessionResolves){let l=c.provider?` (provider=${c.provider})`:"";return`${i}
2428
- 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 rv(e){return{active:sd(e.db.db)??[]}}function OU(e,t={}){let n=rv(e);return t.json?JSON.stringify(n):`active: ${n.active.length?n.active.join(","):"(none)"}`}function DU(e,t=Date.now()){if(!e.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='workflow_escalations'").get())return{open:0,oldest_age_s:null,by_scope:[]};let i=(e.prepare("PRAGMA table_info(workflow_escalations)").all().some(l=>l.name==="created_at_ms")?e.prepare("SELECT local_scope, COUNT(*) AS open, COUNT(created_at_ms) AS dated, MIN(created_at_ms) AS oldest FROM workflow_escalations WHERE state='waiting' GROUP BY local_scope ORDER BY local_scope").all():e.prepare("SELECT local_scope, COUNT(*) AS open FROM workflow_escalations WHERE state='waiting' GROUP BY local_scope ORDER BY local_scope").all()).map(l=>{let u=Number(l.open),d="oldest"in l?l.oldest:null,f="dated"in l?Number(l.dated):0;return{local_scope:l.local_scope,open:u,oldest_age_s:d!==null&&f===u?Math.max(0,Math.floor((t-Number(d))/1e3)):null}}),a=i.reduce((l,u)=>l+u.open,0),c=a===0||i.some(l=>l.oldest_age_s===null)?null:Math.max(...i.map(l=>l.oldest_age_s));return{open:a,oldest_age_s:c,by_scope:i}}var bo=qn(fr(),1);function Loe(e,t){return Q(e)?kt(e,t)?"Running":qo(e,t)?"Dead(reclaimable)":"Idle":"remote -- delivery only"}async function sv(e,t={}){let n=null;t.live&&(n=await(t.fetchReport??qe)());let r=e.teams.map(d=>{let f=It(e.db.db,d.name),m=gA(e.db.db,d.name).length,p={team:d.name,status:f?.status??null,changedTs:f?.changed_ts??null,pending:m};return t.live&&n&&(p.live=Loe(d,n)),p}),o=await(t.checkActiveGhAccountImpl??Np)(),i=o!==null&&!o.matchesPolicy?o:null,c=(t.readSiteLockStateImpl??lr)(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"},u=DU(e.db.db);return{live:t.live===!0,teams:r,ghAccountMismatch:i,daemon:l,escalations:u}}async function $U(e,t={}){let n=await sv(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,bo.escapeCell)(a.team),(0,bo.escapeCell)(a.status??"?"),a.changedTs===null?"-":Le(a.changedTs),String(a.pending)];return n.live?[...c,(0,bo.escapeCell)(a.live??"")]:c}),o=(0,bo.formatTable)([r,...s]),i=[];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 "${oT}". DO NOT PUSH until this is switched back. !!!`),i.push(n.escalations.oldest_age_s===null?`open escalations: ${n.escalations.open} (oldest age: unknown)`:`open escalations: ${n.escalations.open} (oldest age: ${n.escalations.oldest_age_s}s)`);for(let a of n.escalations.by_scope)i.push(a.oldest_age_s===null?` ${(0,bo.escapeCell)(a.local_scope)}: ${a.open} open (oldest age: unknown)`:` ${(0,bo.escapeCell)(a.local_scope)}: ${a.open} open (oldest age: ${a.oldest_age_s}s)`);return i.push(o),i.join(`
2427
+ ${o}`}function xU(e,t,n,r,s=Date.now()){return os(e.db.db,t,n,s),Wt(e.db.db,t,n,s,{note:r||"manual state set"}),`state set ${t} -> ${n}`}function LU(e,t,n,r=Date.now()){let s=new Date(r).toISOString();return qh(e.db.db,t,s),Wt(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 CU(e,t,n,r=Date.now(),s=Roe){let o=me(e.db.db,t)?.confirmed_done_ts!=null;qh(e.db.db,t,null),Wt(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||!Q(a))return i;try{let c=await lu(se(a),a.leadAlias,s);if(!c.sessionResolves){let l=c.provider?` (provider=${c.provider})`:"";return`${i}
2428
+ 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 rv(e){return{active:sd(e.db.db)??[]}}function OU(e,t={}){let n=rv(e);return t.json?JSON.stringify(n):`active: ${n.active.length?n.active.join(","):"(none)"}`}function DU(e,t=Date.now()){if(!e.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='workflow_escalations'").get())return{open:0,oldest_age_s:null,by_scope:[]};let i=(e.prepare("PRAGMA table_info(workflow_escalations)").all().some(l=>l.name==="created_at_ms")?e.prepare("SELECT local_scope, COUNT(*) AS open, COUNT(created_at_ms) AS dated, MIN(created_at_ms) AS oldest FROM workflow_escalations WHERE state='waiting' GROUP BY local_scope ORDER BY local_scope").all():e.prepare("SELECT local_scope, COUNT(*) AS open FROM workflow_escalations WHERE state='waiting' GROUP BY local_scope ORDER BY local_scope").all()).map(l=>{let u=Number(l.open),d="oldest"in l?l.oldest:null,f="dated"in l?Number(l.dated):0;return{local_scope:l.local_scope,open:u,oldest_age_s:d!==null&&f===u?Math.max(0,Math.floor((t-Number(d))/1e3)):null}}),a=i.reduce((l,u)=>l+u.open,0),c=a===0||i.some(l=>l.oldest_age_s===null)?null:Math.max(...i.map(l=>l.oldest_age_s));return{open:a,oldest_age_s:c,by_scope:i}}var bo=qn(fr(),1);function xoe(e,t){return Q(e)?kt(e,t)?"Running":qo(e,t)?"Dead(reclaimable)":"Idle":"remote -- delivery only"}async function sv(e,t={}){let n=null;t.live&&(n=await(t.fetchReport??qe)());let r=e.teams.map(d=>{let f=It(e.db.db,d.name),m=gA(e.db.db,d.name).length,p={team:d.name,status:f?.status??null,changedTs:f?.changed_ts??null,pending:m};return t.live&&n&&(p.live=xoe(d,n)),p}),o=await(t.checkActiveGhAccountImpl??Np)(),i=o!==null&&!o.matchesPolicy?o:null,c=(t.readSiteLockStateImpl??lr)(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"},u=DU(e.db.db);return{live:t.live===!0,teams:r,ghAccountMismatch:i,daemon:l,escalations:u}}async function $U(e,t={}){let n=await sv(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,bo.escapeCell)(a.team),(0,bo.escapeCell)(a.status??"?"),a.changedTs===null?"-":Le(a.changedTs),String(a.pending)];return n.live?[...c,(0,bo.escapeCell)(a.live??"")]:c}),o=(0,bo.formatTable)([r,...s]),i=[];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 "${oT}". DO NOT PUSH until this is switched back. !!!`),i.push(n.escalations.oldest_age_s===null?`open escalations: ${n.escalations.open} (oldest age: unknown)`:`open escalations: ${n.escalations.open} (oldest age: ${n.escalations.oldest_age_s}s)`);for(let a of n.escalations.by_scope)i.push(a.oldest_age_s===null?` ${(0,bo.escapeCell)(a.local_scope)}: ${a.open} open (oldest age: unknown)`:` ${(0,bo.escapeCell)(a.local_scope)}: ${a.open} open (oldest age: ${a.oldest_age_s}s)`);return i.push(o),i.join(`
2429
2429
 
2430
- `)}var Ao=qn(fr(),1);function ov(e){return{teams:e.teams}}function MU(e,t={}){if(t.json)return JSON.stringify(ov(e));let n=e.teams.map(r=>Q(r)?[(0,Ao.escapeCell)(r.name),(0,Ao.escapeCell)(r.leadAlias),(0,Ao.escapeCell)(r.promptName),(0,Ao.escapeCell)(r.description)]:[(0,Ao.escapeCell)(r.name),"(remote)","--","--"]);return(0,Ao.formatTable)([["TEAM","LEAD","PROMPT","WHAT-IT-DOES"],...n])}function Coe(e){let t=e.LMCTL_AUTH_URL?.trim()||e.LMCTL_AUTH_BASE_URL?.trim();return t?t.replace(/\/+$/,""):void 0}async function Yp(e={}){let t=e.env??process.env,n=e.resolveAppkeyImpl??Oe,r=e.validateAppkeyImpl??Lh,s=Coe(t),o;try{o=n({env:t})}catch(c){return{data:Ue("no_appkey",c instanceof Error?c.message:String(c)),exitCode:3}}let i=s===void 0?null:Oh(s);if(i!==null)return{data:Ue("insecure_endpoint",`the auth endpoint is not safe for your appkey: ${i}`),exitCode:4};let a;try{a=await r(o.appkey,{env:t,fetchImpl:ss(),...s!==void 0?{authBaseUrl:s}:{}})}catch(c){return{data:Ue("auth_unreachable",`could not validate appkey: ${c instanceof Error?c.message:String(c)}`),exitCode:4}}return a.valid?{data:{userId:a.userId,label:a.label,appkeySource:o.source},exitCode:0}:{data:Ue("invalid_appkey",`appkey is invalid (source: ${o.source})`),exitCode:3}}async function Kp(e={}){let{data:t,exitCode:n}=await Yp(e);if(e.interactive===!0&&"error"in t&&(t.error.code==="no_appkey"||t.error.code==="invalid_appkey")){try{await(e.acquireAppkeyImpl??Yt)({env:e.env??process.env,interactive:!0,validate:t.error.code==="invalid_appkey",...e.resolveAppkeyImpl?{resolveAppkeyImpl:e.resolveAppkeyImpl}:{}})}catch(r){let s=r instanceof Error?r.message:String(r),o=Ue("no_appkey",`could not sign in: ${s}`);return{output:e.json?JSON.stringify(o):`could not sign in: ${s}`,exitCode:3}}({data:t,exitCode:n}=await Yp(e))}return e.json?{output:JSON.stringify(t),exitCode:n}:"error"in t?{output:t.error.message,exitCode:n}:{output:`user_id: ${t.userId}
2430
+ `)}var Ao=qn(fr(),1);function ov(e){return{teams:e.teams}}function MU(e,t={}){if(t.json)return JSON.stringify(ov(e));let n=e.teams.map(r=>Q(r)?[(0,Ao.escapeCell)(r.name),(0,Ao.escapeCell)(r.leadAlias),(0,Ao.escapeCell)(r.promptName),(0,Ao.escapeCell)(r.description)]:[(0,Ao.escapeCell)(r.name),"(remote)","--","--"]);return(0,Ao.formatTable)([["TEAM","LEAD","PROMPT","WHAT-IT-DOES"],...n])}function Loe(e){let t=e.LMCTL_AUTH_URL?.trim()||e.LMCTL_AUTH_BASE_URL?.trim();return t?t.replace(/\/+$/,""):void 0}async function Yp(e={}){let t=e.env??process.env,n=e.resolveAppkeyImpl??Oe,r=e.validateAppkeyImpl??Lh,s=Loe(t),o;try{o=n({env:t})}catch(c){return{data:Ue("no_appkey",c instanceof Error?c.message:String(c)),exitCode:3}}let i=s===void 0?null:Oh(s);if(i!==null)return{data:Ue("insecure_endpoint",`the auth endpoint is not safe for your appkey: ${i}`),exitCode:4};let a;try{a=await r(o.appkey,{env:t,fetchImpl:ss(),...s!==void 0?{authBaseUrl:s}:{}})}catch(c){return{data:Ue("auth_unreachable",`could not validate appkey: ${c instanceof Error?c.message:String(c)}`),exitCode:4}}return a.valid?{data:{userId:a.userId,label:a.label,appkeySource:o.source},exitCode:0}:{data:Ue("invalid_appkey",`appkey is invalid (source: ${o.source})`),exitCode:3}}async function Kp(e={}){let{data:t,exitCode:n}=await Yp(e);if(e.interactive===!0&&"error"in t&&(t.error.code==="no_appkey"||t.error.code==="invalid_appkey")){try{await(e.acquireAppkeyImpl??Yt)({env:e.env??process.env,interactive:!0,validate:t.error.code==="invalid_appkey",...e.resolveAppkeyImpl?{resolveAppkeyImpl:e.resolveAppkeyImpl}:{}})}catch(r){let s=r instanceof Error?r.message:String(r),o=Ue("no_appkey",`could not sign in: ${s}`);return{output:e.json?JSON.stringify(o):`could not sign in: ${s}`,exitCode:3}}({data:t,exitCode:n}=await Yp(e))}return e.json?{output:JSON.stringify(t),exitCode:n}:"error"in t?{output:t.error.message,exitCode:n}:{output:`user_id: ${t.userId}
2431
2431
  label: ${t.label}
2432
- appkey source: ${t.appkeySource}`,exitCode:n}}import{execFile as Ooe}from"node:child_process";import{promisify as Doe}from"node:util";var $oe=Doe(Ooe);async function PU(e,t=3e4){let n=e.trim().split(/\s+/).filter(Boolean),{stdout:r}=await $oe("lmctl",["status",...n,"--json"],{timeout:t}),s;try{s=JSON.parse(r)}catch(o){throw new Error(`unexpected \`lmctl status --json\` output (not valid JSON): ${o instanceof Error?o.message:String(o)}`)}if(typeof s!="object"||s===null||Array.isArray(s))throw new Error("unexpected `lmctl status --json` shape: expected a JSON object");return s}import{execFile as Moe}from"node:child_process";import{existsSync as Poe}from"node:fs";import{promisify as Uoe}from"node:util";var Foe=Uoe(Moe),zp=class extends Error{constructor(){super("LMBI_SUBSCRIPTION_CLI is not set -- point it at lmbi's own reviewed subscription-report-cli.js (see the lmbi subscription contract for the current staged path) before running this command."),this.name="SubscriptionCliNotConfiguredError"}};async function iv(e){let t=e.cliPath??process.env.LMBI_SUBSCRIPTION_CLI;if(t===void 0||t==="")throw new zp;let n=e.execFileImpl??Foe,{stdout:r}=await n("node",[t,e.configPath,"--json"],{timeout:e.timeoutMs??3e4});return JSON.parse(r)}async function UU(e={}){let t=e.configPath??process.env.LMBI_SUBSCRIPTION_CONFIG_PATH;if(t===void 0||t===""||!Poe(t))return{status:200,body:{needs_configuration:!0}};try{return{status:200,body:await iv({configPath:t,cliPath:e.cliPath,execFileImpl:e.execFileImpl})}}catch(n){return n instanceof zp?{status:500,body:{error:n.message}}:{status:502,body:{error:n instanceof Error?n.message:String(n)}}}}import{createHash as BU,randomBytes as qoe,timingSafeEqual as Boe}from"node:crypto";var FU=e=>{let t=e.env.server?e.env.server:e.env,n=t.incoming.socket.remoteAddress,r=t.incoming.socket.remotePort,s=t.incoming.socket.remoteFamily;return{remote:{address:n,port:r,addressType:s==="IPv4"?"IPv4":s==="IPv6"?"IPv6":void 0}}};import{createHash as jU}from"node:crypto";import{basename as joe}from"node:path";function U(e){return String(e??"").replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[t])}var HU="body{font:1rem/1.45 system-ui,sans-serif;margin:1rem;color:#111;background:#fff}main,header,footer{max-width:90rem}h1{font-size:1.5rem;margin:.7rem 0}h2{font-size:1.2rem;margin:1rem 0 .4rem}p{margin:.5rem 0}a{color:#0645ad;overflow-wrap:anywhere}table{border-collapse:collapse;width:100%;min-width:44rem}th,td{text-align:left;vertical-align:top;padding:.35rem .5rem;border:1px solid #bbb;overflow-wrap:anywhere}caption{text-align:left;font-weight:bold}.table-scroll,section{max-width:100%;overflow-x:auto}form{display:flex;flex-wrap:wrap;gap:.5rem;align-items:end;margin:.7rem 0}label{display:flex;flex-direction:column;max-width:100%}input,select,textarea,button{font:inherit;max-width:100%;box-sizing:border-box}textarea{flex:1 1 100%}pre{white-space:pre-wrap;overflow-wrap:anywhere}details,li,dd{overflow-wrap:anywhere}dd{margin-left:1rem}article{border-top:1px solid #bbb;padding:.5rem 0}.warning{border-left:3px solid #754b00;padding-left:.5rem}footer{margin-top:2rem}.status-chip{display:inline-block;padding:.15rem .55rem;border-radius:1rem;border:1px solid transparent;font-size:.85rem;font-weight:600;line-height:1.4}.status-queued{background:#dbeafe;color:#1e3a8a;border-color:#93c5fd}.status-replied{background:#dcfce7;color:#14532d;border-color:#86efac}.status-processing{background:#fef3c7;color:#78350f;border-color:#fcd34d}.status-muted{background:#f3f4f6;color:#374151;border-color:#d1d5db}@media(max-width:500px){body{margin:.75rem}th,td{padding:.25rem}}",Hoe=`default-src 'none'; style-src 'sha256-${jU("sha256").update(HU).digest("base64")}'; form-action 'self'`;function et(e,t){return`<a href="${U(e)}">${U(t)}</a>`}function ic(e,t,n){return t.length?`<div class="table-scroll" role="region" aria-label="${U(n)}" tabindex="0"><table><caption>${U(n)}</caption><thead><tr>${e.map(r=>`<th scope="col">${U(r)}</th>`).join("")}</tr></thead><tbody>${t.map(r=>`<tr>${r.map(s=>`<td>${s}</td>`).join("")}</tr>`).join("")}</tbody></table></div>`:"<p>No matching records.</p>"}function Re(e){return`<time datetime="${U(e)}" title="${U(e)}">${U(Le(e))}</time>`}function pt(e,t,n=200){return e.header("Cache-Control","no-store"),e.header("X-Content-Type-Options","nosniff"),e.html(t,n)}function Be(e,t,n,r={},s=[],o=!1){let i=n.replace(/\/$/,""),a=o&&i!=="",c=Hoe+`; base-uri '${a?"self":"none"}'`+(s.length?`; script-src ${s.map(d=>`'sha256-${jU("sha256").update(d).digest("base64")}'`).join(" ")}; connect-src 'self'`:""),l=Object.entries(r).map(([d,f])=>` ${d}="${U(f)}"`).join(""),u=[[i||"/","Home"],[`${i}/tasks`,"Tasks"],[`${i}/running`,"Running"],[`${i}/cron`,"Cron"],[`${i}/comm/math`,"Prompts"],[`${i}/operator`,"Operator"]];return`<!doctype html><html lang="en"><head><meta charset="utf-8">
2432
+ appkey source: ${t.appkeySource}`,exitCode:n}}import{execFile as Coe}from"node:child_process";import{promisify as Ooe}from"node:util";var Doe=Ooe(Coe);async function PU(e,t=3e4){let n=e.trim().split(/\s+/).filter(Boolean),{stdout:r}=await Doe("lmctl",["status",...n,"--json"],{timeout:t}),s;try{s=JSON.parse(r)}catch(o){throw new Error(`unexpected \`lmctl status --json\` output (not valid JSON): ${o instanceof Error?o.message:String(o)}`)}if(typeof s!="object"||s===null||Array.isArray(s))throw new Error("unexpected `lmctl status --json` shape: expected a JSON object");return s}import{execFile as $oe}from"node:child_process";import{existsSync as Moe}from"node:fs";import{promisify as Poe}from"node:util";var Uoe=Poe($oe),zp=class extends Error{constructor(){super("LMBI_SUBSCRIPTION_CLI is not set -- point it at lmbi's own reviewed subscription-report-cli.js (see the lmbi subscription contract for the current staged path) before running this command."),this.name="SubscriptionCliNotConfiguredError"}};async function iv(e){let t=e.cliPath??process.env.LMBI_SUBSCRIPTION_CLI;if(t===void 0||t==="")throw new zp;let n=e.execFileImpl??Uoe,{stdout:r}=await n("node",[t,e.configPath,"--json"],{timeout:e.timeoutMs??3e4});return JSON.parse(r)}async function UU(e={}){let t=e.configPath??process.env.LMBI_SUBSCRIPTION_CONFIG_PATH;if(t===void 0||t===""||!Moe(t))return{status:200,body:{needs_configuration:!0}};try{return{status:200,body:await iv({configPath:t,cliPath:e.cliPath,execFileImpl:e.execFileImpl})}}catch(n){return n instanceof zp?{status:500,body:{error:n.message}}:{status:502,body:{error:n instanceof Error?n.message:String(n)}}}}import{createHash as BU,randomBytes as Hoe,timingSafeEqual as qoe}from"node:crypto";var FU=e=>{let t=e.env.server?e.env.server:e.env,n=t.incoming.socket.remoteAddress,r=t.incoming.socket.remotePort,s=t.incoming.socket.remoteFamily;return{remote:{address:n,port:r,addressType:s==="IPv4"?"IPv4":s==="IPv6"?"IPv6":void 0}}};import{createHash as jU}from"node:crypto";import{basename as Foe}from"node:path";function U(e){return String(e??"").replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[t])}var HU="body{font:1rem/1.45 system-ui,sans-serif;margin:1rem;color:#111;background:#fff}main,header,footer{max-width:90rem}h1{font-size:1.5rem;margin:.7rem 0}h2{font-size:1.2rem;margin:1rem 0 .4rem}p{margin:.5rem 0}a{color:#0645ad;overflow-wrap:anywhere}table{border-collapse:collapse;width:100%;min-width:44rem}th,td{text-align:left;vertical-align:top;padding:.35rem .5rem;border:1px solid #bbb;overflow-wrap:anywhere}caption{text-align:left;font-weight:bold}.table-scroll,section{max-width:100%;overflow-x:auto}form{display:flex;flex-wrap:wrap;gap:.5rem;align-items:end;margin:.7rem 0}label{display:flex;flex-direction:column;max-width:100%}input,select,textarea,button{font:inherit;max-width:100%;box-sizing:border-box}textarea{flex:1 1 100%}pre{white-space:pre-wrap;overflow-wrap:anywhere}details,li,dd{overflow-wrap:anywhere}dd{margin-left:1rem}article{border-top:1px solid #bbb;padding:.5rem 0}.warning{border-left:3px solid #754b00;padding-left:.5rem}footer{margin-top:2rem}.status-chip{display:inline-block;padding:.15rem .55rem;border-radius:1rem;border:1px solid transparent;font-size:.85rem;font-weight:600;line-height:1.4}.status-queued{background:#dbeafe;color:#1e3a8a;border-color:#93c5fd}.status-replied{background:#dcfce7;color:#14532d;border-color:#86efac}.status-processing{background:#fef3c7;color:#78350f;border-color:#fcd34d}.status-muted{background:#f3f4f6;color:#374151;border-color:#d1d5db}@media(max-width:500px){body{margin:.75rem}th,td{padding:.25rem}}",joe=`default-src 'none'; style-src 'sha256-${jU("sha256").update(HU).digest("base64")}'; form-action 'self'`;function et(e,t){return`<a href="${U(e)}">${U(t)}</a>`}function ic(e,t,n){return t.length?`<div class="table-scroll" role="region" aria-label="${U(n)}" tabindex="0"><table><caption>${U(n)}</caption><thead><tr>${e.map(r=>`<th scope="col">${U(r)}</th>`).join("")}</tr></thead><tbody>${t.map(r=>`<tr>${r.map(s=>`<td>${s}</td>`).join("")}</tr>`).join("")}</tbody></table></div>`:"<p>No matching records.</p>"}function Re(e){return`<time datetime="${U(e)}" title="${U(e)}">${U(Le(e))}</time>`}function pt(e,t,n=200){return e.header("Cache-Control","no-store"),e.header("X-Content-Type-Options","nosniff"),e.html(t,n)}function Be(e,t,n,r={},s=[],o=!1){let i=n.replace(/\/$/,""),a=o&&i!=="",c=joe+`; base-uri '${a?"self":"none"}'`+(s.length?`; script-src ${s.map(d=>`'sha256-${jU("sha256").update(d).digest("base64")}'`).join(" ")}; connect-src 'self'`:""),l=Object.entries(r).map(([d,f])=>` ${d}="${U(f)}"`).join(""),u=[[i||"/","Home"],[`${i}/tasks`,"Tasks"],[`${i}/running`,"Running"],[`${i}/cron`,"Cron"],[`${i}/comm/math`,"Prompts"],[`${i}/operator`,"Operator"]];return`<!doctype html><html lang="en"><head><meta charset="utf-8">
2433
2433
  <meta name="viewport" content="width=device-width, initial-scale=1"><meta http-equiv="Content-Security-Policy" content="${U(c)}"><title>${U(e)} \u2014 lmauto</title>
2434
2434
  ${a?`<base href="${U(i)}/" />`:""}
2435
- <style>${HU}</style></head><body><a href="#main">Skip to content</a><header><p>Local operations / lmauto</p><nav aria-label="Main">${u.map(([d,f])=>et(d,f)).join(" | ")}</nav></header><main${l} id="main"><h1>${U(e)}</h1>${t}</main><footer><p>Times are relative to this page load. Refresh for current data.</p></footer></body></html>`}function Io(e){let t=new Map;for(let n of e)if(Q(n))try{t.set(se(n),n.name)}catch{}return t}function qU(e,t,n){function r(o,i=!0){if(o===null)return"\u2014";let a=Oi(o);if(!a)return U(o);let{teamfilePath:c,alias:l}=a,u=`${joe(c)}:${l}`,d=t.get(c);if(i&&d)return`<a href="${U(`${n}/sessions/${encodeURIComponent(d)}/${encodeURIComponent(l)}`)}" title="${U(o)}">${U(u)}</a>`;let f=i?`${o} \u2014 Not in the current local team registry -- no session page available`:o;return`<span title="${U(f)}">${U(u)}</span>`}function s(o,i,a){return`<section><h2>${o}</h2><table><thead><tr>${i.map(c=>`<th scope="col">${c}</th>`).join("")}</tr></thead><tbody>${a.length?a.map(c=>`<tr>${c.map(l=>`<td>${l}</td>`).join("")}</tr>`).join(""):`<tr><td colspan="${i.length}">No ${o.toLowerCase()} invocations.</td></tr>`}</tbody></table></section>`}return"<p>Running shows work still in progress. Dead means its process stopped abnormally while work was still in progress; session data remains intact and may be resumed. Idle means the invocation finished, successfully or with a recorded error; an Idle error status describes that finished result, not an ongoing crash. A target is &lt;teamfile&gt;.lmctl:&lt;role&gt;: the team\u2019s configuration file and the member role executing, such as Lead or Coder. From names what started the invocation: another member\u2019s identity, or operator for a person acting directly, not through an agent. Only targets whose team can be resolved in the current local registry link to a session page; other targets remain unlinked. Full identities are available in the labels\u2019 tooltips.</p>"+s("Running",["Target","From","Started","Running for"],e.running.map(o=>[r(o.target),r(o.from_identity,!1),U(o.started_human),U(o.running_for_human)]))+s("Dead",["Target","From","Started","Age"],e.dead.map(o=>[r(o.target),r(o.from_identity,!1),U(o.started_human),U(o.age_human)]))+s("Idle",["Target","From","Status","Ended","Idle for","Ran for"],e.idle.map(o=>[r(o.target),r(o.from_identity,!1),U(o.status),U(Le(o.ended_at)),U(Ae(o.idle_ms)),U(o.ran_human)]))}var Qp="localweb_session",Woe=8*1024,Goe=1024,Xoe=30*24*60*60,Voe=10,Joe=6e4,Yoe=6e4,Koe=1024;function KU(e,t){let n=zoe(t.mountPath),r=`${n}/login`||"/login",s=`${n}/`||"/",o=n||"/",i=t.allowedOrigins,a=new Map,c=new Map,l=t.remoteKey??oie,u,d=()=>{let f;try{f=t.readAuthority()}catch{f=null}return!f||!f.passcode||!f.generation?(a.clear(),u=void 0,null):(u!==void 0&&f.generation!==u&&a.clear(),u=f.generation,f)};e.use("*",async(f,m)=>{f.header("Cache-Control","no-store");let p=Qoe(f.req.path,n);if(f.req.method==="GET"&&(p==="/healthz"||p==="/login")||f.req.method==="POST"&&p==="/login"){await m();return}let h=f.req.header("origin");if(h!==void 0&&!i.includes(h))return f.json({error:"origin not allowed"},403);let _=d();if(_===null)return Su(f,p,r,n,"unavailable");let g=f.req.header("authorization");if(g!==void 0){let E=l(f),y=Date.now();if(VU(c,E,y))return Su(f,p,r,n,"locked_out");let T=g.startsWith("Bearer ")?g.slice(7):"";if(!XU(T,_.passcode))return JU(c,E,y),Su(f,p,r,n);YU(c,E),await m();return}let w=GU(f.req.header("cookie"));if(w===null||a.get(w)!==_.generation)return Su(f,p,r,n,w===null?"missing":"expired");if(nie(f.req.method)&&!WU(f.req.url,f.req.header("host"),h,i))return Su(f,p,r,n);await m()}),e.get("/healthz",f=>f.json({ok:!0})),e.get("/login",f=>f.html(Zoe(ZU(f,r,n),n))),e.post("/login",async f=>{if(!WU(f.req.url,f.req.header("host"),f.req.header("origin"),i))return av(f,r,n);let m=l(f),p=Date.now();if(VU(c,m,p))return eie(f,n);let h=d();if(h===null)return av(f,r,n);let _=await tie(f.req.raw).catch(()=>null);if(_===null||!XU(_,h.passcode))return JU(c,m,p),av(f,r,n);YU(c,m),a.size>=Goe&&a.delete(a.keys().next().value);let g=qoe(32).toString("base64url");return a.set(g,h.generation),f.header("Set-Cookie",rie(g,o,new URL(f.req.url).protocol==="https:")),f.redirect(QU(f,n)??s,303)}),e.post("/logout",f=>{let m=GU(f.req.header("cookie"));return m!==null&&a.delete(m),f.header("Set-Cookie",sie(o,new URL(f.req.url).protocol==="https:")),f.redirect(r,303)})}function zoe(e=""){if(e===""||e==="/")return"";let t=e.endsWith("/")?e.slice(0,-1):e;if(!/^\/[A-Za-z0-9_./~-]+$/.test(t)||t.startsWith("//"))throw new Error("Invalid mount path");return t}function Qoe(e,t){return t&&(e===t||e.startsWith(`${t}/`))?e.slice(t.length)||"/":e}function Su(e,t,n,r,s="required"){let o=s==="locked_out"?429:401;if(t==="/api"||t.startsWith("/api/"))return e.json({error:s==="locked_out"?"too many failed attempts":"unauthorized"},o);let i={unavailable:"Authentication is not currently available.",missing:"You are not logged in yet.",expired:"Your session expired. Log in again to continue.",required:"Authentication required.",locked_out:"Too many failed attempts from this source. Try again shortly."}[s],a=e.req.method==="GET"?zU(`${r}${t}${new URL(e.req.url).search}`,r):null,c=a===null?n:`${n}?next=${encodeURIComponent(a)}`,l=s==="locked_out"?`<p>${i}</p>`:`<p>${i}</p><p><a href="${U(c)}">Log in</a></p>`;return e.html(Be("Authentication required",l,r),o)}function Zoe(e,t){return Be("LocalWeb login",`<form method="post" action="${U(e)}"><label>Passcode<input type="password" name="passcode" autocomplete="current-password" required></label><button type="submit">Log in</button></form>`,t)}function av(e,t,n){return e.html(Be("Login failed",`<p>Invalid credentials.</p><a href="${U(ZU(e,t,n))}">Try again</a>`,n),401)}function eie(e,t){return e.html(Be("Login failed","<p>Too many failed attempts from this source. Try again shortly.</p>",t),429)}function zU(e,t){if(!e||e.length>4096||!e.startsWith("/")||e.startsWith("//")||/[\\\x00-\x20\x7f]/.test(e))return null;let n="http://localweb.invalid";try{let r=new URL(e,n),s=decodeURIComponent(r.pathname);if(r.origin!==n||s.includes("//")||/[\\\x00-\x1f\x7f]/.test(s))return null;let o=new URL(s,n),i=a=>!t||a===t||a.startsWith(`${t}/`);return o.origin!==n||o.pathname.includes("//")||!i(r.pathname)||!i(o.pathname)?null:`${r.pathname}${r.search}${r.hash}`}catch{return null}}function QU(e,t){let n=new URL(e.req.url).searchParams.getAll("next");return n.length===1?zU(n[0],t):null}function ZU(e,t,n){let r=QU(e,n);return r===null?t:`${t}?next=${encodeURIComponent(r)}`}async function tie(e){if(!e.headers.get("content-type")?.toLowerCase().startsWith("application/x-www-form-urlencoded"))throw new Error("invalid form");let t=e.body?.getReader();if(!t)throw new Error("missing form");let n=[],r=0;for(;;){let{done:o,value:i}=await t.read();if(o)break;if(r+=i.byteLength,r>Woe)throw await t.cancel(),new Error("form too large");n.push(i)}let s=new URLSearchParams(Buffer.concat(n).toString("utf8"));if(s.getAll("passcode").length!==1||[...s.keys()].some(o=>o!=="passcode"))throw new Error("invalid form");return s.get("passcode")??""}function WU(e,t,n,r){if(n===void 0||!r.includes(n))return!1;let s=new URL(e),o=t??s.host;return n===`${s.protocol}//${o}`&&r.includes(`${s.protocol}//${s.host}`)}function nie(e){return e!=="GET"&&e!=="HEAD"&&e!=="OPTIONS"}function GU(e){let t=(e??"").split(";").map(n=>n.trim()).filter(n=>n.startsWith(`${Qp}=`)).map(n=>n.slice(Qp.length+1));return t.length===1&&/^[A-Za-z0-9_-]{43}$/.test(t[0])?t[0]:null}function rie(e,t,n){return`${Qp}=${e}; Path=${t}; HttpOnly; SameSite=Strict; Max-Age=${Xoe}${n?"; Secure":""}`}function sie(e,t){return`${Qp}=; Path=${e}; HttpOnly; SameSite=Strict; Max-Age=0${t?"; Secure":""}`}function XU(e,t){let n=BU("sha256").update(e,"utf8").digest(),r=BU("sha256").update(t,"utf8").digest();return Boe(n,r)}function oie(e){try{return FU(e).remote.address??"unknown"}catch{return"unknown"}}function VU(e,t,n){let r=e.get(t);return r!==void 0&&n<r.lockedUntilMs}function JU(e,t,n){let r=e.get(t);if(r===void 0||n-r.windowStartMs>Joe){e.size>=Koe&&e.delete(e.keys().next().value),e.set(t,{count:1,windowStartMs:n,lockedUntilMs:0});return}r.count+=1,r.count>=Voe&&(r.lockedUntilMs=n+Yoe)}function YU(e,t){e.delete(t)}import{createHash as iie}from"node:crypto";var eF=64*1024,aie=new Set(["math"]);function cie(e,t){return iie("sha256").update(e,"utf8").update("\0","utf8").update(t,"utf8").digest("hex")}function Zp(e,t,n){let r=n.to?.trim(),s=n.prompt??"",o=n.dedupeKey?.trim();if(!r)throw new q("INVALID_ARGUMENT","to is required",2);if(!o)throw new q("INVALID_ARGUMENT","dedupeKey is required",2);if(s.trim().length===0)throw new q("INVALID_ARGUMENT","prompt is required",2);if(Buffer.byteLength(s,"utf8")>eF)throw new q("INVALID_ARGUMENT",`prompt exceeds the ${eF}-byte comm-flow cap`,2);if(!aie.has(r))throw new q("INVALID_ARGUMENT",`"${r}" is not a comm-flow-enabled target`,2);let i=t.find(l=>l.name===r);if(i===void 0||!Q(i))throw new q("INVALID_ARGUMENT",`"${r}" is not a registered local team`,2);let a=cie(r,s);return e.transaction(()=>{let l=e.prepare("SELECT id, admission_fingerprint FROM queue WHERE dedupe_key = ?").get(o);if(l){if(l.admission_fingerprint===a)return{queueId:l.id,replayed:!0};throw new q("CONFLICT",`dedupeKey "${o}" was already used for a different prompt`,4)}let u=De(e,t,r,s,{from:"operator",dedupeKey:o});return e.prepare("UPDATE queue SET admission_fingerprint = ? WHERE id = ?").run(a,u),{queueId:u,replayed:!1}}).immediate()}import{existsSync as lie,readFileSync as uie}from"node:fs";import{dirname as nF,join as cv}from"node:path";import{fileURLToPath as rF}from"node:url";var die=cv(nF(rF(import.meta.url)),"public"),fie={"/legacy":{file:"index.html",contentType:"text/html; charset=utf-8"},"/legacy/":{file:"index.html",contentType:"text/html; charset=utf-8"},"/legacy/index.html":{file:"index.html",contentType:"text/html; charset=utf-8"},"/legacy/app.js":{file:"app.js",contentType:"text/javascript; charset=utf-8"},"/legacy/styles.css":{file:"styles.css",contentType:"text/css; charset=utf-8"}},mie=cv(nF(rF(import.meta.url)),"vendor-webui"),pie={"/":{file:"index.html",contentType:"text/html; charset=utf-8"},"/index.html":{file:"index.html",contentType:"text/html; charset=utf-8"},"/local.js":{file:"local.js",contentType:"text/javascript; charset=utf-8"},"/styles.css":{file:"styles.css",contentType:"text/css; charset=utf-8"}};function hie(e){return e.endsWith("/")?e.slice(0,-1):e}function _ie(e,t){let n=e.replace(/<head[^>]*>/i,r=>`${r}
2436
- <base href="${t}" />`);if(n===e)throw new Error("injectBaseHref: no <head> tag found in index.html -- cannot inject <base href>");return n}function tF(e,t,n,r){for(let s of Object.keys(n))e.get(s,o=>{let i=n[s];if(!i)return o.notFound();let a=cv(t,i.file);if(!lie(a))return o.notFound();let c=uie(a);return r!==void 0&&i.contentType.startsWith("text/html")&&(c=_ie(c.toString("utf8"),r)),o.body(c,200,{"content-type":i.contentType})})}function sF(e,t={}){let n=hie(t.mountPath??""),r=t.webDistDir??mie;tF(e,r,pie,n!==""?`${n}/`:void 0),tF(e,die,fie,`${n}/legacy/`)}import{createHash as dv,createHmac as vie,randomBytes as lv,timingSafeEqual as Sie}from"node:crypto";import{basename as bie}from"node:path";import{existsSync as gie}from"node:fs";import{homedir as Eie}from"node:os";import{join as yie}from"node:path";function wie(e){return e||(process.env.LMTEAM_DB_PATH?process.env.LMTEAM_DB_PATH:yie(Eie(),".lmteam","lmteam.db"))}function eh(e){let t=wie(e);if(!gie(t))throw new Error(`lmteam database not found at ${t} -- set LMTEAM_DB_PATH or check the path`);return new fn(t,{readonly:!0,fileMustExist:!0})}function oF(e,t={}){let n=t.status??"stands",r=t.affects?e.prepare(`SELECT d.* FROM decisions d JOIN decision_affects a ON a.decision_id = d.id
2437
- 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 iF(e){return e.prepare("SELECT * FROM asks WHERE status = 'open' ORDER BY raised_at ASC").all()}function aF(e,t){return e.prepare("SELECT * FROM asks WHERE id = ?").get(t)??null}function cF(e){return e.prepare("SELECT * FROM blocked WHERE status = 'open' ORDER BY raised_at ASC").all()}function Tie(){let e=!1,t=0,n=new Set,r=M=>!e&&!document.hidden&&M===t,s=M=>document.getElementById(M),o=(M,B)=>{let W=s(M);W&&(W.textContent=B)},i=(M,B="")=>{let W=document.createElement(M);return W.textContent=B,W},a=M=>M!==null&&typeof M=="object"&&!Array.isArray(M),c=M=>Number.isSafeInteger(M)&&Number(M)>0,l=M=>typeof M=="string"&&Number.isFinite(Date.parse(M)),u=M=>M===null||l(M);async function d(M,B,W,ne){n.add(W);let z,ue,X=new Promise((V,Z)=>{z=()=>{ue?.cancel().catch(()=>{}),Z(new Error("Request cancelled or timed out"))},W.signal.addEventListener("abort",z,{once:!0})}),Y=setTimeout(()=>W.abort(),15e3),H=async()=>{W.signal.throwIfAborted();let V=await fetch(M,{method:ne===void 0?"GET":"POST",signal:W.signal,credentials:"same-origin",cache:"no-store",redirect:"error",headers:{Accept:B==="json"?"application/json":"text/html",...ne===void 0?{}:{"Content-Type":"application/x-www-form-urlencoded"}},...ne===void 0?{}:{body:ne}});if(W.signal.throwIfAborted(),V.status!==200||V.redirected||!V.headers.get("content-type")?.includes(B==="json"?"application/json":"text/html")){let ie;if(B==="html"&&!V.redirected&&V.headers.get("content-type")?.includes("text/html")){let _e=await V.text().catch(()=>""),ee=/<h1>[^<]*<\/h1>\s*<p>([^<]*)<\/p>/.exec(_e);ee&&ee[1]&&(ie=ee[1].replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'"))}else V.body?.cancel().catch(()=>{});let ye=new Error(ie??"Unexpected server response");throw ye.status=V.status,ye}let Z=V.body?.getReader();if(ue=Z,!Z)throw new Error("Missing response body");let re=new TextDecoder,de=0,le="";try{for(;;){let ie=await Z.read();if(W.signal.throwIfAborted(),ie.done)break;if(de+=ie.value.byteLength,de>(B==="json"?262144:2e6))throw new Error("Response exceeds safety limit");le+=re.decode(ie.value,{stream:!0})}return le+re.decode()}catch(ie){throw Z.cancel().catch(()=>{}),ie}};try{return await Promise.race([H(),X])}finally{clearTimeout(Y),W.signal.removeEventListener("abort",z),n.delete(W)}}function f(M,B){if(!a(M)||M.id!==B||!l(M.createdAt)||!u(M.pulledAt)||!u(M.answeredAt))throw new Error("Invalid queue state");let W=M.lifecycle,ne=M.lifecycleBasis,z=M.answer;if(!(W==="queued"?ne==="dispatched":W==="processing"?ne==="confirmed"||ne==="dispatched":W==="finished"&&["answer","merged","informational"].includes(String(ne))))throw new Error("Invalid lifecycle evidence");if(ne==="answer"){if(!a(z)||!c(z.id)||z.prompt_queue_id!==B||typeof z.answer_text!="string"||!l(z.answered_at)||z.answered_at!==M.answeredAt||!l(z.created_at)||typeof z.truncated!="boolean")throw new Error("Invalid correlated answer");let X=new TextEncoder().encode(z.answer_text).length;if(!Number.isSafeInteger(z.byteLength)||z.byteLength!==X||X>65536||!Number.isSafeInteger(z.totalBytes)||Number(z.totalBytes)<X||(z.truncated?Number(z.totalBytes)<=X:z.totalBytes!==X))throw new Error("Invalid response coverage")}else if(z!==null||M.answeredAt!==null)throw new Error("Unexpected answer");if(W==="queued"&&M.pulledAt!==null)throw new Error("Unexpected handling time");return M}let m=s("comm-state"),p=Number(m?.dataset.queueId),h=m?.dataset.mount??"",_,g=null,w=0,E=m?.dataset.lifecycle==="finished";function y(){if(clearTimeout(_),!(!m||!c(p)||e||document.hidden||E||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||E||w>=60)return;let M=new AbortController,B=t;g=M,w++;try{let W=await d(`${h}/api/queue/${p}/state`,"json",M);if(!r(B))return;let ne=f(JSON.parse(W),p),z=ne.lifecycleBasis,ue=ne.answer,X=ne.lifecycle==="queued"?"Queued":ne.lifecycle==="processing"?"Processing":z==="merged"?"Combined":z==="informational"?"Informational":"Replied",Y=ne.lifecycle==="queued"?"Queued \u2014 waiting for handling":ne.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",H=z==="merged"?"No separate answer: prompt combined into another prompt.":"No answer expected: this was an informational send.",V=m.dataset.sender??"sender not recorded",Z=m.dataset.recipient??"inbox not recorded",re=ue?`Answer recorded in the ${Z} inbox for prompt #${p} from ${V}.`:ne.lifecycle==="finished"?H:`No answer recorded for prompt #${p} from ${V} to ${Z}.`,de=i("span",X);de.className=`status-chip status-${ne.lifecycle==="finished"?ue?"replied":"muted":ne.lifecycle}`,de.title=Y,m.replaceChildren(de,i("span",` \xB7 ${Y}`)),m.dataset.lifecycle=ne.lifecycle,m.dataset.lifecycleBasis=z,o("comm-receipt-summary",ue?"An answer is recorded below.":ne.lifecycle==="finished"?H:"No answer recorded yet."),o("comm-response-status",re),o("comm-response-none",!ue&&ne.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: ${ne.pulledAt??"not recorded"}${ne.pulledAt?z==="confirmed"?" (picked up)":z==="dispatched"?" (delivery attempted)":" (transport or pickup time)":""}`),o("comm-poll-notice",`State checked ${new Date().toISOString()}.`),E=ne.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===M&&(g=null),y()}}let v=s("comm-composer-container"),A=s("comm-draft-form"),I=null,N=!1,x=!1,R=!1,k=null,O=null,D=M=>Array.from(M.querySelectorAll("input, textarea")),S=(M,B)=>{let W=D(M).filter(ne=>ne.name===B);if(W.length!==1)throw new Error("Invalid review fields");return W[0]};function b(M,B){let W=D(M).map(ne=>({input:ne,value:ne.value}));k=M,O=M.querySelector('button[type="submit"]'),M.addEventListener("submit",ne=>{if(x||e||document.hidden){ne.preventDefault();return}for(let z of W)z.input.value=z.value;x=!0,R=!0,B&&(B.disabled=!0),O&&(O.disabled=!0),o("comm-send-status","Submitting through the browser. If the outcome is uncertain, return here and retry this same confirmation.")})}let L=s("comm-confirm-form");if(L&&b(L,s("comm-edit-button")),A?.addEventListener("submit",M=>{R&&M.preventDefault()}),v&&A&&s("compose")){let M=Array.from(v.childNodes),B=A.querySelector('textarea[name="prompt"]'),W=A.querySelector('button[type="submit"]');A.addEventListener("submit",async ne=>{if(!B||(ne.preventDefault(),I||R||e||document.hidden))return;let z=B.value.replace(/\r\n?/g,`
2435
+ <style>${HU}</style></head><body><a href="#main">Skip to content</a><header><p>Local operations / lmauto</p><nav aria-label="Main">${u.map(([d,f])=>et(d,f)).join(" | ")}</nav></header><main${l} id="main"><h1>${U(e)}</h1>${t}</main><footer><p>Times are relative to this page load. Refresh for current data.</p></footer></body></html>`}function Io(e){let t=new Map;for(let n of e)if(Q(n))try{t.set(se(n),n.name)}catch{}return t}function qU(e,t,n){function r(o,i=!0){if(o===null)return"\u2014";let a=Oi(o);if(!a)return U(o);let{teamfilePath:c,alias:l}=a,u=`${Foe(c)}:${l}`,d=t.get(c);if(i&&d)return`<a href="${U(`${n}/sessions/${encodeURIComponent(d)}/${encodeURIComponent(l)}`)}" title="${U(o)}">${U(u)}</a>`;let f=i?`${o} \u2014 Not in the current local team registry -- no session page available`:o;return`<span title="${U(f)}">${U(u)}</span>`}function s(o,i,a){return`<section><h2>${o}</h2><table><thead><tr>${i.map(c=>`<th scope="col">${c}</th>`).join("")}</tr></thead><tbody>${a.length?a.map(c=>`<tr>${c.map(l=>`<td>${l}</td>`).join("")}</tr>`).join(""):`<tr><td colspan="${i.length}">No ${o.toLowerCase()} invocations.</td></tr>`}</tbody></table></section>`}return"<p>Running shows work still in progress. Dead means its process stopped abnormally while work was still in progress; session data remains intact and may be resumed. Idle means the invocation finished, successfully or with a recorded error; an Idle error status describes that finished result, not an ongoing crash. A target is &lt;teamfile&gt;.lmctl:&lt;role&gt;: the team\u2019s configuration file and the member role executing, such as Lead or Coder. From names what started the invocation: another member\u2019s identity, or operator for a person acting directly, not through an agent. Only targets whose team can be resolved in the current local registry link to a session page; other targets remain unlinked. Full identities are available in the labels\u2019 tooltips.</p>"+s("Running",["Target","From","Started","Running for"],e.running.map(o=>[r(o.target),r(o.from_identity,!1),U(o.started_human),U(o.running_for_human)]))+s("Dead",["Target","From","Started","Age"],e.dead.map(o=>[r(o.target),r(o.from_identity,!1),U(o.started_human),U(o.age_human)]))+s("Idle",["Target","From","Status","Ended","Idle for","Ran for"],e.idle.map(o=>[r(o.target),r(o.from_identity,!1),U(o.status),U(Le(o.ended_at)),U(Ae(o.idle_ms)),U(o.ran_human)]))}var Qp="localweb_session",Boe=8*1024,Woe=1024,Goe=30*24*60*60,Xoe=10,Voe=6e4,Joe=6e4,Yoe=1024;function KU(e,t){let n=Koe(t.mountPath),r=`${n}/login`||"/login",s=`${n}/`||"/",o=n||"/",i=t.allowedOrigins,a=new Map,c=new Map,l=t.remoteKey??sie,u,d=()=>{let f;try{f=t.readAuthority()}catch{f=null}return!f||!f.passcode||!f.generation?(a.clear(),u=void 0,null):(u!==void 0&&f.generation!==u&&a.clear(),u=f.generation,f)};e.use("*",async(f,m)=>{f.header("Cache-Control","no-store");let p=zoe(f.req.path,n);if(f.req.method==="GET"&&(p==="/healthz"||p==="/login")||f.req.method==="POST"&&p==="/login"){await m();return}let h=f.req.header("origin");if(h!==void 0&&!i.includes(h))return f.json({error:"origin not allowed"},403);let _=d();if(_===null)return Su(f,p,r,n,"unavailable");let g=f.req.header("authorization");if(g!==void 0){let E=l(f),y=Date.now();if(VU(c,E,y))return Su(f,p,r,n,"locked_out");let T=g.startsWith("Bearer ")?g.slice(7):"";if(!XU(T,_.passcode))return JU(c,E,y),Su(f,p,r,n);YU(c,E),await m();return}let w=GU(f.req.header("cookie"));if(w===null||a.get(w)!==_.generation)return Su(f,p,r,n,w===null?"missing":"expired");if(tie(f.req.method)&&!WU(f.req.url,f.req.header("host"),h,i))return Su(f,p,r,n);await m()}),e.get("/healthz",f=>f.json({ok:!0})),e.get("/login",f=>f.html(Qoe(ZU(f,r,n),n))),e.post("/login",async f=>{if(!WU(f.req.url,f.req.header("host"),f.req.header("origin"),i))return av(f,r,n);let m=l(f),p=Date.now();if(VU(c,m,p))return Zoe(f,n);let h=d();if(h===null)return av(f,r,n);let _=await eie(f.req.raw).catch(()=>null);if(_===null||!XU(_,h.passcode))return JU(c,m,p),av(f,r,n);YU(c,m),a.size>=Woe&&a.delete(a.keys().next().value);let g=Hoe(32).toString("base64url");return a.set(g,h.generation),f.header("Set-Cookie",nie(g,o,new URL(f.req.url).protocol==="https:")),f.redirect(QU(f,n)??s,303)}),e.post("/logout",f=>{let m=GU(f.req.header("cookie"));return m!==null&&a.delete(m),f.header("Set-Cookie",rie(o,new URL(f.req.url).protocol==="https:")),f.redirect(r,303)})}function Koe(e=""){if(e===""||e==="/")return"";let t=e.endsWith("/")?e.slice(0,-1):e;if(!/^\/[A-Za-z0-9_./~-]+$/.test(t)||t.startsWith("//"))throw new Error("Invalid mount path");return t}function zoe(e,t){return t&&(e===t||e.startsWith(`${t}/`))?e.slice(t.length)||"/":e}function Su(e,t,n,r,s="required"){let o=s==="locked_out"?429:401;if(t==="/api"||t.startsWith("/api/"))return e.json({error:s==="locked_out"?"too many failed attempts":"unauthorized"},o);let i={unavailable:"Authentication is not currently available.",missing:"You are not logged in yet.",expired:"Your session expired. Log in again to continue.",required:"Authentication required.",locked_out:"Too many failed attempts from this source. Try again shortly."}[s],a=e.req.method==="GET"?zU(`${r}${t}${new URL(e.req.url).search}`,r):null,c=a===null?n:`${n}?next=${encodeURIComponent(a)}`,l=s==="locked_out"?`<p>${i}</p>`:`<p>${i}</p><p><a href="${U(c)}">Log in</a></p>`;return e.html(Be("Authentication required",l,r),o)}function Qoe(e,t){return Be("LocalWeb login",`<form method="post" action="${U(e)}"><label>Passcode<input type="password" name="passcode" autocomplete="current-password" required></label><button type="submit">Log in</button></form>`,t)}function av(e,t,n){return e.html(Be("Login failed",`<p>Invalid credentials.</p><a href="${U(ZU(e,t,n))}">Try again</a>`,n),401)}function Zoe(e,t){return e.html(Be("Login failed","<p>Too many failed attempts from this source. Try again shortly.</p>",t),429)}function zU(e,t){if(!e||e.length>4096||!e.startsWith("/")||e.startsWith("//")||/[\\\x00-\x20\x7f]/.test(e))return null;let n="http://localweb.invalid";try{let r=new URL(e,n),s=decodeURIComponent(r.pathname);if(r.origin!==n||s.includes("//")||/[\\\x00-\x1f\x7f]/.test(s))return null;let o=new URL(s,n),i=a=>!t||a===t||a.startsWith(`${t}/`);return o.origin!==n||o.pathname.includes("//")||!i(r.pathname)||!i(o.pathname)?null:`${r.pathname}${r.search}${r.hash}`}catch{return null}}function QU(e,t){let n=new URL(e.req.url).searchParams.getAll("next");return n.length===1?zU(n[0],t):null}function ZU(e,t,n){let r=QU(e,n);return r===null?t:`${t}?next=${encodeURIComponent(r)}`}async function eie(e){if(!e.headers.get("content-type")?.toLowerCase().startsWith("application/x-www-form-urlencoded"))throw new Error("invalid form");let t=e.body?.getReader();if(!t)throw new Error("missing form");let n=[],r=0;for(;;){let{done:o,value:i}=await t.read();if(o)break;if(r+=i.byteLength,r>Boe)throw await t.cancel(),new Error("form too large");n.push(i)}let s=new URLSearchParams(Buffer.concat(n).toString("utf8"));if(s.getAll("passcode").length!==1||[...s.keys()].some(o=>o!=="passcode"))throw new Error("invalid form");return s.get("passcode")??""}function WU(e,t,n,r){if(n===void 0||!r.includes(n))return!1;let s=new URL(e),o=t??s.host;return n===`${s.protocol}//${o}`&&r.includes(`${s.protocol}//${s.host}`)}function tie(e){return e!=="GET"&&e!=="HEAD"&&e!=="OPTIONS"}function GU(e){let t=(e??"").split(";").map(n=>n.trim()).filter(n=>n.startsWith(`${Qp}=`)).map(n=>n.slice(Qp.length+1));return t.length===1&&/^[A-Za-z0-9_-]{43}$/.test(t[0])?t[0]:null}function nie(e,t,n){return`${Qp}=${e}; Path=${t}; HttpOnly; SameSite=Strict; Max-Age=${Goe}${n?"; Secure":""}`}function rie(e,t){return`${Qp}=; Path=${e}; HttpOnly; SameSite=Strict; Max-Age=0${t?"; Secure":""}`}function XU(e,t){let n=BU("sha256").update(e,"utf8").digest(),r=BU("sha256").update(t,"utf8").digest();return qoe(n,r)}function sie(e){try{return FU(e).remote.address??"unknown"}catch{return"unknown"}}function VU(e,t,n){let r=e.get(t);return r!==void 0&&n<r.lockedUntilMs}function JU(e,t,n){let r=e.get(t);if(r===void 0||n-r.windowStartMs>Voe){e.size>=Yoe&&e.delete(e.keys().next().value),e.set(t,{count:1,windowStartMs:n,lockedUntilMs:0});return}r.count+=1,r.count>=Xoe&&(r.lockedUntilMs=n+Joe)}function YU(e,t){e.delete(t)}import{createHash as oie}from"node:crypto";var eF=64*1024,iie=new Set(["math"]);function aie(e,t){return oie("sha256").update(e,"utf8").update("\0","utf8").update(t,"utf8").digest("hex")}function Zp(e,t,n){let r=n.to?.trim(),s=n.prompt??"",o=n.dedupeKey?.trim();if(!r)throw new q("INVALID_ARGUMENT","to is required",2);if(!o)throw new q("INVALID_ARGUMENT","dedupeKey is required",2);if(s.trim().length===0)throw new q("INVALID_ARGUMENT","prompt is required",2);if(Buffer.byteLength(s,"utf8")>eF)throw new q("INVALID_ARGUMENT",`prompt exceeds the ${eF}-byte comm-flow cap`,2);if(!iie.has(r))throw new q("INVALID_ARGUMENT",`"${r}" is not a comm-flow-enabled target`,2);let i=t.find(l=>l.name===r);if(i===void 0||!Q(i))throw new q("INVALID_ARGUMENT",`"${r}" is not a registered local team`,2);let a=aie(r,s);return e.transaction(()=>{let l=e.prepare("SELECT id, admission_fingerprint FROM queue WHERE dedupe_key = ?").get(o);if(l){if(l.admission_fingerprint===a)return{queueId:l.id,replayed:!0};throw new q("CONFLICT",`dedupeKey "${o}" was already used for a different prompt`,4)}let u=De(e,t,r,s,{from:"operator",dedupeKey:o});return e.prepare("UPDATE queue SET admission_fingerprint = ? WHERE id = ?").run(a,u),{queueId:u,replayed:!1}}).immediate()}import{existsSync as cie,readFileSync as lie}from"node:fs";import{dirname as nF,join as cv}from"node:path";import{fileURLToPath as rF}from"node:url";var uie=cv(nF(rF(import.meta.url)),"public"),die={"/legacy":{file:"index.html",contentType:"text/html; charset=utf-8"},"/legacy/":{file:"index.html",contentType:"text/html; charset=utf-8"},"/legacy/index.html":{file:"index.html",contentType:"text/html; charset=utf-8"},"/legacy/app.js":{file:"app.js",contentType:"text/javascript; charset=utf-8"},"/legacy/styles.css":{file:"styles.css",contentType:"text/css; charset=utf-8"}},fie=cv(nF(rF(import.meta.url)),"vendor-webui"),mie={"/":{file:"index.html",contentType:"text/html; charset=utf-8"},"/index.html":{file:"index.html",contentType:"text/html; charset=utf-8"},"/local.js":{file:"local.js",contentType:"text/javascript; charset=utf-8"},"/styles.css":{file:"styles.css",contentType:"text/css; charset=utf-8"}};function pie(e){return e.endsWith("/")?e.slice(0,-1):e}function hie(e,t){let n=e.replace(/<head[^>]*>/i,r=>`${r}
2436
+ <base href="${t}" />`);if(n===e)throw new Error("injectBaseHref: no <head> tag found in index.html -- cannot inject <base href>");return n}function tF(e,t,n,r){for(let s of Object.keys(n))e.get(s,o=>{let i=n[s];if(!i)return o.notFound();let a=cv(t,i.file);if(!cie(a))return o.notFound();let c=lie(a);return r!==void 0&&i.contentType.startsWith("text/html")&&(c=hie(c.toString("utf8"),r)),o.body(c,200,{"content-type":i.contentType})})}function sF(e,t={}){let n=pie(t.mountPath??""),r=t.webDistDir??fie;tF(e,r,mie,n!==""?`${n}/`:void 0),tF(e,uie,die,`${n}/legacy/`)}import{createHash as dv,createHmac as Tie,randomBytes as lv,timingSafeEqual as vie}from"node:crypto";import{basename as Sie}from"node:path";import{existsSync as _ie}from"node:fs";import{homedir as gie}from"node:os";import{join as Eie}from"node:path";function yie(e){return e||(process.env.LMTEAM_DB_PATH?process.env.LMTEAM_DB_PATH:Eie(gie(),".lmteam","lmteam.db"))}function eh(e){let t=yie(e);if(!_ie(t))throw new Error(`lmteam database not found at ${t} -- set LMTEAM_DB_PATH or check the path`);return new fn(t,{readonly:!0,fileMustExist:!0})}function oF(e,t={}){let n=t.status??"stands",r=t.affects?e.prepare(`SELECT d.* FROM decisions d JOIN decision_affects a ON a.decision_id = d.id
2437
+ 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 iF(e){return e.prepare("SELECT * FROM asks WHERE status = 'open' ORDER BY raised_at ASC").all()}function aF(e,t){return e.prepare("SELECT * FROM asks WHERE id = ?").get(t)??null}function cF(e){return e.prepare("SELECT * FROM blocked WHERE status = 'open' ORDER BY raised_at ASC").all()}function wie(){let e=!1,t=0,n=new Set,r=M=>!e&&!document.hidden&&M===t,s=M=>document.getElementById(M),o=(M,B)=>{let W=s(M);W&&(W.textContent=B)},i=(M,B="")=>{let W=document.createElement(M);return W.textContent=B,W},a=M=>M!==null&&typeof M=="object"&&!Array.isArray(M),c=M=>Number.isSafeInteger(M)&&Number(M)>0,l=M=>typeof M=="string"&&Number.isFinite(Date.parse(M)),u=M=>M===null||l(M);async function d(M,B,W,ne){n.add(W);let z,ue,X=new Promise((V,Z)=>{z=()=>{ue?.cancel().catch(()=>{}),Z(new Error("Request cancelled or timed out"))},W.signal.addEventListener("abort",z,{once:!0})}),Y=setTimeout(()=>W.abort(),15e3),H=async()=>{W.signal.throwIfAborted();let V=await fetch(M,{method:ne===void 0?"GET":"POST",signal:W.signal,credentials:"same-origin",cache:"no-store",redirect:"error",headers:{Accept:B==="json"?"application/json":"text/html",...ne===void 0?{}:{"Content-Type":"application/x-www-form-urlencoded"}},...ne===void 0?{}:{body:ne}});if(W.signal.throwIfAborted(),V.status!==200||V.redirected||!V.headers.get("content-type")?.includes(B==="json"?"application/json":"text/html")){let ie;if(B==="html"&&!V.redirected&&V.headers.get("content-type")?.includes("text/html")){let _e=await V.text().catch(()=>""),ee=/<h1>[^<]*<\/h1>\s*<p>([^<]*)<\/p>/.exec(_e);ee&&ee[1]&&(ie=ee[1].replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'"))}else V.body?.cancel().catch(()=>{});let ye=new Error(ie??"Unexpected server response");throw ye.status=V.status,ye}let Z=V.body?.getReader();if(ue=Z,!Z)throw new Error("Missing response body");let re=new TextDecoder,de=0,le="";try{for(;;){let ie=await Z.read();if(W.signal.throwIfAborted(),ie.done)break;if(de+=ie.value.byteLength,de>(B==="json"?262144:2e6))throw new Error("Response exceeds safety limit");le+=re.decode(ie.value,{stream:!0})}return le+re.decode()}catch(ie){throw Z.cancel().catch(()=>{}),ie}};try{return await Promise.race([H(),X])}finally{clearTimeout(Y),W.signal.removeEventListener("abort",z),n.delete(W)}}function f(M,B){if(!a(M)||M.id!==B||!l(M.createdAt)||!u(M.pulledAt)||!u(M.answeredAt))throw new Error("Invalid queue state");let W=M.lifecycle,ne=M.lifecycleBasis,z=M.answer;if(!(W==="queued"?ne==="dispatched":W==="processing"?ne==="confirmed"||ne==="dispatched":W==="finished"&&["answer","merged","informational"].includes(String(ne))))throw new Error("Invalid lifecycle evidence");if(ne==="answer"){if(!a(z)||!c(z.id)||z.prompt_queue_id!==B||typeof z.answer_text!="string"||!l(z.answered_at)||z.answered_at!==M.answeredAt||!l(z.created_at)||typeof z.truncated!="boolean")throw new Error("Invalid correlated answer");let X=new TextEncoder().encode(z.answer_text).length;if(!Number.isSafeInteger(z.byteLength)||z.byteLength!==X||X>65536||!Number.isSafeInteger(z.totalBytes)||Number(z.totalBytes)<X||(z.truncated?Number(z.totalBytes)<=X:z.totalBytes!==X))throw new Error("Invalid response coverage")}else if(z!==null||M.answeredAt!==null)throw new Error("Unexpected answer");if(W==="queued"&&M.pulledAt!==null)throw new Error("Unexpected handling time");return M}let m=s("comm-state"),p=Number(m?.dataset.queueId),h=m?.dataset.mount??"",_,g=null,w=0,E=m?.dataset.lifecycle==="finished";function y(){if(clearTimeout(_),!(!m||!c(p)||e||document.hidden||E||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||E||w>=60)return;let M=new AbortController,B=t;g=M,w++;try{let W=await d(`${h}/api/queue/${p}/state`,"json",M);if(!r(B))return;let ne=f(JSON.parse(W),p),z=ne.lifecycleBasis,ue=ne.answer,X=ne.lifecycle==="queued"?"Queued":ne.lifecycle==="processing"?"Processing":z==="merged"?"Combined":z==="informational"?"Informational":"Replied",Y=ne.lifecycle==="queued"?"Queued \u2014 waiting for handling":ne.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",H=z==="merged"?"No separate answer: prompt combined into another prompt.":"No answer expected: this was an informational send.",V=m.dataset.sender??"sender not recorded",Z=m.dataset.recipient??"inbox not recorded",re=ue?`Answer recorded in the ${Z} inbox for prompt #${p} from ${V}.`:ne.lifecycle==="finished"?H:`No answer recorded for prompt #${p} from ${V} to ${Z}.`,de=i("span",X);de.className=`status-chip status-${ne.lifecycle==="finished"?ue?"replied":"muted":ne.lifecycle}`,de.title=Y,m.replaceChildren(de,i("span",` \xB7 ${Y}`)),m.dataset.lifecycle=ne.lifecycle,m.dataset.lifecycleBasis=z,o("comm-receipt-summary",ue?"An answer is recorded below.":ne.lifecycle==="finished"?H:"No answer recorded yet."),o("comm-response-status",re),o("comm-response-none",!ue&&ne.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: ${ne.pulledAt??"not recorded"}${ne.pulledAt?z==="confirmed"?" (picked up)":z==="dispatched"?" (delivery attempted)":" (transport or pickup time)":""}`),o("comm-poll-notice",`State checked ${new Date().toISOString()}.`),E=ne.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===M&&(g=null),y()}}let v=s("comm-composer-container"),A=s("comm-draft-form"),I=null,N=!1,x=!1,R=!1,k=null,O=null,D=M=>Array.from(M.querySelectorAll("input, textarea")),S=(M,B)=>{let W=D(M).filter(ne=>ne.name===B);if(W.length!==1)throw new Error("Invalid review fields");return W[0]};function b(M,B){let W=D(M).map(ne=>({input:ne,value:ne.value}));k=M,O=M.querySelector('button[type="submit"]'),M.addEventListener("submit",ne=>{if(x||e||document.hidden){ne.preventDefault();return}for(let z of W)z.input.value=z.value;x=!0,R=!0,B&&(B.disabled=!0),O&&(O.disabled=!0),o("comm-send-status","Submitting through the browser. If the outcome is uncertain, return here and retry this same confirmation.")})}let L=s("comm-confirm-form");if(L&&b(L,s("comm-edit-button")),A?.addEventListener("submit",M=>{R&&M.preventDefault()}),v&&A&&s("compose")){let M=Array.from(v.childNodes),B=A.querySelector('textarea[name="prompt"]'),W=A.querySelector('button[type="submit"]');A.addEventListener("submit",async ne=>{if(!B||(ne.preventDefault(),I||R||e||document.hidden))return;let z=B.value.replace(/\r\n?/g,`
2438
2438
  `);if(!z.trim()||new TextEncoder().encode(z.replace(/\n/g,`\r
2439
2439
  `)).length>65536){o("comm-composer-notice","Enter a nonblank prompt of at most 64 KiB UTF-8.");return}let ue=t,X=new AbortController;I=X,N=!1,W&&(W.disabled=!0),o("comm-composer-notice","Reviewing prompt\u2026");try{let Y=new URL(A.action,window.location.href),H=s("compose")?.dataset.base;if(!H||Y.origin!==new URL(window.location.href).origin||Y.pathname!==`${H}/review`||Y.search||Y.hash)throw new Error("Unexpected review destination");let V=()=>{let Lt=new URLSearchParams;for(let K of D(A))K.name&&!K.disabled&&Lt.append(K.name,K.value.replace(/\r\n|\r|\n/g,`\r
2440
2440
  `));return Lt.toString()},Z;try{Z=await d(Y.href,"html",X,V())}catch(Lt){if((Lt instanceof Error?Lt.status:void 0)!==409||!r(ue))throw Lt;o("comm-composer-notice","Session renewing\u2026");let St=await d(window.location.href,"html",X);if(!r(ue))return;let Bt=new DOMParser().parseFromString(St,"text/html").getElementById("comm-draft-form"),Jt="";try{Bt&&(Jt=S(Bt,"csrf").value)}catch{}if(!Jt)throw Lt;S(A,"csrf").value=Jt,Z=await d(Y.href,"html",X,V())}if(!r(ue))return;let de=new DOMParser().parseFromString(Z,"text/html").getElementById("comm-confirm-form");if(!de)throw new Error("Review unavailable; use the native review form after reloading");let le=new URL(de.getAttribute("action")??"",Y.href),ie=S(de,"confirmation").value;if(de.method.toLowerCase()!=="post"||le.origin!==Y.origin||le.pathname!==`${H}/prompts`||le.search||le.hash||!ie||ie.length>4096||S(de,"prompt").value!==z)throw new Error("Review did not match the exact prompt");let ye=i("div");ye.id="comm-review-panel",ye.append(i("p","Review prompt to math:Lead"),i("pre",z));let _e=document.createElement("form");_e.id="comm-confirm-form",_e.method="post",_e.action=le.href;let ee=document.createElement("input");ee.type="hidden",ee.name="confirmation",ee.value=ie;let ge=document.createElement("textarea");ge.name="prompt",ge.hidden=!0,ge.value=z;let at=document.createElement("button");at.type="submit",at.id="comm-confirm-submit",at.textContent="Confirm and queue";let _t=document.createElement("button");_t.type="button",_t.id="comm-edit-button",_t.textContent="Edit prompt";let gr=i("p");gr.id="comm-send-status",gr.setAttribute("role","status"),_e.append(ee,ge,at),ye.append(_e,_t,gr),_t.addEventListener("click",()=>{R||_t.disabled||(B.value=z,v.replaceChildren(...M),k=null)}),b(_e,_t),v.replaceChildren(ye)}catch(Y){r(ue)&&o("comm-composer-notice",`Review unavailable: ${Y instanceof Error?Y.message:String(Y)}. Draft retained; retry review or reload to renew the form. The native flow also works without JavaScript.`)}finally{I===X&&(I=null,W&&!e&&!document.hidden&&(W.disabled=!1),!e&&!document.hidden&&N&&o("comm-composer-notice","Review interrupted; draft retained. Review again when ready."))}})}function $(){I&&(N=!0),t++,clearTimeout(_);for(let M of n)M.abort()}let j=()=>{if(!I&&!R){let M=A?.querySelector('button[type="submit"]');M&&(M.disabled=!1),N&&o("comm-composer-notice","Review interrupted; draft retained. Review again when ready.")}y()},F=()=>{document.hidden?$():j()},C=()=>{e=!0,$()},P=M=>{M.persisted&&(e=!1,k&&x&&(x=!1,O&&(O.disabled=!1,O.textContent="Retry this same confirmation"),o("comm-send-status","Outcome may be uncertain. Retry only this same confirmation, or check the inbox.")),j())};return document.addEventListener("visibilitychange",F),window.addEventListener("pagehide",C),window.addEventListener("pageshow",P),y(),()=>{C(),document.removeEventListener("visibilitychange",F),window.removeEventListener("pagehide",C),window.removeEventListener("pageshow",P)}}var th=`(function () {
2441
2441
  function __name(value) { return value; }
2442
- return (${Tie.toString()})();
2443
- })();`;var lF=Be("","","").match(/<style>([\s\S]*?)<\/style>/),Aie=dv("sha256").update(lF?lF[1]:"").digest("base64"),Iie=dv("sha256").update(th).digest("base64"),kie=`default-src 'none'; style-src 'sha256-${Aie}'; form-action 'self'; base-uri 'none'; frame-ancestors 'none'; script-src 'sha256-${Iie}'; connect-src 'self'`,uv="lmbee_comm_browser",Rie=64*1024,Nie=256*1024,ac=class extends Error{};function uF(e){let t=new hi,{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=lv(32),a=new Map,c=C=>dv("sha256").update(C).digest("hex"),l=C=>vie("sha256",i).update(C).digest("base64url"),u=C=>{let P=Buffer.from(JSON.stringify(C)).toString("base64url");return`${P}.${l(P)}`};function d(C){let P=C.split(".");if(P.length!==2||C.length>4096)throw new Error("Invalid confirmation. Review the prompt again.");let M=Buffer.from(l(P[0])),B=Buffer.from(P[1]);if(M.length!==B.length||!Sie(M,B))throw new Error("Invalid confirmation. Review the prompt again.");return JSON.parse(Buffer.from(P[0],"base64url").toString("utf8"))}function f(C,P=!1){let M=(C.req.header("cookie")??"").split(";").map(W=>W.trim()).filter(W=>W.startsWith(`${uv}=`));if(M.length===1)try{let W=d(M[0].slice(uv.length+1));if(typeof W.browser=="string"&&/^[a-f0-9]{48}$/.test(W.browser))return W.browser}catch{}if(!P)throw new Error("Browser confirmation expired. Open the Math inbox and review again.");let B=lv(24).toString("hex");return C.header("Set-Cookie",`${uv}=${u({browser:B})}; Path=${s}; HttpOnly; SameSite=Strict${new URL(C.req.url).protocol==="https:"?"; Secure":""}`),B}function m(){let C=n.teams.find(P=>P.name==="math");if(!C||!Q(C)||C.leadAlias!=="Lead")throw new Error("The local math Lead inbox is unavailable.");return`${se(C)}:Lead`}function p(C){return C==="merged"||C==="informational"||C==="retracted"}function h(C){return C.answeredAt?`<a href="${s}/prompts/${C.id}#comm-response">Answer to #${C.id}</a> \xB7 ${Re(C.answeredAt)}`:C.lifecycleBasis==="merged"?"No separate answer (merged)":C.lifecycleBasis==="informational"?"No answer expected (informational)":C.lifecycleBasis==="retracted"?`No answer expected (retracted): ${U(C.retracted_reason??"no reason recorded")}`:"No answer recorded"}function _(C){for(let P of C.split(`
2444
- `)){let M=P.trim();if(M)return M}return""}let g=80,w=2e3;function E(C,P){return C.length>P?`${C.slice(0,P)}\u2026`:C}function y(C){let P=_(C);return P?E(P,g):"(empty prompt)"}function T(C){return E(C.trim(),w)}function v(C){let P=So(n,C),M=`Prompt #${C}`;return!P||P.status!=="available"||P.text===null?`<a href="${s}/prompts/${C}">${U(M)}</a>`:`<a href="${s}/prompts/${C}" title="${U(T(P.text))}">${U(y(P.text))}</a>`}function A(C){return C.lifecycle==="queued"?"queued":C.lifecycle==="processing"?"processing":p(C.lifecycleBasis)?"muted":"replied"}function I(C){return C.lifecycle==="queued"?"Queued":C.lifecycle==="processing"?"Processing":C.lifecycleBasis==="merged"?"Combined":C.lifecycleBasis==="informational"?"Informational":C.lifecycleBasis==="retracted"?"Retracted":"Replied"}function N(C){return`<span class="status-chip status-${A(C)}" title="${U(x(C))}">${U(I(C))}</span>`}function x(C){return C.lifecycle==="queued"?"Queued \u2014 waiting for handling":C.lifecycle==="finished"?C.lifecycleBasis==="merged"?"Finished \u2014 combined with another prompt":C.lifecycleBasis==="informational"?"Finished \u2014 informational, no answer expected":C.lifecycleBasis==="retracted"?"Finished \u2014 retracted, no answer expected":"Finished \u2014 answer recorded":C.lifecycleBasis==="confirmed"?"Processing \u2014 picked up by inbox":"Processing \u2014 delivery attempted; read not confirmed"}function R(C){if(C==="operator")return"Operator";let P=Oi(C);if(P){let B=n.teams.find(W=>{if(!Q(W))return!1;try{return se(W)===P.teamfilePath}catch{return!1}});return B?`<a href="${U(`${r}/sessions/${encodeURIComponent(B.name)}/${encodeURIComponent(P.alias)}`)}" title="${U(C)}">${U(`${B.name}:${P.alias}`)}</a>`:`<span title="${U(C)}">${U(`${bie(P.teamfilePath)}:${P.alias}`)}</span>`}let M=n.teams.find(B=>B.name===C);return M&&Q(M)?`<a href="${U(`${r}/sessions/${encodeURIComponent(M.name)}/${encodeURIComponent(M.leadAlias)}`)}" title="${U(`Current configured lead for inbox ${C}`)}">${U(`${M.name}:${M.leadAlias}`)}</a>`:`${U(C)}${M?" (remote inbox)":" (not in the current team list)"}`}function k(){let C=n.teams.find(P=>P.name==="math");if(!C||!Q(C))return'<section aria-label="Assigned work"><h2>Assigned work</h2><p>Math\u2019s current local actor is unavailable, so its assigned work cannot be resolved.</p></section>';try{let P=Ps(n.db.db,{owner:{team:se(C),alias:C.leadAlias},limit:5});return`<section aria-label="Assigned work"><h2>Assigned work</h2><p>Work owned by ${R("math")}. Open an item to follow its epic, parent task, or subtasks.</p>${P.rows.length?`<ul>${P.rows.map(M=>`<li><a href="${r}/tasks/${M.id}">${U(`${M.kind} #${M.id}: ${M.title}`)}</a> \u2014 ${U(M.status)}</li>`).join("")}</ul><p>Up to five assigned items shown.</p>`:"<p>No assigned work returned for this actor.</p>"}</section>`}catch{return'<section aria-label="Assigned work"><h2>Assigned work</h2><p>Current work ownership is unavailable. Prompt and answer records below remain readable.</p></section>'}}let O="<details><summary>About these records</summary><p>Actor links open each team\u2019s current configured lead; records identify inboxes and sender labels, not exact historical sessions. Assigned work is current ownership, not proof of execution or a prompt\u2019s topic. A delivery attempt does not confirm the inbox read a prompt. A recorded answer does not establish delivery back to the sender or task success.</p></details>";function D(C,P,M,B=200){return C.html(Be(P,`${M}<script>${th}</script>`,r,{},[th]),B)}function S(C,P="",M=""){return`<div id="comm-composer-container"><p id="comm-composer-notice">${U(M)}</p><form id="comm-draft-form" method="post" action="${s}/review"><input type="hidden" name="csrf" value="${U(u({browser:C,purpose:"review"}))}"><label for="prompt">Prompt for math Lead (maximum 64 KiB UTF-8)</label><textarea id="prompt" name="prompt" rows="8" required>
2442
+ return (${wie.toString()})();
2443
+ })();`;var lF=Be("","","").match(/<style>([\s\S]*?)<\/style>/),bie=dv("sha256").update(lF?lF[1]:"").digest("base64"),Aie=dv("sha256").update(th).digest("base64"),Iie=`default-src 'none'; style-src 'sha256-${bie}'; form-action 'self'; base-uri 'none'; frame-ancestors 'none'; script-src 'sha256-${Aie}'; connect-src 'self'`,uv="lmbee_comm_browser",kie=64*1024,Rie=256*1024,ac=class extends Error{};function uF(e){let t=new hi,{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=lv(32),a=new Map,c=C=>dv("sha256").update(C).digest("hex"),l=C=>Tie("sha256",i).update(C).digest("base64url"),u=C=>{let P=Buffer.from(JSON.stringify(C)).toString("base64url");return`${P}.${l(P)}`};function d(C){let P=C.split(".");if(P.length!==2||C.length>4096)throw new Error("Invalid confirmation. Review the prompt again.");let M=Buffer.from(l(P[0])),B=Buffer.from(P[1]);if(M.length!==B.length||!vie(M,B))throw new Error("Invalid confirmation. Review the prompt again.");return JSON.parse(Buffer.from(P[0],"base64url").toString("utf8"))}function f(C,P=!1){let M=(C.req.header("cookie")??"").split(";").map(W=>W.trim()).filter(W=>W.startsWith(`${uv}=`));if(M.length===1)try{let W=d(M[0].slice(uv.length+1));if(typeof W.browser=="string"&&/^[a-f0-9]{48}$/.test(W.browser))return W.browser}catch{}if(!P)throw new Error("Browser confirmation expired. Open the Math inbox and review again.");let B=lv(24).toString("hex");return C.header("Set-Cookie",`${uv}=${u({browser:B})}; Path=${s}; HttpOnly; SameSite=Strict${new URL(C.req.url).protocol==="https:"?"; Secure":""}`),B}function m(){let C=n.teams.find(P=>P.name==="math");if(!C||!Q(C)||C.leadAlias!=="Lead")throw new Error("The local math Lead inbox is unavailable.");return`${se(C)}:Lead`}function p(C){return C==="merged"||C==="informational"||C==="retracted"}function h(C){return C.answeredAt?`<a href="${s}/prompts/${C.id}#comm-response">Answer to #${C.id}</a> \xB7 ${Re(C.answeredAt)}`:C.lifecycleBasis==="merged"?"No separate answer (merged)":C.lifecycleBasis==="informational"?"No answer expected (informational)":C.lifecycleBasis==="retracted"?`No answer expected (retracted): ${U(C.retracted_reason??"no reason recorded")}`:"No answer recorded"}function _(C){for(let P of C.split(`
2444
+ `)){let M=P.trim();if(M)return M}return""}let g=80,w=2e3;function E(C,P){return C.length>P?`${C.slice(0,P)}\u2026`:C}function y(C){let P=_(C);return P?E(P,g):"(empty prompt)"}function T(C){return E(C.trim(),w)}function v(C){let P=So(n,C),M=`Prompt #${C}`;return!P||P.status!=="available"||P.text===null?`<a href="${s}/prompts/${C}">${U(M)}</a>`:`<a href="${s}/prompts/${C}" title="${U(T(P.text))}">${U(y(P.text))}</a>`}function A(C){return C.lifecycle==="queued"?"queued":C.lifecycle==="processing"?"processing":p(C.lifecycleBasis)?"muted":"replied"}function I(C){return C.lifecycle==="queued"?"Queued":C.lifecycle==="processing"?"Processing":C.lifecycleBasis==="merged"?"Combined":C.lifecycleBasis==="informational"?"Informational":C.lifecycleBasis==="retracted"?"Retracted":"Replied"}function N(C){return`<span class="status-chip status-${A(C)}" title="${U(x(C))}">${U(I(C))}</span>`}function x(C){return C.lifecycle==="queued"?"Queued \u2014 waiting for handling":C.lifecycle==="finished"?C.lifecycleBasis==="merged"?"Finished \u2014 combined with another prompt":C.lifecycleBasis==="informational"?"Finished \u2014 informational, no answer expected":C.lifecycleBasis==="retracted"?"Finished \u2014 retracted, no answer expected":"Finished \u2014 answer recorded":C.lifecycleBasis==="confirmed"?"Processing \u2014 picked up by inbox":"Processing \u2014 delivery attempted; read not confirmed"}function R(C){if(C==="operator")return"Operator";let P=Oi(C);if(P){let B=n.teams.find(W=>{if(!Q(W))return!1;try{return se(W)===P.teamfilePath}catch{return!1}});return B?`<a href="${U(`${r}/sessions/${encodeURIComponent(B.name)}/${encodeURIComponent(P.alias)}`)}" title="${U(C)}">${U(`${B.name}:${P.alias}`)}</a>`:`<span title="${U(C)}">${U(`${Sie(P.teamfilePath)}:${P.alias}`)}</span>`}let M=n.teams.find(B=>B.name===C);return M&&Q(M)?`<a href="${U(`${r}/sessions/${encodeURIComponent(M.name)}/${encodeURIComponent(M.leadAlias)}`)}" title="${U(`Current configured lead for inbox ${C}`)}">${U(`${M.name}:${M.leadAlias}`)}</a>`:`${U(C)}${M?" (remote inbox)":" (not in the current team list)"}`}function k(){let C=n.teams.find(P=>P.name==="math");if(!C||!Q(C))return'<section aria-label="Assigned work"><h2>Assigned work</h2><p>Math\u2019s current local actor is unavailable, so its assigned work cannot be resolved.</p></section>';try{let P=Ps(n.db.db,{owner:{team:se(C),alias:C.leadAlias},limit:5});return`<section aria-label="Assigned work"><h2>Assigned work</h2><p>Work owned by ${R("math")}. Open an item to follow its epic, parent task, or subtasks.</p>${P.rows.length?`<ul>${P.rows.map(M=>`<li><a href="${r}/tasks/${M.id}">${U(`${M.kind} #${M.id}: ${M.title}`)}</a> \u2014 ${U(M.status)}</li>`).join("")}</ul><p>Up to five assigned items shown.</p>`:"<p>No assigned work returned for this actor.</p>"}</section>`}catch{return'<section aria-label="Assigned work"><h2>Assigned work</h2><p>Current work ownership is unavailable. Prompt and answer records below remain readable.</p></section>'}}let O="<details><summary>About these records</summary><p>Actor links open each team\u2019s current configured lead; records identify inboxes and sender labels, not exact historical sessions. Assigned work is current ownership, not proof of execution or a prompt\u2019s topic. A delivery attempt does not confirm the inbox read a prompt. A recorded answer does not establish delivery back to the sender or task success.</p></details>";function D(C,P,M,B=200){return C.html(Be(P,`${M}<script>${th}</script>`,r,{},[th]),B)}function S(C,P="",M=""){return`<div id="comm-composer-container"><p id="comm-composer-notice">${U(M)}</p><form id="comm-draft-form" method="post" action="${s}/review"><input type="hidden" name="csrf" value="${U(u({browser:C,purpose:"review"}))}"><label for="prompt">Prompt for math Lead (maximum 64 KiB UTF-8)</label><textarea id="prompt" name="prompt" rows="8" required>
2445
2445
  ${U(P)}</textarea><button type="submit">Review prompt</button></form></div>`}function b(C,P){return`<form method="post" action="${s}/prompts"><input type="hidden" name="confirmation" value="${U(P)}"><textarea name="prompt" hidden>
2446
- ${U(C)}</textarea><button type="submit">Retry this same confirmation</button></form>`}let L=500;function $(C){let P=C.req.query("ask");if(P!==void 0&&/^[1-9]\d*$/.test(P)){try{let B=eh(),W;try{W=aF(B,Number(P))}finally{B.close()}if(W){let ne=W.downstream?U(W.downstream):"Not recorded";return`<div id="comm-reply-context" aria-label="Replying to"><p><strong>Replying to ask:</strong> ${U(W.subject)}</p><p>${U(W.reason)}</p><p><strong>Downstream:</strong> ${ne}</p></div>`}}catch{}return""}let M=C.req.query("reply_to");if(M!==void 0&&/^[1-9]\d*$/.test(M)){let B=rc(n,Number(M));if(B){let W=So(n,B.id),ne=W?.status==="available"&&W.text!==null?E(W.text.trim(),L):"(preview unavailable)";return`<div id="comm-reply-context" aria-label="Replying to"><p><strong>Replying to</strong> a prompt from ${R(B.from_id)}, ${Re(B.created_ts)}:</p><pre>${U(ne)}</pre></div>`}}return""}async function j(C){if(!C.req.header("content-type")?.toLowerCase().startsWith("application/x-www-form-urlencoded"))throw new Error("Expected a browser form.");let P=C.req.raw.body?.getReader();if(!P)throw new Error("Missing form.");let M=0,B=[];for(;;){let{done:ne,value:z}=await P.read();if(ne)break;if(M+=z.byteLength,M>Nie)throw await P.cancel(),new Error("Form exceeds the size limit.");B.push(z)}let W=new URLSearchParams(Buffer.concat(B).toString("utf8"));for(let ne of W.keys())if(W.getAll(ne).length!==1)throw new Error("Duplicate form field.");return W}function F(C){let P=C.get("prompt")??"";if(!P.trim()||Buffer.byteLength(P)>Rie)throw new Error("Enter a nonblank prompt of at most 64 KiB UTF-8.");return P}return t.use("/comm/math/*",async(C,P)=>{C.header("Cache-Control","no-store"),C.header("Content-Security-Policy",kie),C.header("Referrer-Policy","same-origin"),C.header("X-Content-Type-Options","nosniff");let M=new URL(C.req.url),B=`${M.protocol}//${C.req.header("host")??M.host}`,W=C.req.header("sec-fetch-site");if(!e.allowedOrigins.includes(B)||W&&W!=="same-origin"&&W!=="none"||C.req.header("origin")!==void 0&&C.req.header("origin")!==B||C.req.method==="POST"&&C.req.header("origin")!==B)return D(C,"Request rejected","<p>Use this browser\u2019s local Math inbox page.</p>",403);await P()}),t.get("/comm/math",C=>{let P="<p>Sending is not enabled on this surface.</p>";if(e.enabled)try{m(),P=S(f(C,!0))}catch(W){P=`<p>${U(W.message)}</p>`}let M=C.req.query("after");if(M!==void 0&&(!/^[1-9]\d*$/.test(M)||!Number.isSafeInteger(Number(M))))return D(C,"Invalid page","<p>Invalid prompt cursor.</p>",400);let B=Vp(n,{toId:"math",limit:20,...M?{after:Number(M)}:{}});return D(C,"Math inbox",`<p>Prompts to ${R("math")} and the answers recorded against them. Select a prompt to follow the exchange; use assigned work to explore the tasks this actor owns.</p>${O}<p><a href="${s}">Refresh inbox</a> \xB7 <a href="#compose">Write a prompt</a> \xB7 <a href="${r}/sessions/math/Lead">Math session</a></p><section id="compose" aria-label="Write a prompt" data-mount="${U(r)}" data-base="${U(s)}"><h2>Write a prompt</h2><p>Start a new prompt to ${R("math")}. Review the exact text before queueing it.</p>${$(C)}${P}</section>${k()}<section id="history" aria-label="Prompts and answers"><h2>Incoming prompts and answers</h2><p>Only prompts addressed to Math appear here. <a href="${r}/sessions/math/Lead#comm-sequence">See incoming and outgoing exchanges</a> in the session timeline.</p><p>Newest 20 matching prompts first. Queued means waiting; processing records a pull or dispatch attempt; finished means an answer was recorded, an informational send expected no answer, or prompts from the same sender to the same recipient were combined to avoid separate deliveries. Finished for a combined prompt does not mean separate work was done, and no separate answer is expected. The combined prompt ID is not recorded, so no link is available.</p><table><thead><tr><th>Prompt</th><th>Actors</th><th>Handling</th><th>Queued</th><th>Answer</th></tr></thead><tbody>${B.rows.map(W=>`<tr data-queue-id="${W.id}"><td>${v(W.id)}</td><td>${R(W.from_id)} \u2192 ${R(W.to_id)}</td><td>${N(W)} \xB7 ${U(x(W))}</td><td>${Re(W.created_ts)}</td><td>${h(W)}</td></tr>`).join("")}</tbody></table><p>Task links for these prompts: not recorded.</p>${B.meta.next_cursor?`<a href="${s}?after=${B.meta.next_cursor}">Older prompts</a>`:""}</section>`)}),t.post("/comm/math/review",async C=>{if(!e.enabled)return D(C,"Sending unavailable","<p>Sending is not enabled.</p>",403);let P="",M="";try{let B=await j(C);P=B.get("prompt")??"";let W;try{W=f(C)}catch(ue){throw new ac(ue.message)}M=W;let ne;try{ne=d(B.get("csrf")??"")}catch(ue){throw new ac(ue.message)}if(ne.browser!==W||ne.purpose!=="review")throw new ac("Review form no longer matches this browser session. Reloading will renew it.");P=F(B);let z={browser:W,digest:c(P),target:m(),key:`localweb:${lv(24).toString("hex")}`,expires:o()+3e5};return D(C,"Review prompt to math",`<div id="comm-review-panel"><p>New prompt: Operator \u2192 ${R("math")}. Task link: none.</p><p>Queue one prompt for math to handle on its next pull. Processing may wait; the agent may use its existing file/network permissions.</p><p>Recipient: <a href="${U(`${r}/sessions/math/Lead`)}" title="${U(z.target)}">math:Lead</a></p><pre id="comm-review-preview">
2446
+ ${U(C)}</textarea><button type="submit">Retry this same confirmation</button></form>`}let L=500;function $(C){let P=C.req.query("ask");if(P!==void 0&&/^[1-9]\d*$/.test(P)){try{let B=eh(),W;try{W=aF(B,Number(P))}finally{B.close()}if(W){let ne=W.downstream?U(W.downstream):"Not recorded";return`<div id="comm-reply-context" aria-label="Replying to"><p><strong>Replying to ask:</strong> ${U(W.subject)}</p><p>${U(W.reason)}</p><p><strong>Downstream:</strong> ${ne}</p></div>`}}catch{}return""}let M=C.req.query("reply_to");if(M!==void 0&&/^[1-9]\d*$/.test(M)){let B=rc(n,Number(M));if(B){let W=So(n,B.id),ne=W?.status==="available"&&W.text!==null?E(W.text.trim(),L):"(preview unavailable)";return`<div id="comm-reply-context" aria-label="Replying to"><p><strong>Replying to</strong> a prompt from ${R(B.from_id)}, ${Re(B.created_ts)}:</p><pre>${U(ne)}</pre></div>`}}return""}async function j(C){if(!C.req.header("content-type")?.toLowerCase().startsWith("application/x-www-form-urlencoded"))throw new Error("Expected a browser form.");let P=C.req.raw.body?.getReader();if(!P)throw new Error("Missing form.");let M=0,B=[];for(;;){let{done:ne,value:z}=await P.read();if(ne)break;if(M+=z.byteLength,M>Rie)throw await P.cancel(),new Error("Form exceeds the size limit.");B.push(z)}let W=new URLSearchParams(Buffer.concat(B).toString("utf8"));for(let ne of W.keys())if(W.getAll(ne).length!==1)throw new Error("Duplicate form field.");return W}function F(C){let P=C.get("prompt")??"";if(!P.trim()||Buffer.byteLength(P)>kie)throw new Error("Enter a nonblank prompt of at most 64 KiB UTF-8.");return P}return t.use("/comm/math/*",async(C,P)=>{C.header("Cache-Control","no-store"),C.header("Content-Security-Policy",Iie),C.header("Referrer-Policy","same-origin"),C.header("X-Content-Type-Options","nosniff");let M=new URL(C.req.url),B=`${M.protocol}//${C.req.header("host")??M.host}`,W=C.req.header("sec-fetch-site");if(!e.allowedOrigins.includes(B)||W&&W!=="same-origin"&&W!=="none"||C.req.header("origin")!==void 0&&C.req.header("origin")!==B||C.req.method==="POST"&&C.req.header("origin")!==B)return D(C,"Request rejected","<p>Use this browser\u2019s local Math inbox page.</p>",403);await P()}),t.get("/comm/math",C=>{let P="<p>Sending is not enabled on this surface.</p>";if(e.enabled)try{m(),P=S(f(C,!0))}catch(W){P=`<p>${U(W.message)}</p>`}let M=C.req.query("after");if(M!==void 0&&(!/^[1-9]\d*$/.test(M)||!Number.isSafeInteger(Number(M))))return D(C,"Invalid page","<p>Invalid prompt cursor.</p>",400);let B=Vp(n,{toId:"math",limit:20,...M?{after:Number(M)}:{}});return D(C,"Math inbox",`<p>Prompts to ${R("math")} and the answers recorded against them. Select a prompt to follow the exchange; use assigned work to explore the tasks this actor owns.</p>${O}<p><a href="${s}">Refresh inbox</a> \xB7 <a href="#compose">Write a prompt</a> \xB7 <a href="${r}/sessions/math/Lead">Math session</a></p><section id="compose" aria-label="Write a prompt" data-mount="${U(r)}" data-base="${U(s)}"><h2>Write a prompt</h2><p>Start a new prompt to ${R("math")}. Review the exact text before queueing it.</p>${$(C)}${P}</section>${k()}<section id="history" aria-label="Prompts and answers"><h2>Incoming prompts and answers</h2><p>Only prompts addressed to Math appear here. <a href="${r}/sessions/math/Lead#comm-sequence">See incoming and outgoing exchanges</a> in the session timeline.</p><p>Newest 20 matching prompts first. Queued means waiting; processing records a pull or dispatch attempt; finished means an answer was recorded, an informational send expected no answer, or prompts from the same sender to the same recipient were combined to avoid separate deliveries. Finished for a combined prompt does not mean separate work was done, and no separate answer is expected. The combined prompt ID is not recorded, so no link is available.</p><table><thead><tr><th>Prompt</th><th>Actors</th><th>Handling</th><th>Queued</th><th>Answer</th></tr></thead><tbody>${B.rows.map(W=>`<tr data-queue-id="${W.id}"><td>${v(W.id)}</td><td>${R(W.from_id)} \u2192 ${R(W.to_id)}</td><td>${N(W)} \xB7 ${U(x(W))}</td><td>${Re(W.created_ts)}</td><td>${h(W)}</td></tr>`).join("")}</tbody></table><p>Task links for these prompts: not recorded.</p>${B.meta.next_cursor?`<a href="${s}?after=${B.meta.next_cursor}">Older prompts</a>`:""}</section>`)}),t.post("/comm/math/review",async C=>{if(!e.enabled)return D(C,"Sending unavailable","<p>Sending is not enabled.</p>",403);let P="",M="";try{let B=await j(C);P=B.get("prompt")??"";let W;try{W=f(C)}catch(ue){throw new ac(ue.message)}M=W;let ne;try{ne=d(B.get("csrf")??"")}catch(ue){throw new ac(ue.message)}if(ne.browser!==W||ne.purpose!=="review")throw new ac("Review form no longer matches this browser session. Reloading will renew it.");P=F(B);let z={browser:W,digest:c(P),target:m(),key:`localweb:${lv(24).toString("hex")}`,expires:o()+3e5};return D(C,"Review prompt to math",`<div id="comm-review-panel"><p>New prompt: Operator \u2192 ${R("math")}. Task link: none.</p><p>Queue one prompt for math to handle on its next pull. Processing may wait; the agent may use its existing file/network permissions.</p><p>Recipient: <a href="${U(`${r}/sessions/math/Lead`)}" title="${U(z.target)}">math:Lead</a></p><pre id="comm-review-preview">
2447
2447
  ${U(P)}</pre><form id="comm-confirm-form" method="post" action="${s}/prompts"><input type="hidden" name="confirmation" value="${U(u(z))}"><textarea name="prompt" hidden>
2448
2448
  ${U(P)}</textarea><button id="comm-confirm-submit" type="submit">Confirm and queue</button></form><button type="button" id="comm-edit-button">Edit prompt</button><p id="comm-send-status" role="status"></p><details><summary>Edit prompt</summary>${S(W,P)}</details><p>Confirmation expires in five minutes. If a submission result is uncertain, retry this same confirmation; do not create a new prompt.</p></div>`)}catch(B){let W=B instanceof ac?409:400;return D(C,"Review unavailable",`<p>${U(B.message)}</p>${M?S(M,P):`<pre>
2449
2449
  ${U(P)}</pre>`}<a href="${s}">Math inbox</a>`,W)}}),t.post("/comm/math/prompts",async C=>{if(!e.enabled)return D(C,"Sending unavailable","<p>Sending is not enabled.</p>",403);let P="",M="",B=!1;try{let W=await j(C);P=W.get("prompt")??"",M=W.get("confirmation")??"";let ne=f(C);P=F(W);let z=d(M);if(z.browser!==ne||z.digest!==c(P)||!Number.isFinite(z.expires)||!/^localweb:[a-f0-9]{48}$/.test(z.key))throw new Error("Confirmation does not match this browser and prompt.");let ue=n.db.db.prepare("SELECT id, admission_fingerprint FROM queue WHERE dedupe_key = ?").get(z.key);if(ue){if(ue.admission_fingerprint!==c(`math\0${P}`))throw new Error("Confirmation conflicts with an existing admission.");return C.redirect(`${s}/prompts/${ue.id}`,303)}if(z.expires<o()||z.target!==m())throw new Error("Confirmation expired or changed. Check the inbox before reviewing again; a previous uncertain admission may already exist.");B=!0;let X=o()-6e4;for(let[V,Z]of a)Z.start<X&&a.delete(V);let Y=a.get(ne)??{start:o(),count:0};if(Y.count>=10)return D(C,"Please wait",`<p>Ten prompts were queued this minute. Wait before retrying this unchanged confirmation.</p><pre>
2450
2450
  ${U(P)}</pre>${b(P,M)}`,429);let H=Zp(n.db.db,n.teams,{to:"math",prompt:P,dedupeKey:z.key});return H.replayed||(Y.count++,a.set(ne,Y)),C.redirect(`${s}/prompts/${H.queueId}`,303)}catch(W){return D(C,"Prompt not confirmed",`<p>${U(W.message)}</p><pre>
2451
2451
  ${U(P)}</pre>${B?b(P,M):""}<p>No new confirmation key was issued. For an uncertain result, retain the original confirmation and check the inbox before sending again. A server restart invalidates pending confirmations; known receipt URLs remain readable.</p><a href="${s}">Math inbox</a>`,400)}}),t.get("/comm/math/prompts/:id",C=>{let P=C.req.param("id"),M=Number(P);if(!/^[1-9]\d*$/.test(P)||!Number.isSafeInteger(M))return D(C,"Not found","<p>Invalid prompt ID.</p>",404);let B=rc(n,M);if(!B||B.to_id!=="math")return D(C,"Not found","<p>No Math inbox prompt at this address.</p>",404);let W=vu(n,M),ne=So(n,M),z=W.answer,ue=W.lifecycle==="finished"&&p(W.lifecycleBasis),X=U(B.retracted_reason??"no reason recorded"),Y=W.lifecycleBasis==="informational"?"This was an informational send; no answer is expected.":W.lifecycleBasis==="retracted"?`This prompt was retracted by its sender: ${X}. No answer is expected.`:"This prompt was combined into another prompt. The combined prompt ID is not recorded, so no link is available.",H=W.lifecycleBasis==="informational"?"No answer expected: this was an informational send.":W.lifecycleBasis==="retracted"?`No answer expected: this prompt was retracted. Reason: ${X}.`:"No separate answer: prompt combined into another prompt.";if(z&&z.prompt_queue_id!==M)return D(C,"Answer unavailable","<p>Answer correlation mismatch.</p>",503);let V="";if(e.enabled)try{m(),V=`<section id="compose" aria-label="Write a prompt" data-mount="${U(r)}" data-base="${U(s)}"><h2>Write another prompt</h2><p>Start a new prompt to ${R("math")}. Review the exact text before queueing it.</p>${S(f(C,!0))}</section>`}catch{}return D(C,`Math prompt #${M}`,`<p>Prompt #${M}: ${R(B.from_id)} \u2192 ${R(B.to_id)}. <span id="comm-receipt-summary">${z?"An answer is recorded below.":ue?Y:"No answer recorded yet."}</span></p>${O}<p>Work: no task association is recorded for this prompt. <a href="#assigned-work">Browse Math\u2019s current assigned work</a>.</p><p id="comm-state" role="status" aria-live="polite" data-sender="${U(B.from_id)}" data-recipient="${U(B.to_id)}" data-queue-id="${M}" data-mount="${U(r)}" data-lifecycle="${W.lifecycle}" data-lifecycle-basis="${W.lifecycleBasis}">${N(W)} \xB7 ${U(x(W))}</p><p><a href="${s}/prompts/${M}">Refresh state</a> \xB7 <a href="${s}">Math inbox</a></p>${V}<section aria-label="Prompt and answer sequence"><h2>Prompt and answer sequence</h2><article data-queue-id="${M}" data-event="request"><h3>Prompt text</h3><p>${R(B.from_id)} \u2192 ${R(B.to_id)} \xB7 queued ${Re(W.createdAt)}</p><details><summary>Prompt times</summary><p id="comm-handling-observation">Delivery attempted ${B.sent_ts?Re(B.sent_ts):"not recorded"} \xB7 Picked up ${B.retrieved_ts?Re(B.retrieved_ts):"not recorded"} </p><p>Answer recorded <span id="comm-reply-time">${z?Re(z.answered_at):"not recorded"}</span></p></details>${ne?.status==="available"?`<pre>
2452
2452
  ${U(ne.text)}</pre><p>${ne.truncated?"Preview truncated.":"Saved prompt text; availability may change."}</p>`:"<p>Prompt preview unavailable.</p>"}</article><article data-queue-id="${M}" data-event="response"><h3>Answer</h3><p id="comm-poll-notice" role="status" aria-live="polite">Live updates while this page is visible.</p><p id="comm-response-status">${ue?H:`${z?"Answer recorded":"Waiting for an answer"} in the ${R(B.to_id)} inbox for prompt #${M} from ${R(B.from_id)}.`}</p>${z?`<p id="comm-response-meta">Recorded ${Re(z.answered_at)} \xB7 answer #${z.id} to prompt #${z.prompt_queue_id}</p><pre id="comm-response">
2453
- ${U(z.answer_text)}</pre><p id="comm-response-truncation">${z.truncated?`Truncated: ${z.byteLength} of ${z.totalBytes} bytes. No continuation endpoint is available.`:`${z.byteLength} bytes returned.`}</p>`:`<p id="comm-response-meta"></p><pre id="comm-response" hidden></pre><p id="comm-response-truncation"></p><p id="comm-response-none">${ue?"":"No correlated answer recorded yet. Refresh to check again."}</p>`}</article></section><div id="assigned-work">${k()}</div>`)}),t}import{basename as xie}from"node:path";var fv=50,Lie=e=>e.trim().toLowerCase().replace(/[\s_]+/g,"-"),mv=e=>["blocked","error","on-hold","rate-limited"].includes(Lie(e));function hF(e){if(!/^[1-9]\d*$/.test(e)||!Number.isSafeInteger(Number(e)))throw new q("INVALID_ARGUMENT","Invalid positive integer ID");return Number(e)}function Cie(e){let t={},n=new Set(["q","project","status","kind","team","attention","sort","page"]);for(let[r,s]of new URL(e).searchParams){if(!n.has(r)||Object.hasOwn(t,r)||s.length>256||/[\x00-\x1f\x7f]/.test(s))throw new q("INVALID_ARGUMENT","Invalid or duplicate task filter");t[r]=s}if(t.page&&hF(t.page)>Ke)throw new q("INVALID_ARGUMENT","Page exceeds safety limit");if(t.attention&&t.attention!=="1")throw new q("INVALID_ARGUMENT","attention must be 1");if(t.sort&&!["id","updated"].includes(t.sort))throw new q("INVALID_ARGUMENT","Unknown task sort");if(t.kind&&!["epic","task","subtask"].includes(t.kind))throw new q("INVALID_ARGUMENT","Unknown task kind");return t}function dF(e,t){let n=new URLSearchParams(Object.entries(t).filter(([,r])=>r!==""));return e+(n.size?`?${n}`:"")}function Oie(e,t,n,r){let s=e.filter(m=>(!t.q||`${m.id} ${m.title} ${m.description} ${m.requirements} ${m.acceptance_criteria}`.toLowerCase().includes(t.q.toLowerCase()))&&(!t.attention||mv(m.status))&&(!r||m.owner_team_path===r));s.sort(t.sort==="updated"?(m,p)=>Date.parse(p.updated_at)-Date.parse(m.updated_at)||m.id-p.id:(m,p)=>m.id-p.id);let o=Number(t.page||1),i=s.slice((o-1)*fv,o*fv),a=new Map(e.map(m=>[m.id,m])),c=m=>{if(m===null)return;let p=a.get(m)??n(m);return a.set(m,p),p},l=new Map(i.map(m=>[m.id,{...m,context:!1}]));for(let m of i){let p=c(m.parent_id),h=new Set([m.id]);for(;p&&!h.has(p.id);)h.add(p.id),l.has(p.id)||l.set(p.id,{...p,context:!0}),p=c(p.parent_id)}let u=new Map;for(let m of l.values()){let p=m.parent_id!==null&&l.has(m.parent_id)?m.parent_id:null,h=u.get(p)??[];h.push(m),u.set(p,h)}let d=[],f=m=>{for(let p of u.get(m)??[])d.push(p),f(p.id)};return f(null),{rows:d,total:s.length,pageNumber:o,more:s.length>o*fv,byId:a}}function cc(e,t){return et(`${t}/tasks/${e.id}`,`#${e.id} ${e.title}`)}function _F(e,t,n){if(e.owner_team_path===null)return"Unassigned";let r=`${xie(e.owner_team_path)}:${e.owner_alias}`,s=`${e.owner_team_path}:${e.owner_alias}`,o=t.get(e.owner_team_path);return o&&e.owner_alias?`<a href="${U(`${n}/sessions/${encodeURIComponent(o)}/${encodeURIComponent(e.owner_alias)}`)}" title="${U(s)}">${U(r)}</a>`:`<span title="${U(s)}">${U(r)}</span>`}function gF(e){if(e.blocked_on!==null){let t=e.blocked_on==="operator"?"Operator":e.blocked_on;return`<span class="status-chip status-processing" title="blocked_on names who this task is waiting on; independent of the recorded status text">Blocked on ${U(t)}</span>`}if(e.hold_until!==null){let t=Date.parse(e.hold_until)<=Date.now(),n=e.hold_reason?` \u2014 ${U(e.hold_reason)}`:"";return t?`<span class="status-chip status-processing" title="Hold expired ${U(e.hold_until)}; not auto-cleared, needs the owning team to resolve it">Hold expired, evidence due${n}</span>`:`<span class="status-chip status-muted">On hold until ${Re(e.hold_until)}${n}</span>`}return"\u2014"}function fF(e,t,n,r,s="Task ledger"){return ic(["Task / hierarchy","Project","Recorded status","Blocked / hold","Recorded owner","Updated","Presentation"],e.map(o=>{let i=[],a=o.parent_id===null?void 0:t.get(o.parent_id),c=new Set([o.id]);for(;a&&!c.has(a.id);)c.add(a.id),i.unshift(a),a=a.parent_id===null?void 0:t.get(a.parent_id);let l=i.map(u=>cc(u,n)).join(" / ");return[`${l?`${l}<br>`:""}${cc(o,n)}${o.context?" <strong>(ancestor context)</strong>":""}<br>${U(o.kind)}`,U(o.project),U(o.status),gF(o),_F(o,r,n),Re(o.updated_at),o.kind==="epic"?"Not applicable":o.delivered_ts?`First presented ${Re(o.delivered_ts)}`:"Not recorded"]}),s)}function mF(e,t,n){let r=["q","project","status"].map(i=>`<label>${{q:"Search",project:"Project",status:"Exact recorded status"}[i]}<input name="${i}" value="${U(e[i]??"")}" maxlength="256"></label>`).join(""),s=(i,a,c)=>`<label>${a}<select name="${i}">${c.map(([l,u])=>`<option value="${U(l)}"${e[i]===l?" selected":""}>${U(u)}</option>`).join("")}</select></label>`,o=[["",`All teams (${t.length} own work in this scope)`],...t.map(i=>[i,i])];return`<form method="get" action="${U(n)}/tasks">${r}${s("kind","Kind",[["","All kinds"],["epic","Epic"],["task","Task"],["subtask","Subtask"]])}${s("team","Owning team",o)}${s("sort","Sort",[["id","ID"],["updated","Updated"]])}<label>Attention only<input type="checkbox" name="attention" value="1"${e.attention?" checked":""}></label><button>Filter tasks</button> ${et(`${n}/tasks`,"Clear filters")}</form>`}function pF(e){return`<p>${e.total} entities in this scope: ${e.by_kind.epic??0} epics, ${e.by_kind.task??0} tasks, ${e.by_kind.subtask??0} subtasks.</p>`}function EF(e,t,n=""){let r=n.replace(/\/$/,""),s=(i,a,c,l=200)=>pt(i,Be(a,c,r,{"data-page":"tasks"}),l),o=(i,a)=>{let c=a instanceof q?a.code==="NOT_FOUND"?404:a.code==="DB_BUSY"?503:a.code==="STORAGE_ERROR"?500:a.code==="CONFLICT"?409:400:500;return s(i,"Tasks unavailable",`<p>${U(a instanceof Error?a.message:String(a))}</p>${et(`${r}/tasks`,"Task ledger")}`,c)};e.get("/tasks",i=>{try{let a=Cie(i.req.url),c;if(a.team){let p=t.teams.find(h=>h.name===a.team&&Q(h));if(!p||!Q(p))throw new q("INVALID_ARGUMENT","Unknown local owning team");c=se(p)}let l=Ps(t.db.db,{...a.project?{project:a.project}:{},...a.kind?{kind:a.kind}:{},...a.status?{status:a.status}:{},limit:Ke}),u=Io(t.teams),d=[...new Set(l.rows.map(p=>p.owner_team_path).filter(p=>p!==null).map(p=>u.get(p)).filter(p=>p!==void 0))].sort();if(l.meta.next_cursor!==null)return s(i,"Tasks",'<p class="warning">This scope exceeds 10,000 entities. Choose a project, kind, or status to narrow it; an incomplete board is not shown.</p>'+mF(a,d,r),503);let f=Oie(l.rows,a,p=>Us(t.db.db,p),c),m=`<nav aria-label="Task pages">${f.pageNumber>1?et(dF(`${r}/tasks`,{...a,page:String(f.pageNumber-1)}),"Previous page"):""} ${f.more?et(dF(`${r}/tasks`,{...a,page:String(f.pageNumber+1)}),"Next page"):""}</nav>`;return s(i,"Tasks",'<p data-testid="page-intro">Epics group tasks, and tasks can contain subtasks; follow a title to read its details and children. Status and owner are recorded values; Updated means content activity; Attention means blocked, error, on-hold, or rate-limited; First presentation means when the item was first shown to an agent to work on, not completion. Blocked / hold is separate from the recorded status text: it shows when a task is structurally waiting on a specific team or operator, or deliberately parked until a date, even while its own status reads as ordinary active work.</p>'+pF({total:l.rows.length,by_kind:l.rows.reduce((p,h)=>(p[h.kind]=(p[h.kind]??0)+1,p),{})})+mF(a,d,r)+`<p>${f.total} matching entities. Page ${f.pageNumber}, up to 50 matches plus labeled ancestor context; presentation does not mean completion.</p>`+m+fF(f.rows,f.byId,r,u)+m)}catch(a){return o(i,a)}}),e.get("/tasks/:id",i=>{try{let a=hF(i.req.param("id")),c=Us(t.db.db,a),l=Fs(t.db.db,a),u=[],d=c.parent_id,f=new Set([a]);for(;d!==null&&!f.has(d);){f.add(d);let T=Us(t.db.db,d);u.unshift(T),d=T.parent_id}let m=Io(t.teams),p=new Map([...u,c,...l.children].map(T=>[T.id,T])),h=T=>T.length?`<ul>${T.map(v=>`<li>${cc(v,r)} \u2014 ${U(v.status)}</li>`).join("")}</ul>`:"<p>None recorded.</p>",_=`<nav aria-label="Breadcrumb">${et(`${r}/tasks`,"Task ledger")} / ${u.map(T=>et(`${r}/tasks/${T.id}`,`#${T.id} ${T.title} (status: ${T.status})`)).join(" / ")}${u.length?" / ":""}<span aria-current="page">#${c.id} ${U(c.title)}</span></nav>`,g=u.at(-1),w=u.find(T=>T.kind==="epic"),y=`<p data-testid="work-context">${c.kind==="epic"?"This is an epic with no parent.":c.kind==="task"?w?`This is a task in epic ${cc(w,r)}.`:"This is a task with no parent epic.":`This is a subtask${g?` of task ${cc(g,r)}`:""}${w?`, part of epic ${cc(w,r)}.`:"; no parent epic is recorded."}`}</p><p data-testid="page-intro">This page describes one work item and its recorded status and owner. Follow the breadcrumb to its parent or epic, or a child title to drill down; Updated records content activity, not completion.</p>`+_+`<p>Kind: ${U(c.kind)}; project: ${U(c.project)}; recorded status: <strong>${U(c.status)}</strong>.</p><p>Recorded owner: ${_F(c,m,r)}.</p><p>Blocked / hold: ${gF(c)}</p>`+["description","requirements","acceptance_criteria"].map(T=>`<h2>${{description:"Description",requirements:"Requirements",acceptance_criteria:"Acceptance criteria"}[T]}</h2><pre>${U(c[T]||"Not supplied")}</pre>`).join("")+pF(js(t.db.db,{id:a}))+"<h2>Children</h2>"+fF(l.children,p,r,m,"Immediate children")+"<h2>Depends on</h2>"+h(c.dependencies.outgoing)+"<h2>Required by</h2>"+h(c.dependencies.incoming)+`<h2>Times</h2><p>Created ${Re(c.created_at)}; updated ${Re(c.updated_at)}.</p><p>First presentation: ${c.kind==="epic"?"Not applicable":c.delivered_ts?Re(c.delivered_ts):"Not recorded"}. Presentation does not mean completion.</p>`;return s(i,`Task #${c.id}: ${c.title}`,y)}catch(a){return o(i,a)}})}import{basename as Die}from"node:path";var yF=50,wF='<p data-testid="page-intro">A cron job is work scheduled to run automatically; this page reviews its saved configuration and recorded results. An unresolved escalated run is waiting for a person to help, while execution uncertain means the process has not been confirmed stopped.</p>',$ie={ok:"OK (last-fire bookkeeping)",error:"Error",skipped_overlap:"Skipped: earlier execution still guarded",skipped_stale:"Skipped: scheduled window too old",reconciled:"Process gone; outcome unknown",blocked_escalation:"Skipped: unresolved escalation at last check"},nn=e=>e===null?"Not recorded":Re(e),jt=e=>e===null?"Not configured":U(e),TF=e=>e.last_fire_status===null?"Not recorded":`${U($ie[e.last_fire_status]??e.last_fire_status)} <small>(${U(e.last_fire_status)})</small>`;function vF(e){let t=e.req.queries("after");if(t===void 0)return 0;let n=t[0]??"";if(t.length!==1||!/^(0|[1-9]\d*)$/.test(n)||!Number.isSafeInteger(Number(n)))throw new G("INVALID_ARGUMENT","after must be a nonnegative integer");return Number(n)}function SF(e,t,n){if(e.session_teamfile===null||e.session_alias===null)return"Not configured";let r=`${e.session_teamfile}:${e.session_alias}`,s=`${Die(e.session_teamfile)}:${e.session_alias}`,o=t.get(e.session_teamfile);return o?`<a href="${U(`${n}/sessions/${encodeURIComponent(o)}/${encodeURIComponent(e.session_alias)}`)}" title="${U(r)}">${U(s)}</a>`:`<span title="${U(r)}">${U(s)}</span> (not in the current local registry)`}function bF(e,t){let n=[];return(e.last_fire_status==="error"||e.last_fire_error)&&n.push("Recorded fire error"),e.last_fire_status==="blocked_escalation"&&n.push("Last check blocked by escalation"),e.last_fire_status==="reconciled"&&n.push("Previous execution outcome unknown"),t?.status==="escalated"&&t.escalation_resolved_at===null&&n.push(`Run #${t.id}: escalated \u2014 waiting for a person`),t?.execution_state==="uncertain"&&n.push(`Run #${t.id}: execution uncertain`),t?.status==="failed"&&n.push(`Run #${t.id}: failed; execution still guarded`),n}function pv(e){return`<dl>${e.map(([t,n])=>`<dt>${U(t)}</dt><dd>${n}</dd>`).join("")}</dl>`}function Mie(e){if(e===null)return"<p>No artifacts recorded.</p>";try{let t=JSON.parse(e);if(Array.isArray(t)&&t.every(n=>typeof n=="string"))return t.length?`<ul>${t.map(n=>`<li>${U(n)}</li>`).join("")}</ul>`:"<p>No artifacts recorded.</p>"}catch{}return`<pre>${U(e)}</pre>`}function Pie(e){let t=e.status==="escalated",n=t&&e.escalation_resolved_at===null,r=e.status==="failed"||n||e.execution_state==="uncertain",s=`${e.status}${t?n?" \u2014 waiting for a person":" \u2014 escalation resolved":""}`,o=t||e.escalation_reason!==null||e.escalation_resolved_at!==null?"<h4>Escalation</h4>"+pv([["Reason",jt(e.escalation_reason)],["Requested action",jt(e.escalation_action)],["Owner",jt(e.escalation_owner)],["Resolved at",nn(e.escalation_resolved_at)],["Resolution",jt(e.escalation_resolution)],["Resolved by",jt(e.escalation_resolution_actor)],["Resolution note",jt(e.escalation_resolution_note)]]):"";return`<article id="run-${e.id}"${r?' class="warning"':""}><h3>Run #${e.id}: ${U(s)}</h3>`+pv([["Execution state",U(e.execution_state)],["Trigger",U(e.trigger_kind)],["Created",nn(e.created_at)],["Started",nn(e.started_at)],["Finished",nn(e.finished_at)],["Result reported",nn(e.reported_at)],["Last updated",nn(e.updated_at)],["Execution reference",jt(e.execution_identity)],["Process ID",jt(e.pid)],["Execution uncertainty reason",jt(e.execution_uncertain_reason)],["Execution confirmed gone",nn(e.execution_gone_at)],["Confirmation note",jt(e.execution_confirmation_note)]])+`<h4>Summary</h4><pre>${U(e.summary??"No summary recorded.")}</pre><h4>Artifacts (recorded paths or references)</h4>`+Mie(e.artifacts)+o+"</article>"}function AF(e,t,n=""){let r=n.replace(/\/$/,""),s=(a,c,l,u=200)=>pt(a,Be(c,l,r),u),o=(a,c)=>{let l=c instanceof G?c.code==="NOT_FOUND"?404:c.code==="DB_BUSY"?503:c.code==="INVALID_ARGUMENT"?400:500:500;return s(a,"Cron review unavailable",`<p>${U(c instanceof Error?c.message:String(c))}</p>${et(`${r}/cron`,"Cron jobs")}`,l)},i=(a,c,l)=>`<nav aria-label="Cron pages">${c?et(a,"First page"):""} ${l!==null?et(`${a}?after=${l}`,"Next page"):""}</nav>`;e.get("/cron",a=>{try{let c=vF(a),l=up(t.db.db,{limit:yF,after:c}),u=Io(t.teams),d=l.rows.map(m=>({job:m,flags:bF(m,cr(t.db.db,m.id))})),f=(m,p)=>ic(["Job","Schedule / timezone","Action kind","Enabled","Last fire status","Last fired","Scheduler last looked at","Last fire error","Session"],m.map(({job:h,flags:_})=>[et(`${r}/cron/${h.id}`,`#${h.id} ${h.title}`)+(_.length?`<p class="warning"><strong>${_.map(U).join("<br>")}</strong></p>`:""),`<code>${U(h.schedule_expr)}</code><br>${U(h.timezone??"Host-local timezone")}`,U(h.action_kind),h.enabled?"Enabled":"Disabled",TF(h),nn(h.last_fired_ts),nn(h.last_checked_ts),h.last_fire_error===null?"None recorded":`<pre>${U(h.last_fire_error)}</pre>`,SF(h,u,r)]),p);return s(a,"Cron jobs",wF+"<p>Saved jobs, up to 50 per page in ID order. Times below are stored scheduler records; OK is not proof of successful AI work. A retained error can predate a later skipped check.</p><h2>Failures and review flags</h2>"+f(d.filter(m=>m.flags.length>0),"Jobs with review flags on this page")+"<h2>Other jobs</h2>"+f(d.filter(m=>m.flags.length===0),"Other jobs on this page")+i(`${r}/cron`,c,l.meta.next_cursor))}catch(c){return o(a,c)}}),e.get("/cron/:id",a=>{try{let c=a.req.param("id");if(!/^[1-9]\d*$/.test(c)||!Number.isSafeInteger(Number(c)))throw new G("INVALID_ARGUMENT","Invalid positive job ID");let l=vF(a),u=it(t.db.db,Number(c)),d=np(t.db.db,{jobId:u.id,limit:yF,after:l}),f=cr(t.db.db,u.id),m=bF(u,f),p=pv([["Title",U(u.title)],["Schedule expression",`<code>${U(u.schedule_expr)}</code>`],["Timezone",U(u.timezone??"Host-local timezone")],["Action kind",U(u.action_kind)],["Enabled",u.enabled?"Enabled":"Disabled"],["Provider",jt(u.provider)],["Model",jt(u.model)],["Working directory",jt(u.working_directory)],["Escalation owner",jt(u.escalation_owner)],["Session",SF(u,Io(t.teams),r)],["Session teamfile",jt(u.session_teamfile)],["Session alias",jt(u.session_alias)],["Session seeded at",nn(u.session_seeded_at)],["Session generation",U(u.session_generation)],["Scheduler last looked at",nn(u.last_checked_ts)],["Last fired",nn(u.last_fired_ts)],["Last fire status",TF(u)],["Last fire error",u.last_fire_error===null?"None recorded":`<pre>${U(u.last_fire_error)}</pre>`],["Recorded execution since",nn(u.running_since_ts)],["Recorded systemd unit",jt(u.running_systemd_unit)],["Created",nn(u.created_at)],["Updated",nn(u.updated_at)],["Revision",U(u.revision)]]),h=f?`<p>${et(`${r}/cron/${u.id}?after=${f.id-1}#run-${f.id}`,`Inspect guarded run #${f.id}`)} \u2014 ${U(f.status)}, execution ${U(f.execution_state)}.</p>`:"",_=l?"<p>No more run records after this cursor.</p>":"<p>No run history recorded. Command or script jobs may have last-fire records without run history; an empty history is not itself an error.</p>";return s(a,`Cron job #${u.id}: ${u.title}`,wF+`<p>${et(`${r}/cron`,"All cron jobs")}</p>`+(m.length?`<p class="warning"><strong>${m.map(U).join("<br>")}</strong></p>`:"")+h+"<h2>Configuration</h2>"+p+`<h3>Action payload (command, script, prompt, or enqueue data)</h3><pre>${U(u.action_payload)}</pre><h2>Run history</h2><p>Up to 50 recorded runs, oldest ID first. Outcome and process state are separate: active is recorded as active, uncertain is not confirmed stopped, and gone is confirmed stopped.</p>`+(d.rows.length?d.rows.map(Pie).join(""):_)+i(`${r}/cron/${u.id}`,l,d.next_cursor))}catch(c){return o(a,c)}})}function Uie(e,t){return t===null&&e.retracted_ts===null&&(e.status==="pending"||e.status==="escalating"||e.status==="sent"||e.status==="retrieved")}var kF=64*1024;async function Fie(e){if(!e.req.header("content-type")?.toLowerCase().startsWith("application/x-www-form-urlencoded"))throw new q("INVALID_ARGUMENT","Expected a browser form.");let t=e.req.raw.body?.getReader();if(!t)throw new q("INVALID_ARGUMENT","Missing form.");let n=0,r=[];for(;;){let{done:i,value:a}=await t.read();if(i)break;if(n+=a.byteLength,n>kF)throw await t.cancel(),new q("INVALID_ARGUMENT","Form exceeds the size limit.");r.push(a)}let o=new URLSearchParams(Buffer.concat(r).toString("utf8")).getAll("answer");if(o.length!==1)throw new q("INVALID_ARGUMENT","Missing or duplicate answer field.");return o[0]}function RF(e,t){let n=[t.from_id,t.to_id,t.escalation_only,t.to_alias],s=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(...n,t.id).id??Number.MAX_SAFE_INTEGER;return 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 < ?").all(...n,t.id,s)}function NF(e,t){let n=[];t.retracted_ts!==null&&t.retracted_reason&&n.push(t.retracted_reason);let r=RF(e,t);for(let s of r)s.retracted_ts!==null&&s.retracted_reason&&n.push(s.retracted_reason);return n}function hv(e,t=Date.now()){return au(e,t).map(r=>{let s=r.row,o=Ei(e,s),i=iu(e,s),a=r.ageMs>=uu||o>=2&&s.sent_ts===null,c=NF(e,s);return{row:s,constituentCount:o,retractedCount:i,urgent:a,retractedReasons:c}})}function xF(e){return e===1?"1 of 1":`${e} merged into this one`}function jie(e){return e==="merged"||e==="informational"||e==="retracted"}function Hie(e){return e.lifecycle==="queued"?"queued":e.lifecycle==="processing"?"processing":jie(e.lifecycleBasis)?"muted":"replied"}function qie(e){return e.lifecycle==="queued"?"Queued":e.lifecycle==="processing"?"Processing":e.lifecycleBasis==="merged"?"Combined":e.lifecycleBasis==="informational"?"Informational":e.lifecycleBasis==="retracted"?"Retracted":"Replied"}function LF(e){return`<span class="status-chip status-${Hie(e)}" title="${U(_v(e))}">${U(qie(e))}</span>`}function _v(e){return e.lifecycle==="queued"?"Queued \u2014 waiting for handling":e.lifecycle==="processing"?e.lifecycleBasis==="confirmed"?"Processing \u2014 picked up by inbox":"Processing \u2014 delivery attempted; read not confirmed":e.lifecycle==="finished"?e.lifecycleBasis==="retracted"?"Finished \u2014 retracted":e.lifecycleBasis==="merged"?"Finished \u2014 combined with another prompt":e.lifecycleBasis==="informational"?"Finished \u2014 informational, no answer expected":"Finished \u2014 answer recorded":`${e.lifecycle} (${e.lifecycleBasis})`}function Bie(e){return`<dl>${e.map(([t,n])=>`<dt>${U(t)}</dt><dd>${n}</dd>`).join("")}</dl>`}function Wie(e){return e.length===0?"<p>No standing decisions recorded.</p>":e.map(t=>{let n=t.would_change_it?`<p><strong>Would change this:</strong> ${U(t.would_change_it)}</p>`:"<p><strong>Would change this:</strong> Not recorded.</p>",r=t.affects.length>0?t.affects.map(U).join(", "):"Not recorded";return`<article aria-label="Decision #${t.id}"><h3>${U(t.subject)}</h3><p>${U(t.decision)}</p>${n}<details><summary>Reasoning</summary><p>${U(t.reasoning)}</p></details><p>Decided by ${U(t.decided_by)}, ${Re(t.decided_at)}. Affects: ${r}.</p></article>`}).join("")}function Gie(e){return e.length===0?"<p>Nothing blocking math right now.</p>":e.map(t=>`<article aria-label="Blocked #${t.id}"><h3>!!! ${U(t.title)}</h3><p>Category: ${U(t.category)}.</p>${t.detail?`<p>${U(t.detail)}</p>`:""}<p>Raised by ${U(t.raised_by)}, ${Re(t.raised_at)}.</p></article>`).join("")}function Xie(e,t){return e.length===0?"<p>No open judgment calls for the operator.</p>":e.map(n=>{let r=n.downstream?`<p><strong>Downstream:</strong> ${U(n.downstream)}</p>`:"<p><strong>Downstream:</strong> Not recorded.</p>";return`<article aria-label="Ask #${n.id}"><h3>${U(n.subject)}</h3><p>${U(n.reason)}</p>${r}<p>Status: Open. Raised by ${U(n.raised_by)}, ${Re(n.raised_at)}.</p><p><a href="${U(t)}/comm/math?ask=${n.id}#compose">Discuss this with math</a></p></article>`}).join("")}function IF(e,t,n,r){if(e.length===0)return`<p>No ${t.toLowerCase()}.</p>`;let s=["Prompt","From","Age","Constituents","Retractions","Lifecycle"],o=e.map(i=>{let a=i.row,c=mt(r,a.id),l=zn(a,c),u=`<a href="${U(n)}/operator/${a.id}">#${a.id}</a>`,d=U(a.from_id),f=Re(a.created_ts),m=xF(i.constituentCount),p=i.retractedCount>0?`${i.retractedCount} retracted${i.retractedReasons.length>0?`: ${i.retractedReasons.map(_=>`\u201C${U(_)}\u201D`).join("; ")}`:""}`:"\u2014",h=`${LF(l)} \xB7 ${U(_v(l))}`;return[u,d,f,m,p,h]});return ic(s,o,t)}function CF(e,t,n=""){let r=n.replace(/\/$/,"");e.get("/operator",s=>{try{let o=hv(t.db.db,Date.now()),i=o.filter(_=>_.urgent),a=o.filter(_=>!_.urgent),c='<p data-testid="page-intro">What needs the operator, what math has already decided for them to review, and a way to reach math directly. Blocked means math is technically incapable of proceeding (re-auth, billing, account identity) -- rare and urgent. Escalations are requests a team sent that genuinely need a decision, shown whether or not anyone is currently monitoring them; urgent means waiting over four hours, or never delivered despite repeated sends. Constituents counts how many separate escalations were folded into one message; Retractions counts how many of those the sender has since withdrawn, with their stated reason. Asks are judgment calls only the operator can make, routine, not urgent -- problem statement, then what it affects downstream, then who raised it. Decisions are rulings math has already made, for review, not approval.</p>',l=`<section class="warning" aria-label="Urgent escalations"><h2>Urgent escalations</h2>${IF(i,"Urgent escalations",r,t.db.db)}</section>`,u=`<section aria-label="Routine escalations"><h2>Routine escalations</h2>${IF(a,"Routine escalations",r,t.db.db)}</section>`,d=`<section aria-label="Send a message"><h2>Send a message</h2><p>Start a new request to math. This reuses the same queue and composer as <a href="${U(r)}/comm/math">the Math inbox</a> -- one write path, not a second one.</p><p><a href="${U(r)}/comm/math#compose">Write a message to math</a></p></section>`,f,m,p;try{let _=eh(),g,w,E;try{g=cF(_),w=iF(_),E=oF(_)}finally{_.close()}f=`<section class="warning" aria-label="Blocked"><h2>Blocked</h2>${Gie(g)}</section>`,m=`<section aria-label="Asks"><h2>Asks</h2>${Xie(w,r)}</section>`,p=`<section aria-label="Decisions"><h2>Decisions</h2><p>Rulings math has already made, in force now (superseded and reversed decisions are excluded). Nothing here waits on you -- read, and ping math if you disagree.</p>${Wie(E)}</section>`}catch(_){let g=`<p class="warning">lmteam data unavailable: ${U(_ instanceof Error?_.message:String(_))}</p>`;f=`<section class="warning" aria-label="Blocked"><h2>Blocked</h2>${g}</section>`,m=`<section aria-label="Asks"><h2>Asks</h2>${g}</section>`,p=`<section aria-label="Decisions"><h2>Decisions</h2>${g}</section>`}let h=`${c}${f}${l}${m}${d}${u}${p}`;return pt(s,Be("Operator inbox",h,r,{"data-page":"operator"},[],!0))}catch(o){return pt(s,Be("Operator inbox unavailable",`<p>${U(o instanceof Error?o.message:String(o))}</p>`,r,{},[],!0),500)}}),e.get("/operator/:id",s=>{let o=s.req.param("id"),i=Number(o);if(!o||!/^[1-9]\d*$/.test(o)||!Number.isSafeInteger(i))return pt(s,Be("Invalid escalation ID",`<p>Invalid escalation ID.</p><p><a href="${U(r)}/operator">Operator inbox</a></p>`,r,{},[],!0),400);try{let a=Ds(t.db.db,i);if(!a||a.to_id!=="operator")return pt(s,Be("Not found",`<p>No operator escalation at this address.</p><p><a href="${U(r)}/operator">Operator inbox</a></p>`,r,{},[],!0),404);let c=So(t,i),l=mt(t.db.db,i),u=zn(a,l),d=Ei(t.db.db,a),f=iu(t.db.db,a),m=NF(t.db.db,a),p=[["From",U(a.from_id)],["To",U(a.to_id)],["Queued",Re(a.created_ts)],["Lifecycle",`${LF(u)} \xB7 ${U(_v(u))}`],["Constituents",U(xF(d))],["Delivery attempted",a.sent_ts?Re(a.sent_ts):"not recorded"],["Picked up",a.retrieved_ts?Re(a.retrieved_ts):"not recorded"],["Subject",a.subject_id?U(a.subject_id):"none"]];f>0&&p.push(["Retractions",`${f} retracted${m.length>0?`: ${m.map(y=>`\u201C${U(y)}\u201D`).join("; ")}`:""}`]),a.retracted_ts!==null&&(p.push(["Retracted at",Re(a.retracted_ts)]),p.push(["Retraction reason",U(a.retracted_reason??"(none)")]));let h="";c?.status==="available"?h=`<pre>${U(c.text)}</pre><p>${c.truncated?`Preview truncated (${c.byteLength} bytes).`:`Full content (${c.byteLength} bytes).`}</p>`:h=`<p>Prompt preview unavailable (${U(c?.status??"missing")}).</p>`;let _="";l?_=`<section><h2>Answer</h2><p>Recorded ${Re(l.answered_at)}</p><pre>${U(l.answer_text)}</pre></section>`:Uie(a,l)&&(_=`<section aria-label="Answer"><h2>Answer</h2><form method="post" action="${U(r)}/operator/${i}/answer"><label for="answer">Answer text</label><textarea id="answer" name="answer" rows="8" maxlength="${kF}" required></textarea><button>Send answer</button></form></section>`);let g=RF(t.db.db,a),w="";g.length>0&&(w=`<section><h3>Merged constituents (${g.length})</h3><p>Additional escalations folded into this message:</p><ul>${g.map(y=>`<li><a href="${U(r)}/operator/${y.id}">#${y.id}</a> from ${U(y.from_id)} (queued ${Re(y.created_ts)})${y.retracted_ts?` \u2014 <strong>Retracted</strong>: \u201C${U(y.retracted_reason)}\u201D`:""}</li>`).join("")}</ul></section>`);let E=`<p><a href="${U(r)}/operator">Operator inbox</a></p>
2453
+ ${U(z.answer_text)}</pre><p id="comm-response-truncation">${z.truncated?`Truncated: ${z.byteLength} of ${z.totalBytes} bytes. No continuation endpoint is available.`:`${z.byteLength} bytes returned.`}</p>`:`<p id="comm-response-meta"></p><pre id="comm-response" hidden></pre><p id="comm-response-truncation"></p><p id="comm-response-none">${ue?"":"No correlated answer recorded yet. Refresh to check again."}</p>`}</article></section><div id="assigned-work">${k()}</div>`)}),t}import{basename as Nie}from"node:path";var fv=50,xie=e=>e.trim().toLowerCase().replace(/[\s_]+/g,"-"),mv=e=>["blocked","error","on-hold","rate-limited"].includes(xie(e));function hF(e){if(!/^[1-9]\d*$/.test(e)||!Number.isSafeInteger(Number(e)))throw new q("INVALID_ARGUMENT","Invalid positive integer ID");return Number(e)}function Lie(e){let t={},n=new Set(["q","project","status","kind","team","attention","sort","page"]);for(let[r,s]of new URL(e).searchParams){if(!n.has(r)||Object.hasOwn(t,r)||s.length>256||/[\x00-\x1f\x7f]/.test(s))throw new q("INVALID_ARGUMENT","Invalid or duplicate task filter");t[r]=s}if(t.page&&hF(t.page)>Ke)throw new q("INVALID_ARGUMENT","Page exceeds safety limit");if(t.attention&&t.attention!=="1")throw new q("INVALID_ARGUMENT","attention must be 1");if(t.sort&&!["id","updated"].includes(t.sort))throw new q("INVALID_ARGUMENT","Unknown task sort");if(t.kind&&!["epic","task","subtask"].includes(t.kind))throw new q("INVALID_ARGUMENT","Unknown task kind");return t}function dF(e,t){let n=new URLSearchParams(Object.entries(t).filter(([,r])=>r!==""));return e+(n.size?`?${n}`:"")}function Cie(e,t,n,r){let s=e.filter(m=>(!t.q||`${m.id} ${m.title} ${m.description} ${m.requirements} ${m.acceptance_criteria}`.toLowerCase().includes(t.q.toLowerCase()))&&(!t.attention||mv(m.status))&&(!r||m.owner_team_path===r));s.sort(t.sort==="updated"?(m,p)=>Date.parse(p.updated_at)-Date.parse(m.updated_at)||m.id-p.id:(m,p)=>m.id-p.id);let o=Number(t.page||1),i=s.slice((o-1)*fv,o*fv),a=new Map(e.map(m=>[m.id,m])),c=m=>{if(m===null)return;let p=a.get(m)??n(m);return a.set(m,p),p},l=new Map(i.map(m=>[m.id,{...m,context:!1}]));for(let m of i){let p=c(m.parent_id),h=new Set([m.id]);for(;p&&!h.has(p.id);)h.add(p.id),l.has(p.id)||l.set(p.id,{...p,context:!0}),p=c(p.parent_id)}let u=new Map;for(let m of l.values()){let p=m.parent_id!==null&&l.has(m.parent_id)?m.parent_id:null,h=u.get(p)??[];h.push(m),u.set(p,h)}let d=[],f=m=>{for(let p of u.get(m)??[])d.push(p),f(p.id)};return f(null),{rows:d,total:s.length,pageNumber:o,more:s.length>o*fv,byId:a}}function cc(e,t){return et(`${t}/tasks/${e.id}`,`#${e.id} ${e.title}`)}function _F(e,t,n){if(e.owner_team_path===null)return"Unassigned";let r=`${Nie(e.owner_team_path)}:${e.owner_alias}`,s=`${e.owner_team_path}:${e.owner_alias}`,o=t.get(e.owner_team_path);return o&&e.owner_alias?`<a href="${U(`${n}/sessions/${encodeURIComponent(o)}/${encodeURIComponent(e.owner_alias)}`)}" title="${U(s)}">${U(r)}</a>`:`<span title="${U(s)}">${U(r)}</span>`}function gF(e){if(e.blocked_on!==null){let t=e.blocked_on==="operator"?"Operator":e.blocked_on;return`<span class="status-chip status-processing" title="blocked_on names who this task is waiting on; independent of the recorded status text">Blocked on ${U(t)}</span>`}if(e.hold_until!==null){let t=Date.parse(e.hold_until)<=Date.now(),n=e.hold_reason?` \u2014 ${U(e.hold_reason)}`:"";return t?`<span class="status-chip status-processing" title="Hold expired ${U(e.hold_until)}; not auto-cleared, needs the owning team to resolve it">Hold expired, evidence due${n}</span>`:`<span class="status-chip status-muted">On hold until ${Re(e.hold_until)}${n}</span>`}return"\u2014"}function fF(e,t,n,r,s="Task ledger"){return ic(["Task / hierarchy","Project","Recorded status","Blocked / hold","Recorded owner","Updated","Presentation"],e.map(o=>{let i=[],a=o.parent_id===null?void 0:t.get(o.parent_id),c=new Set([o.id]);for(;a&&!c.has(a.id);)c.add(a.id),i.unshift(a),a=a.parent_id===null?void 0:t.get(a.parent_id);let l=i.map(u=>cc(u,n)).join(" / ");return[`${l?`${l}<br>`:""}${cc(o,n)}${o.context?" <strong>(ancestor context)</strong>":""}<br>${U(o.kind)}`,U(o.project),U(o.status),gF(o),_F(o,r,n),Re(o.updated_at),o.kind==="epic"?"Not applicable":o.delivered_ts?`First presented ${Re(o.delivered_ts)}`:"Not recorded"]}),s)}function mF(e,t,n){let r=["q","project","status"].map(i=>`<label>${{q:"Search",project:"Project",status:"Exact recorded status"}[i]}<input name="${i}" value="${U(e[i]??"")}" maxlength="256"></label>`).join(""),s=(i,a,c)=>`<label>${a}<select name="${i}">${c.map(([l,u])=>`<option value="${U(l)}"${e[i]===l?" selected":""}>${U(u)}</option>`).join("")}</select></label>`,o=[["",`All teams (${t.length} own work in this scope)`],...t.map(i=>[i,i])];return`<form method="get" action="${U(n)}/tasks">${r}${s("kind","Kind",[["","All kinds"],["epic","Epic"],["task","Task"],["subtask","Subtask"]])}${s("team","Owning team",o)}${s("sort","Sort",[["id","ID"],["updated","Updated"]])}<label>Attention only<input type="checkbox" name="attention" value="1"${e.attention?" checked":""}></label><button>Filter tasks</button> ${et(`${n}/tasks`,"Clear filters")}</form>`}function pF(e){return`<p>${e.total} entities in this scope: ${e.by_kind.epic??0} epics, ${e.by_kind.task??0} tasks, ${e.by_kind.subtask??0} subtasks.</p>`}function EF(e,t,n=""){let r=n.replace(/\/$/,""),s=(i,a,c,l=200)=>pt(i,Be(a,c,r,{"data-page":"tasks"}),l),o=(i,a)=>{let c=a instanceof q?a.code==="NOT_FOUND"?404:a.code==="DB_BUSY"?503:a.code==="STORAGE_ERROR"?500:a.code==="CONFLICT"?409:400:500;return s(i,"Tasks unavailable",`<p>${U(a instanceof Error?a.message:String(a))}</p>${et(`${r}/tasks`,"Task ledger")}`,c)};e.get("/tasks",i=>{try{let a=Lie(i.req.url),c;if(a.team){let p=t.teams.find(h=>h.name===a.team&&Q(h));if(!p||!Q(p))throw new q("INVALID_ARGUMENT","Unknown local owning team");c=se(p)}let l=Ps(t.db.db,{...a.project?{project:a.project}:{},...a.kind?{kind:a.kind}:{},...a.status?{status:a.status}:{},limit:Ke}),u=Io(t.teams),d=[...new Set(l.rows.map(p=>p.owner_team_path).filter(p=>p!==null).map(p=>u.get(p)).filter(p=>p!==void 0))].sort();if(l.meta.next_cursor!==null)return s(i,"Tasks",'<p class="warning">This scope exceeds 10,000 entities. Choose a project, kind, or status to narrow it; an incomplete board is not shown.</p>'+mF(a,d,r),503);let f=Cie(l.rows,a,p=>Us(t.db.db,p),c),m=`<nav aria-label="Task pages">${f.pageNumber>1?et(dF(`${r}/tasks`,{...a,page:String(f.pageNumber-1)}),"Previous page"):""} ${f.more?et(dF(`${r}/tasks`,{...a,page:String(f.pageNumber+1)}),"Next page"):""}</nav>`;return s(i,"Tasks",'<p data-testid="page-intro">Epics group tasks, and tasks can contain subtasks; follow a title to read its details and children. Status and owner are recorded values; Updated means content activity; Attention means blocked, error, on-hold, or rate-limited; First presentation means when the item was first shown to an agent to work on, not completion. Blocked / hold is separate from the recorded status text: it shows when a task is structurally waiting on a specific team or operator, or deliberately parked until a date, even while its own status reads as ordinary active work.</p>'+pF({total:l.rows.length,by_kind:l.rows.reduce((p,h)=>(p[h.kind]=(p[h.kind]??0)+1,p),{})})+mF(a,d,r)+`<p>${f.total} matching entities. Page ${f.pageNumber}, up to 50 matches plus labeled ancestor context; presentation does not mean completion.</p>`+m+fF(f.rows,f.byId,r,u)+m)}catch(a){return o(i,a)}}),e.get("/tasks/:id",i=>{try{let a=hF(i.req.param("id")),c=Us(t.db.db,a),l=Fs(t.db.db,a),u=[],d=c.parent_id,f=new Set([a]);for(;d!==null&&!f.has(d);){f.add(d);let T=Us(t.db.db,d);u.unshift(T),d=T.parent_id}let m=Io(t.teams),p=new Map([...u,c,...l.children].map(T=>[T.id,T])),h=T=>T.length?`<ul>${T.map(v=>`<li>${cc(v,r)} \u2014 ${U(v.status)}</li>`).join("")}</ul>`:"<p>None recorded.</p>",_=`<nav aria-label="Breadcrumb">${et(`${r}/tasks`,"Task ledger")} / ${u.map(T=>et(`${r}/tasks/${T.id}`,`#${T.id} ${T.title} (status: ${T.status})`)).join(" / ")}${u.length?" / ":""}<span aria-current="page">#${c.id} ${U(c.title)}</span></nav>`,g=u.at(-1),w=u.find(T=>T.kind==="epic"),y=`<p data-testid="work-context">${c.kind==="epic"?"This is an epic with no parent.":c.kind==="task"?w?`This is a task in epic ${cc(w,r)}.`:"This is a task with no parent epic.":`This is a subtask${g?` of task ${cc(g,r)}`:""}${w?`, part of epic ${cc(w,r)}.`:"; no parent epic is recorded."}`}</p><p data-testid="page-intro">This page describes one work item and its recorded status and owner. Follow the breadcrumb to its parent or epic, or a child title to drill down; Updated records content activity, not completion.</p>`+_+`<p>Kind: ${U(c.kind)}; project: ${U(c.project)}; recorded status: <strong>${U(c.status)}</strong>.</p><p>Recorded owner: ${_F(c,m,r)}.</p><p>Blocked / hold: ${gF(c)}</p>`+["description","requirements","acceptance_criteria"].map(T=>`<h2>${{description:"Description",requirements:"Requirements",acceptance_criteria:"Acceptance criteria"}[T]}</h2><pre>${U(c[T]||"Not supplied")}</pre>`).join("")+pF(js(t.db.db,{id:a}))+"<h2>Children</h2>"+fF(l.children,p,r,m,"Immediate children")+"<h2>Depends on</h2>"+h(c.dependencies.outgoing)+"<h2>Required by</h2>"+h(c.dependencies.incoming)+`<h2>Times</h2><p>Created ${Re(c.created_at)}; updated ${Re(c.updated_at)}.</p><p>First presentation: ${c.kind==="epic"?"Not applicable":c.delivered_ts?Re(c.delivered_ts):"Not recorded"}. Presentation does not mean completion.</p>`;return s(i,`Task #${c.id}: ${c.title}`,y)}catch(a){return o(i,a)}})}import{basename as Oie}from"node:path";var yF=50,wF='<p data-testid="page-intro">A cron job is work scheduled to run automatically; this page reviews its saved configuration and recorded results. An unresolved escalated run is waiting for a person to help, while execution uncertain means the process has not been confirmed stopped.</p>',Die={ok:"OK (last-fire bookkeeping)",error:"Error",skipped_overlap:"Skipped: earlier execution still guarded",skipped_stale:"Skipped: scheduled window too old",reconciled:"Process gone; outcome unknown",blocked_escalation:"Skipped: unresolved escalation at last check"},nn=e=>e===null?"Not recorded":Re(e),jt=e=>e===null?"Not configured":U(e),TF=e=>e.last_fire_status===null?"Not recorded":`${U(Die[e.last_fire_status]??e.last_fire_status)} <small>(${U(e.last_fire_status)})</small>`;function vF(e){let t=e.req.queries("after");if(t===void 0)return 0;let n=t[0]??"";if(t.length!==1||!/^(0|[1-9]\d*)$/.test(n)||!Number.isSafeInteger(Number(n)))throw new G("INVALID_ARGUMENT","after must be a nonnegative integer");return Number(n)}function SF(e,t,n){if(e.session_teamfile===null||e.session_alias===null)return"Not configured";let r=`${e.session_teamfile}:${e.session_alias}`,s=`${Oie(e.session_teamfile)}:${e.session_alias}`,o=t.get(e.session_teamfile);return o?`<a href="${U(`${n}/sessions/${encodeURIComponent(o)}/${encodeURIComponent(e.session_alias)}`)}" title="${U(r)}">${U(s)}</a>`:`<span title="${U(r)}">${U(s)}</span> (not in the current local registry)`}function bF(e,t){let n=[];return(e.last_fire_status==="error"||e.last_fire_error)&&n.push("Recorded fire error"),e.last_fire_status==="blocked_escalation"&&n.push("Last check blocked by escalation"),e.last_fire_status==="reconciled"&&n.push("Previous execution outcome unknown"),t?.status==="escalated"&&t.escalation_resolved_at===null&&n.push(`Run #${t.id}: escalated \u2014 waiting for a person`),t?.execution_state==="uncertain"&&n.push(`Run #${t.id}: execution uncertain`),t?.status==="failed"&&n.push(`Run #${t.id}: failed; execution still guarded`),n}function pv(e){return`<dl>${e.map(([t,n])=>`<dt>${U(t)}</dt><dd>${n}</dd>`).join("")}</dl>`}function $ie(e){if(e===null)return"<p>No artifacts recorded.</p>";try{let t=JSON.parse(e);if(Array.isArray(t)&&t.every(n=>typeof n=="string"))return t.length?`<ul>${t.map(n=>`<li>${U(n)}</li>`).join("")}</ul>`:"<p>No artifacts recorded.</p>"}catch{}return`<pre>${U(e)}</pre>`}function Mie(e){let t=e.status==="escalated",n=t&&e.escalation_resolved_at===null,r=e.status==="failed"||n||e.execution_state==="uncertain",s=`${e.status}${t?n?" \u2014 waiting for a person":" \u2014 escalation resolved":""}`,o=t||e.escalation_reason!==null||e.escalation_resolved_at!==null?"<h4>Escalation</h4>"+pv([["Reason",jt(e.escalation_reason)],["Requested action",jt(e.escalation_action)],["Owner",jt(e.escalation_owner)],["Resolved at",nn(e.escalation_resolved_at)],["Resolution",jt(e.escalation_resolution)],["Resolved by",jt(e.escalation_resolution_actor)],["Resolution note",jt(e.escalation_resolution_note)]]):"";return`<article id="run-${e.id}"${r?' class="warning"':""}><h3>Run #${e.id}: ${U(s)}</h3>`+pv([["Execution state",U(e.execution_state)],["Trigger",U(e.trigger_kind)],["Created",nn(e.created_at)],["Started",nn(e.started_at)],["Finished",nn(e.finished_at)],["Result reported",nn(e.reported_at)],["Last updated",nn(e.updated_at)],["Execution reference",jt(e.execution_identity)],["Process ID",jt(e.pid)],["Execution uncertainty reason",jt(e.execution_uncertain_reason)],["Execution confirmed gone",nn(e.execution_gone_at)],["Confirmation note",jt(e.execution_confirmation_note)]])+`<h4>Summary</h4><pre>${U(e.summary??"No summary recorded.")}</pre><h4>Artifacts (recorded paths or references)</h4>`+$ie(e.artifacts)+o+"</article>"}function AF(e,t,n=""){let r=n.replace(/\/$/,""),s=(a,c,l,u=200)=>pt(a,Be(c,l,r),u),o=(a,c)=>{let l=c instanceof G?c.code==="NOT_FOUND"?404:c.code==="DB_BUSY"?503:c.code==="INVALID_ARGUMENT"?400:500:500;return s(a,"Cron review unavailable",`<p>${U(c instanceof Error?c.message:String(c))}</p>${et(`${r}/cron`,"Cron jobs")}`,l)},i=(a,c,l)=>`<nav aria-label="Cron pages">${c?et(a,"First page"):""} ${l!==null?et(`${a}?after=${l}`,"Next page"):""}</nav>`;e.get("/cron",a=>{try{let c=vF(a),l=up(t.db.db,{limit:yF,after:c}),u=Io(t.teams),d=l.rows.map(m=>({job:m,flags:bF(m,cr(t.db.db,m.id))})),f=(m,p)=>ic(["Job","Schedule / timezone","Action kind","Enabled","Last fire status","Last fired","Scheduler last looked at","Last fire error","Session"],m.map(({job:h,flags:_})=>[et(`${r}/cron/${h.id}`,`#${h.id} ${h.title}`)+(_.length?`<p class="warning"><strong>${_.map(U).join("<br>")}</strong></p>`:""),`<code>${U(h.schedule_expr)}</code><br>${U(h.timezone??"Host-local timezone")}`,U(h.action_kind),h.enabled?"Enabled":"Disabled",TF(h),nn(h.last_fired_ts),nn(h.last_checked_ts),h.last_fire_error===null?"None recorded":`<pre>${U(h.last_fire_error)}</pre>`,SF(h,u,r)]),p);return s(a,"Cron jobs",wF+"<p>Saved jobs, up to 50 per page in ID order. Times below are stored scheduler records; OK is not proof of successful AI work. A retained error can predate a later skipped check.</p><h2>Failures and review flags</h2>"+f(d.filter(m=>m.flags.length>0),"Jobs with review flags on this page")+"<h2>Other jobs</h2>"+f(d.filter(m=>m.flags.length===0),"Other jobs on this page")+i(`${r}/cron`,c,l.meta.next_cursor))}catch(c){return o(a,c)}}),e.get("/cron/:id",a=>{try{let c=a.req.param("id");if(!/^[1-9]\d*$/.test(c)||!Number.isSafeInteger(Number(c)))throw new G("INVALID_ARGUMENT","Invalid positive job ID");let l=vF(a),u=it(t.db.db,Number(c)),d=np(t.db.db,{jobId:u.id,limit:yF,after:l}),f=cr(t.db.db,u.id),m=bF(u,f),p=pv([["Title",U(u.title)],["Schedule expression",`<code>${U(u.schedule_expr)}</code>`],["Timezone",U(u.timezone??"Host-local timezone")],["Action kind",U(u.action_kind)],["Enabled",u.enabled?"Enabled":"Disabled"],["Provider",jt(u.provider)],["Model",jt(u.model)],["Working directory",jt(u.working_directory)],["Escalation owner",jt(u.escalation_owner)],["Session",SF(u,Io(t.teams),r)],["Session teamfile",jt(u.session_teamfile)],["Session alias",jt(u.session_alias)],["Session seeded at",nn(u.session_seeded_at)],["Session generation",U(u.session_generation)],["Scheduler last looked at",nn(u.last_checked_ts)],["Last fired",nn(u.last_fired_ts)],["Last fire status",TF(u)],["Last fire error",u.last_fire_error===null?"None recorded":`<pre>${U(u.last_fire_error)}</pre>`],["Recorded execution since",nn(u.running_since_ts)],["Recorded systemd unit",jt(u.running_systemd_unit)],["Created",nn(u.created_at)],["Updated",nn(u.updated_at)],["Revision",U(u.revision)]]),h=f?`<p>${et(`${r}/cron/${u.id}?after=${f.id-1}#run-${f.id}`,`Inspect guarded run #${f.id}`)} \u2014 ${U(f.status)}, execution ${U(f.execution_state)}.</p>`:"",_=l?"<p>No more run records after this cursor.</p>":"<p>No run history recorded. Command or script jobs may have last-fire records without run history; an empty history is not itself an error.</p>";return s(a,`Cron job #${u.id}: ${u.title}`,wF+`<p>${et(`${r}/cron`,"All cron jobs")}</p>`+(m.length?`<p class="warning"><strong>${m.map(U).join("<br>")}</strong></p>`:"")+h+"<h2>Configuration</h2>"+p+`<h3>Action payload (command, script, prompt, or enqueue data)</h3><pre>${U(u.action_payload)}</pre><h2>Run history</h2><p>Up to 50 recorded runs, oldest ID first. Outcome and process state are separate: active is recorded as active, uncertain is not confirmed stopped, and gone is confirmed stopped.</p>`+(d.rows.length?d.rows.map(Mie).join(""):_)+i(`${r}/cron/${u.id}`,l,d.next_cursor))}catch(c){return o(a,c)}})}function Pie(e,t){return t===null&&e.retracted_ts===null&&(e.status==="pending"||e.status==="escalating"||e.status==="sent"||e.status==="retrieved")}var kF=64*1024;async function Uie(e){if(!e.req.header("content-type")?.toLowerCase().startsWith("application/x-www-form-urlencoded"))throw new q("INVALID_ARGUMENT","Expected a browser form.");let t=e.req.raw.body?.getReader();if(!t)throw new q("INVALID_ARGUMENT","Missing form.");let n=0,r=[];for(;;){let{done:i,value:a}=await t.read();if(i)break;if(n+=a.byteLength,n>kF)throw await t.cancel(),new q("INVALID_ARGUMENT","Form exceeds the size limit.");r.push(a)}let o=new URLSearchParams(Buffer.concat(r).toString("utf8")).getAll("answer");if(o.length!==1)throw new q("INVALID_ARGUMENT","Missing or duplicate answer field.");return o[0]}function RF(e,t){let n=[t.from_id,t.to_id,t.escalation_only,t.to_alias],s=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(...n,t.id).id??Number.MAX_SAFE_INTEGER;return 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 < ?").all(...n,t.id,s)}function NF(e,t){let n=[];t.retracted_ts!==null&&t.retracted_reason&&n.push(t.retracted_reason);let r=RF(e,t);for(let s of r)s.retracted_ts!==null&&s.retracted_reason&&n.push(s.retracted_reason);return n}function hv(e,t=Date.now()){return au(e,t).map(r=>{let s=r.row,o=Ei(e,s),i=iu(e,s),a=r.ageMs>=uu||o>=2&&s.sent_ts===null,c=NF(e,s);return{row:s,constituentCount:o,retractedCount:i,urgent:a,retractedReasons:c}})}function xF(e){return e===1?"1 of 1":`${e} merged into this one`}function Fie(e){return e==="merged"||e==="informational"||e==="retracted"}function jie(e){return e.lifecycle==="queued"?"queued":e.lifecycle==="processing"?"processing":Fie(e.lifecycleBasis)?"muted":"replied"}function Hie(e){return e.lifecycle==="queued"?"Queued":e.lifecycle==="processing"?"Processing":e.lifecycleBasis==="merged"?"Combined":e.lifecycleBasis==="informational"?"Informational":e.lifecycleBasis==="retracted"?"Retracted":"Replied"}function LF(e){return`<span class="status-chip status-${jie(e)}" title="${U(_v(e))}">${U(Hie(e))}</span>`}function _v(e){return e.lifecycle==="queued"?"Queued \u2014 waiting for handling":e.lifecycle==="processing"?e.lifecycleBasis==="confirmed"?"Processing \u2014 picked up by inbox":"Processing \u2014 delivery attempted; read not confirmed":e.lifecycle==="finished"?e.lifecycleBasis==="retracted"?"Finished \u2014 retracted":e.lifecycleBasis==="merged"?"Finished \u2014 combined with another prompt":e.lifecycleBasis==="informational"?"Finished \u2014 informational, no answer expected":"Finished \u2014 answer recorded":`${e.lifecycle} (${e.lifecycleBasis})`}function qie(e){return`<dl>${e.map(([t,n])=>`<dt>${U(t)}</dt><dd>${n}</dd>`).join("")}</dl>`}function Bie(e){return e.length===0?"<p>No standing decisions recorded.</p>":e.map(t=>{let n=t.would_change_it?`<p><strong>Would change this:</strong> ${U(t.would_change_it)}</p>`:"<p><strong>Would change this:</strong> Not recorded.</p>",r=t.affects.length>0?t.affects.map(U).join(", "):"Not recorded";return`<article aria-label="Decision #${t.id}"><h3>${U(t.subject)}</h3><p>${U(t.decision)}</p>${n}<details><summary>Reasoning</summary><p>${U(t.reasoning)}</p></details><p>Decided by ${U(t.decided_by)}, ${Re(t.decided_at)}. Affects: ${r}.</p></article>`}).join("")}function Wie(e){return e.length===0?"<p>Nothing blocking math right now.</p>":e.map(t=>`<article aria-label="Blocked #${t.id}"><h3>!!! ${U(t.title)}</h3><p>Category: ${U(t.category)}.</p>${t.detail?`<p>${U(t.detail)}</p>`:""}<p>Raised by ${U(t.raised_by)}, ${Re(t.raised_at)}.</p></article>`).join("")}function Gie(e,t){return e.length===0?"<p>No open judgment calls for the operator.</p>":e.map(n=>{let r=n.downstream?`<p><strong>Downstream:</strong> ${U(n.downstream)}</p>`:"<p><strong>Downstream:</strong> Not recorded.</p>";return`<article aria-label="Ask #${n.id}"><h3>${U(n.subject)}</h3><p>${U(n.reason)}</p>${r}<p>Status: Open. Raised by ${U(n.raised_by)}, ${Re(n.raised_at)}.</p><p><a href="${U(t)}/comm/math?ask=${n.id}#compose">Discuss this with math</a></p></article>`}).join("")}function IF(e,t,n,r){if(e.length===0)return`<p>No ${t.toLowerCase()}.</p>`;let s=["Prompt","From","Age","Constituents","Retractions","Lifecycle"],o=e.map(i=>{let a=i.row,c=mt(r,a.id),l=zn(a,c),u=`<a href="${U(n)}/operator/${a.id}">#${a.id}</a>`,d=U(a.from_id),f=Re(a.created_ts),m=xF(i.constituentCount),p=i.retractedCount>0?`${i.retractedCount} retracted${i.retractedReasons.length>0?`: ${i.retractedReasons.map(_=>`\u201C${U(_)}\u201D`).join("; ")}`:""}`:"\u2014",h=`${LF(l)} \xB7 ${U(_v(l))}`;return[u,d,f,m,p,h]});return ic(s,o,t)}function CF(e,t,n=""){let r=n.replace(/\/$/,"");e.get("/operator",s=>{try{let o=hv(t.db.db,Date.now()),i=o.filter(_=>_.urgent),a=o.filter(_=>!_.urgent),c='<p data-testid="page-intro">What needs the operator, what math has already decided for them to review, and a way to reach math directly. Blocked means math is technically incapable of proceeding (re-auth, billing, account identity) -- rare and urgent. Escalations are requests a team sent that genuinely need a decision, shown whether or not anyone is currently monitoring them; urgent means waiting over four hours, or never delivered despite repeated sends. Constituents counts how many separate escalations were folded into one message; Retractions counts how many of those the sender has since withdrawn, with their stated reason. Asks are judgment calls only the operator can make, routine, not urgent -- problem statement, then what it affects downstream, then who raised it. Decisions are rulings math has already made, for review, not approval.</p>',l=`<section class="warning" aria-label="Urgent escalations"><h2>Urgent escalations</h2>${IF(i,"Urgent escalations",r,t.db.db)}</section>`,u=`<section aria-label="Routine escalations"><h2>Routine escalations</h2>${IF(a,"Routine escalations",r,t.db.db)}</section>`,d=`<section aria-label="Send a message"><h2>Send a message</h2><p>Start a new request to math. This reuses the same queue and composer as <a href="${U(r)}/comm/math">the Math inbox</a> -- one write path, not a second one.</p><p><a href="${U(r)}/comm/math#compose">Write a message to math</a></p></section>`,f,m,p;try{let _=eh(),g,w,E;try{g=cF(_),w=iF(_),E=oF(_)}finally{_.close()}f=`<section class="warning" aria-label="Blocked"><h2>Blocked</h2>${Wie(g)}</section>`,m=`<section aria-label="Asks"><h2>Asks</h2>${Gie(w,r)}</section>`,p=`<section aria-label="Decisions"><h2>Decisions</h2><p>Rulings math has already made, in force now (superseded and reversed decisions are excluded). Nothing here waits on you -- read, and ping math if you disagree.</p>${Bie(E)}</section>`}catch(_){let g=`<p class="warning">lmteam data unavailable: ${U(_ instanceof Error?_.message:String(_))}</p>`;f=`<section class="warning" aria-label="Blocked"><h2>Blocked</h2>${g}</section>`,m=`<section aria-label="Asks"><h2>Asks</h2>${g}</section>`,p=`<section aria-label="Decisions"><h2>Decisions</h2>${g}</section>`}let h=`${c}${f}${l}${m}${d}${u}${p}`;return pt(s,Be("Operator inbox",h,r,{"data-page":"operator"},[],!0))}catch(o){return pt(s,Be("Operator inbox unavailable",`<p>${U(o instanceof Error?o.message:String(o))}</p>`,r,{},[],!0),500)}}),e.get("/operator/:id",s=>{let o=s.req.param("id"),i=Number(o);if(!o||!/^[1-9]\d*$/.test(o)||!Number.isSafeInteger(i))return pt(s,Be("Invalid escalation ID",`<p>Invalid escalation ID.</p><p><a href="${U(r)}/operator">Operator inbox</a></p>`,r,{},[],!0),400);try{let a=Ds(t.db.db,i);if(!a||a.to_id!=="operator")return pt(s,Be("Not found",`<p>No operator escalation at this address.</p><p><a href="${U(r)}/operator">Operator inbox</a></p>`,r,{},[],!0),404);let c=So(t,i),l=mt(t.db.db,i),u=zn(a,l),d=Ei(t.db.db,a),f=iu(t.db.db,a),m=NF(t.db.db,a),p=[["From",U(a.from_id)],["To",U(a.to_id)],["Queued",Re(a.created_ts)],["Lifecycle",`${LF(u)} \xB7 ${U(_v(u))}`],["Constituents",U(xF(d))],["Delivery attempted",a.sent_ts?Re(a.sent_ts):"not recorded"],["Picked up",a.retrieved_ts?Re(a.retrieved_ts):"not recorded"],["Subject",a.subject_id?U(a.subject_id):"none"]];f>0&&p.push(["Retractions",`${f} retracted${m.length>0?`: ${m.map(y=>`\u201C${U(y)}\u201D`).join("; ")}`:""}`]),a.retracted_ts!==null&&(p.push(["Retracted at",Re(a.retracted_ts)]),p.push(["Retraction reason",U(a.retracted_reason??"(none)")]));let h="";c?.status==="available"?h=`<pre>${U(c.text)}</pre><p>${c.truncated?`Preview truncated (${c.byteLength} bytes).`:`Full content (${c.byteLength} bytes).`}</p>`:h=`<p>Prompt preview unavailable (${U(c?.status??"missing")}).</p>`;let _="";l?_=`<section><h2>Answer</h2><p>Recorded ${Re(l.answered_at)}</p><pre>${U(l.answer_text)}</pre></section>`:Pie(a,l)&&(_=`<section aria-label="Answer"><h2>Answer</h2><form method="post" action="${U(r)}/operator/${i}/answer"><label for="answer">Answer text</label><textarea id="answer" name="answer" rows="8" maxlength="${kF}" required></textarea><button>Send answer</button></form></section>`);let g=RF(t.db.db,a),w="";g.length>0&&(w=`<section><h3>Merged constituents (${g.length})</h3><p>Additional escalations folded into this message:</p><ul>${g.map(y=>`<li><a href="${U(r)}/operator/${y.id}">#${y.id}</a> from ${U(y.from_id)} (queued ${Re(y.created_ts)})${y.retracted_ts?` \u2014 <strong>Retracted</strong>: \u201C${U(y.retracted_reason)}\u201D`:""}</li>`).join("")}</ul></section>`);let E=`<p><a href="${U(r)}/operator">Operator inbox</a></p>
2454
2454
  <p data-testid="page-intro">One escalation addressed to the operator. Constituents counts how many separate escalations were folded into this message; Retractions, if shown, counts how many of those the sender has since withdrawn, with their stated reason.</p>
2455
- <section aria-label="Escalation metadata"><h2>Metadata</h2>${Bie(p)}</section>
2455
+ <section aria-label="Escalation metadata"><h2>Metadata</h2>${qie(p)}</section>
2456
2456
  <article aria-label="Prompt content"><h2>Prompt content</h2>${h}</article>
2457
2457
  ${_}
2458
- ${w}`;return pt(s,Be(`Operator escalation #${i}`,E,r,{"data-page":"operator-detail"},[],!0))}catch(a){return pt(s,Be("Operator escalation unavailable",`<p>${U(a instanceof Error?a.message:String(a))}</p>`,r,{},[],!0),500)}}),e.post("/operator/:id/answer",async s=>{let o=s.req.param("id"),i=Number(o);if(!o||!/^[1-9]\d*$/.test(o)||!Number.isSafeInteger(i))return pt(s,Be("Invalid escalation ID",`<p>Invalid escalation ID.</p><p><a href="${U(r)}/operator">Operator inbox</a></p>`,r,{},[],!0),400);try{let a=await Fie(s);return wi(t.db.db,i,"operator",a),s.redirect(`${r}/operator/${i}`,303)}catch(a){let c=a instanceof q?a.code==="NOT_FOUND"?404:a.code==="CONFLICT"?409:400:500;return pt(s,Be("Answer not recorded",`<p>${U(a instanceof Error?a.message:String(a))}</p><p><a href="${U(r)}/operator/${i}">Back to escalation #${i}</a></p>`,r,{},[],!0),c)}})}function OF(e,t,n=""){let r=n.replace(/\/$/,"");e.get("/",s=>{try{let o=new Date().toISOString(),i=js(t.db.db),a=Object.entries(i.by_status).reduce((g,[w,E])=>g+(mv(w)?E:0),0),c=hv(t.db.db,Date.now()).filter(g=>g.urgent),l=c.length>0?`<section class="warning" role="alert" data-testid="operator-urgent-alert"><p><strong>Urgent operator attention required:</strong> ${et(`${r}/operator`,`${c.length} urgent escalation${c.length===1?"":"s"} awaiting operator answer`)}.</p></section>`:"",u=ou(),d=["epic","task","subtask"].map(g=>et(`${r}/tasks?kind=${g}`,`${i.by_kind[g]??0} ${g}s`)).join(", "),f=u.report===null?"<p>Activity has not yet been observed; running, dead, and idle counts are unknown.</p>":`<p>As of ${u.observedAt?Re(u.observedAt):"an unknown time"}, from the last successful scheduled observation: ${u.report.running.length} running, ${u.report.dead.length} dead, ${u.report.idle.length} idle invocation records.</p>`,m=u.lastError?`<p class="warning">Observer failed${u.lastErrorAt?` ${Re(u.lastErrorAt)}`:""}: ${U(u.lastError)}. ${u.report?"The counts retain the last successful observation.":"No successful observation is available."}</p>`:"",p=t.teams.filter(Q),h="";if(u.report!==null){let g=u.report,w=[...g.running,...g.dead,...g.idle],E=p.filter(y=>!w.some(T=>Di(y,T.target)));if(E.length>0){let y=E.map(T=>`<li>${U(T.name)}: ${U(cu(bp(t.db.db,T,g,Date.now(),{allLocalTeams:p})))}</li>`).join("");h=`<p>${E.length} local team${E.length===1?"":"s"} in no running, dead, or idle record above \u2014 absent, not necessarily stalled; each line names the specific reason nobody has looked recently, when one is known:</p><ul>${y}</ul>`}}let _=`${l}<p data-testid="page-intro">Work is organized as epics \u2192 tasks \u2192 subtasks in the ${et(`${r}/tasks`,"task board")}; actors are sessions that receive prompts and produce answers, visible through ${et(`${r}/running`,"activity and session links")} and the ${et(`${r}/comm/math`,"Math inbox")}. Recorded ownership connects work to an actor, while a recorded answer does not by itself mean the work is complete.</p>
2458
+ ${w}`;return pt(s,Be(`Operator escalation #${i}`,E,r,{"data-page":"operator-detail"},[],!0))}catch(a){return pt(s,Be("Operator escalation unavailable",`<p>${U(a instanceof Error?a.message:String(a))}</p>`,r,{},[],!0),500)}}),e.post("/operator/:id/answer",async s=>{let o=s.req.param("id"),i=Number(o);if(!o||!/^[1-9]\d*$/.test(o)||!Number.isSafeInteger(i))return pt(s,Be("Invalid escalation ID",`<p>Invalid escalation ID.</p><p><a href="${U(r)}/operator">Operator inbox</a></p>`,r,{},[],!0),400);try{let a=await Uie(s);return wi(t.db.db,i,"operator",a),s.redirect(`${r}/operator/${i}`,303)}catch(a){let c=a instanceof q?a.code==="NOT_FOUND"?404:a.code==="CONFLICT"?409:400:500;return pt(s,Be("Answer not recorded",`<p>${U(a instanceof Error?a.message:String(a))}</p><p><a href="${U(r)}/operator/${i}">Back to escalation #${i}</a></p>`,r,{},[],!0),c)}})}function OF(e,t,n=""){let r=n.replace(/\/$/,"");e.get("/",s=>{try{let o=new Date().toISOString(),i=js(t.db.db),a=Object.entries(i.by_status).reduce((g,[w,E])=>g+(mv(w)?E:0),0),c=hv(t.db.db,Date.now()).filter(g=>g.urgent),l=c.length>0?`<section class="warning" role="alert" data-testid="operator-urgent-alert"><p><strong>Urgent operator attention required:</strong> ${et(`${r}/operator`,`${c.length} urgent escalation${c.length===1?"":"s"} awaiting operator answer`)}.</p></section>`:"",u=ou(),d=["epic","task","subtask"].map(g=>et(`${r}/tasks?kind=${g}`,`${i.by_kind[g]??0} ${g}s`)).join(", "),f=u.report===null?"<p>Activity has not yet been observed; running, dead, and idle counts are unknown.</p>":`<p>As of ${u.observedAt?Re(u.observedAt):"an unknown time"}, from the last successful scheduled observation: ${u.report.running.length} running, ${u.report.dead.length} dead, ${u.report.idle.length} idle invocation records.</p>`,m=u.lastError?`<p class="warning">Observer failed${u.lastErrorAt?` ${Re(u.lastErrorAt)}`:""}: ${U(u.lastError)}. ${u.report?"The counts retain the last successful observation.":"No successful observation is available."}</p>`:"",p=t.teams.filter(Q),h="";if(u.report!==null){let g=u.report,w=[...g.running,...g.dead,...g.idle],E=p.filter(y=>!w.some(T=>Di(y,T.target)));if(E.length>0){let y=E.map(T=>`<li>${U(T.name)}: ${U(cu(bp(t.db.db,T,g,Date.now(),{allLocalTeams:p})))}</li>`).join("");h=`<p>${E.length} local team${E.length===1?"":"s"} in no running, dead, or idle record above \u2014 absent, not necessarily stalled; each line names the specific reason nobody has looked recently, when one is known:</p><ul>${y}</ul>`}}let _=`${l}<p data-testid="page-intro">Work is organized as epics \u2192 tasks \u2192 subtasks in the ${et(`${r}/tasks`,"task board")}; actors are sessions that receive prompts and produce answers, visible through ${et(`${r}/running`,"activity and session links")} and the ${et(`${r}/comm/math`,"Math inbox")}. Recorded ownership connects work to an actor, while a recorded answer does not by itself mean the work is complete.</p>
2459
2459
  <section><h2>Work</h2><p>Task-ledger counts read when this page loaded ${Re(o)}: ${i.total} work items \u2014 ${d}.</p>
2460
2460
  <p>${et(`${r}/tasks?attention=1`,`${a} work items needing attention`)} across all kinds: recorded statuses blocked, error, on-hold, or rate-limited.</p></section>
2461
2461
  <section><h2>Actors and activity</h2><p>${t.teams.length} teams in the current registry at page load. Teams group actors; the counts below describe invocation records, not a team or session roster.</p>
2462
2462
  ${f}${m}<p>${et(`${r}/running`,"Open Running / Dead / Idle")}. Running means work in flight, Dead means its process stopped, and Idle means a finished invocation.</p>
2463
- ${h}<p>This page loaded ${Re(o)}; the activity snapshot is separate and may be older. Refreshing this page does not trigger a new activity scan.</p></section>`;return pt(s,Be("Overview",_,r,{},[],!0))}catch(o){return pt(s,Be("Overview unavailable",`<p>${U(o instanceof Error?o.message:String(o))}</p>`,r,{},[],!0),500)}})}function Vie(e,t,n){return`${n.replace(/\/$/,"")}/api/session/${encodeURIComponent(e)}/${encodeURIComponent(t)}?limit=20`}function DF(e,t,n,r={}){let s=n.replace(/\/$/,"");if(s&&(!s.startsWith("/")||s.startsWith("//")||/[?#\\]/.test(s)))throw new Error("Invalid mount path");let o=r.commPageEnabled===!0?`<a href="${U(s)}/comm/math">Math inbox \u2014 review and send</a>`:"",i=r.commEnabled===!0&&e==="math"&&t==="Lead";return`<section id="session-detail" data-canonical-teamfile="${U(r.canonicalTeamfile??"")}" data-comm-page-enabled="${r.commPageEnabled===!0}" data-comm-enabled="${i}" data-team="${U(e)}" data-alias="${U(t)}" data-mount="${U(s)}" data-history="${U(Vie(e,t,s))}">
2463
+ ${h}<p>This page loaded ${Re(o)}; the activity snapshot is separate and may be older. Refreshing this page does not trigger a new activity scan.</p></section>`;return pt(s,Be("Overview",_,r,{},[],!0))}catch(o){return pt(s,Be("Overview unavailable",`<p>${U(o instanceof Error?o.message:String(o))}</p>`,r,{},[],!0),500)}})}function Xie(e,t,n){return`${n.replace(/\/$/,"")}/api/session/${encodeURIComponent(e)}/${encodeURIComponent(t)}?limit=20`}function DF(e,t,n,r={}){let s=n.replace(/\/$/,"");if(s&&(!s.startsWith("/")||s.startsWith("//")||/[?#\\]/.test(s)))throw new Error("Invalid mount path");let o=r.commPageEnabled===!0?`<a href="${U(s)}/comm/math">Math inbox \u2014 review and send</a>`:"",i=r.commEnabled===!0&&e==="math"&&t==="Lead";return`<section id="session-detail" data-canonical-teamfile="${U(r.canonicalTeamfile??"")}" data-comm-page-enabled="${r.commPageEnabled===!0}" data-comm-enabled="${i}" data-team="${U(e)}" data-alias="${U(t)}" data-mount="${U(s)}" data-history="${U(Xie(e,t,s))}">
2464
2464
  <p>Session: <strong>${U(e)}:${U(t)}</strong>. ${t==="Lead"?"Role: lead.":"Role not recorded."} lmauto hosts this page; the session\u2019s team is ${U(e)}.</p>
2465
2465
  <p id="session-purpose">Team purpose is not loaded in this HTML view; JavaScript loads it automatically.</p>
2466
2466
  <p><a href="${U(s)}/running">Observed activity</a> \xB7 <a href="${U(s)}/tasks">Work items</a></p>
@@ -2478,21 +2478,21 @@ ${o?`<p>This timeline shows incoming and outgoing exchanges. ${o} opens requests
2478
2478
  <script>(function () {
2479
2479
  // tsx preserves names using an injected helper; keep serialized source self-contained.
2480
2480
  function __name(value) { return value; }
2481
- return (${Jie.toString()})();
2482
- })();</script>`}function Jie(){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=H=>document.getElementById(H),l=(H,V)=>{c(H).textContent=V},u=(H,V)=>{let Z=document.createElement(H);return Z.textContent=V,Z},d=new Map,f=!1,m=0,p,h=null,_=0,g=0,w=null,E=null,y=H=>!f&&!document.hidden&&H===m,T=()=>{},v=[],A=!1;function I(H){let V=u("span",H),Z=v.find(re=>re.name===H);if(!Z){let re=A?"Recorded label; current actor unresolved":"Recorded label; current team list unavailable";return V.title=`${H} \u2014 ${re}`,/[\\/]/.test(H)&&(V.textContent=H.split(/[\\/]/).at(-1).replace(/\.lmctl(?=:|$)/,"")),V}if(Z.channel==="lmmail")return V.textContent+=" (remote inbox)",V;if(Z.channel==="local"&&Z.leadAlias&&H!=="operator"){let re=u("a",`${Z.name}:${Z.leadAlias}`);re.title="Current configured inbox lead; not a historical sender session",V.textContent="",re.href=`${r}/sessions/${encodeURIComponent(Z.name)}/${encodeURIComponent(Z.leadAlias)}`,V.append(re)}return V}function N(H,V){let Z=u("span","");return Z.append(I(H),u("span"," \u2192 "),I(V)),Z}let x=H=>`${r}/sessions/${encodeURIComponent(t)}/${encodeURIComponent(n)}?queue=${H}`,R=H=>H instanceof Error?H.message:String(H);async function k(H,V){let Z=new AbortController;d.set(Z,V===void 0);let re=setTimeout(()=>Z.abort(),15e3);try{let de=await fetch(H,{method:V===void 0?"GET":"POST",signal:Z.signal,credentials:"same-origin",cache:"no-store",redirect:"error",headers:{Accept:"application/json",...V===void 0?{}:{"Content-Type":"application/json"}},...V===void 0?{}:{body:JSON.stringify(V)}});if(!de.ok)throw new Error(`HTTP ${de.status}; request unsuccessful`);if(!de.headers.get("content-type")?.includes("application/json"))throw new Error("Expected JSON response");let le=de.body.getReader(),ie=new TextDecoder,ye=0,_e="";for(;;){let ee=await le.read();if(ee.done)break;if(ye+=ee.value.byteLength,ye>2e6)throw await le.cancel(),new Error("Response exceeds 2 MB limit");_e+=ie.decode(ee.value,{stream:!0})}return JSON.parse(_e+ie.decode())}finally{clearTimeout(re),d.delete(Z)}}function O(H){return H==="merged"||H==="informational"||H==="retracted"}function D(H,V=!1){if(V){if(H.lifecycle==="queued")return"queued";if(H.lifecycle==="finished")return H.lifecycleBasis==="merged"?"finished \xB7 merged into an earlier message":H.lifecycleBasis==="informational"?"finished \xB7 informational, no reply expected":H.lifecycleBasis==="retracted"?"finished \xB7 retracted, no reply expected":"finished \xB7 reply recorded";if(H.lifecycle==="processing")return H.lifecycleBasis==="confirmed"?"processing \xB7 picked up":"processing \xB7 attempted"}if(H.lifecycle==="finished")return H.lifecycleBasis==="merged"?"finished \u2014 merged into an earlier message, no separate response":H.lifecycleBasis==="informational"?"finished \u2014 informational, no response expected":H.lifecycleBasis==="retracted"?"finished \u2014 retracted, no response expected":"finished \u2014 response recorded";if(H.lifecycle==="queued")return"queued \u2014 waiting for handling";if(H.lifecycle==="processing")return H.lifecycleBasis==="confirmed"?"processing \u2014 picked up by inbox":"processing \u2014 delivery attempted; read not confirmed";throw new Error("Unknown lifecycle in owner response")}let S=null,b=H=>H!==null&&typeof H=="object"&&!Array.isArray(H),L=(H,V)=>typeof H=="string"&&H.trim()?H:V,$=!1;async function j(){if(!$||S===m||f||document.hidden)return;let H=m;S=H,c("session-refresh").disabled=!0;try{let V=await k(s);if(!y(H))return;if(!b(V)||!Array.isArray(V.messages))throw new Error("Recent messages were not supplied by the history source");let Z=V.messages.slice(-20).map(re=>{let de=b(re)?re:{},le=de.content==null?"Message content not recorded.":typeof de.content=="string"?de.content:JSON.stringify(de.content),ie=u("article","");return ie.append(u("h3",L(de.role,"Unknown role")),u("p",L(de.timestamp,"Time not recorded.")),u("pre",le)),ie});c("session-history").dataset.state="ready",c("session-history").replaceChildren(...Z.length?Z:[u("p","No recent messages returned.")]),l("session-history-status",`Latest ${Z.length} messages.${V.truncated===!0?" Older messages are not shown.":""}`),l("session-source",`Provider ${L(V.provider,"not recorded")}; session ${L(V.sessionId,"not recorded")}. Optional bounded provider tail. ${V.truncated===!0?"Older output truncated. ":""}Fetched ${new Date().toISOString()}.`)}catch(V){y(H)&&(c("session-history").dataset.state="error",c("session-history").children.length===0&&c("session-history").replaceChildren(u("p","Recent messages unavailable.")),l("session-history-status","Recent messages unavailable. Try Refresh transcript."),l("session-source",`History unavailable; previous content may be stale. ${R(V)}`))}finally{S===H&&(S=null),y(H)&&(c("session-refresh").disabled=!1)}}async function F(){if(!o||f||document.hidden)return;let H=m;try{let V=new URLSearchParams({ownerTeam:o,ownerAlias:n,limit:"20"}),Z=await k(`${r}/api/tasks?${V}`);if(!y(H))return;if(!Array.isArray(Z.rows))throw new Error("Invalid task response");c("session-tasks").replaceChildren(u("p","Up to 20 assigned work items."),...Z.rows.slice(0,20).map(re=>{let de=u("a",`#${re.id} ${re.title} \u2014 ${re.kind}, ${re.status}`);de.href=`${r}/tasks/${Number(re.id)}`;let le=u("p","");if(le.append(de),Number.isSafeInteger(re.parent_id)&&re.parent_id>0){let ie=u("a",` Parent work item #${re.parent_id}`);ie.href=`${r}/tasks/${re.parent_id}`,le.append(ie)}return le}),...Z.rows.length?[]:[u("p","No recorded assignment for this session.")])}catch(V){y(H)&&l("session-tasks",`Assigned work unavailable: ${R(V)}`)}}async function C(){if(w===_||h===null||f||document.hidden)return;w=_;let H=h,V=_,Z=m;try{let re=await k(`${r}/api/queue/${H}/state`);if(V!==_||!y(Z))return;if(re.id!==H)throw new Error("Queue identity mismatch");if(re.lifecycle==="finished"&&!O(re.lifecycleBasis)&&!re.answer)throw new Error("Finished state has no correlated response");if(re.answer&&re.answer.prompt_queue_id!==H)throw new Error("Answer correlation mismatch");c("comm-state").dataset.queueId=String(H),c("comm-state").dataset.lifecycle=re.lifecycle,c("comm-state").dataset.lifecycleBasis=re.lifecycleBasis,l("comm-state",`Queue #${H}: ${D(re)}. Created ${re.createdAt}. Last checked ${new Date().toISOString()}.`),re.answer?l("comm-response",`${re.answer.answer_text}
2481
+ return (${Vie.toString()})();
2482
+ })();</script>`}function Vie(){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=H=>document.getElementById(H),l=(H,V)=>{c(H).textContent=V},u=(H,V)=>{let Z=document.createElement(H);return Z.textContent=V,Z},d=new Map,f=!1,m=0,p,h=null,_=0,g=0,w=null,E=null,y=H=>!f&&!document.hidden&&H===m,T=()=>{},v=[],A=!1;function I(H){let V=u("span",H),Z=v.find(re=>re.name===H);if(!Z){let re=A?"Recorded label; current actor unresolved":"Recorded label; current team list unavailable";return V.title=`${H} \u2014 ${re}`,/[\\/]/.test(H)&&(V.textContent=H.split(/[\\/]/).at(-1).replace(/\.lmctl(?=:|$)/,"")),V}if(Z.channel==="lmmail")return V.textContent+=" (remote inbox)",V;if(Z.channel==="local"&&Z.leadAlias&&H!=="operator"){let re=u("a",`${Z.name}:${Z.leadAlias}`);re.title="Current configured inbox lead; not a historical sender session",V.textContent="",re.href=`${r}/sessions/${encodeURIComponent(Z.name)}/${encodeURIComponent(Z.leadAlias)}`,V.append(re)}return V}function N(H,V){let Z=u("span","");return Z.append(I(H),u("span"," \u2192 "),I(V)),Z}let x=H=>`${r}/sessions/${encodeURIComponent(t)}/${encodeURIComponent(n)}?queue=${H}`,R=H=>H instanceof Error?H.message:String(H);async function k(H,V){let Z=new AbortController;d.set(Z,V===void 0);let re=setTimeout(()=>Z.abort(),15e3);try{let de=await fetch(H,{method:V===void 0?"GET":"POST",signal:Z.signal,credentials:"same-origin",cache:"no-store",redirect:"error",headers:{Accept:"application/json",...V===void 0?{}:{"Content-Type":"application/json"}},...V===void 0?{}:{body:JSON.stringify(V)}});if(!de.ok)throw new Error(`HTTP ${de.status}; request unsuccessful`);if(!de.headers.get("content-type")?.includes("application/json"))throw new Error("Expected JSON response");let le=de.body.getReader(),ie=new TextDecoder,ye=0,_e="";for(;;){let ee=await le.read();if(ee.done)break;if(ye+=ee.value.byteLength,ye>2e6)throw await le.cancel(),new Error("Response exceeds 2 MB limit");_e+=ie.decode(ee.value,{stream:!0})}return JSON.parse(_e+ie.decode())}finally{clearTimeout(re),d.delete(Z)}}function O(H){return H==="merged"||H==="informational"||H==="retracted"}function D(H,V=!1){if(V){if(H.lifecycle==="queued")return"queued";if(H.lifecycle==="finished")return H.lifecycleBasis==="merged"?"finished \xB7 merged into an earlier message":H.lifecycleBasis==="informational"?"finished \xB7 informational, no reply expected":H.lifecycleBasis==="retracted"?"finished \xB7 retracted, no reply expected":"finished \xB7 reply recorded";if(H.lifecycle==="processing")return H.lifecycleBasis==="confirmed"?"processing \xB7 picked up":"processing \xB7 attempted"}if(H.lifecycle==="finished")return H.lifecycleBasis==="merged"?"finished \u2014 merged into an earlier message, no separate response":H.lifecycleBasis==="informational"?"finished \u2014 informational, no response expected":H.lifecycleBasis==="retracted"?"finished \u2014 retracted, no response expected":"finished \u2014 response recorded";if(H.lifecycle==="queued")return"queued \u2014 waiting for handling";if(H.lifecycle==="processing")return H.lifecycleBasis==="confirmed"?"processing \u2014 picked up by inbox":"processing \u2014 delivery attempted; read not confirmed";throw new Error("Unknown lifecycle in owner response")}let S=null,b=H=>H!==null&&typeof H=="object"&&!Array.isArray(H),L=(H,V)=>typeof H=="string"&&H.trim()?H:V,$=!1;async function j(){if(!$||S===m||f||document.hidden)return;let H=m;S=H,c("session-refresh").disabled=!0;try{let V=await k(s);if(!y(H))return;if(!b(V)||!Array.isArray(V.messages))throw new Error("Recent messages were not supplied by the history source");let Z=V.messages.slice(-20).map(re=>{let de=b(re)?re:{},le=de.content==null?"Message content not recorded.":typeof de.content=="string"?de.content:JSON.stringify(de.content),ie=u("article","");return ie.append(u("h3",L(de.role,"Unknown role")),u("p",L(de.timestamp,"Time not recorded.")),u("pre",le)),ie});c("session-history").dataset.state="ready",c("session-history").replaceChildren(...Z.length?Z:[u("p","No recent messages returned.")]),l("session-history-status",`Latest ${Z.length} messages.${V.truncated===!0?" Older messages are not shown.":""}`),l("session-source",`Provider ${L(V.provider,"not recorded")}; session ${L(V.sessionId,"not recorded")}. Optional bounded provider tail. ${V.truncated===!0?"Older output truncated. ":""}Fetched ${new Date().toISOString()}.`)}catch(V){y(H)&&(c("session-history").dataset.state="error",c("session-history").children.length===0&&c("session-history").replaceChildren(u("p","Recent messages unavailable.")),l("session-history-status","Recent messages unavailable. Try Refresh transcript."),l("session-source",`History unavailable; previous content may be stale. ${R(V)}`))}finally{S===H&&(S=null),y(H)&&(c("session-refresh").disabled=!1)}}async function F(){if(!o||f||document.hidden)return;let H=m;try{let V=new URLSearchParams({ownerTeam:o,ownerAlias:n,limit:"20"}),Z=await k(`${r}/api/tasks?${V}`);if(!y(H))return;if(!Array.isArray(Z.rows))throw new Error("Invalid task response");c("session-tasks").replaceChildren(u("p","Up to 20 assigned work items."),...Z.rows.slice(0,20).map(re=>{let de=u("a",`#${re.id} ${re.title} \u2014 ${re.kind}, ${re.status}`);de.href=`${r}/tasks/${Number(re.id)}`;let le=u("p","");if(le.append(de),Number.isSafeInteger(re.parent_id)&&re.parent_id>0){let ie=u("a",` Parent work item #${re.parent_id}`);ie.href=`${r}/tasks/${re.parent_id}`,le.append(ie)}return le}),...Z.rows.length?[]:[u("p","No recorded assignment for this session.")])}catch(V){y(H)&&l("session-tasks",`Assigned work unavailable: ${R(V)}`)}}async function C(){if(w===_||h===null||f||document.hidden)return;w=_;let H=h,V=_,Z=m;try{let re=await k(`${r}/api/queue/${H}/state`);if(V!==_||!y(Z))return;if(re.id!==H)throw new Error("Queue identity mismatch");if(re.lifecycle==="finished"&&!O(re.lifecycleBasis)&&!re.answer)throw new Error("Finished state has no correlated response");if(re.answer&&re.answer.prompt_queue_id!==H)throw new Error("Answer correlation mismatch");c("comm-state").dataset.queueId=String(H),c("comm-state").dataset.lifecycle=re.lifecycle,c("comm-state").dataset.lifecycleBasis=re.lifecycleBasis,l("comm-state",`Queue #${H}: ${D(re)}. Created ${re.createdAt}. Last checked ${new Date().toISOString()}.`),re.answer?l("comm-response",`${re.answer.answer_text}
2483
2483
  ${re.answer.truncated?`Truncated response; ${re.answer.totalBytes} total bytes. No continuation endpoint available.`:""}`):l("comm-response",re.lifecycleBasis==="merged"?"No separate answer: prompt merged into another prompt.":re.lifecycleBasis==="informational"?"No answer expected: this was an informational prompt.":re.lifecycleBasis==="retracted"?"No answer expected: this prompt was retracted.":"Outcome unknown: no reply recorded. This does not establish failure or unread work."),re.lifecycle!=="finished"&&++g<60?p=setTimeout(()=>void C(),5e3):re.lifecycle!=="finished"&&l("comm-state",`Queue #${H}: observation stalled \u2014 automatic checks paused after 60 reads; last state ${D(re)}. Check again manually. This does not establish execution failure.`)}catch(re){V===_&&y(Z)&&l("comm-state",`State check failed; last content may be stale. ${R(re)}. Check again manually.`)}finally{w===V&&(w=null)}}async function P(H,V=!1){if(!Number.isSafeInteger(H)||H<1||f||document.hidden)return;c("comm-reading-panel").hidden=!1,E={id:H,admitted:V},clearTimeout(p),h=null,_++,g=0;let Z=_,re=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 #${H}\u2026`),l("comm-response",""),l("comm-preview","Loading request preview\u2026"),c("comm-check").hidden=!1;let de=new URL(location.href);de.searchParams.set("queue",String(H)),window.history.replaceState(null,"",de);try{let le=await k(`${r}/api/queue/${H}`);if(Z!==_||!y(re))return;if(le.queue.id!==H)throw new Error("Queue envelope identity mismatch");if(V&&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=H;let ie=c("comm-context");if(ie.replaceChildren(u("span",`Request #${H}: `),N(le.queue.from_id,le.queue.to_id),u("span",". Expected reply context: "),I(le.queue.to_id),u("span",` inbox for prompt #${H} from `),I(le.queue.from_id),u("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&&ie.append(u("span",` Retraction reason: ${le.queue.retracted_reason}.`)),a==="true"&&le.queue.to_id==="math"){let _e=u("a","Open full prompt and answer");_e.href=`${r}/comm/math/prompts/${H}`,ie.append(_e)}let ye=await k(`${r}/api/queue/${H}/preview`);if(Z!==_||!y(re))return;if(ye.id!==H)throw new Error("Preview identity mismatch");l("comm-preview",ye.status==="available"?`${ye.text??""}${ye.truncated?`
2484
2484
  [Prompt preview truncated]`:""}`:`Prompt preview ${ye.status}; content unavailable.`)}catch(le){Z===_&&y(re)&&(l("comm-preview",`Prompt preview unavailable: ${R(le)}`),h===null&&l("comm-state","Queue selection unavailable; select a message from this team."))}await C()}let M=null;async function B(){if(M===m||f||document.hidden)return;let H=m;M=H,c("comm-refresh").disabled=!0;try{let V=await k(`${r}/api/teams`).catch(()=>null);if(!y(H))return;v=V?.teams??[],A=V!==null;let Z=v.find(ee=>ee.name===t),re=Z?.channel==="local"&&typeof Z.description=="string"?Z.description.trim():"";l("session-purpose",V===null?"Team purpose unavailable.":re?`Recorded team description: \u201C${re}\u201D`:"No team purpose recorded.");let de=await Promise.all(["to","from"].map(async ee=>{let ge=await k(`${r}/api/queue/prompts?${ee}=${encodeURIComponent(t)}&limit=20`);if(!Array.isArray(ge.rows))throw new Error("Invalid message list");return ge}));if(!y(H))return;let le=new Map;for(let ee of de)for(let ge of ee.rows.slice(0,20)){if(!Number.isSafeInteger(ge.id)||ge.id<1)throw new Error("Invalid queue identity");if(ge.to_id!==t&&ge.from_id!==t)throw new Error("Message outside current team");let at=le.get(ge.id);(!at||ge.lifecycle==="finished"&&at.lifecycle!=="finished")&&le.set(ge.id,ge)}let ie=ee=>Number.isFinite(Date.parse(ee))?Date.parse(ee):Number.MAX_VALUE,_e=[...le.values()].sort((ee,ge)=>ie(ee.created_ts)-ie(ge.created_ts)||ee.id-ge.id).map(ee=>{let ge=u("li","");ge.dataset.queueId=String(ee.id);let at=u("a",`Read exchange #${ee.id}`);at.href=x(ee.id),at.addEventListener("click",K=>{K.defaultPrevented||K.button!==0||K.metaKey||K.ctrlKey||K.shiftKey||K.altKey||(K.preventDefault(),P(ee.id))}),ge.append(at);let _t=u("div","");_t.dataset.queueId=String(ee.id),_t.dataset.event="request";let gr=Number.isFinite(Date.parse(ee.created_ts))?ee.created_ts:"Time not recorded; placed last by request ID",Lt=u("span",ee.lifecycle==="queued"?"Queued":ee.lifecycle==="processing"?"Processing":ee.lifecycleBasis==="merged"?"Combined":ee.lifecycleBasis==="informational"?"Informational":ee.lifecycleBasis==="retracted"?"Retracted":"Replied");if(Lt.className=`status-chip status-${ee.lifecycle==="queued"?"queued":ee.lifecycle==="processing"?"processing":O(ee.lifecycleBasis)?"muted":"replied"}`,Lt.title=D(ee),_t.append(u("p",`Request recorded: ${gr}`),N(ee.from_id,ee.to_id),Lt),ee.from_id===ee.to_id&&_t.append(u("p","Self-addressed request.")),ee.subject_id!=null&&_t.append(u("p",`Recorded subject label: ${ee.subject_id}`)),ge.append(_t),ee.lifecycle==="finished"&&!O(ee.lifecycleBasis)){let K=u("div","");K.dataset.queueId=String(ee.id),K.dataset.event="response",K.append(u("span","Answer recorded in "),I(ee.to_id),u("span",` inbox for prompt #${ee.id} from `),I(ee.from_id),u("p",`Recorded reply time: ${ee.answeredAt??"Time not recorded"}`));let St=u("details",""),Bt=u("pre","Open to load the recorded reply.");St.append(u("summary","Show reply"),Bt);let Jt=!1,Hn=!1;St.addEventListener("toggle",async()=>{if(!St.open||Jt||Hn||f||document.hidden)return;let An=m;Hn=!0,Bt.textContent="Loading reply\u2026";try{let Ns=await k(`${r}/api/queue/${ee.id}/state`);if(!y(An))return;let ts=Ns.answer;if(Ns.id!==ee.id||ts===null||ts.prompt_queue_id!==ee.id)throw new Error("Answer identity mismatch");if(typeof ts.answer_text!="string")throw new Error("Reply text unavailable");let Ri=Array.from(ts.answer_text);Bt.textContent=Ri.slice(0,1200).join("")+(Ri.length>1200||ts.truncated?`
2485
2485
  [Reply excerpt; open the full exchange for available text.]`:""),Jt=!0}catch(Ns){y(An)&&(Bt.textContent=`Reply unavailable: ${R(Ns)}. Close and reopen to retry.`)}finally{Hn=!1}}),K.append(St),ge.append(K)}else ge.append(u("p",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. Reason: ${ee.retracted_reason??"no reason recorded"}.`:"Reply: not recorded"));return ge});c("comm-sequence").replaceChildren(..._e.slice(-5)),c("comm-older-sequence").replaceChildren(..._e.slice(0,-5)),c("comm-older").hidden=_e.length<=5,l("comm-older-label",`Show ${Math.max(0,_e.length-5)} older loaded prompts`),l("comm-coverage",`Showing newest ${Math.min(5,_e.length)} of ${le.size} loaded prompts, ordered by arrival, oldest first; answers are grouped with their prompts. ${de.some(ee=>ee.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(V){y(H)&&l("comm-coverage",`Message context unavailable; previous events may be stale. ${R(V)}`)}finally{M===H&&(M=null),y(H)&&(c("comm-refresh").disabled=!1)}}let W=c("comm-form");if(W&&i==="true"&&t==="math"&&n==="Lead"){let H=c("comm-draft"),V=c("comm-submit"),Z=c("comm-confirm"),re=c("comm-edit"),de=null,le=!1,ie=!1,ye="Page paused during admission";T=()=>{f||document.hidden||!de||!ie||(Z.disabled=le,le||(l("comm-send-status",`Admission uncertain or failed: ${ye}. Retry preserves the exact prompt and dedupe key. Keep this page open until resolved.`),Z.textContent="Retry same prompt safely"))},W.addEventListener("submit",_e=>{if(_e.preventDefault(),!(f||document.hidden||le||de)){if(!H.value.trim()||new TextEncoder().encode(H.value).length>65536){l("comm-send-status","Enter a nonblank prompt of at most 64 KiB UTF-8.");return}de={to:"math",prompt:H.value,dedupeKey:`localweb:${crypto.randomUUID()}`},H.disabled=!0,V.disabled=!0,l("comm-review",`To math, from operator:
2486
2486
  ${de.prompt}`),c("comm-review").hidden=!1,Z.hidden=!1,re.hidden=!1,l("comm-send-status","Review the exact prompt before confirming.")}}),re.addEventListener("click",()=>{le||ie||(de=null,H.disabled=!1,V.disabled=!1,Z.hidden=!0,re.hidden=!0,c("comm-review").hidden=!0)}),Z.addEventListener("click",async()=>{if(!de||le||f||document.hidden)return;let _e=m;le=!0,ie=!0,Z.disabled=!0,re.hidden=!0,l("comm-send-status","Submitting; waiting for confirmation that the prompt was queued\u2026");try{let ee=await k(`${r}/api/comm/send`,de);if(!y(_e))throw new Error("Page paused before receipt could be shown");if(!Number.isSafeInteger(ee.queueId)||ee.queueId<1)throw new Error("Missing queue receipt");l("comm-send-status",`Accepted as queue #${ee.queueId}${ee.replayed?" (existing prompt recovered)":""}.`),de=null,ie=!1,H.value="",H.disabled=!1,V.disabled=!1,Z.hidden=!0,Z.textContent="Confirm send to math",c("comm-review").hidden=!0,P(ee.queueId,!0),B()}catch(ee){ye=R(ee)}finally{le=!1,!f&&!document.hidden&&(Z.disabled=!1),T()}})}c("session-refresh").addEventListener("click",()=>{$=!0,l("session-refresh","Refresh transcript"),j()}),c("comm-refresh").addEventListener("click",()=>void B()),c("comm-check").addEventListener("click",()=>{clearTimeout(p),g=0,C()});let ne=H=>{m++,_++,clearTimeout(p),S=null,M=null;for(let[V,Z]of d)(H||Z)&&V.abort()},z=()=>{f||document.hidden||($&&j(),F(),B(),E&&P(E.id,E.admitted),T())},ue=()=>{document.hidden?ne(!1):z()};document.addEventListener("visibilitychange",ue);let X=()=>{f=!0,ne(!0),document.removeEventListener("visibilitychange",ue)};window.addEventListener("pagehide",X),window.addEventListener("pageshow",H=>{H.persisted&&(f=!1,document.addEventListener("visibilitychange",ue),z())}),F(),B();let Y=Number(new URL(location.href).searchParams.get("queue"));return Number.isSafeInteger(Y)&&Y>0&&P(Y),X}function $F(e){let{context:t}=e,n=e.config??xe,r=e.remoteStalledConfig??{},s=e.fetchReport??qe,o=e.send??br,i=e.whoami??Yp,a=e.fetchHealth??PU,c=e.heavyLockStatusPath??Wa(),l=e.heavyLockPath??Ga(),u=e.tail??Km,d=e.tailJson??zm,f=new hi;if(e.publish===!0){let S=e.passcodeFilePath!==void 0?e.passcodeFilePath:Ja(t.db.path),b=e.readPasscodeAuthority??(()=>S===null?null:Y$(S));KU(f,{allowedOrigins:e.allowedOrigins,mountPath:e.mountPath,readAuthority:b,...e.remoteKey!==void 0?{remoteKey:e.remoteKey}:{}})}else f.use("*",async(S,b)=>{S.header("Cache-Control","no-store");let L=S.req.header("origin");if(L!==void 0&&!e.allowedOrigins.includes(L))return S.json({error:"origin not allowed"},403);await b()});f.route("/",uF({context:t,allowedOrigins:e.allowedOrigins,mountPath:e.mountPath,enabled:!0})),OF(f,t,e.mountPath),sF(f,{webDistDir:e.webDistDir,mountPath:e.mountPath}),e.includeTaskFeatures!==!1&&EF(f,t,e.mountPath),AF(f,t,e.mountPath),CF(f,t,e.mountPath),f.post("/api/native-session/request",async S=>{let b;try{b=await S.req.json()}catch{return S.json({error:"Expected a JSON native request"},400)}if(!b||typeof b!="object"||Array.isArray(b))return S.json({error:"Expected a JSON native request"},400);let L=b;return!["turn","close"].includes(L.operation)||!L.member||typeof L.member!="object"||Array.isArray(L.member)||typeof L.member.provider!="string"||typeof L.member.sessionid!="string"||L.operation==="turn"&&typeof L.prompt!="string"?S.json({error:"Expected native identity and operation"},400):e.nativeManager?S.json(await e.nativeManager.request(L)):S.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 S=>{let b;try{b=await S.req.json()}catch{return S.json({error:"Expected a JSON request object"},400)}if(!b||typeof b!="object"||Array.isArray(b))return S.json({error:"Expected a JSON request object"},400);let L=b;return typeof L.connection!="string"||typeof L.operation!="string"||L.params!==void 0&&(!L.params||typeof L.params!="object"||Array.isArray(L.params))?S.json({error:"Expected connection, operation and a params object"},400):e.mcpManager?S.json(await e.mcpManager.request({connection:L.connection,operation:L.operation,params:L.params})):S.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=S=>Ze("invalid_argument",S),p=(S,b)=>S.json(b,DT(b)),h=S=>{let b=new URL(S.req.url).searchParams,L=Object.create(null);for(let[$,j]of b.entries()){if(Object.hasOwn(L,$))return S.json(m(`Query parameter ${$} must occur once`),400);L[$]=j}return L};f.post("/api/escalations",async S=>{let b;try{b=await S.req.json()}catch{return p(S,m("Expected a JSON escalation object"))}if(!b||typeof b!="object"||Array.isArray(b))return p(S,m("Expected a JSON escalation object"));try{return p(S,ec(t.db.db,"create",b))}catch{return p(S,Ze("outcome_unknown","Escalation operation outcome is unknown"))}}),f.get("/api/escalations/status",S=>{let b=h(S);if(b instanceof Response)return b;try{return p(S,ec(t.db.db,"status",b))}catch{return p(S,Ze("database_unavailable","Escalation database is unavailable"))}}),f.get("/api/escalations/open",S=>{let b=h(S);if(b instanceof Response)return b;try{return p(S,ec(t.db.db,"list_open",b))}catch{return p(S,Ze("database_unavailable","Escalation database is unavailable"))}}),f.post("/api/escalations/answer",async S=>{let b;try{b=await S.req.json()}catch{return p(S,m("Expected a JSON answer object"))}if(!b||typeof b!="object"||Array.isArray(b))return p(S,m("Expected a JSON answer object"));try{return p(S,ec(t.db.db,"answer",b))}catch{return p(S,Ze("outcome_unknown","Escalation operation outcome is unknown"))}}),f.post("/api/escalations/withdraw",async S=>{let b;try{b=await S.req.json()}catch{return p(S,m("Expected a JSON withdrawal object"))}if(!b||typeof b!="object"||Array.isArray(b))return p(S,m("Expected a JSON withdrawal object"));try{return p(S,ec(t.db.db,"withdraw",b))}catch{return p(S,Ze("outcome_unknown","Escalation operation outcome is unknown"))}}),f.post("/api/jobs/on-demand",async S=>{let b;try{b=await S.req.json()}catch{return S.json({error:"invalid JSON"},400)}if(b===null||typeof b!="object"||Array.isArray(b))return S.json({error:"expected object"},400);let L=b;if(typeof L.db!="string"||typeof L.local_scope!="string"||typeof L.script!="string"||!Array.isArray(L.args)||!L.args.every($=>typeof $=="string")||L.conversationid!==void 0&&typeof L.conversationid!="string")return S.json({error:"invalid on-demand request"},400);try{let $=await fP(t.db.db,t.db.path,t.teams,{db:L.db,localScope:L.local_scope,script:L.script,args:L.args,...typeof L.conversationid=="string"?{conversationId:L.conversationid}:{}});return"status"in $&&$.status==="busy"?S.json($,503):S.json($,202)}catch($){if($ instanceof G||$ instanceof q){let j=$.code==="INVALID_ARGUMENT"||$.code==="INVALID_SCHEDULE"?400:$.code==="NOT_FOUND"?404:$.code==="CONFLICT"?409:$.code==="DB_BUSY"?503:500;return j===503&&S.header("Retry-After","1"),S.json({error:$.message},j)}return S.json({error:$ instanceof Error?$.message:String($)},500)}}),f.get("/api/teams",S=>S.json(ov(t))),f.get("/api/identities/:key",S=>S.json(td(t.teams,S.req.param("key")))),f.get("/api/state",S=>{let b=S.req.query("team");return b!==void 0?S.json(nv(t,b)):S.req.query("active")!==void 0?S.json(rv(t)):S.json(tv(t))}),f.get("/api/status",async S=>{let b=S.req.query("live")==="1"||S.req.query("live")==="true",L=await sv(t,{live:b,fetchReport:s});return S.json(L)}),f.get("/api/liveness",async S=>{let b=await s(),L=t.teams.map($=>{let j=Q($)?null:pd(t.db.db,{site:$.peerSite,team:$.name,alias:$.alias});return{team:$.name,running:Q($)?kt($,b):!1,deadReclaimable:Q($)?qo($,b):!1,remoteOutbound:j?{state:j.state,sentTs:j.sent_ts,ackedTs:j.acked_ts,repliedTs:j.replied_ts}:null}});return S.json({report:b,teams:L})}),f.get("/api/stalled",async S=>{let b=await s(),L=vn(c,l,void 0,F=>{process.stderr.write(`[api/stalled] heavy-lock probe failed, treating conservatively as held: ${F.message}
2487
- `)}),$=await Bi(t.db.db,t.teams.filter(Q),b,L,n,void 0,{readOnly:!0}),j=yP(t.db.db,t.teams.filter(F=>!Q(F)),r);return S.json({stalled:$,remoteStalled:j})});function _(S){let b=t.teams.find($=>$.name===S);if(!b)return{error:`unknown team "${S}"`,status:404};if(!Q(b))return{error:`team "${S}" is a remote team (channel=lmmail) -- not reachable via lctl`,status:400};let L;try{L=se(b)}catch($){return{error:$ instanceof Error?$.message:String($),status:500}}return{teamfilePath:L}}function g(S,b,L,$){return d(S,b,{lines:L?Number(L):20,...$?{since:$}:{}})}let w=(e.mountPath??"").replace(/\/$/,"");f.get("/running",S=>{try{let b=ou(),L=b.report===null?"<p>Activity has not yet been observed; running, dead, and idle counts are unknown.</p>":`<p>Cached observation taken ${b.observedAt?Re(b.observedAt):"at an unknown time"}. Refreshing this page does not run a new activity scan.</p>`,$=b.lastError?`<p class="warning">Observer failed${b.lastErrorAt?` ${Re(b.lastErrorAt)}`:""}: ${U(b.lastError)}. ${b.report?"Showing the last successful observation.":"No successful observation is available."}</p>`:"",j=b.report===null?"":qU(qw(b.report),Io(t.teams),w);return pt(S,Be("Running","<p>This page loaded just now; activity data comes from a separate scheduled observation and may be older.</p>"+L+$+j,w))}catch(b){return pt(S,Be("Running unavailable",`<p>${U(b instanceof Error?b.message:String(b))}</p>`,w),502)}}),f.get("/sessions/:team/:alias",S=>{let b=S.req.param("team"),L=S.req.param("alias"),$=`Session: ${b} / ${L}`,j={"data-page":"session","data-team":b,"data-alias":L},F=_(b);if("error"in F)return pt(S,Be($,`<p role="alert">${U(F.error)}</p>`,w,j),F.status);let C=DF(b,L,w,{canonicalTeamfile:F.teamfilePath,commPageEnabled:!0}),P=Array.from(C.matchAll(/<script>([\s\S]*?)<\/script>/g),M=>M[1]);return pt(S,Be($,C,w,j,P))}),f.get("/api/session/:team/:alias",async S=>{let b=S.req.param("team"),L=S.req.param("alias"),$=_(b);if("error"in $)return S.json({error:$.error},$.status);let{teamfilePath:j}=$,F=S.req.query("since"),C=S.req.query("limit");try{let P=await g(j,L,C,F);return S.json(P)}catch(P){return S.json({error:P instanceof Error?P.message:String(P)},404)}}),f.get("/api/transcript",async S=>{let b=S.req.query("team");if(!b)return S.json({error:"team is required"},400);let L=t.teams.find(P=>P.name===b);if(!L)return S.json({error:`unknown team "${b}"`},404);if(!Q(L))return S.json({error:`team "${b}" is a remote team (channel=lmmail) -- not reachable via lctl`},400);let $=S.req.query("alias")??L.leadAlias,j;try{j=se(L)}catch(P){return S.json({error:P instanceof Error?P.message:String(P)},500)}let F=S.req.query("lines"),C=S.req.query("since");try{let P=await u(j,$,{...F?{lines:Number(F)}:{},...C?{since:C}:{}});return S.json({team:b,alias:$,...P})}catch(P){return S.json({error:P instanceof Error?P.message:String(P)},502)}}),f.get("/api/queue",S=>{let b=S.req.query("to");return S.json(KT(t,b))}),f.get("/api/queue/stats",S=>{try{let b=x(S.req.query("to"),"to");return S.json(ZT(t,b))}catch(b){return y(S,b)}});let E=S=>{try{let b=S.req.query(),L={fromId:x(b.from,"from"),toId:x(b.to,"to"),status:k(b.status),since:O(b.since,"since"),until:O(b.until,"until"),after:v(b.after,"after"),limit:v(b.limit,"limit",200)};return S.json(Vp(t,L))}catch(b){return y(S,b)}};f.get("/api/queue/prompts",E),f.get("/api/queue/:id",S=>{let b=Number(S.req.param("id")),L=rc(t,b);return L?S.json({queue:L}):S.json(Ue("queue_not_found",`no queue entry ${b}`),404)}),f.get("/api/queue/:id/state",S=>{let b=Number(S.req.param("id")),L=vu(t,b);return L?S.json(L):S.json(Ue("queue_not_found",`no queue entry ${b}`),404)}),f.post("/api/queue/:id/answer",async S=>{try{let b=I(S.req.param("id"),"id"),L=await S.req.json().catch(()=>({})),$=x(L.from,"from"),j=x(L.text,"text");if($===void 0||j===void 0)return S.json(Ue("invalid_argument","from and text are required"),400);let F=wi(t.db.db,b,$,j);return S.json({answer:F},202)}catch(b){return y(S,b)}}),f.get("/api/queue/:id/preview",S=>{try{let b=I(S.req.param("id"),"id"),L=So(t,b);return L?S.json(L):S.json(Ue("queue_not_found",`no queue entry ${b}`),404)}catch(b){return y(S,b)}}),f.post("/api/enqueue",async S=>{let b=await S.req.json().catch(()=>({})),L=b.prompt;if(!b.to||!L||!b.from)return S.json({error:"to, prompt, and from are required"},400);if(b.from==="autopilot")return S.json({error:"from: 'autopilot' is reserved for the tool's own automated enqueues"},400);try{let $=e.publish===!0&&b.from==="operator",j=De(t.db.db,t.teams,b.to,L,{from:b.from,...$?{operatorPriority:!0}:{}});return S.json({id:j})}catch($){return S.json({error:$ instanceof Error?$.message:String($)},400)}}),f.post("/api/comm/send",async S=>{try{let b=await S.req.json().catch(()=>({})),L=x(b.to,"to"),$=x(b.prompt,"prompt"),j=x(b.dedupeKey,"dedupeKey");if(L===void 0||$===void 0||j===void 0)return S.json(Ue("invalid_argument","to, prompt, and dedupeKey are required"),400);let F=Zp(t.db.db,t.teams,{to:L,prompt:$,dedupeKey:j});return S.json(F,F.replayed?200:202)}catch(b){return y(S,b)}}),f.post("/api/queue/deliver",async S=>{let b=await s(),L=$s(t.db.db,{teams:t.teams,report:b,...e.remoteMail?{remoteMail:e.remoteMail}:{}});return S.json({delivered:L})}),f.post("/api/queue/retrieve",async S=>{let b=await S.req.json().catch(()=>({}));if(!b.to)return S.json({error:"to is required"},400);if(b.id!==void 0&&(!Number.isInteger(b.id)||b.id<=0))return S.json({error:"id must be a positive integer"},400);try{let $=yd(t.db.db,b.to,b.id).map(j=>{let F;try{F=Yie(j.prompt_file,"utf8")}catch{F="(could not read prompt file)"}return{...j,content:F}});return S.json({retrieved:$})}catch(L){return y(S,L)}}),f.get("/api/inbox",S=>{let b=S.req.query("to");return b?S.json(QT(t,b)):S.json(Ue("to_required","to is required"),400)});function y(S,b){if(b instanceof q){let L=b.code==="NOT_FOUND"?404:b.code==="CONFLICT"?409:b.code==="DB_BUSY"?503:b.code==="STORAGE_ERROR"?500:400;return S.json(Ue(b.code,b.message),L)}return S.json(Ue("internal_error",b instanceof Error?b.message:String(b)),500)}let T=new Set(["epic","task","subtask"]);function v(S,b,L){if(S===void 0)return;let $=Number(S);if(!/^[1-9]\d*$/.test(S)||!Number.isSafeInteger($)||L!==void 0&&$>L)throw new q("INVALID_ARGUMENT",L!==void 0?`${b} must be a positive integer <= ${L}`:`${b} must be a positive integer`);return $}function A(S,b){if(S===void 0)return;let L=Number(S);if(!/^\d+$/.test(S)||!Number.isSafeInteger(L))throw new q("INVALID_ARGUMENT",`${b} must be a nonnegative integer`);return L}function I(S,b){let L=Number(S);if(!/^[1-9]\d*$/.test(S)||!Number.isSafeInteger(L))throw new q("INVALID_ARGUMENT",`${b} must be a positive integer`);return L}function N(S){if(S!==void 0){if(!T.has(S))throw new q("INVALID_ARGUMENT","kind must be 'epic', 'task', or 'subtask'");return S}}function x(S,b){if(S!==void 0){if(S.trim()==="")throw new q("INVALID_ARGUMENT",`${b} must not be blank`);return S}}function R(S,b){if(S!==void 0){if(S==="1"||S==="true")return!0;if(S==="0"||S==="false")return!1;throw new q("INVALID_ARGUMENT",`${b} must be '1'/'true' or '0'/'false'`)}}function k(S){if(S!==void 0){if(!g_.includes(S))throw new q("INVALID_ARGUMENT",`status must be one of: ${g_.join(", ")}`);return S}}function O(S,b){if(S===void 0)return;let L=S.trim()===""?NaN:Date.parse(S);if(Number.isNaN(L))throw new q("INVALID_ARGUMENT",`${b} must be a valid ISO8601 date-time string`);return new Date(L).toISOString()}function D(S,b){let L=x(S,"ownerTeam"),$=x(b,"ownerAlias");if(!(L===void 0&&$===void 0)){if(L===void 0||$===void 0)throw new q("INVALID_ARGUMENT","ownerTeam and ownerAlias must both be given");return{team:L,alias:$}}}return e.includeTaskFeatures!==!1&&(f.get("/api/tasks",S=>{let b=S.req.query();try{let L={project:x(b.project,"project"),kind:N(b.kind),status:x(b.status,"status"),parentId:v(b.parentId,"parentId"),owner:D(b.ownerTeam,b.ownerAlias),unassigned:R(b.unassigned,"unassigned"),limit:v(b.limit,"limit",Ke),after:A(b.after,"after")};return S.json(Ps(t.db.db,L))}catch(L){return y(S,L)}}),f.get("/api/tasks/summary",S=>{try{let b=v(S.req.query("id"),"id"),L=x(S.req.query("project"),"project");return S.json(js(t.db.db,{id:b,project:L}))}catch(b){return y(S,b)}}),f.get("/api/tasks/:id",S=>{try{let b=I(S.req.param("id"),"id");return S.json(Us(t.db.db,b))}catch(b){return y(S,b)}}),f.get("/api/tasks/:id/tree",S=>{try{let b=I(S.req.param("id"),"id");return S.json(Fs(t.db.db,b))}catch(b){return y(S,b)}}),f.get("/api/tasks/:id/notes",S=>{try{let b=I(S.req.param("id"),"id"),L=A(S.req.query("after"),"after"),$=v(S.req.query("limit"),"limit",Ke);return S.json(NA(t.db.db,b,{limit:$,after:L}))}catch(b){return y(S,b)}})),f.post("/api/send",async S=>{let b=await S.req.json().catch(()=>({})),L=b.prompt;if(!b.team||!L)return S.json({error:"team and prompt are required"},400);let $=t.teams.find(P=>P.name===b.team);if(!$)return S.json({error:`unknown team "${b.team}"`},404);if(!Q($))return S.json({error:`team "${b.team}" is a remote team (channel=lmmail) -- not reachable via lctl`},400);let j=await o({teamfilePath:se($),alias:$.leadAlias},L),F=tc(j),C=Date.now();return os(t.db.db,$.name,F.status,C),Wt(t.db.db,$.name,F.status,C,{note:"web send"}),S.json({status:F.status,outcome:j})}),f.get("/api/history",S=>{let b=S.req.query("team"),L=S.req.query("limit"),$=UT(t,b,L);return"error"in $?S.json($,400):S.json($)}),f.get("/api/sources",S=>S.json(ev(t))),f.get("/api/mail/status",S=>S.json(FT(t))),f.get("/api/subscriptions",async S=>{let{status:b,body:L}=await UU();return S.json(L,b)}),f.get("/api/whoami",async S=>{let{data:b,exitCode:L}=await i();return"error"in b?S.json(b,L===4?502:400):S.json(b)}),f.get("/api/running",async S=>S.json(await s())),f.get("/api/running/humanized",async S=>S.json(qw(await s()))),f.get("/api/running/observed",S=>S.json(ou())),f.get("/api/heavy-lock",S=>{try{return S.json(Hw(c,l))}catch(b){if(b instanceof Ba)return S.json(Ue("heavy_lock_probe_failed",b.message),502);throw b}}),f.get("/api/health",async S=>{let b=S.req.query("target");if(!b)return S.json(Ue("target_required","target is required"),400);try{let L=await a(b);return S.json(L)}catch(L){return S.json(Ue("health_fetch_failed",L instanceof Error?L.message:String(L)),502)}}),f.post("/api/sources",async S=>{let b=await S.req.json().catch(()=>({}));if(!b.path)return S.json({error:"path is required"},400);let L=Jp(t,b.path,b.label??void 0);return L.ok?(t.teams=Os(t.db.db,t.teamsConfPath),S.json({ok:!0})):S.json({error:L.output},400)}),f.delete("/api/sources",S=>{let b=S.req.query("path");return b?(rd(t.db.db,b),t.teams=Os(t.db.db,t.teamsConfPath),S.json({ok:!0})):S.json({error:"path is required"},400)}),f}function gv(e){return e.teams=Os(e.db.db,e.teamsConfPath),e.teams}var Kie=4173,zie="127.0.0.1";function MF(e){if(process.env.LMBEE_SITE_UUID!==void 0)try{let E=Ar(e.context.db.db,void 0,process.env.LMBEE_SITE_UUID);if(e.remoteMail&&e.remoteMail.localSiteId!==E)throw new Error("Remote mail site identity conflicts with the database binding")}catch(E){return Promise.reject(E)}let t=e.port??Kie,n=e.hostname??zie,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=fu(e.context.db.path),i=null;if(o!==null)try{i=Va(o,e.lockOwnerLabel??"lmbee-serve")}catch(E){return Promise.reject(E)}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,u,d,f,m,p,h=null,_=null,g=null,w=null;try{let E=e.passcodeFilePath??Ja(e.context.db.path);r&&E!==null&&Op(E);let y=e.mcpConfigPath??process.env.LMBEE_MCP_CONFIG;if(l=e.mcpManager??(y?new Cl({connections:qy(y).connections}):void 0),e.nativeManager)u=e.nativeManager;else{let v=Cg({env:{...process.env},cwd:process.cwd(),dbPath:e.context.db.path,interactive:!1});if(v.status!=="ok")throw Error(v.error);u=new bm({context:v,ownsContext:!0})}d=$F({nativeManager:u,mcpManager:l,context:e.context,allowedOrigins:a,publish:r,includeTaskFeatures:e.includeTaskFeatures,passcodeFilePath:E,...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 T=e.mountPath?.endsWith("/")?e.mountPath.slice(0,-1):e.mountPath;if(T?f=new hi().route(T,d).get(`${T}/`,async v=>{let A=new URL(v.req.url);A.pathname="/",A.search="";let I=await d.fetch(new Request(A,{method:"GET",headers:v.req.raw.headers}));return I.ok?v.redirect(T,302):I}):f=d,m=j$({db:e.context.db.db,getTeams:()=>gv(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:v=>{process.stderr.write(`[cron] tick: watch=${v.watch.why}, ${v.stalled.length} stalled (${v.stalled.join(", ")||"none"})${v.maintainerWoken?", maintainer woken":""}${v.autoContinued.length?`, auto-continued (${v.autoContinued.join(", ")})`:""}
2487
+ `)}),$=await Bi(t.db.db,t.teams.filter(Q),b,L,n,void 0,{readOnly:!0}),j=yP(t.db.db,t.teams.filter(F=>!Q(F)),r);return S.json({stalled:$,remoteStalled:j})});function _(S){let b=t.teams.find($=>$.name===S);if(!b)return{error:`unknown team "${S}"`,status:404};if(!Q(b))return{error:`team "${S}" is a remote team (channel=lmmail) -- not reachable via lctl`,status:400};let L;try{L=se(b)}catch($){return{error:$ instanceof Error?$.message:String($),status:500}}return{teamfilePath:L}}function g(S,b,L,$){return d(S,b,{lines:L?Number(L):20,...$?{since:$}:{}})}let w=(e.mountPath??"").replace(/\/$/,"");f.get("/running",S=>{try{let b=ou(),L=b.report===null?"<p>Activity has not yet been observed; running, dead, and idle counts are unknown.</p>":`<p>Cached observation taken ${b.observedAt?Re(b.observedAt):"at an unknown time"}. Refreshing this page does not run a new activity scan.</p>`,$=b.lastError?`<p class="warning">Observer failed${b.lastErrorAt?` ${Re(b.lastErrorAt)}`:""}: ${U(b.lastError)}. ${b.report?"Showing the last successful observation.":"No successful observation is available."}</p>`:"",j=b.report===null?"":qU(qw(b.report),Io(t.teams),w);return pt(S,Be("Running","<p>This page loaded just now; activity data comes from a separate scheduled observation and may be older.</p>"+L+$+j,w))}catch(b){return pt(S,Be("Running unavailable",`<p>${U(b instanceof Error?b.message:String(b))}</p>`,w),502)}}),f.get("/sessions/:team/:alias",S=>{let b=S.req.param("team"),L=S.req.param("alias"),$=`Session: ${b} / ${L}`,j={"data-page":"session","data-team":b,"data-alias":L},F=_(b);if("error"in F)return pt(S,Be($,`<p role="alert">${U(F.error)}</p>`,w,j),F.status);let C=DF(b,L,w,{canonicalTeamfile:F.teamfilePath,commPageEnabled:!0}),P=Array.from(C.matchAll(/<script>([\s\S]*?)<\/script>/g),M=>M[1]);return pt(S,Be($,C,w,j,P))}),f.get("/api/session/:team/:alias",async S=>{let b=S.req.param("team"),L=S.req.param("alias"),$=_(b);if("error"in $)return S.json({error:$.error},$.status);let{teamfilePath:j}=$,F=S.req.query("since"),C=S.req.query("limit");try{let P=await g(j,L,C,F);return S.json(P)}catch(P){return S.json({error:P instanceof Error?P.message:String(P)},404)}}),f.get("/api/transcript",async S=>{let b=S.req.query("team");if(!b)return S.json({error:"team is required"},400);let L=t.teams.find(P=>P.name===b);if(!L)return S.json({error:`unknown team "${b}"`},404);if(!Q(L))return S.json({error:`team "${b}" is a remote team (channel=lmmail) -- not reachable via lctl`},400);let $=S.req.query("alias")??L.leadAlias,j;try{j=se(L)}catch(P){return S.json({error:P instanceof Error?P.message:String(P)},500)}let F=S.req.query("lines"),C=S.req.query("since");try{let P=await u(j,$,{...F?{lines:Number(F)}:{},...C?{since:C}:{}});return S.json({team:b,alias:$,...P})}catch(P){return S.json({error:P instanceof Error?P.message:String(P)},502)}}),f.get("/api/queue",S=>{let b=S.req.query("to");return S.json(KT(t,b))}),f.get("/api/queue/stats",S=>{try{let b=x(S.req.query("to"),"to");return S.json(ZT(t,b))}catch(b){return y(S,b)}});let E=S=>{try{let b=S.req.query(),L={fromId:x(b.from,"from"),toId:x(b.to,"to"),status:k(b.status),since:O(b.since,"since"),until:O(b.until,"until"),after:v(b.after,"after"),limit:v(b.limit,"limit",200)};return S.json(Vp(t,L))}catch(b){return y(S,b)}};f.get("/api/queue/prompts",E),f.get("/api/queue/:id",S=>{let b=Number(S.req.param("id")),L=rc(t,b);return L?S.json({queue:L}):S.json(Ue("queue_not_found",`no queue entry ${b}`),404)}),f.get("/api/queue/:id/state",S=>{let b=Number(S.req.param("id")),L=vu(t,b);return L?S.json(L):S.json(Ue("queue_not_found",`no queue entry ${b}`),404)}),f.post("/api/queue/:id/answer",async S=>{try{let b=I(S.req.param("id"),"id"),L=await S.req.json().catch(()=>({})),$=x(L.from,"from"),j=x(L.text,"text");if($===void 0||j===void 0)return S.json(Ue("invalid_argument","from and text are required"),400);let F=wi(t.db.db,b,$,j);return S.json({answer:F},202)}catch(b){return y(S,b)}}),f.get("/api/queue/:id/preview",S=>{try{let b=I(S.req.param("id"),"id"),L=So(t,b);return L?S.json(L):S.json(Ue("queue_not_found",`no queue entry ${b}`),404)}catch(b){return y(S,b)}}),f.post("/api/enqueue",async S=>{let b=await S.req.json().catch(()=>({})),L=b.prompt;if(!b.to||!L||!b.from)return S.json({error:"to, prompt, and from are required"},400);if(b.from==="autopilot")return S.json({error:"from: 'autopilot' is reserved for the tool's own automated enqueues"},400);try{let $=e.publish===!0&&b.from==="operator",j=De(t.db.db,t.teams,b.to,L,{from:b.from,...$?{operatorPriority:!0}:{}});return S.json({id:j})}catch($){return S.json({error:$ instanceof Error?$.message:String($)},400)}}),f.post("/api/comm/send",async S=>{try{let b=await S.req.json().catch(()=>({})),L=x(b.to,"to"),$=x(b.prompt,"prompt"),j=x(b.dedupeKey,"dedupeKey");if(L===void 0||$===void 0||j===void 0)return S.json(Ue("invalid_argument","to, prompt, and dedupeKey are required"),400);let F=Zp(t.db.db,t.teams,{to:L,prompt:$,dedupeKey:j});return S.json(F,F.replayed?200:202)}catch(b){return y(S,b)}}),f.post("/api/queue/deliver",async S=>{let b=await s(),L=$s(t.db.db,{teams:t.teams,report:b,...e.remoteMail?{remoteMail:e.remoteMail}:{}});return S.json({delivered:L})}),f.post("/api/queue/retrieve",async S=>{let b=await S.req.json().catch(()=>({}));if(!b.to)return S.json({error:"to is required"},400);if(b.id!==void 0&&(!Number.isInteger(b.id)||b.id<=0))return S.json({error:"id must be a positive integer"},400);try{let $=yd(t.db.db,b.to,b.id).map(j=>{let F;try{F=Jie(j.prompt_file,"utf8")}catch{F="(could not read prompt file)"}return{...j,content:F}});return S.json({retrieved:$})}catch(L){return y(S,L)}}),f.get("/api/inbox",S=>{let b=S.req.query("to");return b?S.json(QT(t,b)):S.json(Ue("to_required","to is required"),400)});function y(S,b){if(b instanceof q){let L=b.code==="NOT_FOUND"?404:b.code==="CONFLICT"?409:b.code==="DB_BUSY"?503:b.code==="STORAGE_ERROR"?500:400;return S.json(Ue(b.code,b.message),L)}return S.json(Ue("internal_error",b instanceof Error?b.message:String(b)),500)}let T=new Set(["epic","task","subtask"]);function v(S,b,L){if(S===void 0)return;let $=Number(S);if(!/^[1-9]\d*$/.test(S)||!Number.isSafeInteger($)||L!==void 0&&$>L)throw new q("INVALID_ARGUMENT",L!==void 0?`${b} must be a positive integer <= ${L}`:`${b} must be a positive integer`);return $}function A(S,b){if(S===void 0)return;let L=Number(S);if(!/^\d+$/.test(S)||!Number.isSafeInteger(L))throw new q("INVALID_ARGUMENT",`${b} must be a nonnegative integer`);return L}function I(S,b){let L=Number(S);if(!/^[1-9]\d*$/.test(S)||!Number.isSafeInteger(L))throw new q("INVALID_ARGUMENT",`${b} must be a positive integer`);return L}function N(S){if(S!==void 0){if(!T.has(S))throw new q("INVALID_ARGUMENT","kind must be 'epic', 'task', or 'subtask'");return S}}function x(S,b){if(S!==void 0){if(S.trim()==="")throw new q("INVALID_ARGUMENT",`${b} must not be blank`);return S}}function R(S,b){if(S!==void 0){if(S==="1"||S==="true")return!0;if(S==="0"||S==="false")return!1;throw new q("INVALID_ARGUMENT",`${b} must be '1'/'true' or '0'/'false'`)}}function k(S){if(S!==void 0){if(!g_.includes(S))throw new q("INVALID_ARGUMENT",`status must be one of: ${g_.join(", ")}`);return S}}function O(S,b){if(S===void 0)return;let L=S.trim()===""?NaN:Date.parse(S);if(Number.isNaN(L))throw new q("INVALID_ARGUMENT",`${b} must be a valid ISO8601 date-time string`);return new Date(L).toISOString()}function D(S,b){let L=x(S,"ownerTeam"),$=x(b,"ownerAlias");if(!(L===void 0&&$===void 0)){if(L===void 0||$===void 0)throw new q("INVALID_ARGUMENT","ownerTeam and ownerAlias must both be given");return{team:L,alias:$}}}return e.includeTaskFeatures!==!1&&(f.get("/api/tasks",S=>{let b=S.req.query();try{let L={project:x(b.project,"project"),kind:N(b.kind),status:x(b.status,"status"),parentId:v(b.parentId,"parentId"),owner:D(b.ownerTeam,b.ownerAlias),unassigned:R(b.unassigned,"unassigned"),limit:v(b.limit,"limit",Ke),after:A(b.after,"after")};return S.json(Ps(t.db.db,L))}catch(L){return y(S,L)}}),f.get("/api/tasks/summary",S=>{try{let b=v(S.req.query("id"),"id"),L=x(S.req.query("project"),"project");return S.json(js(t.db.db,{id:b,project:L}))}catch(b){return y(S,b)}}),f.get("/api/tasks/:id",S=>{try{let b=I(S.req.param("id"),"id");return S.json(Us(t.db.db,b))}catch(b){return y(S,b)}}),f.get("/api/tasks/:id/tree",S=>{try{let b=I(S.req.param("id"),"id");return S.json(Fs(t.db.db,b))}catch(b){return y(S,b)}}),f.get("/api/tasks/:id/notes",S=>{try{let b=I(S.req.param("id"),"id"),L=A(S.req.query("after"),"after"),$=v(S.req.query("limit"),"limit",Ke);return S.json(NA(t.db.db,b,{limit:$,after:L}))}catch(b){return y(S,b)}})),f.post("/api/send",async S=>{let b=await S.req.json().catch(()=>({})),L=b.prompt;if(!b.team||!L)return S.json({error:"team and prompt are required"},400);let $=t.teams.find(P=>P.name===b.team);if(!$)return S.json({error:`unknown team "${b.team}"`},404);if(!Q($))return S.json({error:`team "${b.team}" is a remote team (channel=lmmail) -- not reachable via lctl`},400);let j=await o({teamfilePath:se($),alias:$.leadAlias},L),F=tc(j),C=Date.now();return os(t.db.db,$.name,F.status,C),Wt(t.db.db,$.name,F.status,C,{note:"web send"}),S.json({status:F.status,outcome:j})}),f.get("/api/history",S=>{let b=S.req.query("team"),L=S.req.query("limit"),$=UT(t,b,L);return"error"in $?S.json($,400):S.json($)}),f.get("/api/sources",S=>S.json(ev(t))),f.get("/api/mail/status",S=>S.json(FT(t))),f.get("/api/subscriptions",async S=>{let{status:b,body:L}=await UU();return S.json(L,b)}),f.get("/api/whoami",async S=>{let{data:b,exitCode:L}=await i();return"error"in b?S.json(b,L===4?502:400):S.json(b)}),f.get("/api/running",async S=>S.json(await s())),f.get("/api/running/humanized",async S=>S.json(qw(await s()))),f.get("/api/running/observed",S=>S.json(ou())),f.get("/api/heavy-lock",S=>{try{return S.json(Hw(c,l))}catch(b){if(b instanceof Ba)return S.json(Ue("heavy_lock_probe_failed",b.message),502);throw b}}),f.get("/api/health",async S=>{let b=S.req.query("target");if(!b)return S.json(Ue("target_required","target is required"),400);try{let L=await a(b);return S.json(L)}catch(L){return S.json(Ue("health_fetch_failed",L instanceof Error?L.message:String(L)),502)}}),f.post("/api/sources",async S=>{let b=await S.req.json().catch(()=>({}));if(!b.path)return S.json({error:"path is required"},400);let L=Jp(t,b.path,b.label??void 0);return L.ok?(t.teams=Os(t.db.db,t.teamsConfPath),S.json({ok:!0})):S.json({error:L.output},400)}),f.delete("/api/sources",S=>{let b=S.req.query("path");return b?(rd(t.db.db,b),t.teams=Os(t.db.db,t.teamsConfPath),S.json({ok:!0})):S.json({error:"path is required"},400)}),f}function gv(e){return e.teams=Os(e.db.db,e.teamsConfPath),e.teams}var Yie={start(){},stop(){},async deliverNow(){return 0},isRunning(){return!1},isDelivering(){return!1}},Kie=4173,zie="127.0.0.1";function MF(e){if(process.env.LMBEE_SITE_UUID!==void 0)try{let E=Ar(e.context.db.db,void 0,process.env.LMBEE_SITE_UUID);if(e.remoteMail&&e.remoteMail.localSiteId!==E)throw new Error("Remote mail site identity conflicts with the database binding")}catch(E){return Promise.reject(E)}let t=e.port??Kie,n=e.hostname??zie,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=fu(e.context.db.path),i=null;if(o!==null)try{i=Va(o,e.lockOwnerLabel??"lmbee-serve")}catch(E){return Promise.reject(E)}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,u,d,f,m,p=Yie,h=null,_=null,g=null,w=null;try{let E=e.passcodeFilePath??Ja(e.context.db.path);r&&E!==null&&Op(E);let y=e.mcpConfigPath??process.env.LMBEE_MCP_CONFIG;if(l=e.mcpManager??(y?new Cl({connections:qy(y).connections}):void 0),e.nativeManager)u=e.nativeManager;else{let v=Cg({env:{...process.env},cwd:process.cwd(),dbPath:e.context.db.path,interactive:!1});if(v.status!=="ok")throw Error(v.error);u=new bm({context:v,ownsContext:!0})}d=$F({nativeManager:u,mcpManager:l,context:e.context,allowedOrigins:a,publish:r,includeTaskFeatures:e.includeTaskFeatures,passcodeFilePath:E,...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 T=e.mountPath?.endsWith("/")?e.mountPath.slice(0,-1):e.mountPath;if(T?f=new hi().route(T,d).get(`${T}/`,async v=>{let A=new URL(v.req.url);A.pathname="/",A.search="";let I=await d.fetch(new Request(A,{method:"GET",headers:v.req.raw.headers}));return I.ok?v.redirect(T,302):I}):f=d,m=j$({db:e.context.db.db,getTeams:()=>gv(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:v=>{process.stderr.write(`[cron] tick: watch=${v.watch.why}, ${v.stalled.length} stalled (${v.stalled.join(", ")||"none"})${v.maintainerWoken?", maintainer woken":""}${v.autoContinued.length?`, auto-continued (${v.autoContinued.join(", ")})`:""}
2488
2488
  `)},onError:v=>{process.stderr.write(`[cron] tick failed: ${v instanceof Error?v.stack??v.message:String(v)}
2489
- `)}}),p=nP({db:e.context.db.db,getTeams:()=>gv(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:v=>{v>0&&process.stderr.write(`[queue] delivered ${v}
2489
+ `)}}),e.queueDelivery!==!1&&(p=nP({db:e.context.db.db,getTeams:()=>gv(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:v=>{v>0&&process.stderr.write(`[queue] delivered ${v}
2490
2490
  `)},onError:v=>{process.stderr.write(`[queue] delivery pass failed: ${v instanceof Error?v.stack??v.message:String(v)}
2491
- `)}}),e.remoteMail){let v=e.remoteMail;h=tP({db:e.context.db.db,client:v.client,mailbox:v.mailbox,worker:{localSiteId:v.localSiteId,allowlist:v.allowlist,dispatch:A=>Q$(e.context.db.db,gv(e.context),A,{client:v.client,localSiteId:v.localSiteId})},...v.intervalMs!==void 0?{intervalMs:v.intervalMs}:{},onPoll:A=>{if(v.onPoll?.(A),A.recorded>0||A.retriedFailed>0){let I=e.fetchReport??qe,N=e.deliverImpl??$s;I().then(x=>N(e.context.db.db,{teams:e.context.teams,report:x,...c?{remoteMail:c}:{}})).catch(x=>{process.stderr.write(`[mail] prompt-delivery trigger failed: ${x instanceof Error?x.stack??x.message:String(x)}
2491
+ `)}})),e.remoteMail){let v=e.remoteMail;h=tP({db:e.context.db.db,client:v.client,mailbox:v.mailbox,worker:{localSiteId:v.localSiteId,allowlist:v.allowlist,dispatch:A=>Q$(e.context.db.db,gv(e.context),A,{client:v.client,localSiteId:v.localSiteId})},...v.intervalMs!==void 0?{intervalMs:v.intervalMs}:{},onPoll:A=>{if(v.onPoll?.(A),A.recorded>0||A.retriedFailed>0){let I=e.fetchReport??qe,N=e.deliverImpl??$s;I().then(x=>N(e.context.db.db,{teams:e.context.teams,report:x,...c?{remoteMail:c}:{}})).catch(x=>{process.stderr.write(`[mail] prompt-delivery trigger failed: ${x instanceof Error?x.stack??x.message:String(x)}
2492
2492
  `)})}},onError:v.onMailError??(A=>{process.stderr.write(`[mail] poll failed: ${A instanceof Error?A.stack??A.message:String(A)}
2493
- `)})})}if(e.execWorker){let v=e.execWorker;_=(v.createExecWorkerImpl??Dp)({client:v.client,mailbox:v.mailbox,adminUsers:v.adminUsers,allowUsers:v.allowUsers,allowAnonymous:v.allowAnonymous,...v.pollIntervalMs!==void 0?{pollIntervalMs:v.pollIntervalMs}:{},...v.timeoutCapSeconds!==void 0?{timeoutCapSeconds:v.timeoutCapSeconds}:{}})}e.remoteExecute&&!e.execWorker&&(g=MM({...e.remoteExecute,db:e.context.db.db})),e.recentAgents&&(w=zM({...e.recentAgents,db:e.context.db.db}))}catch(E){throw l?.cancel(),u?.cancel(),i?.release(),E}return new Promise((E,y)=>{let T=!1,v;try{v=kC({fetch:f.fetch,port:t,hostname:n},A=>{if(t===0&&a.push(`http://${s}:${A.port}`,`http://localhost:${A.port}`,`http://[::1]:${A.port}`),T=!0,m.start(),p.start(),h&&e.remoteMail){let I=e.remoteMail;(I.ensureMailboxImpl??eP)(I.client,I.mailbox).then(()=>h?.start()).catch(x=>{process.stderr.write(`[mail] mailbox provisioning failed, mail lane stays dormant this run: ${x instanceof Error?x.stack??x.message:String(x)}
2493
+ `)})})}if(e.execWorker){let v=e.execWorker;_=(v.createExecWorkerImpl??Dp)({client:v.client,mailbox:v.mailbox,adminUsers:v.adminUsers,allowUsers:v.allowUsers,allowAnonymous:v.allowAnonymous,...v.pollIntervalMs!==void 0?{pollIntervalMs:v.pollIntervalMs}:{},...v.timeoutCapSeconds!==void 0?{timeoutCapSeconds:v.timeoutCapSeconds}:{}})}e.remoteExecute&&!e.execWorker&&(g=MM({...e.remoteExecute,db:e.context.db.db})),e.recentAgents&&(w=zM({...e.recentAgents,db:e.context.db.db}))}catch(E){throw l?.cancel(),u?.cancel(),i?.release(),E}return new Promise((E,y)=>{let T=!1,v;try{v=kC({fetch:f.fetch,port:t,hostname:n},A=>{if(t===0&&a.push(`http://${s}:${A.port}`,`http://localhost:${A.port}`,`http://[::1]:${A.port}`),T=!0,m.start(),p?.start(),h&&e.remoteMail){let I=e.remoteMail;(I.ensureMailboxImpl??eP)(I.client,I.mailbox).then(()=>h?.start()).catch(x=>{process.stderr.write(`[mail] mailbox provisioning failed, mail lane stays dormant this run: ${x instanceof Error?x.stack??x.message:String(x)}
2494
2494
  `),I.onMailError?.(x)})}if(_&&e.execWorker){let I=e.execWorker;(I.ensureExecMailboxImpl??kM)(I.client,I.mailbox).then(()=>_?.start()).catch(x=>{process.stderr.write(`[exec-worker] mailbox provisioning failed, exec stays dormant this run: ${x instanceof Error?x.stack??x.message:String(x)}
2495
- `)})}g?.start(),w?.start(),E({app:d,scheduler:m,queueScheduler:p,mailScheduler:h,execWorker:_,remoteExecute:g,recentAgents:w,server:v,port:A.port,hostname:n,close(){l?.cancel(),u?.cancel(),m.stop(),p.stop(),h?.stop(),_?.stop(),g?.stop(),w?.stop(),v.close(),i?.release()},async shutdown(){let I=l?.shutdown()??Promise.resolve(),N=u?.shutdown()??Promise.resolve();m.stop(),p.stop(),h?.stop(),_?.stop(),g?.stop(),w?.stop();let x=new Promise((D,S)=>{v.close(b=>b?S(b):D())}),R=(async()=>{for(;m.isTicking()||p.isDelivering()||(h?.isPolling()??!1);)await new Promise(D=>setTimeout(D,50))})(),O=(await Promise.allSettled([I,N,x,R,_?.whenIdle()??Promise.resolve(),g?.whenIdle()??Promise.resolve(),w?.whenIdle()??Promise.resolve()])).flatMap(D=>D.status==="rejected"?[D.reason]:[]);if(O.length)throw new AggregateError(O,"Service cleanup failed: "+O.map(String).join("; "));i?.release()}})})}catch(A){l?.cancel(),u?.cancel(),i?.release(),y(A instanceof Error?A:new Error(String(A)));return}(l||u)&&("requestTimeout"in v&&(v.requestTimeout=0),"headersTimeout"in v&&(v.headersTimeout=0),v.setTimeout(0)),v.on("error",A=>{if(T){process.stderr.write(`[serve] post-bind server error (ignored -- lock/scheduler untouched): ${A instanceof Error?A.stack??A.message:String(A)}
2495
+ `)})}g?.start(),w?.start(),E({app:d,scheduler:m,queueScheduler:p,mailScheduler:h,execWorker:_,remoteExecute:g,recentAgents:w,server:v,port:A.port,hostname:n,close(){l?.cancel(),u?.cancel(),m.stop(),p?.stop(),h?.stop(),_?.stop(),g?.stop(),w?.stop(),v.close(),i?.release()},async shutdown(){let I=l?.shutdown()??Promise.resolve(),N=u?.shutdown()??Promise.resolve();m.stop(),p?.stop(),h?.stop(),_?.stop(),g?.stop(),w?.stop();let x=new Promise((D,S)=>{v.close(b=>b?S(b):D())}),R=(async()=>{for(;m.isTicking()||(p?.isDelivering()??!1)||(h?.isPolling()??!1);)await new Promise(D=>setTimeout(D,50))})(),O=(await Promise.allSettled([I,N,x,R,_?.whenIdle()??Promise.resolve(),g?.whenIdle()??Promise.resolve(),w?.whenIdle()??Promise.resolve()])).flatMap(D=>D.status==="rejected"?[D.reason]:[]);if(O.length)throw new AggregateError(O,"Service cleanup failed: "+O.map(String).join("; "));i?.release()}})})}catch(A){l?.cancel(),u?.cancel(),i?.release(),y(A instanceof Error?A:new Error(String(A)));return}(l||u)&&("requestTimeout"in v&&(v.requestTimeout=0),"headersTimeout"in v&&(v.headersTimeout=0),v.setTimeout(0)),v.on("error",A=>{if(T){process.stderr.write(`[serve] post-bind server error (ignored -- lock/scheduler untouched): ${A instanceof Error?A.stack??A.message:String(A)}
2496
2496
  `);return}T=!0,l?.cancel(),u?.cancel(),i?.release(),y(A instanceof Error?A:new Error(String(A)))})})}function rn(e,t=[]){let n=new Set(t),r=[],s={};for(let o=0;o<e.length;o++){let i=e[o];if(i==="-h")s.help=!0;else if(i.startsWith("--")){let a=i.slice(2),c=e[o+1];!n.has(a)&&c!==void 0&&!c.startsWith("--")?(s[a]=c,o++):s[a]=!0}else r.push(i)}return{positionals:r,flags:s}}function Si(e,t){if(e===void 0)return;if(typeof e!="string")return new Error(`${t} requires a numeric value (milliseconds)`);let n=Number(e);return!Number.isFinite(n)||n<0?new Error(`${t} must be a finite, non-negative number of milliseconds, got "${e}"`):n}function lc(e,t){if(e===void 0)return;if(typeof e!="string")return new Error(`${t} requires a numeric value`);let n=Number(e);return!Number.isFinite(n)||n<0?new Error(`${t} must be a finite, non-negative number, got "${e}"`):n}import{existsSync as Qie,readFileSync as Zie,writeFileSync as eae}from"node:fs";var Ev="lmbee-cron-export",PF=["schema_version","kind","exported_at","exported_from","jobs"],UF=["id","title","schedule_expr","action_kind","action_payload","provider","model","working_directory","escalation_owner","timezone","enabled"],tae=["provider","model","working_directory","escalation_owner","timezone"];function nae(e){return{id:e.id,title:e.title,schedule_expr:e.schedule_expr,action_kind:e.action_kind,action_payload:e.action_payload,provider:e.provider,model:e.model,working_directory:e.working_directory,escalation_owner:e.escalation_owner,timezone:e.timezone,enabled:!!e.enabled}}function rae(e){return e instanceof Error&&"code"in e&&typeof e.code=="string"&&e.code.startsWith("SQLITE_BUSY")}function sae(e,t){let n;try{n=e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'cron_jobs'").get()!==void 0?e.prepare("SELECT * FROM cron_jobs ORDER BY id").all():[]}catch(r){throw rae(r)?new G("SOURCE_BUSY","source database is locked by another process -- export never waits on locks (busy_timeout = 0); retry shortly",3):r}for(let r of n)if(r.action_kind!=="command"&&r.action_kind!=="script")throw new G("INVALID_ARGUMENT",`cron job ${r.id} "${r.title}" has action_kind "${r.action_kind}" -- export does not carry ${r.action_kind}-kind jobs, so no file was written (import would refuse it; never produce a transferable payload containing one -- re-create the job manually on the target)`);return{schema_version:1,kind:Ev,exported_at:new Date().toISOString(),exported_from:t,jobs:n.map(nae)}}function oae(e,t,n){let r=sae(e,n);try{eae(t,`${JSON.stringify(r,null,2)}
2497
2497
  `,{flag:"wx"})}catch(s){throw s&&typeof s=="object"&&"code"in s&&s.code==="EEXIST"?new G("INVALID_ARGUMENT",`export path already exists: ${t} (rm it first; there is no --force)`):new G("INVALID_ARGUMENT",`cannot write export to ${t}: ${s instanceof Error?s.message:String(s)}`)}return r}function iae(e){let t=Ls(e);Yu(t);let n=new fn(t,{readonly:!0,fileMustExist:!0});return n.pragma("busy_timeout = 0"),{db:n,path:t,close:()=>n.close()}}var FF=`usage: lmbee cron export PATH [--json] -- write all cron job DEFINITIONS (ids preserved) as one JSON document;
2498
2498
  refuses if PATH already exists (rm it first; there is no --force). Definitions only, never execution state.`;function bu(e,t,n){if(t.length>1)throw new G("INVALID_ARGUMENT",`cron ${e} takes exactly one PATH argument -- refusing unexpected extra argument ${JSON.stringify(t[1])}`);for(let r of Object.keys(n))if(r!=="json"&&r!=="help")throw new G("INVALID_ARGUMENT",`cron ${e} does not know flag "--${r}" (only --json and --help)`)}function jF(e){let{positionals:t,flags:n}=rn(e,["json","help"]),r=n.json===!0;try{if(n.help===!0)return{output:FF,exitCode:0};bu("export",t,n);let s=t[0];if(s===void 0)throw new G("INVALID_ARGUMENT",`an export PATH is required