@lmctl-ai/lmctl 0.2.200 → 0.2.201

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.
@@ -0,0 +1,1850 @@
1
+ var w_=Object.create;var Ql=Object.defineProperty;var S_=Object.getOwnPropertyDescriptor;var b_=Object.getOwnPropertyNames;var R_=Object.getPrototypeOf,k_=Object.prototype.hasOwnProperty;var I_=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var A_=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of b_(e))!k_.call(t,s)&&s!==n&&Ql(t,s,{get:()=>e[s],enumerable:!(r=S_(e,s))||r.enumerable});return t};var Zl=(t,e,n)=>(n=t!=null?w_(R_(t)):{},A_(e||!t||!t.__esModule?Ql(n,"default",{value:t,enumerable:!0}):n,t));var Nl=I_(Ie=>{"use strict";function Qn(t){if(!Array.isArray(t))throw new TypeError("Each row and headers must be an array of cells");return Array.from(t,e=>{let n=e==null?"":String(e);if(/[\x00-\x1f\x7f-\x9f]/u.test(n))throw new TypeError("Cells must be single-line text without terminal control characters");return n})}function sg(t){if(t===void 0)return[];if(!Array.isArray(t))throw new TypeError('align must be an array of "left", "right", or "decimal" per column');return t.map(e=>{if(e!=="left"&&e!=="right"&&e!=="decimal")throw new TypeError('align entries must be "left", "right", or "decimal"');return e})}function gt(t){let e=0;for(let n of t){let r=n.codePointAt(0);if(!(r>=768&&r<=879||r>=6832&&r<=6911||r>=7616&&r<=7679||r>=8400&&r<=8447||r>=65024&&r<=65039||r>=65056&&r<=65071||r===8203||r>=917760&&r<=917999)){if(r>=4352&&r<=4447||r>=11904&&r<=12350||r>=12353&&r<=13311||r>=13312&&r<=19903||r>=19968&&r<=40959||r>=40960&&r<=42191||r>=44032&&r<=55203||r>=63744&&r<=64255||r>=65072&&r<=65135||r>=65280&&r<=65376||r>=65504&&r<=65510||r>=9728&&r<=10175||r>=126976&&r<=129791||r>=131072&&r<=262141){e+=2;continue}e+=1}}return e}function Al(t,e,n){let r=" ".repeat(Math.max(0,e-gt(t)));return n?r+t:t+r}function ig(t){if(Array.isArray(t))return{rows:t};if(t!==null&&typeof t=="object"&&Array.isArray(t.rows))return t;throw new TypeError("each grid must be a rows array or { rows, headers }")}function oI(t){if(t===void 0)return"\u2026";if(typeof t!="string"||/[\x00-\x1f\x7f-\x9f]/u.test(t))throw new TypeError("ellipsis must be a single-line string without terminal control characters");return t}function aI(t,e,n="\u2026"){if(gt(t)<=e)return t;let r=gt(n)>e?"\u2026":n,s=gt(r);if(e<=s)return r;let i="",o=0;for(let a of t){let l=gt(a);if(o+l>e-s)break;i+=a,o+=l}return`${i}${r}`}function lI(t){if(t===void 0)return[];if(!Array.isArray(t))throw new TypeError("max must be an array of per-column width caps");return t.map(e=>{if(e!=null){if(typeof e!="number"||!Number.isInteger(e)||e<1)throw new TypeError("max entries must be positive integers, null, or undefined");return e}})}function og(t){let e=/^(?:[+-]?\$?|\$[+-]?)(?:\d+|\d{1,3}(?:,\d{3})+|(?=\.))(?:\.(\d+))?$/.exec(t);return!e||!/\d/.test(t)?null:{places:e[1]?.length??0}}function dI(t){if(t!==void 0){if(!Array.isArray(t)||t.some(e=>!Number.isInteger(e)||e<0))throw new TypeError("decimalPlaces must be an array of nonnegative integers");return t}}function ag(t){if(!Array.isArray(t))throw new TypeError("grids must be an array of grids");let e=[];for(let n of t){let r=ig(n);r.headers!==void 0&&Qn(r.headers);for(let s of r.rows.map(Qn))s.forEach((i,o)=>{e[o]=Math.max(e[o]??0,og(i)?.places??0)})}return e}Ie.measureDecimalPlaces=ag;function lg(t,e,n){let r=dI(n)??[],s=e.includes("decimal")?ag(t):[];return Array.from({length:Math.max(r.length,s.length)},(i,o)=>Math.max(r[o]??0,s[o]??0))}function dg(t,e){let n=og(t);if(!n)return null;let r=n.places?n.places+1:0,s=e?e+1:0;return t+" ".repeat(Math.max(0,s-r))}function ug(t,{max:e,align:n,decimalPlaces:r}={}){if(!Array.isArray(t))throw new TypeError("grids must be an array of grids");let s=lI(e),i=sg(n),o=lg(t,i,r),a=[],l=(d,u)=>{a[d]=Math.max(a[d]??0,u)};for(let d of t){let u=ig(d);u.headers!==void 0&&Qn(u.headers).forEach((c,m)=>{l(m,gt(c))});for(let c of u.rows.map(Qn))c.forEach((m,p)=>{let f=i[p]==="decimal"?dg(m,o[p]??0)??m:m;l(p,gt(f))})}return a.map((d,u)=>{let c=s[u];return c===void 0?d:Math.min(d,c)})}Ie.measureColumns=ug;function uI(t){if(t===void 0)return"";if(typeof t=="number"&&Number.isInteger(t)&&t>=0)return" ".repeat(t);if(typeof t=="string"&&!/[\x00-\x1f\x7f-\x9f]/u.test(t))return t;throw new TypeError("margin must be a number of spaces or a single-line string")}function cg(t,{widths:e,headers:n,align:r,truncate:s=!0,truncateTrailing:i=!1,margin:o,max:a,ellipsis:l,decimalPlaces:d}={}){if(!Array.isArray(t))throw new TypeError("rows must be an array of row arrays");if(e!==void 0&&!Array.isArray(e))throw new TypeError("widths must be an array of column widths");if(e!==void 0&&a!==void 0)throw new TypeError("pass widths or max, not both (max caps a measurement)");let u=uI(o),c=sg(r),m=oI(l),p=lg([t],c,d),f=e??ug([{rows:t,headers:n}],{max:a,align:c,decimalPlaces:p}),g=t.map(Qn);n!==void 0&&g.unshift(Qn(n));let _=g.map((h,E)=>{let y=h.length-1;for(;y>=0&&h[y]==="";)y--;return h.slice(0,y+1).map((T,v)=>{let b=f[v]||0,S=s&&b>0&&(v!==y||i)?aI(T,b,m):T;if(c[v]==="decimal"){let R=n!==void 0&&E===0?null:dg(T,p[v]??0),O=Al(R!==null&&gt(R)<=b?R:S,b,!0);return v===y&&R!==null?O.trimEnd():O}return c[v]==="right"?Al(S,b,!0):v===y?S:Al(S,b,!1)}).join(" ")}).join(`
2
+ `);return _===""||u===""?_:`${u}${_.split(`
3
+ `).join(`
4
+ ${u}`)}`}Ie.renderGrid=cg;function mg(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l}={}){return cg(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l})}function cI(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l,stream:d=process.stdout}={}){let u=mg(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l});u&&d.write(`${u}
5
+ `)}Ie.formatTable=mg;Ie.printTable=cI;function rg(t){return t instanceof Date?t.getTime():typeof t=="number"?t:typeof t=="string"&&t.trim()?Date.parse(t):NaN}function mI(t,{now:e=Date.now()}={}){let n=rg(e);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=rg(t);if(!Number.isFinite(r))return"unknown";let s=r-n,i=Math.floor(Math.abs(s)/1e3);if(i===0)return"now";for(let[o,a]of[["w",604800],["d",86400],["h",3600],["m",60],["s",1]])if(i>=a)return`${Math.floor(i/a)}${o}${s<0?" ago":""}`}Ie.formatRelativeTime=mI;function pI(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=t<0?"-":"",n=Math.abs(t);if(n<1e3)return String(t);let r=Math.round(n/1e3);return r<1e3?`${e}${r}K`:`${e}${(n/1e6).toFixed(1)}M`}Ie.formatCount=pI;var Cl=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function fI(t,{maxUnit:e="w",style:n="spaced"}={}){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let r=Cl.findIndex(([a])=>a===e);if(r===-1)throw new TypeError('maxUnit must be one of "w", "d", "h", "m", "s"');if(n!=="spaced"&&n!=="compact")throw new TypeError('style must be "spaced" or "compact"');let s=Math.floor(Math.max(0,t)/1e3);if(n==="compact"){let a=Cl.slice(r).filter(([c])=>c!=="s");if(a.length===0||s<60)return"<1m";let l=[],d=s,u=!1;for(let[c,m]of a){let p=Math.floor(d/m);if(d-=p*m,p>0&&!u){let f=c==="d"||c==="w"?`${p}${c}`:`${st(p)}${c}`;l.push({text:f,zero:!1}),u=!0}else u&&l.push({text:`${st(p)}${c}`,zero:p===0})}for(;l.length>0&&l[l.length-1].zero;)l.pop();return l.map(c=>c.text).join("")}let i=s,o=[];for(let[a,l]of Cl.slice(r))if(i>=l||a==="s"&&o.length===0){let d=Math.floor(i/l);if(i-=d*l,o.push(`${d}${a}`),o.length===2)break}return o.join(" ")}Ie.formatDuration=fI;function pg(t){return t===void 0?new Date:t instanceof Date?t:typeof t=="number"||typeof t=="string"?new Date(t):new Date(NaN)}function st(t){return String(t).padStart(2,"0")}function fg(t){let e=pg(t);return Number.isNaN(e.getTime())?"unknown":`${st(e.getHours())}:${st(e.getMinutes())}:${st(e.getSeconds())}`}Ie.formatClock=fg;function gI(t){let e=pg(t);return Number.isNaN(e.getTime())?"unknown":`${`${e.getFullYear()}-${st(e.getMonth()+1)}-${st(e.getDate())}`} ${fg(e)}`}Ie.formatLocalTimestamp=gI;function _I(t){return typeof t=="number"&&Number.isFinite(t)?`${Math.round(t*100)}%`:"?%"}Ie.formatPercent=_I;function hI(t,{width:e=10,fill:n="#",empty:r=" ",unknown:s="?"}={}){if(typeof e!="number"||!Number.isInteger(e)||e<1)throw new TypeError("width must be a positive integer");for(let[o,a]of[["fill",n],["empty",r],["unknown",s]])if(typeof a!="string"||[...a].length!==1||/[\x00-\x1f\x7f-\x9f]/u.test(a)||gt(a)!==1)throw new TypeError(`${o} must be a single character with terminal display width 1`);if(typeof t!="number"||!Number.isFinite(t))return s.repeat(e);let i=Math.min(e,Math.max(0,Math.round(t*e)));return`${n.repeat(i)}${r.repeat(e-i)}`}Ie.formatBar=hI;function yI(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=Math.floor(Math.max(0,t)/1e3),n=Math.floor(e/86400);e-=n*86400;let r=Math.floor(e/3600);e-=r*3600;let s=Math.floor(e/60);e-=s*60;let i=`${st(r)}:${st(s)}:${st(e)}`;return n>0?`${n}d ${i}`:i}Ie.formatTimer=yI;function TI(t){return(t==null?"":String(t)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
6
+ `?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}Ie.escapeCell=TI});import{createServer as BA}from"node:net";import{chmodSync as XA,existsSync as qA,lstatSync as JA,readFileSync as GA,rmSync as Gl,writeFileSync as VA,renameSync as KA}from"node:fs";import{join as YA,resolve as zA}from"node:path";import{randomUUID as QA}from"node:crypto";var ed="root_teamfile <> '(direct)'",er=ed+" AND COALESCE(accounting_only,0)=0";function td(t){return t.prepare("PRAGMA table_info(team_chat_log)").all().some(e=>e.name==="accounting_only")?er:ed}import{stat as VT,realpath as KT}from"node:fs/promises";import{existsSync as C_}from"node:fs";import{createRequire as N_}from"node:module";var Gi=null;function x_(){return Gi===null&&(Gi=N_(import.meta.url)("node:sqlite").DatabaseSync),Gi}var O_={1:"SQLITE_ERROR",2:"SQLITE_INTERNAL",3:"SQLITE_PERM",4:"SQLITE_ABORT",5:"SQLITE_BUSY",6:"SQLITE_LOCKED",7:"SQLITE_NOMEM",8:"SQLITE_READONLY",9:"SQLITE_INTERRUPT",10:"SQLITE_IOERR",11:"SQLITE_CORRUPT",12:"SQLITE_NOTFOUND",13:"SQLITE_FULL",14:"SQLITE_CANTOPEN",15:"SQLITE_PROTOCOL",17:"SQLITE_SCHEMA",18:"SQLITE_TOOBIG",19:"SQLITE_CONSTRAINT",20:"SQLITE_MISMATCH",21:"SQLITE_MISUSE",23:"SQLITE_AUTH",25:"SQLITE_RANGE",26:"SQLITE_NOTADB"},L_={275:"SQLITE_CONSTRAINT_CHECK",531:"SQLITE_CONSTRAINT_COMMITHOOK",787:"SQLITE_CONSTRAINT_FOREIGNKEY",1043:"SQLITE_CONSTRAINT_FUNCTION",1299:"SQLITE_CONSTRAINT_NOTNULL",1555:"SQLITE_CONSTRAINT_PRIMARYKEY",1811:"SQLITE_CONSTRAINT_TRIGGER",2067:"SQLITE_CONSTRAINT_UNIQUE",2323:"SQLITE_CONSTRAINT_VTAB",2579:"SQLITE_CONSTRAINT_ROWID",2835:"SQLITE_CONSTRAINT_PINNED",3091:"SQLITE_CONSTRAINT_DATATYPE",261:"SQLITE_BUSY_RECOVERY",517:"SQLITE_BUSY_SNAPSHOT",773:"SQLITE_BUSY_TIMEOUT",262:"SQLITE_LOCKED_SHAREDCACHE",518:"SQLITE_LOCKED_VTAB"};function D_(t){let e=L_[t];if(e!==void 0)return e;let n=O_[t&255];return n!==void 0?n:`SQLITE_UNKNOWN_${t}`}function qt(t){throw t&&typeof t=="object"&&"errcode"in t&&typeof t.errcode=="number"&&(t.code=D_(t.errcode)),t}var Ki=class{name;handle;savepointId=0;constructor(e,n={}){if(n.fileMustExist===!0&&e!==":memory:"&&!C_(e))throw new Error("unable to open database file");this.name=e;try{this.handle=new(x_())(e,{readOnly:n.readonly===!0})}catch(r){qt(r)}this.exec("PRAGMA busy_timeout = 5000"),this.exec(`PRAGMA foreign_keys = ${n.foreignKeys===!0?"ON":"OFF"}`)}prepare(e){try{return new Yi(this.handle.prepare(e))}catch(n){qt(n)}}exec(e){try{this.handle.exec(e)}catch(n){qt(n)}}pragma(e,n){let r=`PRAGMA ${e}`;if(e.includes("=")){this.exec(r);return}if(n?.simple===!0){let s=this.prepare(r).get();return s===void 0?void 0:Object.values(s)[0]}return this.prepare(r).all()}transaction(e){let n=(...r)=>this.runTransaction("BEGIN",e,r);return n.immediate=(...r)=>this.runTransaction("BEGIN IMMEDIATE",e,r),n}get inTransaction(){return this.handle.isTransaction}close(){try{this.handle.close()}catch(e){qt(e)}}runTransaction(e,n,r){if(!this.inTransaction){this.exec(e);try{let i=n(...r);return this.exec("COMMIT"),i}catch(i){if(this.inTransaction)try{this.exec("ROLLBACK")}catch(o){if(!P_(o))throw o}throw i}}let s=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${s}`);try{let i=n(...r);return this.exec(`RELEASE ${s}`),i}catch(i){if(this.inTransaction)try{this.exec(`ROLLBACK TO ${s}`),this.exec(`RELEASE ${s}`)}catch(o){if(!M_(o))throw o}throw i}}};function P_(t){return t instanceof Error&&/cannot rollback - no transaction is active/i.test(t.message)}function M_(t){return t instanceof Error&&/no such savepoint:/i.test(t.message)}var hn=Ki,Yi=class{constructor(e){this.handle=e;this.handle.setAllowBareNamedParameters(!0)}rawMode=!1;get(...e){try{let n=this.handle.get(...Vi(e));return this.normalizeRow(n)}catch(n){qt(n)}}all(...e){try{return this.handle.all(...Vi(e)).map(n=>this.normalizeRow(n))}catch(n){qt(n)}}run(...e){try{let n=this.handle.run(...Vi(e));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}catch(n){qt(n)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&zi(e)?Object.values(e):zi(e)?{...e}:e}};function Vi(t){return t.length===1&&U_(t[0])?[t[0]]:t}function U_(t){if(!zi(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function zi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Qi(t){return new hn(t,{readonly:!0,fileMustExist:!0})}import{join as Oe,resolve as yu}from"node:path";import{homedir as YT}from"node:os";import{readdir as J_}from"node:fs/promises";import{join as id,sep as od}from"node:path";import{createHash as F_}from"node:crypto";import{lstat as j_,readFile as $_,realpath as nd,stat as rd}from"node:fs/promises";import{isAbsolute as sd,relative as W_,resolve as H_,sep as B_}from"node:path";var nr="bx3",Ce={input_uncached:null,input_cached:null,input_cache_write:null,output:null};function F(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}function X(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}function tr(t){return X(t)}function Ue(t){if(typeof t!="string"&&typeof t!="number")return null;let e=new Date(t);return Number.isFinite(e.getTime())?e.toISOString():null}function z(t){if(!Number.isSafeInteger(t.maxBytes)||t.maxBytes<=0)throw new Error("maxBytes must be a positive safe integer");if(!Number.isSafeInteger(t.maxRows)||t.maxRows<=0)throw new Error("maxRows must be a positive safe integer");t.signal.throwIfAborted()}function te(t,e){return t<e?-1:t>e?1:0}var Pe=class{map=new Map;record(e,n,r,s){if(typeof r!="string"||r.length===0||r.includes("\0"))return;let i=`${e}\0${n}\0${r}`;this.map.has(i)||this.map.set(i,{direction:n,path:r,bytes:s})}files(e){let n=[];for(let r of this.map.values())r.direction===e&&n.push({path:r.path,bytes:r.bytes});return n}},X_=0,Me=class{map=new Map;record(e){let n;e.id!==null?n=`id\0${e.id}\0${e.direction}\0${e.kind}`:e.bytes===null?n=`mark\0${e.direction}\0${e.kind}\0${e.basis}\0${e.ref??""}`:n=`seq\0${X_++}`,this.map.has(n)||this.map.set(n,e)}entries(){return[...this.map.values()]}};function Re(t,e,n){if(t===null||e===null)return null;let r=n==="written"?"write":"read",s=0;for(let i of t){if(i.bytes===null)return null;s+=i.bytes}for(let i of e)if(i.direction===r){if(i.bytes===null)return null;s+=i.bytes}return s}function Ve(t,e,n){let r={},s=tr(t.cacheWrite5m),i=tr(t.cacheWrite1h),o=tr(t.reasoning),a=tr(t.webSearch),l=tr(t.webFetch);o!==null&&(e===null||o<=e)&&(r.reasoning_output_tokens=o);let d=(s??0)+(i??0),u=n===null||d<=n;return s!==null&&u&&(r.cache_write_5m_tokens=s),i!==null&&u&&(r.cache_write_1h_tokens=i),a!==null&&(r.web_search_requests=a),l!==null&&(r.web_fetch_requests=l),Object.keys(r).length>0?r:null}var q_=new Set(["schedulewakeup","taskcreate","taskupdate","taskoutput","taskstop","todowrite","todoread","croncreate","crondelete","cronlist","monitor","listagents","toolsearch","askuserquestion","exitplanmode","agent","skill","job"]);function _t(t){return typeof t=="string"&&q_.has(t.toLowerCase())}function me(t,e){t.record({direction:"read",kind:"unattributed",id:e,ref:null,bytes:null,basis:"unknown"}),t.record({direction:"write",kind:"unattributed",id:e,ref:null,bytes:null,basis:"unknown"})}function yn(t){let e=F(t);return e&&typeof e.content=="string"?Buffer.byteLength(e.content,"utf8"):null}async function ye(t,e){if(!sd(t))return null;let n=await j_(t).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await nd(t).catch(()=>null);if(!r)return null;for(let s of e){let i=await nd(s).catch(()=>H_(s)),o=W_(i,r);if(o===""||!o.startsWith(`..${B_}`)&&o!==".."&&!sd(o))return r}return null}async function Ne(t,e){z(e);let n=await rd(t).catch(()=>null);if(!n?.isFile()||n.size>e.maxBytes)return null;let r=await $_(t,{signal:e.signal});e.signal.throwIfAborted();let s=await rd(t).catch(()=>null);return!s?.isFile()||n.dev!==s.dev||n.ino!==s.ino||n.size!==s.size||n.mtimeMs!==s.mtimeMs?null:{revision:`${nr}:sha256:${F_("sha256").update(r).digest("hex")}`,data:r}}function Kr(t,e){if(t.length>0&&t[t.length-1]!==10)return null;let n=t.toString("utf8"),r=n.length===0?[]:n.slice(0,-1).split(`
7
+ `),s=[];for(let i of r)if(e.signal.throwIfAborted(),!!i.trim())try{let o=F(JSON.parse(i));if(!o)return null;s.push(o)}catch{return null}return s}var Tn=class{constructor(e){this.format=e}async discover(e,n,r){z(e);let s=[],i=0,o=!1,a=async(l,d)=>{if(e.signal.throwIfAborted(),d>8||i>e.maxRows){o=!0;return}let u=await J_(l,{withFileTypes:!0}).catch(m=>(m.code!=="ENOENT"&&(o=!0),[])),c=m=>id(l,m.name)+(m.isDirectory()?od:"");for(let m of u.sort((p,f)=>te(c(p),c(f)))){e.signal.throwIfAborted();let p=id(l,m.name),f=m.isDirectory()&&r?.startsWith(p+od);if(!(r&&!f&&te(c(m),r)<=0)){if(!f&&++i>e.maxRows){o=!0;break}if(m.isDirectory())await a(p,d+1);else if(m.isFile()){let g=this.format.sessionId(p);g&&s.push({provider:this.format.provider,sessionid:g,source_id:p})}if(s.length>=n){o=!0;break}}}};return await a(this.format.root,0),s.sort((l,d)=>te(l.source_id,d.source_id)),{sources:s.slice(0,n),truncated:o||s.length>n}}async bytes(e,n){if(z(n),e.provider!==this.format.provider||this.format.sessionId(e.source_id)!==e.sessionid)return null;let r=await ye(e.source_id,[this.format.root]);if(!r)return null;let s=await Ne(r,n).catch(()=>(n.signal.throwIfAborted(),null));return s&&{...s,revision:`${this.format.revision}:${s.revision}`}}async inspect(e,n){let r=await this.bytes(e,n);return r?{status:"ready",revision:r.revision}:{status:"partial"}}async read(e,n,r){let s=await this.bytes(e,r);if(!s||s.revision!==n)return{status:"partial"};let i=this.format.decode(s.data,e.sessionid,e.source_id,r);return!i||!i.responses?{status:"partial"}:{status:"complete",source:e,revision:n,checkpoint:null,responses:i.responses,...i.captureStatus?{capture_status:i.captureStatus}:{}}}};function En(t,e=!0){let n={input_uncached:null,input_cached:null,input_cache_write:null,output:null};if(!e||!t.length||new Set(t.map(r=>r.response_id)).size!==t.length)return n;for(let r of Object.keys(n)){let s=t.map(o=>o.tokens[r]);if(s.some(o=>o===null||!Number.isSafeInteger(o)||o<0))continue;let i=s.reduce((o,a)=>o+a,0);Number.isSafeInteger(i)&&(n[r]=i)}return n}import{readdir as K_}from"node:fs/promises";import{join as vn,resolve as Y_}from"node:path";import{createReadStream as ad}from"node:fs";import{createInterface as ld}from"node:readline";import{stat as G_}from"node:fs/promises";import{homedir as V_}from"node:os";var J=V_();function dd(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*le(t,e){let n=ad(t,{encoding:"utf-8"}),r=ld({input:n,crlfDelay:1/0});try{for await(let s of r){let i=s.trim();if(!i)continue;let o=dd(i);o!==void 0?yield o:e?.()}}finally{n.destroy()}}async function Fe(t,e){let n=[],r=ad(t,{encoding:"utf-8"}),s=ld({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=dd(o);if(a!==void 0&&n.push(a),n.length>=e)break}}finally{s.close(),r.destroy()}return n}async function pe(t){let e=await G_(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function re(t){return t.replace(/\\n/g,`
8
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function B(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function Be(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var ud=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function zr(t){return Y_(t||process.env.XDG_DATA_HOME||vn(J,".local","share"))}function z_(t){return vn(zr(t),"muse","sessions")}function Q_(t,e,n,r){let s=r?.input_tokens,i=r?.cache_read_tokens??r?.input_cache_read_tokens,o=r?.cache_write_tokens??r?.input_cache_write_tokens,a=typeof r?.promptTokens=="number"?r.promptTokens:typeof r?.prompt_tokens=="number"?r.prompt_tokens:void 0,l=typeof s=="number"&&typeof i=="number"&&i>s||typeof a=="number"&&typeof i=="number"&&i>a||typeof a=="number"&&typeof o=="number"&&o>a||typeof a=="number"&&typeof i=="number"&&typeof o=="number"&&i+o>a,d=l?null:typeof i=="number"?i:null,u=l?null:typeof o=="number"?o:null,c=null;return l||(typeof r?.input_uncached_tokens=="number"?c=r.input_uncached_tokens:typeof a=="number"&&typeof i=="number"&&typeof o=="number"&&a>=i+o&&(c=a-i-o)),{response_id:t,timestamp:e.toISOString(),model:typeof n=="string"&&n.length>0?n:null,tokens:{input_uncached:typeof c=="number"?c:null,input_cached:typeof d=="number"?d:null,input_cache_write:typeof u=="number"?u:null,output:typeof r?.output_tokens=="number"?r.output_tokens:null},files_read:null,files_written:null}}function md(t,e){let n,r,s,i,o,a=[],l=new Map,d=new Map,u=new Set,c,m,p=()=>{m="partial"},f=h=>{if(typeof h!="string"||h.length===0){p();return}let E=l.get(h);return E||(E={id:h,turn:{id:h,status:"unknown"},responseIds:[]},l.set(h,E)),E},g=h=>{if(h.retained_frame&&Array.isArray(h.children)){for(let S of h.children)try{if(typeof S?.record_json!="string")throw new Error("missing record_json");g(JSON.parse(S.record_json))}catch{p()}return}if(h.stream?.kind!=="session"||h.stream?.id!==t)return;if(h.schema_version!==1){p();return}if(h.payload_type?.startsWith("runtime.session")&&h.payload_schema_version!==1){p();return}let E=h.payload?.source_run_record_id;for(let S of[h.id,E])if(!(typeof S!="string"||S.length===0)&&u.has(S))return;for(let S of[h.id,E])typeof S=="string"&&S.length>0&&u.add(S);let y=typeof h.recorded_at=="number"&&Number.isFinite(h.recorded_at)?new Date(h.recorded_at/1e3):void 0;if(h.recorded_at!==void 0&&(!y||!Number.isFinite(y.getTime()))){p();return}y&&Number.isFinite(y.getTime())&&((!s||y<s)&&(s=y),(!i||y>i)&&(i=y));let T=h.payload;if(h.payload_type==="runtime.session.metadata"&&(typeof T?.record?.workspace_root=="string"&&(n=T.record.workspace_root),typeof T?.record?.model_id=="string"&&(r=T.record.model_id)),h.payload_type!=="runtime.session"||T?.kind!=="run")return;let v=T.event,b=f(T.run_id);if(!v||!y||!b){v||p();return}if(v.kind==="started"&&typeof v.prompt=="string")a.push({role:"user",content:v.prompt,timestamp:y}),b.turn.startedAt=y,b.turn.prompt=v.prompt,b.turn.status="in_progress",o="in_progress";else if(v.kind==="assistant_message_committed"&&typeof v.text=="string")a.push({role:"assistant",content:v.text,timestamp:y});else if(v.kind==="terminal")b.turn.completedAt=y,b.turn.status=v.terminal==="completed"?"complete":"aborted",o=b.turn.status;else if(v.kind==="model_completed"){typeof v.model=="string"&&v.model.length>0&&(r=v.model,b.turn.model=v.model);let S=typeof E=="string"&&E.length>0?E:typeof h.id=="string"&&h.id.length>0?h.id:void 0;if(!S)p();else{b.responseIds.push(S);let W={};if(v.usage&&typeof v.usage=="object")for(let D of["input_tokens","output_tokens","cached_tokens","reasoning_tokens","input_uncached_tokens","cache_read_tokens","input_cache_read_tokens","cache_write_tokens","input_cache_write_tokens","promptTokens","prompt_tokens"]){let ae=v.usage[D];typeof ae=="number"&&Number.isSafeInteger(ae)&&ae>=0&&(W[D]=ae)}Object.keys(W).length>0&&(b.turn.rawUsage=[...b.turn.rawUsage??[],{responseId:S,values:W}]),d.set(S,Q_(S,y,v.model,W))}if(!v.usage)return;let R={},O=v.usage.input_tokens,N=v.usage.cache_read_tokens??v.usage.input_cache_read_tokens,A=v.usage.cache_write_tokens??v.usage.input_cache_write_tokens,w=typeof v.usage.promptTokens=="number"?v.usage.promptTokens:typeof v.usage.prompt_tokens=="number"?v.usage.prompt_tokens:void 0,I=typeof O=="number"&&typeof N=="number"&&N>O||typeof w=="number"&&typeof N=="number"&&N>w||typeof w=="number"&&typeof A=="number"&&A>w||typeof w=="number"&&typeof N=="number"&&typeof A=="number"&&N+A>w,C=I?void 0:typeof N=="number"?N:void 0,k=I?void 0:typeof A=="number"?A:void 0,x;I||(typeof v.usage.input_uncached_tokens=="number"?x=v.usage.input_uncached_tokens:typeof w=="number"&&typeof N=="number"&&typeof A=="number"&&w>=N+A&&(x=w-N-A)),x!==void 0&&x<0&&(x=void 0);let P=v.usage.output_tokens,L=v.usage.reasoning_tokens;typeof x=="number"&&Number.isSafeInteger(x)&&x>=0&&(R.inputTokens=x),typeof C=="number"&&Number.isSafeInteger(C)&&C>=0&&(R.cachedInputTokens=C),typeof k=="number"&&Number.isSafeInteger(k)&&k>=0&&(R.cacheWriteInputTokens=k),typeof P=="number"&&Number.isSafeInteger(P)&&P>=0&&(R.outputTokens=P),typeof L=="number"&&Number.isSafeInteger(L)&&L>=0&&(R.reasoningOutputTokens=L),c=R}};return{visit:g,finish:()=>{if(!n||!s||!i)return null;let h=a.filter(v=>v.role==="user").map(v=>v.content),E=[...l.values()].map(v=>({...v.turn,...v.responseIds.length>0?{responseIds:[...v.responseIds]}:{}})),y=[...d.values()],T=En(y,m!=="partial");return{provider:"muse",sessionId:t,filePath:e,cwd:n,createdAt:s,modifiedAt:i,model:r,messages:a,messageCount:a.length,firstUserMessage:h[0],lastUserMessage:h.at(-1),userPrompts:h,turnStatus:o,totalInputTokens:T.input_uncached??void 0,totalCachedInputTokens:T.input_cached??void 0,totalCacheWriteInputTokens:T.input_cache_write??void 0,totalOutputTokens:T.output??void 0,lastTokenUsage:c,turns:E,responses:y,...m?{captureStatus:m}:{}}},markPartial:p}}function Z_(t,e,n){let r=md(e,n);for(let s of t)r.visit(s);return r.finish()}function eh(t,e,n,r){r.signal.throwIfAborted();let s=Math.max(0,r.maxBytes),i=t.length<=s?t:t.subarray(0,Math.max(0,t.subarray(0,s).lastIndexOf(10))),o=i.length!==t.length,a=[],l=o,d=0,u=m=>{if(!m||typeof m!="object"||Array.isArray(m)){l=!0;return}let p=m;if(p.retained_frame&&Array.isArray(p.children)){for(let f of p.children){if(d>=r.maxRows){l=!0;return}let g;try{if(typeof f?.record_json!="string")throw new Error("missing record_json");g=JSON.parse(f.record_json)}catch{l=!0;continue}u(g)}return}if(d>=r.maxRows){l=!0;return}a.push(p),d++};for(let m of i.toString("utf8").split(/\r?\n/u)){if(r.signal.throwIfAborted(),m.trim()==="")continue;let p;try{p=JSON.parse(m)}catch{l=!0;continue}u(p)}let c=Z_(a,e,n);return c&&l&&(c.captureStatus="partial"),c}function pd(t){return{provider:"muse",root:z_(t),revision:"muse-session-v2",sessionId:n=>n.replaceAll("\\","/").match(/\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\/session\.jsonl$/iu)?.[1]??null,decode:eh}}async function cd(t,e){let n=md(t,e);for await(let r of le(e,n.markPartial))n.visit(r);return n.finish()}var Yr=class{name="muse";dataHome;constructor(e={}){this.dataHome=zr(e.museDataHome)}get root(){return vn(this.dataHome,"muse","sessions")}getWatchPaths(){return[{directory:this.root,filePattern:/session\.jsonl$/}]}async files(e=this.root,n=0){let r;try{r=await K_(e,{withFileTypes:!0})}catch{return[]}let s=[];for(let i of r)i.isFile()&&i.name==="session.jsonl"?s.push(vn(e,i.name)):i.isDirectory()&&n<4&&s.push(...await this.files(vn(e,i.name),n+1));return s}async resolveSessionPath(e){return ud.test(e)?(await this.files()).find(n=>n.endsWith(vn(e,"session.jsonl")))??null:null}async loadSession(e){let n=await this.resolveSessionPath(e);return n?cd(e,n):null}async discoverSessions(){let e=[];for(let n of await this.files())try{let r=n.split(/[\\/]/).at(-2);if(!ud.test(r))continue;let s=await cd(r,n);s&&e.push(s)}catch{}return e}async deleteSession(){return!1}};import{readFile as fd,readdir as th,rm as nh,stat as gd}from"node:fs/promises";import{basename as rh,join as wn,resolve as sh}from"node:path";var Ed=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;function es(t){return sh(t||process.env.MINIPLAYER_HOME||wn(process.env.XDG_DATA_HOME||wn(J,".local","share"),"miniplayer"))}var Zr=class{name="miniplayer";home;constructor(e={}){this.home=es(e.miniplayerHome)}getWatchPaths(){return[{directory:wn(this.home,"sessions"),filePattern:/\.json$/}]}async discoverSessions(){let e;try{e=await th(wn(this.home,"sessions"))}catch{return[]}return(await Promise.all(e.filter(r=>r.endsWith(".json")).map(r=>this.loadSession(r.slice(0,-5))))).filter(r=>r!==null)}async resolveSessionPath(e){if(!Ed.test(e))return null;let n=wn(this.home,"sessions",`${e}.json`);try{return(await gd(n)).isFile()?n:null}catch{return null}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;try{let r=vd(JSON.parse(await fd(n,"utf8")),e,n);if(!r)return null;let s="complete";try{let i=JSON.parse(await fd(`${n}.lock`,"utf8"));if(Number.isInteger(i.pid)&&i.pid>0)try{process.kill(i.pid,0),s="in_progress"}catch{s="aborted"}}catch{}return{...r,...s!=="complete"?{turnStatus:s}:{}}}catch{return null}}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{throw await gd(`${n}.lock`),new Error("Cannot delete a locked miniplayer session")}catch(r){if(r.code!=="ENOENT")throw r}return await nh(n),!0}};function Qr(t){if(typeof t=="string")return t;try{return JSON.stringify(t)??String(t)}catch{return String(t)}}function Zi(t){return!t||typeof t!="object"?"tool":typeof t.toolName=="string"?t.toolName:typeof t.name=="string"?t.name:"tool"}function _d(t){if(!t||typeof t!="object")return null;let e=t.toolCallId??t.id;return typeof e=="string"&&e.length>0?e:null}function hd(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function yd(t){if(typeof t!="string")return null;try{let e=new URL(t);return e.username="",e.password="",e.search="",e.hash="",e.toString()}catch{return null}}function Td(t){let e=t.usage&&typeof t.usage=="object"&&!Array.isArray(t.usage)?t.usage:{},n={};for(let[l,d]of Object.entries(e))X(d)!==null&&(n[l]=d);let r=X(e.inputTokens),s=X(e.cachedInputTokens),i=X(t.cacheWriteInputTokens??e.cacheWriteInputTokens),o=X(e.outputTokens),a=null;return t.usageConvention==="input-includes-cache"&&r!==null&&s!==null&&s<=r&&(a=r-s),t.usageConvention==="input-excludes-cache"&&r!==null&&i!==null&&(a=r+i),t.usageConvention==="synthetic"&&r===0&&s===0&&(i===0||i===null)&&o===0&&(a=0),{tokens:{input_uncached:a,input_cached:s,input_cache_write:i,output:o},rawUsage:n,pricingFacts:X(e.reasoningTokens)===null?null:{reasoning_output_tokens:X(e.reasoningTokens)}}}function vd(t,e,n){if(!t||typeof t!="object")return null;let r=t;if(![1,2].includes(r.version)||r.id!==e||typeof r.cwd!="string")return null;let s=f=>{if(typeof f!="string")return;let g=new Date(f);return Number.isFinite(g.getTime())?g:void 0},i=s(r.createdAt),o=s(r.updatedAt);if(!i||!o)return null;let a=[],l=[],d=[],u=r.version===1,c="complete";if(r.version===1){if(!Array.isArray(r.messages))return null;for(let f of r.messages){if(!f||!["user","assistant"].includes(f.role)||typeof f.content!="string")return null;a.push({role:f.role,content:f.content,timestamp:s(f.timestamp)??o})}}else{if(!Array.isArray(r.turns))return null;let f=new Set,g=new Set;for(let _ of r.turns){if(!_||typeof _.responseId!="string"||!_.responseId||typeof _.input?.text!="string")return null;if(f.has(_.responseId)){u=!0;continue}f.add(_.responseId);let h=s(_.startedAt),E=s(_.completedAt??_.endedAt);if(!h)return null;let y=typeof _.model=="string"?_.model:void 0;["complete","running","failed","aborted"].includes(_.status)||(u=!0);let T=_.status==="complete"?"complete":_.status==="running"?"in_progress":_.status==="failed"?"failed":_.status==="aborted"?"aborted":"unknown";c=T==="failed"||T==="unknown"?"aborted":T,(T!=="complete"||_.partial===!0)&&(u=!0);let v=Array.isArray(_.modelResponses),b=v?_.modelResponses:[],S=[];l.push({id:_.responseId,startedAt:h,completedAt:E,model:y,prompt:_.input.text,status:T,responseIds:S}),a.push({role:"user",timestamp:h,content:_.input.text});let R=Array.isArray(_.toolEvents)&&_.toolEvents.length>0;if(!v&&!R){let I=_.usage??{},C=Td({..._,usage:I});Object.keys(C.rawUsage).length&&(l.at(-1).rawUsage=[{responseId:_.responseId,values:C.rawUsage}]),S.push(_.responseId),d.push({response_id:_.responseId,timestamp:(E??h).toISOString(),model:y??null,model_provider:typeof _.provider=="string"?_.provider:null,tokens:C.tokens,files_read:[],files_written:[],read_bytes:Buffer.byteLength(_.input.text,"utf8"),write_bytes:0,external_io:[{direction:"read",kind:"prompt",id:_.responseId,ref:null,bytes:Buffer.byteLength(_.input.text,"utf8"),basis:"input_text"}],pricing_facts:C.pricingFacts}),T!=="complete"&&!_.usage&&(u=!0),typeof _.output?.text=="string"&&a.push({role:"assistant",timestamp:E??h,content:_.output.text,model:y});continue}let O=new Map,N=new Map,A=new Set,w=[];for(let I of b){if(!I||typeof I!="object"||typeof I.responseId!="string"||!I.responseId){u=!0;continue}if(S.includes(I.responseId)){u=!0;continue}let C=I,k=w.length;w.push({response:C,index:k,filesRead:[],filesWritten:[],io:[]}),S.push(I.responseId),g.has(I.responseId)&&(u=!0),g.add(I.responseId),C.toolCalls!==void 0&&!Array.isArray(C.toolCalls)&&(u=!0,w[k].io.push({direction:"read",kind:"unattributed",id:I.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:I.responseId,ref:null,bytes:null,basis:"unknown"}));for(let x of Array.isArray(C.toolCalls)?C.toolCalls:[]){let P=_d(x),L=Zi(x);if(P)O.set(P,k),N.set(P,L);else{u=!0;let W=L==="list_directory"||L==="read_file"||L==="webget"||L==="shell"||L==="tool",D=L==="write_file"||L==="shell"||L==="tool";W&&w[k].io.push({direction:"read",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"}),D&&w[k].io.push({direction:"write",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"})}}}S.length===0&&b.length>0&&(u=!0);for(let I of Array.isArray(_.toolEvents)?_.toolEvents:[]){let C=I&&typeof I=="object"?I:{},k=_d(C),x=k?O.get(k):void 0,P=Zi(C),L=hd(C.result),W=C.status==="failed"||C.error!==void 0;if(C.type==="tool_call"?a.push({role:"tool_use",timestamp:s(C?.timestamp)??h,content:Qr(C?.input??C?.args),toolName:P,toolInput:Qr(C?.input??C?.args),toolInputData:hd(C?.input??C?.args)??void 0,...k?{toolCallId:k}:{}}):a.push({role:"tool_result",timestamp:s(C?.timestamp)??E??h,content:Qr(W?C?.error:C?.result),toolName:P,...k?{toolCallId:k}:{}}),x===void 0){u=!0;continue}let D=w[x];(C.type==="tool_result"||W||C.result!==void 0)&&A.add(k);let ae=L?.path,$=X(L?.bytesRead??L?.bytesWritten);C.type!=="tool_call"&&(P==="read_file"&&!W&&typeof ae=="string"&&$!==null?D.filesRead.push({path:ae,bytes:$}):P==="write_file"&&!W&&typeof ae=="string"&&$!==null?D.filesWritten.push({path:ae,bytes:$}):P==="webget"&&!W&&$!==null?D.io.push({direction:"read",kind:"web",id:k,ref:yd(L?.finalUrl??L?.url),bytes:$,basis:"certified_counter"}):P==="shell"||W?(P!=="write_file"&&D.io.push({direction:"read",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}),(P==="shell"||P==="write_file")&&D.io.push({direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"})):P==="list_directory"||P==="read_file"||P==="webget"?D.io.push({direction:"read",kind:P==="webget"?"web":"unattributed",id:k,ref:P==="webget"?yd(L?.finalUrl??L?.url):null,bytes:null,basis:"unknown"}):P==="write_file"?D.io.push({direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}):D.io.push({direction:"read",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}))}for(let[I,C]of N)if(!A.has(I)){let k=w[O.get(I)],x=C==="list_directory"||C==="read_file"||C==="webget"||C==="shell",P=C==="write_file"||C==="shell";x&&k.io.push({direction:"read",kind:"unattributed",id:I,ref:null,bytes:null,basis:"unknown"}),P&&k.io.push({direction:"write",kind:"unattributed",id:I,ref:null,bytes:null,basis:"unknown"}),u=!0}for(let I of w){let C=I.response,k=Td(C),x=s(C.completedAt??C.startedAt)??E??h;new Set((Array.isArray(C.toolCalls)?C.toolCalls:[]).map(D=>Zi(D))).has("shell")&&!I.io.some(D=>D.kind==="unattributed"&&D.direction==="read")&&I.io.push({direction:"read",kind:"unattributed",id:C.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:C.responseId,ref:null,bytes:null,basis:"unknown"}),I.index===0&&I.io.unshift({direction:"read",kind:"prompt",id:_.responseId,ref:null,bytes:Buffer.byteLength(_.input.text,"utf8"),basis:"input_text"});let L=I.io.some(D=>D.direction==="read"&&D.bytes===null),W=I.io.some(D=>D.direction==="write"&&D.bytes===null);if(d.push({response_id:C.responseId,timestamp:x.toISOString(),model:typeof C.model=="string"?C.model:null,model_provider:typeof C.provider=="string"?C.provider:typeof _.provider=="string"?_.provider:null,tokens:k.tokens,files_read:L?null:I.filesRead,files_written:W?null:I.filesWritten,read_bytes:L?null:I.filesRead.reduce((D,ae)=>D+(ae.bytes??0),0)+I.io.filter(D=>D.direction==="read").reduce((D,ae)=>D+(ae.bytes??0),0),write_bytes:W?null:I.filesWritten.reduce((D,ae)=>D+(ae.bytes??0),0)+I.io.filter(D=>D.direction==="write").reduce((D,ae)=>D+(ae.bytes??0),0),external_io:I.io,pricing_facts:k.pricingFacts}),Object.keys(k.rawUsage).length){let D=l.at(-1);D.rawUsage=[...D.rawUsage??[],{responseId:C.responseId,values:k.rawUsage}]}}l.at(-1).responseIds=S,S.length!==b.length&&(u=!0),typeof _.output?.text=="string"&&a.push({role:"assistant",timestamp:E??h,content:_.output.text,model:y})}}let m=a.filter(f=>f.role==="user").map(f=>f.content),p=En(d,!u);return{provider:"miniplayer",sessionId:e,cwd:r.cwd,filePath:n,createdAt:i,modifiedAt:o,model:typeof r.model=="string"?r.model:void 0,messages:a,messageCount:a.length,userPrompts:m,firstUserMessage:m[0],lastUserMessage:m.at(-1),turns:l,responses:d,turnStatus:c,...u?{captureStatus:"partial"}:{},totalInputTokens:p.input_uncached??void 0,totalCachedInputTokens:p.input_cached??void 0,totalCacheWriteInputTokens:p.input_cache_write??void 0,totalOutputTokens:p.output??void 0}}function ts(t){return{provider:"miniplayer",root:wn(es(t),"sessions"),revision:"miniplayer-data-v3",sessionId(e){let n=rh(e,".json");return e.endsWith(".json")&&Ed.test(n)?n:null},decode(e,n,r,s){s.signal.throwIfAborted();try{let i=JSON.parse(e.toString("utf8"));return(Array.isArray(i.turns)?i.turns.reduce((a,l)=>a+1+(Array.isArray(l?.modelResponses)?l.modelResponses.length:0)+(Array.isArray(l?.toolEvents)?l.toolEvents.length:0),0):Array.isArray(i.messages)?i.messages.length:0)>s.maxRows?null:vd(i,n,r)}catch{return null}}}}import{createHash as _o}from"node:crypto";import{createRequire as Zy}from"node:module";import{lstat as eT,readFile as tT,readdir as nT,realpath as fo,stat as tu}from"node:fs/promises";import{basename as is,dirname as rT,isAbsolute as nu,join as Vt,relative as sT,resolve as ot,sep as iT}from"node:path";import{createHash as ih}from"node:crypto";import{createRequire as oh}from"node:module";import{readdir as ah,realpath as lh}from"node:fs/promises";import{basename as wd,dirname as dh,join as Sd,resolve as bd}from"node:path";var ht="agy",ns="agy-tokens-v1",uh=oh(import.meta.url);function ch(){return uh("node:sqlite").DatabaseSync}function mh(){return process.env.HOME||process.env.USERPROFILE||""}function Jt(t){let e=[],n=0,r=()=>{let s=0n,i=0n;for(;;){if(n>=t.length||i>63n)return null;let o=t[n++];if(s|=BigInt(o&127)<<i,i+=7n,!(o&128))break}return s<=BigInt(Number.MAX_SAFE_INTEGER)?Number(s):null};for(;n<t.length;){let s=r();if(s===null)return e;let i=s>>>3,o=s&7;if(i===0)return e;if(o===0){let a=r();if(a===null)return e;e.push({field:i,wire:o,varint:a})}else if(o===1){if(n+8>t.length)return e;n+=8,e.push({field:i,wire:o})}else if(o===5){if(n+4>t.length)return e;n+=4,e.push({field:i,wire:o})}else if(o===2){let a=r();if(a===null||n+a>t.length)return e;e.push({field:i,wire:o,bytes:t.subarray(n,n+a)}),n+=a}else return e}return e}function Ke(t,e){return t.find(n=>n.field===e)}function ph(t){let e=new Map;for(let n of t){if(n.field!==20||n.bytes===void 0)continue;let r=Jt(n.bytes),s=Ke(r,1)?.bytes,i=Ke(r,2)?.bytes;if(s===void 0||i===void 0)continue;let o=s.toString("utf8");e.has(o)||e.set(o,i.toString("utf8"))}return e}function fh(t){let e=Ke(Jt(t),5)?.bytes;if(e===void 0)return null;let n=Ke(Jt(e),1)?.bytes;if(n===void 0)return null;let r=Jt(n),s=Ke(r,1)?.varint;if(s===void 0)return null;let i=Ke(r,2)?.varint??0,o=s*1e3+Math.floor(i/1e6),a=new Date(o);return Number.isFinite(a.getTime())?a.toISOString():null}function gh(t){let e=Ke(t,4)?.bytes,n=e!==void 0?Jt(e):[],r=s=>{let i=Ke(n,s)?.varint;return i===void 0?null:X(i)};return{tokens:{input_uncached:r(2),input_cached:r(5),input_cache_write:r(4),output:r(3)},thinkingOutputTokens:r(9)}}function _h(t){let e=Ke(Jt(t),1)?.bytes;if(e===void 0)return null;let n=Jt(e),r=ph(n),s=r.get("request_id");if(s===void 0||s.length===0)return null;let i=Ke(n,19)?.bytes,o=i!==void 0&&i.length>0?i.toString("utf8"):null,a=r.get("last_step_index"),l=a===void 0?Number.NaN:Number(a),d=Number.isSafeInteger(l)&&l>=0?l:null,{tokens:u,thinkingOutputTokens:c}=gh(n);return{requestId:s,model:o,lastStepIndex:d,tokens:u,thinkingOutputTokens:c}}function Rd(t,e){z(e);let n=t.prepare("SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) AS total FROM gen_metadata").get(),r=X(n?.total);if(r===null||r>e.maxBytes)return null;let s=t.prepare("SELECT idx, data FROM gen_metadata ORDER BY idx LIMIT ?").all(e.maxRows+1);if(s.length>e.maxRows)return null;let i=ih("sha256");i.update("rev:").update(ns).update(`
9
+ `);let o=[],a=[],l=0;for(let c of s){if(e.signal.throwIfAborted(),!(c.data instanceof Uint8Array))return null;let m=Buffer.from(c.data);if(l+=m.length,l>e.maxBytes)return null;i.update("g").update(String(c.idx)).update("\0").update(m).update(`
10
+ `);let p=_h(m);p!==null&&(o.push(p),p.lastStepIndex!==null&&a.push(p.lastStepIndex))}let d=new Map,u=[...new Set(a)].sort((c,m)=>c-m);for(let c of u){e.signal.throwIfAborted();let p=t.prepare("SELECT idx, step_payload FROM steps WHERE idx = ?").get(c)?.step_payload;if(!(p instanceof Uint8Array))continue;let f=Buffer.from(p);if(l+=f.length,l>e.maxBytes)return null;i.update("s").update(String(c)).update("\0").update(f).update(`
11
+ `);let g=fh(f);g!==null&&d.set(c,g)}return{revision:`${nr}+${ns}:sha256:${i.digest("hex")}`,generations:o,timestamps:d}}function hh(t){return t.generations.map(e=>({response_id:e.requestId,timestamp:e.lastStepIndex===null?null:t.timestamps.get(e.lastStepIndex)??null,model:e.model,tokens:e.tokens,files_read:null,files_written:null,external_io:null,read_bytes:null,write_bytes:null,model_provider:null,pricing_facts:Ve({reasoning:e.thinkingOutputTokens},e.tokens.output,e.tokens.input_cache_write)}))}var rr=class{conversationsDir;sqliteBusyTimeoutMs;constructor(e={}){this.conversationsDir=bd(e.agyConversationsDir??Sd(mh(),".gemini","antigravity-cli","conversations")),this.sqliteBusyTimeoutMs=e.sqliteBusyTimeoutMs??5e3}async discover(e,n,r=null){z(e);let s=await ah(this.conversationsDir,{withFileTypes:!0}).catch(()=>[]),i=[];for(let o of s){if(e.signal.throwIfAborted(),!o.isFile()||o.isSymbolicLink()||!o.name.endsWith(".db"))continue;let a=await lh(Sd(this.conversationsDir,o.name)).catch(()=>null);a!==null&&(r!==null&&te(a,r)<=0||i.push(a))}return i.sort(te),{sources:i.slice(0,n).map(o=>({provider:ht,sessionid:wd(o,".db"),source_id:o})),truncated:!1}}async open(e){let n=await ye(e.source_id,[this.conversationsDir]);if(n===null||wd(n,".db")!==e.sessionid||bd(dh(n))!==this.conversationsDir)return null;try{let r=new(ch())(n,{open:!0,readOnly:!0});return r.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),r}catch{return null}}async inspect(e,n){if(z(n),e.provider!==ht)return{status:"unsupported"};let r=await this.open(e);if(r===null)return{status:"unavailable"};try{let s=Rd(r,n);return s?{status:"ready",revision:s.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}async read(e,n,r){if(z(r),e.provider!==ht)return{status:"unsupported"};let s=await this.open(e);if(s===null)return{status:"unavailable"};try{s.exec("BEGIN");let i=Rd(s,r);if(i===null||i.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let o=hh(i);return s.exec("COMMIT"),{status:"complete",source:e,revision:n,checkpoint:n,responses:o}}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function kd(t={}){return new rr(t)}import{readdir as Ch,realpath as Nh}from"node:fs/promises";import{basename as eo,dirname as Ad,join as xd,resolve as Od}from"node:path";import xh from"node:zlib";import yh from"node:zlib";var Th=yh.zstdDecompressSync,Eh=40,vh=181,wh=47,Sh=253,bh=42,Rh=77,kh=24;function Ih(t,e){return t[e]===Eh&&t[e+1]===vh&&t[e+2]===wh&&t[e+3]===Sh}function Id(t,e){return(t[e]&240)===80&&t[e+1]===bh&&t[e+2]===Rh&&t[e+3]===kh}function Ah(t,e){if(Id(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!Ih(t,e))return;let n=e+4;if(n+1>t.length)return;let r=t[n];n+=1;let s=r>>6,i=(r&32)!==0,o=(r&4)!==0,a=r&3;i||(n+=1),n+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(n+=l,!(n>t.length)){for(;;){if(n+3>t.length)return;let d=t[n]|t[n+1]<<8|t[n+2]<<16,u=(d&1)!==0,c=d>>1&3,m=d>>3;if(n+=3,c===3||(n+=c===1?1:m,n>t.length))return;if(u)break}if(o&&(n+=4),!(n>t.length))return n-e}}function sr(t){let e=[],n=0;for(;n+4<=t.length;){let r=Ah(t,n);if(r===void 0||r<=0)break;e.push(t.subarray(n,n+r)),n+=r}return e}function rs(t){let e=[];for(let n of sr(t))Id(n,0)||e.push(Th(n).toString("utf8"));return e.join("")}var yt="dsh",Oh=xh.zstdDecompressSync;function Ld(t){return/^session(\.v\d+)?\.jsonl\.zstd$/.test(t)}var Lh=5e5,Dh=new Set(["read","read_image"]),Ph=new Set(["write","edit"]),Mh=new Set(["create_goal","get_goal","update_goal","todo_write","ask_user_question","exit_plan_mode","list_agents","interrupt_agent","job_list","job_kill","job_output"]);function Uh(t){return Mh.has(t)||_t(t)}function Fh(){return process.env.HOME||process.env.USERPROFILE||""}function jh(t){if(typeof t=="string")return Buffer.byteLength(t,"utf8");if(!Array.isArray(t))return null;let e=0,n=!1;for(let r of t){let s=F(r);s?.type==="text"&&typeof s.text=="string"&&(e+=Buffer.byteLength(s.text,"utf8"),n=!0)}return n?e:null}function Cd(t){if(!t)return null;let e=X(t.inputTokens),n=X(t.outputTokens);if(e===null||n===null)return null;let r=t.cacheReadTokens===void 0?null:X(t.cacheReadTokens);return{input_uncached:e,input_cached:r,input_cache_write:null,output:n}}function $h(t){return t.length>=4&&(t[0]&240)===80&&t[1]===42&&t[2]===77&&t[3]===24}function Wh(t,e){let n=sr(t),r=0;for(let o of n)r+=o.length;if(r!==t.length)return{text:"",truncated:!0};let s=[],i=0;for(let o of n){if(e.signal.throwIfAborted(),$h(o))continue;if(o.length>e.maxBytes)return{text:s.join(""),truncated:!0};let a;try{a=Oh(o)}catch{return{text:s.join(""),truncated:!0}}if(i+=a.length,i>e.maxBytes)return{text:s.join(""),truncated:!0};s.push(a.toString("utf8"))}return{text:s.join(""),truncated:!1}}function Hh(t){let e=[];for(let n of t.split(`
12
+ `)){if(!n.trim())continue;let r;try{r=JSON.parse(n)}catch{continue}let s=typeof r.type=="string"?r.type:"";s.endsWith("-chunks")||s==="assistant/chunk"&&F(F(r.data)?.chunk)?.type!=="usage"||e.push(r)}return e}function Bh(t){if(typeof t=="string")try{return F(JSON.parse(t))}catch{return null}return F(t)}function Nd(t,e){return typeof t!="number"||typeof e!="number"?null:`${t}\0${e}`}function Xh(t,e,n,r){let s=new Map,i=[],o=new Set,a=new Map,l=null,d=null,u=null;for(let m of t){r.signal.throwIfAborted();let p=F(m.data);if(m.type==="assistant/chunk"){let f=F(p?.chunk),g=F(f?.usage),_=Nd(p?.turn,p?.step);g&&_!==null&&typeof p?.turn=="number"&&typeof p?.step=="number"&&a.set(_,{turn:p.turn,step:p.step,usage:g,time:m.time});continue}if(m.type==="request/header"){let f=F(F(p?.header)?.config);typeof f?.provider=="string"&&f.provider&&(l=f.provider),typeof f?.model=="string"&&f.model&&(d=f.model);continue}if(m.type==="user/message"){if(F(p?.source)?.kind!=="user")continue;let g=typeof p?.id=="string"&&p.id?p.id:null;i.push({id:g,bytes:jh(p?.content)});continue}if(m.type==="assistant/message"){let f=F(p?.message),g=F(f?.source),_=typeof f?.id=="string"&&f.id?f.id:null,h=Nd(p?.turn,p?.step),E;if(h!==null)o.add(h),E=`dsh:turn-step:${p.turn}/${p.step}`;else{if(F(p?.usage))return{status:"partial"};E=_}if(E===null)return{status:"partial"};let y=Cd(F(p?.usage)),T=s.get(E);if(!T){if(T={meta:{response_id:E,timestamp:Ue(typeof m.time=="number"?m.time:null),model:(typeof g?.model=="string"&&g.model?g.model:null)??d,tokens:y??{...Ce},files_read:[],files_written:[]},obs:new Pe,io:new Me,reasoning:null,provider:typeof g?.provider=="string"&&g.provider?g.provider:null},s.set(E,T),s.size>r.maxRows)return{status:"partial"};for(let v of i)T.io.record({direction:"read",kind:"prompt",id:v.id,ref:null,bytes:v.bytes,basis:v.bytes===null?"unknown":"input_text"});i.length=0}if(y){T.meta.tokens=y;let v=X(F(p?.usage)?.reasoningTokens);v!==null&&(T.reasoning=v)}u=E;continue}if(m.type==="tool/call"){let f=u!==null?s.get(u):void 0;if(!f)continue;let g=typeof p?.callId=="string"&&p.callId?p.callId:null,_=typeof p?.name=="string"?p.name.toLowerCase():"",h=Bh(p?.arguments),E=(typeof h?.file_path=="string"&&h.file_path?h.file_path:null)??(typeof h?.path=="string"&&h.path?h.path:null);Dh.has(_)?E!==null?f.obs.record(g??"","read",E,null):me(f.io,g):Ph.has(_)?E!==null?f.obs.record(g??"","written",E,yn(h)):me(f.io,g):Uh(_)||me(f.io,g);continue}}for(let[m,{turn:p,step:f,usage:g,time:_}]of a){if(o.has(m))continue;r.signal.throwIfAborted();let h=Cd(g),E=new Me;me(E,null);let y={meta:{response_id:`dsh:turn-step:${p}/${f}`,timestamp:Ue(typeof _=="number"?_:null),model:d,tokens:h??{...Ce},files_read:[],files_written:[]},obs:new Pe,io:E,reasoning:X(g.reasoningTokens),provider:l};if(s.set(y.meta.response_id,y),s.size>r.maxRows)return{status:"partial"}}let c=[];for(let{meta:m,obs:p,io:f,reasoning:g,provider:_}of s.values()){let h=p.files("read"),E=p.files("written"),y=f.entries();c.push({...m,files_read:h,files_written:E,external_io:y,read_bytes:Re(h,y,"read"),write_bytes:Re(E,y,"written"),model_provider:l??_,pricing_facts:Ve({reasoning:g??void 0},m.tokens.output,m.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:c}}var to=class{sessionsDir;maxDiscoveryTraversalVisits;constructor(e={}){let n=e.dshHome??process.env.DSH_HOME??xd(Fh(),".dsh");this.sessionsDir=Od(n,"sessions"),this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):Lh}async discover(e,n,r=null){z(e);let{paths:s,truncated:i}=await qh(this.sessionsDir,n,this.maxDiscoveryTraversalVisits,e,r);return{sources:s.map(o=>({provider:yt,sessionid:eo(Ad(o)),source_id:o})),truncated:i}}matches(e,n){return Ld(eo(n))&&eo(Ad(n))===e.sessionid}async inspect(e,n){if(z(n),e.provider!==yt)return{status:"unsupported"};let r=await ye(e.source_id,[this.sessionsDir]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await Ne(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){if(z(r),e.provider!==yt)return{status:"unsupported"};let s=await ye(e.source_id,[this.sessionsDir]);if(!s||!this.matches(e,s))return{status:"unavailable"};let i=await Ne(s,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let{text:o,truncated:a}=Wh(i.data,r);return a?{status:"partial"}:Xh(Hh(o),e,n,r)}};async function qh(t,e,n,r,s){let i=[],o=0,a=!1;async function l(d,u){r.signal.throwIfAborted();let c=await Ch(d,{withFileTypes:!0}).catch(()=>[]);c.sort((m,p)=>te(m.name,p.name));for(let m of c){if(r.signal.throwIfAborted(),i.length>=e)return;if(o+=1,o>n){a=!0;return}let p=xd(d,m.name);if(m.isDirectory()&&!m.isSymbolicLink()&&u<2){if(await l(p,u+1),a||i.length>=e)return}else if(m.isFile()&&Ld(m.name)){let f=await Nh(p).catch(()=>Od(p));(s===null||te(f,s)>0)&&i.push(f)}}}return await l(t,0),{paths:i.sort(te),truncated:a}}function Dd(t={}){return new to(t)}import{readdir as Jh,realpath as Gh}from"node:fs/promises";import{basename as ss,dirname as Vh,join as no,resolve as Pd}from"node:path";var Tt="qwen",Kh="qwen-code.api_response",Yh="qwen-code.tool_call",Md="chats",zh=new Set(["read_file"]),Qh=new Set(["write_file"]),Zh=5e5;function ey(){return process.env.HOME||process.env.USERPROFILE||""}function ty(){let t=ey();return[no(t,".qwen","projects"),no(t,".qwen.bk1","projects")]}function ny(t){return t.type!=="system"||t.subtype!=="ui_telemetry"?null:F(F(t.systemPayload)?.uiEvent)}function ry(t){let e=t["event.name"];return typeof e=="string"&&e.length>0?e:null}function sy(t){let e=X(t.input_token_count),n=X(t.output_token_count),r=X(t.cached_content_token_count),s=X(t.total_token_count);if(e===null||n===null||r===null||s===null||r>e||e+n!==s)return null;let i=t.thoughts_token_count===void 0?null:X(t.thoughts_token_count);return t.thoughts_token_count!==void 0&&(i===null||i>n)?null:{input_uncached:e-r,input_cached:r,input_cache_write:null,output:n}}function iy(t){let e=F(t)?.parts;if(!Array.isArray(e))return null;let n=0,r=!1;for(let s of e){let i=F(s);!i||i.thought===!0||typeof i.text=="string"&&(n+=Buffer.byteLength(i.text,"utf8"),r=!0)}return r?n:null}function oy(t){let e=new Map,n=new Set,r=new Map;for(let o of t){let a=typeof o.uuid=="string"&&o.uuid?o.uuid:null;if(a!==null&&(e.set(a,typeof o.parentUuid=="string"&&o.parentUuid?o.parentUuid:null),o.type==="user")){n.add(a);let l=iy(o.message);l!==null&&r.set(a,l)}}let s=new Map;return{promptBytes:r,resolve:o=>{let a=[],l=new Set,d=o,u;for(;;){let c=s.get(d);if(c){u=c;break}if(n.has(d)){u={kind:"found",uuid:d};break}if(!e.has(d)){u={kind:"broken"};break}if(l.has(d)){u={kind:"broken"};break}l.add(d),a.push(d);let m=e.get(d)??null;if(m===null){u={kind:"clean"};break}d=m}for(let c of a)s.set(c,u);return u}}}function ay(t,e,n,r){let{promptBytes:s,resolve:i}=oy(t),o=new Set,a=new Map,l=0;for(let u of t){r.signal.throwIfAborted();let c=ny(u);if(c===null)continue;let m=ry(c);if(m===Kh){let E=typeof c.response_id=="string"&&c.response_id?c.response_id:null;if(E===null)return{status:"unsupported"};let y=sy(c);if(y===null)return{status:"partial"};let T=a.get(E);if(!T){if(T={meta:{response_id:E,timestamp:Ue(c["event.timestamp"]??u.timestamp),model:typeof c.model=="string"&&c.model?c.model:null,tokens:{...Ce},files_read:[],files_written:[]},obs:new Pe,io:new Me,thoughts:null},a.set(E,T),a.size>r.maxRows)return{status:"partial"};let b=typeof u.uuid=="string"&&u.uuid?u.uuid:null,S=b===null?{kind:"broken"}:i(b);if(S.kind==="broken")T.io.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"});else if(S.kind==="found"&&!o.has(S.uuid)){o.add(S.uuid);let R=s.get(S.uuid)??null;T.io.record({direction:"read",kind:"prompt",id:S.uuid,ref:null,bytes:R,basis:R===null?"unknown":"input_text"})}}T.meta.tokens=y,typeof c.model=="string"&&c.model&&(T.meta.model=c.model);let v=X(c.thoughts_token_count);v!==null&&(T.thoughts=v);continue}if(m!==Yh)continue;let p=typeof c.response_id=="string"&&c.response_id?c.response_id:null;if(p===null)continue;let f=a.get(p);if(f===void 0)return{status:"partial"};let g=typeof c.function_name=="string"?c.function_name.toLowerCase():"",_=F(c.function_args),h=`tool-${l++}`;if(zh.has(g)){let E=typeof _?.file_path=="string"?_.file_path:null;E!==null?f.obs.record(h,"read",E,null):me(f.io,h)}else if(Qh.has(g)){let E=typeof _?.file_path=="string"?_.file_path:null;E!==null?f.obs.record(h,"written",E,yn(_)):me(f.io,h)}else _t(g)||me(f.io,h)}let d=[];for(let{meta:u,obs:c,io:m,thoughts:p}of a.values()){let f=c.files("read"),g=c.files("written"),_=m.entries();d.push({...u,files_read:f,files_written:g,external_io:_,read_bytes:Re(f,_,"read"),write_bytes:Re(g,_,"written"),model_provider:null,pricing_facts:Ve({reasoning:p??void 0},u.tokens.output,u.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:d}}async function ly(t,e,n,r,s){let i=[],o=0,a=!1;async function l(d){r.signal.throwIfAborted();let u=await Jh(d,{withFileTypes:!0}).catch(()=>[]);u.sort((c,m)=>te(c.name,m.name));for(let c of u){if(r.signal.throwIfAborted(),i.length>=e)return;if(o+=1,o>n){a=!0;return}let m=no(d,c.name);if(c.isDirectory()&&!c.isSymbolicLink()){if(await l(m),a||i.length>=e)return}else if(c.isFile()&&c.name.endsWith(".jsonl")&&ss(d)===Md){let p=await Gh(m).catch(()=>Pd(m));(s===null||te(p,s)>0)&&i.push(p)}}}return await l(t),{paths:i.sort(te),truncated:a}}function dy(t,e){for(let n of t){let r=n.sessionId;if(typeof r=="string"&&r.length>0&&r!==e)return!1}return!0}var ro=class{roots;maxDiscoveryTraversalVisits;constructor(e={}){this.roots=(e.qwenProjectsDirs??ty()).map(n=>Pd(n)),this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):Zh}async discover(e,n,r=null){z(e);let s=new Map,i=!1;for(let a of this.roots){e.signal.throwIfAborted();let l=await ly(a,n,this.maxDiscoveryTraversalVisits,e,r);l.truncated&&(i=!0);for(let d of l.paths)s.set(d,d)}return{sources:[...s.keys()].sort(te).slice(0,n).map(a=>({provider:Tt,sessionid:ss(a,".jsonl"),source_id:a})),truncated:i}}matches(e,n){return ss(n,".jsonl")===e.sessionid&&ss(Vh(n))===Md}async inspect(e,n){if(z(n),e.provider!==Tt)return{status:"unsupported"};let r=await ye(e.source_id,[...this.roots]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await Ne(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){if(z(r),e.provider!==Tt)return{status:"unsupported"};let s=await ye(e.source_id,[...this.roots]);if(!s||!this.matches(e,s))return{status:"unavailable"};let i=await Ne(s,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let o=Kr(i.data,r);return o?dy(o,e.sessionid)?ay(o,e,n,r):{status:"unavailable"}:{status:"partial"}}};function Ud(t={}){return new ro(t)}import{createHash as uy}from"node:crypto";import{createRequire as cy}from"node:module";import{join as ir,resolve as so}from"node:path";var Gt="opencode",my=cy(import.meta.url);function py(){return my("node:sqlite").DatabaseSync}function Fd(){return process.env.HOME||process.env.USERPROFILE||""}function fy(){let t=process.env.XDG_DATA_HOME||ir(Fd(),".local","share"),e=process.env.XDG_CONFIG_HOME||ir(Fd(),".config");return[ir(t,"opencode","opencode.db"),ir(t,"opencode","opencode-local.db"),ir(e,"opencode","opencode.db")]}var gy=["read","read_file","view","view_file","view_image"],_y=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],hy=["filePath","path","file","file_path","filepath","notebook_path","paths"],yy=new Set(["session-job-notification"]);function Ty(t){if(typeof t!="string")return null;let e=t.toLowerCase();return e==="apply_patch"?"apply_patch":gy.includes(e)?"read":_y.includes(e)?"written":null}function jd(t,e=hy){let n=F(t);if(!n)return null;for(let r of e){let s=n[r];if(typeof s=="string"&&s.length>0)return s;if(Array.isArray(s)){for(let i of s)if(typeof i=="string"&&i.length>0)return i}}return null}function Ey(t){let e=F(t);if(!e)return null;if(typeof e.content=="string")return Buffer.byteLength(e.content,"utf8");if(typeof e.newString=="string")return Buffer.byteLength(e.newString,"utf8");if(typeof e.new_string=="string")return Buffer.byteLength(e.new_string,"utf8");if(typeof e.newSource=="string")return Buffer.byteLength(e.newSource,"utf8");if(Array.isArray(e.edits)){let n=0;for(let r of e.edits){let s=F(r),i=s?.newString??s?.new_string;if(typeof i!="string")return null;n+=Buffer.byteLength(i,"utf8")}return n}return null}function vy(t){let e=new Map,n=null,r=()=>{n&&(e.set(n.path,(e.get(n.path)??0)+n.bytes),n=null)};for(let s of t.split(`
13
+ `)){let i=s.replace(/\r$/,""),o=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(i);if(o){r(),n={path:o[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(i);if(a){n&&(n.path=a[1].trim());continue}if(i.startsWith("*** ")){r();continue}n&&i.startsWith("+")&&(n.bytes+=Buffer.byteLength(i.slice(1),"utf8")+1)}return r(),[...e].map(([s,i])=>({path:s,bytes:i}))}function wy(t){if(typeof t!="string"||t.length===0)return null;try{let e=new URL(t);return e.protocol!=="http:"&&e.protocol!=="https:"?null:`${e.origin}${e.pathname}`}catch{return null}}function Sy(t,e=!1){let n=F(t);if(!n)return{...Ce};let r=n.input===void 0?e?null:0:X(n.input),s=n.output===void 0?e?null:0:X(n.output),i=n.reasoning===void 0?e?null:0:X(n.reasoning),o=F(n.cache),a=o?.read===void 0?e?null:0:X(o.read),l=o?.write===void 0?e?null:0:X(o.write);return e&&r===0&&s===0&&i===0&&a===0&&l===0?{...Ce}:e?{input_uncached:r!==null&&l!==null&&Number.isSafeInteger(r+l)?r+l:null,input_cached:a,input_cache_write:l,output:s!==null&&i!==null&&Number.isSafeInteger(s+i)?s+i:null}:r===null||s===null||i===null||a===null||l===null?{...Ce}:r+s+i+a+l===0?{...Ce}:{input_uncached:r+l,input_cached:a,input_cache_write:l,output:s+i}}function $d(t,e,n){z(n);let r=n.maxRows*20,s=t.prepare("SELECT (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM message WHERE session_id=?) + (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM part WHERE session_id=?) AS total").get(e,e),i=X(s?.total);if(i===null||i>n.maxBytes)return null;let o=t.prepare("SELECT id,time_created,time_updated,data FROM message WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1),a=t.prepare("SELECT id,message_id,time_created,time_updated,data FROM part WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1);if(o.length+a.length>r)return null;let l=0,d=uy("sha256");for(let u of[...o,...a]){n.signal.throwIfAborted();let c=JSON.stringify(u);if(l+=Buffer.byteLength(c),l>n.maxBytes)return null;d.update(c).update(`
14
+ `)}return{revision:`${nr}:sha256:${d.digest("hex")}`,messages:o,parts:a}}function by(t){let e=0,n=!1,r=!1;for(let s of t){let i;try{i=F(JSON.parse(s.data))}catch{continue}let o=typeof i?.type=="string"?i.type:"";i?.synthetic===!0||i?.ignored===!0||(o==="text"&&typeof i.text=="string"?(e+=Buffer.byteLength(i.text,"utf8"),n=!0):o&&!yy.has(o)&&(r=!0))}return n?e:r?"unknown":null}function Ry(t,e,n,r){let s=new Map;for(let d of n.parts){let u=s.get(d.message_id)??[];u.push(d),s.set(d.message_id,u)}let i=new Map;for(let d of n.messages){let u;try{u=F(JSON.parse(d.data))}catch{continue}if(u?.role!=="user")continue;let c=by(s.get(d.id)??[]);c==="unknown"?i.set(d.id,null):c!==null&&i.set(d.id,c)}let o=new Map,a=new Set;for(let d of n.messages){let u;try{u=F(JSON.parse(d.data))}catch{continue}if(u?.role!=="assistant")continue;let c=typeof u.parentID=="string"?u.parentID:null;c!==null&&i.has(c)&&!a.has(c)&&(a.add(c),o.set(d.id,{id:c,bytes:i.get(c)}))}let l=[];for(let d of n.messages){r.signal.throwIfAborted();let u;try{u=F(JSON.parse(d.data))}catch{return{status:"partial"}}if(r.requireBillingCounters&&u&&Object.hasOwn(u,"tokens")&&u.role!=="assistant")return{status:"partial"};if(!u||u.role!=="assistant")continue;let c=new Pe,m=new Me,p=0,f=o.get(d.id);f&&m.record({direction:"read",kind:"prompt",id:f.id,ref:null,bytes:f.bytes,basis:f.bytes===null?"unknown":"input_text"});for(let S of s.get(d.id)??[]){let R;try{R=F(JSON.parse(S.data))}catch{return{status:"partial"}}if(R?.type!=="tool")continue;let O=typeof R.tool=="string"?R.tool.toLowerCase():"",N=Ty(R.tool),A=F(R.state),w=F(A?.input),I=typeof R.callID=="string"&&R.callID?R.callID:typeof A?.callID=="string"&&A.callID?A.callID:S.id;if(N==="written")c.record(I,"written",jd(w),Ey(w));else if(N==="apply_patch"){let C=w?.patchText;if(typeof C=="string")for(let k of vy(C))c.record(I,"written",k.path,k.bytes);else me(m,I)}else if(N==="read"){let C=jd(w,["filePath","path","file","file_path"]);if(C===null)continue;let k=null;if(A?.status==="completed"){let x=F(F(A.metadata)?.display);x?.type==="file"&&typeof x.text=="string"&&(k=Buffer.byteLength(x.text,"utf8"))}c.record(I,"read",C,k)}else if(O==="webfetch"){p+=1;let C=A?.status==="completed"?A.output:void 0;m.record({direction:"read",kind:"web",id:I,ref:wy(w?.url),bytes:typeof C=="string"?Buffer.byteLength(C,"utf8"):null,basis:typeof C=="string"?"normalized_content":"unknown"})}else _t(R.tool)||me(m,I)}let g=F(u.time),_=F(u.model)?.modelID??u.modelID,h=Sy(u.tokens,r.requireBillingCounters),E=F(u.tokens),y=c.files("read"),T=c.files("written"),v=m.entries(),b=Ve({reasoning:E?.reasoning,webFetch:p>0?p:void 0},h.output,h.input_cache_write);if(l.push({response_id:d.id,timestamp:Ue(g?.created??d.time_created),model:typeof _=="string"&&_?_:null,tokens:h,files_read:y,files_written:T,external_io:v,read_bytes:Re(y,v,"read"),write_bytes:Re(T,v,"written"),model_provider:typeof u.providerID=="string"&&u.providerID?u.providerID:null,pricing_facts:b}),l.length>r.maxRows)return{status:"partial"}}return{status:"complete",source:t,revision:e,checkpoint:e,responses:l}}var or=class{dbPaths;sqliteBusyTimeoutMs;constructor(e={}){this.dbPaths=(e.dbPaths??fy()).map(n=>so(n)),this.sqliteBusyTimeoutMs=e.sqliteBusyTimeoutMs??5e3}openDb(e){if(!this.dbPaths.includes(so(e)))return null;try{let n=new(py())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),n}catch{return null}}async discover(e,n,r=null){z(e);let s=new Map;for(let o of this.dbPaths){e.signal.throwIfAborted();let a=await ye(o,[so(o,"..")]);if(!a||r&&te(a,r.source_id)<0)continue;let l=this.openDb(a);if(l)try{let d=r?.source_id===a?r.sessionid:"",u=l.prepare("SELECT id FROM session WHERE id > ? ORDER BY id LIMIT ?").all(d,n);for(let c of u)typeof c.id=="string"&&c.id&&!s.has(c.id)&&s.set(c.id,{provider:Gt,sessionid:c.id,source_id:a})}catch{}finally{l.close()}}return{sources:[...s.values()].sort((o,a)=>te(`${o.source_id}\0${o.sessionid}`,`${a.source_id}\0${a.sessionid}`)).slice(0,n),truncated:!1}}inspect(e,n){if(z(n),e.provider!==Gt)return{status:"unsupported"};let r=this.openDb(e.source_id);if(!r)return{status:"unavailable"};try{if(r.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return{status:"unavailable"};let i=$d(r,e.sessionid,n);return i?{status:"ready",revision:i.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}read(e,n,r){if(z(r),e.provider!==Gt)return{status:"unsupported"};let s=this.openDb(e.source_id);if(!s)return{status:"unavailable"};try{if(s.exec("BEGIN"),s.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return s.exec("ROLLBACK"),{status:"unavailable"};let o=$d(s,e.sessionid,r);if(!o||o.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=Ry(e,n,o,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function Wd(t={}){return new or(t)}import{readdir as ky,realpath as Iy,stat as Ay}from"node:fs/promises";import{basename as Hd,dirname as Cy,join as Bd,resolve as Xd}from"node:path";var Et="copilot",qd="events.jsonl",Ny=new Set(["report_intent"]),xy=new Set(["view"]);function Oy(t){let e=new Map,n=null,r=()=>{n&&(e.set(n.path,(e.get(n.path)??0)+n.bytes),n=null)};for(let s of t.split(`
15
+ `)){let i=s.replace(/\r$/,""),o=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(i);if(o){r(),n={path:o[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(i);if(a){n&&(n.path=a[1].trim());continue}if(i.startsWith("*** ")){r();continue}n&&i.startsWith("+")&&(n.bytes+=Buffer.byteLength(i.slice(1),"utf8")+1)}return r(),[...e].map(([s,i])=>({path:s,bytes:i}))}function Ly(t){let e=t?.content;return typeof e=="string"?Buffer.byteLength(e,"utf8"):null}function Dy(t,e,n){let r=F(t);if(!r)return{entry:null,incomplete:t!=null};let s=[],i=!1;for(let[a,l]of Object.entries(r)){let d=F(l);if(!d){i=!0;continue}let u=F(d.usage),c=F(d.requests),m=F(d.tokenDetails),p=F(m?.input);s.push({model:a,requests_count:c?X(c.count):null,input_tokens:u?X(u.inputTokens):null,input_other_tokens:p?X(p.tokenCount):null,cache_read_tokens:u?X(u.cacheReadTokens):null,cache_write_tokens:u?X(u.cacheWriteTokens):null,output_tokens:u?X(u.outputTokens):null,reasoning_tokens:u?X(u.reasoningTokens):null})}s.sort((a,l)=>te(a.model,l.model));let o=i||s.length>0;return e===null?{entry:null,incomplete:o}:{entry:{native_id:e,recorded_at:n,kind:"copilot_session_shutdown",semantics:"reported_scope_unknown",models:s},incomplete:i}}function Py(t,e,n,r){let s=new Map;for(let c of t){if(c.type!=="user.message")continue;let m=F(c.data),p=typeof m?.interactionId=="string"?m.interactionId:null;if(p===null)continue;let f=Ly(m);s.has(p)?s.get(p)===null&&f!==null&&s.set(p,f):s.set(p,f)}let i=new Map,o=new Set,a=new Map,l=!1,d=1e3;for(let c of t){if(r.signal.throwIfAborted(),c.type==="session.shutdown"){let h=typeof c.id=="string"&&c.id?c.id:null,E=Ue(c.timestamp),{entry:y,incomplete:T}=Dy(F(c.data)?.modelMetrics,h,E);if(T&&(l=!0),y){let v=a.get(y.native_id);if(v&&JSON.stringify(v)!==JSON.stringify(y))l=!0;else if(a.set(y.native_id,y),a.size>d)return{snapshot:{status:"partial"},sessionUsage:null}}continue}if(c.type!=="assistant.message")continue;let m=F(c.data);if(!m)continue;let p=typeof m.messageId=="string"&&m.messageId?m.messageId:typeof c.id=="string"&&c.id?c.id:null;if(p===null)continue;let f=typeof m.interactionId=="string"?m.interactionId:null,g=i.get(p);if(!g){if(g={meta:{response_id:p,timestamp:Ue(c.timestamp),model:typeof m.model=="string"&&m.model?m.model:null,tokens:{...Ce},files_read:[],files_written:[]},obs:new Pe,io:new Me,promptRecorded:!1},i.set(p,g),i.size>r.maxRows)return{snapshot:{status:"partial"},sessionUsage:null};if(f!==null&&s.has(f)){if(!o.has(f)){o.add(f);let h=s.get(f);g.io.record({direction:"read",kind:"prompt",id:f,ref:null,bytes:h,basis:h===null?"unknown":"input_text"}),g.promptRecorded=!0}}else g.io.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})}let _=X(m.outputTokens);if(_!==null&&(g.meta.tokens.output=(g.meta.tokens.output??0)+_),g.meta.model===null&&typeof m.model=="string"&&m.model&&(g.meta.model=m.model),Array.isArray(m.toolRequests))for(let h of m.toolRequests){let E=F(h);if(!E)continue;let y=typeof E.name=="string"?E.name.toLowerCase():"",T=typeof E.toolCallId=="string"&&E.toolCallId?E.toolCallId:null,v=E.arguments;if(y==="create"){let b=F(v),S=typeof b?.path=="string"?b.path:null,R=typeof b?.file_text=="string"?Buffer.byteLength(b.file_text,"utf8"):null;S!==null?g.obs.record(T??p,"written",S,R):me(g.io,T)}else if(y==="apply_patch")if(typeof v=="string"){let b=Oy(v);if(b.length>0)for(let S of b)g.obs.record(T??p,"written",S.path,S.bytes);else me(g.io,T)}else me(g.io,T);else if(xy.has(y)){let b=F(v),S=typeof b?.path=="string"?b.path:null;S!==null?g.obs.record(T??p,"read",S,null):me(g.io,T)}else Ny.has(y)||me(g.io,T)}}let u=[];for(let{meta:c,obs:m,io:p}of i.values()){let f=m.files("read"),g=m.files("written"),_=p.entries();u.push({...c,files_read:f,files_written:g,external_io:_,read_bytes:Re(f,_,"read"),write_bytes:Re(g,_,"written"),model_provider:null,pricing_facts:null})}return l?{snapshot:{status:"partial"},sessionUsage:null}:{snapshot:{status:"complete",source:e,revision:n,checkpoint:n,responses:u},sessionUsage:a.size>0?[...a.values()]:null}}function My(){return process.env.HOME||process.env.USERPROFILE||""}var io=class{sessionStateDir;constructor(e={}){this.sessionStateDir=Xd(e.copilotSessionStateDir??Bd(My(),".copilot","session-state"))}async discover(e,n,r=null){z(e);let s;try{s=await ky(this.sessionStateDir)}catch{return{sources:[],truncated:!1}}let i=[];for(let o of s.sort(te)){e.signal.throwIfAborted();let a=Bd(this.sessionStateDir,o,qd);if(!(await Ay(a).catch(()=>null))?.isFile())continue;let d=await Iy(a).catch(()=>Xd(a)),u={provider:Et,sessionid:o,source_id:d};r!==null&&te(`${d}\0${o}`,r)<=0||i.push(u)}return i.sort((o,a)=>te(`${o.source_id}\0${o.sessionid}`,`${a.source_id}\0${a.sessionid}`)),{sources:i.slice(0,n),truncated:!1}}matches(e,n){return Hd(n)===qd&&Hd(Cy(n))===e.sessionid}async inspect(e,n){if(z(n),e.provider!==Et)return{status:"unsupported"};let r=await ye(e.source_id,[this.sessionStateDir]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await Ne(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){return(await this.readWithUsage(e,n,r)).snapshot}async readWithUsage(e,n,r){if(z(r),e.provider!==Et)return{snapshot:{status:"unsupported"},sessionUsage:null};let s=await ye(e.source_id,[this.sessionStateDir]);if(!s||!this.matches(e,s))return{snapshot:{status:"unavailable"},sessionUsage:null};let i=await Ne(s,r).catch(()=>null);if(!i||i.revision!==n)return{snapshot:{status:"partial"},sessionUsage:null};let o=Kr(i.data,r);return o?Py(o,e,n,r):{snapshot:{status:"partial"},sessionUsage:null}}};function Jd(t={}){return new io(t)}import{readdir as Gd,readFile as Uy,realpath as oo,stat as Vd}from"node:fs/promises";import{basename as lr,dirname as bn,isAbsolute as lo,join as Sn,relative as zd,resolve as ar,sep as Qd}from"node:path";var vt="kimi",uo="wire.jsonl",Zd="agents",Fy=new Set(["1.4","1.5"]),jy=5e5,$y=8*1024*1024,Wy=new Set(["read"]),Hy=new Set(["write","edit"]),By=new Set(["todolist","tasklist","taskoutput","taskstop","waitfor","creategoal","updategoal","getgoal","enterplanmode","exitplanmode","agentswarm","agent","skill","croncreate","crondelete","cronlist"]);function Xy(t){return By.has(t)||_t(t)}function qy(){return process.env.HOME||process.env.USERPROFILE||""}function Jy(t,e){if(t.length>0&&t[t.length-1]!==10)return null;let n=[],r=0;for(;r<t.length;){e.signal.throwIfAborted();let s=t.indexOf(10,r);s===-1&&(s=t.length);let i=t.toString("utf8",r,s);if(r=s+1,!!i.trim())try{let o=F(JSON.parse(i));if(!o)return null;n.push(o)}catch{return null}}return n}function Kd(t){let e=F(t);if(!e)return null;let n=X(e.inputOther),r=X(e.inputCacheRead),s=X(e.inputCacheCreation),i=X(e.output);return n===null||r===null||s===null||i===null?null:{input_uncached:n+s,input_cached:r,input_cache_write:s,output:i}}function Gy(t){if(!Array.isArray(t))return null;let e=0,n=!1;for(let r of t){let s=F(r);s?.type==="text"&&typeof s.text=="string"&&(e+=Buffer.byteLength(s.text,"utf8"),n=!0)}return n?e:null}var Vy=new Set(["system_trigger","cron_job","task"]);function Ky(t,e,n,r){let s=t.find(E=>E.type==="metadata"),i=s&&typeof s.protocol_version=="string"?s.protocol_version:null;if(i!==null&&!Fy.has(i))return{status:"unsupported"};let o=Yy(e.source_id),a=new Map,l=new Map,d=[],u=new Set,c=new Set,m=null,p=!1,f=E=>`${o}/${E}`,g=(E,y)=>{let T=f(E),v=a.get(T);return v||(v={meta:{response_id:T,timestamp:Ue(typeof y=="number"?y:null),model:null,tokens:{...Ce},files_read:[],files_written:[]},obs:new Pe,io:new Me,turnStepKey:null,tokensSource:"none"},a.set(T,v)),v},_=(E,y)=>{if(E.turnStepKey!==null)return;let T=y.turnId===void 0?null:String(y.turnId),v=y.step===void 0?null:String(y.step);T!==null&&v!==null&&(E.turnStepKey=`${T}.${v}`)};for(let E of t){if(r.signal.throwIfAborted(),E.type==="turn.prompt"){let T=F(E.origin),v=typeof T?.kind=="string"?T.kind:null,b=typeof E.promptId=="string"&&E.promptId?E.promptId:null;if(v!==null&&Vy.has(v))continue;if(b!==null){if(u.has(b))continue;u.add(b)}v==="user"?d.push({bytes:Gy(E.input),id:b}):d.push({bytes:null,id:b});continue}if(E.type==="usage.record"){if(c.size>1){p=!0;continue}if(c.size===0){m===null&&(p=!0);continue}let[T]=c,v=a.get(f(T));if(!v){p=!0;continue}if(v.tokensSource==="record"){p=!0;continue}let b=Kd(E.usage);b&&(v.meta.tokens=b,v.tokensSource="record");continue}if(E.type==="llm.request"){let T=typeof E.turnStep=="string"?E.turnStep:null,v=(typeof E.modelAlias=="string"&&E.modelAlias?E.modelAlias:null)??(typeof E.model=="string"&&E.model?E.model:null);T!==null&&v!==null&&(l.has(T)?l.get(T)!==v&&l.set(T,null):l.set(T,v));continue}if(E.type!=="context.append_loop_event")continue;let y=F(E.event);if(y){if(y.type==="step.begin"){let T=typeof y.uuid=="string"&&y.uuid?y.uuid:null;if(T===null)continue;let v=g(T,E.time);if(a.size>r.maxRows)return{status:"partial"};if(c.add(T),_(v,y),d.length>0){for(let b of d)v.io.record({direction:"read",kind:"prompt",id:b.id,ref:null,bytes:b.bytes,basis:b.bytes===null?"unknown":"input_text"});d.length=0}continue}if(y.type==="step.end"){let T=typeof y.uuid=="string"&&y.uuid?y.uuid:null;if(T===null)continue;let v=g(T,E.time);if(a.size>r.maxRows)return{status:"partial"};c.delete(T),m=T,_(v,y);let b=Kd(y.usage);b&&(v.meta.tokens=b),v.tokensSource="end",v.meta.timestamp===null&&(v.meta.timestamp=Ue(typeof E.time=="number"?E.time:null));continue}if(y.type==="tool.call"){let T=typeof y.stepUuid=="string"&&y.stepUuid?y.stepUuid:null;if(T===null)continue;let v=g(T,E.time);if(a.size>r.maxRows)return{status:"partial"};let b=typeof y.name=="string"?y.name.toLowerCase():"",S=typeof y.toolCallId=="string"&&y.toolCallId?y.toolCallId:null,R=F(y.args),O=typeof R?.path=="string"&&R.path?R.path:typeof R?.file_path=="string"&&R.file_path?R.file_path:null;Wy.has(b)?O!==null?v.obs.record(S??"","read",O,null):me(v.io,S):Hy.has(b)?O!==null?v.obs.record(S??"","written",O,yn(R)):me(v.io,S):Xy(b)||me(v.io,S);continue}}}let h=[];for(let{meta:E,obs:y,io:T,turnStepKey:v}of a.values()){E.model===null&&v!==null&&(E.model=l.get(v)??null);let b=y.files("read"),S=y.files("written"),R=T.entries();h.push({...E,files_read:b,files_written:S,external_io:R,read_bytes:Re(b,R,"read"),write_bytes:Re(S,R,"written"),model_provider:null,pricing_facts:Ve({},E.tokens.output,E.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:h,...p?{capture_status:"partial"}:{}}}function ao(t){return lr(t)===uo&&lr(bn(bn(t)))===Zd}function Yd(t){return lr(bn(bn(bn(t))))}function Yy(t){return lr(bn(t))}function zy(t,e){let n=zd(e,t);return n===""||!n.startsWith(`..${Qd}`)&&n!==".."&&!lo(n)}function Qy(t){if(t instanceof Error&&t.name==="AbortError")throw t}var dr=class{home;sessionsDir;indexPath;maxDiscoveryTraversalVisits;constructor(e={}){this.home=ar(e.kimiHome??process.env.KIMI_CODE_HOME??Sn(qy(),".kimi-code")),this.sessionsDir=Sn(this.home,"sessions"),this.indexPath=Sn(this.home,"session_index.jsonl"),this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):jy}async discover(e,n,r=null){z(e);let s=new Set,i=!1,o=await oo(this.sessionsDir).catch(()=>ar(this.sessionsDir)),a=m=>{ao(m)&&zy(m,o)&&s.add(m)},l=0,d=async(m,p)=>{if(e.signal.throwIfAborted(),i)return;let f=await Gd(m,{withFileTypes:!0}).catch(()=>[]);f.sort((g,_)=>te(g.name,_.name));for(let g of f){if(e.signal.throwIfAborted(),l+=1,l>this.maxDiscoveryTraversalVisits){i=!0;return}let _=Sn(m,g.name);if(g.isDirectory()&&!g.isSymbolicLink()&&p<4){if(await d(_,p+1),i)return}else g.isFile()&&g.name===uo&&ao(_)&&a(await oo(_).catch(()=>ar(_)))}};await d(this.sessionsDir,0);try{await this.unionIndex(a,e)}catch(m){Qy(m)}let u=[...s].sort(te);return{sources:(r===null?u:u.filter(m=>te(m,r)>0)).slice(0,n).map(m=>({provider:vt,sessionid:Yd(m),source_id:m})),truncated:i}}async unionIndex(e,n){let r=await Vd(this.indexPath).catch(()=>null);if(!r?.isFile()||r.size>$y)return;let s=await Uy(this.indexPath,{signal:n.signal});for(let i of s.toString("utf8").split(`
16
+ `)){if(n.signal.throwIfAborted(),!i.trim())continue;let o;try{o=F(JSON.parse(i))}catch{continue}let a=typeof o?.sessionId=="string"?o.sessionId:null,l=typeof o?.sessionDir=="string"?o.sessionDir:null;if(!a||!l||!lo(l)||lr(l)!==a)continue;let d=zd(this.sessionsDir,ar(l));if(d.startsWith(`..${Qd}`)||d===".."||lo(d))continue;let u=Sn(l,Zd),c=await Gd(u,{withFileTypes:!0}).catch(()=>[]);for(let m of c){if(!m.isDirectory())continue;let p=Sn(u,m.name,uo);(await Vd(p).catch(()=>null))?.isFile()&&e(await oo(p).catch(()=>ar(p)))}}}matches(e,n){return ao(n)&&Yd(n)===e.sessionid}async inspect(e,n){if(z(n),e.provider!==vt)return{status:"unsupported"};let r=await ye(e.source_id,[this.sessionsDir]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await Ne(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){if(z(r),e.provider!==vt)return{status:"unsupported"};let s=await ye(e.source_id,[this.sessionsDir]);if(!s||!this.matches(e,s))return{status:"unavailable"};let i=await Ne(s,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let o=Jy(i.data,r);return o?Ky(o,e,n,r):{status:"partial"}}};function eu(t={}){return new dr(t)}var wt=class{map=new Map;record(e,n,r,s){if(typeof r!="string"||r.length===0||r.includes("\0"))return;let i=`${e}\0${n}\0${r}`;this.map.has(i)||this.map.set(i,{direction:n,path:r,bytes:s})}files(e){let n=[];for(let r of this.map.values())r.direction===e&&n.push({path:r.path,bytes:r.bytes});return n}absorb(e){for(let[n,r]of e.map)this.map.has(n)||this.map.set(n,r)}},oT=0,St=class{map=new Map;record(e){let n;e.id!==null?n=`id\0${e.id}\0${e.direction}\0${e.kind}`:e.bytes===null?n=`mark\0${e.direction}\0${e.kind}\0${e.basis}\0${e.ref??""}`:n=`seq\0${oT++}`,this.map.has(n)||this.map.set(n,e)}entries(){return[...this.map.values()]}absorb(e){for(let[n,r]of e.map)this.map.has(n)||this.map.set(n,r)}},aT=new Set(["schedulewakeup","taskcreate","taskupdate","taskoutput","taskstop","todowrite","todoread","croncreate","crondelete","cronlist","monitor","listagents","toolsearch","askuserquestion","exitplanmode","agent","skill","job"]);function ho(t){return typeof t=="string"&&aT.has(t.toLowerCase())}function mr(t,e){t.record({direction:"read",kind:"unattributed",id:e,ref:null,bytes:null,basis:"unknown"}),t.record({direction:"write",kind:"unattributed",id:e,ref:null,bytes:null,basis:"unknown"})}function lu(t){if(typeof t!="string"||t.length===0)return null;try{let e=new URL(t);return e.protocol!=="http:"&&e.protocol!=="https:"?null:`${e.origin}${e.pathname}`}catch{return null}}function In(t,e,n){if(t===null)return null;let r=n==="written"?"write":"read",s=0;for(let i of t){if(i.bytes===null)return null;s+=i.bytes}for(let i of e)if(i.direction===r){if(i.bytes===null)return null;s+=i.bytes}return s}function kn(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}function yo(t,e,n){let r={},s=kn(t.cacheWrite5m),i=kn(t.cacheWrite1h),o=kn(t.reasoning),a=kn(t.webSearch),l=kn(t.webFetch);o!==null&&(e===null||o<=e)&&(r.reasoning_output_tokens=o);let d=(s??0)+(i??0),u=n===null||d<=n;return s!==null&&u&&(r.cache_write_5m_tokens=s),i!==null&&u&&(r.cache_write_1h_tokens=i),a!==null&&(r.web_search_requests=a),l!==null&&(r.web_fetch_requests=l),Object.keys(r).length>0?r:null}var Rn=["claude","codex","lmplayer",ht,yt,Gt,Et,Tt,vt,"muse","miniplayer"],ur={input_uncached:null,input_cached:null,input_cache_write:null,output:null},lT=5e5,To="bx3",dT=Zy(import.meta.url);function os(){return process.env.HOME||process.env.USERPROFILE||""}function uT(){if(process.env.OPENCODE_DB)return[ot(process.env.OPENCODE_DB)];let t=process.env.XDG_DATA_HOME||Vt(os(),".local","share");return[Vt(t,"lmplayer","opencode-local.db"),Vt(t,"lmplayer","opencode-dev.db")]}function cT(){return dT("node:sqlite").DatabaseSync}function q(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}function xe(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}function Eo(t){if(typeof t!="string"&&typeof t!="number")return null;let e=new Date(t);return Number.isFinite(e.getTime())?e.toISOString():null}function cr(t){if(!Number.isSafeInteger(t.maxBytes)||t.maxBytes<=0)throw new Error("maxBytes must be a positive safe integer");if(!Number.isSafeInteger(t.maxRows)||t.maxRows<=0)throw new Error("maxRows must be a positive safe integer");t.signal.throwIfAborted()}function as(t){return`${t.source_id}\0${t.sessionid}`}function bt(t,e){return t<e?-1:t>e?1:0}function co(t,e){return bt(as(t),as(e))}var mo=["claude","codex","lmplayer"];function mT(t){let e={version:2,pos:t.pos,done:t.done,rr:t.rr};return Buffer.from(JSON.stringify(e),"utf8").toString("base64url")}function ru(t){let e=q(t);if(!e||typeof e.source_id!="string"||typeof e.sessionid!="string"||e.source_id.includes("\0")||e.sessionid.includes("\0"))throw new Error("invalid passive session discovery cursor");return{source_id:e.source_id,sessionid:e.sessionid}}function pT(t){if(t===void 0)return null;let e;try{e=q(JSON.parse(Buffer.from(t,"base64url").toString("utf8")))}catch{throw new Error("invalid passive session discovery cursor")}if(!e)throw new Error("invalid passive session discovery cursor");if(e.version===1){let i=e.provider;if(!Number.isSafeInteger(i)||i<0||i>=mo.length)throw new Error("invalid passive session discovery cursor");let o=i,a=ru({source_id:e.source_id,sessionid:e.sessionid}),l=new Map([[mo[o],a]]),d=new Set(mo.slice(0,o));return{pos:l,done:d,rr:0}}if(e.version!==2)throw new Error("invalid passive session discovery cursor");let n=q(e.pos);if(!n||!Array.isArray(e.done)||!Number.isSafeInteger(e.rr)||e.rr<0)throw new Error("invalid passive session discovery cursor");let r=new Map;for(let[i,o]of Object.entries(n))r.set(i,ru(o));let s=new Set;for(let i of e.done){if(typeof i!="string")throw new Error("invalid passive session discovery cursor");s.add(i)}return{pos:r,done:s,rr:e.rr}}var fT=["read","read_file","view","view_file","view_image"],gT=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],_T=["filePath","path","file","file_path","filepath","notebook_path","paths"];function du(t){if(typeof t!="string")return null;let e=t.toLowerCase();return e==="apply_patch"?"apply_patch":fT.includes(e)?"read":gT.includes(e)?"written":null}function hT(t){return typeof t=="string"?(()=>{try{return JSON.parse(t)}catch{return t}})():t}function ls(t,e=_T){let n=q(t);if(!n)return null;for(let r of e){let s=n[r];if(typeof s=="string"&&s.length>0)return s;if(Array.isArray(s)){for(let i of s)if(typeof i=="string"&&i.length>0)return i}}return null}function uu(t){let e=q(t);if(!e)return null;if(typeof e.content=="string")return Buffer.byteLength(e.content,"utf8");if(typeof e.new_string=="string")return Buffer.byteLength(e.new_string,"utf8");if(typeof e.newString=="string")return Buffer.byteLength(e.newString,"utf8");if(typeof e.new_source=="string")return Buffer.byteLength(e.new_source,"utf8");if(typeof e.newSource=="string")return Buffer.byteLength(e.newSource,"utf8");if(Array.isArray(e.edits)){let n=0;for(let r of e.edits){let s=q(r),i=s?.new_string??s?.newString;if(typeof i!="string")return null;n+=Buffer.byteLength(i,"utf8")}return n}return null}function ds(t){let e=new Map,n=null,r=()=>{n&&(e.set(n.path,(e.get(n.path)??0)+n.bytes),n=null)};for(let s of t.split(`
17
+ `)){let i=s.replace(/\r$/,""),o=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(i);if(o){r(),n={path:o[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(i);if(a){n&&(n.path=a[1].trim());continue}if(i.startsWith("*** ")){r();continue}n&&i.startsWith("+")&&(n.bytes+=Buffer.byteLength(i.slice(1),"utf8")+1)}return r(),[...e].map(([s,i])=>({path:s,bytes:i}))}var yT=[["text(await tools.apply_patch(",2],["await tools.apply_patch(",1],["tools.apply_patch(",1]];function TT(t){let e=0,n=t.length,r=()=>{for(;e<n&&/\s/.test(t[e]);)e++};r();let s=0,i=!1;for(let[d,u]of yT)if(t.startsWith(d,e)){e+=d.length,s=u,i=!0;break}if(!i||t[e]!=='"')return null;let o=e;e++;let a=!1;for(;e<n;){let d=t[e];if(d==="\\"){e+=2;continue}if(d==='"'){e++,a=!0;break}e++}if(!a)return null;let l;try{l=JSON.parse(t.slice(o,e))}catch{return null}if(typeof l!="string")return null;for(let d=0;d<s;d++){if(r(),t[e]!==")")return null;e++}return r(),t[e]===";"&&e++,r(),e<n?null:l}function su(t){if(t.length===0||t.endsWith(`
18
+ `))return null;let e=[];for(let n of t.split(`
19
+ `)){let r=/^\s*\d+\t(.*)$/s.exec(n);if(r===null)return null;e.push(r[1])}return e.join(`
20
+ `)}async function iu(t,e){cr(e);let n=await tu(t).catch(()=>null);if(!n?.isFile()||n.size>e.maxBytes)return null;let r=await tT(t,{signal:e.signal});e.signal.throwIfAborted();let s=await tu(t).catch(()=>null);return!s?.isFile()||n.dev!==s.dev||n.ino!==s.ino||n.size!==s.size||n.mtimeMs!==s.mtimeMs?null:{revision:`${To}:sha256:${_o("sha256").update(r).digest("hex")}`,data:r}}function ET(t,e){if(t.length>0&&t[t.length-1]!==10)return null;let n=[],r=0;for(;r<t.length;){e.signal.throwIfAborted();let s=t.indexOf(10,r);s===-1&&(s=t.length);let i=t.toString("utf8",r,s);if(r=s+1,!!i.trim())try{let o=q(JSON.parse(i));if(!o)return null;n.push(o)}catch{return null}}return n}function vT(t){return is(rT(t))==="subagents"}function wT(t){let e=q(t);if(!e)return null;let n=xe(e.input_tokens),r=xe(e.output_tokens);if(n===null||r===null)return null;let s=e.cache_read_input_tokens===void 0?0:xe(e.cache_read_input_tokens),i=e.cache_creation_input_tokens===void 0?0:xe(e.cache_creation_input_tokens);return s===null||i===null?null:{input_uncached:n+i,input_cached:s,input_cache_write:i,output:r}}function ST(t,e){let n=new Map;for(let r of t){if(e.signal.throwIfAborted(),r.type!=="user")continue;let s=q(r.message),i=Array.isArray(s?.content)?s.content:null;if(!i)continue;let o=i.map(q).filter(u=>u?.type==="tool_result"),a=o.length===1,l=q(r.toolUseResult),d=l?.type==="text"?q(l.file):null;for(let u of o){if(typeof u.tool_use_id!="string"||u.tool_use_id.length===0)continue;let c,m=null;if(u.is_error===!0)c=null;else if(a&&d&&typeof d.content=="string")c=Buffer.byteLength(d.content,"utf8"),m=typeof d.filePath=="string"?d.filePath:null;else if(typeof u.content=="string"){let p=su(u.content);c=p!==null?Buffer.byteLength(p,"utf8"):null}else if(Array.isArray(u.content)){let p=u.content.map(q).filter(f=>f?.type==="text"&&typeof f.text=="string").map(f=>f.text);if(p.length===1){let f=su(p[0]);c=f!==null?Buffer.byteLength(f,"utf8"):null}else c=null}else c=null;n.set(u.tool_use_id,{bytes:c,cleanPath:m})}}return n}function bT(t){let e=t?.content;if(typeof e=="string")return Buffer.byteLength(e,"utf8");if(Array.isArray(e)){let n=0,r=!1;for(let s of e){let i=q(s);i?.type==="text"&&typeof i.text=="string"&&(n+=Buffer.byteLength(i.text,"utf8"),r=!0)}if(r)return n}return null}function RT(t){if(t.type!=="user"||t.toolUseResult!==void 0||t.isMeta===!0||t.isCompactSummary===!0||t.isVisibleInTranscriptOnly===!0||t.promptSource==="system"||t.scheduledTaskId!==void 0||t.scheduledFireId!==void 0)return!1;let e=q(t.message)?.content;return!(Array.isArray(e)&&e.some(n=>q(n)?.type==="tool_result"))}function kT(t){let e=new Map,n=new Set,r=new Map;for(let o of t){let a=typeof o.uuid=="string"&&o.uuid?o.uuid:null;if(a!==null&&(e.set(a,typeof o.parentUuid=="string"&&o.parentUuid?o.parentUuid:null),RT(o))){n.add(a);let l=bT(q(o.message));l!==null&&r.set(a,l)}}let s=new Map;return{promptBytes:r,parent:e,resolve:o=>{let a=[],l=new Set,d=o,u;for(;;){let c=s.get(d);if(c){u=c;break}if(n.has(d)){u={kind:"found",uuid:d};break}if(!e.has(d)){u={kind:"broken"};break}if(l.has(d)){u={kind:"broken"};break}l.add(d),a.push(d);let m=e.get(d)??null;if(m===null){u={kind:"clean"};break}d=m}for(let c of a)s.set(c,u);return u}}}function IT(t,e){let n=q(e.cache_creation),r=q(e.output_tokens_details),s=q(e.server_tool_use),i=(o,a)=>{let l=kn(a);l!==null&&(t[o]=l)};i("cacheWrite5m",n?.ephemeral_5m_input_tokens),i("cacheWrite1h",n?.ephemeral_1h_input_tokens),i("reasoning",r?.thinking_tokens),i("webSearch",s?.web_search_requests),i("webFetch",s?.web_fetch_requests)}function AT(t,e,n,r,s=!1){let i=ST(t,r),{promptBytes:o,parent:a,resolve:l}=kT(t),d=new Set,u=(f,g)=>{let _=o.get(g)??null;f.record({direction:"read",kind:"prompt",id:g,ref:null,bytes:_,basis:_===null?"unknown":"input_text"})},c=f=>{f.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})},m=new Map;for(let f of t){if(r.signal.throwIfAborted(),f.type!=="assistant"||f.isSidechain===!0&&!s||f.isMeta===!0)continue;let g=q(f.message);if(!g||typeof g.id!="string"||g.id.length===0)continue;let _=m.get(g.id);if(!_){if(_={meta:{response_id:g.id,timestamp:Eo(f.timestamp),model:null,tokens:{...ur},files_read:[],files_written:[]},obs:new wt,io:new St,pricingRaw:{}},m.set(g.id,_),m.size>r.maxRows)return{status:"partial"};let E=typeof f.uuid=="string"&&f.uuid?f.uuid:null;if(E===null)c(_.io);else{let y=l(E);if(y.kind==="broken")c(_.io);else if(y.kind==="found"){let T=[],v=y.uuid;for(;v!==null&&!d.has(v);){let b=v;d.add(b),T.push(b);let S=a.get(b)??null;if(S===null){v=null;continue}let R=l(S);v=R.kind==="found"?R.uuid:null}for(let b=T.length-1;b>=0;b-=1)u(_.io,T[b])}}}let h=q(g.usage);if(h){let E=wT(h);E&&(_.meta.tokens=E),IT(_.pricingRaw,h)}if(typeof g.model=="string"&&g.model&&(_.meta.model=g.model),Array.isArray(g.content))for(let E of g.content){let y=q(E);if(y?.type!=="tool_use")continue;let T=typeof y.id=="string"&&y.id?y.id:g.id,v=du(y.name),b=hT(y.input),S=typeof y.name=="string"?y.name.toLowerCase():"";if(v==="read"){let R=ls(b,["file_path","filePath","path","file"]);if(R===null)continue;let O=i.get(T),N=O===void 0||O.cleanPath!==null&&O.cleanPath!==R?null:O.bytes;_.obs.record(T,"read",R,N)}else if(v==="written")_.obs.record(T,"written",ls(b),uu(b));else if(v==="apply_patch"){let R=typeof b=="string"?b:q(b)?.input;if(typeof R=="string")for(let O of ds(R))_.obs.record(T,"written",O.path,O.bytes)}else S==="webfetch"||S==="websearch"?_.io.record({direction:"read",kind:"web",id:T,ref:lu(q(b)?.url),bytes:null,basis:"unknown"}):ho(y.name)||mr(_.io,T)}}let p=[];for(let{meta:f,obs:g,io:_,pricingRaw:h}of m.values()){let E=g.files("read"),y=g.files("written"),T=_.entries();p.push({...f,files_read:E,files_written:y,external_io:T,read_bytes:In(E,T,"read"),write_bytes:In(y,T,"written"),model_provider:null,pricing_facts:yo(h,f.tokens.output,f.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:p}}function CT(t){let e=q(t);if(!e)return null;let n=xe(e.input_tokens),r=xe(e.cached_input_tokens),s=xe(e.output_tokens);if(n===null||r===null||s===null||r>n)return null;let i=e.cache_write_input_tokens===void 0?null:xe(e.cache_write_input_tokens);return e.cache_write_input_tokens!==void 0&&i===null?null:{input_uncached:n-r,input_cached:r,input_cache_write:i,output:s}}function NT(t,e,n){let r=typeof t.call_id=="string"&&t.call_id?t.call_id:null,s=typeof t.name=="string"?t.name.toLowerCase():"",i=t.type==="custom_tool_call"?t.input:t.arguments;if(s==="apply_patch"&&typeof i=="string"){if(r!==null)for(let o of ds(i))e.record(r,"written",o.path,o.bytes);return}if(typeof i=="string"){let o=TT(i);if(o!==null){if(r!==null)for(let a of ds(o))e.record(r,"written",a.path,a.bytes);return}}ho(s)||mr(n,r)}function xT(t){let n=q(t.internal_chat_message_metadata_passthrough)?.content_item_kinds,r=t.content;if(!Array.isArray(n))return"unknown";if(!Array.isArray(r))return"injected";let s=0,i=!1;for(let o=0;o<r.length;o+=1){if(n[o]!=="user.text")continue;let a=q(r[o]);a&&typeof a.text=="string"&&(s+=Buffer.byteLength(a.text,"utf8"),i=!0)}return i?{bytes:s}:"injected"}function OT(t,e,n,r){let s=new Map,i=new Map,o=null,a=null,l=new wt,d=new St,u=0,c=!1,m=!0,p=new Set;for(let g of t){r.signal.throwIfAborted();let _=q(g.payload);if(g.type==="session_meta"&&_&&typeof _.model_provider=="string"&&_.model_provider){a=_.model_provider;continue}if(g.type==="turn_context"&&_){let T=typeof _.model=="string"&&_.model?_.model:null;T&&(o=T),T&&typeof _.turn_id=="string"&&i.set(_.turn_id,T);continue}if(g.type==="response_item"&&_){if(_.type==="function_call"||_.type==="custom_tool_call")NT(_,l,d);else if(_.type==="local_shell_call")mr(d,typeof _.call_id=="string"?_.call_id:null);else if(_.type==="web_search_call")u+=1,d.record({direction:"read",kind:"web",id:typeof _.id=="string"?_.id:null,ref:null,bytes:null,basis:"unknown"});else if(_.type==="message"&&_.role==="user"){let T=xT(_),v=typeof _.id=="string"&&_.id?_.id:null;T==="unknown"?d.record({direction:"read",kind:"prompt",id:v,ref:null,bytes:null,basis:"unknown"}):T!=="injected"&&(v===null?d.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"}):p.has(v)||(p.add(v),d.record({direction:"read",kind:"prompt",id:v,ref:null,bytes:T.bytes,basis:"input_text"})))}continue}if(g.type==="event_msg"&&_?.type==="token_count"){c=!0,m&&(l=new wt,d=new St,u=0);continue}if(g.type!=="token_usage_record"||!_)continue;if(typeof _.response_id!="string"||_.response_id.length===0)return{status:"unsupported"};let h=CT(_.usage);if(!h)return{status:"partial"};let E=typeof _.turn_id=="string"?i.get(_.turn_id)??o:o,y=s.get(_.response_id);if(!y&&(y={meta:{response_id:_.response_id,timestamp:null,model:null,tokens:h,files_read:[],files_written:[]},obs:new wt,io:new St,rawUsage:null,webSearch:0},s.set(_.response_id,y),s.size>r.maxRows))return{status:"partial"};m=!1,y.meta.timestamp=Eo(g.timestamp),y.meta.model=E??null,y.meta.tokens=h,y.rawUsage=q(_.usage),y.obs.absorb(l),y.io.absorb(d),y.webSearch+=u,l=new wt,d=new St,u=0}if(c&&s.size===0)return{status:"unsupported"};let f=[];for(let{meta:g,obs:_,io:h,rawUsage:E,webSearch:y}of s.values()){let T=_.files("read"),v=_.files("written"),b=h.entries(),S=q(E),R=yo({reasoning:S?.reasoning_output_tokens,webSearch:y>0?y:void 0},g.tokens.output,g.tokens.input_cache_write);f.push({...g,files_read:T,files_written:v,external_io:b,read_bytes:In(T,b,"read"),write_bytes:In(v,b,"written"),model_provider:a,pricing_facts:R})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:f,...c?{capture_status:"partial"}:{}}}function LT(t,e=!1){let n=q(t);if(!n)return{...ur};let r=n.input===void 0?e?null:0:xe(n.input),s=n.output===void 0?e?null:0:xe(n.output),i=n.reasoning===void 0?e?null:0:xe(n.reasoning),o=q(n.cache),a=o?.read===void 0?e?null:0:xe(o.read),l=o?.write===void 0?e?null:0:xe(o.write);return e&&r===0&&s===0&&i===0&&a===0&&l===0?{...ur}:e?{input_uncached:r!==null&&l!==null&&Number.isSafeInteger(r+l)?r+l:null,input_cached:a,input_cache_write:l,output:s!==null&&i!==null&&Number.isSafeInteger(s+i)?s+i:null}:r===null||s===null||i===null||a===null||l===null?{...ur}:r+s+i+a+l===0?{...ur}:{input_uncached:r+l,input_cached:a,input_cache_write:l,output:s+i}}function ou(t,e,n){cr(n);let r=n.maxRows*20,s=t.prepare("SELECT (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM message WHERE session_id=?) + (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM part WHERE session_id=?) AS total").get(e,e),i=xe(s?.total);if(i===null||i>n.maxBytes)return null;let o=t.prepare("SELECT id,time_created,time_updated,data FROM message WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1),a=t.prepare("SELECT id,message_id,time_created,time_updated,data FROM part WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1);if(o.length+a.length>r)return null;let l=0,d=_o("sha256");for(let u of[...o,...a]){n.signal.throwIfAborted();let c=JSON.stringify(u);if(l+=Buffer.byteLength(c),l>n.maxBytes)return null;d.update(c).update(`
21
+ `)}return{revision:`${To}:sha256:${d.digest("hex")}`,messages:o,parts:a}}var DT=new Set(["session-job-notification"]);function PT(t){let e=0,n=!1,r=!1;for(let s of t){let i;try{i=q(JSON.parse(s.data))}catch{continue}let o=typeof i?.type=="string"?i.type:"";i?.synthetic===!0||i?.ignored===!0||(o==="text"&&typeof i.text=="string"?(e+=Buffer.byteLength(i.text,"utf8"),n=!0):o&&!DT.has(o)&&(r=!0))}return n?e:r?"unknown":null}function MT(t,e,n,r){let s=new Map;for(let d of n.parts){let u=s.get(d.message_id)??[];u.push(d),s.set(d.message_id,u)}let i=new Map;for(let d of n.messages){let u;try{u=q(JSON.parse(d.data))}catch{continue}if(u?.role!=="user")continue;let c=PT(s.get(d.id)??[]);c==="unknown"?i.set(d.id,null):c!==null&&i.set(d.id,c)}let o=new Map,a=new Set;for(let d of n.messages){let u;try{u=q(JSON.parse(d.data))}catch{continue}if(u?.role!=="assistant")continue;let c=typeof u.parentID=="string"?u.parentID:null;c!==null&&i.has(c)&&!a.has(c)&&(a.add(c),o.set(d.id,{id:c,bytes:i.get(c)}))}let l=[];for(let d of n.messages){r.signal.throwIfAborted();let u;try{u=q(JSON.parse(d.data))}catch{return{status:"partial"}}if(r.requireBillingCounters&&u&&Object.hasOwn(u,"tokens")&&u.role!=="assistant")return{status:"partial"};if(!u||u.role!=="assistant")continue;let c=new wt,m=new St,p=0,f=o.get(d.id);f&&m.record({direction:"read",kind:"prompt",id:f.id,ref:null,bytes:f.bytes,basis:f.bytes===null?"unknown":"input_text"});for(let S of s.get(d.id)??[]){let R;try{R=q(JSON.parse(S.data))}catch{return{status:"partial"}}if(R?.type!=="tool")continue;let O=typeof R.tool=="string"?R.tool.toLowerCase():"",N=du(R.tool),A=q(R.state),w=q(A?.input),I=typeof R.callID=="string"&&R.callID?R.callID:typeof A?.callID=="string"&&A.callID?A.callID:S.id;if(N==="written")c.record(I,"written",ls(w),uu(w));else if(N==="apply_patch"){let C=w?.patchText;if(typeof C=="string")for(let k of ds(C))c.record(I,"written",k.path,k.bytes);else mr(m,I)}else if(N==="read"){let C=ls(w,["filePath","path","file","file_path"]);if(C===null)continue;let k=null;if(A?.status==="completed"){let x=q(q(A.metadata)?.display);x?.type==="file"&&typeof x.text=="string"&&(k=Buffer.byteLength(x.text,"utf8"))}c.record(I,"read",C,k)}else if(O==="webfetch"){p+=1;let C=A?.status==="completed"?A.output:void 0;m.record({direction:"read",kind:"web",id:I,ref:lu(w?.url),bytes:typeof C=="string"?Buffer.byteLength(C,"utf8"):null,basis:typeof C=="string"?"normalized_content":"unknown"})}else ho(R.tool)||mr(m,I)}let g=q(u.time),_=q(u.model)?.modelID??u.modelID,h=LT(u.tokens,r.requireBillingCounters),E=q(u.tokens),y=c.files("read"),T=c.files("written"),v=m.entries(),b=yo({reasoning:E?.reasoning,webFetch:p>0?p:void 0},h.output,h.input_cache_write);if(l.push({response_id:d.id,timestamp:Eo(g?.created??d.time_created),model:typeof _=="string"&&_?_:null,tokens:h,files_read:y,files_written:T,external_io:v,read_bytes:In(y,v,"read"),write_bytes:In(T,v,"written"),model_provider:typeof u.providerID=="string"&&u.providerID?u.providerID:null,pricing_facts:b}),l.length>r.maxRows)return{status:"partial"}}return{status:"complete",source:t,revision:e,checkpoint:e,responses:l}}async function po(t,e){if(!nu(t))return null;let n=await eT(t).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await fo(t).catch(()=>null);if(!r)return null;for(let s of e){let i=await fo(s).catch(()=>ot(s)),o=sT(i,r);if(o===""||!o.startsWith(`..${iT}`)&&o!==".."&&!nu(o))return r}return null}async function au(t,e,n,r,s=null){let i=[],o=0,a=!1;async function l(d){r.signal.throwIfAborted();let u=await nT(d,{withFileTypes:!0}).catch(()=>[]);u.sort((c,m)=>bt(c.name,m.name));for(let c of u){if(r.signal.throwIfAborted(),i.length>=e)return;if(o+=1,o>n){a=!0;return}let m=Vt(d,c.name);if(c.isDirectory()&&!c.isSymbolicLink()){if(await l(m),a||i.length>=e)return}else if(c.isFile()&&c.name.endsWith(".jsonl")){let p=await fo(m).catch(()=>ot(m));(s===null||bt(p,s)>0)&&i.push(p)}}}return await l(t),{paths:i.sort(bt),truncated:a}}function UT(t,e){let n=new Set;if(e.length===0)return n;let r=400;for(let{db:s}of t)for(let i=0;i<e.length;i+=r){let o=e.slice(i,i+r);try{let a=s.prepare(`SELECT id FROM session WHERE id IN (${o.map(()=>"?").join(",")})`).all(...o);for(let l of a)typeof l.id=="string"&&n.add(l.id)}catch{}}return n}var go=class{claudeProjectsDir;codexSessionDirs;lmplayerDbPaths;sqliteBusyTimeoutMs;maxDiscoveryTraversalVisits;agyReader;dshReader;qwenReader;opencodeReader;copilotReader;kimiReader;sessionDataReaders;constructor(e={}){this.sessionDataReaders=Object.fromEntries([pd(e.museDataHome),ts(e.miniplayerHome)].map(n=>[n.provider,new Tn(n)])),this.claudeProjectsDir=ot(e.claudeProjectsDir??Vt(os(),".claude","projects")),this.codexSessionDirs=(e.codexSessionDirs??[Vt(os(),".codex","sessions"),Vt(os(),".code","sessions")]).map(n=>ot(n)),this.lmplayerDbPaths=(e.lmplayerDbPaths??uT()).map(n=>ot(n)),this.sqliteBusyTimeoutMs=e.sqliteBusyTimeoutMs??5e3,this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):lT,this.agyReader=kd(e.agyConversationsDir?{agyConversationsDir:e.agyConversationsDir}:{}),this.dshReader=Dd(e.dshHome?{dshHome:e.dshHome}:{}),this.qwenReader=Ud(e.qwenProjectsDirs?{qwenProjectsDirs:e.qwenProjectsDirs}:{}),this.opencodeReader=Wd(e.opencodeDbPaths?{dbPaths:e.opencodeDbPaths}:{}),this.copilotReader=Jd(e.copilotSessionStateDir?{copilotSessionStateDir:e.copilotSessionStateDir}:{}),this.kimiReader=eu(e.kimiHome?{kimiHome:e.kimiHome}:{})}capabilities(){let e=_o("sha256").update(JSON.stringify({claudeProjectsDir:this.claudeProjectsDir,codexSessionDirs:this.codexSessionDirs,lmplayerDbPaths:this.lmplayerDbPaths,agyExtractionRevisionTag:ns,sessionData:Object.values(this.sessionDataReaders).map(({format:n})=>[n.provider,n.root,n.revision])})).digest("hex");return{scope:"account",revision:`${To}:${e}`,providers:[...Rn],metering:{muse:"partial",miniplayer:"partial",claude:"per_response",codex:"per_response",lmplayer:"per_response",opencode:"per_response",[Tt]:"per_response",[yt]:"per_response",[ht]:"partial",[Et]:"partial",[vt]:"per_response"}}}async discover(e){if(cr(e),!Number.isSafeInteger(e.maxSources)||e.maxSources<=0)throw new Error("maxSources must be a positive safe integer");let n=pT(e.after),r=n?.pos??new Map,s=n?.done??new Set,i=n?.rr??0,o=Rn.filter(_=>!s.has(_));if(o.length===0)return{sources:[],complete:!0,cursor:null};let a=new Map,l=new Map;for(let _ of o){e.signal.throwIfAborted();let h=r.get(_)??null,{sources:E,truncated:y}=await this.discoverProvider(Rn.indexOf(_),e,e.maxSources+1,h);if(y)throw new Error(`passive session discovery exceeded the traversal budget for provider "${_}"; cannot certify a complete or progressing sweep`);let T=h?as({provider:_,source_id:h.source_id,sessionid:h.sessionid}):null,v=T===null?E:E.filter(b=>bt(as(b),T)>0);l.set(_,v.length>e.maxSources),a.set(_,v.slice(0,e.maxSources))}let d=i%o.length,u=o.map((_,h)=>o[(h+d)%o.length]),c=new Map(o.map(_=>[_,0])),m=[],p=!0;for(;m.length<e.maxSources&&p;){p=!1;for(let _ of u){if(m.length>=e.maxSources)break;let h=a.get(_),E=c.get(_);E<h.length&&(m.push(h[E]),c.set(_,E+1),p=!0)}}let f={},g=[...s];for(let _ of o){let h=a.get(_),E=c.get(_);if(!l.get(_)&&E===h.length){g.push(_);continue}if(E>0){let T=h[E-1];f[_]={source_id:T.source_id,sessionid:T.sessionid}}else{let T=r.get(_);T&&(f[_]=T)}}return Rn.every(_=>g.includes(_))?{sources:m,complete:!0,cursor:null}:{sources:m,complete:!1,cursor:mT({pos:f,done:g,rr:i+1})}}async inspect(e,n){if(cr(n),!Rn.includes(e.provider))return{status:"unsupported"};if(e.provider==="claude"||e.provider==="codex"){let r=e.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,s=await po(e.source_id,r);if(!s||!this.jsonlSourceMatches(e,s))return{status:"unavailable"};let i=await iu(s,n).catch(()=>null);return i?{status:"ready",revision:i.revision}:{status:"partial"}}return e.provider==="lmplayer"?this.inspectLmplayer(e,n):e.provider===ht?this.agyReader.inspect(e,n):e.provider===yt?this.dshReader.inspect(e,n):e.provider===Gt?this.opencodeReader.inspect(e,n):e.provider===Et?this.copilotReader.inspect(e,n):e.provider===Tt?this.qwenReader.inspect(e,n):e.provider===vt?this.kimiReader.inspect(e,n):this.sessionDataReaders[e.provider]?.inspect(e,n)??{status:"unsupported"}}async read(e,n,r){if(cr(r),e.provider==="claude"||e.provider==="codex"){let s=e.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,i=await po(e.source_id,s);if(!i||!this.jsonlSourceMatches(e,i))return{status:"unavailable"};let o=await iu(i,r).catch(()=>null);if(!o)return{status:"partial"};if(o.revision!==n)return{status:"partial"};let a=ET(o.data,r);return a?e.provider==="claude"?AT(a,e,n,r,vT(i)):OT(a,e,n,r):{status:"partial"}}if(e.provider==="lmplayer")return this.readLmplayer(e,n,r);if(e.provider===ht)return this.agyReader.read(e,n,r);if(e.provider===yt)return this.dshReader.read(e,n,r);if(e.provider===Gt)return this.opencodeReader.read(e,n,r);if(e.provider===Tt)return this.qwenReader.read(e,n,r);if(e.provider===Et){let{snapshot:s,sessionUsage:i}=await this.copilotReader.readWithUsage(e,n,r);return s.status!=="complete"?s:{...s,session_usage:i}}return e.provider===vt?this.kimiReader.read(e,n,r):this.sessionDataReaders[e.provider]?this.sessionDataReaders[e.provider].read(e,n,r):{status:"unsupported"}}async discoverProvider(e,n,r,s){let i=s?.source_id??null;if(e===0){let{paths:o,truncated:a}=await au(this.claudeProjectsDir,r,this.maxDiscoveryTraversalVisits,n,i);return{sources:o.map(l=>({provider:"claude",sessionid:is(l,".jsonl"),source_id:l})).sort(co),truncated:a}}if(e===1){let o=[],a=!1;for(let l of[...this.codexSessionDirs].sort(bt)){let d=await au(l,r,this.maxDiscoveryTraversalVisits,n,i);d.truncated&&(a=!0);for(let u of d.paths){let c=is(u,".jsonl"),m=c.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u);o.push({provider:"codex",sessionid:m?.[1]??c,source_id:u})}}return{sources:o.sort(co).slice(0,r),truncated:a}}if(e===2)return{sources:await this.discoverLmplayer(n,r,s),truncated:!1};if(e===3)return this.agyReader.discover(n,r,i);if(e===4)return this.dshReader.discover(n,r,i);if(e===5)return this.opencodeReader.discover(n,r,s);if(e===6){let o=s?`${s.source_id}\0${s.sessionid}`:null;return this.copilotReader.discover(n,r,o)}return e===7?this.qwenReader.discover(n,r,i):e===8?this.kimiReader.discover(n,r,i):this.sessionDataReaders[Rn[e]].discover(n,r,i)}jsonlSourceMatches(e,n){let r=is(n,".jsonl");return e.provider==="claude"?r===e.sessionid:(r.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u)?.[1]??r)===e.sessionid}openLmplayer(e){if(!this.lmplayerDbPaths.includes(ot(e)))return null;try{let n=new(cT())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),n}catch{return null}}async discoverLmplayer(e,n,r){let s=[];try{let i=[...new Set(this.lmplayerDbPaths.map(a=>ot(a)))].sort(bt);for(let a of i){e.signal.throwIfAborted();let l=await po(a,[ot(a,"..")]);if(!l)continue;let d=this.openLmplayer(l);d&&s.push({path:l,db:d})}let o=[];for(let a=0;a<s.length&&o.length<n;a+=1){e.signal.throwIfAborted();let{path:l,db:d}=s[a];if(r&&bt(l,r.source_id)<0)continue;let u=r?.source_id===l?r.sessionid:"";for(;;){e.signal.throwIfAborted();let c;try{c=d.prepare("SELECT id FROM session WHERE id > ? ORDER BY id LIMIT ?").all(u,n)}catch{break}if(c.length===0)break;let m=c.map(f=>typeof f.id=="string"&&f.id?f.id:"").filter(Boolean);if(m.length===0)break;let p=a===0?new Set:UT(s.slice(0,a),m);for(let f of m){if(o.length>=n)break;p.has(f)||o.push({provider:"lmplayer",sessionid:f,source_id:l})}if(u=m[m.length-1],o.length>=n||c.length<n)break}}return o.sort(co).slice(0,n)}finally{for(let{db:i}of s)try{i.close()}catch{}}}inspectLmplayer(e,n){let r=this.openLmplayer(e.source_id);if(!r)return{status:"unavailable"};try{if(r.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return{status:"unavailable"};let i=ou(r,e.sessionid,n);return i?{status:"ready",revision:i.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}readLmplayer(e,n,r){let s=this.openLmplayer(e.source_id);if(!s)return{status:"unavailable"};try{if(s.exec("BEGIN"),s.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return s.exec("ROLLBACK"),{status:"unavailable"};let o=ou(s,e.sessionid,r);if(!o||o.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=MT(e,n,o,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function cu(t={}){return new go(t)}import{createHash as fu}from"node:crypto";import{opendir as jT,open as $T,realpath as gu}from"node:fs/promises";import{constants as vo}from"node:fs";import{join as WT,relative as HT,isAbsolute as BT,basename as XT,dirname as qT}from"node:path";function pr(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);if(e.length>1)try{let r=JSON.parse(e[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(t)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function Kt(t){let e=pr(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let n=t.split(`
22
+ `).map(a=>a).filter(a=>a.trim().length>0);if(n.length===0)throw new Error("gemini session file is empty");let r=n[0],s;try{s=JSON.parse(r)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<n.length;a++){let l;try{l=JSON.parse(n[a])}catch{continue}if(l===null||typeof l!="object")continue;let d=l;if("$set"in d&&d.$set&&typeof d.$set=="object"){Object.assign(s,d.$set);continue}if(typeof d.id=="string"||typeof d.type=="string"){let u=d;if(typeof u.id=="string"){let c=o.get(u.id);c?FT(c,u):(i.push(u),o.set(u.id,u))}else i.push(u)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:i}}function FT(t,e){for(let[n,r]of Object.entries(e))if(r!==void 0){if(n==="tokens"&&mu(t.tokens)&&mu(r)){t.tokens={...t.tokens,...r};continue}t[n]=r}}function mu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function pu(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:n,...r}=t,s=[JSON.stringify(r)];for(let i of n)s.push(JSON.stringify(i));return s.join(`
23
+ `)+`
24
+ `}var at=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,JT=t=>{let e=typeof t=="number"||typeof t=="string"?new Date(t):null;return e&&Number.isFinite(e.getTime())?e.toISOString():null},_u=(t,e,n)=>({response_id:t,timestamp:JT(e),model:typeof n=="string"&&n?n:null,tokens:{input_uncached:null,input_cached:null,input_cache_write:null,output:null},files_read:null,files_written:null});function GT(t,e,n){try{if(t==="pi"){let u=e.split(`
25
+ `).filter(m=>m.trim()).map(m=>JSON.parse(m));if(u[0]?.type!=="session"||u[0]?.id!==n||u.slice(1).some(m=>m?.type==="session"))return;let c=[];for(let m of u){let p=m.message;if(p?.usage!==void 0&&(m.type!=="message"||p.role!=="assistant"))return;if(m.type!=="message"||p?.role!=="assistant")continue;if(typeof m.id!="string"||!m.id)return;let f=p.usage,g=_u(m.id,m.timestamp,p.model);if(!f||typeof f!="object")return;g.tokens={input_uncached:at(f.input),input_cached:at(f.cacheRead),input_cache_write:at(f.cacheWrite),output:at(f.output)},g.pricing_facts={reasoning_output_tokens:at(f.reasoning)},g.providerCostUsd=typeof f.cost?.total=="number"&&Number.isFinite(f.cost.total)&&f.cost.total>=0?f.cost.total:null,c.push(g)}return c}let r;try{r=JSON.parse(e)}catch{}let s=Array.isArray(r?.messages)?r.messages:e.split(`
26
+ `).filter(u=>u.trim()).map(u=>JSON.parse(u));if((Array.isArray(r?.messages)?r:s[0])?.sessionId!==n)return;let o=new Map,a=new Map;for(let u of s){if(!u||typeof u!="object"||Array.isArray(u)||u.$set?.sessionId!==void 0&&u.$set.sessionId!==n)return;if(typeof u.id!="string")continue;let c=o.get(u.id)??{};for(let m of["model","timestamp","type"]){let p=u[m];if(!(m==="model"&&p===null&&c.model===void 0)&&p!==void 0){if(typeof p!="string"||c[m]!==void 0&&c[m]!==p)return;c[m]=p}}o.set(u.id,c),Object.hasOwn(u,"tokens")&&a.set(u.id,u.tokens)}let l=Kt(e);if(!l||l.sessionId!==n)return;let d=[];for(let u of l.messages){if(u.tokens!==void 0&&!["gemini","assistant"].includes(u.type??""))return;if(!["gemini","assistant"].includes(u.type??""))continue;if(!u.id||!u.tokens)return;let c=a.get(u.id)??u.tokens,m=at(c.input),p=at(c.cached),f=at(c.output),g=at(c.thoughts),_=_u(u.id,u.timestamp,u.model);_.tokens={input_uncached:m!==null&&p!==null&&p<=m?m-p:null,input_cached:p,input_cache_write:null,output:f!==null&&g!==null&&Number.isSafeInteger(f+g)?f+g:null},_.pricing_facts={reasoning_output_tokens:g},d.push(_)}return d}catch{return}}function wo(t,e){let n=async(s,i)=>{i.signal.throwIfAborted();let o=await gu(s),a=await gu(e),l=HT(a,o);if(l===".."||l.startsWith("../")||l.startsWith("..\\")||BT(l))throw Error("outside native root");let d=await $T(o,vo.O_RDONLY|vo.O_NOFOLLOW|vo.O_NONBLOCK);try{let u=await d.stat({bigint:!0});if(!u.isFile()||u.size>BigInt(i.maxBytes))throw Error("native byte limit");let c=Buffer.alloc(Number(u.size)+1),m=0;for(;m<c.length;){i.signal.throwIfAborted();let f=await d.read(c,m,c.length-m,m);if(!f.bytesRead)break;m+=f.bytesRead}let p=await d.stat({bigint:!0});if(i.signal.throwIfAborted(),m!==Number(u.size)||u.size!==p.size||u.mtimeNs!==p.mtimeNs||u.ctimeNs!==p.ctimeNs||u.ino!==p.ino||u.dev!==p.dev)throw Error("changing native file");return new TextDecoder("utf-8",{fatal:!0}).decode(c.subarray(0,m))}finally{await d.close()}},r=s=>{try{return t==="pi"?JSON.parse(s.slice(0,s.indexOf(`
27
+ `)<0?s.length:s.indexOf(`
28
+ `))).id:Kt(s)?.sessionId}catch{return}};return{async discover(s){let i=[],o=0,a=!0,l=async(d,u)=>{if(s.signal.throwIfAborted(),u>4){a=!1;return}let c=await jT(d).catch(()=>{a=!1});if(c)for await(let m of c){if(s.signal.throwIfAborted(),++o>s.maxRows||i.length>=s.maxSources){a=!1;break}let p=WT(d,m.name);if(m.isDirectory())await l(p,u+1);else if(m.isFile()&&/\.jsonl?$/.test(m.name)&&(t!=="gemini"||XT(qT(p))==="chats"&&m.name.startsWith("session-"))){let f=await n(p,s).catch(()=>{});if(f===void 0){s.signal.throwIfAborted(),a=!1;continue}let g=r(f);typeof g=="string"&&g?i.push({provider:t,sessionid:g,source_id:p}):a=!1}}};return await l(e,0),{sources:i,complete:a,cursor:null}},async inspect(s,i){let o=await n(s.source_id,i);return{status:"ready",revision:fu("sha256").update(o).digest("hex")}},async read(s,i,o){let a=await n(s.source_id,o);if(fu("sha256").update(a).digest("hex")!==i)return{status:"partial"};if(a.split(`
29
+ `).length>o.maxRows)return{status:"partial"};let l=GT(t,a,s.sessionid);return l&&l.length<=o.maxRows?{status:"complete",source:s,revision:i,responses:l}:{status:"partial"}}}}var us=["kimi","opencode","gemini","miniplayer","pi","agy","lmplayer"],So=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null;function zT(t,e){if(!e.length||e.some(u=>typeof u.response_id!="string"||!u.response_id)||new Set(e.map(u=>u.response_id)).size!==e.length)return;let n=t==="agy"&&e.some(u=>(u.tokens.input_cache_write??0)>0),r=e.map(u=>{let c=u.tokens,m=c.input_cache_write,p=c.input_uncached;for(let g of Object.values(c))g!==null&&So(g)===null&&(n=!0);let f=p;return["kimi","opencode","miniplayer","lmplayer"].includes(t)&&(m===null||p===null||m>p?(f=null,n=!0):f=p-m),(f===null||c.input_cached===null||c.output===null)&&(n=!0),{...u,tokens:{...c,input_uncached:f}}}),s=En(r);s.input_cache_write===null&&(t==="pi"||r.some(u=>u.tokens.input_cache_write!=null))&&(n=!0);let i=new Set(e.map(u=>u.model).filter(u=>typeof u=="string"&&u.length>0));for(let u of["input_uncached","input_cached","output"])s[u]===null&&(n=!0);let o=u=>{if(u.some(m=>m==null))return null;if(u.some(m=>So(m)===null))return n=!0,null;let c=u.reduce((m,p)=>m+p,0);return So(c)===null?(n=!0,null):c};e.some(u=>u.pricing_facts?.reasoning_output_tokens!=null&&u.tokens.output!=null&&u.pricing_facts.reasoning_output_tokens>u.tokens.output)&&(n=!0);let a=o(e.map(u=>u.pricing_facts?.reasoning_output_tokens)),l=e.map(u=>u.providerCostUsd),d=l.every(u=>typeof u=="number"&&Number.isFinite(u)&&u>=0)?l.reduce((u,c)=>u+c,0):null;return{source:"native",inputUncached:s.input_uncached,cacheRead:s.input_cached,cacheWrite:s.input_cache_write,output:s.output,reasoning:a,modelReported:i.size===1?[...i][0]:null,mixedModels:i.size>1,providerCostUsd:d,reason:n||s.input_cache_write===null?"counter_not_exposed":null,invalidCounters:n}}async function hu(t,e,n,r){let s=[],i=new Set;for(let o of t){r.signal?.throwIfAborted();let a=yu(o),l;try{if(!(await VT(a)).isFile())return{sources:s,complete:!1};let d=await KT(a);if(i.has(d))continue;i.add(d),l=Qi(a),l.pragma("busy_timeout = 0"),l.prepare("SELECT id FROM session WHERE id=?").get(n)&&s.push({provider:e,sessionid:n,source_id:a})}catch(d){if(d.code!=="ENOENT")return{sources:s,complete:!1}}finally{try{l?.close()}catch{}}}return{sources:s,complete:!0}}function QT(t,e,n){let r=e.HOME||e.USERPROFILE||YT(),s=e.XDG_DATA_HOME||Oe(r,".local","share"),i=e.XDG_CONFIG_HOME||Oe(r,".config");if(t==="pi")return wo("pi",e.PI_CODING_AGENT_DIR?Oe(e.PI_CODING_AGENT_DIR,"sessions"):Oe(r,".pi","agent","sessions"));if(t==="gemini")return wo("gemini",Oe(e.GEMINI_CLI_HOME||Oe(r,".gemini"),"tmp"));if(t==="miniplayer"){let l=new Tn(ts(e.MINIPLAYER_HOME||Oe(s,"miniplayer")));return{discover:async d=>{let u=await l.discover(d,d.maxSources,null);return{...u,complete:!u.truncated&&u.sources.length<d.maxSources}},inspect:(d,u)=>l.inspect(d,u),read:(d,u,c)=>l.read(d,u,c)}}if(t==="opencode"){let l=[Oe(s,"opencode","opencode.db"),Oe(s,"opencode","opencode-local.db"),Oe(i,"opencode","opencode.db")].map(u=>yu(u)),d=new or({dbPaths:l,sqliteBusyTimeoutMs:0});return{discover:u=>hu(l,t,n,u),inspect:(u,c)=>d.inspect(u,c),read:(u,c,m)=>d.read(u,c,m)}}if(t==="kimi"||t==="agy"){let l=t==="kimi"?new dr({kimiHome:e.KIMI_CODE_HOME||Oe(r,".kimi-code")}):new rr({agyConversationsDir:Oe(r,".gemini","antigravity-cli","conversations"),sqliteBusyTimeoutMs:0});return{discover:async d=>{let u=await l.discover(d,d.maxSources,null);return{...u,complete:!u.truncated&&u.sources.length<d.maxSources}},inspect:(d,u)=>l.inspect(d,u),read:(d,u,c)=>l.read(d,u,c)}}let o=e.OPENCODE_DB?[e.OPENCODE_DB]:[Oe(s,"lmplayer","opencode-local.db"),Oe(s,"lmplayer","opencode-dev.db")],a=cu({lmplayerDbPaths:o,sqliteBusyTimeoutMs:0});return{discover:l=>hu(o,t,n,l),inspect:(l,d)=>a.inspect(l,d),read:(l,d,u)=>a.read(l,d,u)}}async function Tu(t,e,n,r){if(!us.includes(t.provider)||!e||t.native_session_id&&t.native_session_id!==e)return;let s=new AbortController,i,o,a=async()=>{let l=r.db??(o=Qi(r.dbPath));o&&o.pragma("busy_timeout = 0");let d={signal:s.signal,maxBytes:8*1024*1024,maxRows:1e4,maxSources:512,requireBillingCounters:!0},u=r.reader??QT(t.provider,r.env??process.env,e),c=await u.discover(d);if(c.complete!==!0)return;let m=c.sources.filter(f=>f.provider===t.provider&&(f.sessionid===e||t.provider==="lmplayer"&&f.sessionid==="")).map(f=>({...f,sessionid:e}));if(!m.length)return;let p;for(let f of m){s.signal.throwIfAborted();let g=await u.inspect(f,d);if(g.status!=="ready")return;let _=await u.read(f,g.revision,d);if(s.signal.throwIfAborted(),_.status!=="complete"||_.capture_status!==void 0||_.source?.provider!==t.provider||_.source?.sessionid!==e||_.source?.source_id!==f.source_id||_.revision!==g.revision)return;let h=Date.parse(t.startedAt),E=Date.parse(n);if(!Number.isFinite(h)||!Number.isFinite(E)||E<h)return;let y=_.responses;if(!Array.isArray(y)||y.some(b=>!b.timestamp||!Number.isFinite(Date.parse(b.timestamp))))return;let T=y.filter(b=>Date.parse(b.timestamp)>=h&&Date.parse(b.timestamp)<=E);if(!T.length)continue;if(p)return;let v=l.pragma("busy_timeout",{simple:!0});try{l.pragma("busy_timeout = 0");let b=l.prepare("SELECT 1 FROM team_chat_log WHERE attempt_key IS NOT NULL AND attempt_key<>? AND provider=? AND (native_session_id=? OR native_session_id IS NULL) AND julianday(created_at)<=julianday(?) AND (ended_at IS NULL OR julianday(ended_at)>=julianday(?)) LIMIT 1");for(let S of T){let R=new Date(S.timestamp).toISOString();if(b.get(t.attempt_key,t.provider,e,R,R))return}}finally{l.pragma("busy_timeout = "+v)}p=T}return p?zT(t.provider,p):void 0};try{return await Promise.race([a(),new Promise(l=>{i=setTimeout(()=>{s.abort(),l(void 0)},2e3)})])}catch{return}finally{clearTimeout(i),s.abort();try{o?.close()}catch{}}}function Ye(t){return t.some(e=>e!=null&&(typeof e!="number"||!Number.isSafeInteger(e)||e<0))}import{randomUUID as xE}from"node:crypto";var cs={attempt_key:"TEXT",provider:"TEXT",native_session_id:"TEXT",cwd:"TEXT",ended_at:"TEXT",turn_outcome:"TEXT",model_requested:"TEXT",model_reported:"TEXT",tok_input_uncached:"INTEGER",tok_cache_read:"INTEGER",tok_cache_write:"INTEGER",tok_output:"INTEGER",tok_reasoning:"INTEGER",usage_source:"TEXT CHECK(usage_source IN ('wire','native','cumulative_delta'))",usage_reason:"TEXT",price_record_id:"TEXT",price_snapshot_sha256:"TEXT",rate_input_1m:"REAL",rate_output_1m:"REAL",rate_cache_read_1m:"REAL",rate_cache_write_1m:"REAL",cost_reason:"TEXT",provider_cost_usd:"REAL"},Eu=`CREATE UNIQUE INDEX IF NOT EXISTS idx_team_chat_attempt_unique ON team_chat_log(attempt_key) WHERE attempt_key IS NOT NULL;
30
+ CREATE INDEX IF NOT EXISTS idx_team_chat_started ON team_chat_log(created_at);
31
+ CREATE INDEX IF NOT EXISTS idx_team_chat_provider_model ON team_chat_log(provider, model_reported);
32
+ CREATE INDEX IF NOT EXISTS idx_team_chat_provider_session ON team_chat_log(provider, native_session_id);
33
+ CREATE VIEW IF NOT EXISTS turn_usage AS SELECT
34
+ id, attempt_key, root_teamfile = '(direct)' AS is_direct,
35
+ CASE WHEN root_teamfile = '(direct)' THEN NULL ELSE root_teamfile END AS team,
36
+ CASE WHEN root_teamfile = '(direct)' THEN NULL ELSE receiver_alias END AS alias,
37
+ provider,native_session_id,cwd,created_at AS started_at,ended_at,substr(created_at,1,10) AS day,
38
+ COALESCE(turn_outcome,status) AS status,model_requested,model_reported,COALESCE(model_reported,model_requested) AS model,
39
+ tok_input_uncached,tok_cache_read,tok_cache_write,tok_output,tok_reasoning,
40
+ COALESCE(tok_input_uncached,0)+COALESCE(tok_cache_read,0)+COALESCE(tok_cache_write,0)+COALESCE(tok_output,0) AS billed_tokens,
41
+ usage_source,usage_reason,price_record_id,cost_reason,provider_cost_usd,
42
+ CASE WHEN cost_reason IS NULL AND usage_source IS NOT NULL THEN
43
+ (COALESCE(tok_input_uncached,0)*COALESCE(rate_input_1m,0)
44
+ +COALESCE(tok_cache_read,0)*COALESCE(rate_cache_read_1m,0)
45
+ +COALESCE(tok_cache_write,0)*COALESCE(rate_cache_write_1m,rate_input_1m,0)
46
+ +COALESCE(tok_output,0)*COALESCE(rate_output_1m,0))/1e6 END AS cost_usd
47
+ FROM team_chat_log WHERE attempt_key IS NOT NULL;
48
+ `;import{createHash as Cu}from"node:crypto";import{mkdirSync as Nu,readFileSync as ZT,renameSync as eE,writeFileSync as tE,existsSync as xu}from"node:fs";import{homedir as nE}from"node:os";import{dirname as Ou,join as gs,resolve as _s}from"node:path";import{fileURLToPath as rE}from"node:url";var sE="https://lmctl.com/dataset/model_list.json",iE="https://lmctl.com/dataset/aliases.json",oE=1e3,aE=1e4,vu=6*60*60*1e3;function lE(){return gs(nE(),".lmctl","cache","lmprice")}var ps="model_list.json",fs="aliases.json",Lu="meta.json",dE="model_list.meta.json";function Nn(t,e){return gs(t,e)}var fr=new WeakMap;function hs(t,e){if(!t||!e)return null;let n=fr.get(t),r=fr.get(e);return n===void 0||r===void 0?null:Cu("sha256").update(n).update(r).digest("hex")}function Yt(t){try{let e=ZT(t,"utf-8"),n=JSON.parse(e);return n&&typeof n=="object"&&fr.set(n,e),n}catch{return null}}function Du(t,e){let n=`${t}.tmp-${process.pid}`;tE(n,e),eE(n,t)}function bo(t){return t===null||typeof t=="number"}function zt(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.schema_version!==1||!Array.isArray(e.records)||e.records.length===0?!1:e.records.every(n=>{if(typeof n!="object"||n===null)return!1;let r=n;if(typeof r.source!="string"||typeof r.source_model_id!="string"||typeof r.pricing!="object"||r.pricing===null)return!1;let s=r.pricing;return bo(s.input_per_1m_tokens)&&bo(s.output_per_1m_tokens)&&bo(s.input_cache_read_per_1m_tokens)})}var uE=new Set(["established","asserted","unresolved"]);function Qt(t){if(typeof t!="object"||t===null)return!1;let e=t;if(e.schema_version!==1||!Array.isArray(e.standards)||!Array.isArray(e.aliases))return!1;let n=e.standards.every(s=>{if(typeof s!="object"||s===null)return!1;let i=s;return typeof i.standard_slug=="string"&&(i.catalog_record_id===null||typeof i.catalog_record_id=="string")}),r=e.aliases.every(s=>{if(typeof s!="object"||s===null)return!1;let i=s;return typeof i.alias=="string"&&(i.standard_slug===null||typeof i.standard_slug=="string")&&typeof i.evidence=="string"&&uE.has(i.evidence)});return n&&r}var wu={etag:null,last_checked:null};function cE(t){let e=Yt(Nn(t,Lu)),n={etag:typeof e?.model_list?.etag=="string"?e.model_list.etag:null,last_checked:typeof e?.model_list?.last_checked=="string"?e.model_list.last_checked:null},r={etag:typeof e?.aliases?.etag=="string"?e.aliases.etag:null,last_checked:typeof e?.aliases?.last_checked=="string"?e.aliases.last_checked:null};if(e===null){let s=Yt(Nn(t,dE));s&&(n.etag=typeof s.etag=="string"?s.etag:null,n.last_checked=typeof s.fetchedAt=="string"?s.fetchedAt:null)}return{model_list:n,aliases:r,...typeof e?.pair_sha256=="string"?{pair_sha256:e.pair_sha256}:{}}}function mE(t){let e=cE(t),n=Yt(Nn(t,ps)),r=Yt(Nn(t,fs));return e.pair_sha256&&hs(zt(n)?n:null,Qt(r)?r:null)!==e.pair_sha256?{catalog:null,aliases:null,meta:{model_list:{...wu},aliases:{...wu}}}:{catalog:zt(n)?n:null,aliases:Qt(r)?r:null,meta:e}}function Su(t,e){try{return Nu(t,{recursive:!0}),Du(Nn(t,Lu),JSON.stringify(e)),!0}catch{return!1}}function Ro(t){return(t&&typeof t=="object"?fr.get(t):void 0)??JSON.stringify(t)}function ms(t,e,n){try{Nu(t,{recursive:!0}),Du(Nn(t,e),Ro(n))}catch{}}function pE(t,e){let n=fE(t),r=n?[_s(n,"data",e)]:[_s(t,"..","..","data",e)];for(let s of r)if(xu(s))return s;return null}function fE(t){let e=_s(t);for(;;){if(xu(_s(e,"package.json")))return e;let n=Ou(e);if(n===e)return null;e=n}}function bu(t,e,n){let r=n!==void 0?n:pE(t,e);return r===null?null:Yt(r)}function ys(t=process.env){let e=t.LMCTL_PRICE_TTL;if(e===void 0||e==="")return vu;let n=Number(e);return!Number.isFinite(n)||n<0?vu:n*1e3}function gE(){let t=process.env.LMCTL_PRICE_DATA;return t!==void 0&&t!==""?t:null}async function Ru(t,e,n,r){try{let s=await t(e,{method:"HEAD",signal:AbortSignal.timeout(oE)});if(!s.ok)return{kind:"failed"};let i=s.headers.get("etag");if(n!==null&&i!==null&&i===r)return{kind:"match"};let o=await t(e,{signal:AbortSignal.timeout(aE)});if(!o.ok)return{kind:"failed"};let a=await o.text(),l=JSON.parse(a);return l&&typeof l=="object"&&fr.set(l,a),{kind:"payload",payload:l,etag:o.headers.get("etag")??i}}catch{return{kind:"failed"}}}var ko=null;var ku=null;function Pu(t={}){return Object.keys(t).length===0?(ku??=Iu(t),ku):Iu(t)}async function Iu(t){let e=Ou(rE(import.meta.url)),n=t.pinDir!==void 0?t.pinDir:gE();if(n!==null&&n!==""){let g=Yt(gs(n,ps)),_=Yt(gs(n,fs));if(zt(g)&&Qt(_)){let h={sha256:hs(g,_),catalog:g,aliases:_,source:"pinned",generatedAt:g.generated_at??null};return ko=h.generatedAt,h}return Au(t,e)}let r=t.fetchImpl??fetch,s=t.cacheDir??lE(),i=t.now??Date.now(),o=t.ttlMs??ys(),a=mE(s),l=(g,_)=>g!==null&&_.last_checked!==null&&i>=Date.parse(_.last_checked)&&i-Date.parse(_.last_checked)<o,d=a.catalog,u=a.aliases,c=!1,m=!1,p={model_list:{...a.meta.model_list},aliases:{...a.meta.aliases}},f=!1;if(!l(d,a.meta.model_list)){let g=await Ru(r,sE,d,a.meta.model_list.etag);g.kind==="failed"&&(m=!0),g.kind==="match"?(p.model_list.last_checked=new Date(i).toISOString(),f=!0):g.kind==="payload"&&(zt(g.payload)?(p.model_list.last_checked=new Date(i).toISOString(),f=!0,d=g.payload,g.etag!==null&&(p.model_list.etag=g.etag),c=!0):m=!0)}if(!l(u,a.meta.aliases)){let g=await Ru(r,iE,u,a.meta.aliases.etag);g.kind==="failed"&&(m=!0),g.kind==="match"?(p.aliases.last_checked=new Date(i).toISOString(),f=!0):g.kind==="payload"&&(Qt(g.payload)?(p.aliases.last_checked=new Date(i).toISOString(),f=!0,u=g.payload,g.etag!==null&&(p.aliases.etag=g.etag),c=!0):m=!0)}if(!m&&(f||c))if(d!==null&&u!==null){let g=Cu("sha256").update(Ro(d)).update(Ro(u)).digest("hex");Su(s,{...p,pair_sha256:g})&&g!==a.meta.pair_sha256&&(ms(s,ps,d),ms(s,fs,u))}else d!==a.catalog&&d!==null&&ms(s,ps,d),u!==a.aliases&&u!==null&&ms(s,fs,u),Su(s,p);if(d!==null||u!==null){let g={catalog:d,aliases:u,sha256:hs(d,u),source:c?"network":"cache",refreshFailed:m,generatedAt:d?.generated_at??null};return ko=g.generatedAt,g}return{...Au(t,e),refreshFailed:m}}function Au(t,e){let n=bu(e,"price-data.json",t.bundledPath),r=bu(e,"price-aliases.json",t.bundledAliasesPath),s=zt(n)?n:null,i=Qt(r)?r:null,o={catalog:s,aliases:i,sha256:hs(s,i),source:s!==null||i!==null?"bundled":"unavailable",generatedAt:s?.generated_at??null};return ko=o.generatedAt,o}var An=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?t:null,Cn=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null;function Mu(t){if(t.cacheWrite!==void 0)return Cn(t.cacheWrite);if(t.cacheWrite5m===void 0&&t.cacheWrite1h===void 0)return 0;let e=Cn(t.cacheWrite5m),n=Cn(t.cacheWrite1h);return e===null||n===null?null:Cn(e+n)}function Io(t,e){let n=Cn(t.cacheWrite5m===void 0?0:t.cacheWrite5m),r=Cn(t.cacheWrite1h===void 0?0:t.cacheWrite1h);return n!==null&&r!==null&&Number.isSafeInteger(n+r)&&n+r===e?{five:n,one:r}:null}function Ao(t,e){let n=An(e.input_per_1m_tokens),r=An(e.output_per_1m_tokens),s=An(e.input_cache_read_per_1m_tokens),i=An(e.source_cost_fields?.cache_creation_input_token_cost),o=An(e.input_cache_write_per_1m_tokens)??(i===null?n:i*1e6),a=An(e.source_cost_fields?.cache_creation_input_token_cost_above_1hr),l=a===null?o:a*1e6,d=Mu(t),u=Io(t,d),c=d===null?null:u===null||d===0?o:u.five>0&&o===null||u.one>0&&l===null?null:(u.five*(o??0)+u.one*(l??0))/d;return{inputPer1m:n,outputPer1m:r,cacheReadPer1m:s,cacheWritePer1m:c}}function Uu(t,e){if(e===null)return null;let n=Ao(t,e),r=Mu(t);if(r===null||t.input>0&&n.inputPer1m===null||t.output>0&&n.outputPer1m===null||t.cachedInput>0&&n.cacheReadPer1m===null||r>0&&n.cacheWritePer1m===null)return null;let s=(t.input*(n.inputPer1m??0)+t.output*(n.outputPer1m??0)+t.cachedInput*(n.cacheReadPer1m??0)+r*(n.cacheWritePer1m??0))/1e6;return Number(s.toPrecision(10))}function Zt(t){return t.toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function xn(t){let e=t.source_model_id.toLowerCase(),n=e.slice(e.lastIndexOf("/")+1);return Zt(n)}function ju(t){let e=new Set,n=r=>{let s=r.toLowerCase().split("/");for(let i=0;i<s.length;i+=1)e.add(Zt(s.slice(i).join("/")))};return n(t.source_model_id),t.gateway_id&&n(t.gateway_id),e}function _E(t,e){let n=new Set,r=l=>{n.add(Zt(l))},s=t.trim().toLowerCase(),i=null,o=s.indexOf(":");o>0&&!s.slice(0,o).includes("/")&&(i=s.slice(0,o),r(s),s=s.slice(o+1)),r(s);let a=s.slice(s.lastIndexOf("/")+1);r(a);for(let l of e)r(`${l}/${a}`);return i!==null&&r(`${i}/${a}`),[...n]}function en(t){let e=r=>!(r.mode!==void 0&&r.mode!==null&&r.mode!=="chat"||t.nonChatName&&t.nonChatName.test(r.source_model_id.toLowerCase())),n=r=>e(r)&&t.family.test(r.source_model_id.toLowerCase());return{firstPartyProviders:t.firstPartyProviders,isChatModel:e,coversRecord:n,normalize:r=>_E(r,t.vendorPrefixes),matchRow(r,s){if(!n(r))return!1;let i=ju(r);return s.some(o=>i.has(o))}}}var $u=en({vendorPrefixes:["anthropic"],family:/claude/,firstPartyProviders:["anthropic"]}),Wu=en({vendorPrefixes:["openai"],family:/(^|\/)(gpt-|o\d|chatgpt|ft:gpt)|openai\//,firstPartyProviders:["openai"],nonChatName:/(^|[-/])(tts|transcribe(?:-\w+)?|realtime(?:-\w+)?|search(?:-\w+)*|image(?:-\w+)?|audio(?:-\w+)?|whisper(?:-\w+)?|dall-e(?:-\w+)?|embedding|moderation)(-|$)/}),Hu=en({vendorPrefixes:["google","gemini"],family:/gemini|gemma/,firstPartyProviders:["gemini","google","vertex_ai-language-models"],nonChatName:/embedding|imagen|-image|tts|audio|veo|lyria|live|realtime|video/}),Bu=en({vendorPrefixes:["moonshot","moonshotai"],family:/kimi|moonshot/,firstPartyProviders:["moonshot"]}),Xu=en({vendorPrefixes:["dashscope","qwen"],family:/qwen/,firstPartyProviders:["dashscope"]}),qu=en({vendorPrefixes:["deepseek","nousresearch"],family:/deepseek|nous|hermes-\d/,firstPartyProviders:["deepseek","nousresearch"]}),hE=/\s*\(([^()]+)\)\s*$/;function yE(t){let e=t.trim(),n=hE.exec(e);return n?{model:e.slice(0,n.index).trim(),effort:n[1].trim()}:{model:e,effort:null}}var TE={"gemini 3.8 flash":"gemini-3.8-flash","gemini 3.7 flash":"gemini-3.7-flash","gemini 3.6 flash":"gemini-3.6-flash","gemini 3.1 pro":"gemini/gemini-3.1-pro-preview","claude sonnet 4.6":"claude-sonnet-4-6"},EE=["gemini","google","vertex_ai-language-models","anthropic"],vE={normalize(t){let{model:e}=yE(t),n=TE[e.toLowerCase()];return n===void 0?[]:[Zt(n)]},isChatModel(t){return t.mode===void 0||t.mode===null||t.mode==="chat"},coversRecord(t){return this.isChatModel(t)&&/gemini|claude/.test(t.source_model_id.toLowerCase())},matchRow(t,e){if(!this.coversRecord(t))return!1;let n=ju(t);return e.some(r=>n.has(r))}},Ju=en({vendorPrefixes:["deepseek"],family:/deepseek/,firstPartyProviders:["deepseek"]}),Gu={claude:$u,codex:Wu,gemini:Hu,agy:vE,kimi:Bu,qwen:Xu,hermes:qu,deepseek:Ju},Fu={claude:$u.firstPartyProviders,codex:Wu.firstPartyProviders,gemini:Hu.firstPartyProviders,agy:EE,kimi:Bu.firstPartyProviders,qwen:Xu.firstPartyProviders,hermes:qu.firstPartyProviders,deepseek:Ju.firstPartyProviders};function wE(t,e,n){let r=e.trim().toLowerCase(),s=Zt(r);if(n.records.some(o=>o.source_model_id.toLowerCase()===r&&t.matchRow(o,[s])))return!0;let i=t.normalize(e);return i.length>0&&n.records.some(o=>t.matchRow(o,i))}function SE(t,e,n){let r=[];for(let[s,i]of Object.entries(Gu))s!==n&&wE(i,t,e)&&r.push(s);return r}function Ts(t){return t==="moonshot"?0:t==="litellm"?1:t==="openrouter"?2:t==="manual"?3:4}function bE(t,e){return t.input_per_1m_tokens===e.input_per_1m_tokens&&t.output_per_1m_tokens===e.output_per_1m_tokens&&t.input_cache_read_per_1m_tokens===e.input_cache_read_per_1m_tokens&&(t.input_cache_write_per_1m_tokens??null)===(e.input_cache_write_per_1m_tokens??null)&&(t.source_cost_fields?.cache_creation_input_token_cost??null)===(e.source_cost_fields?.cache_creation_input_token_cost??null)&&(t.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)===(e.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)}function RE(t){let e=new Map,n=[];for(let r of t){let s=r.source_model_id.toLowerCase(),i=s.lastIndexOf("/"),o=i===-1?"":s.slice(0,i+1),a=i===-1?s:s.slice(i+1),l=`${r.source}:${o}${Zt(a)}`,d=e.get(l);if(d===void 0){e.set(l,r);continue}if(!bE(d.pricing,r.pricing)){n.push(r);continue}/\d\.\d/.test(d.source_model_id)&&!/\d\.\d/.test(r.source_model_id)&&e.set(l,r)}return[...e.values(),...n]}function Vu(t){return{route:t.record_id??`${t.source}:${t.source_model_id}`,source:t.source,sourceModelId:t.source_model_id,provider:t.provider??null,pricing:t.pricing,estimated:t.source==="manual"}}function Ku(t,e){return t.map(Vu).sort((n,r)=>{let s=Ts(n.source)-Ts(r.source);if(s!==0)return s;let i=n.provider!==null&&e.includes(n.provider)?0:1,o=r.provider!==null&&e.includes(r.provider)?0:1;return i!==o?i-o:n.sourceModelId.localeCompare(r.sourceModelId)})}function Es(t){return t.pricing.input_per_1m_tokens!==null&&t.pricing.output_per_1m_tokens!==null}function kE(t,e,n){let r=RE(t),s=Ku(r,n),o=r.find(a=>(a.record_id??`${a.source}:${a.source_model_id}`)===s[0].route)?.context_window?.input_tokens??void 0;return{id:s[0].sourceModelId,normalizedId:e,offers:s,...o!=null?{contextWindow:o}:{}}}function Co(t,e,n,r){if(t.length===0)return{kind:"known-unpriced",id:e};let s=kE(t,e,n);if(r!==void 0){let o=t.map(Vu),a=o.filter(u=>u.provider===r&&!u.sourceModelId.includes("/")&&u.source!=="openrouter"&&!u.estimated),l=a.length>0?a:o;if(l.length!==1||!Es(l[0]))return{kind:"known-unpriced",id:e};let d=l[0];s.offers=[d,...s.offers.filter(u=>u.route!==d.route)],s.id=d.sourceModelId}let i=s.offers.find(Es);return i===void 0?{kind:"known-unpriced",id:e}:i.estimated?{kind:"estimated",model:s}:{kind:"priced",model:s}}var No=[];function IE(t,e){return t.standards.find(n=>n.standard_slug.toLowerCase()===e.toLowerCase())??null}function AE(t,e,n){let r=t.standard_slug;if(e===null||e.catalog_record_id===null)return{kind:"known-unpriced",id:r};let s=e.catalog_record_id,i=c=>c.record_id??c.source+":"+c.source_model_id,o=n.records.find(c=>i(c)===s),a=o?[]:n.records.filter(c=>i(c).toLowerCase()===s.toLowerCase()),l=o??(a.length===1?a[0]:void 0);if(!l)return{kind:"known-unpriced",id:r};let d=xn(l),u=n.records.filter(c=>xn(c)!==d?!1:c.mode===void 0||c.mode===null||c.mode==="chat");return u.length===0?{kind:"known-unpriced",id:r}:Co(u,d,No)}function CE(t,e,n,r){if(n===null||!Array.isArray(n.records))return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};if(r!==null){let g=[e.trim().toLowerCase()];g.push(`${t.toLowerCase()}/${g[0]}`);let _=r.aliases.find(h=>g.includes(h.alias.toLowerCase()));if(_){if(_.evidence==="unresolved"||_.standard_slug===null)return{state:{kind:"unresolved",alias:_.alias},viaAlias:!0,pinRoute:null};let h=IE(r,_.standard_slug);return{state:AE(_,h,n),viaAlias:!0,pinRoute:h?.catalog_record_id??null}}}let s=Gu[t];if(!s)return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};let i=e.trim().toLowerCase(),o=s.normalize(e),a=g=>({state:g,viaAlias:!1,pinRoute:null}),l=Zt(i),d=n.records.filter(g=>g.source_model_id.toLowerCase()===i&&s.matchRow(g,[l]));if(d.length>0){let g=xn(d[0]),_=n.records.filter(h=>s.matchRow(h,[g])&&xn(h)===g);return a(Co(_.length>0?_:d,g,Fu[t]??No,t==="codex"?"openai":void 0))}let u=n.records.filter(g=>s.matchRow(g,o));if(u.length===0){let g=SE(e,n,t);return g.length>0?a({kind:"wrong-provider",declared:e,otherProviders:g}):a({kind:"unknown",declared:e})}let c=new Map;for(let g of u){let _=xn(g),h=c.get(_);h?h.push(g):c.set(_,[g])}let m=Fu[t]??No,p=null,f=null;for(let g of c.values()){let _=Ku(g,m);(f===null||NE(_[0],f[0],m)<0)&&(p=g,f=_)}return a(Co(p,xn(p[0]),m,t==="codex"?"openai":void 0))}function Yu(t,e,n,r){let{state:s,viaAlias:i,pinRoute:o}=CE(t,e,n,r);if(s.kind!=="priced"&&s.kind!=="estimated")return{state:s,offer:null,provenance:null};let a=s.model.offers;if(i&&o!==null){let d=a.find(u=>u.route===o)??a.find(u=>u.route.toLowerCase()===o.toLowerCase());if(d!==void 0&&Es(d))return{state:s,offer:d,provenance:"alias-pin"}}let l=a.find(Es)??null;return{state:s,offer:l,provenance:i&&o!==null?"alias-pin":"route-preference"}}function NE(t,e,n){let r=Ts(t.source)-Ts(e.source);if(r!==0)return r;let s=t.provider!==null&&n.includes(t.provider)?0:1,i=e.provider!==null&&n.includes(e.provider)?0:1;return s!==i?s-i:t.sourceModelId.localeCompare(e.sourceModelId)}function zu(t){return{startedAt:new Date().toISOString(),attempt_key:xE(),provider:t.provider,model_requested:t.modelRequested,cwd:t.cwd,native_session_id:t.sessionId||null}}function Qu(t,e){return e?"cancelled":/\bstall(?:ed|ing)?\b/i.test(t)?"stalled":"error"}var lt=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,OE=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?t:null;async function xo(t,e,n=async()=>({catalog:null,aliases:null,source:"unavailable",generatedAt:null}),r){let s={...t,ended_at:new Date().toISOString(),turn_outcome:e.status,native_session_id:e.sessionId||t.native_session_id||null};try{let i=["claude","codex","muse","dsh"].includes(t.provider)||us.includes(t.provider)&&e.usage?.source==="wire"?e.usage:r&&us.includes(t.provider)?await Tu(t,e.sessionId||String(t.native_session_id??""),String(s.ended_at),r):void 0;if(e.status!=="cancelled"&&(i?.outcome==="cancelled"||i?.outcome==="error")&&(s.turn_outcome=i.outcome),!i||i.source===null)return s.usage_source=null,s.usage_reason=t.provider==="ClaudeMock"?"mock_estimate":s.turn_outcome!=="ok"?"turn_not_completed":["copilot","hermes"].includes(t.provider)?"session_totals_only":"native_record_missing",s.cost_reason="usage_unavailable",s;if(Object.assign(s,{usage_source:i.source,usage_reason:i.reason,tok_input_uncached:lt(i.inputUncached),tok_cache_read:lt(i.cacheRead),tok_cache_write:lt(i.cacheWrite),tok_output:lt(i.output),tok_reasoning:lt(i.reasoning),model_reported:i.modelReported,provider_cost_usd:OE(i.providerCostUsd)}),i.invalidCounters||Ye([i.inputUncached,i.cacheRead,i.cacheWrite,i.output,i.reasoning]))return s.usage_reason="counter_not_exposed",s.cost_reason="usage_unavailable",s;if(i.mixedModels)return s.cost_reason="mixed_models",s.model_reported=null,s;let o=i.modelReported||t.model_requested;if(!o)return s.cost_reason="model_unknown",s;let a,l=await Promise.race([n(),new Promise(f=>{a=setTimeout(()=>f(null),1e3)})]).finally(()=>{a&&clearTimeout(a)});if(!l||!l.catalog)return s.cost_reason="price_data_unavailable",s;let d=Yu(t.provider,o,l.catalog,l.aliases);if(!d.offer)return s.cost_reason=d.state.kind==="unresolved"?"model_unresolved":d.state.kind==="unknown"||d.state.kind==="wrong-provider"?"model_unknown":"model_unpriced",s;let u=l.catalog.records.find(f=>(f.record_id??f.source+":"+f.source_model_id)===d.offer.route),c=d.offer.pricing,m={input:lt(i.inputUncached)??0,output:lt(i.output)??0,cachedInput:lt(i.cacheRead)??0,cacheWrite:lt(i.cacheWrite)??0,...i.cacheWrite5m==null?{}:{cacheWrite5m:i.cacheWrite5m},...i.cacheWrite1h==null?{}:{cacheWrite1h:i.cacheWrite1h}},p=Ao(m,c);return Object.assign(s,{price_record_id:u?.record_id??null,price_snapshot_sha256:l.sha256??null,rate_input_1m:p.inputPer1m,rate_output_1m:p.outputPer1m,rate_cache_read_1m:p.cacheReadPer1m,rate_cache_write_1m:p.cacheWritePer1m}),s.cost_reason=Uu(m,c)===null?"rate_missing":null,s}catch{return{...s,usage_reason:"recorder_failed",cost_reason:"usage_unavailable"}}}function tn(t,e,n){try{let r=Object.entries(n).filter(([s])=>Object.hasOwn(cs,s));if(!r.length)return;t.prepare(`UPDATE team_chat_log SET ${r.map(([s])=>`${s}=?`).join(",")} WHERE id=? AND ended_at IS NULL`).run(...r.map(([,s])=>s??null),e)}catch(r){for(let i of["usage_source","model_reported","tok_input_uncached","tok_cache_read","tok_cache_write","tok_output","tok_reasoning","price_record_id","price_snapshot_sha256","rate_input_1m","rate_output_1m","rate_cache_read_1m","rate_cache_write_1m","provider_cost_usd"])n[i]=null;n.usage_reason="recorder_failed",n.cost_reason="usage_unavailable";let s=r?.code??"";if(/^SQLITE_(?:BUSY|LOCKED)(?:_|$)/.test(s))return;try{t.prepare("UPDATE team_chat_log SET attempt_key=COALESCE(attempt_key,?),provider=COALESCE(provider,?),native_session_id=COALESCE(native_session_id,?),cwd=COALESCE(cwd,?),model_requested=COALESCE(model_requested,?),ended_at=COALESCE(ended_at,?),turn_outcome=COALESCE(turn_outcome,?),usage_reason='recorder_failed',cost_reason='usage_unavailable' WHERE id=? AND ended_at IS NULL").run(n.attempt_key??null,n.provider??null,n.native_session_id??null,n.cwd??null,n.model_requested??null,n.ended_at??null,n.turn_outcome??null,e)}catch{}}}import{randomUUID as Pc}from"node:crypto";import{existsSync as jc,mkdirSync as wv,renameSync as Sv,rmdirSync as bv}from"node:fs";import{hostname as $o}from"node:os";var Zu=`
49
+ CREATE TABLE IF NOT EXISTS price_snapshot (
50
+ sha256 TEXT PRIMARY KEY,
51
+ generated_at TEXT,
52
+ source TEXT NOT NULL,
53
+ fetched_at TEXT NOT NULL,
54
+ loaded_at TEXT NOT NULL,
55
+ record_count INTEGER NOT NULL,
56
+ standards_json TEXT NOT NULL CHECK(json_valid(standards_json))
57
+ );
58
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_price_snapshot_singleton ON price_snapshot((1));
59
+
60
+ CREATE TABLE IF NOT EXISTS price_record (
61
+ record_id TEXT PRIMARY KEY,
62
+ source TEXT,
63
+ provider TEXT,
64
+ source_model_id TEXT,
65
+ vendor_model_id TEXT,
66
+ canonical_slug TEXT,
67
+ currency TEXT,
68
+ unit TEXT,
69
+ input_1m REAL,
70
+ output_1m REAL,
71
+ cache_read_1m REAL,
72
+ cache_write_1m REAL,
73
+ source_cost_fields TEXT CHECK(json_valid(source_cost_fields)),
74
+ record_json TEXT NOT NULL CHECK(json_valid(record_json)),
75
+ ordinal INTEGER NOT NULL
76
+ );
77
+
78
+ CREATE TABLE IF NOT EXISTS price_alias (
79
+ alias TEXT PRIMARY KEY,
80
+ standard_slug TEXT,
81
+ evidence TEXT,
82
+ catalog_record_id TEXT
83
+ );
84
+ `;import{existsSync as BE,mkdirSync as XE,readFileSync as ic}from"node:fs";import{randomUUID as qE}from"node:crypto";import{homedir as JE}from"node:os";import{dirname as oc,join as GE,resolve as ac}from"node:path";import{fileURLToPath as VE,pathToFileURL as KE}from"node:url";import{createHash as PE}from"node:crypto";import{createHash as LE}from"node:crypto";function DE(t,e,n){return LE("sha256").update(`${t}\0${e}\0${n}`).digest("hex")}function Le(t,e,n){let r=DE(e.stream_id,e.intentKey??e.event_type,e.observedLastSeq),s=t.prepare(`INSERT INTO message_event (event_id, ts, stream_id, event_type, payload)
85
+ VALUES (?, ?, ?, ?, ?)
86
+ ON CONFLICT(event_id) DO NOTHING`),i=t.prepare("SELECT seq FROM message_event WHERE event_id = ?");return t.transaction(()=>{let a=s.run(r,e.ts??new Date().toISOString(),e.stream_id,e.event_type,JSON.stringify(e.payload));if(a.changes===0)return{appended:!1,seq:i.get(r).seq,event_id:r};let l=Number(a.lastInsertRowid);return n(l),{appended:!0,seq:l,event_id:r}})()}var Q={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"};function nn(t,e){return t==null?null:{teamfile:t,alias:e??""}}function ME(t,e,n){return`lease_${PE("sha256").update(`${t}\0${e}\0${n}`).digest("hex").slice(0,16)}`}function vs(t,e,n,r){n.forEach((s,i)=>{Le(t,{stream_id:e,event_type:s.event_type,payload:s.payload,observedLastSeq:i,ts:s.ts},()=>{}).appended?r.appended+=1:r.skipped+=1})}function UE(t){let e=`msg_tcl_${t.id}`,n=nn(t.sender_teamfile,t.sender_alias),r=nn(t.receiver_teamfile,t.receiver_alias),s={table:"team_chat_log",id:t.id},i={message_id:e,sender:n,receiver:r,root_teamfile:t.root_teamfile,legacy:s},o=[{event_type:Q.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.message,origin:t.origin,correlation_status:"legacy-unavailable"}}];return t.status!=="running"&&o.push({event_type:Q.HANDLED,ts:t.created_at,payload:{...i,outcome:t.status,receipt:t.response,error:t.error_detail,truncated:t.truncated===1}}),{streamId:e,events:o}}function FE(t){let e=`msg_mbx_${t.id}`,n=nn(t.sender_teamfile,t.sender_alias),r=nn(t.receiver_teamfile,t.receiver_alias),s={table:"agent_mailbox",id:t.id},i={message_id:e,sender:n,receiver:r,root_teamfile:t.root_teamfile,legacy:s},o=[];if(t.message_type==="response"){let a=t.request_mailbox_id!==null?`msg_mbx_${t.request_mailbox_id}`:null;return o.push({event_type:Q.RESPONSE_CREATE,ts:t.created_at,payload:{...i,message_type:"response",content:t.payload,in_reply_to_message_id:a,correlation_status:"legacy-unavailable"}}),o.push({event_type:Q.RESPONSE_ENQUEUE,ts:t.created_at,payload:{...i,message_type:"response",in_reply_to_message_id:a}}),t.delivered_at!==null&&o.push({event_type:Q.RESPONSE_DELIVERED,ts:t.delivered_at,payload:{...i,message_type:"response",receipt:t.receipt}}),{streamId:e,events:o}}return o.push({event_type:Q.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.payload,correlation_status:"legacy-unavailable"}}),o.push({event_type:Q.ENQUEUE,ts:t.created_at,payload:{...i,message_type:"request"}}),t.waited_at!==null&&o.push({event_type:Q.WAIT_REGISTER,ts:t.waited_at,payload:{...i,waited_by:t.waited_by}}),(t.delivering_at!==null||t.delivery_holder_pid!==null)&&o.push({event_type:Q.DELIVER_CLAIM,ts:t.delivering_at??t.created_at,payload:{...i,pid:t.delivery_holder_pid,host:t.delivery_holder_host}}),t.delivered_at!==null&&o.push({event_type:Q.DELIVERED,ts:t.delivered_at,payload:{...i,receipt:t.receipt}}),{streamId:e,events:o}}function jE(t){let e=`inv_${t.id}`,n=nn(t.target_teamfile,t.target_alias),r={table:"tracked_invocation",id:t.id},s=[{event_type:Q.INVOCATION_START,ts:t.started_at,payload:{invocation_id:e,kind:t.kind,origin:t.origin,launch_source:t.launch_source,from_identity:t.from_identity,target:n,root_teamfile:t.root_teamfile,scope_teamfile:t.scope_teamfile,cwd:t.cwd,command:t.command,request_payload:t.request_payload,started_at:t.started_at,request_message_id:t.team_chat_log_id!==null?`msg_tcl_${t.team_chat_log_id}`:null,holder_pid:t.holder_pid,holder_host:t.holder_host,legacy:r}}];return t.notified_by!==null&&s.push({event_type:Q.INVOCATION_NOTIFY_CLAIM,ts:t.notified_at??t.started_at,payload:{invocation_id:e,notified_by:t.notified_by,notified_at:t.notified_at,legacy:r}}),t.status!=="running"&&s.push({event_type:Q.INVOCATION_FINISH,ts:t.ended_at??t.started_at,payload:{invocation_id:e,status:t.status,ended_at:t.ended_at,exit_code:t.exit_code,signal:t.signal,result_summary:t.result_summary,error:t.error,legacy:r}}),{streamId:e,events:s}}function $E(t){let e=ME(t.receiver_teamfile,t.receiver_alias,t.started_at),n=nn(t.receiver_teamfile,t.receiver_alias),r=nn(t.sender_teamfile,t.sender_alias);return{streamId:e,events:[{event_type:Q.INFLIGHT_TAKE,ts:t.started_at,payload:{lease_id:e,receiver:n,sender:r,holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at,legacy:{table:"agent_inflight",receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias}}}]}}function ws(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function ec(t){let e={appended:0,skipped:0},n={team_chat_log:0,agent_mailbox:0,tracked_invocation:0,agent_inflight:0};t.transaction(()=>{if(ws(t,"team_chat_log"))for(let i of t.prepare("SELECT * FROM team_chat_log WHERE "+td(t)+" ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=UE(i);vs(t,a,l,e),n.team_chat_log+=e.appended+e.skipped-o}if(ws(t,"agent_mailbox"))for(let i of t.prepare("SELECT * FROM agent_mailbox ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=FE(i);vs(t,a,l,e),n.agent_mailbox+=e.appended+e.skipped-o}if(ws(t,"tracked_invocation"))for(let i of t.prepare("SELECT * FROM tracked_invocation ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=jE(i);vs(t,a,l,e),n.tracked_invocation+=e.appended+e.skipped-o}if(ws(t,"agent_inflight"))for(let i of t.prepare("SELECT * FROM agent_inflight ORDER BY receiver_teamfile, receiver_alias").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=$E(i);vs(t,a,l,e),n.agent_inflight+=e.appended+e.skipped-o}WE(t)})();let s=i=>t.prepare(`SELECT count(*) AS n FROM ${i}`).get().n;return{appended:e.appended,skipped:e.skipped,bySource:n,projections:{agent_state:s("agent_state"),message_pending:s("message_pending"),invocation_state:s("invocation_state")}}}function WE(t){t.exec("DELETE FROM agent_state"),t.exec("DELETE FROM message_pending"),t.exec("DELETE FROM invocation_state");let e=t.prepare("SELECT seq, stream_id, event_type, payload FROM message_event ORDER BY seq").all();for(let n of e){let r=JSON.parse(n.payload);HE(t,n.seq,n.stream_id,n.event_type,r)}}function ge(t,e,n){let r=t[e];return r!=null?r[n]??null:null}function HE(t,e,n,r,s){switch(r){case Q.ENQUEUE:case Q.RESPONSE_ENQUEUE:{let i=r===Q.RESPONSE_ENQUEUE;t.prepare(`INSERT INTO message_pending
87
+ (message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
88
+ receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
89
+ VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)
90
+ ON CONFLICT(message_id) DO UPDATE SET lifecycle_state='queued', last_seq=excluded.last_seq`).run(n,i?"response":"request",i?s.in_reply_to_message_id??null:null,ge(s,"sender","teamfile"),ge(s,"sender","alias"),ge(s,"receiver","teamfile"),ge(s,"receiver","alias"),e,e);break}case Q.DELIVER_CLAIM:t.prepare(`UPDATE message_pending SET lifecycle_state='claimed', delivery_lease_id=?, delivery_holder_pid=?, last_seq=?
91
+ WHERE message_id=?`).run(s.lease_id??null,s.pid??null,e,n);break;case Q.DELIVER_CLAIM_RELEASE:t.prepare(`UPDATE message_pending
92
+ SET lifecycle_state='queued', delivery_lease_id=NULL,
93
+ delivery_holder_pid=NULL, last_seq=?
94
+ WHERE message_id=?`).run(e,n);break;case Q.DELIVERED:case Q.RESPONSE_DELIVERED:t.prepare("DELETE FROM message_pending WHERE message_id=?").run(n);break;case Q.INFLIGHT_TAKE:t.prepare(`INSERT INTO agent_state
95
+ (receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias, holder_pid, holder_host, started_at, last_seq)
96
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
97
+ ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
98
+ lease_id=excluded.lease_id, sender_teamfile=excluded.sender_teamfile, sender_alias=excluded.sender_alias,
99
+ holder_pid=excluded.holder_pid, holder_host=excluded.holder_host, started_at=excluded.started_at, last_seq=excluded.last_seq`).run(ge(s,"receiver","teamfile"),ge(s,"receiver","alias"),s.lease_id??null,ge(s,"sender","teamfile"),ge(s,"sender","alias"),s.holder_pid??null,s.holder_host??null,s.started_at??null,e);break;case Q.INFLIGHT_RELEASE:t.prepare("DELETE FROM agent_state WHERE receiver_teamfile=? AND receiver_alias=? AND terminal_lock_id IS NULL AND terminal_invocation_id IS NULL").run(ge(s,"receiver","teamfile"),ge(s,"receiver","alias"));break;case Q.INFLIGHT_RECLAIM:t.prepare(`UPDATE agent_state SET lease_id=?, sender_teamfile=?, sender_alias=?, holder_pid=?, holder_host=?, last_seq=?
100
+ WHERE receiver_teamfile=? AND receiver_alias=?`).run(s.lease_id??null,ge(s,"sender","teamfile"),ge(s,"sender","alias"),s.holder_pid??null,s.holder_host??null,e,ge(s,"receiver","teamfile"),ge(s,"receiver","alias"));break;case Q.TERMINAL_LOCK_TAKE:t.prepare(`INSERT INTO agent_state
101
+ (receiver_teamfile, receiver_alias, terminal_lock_id, last_seq)
102
+ VALUES (?, ?, ?, ?)
103
+ ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
104
+ terminal_lock_id=excluded.terminal_lock_id, last_seq=excluded.last_seq`).run(ge(s,"receiver","teamfile"),ge(s,"receiver","alias"),s.lock_id??n,e);break;case Q.TERMINAL_LOCK_RELEASE:case Q.TERMINAL_LOCK_EXPIRE:t.prepare(`UPDATE agent_state SET terminal_lock_id=NULL, last_seq=?
105
+ WHERE receiver_teamfile=? AND receiver_alias=?`).run(e,ge(s,"receiver","teamfile"),ge(s,"receiver","alias"));break;case Q.INVOCATION_START:t.prepare(`INSERT INTO invocation_state
106
+ (invocation_id, kind, origin, launch_source, from_identity, target_teamfile, target_alias, root_teamfile,
107
+ cwd, command, request_message_id, request_payload, holder_pid, holder_host, status, started_at, last_seq)
108
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?)
109
+ ON CONFLICT(invocation_id) DO NOTHING`).run(n,s.kind??"chat",s.origin??"unknown",s.launch_source??"",s.from_identity??"",ge(s,"target","teamfile"),ge(s,"target","alias"),s.root_teamfile??null,s.cwd??null,s.command??null,s.request_message_id??null,s.request_payload??null,s.holder_pid??null,s.holder_host??null,s.started_at??"",e);break;case Q.INVOCATION_FINISH:t.prepare(`UPDATE invocation_state SET status=?, ended_at=?, result_summary=?, error=?, last_seq=?
110
+ WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,e,n);break;case Q.INVOCATION_NOTIFY_CLAIM:t.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,e,n);break;default:break}}var lc=oc(VE(import.meta.url)),dc=ac(lc,"schema.sql"),YE=ac(lc,"migrations"),kt=66,rn=class extends Error{dbPath;dbVersion;buildVersion;constructor(e,n,r=kt,s){super(e+": refusing to proceed: this lmctl is older than this database (database v"+n+"; build v"+r+"). "+(s?"Required database structure is unavailable: "+s.replace(/\s+/g," ")+". ":"")+"Run: npm install -g @lmctl-ai/lmctl@latest. No manual database changes are needed. --allow-schema-skew is a last resort and may hide newer data."),this.name="SchemaSkewError",this.dbPath=e,this.dbVersion=n,this.buildVersion=r}};function Ss(t){t.dbPath!==":memory:"&&XE(oc(t.dbPath),{recursive:!0});let e=new hn(t.dbPath);try{e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let n=gr(e),r=t.buildVersionForTests??kt,s=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1";if(n>r)return tc(e,t.dbPath,r,s),e;if(n===kt)return nc(e),e;let i=n>0&&n<47;i&&e.pragma("foreign_keys = OFF");try{e.transaction(()=>{let o=gr(e);o>r&&tc(e,t.dbPath,r,s)||(o===0&&(e.exec(ic(dc,"utf8")),e.pragma("user_version = "+kt)),o>0&&o<63&&e.exec("DROP VIEW IF EXISTS turn_usage"),zE(e,o),nc(e))}).immediate()}finally{i&&e.pragma("foreign_keys = ON")}return e}catch(n){try{e.close()}catch{}throw n}}function tc(t,e,n,r){return t.transaction(()=>{let s=gr(t);if(s<=n)return!1;let i=QE(t,s);if(ev={dbVersion:s,buildVersion:n},i>n&&!r)throw new rn(e,s,n);return i>n&&ZE(e,s,n),!0})()}function zE(t,e){let n=e;if(n<2&&n!==0&&(t.exec(`
111
+ CREATE TABLE IF NOT EXISTS session_size (
112
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
113
+ team_name TEXT NOT NULL,
114
+ alias TEXT NOT NULL,
115
+ sessionid TEXT NOT NULL,
116
+ input_tokens INTEGER,
117
+ cache_tokens INTEGER,
118
+ output_tokens INTEGER,
119
+ total_tokens INTEGER,
120
+ observed_at TEXT NOT NULL
121
+ );
122
+ CREATE INDEX IF NOT EXISTS idx_session_size_member ON session_size(team_name, alias, observed_at DESC);
123
+ CREATE INDEX IF NOT EXISTS idx_session_size_session ON session_size(sessionid, observed_at DESC);
124
+ CREATE INDEX IF NOT EXISTS idx_session_size_observed ON session_size(observed_at DESC);
125
+ `),t.pragma("user_version = 2"),n=2),n<3&&n!==0&&(t.prepare("PRAGMA table_info(project)").all().some(s=>s.name==="intake_config")||t.exec("ALTER TABLE project ADD COLUMN intake_config TEXT"),t.pragma("user_version = 3"),n=3),n<4&&n!==0&&(t.prepare("PRAGMA table_info(job)").all().some(s=>s.name==="concurrency_key_resolved")||t.exec("ALTER TABLE job ADD COLUMN concurrency_key_resolved TEXT"),t.exec("CREATE INDEX IF NOT EXISTS idx_job_concurrency_running ON job(concurrency_key_resolved, status)"),t.pragma("user_version = 4"),n=4),n<5&&n!==0&&(t.prepare("PRAGMA table_info(run)").all().some(s=>s.name==="paused_at")||t.exec("ALTER TABLE run ADD COLUMN paused_at TEXT"),t.pragma("user_version = 5"),n=5),n<6&&n!==0&&(t.prepare("PRAGMA table_info(attention)").all().some(s=>s.name==="requires_user")||t.exec("ALTER TABLE attention ADD COLUMN requires_user INTEGER NOT NULL DEFAULT 0"),t.pragma("user_version = 6"),n=6),n<7&&n!==0&&(t.prepare("PRAGMA table_info(project)").all().some(s=>s.name==="test_argv")||t.exec("ALTER TABLE project ADD COLUMN test_argv TEXT"),t.exec(`
126
+ CREATE TABLE IF NOT EXISTS candidate_issue (
127
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
128
+ triage_run_id INTEGER NOT NULL REFERENCES run(id),
129
+ repo TEXT NOT NULL,
130
+ issue_url TEXT NOT NULL,
131
+ issue_number INTEGER NOT NULL,
132
+ title TEXT,
133
+ status TEXT NOT NULL,
134
+ reason TEXT,
135
+ confidence REAL,
136
+ local_path TEXT,
137
+ likely_files TEXT,
138
+ test_command TEXT,
139
+ lmdedup_summary TEXT,
140
+ created_at TEXT NOT NULL,
141
+ approved_at TEXT,
142
+ fix_job_id INTEGER REFERENCES job(id),
143
+ UNIQUE(triage_run_id, issue_url)
144
+ );
145
+ CREATE INDEX IF NOT EXISTS idx_candidate_issue_run ON candidate_issue(triage_run_id);
146
+ CREATE INDEX IF NOT EXISTS idx_candidate_issue_status ON candidate_issue(status);
147
+
148
+ CREATE TABLE IF NOT EXISTS submitted_pr (
149
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
150
+ repo TEXT NOT NULL,
151
+ pr_url TEXT NOT NULL UNIQUE,
152
+ issue_url TEXT,
153
+ local_path TEXT,
154
+ branch TEXT,
155
+ head_sha TEXT,
156
+ status TEXT NOT NULL DEFAULT 'watching',
157
+ submitted_at TEXT NOT NULL,
158
+ last_scanned_at TEXT,
159
+ last_followup_at TEXT,
160
+ last_known_state TEXT,
161
+ last_known_checks TEXT,
162
+ last_known_review TEXT,
163
+ visibility_status TEXT,
164
+ created_by_run_id INTEGER REFERENCES run(id)
165
+ );
166
+ CREATE INDEX IF NOT EXISTS idx_submitted_pr_status ON submitted_pr(status);
167
+ CREATE INDEX IF NOT EXISTS idx_submitted_pr_scanned ON submitted_pr(last_scanned_at);
168
+
169
+ CREATE TABLE IF NOT EXISTS pr_followup_event (
170
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
171
+ submitted_pr_id INTEGER NOT NULL REFERENCES submitted_pr(id),
172
+ run_id INTEGER REFERENCES run(id),
173
+ event_kind TEXT NOT NULL,
174
+ source_url TEXT,
175
+ actor TEXT,
176
+ author_association TEXT,
177
+ body_hash TEXT,
178
+ classification TEXT,
179
+ action_required TEXT,
180
+ created_at TEXT NOT NULL,
181
+ seen_at TEXT,
182
+ resolved_at TEXT,
183
+ UNIQUE(submitted_pr_id, body_hash)
184
+ );
185
+ CREATE INDEX IF NOT EXISTS idx_pr_followup_event_pr ON pr_followup_event(submitted_pr_id);
186
+ CREATE INDEX IF NOT EXISTS idx_pr_followup_event_kind ON pr_followup_event(event_kind);
187
+ `),t.pragma("user_version = 7"),n=7),n<8&&n!==0&&(t.prepare("PRAGMA table_info(step_artifact)").all().some(s=>s.name==="provider_call_mode")||t.exec("ALTER TABLE step_artifact ADD COLUMN provider_call_mode TEXT"),t.pragma("user_version = 8"),n=8),n<9&&n!==0){let r=G(t,"team_member");r.has("state")||t.exec("ALTER TABLE team_member ADD COLUMN state TEXT NOT NULL DEFAULT 'idle' CHECK(state IN ('idle','in_chat','attention_needed','retired'))"),r.has("state_reason")||t.exec("ALTER TABLE team_member ADD COLUMN state_reason TEXT"),r.has("state_updated_at")||t.exec("ALTER TABLE team_member ADD COLUMN state_updated_at TEXT"),r.has("role_prompt")||t.exec("ALTER TABLE team_member ADD COLUMN role_prompt TEXT"),r.has("prompt_snapshot")||t.exec("ALTER TABLE team_member ADD COLUMN prompt_snapshot TEXT"),G(t,"team").has("lead_seed_prompt")||t.exec("ALTER TABLE team ADD COLUMN lead_seed_prompt TEXT"),G(t,"run").has("parent_run_id")||t.exec("ALTER TABLE run ADD COLUMN parent_run_id INTEGER REFERENCES run(id)"),G(t,"project").has("memory_mode")||t.exec("ALTER TABLE project ADD COLUMN memory_mode TEXT NOT NULL DEFAULT 'folder' CHECK(memory_mode IN ('folder','db'))"),t.pragma("user_version = 9"),n=9}if(n<10&&n!==0&&(t.exec(`
188
+ CREATE TABLE IF NOT EXISTS memory (
189
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
190
+ project_id INTEGER NOT NULL REFERENCES project(id),
191
+ type TEXT NOT NULL CHECK (type IN ('user', 'feedback', 'project', 'reference')),
192
+ name TEXT NOT NULL,
193
+ description TEXT,
194
+ body TEXT NOT NULL,
195
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
196
+ updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
197
+ UNIQUE(project_id, name)
198
+ );
199
+ CREATE INDEX IF NOT EXISTS idx_memory_project_type ON memory(project_id, type);
200
+ CREATE INDEX IF NOT EXISTS idx_memory_project_name ON memory(project_id, name);
201
+ `),t.pragma("user_version = 10"),n=10),n<11&&n!==0&&(t.exec(`
202
+ CREATE TABLE IF NOT EXISTS session_event (
203
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
204
+ run_id INTEGER NOT NULL REFERENCES run(id),
205
+ step_id INTEGER REFERENCES step(id),
206
+ kind TEXT NOT NULL,
207
+ timestamp_ms INTEGER NOT NULL,
208
+ payload TEXT NOT NULL,
209
+ payload_truncated INTEGER NOT NULL DEFAULT 0,
210
+ overflow_artifact_id INTEGER REFERENCES step_artifact(id)
211
+ );
212
+ CREATE INDEX IF NOT EXISTS idx_session_event_run ON session_event(run_id);
213
+ CREATE INDEX IF NOT EXISTS idx_session_event_kind_step ON session_event(kind, step_id);
214
+ CREATE INDEX IF NOT EXISTS idx_session_event_timestamp ON session_event(timestamp_ms);
215
+
216
+ CREATE TABLE IF NOT EXISTS rollup_stats (
217
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
218
+ run_id INTEGER NOT NULL REFERENCES run(id),
219
+ step_id INTEGER REFERENCES step(id),
220
+ metric_kind TEXT NOT NULL,
221
+ value REAL NOT NULL,
222
+ bucket_start_ms INTEGER NOT NULL,
223
+ bucket_end_ms INTEGER NOT NULL,
224
+ updated_at INTEGER NOT NULL,
225
+ UNIQUE(run_id, step_id, metric_kind, bucket_start_ms)
226
+ );
227
+ CREATE INDEX IF NOT EXISTS idx_rollup_run_metric ON rollup_stats(run_id, metric_kind);
228
+ CREATE INDEX IF NOT EXISTS idx_rollup_bucket ON rollup_stats(bucket_start_ms);
229
+
230
+ CREATE TABLE IF NOT EXISTS drift_signal (
231
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
232
+ team_member_id INTEGER NOT NULL REFERENCES team_member(id),
233
+ project_id INTEGER REFERENCES project(id),
234
+ signal_kind TEXT NOT NULL,
235
+ severity TEXT NOT NULL CHECK (severity IN ('low', 'medium', 'high')),
236
+ description TEXT NOT NULL,
237
+ detected_at INTEGER NOT NULL,
238
+ expires_at INTEGER,
239
+ acknowledged_at INTEGER,
240
+ payload TEXT
241
+ );
242
+ CREATE INDEX IF NOT EXISTS idx_drift_member ON drift_signal(team_member_id);
243
+ CREATE INDEX IF NOT EXISTS idx_drift_unacked ON drift_signal(team_member_id) WHERE acknowledged_at IS NULL;
244
+
245
+ CREATE TABLE IF NOT EXISTS rollup_cursor (
246
+ key TEXT PRIMARY KEY,
247
+ value INTEGER NOT NULL DEFAULT 0
248
+ );
249
+ `),t.pragma("user_version = 11"),n=11),n<12&&n!==0&&(t.exec(`
250
+ CREATE TABLE IF NOT EXISTS interactive_session (
251
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
252
+ run_id INTEGER NOT NULL REFERENCES run(id),
253
+ step_id INTEGER NOT NULL REFERENCES step(id),
254
+ state_name TEXT NOT NULL,
255
+ turn_count INTEGER NOT NULL DEFAULT 0,
256
+ last_agent_output TEXT,
257
+ last_operator_input TEXT,
258
+ status TEXT NOT NULL CHECK (status IN ('waiting_operator', 'waiting_agent', 'done', 'timeout')),
259
+ started_at INTEGER NOT NULL,
260
+ last_activity_at INTEGER NOT NULL,
261
+ UNIQUE(step_id)
262
+ );
263
+ CREATE INDEX IF NOT EXISTS idx_interactive_status ON interactive_session(status);
264
+ CREATE INDEX IF NOT EXISTS idx_interactive_run_state ON interactive_session(run_id, state_name);
265
+ `),t.pragma("user_version = 12"),n=12),n<13&&n!==0&&(t.exec("ALTER TABLE team DROP COLUMN lead_seed_prompt"),t.pragma("user_version = 13"),n=13),n<14&&n!==0&&(t.exec("ALTER TABLE memory RENAME TO durable_memory"),t.exec("ALTER TABLE project RENAME COLUMN memory_mode TO durable_memory_mode"),t.exec("DROP INDEX IF EXISTS idx_memory_project_type"),t.exec("DROP INDEX IF EXISTS idx_memory_project_name"),t.exec("CREATE INDEX IF NOT EXISTS idx_durable_memory_project_type ON durable_memory(project_id, type)"),t.exec("CREATE INDEX IF NOT EXISTS idx_durable_memory_project_name ON durable_memory(project_id, name)"),t.pragma("user_version = 14"),n=14),n<15&&n!==0&&(t.exec(`
266
+ CREATE TABLE IF NOT EXISTS workflow_version (
267
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
268
+ workflow_id INTEGER NOT NULL REFERENCES workflow(id),
269
+ version INTEGER NOT NULL,
270
+ definition TEXT NOT NULL,
271
+ author TEXT,
272
+ created_at TEXT NOT NULL,
273
+ UNIQUE(workflow_id, version)
274
+ );
275
+ CREATE INDEX IF NOT EXISTS idx_workflow_version_wf ON workflow_version(workflow_id, version DESC);
276
+ `),G(t,"workflow").has("active_version_id")||t.exec("ALTER TABLE workflow ADD COLUMN active_version_id INTEGER REFERENCES workflow_version(id)"),G(t,"run").has("workflow_version_id")||t.exec("ALTER TABLE run ADD COLUMN workflow_version_id INTEGER REFERENCES workflow_version(id)"),t.pragma("user_version = 15"),n=15),n<16&&n!==0&&(t.exec(`
277
+ CREATE TABLE IF NOT EXISTS trigger_instance (
278
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
279
+ workflow_id INTEGER NOT NULL REFERENCES workflow(id),
280
+ trigger_id TEXT NOT NULL,
281
+ trigger_type TEXT NOT NULL,
282
+ parameters TEXT NOT NULL,
283
+ enabled INTEGER NOT NULL DEFAULT 1 CHECK(enabled IN (0,1)),
284
+ cursor TEXT,
285
+ last_poll_at TEXT,
286
+ last_failure_at TEXT,
287
+ last_failure TEXT,
288
+ created_at TEXT NOT NULL,
289
+ UNIQUE(workflow_id, trigger_id)
290
+ );
291
+ CREATE INDEX IF NOT EXISTS idx_trigger_instance_wf ON trigger_instance(workflow_id);
292
+ CREATE INDEX IF NOT EXISTS idx_trigger_instance_enabled ON trigger_instance(enabled) WHERE enabled = 1;
293
+ `),G(t,"step").has("parent_step_id")||t.exec("ALTER TABLE step ADD COLUMN parent_step_id INTEGER REFERENCES step(id)"),t.exec("CREATE INDEX IF NOT EXISTS idx_step_parent ON step(parent_step_id)"),t.pragma("user_version = 16"),n=16),n<17&&n!==0&&(t.exec(`
294
+ CREATE TABLE IF NOT EXISTS project_workflow (
295
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
296
+ project_id INTEGER NOT NULL REFERENCES project(id),
297
+ workflow_id INTEGER NOT NULL REFERENCES workflow(id),
298
+ condition TEXT,
299
+ parameters_override TEXT,
300
+ enabled INTEGER NOT NULL DEFAULT 1 CHECK(enabled IN (0,1)),
301
+ priority INTEGER NOT NULL DEFAULT 100,
302
+ created_at TEXT NOT NULL,
303
+ UNIQUE(project_id, workflow_id, condition)
304
+ );
305
+ CREATE INDEX IF NOT EXISTS idx_project_workflow_project ON project_workflow(project_id, enabled);
306
+ `),G(t,"job").has("workflow_id_override")||t.exec("ALTER TABLE job ADD COLUMN workflow_id_override INTEGER REFERENCES workflow(id)"),t.pragma("user_version = 17"),n=17),n<18&&n!==0&&(t.exec(`
307
+ CREATE TABLE IF NOT EXISTS project_issue (
308
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
309
+ project_id INTEGER NOT NULL REFERENCES project(id),
310
+ title TEXT NOT NULL,
311
+ body TEXT NOT NULL,
312
+ status TEXT NOT NULL DEFAULT 'open' CHECK(status IN ('open','assigned','closed','reopened')),
313
+ severity TEXT NOT NULL DEFAULT 'medium' CHECK(severity IN ('low','medium','high','critical')),
314
+ labels TEXT,
315
+ ai_test_path TEXT,
316
+ source_run_id INTEGER REFERENCES run(id),
317
+ assigned_run_id INTEGER REFERENCES run(id),
318
+ closed_run_id INTEGER REFERENCES run(id),
319
+ commit_hash TEXT,
320
+ created_at TEXT NOT NULL,
321
+ updated_at TEXT NOT NULL,
322
+ closed_at TEXT
323
+ );
324
+ CREATE INDEX IF NOT EXISTS idx_project_issue_status
325
+ ON project_issue(project_id, status);
326
+ CREATE INDEX IF NOT EXISTS idx_project_issue_ai_test
327
+ ON project_issue(project_id, ai_test_path) WHERE ai_test_path IS NOT NULL;
328
+ `),t.pragma("user_version = 18"),n=18),n<19&&n!==0&&(t.exec(`
329
+ CREATE TABLE IF NOT EXISTS webui_session (
330
+ session_id TEXT PRIMARY KEY,
331
+ user_id TEXT NOT NULL,
332
+ current_node TEXT NOT NULL,
333
+ node_params TEXT,
334
+ prev_node_stack TEXT,
335
+ pending_form TEXT,
336
+ chatbot_session_id TEXT,
337
+ auth_state TEXT NOT NULL,
338
+ last_transition_at TEXT NOT NULL,
339
+ created_at TEXT NOT NULL
340
+ );
341
+ CREATE INDEX IF NOT EXISTS webui_session_user_idx ON webui_session(user_id);
342
+
343
+ CREATE TABLE IF NOT EXISTS chatbot_session (
344
+ chatbot_session_id TEXT PRIMARY KEY,
345
+ user_id TEXT NOT NULL,
346
+ title TEXT,
347
+ created_at TEXT NOT NULL,
348
+ last_active_at TEXT NOT NULL,
349
+ status TEXT NOT NULL DEFAULT 'active'
350
+ );
351
+ CREATE INDEX IF NOT EXISTS chatbot_session_user_idx ON chatbot_session(user_id, last_active_at DESC);
352
+
353
+ CREATE TABLE IF NOT EXISTS chatbot_message (
354
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
355
+ chatbot_session_id TEXT NOT NULL REFERENCES chatbot_session(chatbot_session_id) ON DELETE CASCADE,
356
+ role TEXT NOT NULL,
357
+ content TEXT NOT NULL,
358
+ tool_calls TEXT,
359
+ created_at TEXT NOT NULL
360
+ );
361
+ CREATE INDEX IF NOT EXISTS chatbot_message_session_idx ON chatbot_message(chatbot_session_id, id);
362
+ `),t.pragma("user_version = 19"),n=19),n<20&&n!==0&&(t.exec(`
363
+ CREATE TABLE IF NOT EXISTS lmctl_config (
364
+ key TEXT PRIMARY KEY,
365
+ value TEXT NOT NULL,
366
+ updated_at TEXT NOT NULL
367
+ );
368
+ `),t.pragma("user_version = 20"),n=20),n<21&&n!==0){let r=G(t,"project");r.has("active_run_id")||t.exec("ALTER TABLE project ADD COLUMN active_run_id INTEGER REFERENCES run(id)"),r.has("active_locked_at")||t.exec("ALTER TABLE project ADD COLUMN active_locked_at TEXT"),r.has("active_locked_by")||t.exec("ALTER TABLE project ADD COLUMN active_locked_by TEXT"),t.pragma("user_version = 21"),n=21}if(n<22&&n!==0&&(G(t,"project").has("active_locked_expires_at")||t.exec("ALTER TABLE project ADD COLUMN active_locked_expires_at TEXT"),t.exec("CREATE INDEX IF NOT EXISTS idx_project_active_lock_expires ON project(active_locked_expires_at) WHERE active_locked_expires_at IS NOT NULL"),t.pragma("user_version = 22"),n=22),n<23&&n!==0){t.exec("DROP INDEX IF EXISTS idx_project_active_lock_expires");let r=G(t,"project");r.has("active_locked_expires_at")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_expires_at"),r.has("active_locked_by")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_by"),r.has("active_locked_at")&&t.exec("ALTER TABLE project DROP COLUMN active_locked_at"),r.has("active_run_id")&&t.exec("ALTER TABLE project DROP COLUMN active_run_id"),t.pragma("user_version = 23"),n=23}if(n<24&&n!==0){let r=G(t,"team_member");r.size>0&&!r.has("provider_resolved")&&t.exec("ALTER TABLE team_member ADD COLUMN provider_resolved TEXT"),t.pragma("user_version = 24"),n=24}if(n<25&&n!==0&&(t.exec(`
369
+ CREATE TABLE IF NOT EXISTS composition_unit (
370
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
371
+ name TEXT NOT NULL,
372
+ version INTEGER NOT NULL,
373
+ lang TEXT NOT NULL,
374
+ source TEXT NOT NULL,
375
+ source_sha TEXT NOT NULL,
376
+ compiled_workflow_version_id INTEGER REFERENCES workflow_version(id),
377
+ created_at TEXT NOT NULL,
378
+ UNIQUE(name, version)
379
+ );
380
+ CREATE INDEX IF NOT EXISTS idx_composition_unit_name ON composition_unit(name, version DESC);
381
+ `),t.pragma("user_version = 25"),n=25),n<26&&n!==0){let r=G(t,"workflow");r.size>0&&!r.has("source_uri")&&t.exec("ALTER TABLE workflow ADD COLUMN source_uri TEXT"),r.size>0&&!r.has("source_sha256")&&t.exec("ALTER TABLE workflow ADD COLUMN source_sha256 TEXT"),t.pragma("user_version = 26"),n=26}if(n<27&&n!==0){let r=G(t,"run");r.size>0&&!r.has("pending_escalation_decision")&&t.exec("ALTER TABLE run ADD COLUMN pending_escalation_decision TEXT"),t.pragma("user_version = 27"),n=27}if(n<28&&n!==0&&(t.exec(`
382
+ CREATE TABLE IF NOT EXISTS prompt_dispatch (
383
+ prompt_id TEXT PRIMARY KEY,
384
+ project_id INTEGER NOT NULL REFERENCES project(id),
385
+ job_id INTEGER NOT NULL REFERENCES job(id),
386
+ text TEXT NOT NULL,
387
+ context_json TEXT,
388
+ created_at TEXT NOT NULL,
389
+ completed_at TEXT
390
+ );
391
+ CREATE INDEX IF NOT EXISTS idx_prompt_dispatch_project ON prompt_dispatch(project_id, created_at DESC);
392
+ CREATE INDEX IF NOT EXISTS idx_prompt_dispatch_job ON prompt_dispatch(job_id);
393
+ `),t.pragma("user_version = 28"),n=28),n<29&&n!==0&&(t.exec(`
394
+ CREATE TABLE IF NOT EXISTS workspace (
395
+ id TEXT PRIMARY KEY,
396
+ name TEXT NOT NULL,
397
+ idle_threshold_ms INTEGER NOT NULL DEFAULT 600000,
398
+ created_at TEXT NOT NULL,
399
+ deleted_at TEXT
400
+ );
401
+ CREATE TABLE IF NOT EXISTS web_project (
402
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
403
+ workspace_id TEXT NOT NULL REFERENCES workspace(id),
404
+ name TEXT NOT NULL,
405
+ repo_path TEXT NOT NULL,
406
+ config_json TEXT,
407
+ linked_v4_project_id INTEGER REFERENCES project(id),
408
+ last_active_at TEXT,
409
+ created_at TEXT NOT NULL,
410
+ deleted_at TEXT
411
+ );
412
+ CREATE INDEX IF NOT EXISTS idx_web_project_workspace ON web_project(workspace_id, deleted_at);
413
+ CREATE INDEX IF NOT EXISTS idx_web_project_v4_link ON web_project(linked_v4_project_id) WHERE linked_v4_project_id IS NOT NULL;
414
+ INSERT OR IGNORE INTO workspace (id, name, idle_threshold_ms, created_at)
415
+ VALUES ('default', 'Default workspace', 600000, '1970-01-01T00:00:00.000Z');
416
+ `),t.pragma("user_version = 29"),n=29),n<30&&n!==0&&(t.exec(`
417
+ CREATE TABLE IF NOT EXISTS mailbox_cursor (
418
+ user_id TEXT PRIMARY KEY,
419
+ last_processed_version_id TEXT,
420
+ last_processed_at TEXT NOT NULL
421
+ );
422
+ `),t.pragma("user_version = 30"),n=30),n<31&&n!==0&&(t.prepare("PRAGMA table_info(project)").all().some(s=>s.name==="test_command")||t.exec("ALTER TABLE project ADD COLUMN test_command TEXT"),t.pragma("user_version = 31"),n=31),n<32&&n!==0&&(t.exec(`
423
+ -- Path-keyed root-team registry (NOT a reuse of team/team_member)
424
+ CREATE TABLE IF NOT EXISTS root_team (
425
+ teamfile_path TEXT PRIMARY KEY,
426
+ name TEXT,
427
+ raw_text TEXT NOT NULL,
428
+ raw_sha256 TEXT NOT NULL,
429
+ registered_at TEXT NOT NULL,
430
+ last_seeded_at TEXT
431
+ );
432
+
433
+ -- One row per request->response exchange
434
+ CREATE TABLE IF NOT EXISTS team_chat_log (
435
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
436
+ root_teamfile TEXT NOT NULL,
437
+ sender_teamfile TEXT NOT NULL,
438
+ sender_alias TEXT NOT NULL,
439
+ receiver_teamfile TEXT NOT NULL,
440
+ receiver_alias TEXT NOT NULL,
441
+ message TEXT NOT NULL,
442
+ response TEXT,
443
+ status TEXT NOT NULL,
444
+ error_detail TEXT,
445
+ truncated INTEGER NOT NULL DEFAULT 0,
446
+ created_at TEXT NOT NULL
447
+ );
448
+ CREATE INDEX IF NOT EXISTS idx_team_chat_log_root_time
449
+ ON team_chat_log(root_teamfile, created_at);
450
+
451
+ -- Per-receiver in-flight marker for single-sender serialization (\xA75)
452
+ CREATE TABLE IF NOT EXISTS agent_inflight (
453
+ receiver_teamfile TEXT NOT NULL,
454
+ receiver_alias TEXT NOT NULL,
455
+ sender_teamfile TEXT NOT NULL,
456
+ sender_alias TEXT NOT NULL,
457
+ started_at TEXT NOT NULL,
458
+ PRIMARY KEY(receiver_teamfile, receiver_alias)
459
+ );
460
+ `),t.pragma("user_version = 32"),n=32),n<33&&n!==0&&(G(t,"mailbox_cursor").has("mailbox_key")?t.exec(`
461
+ CREATE TABLE IF NOT EXISTS mailbox_cursor_v33 (
462
+ user_id TEXT NOT NULL,
463
+ mailbox_key TEXT NOT NULL,
464
+ last_processed_version_id TEXT,
465
+ last_processed_at TEXT NOT NULL,
466
+ PRIMARY KEY(user_id, mailbox_key)
467
+ );
468
+ INSERT OR IGNORE INTO mailbox_cursor_v33 (
469
+ user_id,
470
+ mailbox_key,
471
+ last_processed_version_id,
472
+ last_processed_at
473
+ )
474
+ SELECT
475
+ user_id,
476
+ mailbox_key,
477
+ last_processed_version_id,
478
+ last_processed_at
479
+ FROM mailbox_cursor;
480
+ DROP TABLE mailbox_cursor;
481
+ ALTER TABLE mailbox_cursor_v33 RENAME TO mailbox_cursor;
482
+ `):t.exec(`
483
+ CREATE TABLE IF NOT EXISTS mailbox_cursor_v33 (
484
+ user_id TEXT NOT NULL,
485
+ mailbox_key TEXT NOT NULL,
486
+ last_processed_version_id TEXT,
487
+ last_processed_at TEXT NOT NULL,
488
+ PRIMARY KEY(user_id, mailbox_key)
489
+ );
490
+ INSERT OR IGNORE INTO mailbox_cursor_v33 (
491
+ user_id,
492
+ mailbox_key,
493
+ last_processed_version_id,
494
+ last_processed_at
495
+ )
496
+ SELECT
497
+ user_id,
498
+ 'mailbox/' || user_id || '.json',
499
+ last_processed_version_id,
500
+ last_processed_at
501
+ FROM mailbox_cursor;
502
+ DROP TABLE mailbox_cursor;
503
+ ALTER TABLE mailbox_cursor_v33 RENAME TO mailbox_cursor;
504
+ `),t.pragma("user_version = 33"),n=33),n<34&&n!==0&&(t.exec(`
505
+ -- Per-mailbox durable watermark for daemon team_chat_log pushes. First-ever
506
+ -- start seeds this at current MAX(team_chat_log.id) to skip historic backlog;
507
+ -- subsequent restarts resume from the last successfully published id.
508
+ CREATE TABLE IF NOT EXISTS team_chat_log_cursor (
509
+ cursor_key TEXT PRIMARY KEY,
510
+ last_pushed_id INTEGER NOT NULL,
511
+ updated_at TEXT NOT NULL
512
+ );
513
+ `),t.pragma("user_version = 34"),n=34),n<35&&n!==0&&(G(t,"mailbox_cursor").has("last_processed_seq")||t.exec("ALTER TABLE mailbox_cursor ADD COLUMN last_processed_seq INTEGER;"),t.pragma("user_version = 35"),n=35),n<36&&n!==0&&(t.exec(`
514
+ CREATE TABLE IF NOT EXISTS usage_meter (
515
+ user_id TEXT NOT NULL,
516
+ device_id TEXT NOT NULL,
517
+ period TEXT NOT NULL,
518
+ put_count INTEGER NOT NULL DEFAULT 0,
519
+ get_count INTEGER NOT NULL DEFAULT 0,
520
+ list_count INTEGER NOT NULL DEFAULT 0,
521
+ updated_at TEXT NOT NULL,
522
+ PRIMARY KEY(user_id, device_id, period)
523
+ );
524
+ `),t.pragma("user_version = 36"),n=36),n<37&&n!==0&&(Xe(t,"team_connection")&&t.exec(`
525
+ CREATE TABLE IF NOT EXISTS team_connection_v37 (
526
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
527
+ source_teamfile TEXT NOT NULL,
528
+ target_name TEXT NOT NULL,
529
+ target_teamfile TEXT NOT NULL,
530
+ created_at TEXT NOT NULL,
531
+ UNIQUE(source_teamfile, target_name, target_teamfile)
532
+ );
533
+ INSERT OR IGNORE INTO team_connection_v37 (
534
+ id,
535
+ source_teamfile,
536
+ target_name,
537
+ target_teamfile,
538
+ created_at
539
+ )
540
+ SELECT
541
+ id,
542
+ source_teamfile,
543
+ target_name,
544
+ target_teamfile,
545
+ created_at
546
+ FROM team_connection
547
+ ORDER BY id ASC;
548
+ DROP TABLE team_connection;
549
+ ALTER TABLE team_connection_v37 RENAME TO team_connection;
550
+ `),t.pragma("user_version = 37"),n=37),n<38&&n!==0&&(G(t,"agent_inflight").has("active_count")||t.exec("ALTER TABLE agent_inflight ADD COLUMN active_count INTEGER NOT NULL DEFAULT 1;"),t.exec("DROP TABLE IF EXISTS team_connection;"),t.pragma("user_version = 38"),n=38),n<39&&n!==0&&(G(t,"agent_inflight").has("holder_pid")||t.exec("ALTER TABLE agent_inflight ADD COLUMN holder_pid INTEGER;"),t.pragma("user_version = 39"),n=39),n<40&&n!==0&&(t.exec(`
551
+ CREATE TABLE IF NOT EXISTS delegation_job (
552
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
553
+ teamfile TEXT NOT NULL,
554
+ alias TEXT NOT NULL,
555
+ from_identity TEXT NOT NULL,
556
+ root_teamfile TEXT NOT NULL,
557
+ prompt TEXT NOT NULL,
558
+ status TEXT NOT NULL CHECK(status IN ('pending', 'running', 'done', 'error', 'busy', 'cancelled')),
559
+ created_at TEXT NOT NULL,
560
+ started_at TEXT,
561
+ ended_at TEXT,
562
+ locked_by TEXT,
563
+ worker_pid INTEGER,
564
+ locked_until TEXT,
565
+ result_text TEXT,
566
+ error TEXT,
567
+ team_chat_log_id INTEGER REFERENCES team_chat_log(id),
568
+ attempt_count INTEGER NOT NULL DEFAULT 0
569
+ );
570
+ CREATE INDEX IF NOT EXISTS idx_delegation_job_status_created
571
+ ON delegation_job(status, created_at DESC);
572
+ CREATE INDEX IF NOT EXISTS idx_delegation_job_team_created
573
+ ON delegation_job(teamfile, created_at DESC);
574
+ CREATE INDEX IF NOT EXISTS idx_delegation_job_from_created
575
+ ON delegation_job(from_identity, created_at DESC);
576
+
577
+ CREATE TABLE IF NOT EXISTS delegation_event (
578
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
579
+ delegation_job_id INTEGER NOT NULL REFERENCES delegation_job(id) ON DELETE CASCADE,
580
+ ts TEXT NOT NULL,
581
+ kind TEXT NOT NULL,
582
+ payload TEXT NOT NULL
583
+ );
584
+ CREATE INDEX IF NOT EXISTS idx_delegation_event_job_id
585
+ ON delegation_event(delegation_job_id, id);
586
+ `),t.pragma("user_version = 40"),n=40),n<41&&n!==0){let r=G(t,"delegation_job");r.has("permission_mode")||t.exec("ALTER TABLE delegation_job ADD COLUMN permission_mode TEXT;"),r.has("idle_timeout_ms")||t.exec("ALTER TABLE delegation_job ADD COLUMN idle_timeout_ms INTEGER;"),t.pragma("user_version = 41"),n=41}if(n<42&&n!==0&&(G(t,"delegation_job").has("delivered_at")||t.exec("ALTER TABLE delegation_job ADD COLUMN delivered_at TEXT;"),t.pragma("user_version = 42"),n=42),n<43&&n!==0&&(G(t,"delegation_job").has("meta")||t.exec("ALTER TABLE delegation_job ADD COLUMN meta TEXT;"),t.exec(`
587
+ CREATE TABLE IF NOT EXISTS runtime_state (
588
+ scope TEXT NOT NULL,
589
+ key TEXT NOT NULL,
590
+ kind TEXT NOT NULL,
591
+ data TEXT NOT NULL,
592
+ updated_at TEXT NOT NULL,
593
+ PRIMARY KEY(scope, key, kind)
594
+ );
595
+ `),t.pragma("user_version = 43"),n=43),n<44&&n!==0&&(t.exec(`
596
+ CREATE TABLE IF NOT EXISTS tracked_invocation (
597
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
598
+ kind TEXT NOT NULL CHECK(kind IN ('chat', 'exec')),
599
+ origin TEXT NOT NULL CHECK(origin IN ('agent', 'operator', 'mcp', 'unknown')),
600
+ scope_teamfile TEXT,
601
+ from_identity TEXT NOT NULL,
602
+ target_teamfile TEXT,
603
+ target_alias TEXT,
604
+ root_teamfile TEXT,
605
+ cwd TEXT,
606
+ command TEXT,
607
+ status TEXT NOT NULL CHECK(status IN ('running', 'done', 'error', 'busy', 'cancelled')),
608
+ started_at TEXT NOT NULL,
609
+ ended_at TEXT,
610
+ holder_pid INTEGER,
611
+ holder_host TEXT,
612
+ last_heartbeat_at TEXT,
613
+ exit_code INTEGER,
614
+ signal TEXT,
615
+ result_summary TEXT,
616
+ error TEXT,
617
+ team_chat_log_id INTEGER,
618
+ meta TEXT
619
+ );
620
+ CREATE INDEX IF NOT EXISTS idx_tracked_invocation_status_started
621
+ ON tracked_invocation(status, started_at);
622
+ CREATE INDEX IF NOT EXISTS idx_tracked_invocation_from_status_started
623
+ ON tracked_invocation(from_identity, status, started_at);
624
+ CREATE INDEX IF NOT EXISTS idx_tracked_invocation_scope_status_started
625
+ ON tracked_invocation(scope_teamfile, status, started_at);
626
+ CREATE INDEX IF NOT EXISTS idx_tracked_invocation_status_ended
627
+ ON tracked_invocation(status, ended_at);
628
+ `),t.pragma("user_version = 44"),n=44),n<45&&n!==0&&(t.exec(`
629
+ CREATE TABLE IF NOT EXISTS agent_mailbox (
630
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
631
+ receiver_teamfile TEXT NOT NULL,
632
+ receiver_alias TEXT NOT NULL,
633
+ sender_teamfile TEXT,
634
+ sender_alias TEXT,
635
+ root_teamfile TEXT,
636
+ payload TEXT NOT NULL,
637
+ created_at TEXT NOT NULL,
638
+ remote_transport TEXT,
639
+ remote_message_id TEXT,
640
+ remote_thread_id TEXT,
641
+ meta TEXT
642
+ );
643
+ CREATE INDEX IF NOT EXISTS idx_agent_mailbox_receiver_id
644
+ ON agent_mailbox(receiver_teamfile, receiver_alias, id);
645
+ CREATE INDEX IF NOT EXISTS idx_agent_mailbox_sender_created
646
+ ON agent_mailbox(sender_teamfile, sender_alias, created_at);
647
+ CREATE INDEX IF NOT EXISTS idx_agent_mailbox_created
648
+ ON agent_mailbox(created_at);
649
+ `),t.pragma("user_version = 45"),n=45),n<46&&n!==0&&(Xe(t,"team_chat_log")?rc(t):t.exec(`
650
+ CREATE TABLE IF NOT EXISTS team_chat_log (
651
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
652
+ root_teamfile TEXT NOT NULL,
653
+ sender_teamfile TEXT,
654
+ sender_alias TEXT,
655
+ receiver_teamfile TEXT NOT NULL,
656
+ receiver_alias TEXT NOT NULL,
657
+ message TEXT NOT NULL,
658
+ response TEXT,
659
+ origin TEXT NOT NULL CHECK(origin IN ('agent','operator','mcp','unknown')),
660
+ status TEXT NOT NULL,
661
+ error_detail TEXT,
662
+ truncated INTEGER NOT NULL DEFAULT 0,
663
+ created_at TEXT NOT NULL
664
+ );
665
+ `),t.exec(`
666
+ CREATE INDEX IF NOT EXISTS idx_team_chat_log_root_time
667
+ ON team_chat_log(root_teamfile, created_at);
668
+ `),t.pragma("user_version = 46"),n=46),n>=46&&Xe(t,"team_chat_log")&&!G(t,"team_chat_log").has("origin")&&rc(t),n<47&&n!==0){if(Rt(t,"tracked_invocation"),Xe(t,"agent_mailbox")){let s=G(t,"agent_mailbox");s.has("delivered_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivered_at TEXT;"),s.has("receipt")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN receipt TEXT;")}let r=G(t,"tracked_invocation");r.has("notified_by")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_by TEXT;"),r.has("notified_at")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_at TEXT;"),t.pragma("user_version = 47"),n=47}if(n<48&&n!==0){if(Xe(t,"agent_mailbox")){let r=G(t,"agent_mailbox");r.has("delivering_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivering_at TEXT;"),r.has("delivery_holder_pid")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_pid INTEGER;"),r.has("delivery_holder_host")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_host TEXT;"),r.has("waited_at")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_at TEXT;"),r.has("waited_by")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_by TEXT;"),t.exec(`
669
+ CREATE INDEX IF NOT EXISTS idx_agent_mailbox_sender_delivery_wait
670
+ ON agent_mailbox(sender_teamfile, sender_alias, delivered_at, waited_at, id);
671
+ CREATE INDEX IF NOT EXISTS idx_agent_mailbox_lane_delivery
672
+ ON agent_mailbox(sender_teamfile, sender_alias, receiver_teamfile, receiver_alias, delivered_at, delivering_at, id);
673
+ `)}t.pragma("user_version = 48"),n=48}if(n<49&&n!==0&&(Rt(t,"tracked_invocation"),t.exec(`
674
+ UPDATE tracked_invocation
675
+ SET notified_by = 'migration-baseline',
676
+ notified_at = COALESCE(ended_at, started_at)
677
+ WHERE status IN ('done', 'error', 'busy', 'cancelled')
678
+ AND notified_by IS NULL;
679
+ `),t.pragma("user_version = 49"),n=49),n<50&&n!==0&&(Rt(t,"tracked_invocation"),G(t,"tracked_invocation").has("launch_source")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN launch_source TEXT;"),t.pragma("user_version = 50"),n=50),n<51&&n!==0){if(Xe(t,"agent_mailbox")){let r=G(t,"agent_mailbox");r.has("message_type")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN message_type TEXT NOT NULL DEFAULT 'request' CHECK(message_type IN ('request','response'));"),r.has("reply_mode")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN reply_mode TEXT NOT NULL DEFAULT 'pull' CHECK(reply_mode IN ('push','pull'));"),r.has("request_mailbox_id")||t.exec("ALTER TABLE agent_mailbox ADD COLUMN request_mailbox_id INTEGER;"),t.exec(`
680
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_agent_mailbox_response_request_unique
681
+ ON agent_mailbox(request_mailbox_id)
682
+ WHERE message_type = 'response' AND request_mailbox_id IS NOT NULL;
683
+ CREATE TRIGGER IF NOT EXISTS trg_agent_mailbox_response_request_insert
684
+ BEFORE INSERT ON agent_mailbox
685
+ WHEN NEW.message_type = 'response' AND NEW.request_mailbox_id IS NULL
686
+ BEGIN
687
+ SELECT RAISE(ABORT, 'agent_mailbox response requires request_mailbox_id');
688
+ END;
689
+ CREATE TRIGGER IF NOT EXISTS trg_agent_mailbox_response_request_update
690
+ BEFORE UPDATE OF message_type, request_mailbox_id ON agent_mailbox
691
+ WHEN NEW.message_type = 'response' AND NEW.request_mailbox_id IS NULL
692
+ BEGIN
693
+ SELECT RAISE(ABORT, 'agent_mailbox response requires request_mailbox_id');
694
+ END;
695
+ `)}t.pragma("user_version = 51"),n=51}if(n<52&&n!==0&&(Rt(t,"tracked_invocation"),G(t,"tracked_invocation").has("request_payload")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN request_payload TEXT;"),t.pragma("user_version = 52"),n=52),n<53&&n!==0&&(t.exec(`
696
+ CREATE TABLE IF NOT EXISTS message_event (
697
+ seq INTEGER PRIMARY KEY AUTOINCREMENT,
698
+ event_id TEXT NOT NULL UNIQUE,
699
+ ts TEXT NOT NULL,
700
+ stream_id TEXT NOT NULL,
701
+ event_type TEXT NOT NULL,
702
+ payload TEXT NOT NULL CHECK(json_valid(payload)),
703
+ sender_teamfile TEXT GENERATED ALWAYS AS (json_extract(payload, '$.sender.teamfile')) STORED,
704
+ sender_alias TEXT GENERATED ALWAYS AS (json_extract(payload, '$.sender.alias')) STORED,
705
+ receiver_teamfile TEXT GENERATED ALWAYS AS (json_extract(payload, '$.receiver.teamfile')) STORED,
706
+ receiver_alias TEXT GENERATED ALWAYS AS (json_extract(payload, '$.receiver.alias')) STORED
707
+ );
708
+ CREATE INDEX IF NOT EXISTS idx_message_event_stream ON message_event(stream_id, seq);
709
+ CREATE INDEX IF NOT EXISTS idx_message_event_type ON message_event(event_type, seq);
710
+ CREATE INDEX IF NOT EXISTS idx_message_event_sender ON message_event(sender_teamfile, sender_alias, seq);
711
+ CREATE INDEX IF NOT EXISTS idx_message_event_receiver ON message_event(receiver_teamfile, receiver_alias, seq);
712
+ CREATE TABLE IF NOT EXISTS agent_state (
713
+ receiver_teamfile TEXT NOT NULL,
714
+ receiver_alias TEXT NOT NULL,
715
+ lease_id TEXT UNIQUE,
716
+ sender_teamfile TEXT,
717
+ sender_alias TEXT,
718
+ holder_pid INTEGER,
719
+ holder_host TEXT,
720
+ started_at TEXT,
721
+ last_heartbeat_at TEXT,
722
+ terminal_lock_id TEXT UNIQUE,
723
+ terminal_invocation_id TEXT UNIQUE,
724
+ terminal_invocation_pid INTEGER,
725
+ terminal_invocation_host TEXT,
726
+ terminal_invocation_heartbeat_at TEXT,
727
+ last_seq INTEGER NOT NULL,
728
+ PRIMARY KEY(receiver_teamfile, receiver_alias)
729
+ );
730
+ CREATE TABLE IF NOT EXISTS message_pending (
731
+ message_id TEXT PRIMARY KEY,
732
+ message_type TEXT NOT NULL CHECK(message_type IN ('request','response')),
733
+ in_reply_to TEXT UNIQUE,
734
+ sender_teamfile TEXT,
735
+ sender_alias TEXT,
736
+ receiver_teamfile TEXT NOT NULL,
737
+ receiver_alias TEXT NOT NULL,
738
+ lifecycle_state TEXT NOT NULL,
739
+ delivery_lease_id TEXT,
740
+ delivery_holder_pid INTEGER,
741
+ created_seq INTEGER NOT NULL,
742
+ last_seq INTEGER NOT NULL
743
+ );
744
+ CREATE INDEX IF NOT EXISTS idx_message_pending_lane
745
+ ON message_pending(sender_teamfile, sender_alias, receiver_teamfile,
746
+ receiver_alias, message_type, created_seq)
747
+ WHERE lifecycle_state = 'queued';
748
+ CREATE TABLE IF NOT EXISTS invocation_state (
749
+ invocation_id TEXT PRIMARY KEY,
750
+ kind TEXT NOT NULL,
751
+ origin TEXT NOT NULL,
752
+ launch_source TEXT NOT NULL,
753
+ from_identity TEXT NOT NULL,
754
+ target_teamfile TEXT,
755
+ target_alias TEXT,
756
+ root_teamfile TEXT,
757
+ cwd TEXT,
758
+ command TEXT,
759
+ request_message_id TEXT,
760
+ request_payload TEXT,
761
+ holder_pid INTEGER,
762
+ holder_host TEXT,
763
+ status TEXT NOT NULL,
764
+ started_at TEXT NOT NULL,
765
+ last_heartbeat_at TEXT,
766
+ ended_at TEXT,
767
+ result_summary TEXT,
768
+ error TEXT,
769
+ notified_by TEXT,
770
+ notified_at TEXT,
771
+ last_seq INTEGER NOT NULL
772
+ );
773
+ CREATE INDEX IF NOT EXISTS idx_invocation_state_target_status
774
+ ON invocation_state(target_teamfile, target_alias, status, launch_source);
775
+ CREATE INDEX IF NOT EXISTS idx_invocation_state_from_time
776
+ ON invocation_state(from_identity, started_at DESC);
777
+ `),t.pragma("user_version = 53"),n=53),n<54&&n!==0&&(Rt(t,"agent_state"),G(t,"agent_state").has("currently_handling_message_id")||t.exec("ALTER TABLE agent_state ADD COLUMN currently_handling_message_id TEXT;"),t.pragma("user_version = 54"),n=54),n<55&&n!==0&&(Rt(t,"agent_state"),G(t,"agent_state").has("currently_handling_since")||t.exec("ALTER TABLE agent_state ADD COLUMN currently_handling_since TEXT;"),t.pragma("user_version = 55"),n=55),n<56&&n!==0&&(Xe(t,"tracked_invocation")&&t.exec(`
778
+ CREATE TABLE tracked_invocation_v56 (
779
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
780
+ kind TEXT NOT NULL CHECK(kind IN ('chat', 'exec')),
781
+ origin TEXT NOT NULL CHECK(origin IN ('agent', 'operator', 'mcp', 'unknown')),
782
+ scope_teamfile TEXT,
783
+ from_identity TEXT NOT NULL,
784
+ target_teamfile TEXT,
785
+ target_alias TEXT,
786
+ root_teamfile TEXT,
787
+ cwd TEXT,
788
+ command TEXT,
789
+ status TEXT NOT NULL CHECK(status IN ('running', 'done', 'error', 'busy', 'cancelled', 'aborted')),
790
+ started_at TEXT NOT NULL,
791
+ ended_at TEXT,
792
+ holder_pid INTEGER,
793
+ holder_host TEXT,
794
+ last_heartbeat_at TEXT,
795
+ exit_code INTEGER,
796
+ signal TEXT,
797
+ result_summary TEXT,
798
+ error TEXT,
799
+ team_chat_log_id INTEGER,
800
+ meta TEXT,
801
+ notified_by TEXT,
802
+ notified_at TEXT,
803
+ launch_source TEXT,
804
+ request_payload TEXT
805
+ );
806
+ INSERT INTO tracked_invocation_v56 (
807
+ id, kind, origin, scope_teamfile, from_identity, target_teamfile,
808
+ target_alias, root_teamfile, cwd, command, status, started_at,
809
+ ended_at, holder_pid, holder_host, last_heartbeat_at, exit_code,
810
+ signal, result_summary, error, team_chat_log_id, meta, notified_by,
811
+ notified_at, launch_source, request_payload
812
+ )
813
+ SELECT
814
+ id, kind, origin, scope_teamfile, from_identity, target_teamfile,
815
+ target_alias, root_teamfile, cwd, command, status, started_at,
816
+ ended_at, holder_pid, holder_host, last_heartbeat_at, exit_code,
817
+ signal, result_summary, error, team_chat_log_id, meta, notified_by,
818
+ notified_at, launch_source, request_payload
819
+ FROM tracked_invocation
820
+ ORDER BY id ASC;
821
+ DROP TABLE tracked_invocation;
822
+ ALTER TABLE tracked_invocation_v56 RENAME TO tracked_invocation;
823
+ CREATE INDEX IF NOT EXISTS idx_tracked_invocation_status_started
824
+ ON tracked_invocation(status, started_at);
825
+ CREATE INDEX IF NOT EXISTS idx_tracked_invocation_from_status_started
826
+ ON tracked_invocation(from_identity, status, started_at);
827
+ CREATE INDEX IF NOT EXISTS idx_tracked_invocation_scope_status_started
828
+ ON tracked_invocation(scope_teamfile, status, started_at);
829
+ CREATE INDEX IF NOT EXISTS idx_tracked_invocation_status_ended
830
+ ON tracked_invocation(status, ended_at);
831
+ `),t.pragma("user_version = 56"),n=56),n<57&&n!==0&&(Xe(t,"agent_mailbox")&&ec(t),t.exec("DROP TABLE IF EXISTS agent_mailbox;"),t.pragma("user_version = 57"),n=57),n<58&&n!==0&&(Rt(t,"tracked_invocation"),G(t,"tracked_invocation").has("parent_invocation_id")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN parent_invocation_id INTEGER;"),t.pragma("user_version = 58"),n=58),n<59&&n!==0&&(t.exec(`
832
+ CREATE TABLE IF NOT EXISTS state_ledger_identity (
833
+ singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
834
+ instance_id TEXT NOT NULL,
835
+ created_at TEXT NOT NULL
836
+ );
837
+ `),t.pragma("user_version = 59"),n=59),n<60&&n!==0&&(Rt(t,"tracked_invocation"),G(t,"tracked_invocation").has("config_warnings")||t.exec("ALTER TABLE tracked_invocation ADD COLUMN config_warnings TEXT;"),t.pragma("user_version = 60"),n=60),n<61&&n!==0){let r=G(t,"team_chat_log");r.size>0&&!r.has("message_type")&&t.exec("ALTER TABLE team_chat_log ADD COLUMN message_type TEXT CHECK(message_type IN ('batch'));"),t.exec(`
838
+ CREATE TABLE IF NOT EXISTS schema_meta (
839
+ key TEXT PRIMARY KEY,
840
+ value TEXT NOT NULL
841
+ );
842
+ INSERT OR IGNORE INTO schema_meta (key, value) VALUES ('min_reader_version', '60');
843
+ `),t.pragma("user_version = 61"),n=61}if(n<62&&n!==0&&(t.exec(`
844
+ CREATE TABLE IF NOT EXISTS queue(
845
+ id INTEGER PRIMARY KEY,
846
+ from_id TEXT NOT NULL,
847
+ to_id TEXT NOT NULL,
848
+ prompt_file TEXT NOT NULL,
849
+ status TEXT NOT NULL DEFAULT 'pending',
850
+ created_ts TEXT NOT NULL,
851
+ sent_ts TEXT,
852
+ retrieved_ts TEXT,
853
+ subject_id TEXT,
854
+ dedupe_key TEXT UNIQUE,
855
+ delivered_via_escalation INTEGER NOT NULL DEFAULT 0,
856
+ escalation_claimed_ts TEXT,
857
+ escalation_claim_token TEXT,
858
+ escalation_only INTEGER NOT NULL DEFAULT 0,
859
+ admission_fingerprint TEXT,
860
+ expects_response INTEGER NOT NULL DEFAULT 0,
861
+ to_alias TEXT,
862
+ retracted_ts TEXT,
863
+ retracted_reason TEXT,
864
+ retraction_notice INTEGER NOT NULL DEFAULT 0,
865
+ in_reply_to INTEGER,
866
+ operator_priority INTEGER NOT NULL DEFAULT 0,
867
+ merged_into_id INTEGER
868
+ );
869
+
870
+ CREATE INDEX IF NOT EXISTS idx_queue_to_status ON queue(to_id, status);
871
+
872
+ CREATE TABLE IF NOT EXISTS answers(
873
+ id INTEGER PRIMARY KEY,
874
+ prompt_queue_id INTEGER NOT NULL REFERENCES queue(id),
875
+ answer_text TEXT NOT NULL,
876
+ answered_at TEXT NOT NULL,
877
+ created_at TEXT NOT NULL,
878
+ superseded_at TEXT
879
+ );
880
+
881
+ CREATE INDEX IF NOT EXISTS idx_answers_answered_at ON answers(answered_at);
882
+
883
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_answers_current ON answers(prompt_queue_id) WHERE superseded_at IS NULL;
884
+
885
+ CREATE TABLE IF NOT EXISTS prompt_tasks(
886
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
887
+ parent_id INTEGER REFERENCES prompt_tasks(id),
888
+ kind TEXT NOT NULL DEFAULT 'task' CHECK(kind IN ('epic', 'task')),
889
+ title TEXT NOT NULL,
890
+ description TEXT NOT NULL DEFAULT '',
891
+ created_at TEXT NOT NULL
892
+ );
893
+
894
+ CREATE INDEX IF NOT EXISTS idx_prompt_tasks_parent ON prompt_tasks(parent_id);
895
+
896
+ CREATE TABLE IF NOT EXISTS task_prompts(
897
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
898
+ task_id INTEGER REFERENCES prompt_tasks(id),
899
+ from_id TEXT NOT NULL,
900
+ to_id TEXT NOT NULL,
901
+ prompt TEXT NOT NULL,
902
+ created_at TEXT NOT NULL,
903
+ retrieved_ts TEXT
904
+ );
905
+
906
+ CREATE INDEX IF NOT EXISTS idx_task_prompts_task ON task_prompts(task_id);
907
+
908
+ CREATE INDEX IF NOT EXISTS idx_task_prompts_to ON task_prompts(to_id, created_at);
909
+
910
+ CREATE TABLE IF NOT EXISTS prompt_task_reassignments(
911
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
912
+ prompt_id INTEGER NOT NULL REFERENCES task_prompts(id),
913
+ from_task_id INTEGER REFERENCES prompt_tasks(id),
914
+ to_task_id INTEGER NOT NULL REFERENCES prompt_tasks(id),
915
+ reassigned_by TEXT NOT NULL,
916
+ reassigned_at TEXT NOT NULL
917
+ );
918
+
919
+ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_reassignments(prompt_id);
920
+ `),t.exec("INSERT OR IGNORE INTO schema_meta (key, value) VALUES ('min_reader_version', '61')"),t.pragma("user_version = 62"),n=62),n<63&&n!==0&&(t.transaction(()=>{if(gr(t)<63){let r=G(t,"team_chat_log");for(let[s,i]of Object.entries(cs))r.has(s)||t.exec(`ALTER TABLE team_chat_log ADD COLUMN ${s} ${i}`);t.exec(Eu),t.exec("INSERT OR IGNORE INTO schema_meta(key,value) VALUES('min_reader_version','62')"),t.pragma("user_version = 63")}}).immediate(),n=63),n<64&&n!==0&&(t.exec(Zu),t.exec("INSERT OR IGNORE INTO schema_meta(key,value) VALUES('min_reader_version','63')"),t.pragma("user_version = 64"),n=64),n<65&&n!==0&&(t.transaction(()=>{G(t,"team_chat_log").has("accounting_only")||t.exec("ALTER TABLE team_chat_log ADD COLUMN accounting_only INTEGER"),t.exec("INSERT OR IGNORE INTO schema_meta(key,value) VALUES('min_reader_version','64')"),t.pragma("user_version = 65")}).immediate(),n=65),n<66&&n!==0){if(Xe(t,"agent_inflight")){let r=G(t,"agent_inflight"),s=[["native_provider","TEXT"],["native_session_id","TEXT"],["native_endpoint","TEXT"],["native_phase","TEXT CHECK(native_phase IN ('starting', 'ready', 'closing'))"],["native_generation","TEXT"],["native_boot_id","TEXT"],["native_start_time","TEXT"],["native_config_json","TEXT"]];for(let[i,o]of s)r.has(i)||t.exec(`ALTER TABLE agent_inflight ADD COLUMN ${i} ${o}`);t.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_agent_inflight_native_address
921
+ ON agent_inflight(native_provider, native_session_id)
922
+ WHERE native_provider IS NOT NULL AND native_session_id IS NOT NULL`)}t.exec("INSERT OR IGNORE INTO schema_meta(key,value) VALUES('min_reader_version','65')"),t.pragma("user_version = 66"),n=66}BE(YE)}function nc(t){t.prepare("SELECT instance_id FROM state_ledger_identity WHERE singleton = 1").get()===void 0&&t.prepare("INSERT OR IGNORE INTO state_ledger_identity (singleton, instance_id, created_at) VALUES (1, ?, ?)").run(qE(),new Date().toISOString())}function G(t,e){let n=t.prepare(`PRAGMA table_info(${e})`).all();return new Set(n.map(r=>r.name))}function Xe(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Rt(t,e){if(!Xe(t,e)&&(t.exec(ic(dc,"utf8").replace(/-- v63 usage objects begin[\s\S]*?-- v63 usage objects end/,"")),!Xe(t,e)))throw new Error(`schema.sql did not create expected table: ${e}`)}function rc(t){let e=G(t,"team_chat_log");t.pragma("foreign_keys = OFF");try{t.exec(`
923
+ DROP TABLE IF EXISTS team_chat_log_v46;
924
+ CREATE TABLE team_chat_log_v46 (
925
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
926
+ root_teamfile TEXT NOT NULL,
927
+ sender_teamfile TEXT,
928
+ sender_alias TEXT,
929
+ receiver_teamfile TEXT NOT NULL,
930
+ receiver_alias TEXT NOT NULL,
931
+ message TEXT NOT NULL,
932
+ response TEXT,
933
+ origin TEXT NOT NULL CHECK(origin IN ('agent','operator','mcp','unknown')),
934
+ status TEXT NOT NULL,
935
+ error_detail TEXT,
936
+ truncated INTEGER NOT NULL DEFAULT 0,
937
+ created_at TEXT NOT NULL
938
+ );
939
+ INSERT INTO team_chat_log_v46 (
940
+ id, root_teamfile, sender_teamfile, sender_alias, receiver_teamfile, receiver_alias,
941
+ message, response, origin, status, error_detail, truncated, created_at
942
+ )
943
+ SELECT
944
+ id, root_teamfile, sender_teamfile, sender_alias, receiver_teamfile, receiver_alias,
945
+ message, response,
946
+ ${e.has("origin")?"origin":"'unknown'"},
947
+ status, error_detail, truncated, created_at
948
+ FROM team_chat_log;
949
+ DROP TABLE team_chat_log;
950
+ ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
951
+ `)}finally{t.pragma("foreign_keys = ON")}}function gr(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function QE(t,e){try{if(!Xe(t,"schema_meta"))return e;let n=t.prepare("SELECT value FROM schema_meta WHERE key = 'min_reader_version'").get();if(n===void 0||typeof n.value!="string"||!/^\d+$/.test(n.value))return e;let r=Number(n.value);return Number.isSafeInteger(r)&&r>0?r:e}catch{return e}}var sc=!1;function ZE(t,e,n){sc||(sc=!0,process.stderr.write("warning: "+t+": this lmctl is too old for this database (database v"+e+"; build v"+n+`). --allow-schema-skew may hide newer data. Run: npm install -g @lmctl-ai/lmctl@latest. No manual database changes are needed.
952
+ `),process.argv.includes("--json")&&process.stderr.write(`${JSON.stringify({schema_skew:{db_version:e,build_version:n,mode:"best_effort"}})}
953
+ `))}var ev=null;function tv(){return process.env.LMCTL_DB??GE(JE(),".lmctl","state.db")}if(process.argv[1]&&(process.argv[1].endsWith("migrate.ts")||process.argv[1].endsWith("migrate.js"))&&import.meta.url===KE(process.argv[1]).href)try{let t=Ss({dbPath:process.argv[2]??tv()});try{process.stdout.write("migrated user_version="+gr(t)+`
954
+ `)}finally{t.close()}}catch(t){if(!(t instanceof rn))throw t;process.stderr.write("error: "+t.message+`
955
+ `),process.exitCode=1}function uc(t){return{getAgentInflight:t.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:t.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:t.prepare(`
956
+ INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
957
+ VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
958
+ ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
959
+ sender_teamfile = CASE
960
+ WHEN @force = 1
961
+ OR (
962
+ @stale_before IS NOT NULL
963
+ AND agent_inflight.holder_pid IS NULL
964
+ AND agent_inflight.started_at < @stale_before
965
+ )
966
+ OR (
967
+ @reclaim_observed_sender_teamfile IS NOT NULL
968
+ AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
969
+ AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
970
+ AND agent_inflight.started_at = @reclaim_observed_started_at
971
+ AND @reclaim_observed_holder_pid IS NOT NULL
972
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
973
+ )
974
+ THEN excluded.sender_teamfile
975
+ ELSE agent_inflight.sender_teamfile
976
+ END,
977
+ sender_alias = CASE
978
+ WHEN @force = 1
979
+ OR (
980
+ @stale_before IS NOT NULL
981
+ AND agent_inflight.holder_pid IS NULL
982
+ AND agent_inflight.started_at < @stale_before
983
+ )
984
+ OR (
985
+ @reclaim_observed_sender_teamfile IS NOT NULL
986
+ AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
987
+ AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
988
+ AND agent_inflight.started_at = @reclaim_observed_started_at
989
+ AND @reclaim_observed_holder_pid IS NOT NULL
990
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
991
+ )
992
+ THEN excluded.sender_alias
993
+ ELSE agent_inflight.sender_alias
994
+ END,
995
+ started_at = CASE
996
+ WHEN @force = 1
997
+ OR (
998
+ @stale_before IS NOT NULL
999
+ AND agent_inflight.holder_pid IS NULL
1000
+ AND agent_inflight.started_at < @stale_before
1001
+ )
1002
+ OR (
1003
+ @reclaim_observed_sender_teamfile IS NOT NULL
1004
+ AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
1005
+ AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
1006
+ AND agent_inflight.started_at = @reclaim_observed_started_at
1007
+ AND @reclaim_observed_holder_pid IS NOT NULL
1008
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
1009
+ )
1010
+ THEN excluded.started_at
1011
+ ELSE agent_inflight.started_at
1012
+ END,
1013
+ active_count = CASE
1014
+ WHEN @force = 1
1015
+ OR (
1016
+ @stale_before IS NOT NULL
1017
+ AND agent_inflight.holder_pid IS NULL
1018
+ AND agent_inflight.started_at < @stale_before
1019
+ )
1020
+ OR (
1021
+ @reclaim_observed_sender_teamfile IS NOT NULL
1022
+ AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
1023
+ AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
1024
+ AND agent_inflight.started_at = @reclaim_observed_started_at
1025
+ AND @reclaim_observed_holder_pid IS NOT NULL
1026
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
1027
+ )
1028
+ THEN 1
1029
+ ELSE agent_inflight.active_count
1030
+ END,
1031
+ holder_pid = CASE
1032
+ WHEN @force = 1
1033
+ OR (
1034
+ @stale_before IS NOT NULL
1035
+ AND agent_inflight.holder_pid IS NULL
1036
+ AND agent_inflight.started_at < @stale_before
1037
+ )
1038
+ OR (
1039
+ @reclaim_observed_sender_teamfile IS NOT NULL
1040
+ AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
1041
+ AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
1042
+ AND agent_inflight.started_at = @reclaim_observed_started_at
1043
+ AND @reclaim_observed_holder_pid IS NOT NULL
1044
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
1045
+ )
1046
+ THEN excluded.holder_pid
1047
+ ELSE agent_inflight.holder_pid
1048
+ END
1049
+ WHERE @force = 1
1050
+ OR (
1051
+ @stale_before IS NOT NULL
1052
+ AND agent_inflight.holder_pid IS NULL
1053
+ AND agent_inflight.started_at < @stale_before
1054
+ )
1055
+ OR (
1056
+ @reclaim_observed_sender_teamfile IS NOT NULL
1057
+ AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
1058
+ AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
1059
+ AND agent_inflight.started_at = @reclaim_observed_started_at
1060
+ AND @reclaim_observed_holder_pid IS NOT NULL
1061
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
1062
+ )
1063
+ RETURNING *
1064
+ `),clearAgentInflight:t.prepare("DELETE FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),clearAgentInflightIfSender:t.prepare(`
1065
+ DELETE FROM agent_inflight
1066
+ WHERE receiver_teamfile = ?
1067
+ AND receiver_alias = ?
1068
+ AND sender_teamfile = ?
1069
+ AND sender_alias = ?
1070
+ `),clearObservedTerminalAgentInflight:t.prepare(`
1071
+ DELETE FROM agent_inflight
1072
+ WHERE receiver_teamfile = @receiver_teamfile
1073
+ AND receiver_alias = @receiver_alias
1074
+ AND sender_teamfile = @receiver_teamfile
1075
+ AND sender_alias = 'terminal'
1076
+ AND sender_teamfile = @observed_sender_teamfile
1077
+ AND sender_alias = @observed_sender_alias
1078
+ AND started_at = @observed_started_at
1079
+ AND (
1080
+ (holder_pid IS NULL AND @observed_holder_pid IS NULL)
1081
+ OR holder_pid = @observed_holder_pid
1082
+ )
1083
+ `),decrementAgentInflight:t.prepare(`
1084
+ UPDATE agent_inflight
1085
+ SET active_count = active_count - 1
1086
+ WHERE receiver_teamfile = ?
1087
+ AND receiver_alias = ?
1088
+ AND sender_teamfile = ?
1089
+ AND sender_alias = ?
1090
+ AND active_count > 1
1091
+ `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?"),getNativeHolder:t.prepare(`
1092
+ SELECT ai.* FROM agent_inflight ai
1093
+ JOIN agent_state s ON s.receiver_teamfile = ai.receiver_teamfile
1094
+ AND s.receiver_alias = ai.receiver_alias
1095
+ AND s.lease_id = ai.native_generation
1096
+ WHERE ai.native_provider = ? AND ai.native_session_id = ?
1097
+ `),clearNativeHolderMetadata:t.prepare(`
1098
+ UPDATE agent_inflight SET native_provider = NULL, native_session_id = NULL,
1099
+ native_endpoint = NULL, native_phase = NULL, native_generation = NULL,
1100
+ native_boot_id = NULL, native_start_time = NULL, native_config_json = NULL
1101
+ WHERE receiver_teamfile = ? AND receiver_alias = ?
1102
+ `),setNativeHolderMetadata:t.prepare(`
1103
+ UPDATE agent_inflight SET native_provider = @provider, native_session_id = @session_id,
1104
+ native_endpoint = @endpoint, native_phase = @phase, native_generation = @generation,
1105
+ native_boot_id = @boot_id, native_start_time = @start_time, native_config_json = @config_json
1106
+ WHERE receiver_teamfile = @receiver_teamfile AND receiver_alias = @receiver_alias
1107
+ AND native_generation IS NULL
1108
+ AND EXISTS (SELECT 1 FROM agent_state s
1109
+ WHERE s.receiver_teamfile = agent_inflight.receiver_teamfile
1110
+ AND s.receiver_alias = agent_inflight.receiver_alias
1111
+ AND s.lease_id = @generation)
1112
+ `),updateNativeHolderPhase:t.prepare(`
1113
+ UPDATE agent_inflight SET native_phase = ?
1114
+ WHERE receiver_teamfile = ? AND receiver_alias = ? AND native_generation = ?
1115
+ AND EXISTS (SELECT 1 FROM agent_state s
1116
+ WHERE s.receiver_teamfile = agent_inflight.receiver_teamfile
1117
+ AND s.receiver_alias = agent_inflight.receiver_alias
1118
+ AND s.lease_id = ?)
1119
+ `),publishNativeHolder:t.prepare(`
1120
+ UPDATE agent_inflight SET native_endpoint = ?, native_phase = ?
1121
+ WHERE receiver_teamfile = ? AND receiver_alias = ? AND native_generation = ?
1122
+ AND EXISTS (SELECT 1 FROM agent_state s
1123
+ WHERE s.receiver_teamfile = agent_inflight.receiver_teamfile
1124
+ AND s.receiver_alias = agent_inflight.receiver_alias
1125
+ AND s.lease_id = ?)
1126
+ `),clearNativeHolderFenced:t.prepare(`
1127
+ UPDATE agent_inflight SET native_provider = NULL, native_session_id = NULL,
1128
+ native_endpoint = NULL, native_phase = NULL, native_generation = NULL,
1129
+ native_boot_id = NULL, native_start_time = NULL, native_config_json = NULL
1130
+ WHERE receiver_teamfile = ? AND receiver_alias = ? AND native_generation = ?
1131
+ AND EXISTS (SELECT 1 FROM agent_state s
1132
+ WHERE s.receiver_teamfile = agent_inflight.receiver_teamfile
1133
+ AND s.receiver_alias = agent_inflight.receiver_alias
1134
+ AND s.lease_id = ?)
1135
+ `)}}var cc=`
1136
+ ...[truncated]`;function mc(t){return{insertTrackedInvocation:t.prepare(`
1137
+ INSERT INTO tracked_invocation (
1138
+ kind, origin, scope_teamfile, from_identity, target_teamfile, target_alias,
1139
+ root_teamfile, cwd, command, status, started_at, holder_pid, holder_host,
1140
+ last_heartbeat_at, meta, launch_source, request_payload, parent_invocation_id
1141
+ )
1142
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?, ?, ?, ?, ?, ?)
1143
+ `),getTrackedInvocation:t.prepare("SELECT * FROM tracked_invocation WHERE id = ?"),listAllRunningTrackedInvocations:t.prepare(`
1144
+ SELECT * FROM tracked_invocation
1145
+ WHERE status = 'running'
1146
+ ORDER BY started_at ASC, id ASC
1147
+ `),listRecentlyFinishedTrackedInvocations:t.prepare(`
1148
+ SELECT * FROM tracked_invocation
1149
+ WHERE ended_at IS NOT NULL AND ended_at >= ?
1150
+ ORDER BY ended_at DESC
1151
+ `),finishTrackedInvocation:t.prepare(`
1152
+ UPDATE tracked_invocation
1153
+ SET status = ?,
1154
+ ended_at = ?,
1155
+ exit_code = ?,
1156
+ signal = ?,
1157
+ result_summary = ?,
1158
+ error = ?,
1159
+ team_chat_log_id = ?,
1160
+ meta = COALESCE(?, meta),
1161
+ config_warnings = COALESCE(?, config_warnings),
1162
+ last_heartbeat_at = COALESCE(last_heartbeat_at, ?)
1163
+ WHERE id = ?
1164
+ AND status = 'running'
1165
+ `),reclaimTrackedInvocationIfUnchanged:t.prepare(`
1166
+ UPDATE tracked_invocation
1167
+ SET status = ?,
1168
+ ended_at = ?,
1169
+ exit_code = ?,
1170
+ signal = ?,
1171
+ result_summary = ?,
1172
+ error = ?,
1173
+ team_chat_log_id = ?,
1174
+ meta = COALESCE(?, meta),
1175
+ config_warnings = COALESCE(?, config_warnings),
1176
+ last_heartbeat_at = COALESCE(last_heartbeat_at, ?)
1177
+ WHERE id = ?
1178
+ AND status = 'running'
1179
+ AND holder_pid IS ?
1180
+ AND holder_host IS ?
1181
+ AND started_at = ?
1182
+ AND last_heartbeat_at IS ?
1183
+ `),heartbeatTrackedInvocation:t.prepare(`
1184
+ UPDATE tracked_invocation
1185
+ SET last_heartbeat_at = ?
1186
+ WHERE id = ?
1187
+ AND status = 'running'
1188
+ `),claimTrackedInvocationNotification:t.prepare(`
1189
+ UPDATE tracked_invocation
1190
+ SET notified_by = ?,
1191
+ notified_at = ?
1192
+ WHERE id = ?
1193
+ AND notified_by IS NULL
1194
+ `),updateTrackedInvocationRequestPayload:t.prepare(`
1195
+ UPDATE tracked_invocation
1196
+ SET request_payload = ?
1197
+ WHERE id = ?
1198
+ AND status = 'running'
1199
+ `),linkTrackedInvocationChatLog:t.prepare(`
1200
+ UPDATE tracked_invocation
1201
+ SET team_chat_log_id = ?
1202
+ WHERE id = ?
1203
+ AND status = 'running'
1204
+ AND team_chat_log_id IS NULL
1205
+ `),abortTrackedInvocationIfUnchanged:t.prepare(`
1206
+ UPDATE tracked_invocation
1207
+ SET status = 'aborted',
1208
+ ended_at = ?,
1209
+ error = ?
1210
+ WHERE id = ?
1211
+ AND status = 'running'
1212
+ AND holder_pid IS ?
1213
+ AND holder_host IS ?
1214
+ AND started_at = ?
1215
+ AND last_heartbeat_at IS ?
1216
+ `)}}function qe(t){if(t==null)return null;if(Buffer.byteLength(t,"utf8")<=65536)return t;let n=Buffer.byteLength(cc,"utf8"),r=Math.max(0,65536-n),s=Buffer.from(t,"utf8"),i=r;for(;i>0&&(s[i]&192)===128;)i-=1;return`${s.subarray(0,i).toString("utf8")}${cc}`}var _r="terminal_lock",hr="member";function yr(t,e){return JSON.stringify([t,e])}function pc(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(n=>typeof n=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}import{readFileSync as fc}from"node:fs";function je(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function bs(t){if(!Number.isInteger(t)||(t??0)<=0)return null;let e=nv();if(e===null)return null;try{let n=fc(`/proc/${t}/stat`,"utf-8"),r=n.lastIndexOf(")");if(r<0)return null;let i=n.slice(r+2).trim().split(/\s+/)[19];return i===void 0||!/^\d+$/.test(i)?null:`${e}:${i}`}catch{return null}}function nv(){try{let t=fc("/proc/sys/kernel/random/boot_id","utf-8").trim();return/^[0-9a-f-]{36}$/i.test(t)?t:null}catch{return null}}import{randomUUID as lv}from"node:crypto";import{hostname as dv}from"node:os";import{hostname as On}from"node:os";var gc=8*60*60*1e3,_c=12e4,Oo=3e4;function Rs(t=process.env){let e=t.LMCTL_INFLIGHT_HEARTBEAT_MS;if(e===void 0||e.trim()==="")return Oo;let n=Number(e);return!Number.isFinite(n)||n<=0?Oo:Math.max(1,Math.trunc(n))}function ks(t,e={}){let n=setInterval(()=>{Promise.resolve().then(()=>t(new Date().toISOString())).then(r=>{r||clearInterval(n)}).catch(r=>e.onError?.(r))},e.intervalMs??Oo);return n.unref?.(),n}function Is(t,e){let n=new Date().toISOString(),r=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:n},i=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),o=i===null||i.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...o?{stale_before:r}:{},force:e.force,reclaim_reason:e.reclaimReason,nativeHolder:e.nativeHolder});if(a.acquired){let d=i===null?null:e.force===!0?e.reclaimReason??"force":i.holder_pid===null&&i.started_at<r?"stale":null;return{acquired:!0,lease:a.current??s,leaseId:a.lease_id,previous:i,reclaimReason:d}}if(!As(a.current,r))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:r,nativeHolder:e.nativeHolder}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid},reclaim_reason:"dead-pid",nativeHolder:e.nativeHolder});return l.acquired?{acquired:!0,lease:l.current??s,leaseId:l.lease_id,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function hc(t){return t.status!=="running"?null:t.holder_host===On()&&t.holder_pid!==null&&t.holder_pid>0?je(t.holder_pid)?"live":"dead":"unknown"}function Tr(t,e,n){let r,s=t.getTerminalLock(e,n);if(s!==null){if(rv(s))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:s};r??={source:"terminal-lock",holder_pid:s.holder_pid,holder_host:s.holder_host,reason:s.holder_host===On()?"dead-pid":"stale"}}let i=sv(t,e,n);if(i!==null){if(iv(i))return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:i};r??={source:"terminal-invocation",holder_pid:i.holder_pid,holder_host:i.holder_host,reason:i.holder_pid!==null&&(i.holder_host===null||i.holder_host===On())?"dead-pid":"stale"}}let o=t.getAgentInflight(e,n);if(o!==null){let a=new Date(Date.now()-It()).toISOString();if(!As(o,a))return{busy:!0,reason:"in-flight",inFlight:o};r??={source:"in-flight",holder_pid:o.holder_pid,holder_host:o.holder_pid===null?null:On(),reason:o.holder_pid===null?"stale":"dead-pid"}}return r===void 0?{busy:!1}:{busy:!1,reclaimable:r}}function rv(t){if(t.holder_host===On())return je(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=av():!1}function sv(t,e,n){return t.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
1217
+ FROM tracked_invocation
1218
+ WHERE target_teamfile = ?
1219
+ AND target_alias = ?
1220
+ AND status = 'running'
1221
+ AND launch_source = 'terminal'
1222
+ ORDER BY started_at DESC, id DESC
1223
+ LIMIT 1`,e,n)[0]??null}function iv(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===On())?je(t.holder_pid):ov(t)}function ov(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=It():!1}function As(t,e){return t.holder_pid===null?t.started_at<e:!je(t.holder_pid)}function It(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return gc;let n=Number(e);return!Number.isFinite(n)||n<=0?gc:n}function av(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return _c;let n=Number(e);return!Number.isFinite(n)||n<=0?_c:n}var uv=60*60*1e3;function At(t,e){return{teamfile:t,alias:e}}function yc(t,e,n={}){return{teamfile:t,alias:e,...n.provider===void 0||n.provider===null?{}:{provider:n.provider},...n.sessionId===void 0||n.sessionId===null?{}:{session_id:n.sessionId}}}function Lo(t,e){return t===null?null:At(t,e??"")}function dt(t){return`msg_tcl_${t}`}function sn(t){return`inv_${t}`}function Ln(t,e,n){return t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias,
1224
+ holder_pid, holder_host, started_at, terminal_lock_id,
1225
+ terminal_invocation_id, currently_handling_message_id,
1226
+ currently_handling_since, last_seq
1227
+ FROM agent_state
1228
+ WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,n)??null}function cv(t,e,n){if(e===null||n===null)return null;let r=t.prepare(`SELECT currently_handling_message_id, currently_handling_since
1229
+ FROM agent_state
1230
+ WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,n);if(r?.currently_handling_message_id===null||r?.currently_handling_message_id===void 0||r.currently_handling_since===null)return null;let s=Date.parse(r.currently_handling_since);return!Number.isFinite(s)||Date.now()-s>uv?null:r.currently_handling_message_id}function mv(t,e,n){let r=cv(t,e,n);return r===null?{}:{causation:{request_message_id:r}}}function Do(t,e,n,r,s=new Date().toISOString()){t.prepare(`INSERT INTO agent_state
1231
+ (receiver_teamfile, receiver_alias, currently_handling_message_id,
1232
+ currently_handling_since, last_seq)
1233
+ VALUES (?, ?, ?, ?, 0)
1234
+ ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
1235
+ currently_handling_message_id = excluded.currently_handling_message_id,
1236
+ currently_handling_since = excluded.currently_handling_since`).run(e,n,r,s)}function Po(t,e,n,r){return t.prepare(`UPDATE agent_state
1237
+ SET currently_handling_message_id = NULL,
1238
+ currently_handling_since = NULL
1239
+ WHERE receiver_teamfile = ? AND receiver_alias = ?
1240
+ AND currently_handling_message_id = ?`).run(e,n,r).changes===1}function pv(t,e){let n=e??new Date(Date.now()-It()).toISOString();return As({holder_pid:t.holder_pid,started_at:t.started_at??""},n)}function fv(t,e,n){return e==="force"||e==="session-idle"?e:n?"force":t.holder_pid!==null&&!je(t.holder_pid)?"dead-pid":"stale"}function gv(t){return{sender:Lo(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at}}function Dn(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function Mo(t,e,n){let r=dt(e),s=Lo(n.sender_teamfile,n.sender_alias),i=yc(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),o={message_id:r,message_type:"request",sender:s,receiver:i,root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:e}};return Le(t,{stream_id:r,event_type:"CREATE",observedLastSeq:0,ts:n.created_at,payload:{...o,content:n.message,provider_prompt:n.provider_prompt??n.message,origin:n.origin,...mv(t,n.sender_teamfile,n.sender_alias)}},()=>{Do(t,n.receiver_teamfile,n.receiver_alias,r,n.created_at)}),r}function Cs(t,e,n){let r=dt(e),s={message_id:r,message_type:"request",sender:Lo(n.sender_teamfile,n.sender_alias),receiver:yc(n.receiver_teamfile,n.receiver_alias,{provider:n.receiver_provider,sessionId:n.receiver_session_id}),root_teamfile:n.root_teamfile,legacy:{table:"team_chat_log",id:e}};return Le(t,{stream_id:r,event_type:"HANDLED",observedLastSeq:1,ts:n.created_at,payload:{...s,outcome:n.status,...n.usage?{usage:n.usage}:{},receipt:n.response,error:n.error_detail,truncated:n.truncated===1}},()=>{Po(t,n.receiver_teamfile,n.receiver_alias,r)}),r}function _v(t){return{sender:At(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at}}function Tc(t,e,n,r){let s=t.prepare(`UPDATE agent_state
1241
+ SET lease_id = NULL, sender_teamfile = NULL, sender_alias = NULL,
1242
+ holder_pid = NULL, holder_host = NULL, started_at = NULL,
1243
+ last_heartbeat_at = NULL, last_seq = ?
1244
+ WHERE receiver_teamfile = ? AND receiver_alias = ?
1245
+ AND lease_id IS ? AND last_seq = ?`).run(n,e.receiver_teamfile,e.receiver_alias,e.lease_id,e.last_seq);Dn(s.changes,r)}function Ec(t,e,n,r,s=null,i=!1){let o=dv();if(n!==null&&r===null)throw new Error("agent inflight takeover is missing a reclaim reason");let a=Ln(t,e.receiver_teamfile,e.receiver_alias);if(a!==null&&a.lease_id!==null){if(!(i||pv(a,s)))throw new Error("event projection rejected INFLIGHT_TAKE: receiver already holds a live lease");let c=fv(a,r,i),m=gv(a),p=a.lease_id;Le(t,{stream_id:p,event_type:"INFLIGHT_RECLAIM",observedLastSeq:a.last_seq,ts:e.started_at,payload:{receiver:At(e.receiver_teamfile,e.receiver_alias),reason:c,previous_holder:m}},f=>Tc(t,a,f,"INFLIGHT_RECLAIM")),a=Ln(t,e.receiver_teamfile,e.receiver_alias)}let l=a?.last_seq??0,d=`lease_${lv()}`;return Le(t,{stream_id:d,event_type:"INFLIGHT_TAKE",observedLastSeq:l,ts:e.started_at,payload:{lease_id:d,receiver:At(e.receiver_teamfile,e.receiver_alias),sender:At(e.sender_teamfile,e.sender_alias),holder_pid:e.holder_pid,holder_host:o,started_at:e.started_at}},u=>{if(a===null){t.prepare(`INSERT INTO agent_state
1246
+ (receiver_teamfile, receiver_alias, lease_id, sender_teamfile,
1247
+ sender_alias, holder_pid, holder_host, started_at,
1248
+ last_heartbeat_at, last_seq)
1249
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(e.receiver_teamfile,e.receiver_alias,d,e.sender_teamfile,e.sender_alias,e.holder_pid,o,e.started_at,e.started_at,u);return}let c=t.prepare(`UPDATE agent_state
1250
+ SET lease_id = ?, sender_teamfile = ?, sender_alias = ?,
1251
+ holder_pid = ?, holder_host = ?, started_at = ?,
1252
+ last_heartbeat_at = ?, last_seq = ?
1253
+ WHERE receiver_teamfile = ? AND receiver_alias = ?
1254
+ AND lease_id IS NULL AND last_seq = ?`).run(d,e.sender_teamfile,e.sender_alias,e.holder_pid,o,e.started_at,e.started_at,u,e.receiver_teamfile,e.receiver_alias,a.last_seq);Dn(c.changes,"INFLIGHT_TAKE")}),d}function vc(t,e,n,r){return t.prepare(`UPDATE agent_state
1255
+ SET last_heartbeat_at = ?
1256
+ WHERE receiver_teamfile = ? AND receiver_alias = ?
1257
+ AND lease_id = ?
1258
+ AND sender_teamfile = ? AND sender_alias = ?
1259
+ AND started_at = ? AND holder_pid IS ?`).run(r,e.receiver_teamfile,e.receiver_alias,n,e.sender_teamfile,e.sender_alias,e.started_at,e.holder_pid).changes===1}function Er(t,e,n,r){let s=Ln(t,e.receiver_teamfile,e.receiver_alias);s===null||s.lease_id===null||Le(t,{stream_id:s.lease_id,event_type:n,observedLastSeq:s.last_seq,payload:{receiver:At(e.receiver_teamfile,e.receiver_alias),...n==="INFLIGHT_RECLAIM"?{reason:r??"stale",previous_holder:_v(e)}:{lease_id:s.lease_id}}},i=>Tc(t,s,i,n))}function wc(t,e){let n=Ln(t,e.teamfile,e.alias),r=n?.last_seq??0;Le(t,{stream_id:e.lock_id,event_type:"TERMINAL_LOCK_TAKE",observedLastSeq:r,ts:e.started_at,payload:{receiver:At(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at}},s=>{if(n===null){t.prepare(`INSERT INTO agent_state
1260
+ (receiver_teamfile, receiver_alias, terminal_lock_id, last_seq)
1261
+ VALUES (?, ?, ?, ?)`).run(e.teamfile,e.alias,e.lock_id,s);return}let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = ?, last_seq = ?
1262
+ WHERE receiver_teamfile = ? AND receiver_alias = ?
1263
+ AND terminal_lock_id IS NULL AND last_seq = ?`).run(e.lock_id,s,e.teamfile,e.alias,n.last_seq);Dn(i.changes,"TERMINAL_LOCK_TAKE")})}function Uo(t,e,n=!1){let r=Ln(t,e.teamfile,e.alias);r===null||r.terminal_lock_id!==e.lock_id||Le(t,{stream_id:e.lock_id,event_type:n?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE",observedLastSeq:r.last_seq,payload:{receiver:At(e.teamfile,e.alias),lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host}},s=>{let i=t.prepare(`UPDATE agent_state SET terminal_lock_id = NULL, last_seq = ?
1264
+ WHERE receiver_teamfile = ? AND receiver_alias = ?
1265
+ AND terminal_lock_id = ? AND last_seq = ?`).run(s,e.teamfile,e.alias,e.lock_id,r.last_seq);Dn(i.changes,n?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE")})}function Sc(t,e,n){let r=Ln(t,n.targetTeamfile,n.targetAlias);if(r===null){t.prepare(`INSERT INTO agent_state
1266
+ (receiver_teamfile, receiver_alias, terminal_invocation_id,
1267
+ terminal_invocation_pid, terminal_invocation_host,
1268
+ terminal_invocation_heartbeat_at, last_seq)
1269
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(n.targetTeamfile,n.targetAlias,n.invocationId,n.holderPid,n.holderHost,n.heartbeatAt,e);return}let s=t.prepare(`UPDATE agent_state
1270
+ SET terminal_invocation_id = ?, terminal_invocation_pid = ?,
1271
+ terminal_invocation_host = ?,
1272
+ terminal_invocation_heartbeat_at = ?, last_seq = ?
1273
+ WHERE receiver_teamfile = ? AND receiver_alias = ?
1274
+ AND terminal_invocation_id IS NULL AND last_seq = ?`).run(n.invocationId,n.holderPid,n.holderHost,n.heartbeatAt,e,n.targetTeamfile,n.targetAlias,r.last_seq);Dn(s.changes,"terminal INVOCATION_START")}function bc(t,e,n){return t.prepare(`UPDATE agent_state
1275
+ SET terminal_invocation_heartbeat_at = ?
1276
+ WHERE terminal_invocation_id = ?`).run(n,e).changes===1}function Rc(t,e,n){let r=t.prepare(`SELECT receiver_teamfile, receiver_alias, lease_id, terminal_lock_id,
1277
+ terminal_invocation_id, last_seq
1278
+ FROM agent_state WHERE terminal_invocation_id = ?`).get(n);if(r===void 0)return;let s=t.prepare(`UPDATE agent_state
1279
+ SET terminal_invocation_id = NULL, terminal_invocation_pid = NULL,
1280
+ terminal_invocation_host = NULL,
1281
+ terminal_invocation_heartbeat_at = NULL, last_seq = ?
1282
+ WHERE receiver_teamfile = ? AND receiver_alias = ?
1283
+ AND terminal_invocation_id = ? AND last_seq = ?`).run(e,r.receiver_teamfile,r.receiver_alias,n,r.last_seq);Dn(s.changes,"terminal INVOCATION_FINISH")}var hv="INVOCATION_START",yv="INVOCATION_FINISH",Tv="INVOCATION_NOTIFY_CLAIM";function kc(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function Fo(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function Ic(t,e){let n=sn(e.id),r=e.target_teamfile===null?null:{teamfile:e.target_teamfile,alias:e.target_alias??""},s=e.last_heartbeat_at??e.started_at;Le(t,{stream_id:n,event_type:hv,observedLastSeq:0,ts:e.started_at,payload:{invocation_id:n,kind:e.kind,origin:e.origin,launch_source:e.launch_source,from_identity:e.from_identity,target:r,root_teamfile:e.root_teamfile,scope_teamfile:e.scope_teamfile,cwd:e.cwd,command:e.command,request_payload:e.request_payload,request_message_id:e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,legacy:{table:"tracked_invocation",id:e.id}}},i=>{t.prepare(`INSERT INTO invocation_state
1284
+ (invocation_id, kind, origin, launch_source, from_identity, target_teamfile, target_alias,
1285
+ root_teamfile, cwd, command, request_message_id, request_payload, holder_pid, holder_host,
1286
+ status, started_at, last_heartbeat_at, last_seq)
1287
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,i),Fo(e)&&Sc(t,i,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function Ns(t,e){let n=sn(e.id),r=kc(t,n);return r===null?!1:(Le(t,{stream_id:n,event_type:yv,observedLastSeq:r.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:n,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
1288
+ SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
1289
+ WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);Fo(e)&&Rc(t,s,n)}),!0)}function Ac(t,e,n,r){let s=sn(e.id),i=kc(t,s);return i===null?!1:(Le(t,{stream_id:s,event_type:Tv,observedLastSeq:i.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},o=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,o,s,i.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function Cc(t,e,n){let r=sn(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),Fo(e)&&bc(t,r,n)}function Nc(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,sn(e))}function xc(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,sn(e))}var Ev="other",vv=["not_enough_information","dont_know","other_work"],Jx=new Set([Ev,...vv]),Oc="@abort",Lc="invalid_decision";var Dc="workflow_escalation";function j(){return new Date().toISOString()}function Rv(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!jc(t))return e;let n;try{n=new hn(t,{readonly:!0})}catch{return e}try{let r=[];try{r=n.prepare("SELECT teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at FROM root_team").all()}catch{}let s=[];try{s=n.prepare("SELECT key, value FROM lmctl_config").all()}catch{}return{rootTeams:r,config:s}}finally{n.close()}}function kv(t){if(t===":memory:"||!jc(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{Sv(r,`${e}${n}`)}catch{}}return e}function Mc(t,e){let n=e instanceof Error?e.message:String(e);try{let r=Rv(t),s=kv(t),i=new xs(Ss({dbPath:t}));for(let o of r.rootTeams)i.upsertRootTeam(o);for(let{key:o,value:a}of r.config)i.setConfig(o,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${kt} (${n}); started a fresh database instead. Preserved ${r.rootTeams.length} team registration(s) and ${r.config.length} config value(s).`+(s!==null?` Old database backed up at ${s}.
1290
+ `:`
1291
+ `)),i}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${t}: unusable (${n}), and recovery into a fresh database also failed (${s}). Check that the containing directory is writable, or move the file aside manually and retry.`)}}function jo(t,e){let n;try{return n=Ss({dbPath:t,allowSchemaSkew:e}),{dal:new xs(n)}}catch(r){if(r instanceof rn)throw r;let s;if(n!==void 0)try{s=n.pragma("user_version",{simple:!0})}catch{}try{n?.close()}catch{}return{cause:r,dbVersion:s}}}var Iv=3,$c=".recovery.lock",Av=20,Cv=50;function Nv(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function xv(t){if(t===":memory:")return!0;try{return wv(`${t}${$c}`),!0}catch{return!1}}function Ov(t){if(t!==":memory:")try{bv(`${t}${$c}`)}catch{}}function Ct(t){let e=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1";if(t.recover===!1){let s=jo(t.path,e);if(s.dal)return s.dal;throw s.cause}let n={};for(let s=0;s<Iv;s+=1)if(n=jo(t.path,e),n.dal!==void 0)return n.dal;let r=n.cause?.code;if(typeof r=="string"&&/^SQLITE_(BUSY|LOCKED)/.test(r))throw new Error(t.path+": database is busy; retry this command after the other writer finishes.",{cause:n.cause});if(n.dbVersion!==void 0&&n.dbVersion>kt){let s=n.cause instanceof Error?n.cause.message:String(n.cause);throw new rn(t.path,n.dbVersion,kt,s)}for(let s=0;s<Av;s+=1){if(xv(t.path))try{return Mc(t.path,n.cause)}finally{Ov(t.path)}Nv(Cv);let i=jo(t.path,e);if(i.dal!==void 0)return i.dal}return Mc(t.path,n.cause)}var xs=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Uv(e),this.claimTxn=e.transaction((n,r,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(n,r,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((n,r,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let d=i(l);if(d.concurrency_key!==null&&(l.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,s,l.id)?.count??0)>=Math.max(1,d.concurrent_limit)))continue;if(this.stmts.claimJob.run(n,r,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((n,r,s,i,o)=>{let a=this.getJob(n);if(a===null)return{claimed:!1,reason:"not_found",job_id:n};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=a.status==="queued"&&a.available_at<=i,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!d&&!u)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=o(a);if(c.concurrency_key!==null&&(a.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,i,a.id)?.count??0)>=Math.max(1,c.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(r,s,i,a.id,i,i,i).changes!==1){let f=this.getJob(a.id);return{claimed:!1,reason:f?.locked_until!==null&&f?.locked_until!==void 0&&f.locked_until>=i?"locked":"not_claimable",job_id:n,status:f?.status??a.status,locked_by:f?.locked_by??a.locked_by,locked_until:f?.locked_until??a.locked_until}}let p=this.getJob(a.id);return p===null?{claimed:!1,reason:"not_found",job_id:n}:{claimed:!0,job:p}}),this.resumeRunTxn=e.transaction((n,r,s)=>Fv("state_not_found")),this.resumeInteractiveTxn=e.transaction((n,r,s,i)=>{let o=this.getInteractiveSessionByStepId(n);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,r,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(n),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==Dc)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let u=JSON.parse(i.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(o=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(c=>typeof c=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(r!==Oc&&!a.includes(r))return{resumed:!1,reason:Lc};let d={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(d=u)}catch{d={}}return d[o]=r,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(d),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,n),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(n,r={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(n.receiver_teamfile,n.receiver_alias);if(r.nativeHolder!==void 0&&s!==null&&(s.native_provider!==null&&s.native_provider!==void 0||s.native_session_id!==null&&s.native_session_id!==void 0||s.native_endpoint!==null&&s.native_endpoint!==void 0))return this.db.exec("COMMIT"),{acquired:!1,current:s};let i=r.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...n,holder_pid:process.pid,stale_before:r.stale_before??null,force:r.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:r.reclaim_reason??(r.force===!0?"force":r.reclaim_observed!==void 0?"dead-pid":"stale"),d=Ec(this.db,o,s,l,r.stale_before??null,r.force===!0);this.stmts.clearNativeHolderMetadata.run(n.receiver_teamfile,n.receiver_alias);let u=r.nativeHolder;u!==void 0&&this.stmts.setNativeHolderMetadata.run({receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,provider:u.provider,session_id:u.sessionId,endpoint:u.endpoint,phase:u.phase,generation:d,boot_id:u.processIdentity?.bootId??null,start_time:u.processIdentity?.startTime??null,config_json:u.configJson}),a={acquired:!0,current:o,lease_id:d}}else a={acquired:!1,current:this.getAgentInflight(n.receiver_teamfile,n.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...n){let r=e.trim().toLowerCase();if(!r.startsWith("select")&&!r.startsWith("with")&&!r.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...n)}insertWorkflow(e){Uc(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,j()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,e.definition,e.author??null,j());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,e.definition),i}upsertWorkflow(e){Uc(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(e.name);if(n===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,e.definition,e.author??null,j());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??n.definition_schema_version,s,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,e.definition),this.getWorkflow(n.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,j())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,n){return(n===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,n))??null}findWorkflowByName(e,n){return this.getWorkflowByName(e,n)}insertWorkflowVersion(e,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,n,r??null,j());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(r.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(n,r.definition,s,e),this.syncWorkflowTriggers(e,r.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,j()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,n){return this.stmts.setTriggerCursor.run(n,j(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,n){return this.stmts.setTriggerFailure.run(j(),n,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,n){let r;try{r=JSON.parse(n)}catch{return}if(r===null||typeof r!="object"||Array.isArray(r))return;let s=r.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let n=this.stmts.insertTeam.run(e.name,j());return this.stmts.getTeam.get(n.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let n=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,j());return this.stmts.getTeamMember.get(n.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,n){return this.stmts.findTeamMemberByAlias.get(e,n)??null}updateTeamMemberSession(e,n){return this.stmts.updateTeamMemberSession.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,n,r){return this.stmts.setMemberState.run(n,r??null,j(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,n){return this.stmts.setMemberPromptSnapshot.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,n){return this.stmts.setMemberProviderResolved.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,n){return this.stmts.setMemberRolePrompt.run(n,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,n){let r=this.stmts.getTeamMember.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"role_prompt"),i=Object.prototype.hasOwnProperty.call(n,"model"),o=Object.prototype.hasOwnProperty.call(n,"provider");return this.stmts.updateTeamMemberMeta.run(s?n.role_prompt??null:r.role_prompt,i?n.model??null:r.model,o?n.provider??r.provider:r.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let n=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,j());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(e){let n=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",j());return this.stmts.getProject.get(n.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,n){return this.stmts.setProjectIntakeConfig.run(n,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,n){let r=this.stmts.getProject.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"local_path"),i=Object.prototype.hasOwnProperty.call(n,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(n,"default_branch"),a=Object.prototype.hasOwnProperty.call(n,"intake_config");return this.stmts.updateProjectSettings.run(s?n.local_path:r.local_path,i?n.durable_memory_mode:r.durable_memory_mode,o?n.default_branch??null:r.default_branch,a?n.intake_config??null:r.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let n=JSON.parse(e.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let n=e.condition??null,r=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,n,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,j());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,n={}){return n.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let n=j(),r=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,n={}){return this.stmts.listIssuesForProject.all(e).filter(r=>!(n.status!==void 0&&!n.status.includes(r.status)||n.severity!==void 0&&!n.severity.includes(r.severity)||n.ai_test_path!==void 0&&r.ai_test_path!==n.ai_test_path))}claimNextIssue(e,n){return this.stmts.claimNextIssue.get(n,j(),e)??null}claimIssue(e,n){return this.stmts.claimIssue.get(n,j(),e)??null}closeIssue(e,n,r){let s=j(),i=this.stmts.closeIssue.get(n,r??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,n){let r=this.stmts.reopenIssue.get(n,j(),e);if(r===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return r}updateIssue(e,n){let r=this.getIssue(e);if(r===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(n,"labels"),i=Object.prototype.hasOwnProperty.call(n,"ai_test_path"),o=this.stmts.updateIssue.get(n.title??r.title,n.body??r.body,n.severity??r.severity,s?n.labels??null:r.labels,i?n.ai_test_path??null:r.ai_test_path,j(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,n){let r=this.stmts.getWebuiSession.get(e);if(r!==void 0)return r;let s=j();return this.stmts.insertWebuiSession.run(e,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,j(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,n){if(this.stmts.setWebuiSessionChatbot.run(n,j(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,n){let r=Pc(),s=j();return this.stmts.insertChatbotSession.run(r,e,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,n,r,s){let i=j(),o=this.stmts.insertChatbotMessage.run(e,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,n){this.stmts.upsertConfig.run(e,n,j())}getConfigAll(){let e=this.stmts.listConfig.all(),n={};for(let r of e)n[r.key]=r.value;return n}enqueueJob(e){let n=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??j(),e.dedupe_key??null,e.concurrency_key??null,j());if(n.changes===1)return this.stmts.getJob.get(n.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let n=j(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,r,n)}claimNextJobWithConcurrency(e){let n=j(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,r,n,e.evaluator)}claimJobByIdWithConcurrency(e){let n=j(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,r,n,e.evaluator)}releaseJob(e,n,r){let s=n==="queued"||n==="running"?null:j();return this.stmts.releaseJob.run(n,r??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,n){return this.stmts.findJobByDedupe.get(e,n)??null}insertRun(e){let n=this.getWorkflow(e.workflow_id);if(n===null)throw new Error(`workflow not found: ${e.workflow_id}`);let r=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,n.active_version_id,e.parent_run_id??null,j()),s=this.stmts.getRun.get(r.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,n){return this.stmts.setJobRun.run(n,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,j()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,n){return this.stmts.setPromptDispatchCompleted.run(n??j(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let n=e.id??"default";this.stmts.ensureWorkspace.run(n,e.name??"Default workspace",e.idleThresholdMs??6e5,j());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let n=j(),r=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,n,n),s=Number(r.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let n=this.getWebProject(e.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??n.name,e.config_json===void 0?n.config_json:e.config_json,j(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(j(),e).changes===1}loadMailboxCursor(e,n){return this.stmts.loadMailboxCursor.get(e,n)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,n,r){return this.stmts.loadUsage.get(e,n,r)??null}sumUsageForPeriod(e,n){let r=this.stmts.sumUsageForPeriod.get(e,n);return{put:r?.put??0,get:r?.get??0,list:r?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.message_type??null,e.created_at),r=Number(n.lastInsertRowid);return e.usage&&tn(this.db,r,e.usage),Mo(this.db,r,e),e.usage&&tn(this.db,r,e.usage),Cs(this.db,r,e),r})()}beginTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.message_type??null,e.created_at),r=Number(n.lastInsertRowid);return e.usage&&tn(this.db,r,e.usage),Mo(this.db,r,e),r})()}finishTeamChatLog(e,n){this.db.transaction(()=>{if(this.db.prepare("SELECT ended_at FROM team_chat_log WHERE id=?").get(e)?.ended_at!=null)return;if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);n.usage&&tn(this.db,e,n.usage),Cs(this.db,e,n)})()}insertDirectTurn(e,n,r){return this.db.transaction(()=>{let s=this.db.prepare("SELECT id FROM team_chat_log WHERE attempt_key = ?").get(e.attempt_key);if(s!==void 0)return s.id;let i=this.stmts.insertTeamChatLog.run(r?.teamfile??"(direct)",null,null,r?.teamfile??"(direct)",r?.alias??e.provider,"","",n,"running",null,0,null,e.startedAt),o=Number(i.lastInsertRowid);return this.db.prepare("UPDATE team_chat_log SET accounting_only=1 WHERE id=?").run(o),tn(this.db,o,e),o})()}finishDirectTurn(e,n){this.db.transaction(()=>{if(this.db.prepare("SELECT ended_at FROM team_chat_log WHERE id = ?").get(e)?.ended_at!=null)return;let s=n.turn_outcome==="ok"?"ok":"error";if(this.stmts.updateTeamChatLogResponse.run("",s,null,0,e).changes!==1)throw new Error(`direct turn row disappeared during finish: ${e}`);tn(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{Do(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>Po(this.db,e,n,r))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,n=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let n=e.started_at??j(),r=e.holder_host??$o(),s=e.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,qe(e.command),n,e.holder_pid??null,r,s,qe(e.meta),e.launch_source??e.kind,e.request_payload??null,e.parent_invocation_id??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return Ic(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,n,r={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,n];r.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(r.sinceMs).toISOString())),r.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(r.untilMs).toISOString()));let o=Math.max(1,Math.trunc(r.limit??200));return this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${s.join(" AND ")} ORDER BY started_at DESC LIMIT ?`).all(...i,o)}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}listRecentlyFinishedTrackedInvocations(e){return this.stmts.listRecentlyFinishedTrackedInvocations.all(e)}listFinishedTrackedInvocationChildren(e,n){if(e.length===0)return[];let r=e.map(()=>"?").join(", ");return this.db.prepare(`
1292
+ SELECT * FROM tracked_invocation
1293
+ WHERE parent_invocation_id IN (${r})
1294
+ AND ended_at IS NOT NULL
1295
+ AND ended_at >= ?
1296
+ ORDER BY started_at ASC, id ASC
1297
+ `).all(...e,n)}finishTrackedInvocation(e,n){return this.db.transaction(()=>{let r=n.ended_at??j();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,qe(n.result_summary),qe(n.error),n.team_chat_log_id??null,qe(n.meta),qe(n.config_warnings),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Ns(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,n,r){return this.db.transaction(()=>{let s=r.ended_at??j();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,qe(r.result_summary),qe(r.error),r.team_chat_log_id??null,qe(r.meta),qe(r.config_warnings),s,e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Ns(this.db,o),o})()}heartbeatTrackedInvocation(e,n=j()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return Cc(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(Nc(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:(xc(this.db,e,dt(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=j();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,qe(r),e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Ns(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(e,n){let r=this.stmts.getTeamChatLogById.get(e);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,e).changes!==1||Cs(this.db,e,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:j()})}listClaimableTerminalTrackedInvocations(e){let n=["status IN ('done', 'error', 'busy', 'cancelled', 'aborted')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(e,n,r=j()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Ac(this.db,i,n,r),i})()}listTrackedInvocations(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status)),e.kind!==void 0&&(n.push("kind = ?"),r.push(e.kind)),e.origin!==void 0&&(n.push("origin = ?"),r.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));r.push(s);let i=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}updateTeamChatLogResponse(e,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e)}getAgentInflight(e,n){return this.stmts.getAgentInflight.get(e,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,n){return this.tryAcquireAgentInflightTxn(e,n)}tryAcquireNativeHolder(e,n){return this.tryAcquireAgentInflightTxn(e,{nativeHolder:n})}findNativeHolder(e,n){return this.stmts.getNativeHolder.get(e,n)??null}updateNativeHolderPhase(e,n,r,s){return this.stmts.updateNativeHolderPhase.run(s,e,n,r,r).changes===1}publishNativeHolder(e,n,r,s,i="ready"){return this.stmts.publishNativeHolder.run(s,i,e,n,r,r).changes===1}clearNativeHolder(e,n,r){return this.stmts.clearNativeHolderFenced.run(e,n,r,r).changes===1}heartbeatAgentInflight(e,n,r=j()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:vc(this.db,s,n,r)})()}clearAgentInflight(e,n){this.db.transaction(()=>{let s=this.getAgentInflight(e,n);if(s===null)return;this.stmts.clearAgentInflight.run(e,n).changes===1&&Er(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(e,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return o.changes===1&&i!==null&&Er(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
1298
+ WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&Er(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Er(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(_r,yr(e,n),hr);return r===void 0?null:pc(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&Uo(this.db,r,!0),this.stmts.upsertRuntimeState.run(_r,yr(e.teamfile,e.alias),hr,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&wc(this.db,e)})()}heartbeatTerminalLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,n);if(i===null||i.lock_id!==r)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(_r,yr(e,n),hr,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(_r,yr(e,n),hr);return i.changes===1&&Uo(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,n,r){let s=this.stmts.getRuntimeState.get(e,n,r);return s===void 0?null:Pv(s.data)}tryAcquireRuntimeProcessLock(e,n,r,s,i=j()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,n,r);if(o!==null&&!Mv(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Pc(),holder_pid:process.pid,holder_host:$o(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,n,r,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,n){return this.stmts.setRunCurrentState.run(n,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,n,r){return this.stmts.setRunPausedState.run(n,r,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,n){return this.stmts.setRunPendingEscalationDecision.run(n,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,n){return this.stmts.setRunTerminalState.run(n,j(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,n){return this.resumeRunTxn(e,n,j())}insertStep(e){let n=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,j());return this.stmts.getStep.get(n.lastInsertRowid)}finishStep(e,n,r){return this.stmts.finishStep.run(n??null,r??null,j(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let n=this.stmts.listLatestStepOutcomesByState.all(e),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(e){let n=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??j(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(n.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let n=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,j());return this.stmts.getStepArtifact.get(n.lastInsertRowid)}insertExternalObject(e){let r=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,j()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:r}}insertExternalSignal(e){let n=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,j()),r=n.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:r}}raiseAttention(e){let n=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,j());return this.stmts.getAttention.get(n.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(j(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let n=j();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,n,n),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,n){return this.stmts.getDurableMemoryByName.get(e,n)??null}deleteDurableMemory(e,n){return this.stmts.deleteDurableMemory.run(e,n).changes>0}listDurableMemory(e,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(e,n):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(e).filter(s=>n.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(e){let n=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??j());return this.stmts.getSessionSize.get(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,n,r=20){return this.stmts.sessionSizeHistory.all(e,n,r)}insertSessionEvent(e){let n=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(n.lastInsertRowid)}listSessionEvents(e,n){return n!==void 0?this.stmts.listSessionEventsSince.all(e,n):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,n=1e3){return this.stmts.listAllEventsSince.all(e,n)}latestAgentCall(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(n===void 0)return null;try{let r=JSON.parse(n.payload);return typeof r.alias!="string"||typeof r.provider!="string"?null:{alias:r.alias,provider:r.provider,...typeof r.model=="string"?{model:r.model}:{}}}catch{return null}}agentCallTokenTotals(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),r=0,s=0,i=0;for(let o of n)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(r+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:r,totalOutputTokens:s,agentCallCount:i}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let n=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(n.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,n,r){return this.stmts.findUnackedDrift.get(e,n??null,r)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let n=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,n,n),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,n){return this.stmts.getInteractiveSessionByRunAndState.get(e,n)??null}setInteractiveAgentOutput(e,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),e)}resumeInteractive(e,n,r){return this.resumeInteractiveTxn(e,n,r,j())}resumeEscalation(e,n){return this.resumeEscalationTxn(e,n,j())}};function Uc(t,e,n){let r=Fc(e);if(r.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return r;let d=n(l);if(d===null)throw new Error(`unknown workflow reference: ${l}`);return Fc(d.definition)},a=l=>{let d=i.indexOf(l);if(d>=0)throw new Error(`cycle detected: ${[...i.slice(d),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let u of o(l))a(u)}finally{i.pop()}s.add(l)}};a(t)}function Fc(t){let e=Lv(t),n=e===null?null:Dv(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))Os(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function Lv(t){try{let e=JSON.parse(t);return Os(e)?e:null}catch{return null}}function Dv(t,e){let n=t[e];return Os(n)?n:null}function Os(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Pv(t){try{let e=JSON.parse(t);return!Os(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function Mv(t,e){return t===null?!0:t.holder_host===$o()?!je(t.holder_pid):t.last_heartbeat<e}function Uv(t){return{getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
1299
+ INSERT INTO runtime_state (scope, key, kind, data, updated_at)
1300
+ VALUES (?, ?, ?, ?, ?)
1301
+ ON CONFLICT(scope, key, kind) DO UPDATE SET
1302
+ data = excluded.data,
1303
+ updated_at = excluded.updated_at
1304
+ `),deleteRuntimeState:t.prepare("DELETE FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),insertWorkflow:t.prepare(`
1305
+ INSERT INTO workflow (name, version, definition_schema_version, definition, created_at)
1306
+ VALUES (?, ?, ?, ?, ?)
1307
+ `),setWorkflowSource:t.prepare("UPDATE workflow SET source_uri = ?, source_sha256 = ? WHERE id = ?"),getWorkflow:t.prepare("SELECT * FROM workflow WHERE id = ?"),findWorkflowVersion:t.prepare("SELECT * FROM workflow WHERE name = ? AND version = ?"),findWorkflowLatest:t.prepare("SELECT * FROM workflow WHERE name = ? ORDER BY version DESC LIMIT 1"),updateWorkflowActiveVersion:t.prepare("UPDATE workflow SET active_version_id = ? WHERE id = ?"),updateWorkflowActiveVersionAndDefinition:t.prepare(`
1308
+ UPDATE workflow
1309
+ SET active_version_id = ?,
1310
+ definition = ?,
1311
+ definition_schema_version = ?
1312
+ WHERE id = ?
1313
+ `),updateWorkflowActiveVersionDefinitionAndVersion:t.prepare(`
1314
+ UPDATE workflow
1315
+ SET active_version_id = ?,
1316
+ definition = ?,
1317
+ definition_schema_version = ?,
1318
+ version = ?
1319
+ WHERE id = ?
1320
+ `),insertWorkflowVersion:t.prepare(`
1321
+ INSERT INTO workflow_version (workflow_id, version, definition, author, created_at)
1322
+ VALUES (?, ?, ?, ?, ?)
1323
+ `),getWorkflowVersion:t.prepare("SELECT * FROM workflow_version WHERE id = ?"),getLatestWorkflowVersion:t.prepare("SELECT version FROM workflow_version WHERE workflow_id = ? ORDER BY version DESC LIMIT 1"),listWorkflowVersions:t.prepare("SELECT * FROM workflow_version WHERE workflow_id = ? ORDER BY version DESC, id DESC"),upsertTriggerInstance:t.prepare(`
1324
+ INSERT INTO trigger_instance (workflow_id, trigger_id, trigger_type, parameters, enabled, created_at)
1325
+ VALUES (?, ?, ?, ?, ?, ?)
1326
+ ON CONFLICT(workflow_id, trigger_id) DO UPDATE SET
1327
+ trigger_type = excluded.trigger_type,
1328
+ parameters = excluded.parameters,
1329
+ enabled = excluded.enabled
1330
+ `),getTriggerInstance:t.prepare("SELECT * FROM trigger_instance WHERE id = ?"),getTriggerInstanceByWorkflowAndId:t.prepare("SELECT * FROM trigger_instance WHERE workflow_id = ? AND trigger_id = ?"),listTriggerInstancesForWorkflow:t.prepare("SELECT * FROM trigger_instance WHERE workflow_id = ? ORDER BY trigger_id ASC"),listEnabledTriggerInstances:t.prepare("SELECT * FROM trigger_instance WHERE enabled = 1 ORDER BY id ASC"),setTriggerCursor:t.prepare("UPDATE trigger_instance SET cursor = ?, last_poll_at = ? WHERE id = ?"),setTriggerFailure:t.prepare("UPDATE trigger_instance SET last_failure_at = ?, last_failure = ? WHERE id = ?"),insertTeam:t.prepare("INSERT INTO team (name, created_at) VALUES (?, ?)"),getTeam:t.prepare("SELECT * FROM team WHERE id = ?"),findTeamByName:t.prepare("SELECT * FROM team WHERE name = ?"),listTeams:t.prepare("SELECT * FROM team ORDER BY name ASC, id ASC"),insertTeamMember:t.prepare(`
1331
+ INSERT INTO team_member
1332
+ (team_id, alias, role, provider, model, sessionid, sessiondir, created_at)
1333
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
1334
+ `),getTeamMember:t.prepare("SELECT * FROM team_member WHERE id = ?"),listTeamMembers:t.prepare("SELECT * FROM team_member WHERE team_id = ? ORDER BY id ASC"),findTeamMemberByAlias:t.prepare("SELECT * FROM team_member WHERE team_id = ? AND alias = ?"),updateTeamMemberSession:t.prepare("UPDATE team_member SET sessionid = ? WHERE id = ?"),setMemberState:t.prepare("UPDATE team_member SET state = ?, state_reason = ?, state_updated_at = ? WHERE id = ?"),listMembersInState:t.prepare("SELECT * FROM team_member WHERE state = ? ORDER BY id ASC"),setMemberPromptSnapshot:t.prepare("UPDATE team_member SET prompt_snapshot = ? WHERE id = ?"),setMemberProviderResolved:t.prepare("UPDATE team_member SET provider_resolved = ? WHERE id = ?"),setMemberRolePrompt:t.prepare("UPDATE team_member SET role_prompt = ? WHERE id = ?"),updateTeamMemberMeta:t.prepare(`
1335
+ UPDATE team_member
1336
+ SET role_prompt = ?,
1337
+ model = ?,
1338
+ provider = ?
1339
+ WHERE id = ?
1340
+ `),insertTeamMemberCompanion:t.prepare(`
1341
+ INSERT INTO team_member_companion (interpreter_id, companion_id, created_at)
1342
+ VALUES (?, ?, ?)
1343
+ `),getTeamMemberCompanion:t.prepare("SELECT * FROM team_member_companion WHERE id = ?"),insertProject:t.prepare(`
1344
+ INSERT INTO project
1345
+ (name, description, local_path, workflow_name, team_id, default_branch, intake_config, test_argv, test_command, durable_memory_mode, created_at)
1346
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1347
+ `),insertCompositionUnit:t.prepare(`
1348
+ INSERT INTO composition_unit
1349
+ (name, version, lang, source, source_sha, compiled_workflow_version_id, created_at)
1350
+ VALUES (?, ?, ?, ?, ?, ?, ?)
1351
+ `),getProject:t.prepare("SELECT * FROM project WHERE id = ?"),findProjectByName:t.prepare("SELECT * FROM project WHERE name = ?"),setProjectIntakeConfig:t.prepare("UPDATE project SET intake_config = ? WHERE id = ?"),updateProjectSettings:t.prepare(`
1352
+ UPDATE project
1353
+ SET local_path = ?,
1354
+ durable_memory_mode = ?,
1355
+ default_branch = ?,
1356
+ intake_config = ?
1357
+ WHERE id = ?
1358
+ `),listProjectsWithIntakeConfig:t.prepare("SELECT * FROM project WHERE intake_config IS NOT NULL ORDER BY name ASC, id ASC"),listProjects:t.prepare("SELECT * FROM project ORDER BY name ASC, id ASC"),getProjectByJob:t.prepare(`
1359
+ SELECT p.*
1360
+ FROM project p
1361
+ JOIN job j ON j.project_id = p.id
1362
+ WHERE j.id = ?
1363
+ `),insertProjectWorkflow:t.prepare(`
1364
+ INSERT OR IGNORE INTO project_workflow
1365
+ (project_id, workflow_id, condition, parameters_override, enabled, priority, created_at)
1366
+ VALUES (?, ?, ?, ?, ?, ?, ?)
1367
+ `),getProjectWorkflow:t.prepare("SELECT * FROM project_workflow WHERE id = ?"),findProjectWorkflowUnique:t.prepare(`
1368
+ SELECT * FROM project_workflow
1369
+ WHERE project_id = ?
1370
+ AND workflow_id = ?
1371
+ AND condition IS ?
1372
+ ORDER BY id ASC
1373
+ LIMIT 1
1374
+ `),listProjectWorkflows:t.prepare("SELECT * FROM project_workflow WHERE project_id = ? ORDER BY priority ASC, id ASC"),listEnabledProjectWorkflows:t.prepare("SELECT * FROM project_workflow WHERE project_id = ? AND enabled = 1 ORDER BY priority ASC, id ASC"),removeProjectWorkflow:t.prepare("DELETE FROM project_workflow WHERE id = ?"),setProjectWorkflowEnabled:t.prepare("UPDATE project_workflow SET enabled = ? WHERE id = ?"),createIssue:t.prepare(`
1375
+ INSERT INTO project_issue
1376
+ (project_id, title, body, severity, labels, ai_test_path, source_run_id, created_at, updated_at)
1377
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
1378
+ `),getIssue:t.prepare("SELECT * FROM project_issue WHERE id = ?"),listIssuesForProject:t.prepare(`
1379
+ SELECT * FROM project_issue
1380
+ WHERE project_id = ?
1381
+ ORDER BY
1382
+ CASE severity
1383
+ WHEN 'critical' THEN 0
1384
+ WHEN 'high' THEN 1
1385
+ WHEN 'medium' THEN 2
1386
+ WHEN 'low' THEN 3
1387
+ ELSE 4
1388
+ END,
1389
+ created_at ASC,
1390
+ id ASC
1391
+ `),claimNextIssue:t.prepare(`
1392
+ UPDATE project_issue
1393
+ SET status = 'assigned',
1394
+ assigned_run_id = ?,
1395
+ updated_at = ?
1396
+ WHERE id = (
1397
+ SELECT id FROM project_issue
1398
+ WHERE project_id = ?
1399
+ AND status IN ('open', 'reopened')
1400
+ ORDER BY
1401
+ CASE severity
1402
+ WHEN 'critical' THEN 0
1403
+ WHEN 'high' THEN 1
1404
+ WHEN 'medium' THEN 2
1405
+ WHEN 'low' THEN 3
1406
+ ELSE 4
1407
+ END,
1408
+ created_at ASC,
1409
+ id ASC
1410
+ LIMIT 1
1411
+ )
1412
+ RETURNING *
1413
+ `),claimIssue:t.prepare(`
1414
+ UPDATE project_issue
1415
+ SET status = 'assigned',
1416
+ assigned_run_id = ?,
1417
+ updated_at = ?
1418
+ WHERE id = ?
1419
+ AND status IN ('open', 'reopened')
1420
+ RETURNING *
1421
+ `),closeIssue:t.prepare(`
1422
+ UPDATE project_issue
1423
+ SET status = 'closed',
1424
+ closed_run_id = ?,
1425
+ commit_hash = ?,
1426
+ closed_at = ?,
1427
+ updated_at = ?
1428
+ WHERE id = ?
1429
+ RETURNING *
1430
+ `),reopenIssue:t.prepare(`
1431
+ UPDATE project_issue
1432
+ SET status = 'reopened',
1433
+ source_run_id = ?,
1434
+ assigned_run_id = NULL,
1435
+ updated_at = ?,
1436
+ closed_at = NULL
1437
+ WHERE id = ?
1438
+ AND status = 'closed'
1439
+ RETURNING *
1440
+ `),updateIssue:t.prepare(`
1441
+ UPDATE project_issue
1442
+ SET title = ?,
1443
+ body = ?,
1444
+ severity = ?,
1445
+ labels = ?,
1446
+ ai_test_path = ?,
1447
+ updated_at = ?
1448
+ WHERE id = ?
1449
+ RETURNING *
1450
+ `),listWorkflows:t.prepare("SELECT * FROM workflow ORDER BY name ASC, version ASC"),upsertDurableMemory:t.prepare(`
1451
+ INSERT INTO durable_memory (project_id, type, name, description, body, created_at, updated_at)
1452
+ VALUES (?, ?, ?, ?, ?, ?, ?)
1453
+ ON CONFLICT(project_id, name) DO UPDATE SET
1454
+ type = excluded.type,
1455
+ description = excluded.description,
1456
+ body = excluded.body,
1457
+ updated_at = excluded.updated_at
1458
+ `),getDurableMemoryByName:t.prepare("SELECT * FROM durable_memory WHERE project_id = ? AND name = ?"),listDurableMemory:t.prepare("SELECT * FROM durable_memory WHERE project_id = ? ORDER BY name ASC"),listDurableMemoryByType:t.prepare("SELECT * FROM durable_memory WHERE project_id = ? AND type = ? ORDER BY name ASC"),deleteDurableMemory:t.prepare("DELETE FROM durable_memory WHERE project_id = ? AND name = ?"),insertSessionEvent:t.prepare(`
1459
+ INSERT INTO session_event (run_id, step_id, kind, timestamp_ms, payload, payload_truncated, overflow_artifact_id)
1460
+ VALUES (?, ?, ?, ?, ?, ?, ?)
1461
+ `),getSessionEvent:t.prepare("SELECT * FROM session_event WHERE id = ?"),listSessionEvents:t.prepare("SELECT * FROM session_event WHERE run_id = ? ORDER BY id ASC"),listSessionEventsSince:t.prepare("SELECT * FROM session_event WHERE run_id = ? AND id > ? ORDER BY id ASC"),listAllEventsSince:t.prepare("SELECT * FROM session_event WHERE id > ? ORDER BY id ASC LIMIT ?"),upsertRollupStat:t.prepare(`
1462
+ INSERT INTO rollup_stats (run_id, step_id, metric_kind, value, bucket_start_ms, bucket_end_ms, updated_at)
1463
+ VALUES (?, ?, ?, ?, ?, ?, ?)
1464
+ ON CONFLICT(run_id, step_id, metric_kind, bucket_start_ms)
1465
+ DO UPDATE SET value = value + excluded.value, updated_at = excluded.updated_at
1466
+ `),listRollupStats:t.prepare(`
1467
+ SELECT * FROM rollup_stats WHERE run_id = ? ORDER BY step_id ASC, metric_kind ASC, bucket_start_ms ASC
1468
+ `),getRollupCursor:t.prepare("SELECT value FROM rollup_cursor WHERE key = ?"),setRollupCursor:t.prepare(`
1469
+ INSERT INTO rollup_cursor (key, value) VALUES (?, ?)
1470
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value
1471
+ `),insertDriftSignal:t.prepare(`
1472
+ INSERT INTO drift_signal
1473
+ (team_member_id, project_id, signal_kind, severity, description, detected_at, expires_at, payload)
1474
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
1475
+ `),getDriftSignal:t.prepare("SELECT * FROM drift_signal WHERE id = ?"),listDriftByMember:t.prepare("SELECT * FROM drift_signal WHERE team_member_id = ? ORDER BY detected_at DESC"),listUnackedDriftByMember:t.prepare("SELECT * FROM drift_signal WHERE team_member_id = ? AND acknowledged_at IS NULL ORDER BY detected_at DESC"),listDriftByProject:t.prepare("SELECT * FROM drift_signal WHERE project_id = ? ORDER BY detected_at DESC"),listAllDrift:t.prepare("SELECT * FROM drift_signal ORDER BY detected_at DESC"),findUnackedDrift:t.prepare("SELECT id FROM drift_signal WHERE team_member_id = ? AND project_id IS ? AND signal_kind = ? AND acknowledged_at IS NULL LIMIT 1"),ackDriftSignal:t.prepare("UPDATE drift_signal SET acknowledged_at = COALESCE(acknowledged_at, ?) WHERE id = ?"),insertJob:t.prepare(`
1476
+ INSERT OR IGNORE INTO job
1477
+ (project_id, workflow_id_override, source, source_ref, payload, priority, available_at, dedupe_key, concurrency_key_resolved, enqueued_at)
1478
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1479
+ `),getJob:t.prepare("SELECT * FROM job WHERE id = ?"),findJobByDedupe:t.prepare("SELECT * FROM job WHERE source = ? AND dedupe_key = ? ORDER BY id LIMIT 1"),selectClaimableJob:t.prepare(`
1480
+ SELECT id FROM job
1481
+ WHERE ((status = 'queued' AND available_at <= ?) OR (status = 'running' AND locked_until < ?))
1482
+ AND (locked_until IS NULL OR locked_until < ?)
1483
+ ORDER BY priority DESC, available_at ASC, id ASC
1484
+ LIMIT 1
1485
+ `),selectClaimableJobs:t.prepare(`
1486
+ SELECT id FROM job
1487
+ WHERE ((status = 'queued' AND available_at <= ?) OR (status = 'running' AND locked_until < ?))
1488
+ AND (locked_until IS NULL OR locked_until < ?)
1489
+ ORDER BY priority DESC, available_at ASC, id ASC
1490
+ `),claimJob:t.prepare(`
1491
+ UPDATE job
1492
+ SET status = 'running',
1493
+ locked_by = ?,
1494
+ locked_until = ?,
1495
+ attempt_count = attempt_count + 1,
1496
+ started_at = COALESCE(started_at, ?)
1497
+ WHERE id = ?
1498
+ AND ((status = 'queued' AND available_at <= ?) OR (status = 'running' AND locked_until < ?))
1499
+ AND (locked_until IS NULL OR locked_until < ?)
1500
+ `),setJobConcurrencyKey:t.prepare("UPDATE job SET concurrency_key_resolved = ? WHERE id = ?"),countRunningByConcurrencyKey:t.prepare(`
1501
+ SELECT COUNT(*) AS count
1502
+ FROM job
1503
+ WHERE concurrency_key_resolved = ?
1504
+ AND status = 'running'
1505
+ AND locked_until > ?
1506
+ AND id != ?
1507
+ `),releaseJob:t.prepare(`
1508
+ UPDATE job
1509
+ SET status = ?, last_error = ?, ended_at = ?, locked_by = NULL, locked_until = NULL
1510
+ WHERE id = ?
1511
+ `),pauseJob:t.prepare(`
1512
+ UPDATE job
1513
+ SET status = 'paused',
1514
+ locked_by = NULL,
1515
+ locked_until = NULL,
1516
+ ended_at = NULL
1517
+ WHERE id = ?
1518
+ `),requeuePausedJob:t.prepare(`
1519
+ UPDATE job
1520
+ SET status = 'queued',
1521
+ locked_by = NULL,
1522
+ locked_until = NULL,
1523
+ available_at = ?,
1524
+ ended_at = NULL,
1525
+ last_error = NULL
1526
+ WHERE id = ?
1527
+ `),setJobRun:t.prepare("UPDATE job SET run_id = ? WHERE id = ?"),insertRun:t.prepare(`
1528
+ INSERT INTO run (job_id, workflow_id, team_id, current_state, workflow_version_id, parent_run_id, started_at)
1529
+ VALUES (?, ?, ?, ?, ?, ?, ?)
1530
+ `),getRun:t.prepare("SELECT * FROM run WHERE id = ?"),setRunCurrentState:t.prepare("UPDATE run SET current_state = ?, paused_at = NULL WHERE id = ?"),setRunPausedState:t.prepare("UPDATE run SET current_state = ?, paused_at = ? WHERE id = ?"),resumeRunState:t.prepare("UPDATE run SET current_state = ?, paused_at = NULL WHERE id = ?"),setRunPendingEscalationDecision:t.prepare("UPDATE run SET pending_escalation_decision = ? WHERE id = ?"),setRunTerminalState:t.prepare(`
1531
+ UPDATE run SET terminal_state = ?, ended_at = ?, current_state = NULL, paused_at = NULL WHERE id = ?
1532
+ `),insertStep:t.prepare(`
1533
+ INSERT INTO step (run_id, parent_step_id, state_name, outcome, status_detail, started_at)
1534
+ VALUES (?, ?, ?, ?, ?, ?)
1535
+ `),getStep:t.prepare("SELECT * FROM step WHERE id = ?"),listStepsForRun:t.prepare("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC"),insertSubmittedPr:t.prepare(`
1536
+ INSERT INTO submitted_pr
1537
+ (repo, pr_url, issue_url, local_path, branch, head_sha, status, submitted_at, last_known_state, created_by_run_id)
1538
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1539
+ `),getSubmittedPr:t.prepare("SELECT * FROM submitted_pr WHERE id = ?"),findSubmittedPrByUrl:t.prepare("SELECT * FROM submitted_pr WHERE pr_url = ?"),listSubmittedPrs:t.prepare("SELECT * FROM submitted_pr ORDER BY submitted_at DESC, id DESC"),listSubmittedPrsByStatus:t.prepare("SELECT * FROM submitted_pr WHERE status = ? ORDER BY submitted_at DESC, id DESC"),listLatestStepOutcomesByState:t.prepare(`
1540
+ SELECT state_name, outcome FROM step s1
1541
+ WHERE run_id = ?
1542
+ AND outcome IS NOT NULL
1543
+ AND id = (SELECT MAX(s2.id) FROM step s2 WHERE s2.run_id = s1.run_id AND s2.state_name = s1.state_name AND s2.outcome IS NOT NULL)
1544
+ ORDER BY id
1545
+ `),finishStep:t.prepare("UPDATE step SET outcome = ?, status_detail = ?, ended_at = ? WHERE id = ?"),finishLatestOpenStepForRunState:t.prepare(`
1546
+ UPDATE step
1547
+ SET outcome = ?, status_detail = ?, ended_at = ?
1548
+ WHERE id = (
1549
+ SELECT id FROM step
1550
+ WHERE run_id = ? AND state_name = ? AND ended_at IS NULL
1551
+ ORDER BY id DESC
1552
+ LIMIT 1
1553
+ )
1554
+ `),insertStepArtifact:t.prepare(`
1555
+ INSERT INTO step_artifact (step_id, kind, path, content, sha, provider_call_mode, created_at)
1556
+ VALUES (?, ?, ?, ?, ?, ?, ?)
1557
+ `),getStepArtifact:t.prepare("SELECT * FROM step_artifact WHERE id = ?"),insertExternalObject:t.prepare(`
1558
+ INSERT OR IGNORE INTO external_object
1559
+ (type, provider, project_id, run_id, external_id, url, status, metadata, last_seen_at, created_at)
1560
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1561
+ `),findExternalObjectByUnique:t.prepare(`
1562
+ SELECT * FROM external_object WHERE provider = ? AND type = ? AND external_id = ?
1563
+ `),insertExternalSignal:t.prepare(`
1564
+ INSERT OR IGNORE INTO external_signal
1565
+ (object_id, kind, source, occurred_at, payload, signal_hash, handled_at, created_at)
1566
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
1567
+ `),getExternalSignal:t.prepare("SELECT * FROM external_signal WHERE id = ?"),findExternalSignalByUnique:t.prepare(`
1568
+ SELECT * FROM external_signal WHERE object_id = ? AND kind = ? AND signal_hash = ?
1569
+ `),insertAttention:t.prepare(`
1570
+ INSERT INTO attention
1571
+ (kind, severity, project_id, run_id, external_object_id, requires_user, payload, created_at)
1572
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
1573
+ `),getAttention:t.prepare("SELECT * FROM attention WHERE id = ?"),ackAttention:t.prepare("UPDATE attention SET acknowledged_at = ? WHERE id = ?"),insertSessionSize:t.prepare(`
1574
+ INSERT INTO session_size
1575
+ (team_name, alias, sessionid, input_tokens, cache_tokens, output_tokens, total_tokens, observed_at)
1576
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
1577
+ `),getSessionSize:t.prepare("SELECT * FROM session_size WHERE id = ?"),latestSessionSizes:t.prepare(`
1578
+ SELECT s.*
1579
+ FROM session_size s
1580
+ JOIN (
1581
+ SELECT team_name, alias, MAX(id) AS id
1582
+ FROM session_size
1583
+ GROUP BY team_name, alias
1584
+ ) latest ON latest.id = s.id
1585
+ ORDER BY s.team_name ASC, s.alias ASC
1586
+ `),sessionSizeHistory:t.prepare(`
1587
+ SELECT * FROM session_size
1588
+ WHERE team_name = ? AND alias = ?
1589
+ ORDER BY observed_at DESC, id DESC
1590
+ LIMIT ?
1591
+ `),insertWebuiSession:t.prepare(`
1592
+ INSERT INTO webui_session
1593
+ (session_id, user_id, current_node, node_params, prev_node_stack, pending_form, chatbot_session_id, auth_state, last_transition_at, created_at)
1594
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1595
+ `),getWebuiSession:t.prepare("SELECT * FROM webui_session WHERE session_id = ?"),updateWebuiSessionTransition:t.prepare(`
1596
+ UPDATE webui_session
1597
+ SET current_node = ?,
1598
+ node_params = ?,
1599
+ prev_node_stack = ?,
1600
+ pending_form = ?,
1601
+ last_transition_at = ?
1602
+ WHERE session_id = ?
1603
+ `),setWebuiSessionChatbot:t.prepare(`
1604
+ UPDATE webui_session
1605
+ SET chatbot_session_id = ?,
1606
+ last_transition_at = ?
1607
+ WHERE session_id = ?
1608
+ `),insertChatbotSession:t.prepare(`
1609
+ INSERT INTO chatbot_session
1610
+ (chatbot_session_id, user_id, title, created_at, last_active_at, status)
1611
+ VALUES (?, ?, ?, ?, ?, ?)
1612
+ `),getChatbotSession:t.prepare("SELECT * FROM chatbot_session WHERE chatbot_session_id = ?"),listChatbotSessionsForUser:t.prepare(`
1613
+ SELECT * FROM chatbot_session
1614
+ WHERE user_id = ?
1615
+ ORDER BY last_active_at DESC, chatbot_session_id ASC
1616
+ `),touchChatbotSession:t.prepare("UPDATE chatbot_session SET last_active_at = ? WHERE chatbot_session_id = ?"),insertChatbotMessage:t.prepare(`
1617
+ INSERT INTO chatbot_message (chatbot_session_id, role, content, tool_calls, created_at)
1618
+ VALUES (?, ?, ?, ?, ?)
1619
+ `),getChatbotMessage:t.prepare("SELECT * FROM chatbot_message WHERE id = ?"),listChatbotMessages:t.prepare(`
1620
+ SELECT * FROM chatbot_message
1621
+ WHERE chatbot_session_id = ?
1622
+ ORDER BY id ASC
1623
+ `),getConfig:t.prepare("SELECT value FROM lmctl_config WHERE key = ?"),upsertConfig:t.prepare(`
1624
+ INSERT INTO lmctl_config (key, value, updated_at)
1625
+ VALUES (?, ?, ?)
1626
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at
1627
+ `),listConfig:t.prepare("SELECT key, value, updated_at FROM lmctl_config ORDER BY key ASC"),insertInteractiveSession:t.prepare(`
1628
+ INSERT INTO interactive_session (run_id, step_id, state_name, turn_count, status, started_at, last_activity_at)
1629
+ VALUES (?, ?, ?, 0, ?, ?, ?)
1630
+ `),getInteractiveSessionByStepId:t.prepare("SELECT * FROM interactive_session WHERE step_id = ?"),getInteractiveSessionByRunAndState:t.prepare("SELECT * FROM interactive_session WHERE run_id = ? AND state_name = ?"),updateInteractiveSession:t.prepare(`
1631
+ UPDATE interactive_session SET status = ?, last_operator_input = ?, last_activity_at = ? WHERE id = ?
1632
+ `),setInteractiveAgentOutput:t.prepare(`
1633
+ UPDATE interactive_session SET last_agent_output = ?, turn_count = turn_count + 1, status = ?, last_activity_at = ? WHERE id = ?
1634
+ `),insertPromptDispatch:t.prepare(`
1635
+ INSERT INTO prompt_dispatch (prompt_id, project_id, job_id, text, context_json, created_at)
1636
+ VALUES (?, ?, ?, ?, ?, ?)
1637
+ `),getPromptDispatch:t.prepare("SELECT * FROM prompt_dispatch WHERE prompt_id = ?"),setPromptDispatchCompleted:t.prepare("UPDATE prompt_dispatch SET completed_at = ? WHERE prompt_id = ?"),getWorkspace:t.prepare("SELECT * FROM workspace WHERE id = ? AND deleted_at IS NULL"),ensureWorkspace:t.prepare(`
1638
+ INSERT INTO workspace (id, name, idle_threshold_ms, created_at)
1639
+ VALUES (?, ?, ?, ?)
1640
+ ON CONFLICT(id) DO NOTHING
1641
+ `),insertWebProject:t.prepare(`
1642
+ INSERT INTO web_project (workspace_id, name, repo_path, config_json, linked_v4_project_id, last_active_at, created_at)
1643
+ VALUES (?, ?, ?, ?, ?, ?, ?)
1644
+ `),getWebProject:t.prepare("SELECT * FROM web_project WHERE id = ?"),listWebProjectsActive:t.prepare("SELECT * FROM web_project WHERE workspace_id = ? AND deleted_at IS NULL ORDER BY name ASC, id ASC"),updateWebProject:t.prepare(`
1645
+ UPDATE web_project
1646
+ SET name = ?,
1647
+ config_json = ?,
1648
+ last_active_at = ?
1649
+ WHERE id = ?
1650
+ `),setWebProjectLastActive:t.prepare("UPDATE web_project SET last_active_at = ? WHERE id = ?"),softDeleteWebProject:t.prepare("UPDATE web_project SET deleted_at = ? WHERE id = ? AND deleted_at IS NULL"),loadMailboxCursor:t.prepare("SELECT * FROM mailbox_cursor WHERE user_id = ? AND mailbox_key = ?"),saveMailboxCursor:t.prepare(`
1651
+ INSERT INTO mailbox_cursor (user_id, mailbox_key, last_processed_version_id, last_processed_seq, last_processed_at)
1652
+ VALUES (?, ?, ?, ?, ?)
1653
+ ON CONFLICT(user_id, mailbox_key) DO UPDATE SET
1654
+ last_processed_version_id = excluded.last_processed_version_id,
1655
+ last_processed_seq = excluded.last_processed_seq,
1656
+ last_processed_at = excluded.last_processed_at
1657
+ `),addUsage:t.prepare(`
1658
+ INSERT INTO usage_meter (user_id, device_id, period, put_count, get_count, list_count, updated_at)
1659
+ VALUES (?, ?, ?, ?, ?, ?, ?)
1660
+ ON CONFLICT(user_id, device_id, period) DO UPDATE SET
1661
+ put_count = put_count + excluded.put_count,
1662
+ get_count = get_count + excluded.get_count,
1663
+ list_count = list_count + excluded.list_count,
1664
+ updated_at = excluded.updated_at
1665
+ `),loadUsage:t.prepare("SELECT * FROM usage_meter WHERE user_id = ? AND device_id = ? AND period = ?"),sumUsageForPeriod:t.prepare(`
1666
+ SELECT COALESCE(SUM(put_count), 0) AS put,
1667
+ COALESCE(SUM(get_count), 0) AS get,
1668
+ COALESCE(SUM(list_count), 0) AS list
1669
+ FROM usage_meter WHERE user_id = ? AND period = ?
1670
+ `),upsertRootTeam:t.prepare(`
1671
+ INSERT INTO root_team (teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at)
1672
+ VALUES (?, ?, ?, ?, ?, ?)
1673
+ ON CONFLICT(teamfile_path) DO UPDATE SET
1674
+ name = excluded.name,
1675
+ raw_text = excluded.raw_text,
1676
+ raw_sha256 = excluded.raw_sha256,
1677
+ registered_at = excluded.registered_at,
1678
+ last_seeded_at = excluded.last_seeded_at
1679
+ `),getRootTeam:t.prepare("SELECT * FROM root_team WHERE teamfile_path = ?"),listRootTeams:t.prepare("SELECT * FROM root_team ORDER BY teamfile_path ASC"),insertTeamChatLog:t.prepare(`
1680
+ INSERT INTO team_chat_log (
1681
+ root_teamfile, sender_teamfile, sender_alias, receiver_teamfile, receiver_alias,
1682
+ message, response, origin, status, error_detail, truncated, message_type, created_at
1683
+ )
1684
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1685
+ `),listTeamChatLog:t.prepare("SELECT * FROM team_chat_log WHERE root_teamfile = ? AND "+er+" ORDER BY created_at ASC, id ASC"),listTeamChatLogSinceId:t.prepare("SELECT * FROM team_chat_log WHERE id > ? AND "+er+" ORDER BY id ASC LIMIT ?"),getMaxTeamChatLogId:t.prepare("SELECT COALESCE(MAX(id), 0) AS max_id FROM team_chat_log"),loadTeamChatLogCursor:t.prepare("SELECT * FROM team_chat_log_cursor WHERE cursor_key = ?"),saveTeamChatLogCursor:t.prepare(`
1686
+ INSERT INTO team_chat_log_cursor (cursor_key, last_pushed_id, updated_at)
1687
+ VALUES (?, ?, ?)
1688
+ ON CONFLICT(cursor_key) DO UPDATE SET
1689
+ last_pushed_id = excluded.last_pushed_id,
1690
+ updated_at = excluded.updated_at
1691
+ `),updateTeamChatLogResponse:t.prepare(`
1692
+ UPDATE team_chat_log
1693
+ SET response = ?,
1694
+ status = ?,
1695
+ error_detail = ?,
1696
+ truncated = ?
1697
+ WHERE id = ?
1698
+ `),getTeamChatLogById:t.prepare("SELECT * FROM team_chat_log WHERE id = ? AND "+er),terminalizeTeamChatLogIfRunning:t.prepare(`
1699
+ UPDATE team_chat_log
1700
+ SET status = ?,
1701
+ error_detail = ?,
1702
+ response = NULL
1703
+ WHERE id = ?
1704
+ AND status = 'running'
1705
+ `),...mc(t),...uc(t)}}function Fv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}import{homedir as jv}from"node:os";import{join as Wc}from"node:path";var $v=".lmctl",Wv="state.db";function Hv(t=process.env){let e=t.LMCTL_HOME;return e!==void 0&&e.length>0?e:Wc(t.HOME||jv(),$v)}function Hc(t=process.env){return Wc(Hv(t),Wv)}function Pn(t,e=process.env){return t!==void 0&&t.length>0?t:e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0?e.LMCTL_DB:Hc(e)}function Bc(t,e=process.env){return e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0&&e.LMCTL_DB!==Hc(e)?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}import{isAbsolute as Bv,resolve as Xc,join as qc}from"node:path";function fe(t){try{if(t instanceof Error){let e=t.message;if(typeof e=="string")return e}return String(t)}catch{return"Unprintable error"}}function Ls(t){return{...t,status:"ok",error:null}}function ee(t,e,n){return{...n,status:"error",code:t,error:e}}var Wo=new WeakMap;function Jc(t,e){let n=Wo.get(t);if(!n||t.closed)throw Error("Context is closed");return n.resources.add(e),()=>n.resources.delete(e)}function vr(t){let e=Wo.get(t);if(!e)throw Error("Unknown context");return e.dal()}var Xv=new WeakMap;var Gc=new WeakSet;function Vc(t){return t!==null&&typeof t=="object"&&Gc.has(t)}function Kc(t){try{if(!t||typeof t!="object"||Array.isArray(t))return ee("invalid_argument","Context needs an explicit options map");let e={...t},n=["pid","env","cwd","dbPath","dal","onProgress","onWarning","clock","interactive"];if(Object.keys(e).some(g=>!n.includes(g)))return ee("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!Bv(e.cwd))return ee("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...e.env});if(Object.values(r).some(g=>g!==void 0&&typeof g!="string"))return ee("invalid_argument","Environment values must be strings or undefined");for(let g of["onProgress","onWarning","clock"])if(e[g]!==void 0&&typeof e[g]!="function")return ee("invalid_argument",g+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return ee("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return ee("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return ee("invalid_argument","pid must be a positive integer");let s=Xc(e.cwd),i=r.LMCTL_HOME||(r.HOME?qc(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(i?qc(i,"state.db"):void 0)))return ee("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,d,u,c=new AbortController,m=new Set,p=g=>{if(l){try{l.close()}catch(_){g.push(fe(_))}l=void 0}},f=Object.freeze({status:"ok",error:null,pid:e.pid,signal:c.signal,env:r,cwd:s,dbPath:Xc(s,Pn(e.dbPath,r)),dal:e.dal,interactive:e.interactive??r.LMCTL_NON_INTERACTIVE!=="1",onProgress:e.onProgress??(()=>{}),onWarning:e.onWarning??(()=>{}),clock:e.clock??Date.now,get closed(){return a},close(){if(d)return d;let g;return d=new Promise(_=>{g=_}),a=!0,c.abort(),(async()=>{let _=[],h=0;for(let E of[...m])try{await E.close(),h++,m.delete(E)}catch(y){_.push(fe(y))}_.length||p(_),g({released:h,errors:_})})(),d},finalizeSync(g){if(u)return u;a=!0;let _=[],h={released:0,errors:_};u=h,d??=Promise.resolve(h);for(let E of[...m])try{E.finalizeSync(g),h.released++,m.delete(E)}catch(y){_.push(fe(y))}return c.abort(g),_.length||p(_),h}});return Wo.set(f,{resources:m,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=Ct({path:f.dbPath})}}),Gc.add(f),Xv.set(f,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),f}catch(e){return ee("invalid_argument","Invalid context: "+fe(e))}}import{readdirSync as MA}from"node:fs";import{join as c_,resolve as UA}from"node:path";import{randomUUID as FA}from"node:crypto";import{performance as u_}from"node:perf_hooks";var on="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model.";function wr(t){return t!=="gemini"}function Ds(t){if(!wr(t))throw new Error(on)}var Mn=class extends Error{};async function ut(t,e,n,r,s){if(t.provider!==e)throw new Error(`bundle session provider mismatch: session serves "${t.provider}", turn targets "${e}"`);if(t.sessionId!==n)throw new Mn(`session identity mismatch: expected "${n}", got "${t.sessionId}"`);let i=await t.sendTurn(r,s);if(i.sessionId!==n)throw Object.assign(new Mn(`session identity mismatch: expected "${n}", got "${i.sessionId}"`),{usage:i.usage,sessionId:i.sessionId});return{...i,...i.text===""&&i.sawActivity===!1?{status:"empty"}:{}}}async function Ho(t,e){Ds(t.name);let n=e.requireResume??!0;if(n&&!e.sessionId.trim())throw new Error("conversation requires an existing session ID");let r=e.userConfig?.tools[t.name]?.agent!==void 0,s=e.execution!=="per-turn"&&t.openSession!==void 0&&!r;if(e.execution==="persistent"&&!s)throw new Error(`provider "${t.name}" does not support persistent sessions with this configuration`);let i=s?await t.openSession(e):void 0,o=!n&&e.sessionId==="";if(i&&(i.provider!==t.name||typeof i.sessionId!="string"||!i.sessionId.trim()||!o&&i.sessionId!==e.sessionId))throw await i.close(),new Error(`session identity mismatch opening ${t.name}: expected "${e.sessionId}", got "${i.sessionId}" (${i.provider})`);let a=i?.sessionId??e.sessionId,l=0,d=!1,u,c;return{provider:t.name,sessionId:a,execution:s?"persistent":"per-turn",transport:r?"custom":t.protocol?.transport??"unknown",cancellation:r?"unknown":s?t.protocol?.persistentCancellation??"unknown":t.protocol?.perTurnCancellation??"unknown",get completedTurns(){return l},async sendTurn(m,p={}){if(d)throw new Error("conversation is closed");if(u)throw new Error("conversation already has an active turn");if(p.signal?.aborted)throw new Error("Aborted");let f=new AbortController;u=f;let g=()=>f.abort();p.signal?.addEventListener("abort",g,{once:!0});try{let _=i?await ut(i,t.name,a,m,{...p,signal:f.signal}):await t.sendTurn(m,{...e,...p,signal:f.signal,requireResume:n,timeoutMs:e.timeoutMs??0});if(f.signal.aborted)throw Object.assign(new Error("Aborted"),{usage:_.usage,sessionId:_.sessionId});if(n&&_.sessionId!==e.sessionId)throw d=!0,Object.assign(new Mn(`session identity mismatch: expected "${e.sessionId}", got "${_.sessionId}"`),{usage:_.usage,sessionId:_.sessionId});return _.status!=="empty"&&_.status!=="stalled"&&l++,_}catch(_){throw f.signal.aborted&&i&&t.protocol?.persistentCancellation==="session"&&(d=!0),_ instanceof Mn&&(d=!0,await i?.close()),_}finally{p.signal?.removeEventListener("abort",g),u=void 0}},close(){return c||(d=!0,u?.abort(),c=i?i.close():Promise.resolve()),c}}}import{platform as Yc}from"node:os";import{realpathSync as qv}from"node:fs";import{resolve as Jv}from"node:path";function Bo(t){let e=Jv(t);try{return qv(e)}catch{return e}}var Ps=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(e?.workspace){let o=Bo(e.workspace);i=i.filter(a=>Bo(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=Yc()==="darwin"||Yc()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}};function Nt(t){let e=new Ps;for(let n of t)e.registerAdapter(n);return e}import{join as ra}from"node:path";import{mkdir as oS}from"node:fs/promises";var ke=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,Gv=(t,e)=>t===null||e===null?null:ke(t+e),Xo=(t,e)=>JSON.stringify([t,e]),qo=class{finished=new Set;seen=new Set;models=new Map;reportModel(e,n){typeof n=="string"&&n&&n!=="<synthetic>"&&this.models.set(e,n)}remember(e,n){typeof n=="string"&&n&&this.finished.add(Xo(e,n))}turn(e,n=""){return new Jo(this,e,n)}};function Go(){return new qo}var Jo=class{constructor(e,n,r){this.session=e;this.thread=n;this.id=r}value;ended=!1;reported=new Set;bind(e){return typeof e!="string"||!e||this.ended||this.session.finished.has(Xo(this.thread,e))||this.id&&this.id!==e?!1:(this.id=e,!0)}event(e){let n=e.method,r=e.params,s=r?.turn,i=r?.turnId??s?.id,o=typeof r?.threadId=="string"?r.threadId:this.thread;if(this.thread&&o!==this.thread||(this.thread||(this.thread=o),typeof i=="string"&&this.session.finished.has(Xo(o,i))))return!1;if(n==="turn/started")return this.bind(i);if(this.id&&i&&i!==this.id)return!1;if(n==="turn/completed")return this.id?!this.ended:this.bind(i);if(n!=="thread/tokenUsage/updated")return!0;if(this.ended||!this.id||r?.threadId!==this.thread||r?.turnId!==this.id)return!1;let a=r.tokenUsage;if(!a?.last||typeof a.last!="object"||Array.isArray(a.last)||[a.last.inputTokens,a.last.cachedInputTokens,a.last.outputTokens].every(v=>v==null))return!0;let l=v=>["inputTokens","cachedInputTokens","cacheWriteInputTokens","outputTokens","reasoningOutputTokens","totalTokens"].map(b=>v[b]??null),d=a.total&&["inputTokens","cachedInputTokens","outputTokens"].every(v=>ke(a.total[v])!==null)?l(a.total):null,u=typeof e.id=="string"&&e.id.length>0||typeof e.id=="number"&&Number.isSafeInteger(e.id)?e.id:null,c=ke(e.emittedAtMs)??u,m=ke(e.ordinal)??ke(r.ordinal),p=JSON.stringify([this.thread,this.id,d,l(a.last),c,u,m]),f=c!==null||m!==null;if(f&&this.session.seen.has(p))return!1;f&&this.session.seen.add(p);let g=a.last,_=ke(g.inputTokens),h=ke(g.cachedInputTokens),y={source:"wire",inputUncached:_===null||h===null||h>_?null:_-h,cacheRead:h,cacheWrite:ke(g.cacheWriteInputTokens??0),output:ke(g.outputTokens),reasoning:ke(g.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:Ye([g.inputTokens,g.cachedInputTokens,g.cacheWriteInputTokens,g.outputTokens,g.reasoningOutputTokens])||_!==null&&h!==null&&h>_};[y.inputUncached,y.cacheRead,y.cacheWrite,y.output].includes(null)&&(y.reason="counter_not_exposed");let T=r.model??g.model;if(typeof T=="string"&&T&&T!=="<synthetic>"&&this.reported.add(T),!this.value)this.value=y;else{for(let v of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let b=this.value[v],S=y[v];b!==null&&S!==null&&ke(b+S)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[v]=Gv(this.value[v],y[v])}this.value.reason=this.value.reason||y.reason,this.value.invalidCounters||=y.invalidCounters}return!0}usage(){if(this.value)return{...this.value,modelReported:this.reported.size>1?null:[...this.reported][0]??this.session.models.get(this.thread)??null,mixedModels:this.reported.size>1}}finish(){this.ended=!0,this.id&&this.session.remember(this.thread,this.id)}};function Vo(t){let e=!1;for(let n of t.split(`
1706
+ `)){let r;try{r=JSON.parse(n)}catch{continue}let s=r.type;typeof s=="string"&&(s.endsWith(".started")&&(e=!0),["turn.completed","turn.failed","turn.aborted","turn.cancelled","error"].includes(s)&&(e=!1))}return e}function Ko(t){let e=t.trimEnd().split(`
1707
+ `).at(-1)?.trimStart()??"";if(!e.startsWith("{"))return!1;try{return JSON.parse(e),!1}catch{return!0}}function zc(t){let e,n=!1,r=!1,s;for(let i of t.split(`
1708
+ `)){let o;try{o=JSON.parse(i)}catch{continue}if(o.type==="thread.started"&&typeof o.thread_id=="string"&&(e=o.thread_id),o.type==="turn.started"&&(n=!0),o.type!=="turn.completed"||!n||r)continue;r=!0;let a=o.usage;if(!a)continue;let l=ke(a.input_tokens),d=ke(a.cached_input_tokens);s={source:"wire",inputUncached:l===null||d===null||d>l?null:l-d,cacheRead:d,cacheWrite:0,output:ke(a.output_tokens),reasoning:ke(a.reasoning_output_tokens),modelReported:typeof o.model=="string"?o.model:null,providerCostUsd:null,reason:null,invalidCounters:Ye([a.input_tokens,a.cached_input_tokens,a.output_tokens,a.reasoning_output_tokens])||l!==null&&d!==null&&d>l},[s.inputUncached,s.cacheRead,s.output].includes(null)&&(s.reason="counter_not_exposed")}return(Ko(t)||Vo(t))&&(s={source:"wire",inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:"counter_not_exposed",invalidCounters:!0}),{sessionId:e,usage:s}}import{spawn as cm}from"node:child_process";import{mkdirSync as Xw}from"node:fs";import{readFileSync as Vv,writeFileSync as NO,mkdirSync as xO}from"node:fs";import{join as Kv,dirname as LO}from"node:path";import{homedir as Yv}from"node:os";var Yo={muse:{start:"muse",resume:"muse resume {{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}},hermes:{start:"hermes",resume:"hermes --yolo --resume {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}}},zv={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]},hermes:{mode:"argv",argv:["hermes","--yolo","-z","{{prompt}}","--resume","{{session_id}}"]}};function Qv(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function Zv(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=Qv(t.slice(e+1).trim());return n?{key:n,value:r}:null}function ew(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function Ms(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function tw(){return Kv(Yv(),".lmctl","config.toml")}function Us(t){let e=t??tw(),n;try{n=Vv(e,"utf-8")}catch{return{tools:{}}}return nw(n)}function Qc(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function nw(t){let e={},n={},r=t.split(`
1709
+ `),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let c=e[s.tool]??{};if(s.profile){let m=c.profiles?.[s.profile]??{};i.description&&(m.description=i.description),i.flags!==void 0&&(m.flags=i.flags),c.profiles||(c.profiles={}),c.profiles[s.profile]=m}else i.start&&(c.start=i.start),i.resume&&(c.resume=i.resume),i.agent&&(c.agent=i.agent),i.profile_flag!==void 0&&(c.profile_flag=i.profile_flag);e[s.tool]=c}else if(s.kind==="compact"){let c=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let m=Qc(i.min);m!==null&&(c.min=m)}if(i.max!==void 0){let m=Qc(i.max);m!==null&&(c.max=m)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=c):n.global=c}i={}}for(let c of r){let m=c.trim();if(!m||m.startsWith("#"))continue;let p=ew(m);if(p!==null){if(o=!0,l(),p.startsWith("tool.")){let g=".profile.",_=p.indexOf(g);_!==-1?s={kind:"tool",tool:p.slice(5,_),profile:p.slice(_+g.length)}:s={kind:"tool",tool:p.slice(5),profile:null}}else p==="compact"?s={kind:"compact",provider:null}:p.startsWith("compact.")?s={kind:"compact",provider:p.slice(8)}:s={kind:"none"};continue}let f=Zv(m);f&&s.kind!=="none"?i[f.key]=f.value:f&&!o&&(a[f.key]=f.value)}l();let d={tools:e};(n.global||n.providers)&&(d.compact=n);let u=a.site_name;return u!==void 0&&u.length>0&&(d.site_name=u),d}function rw(t,e,n){if(!n)return"";let r=t.tools[e]??Yo[e],s=r?.profiles?.[n]?.flags??Yo[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function Zc(t,e){return!!t.tools[e]}function em(t,e,n,r,s){let i=t.tools[e]??Yo[e],o;if(i?.agent){let l=Ms(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=zv[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let d=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let u=d.map(Ms).join(" ");o=`printf '%s\\n' ${Ms(r)} | ${u}`}else o=d.map(Ms).join(" ")}let a=rw(t,e,s);return a&&(o+=" "+a),o}function tm(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var sw="ACK: waiting for explicit lmctl task.",V=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, or edit. Reply exactly: ${sw}`,Fs=`send this exact lmctl seed instruction: "${V}"`,iw=`
1710
+
1711
+ Teamfile `,ow=`
1712
+
1713
+ After this seed finishes, use \`lmctl prompt `,aw=' <alias> "<message>"` to send a message. Do not run or use lmctl prompt during this seed. Reply only with the ACK above and wait.';function nm(t){let e=t?.prompt??V;if(t?.teamfile!==void 0){let n=t.teamfileContent??"";e=`${V}${iw}${t.teamfile}:
1714
+ ${n}${ow}${JSON.stringify(t.teamfile)}${aw}`}return t?.flightToken&&(e=`${t.flightToken.startsWith("[lmctl-seed:")?t.flightToken:`[lmctl-seed:${t.flightToken}]`}
1715
+ ${e}`),e}import{existsSync as Ww}from"node:fs";import{readFileSync as lm,appendFileSync as Nw,mkdirSync as xw,existsSync as JO,readdirSync as GO,unlinkSync as VO}from"node:fs";import{join as $s,dirname as Ow}from"node:path";import{homedir as Lw}from"node:os";import{randomUUID as lw}from"node:crypto";import{chmodSync as rm,mkdirSync as dw,readdirSync as uw,statSync as cw,unlinkSync as mw,writeFileSync as pw}from"node:fs";import{homedir as fw,tmpdir as gw}from"node:os";import{join as Sr}from"node:path";function an(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var _w=500,hw=1e6,yw=50,Tw=20*1024*1024,Ew=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,vw=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi;function ww(t){return an(t.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\|$)/g,"")).replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g,"\uFFFD")}function br(t){return ww(t).replace(/-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z0-9 ]*PRIVATE KEY-----|$)/g,"[REDACTED_PRIVATE_KEY]").replace(/\b((?:set-)?cookie\s*:[ \t]*)[^\r\n]+/gi,"$1[REDACTED]").replace(/\b([a-z][a-z0-9+.-]*:\/\/[^\s/:@]*):[^\s/@]+@/gi,"$1:[REDACTED]@").replace(/\bBearer\s+(?=[A-Za-z0-9._~+/-]{12,}\b)(?=[A-Za-z0-9._~+/-]*[0-9._~+/-])[A-Za-z0-9._~+/-]{12,}/gi,"Bearer [REDACTED]").replace(vw,"$1[REDACTED]").replace(/\b((?:[A-Z0-9]+_)*(?:KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIALS?)(?:_[A-Z0-9]+)*=)(?!\[REDACTED\])(?:"[^"]*"|'[^']*'|[^\s,;]+)/g,"$1[REDACTED]").replace(/([?&](?:key|sig|signature)=)[^&\s'"]+/gi,"$1[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{12,}\b/g,"[REDACTED_SECRET]").replace(/\b(?:gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|glpat-[A-Za-z0-9_-]{16,}|xox[abeprs]-[A-Za-z0-9-]{10,})/g,"[REDACTED_SECRET]").replace(/\bAIza[0-9A-Za-z_-]{20,}\b/g,"[REDACTED_SECRET]").replace(/\bAKIA[0-9A-Z]{16}\b/g,"[REDACTED_SECRET]").replace(/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,"[REDACTED_JWT]")}function Sw(){let t=process.env.LMCTL_HOME||(process.env.NODE_ENV==="test"?Sr(gw(),`lmctl-test-${process.pid}`,".lmctl"):Sr(process.env.HOME||fw(),".lmctl"));return Sr(t,"provider-errors")}function bw(t,e,n){if(t.length<=e)return t;let r=Math.floor(e*.2),s=e-r,i=t.length-e;return`${t.slice(0,r)}
1716
+ \u2026 ${i} characters of ${n} \u2026
1717
+ ${t.slice(-s)}`}function Rw(t,e){try{let n=uw(t).filter(s=>Ew.test(s)).sort().map(s=>{let i=Sr(t,s);return{path:i,size:cw(i).size}}),r=n.reduce((s,i)=>s+i.size,0);for(let s=0;s<n.length&&(n.length-s>yw||r>Tw);s++){let i=n[s];i.path!==e&&(mw(i.path),r-=i.size)}}catch{}}function kw(t,e){let n=Sw(),r=Sr(n,`stderr-${Date.now()}-${process.pid}-${lw()}.log`);try{dw(n,{recursive:!0,mode:448}),rm(n,448);let s=`[${new Date().toISOString()}] provider=${e}
1718
+ ${bw(t,hw,"provider output not saved")}
1719
+ `;return pw(r,s,{encoding:"utf8",flag:"wx",mode:384}),rm(r,384),Rw(n,r),{path:r,saved:!0}}catch{return{path:r,saved:!1}}}function Iw(t){let e=new Map,n=new Map;t.forEach((i,o)=>{i.trim()!==""&&(e.set(i,(e.get(i)??0)+1),n.set(i,o))});let r=[],s=0;return t.forEach((i,o)=>{let a=e.get(i);if(a===void 0||a===1){r.push(i);return}n.get(i)===o&&(s+=a-1,r.push(`${i} (repeated ${a} times)`))}),{lines:r,duplicates:s}}function ct(t){return Array.from(t)}function Aw(t,e){let n=ct(t),r=`\u2026[${n.length} characters clipped]\u2026`,s=Math.max(2,e-ct(r).length),i=Math.max(1,Math.floor(s*.4)),o=Math.max(1,s-i),a=n.slice(0,i).join("").replace(/[\u200d\ufe0f\u0300-\u036f]+$/u,""),l=n.slice(-o).join("").replace(/^[\u200d\ufe0f\u0300-\u036f]+/u,""),d=n.length-ct(a).length-ct(l).length;return`${a}\u2026[${d} characters clipped]\u2026${l}`}function Cw(t,e){let n=t.join(`
1720
+ `);if(ct(n).length<=e)return{text:n,omittedLines:0,truncatedLine:!1};let r=Math.max(24,Math.floor(e*.68)),s=[],i=0,o=!1;for(let c=t.length-1;c>=0;c--){let m=t[c],p=ct(m).length+(s.length>0?1:0);if(i+p<=r){s.unshift({index:c,line:m}),i+=p;continue}s.length===0&&(s.unshift({index:c,line:Aw(m,t.length===1?e:r)}),o=!0);break}let a=s[0]?.index??t.length,l=[],d="",u=c=>{let m=t.length-c.length-s.length,p=[...c];return m>0&&p.push(`\u2026 ${m} lines omitted \u2026`),p.push(...s.map(f=>f.line)),p.join(`
1721
+ `)};for(let c=0;c<a;c++){let m=[...l,t[c]],p=u(m);if(ct(p).length>e)break;l=m,d=p}return l.length===0&&(d=u(l)),ct(d).length>e&&(d=ct(d).slice(-e).join(""),o=!0),{text:d,omittedLines:Math.max(0,t.length-l.length-s.length),truncatedLine:o}}function de(t,e){let n=br(t),r=e.fullOutput===void 0?n:br(e.fullOutput),{lines:s,duplicates:i}=Iw(n.trim().split(/\r\n|\r|\n/)),o=Cw(s,Math.max(64,e.maxChars??_w)),a=[];if(o.omittedLines>0&&a.push(`${o.omittedLines} lines omitted from summary`),o.truncatedLine&&a.push("a long line was clipped"),i>0&&a.push(`${i} duplicate lines collapsed`),e.fullOutput!==void 0&&r.trim()!==n.trim()&&a.push("filtered provider output is retained in the full log"),a.length===0)return o.text;let l=kw(r,e.provider),d=l.saved?`full redacted output: ${l.path}`:`full redacted output could not be written; attempted path: ${l.path}`;return`${o.text}
1722
+
1723
+ [provider stderr: ${a.join("; ")}; ${d}]`}function sm(t,e=500){let n=t.indexOf(`
1724
+
1725
+ [provider stderr:`),r=a=>a.replace(/\s+/gu," ").trim(),s=r(t),i=Array.from(s);if(i.length<=e)return s;if(n<0)return`${i.slice(0,e-3).join("")}...`;let o=Array.from(r(t.slice(0,n)));return o.length<=e?o.join(""):`...${o.slice(-(e-3)).join("")}`}function im(t=1e6){let e=Math.floor(t*.1),n="",r="",s=0;return{append(i){if(n.length<e&&s===0&&r===""){let a=i.slice(0,e-n.length);if(n+=a,i=i.slice(a.length),i==="")return}r+=i;let o=r.length-(t-e);o>0&&(r=r.slice(o),s+=o)},text(){return s===0?n+r:`${n}
1726
+ \u2026 ${s} characters of provider stderr dropped \u2026
1727
+ ${r}`}}}function Un(t,e){return e===""?t:`${t}:${e.includes(`
1728
+ `)?`
1729
+ `:" "}${e}`}var dm=!1,om=!1,am=0,Dw=5e3;function Qo(){return $s(Lw(),".lmctl")}function ue(){if(dm||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-am>=Dw&&(om=Fw(),am=t),om}function Pw(){let t=new Date,e=t.getTimezoneOffset(),n=e<=0?"+":"-",r=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${n}${r}:${s}`)}var js=null;function zo(t,e="",n=new WeakSet){if(/(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|credential|token|secret)/i.test(e)&&typeof t=="string")return"[REDACTED]";if(typeof t=="string")return br(t);if(Array.isArray(t))return t.map(r=>zo(r,"",n));if(t&&typeof t=="object"){if(n.has(t))return"[Circular]";n.add(t);let r={};for(let[s,i]of Object.entries(t))r[s]=zo(i,s,n);return n.delete(t),r}return t}function Mw(t){return zo(t)}function $e(t,e){if(e?.verbose){if(!dm)return}else if(!e?.always&&!ue())return;try{Uw();let n={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...Mw(t)};Nw(js,JSON.stringify(n)+`
1730
+ `)}catch{}}function Uw(){if(!js){let e=Pw().slice(0,13).replace("T","-");js=$s(Qo(),`debug-${e}.log`)}xw(Ow(js),{recursive:!0})}function We(...t){$e({event:"legacy",msg:t.join(" ")})}function Te(...t){$e({event:"legacy",msg:t.join(" ")},{verbose:!0})}function M(t){$e(t,{always:!0})}function Fw(){return jw()||$w()}function jw(){try{let t=lm($s(Qo(),"config.toml"),"utf-8");for(let e of t.split(`
1731
+ `)){let n=e.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function $w(){try{let t=lm($s(Qo(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Zo="LMCTL_SELF_SESSIONID",Hw="LMCTL_LAUNCH_SOURCE";function um(t){let e=t.CLAUDE_CODE_EXECPATH;if(e===void 0||e.length===0)return t;let n=process.platform!=="win32"&&e.toLowerCase().endsWith(".exe"),r=!n&&!Ww(e);if(!n&&!r)return t;M({event:"claude_execpath_sanitized",reason:n?"wrong_platform_exe":"missing_file",value:e,platform:process.platform});let s={...t};return delete s.CLAUDE_CODE_EXECPATH,s}function Fn(t,e){let n={...t??process.env,PWD:e};return delete n.OLDPWD,n}function Bw(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Zo]:e}}function Ee(t,e,n,r="chat"){return{...Bw(Fn(t,e),n),[Hw]:r}}var ln=class t extends Error{cancelReason;constructor(e,n){super(e),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,t.prototype)}},Z=class t{name;capabilities;injection;protocol;provider;binary;seedArgs;seedTimeoutMs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.protocol=e.protocol,this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedTimeoutMs=e.seedTimeoutMs??6e4,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let n=e?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===V?n:r)}turnOptsFor(e){return e}get seedBinary(){return this.binary}seed(e,n){return n?.signal?.aborted?Promise.resolve({success:!1,error:"seed cancelled before dispatch",errorCode:"ABORT_ERR"}):(Xw(e,{recursive:!0}),new Promise(r=>{let s;try{try{n?.onDispatch?.()}catch{}s=cm(this.binary,this.seedArgsFor(n),{cwd:e,env:Fn(n?.env,e),signal:n?.signal,stdio:["pipe","pipe","pipe"],timeout:this.seedTimeoutMs})}catch(l){return r({success:!1,error:l instanceof Error?l.message:String(l)})}let i="",o="";s.stdout?.on("data",l=>{i+=l.toString()}),s.stderr?.on("data",l=>{o+=l.toString()});let a=n?.prompt!==void 0&&this.seedStdin!==void 0?`${n.prompt}
1732
+ `:this.seedStdin;a&&s.stdin?.write(a),s.stdin?.end(),s.on("exit",(l,d)=>{if(l===0&&!d)r({success:!0});else{let u=an(o).trim(),c=an(i).trim(),m=u||c;r({success:!1,...n?.signal?.aborted?{errorCode:"ABORT_ERR"}:{},error:m?de(m,{provider:this.name}):d?`terminated by ${d}`:`exit code ${l}`})}}),s.on("error",l=>{r({success:!1,error:l.message,errorCode:l.code})})}))}resumeCommand(e,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:Fs,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,n){let r=this.turnOptsFor(n);if(r.userConfig&&Zc(r.userConfig,this.name)){let i=r.userConfig.tools[this.name];if(i?.agent)return this.runOneShotAgent(e,r,i.agent)}let s=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return s<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(s,e,r)}withTimeouts(e,n,r){let s=new AbortController,i,o,a="",l,d=r.sessionId,u,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(e),m(),s.abort(),u&&u({text:a,...l?{usage:l}:{},sessionId:d,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},m=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let p={...r,binary:this.binary,signal:s.signal,onUsage:_=>{l=_,r.onUsage?.(_)},onSessionId:_=>{_&&(d=_),r.onSessionId?.(_)},onDelta:_=>{a+=_,c(),r.onDelta?.(_)},onProgress:_=>{_.kind!=="api_retry"&&c(),r.onProgress?.(_)}},f=this.transportFn(n,p).then(_=>(m(),{..._,status:_.status??"ok"})).catch(_=>{throw m(),o==="external"?Object.assign(new ln("Turn cancelled","external"),{usage:_.usage??l,sessionId:d}):_}),g=new Promise(_=>{u=_});return Promise.race([f,g])}runOneShotAgent(e,n,r){let s=em(n.userConfig,this.name,n.sessionId,e,n.profile),i=Date.now();return new Promise((o,a)=>{let l=n.timeoutMs!==void 0&&n.timeoutMs<=0?0:tm(n.env),d=cm(s,{shell:!0,cwd:n.cwd,env:Ee(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,c=!1,m,p,f=!1,g=null,_=()=>{clearTimeout(m),m=setTimeout(()=>{!Ko(E)&&!Vo(E)&&T(g)},100)},h=l>0?setTimeout(()=>{c=!0,d.kill(),this.name==="codex"&&T(null)},l):void 0,E="",y="";if(d.stdout?.on("data",v=>{let b=v.toString();E+=b,n.onDelta?.(b),f&&!u&&_()}),d.stderr?.on("data",v=>{y+=v.toString(),f&&!u&&_()}),n.signal){if(n.signal.aborted)return clearTimeout(h),d.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>d.kill(),{once:!0})}let T=v=>{if(u)return;u=!0,clearTimeout(h),clearTimeout(m),clearTimeout(p),this.name==="codex"&&(d.stdout?.destroy(),d.stderr?.destroy());let b=Date.now()-i,S=this.name==="codex"?zc(E):{};S.usage&&n.onUsage?.(S.usage),S.sessionId&&n.onSessionId?.(S.sessionId);let R=O=>Object.assign(O,{usage:S.usage,sessionId:S.sessionId??n.sessionId});if(this.name==="codex"&&n.signal?.aborted)a(R(new ln("Turn cancelled","external")));else if(c)a(R(new Error(`Agent command timed out after ${l}ms`)));else if(v===0||v===null)o({text:E.trim(),sessionId:S.sessionId??n.sessionId,durationMs:b,...S.usage?{usage:S.usage}:{}});else{let O=y.trim();a(R(new Error(O?de(O,{provider:this.name}):`Agent command exited with code ${v}`)))}};this.name==="codex"?(d.on("close",T),d.on("exit",v=>{u||(f=!0,g=v,_(),p=setTimeout(()=>T(v),5e3))})):d.on("exit",T),d.on("error",v=>{u||(u=!0,clearTimeout(h),clearTimeout(m),clearTimeout(p),a(v))})})}};var _e=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,xt=t=>typeof t=="string"&&t.length>0&&t!=="<synthetic>"?t:null,mm=()=>({source:"wire",inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:null});function pm(t){if(!t.length)return;let e={...t[0]},n=new Set(t.map(r=>r.modelReported).filter(r=>r!==null));for(let r of t.slice(1)){for(let s of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let i=e[s],o=r[s];i!==null&&o!==null&&_e(i+o)===null&&(e.invalidCounters=!0),e[s]=i===null||o===null?null:_e(i+o)}e.invalidCounters||=r.invalidCounters,e.reason||=r.reason}return e.modelReported=n.size===1?[...n][0]:null,e.mixedModels=n.size>1,(e.invalidCounters||["inputUncached","cacheRead","cacheWrite","output"].some(r=>e[r]===null))&&(e.reason="counter_not_exposed"),e}var Ws=class{constructor(e,n){this.session=e;this.seen=n}parts=[];event(e,n){if(e.sessionId!==this.session||e.turnId!==n||!e.usage||typeof e.usage!="object")return!1;let r=e.sourceRange,s=xt(r?.first?.id),i=xt(r?.last?.id),o=xt(r?.stream?.id),a=xt(r?.stream?.kind),l=s&&i&&o&&a?JSON.stringify([this.session,a,o,s,i]):xt(e.viewCursor)?JSON.stringify([this.session,e.viewCursor]):null;if(l&&this.seen.has(l))return!1;l&&this.seen.add(l);let d=e.usage,u=_e(e.promptTokens),c=_e(d.outputTokens),m=_e(d.cacheReadTokens),p=_e(d.cacheWriteTokens),f=u===0,g=m??(f?0:null),_=p??(f?0:null),h=u!==null&&g!==null&&_!==null&&g+_<=u?u-g-_:null,E=(g??0)>0||(_??0)>0,y={...mm(),inputUncached:h,cacheRead:g,cacheWrite:_,output:c,reasoning:_e(d.reasoningTokens),modelReported:xt(e.modelId),invalidCounters:Ye([e.promptTokens,e.totalTokens,d.inputTokens,d.cachedTokens,d.cacheReadTokens,d.cacheWriteTokens,d.outputTokens,d.reasoningTokens])||E||h===null||c===null||_e(e.totalTokens)!==null&&u!==null&&c!==null&&e.totalTokens!==u+c||_e(d.reasoningTokens)!==null&&c!==null&&d.reasoningTokens>c};return this.parts.push(y),!0}usage(){return pm(this.parts)}},jn=class{constructor(e,n,r){this.session=e;this.boundary=n;this.seen=r}parts=new Map;ownershipUncertain=!1;latestSnapshot;invalidateOwnership(){this.ownershipUncertain=!0,this.latestSnapshot&&(this.latestSnapshot.invalidCounters=!0,this.latestSnapshot.reason="counter_not_exposed")}update(e,n=1/0){let r=e.filter(l=>_e(l.seq)!==null&&l.seq>this.boundary&&l.seq<=n),s=r.find(l=>l.type==="turn/start")?.data?.turn,i=new Set(r.map(l=>l.data?.turn).filter(l=>_e(l)!==null)),o=this.ownershipUncertain||i.size>1,a=new Map;for(let l of r){let d=l.data;if(!d||s!==void 0&&d.turn!==s)continue;let u=l.type==="assistant/message",c=u?d.usage:l.type==="assistant/chunk"&&d.chunk?.type==="usage"?d.chunk.usage:void 0;if(!c||typeof c!="object")continue;let m=_e(d.turn)!==null&&_e(d.step)!==null?["step",d.turn,d.step]:xt(d.message?.id)?["message",d.message.id]:["seq",l.seq],p=JSON.stringify([this.session,...m]);if(this.seen.has(p))continue;let f=a.get(p);(!f||u||!f.final)&&a.set(p,{record:l,final:u})}this.parts=new Map;for(let[l,{record:d,final:u}]of a){let c=d.data,m=u?c.usage:c.chunk.usage;this.parts.set(l,{...mm(),inputUncached:_e(m.inputTokens),cacheRead:_e(m.cacheReadTokens),output:_e(m.outputTokens),reasoning:_e(m.reasoningTokens),modelReported:xt(c.message?.source?.model),invalidCounters:o||[m.inputTokens,m.cacheReadTokens,m.outputTokens].some(p=>_e(p)===null)||Ye([m.inputTokens,m.cacheReadTokens,m.outputTokens,m.reasoningTokens])||_e(m.reasoningTokens)!==null&&_e(m.outputTokens)!==null&&m.reasoningTokens>m.outputTokens})}}lastUsage(){let e=[...this.parts.values()].at(-1);return e?{...e}:void 0}usage(){let e=pm([...this.parts.values()]);return e&&this.ownershipUncertain&&(e.invalidCounters=!0,e.reason="counter_not_exposed"),this.latestSnapshot=e,e}finish(){for(let e of this.parts.keys())this.seen.add(e)}};import{spawn as sS}from"node:child_process";import{randomBytes as iS}from"node:crypto";import{realpath as qs}from"node:fs/promises";import{createInterface as qw}from"node:readline";var Rr=class extends Error{constructor(e,n){super(e,n),this.name=this.constructor.name}},ie=class extends Rr{};var Hs=class extends Rr{rpcCode;rpcData;constructor(e,n,r){super(e),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}};function kr(t,e){let n;if(e&&typeof e=="object"){let r=e.code;typeof r=="number"&&(n=r)}return new Hs(t,n,e)}var Jw=1;function Ot(t,e){let n=e.protocol??"acp",r=qw({input:t.stdout}),s=new Map,i=(a,l={},d)=>new Promise((u,c)=>{let m=Jw++;s.set(m,{resolve:u,reject:c,onResponse:d});let p=JSON.stringify({jsonrpc:"2.0",id:m,method:a,params:l});$e({event:`${n}_send`,direction:"SEND",provider:e.provider,method:a,id:m,params:l}),t.stdin?.write(`${p}
1733
+ `)}),o=(a,l={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:a,params:l})}
1734
+ `)};return r.on("line",a=>{let l=c=>{if(!e.onProtocolError)return;let m=a.slice(0,512);M({event:`${n}_protocol_error`,provider:e.provider,reason:c,raw_preview:m,truncated:a.length>512}),e.onProtocolError(new Error(`${n.toUpperCase()} ${c}: ${JSON.stringify(m)}${a.length>512?" (truncated)":""}`))},d;try{d=JSON.parse(a)}catch{l("returned malformed JSON");return}if(!d||typeof d!="object"||Array.isArray(d)){l("returned an invalid message");return}if($e({event:`${n}_recv`,direction:"RECV",provider:e.provider,id:typeof d.id=="number"?d.id:void 0,method:typeof d.method=="string"?d.method:void 0,preview:JSON.stringify(d).slice(0,300)}),e.onEvent?.(d),typeof d.method!="string"&&typeof d.id=="number"&&s.has(d.id)){let c=s.get(d.id);s.delete(d.id);try{c.onResponse?.(d)}catch(m){c.reject(m instanceof Error?m:new Error(String(m)));return}if(d.error){let m=d.error,p=typeof m?.message=="string"&&m.message.length>0?m.message:JSON.stringify(d.error);c.reject(kr(`${n.toUpperCase()} RPC error: ${p}`,m))}else c.resolve(d);return}let u=d.method;if(!u){l("returned an uncorrelated response");return}if(typeof d.id=="number"||typeof d.id=="string"){M({event:`${n}_unhandled_request`,provider:e.provider,method:u,id:d.id,params:d.params});let c=JSON.stringify({jsonrpc:"2.0",id:d.id,error:{code:-32601,message:`Method not found: ${u} (lmctl does not implement server-side ${n.toUpperCase()} methods)`}});$e({event:`${n}_send`,direction:"SEND",provider:e.provider,replyTo:d.id,error:"method not found"}),t.stdin?.write(`${c}
1735
+ `);return}e.onNotification?.(d)}),{sendRpc:i,sendNotification:o,close(a=new ie(`${n.toUpperCase()} RPC channel closed`)){r.close();for(let l of s.values())l.reject(a);s.clear()}}}import*as ta from"node:child_process";var Gw=1e3;function Vw(t){if(typeof ta.spawnSync=="function")try{ta.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function fm(t){return t.exitCode!==null||t.signalCode!==null}function ea(t,e){return fm(t)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,t.removeListener("exit",s),n(!1))},e);t.once("exit",s)})}async function ne(t,e={}){let n=Date.now(),r=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??Vw;if(fm(t))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await ea(t,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await ea(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await ea(t,Gw)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var Kw=2e3,Bs=8*60*60*1e3,Yw=5e3,zw=1e3,Qw=50,na=Symbol("check-timed-out");async function Xs(t,e,n){if(typeof t=="boolean")return t;let r,s;try{return await Promise.race([t,new Promise(i=>{r=setTimeout(()=>i(na),e),r.unref?.(),n!==void 0&&(s=()=>i(na),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function ze(t,e){if(t===void 0){e.closeStdin();return}let n=!1,r=i=>{if(!n){n=!0;try{t.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}e.closeStdin()},s=Date.now();Zw(t,e,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function Zw(t,e,n,r){let s=t.pollMs??Kw,i=t.maxHoldMs??Bs,o=t.settleMs??Yw,a=t.backgroundGraceMs??zw,l=!1,d=null,u=c=>r({startedMs:n,held:l,reason:c});for(;;){if(e.isAborted())return u("aborted");if(e.hasChildExited())return u("child-exited");let c=i-(Date.now()-n);if(c<=0)return u("max-hold");let m;try{m=await Xs(t.hasOutstandingWork(),c,e.signal)}catch{return u("check-error")}if(m===na)return u(e.isAborted()||e.signal?.aborted===!0?"aborted":"max-hold");if(m)d=null;else{if(!l&&e.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let g=a-(Date.now()-n);await new Promise(_=>setTimeout(_,Math.max(0,Math.min(s,Qw,g))).unref?.());continue}if(!l||o<=0)return u("cleared");d===null&&(d=Date.now(),Te(`${e.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let f=Math.max(d,e.lastEventAtMs());if(!e.isTurnInFlight()&&Date.now()-f>=o)return u("cleared")}if(l||(l=!0,t.onHold?.(),Te(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return M({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-n}),u("max-hold");let p=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(f=>setTimeout(f,p).unref?.())}}function gm(t){ue()&&$e({event:"legacy",msg:`[debug] ${t}`},{always:!0})}var eS={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},tS={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};function Lt(t,e){let n=tS[t];if(n)return n[e]??n.yolo}var nS=new Set(["codex","opencode","kimi","dsh","hermes","pi","miniplayer","muse"]);function rS(t,e){if(e.length===0)return!0;for(let n=0;n+e.length<=t.length;n++){let r=!0;for(let s=0;s<e.length;s++)if(t[n+s]!==e[s]){r=!1;break}if(r)return!0}return!1}function he(t,e,n="yolo"){if(nS.has(t)){gm(`YOLO ${t} [mode=${n}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:t==="dsh"?"DSH_PERMISSION_MODE=danger-full-access env var on the sidecar spawn \u2014 no argv flag":t==="hermes"?"HERMES_YOLO_MODE=1 shell gate + ACP session/set_mode (modeId=dont_ask) edit gate":t==="pi"?"no tool-permission prompts exist in pi by design \u2014 nothing to bypass":t==="muse"?"MSP approval mode plus fixed host sandbox/write/shell posture":t==="miniplayer"?"native tools always granted; no permission mode":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?Lt(t,"plan"):eS[t];if(!r){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw M({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ie(s)}if(!rS(e,r)){let s=r.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw M({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:n,args:e.join(" "),message:i}),new ie(i)}gm(`YOLO ${t} [mode=${n}]: argv flag '${r.join(" ")}'`)}function Ir(){let t=iS(16);t.writeUIntBE(Date.now(),0,6),t[6]=t[6]&15|112,t[8]=t[8]&63|128;let e=t.toString("hex");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`}async function Js(t){if(t.signal?.aborted)throw new Error("Aborted");if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t.sessionId))throw new Error("Muse requires a native session UUID");let e=t.permissionMode==="plan",n=["serve",...e?["--disable-write","--disable-shell"]:["--disable-sandbox","--trust-workspace"],...t.model?["--model",t.model]:[]];he("muse",n,t.permissionMode??"yolo");let r=sS(t.progPath??"muse",n,{cwd:t.cwd,env:Ee(t.env,t.cwd,t.sessionId),stdio:["pipe","pipe","pipe"]}),s,i=new Set,o=new Set,a,l,d=!1,u=!1,c=!1,m=!1,p=0,f=im(),g=Date.now(),_=t.sessionId;r.stderr.setEncoding("utf8"),r.stderr.on("data",w=>{f.append(w)});let h=(w,I,C)=>{if(s===w){if(s=void 0,w.id&&o.add(w.id),I){let k=w.usage.usage()??(w.outcome?{source:null,inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:"turn_not_completed"}:void 0);Object.assign(I,{usage:k?{...k,outcome:w.outcome}:void 0,sessionId:_})}else C&&(C.usage=w.usage.usage());w.cleanup(),w.drained(),w.settled||(w.settled=!0,I?w.reject(I):(p++,w.resolve(C)))}},E=w=>{a||(a=w,s&&h(s,a),T.close(a),!m&&!d&&ne(r,{softDelayMs:t.closeTimeoutMs??2e3,killDelayMs:t.closeTimeoutMs??2e3}).catch(()=>{}))},y=(w,I)=>{let C=I.params;if(!C||C.sessionId!==_)return;let k=I.method;if(k==="view/gap"||k==="session/closed"){E(new Error(`Muse ${k}: the conversation cannot continue without reopening`));return}if(k==="turn/unqueued"&&C.turnId===w.id){w.outcome="cancelled",h(w,new ln("Muse queued turn cancelled","external"));return}k==="turn/started"&&C.turnId===w.id&&(w.queued=!1);let x=C.item,P=C.turnId??x?.turnId;if(P&&P!==w.id||k==="session/tokenUsage"&&(w.settled||C.turnId!==w.id||!w.usage.event(C,w.id)))return;w.opts.onEvent?.(I);let L={kind:"other",raw:I};if(["item/started","item/updated","item/completed"].includes(k)&&x?.turnId===w.id&&typeof x.itemId=="string"){let D=w.items.get(x.itemId);if(D&&typeof x.revision=="number"&&x.revision<=D.revision)return;w.items.set(x.itemId,{...x}),(x.kind==="toolCall"||x.kind==="userShell")&&k!=="item/updated"?L={kind:k==="item/completed"?"tool_result":"tool_use",id:x.itemId,tool:x.tool??x.kind,summary:x.failureReason??x.fallbackText,...k==="item/completed"?{status:x.status==="completed"?"ok":"error"}:{},...x.durationMs!==void 0?{elapsedMs:x.durationMs}:{},raw:I}:x.kind==="reasoning"?L={kind:"thinking",raw:I}:x.kind==="agentMessage"&&(L={kind:"text",raw:I})}else if(k==="item/delta"&&typeof C.itemId=="string"&&typeof C.delta=="string"){let D=w.items.get(C.itemId);if(!D)return;D.kind==="agentMessage"&&(C.field===void 0||C.field==="text")?(D.text=(D.text??"")+C.delta,w.cancelled||w.opts.onDelta?.(C.delta),L={kind:"text",raw:I}):D.kind==="reasoning"&&(L={kind:"thinking",raw:I})}if(w.cancelled||w.opts.onProgress?.(L),k!=="turn/completed"||C.turnId!==w.id)return;if(!["completed","failed","cancelled"].includes(C.terminal)){E(new Error(`Muse returned an unknown turn terminal: ${String(C.terminal)}`));return}if(w.cancelled||C.terminal==="cancelled"){w.outcome="cancelled",h(w,new ln("Muse turn cancelled",w.cancelled?"external":"provider"));return}if(C.terminal!=="completed"){w.outcome="error",h(w,new Error(C.error?.message??C.reason??`Muse turn ended with ${String(C.terminal)}`));return}let W=[...w.items.values()].filter(D=>D.kind==="agentMessage");h(w,void 0,{text:W.map(D=>typeof D.text=="string"?D.text:"").join(`
1736
+ `),sessionId:_,durationMs:typeof C.durationMs=="number"?C.durationMs:Date.now()-w.started,stopReason:C.terminal,...W.some(D=>D.truncated)?{warnings:["Muse reported a truncated response; inspect the native transcript for complete content"]}:{}})},T=Ot(r,{provider:"muse",protocol:"msp",onProtocolError:E,onNotification:w=>{if(g=Date.now(),w.method==="view/gap"||w.method==="session/closed"){w.params?.sessionId===_&&!d&&E(new Error(`Muse ${w.method}: session must be reopened`));return}let I=s;I&&(I.id?y(I,w):I.events.push(w))}}),v=async(w,I,C=Ir())=>(await T.sendRpc(w,{...I,commandId:C})).result,b=w=>{!w.id||w.interruptSent||s!==w||(w.interruptSent=!0,v("turn/interrupt",{sessionId:_,turnId:w.id}).catch(I=>{s===w&&E(I instanceof Error?I:new Error(String(I)))}))},S=w=>{!w.id||w.unqueueSent||s!==w||(w.unqueueSent=!0,v("turn/unqueue",{sessionId:_,turnId:w.id}).catch(I=>{let C=I instanceof Error?I.message:String(I);/already started|not queued|launch boundary|turn is running/i.test(C)?(w.queued=!1,b(w)):s===w&&E(I instanceof Error?I:new Error(C))}))},R=w=>{w.queued?S(w):b(w)};r.on("error",w=>E(new Error(`Unable to start Muse: ${w.message}`)));let O=()=>{d||m||a||c||(c=!0,ne(r,{softDelayMs:t.closeTimeoutMs??2e3,killDelayMs:t.closeTimeoutMs??2e3}).catch(w=>E(w instanceof Error?w:new Error(String(w)))))};r.stdin.on("error",O),r.stdout.on("end",O),r.on("exit",()=>{m=!0}),r.on("close",(w,I)=>{m=!0,d?T.close(new Error("Muse session closed")):E(new Error(Un(`Muse exited (${I??w}) after ${p} completed prompt(s)`,f.text().trim()?de(f.text(),{provider:"muse"}):""))),s&&h(s,new Error("Muse session closed"))});let N=()=>{if(l)return l;d=!0;let w=!!s;return s&&(s.cancelled=!0,R(s)),l=(async()=>{m||(await new Promise(I=>ze(u?t.holdOpen:void 0,{isAborted:()=>w,hasChildExited:()=>m,isTurnInFlight:()=>!!s,lastEventAtMs:()=>g,closeStdin:()=>{r.stdin.end(),I()},label:"muse"})),await ne(r,{stdinEnd:!1,softDelayMs:t.closeTimeoutMs??2e3,killDelayMs:t.closeTimeoutMs??2e3}).catch(()=>{})),s&&h(s,new Error("Muse session closed")),T.close(new Error("Muse session closed"))})(),l},A=()=>{E(new Error("Aborted")),N()};t.signal?.addEventListener("abort",A,{once:!0});try{if(t.signal?.aborted)throw new Error("Aborted");let w=(await T.sendRpc("initialize",{clientInfo:{name:"lmctl",version:"1"}})).result;if(w?.schema?.version!==1)throw new Error("Muse MSP schema version is unsupported");if(t.expectedHome&&(typeof w.museHome!="string"||await qs(w.museHome)!==await qs(t.expectedHome)))throw new Error("Muse data home does not match the configured session reader");if(w.sessionDurability!==void 0&&w.sessionDurability!=="durable")throw new Error("Muse did not provide durable sessions");T.sendNotification("initialized");let I=e?"denyUnmatched":"allowAll",k=(t.create?await v("session/start",{sessionId:_,workspaceRoot:t.cwd,approvalMode:I,...t.model?{modelId:t.model}:{}}):await v("session/resume",{sessionId:_,excludeItems:!0}))?.session;if(k?.sessionId!==_)throw new Error(`Muse did not return requested session "${_}"`);if(typeof k.workspaceRoot!="string"||await qs(k.workspaceRoot)!==await qs(t.cwd))throw new Error("Muse session belongs to a different working directory");if(k.activeTurnId||k.status!=="idle")throw new Error(`Muse session is not idle (${String(k.status)})`);if((await v("session/setApprovalMode",{sessionId:_,mode:I}))?.effectiveMode?.mode!==I)throw new Error("Muse did not apply the requested approval mode");if(!t.create&&t.model&&k.modelId!==t.model&&(await v("session/setModel",{sessionId:_,model:{modelId:t.model,...k.providerId?{providerId:k.providerId}:{}}}))?.status!=="accepted")throw new Error("Muse did not accept the requested model");u=!0}catch(w){throw await N(),a??w}finally{t.signal?.removeEventListener("abort",A)}return{provider:"muse",sessionId:_,get completedTurns(){return p},close:N,async sendTurn(w,I={}){if(s?.cancelled&&await s.drain,a)throw new Error(a.message);if(d)throw new Error("Muse session is closed");if(s)throw new Error("Muse already has an active turn");if(I.signal?.aborted)throw new Error("Aborted");return new Promise((C,k)=>{let x,P=new Promise(D=>{x=D}),L={usage:new Ws(_,i),commandId:Ir(),events:[],items:new Map,opts:I,started:Date.now(),cancelled:!1,interruptSent:!1,unqueueSent:!1,queued:!1,settled:!1,resolve:C,reject:k,drain:P,drained:x,cleanup:()=>{}};s=L;let W=()=>{L.cancelled=!0,L.settled=!0,k(Object.assign(new Error("Aborted"),{usage:L.usage.usage(),sessionId:_})),R(L)};L.cleanup=()=>I.signal?.removeEventListener("abort",W),I.signal?.addEventListener("abort",W,{once:!0}),v("turn/start",{sessionId:_,input:[{type:"text",text:w}],...t.effort?{reasoningEffort:t.effort}:{}},L.commandId).then(D=>{if(s===L){if(D?.commandId!==L.commandId||D.status!=="accepted"||!["started","queued"].includes(D.disposition)||typeof D.turnId!="string"||D.turnId.length===0||o.has(D.turnId)){E(new Error("Muse did not admit a fresh turn; refusing ambiguous dispatch"));return}L.id=D.turnId,L.queued=D.disposition==="queued",L.cancelled&&R(L);for(let ae of L.events)s===L&&y(L,ae);L.events=[]}},D=>{s===L&&h(L,D instanceof Error?D:new Error(String(D)))})})}}}function sa(t={}){let e=zr(t.museDataHome),n=s=>({...s??process.env,XDG_DATA_HOME:e}),r=async(s,i)=>{if(i.bundleSession)return ut(i.bundleSession,"muse",i.sessionId,s,i);let o=i.sessionId||Ir(),a=await Js({...i,sessionId:o,create:i.sessionId==="",env:n(i.env),expectedHome:ra(e,"muse")});try{return await a.sendTurn(s,i)}finally{await a.close()}};return new class extends Z{constructor(){super({provider:new Yr({museDataHome:e}),protocol:{transport:"muse-msp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"muse",seedArgs:[],startTemplate:"muse",resumeTemplate:"muse resume {{session_id}}",transport:r})}openSession(s){return Js({...s,env:n(s.env),expectedHome:ra(e,"muse")})}async seed(s,i){await oS(s,{recursive:!0});let o=Ir(),a,l;try{a=await Js({sessionId:o,cwd:s,create:!0,env:n(i?.env),signal:i?.signal,expectedHome:ra(e,"muse"),model:i?.model,effort:i?.effort}),i?.signal?.throwIfAborted();try{i?.onDispatch?.()}catch{}let d=await a.sendTurn(i?.prompt??V,{signal:i?.signal});if(l=d.usage,await a.close(),!await this.load(o))throw new Error("Muse seed did not persist a readable native session");return{success:!0,sessionId:o,usage:d.usage}}catch(d){return{success:!1,sessionId:o,usage:d?.usage??l,error:`Muse seed failed: ${d instanceof Error?d.message:String(d)}`}}finally{await a?.close()}}}}import{spawn as Em}from"node:child_process";import{existsSync as vm}from"node:fs";function hm(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let n=0;n<t.length;n++)n===0?e.push(t[n]):e.push(`
1737
+
1738
+ --- additional response (turn ${n+1} of ${t.length}; likely an injected mid-call notification) ---
1739
+
1740
+ `+t[n]);return e.join("")}function Gs(t={}){let e=[],n="",r=!1,s=t.usageState,i,o=new Set,a=t.resultIds??s?.resultIds??new Set,l=u=>typeof u=="number"&&Number.isSafeInteger(u)&&u>=0?u:null,d=(u,c)=>u===null||c===null?null:u+c;return{processLine(u){if(!u.trim())return;let c;try{c=JSON.parse(u)}catch{return}let m=oa(c,n||s?.sessionId||t.sessionId||"");if(m&&a.has(m))return;m&&a.add(m),t.onEvent?.(c);let p=c.type;if(p==="system"&&c.subtype==="init"&&(n=c.session_id||n,s&&(_m(s,n),typeof c.model=="string"&&(s.model=c.model))),p==="assistant"){let f=c.message;typeof f?.model=="string"&&f.model!=="<synthetic>"&&o.add(f.model);let g=f?.content;if(Array.isArray(g))for(let _ of g)_.type==="text"&&_.text&&t.onText?.(_.text)}if(p==="result"&&(r=!0,e.push(c),s)){_m(s,typeof c.session_id=="string"?c.session_id:n);let f=c.usage,g=c.total_cost_usd,_=typeof g=="number"&&Number.isFinite(g)&&g>=0,h=s.cost,E=_&&h!==null&&g>=h?g-h:null;if(s.cost=_?g:null,f&&typeof f=="object"){let y=f.cache_creation,T=l(f.cache_creation_input_tokens),v=Io({cacheWrite5m:y?.ephemeral_5m_input_tokens,cacheWrite1h:y?.ephemeral_1h_input_tokens},T),b=f.output_tokens_details,S={source:"wire",inputUncached:l(f.input_tokens),cacheRead:l(f.cache_read_input_tokens),cacheWrite:l(f.cache_creation_input_tokens),output:l(f.output_tokens),reasoning:l(b?.thinking_tokens),modelReported:null,providerCostUsd:E,reason:E===null?"cumulative_only":null,cacheWrite5m:v?.five??null,cacheWrite1h:v?.one??null,invalidCounters:Ye([f.input_tokens,f.cache_read_input_tokens,f.cache_creation_input_tokens,f.output_tokens,b?.thinking_tokens])};if([S.inputUncached,S.cacheRead,S.cacheWrite,S.output].includes(null)&&(S.reason="counter_not_exposed"),!i)i=S;else{for(let R of["inputUncached","cacheRead","cacheWrite","output","reasoning","cacheWrite5m","cacheWrite1h","providerCostUsd"])i[R]=d(i[R]??null,S[R]??null);i.reason=i.reason||S.reason,i.invalidCounters||=S.invalidCounters}}}},usage(){if(i)return{...i,modelReported:o.size>1?null:[...o][0]??s?.model??null,mixedModels:o.size>1}},sawResult(){return r},finalize(){if(!r)return null;let u=ym(e),c=hm(u.resultTexts);return{result:c,usage:this.usage(),sessionId:u.sessionId||n||t.sessionId||"",durationMs:u.durationMs,numTurns:u.numTurns,isError:u.isError&&c.trim().length===0,errorMessage:u.errorMessage}}}}function ym(t){let e=[],n=0,r=0,s="",i=!1,o;for(let a of t){e.push(a.result||"");let l=a.duration_ms;typeof l=="number"&&Number.isFinite(l)&&(n+=l);let d=a.num_turns;typeof d=="number"&&Number.isFinite(d)&&(r=d);let u=a.session_id;if(typeof u=="string"&&u&&(s=u),a.is_error===!0){i=!0;let c=a.errors,m=Array.isArray(c)?c.filter(f=>typeof f=="string").join("; "):void 0,p=typeof a.subtype=="string"?a.subtype:"unknown";o=m&&m.length>0?m:`result subtype=${p} (no error detail provided)`}}return{resultTexts:e,durationMs:n,numTurns:r,sessionId:s,isError:i,errorMessage:o}}function ia(t){return{cost:t?null:0,model:null,sessionId:null,resultIds:new Set}}function _m(t,e){e&&(t.sessionId!==null&&t.sessionId!==e&&(t.cost=null,t.model=null),t.sessionId=e)}function oa(t,e=""){return t.type==="result"&&typeof t.uuid=="string"&&t.uuid.length>0?JSON.stringify([typeof t.session_id=="string"?t.session_id:e,t.uuid]):null}import{join as Vs}from"node:path";import{readdir as aS}from"node:fs/promises";var lS={claude:"claude",qwen:"qwen"};function wm(){let t=process.env.LMCTL_RESULT_GRACE_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return 72e5;let e=Number(t);return Number.isFinite(e)&&e>0?e:72e5}function Sm(){let t=process.env.LMCTL_TOOL_USE_GRACE_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return 27e5;let e=Number(t);return Number.isFinite(e)&&e>0?e:27e5}function bm(t){let n=t.message?.content;return Array.isArray(n)?n.some(r=>r?.type==="tool_use"):!1}function dS(t){let e=t.stderr.trim(),n=`lmctl: ${t.tool} exited with code ${t.exitCode} before returning a final result event.
1741
+ One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return e?`Original provider error:
1742
+ ${de(e,{provider:t.tool})}
1743
+
1744
+ ${n}`:n}var uS={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]};function Rm(t){let e=t.tool||"claude",n=t.binaryPath||lS[e]||"claude",r=["-p","","--output-format","stream-json","--input-format","stream-json"];e==="claude"&&r.push("--verbose"),t.sessionId&&r.push("--resume",t.sessionId),t.model&&r.push("--model",t.model);let s=t.permissionMode??"yolo",i=Lt(e,s)??uS[e]??["--dangerously-skip-permissions"];if(r.push(...i),he(e,r,s),t.cwd&&!vm(t.cwd))throw M({event:"transport_error",provider:e,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),new ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});let o=Ee(t.env,t.cwd,t.sessionId);return{tool:e,binary:n,args:r,spawnEnv:e==="claude"?um(o):o}}function km(t,e){return new Promise((n,r)=>{let s=Date.now(),i,o,a,l;try{({tool:i,binary:o,args:a,spawnEnv:l}=Rm(e))}catch($){return r($ instanceof Error?$:new Error(String($)))}let d=Em(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:l});d.stdin?.on("error",$=>{Te(`stream-json: stdin pipe error, ignored (exit handler reports): ${$.message}`)});let u=!1;if(e.signal){if(e.signal.aborted)return u=!0,M({event:"transport_abort",provider:i,phase:"pre_spawn"}),ne(d).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,M({event:"transport_abort",provider:i}),ne(d).catch(()=>{}),r(Object.assign(new Error("Aborted"),{usage:P.usage()}))},{once:!0})}let c="",m=!1,p=!1,f=0,g=!1,_="",h="",E,y,T=null,v=null,b=!1,S=!1,R=wm(),O=Sm();function N(){E!==void 0&&(clearTimeout(E),E=void 0)}function A(){y!==void 0&&(clearTimeout(y),y=void 0)}let w=null;function I(){return m||u||P.sawResult()}function C($){return $==="text_done"?R:O}async function k($){if($==="text_done"?E=void 0:y=void 0,I()||T!==null)return;w??=Date.now();let K=C($);if(e.holdOpen){let Xt=(e.holdOpen.maxHoldMs??Bs)-(Date.now()-w),qi=Xt>0?await Xs(Promise.resolve(e.holdOpen.hasOutstandingWork()).catch(()=>!1),Xt,e.signal):!1;if(I()||($==="text_done"?E!==void 0:y!==void 0))return;if(qi===!0){M({event:"transport_stall_grace_deferred",provider:i,grace_kind:$,grace_ms:K,reason:"outstanding_dispatched_work"}),x($);return}}v=$,T=$==="text_done"?`${i} finished responding but never emitted its closing result event (${K}ms of silence after its last message)`:`${i} went silent mid-turn and never emitted its closing result event (${K}ms of silence)`,M({event:"transport_stall_grace_fired",provider:i,grace_kind:$,grace_ms:K}),ne(d).catch(()=>{})}function x($){let K=setTimeout(()=>{k($)},C($));K.unref?.(),$==="text_done"?(N(),E=K):(A(),y=K)}let P=Gs({usageState:i==="claude"?ia(!!e.sessionId):void 0,onEvent:$=>{f=Date.now(),g=$.type!=="result",$.type==="system"&&$.subtype==="init"&&(h=$.session_id||h),$.type==="assistant"?(b=!bm($),S=b&&$.message?.stop_reason==="pause_turn"):($.type==="result"||$.type==="user")&&(b=!1,S=!1),N(),i==="claude"&&b&&!S&&!P.sawResult()&&x("text_done"),A(),i==="claude"&&!P.sawResult()&&x("tool_use_silence"),e.onEvent?.($)},onText:$=>{_+=$,e.onText?.($)}});function L(){p||(p=!0,ze(e.holdOpen,{isAborted:()=>u,hasChildExited:()=>m,isTurnInFlight:()=>g,lastEventAtMs:()=>f,closeStdin:()=>{d.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function W($){let K=P.sawResult();P.processLine($);let ve=P.usage();ve&&e.onUsage?.(ve),!K&&P.sawResult()&&L()}d.stdout?.on("data",$=>{c+=$.toString();let K=c.split(`
1745
+ `);c=K.pop()||"";for(let ve of K)W(ve)});let D="";d.stderr?.on("data",$=>{D+=$.toString()}),d.on("error",$=>{M({event:"transport_error",provider:i,error_class:"TransportConnectionError",error_message:$.message}),r(new ie(`Failed to spawn ${o}: ${$.message}`,{cause:$}))}),d.on("exit",$=>{if(m=!0,N(),A(),u)return;c.trim()&&W(c);let K=P.finalize();if(K?.isError)M({event:"transport_error",provider:i,error_class:"Error",reason:"provider_result_error",error_message:K.errorMessage}),r(Object.assign(new Error(`${i} reported an error for this turn (no assistant output)`+(e.sessionId?` \u2014 session=${e.sessionId}`:"")+`: ${K.errorMessage??"unknown error"}`),{usage:K.usage,sessionId:K.sessionId}));else if(K)Te(`stream-json: result ${K.result.slice(0,80)}${K.result.length>80?"...":""} (${K.durationMs}ms)`),n({result:K.result,sessionId:K.sessionId,durationMs:K.durationMs,numTurns:K.numTurns,usage:K.usage,exitCode:$});else if(T!==null&&v==="text_done"&&_.trim().length>0)M({event:"transport_stall_finalized",provider:i,reason:T,text_len:_.length}),n({result:_,sessionId:h||e.sessionId||"",durationMs:Date.now()-s,numTurns:1,exitCode:$,warnings:[T]});else if(T!==null&&v==="tool_use_silence"){let ve=D.trim()?`
1746
+ ${de(D,{provider:i})}`:"",Xt=`${T} \u2014 a tool call was still in flight, so any streamed text is incomplete mid-turn narration, not a real answer`+(e.sessionId?` (session=${e.sessionId})`:"")+ve;M({event:"transport_error",provider:i,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:$,stderr_summary:Xt}),r(new Error(Xt))}else{let ve=T!==null?`${T} \u2014 and produced no usable content to fall back on`+(e.sessionId?` (session=${e.sessionId})`:"")+(D.trim()?`
1747
+ ${de(D,{provider:i})}`:""):dS({tool:i,exitCode:$,stderr:D});M({event:"transport_error",provider:i,error_class:"Error",reason:T!==null?"provider_stalled_no_content":"provider_no_result",exit_code:$,stderr_summary:ve}),r(new Error(ve))}});let ae=JSON.stringify({type:"user",message:{role:"user",content:t}});d.stdin?.write(ae+`
1748
+ `),Te(`stream-json: prompt sent (${t.length} chars)`)})}function cS(t){return t==="qwen"?[Vs(J,".qwen","projects")]:[Vs(J,".claude","projects")]}async function Tm(t,e,n){let r=n??cS(t),s=null;for(let a of r){let l;try{l=await aS(a)}catch{continue}for(let d of l){for(let u of[Vs(a,d,`${e}.jsonl`),Vs(a,d,"chats",`${e}.jsonl`)])if(vm(u)){s=u;break}if(s!==null)break}if(s!==null)break}if(s===null)throw new Error(`stream-json bundle: no session file for session "${e}" under ${r.join(", ")} \u2014 the session must exist on disk before a bundle can resume it`);let o=(await Fe(s,5).catch(()=>[])).map(a=>a?.sessionId).find(a=>typeof a=="string"&&a.length>0);if(o!==e)throw new Error(`stream-json bundle: session file ${s} header does not match the requested session (expected "${e}", header carries ${o??"no sessionId"}) \u2014 the session was likely re-seeded externally; aborting instead of writing into the wrong session`)}async function Im(t){let{tool:e,binary:n,args:r,spawnEnv:s}=Rm(t),i=Em(n,r,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:s}),o=Date.now();i.stdin?.on("error",U=>{Te(`stream-json bundle: stdin pipe error, ignored (exit handler reports): ${U.message}`)});let a={exited:!1,exitCode:null,lastEventAtMs:0,turnActive:!1,completedTurns:0,closed:!1,closing:null},l=t.sessionId||"",d=e==="claude"?ia(!!t.sessionId):void 0,u=d?.resultIds??new Set,c=null,m="";i.stderr?.on("data",U=>{m+=U.toString()});let p="",f="",g=!1,_=!1,h=null,E=null,y=null,T,v,b=wm(),S=Sm(),R=null,O=[],N=()=>a.exited?Promise.resolve():new Promise(U=>{O.push(U)}),A=()=>new Error(`stream-json bundle process (${e}) exited${a.exitCode!==null?` with code ${a.exitCode}`:""} after ${a.completedTurns} completed prompt(s); the bundle cannot continue`);function w(){T!==void 0&&(clearTimeout(T),T=void 0)}function I(){v!==void 0&&(clearTimeout(v),v=void 0)}function C(){return a.exited||R===null||R.aborted||R.processor.sawResult()}function k(U){return U==="text_done"?b:S}async function x(U){if(U==="text_done"?T=void 0:v=void 0,C()||h!==null)return;y??=Date.now();let H=k(U);if(t.holdOpen){let we=(t.holdOpen.maxHoldMs??Bs)-(Date.now()-y),_n=we>0?await Xs(Promise.resolve(t.holdOpen.hasOutstandingWork()).catch(()=>!1),we,void 0):!1;if(C()||(U==="text_done"?T!==void 0:v!==void 0))return;if(_n===!0){M({event:"transport_stall_grace_deferred",provider:e,grace_kind:U,grace_ms:H,reason:"outstanding_dispatched_work"}),P(U);return}}E=U,h=U==="text_done"?`${e} finished responding but never emitted its closing result event (${H}ms of silence after its last message)`:`${e} went silent mid-turn and never emitted its closing result event (${H}ms of silence)`,M({event:"transport_stall_grace_fired",provider:e,grace_kind:U,grace_ms:H}),ne(i).catch(()=>{})}function P(U){let H=setTimeout(()=>{x(U)},k(U));H.unref?.(),U==="text_done"?(w(),T=H):(I(),v=H)}let L=!1,W,D,ae=new Promise((U,H)=>{W=U,D=H});ae.catch(()=>{});let $=setTimeout(()=>{L||(L=!0,D(new Error(`stream-json bundle: ${e} emitted no init event within the open timeout \u2014 cannot verify the resumed session identity`)))},t.closeTimeoutMs!==void 0?Math.max(t.closeTimeoutMs,5e3):3e4);$.unref?.();function K(U){L||(L=!0,clearTimeout($),U?D(U):W())}let ve="";function Xt(U){if(a.lastEventAtMs=Date.now(),U.type==="system"&&U.subtype==="init"){if(d&&typeof U.model=="string"&&(d.model=U.model),f=U.session_id||f,t.sessionId&&typeof U.session_id=="string"&&U.session_id.length>0&&U.session_id!==t.sessionId){let se=new Error(`stream-json bundle: provider resumed a different session (init reported "${U.session_id}", expected "${t.sessionId}")`);K(se),ne(i).catch(()=>{});return}K()}let H=R?.processor.sawResult()??!0;U.type==="assistant"?(g=!bm(U),_=g&&U.message?.stop_reason==="pause_turn"):(U.type==="result"||U.type==="user")&&(g=!1,_=!1),w(),e==="claude"&&a.turnActive&&g&&!_&&!H&&P("text_done"),I(),e==="claude"&&a.turnActive&&!H&&P("tool_use_silence")}function qi(){let U=R;if(U===null)return;let H=U.processor.finalize();if(H!==null){if(R=null,a.turnActive=!1,w(),I(),H.isError){M({event:"transport_error",provider:e,error_class:"Error",reason:"provider_result_error",error_message:H.errorMessage}),U.reject(Object.assign(new Error(`${e} reported an error for this turn (no assistant output)`+(t.sessionId?` \u2014 session=${t.sessionId}`:"")+`: ${H.errorMessage??"unknown error"}`),{usage:H.usage,sessionId:H.sessionId}));return}a.completedTurns+=1,l=H.sessionId||l,Te(`stream-json bundle: result ${H.result.slice(0,80)}${H.result.length>80?"...":""} (${H.durationMs}ms)`),U.resolve({result:H.result,sessionId:H.sessionId||l,durationMs:H.durationMs,numTurns:H.numTurns,usage:H.usage})}}function Kl(U){if(!U.trim())return;let H;try{H=JSON.parse(U)}catch{return}let se=oa(H,f||l);if(se&&u.has(se))return;let we=R;if(we===null&&se&&(u.add(se),d&&(d.cost=null)),Xt(H),we!==null){let _n=we.processor.sawResult();we.processor.processLine(U),we.onEventForward?.(H),!_n&&we.processor.sawResult()&&qi()}}i.stdout?.on("data",U=>{ve+=U.toString();let H=ve.split(`
1749
+ `);ve=H.pop()||"";for(let se of H)Kl(se)}),i.on("error",U=>{if(c=new ie(`Failed to spawn ${n}: ${U.message}`,{cause:U}),M({event:"transport_error",provider:e,error_class:"TransportConnectionError",error_message:U.message}),K(c),R!==null){let H=R;R=null,a.turnActive=!1,H.reject(c)}}),i.on("exit",U=>{a.exited=!0,a.exitCode=U,w(),I(),ve.trim()&&Kl(ve),K(a.exited&&!L?new Error(`stream-json bundle: ${e} exited (code ${String(U)}) before its init event`):void 0);let H=R;if(H!==null&&(R=null,a.turnActive=!1,!H.aborted))if(h!==null&&E==="text_done"&&p.trim().length>0)M({event:"transport_stall_finalized",provider:e,reason:h,text_len:p.length}),H.resolve({result:p,sessionId:f||t.sessionId||"",durationMs:Date.now()-H.startMs,numTurns:1,warnings:[h]});else if(h!==null&&E==="tool_use_silence"){let se=m.trim()?de(m,{provider:e}):"";M({event:"transport_error",provider:e,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:U,...se?{stderr_summary:se}:{}}),H.reject(new Error(`${h} \u2014 a tool call was still in flight, so any streamed text is incomplete mid-turn narration, not a real answer`+(t.sessionId?` (session=${t.sessionId})`:"")+(se?`
1750
+ ${se}`:"")))}else{let se=A(),we=m.trim()?de(m,{provider:e}):"";M({event:"transport_error",provider:e,error_class:"Error",reason:h!==null?"provider_stalled_no_content":"provider_no_result",exit_code:U,...we?{stderr_summary:we}:{}}),H.reject(we?new Error(`${se.message}
1751
+ ${we}`):se)}for(let se of O.splice(0))se()});try{t.sessionId&&await Tm(e,t.sessionId,t.sessionFileRoots),await ae}catch(U){let H=c??(U instanceof Error?U:new Error(String(U))),se=t.closeTimeoutMs??2e3;throw await ne(i,{softDelayMs:Math.min(1e3,se),killDelayMs:Math.min(1e3,se)}).catch(()=>{}),H}let T_=U=>new Promise(H=>{setTimeout(H,U).unref?.()});return{tool:e,get sessionId(){return l},get completedTurns(){return a.completedTurns},async sendTurn(U,H={}){if(a.closed||a.closing!==null)throw new Error(`stream-json bundle session (${e}) is closed`);if(a.exited)throw A();if(R!==null)throw new Error(`stream-json bundle session (${e}) has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending`);let se=()=>(a.closed=!0,ne(i).catch(()=>{}),new Error("Aborted"));if(H.signal?.aborted)throw se();if(t.sessionId&&(await Tm(e,t.sessionId,t.sessionFileRoots),a.exited))throw A();if(H.signal?.aborted)throw se();return p="",g=!1,_=!1,h=null,E=null,y=null,new Promise((we,_n)=>{let Yl=Gs({usageState:d,resultIds:u,sessionId:f||l,onText:zl=>{p+=zl,H.onText?.(zl)}}),Ji={processor:Yl,resolve:we,reject:_n,startMs:Date.now(),aborted:!1,onEventForward:H.onEvent};R=Ji,a.turnActive=!0;let E_=()=>{Ji.aborted=!0,M({event:"transport_abort",provider:e}),a.closed=!0,ne(i).catch(()=>{}),R===Ji&&(R=null,a.turnActive=!1),_n(Object.assign(new Error("Aborted"),{usage:Yl.usage()}))};H.signal?.addEventListener("abort",E_,{once:!0});let v_=JSON.stringify({type:"user",message:{role:"user",content:U}});i.stdin?.write(`${v_}
1752
+ `),Te(`stream-json bundle: prompt sent (${U.length} chars)`)})},close(){return a.closing!==null||(a.closing=(async()=>{if(a.closed=!0,!a.exited&&(t.holdOpen!==void 0?await new Promise(U=>{ze(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>a.exited,isTurnInFlight:()=>a.turnActive,lastEventAtMs:()=>a.lastEventAtMs,closeStdin:()=>{i.stdin?.end(),U()},label:e})}):i.stdin?.end(),!a.exited)){let U=t.closeTimeoutMs??2e3;await Promise.race([N(),T_(U)]),a.exited||await ne(i,{stdinEnd:!1,softDelayMs:Math.min(1e3,U),killDelayMs:Math.min(1e3,U)}).catch(()=>{})}})()),a.closing}}}import{spawn as Nm}from"node:child_process";import{createInterface as xm}from"node:readline";import{existsSync as pS,readFileSync as fS}from"node:fs";import{fileURLToPath as gS}from"node:url";function aa(t={}){return[]}function la(t){return t==="plan"?"read-only":"danger-full-access"}function Am(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function Ks(){return{agentItems:new Map,resultText:""}}function $n(t,e,n,r){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),n?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,n?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(r&&typeof o.text=="string"&&o.text!==a.buffer){let d=typeof i?.threadId=="string"?i.threadId:void 0,u=typeof i?.turnId=="string"?i.turnId:void 0;r({itemId:o.id,threadId:d,turnId:u,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function Ys(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function Cm(t){let e=t.params,n=e?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function zs(){return{pendingCodexError:null}}function Qs(t,e){let n=Cm(t);return n.willRetry||(e.pendingCodexError=n.turnError),n}function Zs(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let r=t.params?.turn;if((typeof r?.status=="string"?r.status:void 0)==="failed"){let i=r?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var _S=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(fS(gS(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})();function Om(){return Am(_S)}function Dt(t,e){Te(`[codex:${t}] ${JSON.stringify(e)}`)}function hS(t){let e=t.stderr.trim(),n=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1753
+ One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
1754
+ ${de(e,{provider:"codex"})}
1755
+
1756
+ ${n}`:n}function Lm(t){let e=t.binaryPath||"codex",n=["app-server","--listen","stdio://"];t.model&&n.push("-c",`model=${JSON.stringify(t.model)}`);let r=t.isLead??t.alias?.toLowerCase()==="lead",s=r?aa():[];n.push(...s),ue()&&We(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:r,injected:s.length>0}));let i=t.permissionMode??"yolo",o=la(i);if(he("codex",n,i),t.cwd&&!pS(t.cwd))throw M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),new ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:e,codexArgs:n,sandbox:o,permissionMode:i,spawnEnv:Ee(t.env,t.cwd,t.threadId)}}function Dm(t,e){let n=e.result;if(n?.thread?.id){t.reportModel(n.thread.id,n.model);for(let r of n.thread.turns??[])t.remember(n.thread.id,r.id)}}function Pm(t,e){return new Promise((n,r)=>{let s,i,o;try{({binary:s,codexArgs:i,sandbox:o}=Lm(e))}catch(N){return r(N instanceof Error?N:new Error(String(N)))}let a=Nm(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ee(e.env,e.cwd,e.threadId)}),l=Go(),d=l.turn(e.threadId||""),u=N=>Object.assign(N,{usage:d.usage(),sessionId:g}),c=!1;if(e.signal){if(e.signal.aborted)return c=!0,M({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),ne(a).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,M({event:"transport_abort",provider:"codex"}),ne(a).catch(()=>{}),r(u(new Error("Aborted")))},{once:!0})}let m=xm({input:a.stdout}),p=new Map,f=1,g=e.threadId||"",_="",h=!1,E=!1,y=Date.now(),T=Ks(),v=zs();function b(N,A={}){return new Promise((w,I)=>{let C=f++;p.set(C,{resolve:w,reject:I});let k=JSON.stringify({jsonrpc:"2.0",id:C,method:N,params:A});a.stdin?.write(k+`
1757
+ `)})}function S(N,A={}){let w=JSON.stringify({jsonrpc:"2.0",method:N,params:A});a.stdin?.write(w+`
1758
+ `)}m.on("line",N=>{let A;try{A=JSON.parse(N)}catch{return}if(typeof A.id=="number"&&p.has(A.id)){Dm(l,A);let k=p.get(A.id);if(p.delete(A.id),A.error){let x=A.error,P=typeof x?.message=="string"&&x.message.length>0?x.message:JSON.stringify(A.error);k.reject(kr(`codex app-server error: ${P}`,x))}else k.resolve(A);e.onEvent?.(A);return}let w=A.method;if(!w){e.onEvent?.(A);return}if(c||!d.event(A))return;let I=d.usage();if(I&&e.onUsage?.(I),w==="thread/started"){let x=A.params?.thread;x?.id&&(g=x.id,e.onSessionId?.(g))}let C=ue()?k=>{Dt("item.text/buffer-mismatch",{itemId:k.itemId,threadId:k.threadId??null,turnId:k.turnId??null,expectedFromItemText:k.expectedFromItemText,gotFromBuffer:k.gotFromBuffer,expectedLen:k.expectedFromItemText.length,gotLen:k.gotFromBuffer.length})}:void 0;if(w==="turn/started"){let k=A.params,x=k?.turn;x?.id&&(_=x.id),$n(A,T,e.onDelta,C),ue()&&Dt("turn/started",{params:k??null})}if(ue()&&(w==="item/started"||w==="item/completed")){let k=A.params;k?.item?.type==="agentMessage"&&Dt(w,{params:k??null})}if(w==="item/started"||w==="item/agentMessage/delta"||w==="item/completed"){if(w==="item/agentMessage/delta"){let k=A.params;ue()&&Dt("agentMessage/delta",{params:k??null})}$n(A,T,e.onDelta,C)}if(w==="turn/completed"){d.finish();let k=A.params;if(ue())for(let[P,L]of T.agentItems.entries())L.buffer&&Dt("turn/completed/unflushed-item",{itemId:P,phase:L.phase,bufferLen:L.buffer.length});Ys(T),ue()&&Dt("turn/completed",{params:k??null});let x=Zs(A,v);x.shouldReject?(ue()&&Dt("turn/completed/terminal-reject",{message:x.turnError.message}),E=!0,h=!0,a.stdin?.end(),r(u(x.turnError))):(h=!0,a.stdin?.end())}if(w==="error"){let k=Qs(A,v);if(ue()){let x=A.params,P=x?.error,L=typeof P?.message=="string"?P.message:"(no message)";Dt(k.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:k.willRetry,params:x??null})}}e.onEvent?.(A)});let R="";a.stderr?.on("data",N=>{R+=N.toString()});let O=N=>{M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:N.message});let A=new ie(`Failed to spawn codex app-server: ${N.message}`,{cause:N});for(let w of p.values())w.reject(u(A));p.clear(),r(u(A))};a.on("error",O),a.stdin?.on("error",O),a.on("exit",N=>{if(c||E)return;if(h){n({result:T.resultText,usage:d.usage(),threadId:g,turnId:_,durationMs:Date.now()-y,exitCode:N});return}if(v.pendingCodexError){r(u(v.pendingCodexError));return}let A=hS({exitCode:N,stderr:R});M({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:N,stderr_summary:A}),r(u(new Error(A)))}),(async()=>{try{if(await b("initialize",Om()),S("initialized",{}),e.threadId)try{let N=b("thread/resume",{threadId:e.threadId,sandbox:o,approvalPolicy:"never",...e.model?{model:e.model}:{}}),A,w=new Promise((I,C)=>{A=setTimeout(()=>C(new Error("resume timeout")),3e4)});try{let C=(await Promise.race([N,w])).result?.thread?.id;if(e.requireResume&&C!==e.threadId)throw new Error(`thread/resume did not return the requested thread "${e.threadId}" (got "${C??"unknown"}")`)}finally{clearTimeout(A)}g=e.threadId,e.onSessionId?.(g)}catch(N){if(e.requireResume)throw N;process.stderr.write(`[codex] thread/resume failed, creating new thread
1759
+ `),M({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:N instanceof Error?N.message:String(N)});let w=(await b("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:o,...e.model?{model:e.model}:{}})).result?.thread;w?.id&&(g=w.id,e.onSessionId?.(g))}else{let A=(await b("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:o,...e.model?{model:e.model}:{}})).result?.thread;A?.id&&(g=A.id,e.onSessionId?.(g))}d=l.turn(g),await b("turn/start",{threadId:g,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(N){ne(a).catch(()=>{}),r(N instanceof Error?N:new Error(String(N)))}})()})}async function Mm(t){let{binary:e,codexArgs:n,sandbox:r}=Lm(t),s=Nm(e,n,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ee(t.env,t.cwd,t.threadId)}),i=Date.now(),o={exited:!1,exitCode:null,completedTurns:0,closed:!1,closing:null},a=t.threadId||"",l=Go(),d=null,u="";s.stderr?.on("data",A=>{u+=A.toString()});let c=xm({input:s.stdout}),m=new Map,p=1;function f(A,w={}){return new Promise((I,C)=>{let k=p++;m.set(k,{resolve:I,reject:C});let x=JSON.stringify({jsonrpc:"2.0",id:k,method:A,params:w});s.stdin?.write(x+`
1760
+ `)})}function g(A,w={}){let I=JSON.stringify({jsonrpc:"2.0",method:A,params:w});s.stdin?.write(I+`
1761
+ `)}let _=[],h=()=>o.exited?Promise.resolve():new Promise(A=>{_.push(A)}),E=()=>new Error(`codex bundle process exited${o.exitCode!==null?` with code ${o.exitCode}`:""} after ${o.completedTurns} completed prompt(s); the bundle cannot continue`),y=null,T=null,v,b,S=A=>{A.turnId&&f("turn/interrupt",{threadId:a,turnId:A.turnId}).catch(()=>{})};function R(A){let w=y;w===null||w.settled||(w.settled=!0,y=null,w.usage.finish(),A&&w.reject(Object.assign(A,{usage:w.usage.usage(),sessionId:a})))}c.on("line",A=>{let w;try{w=JSON.parse(A)}catch{return}if(typeof w.id=="number"&&m.has(w.id)){Dm(l,w);let L=m.get(w.id);if(m.delete(w.id),w.error){let W=w.error,D=typeof W?.message=="string"&&W.message.length>0?W.message:JSON.stringify(w.error);L.reject(kr(`codex app-server error: ${D}`,W))}else L.resolve(w);y?.onEvent?.(w);return}let I=w.method;if(!I){y?.onEvent?.(w);return}if(I==="thread/started"){let W=w.params?.thread;W?.id&&(a=W.id,t.onSessionId?.(a))}let C=w.params,k=C?.turnId??C?.turn?.id;if(T&&(I==="turn/started"&&!T.turnId&&k&&(T.usage.bind(k),T.usage.finish(),T.turnId=k,S(T)),I==="turn/completed"&&k===T.turnId&&(l.remember(a,k),T=null,b?.()),I.startsWith("turn/")||I.startsWith("item/")||I==="error"))return;let x=y;if(k&&x?.turnId&&k!==x.turnId||x!==null&&!x.usage.event(w))return;let P=x?.usage.usage();if(P&&x?.onUsage?.(P),I==="turn/started"&&x!==null){let W=w.params?.turn;W?.id&&(x.turnId=W.id),$n(w,x.agentState,x.onDelta,void 0)}if(x!==null&&(I==="item/started"||I==="item/agentMessage/delta"||I==="item/completed")&&$n(w,x.agentState,x.onDelta,void 0),I==="turn/completed"&&x!==null&&!x.settled){Ys(x.agentState);let L=Zs(w,x.turnState);x.settled=!0,x.usage.finish(),y=null,L.shouldReject?x.reject(Object.assign(L.turnError,{usage:x.usage.usage(),sessionId:a})):(o.completedTurns+=1,x.resolve({text:x.agentState.resultText,usage:x.usage.usage(),sessionId:a,turnId:x.turnId,durationMs:Date.now()-x.startMs}))}I==="error"&&x!==null&&Qs(w,x.turnState),x?.onEvent?.(w)});let O=A=>{d=new ie(`Failed to spawn codex app-server: ${A.message}`,{cause:A}),M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:A.message});for(let w of m.values())w.reject(d);m.clear(),R(d)};s.on("error",O),s.stdin?.on("error",O),s.on("exit",A=>{o.exited=!0,b?.(),o.exitCode=A;let w=E();for(let C of m.values())C.reject(w);m.clear();let I=y;if(I!==null&&!I.settled)if(I.settled=!0,I.usage.finish(),y=null,I.turnState.pendingCodexError)I.reject(Object.assign(I.turnState.pendingCodexError,{usage:I.usage.usage(),sessionId:a}));else{let C=u.trim()?de(u,{provider:"codex"}):"";M({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:A,...C?{stderr_summary:C}:{}}),I.reject(Object.assign(C?new Error(`${w.message}
1762
+ ${C}`):w,{usage:I.usage.usage(),sessionId:a}))}for(let C of _.splice(0))C()});try{if(await f("initialize",Om()),g("initialized",{}),t.threadId){let A;try{A=await f("thread/resume",{threadId:t.threadId,sandbox:r,approvalPolicy:"never",...t.model?{model:t.model}:{}})}catch(I){throw new Error(`Cannot resume codex thread ${t.threadId} for a bundle: ${I instanceof Error?I.message:String(I)} (the thread/start fallback is disabled in bundle mode)`)}let w=A.result?.thread;if(w?.id!==t.threadId)throw new Error(`codex thread/resume did not return the requested thread id: expected "${t.threadId}", received "${w?.id??"unknown"}"`);a=t.threadId,t.onSessionId?.(a)}else{let w=(await f("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:r,...t.model?{model:t.model}:{}})).result?.thread;w?.id&&(a=w.id,t.onSessionId?.(a))}}catch(A){let w=d??(A instanceof Error?A:new Error(String(A))),I=t.closeTimeoutMs??2e3;throw await ne(s,{softDelayMs:Math.min(1e3,I),killDelayMs:Math.min(1e3,I)}).catch(()=>{}),w}let N=A=>new Promise(w=>{setTimeout(w,A).unref?.()});return{provider:"codex",get sessionId(){return a},get completedTurns(){return o.completedTurns},async sendTurn(A,w={}){if(v&&await v,o.closed||o.closing!==null)throw new Error("codex bundle session is closed");if(o.exited)throw E();if(y!==null)throw new Error("codex bundle session has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending");if(w.signal?.aborted)throw new Error("Aborted");return new Promise((I,C)=>{let k={usage:l.turn(a),onUsage:w.onUsage,agentState:Ks(),turnState:zs(),resolve:I,reject:C,startMs:Date.now(),turnId:"",onDelta:w.onDelta,onEvent:w.onEvent,settled:!1};y=k;let x=()=>{k.settled||(k.settled=!0,y=null,T=k,v=new Promise(P=>{b=P}),S(k),w.signal?.removeEventListener("abort",x),k.usage.finish(),C(Object.assign(new Error("Aborted"),{usage:k.usage.usage(),sessionId:a})))};w.signal?.addEventListener("abort",x,{once:!0}),f("turn/start",{threadId:a,input:[{type:"text",text:A}],...t.model?{model:t.model}:{}}).then(P=>{k.usage.bind(P.result?.turn?.id)}).catch(P=>{if(k.settled){T===k&&(T=null,b?.());return}k.settled=!0,y=null,w.signal?.removeEventListener("abort",x),k.usage.finish(),C(Object.assign(o.exited?E():P instanceof Error?P:new Error(String(P)),{usage:k.usage.usage(),sessionId:a}))})})},close(){return o.closing!==null||(o.closing=(async()=>{if(o.closed=!0,b?.(),!o.exited&&(t.holdOpen!==void 0?await new Promise(A=>{ze(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>o.exited,isTurnInFlight:()=>y!==null,lastEventAtMs:()=>i,closeStdin:()=>{s.stdin?.end(),A()},label:"codex"})}):s.stdin?.end(),!o.exited)){let A=t.closeTimeoutMs??2e3;await Promise.race([h(),N(A)]),o.exited||await ne(s,{stdinEnd:!1,softDelayMs:Math.min(1e3,A),killDelayMs:Math.min(1e3,A)}).catch(()=>{})}})()),o.closing}}}import{spawn as np}from"node:child_process";import{existsSync as XS}from"node:fs";var Fm="(?:png|jpe?g|webp|heic|pdf)",yS=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Fm}\\s*`,"gi"),TS=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Fm}\\s*`,"i"),ES=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,vS=/^STANCE:\s+\S+\s*$/gim,wS=/\[Thought:\s*true\]\s*/gi;function ei(t){let e=[...t.matchAll(yS)];if(e.length>0){let n=e[e.length-1],r=(n.index??0)+n[0].length;return Um(t.slice(r).trimStart())}return Um(SS(t.replace(TS,"")))}function SS(t){let e=ES.exec(t);if(e===null)return t;let n=t.slice(e[0].length),r=[...n.matchAll(vS)];if(r.length<2)return t;let s=r[0],i=(s.index??0)+s[0].length;return n.slice(i).trimStart()}function Um(t){let e=[...t.matchAll(wS)];if(e.length===0)return t;let n=e[e.length-1],r=(n.index??0)+n[0].length;return t.slice(r).trimStart()}function mt(t,e=""){let n=t.result;return typeof n?.sessionId=="string"&&n.sessionId.length>0?n.sessionId:e}function jm(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}var bS=new Set(["agent_message_chunk","agent_thought_chunk","tool_call","tool_call_update","plan"]);function ti(t={}){let e="",n="",r="",s=!1,i=!1,o=!1,a=t.isolateResult??(t.tool==="gemini"?ei:void 0),l=()=>({result:a?a(n):n,sessionId:e,stopReason:r,sawActivity:o});return{setSessionId(d){e=d},beginTurn(){n="",r="",s=!1,i=!0,o=!1},completeTurn(d){return r=jm(d),s=!0,i=!1,l()},cancelTurn(){n="",r="",i=!1},processMessage(d){if(d.method!=="session/update")return!1;let c=d.params?.update,m=c?.sessionUpdate;if(typeof m!="string"||(i&&bS.has(m)&&(o=!0),m!=="agent_message_chunk"))return!1;let p=c?.content,f=typeof p?.text=="string"?p.text:"";return f&&i&&(n+=f,t.onDelta?.(f)),!0},finalize(){return s?l():null}}}var ni={name:"miniplayer",binary:"miniplayer",baseArgs:["acp"],argv:t=>{if(t.permissionMode==="plan")throw new Error("miniplayer has no plan mode; its native tools always have full permissions");return["acp",...t.model?["-m",t.model]:[]]}};import{readFileSync as RS,readdirSync as $m}from"node:fs";import{join as ri}from"node:path";function Wm(t,e){let n=e.GEMINI_DIR??process.env.GEMINI_DIR??ri(J,".gemini"),r=ri(n,"tmp"),s;try{s=$m(r)}catch{throw new Error(`gemini bundle: cannot read the gemini session store at ${r} \u2014 cannot verify session "${t}"`)}let i=`"sessionId": "${t}"`,o=`"sessionId":"${t}"`;for(let a of s){let l=ri(r,a,"chats"),d;try{d=$m(l)}catch{continue}for(let u of d){if(!u.endsWith(".json"))continue;let c;try{c=RS(ri(l,u),"utf8").slice(0,8192)}catch{continue}if(c.includes(i)||c.includes(o))return}}throw new Error(`gemini bundle: no session "${t}" in the gemini chats store (${r}) \u2014 the session must exist on disk before a bundle can resume it`)}var Ar={name:"gemini",binary:"gemini",baseArgs:["--acp","-y","--skip-trust"],argv(t){let e=[...Ar.baseArgs];if(t.permissionMode==="plan"){let n=Lt("gemini","plan"),r=Lt("gemini","yolo");e=e.filter(s=>!(r??[]).includes(s)),n&&e.push(...n)}return t.model&&e.push("--model",t.model),e},isolateResult:ei,sessionIdentity:{verifyLoadedSession:t=>{Wm(t.requestedSessionId,t.env)},recheckSession:t=>{Wm(t.requestedSessionId,t.env)}}};import{existsSync as kS,readFileSync as IS}from"node:fs";import{join as da}from"node:path";function Hm(t,e){let n=e.COPILOT_HOME??process.env.COPILOT_HOME??da(J,".copilot"),r=da(n,"session-state",t),s=da(r,"workspace.yaml");if(!kS(s))throw new Error(`copilot bundle: no session "${t}" in the copilot session store (${r}) \u2014 the session must exist on disk before a bundle can resume it`);let i;try{i=IS(s,"utf8").slice(0,4096)}catch(a){throw new Error(`copilot bundle: cannot read ${s} \u2014 cannot verify session "${t}": `+(a instanceof Error?a.message:String(a)))}let o=/^id:\s*(\S+)\s*$/m.exec(i);if(o===null||o[1]!==t)throw new Error(`copilot bundle: session store entry ${s} belongs to ${o?.[1]??"no recorded id"}, not "${t}"`)}var Cr={name:"copilot",binary:"copilot",baseArgs:["--acp","--yolo"],argv(t){return t.permissionMode==="plan"&&(process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
1763
+ `),M({event:"acp_plan_mode_unsupported",provider:"copilot",requested_mode:"plan",effective_mode:"yolo"})),t.model&&(process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${t.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1764
+ `),M({event:"acp_model_unsupported",provider:"copilot",model:t.model})),[...Cr.baseArgs]},yoloAssertion:"always-yolo",sessionIdentity:{verifyLoadedSession:t=>{Hm(t.requestedSessionId,t.env)},recheckSession:t=>{Hm(t.requestedSessionId,t.env)}}};import{spawn as MS}from"node:child_process";import{resolve as Qm}from"node:path";import{existsSync as AS,mkdirSync as CS,readFileSync as NS,writeFileSync as Bm}from"node:fs";import{join as Xm,resolve as ZD}from"node:path";var qm={yellow:t=>t};function xS(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function Jm(t,e={}){let n=Xm(t,".opencode"),r=Xm(n,"opencode.json");if(!AS(r)){CS(n,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return Bm(r,o+`
1765
+ `,"utf-8"),!0}let s;try{s=JSON.parse(NS(r,"utf-8"))}catch{return console.log(qm.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(qm.yellow(` .opencode/opencode.json at ${r} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),xS(s.permission)||M({event:"opencode_yolo_override",provider:"opencode",config_path:r,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&Bm(r,JSON.stringify(s,null,2)+`
1766
+ `,"utf-8"),i}import{existsSync as ca,readdirSync as OS,statSync as Gm}from"node:fs";import{join as Pt}from"node:path";import{createRequire as LS}from"node:module";var ua=null;function ma(){return ua===null&&(ua=LS(import.meta.url)("node:sqlite").DatabaseSync),ua}function Vm(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Km(t,e){if(!e)return;t.observed=!0;let n=e.input??0,r=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=n,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=r,t.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function Ym(t){return t.observed?{totalInputTokens:t.totalInputTokens,totalCachedInputTokens:t.totalCachedInputTokens,totalCacheWriteInputTokens:t.totalCacheWriteInputTokens,totalOutputTokens:t.totalOutputTokens,totalReasoningOutputTokens:t.totalReasoningOutputTokens,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}:{}}function zm(){let t=process.env.XDG_DATA_HOME||Pt(J,".local","share"),e=process.env.XDG_CONFIG_HOME||Pt(J,".config");return[Pt(t,"opencode","opencode.db"),Pt(e,"opencode","opencode.db")]}function DS(){return pa(process.env,J)}function pa(t,e){if(t.OPENCODE_DB)return[t.OPENCODE_DB];let n=t.XDG_DATA_HOME||Pt(e,".local","share"),r=Pt(n,"lmplayer"),s=Pt(r,"opencode-local.db"),i=[s];try{let o=OS(r).filter(a=>/^opencode.*\.db$/u.test(a)).map(a=>Pt(r,a)).filter(a=>a!==s).sort((a,l)=>{try{return Gm(l).mtimeMs-Gm(a).mtimeMs}catch{return 0}});i.push(...o)}catch{}return i}function PS(t){return t==="lmplayer"?DS():zm()}var Wn=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,this.busyTimeoutMs=e?.busyTimeoutMs??5e3,e?.dbPaths?this.dbPaths=[...e.dbPaths]:e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=PS(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>ca(e))}openDb(e){if(!ca(e))return null;let n=new(ma())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let e=[];for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=new Map,i=r.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=r.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1767
+ s.time_created, s.time_updated
1768
+ FROM session s
1769
+ ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),d=a.directory||l?.worktree||"(unknown)",u=r.prepare(`SELECT m.id, m.data, m.time_created FROM message m
1770
+ WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),c=0,m,p,f,g=Vm(),_=[];for(let E of u){let y;try{y=JSON.parse(E.data)}catch{continue}f||(f=y.model?.modelID||y.modelID),(y.role==="user"||y.role==="assistant")&&c++,y.role==="user"&&_.push(E.id),y.role==="assistant"&&Km(g,y.tokens)}let h=[..._.length>0?[_[0]]:[],..._.length>1?[_[_.length-1]]:[]];for(let E of h){let y=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(E),T=this.extractText(y);T&&(m||(m=B(T,80)),p=B(T,80))}e.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:d,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:f,startCommand:this.startCommand,firstUserMessage:m,lastUserMessage:p,messageCount:c,filePath:n,...Ym(g)})}}catch(s){M({event:"opencode_discover_sessions_failed",provider:this.name,db_path:n,error_message:s instanceof Error?s.message:String(s)})}finally{r.close()}}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,e);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(e,n,r){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1771
+ FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=[],d=0,u,c,m,p=Vm();for(let f of o){let g;try{g=JSON.parse(f.data)}catch{continue}u||(u=g.model?.modelID||g.modelID);let _=g.model?.modelID||g.modelID,h=new Date(g.time?.created||f.time_created),E=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(f.id);if(g.role==="user"){let y=this.extractText(E),T=this.extractText(E,!0);T&&l.push(T),y&&(c||(c=B(y,80)),m=B(y,80)),a.push({role:"user",timestamp:h,content:y||"(empty)"}),d++}else if(g.role==="assistant"){Km(p,g.tokens);for(let y of E){let T;try{T=JSON.parse(y.data)}catch{continue}T.type==="text"&&T.text?a.push({role:"assistant",timestamp:h,content:T.text,model:_}):T.type==="reasoning"&&T.text?a.push({role:"thinking",timestamp:h,content:T.text}):T.type==="tool"&&T.tool&&(a.push({role:"tool_use",timestamp:h,content:`${T.tool}`,toolName:T.tool,toolCallId:T.callID,toolInput:T.state?.input?JSON.stringify(T.state.input):void 0,toolInputData:Be(T.state?.input)}),T.state&&(T.state.status==="completed"||T.state.status==="error"||T.state.output!==void 0||T.state.error!==void 0)&&a.push({role:"tool_result",timestamp:h,content:T.state.error??T.state.output??"",toolCallId:T.callID}))}d++}}return{provider:this.name,sessionId:n.id,slug:n.slug,cwd:i,createdAt:new Date(n.time_created),modifiedAt:new Date(n.time_updated),model:u,startCommand:this.startCommand,firstUserMessage:c,lastUserMessage:m,messageCount:d,filePath:r,...Ym(p),messages:a,userPrompts:l}}extractText(e,n=!1){let r=[];for(let s of e){let i;try{i=JSON.parse(s.data)}catch{continue}n&&(i.synthetic===!0||i.ignored===!0)||i.type==="text"&&i.text&&r.push(i.text)}return r.join(`
1772
+ `).trim()}async resolveSessionPath(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{if(this.findSessionRow(r,e))return n}catch{}finally{r.close()}}return null}async deleteSession(e){for(let n of this.existingDbPaths()){let r=new(ma())(n,{open:!0});try{let s=this.findSessionRow(r,e);if(!s)continue;return r.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{r.close()}}return!1}findSessionRow(e,n){let r=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1773
+ s.time_created, s.time_updated
1774
+ FROM session s WHERE s.id = ?`).get(n);if(r)return r;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1775
+ s.time_created, s.time_updated
1776
+ FROM session s
1777
+ WHERE s.id LIKE ?
1778
+ ORDER BY s.time_updated DESC
1779
+ LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}};function fa(t,e){let n=e?.dbPath!==void 0?[e.dbPath]:zm();for(let r of n){if(!ca(r))continue;let s=new(ma())(r,{open:!0,readOnly:!0});try{s.exec("PRAGMA busy_timeout = 5000");let i=s.prepare("SELECT directory FROM session WHERE id = ?").get(t);if(i!==void 0)return{directory:typeof i.directory=="string"?i.directory:""}}finally{s.close()}}return null}function Nr(t){return{id:t.id,onFailure:"non-fatal",applies:e=>t.value(e)!==void 0,run:async e=>{await e.sendRpc("session/set_config_option",{sessionId:e.sessionId,configId:t.configId,value:t.value(e)})},describeFailure:(e,n)=>{let r=t.value(e),s=n instanceof Error?n.message:String(n);return{event:"acp_config_option_failed",fields:{config_id:t.configId,value:r,error_message:s},stderrLine:`[acp] set_config_option(${t.configId}=${r}) failed: ${s}
1780
+ `,warning:`${t.provider} ignored ${t.configId}=${r}: ${s}`,message:s}},successLog:e=>`acp: set_config_option(${t.configId}=${t.value(e)}) ok`}}var dn={name:"opencode",binary:"opencode",baseArgs:["acp"],argv:()=>[...dn.baseArgs],preSpawn(t){try{Jm(t.cwd)}catch(e){M({event:"opencode_config_install_failed",cwd:t.cwd,error_message:e instanceof Error?e.message:String(e)})}},sessionSetup:[Nr({id:"model",provider:"opencode",configId:"model",value:t=>t.model}),Nr({id:"effort",provider:"opencode",configId:"effort",value:t=>t.effort})],probe:Zm,sessionIdentity:{verifyLoadedSession:t=>{let e=fa(t.requestedSessionId,{...t.env.OPENCODE_DB!==void 0?{dbPath:t.env.OPENCODE_DB}:{}});if(e===null)throw new Error(`opencode bundle: no session "${t.requestedSessionId}" in the opencode session store \u2014 the session must exist on disk before a bundle can resume it`);if(Qm(e.directory)!==Qm(t.cwd))throw new Error(`opencode bundle: session "${t.requestedSessionId}" belongs to ${e.directory}, not ${t.cwd} \u2014 refusing to resume another workspace's session`)},recheckSession:t=>{if(fa(t.requestedSessionId,{...t.env.OPENCODE_DB!==void 0?{dbPath:t.env.OPENCODE_DB}:{}})===null)throw new Error(`opencode bundle: session "${t.requestedSessionId}" disappeared from the session store mid-bundle`)}}};function Zm(t){let e;try{e=MS(t.binaryPath??dn.binary,[...dn.baseArgs],{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ee(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=Ot(e,{provider:"opencode"}),r=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(u,c=!0)=>{if(!i){if(i=!0,clearTimeout(d),e.removeListener("error",a),e.removeListener("exit",l),n.close(),!c){s(u);return}ne(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(u))}},a=u=>{o({status:"unavailable",reason:"spawn",error:u.message},!1)},l=(u,c)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(u)}, signal=${String(c)})`},!1)};e.once("error",a),e.once("exit",l);let d=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let u=await n.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),c=mt(u);try{await n.sendRpc("session/set_config_option",{sessionId:c,configId:"model",value:t.model})}catch(m){o({status:"rejected",option:"model",value:t.model,error:m instanceof Error?m.message:String(m)});return}if(t.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:c,configId:"effort",value:t.effort})}catch(m){o({status:"rejected",option:"effort",value:t.effort,error:m instanceof Error?m.message:String(m)});return}o({status:"verified"})}catch(u){o({status:"unavailable",reason:"handshake",error:u instanceof Error?u.message:String(u)})}})()})}import{existsSync as US}from"node:fs";import{readdir as FS}from"node:fs/promises";import{join as ga,resolve as jS}from"node:path";var $S=/runtime\s+\S+\s+does not exist in workspace\s+\S+/;function tp(t){let e=$S.exec(t);return e?e[0]:null}function WS(t){if(!t.includes("notifications/initialized"))return t;let e=t.split(/\r?\n/),n=[];for(let r=0;r<e.length;r++){let s=e[r];if(s.includes("Error handling notification")&&s.includes("notifications/initialized")){let i=[s],o=r;for(;o+1<e.length&&i.length<8&&(o++,i.push(e[o]),e[o].trim()!=="}"););let a=i.join(`
1781
+ `);if(/\bcode:\s*-32601\b/.test(a)&&/Method not found[^]*notifications\/initialized/.test(a)){r=o;continue}}n.push(s)}return n.join(`
1782
+ `)}var _a=t=>t.permissionMode==="plan"?"plan":"auto";async function ep(t,e){let n=jS(e.KIMI_CODE_HOME??process.env.KIMI_CODE_HOME??ga(J,".kimi-code")),r=ga(n,"sessions"),s;try{s=await FS(r,{withFileTypes:!0})}catch{throw new Error(`kimi bundle: cannot read the kimi session store at ${r} \u2014 cannot verify session "${t}"`)}for(let i of s)if(i.isDirectory()&&US(ga(r,i.name,t,"agents","main","wire.jsonl")))return;throw new Error(`kimi bundle: no session "${t}" in the kimi session store (${r}) \u2014 the session must exist on disk before a bundle can resume it`)}var xr={name:"kimi",binary:"kimi",baseArgs:["acp"],argv:()=>[...xr.baseArgs],sessionSetup:[{id:"permission-mode",onFailure:"fail-closed",applies:()=>!0,run:async t=>{await t.sendRpc("session/set_config_option",{sessionId:t.sessionId,configId:"mode",value:_a(t)})},describeFailure:(t,e)=>{let n=_a(t),r=e instanceof Error?e.message:String(e);return{event:"acp_permission_mode_failed",fields:{config_id:"mode",value:n,error_message:r},message:`Cannot set Kimi ACP permission mode to ${n}: ${r}`}},successLog:t=>`acp: set_config_option(mode=${_a(t)}) ok`},Nr({id:"model",provider:"kimi",configId:"model",value:t=>t.model})],onExitFinalization(t){let e=tp(t.result);e!==null&&M({event:"kimi_runtime_dead",provider:"kimi",session_id:t.sessionId,matched_text:e})},filterExpectedStderr:WS,sessionIdentity:{verifyLoadedSession:async t=>{await ep(t.requestedSessionId,t.env)},recheckSession:async t=>{await ep(t.requestedSessionId,t.env)}}};var Or={name:"hermes",binary:"hermes",baseArgs:["acp"],argv(t){if(t.permissionMode==="plan")throw new Error('provider "hermes" does not support --permission-mode plan');return[...Or.baseArgs]},preSpawn(t){t.permissionMode==="yolo"&&(t.env.HERMES_YOLO_MODE="1")},modeVocabulary:{known:["default","accept_edits","dont_ask"],selectable:["accept_edits","dont_ask"]},sessionSetup:[{id:"session-mode",onFailure:"fail-closed",applies:t=>t.acpMode!==void 0,run:async t=>{await t.sendRpc("session/set_mode",{sessionId:t.sessionId,modeId:t.acpMode})},describeFailure:(t,e)=>{let n=e instanceof Error?e.message:String(e);return{event:"acp_session_mode_failed",fields:{mode_id:t.acpMode,error_message:n},message:`Cannot set hermes ACP session mode to ${String(t.acpMode)}: ${n}`}},successLog:t=>`acp: set_mode(modeId=${String(t.acpMode)}) ok`},{id:"model",onFailure:"fail-closed",applies:t=>{if(t.model===void 0)return!1;let e=t.response.result?.models?.currentModelId;return t.model!==e},run:async t=>{await t.sendRpc("session/set_model",{sessionId:t.sessionId,modelId:t.model})},describeFailure:(t,e)=>{let n=e instanceof Error?e.message:String(e);return{event:"acp_config_option_failed",fields:{config_id:"model",value:t.model,error_message:n},stderrLine:`[acp] set_model(modelId=${String(t.model)}) failed: ${n}
1783
+ `,message:`Cannot set Hermes ACP model to ${String(t.model)}: ${n}`}},successLog:t=>`acp: set_model(modelId=${String(t.model)}) ok`}],sessionIdentity:{verifyLoadedSession:()=>{}}};var HS={miniplayer:ni,gemini:Ar,copilot:Cr,opencode:dn,kimi:xr,hermes:Or};function Lr(t){return HS[t]}var BS={miniplayer:{binary:ni.binary,args:ni.baseArgs},gemini:{binary:Ar.binary,args:Ar.baseArgs},copilot:{binary:Cr.binary,args:Cr.baseArgs},opencode:{binary:dn.binary,args:dn.baseArgs},kimi:{binary:xr.binary,args:xr.baseArgs},hermes:{binary:Or.binary,args:Or.baseArgs}};function rp(t,e){let n=Lr(t)?.modeVocabulary;if(!n)throw new ie(`ACP mode "${e}" requested for provider "${t}", which declares no ACP mode vocabulary. Add the provider's mode ids to its AcpProviderProfile modeVocabulary before setting a mode.`);if(!n.known.includes(e))throw new ie(`provider "${t}" has no ACP mode "${e}" (known: ${n.known.join(", ")}).`);if(!n.selectable.includes(e))throw new ie(`provider "${t}" ACP mode "${e}" is not selectable by lmctl (selectable: ${n.selectable.join(", ")}).`)}function qS(t){let e=t.stderr.trim(),n=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
1784
+ One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
1785
+ ${de(e,{provider:t.tool,...t.fullOutput===void 0?{}:{fullOutput:t.fullOutput}})}
1786
+
1787
+ ${n}`:n}function JS(t,e){return Lr(t)?.filterExpectedStderr?.(e)??e}function sp(t){if(t.method!=="session/update")return!1;let n=t.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}async function ip(t,e,n,r){for(let s of t.sessionSetup??[]){let i={...e,sessionId:n.sessionId,response:n.response,sendRpc:r};if(s.applies(i))try{await s.run(i),s.successLog&&Te(s.successLog(i))}catch(o){let a=s.describeFailure(i,o);if(M({event:a.event,provider:t.name,...a.fields}),a.stderrLine&&process.stderr.write(a.stderrLine),a.warning&&e.warnings.push(a.warning),s.onFailure==="fail-closed")throw new Error(a.message)}}}function op(t,e,n){let r=Ee(e.env,e.cwd,e.sessionId);t.preSpawn?.({...n,cwd:e.cwd,env:r});let s=e.binaryPath||t.binary,i=t.argv(n),o=t.yoloAssertion==="always-yolo"?"yolo":n.permissionMode;if(he(e.tool,i,o),e.cwd&&!XS(e.cwd))throw M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),new ie(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:s,spawnArgs:i,spawnEnv:r}}async function ap(t){let{sendRpc:e,sendNotification:n,opts:r,outputProcessor:s}=t,i=t.strictSessionIdentity===!0,o=await e("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}});n("notifications/initialized");let a=r.sessionId||"",l;if(r.sessionId){let d;try{if(o.result?.agentCapabilities?.loadSession===!1)throw new Error("provider advertises loadSession=false");d=await e("session/load",{sessionId:r.sessionId,cwd:r.cwd,mcpServers:[]})}catch(c){if(i||r.requireResume)throw new Error(`Cannot resume session ${r.sessionId} via ACP: ${c instanceof Error?c.message:String(c)}`);process.stderr.write(`[acp] session/load failed for ${r.sessionId}, creating new session
1788
+ `),M({event:"acp_session_resume_fallback",provider:r.tool,session_id:r.sessionId,error_message:c instanceof Error?c.message:String(c)});let m=await e("session/new",{cwd:r.cwd,mcpServers:[]});return a=mt(m),s.setSessionId(a),{sessionId:a,sessionResponse:m}}let u=mt(d);if(r.requireResume&&u!==""&&u!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${u}"`);if(i){let c=mt(d);if(c!==""&&c!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${c}"`);if(c===""){if(t.verifyLoadResponse===void 0)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received none`);await t.verifyLoadResponse(d)}a=r.sessionId}else a=mt(d,r.sessionId);l=d,s.setSessionId(a)}else{let d=await e("session/new",{cwd:r.cwd,mcpServers:[]});a=mt(d),l=d,s.setSessionId(a)}return{sessionId:a,sessionResponse:l}}function lp(t,e){let n=Lr(e.tool);if(!n)return Promise.reject(new Error(`No ACP config for tool "${e.tool}"`));if(e.acpMode!==void 0)try{rp(e.tool,e.acpMode)}catch(r){return Promise.reject(r)}return new Promise((r,s)=>{let i=e.permissionMode??"yolo",o=[],a={permissionMode:i,...e.model!==void 0?{model:e.model}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.acpMode!==void 0?{acpMode:e.acpMode}:{},purpose:"chat",warnings:{push:R=>{o.push(R)}}},l,d,u;try{({binary:l,spawnArgs:d,spawnEnv:u}=op(n,e,a))}catch(R){return s(R instanceof Error?R:new Error(String(R)))}let c=np(l,d,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:u}),m=Date.now(),p=!1,f=!1,g=0,_=!1,h=!1;if(e.signal){if(e.signal.aborted)return p=!0,M({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),ne(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{p=!0,M({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-m}),ne(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let E=e.sessionId||"",y=ti({tool:e.tool,onDelta:e.onDelta,...n.isolateResult?{isolateResult:n.isolateResult}:{}});y.setSessionId(E);let T=Ot(c,{provider:e.tool,onEvent:R=>{g=Date.now(),sp(R)&&(h=!0),e.onEvent?.(R)},onNotification:R=>{g=Date.now(),y.processMessage(R)}}),{sendRpc:v,sendNotification:b}=T,S="";c.stderr?.on("data",R=>{S+=R.toString()}),c.on("error",R=>{T.close(R),M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:R.message,elapsed_ms:Date.now()-m}),s(new ie(`Failed to spawn ${n.binary} ${n.baseArgs.join(" ")}: ${R.message}`,{cause:R}))}),c.on("exit",R=>{if(f=!0,T.close(new ie(`ACP process exited with code ${String(R)}`)),p)return;let O=y.finalize();if(O!==null)n.onExitFinalization?.({...a,sessionId:O.sessionId,result:O.result,stopReason:O.stopReason,exitCode:R}),r({result:O.result,sessionId:O.sessionId,durationMs:Date.now()-m,stopReason:O.stopReason,exitCode:R,sawActivity:O.sawActivity,...o.length>0?{warnings:o}:{}});else{let N=JS(e.tool,S),A=qS({tool:e.tool,exitCode:R,stderr:N,fullOutput:S});M({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:R,stderr_summary:A,elapsed_ms:Date.now()-m}),s(new Error(A))}}),(async()=>{try{let R=await ap({sendRpc:v,sendNotification:b,opts:e,outputProcessor:y});E=R.sessionId,e.onSessionId?.(E);let O=R.sessionResponse;await ip(n,a,{sessionId:E,response:O},v),y.beginTurn(),_=!0,Te(`acp: prompt sent (${t.length} chars)`);let N;if(await v("session/prompt",{sessionId:E,prompt:[{type:"text",text:t}]},A=>{A.error?y.cancelTurn():N=y.completeTurn(A)}),!N)throw new Error("ACP prompt completed without a result boundary");_=!1,Te(`acp: result received (${N.result.length} chars, stopReason=${N.stopReason})`),ze(e.holdOpen,{isAborted:()=>p,hasChildExited:()=>f,isTurnInFlight:()=>_,lastEventAtMs:()=>g,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>h})}catch(R){ne(c).catch(()=>{}),s(R instanceof Error?R:new Error(String(R)))}})()})}async function dp(t){let e=Lr(t.tool);if(!e)throw new Error(`No ACP config for tool "${t.tool}"`);t.acpMode!==void 0&&rp(t.tool,t.acpMode);let n=t.permissionMode??"yolo",r=[],s=!0,i={permissionMode:n,...t.model!==void 0?{model:t.model}:{},...t.effort!==void 0?{effort:t.effort}:{},...t.acpMode!==void 0?{acpMode:t.acpMode}:{},purpose:"chat",warnings:{push:O=>{r.push(O)}}},{binary:o,spawnArgs:a,spawnEnv:l}=op(e,t,i),d=np(o,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:l}),u=Date.now(),c={exited:!1,exitCode:null,lastEventAtMs:0,turnInFlight:!1,backgroundJobLaunched:!1,completedTurns:0,closed:!1,closing:null,telemetryFired:!1},m,p=t.sessionId||"",f=null,g="";d.stderr?.on("data",O=>{g+=O.toString()});let _,h,E=ti({tool:t.tool,onDelta:O=>_?.(O),...e.isolateResult?{isolateResult:e.isolateResult}:{}});E.setSessionId(p);let y=Ot(d,{provider:t.tool,onEvent:O=>{c.lastEventAtMs=Date.now(),sp(O)&&(c.backgroundJobLaunched=!0),h?.(O)},onNotification:O=>{c.lastEventAtMs=Date.now(),E.processMessage(O)}}),T=()=>new Error(`ACP bundle process (${t.tool}) exited${c.exitCode!==null?` with code ${c.exitCode}`:""} after ${c.completedTurns} completed prompt(s); the bundle cannot continue`),v=[],b=()=>c.exited?Promise.resolve():new Promise(O=>{v.push(O)}),S=null;d.on("error",O=>{f=new ie(`Failed to spawn ${e.binary} ${e.baseArgs.join(" ")}: ${O.message}`,{cause:O}),M({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:O.message,elapsed_ms:Date.now()-u}),y.close(O)}),d.on("exit",O=>{if(c.exited=!0,c.exitCode=O,y.close(new ie(`ACP process exited with code ${String(O)}`)),!c.telemetryFired){c.telemetryFired=!0;let N=E.finalize();N!==null&&e.onExitFinalization?.({...i,sessionId:N.sessionId,result:N.result,stopReason:N.stopReason,exitCode:O})}if(S!==null){let N=S;S=null,N(T())}for(let N of v.splice(0))N()});try{let O=await ap({sendRpc:y.sendRpc,sendNotification:y.sendNotification,opts:t,outputProcessor:E,strictSessionIdentity:!0,verifyLoadResponse:e.sessionIdentity===void 0?void 0:async N=>e.sessionIdentity.verifyLoadedSession({...i,requestedSessionId:t.sessionId,loadResponse:N,cwd:t.cwd,env:l})});p=O.sessionId,t.onSessionId?.(p),await ip(e,i,{sessionId:O.sessionId,response:O.sessionResponse},y.sendRpc)}catch(O){let N=f??(O instanceof Error?O:new Error(String(O)));throw ne(d).catch(()=>{}),N}let R=O=>new Promise(N=>{setTimeout(N,O).unref?.()});return{tool:t.tool,get sessionId(){return p},get completedTurns(){return c.completedTurns},async sendTurn(O,N={}){if(m&&await m,c.closed||c.closing!==null)throw new Error(`ACP bundle session (${t.tool}) is closed`);if(c.exited)throw T();if(c.turnInFlight)throw new Error(`ACP bundle session (${t.tool}) has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending`);if(N.signal?.aborted)throw new Error("Aborted");if(e.sessionIdentity?.recheckSession!==void 0){if(await e.sessionIdentity.recheckSession({requestedSessionId:p,cwd:t.cwd,env:l}),c.exited)throw T();if(N.signal?.aborted)throw new Error("Aborted")}c.turnInFlight=!0,_=N.onDelta,h=N.onEvent;let A=Date.now();try{E.beginTurn(),Te(`acp: bundle prompt sent (${O.length} chars)`);let w,I=!1;if(await new Promise((k,x)=>{S=x;let P,L=()=>{I=!0,m=Promise.resolve().then(()=>P).catch(()=>{}),E.cancelTurn(),y.sendNotification("session/cancel",{sessionId:p}),x(new Error("Aborted"))},W=N.signal;W?.addEventListener("abort",L,{once:!0}),P=y.sendRpc("session/prompt",{sessionId:p,prompt:[{type:"text",text:O}]},D=>{I||(D.error?E.cancelTurn():w=E.completeTurn(D),_=void 0,h=void 0)}),P.then(D=>{W?.removeEventListener("abort",L),k(D)},D=>{W?.removeEventListener("abort",L),x(D instanceof Error?D:new Error(String(D)))})}),S=null,!w)throw new Error("ACP prompt completed without a result boundary");c.turnInFlight=!1,c.completedTurns+=1,Te(`acp: bundle result received (${w.result.length} chars, stopReason=${w.stopReason})`);let C=s&&r.length>0?[...r]:void 0;return s=!1,{result:w.result,sessionId:w.sessionId,stopReason:w.stopReason,durationMs:Date.now()-A,sawActivity:w.sawActivity,...C!==void 0?{warnings:C}:{}}}catch(w){throw S=null,E.cancelTurn(),c.turnInFlight=!1,c.exited?T():w}finally{_=void 0,h=void 0}},close(){return c.closing!==null||(c.closing=(async()=>{if(c.closed=!0,c.exited||(t.holdOpen!==void 0?await new Promise(N=>{ze(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>c.exited,isTurnInFlight:()=>c.turnInFlight,lastEventAtMs:()=>c.lastEventAtMs,closeStdin:()=>{d.stdin?.end(),N()},label:t.tool,wasBackgroundJobLaunched:()=>c.backgroundJobLaunched})}):d.stdin?.end(),c.exited))return;let O=t.closeTimeoutMs??2e3;await Promise.race([b(),R(O)]),c.exited||await ne(d,{stdinEnd:!1,softDelayMs:Math.min(1e3,O),killDelayMs:Math.min(1e3,O)}).catch(()=>{})})()),c.closing}}}function ce(t,e=120){let n=t.replace(/\s+/g," ").trim();return n.length>e?n.slice(0,e-1)+"\u2026":n}var GS=256;function up(t,e){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(t.size>=GS){let r=t.keys().next().value;r!==void 0&&t.delete(r)}t.set(n.id,Date.now()),e(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=t.get(n.id);if(r!==void 0){e({...n,elapsedMs:Date.now()-r}),t.delete(n.id);return}}e(n)}}function cp(){let t=new Map;return(e,n)=>{VS(e,up(t,n))}}function VS(t,e){let n=t.type;if(n==="system"){let r=t.subtype;if(r==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,d=[];s!==void 0&&d.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&d.push(`HTTP ${o}`),l!==void 0&&d.push(`retry in ${Math.round(l/1e3)}s`),a&&d.push(ce(a,60));let u=d.length>0?d.join(", "):r;e({kind:"api_retry",summary:u});return}if(r==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(ce(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:r||"system",raw:t});return}if(n==="assistant"||n==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:ce(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,d=i.input,u="";d&&(typeof d.command=="string"?u=d.command:typeof d.file_path=="string"?u=d.file_path:typeof d.path=="string"?u=d.path:typeof d.pattern=="string"?u=d.pattern:typeof d.url=="string"?u=d.url:u=ce(JSON.stringify(d))),e({kind:"tool_use",tool:a,summary:ce(u),id:l,raw:i})}else if(o==="thinking"||o==="redacted_thinking"){let a=i.thinking||i.data||"";e({kind:"thinking",summary:ce(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",d=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,u,c=i.content;if(typeof c=="string")u=`${c.split(`
1789
+ `).length} lines, ${c.length} chars`;else if(Array.isArray(c)){let m=c.map(p=>typeof p=="object"&&p&&"text"in p?p.text:"").filter(Boolean).join("");m&&(u=`${m.split(`
1790
+ `).length} lines, ${m.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:d,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(n==="result"){e({kind:"system",summary:"result",raw:t});return}}async function si(t,e){let n=e.binary==="qwen"?"qwen":"claude",r=e.onProgress?cp():void 0;if(e.bundleSession!==void 0)return ut(e.bundleSession,n,e.sessionId,t,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal});let s=await km(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:n,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onUsage:e.onUsage,onEvent:i=>{typeof i.session_id=="string"&&i.session_id&&e.onSessionId?.(i.session_id),r&&r(i,e.onProgress)},signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,...s.usage?{usage:s.usage}:{},sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns,...s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{}}}async function ii(t){let e=t.binary==="qwen"?"qwen":"claude",n=await Im({tool:e,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,holdOpen:t.holdOpen,closeTimeoutMs:t.closeTimeoutMs,sessionFileRoots:t.sessionFileRoots});return{provider:e,get sessionId(){return n.sessionId},get completedTurns(){return n.completedTurns},async sendTurn(r,s={}){let i=cp(),o=await n.sendTurn(r,{onText:s.onDelta,onEvent:a=>{s.onEvent?.(a),s.onProgress&&i(a,s.onProgress)},signal:s.signal});return{text:o.result,...o.usage?{usage:o.usage}:{},sessionId:o.sessionId,durationMs:o.durationMs,...o.warnings!==void 0?{warnings:o.warnings}:{}}},close:()=>n.close()}}function mp(){let t=new Map;return(e,n)=>{KS(e,up(t,n))}}function KS(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:ce(a)});return}if(i==="agent_thought_chunk"||i==="thought"||i==="reasoning"){let a=s.content?.text||"";e({kind:"thinking",summary:ce(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",d=s.rawInput;d&&(typeof d.command=="string"?l=d.command:typeof d.file_path=="string"?l=d.file_path:typeof d.path=="string"?l=d.path:l=ce(JSON.stringify(d))),e({kind:"tool_use",tool:o,summary:ce(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")e({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,d=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=d?`running\u2026 ${ce(d,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:i})}}function pp(t,e){if(e!==void 0)return t===""&&!e?"empty":void 0}async function Qe(t,e){let n=e.acpTool||e.binary,r=e.onProgress?mp():void 0;if(e.bundleSession!==void 0)return ut(e.bundleSession,n,e.sessionId,t,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal});let s=[];if(e.model&&n==="copilot"){let a="copilot --acp does not implement per-session model selection";$e({event:"model_ignored",provider:n,model:e.model,reason:a}),s.push(`copilot ignored model=${e.model}: ${a}`)}let i=await lp(t,{tool:n,sessionId:e.sessionId,onSessionId:e.onSessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,acpMode:e.acpMode,requireResume:e.requireResume,onDelta:e.onDelta,onEvent:r?a=>r(a,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen}),o=[...s,...i.warnings??[]];return{text:i.result,sessionId:i.sessionId,durationMs:i.durationMs,stopReason:i.stopReason,...pp(i.result,i.sawActivity)!==void 0?{status:"empty"}:{},...o.length>0?{warnings:o}:{}}}async function Ze(t){let e=t.acpTool||t.binary,n=await dp({tool:e,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,effort:t.effort,alias:t.alias,permissionMode:t.permissionMode,acpMode:t.acpMode,requireResume:!0,holdOpen:t.holdOpen,closeTimeoutMs:t.closeTimeoutMs});return{provider:e,get sessionId(){return n.sessionId},get completedTurns(){return n.completedTurns},async sendTurn(r,s={}){let i=mp(),o=await n.sendTurn(r,{...s,onEvent:a=>{s.onEvent?.(a),s.onProgress&&i(a,s.onProgress)}});return{text:o.result,sessionId:o.sessionId,durationMs:o.durationMs,stopReason:o.stopReason,sawActivity:o.sawActivity,...pp(o.result,o.sawActivity)?{status:"empty"}:{},...o.warnings!==void 0?{warnings:o.warnings}:{}}},close:()=>n.close()}}function fp(t,e){let n=t.method;if(!n)return;let r=t.params;if(n==="turn/started"){e({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(n==="error"){let s=r?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=r?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${ce(o,120)}`}:{kind:"other",summary:`codex error: ${ce(o,120)}`});return}if(n==="item/started"||n==="item/completed"){let s=r?.item;if(!s)return;let i=s.type,o=n==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,d=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)e({kind:"tool_use",tool:"Bash",summary:ce(d||"(command)"),id:a});else{let u=s.exitCode,c=s.status||"",m=typeof s.durationMs=="number"?s.durationMs:void 0,p=typeof u=="number"?`exit ${u}`:c||"done",f=[];typeof u=="number"?f.push(`exit ${u}`):c&&f.push(c),typeof m=="number"&&f.push(`${Math.round(m/1e3)}s`),e({kind:"tool_result",summary:f.join(", ")||"done",status:p,elapsedMs:m,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,d=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:ce(d||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",d=s.tool||"tool";if(o)e({kind:"tool_use",tool:`${l}/${d}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(o?{kind:"tool_use",tool:"WebSearch",summary:ce(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(n==="item/agentMessage/delta"){let s=r?.delta||"";if(s){let i=typeof r?._lmctlItemPhase=="string"?r._lmctlItemPhase:void 0;e(i==="commentary"?{kind:"thinking",summary:ce(s)}:{kind:"text",summary:ce(s)})}return}if(n.startsWith("item/reasoning/")||n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";e({kind:"thinking",summary:ce(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let i=s.split(`
1791
+ `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${ce(o,60)}`:ce(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n==="item/commandExecution/terminalInteraction"||n==="item/commandExecution/outputChunk"||n==="item/commandExecution/output"){let s=(typeof r?.stdin=="string"?r.stdin:"")||(typeof r?.delta=="string"?r.delta:"")||(typeof r?.output=="string"?r.output:"")||(typeof r?.text=="string"?r.text:"")||(typeof r?.content=="string"?r.content:"")||(typeof r?.chunk=="string"?r.chunk:"")||"";if(s){let i=s.split(`
1792
+ `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${ce(o,60)}`:ce(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){e({kind:"other",summary:n.slice(5)});return}}async function gp(t,e){if(e.bundleSession!==void 0)return ut(e.bundleSession,"codex",e.sessionId,t,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal});let n=await Pm(t,{threadId:e.sessionId,requireResume:e.requireResume,onSessionId:e.onSessionId,onUsage:e.onUsage,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?r=>fp(r,e.onProgress):void 0,signal:e.signal});return{text:n.result,...n.usage?{usage:n.usage}:{},sessionId:n.threadId,durationMs:n.durationMs}}async function _p(t){let e=await Mm({threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen,closeTimeoutMs:t.closeTimeoutMs});return{provider:"codex",get sessionId(){return e.sessionId},get completedTurns(){return e.completedTurns},async sendTurn(n,r={}){let s=await e.sendTurn(n,{...r,onEvent:i=>{r.onEvent?.(i),r.onProgress&&fp(i,r.onProgress)}});return{text:s.text,...s.usage?{usage:s.usage}:{},sessionId:s.sessionId,durationMs:s.durationMs}},close:()=>e.close()}}function ha(t={}){let e=es(t.miniplayerHome),n=r=>({...r??process.env,MINIPLAYER_HOME:e});return new class extends Z{constructor(){super({provider:new Zr({miniplayerHome:e}),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeSession:!1,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none",leaderSetupHint:"Miniplayer provides native file, shell and web tools. Live ACP sessions cannot be resumed after exit."},binary:"miniplayer",seedArgs:[],resumeTemplate:"",startTemplate:"miniplayer run",transport:(r,s)=>{if(s.sessionId||s.requireResume)throw new Error('miniplayer does not support resume; use lmctl prompt --provider miniplayer --model <model> "<prompt>"');return Qe(r,{...s,env:n(s.env),acpTool:"miniplayer",requireResume:!1})}})}openSession(r){if(r.sessionId)throw new Error("miniplayer cannot reopen a closed ACP session; start a fresh conversation");return Ze({...r,env:n(r.env),binary:"miniplayer",acpTool:"miniplayer"})}manualSeedHint(){return{launchCommand:"miniplayer --help",postLaunchNote:'Use lmctl prompt --provider miniplayer --model <model> "<prompt>". Each invocation creates a fresh run.',lsCommand:"lmctl ls --provider miniplayer"}}resumeCommand(){throw new Error("miniplayer has no interactive terminal or session resume")}async seed(){return{success:!1,error:'miniplayer does not support team session resume; use lmctl prompt --provider miniplayer --model <model> "<prompt>"'}}}}import{join as Ep}from"node:path";import{readdir as oi,stat as hp,unlink as YS}from"node:fs/promises";import{join as Hn,basename as yp}from"node:path";function zS(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function QS(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return re(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}function ZS(t,e){t.input=Math.max(t.input,e.input),t.cacheRead=Math.max(t.cacheRead,e.cacheRead),t.cacheWrite=Math.max(t.cacheWrite,e.cacheWrite),t.output=Math.max(t.output,e.output),t.cacheWriteSplitExposed||=e.cacheWriteSplitExposed,e.cacheWrite5m!==void 0&&(t.cacheWrite5m=Math.max(t.cacheWrite5m??0,e.cacheWrite5m)),e.cacheWrite1h!==void 0&&(t.cacheWrite1h=Math.max(t.cacheWrite1h??0,e.cacheWrite1h))}function eb(t){let e=t?.cache_creation?.ephemeral_5m_input_tokens,n=t?.cache_creation?.ephemeral_1h_input_tokens,r=typeof e=="number"||typeof n=="number",s=(e??0)+(n??0);return{input:t?.input_tokens??0,cacheRead:t?.cache_read_input_tokens??0,cacheWrite:Math.max(t?.cache_creation_input_tokens??0,s),...typeof e=="number"?{cacheWrite5m:e}:{},...typeof n=="number"?{cacheWrite1h:n}:{},cacheWriteSplitExposed:r,output:t?.output_tokens??0}}function tb(t){let e=t.cacheWrite1h??0;if(!t.cacheWriteSplitExposed)return{total:t.cacheWrite,fiveMinute:t.cacheWrite,oneHour:0};let n=t.cacheWrite5m??Math.max(0,t.cacheWrite-e),r=n+e;return{total:Math.max(t.cacheWrite,r),fiveMinute:r>t.cacheWrite?n:n+(t.cacheWrite-r),oneHour:e}}async function Tp(t){let e=0,n=0,r=0,s=0,i=0,o=0,a,l,d=new Map,u=[];for await(let f of le(t))if(!f.isSidechain){if(f.type==="user"&&!f.isMeta&&f.message){let g=f.message.content;if(typeof g=="string"){if(g.includes("<command-name>")||g.includes("<local-command-"))continue;e++,l=B(g.trim(),80)}}else if(f.type==="assistant"&&f.message){let g=f.message.content;if(Array.isArray(g))for(let h of g)h.type==="text"&&e++;let _=f.message.usage;if(_){let h=eb(_),E=f.message.id?.trim();if(E){let T=d.get(E);T?ZS(T,h):d.set(E,h)}else u.push(h);let y=h.input+h.cacheWrite+h.cacheRead;y&&(o=y),a={inputTokens:h.input,cacheWriteInputTokens:h.cacheWrite,cachedInputTokens:h.cacheRead,outputTokens:h.output}}}}let c=0,m=0,p=f=>{let g=tb(f);n+=f.input+f.cacheRead+g.total,r+=f.cacheRead,s+=g.total,c+=g.fiveMinute,m+=g.oneHour,i+=f.output};for(let f of d.values())p(f);for(let f of u)p(f);return{messageCount:e,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalCacheWrite5mInputTokens:c,totalCacheWrite1hInputTokens:m,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a,lastUserMessage:l}}var ai=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Hn(J,".claude"),this.projectsDir=Hn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await oi(this.projectsDir)}catch{return e}for(let r of n){let s=Hn(this.projectsDir,r);if(!(await hp(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await oi(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=yp(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let d=Hn(s,a);try{let u=await this.extractSummary(d,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,n){let r=await Fe(e,50),s=await pe(e),i="",o,a,l,d,u,c;for(let p of r)if(!zS(p.type)&&(!i&&p.cwd&&(i=p.cwd),!o&&p.slug&&(o=p.slug),!a&&p.version&&(a=p.version),!c&&p.timestamp&&(c=new Date(p.timestamp)),p.type==="assistant"&&p.message?.model&&(l=p.message.model),p.type==="user"&&!p.isMeta&&p.message)){let f=p.message.content;if(typeof f=="string"){if(f.includes("<command-name>")||f.includes("<local-command-"))continue;d||(d=B(f.trim(),80)),u=B(f.trim(),80)}}if(!i)return null;let m=await Tp(e);return{provider:"claude",sessionId:n,slug:o,cwd:i,createdAt:c||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:d,lastUserMessage:m.lastUserMessage??u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:m.totalCacheWriteInputTokens||void 0,totalCacheWrite5mInputTokens:m.totalCacheWrite5mInputTokens||void 0,totalCacheWrite1hInputTokens:m.totalCacheWrite1hInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await pe(n),s=[],i="",o,a,l,d,u,c,m,p=e,f,g=[];for await(let h of le(n))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!d&&h.gitBranch&&(d=h.gitBranch),!m&&h.timestamp&&(m=new Date(h.timestamp)),h.sessionId&&(p=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:QS(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let E=new Date(h.timestamp||0),y=h.message.content;if(h.isCompactSummary!==!0&&h.isVisibleInTranscriptOnly!==!0&&h.promptSource!=="system"&&h.toolUseResult===void 0&&h.origin?.kind!=="task-notification"&&h.interruptedMessageId===void 0&&h.interruptedByShutdown!==!0&&h.scheduledTaskId===void 0&&h.scheduledFireId===void 0&&!(Array.isArray(y)&&y.some(T=>T.type==="tool_result"))){let T=typeof y=="string"?y:Array.isArray(y)?y.filter(v=>v.type==="text"&&typeof v.text=="string").map(v=>v.text).join(`
1793
+ `):"";T&&!/^<(?:command-name>|local-command-|task-notification>\s*<)/u.test(T.trimStart())&&!/^<system-reminder>[\s\S]*<\/system-reminder>$/u.test(T.trim())&&!T.trimStart().startsWith("lmctl seed initial connection only.")&&g.push(T)}if(typeof y=="string"){let T=y.trim();if(T.includes("<command-name>")||T.includes("<local-command-")||/^<task-notification>\s*</u.test(T)||T.startsWith("lmctl seed initial connection only.")||/^<system-reminder>[\s\S]*<\/system-reminder>$/u.test(T))continue;u||(u=B(y.trim(),80)),c=B(y.trim(),80),f=void 0,s.push({role:"user",timestamp:E,content:re(y.trim())})}else if(Array.isArray(y)){for(let T of y)if(T.type==="tool_result"){let v=typeof T.content=="string"?re(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:E,content:v,toolCallId:T.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.stop_reason===null||h.message.stop_reason==="tool_use"?f="in_progress":typeof h.message.stop_reason=="string"&&(f="complete"),h.message.model&&(l=h.message.model);let E=new Date(h.timestamp||0),y=h.message.content;if(Array.isArray(y))for(let T of y)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:E,content:re(T.text),model:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.message.stop_reason}:{}}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:E,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolInputData:T.input,toolCallId:T.id,model:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.message.stop_reason}:{}}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:E,content:T.thinking})}}if(!i)return null;nb(s);let _=await Tp(n);return{provider:"claude",sessionId:p,slug:o,cwd:i,createdAt:m||r.createdAt,modifiedAt:r.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:d,turnStatus:f,firstUserMessage:u,lastUserMessage:c,messageCount:_.messageCount,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:_.totalCacheWriteInputTokens||void 0,totalCacheWrite5mInputTokens:_.totalCacheWrite5mInputTokens||void 0,totalCacheWrite1hInputTokens:_.totalCacheWrite1hInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:s,userPrompts:g}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await YS(n),!0):!1}async resolveSessionFile(e){let n;try{n=await oi(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=Hn(this.projectsDir,o);if(!(await hp(a).catch(()=>null))?.isDirectory())continue;let d;try{d=await oi(a)}catch{continue}for(let u of d){if(!u.endsWith(".jsonl"))continue;let c=yp(u,".jsonl");/^[0-9a-f]{8}-/.test(c)&&r.push({filePath:Hn(a,u),fileSessionId:c})}}let s=r.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of r){let a=await Fe(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}};function nb(t){let e=rb(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/Command running in background with ID:\s*([A-Za-z0-9_-]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function rb(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}function Ta(t){return new ya(t)}var ya=class extends Z{claudeDir;constructor(e){super({provider:new ai(e),protocol:{transport:"stream-json",perTurnCancellation:"process",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",V,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:si}),this.claudeDir=e?.claudeDir??Ep(J,".claude")}openSession(e){return ii({...e,binary:"claude",sessionFileRoots:e.sessionFileRoots??[Ep(this.claudeDir,"projects")]})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}};import{readdir as sb,stat as vp,unlink as ib}from"node:fs/promises";import{join as Dr,basename as ob}from"node:path";var ab=new Set(["agents_md.instructions","environments.environment_context","plugins.recommendations","plugins.usage_instructions","apps.instructions","collaboration_mode.instructions","generic.developer_instructions","host_skills.instructions","model_switch.instructions","multi_agent.mode_instructions","multi_agent.role_instructions","multi_agent.usage_hint","permissions.instructions","skills.instructions"]);function Ea(t,e){if(!Array.isArray(t)||e>=t.length)return!1;let n=t[e];return typeof n=="string"&&ab.has(n)}function lb(t,e,n){return`${t}|${e.toISOString()}|${n}`}function Pr(t,e,n){let r=lb(n.role,n.timestamp,n.content);e.has(r)||(e.add(r),t.push(n))}function wp(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function db(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function Bn(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(n=>{if(typeof n=="string")return n;if(n&&typeof n=="object"){let r=n;if(typeof r.text=="string")return r.text;if(typeof r.image_url=="string")return"[input_image]";if(typeof r.type=="string")return`[${r.type}]`}return Bn(n)}).filter(n=>n.length>0).join(`
1794
+ `);try{return JSON.stringify(t)}catch{return String(t)}}function ub(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function cb(t,e){if(e===void 0)return;let n={input:e};if(t!=="apply_patch"||typeof e!="string")return n;let r=[...e.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return r.length>0&&(n.path=r[0].path,n.paths=r.map(s=>s.path),n.kinds=r.map(s=>s.kind)),n}async function Sp(t){let e=0,n=0,r=0,s=0,i=0,o,a,l=new Set,d,u;for await(let c of le(t)){if(c.type==="event_msg"&&c.payload?.type==="user_message"){let m=c.payload.message||c.payload.text;m&&(u=B(m.trim(),80))}if(c.type==="response_item"&&c.payload){let m=c.payload;if(m.type==="message"&&m.role==="user"&&m.content){let p=m.internal_chat_message_metadata_passthrough?.content_item_kinds;for(let f=0;f<m.content.length;f++){let g=m.content[f];Ea(p,f)||g.type==="input_text"&&typeof g.text=="string"&&g.text&&(e++,u=B(g.text.trim(),80))}}else if(m.type==="message"&&m.role==="assistant"&&m.content)for(let p of m.content)p.type==="output_text"&&typeof p.text=="string"&&p.text&&e++}if(c.payload&&typeof c.payload.model_context_window=="number"&&(d=c.payload.model_context_window),c.type==="event_msg"&&c.payload?.type==="token_count"&&c.payload.info?.total_token_usage){let m=c.payload.info.total_token_usage;n=m.input_tokens??n,r=m.cached_input_tokens??m.cache_read_input_tokens??r,s=m.output_tokens??s,i=m.reasoning_output_tokens??i;let p=c.payload.info.last_token_usage;if(p&&typeof p.input_tokens=="number"&&typeof p.output_tokens=="number"){let g=JSON.stringify([c.timestamp??null,c.ordinal??null,m,p]);if(!l.has(g)){l.add(g);let _=[p.input_tokens,p.cached_input_tokens??p.cache_read_input_tokens??0,p.output_tokens,p.reasoning_output_tokens??0];a??=[0,0,0,0],_.forEach((h,E)=>{a[E]+=h})}}let f=db(c.payload.info.last_token_usage);f&&(o=f),typeof c.payload.info.model_context_window=="number"&&(d=c.payload.info.model_context_window)}}return a&&([n,r,s,i]=a),{messageCount:e,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:d,lastUserMessage:u}}var li=class{name="codex";codexDirs;constructor(e={}){let n=[Dr(J,".codex"),Dr(J,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let r=[e.codexDir||n[0],e.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Dr(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let n of this.codexDirs){let r=Dr(n,"sessions");try{await vp(r),e.push(r)}catch{}}return e}async discoverSessions(){let e=[],n=await this.getSessionsDirs();for(let r of n){let s=await this.findSessionFiles(r);for(let i of s)try{let o=await this.extractSummary(i);o&&e.push(o)}catch{}}return e}async findSessionFiles(e){let n=[],r;try{r=await sb(e)}catch{return n}for(let s of r){let i=Dr(e,s),o=await vp(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);n.push(...a)}else s.endsWith(".jsonl")&&n.push(i)}return n}extractSessionIdFromFilename(e){let n=ob(e,".jsonl"),r=n.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async extractSummary(e){let n=await Fe(e,30),r=await pe(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,d,u,c,m;for(let f of n){if(f.type==="session_meta"&&f.payload&&(f.payload.id&&(s=f.payload.id),f.payload.cwd&&(i=f.payload.cwd),f.payload.cli_version&&(o=f.payload.cli_version),f.payload.timestamp&&(l=new Date(f.payload.timestamp)),f.payload.originator&&(c=f.payload.originator),f.payload.source&&(m=f.payload.source)),f.type==="turn_context"&&f.payload&&(f.payload.model&&(a=f.payload.model),!i&&f.payload.cwd&&(i=f.payload.cwd)),f.type==="event_msg"&&f.payload?.type==="user_message"){let g=f.payload.message||f.payload.text;g&&(d||(d=B(g.trim(),80)),u=B(g.trim(),80))}if(f.type==="response_item"&&f.payload?.type==="message"&&f.payload.role==="user"&&f.payload.content){let g=f.payload.internal_chat_message_metadata_passthrough?.content_item_kinds;for(let _=0;_<f.payload.content.length;_++){let h=f.payload.content[_];Ea(g,_)||h.type==="input_text"&&typeof h.text=="string"&&h.text&&(d||(d=B(h.text.trim(),80)),u=B(h.text.trim(),80))}}}if(!i)return null;let p=await Sp(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:wp(c,m),firstUserMessage:d,lastUserMessage:p.lastUserMessage??u,messageCount:p.messageCount,filePath:e,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow}}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await pe(n),s=[],i="",o,a,l,d,u,c=e,m,p,f=new Set,g=[],_=new Set,h=[],E=(v,b)=>{let S=h.find(R=>!R.mirrored&&R.source!==b&&R.text===v);S?S.mirrored=!0:h.push({text:v,source:b,mirrored:!1})},y=()=>{g.push(...h.map(v=>v.text)),h=[]};for await(let v of le(n)){let b=v.timestamp?new Date(v.timestamp):new Date;if(v.type==="session_meta"&&v.payload){v.payload.id&&(c=v.payload.id),v.payload.cwd&&(i=v.payload.cwd),v.payload.cli_version&&(o=v.payload.cli_version),v.payload.timestamp&&(l=new Date(v.payload.timestamp)),m=wp(v.payload.originator,v.payload.source);continue}if(v.type==="turn_context"&&v.payload){v.payload.model&&(a=v.payload.model),!i&&v.payload.cwd&&(i=v.payload.cwd);continue}if(v.type==="response_item"&&v.payload){let S=v.payload;if(S.type==="message"){if(S.role==="user"&&S.content){let R=S.internal_chat_message_metadata_passthrough?.content_item_kinds;if(Array.isArray(R)){let O=S.content.filter((N,A)=>R[A]==="user.text"&&typeof N.text=="string").map(N=>N.text).join(`
1795
+ `);R.includes("user.text")&&O&&(!S.id||!_.has(S.id))&&(E(O,"metadata"),S.id&&_.add(S.id))}for(let O=0;O<S.content.length;O++){let N=S.content[O];if(!Ea(R,O)&&N.type==="input_text"&&typeof N.text=="string"&&N.text){let A=N.text.trim();d||(d=B(A,80)),u=B(A,80),Pr(s,f,{role:"user",timestamp:b,content:re(A)})}}continue}if(S.role==="assistant"&&S.content){for(let R of S.content)R.type==="output_text"&&typeof R.text=="string"&&R.text&&Pr(s,f,{role:"assistant",timestamp:b,content:re(R.text),model:a});continue}if(S.role!=="user"&&S.role!=="assistant"&&S.content){for(let R of S.content)(R.type==="input_text"||R.type==="output_text")&&typeof R.text=="string"&&R.text&&Pr(s,f,{role:"system",timestamp:b,content:re(R.text.trim())});continue}}if(S.type==="function_call"){s.push({role:"tool_use",timestamp:b,content:S.name||"unknown tool",toolName:S.name,toolInput:S.arguments!==void 0?re(Bn(S.arguments)):void 0,toolInputData:ub(S.arguments),toolCallId:S.call_id});continue}if(S.type==="function_call_output"){s.push({role:"tool_result",timestamp:b,content:re(Bn(S.output)),toolCallId:S.call_id});continue}if(S.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:b,content:S.name||"unknown tool",toolName:S.name,toolInput:S.input!==void 0?re(Bn(S.input)):void 0,toolInputData:cb(S.name,S.input),toolCallId:S.call_id});continue}if(S.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:b,content:re(Bn(S.output)),toolCallId:S.call_id});continue}if(S.type==="reasoning"&&S.summary){let R=S.summary.map(O=>Bn(O.text)).join(`
1796
+ `);R.trim()&&Pr(s,f,{role:"thinking",timestamp:b,content:re(R)});continue}}if(v.type==="event_msg"&&v.payload&&(v.payload.type==="task_started"?(y(),p="in_progress"):v.payload.type==="task_complete"?p="complete":v.payload.type==="turn_aborted"&&(p="aborted"),v.payload.type==="user_message"&&typeof v.payload.message=="string"&&E(v.payload.message,"event"),v.payload.type==="agent_reasoning")){let S=v.payload.message||v.payload.text;S&&Pr(s,f,{role:"thinking",timestamp:b,content:re(S)})}}if(!i)return null;y();let T=await Sp(n);return{provider:"codex",sessionId:c,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:m,turnStatus:p,firstUserMessage:d,lastUserMessage:u,messageCount:T.messageCount,filePath:n,totalInputTokens:T.totalInputTokens||void 0,totalCachedInputTokens:T.totalCachedInputTokens||void 0,totalOutputTokens:T.totalOutputTokens||void 0,totalReasoningOutputTokens:T.totalReasoningOutputTokens||void 0,lastInputTokens:T.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:T.lastTokenUsage,modelContextWindow:T.modelContextWindow,messages:s,userPrompts:g}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await ib(n),!0):!1}async resolveSessionFile(e){let n=await this.getSessionsDirs(),r=[];for(let i of n){let o=await this.findSessionFiles(i);r.push(...o)}for(let i of r)if(this.extractSessionIdFromFilename(i)===e)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await Fe(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}};import{execFile as mb}from"node:child_process";import{realpathSync as bp,readdirSync as pb}from"node:fs";import{homedir as fb}from"node:os";import{join as di,resolve as Rp,sep as gb}from"node:path";function Sa(t){return new wa(t)}var va="gpt-5.6-sol",wa=class extends Z{nativeLaunchFailureHint="If the message mentions a shared background server or feature mismatch, it could be a CLI/daemon version mismatch: compare codex --version with codex app-server daemon version (cliVersion vs appServerVersion) and search the web for the error text.";constructor(e){super({provider:new li(e),protocol:{transport:"codex-app-server",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${V}
1797
+ `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:gp})}async preflightNativeLaunch(e){let n=performance.now()+1800,r=(O,N)=>new Promise(A=>{let w=Math.ceil(n-performance.now());if(w<=0){A(void 0);return}let I,C=()=>{try{I?.kill("SIGKILL")}catch{}},k=()=>{C()},x=()=>{C()},P=()=>{C()};process.once("exit",k),process.once("SIGINT",x),process.once("SIGTERM",P);let L=()=>{process.removeListener("exit",k),process.removeListener("SIGINT",x),process.removeListener("SIGTERM",P)};I=mb(O,N,{cwd:e.cwd,env:e.env,signal:e.signal,timeout:w,killSignal:"SIGKILL",maxBuffer:65536},(W,D)=>{L(),A(W?void 0:D)})}),s=await r(e.binary,["app-server","daemon","version"]);if(s===void 0)return{kind:"ok"};let i;try{i=JSON.parse(s)}catch{let O=s.match(/\{[\s\S]*\}/);if(O)try{i=JSON.parse(O[0])}catch{return{kind:"ok"}}else return{kind:"ok"}}let o=O=>typeof O=="string"&&/^\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?(?:\+[A-Za-z0-9.-]+)?$/.test(O)&&O.length<=100,a=typeof i?.cliVersion=="string"?i.cliVersion:typeof i?.cli_version=="string"?i.cli_version:"",l=typeof i?.appServerVersion=="string"?i.appServerVersion:typeof i?.app_server_version=="string"?i.app_server_version:"",d=a.trim(),u=l.trim(),c=typeof i?.status=="string"?i.status.toLowerCase():"";if(!(c==="running"||c==="alreadyrunning")||!o(d)||!o(u))return{kind:"ok"};if(d===u)return{kind:"ok"};let p="codex CLI "+d+" differs from the running codex daemon "+u,f="To align your CLI: npm i -g @openai/codex@"+u,g=p+"; using the daemon's binary. "+f,_={kind:"ok",message:p+"; no matching daemon binary is available, launching the PATH CLI. "+f},h=Rp(e.cwd,e.env.CODEX_HOME||di(e.env.HOME||fb(),".codex")),E=[],y=[],T=process.platform==="win32"?"codex.exe":"codex",v=i.managedCodexPath??i.managed_codex_path;typeof v=="string"&&v.trim().length>0&&E.push(v.trim());let b=O=>O.replace(/\+.*$/,""),S=b(u),R=process.arch==="arm64"?"aarch64":"x86_64";for(let O of["app-server-daemon","standalone"]){let N=di(h,"packages",O,"releases");try{y.push(bp(N)+gb);let A=pb(N).filter(w=>process.arch==="x64"&&(w.includes("aarch64")||w.includes("arm64"))||process.arch==="arm64"&&(w.includes("x86_64")||w.includes("x64")||w.includes("i686"))?!1:w===u||w===S||w.startsWith(u+"-")||w.startsWith(S+"-"));A.sort((w,I)=>{let C=w.includes(R)?0:1,k=I.includes(R)?0:1;return C!==k?C-k:w.localeCompare(I)});for(let w of A)E.push(di(N,w,"bin",T)),E.push(di(N,w,T))}catch{}}for(let O of new Set(E)){if(performance.now()>=n||e.signal?.aborted)break;let N;try{if(N=bp(Rp(e.cwd,O)),!y.some(I=>N.startsWith(I)))continue}catch{continue}let w=(await r(N,["--version"]))?.trim().match(/^codex(?:-cli)?\s+([0-9A-Za-z.+-]+)/)?.[1];if(w&&(w===u||b(w)===S))return{kind:"use-binary",binary:N,message:g}}return _}openSession(e){return _p({...e,model:e.model??va})}seedArgsFor(e){let n=super.seedArgsFor(e),r=e?.model??va;return[...n.slice(0,-1),"--model",r,n[n.length-1]]}turnOptsFor(e){return e.model?e:{...e,model:va}}};import{readFileSync as bb,writeFileSync as Rb,mkdirSync as kb}from"node:fs";import{join as Ib,dirname as Ab}from"node:path";import{randomUUID as Cb}from"node:crypto";import{createHash as _b}from"node:crypto";import{readdir as Mr,readFile as kp,stat as ui,unlink as hb}from"node:fs/promises";import{join as He,basename as yb,dirname as Tb}from"node:path";import{cwd as Eb}from"node:process";function ba(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ip(t){return t==="user"}function Ra(t){return t==="gemini"||t==="assistant"}function un(t,e=new Date(0)){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function vb(t){return`${t.sessionId}\0${t.cwd}`}function wb(t,e){let n=t.filePaths??[t.filePath],r=e.filePaths??[e.filePath],s=[...new Set([...n,...r])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function ci(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Ap(t){let e=0,n=0,r=0,s=0,i=0,o;for(let a of t){if(!Ra(a.type)||!a.tokens)continue;let l=ci(a.tokens.input),d=ci(a.tokens.cached),u=Math.max(l-d,0),c=ci(a.tokens.output),m=ci(a.tokens.thoughts);e+=l,n+=d,r+=c,s+=m,i=l,o={inputTokens:u,cachedInputTokens:d,cacheWriteInputTokens:0,outputTokens:c,reasoningOutputTokens:m,totalTokens:l+c+m}}return{totalInputTokens:e,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function Sb(t){return _b("sha256").update(t).digest("hex")}function Ur(t,e){let n=e;for(;n&&!t.has(n);){t.add(n);let r=Tb(n);if(r===n)break;n=r}}var mi=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let n=e.geminiDir||He(J,".gemini");this.geminiProjectsFile=He(n,"projects.json"),this.geminiTmpDir=He(n,"tmp");let r=e.claudeDir||He(J,".claude");this.claudeProjectsDir=He(r,"projects");let s=[He(J,".codex"),He(J,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>He(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),n=new Map;for(let r of e)try{let s=await this.extractSummary(r);if(!s)continue;let i=vb(s),o=n.get(i);n.set(i,o?wb(o,s):s)}catch{}return[...n.values()]}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await pe(n),i=[],o=[],a=r.messages||[],l=r.sessionId||this.extractSessionIdFromFilename(n),d=r.projectHash||"",u=await this.resolveWorkspace(d),c,m,p;for(let h of a){let E=un(h.timestamp),y=h.type,T=re(ba(h.content));if(Ip(y)){let b=ba(h.content);b&&o.push(b);let S=T.trim();S&&(c||(c=B(S,80)),m=B(S,80)),i.push({role:"user",timestamp:E,content:S||T});continue}if(Ra(y)){h.model&&(p=h.model);for(let b of h.thoughts||[]){let S=[b.subject,b.description].filter(Boolean).join(`
1798
+ `).trim();S&&i.push({role:"thinking",timestamp:un(b.timestamp,E),content:re(S)})}i.push({role:"assistant",timestamp:E,content:T,model:h.model});continue}let v=y?`[${y}] `:"";i.push({role:"system",timestamp:E,content:`${v}${T}`.trim()})}let f=un(r.startTime,s.createdAt),g=un(r.lastUpdated,s.modifiedAt),_=Ap(a);return{provider:"gemini",sessionId:l,cwd:u,createdAt:f,modifiedAt:g,model:p,startCommand:"gemini",firstUserMessage:c,lastUserMessage:m,messageCount:i.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i,userPrompts:o}}async extractSummary(e){let n=await this.readSessionFile(e);if(!n)return null;let r=await pe(e),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(e),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,d,u,c=0;for(let p of s)if(Ip(p.type)){c++;let f=ba(p.content).trim();f&&(l||(l=B(re(f),80)),d=B(re(f),80))}else Ra(p.type)&&(c++,p.model&&(u=p.model));let m=Ap(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:un(n.startTime,r.createdAt),modifiedAt:un(n.lastUpdated,r.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:d,messageCount:c,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastInputTokens||void 0,lastTokenUsage:m.lastTokenUsage}}async readSessionFile(e){let n=await kp(e,"utf-8");if(pr(n)==="unknown")return M({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:n.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return Kt(n)}catch{return null}}extractSessionIdFromFilename(e){let n=yb(e).replace(/\.jsonl?$/,""),r=n.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async findSessionFiles(){let e=[],n;try{n=await Mr(this.geminiTmpDir)}catch{return e}for(let r of n){let s=He(this.geminiTmpDir,r,"chats");if(!(await ui(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Mr(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(He(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await hb(n),!0):!1}async resolveSessionFile(e){let n=await this.findSessionFiles(),r=[];for(let s of n){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===e||a.startsWith(e),d=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!d)continue;let u=await pe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:un(i?.lastUpdated,u.modifiedAt)})}return r.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),r[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;Ur(e,Eb());for(let r of this.extraWorkspacePaths)Ur(e,r);for(let r of await this.collectGeminiProjectPaths())Ur(e,r);for(let r of await this.collectCodexCwds())Ur(e,r);for(let r of await this.collectClaudeCwds())Ur(e,r);let n=new Map;for(let r of e)n.set(Sb(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let e;try{e=await kp(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(e).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await Fe(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,n;try{n=await Mr(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=He(this.claudeProjectsDir,r);if(!(await ui(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Mr(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=He(s,a),u=(await Fe(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let n=[];if(!(await ui(e).catch(()=>null))?.isDirectory())return n;let s;try{s=await Mr(e)}catch{return n}for(let i of s){let o=He(e,i),a=await ui(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);n.push(...l)}else i.endsWith(".jsonl")&&n.push(o)}return n}};function Ia(t){return new ka(t)}var ka=class extends Z{constructor(e){super({provider:new mi(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!1,canResumeInteractive:!1,canFork:!0,forkSupport:"automatic",canStructuredTurn:!1,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",V,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:()=>Promise.reject(new Error(on))})}seed(e,n){return Promise.resolve({success:!1,error:on})}sendTurn(e,n){return Promise.reject(new Error(on))}openSession(e){return Promise.reject(new Error(on))}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
1799
+ `)}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:Fs,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,n){let r=await this.resolvePath(e);if(!r)return{success:!1,error:`Session file not found for ${e}`};try{let s=bb(r,"utf-8"),i=pr(s),o=Kt(s),a=Cb();o.sessionId=a,o.kind="main";let l=Ab(r),d=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=i==="jsonl"?".jsonl":".json",c=`session-${d}-${a.slice(0,8)}${u}`,m=Ib(l,c);return kb(l,{recursive:!0}),Rb(m,pu(o,i),"utf-8"),{success:!0,sessionId:a,filePath:m}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}};import{readdir as Cp,readFile as Nb,rm as xb,stat as Xn}from"node:fs/promises";import{basename as Ob,join as Ge}from"node:path";function Lb(t){if(!t)return null;let e={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},n=!1;for(let r of Object.values(t))r?.usage&&(n=!0,e.inputTokens+=r.usage.inputTokens??0,e.outputTokens+=r.usage.outputTokens??0,e.cacheReadTokens+=r.usage.cacheReadTokens??0,e.cacheWriteTokens+=r.usage.cacheWriteTokens??0,e.reasoningTokens+=r.usage.reasoningTokens??0);return n?e:null}function Aa(){return{shutdownTotals:null,assistantOutputSum:0}}function xp(t,e){if(e.type==="assistant.message"){let n=e.data?.outputTokens;typeof n=="number"&&(t.assistantOutputSum+=n,t.lastAssistantOutputTokens=n)}else if(e.type==="session.shutdown"){let n=Lb(e.data?.modelMetrics);n&&(t.shutdownTotals=n)}}function Np(t){let e=t.shutdownTotals,n=t.lastAssistantOutputTokens!==void 0?{outputTokens:t.lastAssistantOutputTokens}:void 0;return{totalInputTokens:e?.inputTokens,totalCachedInputTokens:e?.cacheReadTokens,totalCacheWriteInputTokens:e?.cacheWriteTokens,totalOutputTokens:e?.outputTokens??(t.lastAssistantOutputTokens===void 0?void 0:t.assistantOutputSum),totalReasoningOutputTokens:e?.reasoningTokens,lastTokenUsage:n}}function Db(t){let e={};for(let n of t.split(`
1800
+ `)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(e[r[1]]=r[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function cn(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function Pb(t){let e=0,n=Aa(),r;for await(let s of le(t)){if(s.type==="user.message"){e++;let i=(s.data?.content||"").trim();i&&(r=B(i,80))}else s.type==="assistant.message"&&(s.data?.content||"").trim()&&e++;xp(n,s)}return{messageCount:e,tokens:n,lastUserMessage:r}}var pi=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||Ge(J,".copilot");this.sessionStateDir=Ge(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await Cp(this.sessionStateDir)}catch{return e}for(let r of n){let s=Ge(this.sessionStateDir,r);if((await Xn(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.resolveSessionDir(e);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=Ge(n,"events.jsonl"),i=await Xn(s).catch(()=>null),o=i?s:Ge(n,"workspace.yaml"),a=await pe(i?s:n),l=[],d=[],u=r?.cwd||"(unknown workspace)",c,m,p,f,g,_,h=r?.id||Ob(n)||e,E=Aa();if(i)for await(let y of le(s)){let T=cn(y.timestamp)||a.modifiedAt;if(xp(E,y),y.type==="session.start"&&y.data){y.data.sessionId&&(h=y.data.sessionId),y.data.copilotVersion&&(m=y.data.copilotVersion),y.data.startTime&&(_=cn(y.data.startTime)),y.data.selectedModel&&(c=y.data.selectedModel),y.data.context&&(y.data.context.cwd&&(u=y.data.context.cwd),y.data.context.branch&&(p=y.data.context.branch));continue}if(y.type==="session.model_change"&&y.data?.newModel){c=y.data.newModel;continue}if(y.type==="user.message"&&y.data){let v=y.data.content||"";v&&d.push(v);let b=v.trim();b&&(f||(f=B(b,80)),g=B(b,80)),l.push({role:"user",timestamp:T,content:re(b||v)});continue}if(y.type==="assistant.message"&&y.data){let v=(y.data.content||"").trim();if(v&&l.push({role:"assistant",timestamp:T,content:re(v),model:c}),y.data.toolRequests)for(let b of y.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments?JSON.stringify(b.arguments,null,2):void 0,toolInputData:Be(b.arguments),toolCallId:b.toolCallId});continue}if(y.type==="tool.execution_complete"&&y.data){let v=y.data.result?.content||"",b=y.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:re(v),toolDetailedContent:b?re(b):void 0,toolCallId:y.data.toolCallId});continue}if(y.type==="assistant.reasoning"&&y.data?.content){l.push({role:"thinking",timestamp:T,content:re(y.data.content)});continue}if(y.type==="session.error"||y.type==="session.warning"||y.type==="session.info"||y.type==="system.message"){let v=y.data?.message||"";v.trim()&&l.push({role:"system",timestamp:T,content:re(v)});continue}}if(!f){let y=(r?.summary||"").trim();y&&(f=B(y,80))}return Mb(l),{provider:"copilot",sessionId:h,cwd:u,createdAt:_??cn(r?.created_at)??a.createdAt,modifiedAt:cn(r?.updated_at)??a.modifiedAt,model:c,cliVersion:m,startCommand:"copilot",gitBranch:p,firstUserMessage:f,lastUserMessage:g,messageCount:l.filter(y=>y.role==="user"||y.role==="assistant").length,filePath:o,...Np(E),messages:l,userPrompts:d}}async extractSummary(e,n){let r=await this.readWorkspaceYaml(e),s=Ge(e,"events.jsonl"),i=await Xn(s).catch(()=>null),o=i?s:Ge(e,"workspace.yaml"),a=await pe(i?s:e),l=i?await Fe(s,20):[],d=r?.id||n,u=r?.cwd||"(unknown workspace)",c,m,p,f,g;for(let h of l)if(h.type==="session.start"&&h.data&&(h.data.sessionId&&(d=h.data.sessionId),h.data.copilotVersion&&(m=h.data.copilotVersion),h.data.startTime&&(p=cn(h.data.startTime)),h.data.selectedModel&&(c=h.data.selectedModel),h.data.context?.cwd&&(u=h.data.context.cwd)),h.type==="session.model_change"&&h.data?.newModel&&(c||(c=h.data.newModel)),h.type==="user.message"&&h.data){let E=(h.data.content||"").trim();E&&(f||(f=B(E,80)),g=B(E,80))}if(!f){let h=(r?.summary||"").trim();h&&(f=B(h,80))}let _=i?await Pb(s):{messageCount:0,tokens:Aa()};return{provider:"copilot",sessionId:d,cwd:u,createdAt:p??cn(r?.created_at)??a.createdAt,modifiedAt:cn(r?.updated_at)??a.modifiedAt,model:c,cliVersion:m,startCommand:"copilot",firstUserMessage:f,lastUserMessage:_.lastUserMessage??g,messageCount:_.messageCount,filePath:o,...Np(_.tokens)}}async readWorkspaceYaml(e){let n=Ge(e,"workspace.yaml");try{let r=await Nb(n,"utf-8");return Db(r)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let n=await this.resolveSessionDir(e);return n?(await xb(n,{recursive:!0}),!0):!1}async resolveSessionDir(e){let n;try{n=await Cp(this.sessionStateDir)}catch{return null}if(n.includes(e)){let s=Ge(this.sessionStateDir,e);if((await Xn(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(e)){let i=Ge(this.sessionStateDir,s);(await Xn(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=Ge(this.sessionStateDir,s);if(!(await Xn(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}};function Mb(t){let e=Ub(t),n=new Map;for(let r of t){if(r.role!=="tool_use"||r.toolCallId===void 0)continue;if(r.toolName==="bash"){let l=e.get(r.toolCallId),u=[l?.content,l?.toolDetailedContent].filter(m=>typeof m=="string").join(`
1801
+ `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(u===void 0)continue;let c=`copilot-shell:${u}:${r.toolCallId}`;n.set(u,c),r.backgroundTaskId=c,l!==void 0&&(l.backgroundTaskId=c);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=n.get(i);if(o===void 0)continue;r.backgroundTaskId=o;let a=e.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function Ub(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}function Na(t){return new Ca(t)}var Ca=class extends Z{copilotDir;constructor(e){super({provider:new pi(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",V,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>Qe(n,{...r,acpTool:"copilot"})}),this.copilotDir=e?.copilotDir}openSession(e){return Ze({...e,env:this.copilotDir!==void 0?{...e.env??process.env,COPILOT_HOME:this.copilotDir}:e.env,binary:"copilot",acpTool:"copilot"})}async seed(e,n){let r=await super.seed(e,n);if(n?.model===void 0||n.model.trim().length===0)return r;let s="copilot seed does not implement per-session model selection";return $e({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}};function Oa(t){return new xa(t)}var xa=class extends Z{constructor(e){super({provider:new Wn(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",V],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(n,r)=>Qe(n,{...r,acpTool:"opencode"})})}openSession(e){return Ze({...e,binary:"opencode",acpTool:"opencode"})}seedArgsFor(e){let n=["run"];return e?.model&&n.push("--model",e.model),e?.effort&&n.push("--variant",e.effort),n.push(e?.prompt??V),n}};import{appendFile as Fb,mkdir as jb,readFile as Op,readdir as Lp,rm as $b,stat as Dp}from"node:fs/promises";import{basename as Wb,dirname as Hb,isAbsolute as Pp,join as mn,relative as Bb,resolve as La}from"node:path";var Xb="1.4",qb="1.5",Jb=new Set([Xb,qb]),fi=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=La(e?.kimiHome??process.env.KIMI_CODE_HOME??mn(J,".kimi-code")),this.sessionsDir=mn(this.homeDir,"sessions")}async discoverSessions(){let e=[];for(let n of await this.sessionFiles())try{let r=await this.summary(n);r&&e.push(r)}catch{}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){let n=await this.findSession(e);if(!n)return null;let r=await this.summary(n);if(!r)return null;let s=await this.parseWire(n.wirePath);return{...r,messages:s.messages,userPrompts:s.userPrompts}}async resolveSessionPath(e){return(await this.findSession(e))?.wirePath??null}async deleteSession(e){let n=await this.findSession(e);return n?(await $b(n.sessionDir,{recursive:!0,force:!0}),await jb(Hb(this.indexPath()),{recursive:!0,mode:448}),await Fb(this.indexPath(),`${JSON.stringify({sessionId:n.sessionId,deleted:!0})}
1802
+ `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return mn(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await Lp(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=mn(this.sessionsDir,s.name),o;try{o=await Lp(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=mn(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await Op(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:La(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:mn(n,"state.json"),wirePath:mn(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!Pp(e)||Wb(e)!==n)return!1;let r=Bb(this.sessionsDir,La(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Pp(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await Op(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await Dp(e.wirePath)}catch{return null}let s=await Dp(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=Da(n.createdAt)??s.birthtime,a=Da(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?B(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let n=[],r=[],s=new Set,i=!0,o,a,l,d=0,u=0,c=0,m=0,p=!1,f=0,g,_;for await(let h of le(e)){let E=Gb(h.time??h.created_at);if(i&&(i=!1,h.type==="metadata"&&!Jb.has(h.protocol_version))){let T=`Kimi transcript wire protocol version ${JSON.stringify(h.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:E,content:T}],userPrompts:[],messageCount:1,firstUserMessage:T,lastUserMessage:T}}if((h.type==="config.update"||h.type==="profile.bind")&&h.modelAlias&&(o=h.modelAlias),h.type==="usage.record"){h.model&&(o=h.model),p||=h.usage!==void 0;let T=h.usage?.inputOther??0,v=h.usage?.inputCacheRead??0,b=h.usage?.inputCacheCreation??0,S=h.usage?.output??0;d+=T,u+=v,c+=b,m+=S,h.usageScope==="turn"&&(g=T+v+b,_={inputTokens:T,cachedInputTokens:v,cacheWriteInputTokens:b,outputTokens:S,totalTokens:g+S});continue}if(h.type==="turn.prompt"&&h.origin?.kind==="user"){let T=Mp(h.input);T&&((!h.promptId||!s.has(h.promptId))&&(r.push(T),h.promptId&&s.add(h.promptId)),a??=B(T,80),l=B(T,80),n.push({role:"user",timestamp:E,content:T}),f++);continue}if(h.type==="turn.steer"){let T=Mp(h.input);T&&(n.push({role:"system",timestamp:E,content:T}),f++);continue}if(h.type!=="context.append_loop_event"||!h.event)continue;let y=h.event;y.type==="content.part"&&y.part?.type==="text"&&y.part.text?(n.push({role:"assistant",timestamp:E,content:y.part.text,model:o}),f++):y.type==="content.part"&&y.part?.type==="think"&&y.part.think?n.push({role:"thinking",timestamp:E,content:y.part.think,model:o}):y.type==="tool.call"?n.push({role:"tool_use",timestamp:E,content:y.name??"tool",toolName:y.name,toolInput:Up(y.args),toolInputData:Be(y.args),toolCallId:y.toolCallId,model:o}):y.type==="tool.result"&&n.push({role:"tool_result",timestamp:E,content:Vb(y.result),toolCallId:y.toolCallId,model:o})}return Kb(n),{messages:n,userPrompts:r,messageCount:f,model:o,firstUserMessage:a,lastUserMessage:l,totalInputTokens:p?d:void 0,totalCachedInputTokens:p?u:void 0,totalCacheWriteInputTokens:p?c:void 0,totalOutputTokens:p?m:void 0,lastInputTokens:g,lastTokenUsage:_}}};function Da(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function Gb(t){return typeof t=="number"?new Date(t):Da(t)??new Date(0)}function Mp(t){return typeof t=="string"?t.trim():Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e&&typeof e.text=="string"?e.text:"").filter(Boolean).join(`
1803
+ `).trim():""}function Up(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function Vb(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:Up(t)??""}function Kb(t){let e=Yb(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function Yb(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}function Ma(t){return new Pa(t)}var Pa=class extends Z{kimiHome;constructor(e){super({provider:new fi(e),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",V,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>Qe(n,{...r,acpTool:"kimi"})}),this.kimiHome=e?.kimiHome}openSession(e){return Ze({...e,env:this.kimiHome!==void 0?{...e.env??process.env,KIMI_CODE_HOME:this.kimiHome}:e.env,binary:"kimi",acpTool:"kimi"})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??V,"--output-format","stream-json"),n}};import{spawn as zb}from"node:child_process";import{mkdirSync as Qb}from"node:fs";function Fa(t){return new Ua(t)}var Ua=class extends Z{constructor(e){super({provider:new Wn({providerName:"lmplayer",startCommand:"lmplayer",dbPaths:e?.lmplayerDbPaths,dbPath:e?.lmplayerDbPath}),protocol:{transport:"lmplayer",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",V],resumeTemplate:"lmplayer tui --session {{session_id}}",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:Zb})}async sendTurn(e,n){let r=await super.sendTurn(e,n);return n.permissionMode==="plan"?{...r,warnings:[...r.warnings??[],"lmplayer does not enforce plan mode; this turn used full permissions"]}:r}seedArgsFor(e){return Fp({prompt:e?.prompt??V,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,n){Qb(e,{recursive:!0});let r=this.seedArgsFor(n);he("lmplayer",r);try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}let s=await $p(this.binary,r,{cwd:e,env:Fn(n?.env,e),signal:n?.signal});return s.code!==0&&s.code!==null?{success:!1,error:jp(s)}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${V}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}};async function Zb(t,e){let n=Date.now(),r=Fp({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});he("lmplayer",r,e.permissionMode??"yolo");let s=await $p(e.binary,r,{cwd:e.cwd,env:Ee(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(jp(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function Fp(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...Lt("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function jp(t){let n=[an(t.stderr).trim(),t.error].filter(Boolean).join(`
1804
+ `);return n?de(n,{provider:"lmplayer"}):`exit code ${t.code}`}function $p(t,e,n){return new Promise((r,s)=>{let i;try{i=zb(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",d,u,c,m=[],p=!1,f=g=>{let _=g.trim();if(!_)return;let h;try{h=JSON.parse(_)}catch{m.push(g),n.onText?.(g);return}if(!qn(h))return;let E=gi(h,!1);d===void 0&&E!==void 0&&(d=E),u=gi(h,!0)??u;let y=eR(h);y!==void 0&&(c=y);let T=Wp(h);T&&(m.push(T),n.onText?.(T))};i.stdout?.on("data",g=>{let _=g.toString("utf8");o+=_,l+=_;let h=l.indexOf(`
1805
+ `);for(;h>=0;){let E=l.slice(0,h);l=l.slice(h+1),f(E),h=l.indexOf(`
1806
+ `)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{p||(p=!0,l.length>0&&f(l),r({code:g,stdout:o,stderr:a,sessionId:d??u,text:m.join(""),error:c}))}),i.on("error",g=>{p||(p=!0,s(g))})})}function eR(t){let e=t.error;if(typeof e=="string"&&e.length>0)return e;if(qn(e)){let n=e.data;if(qn(n)&&typeof n.message=="string"&&n.message.length>0)return typeof e.name=="string"?`${e.name}: ${n.message}`:n.message;if(typeof e.message=="string"&&e.message.length>0)return e.message}}function Wp(t){for(let e of["text","content","delta","output","message"]){let n=t[e];if(typeof n=="string")return n}for(let e of["data","event","payload","part"]){let n=t[e];if(qn(n)){let r=Wp(n);if(r)return r}}}function gi(t,e){for(let r of["sessionID","sessionId","session_id"]){let s=t[r];if(typeof s=="string"&&s.length>0)return s}let n=t.session;if(typeof n=="string"&&n.length>0)return n;if(qn(n)){let r=gi(n,e);if(r!==void 0)return r}if(e){let r=t.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=t[r];if(qn(s)){let i=gi(s,e);if(i!==void 0)return i}}}function qn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}import{readdir as _i,readFile as tR,rm as nR}from"node:fs/promises";import{basename as Hp,join as Mt}from"node:path";function rR(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Fr(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function sR(t,e){if(!e)return;t.observed=!0;let n=Fr(e.promptTokenCount),r=Fr(e.cachedContentTokenCount),s=Fr(e.candidatesTokenCount),i=Fr(e.thoughtsTokenCount);t.totalInputTokens+=n,t.totalCachedInputTokens+=r,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=n,t.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:i,totalTokens:Fr(e.totalTokenCount)||n+s}}function iR(t){return{totalInputTokens:t.observed?t.totalInputTokens:void 0,totalCachedInputTokens:t.observed?t.totalCachedInputTokens:void 0,totalOutputTokens:t.observed?t.totalOutputTokens:void 0,totalReasoningOutputTokens:t.observed?t.totalReasoningOutputTokens:void 0,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}}function Bp(t){return t.type==="user"||t.message?.role==="user"}function Xp(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function qp(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
1807
+ `):Array.isArray(e.parts)?e.parts.filter(n=>!n.thought&&n.type!=="thinking").map(n=>n.text||"").join(`
1808
+ `):"":""}function Jp(t){return t.model||t.message?.model}function oR(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:Vp(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function jr(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function aR(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return jr(e.output??e.error??t)}return jr(t)}function Vp(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Gp(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:jr(t.args,!0),toolInputData:Be(t.args),toolCallId:t.id,model:n}}var hi=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Mt(J,".qwen")}async discoverSessions(){let e=Mt(this.baseDir,"projects"),n;try{n=await _i(e)}catch{return[]}let r=[];for(let s of n){let i=Mt(e,s,"chats"),o;try{o=await _i(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),d=Mt(i,a);try{let u=await this.extractSummary(d,l);u&&r.push(u)}catch{}}}return r}async extractSummary(e,n){let r=!1,s=await pe(e),i="(unknown)",o,a,l,d,u=0;for await(let c of le(e)){if(r=!0,c.cwd&&(i=c.cwd,c.version&&(a=c.version)),c.type==="system"&&c.cwd&&(i=c.cwd,c.version&&(a=c.version),c.model&&(o=c.model)),Bp(c)){let m=qp(c).trim();m&&(l||(l=B(m,80)),d=B(m,80),u++)}if(Xp(c)){let m=Jp(c);m&&(o=m),u+=oR(c)}}return r?{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:d,messageCount:u,filePath:e}:null}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Hp(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await pe(e),s="(unknown)",i,o,a,l,d,u,c=[],m=rR();for await(let p of le(e)){if(sR(m,p.usageMetadata),p.cwd&&(s=p.cwd,p.version&&(o=p.version),p.gitBranch&&(a=p.gitBranch)),p.type==="system"&&p.cwd&&(s=p.cwd,p.version&&(o=p.version),p.model&&(i=p.model),p.gitBranch&&(a=p.gitBranch)),!p.message)continue;let f=p.message,g=p.timestamp?new Date(p.timestamp):r.modifiedAt;if(p.type==="tool_result"){let _=Vp(p).filter(h=>h.functionResponse!==void 0);_.length===0&&p.toolCallResult?.callId&&c.push({role:"tool_result",timestamp:g,content:jr(p.toolCallResult.resultDisplay??p.toolCallResult.error??p.toolCallResult.status)??"tool result",toolCallId:p.toolCallResult.callId});for(let h of _){let E=h.functionResponse,y=aR(E.response),T=jr(p.toolCallResult?.resultDisplay);c.push({role:"tool_result",timestamp:g,content:T??y??p.toolCallResult?.status??"tool result",toolName:E.name,toolCallId:p.toolCallResult?.callId??E.id,...y!==void 0?{toolDetailedContent:y}:{}})}}else if(Bp(p)){let _=qp(p);_.trim()&&(d||(d=B(_.trim(),80)),u=B(_.trim(),80)),c.push({role:"user",timestamp:g,content:_})}else if(Xp(p)){let _=Jp(p);if(_&&(i=_),Array.isArray(f.content))for(let h of f.content)h.type==="text"&&h.text?c.push({role:"assistant",timestamp:g,content:h.text,model:_}):h.type==="thinking"&&h.thinking?c.push({role:"thinking",timestamp:g,content:h.thinking}):h.functionCall&&c.push(Gp(h.functionCall,g,_));else if(typeof f.content=="string")c.push({role:"assistant",timestamp:g,content:f.content,model:_});else if(Array.isArray(f.parts))for(let h of f.parts)if(h.thought||h.type==="thinking"){let E=h.thinking||h.text;E&&c.push({role:"thinking",timestamp:g,content:E})}else h.functionCall?c.push(Gp(h.functionCall,g,_)):h.text&&c.push({role:"assistant",timestamp:g,content:h.text,model:_})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:d,lastUserMessage:u,messageCount:c.filter(p=>p.role==="user"||p.role==="assistant").length,filePath:e,...iR(m),messages:c}}async resolveSessionPath(e){let n=Mt(this.baseDir,"projects");try{let r=await _i(n),s=[];for(let i of r){let o=Mt(n,i,"chats",`${e}.jsonl`);try{return await tR(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=Mt(n,i,"chats"),a;try{a=await _i(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Hp(l,".jsonl").startsWith(e)&&s.push(Mt(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await nR(n),!0}catch{return!1}}};function $a(t){return new ja(t)}var ja=class extends Z{constructor(e){super({provider:new hi(e),protocol:{transport:"stream-json",perTurnCancellation:"process",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",V,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:si})}openSession(e){return ii({...e,binary:"qwen"})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}};import{basename as kR}from"node:path";import{randomUUID as IR}from"node:crypto";import{readdir as Kp,readFile as Yp,rm as zp,stat as Qp}from"node:fs/promises";import{basename as Wa,join as et}from"node:path";import{fileURLToPath as lR}from"node:url";var yi=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||et(J,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:et(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=et(this.baseDir,"conversations"),n;try{n=await Kp(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Wa(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return et(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return et(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Qp(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await dR([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,d,u=0;if(r)for await(let c of le(r)){let m=nf(c.content);if(m&&(a=m),Zp(c)){let p=tf(c.content).trim();p&&(l||(l=B(p,80)),d=B(p,80)),u++}else ef(c)&&c.content&&u++}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:d,messageCount:u,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=sf(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,d=s.lastUserMessage,u=[],c=[];if(i)for await(let m of le(i)){let p=uR(m.created_at,s.modifiedAt),f=nf(m.content);if(f&&(a=f),Zp(m)){let g=tf(m.content),_=g.trim();_&&(l||(l=B(_,80)),d=B(_,80)),o.push({role:"user",timestamp:p,content:g});continue}if(Array.isArray(m.tool_calls))for(let g of m.tool_calls){let _=g.name||"tool",h=mR(g.args),E=Be(g.args),y={role:"tool_use",timestamp:p,content:h,toolName:_,toolInput:h,toolInputData:E};o.push(y),u.push({name:_,stepIndex:m.step_index,input:E,message:y})}if(ef(m)&&m.content)o.push({role:"assistant",timestamp:p,content:m.content,model:a});else if(cR(m)&&m.content){let g=_R(m,r),_=g===void 0?null:await this.readTaskLog(r,g),h={role:"tool_result",timestamp:_?.modifiedAt??p,content:m.content,toolName:m.type?.toLowerCase(),backgroundTaskId:g,..._===null?{}:{toolDetailedContent:_.content}};o.push(h),c.push({event:m,message:h})}m.thinking&&o.push({role:"thinking",timestamp:p,content:m.thinking})}return hR(u,c),{...s,model:a,firstUserMessage:l,lastUserMessage:d,messageCount:o.filter(m=>m.role==="user"||m.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await Qp(n),n}catch{}let r=et(this.baseDir,"conversations");try{let s=[];for(let i of await Kp(r)){if(!i.endsWith(".db"))continue;Wa(i,".db").startsWith(e)&&s.push(et(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=sf(n);return r?(await zp(this.conversationPath(r),{force:!0}),await zp(et(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await pR(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=et(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await Yp(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=et(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([Yp(r,"utf8"),pe(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}};async function dR(t){let e=await Promise.all(t.map(n=>pe(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function uR(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function Zp(t){return t.type==="USER_INPUT"}function ef(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function cR(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function tf(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function nf(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function mR(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function pR(t){for await(let e of le(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=fR(s);if(i)return i}let r=gR(e.content);if(r)return r}return null}function fR(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function gR(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function _R(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function hR(t,e){let n=new Set;for(let r of e){let s=yR(t,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function yR(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:wR(n.event.content);if(r!==void 0)return rf(t.filter(i=>!e.has(i)&&SR(i)===r),n.event.step_index);let s=vR(n.event);if(s!==void 0)return rf(t.filter(i=>!e.has(i)&&TR(i.name,n.event.type)&&of(ER(i))===s),n.event.step_index)}function rf(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function TR(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function ER(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function vR(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),of(e)}function of(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return lR(e)}catch{return}}function wR(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function SR(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function sf(t){if(t.endsWith(".db"))return Wa(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}import{spawn as bR}from"node:child_process";import{StringDecoder as af}from"node:string_decoder";function Ti(t){return async(e,n)=>{let r=Date.now(),s=t.buildArgs(e,n);t.assertArgs?.(s,n),n.onProgress?.({kind:"system",summary:`${t.label} -p one-shot started (no streaming events)`});let{stdout:i}=await RR(t.label,n.binary,s,{cwd:n.cwd,env:Ee(n.env,n.cwd,n.sessionId),signal:n.signal});return n.onProgress?.({kind:"system",summary:`${t.label} -p one-shot completed`}),{text:i.trimEnd(),sessionId:n.sessionId,durationMs:Date.now()-r}}}function RR(t,e,n,r){return new Promise((s,i)=>{if(r.signal?.aborted){i(new Error(`${t} turn aborted`));return}let o;try{o=bR(e,n,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(m){i(m);return}let a="",l="",d=new af("utf8"),u=new af("utf8");o.stdout?.on("data",m=>{a+=d.write(m)}),o.stderr?.on("data",m=>{l+=u.write(m)});let c=()=>{o.kill("SIGTERM"),i(new Error(`${t} turn aborted`))};o.on("error",m=>{r.signal?.removeEventListener("abort",c),i(m)}),o.on("close",(m,p)=>{if(r.signal?.removeEventListener("abort",c),a+=d.end(),l+=u.end(),m===0){s({stdout:a,stderr:l});return}let f=p?`signal ${p}`:`exit code ${m}`,g=l.trim()||a.trim();i(new Error(Un(`${t} failed (${f})`,g?de(g,{provider:t}):"")))}),r.signal?.aborted?c():r.signal?.addEventListener("abort",c,{once:!0})})}function Ba(t){return new Ha(t)}var Ha=class extends Z{constructor(e){super({provider:new yi(e),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",V,"--dangerously-skip-permissions","--print-timeout","2m"],seedTimeoutMs:13e4,resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:AR})}async sendTurn(e,n){if(n.requireResume){let s=await this.resolvePath(n.sessionId);if(s===null||kR(s)!==`${n.sessionId}.db`)throw new Error(`agy cannot resume missing conversation "${n.sessionId}"`)}let r=await super.sendTurn(e,n);return n.permissionMode==="plan"?{...r,warnings:[...r.warnings??[],"agy does not enforce plan mode; this turn used full permissions"]}:r}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}async seed(e,n){let r=IR(),s=`[lmctl-seed:${r}]`,i=await super.seed(e,{...n,prompt:nm({flightToken:r,prompt:n?.prompt})});if(!i.success&&(i.errorCode==="ENOENT"||i.errorCode==="ABORT_ERR"))return i;let o=(await this.provider.discoverSessions()).filter(a=>a.firstUserMessage?.startsWith(s));if(i.success&&o.length===1)return{...i,sessionId:o[0].sessionId};for(let a of o)await this.provider.deleteSession(a.sessionId);return{...i,success:!1,error:i.error??`agy seed created ${o.length} identifiable sessions; expected one`}}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}},AR=Ti({label:"agy",buildArgs:(t,e)=>{let n=[...e.sessionId?["--conversation",e.sessionId]:[],"-p",t,"--dangerously-skip-permissions","--print-timeout",CR(e.timeoutMs)];return e.model&&n.push("--model",e.model),n},assertArgs:(t,e)=>he("agy",t,e.permissionMode??"yolo")});function CR(t){return t!==void 0&&t<=0?"0":t===void 0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}import{randomUUID as ff}from"node:crypto";import{existsSync as gf,statSync as WR}from"node:fs";import{readFile as HR,mkdir as BR}from"node:fs/promises";import{existsSync as $r,readdirSync as NR,statSync as lf}from"node:fs";import{readdir as Xa,rm as xR}from"node:fs/promises";import df,{join as tt}from"node:path";var Ei=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||process.env.DSH_HOME||tt(J,".dsh");this.sessionsDir=tt(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await Xa(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await Xa(tt(this.sessionsDir,r))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(r,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.findSessionDir(e);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=uf(r),i=cf(r,n.filePath,s);return i?{...i,turnStatus:PR(r),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let n=await this.findSessionDir(e);return n?(await xR(tt(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,n){let r=OR(e),s=LR(e),i=r,o=tt(this.sessionsDir,r,n),a=tt(this.sessionsDir,s,n);!$r(o)&&$r(a)&&(i=s);let l=tt(this.sessionsDir,i,n);return Jn(l)}async findSessionDir(e){let n;try{n=await Xa(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=tt(this.sessionsDir,r,s);try{let o=Jn(i);if($r(o))return{cwdDir:r,sessionDir:s,filePath:o}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=tt(this.sessionsDir,e,n),i=Jn(s),o=await r(i),a=rs(o),l=[];for(let d of a.split(`
1809
+ `))if(d.trim())try{let u=JSON.parse(d);if(u.type?.endsWith("-chunks")||u.type==="assistant/chunk"&&u.data?.chunk?.type!=="usage")continue;l.push(u)}catch{}return l}async readSummary(e,n){let r=tt(this.sessionsDir,e,n),s=Jn(r),i=await this.readRecords(e,n);return i.length===0?null:cf(i,s,uf(i))}};function OR(t){if(t.length===0)throw new Error("cannot encode an empty project path");let e="",n=!1;for(let s=0;s<t.length;s++){let i=t.charCodeAt(s),o=String.fromCharCode(i);o==="/"||o==="\\"||o===":"?(n||(e+="-"),n=!0):o!=="~"&&/^[A-Za-z0-9._-]$/.test(o)?(e+=o,n=!1):(e+="~"+i.toString(16).toUpperCase().padStart(4,"0"),n=!1)}return`--${(e.replace(/^-+/,"")||"root").slice(0,251)}--`}function LR(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Jn(t,e){let n=e??(process.platform==="win32"?df.win32:df.posix),r=t,s="session.jsonl.zstd";if((t.endsWith(".jsonl.zstd")||t.endsWith(".jsonl"))&&(r=n.dirname(t),s=n.basename(t)),!$r(r))return t.endsWith(".jsonl.zstd")||t.endsWith(".jsonl")?t:n.join(t,s);try{let i=NR(r),o=[];for(let a of i){let l=/^session(?:\.v(\d+))?\.jsonl\.zstd$/.exec(a);if(l){let d=l[1]?parseInt(l[1],10):0;if(Number.isSafeInteger(d))try{let u=n.join(r,a);lf(u).isFile()&&o.push({name:a,version:d})}catch{}}}if(o.length>0)return o.sort((a,l)=>l.version-a.version),n.join(r,o[0].name)}catch{}try{if($r(t)&&lf(t).isFile())return t}catch{}return n.join(r,s)}function qa(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join("")}function DR(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&e.push(n.text);return e}function uf(t){let e=[];for(let n of t){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let i=r;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:qa(i.content)})}else if(n.type==="assistant/message"){let i=r.message;for(let o of DR(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:qa(i?.content),model:i?.source?.model})}else if(n.type==="tool/call"){let i=r,o;if(typeof i.arguments=="string")try{o=JSON.parse(i.arguments)}catch{}else i.arguments&&typeof i.arguments=="object"&&(o=i.arguments);e.push({role:"tool_use",timestamp:s,content:typeof i.arguments=="string"?i.arguments:JSON.stringify(i.arguments??{}),toolName:i.name,toolCallId:i.callId,toolInputData:o})}else if(n.type==="tool/result"){let i=r,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:qa(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function PR(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function cf(t,e,n){let r=t.find(p=>p.type==="session");if(!r)return null;let s=r,i=r.data,o=s.id??i?.id;if(!o)return null;let a;for(let p of t)if(p.type==="request/header"){let f=p.data?.header;f?.config?.model&&(a=f.config.model)}let l=t.map(p=>p.time).filter(p=>typeof p=="number"),d=s.createdAt??i?.createdAt,u=d?new Date(d):new Date(0),c=l.length>0?new Date(Math.max(...l)):u,m=n.filter(p=>p.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:u,modifiedAt:c,model:a,firstUserMessage:m[0]?.content,lastUserMessage:m.at(-1)?.content,messageCount:n.filter(p=>p.role==="user"||p.role==="assistant").length,filePath:e,...MR(t)}}function MR(t){let e=new Map;for(let o of t){let a=o.data?.turn??null,l=e.get(a)??[];l.push(o),e.set(a,l)}let n=[],r=[];for(let o of e.values()){let a=new jn("",-1,new Set);a.update(o);let l=a.usage();l&&(n.push(l),r.push(a.lastUsage()))}if(!n.length)return{};let s=o=>{if(n.some(l=>l.invalidCounters||l[o]===null))return;let a=n.reduce((l,d)=>l+d[o],0);return Number.isSafeInteger(a)?a:void 0},i=r.at(-1);return{totalInputTokens:s("inputUncached"),totalCachedInputTokens:s("cacheRead"),totalOutputTokens:s("output"),totalReasoningOutputTokens:s("reasoning"),lastInputTokens:i.inputUncached!==null&&i.cacheRead!==null?i.inputUncached+i.cacheRead:void 0,lastTokenUsage:{totalTokens:i.inputUncached!==null&&i.cacheRead!==null&&i.output!==null?i.inputUncached+i.cacheRead+i.output:void 0,inputTokens:i.inputUncached??void 0,cachedInputTokens:i.cacheRead??void 0,outputTokens:i.output??void 0,reasoningOutputTokens:i.reasoning??void 0}}}import{spawn as UR}from"node:child_process";import{randomUUID as FR}from"node:crypto";var jR=/dsh web:\s*(https?:\/\/\S+)/,mf=2e4;function Ja(t,e=[]){if(t==null)return t;if(typeof t=="string"){let n=t;for(let r of e)r&&typeof r=="string"&&r.length>=8&&n.includes(r)&&(n=n.replaceAll(r,"[REDACTED]"));return n=n.replace(/(?:sk-|dsh-)[A-Za-z0-9_\-\.]+/gi,"[REDACTED]"),n=n.replace(/(?:token=)[A-Za-z0-9_\-\.]+/gi,"token=[REDACTED]"),n=n.replace(/bearer\s+[A-Za-z0-9_\-\.]+/gi,"Bearer [REDACTED]"),n}if(Array.isArray(t))return t.map(n=>Ja(n,e));if(typeof t=="object"){let n={};for(let[r,s]of Object.entries(t))/api[_-]?key|secret|token|password|auth|authorization|credential|cookie/i.test(r)?n[r]="[REDACTED]":n[r]=Ja(s,e);return n}return t}function $R(t){let e;try{e=new URL(t)}catch{throw new Error("invalid dsh boot URL: malformed URL")}if(e.protocol!=="http:")throw new Error(`invalid dsh boot URL scheme "${e.protocol}": must be http:`);if(e.username||e.password)throw new Error("invalid dsh boot URL: userinfo credentials are not allowed");let n=e.hostname;if(!(n==="127.0.0.1"||n==="localhost"||n==="::1"||n==="[::1]"))throw new Error(`invalid dsh boot URL host "${n}": loopback host (127.0.0.1 or localhost) required`);return e}var pt=class t extends Error{method;detail;constructor(e,n,r=[]){let s=Ja(n,r),i=typeof s=="string"?s:JSON.stringify(s);super(`dsh RPC ${e} failed: ${i}`),this.name="DshRpcCallError",this.method=e,this.detail=s,Object.setPrototypeOf(this,t.prototype)}};function pf(t,e=2e3){if(!t||t.exitCode!==null||t.signalCode!==null)return;try{t.kill("SIGTERM")}catch{}let n,r=()=>{n!==void 0&&(clearTimeout(n),n=void 0)};if(t.once("exit",r),t.exitCode!==null||t.signalCode!==null){r();return}n=setTimeout(()=>{n=void 0;try{t.exitCode===null&&t.signalCode===null&&t.kill("SIGKILL")}catch{}},e),n.unref()}var Ga=class t{constructor(e,n,r,s=!1,i){this.baseUrl=e;this.child=n;this.cookie=r;this.isV2=s;this.tokenUrl=i;if(this.cookie&&this.recordSecret(this.cookie),this.tokenUrl){this.recordSecret(this.tokenUrl);try{let a=new URL(this.tokenUrl).searchParams.get("token");a&&this.recordSecret(a)}catch{}}}static MAX_RETAINED_SECRETS=8;cookieExchangePromise;knownSecrets=[];recordSecret(e){if(!e||typeof e!="string"||e.length<8)return;let n=r=>{if(r.length<8)return;let s=this.knownSecrets.indexOf(r);for(s!==-1&&this.knownSecrets.splice(s,1),this.knownSecrets.push(r);this.knownSecrets.length>t.MAX_RETAINED_SECRETS;)this.knownSecrets.shift()};if(n(e),e.includes("=")){let r=e.split("=")[1];r&&r.length>=8&&n(r)}}getSecretsToRedact(e=[]){let n=new Set;for(let r of this.knownSecrets)r&&r.length>=8&&n.add(r);if(this.cookie&&this.cookie.length>=8){n.add(this.cookie);let r=this.cookie.split("=")[1];r&&r.length>=8&&n.add(r)}if(this.tokenUrl)try{let s=new URL(this.tokenUrl).searchParams.get("token");s&&s.length>=8&&n.add(s)}catch{}for(let r of e)if(r&&r.length>=8&&(n.add(r),r.includes("="))){let s=r.split("=")[1];s&&s.length>=8&&n.add(s)}return Array.from(n)}static forTesting(e,n){let r=e,s=n?.isV2??!1,i=n?.cookie;try{let o=new URL(e);o.searchParams.has("token")&&(s=!0,r=o.origin)}catch{}return new t(r,void 0,i,s,e)}static async fromBootUrl(e,n,r){let s=$R(e),i=s.searchParams.has("token"),o;if(i)for(let a=0;a<5;a++){if(r?.aborted)throw new Error("dsh web boot aborted");try{let d=(await fetch(e,{redirect:"manual",signal:r})).headers.get("set-cookie");if(d){o=d.split(";")[0];break}}catch(l){if(r?.aborted)throw l;await new Promise(d=>setTimeout(d,100))}}return new t(s.origin,n,o,i,e)}async ensureCookie(e=!1){return this.tokenUrl?this.cookie&&!e?this.cookie:(this.cookieExchangePromise||(this.cookieExchangePromise=(async()=>{for(let n=0;n<5;n++)try{let r=AbortSignal.timeout(1e4),i=(await fetch(this.tokenUrl,{redirect:"manual",signal:r})).headers.get("set-cookie");if(i)return this.cookie=i.split(";")[0],this.recordSecret(this.cookie),this.cookie}catch{await new Promise(r=>setTimeout(r,100))}return this.cookie})().finally(()=>{this.cookieExchangePromise=void 0})),this.cookieExchangePromise):this.cookie}async rpc(e,n){this.isV2&&await this.ensureCookie();let r=this.cookie,s=r?[r]:[],i=`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,o=this.isV2?e.includes("/")?e:e.replace(/\./g,"/"):e.includes(".")?e:e.replace(/\//g,"."),a=n;if(this.isV2){let m=n;if(o==="session/prompt"&&m&&typeof m=="object"){let p=m;p.requestId||(m={...p,requestId:FR()})}m&&typeof m=="object"&&"args"in m?a=m:a={args:{request:m}}}let l={"content-type":"application/json"};this.cookie&&(l.cookie=this.cookie);let d;try{d=await fetch(`${this.baseUrl}/api/${o}`,{method:"POST",headers:l,body:JSON.stringify({type:"client-request",rpcId:i,method:o,payload:a}),redirect:"manual"})}catch(m){throw new pt(e,`transport error: ${m instanceof Error?m.message:String(m)}`,this.getSecretsToRedact(s))}if(d.status>=300&&d.status<400)throw new pt(e,`redirects are not permitted (HTTP ${d.status})`,this.getSecretsToRedact(s));if((d.status===401||d.status===403)&&this.isV2&&this.tokenUrl){let m=await this.ensureCookie(!0);if(m&&m!==l.cookie){l.cookie=m,s.push(m);try{d=await fetch(`${this.baseUrl}/api/${o}`,{method:"POST",headers:l,body:JSON.stringify({type:"client-request",rpcId:i,method:o,payload:a}),redirect:"manual"})}catch(p){throw new pt(e,`transport error: ${p instanceof Error?p.message:String(p)}`,this.getSecretsToRedact(s))}if(d.status>=300&&d.status<400)throw new pt(e,`redirects are not permitted (HTTP ${d.status})`,this.getSecretsToRedact(s))}}let u;try{u=await d.json()}catch{u=void 0}if(!d.ok)throw new pt(e,u??d.statusText,this.getSecretsToRedact(s));let c=u&&typeof u=="object"?u.result:void 0;if(!c||typeof c!="object"||typeof c.ok!="boolean")throw new pt(e,"malformed response: HTTP 200 but body is not a well-formed {result:{ok,\u2026}} envelope",this.getSecretsToRedact(s));if(c.ok===!1)throw new pt(e,c.error??c,this.getSecretsToRedact(s));return"value"in c?c.value:void 0}get alive(){return this.child!==void 0&&this.child.exitCode===null&&this.child.signalCode===null}shutdown(){this.child!==void 0&&this.alive&&pf(this.child,2e3)}static spawn(e){return new Promise((n,r)=>{let s=UR("dsh",["web","--no-open","--port","0"],{env:e,stdio:["ignore","pipe","pipe"]}),i=!1,o=!1,a="",l="",d="",u=new AbortController,c=p=>{i||(i=!0,clearTimeout(m),u.abort(),pf(s,2e3),r(p))},m=setTimeout(()=>{let p=[l?`stdout:
1810
+ ${l}`:"",d?`stderr:
1811
+ ${d}`:""].filter(Boolean).join(`
1812
+ `);c(new Error(`dsh web sidecar did not report a boot URL within ${mf}ms `+(p?`
1813
+ ${de(p,{provider:"dsh"})}`:"(no output captured)")))},mf);s.stdout?.on("data",p=>{let f=p.toString();if(l+=f,a+=f,i||o)return;let g=a.split(`
1814
+ `);a=g.pop()??"";for(let _ of g){let h=jR.exec(_);if(h){o=!0,t.fromBootUrl(h[1],s,u.signal).then(E=>{i||(i=!0,clearTimeout(m),n(E))},E=>{c(E instanceof Error?E:new Error(String(E)))});return}}}),s.stderr?.on("data",p=>{d+=p.toString()}),s.on("error",p=>{c(p)}),s.on("exit",(p,f)=>{let g=f?`signal ${f}`:`exit code ${p}`;c(new Error(Un(`dsh web exited before reporting a boot URL (${g})`,d.trim()?de(d,{provider:"dsh"}):"")))})})}},Ut;async function vi(t,e=n=>Ga.spawn(n)){if(Ut){let n=await Ut.catch(()=>{});if(n?.alive)return n;Ut=void 0}return Ut=e(t),Ut}async function Wr(){if(!Ut)return;(await Ut.catch(()=>{}))?.shutdown(),Ut=void 0}var Va=new Map,XR=500,Ka=8*60*60*1e3;function Qa(t){return new za(t)}var za=class extends Z{dshProvider;usageSeen=new Set;constructor(e){let n=new Ei(e);super({provider:n,protocol:{transport:"dsh-rpc",perTurnCancellation:"unsupported",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"dsh has no in-session leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"dsh",seedArgs:[],resumeTemplate:"dsh web --no-open --port 0 # continuity is via the RPC sidecar, not a resume flag",startTemplate:"dsh web --no-open --port 0",transport:(r,s)=>this.dshPromptTurn(r,s)}),this.dshProvider=n}manualSeedHint(e){return{launchCommand:`cd ${e} && dsh web`,postLaunchNote:"dsh has no interactive terminal session to seed into \u2014 continuity lives in the web profile's session store, not a TTY. Boot the sidecar with the command above, open the printed http:// URL, and start a session rooted at this directory in the web UI; lmctl's managed sidecar can then cold-resume it by id (cross-profile session sharing is verified). Send lmctl's seed instruction there, wait for the reply, then find the new session id with the ls command below and register it manually.",lsCommand:`lmctl ls --provider dsh --sessiondir ${e}`}}async seed(e,n){await BR(e,{recursive:!0});let r=`session-${ff()}`,s=Ya(n?.env??process.env);he("dsh",[],"yolo");try{let i;try{i=await vi(s)}catch(a){return{success:!1,error:`dsh sidecar failed to start: ${wi(a)}`}}try{await i.rpc("session.create",{sessionId:r,cwd:e})}catch(a){return{success:!1,error:`session.create failed: ${wi(a)}`}}if(n?.model)try{await i.rpc("session.selectModel",{sessionId:r,provider:"deepseek-official",model:n.model})}catch(a){return{success:!1,error:`session.selectModel("${n.model}") failed: ${wi(a)}`}}let o=n?.prompt??V;try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}let a=await this.promptAndWait(i,e,r,o,Ka,n?.signal);return{success:!0,sessionId:r,usage:a.usage}}catch(a){return{success:!1,sessionId:r,usage:a?.usage,error:`seed turn failed: ${wi(a)}`}}}finally{await Wr()}}async dshPromptTurn(e,n){let r=Date.now();if(n.bundleSession!==void 0)return ut(n.bundleSession,"dsh",n.sessionId,e,{onDelta:n.onDelta,onProgress:n.onProgress,signal:n.signal});let s=Ya(n.env??process.env);he("dsh",[],n.permissionMode??"yolo");let i=!n.sessionId,o=i?`session-${ff()}`:n.sessionId,a;try{let l=await vi(s);i&&await l.rpc("session.create",{sessionId:o,cwd:n.cwd}),n.model&&(await l.rpc("session.selectModel",{sessionId:o,provider:"deepseek-official",model:n.model}),n.onProgress?.({kind:"system",summary:`dsh model set to ${n.model}`})),n.onProgress?.({kind:"system",summary:"dsh session.prompt sent"}),a=await this.promptAndWait(l,n.cwd,o,e,n.timeoutMs??Ka,n.signal)}finally{await Wr()}return n.onProgress?.({kind:"system",summary:"dsh turn completed"}),{...a,sessionId:o,durationMs:Date.now()-r}}async openSession(e){let n=Ya(e.env??process.env);he("dsh",[],e.permissionMode??"yolo");let r=await vi(n),s=Si(this.dshProvider.sessionFilePath(e.cwd,e.sessionId)),i=!1;try{i=gf(s)&&WR(s).isFile()}catch{i=!1}if(!i)throw await Wr(),new Error(`dsh bundle: session file does not exist for session "${e.sessionId}" (${s}) \u2014 the session must exist before a bundle can resume it`);e.model&&await r.rpc("session.selectModel",{sessionId:e.sessionId,provider:"deepseek-official",model:e.model});let o=e.sessionId,a=this,l=0,d=!1,u=null,c=!1,m=!1,p=async()=>{m||(m=!0,await Wr())};return{provider:"dsh",sessionId:o,get completedTurns(){return l},async sendTurn(f,g={}){if(d||u!==null)throw new Error("dsh bundle session is closed");if(c)throw new Error("dsh bundle session has a turn still in flight");if(g.signal?.aborted)throw new Error("Aborted");if(s=Si(s),!gf(s))throw new Error(`dsh bundle: session file for session "${o}" disappeared mid-bundle \u2014 identity re-check failed (external re-seed?)`);c=!0;let _=Date.now();try{let h,E=a.promptAndWait(r,e.cwd,o,f,Ka,g.signal,b=>{h=b});E.catch(()=>{});let y=()=>{},T=new Promise((b,S)=>{y=()=>{(async()=>{d=!0,await p()})().finally(()=>S(Object.assign(new Error("Aborted"),{usage:h,sessionId:o})))},g.signal?.addEventListener("abort",y,{once:!0})}),v;try{v=await Promise.race([E,T])}finally{g.signal?.removeEventListener("abort",y)}return l+=1,{...v,sessionId:o,durationMs:Date.now()-_}}finally{c=!1}},close(){return u!==null||(u=(async()=>{d=!0,await p()})()),u}}}async promptAndWait(e,n,r,s,i,o,a){let l=Date.now(),d=Si(this.dshProvider.sessionFilePath(n,r)),u=!1,c=await _f(d,()=>{u=!0}),m=c.reduce((E,y)=>typeof y.seq=="number"&&Number.isSafeInteger(y.seq)?Math.max(E,y.seq):E,-1),p=new jn(r,m,this.usageSeen);u&&p.invalidateOwnership();let f=JSON.stringify([d,r]),g=Va.get(f)??new Set;if(g.size){p.invalidateOwnership();for(let E of g)E.invalidateOwnership()}g.add(p),Va.set(f,g),c.filter(E=>E.type==="turn/start"||E.type==="turn/end").at(-1)?.type==="turn/start"&&p.invalidateOwnership();let h;try{await e.rpc("session.prompt",{sessionId:r,mode:"queue",content:[{type:"text",text:s}]});let E=i>0?Date.now()+i:1/0;for(;;){d=Si(d);let y=await _f(d),T=y.find(v=>v.type==="turn/end"&&(v.seq??-1)>m);if(y.length&&p.update(y,T?.seq??1/0),a?.(p.usage()),o?.aborted)throw new Error("Aborted");if(T){let v=T.data?.reason;v?.kind!=="completed"&&(h=v?.kind==="aborted"?"cancelled":"error");let b=[...y].reverse().find(O=>O.type==="assistant/message"&&(O.seq??-1)>m&&(O.seq??1/0)<=(T.seq??1/0)),S=b?JR(b):"";if(v?.kind!=="completed"&&!S)throw new Error(qR(v));p.finish();let R=p.usage();return{text:S,sessionId:r,durationMs:Date.now()-l,usage:R?{...R,...v?.kind==="completed"?{}:{outcome:v?.kind==="aborted"?"cancelled":"error"}}:void 0}}if(Date.now()>E)throw new Error(`dsh turn timed out after ${i}ms waiting for turn/end`);await new Promise(v=>setTimeout(v,XR))}}catch(E){if(p.finish(),E instanceof Error){let y=p.usage();Object.assign(E,{usage:y?{...y,outcome:h}:void 0,sessionId:r})}throw E}finally{g.delete(p),g.size||Va.delete(f)}}};function Ya(t){return{...t,DSH_PERMISSION_MODE:t.DSH_PERMISSION_MODE??"danger-full-access"}}function qR(t){let e=t?.kind??"unknown",n=t?.error?.message;return n?`dsh turn ended with reason=${e}: ${n}`:`dsh turn ended with reason=${e} and no assistant text`}function wi(t){return t instanceof Error?t.message:String(t)}async function _f(t,e){let n;try{n=await HR(t)}catch{return e?.(),[]}e&&sr(n).reduce((i,o)=>i+o.length,0)!==n.length&&e?.();let r=rs(n),s=[];for(let i of r.split(`
1815
+ `))if(i.trim())try{let o=JSON.parse(i);o!==null&&typeof o=="object"&&!Array.isArray(o)&&s.push(o)}catch{e?.()}return s}function JR(t){let n=t.data?.message?.content;if(typeof n=="string")return n;if(!Array.isArray(n))return"";let r=[];for(let s of n)s&&typeof s=="object"&&s.type==="text"&&typeof s.text=="string"&&r.push(s.text);return r.join("")}function Si(t,e){return Jn(t,e)}import{mkdir as tk}from"node:fs/promises";import{existsSync as GR}from"node:fs";import{join as vf,resolve as VR}from"node:path";import{createRequire as KR}from"node:module";var Za=null;function YR(){return Za===null&&(Za=KR(import.meta.url)("node:sqlite").DatabaseSync),Za}var hf="acp";function el(t={}){return VR(t.hermesHome?.trim()||process.env.HERMES_HOME?.trim()||vf(J,".hermes"))}function zR(t={}){return vf(el(t),"state.db")}var yf=`id, source, model, model_config, started_at,
1816
+ last_activity_at, message_count, input_tokens, output_tokens,
1817
+ cache_read_tokens, cache_write_tokens, reasoning_tokens, cwd, title`;function Hr(t){let e=typeof t=="number"&&Number.isFinite(t)?t:0;return new Date(e*1e3)}function De(t){return typeof t=="string"&&t.length>0?t:void 0}function QR(t){if(!t)return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function Tf(t){return De(t.cwd)??De(QR(t.model_config).cwd)??"(unknown)"}var bi=class{name="hermes";dbPath;busyTimeoutMs;discoverLimit;constructor(e){this.dbPath=zR(e),this.busyTimeoutMs=e?.busyTimeoutMs??5e3,this.discoverLimit=e?.discoverLimit??200}get stateDbPath(){return this.dbPath}openDb(){if(!GR(this.dbPath))return null;let e=null;try{return e=new(YR())(this.dbPath,{open:!0,readOnly:!0}),e.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),e}catch(n){return e?.close(),M({event:"hermes_store_unavailable",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),null}}selectSessionRow(e,n){return e.prepare(`SELECT ${yf} FROM sessions WHERE id = ? AND source = ?`).get(n,hf)??null}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let n=e.prepare(`SELECT ${yf} FROM sessions
1818
+ WHERE source = ?
1819
+ ORDER BY COALESCE(last_activity_at, started_at) DESC
1820
+ LIMIT ?`).all(hf,this.discoverLimit),r=[];for(let s of n){let i=this.previewTexts(e,s.id);r.push({provider:this.name,sessionId:s.id,slug:De(s.title),cwd:Tf(s),createdAt:Hr(s.started_at),modifiedAt:Hr(s.last_activity_at??s.started_at),model:De(s.model),startCommand:this.name,firstUserMessage:i.first,lastUserMessage:i.last,messageCount:s.message_count??0,filePath:this.dbPath,...Ef(s)})}return r}catch(n){return M({event:"hermes_discover_sessions_failed",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),[]}finally{e.close()}}activeMessageRows(e,n){let r=new Set(e.prepare("PRAGMA table_info(messages)").all().map(a=>a.name)),i=`id, session_id, role, content, tool_call_id, tool_calls, tool_name,
1821
+ timestamp, finish_reason${["_compressed_summary","display_kind"].filter(a=>r.has(a)).map(a=>`, ${a}`).join("")}`,o="WHERE session_id = ? AND role IN ('user', 'assistant', 'tool')";try{return e.prepare(`SELECT ${i} FROM messages ${o} AND active = 1 ORDER BY id ASC`).all(n)}catch(a){if(!/no such column/i.test(a instanceof Error?a.message:String(a)))throw a;return e.prepare(`SELECT ${i} FROM messages ${o} ORDER BY id ASC`).all(n)}}previewTexts(e,n){try{let[r,s]=["ASC","DESC"].map(i=>{let o=`SELECT content FROM messages WHERE session_id = ?
1822
+ AND role = 'user' AND content != ''`,a;try{a=e.prepare(`${o} AND active = 1 ORDER BY id ${i} LIMIT 1`).get(n)}catch(l){if(!/no such column: active/i.test(String(l)))throw l;a=e.prepare(`${o} ORDER BY id ${i} LIMIT 1`).get(n)}return a?B(a.content,80):void 0});return{first:r,last:s}}catch{return{}}}async loadSession(e){let n=this.openDb();if(!n)return null;try{let r=this.selectSessionRow(n,e);if(!r)return null;let s=this.activeMessageRows(n,e),i=[],o=[],a,l;for(let d of s){let u=Hr(d.timestamp),c=d.content??"";if(d.role==="user"){c&&d._compressed_summary!==1&&d.display_kind!=="hidden"&&o.push(c),c.length>0&&(a||(a=B(c,80)),l=B(c,80)),i.push({role:"user",timestamp:u,content:c||"(empty)"});continue}if(d.role==="tool"){i.push({role:"tool_result",timestamp:u,content:c,toolCallId:De(d.tool_call_id),toolName:De(d.tool_name)});continue}c.length>0&&i.push({role:"assistant",timestamp:u,content:c,model:De(r.model),stopReason:De(d.finish_reason)});for(let m of ZR(d.tool_calls)){let p=ek(m.function?.arguments);i.push({role:"tool_use",timestamp:u,content:De(m.function?.name)??"tool_call",toolName:De(m.function?.name),toolCallId:De(m.call_id)??De(m.id),toolInput:typeof m.function?.arguments=="string"?m.function.arguments:JSON.stringify(m.function?.arguments??{}),toolInputData:Be(p)})}}return{provider:this.name,sessionId:r.id,slug:De(r.title),cwd:Tf(r),createdAt:Hr(r.started_at),modifiedAt:Hr(r.last_activity_at??r.started_at),model:De(r.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:l,messageCount:r.message_count??i.length,filePath:this.dbPath,...Ef(r),messages:i,userPrompts:o}}catch(r){return M({event:"hermes_load_session_failed",provider:this.name,session_id:e,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),null}finally{n.close()}}async resolveSessionPath(e){let n=this.openDb();if(!n)return null;try{return this.selectSessionRow(n,e)?this.dbPath:null}catch{return null}finally{n.close()}}async deleteSession(e){return!1}};function ZR(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function ek(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t;if(typeof t!="string")return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function Ef(t){let e=t.input_tokens??0,n=t.output_tokens??0,r=t.cache_read_tokens??0,s=t.cache_write_tokens??0,i=t.reasoning_tokens??0;return(t.message_count??0)>0&&e+n+r+s+i>0?{totalInputTokens:e,totalCachedInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:n,totalReasoningOutputTokens:i}:{}}var nk=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function rk(t){return nk.test(t)}var sk="dont_ask";function wf(t){if(t==="plan")throw new Error(`provider "hermes" does not support --permission-mode plan: Hermes's ACP mode ladder (default/accept_edits/dont_ask) governs file edits only and has no plan-equivalent, so lmctl refuses rather than silently running the member with edit auto-approval.`);return sk}function nl(t){return new tl(t)}var tl=class extends Z{hermesProvider;hermesHome;constructor(e){let n=new bi(e);super({provider:n,protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Hermes has no provider-side leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"hermes",seedArgs:[],resumeTemplate:"hermes --yolo --resume {{session_id}}",startTemplate:"hermes",transport:async(r,s)=>Qe(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:wf(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=el(e)}async openSession(e){return Ze({...e,env:{...e.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:wf(e.permissionMode)})}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(e,n){await tk(e,{recursive:!0});let r=[];if(n?.effort){let i="hermes has no ACP-level effort surface";M({event:"hermes_effort_ignored",provider:this.name,effort:n.effort,reason:i}),r.push(`hermes seed ignored effort=${n.effort}: ${i}`)}let s;try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}s=await this.sendTurn(n?.prompt??V,{sessionId:"",cwd:e,env:n?.env,signal:n?.signal,model:n?.model})}catch(i){return{success:!1,error:`hermes ACP seed failed: ${i instanceof Error?i.message:String(i)}`}}return rk(s.sessionId)?(r.push(...s.warnings??[]),{success:!0,sessionId:s.sessionId,usage:s.usage,...r.length>0?{warnings:r}:{}}):(M({event:"hermes_seed_contract_violation",provider:this.name,session_id:s.sessionId,reason:"session/new did not return a UUID session id"}),{success:!1,error:`hermes ACP session/new did not return a UUID session id (got ${JSON.stringify(s.sessionId)})`})}};import{readdir as Sf,rm as ik,stat as ok}from"node:fs/promises";import{join as rl}from"node:path";var Ri=class{name="pi";baseDir;constructor(e={}){this.baseDir=e.piDir||rl(J,".pi","agent","sessions")}getWatchPaths(){return[{directory:this.baseDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[];for(let n of await this.listSessionFiles())try{let r=await this.extractSummary(n);r&&e.push(r)}catch{}return e}async listSessionFiles(){let e;try{e=await Sf(this.baseDir)}catch{return[]}let n=[];for(let r of e){let s=rl(this.baseDir,r);try{if(!(await ok(s)).isDirectory())continue;for(let i of await Sf(s))i.endsWith(".jsonl")&&n.push(rl(s,i))}catch{}}return n}async readHeader(e){for await(let n of le(e))return n.type==="session"?n:null;return null}async extractSummary(e){let n=await this.readHeader(e);if(!n)return null;let r=await pe(e),s,i,o,a=0,l=0,d=0,u=0,c=0,m=0,p=0,f;for await(let g of le(e)){if(g.type==="model_change"&&g.provider&&g.modelId){s=`${g.provider}/${g.modelId}`;continue}if(g.type!=="message"||!g.message)continue;let _=g.message;if(_.provider&&_.model&&(s=`${_.provider}/${_.model}`),_.role==="user"){let h=sl(_).trim();h&&(i||(i=B(h,80)),o=B(h,80)),a++}else if(_.role==="assistant"){a++;let h=_.usage;h&&(l+=h.input??0,d+=h.cacheRead??0,u+=h.cacheWrite??0,c+=h.output??0,m+=h.reasoning??0,p=h.input??0,f={inputTokens:h.input,cachedInputTokens:h.cacheRead,cacheWriteInputTokens:h.cacheWrite,outputTokens:h.output,reasoningOutputTokens:h.reasoning,totalTokens:h.totalTokens})}}return{provider:"pi",sessionId:n.id,cwd:n.cwd??"(unknown)",createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:s,startCommand:"pi",firstUserMessage:i,lastUserMessage:o,messageCount:a,filePath:e,totalInputTokens:l,totalCachedInputTokens:d,totalCacheWriteInputTokens:u,totalOutputTokens:c,totalReasoningOutputTokens:m,lastInputTokens:p,lastTokenUsage:f}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=await this.extractSummary(n);if(!r)return null;let s=[],i=r.model;for await(let o of le(n)){if(o.type==="model_change"&&o.provider&&o.modelId){i=`${o.provider}/${o.modelId}`;continue}if(o.type!=="message"||!o.message)continue;let a=o.message;a.provider&&a.model&&(i=`${a.provider}/${a.model}`);let l=a.timestamp?new Date(a.timestamp):r.modifiedAt;if(a.role==="user")s.push({role:"user",timestamp:l,content:sl(a)});else if(a.role==="assistant"&&Array.isArray(a.content))for(let d of a.content)d.type==="text"&&d.text?s.push({role:"assistant",timestamp:l,content:d.text,model:i}):d.type==="thinking"&&d.thinking?s.push({role:"thinking",timestamp:l,content:d.thinking}):d.type==="toolCall"&&s.push({role:"tool_use",timestamp:l,content:bf(d.arguments),toolName:d.name??"tool",toolInput:bf(d.arguments),toolInputData:d.arguments,toolCallId:d.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:l,content:sl(a),toolName:a.toolName,toolCallId:a.toolCallId})}return{...r,model:i,messages:s}}async resolveSessionPath(e){let n=`_${e}.jsonl`,r=[];for(let s of await this.listSessionFiles()){if(s.endsWith(n))return s;s.split("_").pop()?.replace(/\.jsonl$/,"")?.startsWith(e)&&r.push(s)}return r.length===1?r[0]:null}async deleteSession(e){let n=await this.resolveSessionPath(e);return n?(await ik(n,{force:!0}),!0):!1}};function sl(t){return typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(e=>e.type==="text"&&e.text).map(e=>e.text).join(" "):""}function bf(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}function ol(t){return new il(t)}var il=class extends Z{constructor(e){super({provider:new Ri(e),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"pi uses one-shot print turns; no streaming events are available."},binary:"pi",seedArgs:["-p",V],resumeTemplate:"pi --session {{session_id}}",startTemplate:"pi",transport:ak})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}manualSeedHint(e){return{launchCommand:`cd ${e} && pi`,postLaunchNote:"Send the lmctl seed instruction, wait for the session file to write, then exit.",lsCommand:`lmctl ls --provider pi --sessiondir ${e}`}}},ak=Ti({label:"pi",buildArgs:(t,e)=>{let n=[...e.sessionId?["--session",e.sessionId]:[],"-p",t];return e.model&&n.push("--model",e.model),n},assertArgs:(t,e)=>he("pi",t,e.permissionMode??"yolo")});import{createHash as lk}from"node:crypto";import{existsSync as dk,mkdirSync as ll,readFileSync as uk,renameSync as ck,rmdirSync as Of,statSync as mk,writeFileSync as pk}from"node:fs";import{dirname as ml,join as Rf,resolve as al}from"node:path";var Gn=new Map;function fk(t){return lk("sha256").update(t).digest("hex").slice(0,8)}function gk(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function _k(t,e){let n=e?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function Lf(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function ki(t){return Math.max(1,Math.ceil(t.length/4))}function Vn(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return al(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?Rf(ml(al(n)),".lmctl-claude-mock","sessions.json"):Rf(al(t),".lmctl-claude-mock","sessions.json")}function kf(){return{schemaVersion:1,sessions:{}}}function Br(t){if(!dk(t))return kf();try{let e=JSON.parse(uk(t,"utf8")),n=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},r=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=dl(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return kf()}}function Df(t,e){ll(ml(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;pk(n,`${JSON.stringify(e,null,2)}
1823
+ `,"utf8"),ck(n,t)}var hk=5e3,yk=15,If=1e4;function Tk(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function Ek(t){let e=`${t}.lock`;ll(ml(t),{recursive:!0});let n=Date.now()+If;for(;;)try{return ll(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-mk(e).mtimeMs>hk){try{Of(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${If}ms: ${e}`);Tk(yk)}}function vk(t){try{Of(t)}catch{}}function Pf(t,e){let n=Ek(t);try{return e()}finally{vk(n)}}function wk(t){return{...t,timestamp:t.timestamp.toISOString()}}function Sk(t){return{...t,timestamp:new Date(t.timestamp)}}function bk(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(wk)}}function Mf(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(Sk)}}function Ii(t,e=process.cwd()){let n=Gn.get(t);if(n!==void 0)return n;let s=Br(Vn(e)).sessions[t];if(s===void 0)return;let i=Mf(s);return Gn.set(i.sessionId,i),i}function Af(t){Gn.set(t.sessionId,t);let e=Vn(t.cwd);Pf(e,()=>{let n=Br(e);n.sessions[t.sessionId]=bk({...t,filePath:e}),Df(e,n)})}function Rk(t,e=process.cwd()){let n=Vn(e);return Pf(n,()=>{let r=Br(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],Df(n,r)),s})}function kk(){let t=Br(Vn()),e=Object.values(t.sessions).map(Mf);for(let n of e)Gn.set(n.sessionId,n);return e}function dl(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function Cf(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=dl(t.delayMs);return{kind:"success",text:t.text,...e!==void 0?{delayMs:e}:{}}}if(t!==void 0&&typeof t.error=="string"&&typeof t.text!="string"){let e=dl(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function Nf(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function Ik(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=Cf(n[t]??n[Lf(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let i=Cf(r[s]);if(i!==void 0)return i}}}function xf(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}var ul=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of kk())e.set(n.sessionId,n);for(let n of Gn.values())e.set(n.sessionId,n);return[...e.values()].map(xf)}async loadSession(e){let n=Ii(e);return n===void 0?null:{...xf(n),messages:n.messages.slice()}}async resolveSessionPath(e){return Ii(e)?.filePath??null}async deleteSession(e){let n=Gn.delete(e),r=Rk(e);return n||r}},cl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new ul;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,n){try{n?.onDispatch?.()}catch{}let r=gk(_k(e,n)),s=`mock-${r}-${fk(`${e}:${r}`)}`,i=new Date,o=Vn(e),a=Ii(s,e),l=n?.prompt??"ClaudeMock seed",d=ki(l),u={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return u.messages.push({role:"user",timestamp:i,content:l}),u.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),u.totalInputTokens+=d,u.totalOutputTokens+=ki("ACK: ClaudeMock seeded"),Af(u),{success:!0,sessionId:s}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,n){let r=Date.now(),s=Ii(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=Br(Vn(n.cwd)),a=Ik(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await Nf(l),new Error(a.error);let d=a?.kind==="success"?a.text:`ClaudeMock ack: ${Lf(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:d,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=ki(e),s.totalOutputTokens+=ki(d),Af(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await Nf(l),{text:d,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}};function pl(){return new cl}function Ft(t){let e=[sa({museDataHome:t?.museDataHome}),ha({miniplayerHome:t?.miniplayerHome}),Ta({claudeDir:t?.claudeDir}),Sa({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ia({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Na({copilotDir:t?.copilotDir}),Oa({dbPaths:t?.opencodeDbPaths}),Ma({kimiHome:t?.kimiHome}),Fa({lmplayerDbPath:t?.lmplayerDbPath,lmplayerDbPaths:t?.lmplayerDbPaths}),$a({qwenDir:t?.qwenDir}),Ba({agyDir:t?.agyDir}),Qa({dshHome:t?.dshHome}),nl({hermesHome:t?.hermesHome}),ol({piDir:t?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(pl()),e}var fl=null;function Uf(){return fl===null&&(fl=Nt(Ft())),fl}function Ff(t,e){Ds(e);let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function jf(t){let e=t.registry??Uf(),n=Ff(e,t.provider),r={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen,requireResume:t.requireResume,bundleSession:t.bundleSession},s=t.bundleSession===void 0?await Ho(n,{...r,execution:"per-turn",requireResume:t.requireResume??!1}):void 0,i;try{i=s?await s.sendTurn(t.prompt,{onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal}):await n.sendTurn(t.prompt,r)}finally{await s?.close()}return{text:i.text,...i.usage?{usage:i.usage}:{},sessionId:i.sessionId,durationMs:i.durationMs,stopReason:i.stopReason,numTurns:i.numTurns,status:i.status,stalledAfterMs:i.stalledAfterMs,...i.warnings!==void 0?{warnings:i.warnings}:{}}}async function $f(t){return Ho(Ff(t.registry??Uf(),t.provider),t)}import{join as Se}from"node:path";var Wf=new WeakMap;function Ai(t){let e=Wf.get(t);if(e)return e;let n=t.env.HOME;if(!n)return Nt(Ft());let r=t.env.XDG_DATA_HOME||Se(n,".local/share"),s=t.env.XDG_CONFIG_HOME||Se(n,".config");return e=Nt(Ft({museDataHome:r,miniplayerHome:t.env.MINIPLAYER_HOME||Se(r,"miniplayer"),claudeDir:Se(n,".claude"),codexDir:Se(n,".codex"),codeDir:Se(n,".code"),geminiDir:Se(n,".gemini"),copilotDir:Se(n,".copilot"),qwenDir:Se(n,".qwen"),opencodeDbPaths:[Se(r,"opencode/opencode.db"),Se(s,"opencode/opencode.db")],agyDir:Se(n,".gemini/antigravity-cli"),dshHome:Se(n,".dsh"),hermesHome:t.env.HERMES_HOME??Se(n,".hermes"),kimiHome:t.env.KIMI_CODE_HOME??Se(n,".kimi-code"),piDir:Se(n,".pi/agent/sessions"),lmplayerDbPaths:pa(t.env,n)})),Wf.set(t,e),e}var $t=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))$t(e);Object.freeze(t)}return t},Ak=$t(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed"]),rj=$t({status:"string",error:"string|null",code:"ErrorCode?"}),sj=$t(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),ij=$t(["Provider1.Provider","Provider1.Model1","Provider1.Model2","Provider1.Model3","Provider2.Provider","Provider2.Model1","Provider2.Model2","Provider2.Model3","Provider3.Provider","Provider3.Model1","Provider3.Model2","Provider3.Model3"]),oj=$t(["Provider1","Provider2","Provider3"]),aj=$t({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),Y={name:"ctx",type:"context"},gl={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},nt={name:"teamfile",type:"string"},Ci={name:"alias",type:"string"},jt={name:"prompt",type:"string"},Ni={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"alias",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"},{name:"sessiondir",type:"string"},{name:"sessionid",type:"string"}]},Oi=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],Kn={name:"options",type:"map",optional:!0,keys:Oi},Hf={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},Bf={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},Xf={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},Yn={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},xi={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0},{name:"sessiondir",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"}]},Ck=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"}],qf={name:"options",type:"map",optional:!0,keys:Ck},Jf={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},Nk=$t([{name:"resolveProfilePath",implemented:!0,params:[Y,gl],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[Y,gl],statuses:["ok","error"],results:{error:"string|null",profile:"{path,raw,config}",values:"{Provider1..3,Model1..3,Directory,NonInteractive}",path:"string?",line:"number?",column:"number?"},effects:["file-read"],summary:"Read and validate the complete init profile without discovery or writes."},{name:"profileValues",implemented:!0,params:[{name:"config",type:"map"}],statuses:["ok","error"],results:{error:"string|null",Provider1:"string",Provider2:"string",Provider3:"string",Model1:"string",Model2:"string",Model3:"string"},effects:[],summary:"Validate and map slots to first-model environment values."},{name:"readPrompts",implemented:!0,params:[Y,{name:"path",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"single",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",prompts:"string[]"},effects:["file-read"],summary:"Read prompt records without exiting the caller.",scriptBinding:{name:"lm_read_prompts",params:[{name:"batchfile",type:"string"},{name:"single",type:"boolean",optional:!0}]}},{name:"listMembers",implemented:!0,params:[Y,nt],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[nt]}},{name:"resolveMember",implemented:!0,params:[Y,nt,Ci],statuses:["ok","not_found","error"],results:{error:"string|null",member:"Member",isLead:"boolean",teamfile:"string"},effects:["file-read","db"],summary:"Resolve a team member with an explicit missing outcome.",scriptBinding:{name:"lm_member",params:[nt,Ci]}},{name:"lintTeam",implemented:!0,params:[Y,nt],statuses:["ok","error"],results:{error:"string|null",errors:"list",warnings:"list",counts:"map"},effects:["file-read","db"],summary:"Return structured lint findings.",scriptBinding:{name:"lm_lint",params:[nt]}},{name:"seedTeam",implemented:!0,params:[Y,nt,Hf],statuses:["ok","error"],results:{error:"string|null",seeded:"SeededMember[]"},effects:["provider","db","file-write"],summary:"Seed a team with explicit optional preambles.",scriptBinding:{name:"lm_seed",params:[nt,Hf]}},{name:"promptAgent",implemented:!0,params:[Y,Ni,jt,Kn],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...Jf,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[Ni,jt,Kn]}},{name:"promptMember",implemented:!0,params:[Y,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"prompt",type:"string",required:!0},{name:"messageType",type:"string"},...Oi]}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn a team member through native team admission.",scriptBinding:{name:"lm_prompt",params:[nt,Ci,jt,{name:"options",type:"map",optional:!0,keys:[...Oi,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[Y,{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"workspace",type:"string"},{name:"all",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",sessions:"Session[]"},effects:["file-read"],summary:"List native sessions in an explicit workspace.",scriptBinding:{name:"lm_session_list",params:[{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"sessiondir",type:"string"},{name:"all",type:"boolean"}]}]}},{name:"deleteSession",implemented:!0,params:[Y,Yn,Xf],statuses:["deleted","not_found","busy","error"],results:{error:"string|null"},effects:["provider","file-write"],summary:"Delete a session only with explicit force admission.",scriptBinding:{name:"lm_session_delete",params:[Ni,{...Xf,optional:!0}]}},{name:"getSession",implemented:!0,params:[Y,Yn],statuses:["ok","not_found","error"],results:{error:"string|null",messages:"{role,content}[]"},effects:["provider","file-read"],summary:"Read native session messages.",scriptBinding:{name:"lm_session_get",params:[Yn]}},{name:"reserveSession",implemented:!0,params:[Y,Yn],statuses:["ok","busy","error"],results:{error:"string|null",reservation:"SessionReservation"},effects:[],summary:"Reserve context-local handoff admission and return a capability."},{name:"releaseSession",implemented:!0,params:[Y,Yn,{name:"reservation",type:"SessionReservation",optional:!0}],statuses:["ok","error"],results:{error:"string|null"},effects:[],summary:"Release context-local handoff admission; an optional capability makes owned cleanup idempotent and replacement-safe."},{name:"openTeamBatch",returnsResource:!0,implemented:!0,params:[Y,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"label",type:"string",required:!0},{name:"promptCount",type:"number",required:!0},{name:"legacy",type:"boolean"},...Oi]}],statuses:["ok","busy","error"],results:{error:"string|null",batch:"opaque context-bound BatchRef"},effects:["provider","db"],summary:"Open a managed team batch; member-map composition remains language-owned."},{name:"batchTurn",implemented:!0,params:[Y,{name:"batch",type:"BatchRef"},jt,{name:"index",type:"number"},{name:"total",type:"number"}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn an owned live batch reference."},{name:"closeBatch",implemented:!0,params:[Y,{name:"batch",type:"BatchRef"},{name:"options",type:"map",keys:[{name:"status",type:"string",required:!0,values:["done","error","cancelled"]},{name:"error",type:"string"}]}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close an owned batch."},{name:"readRatelimits",implemented:!0,params:[Y,Bf],statuses:["ok","error"],results:{error:"string|null",readings:"list"},effects:["file-read","network"],summary:"Read provider rate-limit data.",scriptBinding:{name:"lm_ratelimit_readings",params:[Bf]}},{name:"openTerminal",implemented:!0,params:[Y,{name:"target",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0}]},{name:"streams",type:"map",keys:[{name:"stdin",type:"stream",required:!0},{name:"stdout",type:"stream",required:!0},{name:"stderr",type:"stream",required:!0}]}],statuses:["ok","error"],results:{error:"string|null",code:"number|null",signal:"string|null"},effects:["provider","db","tty"],summary:"Open a native terminal with caller-supplied streams.",scriptBinding:{name:"lm_terminal",params:[nt,Ci]}},{name:"sessionAdmission",implemented:!0,params:[Y,Yn],statuses:["ok","busy","error"],results:{error:"string|null",busyReason:"turn|handoff?"},effects:[],summary:"Query context-local session admission without exposing mutable sets."},{name:"promptReservedAgent",implemented:!0,params:[Y,{name:"reservation",type:"SessionReservation"},Ni,jt,Kn],statuses:["ok","busy","stalled","empty","error"],results:{...Jf,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[Y,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Synchronously release one batch on a close deadline without cancelling unrelated batches."},{name:"inspectBatch",implemented:!0,params:[Y,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null",id:"string",closed:"boolean",member:"Member",rootId:"number|null"},effects:[],summary:"Read batch metadata without exposing native transports or lease capabilities."},{name:"openNativeSession",returnsResource:!0,implemented:!0,params:[Y,{name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0},{name:"sessiondir",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"}]},Kn],statuses:["ok","busy","error"],results:{error:"string|null",session:"opaque context-bound NativeSessionRef"},effects:["provider","db","file-read"],summary:"Open a script-owned native conversation with existing receiver admission."},{name:"nativeSessionTurn",implemented:!0,params:[Y,{name:"session",type:"NativeSessionRef"},jt],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Record one unframed conversational turn through the existing recorder."},{name:"closeNativeSession",implemented:!0,params:[Y,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close a script-owned native conversation and release its lease."},{name:"finalizeNativeSessionSync",implemented:!0,params:[Y,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Critical synchronous native conversation lease release."},{name:"nativeSessionRequest",implemented:!0,params:[Y,xi,jt,Kn],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null",code:"ErrorCode?"},effects:["provider","db"],summary:"Send one stateless turn to a detached native-session holder, starting one when absent.",scriptBinding:{name:"lm_session_turn",params:[xi,jt,Kn]}},{name:"nativeSessionClose",implemented:!0,params:[Y,xi],statuses:["ok","busy","error"],results:{error:"string|null",code:"ErrorCode?"},effects:["provider","db"],summary:"Close an idle detached native-session holder; an absent holder is already closed.",scriptBinding:{name:"lm_session_close",params:[xi]}},{name:"loadProperties",implemented:!0,params:[Y,gl],statuses:["ok","error"],results:{error:"string|null",path:"string",properties:"map",flat:"map",line:"number?",column:"number?"},effects:["file-read"],summary:"Read the complete hierarchical init.toml properties document through the canonical reader."},{name:"listRunning",implemented:!0,params:[Y,qf],statuses:["ok","error"],results:{error:"string|null",running:"RunningRow[]",dead:"DeadRow[]",idle:"IdleRow[]"},effects:["db"],summary:"DB-wide view of tracked invocation activity. Observation only; dispatch and branch on status busy, never gate on this.",scriptBinding:{name:"lm_running",params:[qf]}}]);function Li(t){if(!Vc(t))return ee("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return ee("cancelled","Context is closed")}function Gf(t,e){let n=r=>s=>{e?.(s,r),r==="stderr"&&s.startsWith("warning:")?t.onWarning(s):t.onProgress(s,r)};return{cwd:t.cwd,env:{...t.env,LMCTL_DB:t.dbPath},dal:t.dal,stdout:{write:n("stdout")},stderr:{write:n("stderr")}}}import{readFileSync as Ok,writeFileSync as yj,renameSync as Tj,existsSync as Lk}from"node:fs";import{basename as Dk,resolve as Pi,dirname as _l}from"node:path";var Di=["title","description","members"],xk=new Set(Di),rt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}};function Vf(t){if(t.length===0||!t.startsWith("---"))throw new rt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1824
+ `);if(e[0]!=="---")throw new rt("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){r=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new rt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let d=l[1],u=l[2].trim();if(!xk.has(d))throw new rt(`unknown frontmatter key "${d}" \u2014 allowed keys: ${Di.join(", ")}`);n[d]=u}if(r===-1)throw new rt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of Di)if(n[o]===void 0)throw new rt(`missing required frontmatter key "${o}" \u2014 required: ${Di.join(", ")}`);let s=0;for(let o=0;o<=r;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=n.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:n.title,description:n.description,members:i,bodyOffset:s}}var Pk="Lead";function Mk(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],i=r[2]!==void 0?r[2]:r[3];e[s]=i}return e}function Uk(t){return/^\s*_MEMBER_\s+\S/.test(t)}function Fk(t){return/^\s*_SESSION_\s+\S/.test(t)}function jk(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function hl(t){return/\.(?:lmctl|lmc)$/i.test(t)}function yl(t){return Dk(t).replace(/\.(?:lmctl|lmc)$/i,"")}function Tl(t){let e=Ok(t,"utf-8"),n=_l(Pi(t)),r=El(e,yl(t),{baseDir:n,sourcePath:Pi(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Pi(n,s.sessiondir));return r}var Kf=["alias","provider","sessionid","sessiondir","teamfile","model","effort"];function El(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
1825
+ `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=Vf(i)}catch(l){if(l instanceof rt)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
1826
+ `);for(let l=0;l<a.length;l++){let d=a[l],u=l+1;if(Fk(d))throw new Error(`line ${u}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if(jk(d)||!Uk(d))continue;let c=Mk(d);for(let p of Object.keys(c))if(!Kf.includes(p))throw new Error(`line ${u}: unknown key "${p}" on _MEMBER_ line: ${d.trim()}
1827
+ allowed keys: ${Kf.join(", ")}`);if(!c.provider&&!c.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${d.trim()}`);continue}if(!c.alias){s.push(`line ${u}: member line missing required alias: ${d.trim()}`);continue}let m={alias:c.alias,provider:c.provider||"",extra:{}};c.sessionid&&(m.session=c.sessionid),Object.prototype.hasOwnProperty.call(c,"sessiondir")&&(m.sessiondir=c.sessiondir),c.teamfile&&(m.teamfile=c.teamfile),c.model&&(m.model=c.model),c.effort&&(m.effort=c.effort),r.push(m)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:o}}function vl(t){return t.members.find(e=>e.alias.toLowerCase()===Pk.toLowerCase())}function wl(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=Pi(e,t.teamfile),o=n??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!Lk(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=Tl(i),l=vl(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return wl(l,_l(i),o,r);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||_l(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function Yf(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}import{existsSync as Zk}from"node:fs";import{dirname as ng}from"node:path";import{createHash as $k}from"node:crypto";import{existsSync as zf,readFileSync as Qf,realpathSync as Wk}from"node:fs";import{dirname as Hk,resolve as Zf}from"node:path";var Sl=5,Mi=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}};function ft(t,e){let n=Zf(t);if(zf(n))return Wk(n);if(e!==void 0){let r=Xk(t,n,e);if(r!==null)return r}return n}function eg(t,e){let n=Hk(e),r=El(t,yl(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Zf(n,s.sessiondir));return r}function zn(t,e,n=r=>{process.stderr.write(`warning: ${r}
1828
+ `)}){let r=ft(t,Bk(e)?e:void 0);if(zf(r)){let i=Qf(r,"utf8"),o=eg(i,r);return e!==void 0&&"upsertRootTeam"in e&&e.getRootTeam(r)===null&&qk(o)&&Vk(e,r,o,i,n),o}let s=e?.getRootTeam(r)??null;throw s!==null?new Error(`teamfile missing on disk: ${r} (registered ${s.registered_at}; the file was renamed or deleted \u2014 seed the team at its new path)`):new Error(`teamfile not found: ${t}`)}function Bk(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function Xk(t,e,n){let r=n.getRootTeam(t)??n.getRootTeam(e);return r===null?null:r.teamfile_path}function qk(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=Sl)}function Jk(t,e,n){let r=ft(e),s=n.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=Sl);if(s.length!==0)for(let i of t.listRootTeams()){let o,a;try{if(o=ft(i.teamfile_path),o===r)continue;a=Qf(o,"utf8")}catch(d){if(Gk(d))continue;throw d}let l=eg(a,o);for(let d of s){let u=l.members.find(c=>c.teamfile===void 0&&c.session===d.session&&(c.session?.length??0)>=Sl);if(u!==void 0)throw new Mi(`sessionid ownership conflict: ${r}:${d.alias} and ${o}:${u.alias} both use sessionid "${d.session}"`)}}}function Gk(t){let e=t?.code;return e==="ENOENT"||e==="ENOTDIR"}function Vk(t,e,n,r,s){try{Jk(t,e,n)}catch(o){if(!(o instanceof Mi))throw o;s(`${o.message}; skipping automatic registration`);return}let i={teamfile_path:e,name:n.name,raw_text:r,raw_sha256:$k("sha256").update(r).digest("hex"),registered_at:new Date().toISOString(),last_seeded_at:null};t.upsertRootTeam(i)}import{closeSync as Nj,openSync as xj,readFileSync as Kk,statSync as Yk,unlinkSync as Oj,writeFileSync as Lj}from"node:fs";function zk(t,e){return`${t}.seed-${e.toLowerCase()}.lock`}function Qk(t){let e;try{e=JSON.parse(Kk(t,"utf8"))}catch(r){return r.code==="ENOENT"?!1:tg(t)}let n=typeof e=="object"&&e!==null&&"pid"in e?e.pid:void 0;if(typeof n!="number"||!Number.isInteger(n)||n<=0)return tg(t);try{return process.kill(n,0),!0}catch(r){return r.code!=="ESRCH"}}function tg(t){try{return Date.now()-Yk(t).mtimeMs<3e5}catch{return!1}}function bl(t,e){return Qk(zk(t,e))}var be=class extends Error{constructor(e,n){super(e),this.name="ChatTargetError",n&&Object.defineProperty(this,"kind",{value:n})}};var Rl=/^[A-Za-z][A-Za-z0-9_-]*$/;function eI(t){return Rl.test(t)}function kl(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),n=t.slice(0,e),r=t.slice(e+1);return!hl(n)||!Rl.test(r)?null:{teamfile:n,alias:r}}function pn(t,e,n){if(!hl(t))throw new be(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl or .lmc extension).`);if(!eI(e))throw new be(`lmctl: "${e}" is not a valid alias (must match ${Rl.source}).`);let r=ft(t,n);if(n===void 0&&!Zk(r))throw new be(`lmctl: teamfile not found: ${t}`,"not_found");let s;try{s=zn(r,n)}catch(o){throw new be(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new be(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=Yf(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new be(`lmctl: alias "${e}" not found in ${t}.
1829
+ Known aliases: ${o}`,"not_found")}if(i.teamfile!==void 0){let o=wl(i,ng(r));return{teamfile:r,alias:i.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir,isLead:!0,...o.model??i.model?{model:o.model??i.model}:{},...o.effort??i.effort?{effort:o.effort??i.effort}:{}}}if(bl(r,i.alias))throw new be(`lmctl: alias "${i.alias}" is being seeded. Wait for the seed to finish, then retry this prompt.`);if(i.session===void 0)throw s.members.some(o=>bl(r,o.alias))?new be(`lmctl: alias "${i.alias}" has no session ID yet, and a seed is currently in progress for this team. Wait for the seed to finish, then retry this prompt.`):new be(`lmctl: alias "${i.alias}" in ${t} has no session ID yet.
1830
+ Run: lmctl seed ${t}`);return{teamfile:r,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??ng(r),isLead:vl(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}import{hostname as tI,networkInterfaces as Xj}from"node:os";var nI=12e4;function rI(t=process.env){return sI(t.LMCTL_TERMINAL_LOCK_STALE_MS,nI)}function Il(t,e={}){let n=e.now??new Date,r=e.localHost??tI(),s=e.staleMs??rI();if(t.holder_host===r)return(e.isProcessAlive??iI)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?n.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Xr(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function sI(t,e){if(t===void 0||t.trim()==="")return e;let n=t.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?e:r}function iI(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}import{openSync as vI,closeSync as wI,fstatSync as SI,readSync as bI,constants as yg}from"node:fs";import{dirname as RI,join as Ui}from"node:path";import{createHash as kI}from"node:crypto";var EI=Zl(Nl(),1);function Wt(t){let e=t.env?.LMCTL_DB;return e!==void 0&&e.length>0?e:Pn(void 0,{...process.env,...t.env})}async function oe(t,e){if(t.dal!==void 0)return e(t.dal);let n=Ct({path:Wt(t)});try{return await e(n)}finally{n.close()}}function _g(t){if(t===void 0)return null;let e=Number.parseInt(t,10);return Number.isInteger(e)&&e>0?e:null}var gg=!1;function hg(t){if(t.stdout!==process.stdout||gg)return;gg=!0;let e=n=>{throw n.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),n};process.stdout.on("error",e)}var qr={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null};var Sg=t=>t.record_id??t.source+":"+t.source_model_id,Tg=t=>t===null||typeof t=="number"&&Number.isFinite(t)&&t>=0;function Ll(t){if(!zt(t.catalog)||!Qt(t.aliases)||!t.sha256||!/^[a-f0-9]{64}$/.test(t.sha256))throw Error("invalid or incomplete price snapshot (catalog, aliases and SHA-256 required)");if(!["network","cache","bundled","pinned"].includes(t.source)||t.generatedAt!==null&&typeof t.generatedAt!="string")throw Error("invalid price snapshot metadata");if(t.catalog.records.length>1e5||t.aliases.aliases.length>1e5||t.aliases.standards.length>1e5)throw Error("price snapshot exceeds the 100000-entry limit");let e=i=>{if(i.length>65536)throw Error("price identity exceeds the 65536-character limit")},n=new Set,r=new Set,s=new Set;for(let i of t.catalog.records){let o=Sg(i);if(!o||n.has(o))throw Error("duplicate or missing price record id");n.add(o),e(o),e(i.source),e(i.source_model_id);for(let u of[i.source,i.source_model_id])if(typeof u!="string"||!u.trim())throw Error("invalid price record identity");let a=i;for(let u of[i.provider,i.mode,i.gateway_id,i.record_id,a.vendor_model_id,a.canonical_slug])if(u!=null&&typeof u!="string")throw Error("invalid price record metadata");for(let u of[i.pricing.input_per_1m_tokens,i.pricing.output_per_1m_tokens,i.pricing.input_cache_read_per_1m_tokens,i.pricing.input_cache_write_per_1m_tokens??null])if(!Tg(u))throw Error("price rates must be finite nonnegative numbers or null");let l=i.pricing.source_cost_fields;if(l!=null&&(typeof l!="object"||Array.isArray(l)))throw Error("invalid source cost fields");for(let u of["cache_creation_input_token_cost","cache_creation_input_token_cost_above_1hr"])if(l?.[u]!==void 0&&!Tg(l[u]))throw Error("source blend rates must be finite nonnegative numbers or null");let d=i.pricing.currency;if(d!=null&&d!=="USD")throw Error("price currency must be USD")}for(let i of t.aliases.standards){e(i.standard_slug),i.catalog_record_id!==null&&e(i.catalog_record_id);let o=i.standard_slug.toLowerCase();if(!o||r.has(o))throw Error("duplicate price standard");r.add(o)}for(let i of t.aliases.aliases){e(i.alias),i.standard_slug!==null&&e(i.standard_slug);let o=i.alias.toLowerCase();if(!o||s.has(o))throw Error("duplicate price alias");if(s.add(o),i.standard_slug!==null&&!r.has(i.standard_slug.toLowerCase()))throw Error("price alias references missing standard")}}var II=64*1024*1024;function Eg(t){let e=vI(t,yg.O_RDONLY|yg.O_NONBLOCK);try{let n=SI(e);if(!n.isFile()||n.size>II)throw Error("price file must be a regular file within the 64 MiB size limit");let r=Buffer.alloc(n.size+1),s=0;for(;s<r.length;){let i=bI(e,r,s,r.length-s,null);if(i===0)break;s+=i}if(s!==n.size)throw Error("price file changed while reading; retry with a complete file");return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(r.subarray(0,s))}finally{wI(e)}}var vg=t=>JSON.parse(t.replace(/^\uFEFF/,""));function AI(t,e=Ui(RI(t),"aliases.json")){let n=Eg(t),r=Eg(e),s;try{s=vg(n)}catch{s=null}if(!s||!("records"in Object(s))){let a=n.trim().split(/\r?\n/).filter(d=>d.trim()).map(d=>JSON.parse(d)),l=a[0]?.schema_version!==void 0&&a[0]?.pricing===void 0&&a[0]?.source_model_id===void 0?a.shift():{};s={schema_version:l.schema_version??1,generated_at:l.generated_at??"",records:a}}let i=vg(r),o={catalog:s,aliases:i,source:"pinned",generatedAt:s?.generated_at||null,sha256:kI("sha256").update(n).update(r).digest("hex")};return Ll(o),o}function Ol(t){let e=t.pragma("busy_timeout",{simple:!0});try{return t.pragma("busy_timeout = 0"),t.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='price_snapshot'").get()?t.transaction(()=>{let n=t.prepare("SELECT * FROM price_snapshot").get();if(!n)return null;let r=t.prepare("SELECT * FROM price_record ORDER BY ordinal").all().map(o=>{if(typeof o.record_id!="string"||!o.record_id||o.currency!=="USD"||o.unit!=="per_1m_tokens")throw Error("invalid stored price identity, currency or unit");let a=JSON.parse(o.record_json);return{...a,record_id:o.record_id,pricing:{...a.pricing,input_per_1m_tokens:o.input_1m,output_per_1m_tokens:o.output_1m,input_cache_read_per_1m_tokens:o.cache_read_1m,input_cache_write_per_1m_tokens:o.cache_write_1m,source_cost_fields:JSON.parse(o.source_cost_fields??"{}")}}});if(r.length!==n.record_count)throw Error("incomplete stored price snapshot");let s=t.prepare("SELECT alias,standard_slug,evidence FROM price_alias ORDER BY alias").all(),i={catalog:{schema_version:1,generated_at:n.generated_at??"",records:r},aliases:{schema_version:1,standards:JSON.parse(n.standards_json),aliases:s},source:n.source,generatedAt:n.generated_at,sha256:n.sha256,fetchedAt:n.fetched_at,loadedAt:n.loaded_at,recordCount:n.record_count};return Ll(i),i})():null}finally{t.pragma("busy_timeout = "+e)}}function CI(t,e,n={}){Ll(e);let r=()=>t.prepare("SELECT sha256 FROM price_snapshot").get()?.sha256===e.sha256,s=t.pragma("busy_timeout",{simple:!0});try{return t.pragma("busy_timeout = 0"),r()?"unchanged":t.transaction(()=>{if(r())return"unchanged";t.exec("DELETE FROM price_alias; DELETE FROM price_record; DELETE FROM price_snapshot;");let i=t.prepare("INSERT INTO price_record(record_id,source,provider,source_model_id,vendor_model_id,canonical_slug,currency,unit,input_1m,output_1m,cache_read_1m,cache_write_1m,source_cost_fields,record_json,ordinal) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");e.catalog.records.forEach((d,u)=>{let c=d;i.run(Sg(d),d.source,d.provider??null,d.source_model_id,c.vendor_model_id??null,c.canonical_slug??null,"USD","per_1m_tokens",d.pricing.input_per_1m_tokens,d.pricing.output_per_1m_tokens,d.pricing.input_cache_read_per_1m_tokens,d.pricing.input_cache_write_per_1m_tokens??null,JSON.stringify(d.pricing.source_cost_fields??{}),JSON.stringify(d),u)});let o=t.prepare("INSERT INTO price_alias(alias,standard_slug,evidence,catalog_record_id) VALUES(?,?,?,?)"),a=new Map(e.aliases.standards.map(d=>[d.standard_slug.toLowerCase(),d]));for(let d of e.aliases.aliases){let u=a.get(d.standard_slug?.toLowerCase()??"");o.run(d.alias.toLowerCase(),d.standard_slug,d.evidence,u?.catalog_record_id??null)}let l=new Date(n.now??Date.now()).toISOString();return t.prepare("INSERT INTO price_snapshot(sha256,generated_at,source,fetched_at,loaded_at,record_count,standards_json) VALUES(?,?,?,?,?,?,?)").run(e.sha256,e.generatedAt,e.source,l,l,e.catalog.records.length,JSON.stringify(e.aliases.standards)),"updated"}).immediate()}catch(i){if(/^SQLITE_(BUSY|LOCKED|READONLY)(_|$)/.test(String(i?.code)))return"deferred";throw i}finally{t.pragma("busy_timeout = "+s)}}var xl=new WeakMap;async function NI(t,e={}){let n=e.now??Date.now(),r={...process.env,...e.env},s=Ol(t),i=xl.get(t),o=i&&i.hash===s?.sha256?i.at:Date.parse(s?.fetchedAt??"");if(!e.force&&s&&n>=o&&n-o<ys(r))return{status:"unchanged",snapshot:s};let a=e.load??(()=>r.LMCTL_PRICE_DATA?Promise.resolve(AI(Ui(r.LMCTL_PRICE_DATA,"model_list.json"))):Pu({cacheDir:r.LMCTL_HOME?Ui(r.LMCTL_HOME,"cache","lmprice"):r.HOME?Ui(r.HOME,".lmctl","cache","lmprice"):void 0,ttlMs:e.force?0:ys(r)})),l,d;try{d=await(e.budgetMs===void 0?a():Promise.race([a(),new Promise(m=>{l=setTimeout(()=>m(null),e.budgetMs)})]))}finally{clearTimeout(l)}if(xl.set(t,{hash:s?.sha256??null,at:n}),!d?.catalog||!d.aliases||!d.sha256||d.refreshFailed&&(s||d.source!=="bundled"))return{status:"unavailable",snapshot:s};let u=CI(t,d,{now:n}),c=Ol(t);return xl.set(t,{hash:c?.sha256??null,at:n}),{status:u,snapshot:c}}async function wg(t,e){try{return(await NI(t,{env:e,budgetMs:900})).snapshot??qr}catch(n){if(/^SQLITE_(BUSY|LOCKED)(_|$)/.test(String(n?.code)))return qr;try{return Ol(t)??qr}catch{return qr}}}async function Dl(t){if(t.dal)return wg(t.dal.db,t.env);let e;try{return e=Ct({path:Wt(t),recover:!1}),await wg(e.db,t.env)}catch{return qr}finally{try{e?.close()}catch{}}}import{existsSync as xI,mkdirSync as OI,readFileSync as LI,renameSync as DI,unlinkSync as PI,writeFileSync as MI}from"node:fs";import{homedir as Rg}from"node:os";import{dirname as Jr,join as Ae,resolve as UI}from"node:path";var Fi="lmctl",ji="lmctl0",FI={existsSync:xI,mkdirSync:OI,readFileSync:LI,writeFileSync:MI,renameSync:DI,unlinkSync:PI},Je=FI,Pl;function kg(t,e,n){let r=Jr(UI(n)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??r,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())it(Ae(o,".mcp.json"),"mcpServers",[Ht(),Bt()]),a.has("opencode")&&it(Ae(o,".opencode","opencode.json"),"mcp",[Ig(),Ag()]),a.has("kimi")&&it(Ae(o,".kimi-code","mcp.json"),"mcpServers",[Ht(),Bt()]);for(let o of s)HI(o)}function jI(t=Pl??Rg()){return Ae(t,".copilot","mcp-config.json")}function $I(t,e){Je.mkdirSync(Jr(t),{recursive:!0});let n=Ae(Jr(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Je.writeFileSync(n,`${JSON.stringify(e,null,2)}
1831
+ `,"utf8"),Je.renameSync(n,t)}catch(r){try{Je.unlinkSync(n)}catch{}throw r}}function WI(t,e){Je.mkdirSync(Jr(t),{recursive:!0});let n=Ae(Jr(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Je.writeFileSync(n,e,"utf8"),Je.renameSync(n,t)}catch(r){try{Je.unlinkSync(n)}catch{}throw r}}function it(t,e,n){try{if(!Je.existsSync(t))return;let r=JSON.parse(Je.readFileSync(t,"utf8"));if(!Zn(r)||!Zn(r[e]))return;let s={...r[e]},i=[];for(let{name:o,shouldRemove:a}of n)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;r[e]=s,$I(t,r),M({event:"mcp_cleanup",path:t,removed:i})}catch{}}function Ht(){return{name:ji,shouldRemove:YI}}function Ig(){return{name:ji,shouldRemove:zI}}function Bt(){return{name:Fi,shouldRemove:VI}}function Ag(){return{name:Fi,shouldRemove:KI}}function HI(t){let e=Pl??Rg();switch(t){case"copilot":it(jI(e),"mcpServers",[Ht(),Bt()]);return;case"claude":it(Ae(e,".claude.json"),"mcpServers",[Ht(),Bt()]);return;case"gemini":it(Ae(e,".gemini","settings.json"),"mcpServers",[Ht(),Bt()]);return;case"qwen":it(Ae(e,".qwen","settings.json"),"mcpServers",[Ht(),Bt()]);return;case"agy":it(Ae(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Ht(),Bt()]);return;case"opencode":it(Ae(e,".config","opencode","opencode.json"),"mcp",[Ig(),Ag()]);return;case"kimi":it(Ae(Pl===void 0?process.env.KIMI_CODE_HOME??Ae(e,".kimi-code"):Ae(e,".kimi-code"),"mcp.json"),"mcpServers",[Ht(),Bt()]);return;case"codex":BI(Ae(e,".codex","config.toml"));return;default:return}}function BI(t){try{if(!Je.existsSync(t))return;let e=Je.readFileSync(t,"utf8"),n=XI(e);if(n===null)return;let r=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of r){let d=Cg(l);if(d===null)return;if(d!==void 0){if(bg(d,n)){o=!0,a=d[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let u=JI(l);if(u===null)return;if(u!==void 0&&bg(u,n)){i.add(u[1]);continue}s.push(l)}if(i.size===0)return;WI(t,s.join(`
1832
+ `)),M({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function bg(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function XI(t){let e=new Map,n;for(let s of t.split(/\n/)){let i=Cg(s);if(i===null)return null;if(i!==void 0){n=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),d=qI(a,n);if(d===null)return null;if(d===void 0||d.length!==3||d[0]!=="mcp_servers"||d[1]!==Fi&&d[1]!==ji)continue;let u=e.get(d[1])??{};if(d[2]==="command"){let c=Ng(l);if(c===null)return null;u.command=c}else if(d[2]==="args"){let c=GI(l);if(c===null)return null;u.args=c}e.set(d[1],u)}let r=new Set;for(let[s,i]of e.entries())s===Fi&&Og(i.command,i.args)&&r.add(s),s===ji&&Lg(i.command,i.args)&&r.add(s);return r}function qI(t,e){if(t.startsWith("mcp_servers"))return $i(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=$i(t);return n===null?null:[...e,...n]}function Cg(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:$i(e[1])}function JI(t){let e=t.indexOf("=");if(e<0)return;let n=t.slice(0,e).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return $i(n)}function $i(t){let e=[],n=0,r=()=>{for(;n<t.length&&/\s/.test(t[n]);)n+=1};for(;n<t.length;){if(r(),n>=t.length)return null;if(t[n]==='"'){n+=1;let s="",i=!1;for(;n<t.length;){let o=t[n];if(o==="\\"){if(n+1>=t.length)return null;s+=t[n+1],n+=2;continue}if(o==='"'){n+=1,i=!0;break}s+=o,n+=1}if(!i)return null;e.push(s)}else{let s=n;for(;n<t.length&&/[A-Za-z0-9_-]/.test(t[n]);)n+=1;if(n===s)return null;e.push(t.slice(s,n))}if(r(),n>=t.length)break;if(t[n]!==".")return null;n+=1}return e.length>0?e:null}function Ng(t){let e=xg(t).trim();if(e.startsWith('"'))try{let n=JSON.parse(e);return typeof n=="string"?n:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function GI(t){let e=xg(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let n=e.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>Ng(s.trim()));return r.some(s=>s===null)?null:r}function xg(t){let e;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==void 0){if(e==='"'&&r==="\\"){n+=1;continue}r===e&&(e=void 0);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function VI(t){return Zn(t)?t.type==="stdio"&&typeof t.command=="string"&&Og(t.command,t.args):!1}function KI(t){return!Zn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Pg(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&Dg(t.command[0],[t.command[1],t.command[2]])}function YI(t){return Zn(t)?t.type==="stdio"&&Lg(t.command,t.args):!1}function zI(t){return!Zn(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Mg(t.command[0])&&t.command[1]==="mcp"}function Og(t,e){return Pg(t)&&Ug(e)||Dg(t,e)}function Lg(t,e){return Mg(t)&&Ug(e)}function Dg(t,e){return QI(t)&&Array.isArray(e)&&e.length===2&&ZI(e[0])&&e[1]==="mcp"}function Pg(t){return typeof t=="string"&&Ml(t)==="lmctl"}function Mg(t){return typeof t=="string"&&Ml(t)==="lmctl0"}function QI(t){if(typeof t!="string")return!1;let e=Ml(t).toLowerCase();return e==="node"||e==="node.exe"}function ZI(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Ml(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function Ug(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function Zn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}import{basename as eA}from"node:path";var tA=6e4,nA=2,Fg=8*60*60*1e3;function $g(t,e){let n=new Date(e.now.getTime()-Wi()).toISOString(),r=Bg(t,n).filter(p=>!p.sender.teamfile.startsWith("prompt:")),s=sA(e.sender,r),i=iA(e.sender,r);i!==null&&i.teamfile===e.root&&!jg(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(p=>jg(p,o)),d=l.map(p=>p.at).filter(p=>p!==null).sort((p,f)=>f-p)[0]??null,u=d!==null&&e.now.getTime()-d<tA,c=Ul(e.sender,r).length;return{stop:l.length>=1&&u&&c>=nA,chain:oA(a)}}function Wg(t,e){let n=new Date(e.now.getTime()-Wi()).toISOString(),r=Bg(t,n),s=Ul(e.sender,r);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function Wi(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Fg;let n=Number(e);return!Number.isFinite(n)||n<=0?Fg:n}function Hg(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function rA(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function Bg(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(rA).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=e).sort((n,r)=>n.at-r.at)}function sA(t,e,n={}){let r=new Map;for(let a of e)r.set(fn(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([fn(t)]);for(let a=0;a<64;a+=1){let l=r.get(fn(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let d={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&n.includePromptSender!==!0)break;let u=fn(l.sender);if(o.has(u))break;s.unshift(d),o.add(u),i=l.sender}return s}function Ul(t,e){let n=fn(t),r=new Set([n]),s=[n],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of e){let d=fn(l.sender),u=fn(l.receiver);d!==a&&u!==a||(i.includes(l)||i.push(l),r.has(d)||(r.add(d),s.push(d)),r.has(u)||(r.add(u),s.push(u)))}}return i.sort((o,a)=>o.at-a.at)}function iA(t,e){let n=Ul(t,e);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function jg(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function fn(t){return`${t.teamfile}\0${t.alias}`}function oA(t){return t.map(e=>`${eA(e.teamfile)}:${e.alias}`).join(" \u2192 ")}function aA(t,e){if(hc(e)!=="dead")return null;let n=`holder process verified not alive; reconciled to aborted (invocation #${e.id}, holder pid ${e.holder_pid??"unknown"} on ${e.holder_host??"unknown"})`;return t.abortTrackedInvocationAndTerminalizeMessage(e.id,{holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat_at:e.last_heartbeat_at},n)}function Xg(t,e,n){let r=t.query(`SELECT id, status, holder_pid, holder_host, started_at, last_heartbeat_at
1833
+ FROM tracked_invocation
1834
+ WHERE target_teamfile = ?
1835
+ AND target_alias = ?
1836
+ AND status = 'running'`,e,n),s=0;for(let i of r)aA(t,i)!==null&&(s+=1);return s}var lA={muse:["--yolo"],claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],pi:[],lmplayer:["--auto"],kimi:[],hermes:[]};var y$=new Set(Object.keys(lA));var Fl=null;function qg(){return Fl===null&&(Fl=Nt(Ft())),Fl}function Jg(t,e){return qg().getSession(t,e)}async function Gg(t){return(await qg().resolveSessions(t)).map(n=>n.provider.name)}var Vg=36e5;function dA(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return Vg;let n=Number(e);return!Number.isFinite(n)||n<=0?Vg:n}async function uA(t,e,n){try{let r=pn(e,n,t),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof r.provider=="string"&&r.provider.trim()!=="")i=r.provider;else{let d=await Gg(s);if(d.length!==1)return null;i=d[0]}let o=await Jg(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function Kg(t,e,n,r,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??dA(),o=await uA(t,n,r),a=o!==null&&o>=i;return a&&M({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var Yg=Zl(Nl(),1);function cA(t){return t===null?null:je(t)?"live":"dead"}function jl(t){let e=t.nowMs??Date.now(),n=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:cA(t.holderPid),since:t.since,idle_ms:Number.isFinite(n)?Math.max(0,e-n):null}}function mA(t){return(0,Yg.formatDuration)(t)}function $l(t){let e=[];return t.idle_ms!==null&&e.push(`active ${mA(t.idle_ms)}`),e.push(`since ${t.since}`),e.push(t.holder_pid===null?"holder_pid=unavailable":`holder_pid=${t.holder_pid}, ${t.holder_liveness}`),`(${e.join("; ")})`}function zg(t,e=process.env,n){let r=n?.db?.name??Pn(void 0,e),s=e.LMCTL_DB===r?e:{...e,LMCTL_DB:void 0};return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
1837
+ The session marker may be stale or the team may not be registered in this lmctl database.
1838
+ Consulted ${Bc(r,s)}
1839
+ To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function Qg(t,e){let n=pA(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function pA(t,e){let n=t[Zo];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let i of e.listRootTeams()){let o;try{o=zn(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===n&&r.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}function Zg(t){let e=kl(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var F$=60*60*1e3,fA=2e3,gA=5e3;function _A(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=Ct({path:Wt(t)})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&je(a.holder_pid)),pollMs:fA,settleMs:gA,maxHoldMs:It(n),onHold:()=>M({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&M({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function e_(t){let e=t.literalPrompt?t.newMessage:hA(t.newMessage,{newMessageFrom:t.newMessageFrom??yA(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=ue(),s=0,i=0,o=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:d=>{n=!0,r&&(s+=1,o=Buffer.byteLength(d,"utf8"),i+=o),t.onDelta?.(d)},onProgress:d=>t.onProgress?.(d)};t.registry&&(a.registry=t.registry),t.signal&&(a.signal=t.signal),t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),t.requireResume!==void 0&&(a.requireResume=t.requireResume),t.bundleSession!==void 0&&(a.bundleSession=t.bundleSession),a.holdOpen=_A(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await jf(a);if(t.requireResume&&l.sessionId!==t.receiver.sessionId)throw Object.assign(new Error(`provider session changed: expected ${t.receiver.sessionId}, received ${l.sessionId??"(missing)"}`),{usage:l.usage,sessionId:l.sessionId});return r&&We(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:i,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:o,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:l.status==="empty"?{status:"empty",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:{status:"ok",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}}function hA(t,e={}){return[`--- new prompt (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
1840
+ `)}function yA(t){return`${t.teamfile}:${t.alias}`}var t_=256*1024,i_=3e4;async function o_(t){let e=t.onEvent??(()=>{}),n=TA(t.io,e),r=null,s=null,i=null,o,a,l=null,d=!1,u=null,c=t.prompt,m;try{let p=t.resolvedNativeTarget,f=p!==void 0;if(f&&(t.heldLease===void 0||t.conversation===void 0))throw new be("native session turns require a caller-held lease and conversation");let g=f?p:await oe(n,k=>pn(t.teamfile,t.alias,k));if(t.expectedSession!==void 0&&(g.provider!==t.expectedSession.provider||g.sessionid!==t.expectedSession.sessionid))throw new be(`session changed for ${g.alias}; expected ${t.expectedSession.provider}:${t.expectedSession.sessionid}, found ${g.provider}:${g.sessionid}`);if(f&&(t.conversation.provider!==g.provider||t.conversation.sessionId!==g.sessionid))throw new be("native session changed for "+g.alias+"; expected "+g.provider+":"+g.sessionid+", found "+t.conversation.provider+":"+t.conversation.sessionId);let _=g.teamfile,h=await oe(n,k=>NA(k,t.env??process.env)),E=h.sender,y=f?"native:"+g.provider+":"+g.sessionid:await xA(n,{explicitRoot:t.rootFlag,sender:E,receiverTeamfile:_,operatorOrigin:h.origin==="operator"}),T=t.env??process.env;if(!f){let k=await oe(n,x=>x.getRootTeam(y)?.name??null);k!==null&&(T.LMBEE_TEAM_NAME=k)}i=await SA(n,{receiverTeamfile:_,receiverAlias:g.alias,sender:E,rootTeamfile:y,provider:g.provider,model:g.model,sessionId:g.sessionid,cwd:g.sessiondir,prompt:t.prompt,origin:h.origin,parentInvocationId:_g(T.LMCTL_INVOCATION_ID)}),o=IA(n,i),i!==null&&(T.LMCTL_INVOCATION_ID=String(i));try{f||kg(n,Tl(_),_)}catch{}r={root_teamfile:y,sender_teamfile:E?.teamfile??null,sender_alias:E?.alias??null,receiver_teamfile:_,receiver_alias:g.alias,receiver_provider:g.provider,receiver_session_id:g.sessionid,origin:h.origin,message_type:t.messageType??null};let v=await l_(n,_,g.alias);if(v!==null){let k=Xr(v);return gn(i,r,t.prompt,k,"unavailable"),u=Wl(k,null),{status:"busy",message:k,teamChatLogId:null}}let b=!1;if(t.heldLease!==void 0){let k=t.heldLease;if(!await oe(n,P=>{let L=P.getAgentInflight(_,g.alias);return L===null||L.sender_teamfile!==k.row.sender_teamfile||L.sender_alias!==k.row.sender_alias||L.started_at!==k.row.started_at||L.holder_pid!==process.pid?!1:P.heartbeatAgentInflight(k.row,k.leaseId,new Date().toISOString())})){let P=`bundle lease lost for ${g.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return gn(i,r,t.prompt,P,"unavailable"),u=Gr(P,null),{status:"error",errorKind:"provider",message:P,teamChatLogId:null,messageId:null}}}else{let k=await EA(n,_,g.alias);if(k.busy){let x=await vA(n,_,g.alias);return x+=await wA(n,_,g.alias),gn(i,r,t.prompt,x,"unavailable"),u=Wl(x,null),{status:"busy",message:x,teamChatLogId:null}}b=k.idleReclaim}if(E!==null&&E.teamfile!==_){let k=await oe(n,x=>$g(x,{root:y,sender:E,receiverTeamfile:_,receiverAlias:g.alias,now:new Date}));if(k.stop){let x=Hg(k.chain);return gn(i,r,t.prompt,x,"cycle"),u=Gr(x,null),{status:"error",errorKind:"cycle",message:x,teamChatLogId:null,messageId:null}}}if(t.heldLease===void 0){let k=await OA(n,{receiver_teamfile:_,receiver_alias:g.alias,sender_teamfile:E?.teamfile??_,sender_alias:E?.alias??"operator",...b?{force:!0,reclaimReason:"session-idle"}:{}});if(!k.acquired){let x=d_(_,g.alias,k.current);return x+=` ${$l(jl({holderPid:k.current.holder_pid,since:k.current.started_at}))}`,gn(i,r,t.prompt,x,"unavailable"),u=Wl(x,null),{status:"busy",message:x,teamChatLogId:null}}s={row:k.lease,leaseId:k.leaseId},t.onInflightAcquired?.(s),a=ks(x=>oe(n,P=>P.heartbeatAgentInflight(s.row,s.leaseId,x)),{intervalMs:i_,onError:x=>{ue()&&We(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:x instanceof Error?x.message:String(x)}))}})}if(t.signal?.aborted)throw Error("Chat turn cancelled");m=zu({provider:g.provider,modelRequested:g.model??null,cwd:g.sessiondir,sessionId:g.sessionid}),r&&(r.started_at=m.startedAt);let S=await e_({sender:E??{teamfile:_,alias:"operator"},receiver:{teamfile:_,alias:g.alias,provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir,...g.model!==void 0?{model:g.model}:{},...g.effort!==void 0?{effort:g.effort}:{},...g.isLead!==void 0?{isLead:g.isLead}:{}},signal:t.signal,newMessage:t.prompt,newMessageFrom:E===null?"operator":`${E.teamfile}:${E.alias}`,...f?{literalPrompt:!0}:{},io:n,permissionMode:t.permissionMode,...t.expectedSession!==void 0?{requireResume:!0}:{},...t.bundleSession!==void 0?{bundleSession:t.bundleSession}:{},...t.conversation!==void 0?{bundleSession:t.conversation}:{},...t.registry!==void 0?{registry:t.registry}:{},env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:k=>e({kind:"delta",chunk:k}),onProgress:k=>e({kind:"progress",alias:g.alias,event:k}),onPromptBuilt:async k=>{c=k,l===null&&(l=await DA(n,{...r,message:k,usage:m}),l!==null&&(t.onAccepted?.(dt(l)),i!==null&&await kA(n,i,l))),i!==null&&await RA(n,i,k)}});c=S.prompt;let R=S.status==="stalled",O=S.status==="empty",N=null,A=R?`provider stalled${S.stalledAfterMs!==void 0?` after ${S.stalledAfterMs}ms`:""}`:O?"provider returned no content and no observed activity for this turn -- often an upstream failure (rate limit, quota, auth) the provider did not report as an error":S.status==="error"?S.error??S.receipt:null,w=R||O||S.status==="error"?"error":"ok",I=await xo(m,{status:S.status,sessionId:S.sessionId,usage:S.usage},()=>Dl(n),{db:n.dal?.db,dbPath:Wt(n),env:n.env});l!==null?(await r_(n,l,{...r,message:c,response:S.receipt,status:w,error_detail:A,usage:I}),d=!0,N=l):N=await s_(n,{...r,message:c,response:S.receipt,status:w,error_detail:A,usage:I});let C=S.status!=="error"?S.warnings:void 0;if(R||O){let k=A;gn(i,r,c,k,"error"),u=Gr(k,N,S.receipt,C)}else u=AA(S.receipt,N,C);return{status:R?"stalled":O?"empty":"ok",replyText:S.receipt,wroteDelta:S.wroteDelta,teamChatLogId:N,messageId:N===null?null:dt(N),durationMs:S.durationMs}}catch(p){let f=p instanceof Error?p.message:String(p),g=p,_=m?await xo(m,{status:Qu(f,!!t.signal?.aborted),usage:g?.usage,sessionId:g?.sessionId},()=>Dl(n),{db:n.dal?.db,dbPath:Wt(n),env:n.env}):void 0;return l!==null&&!d&&r!==null&&(await r_(n,l,{...r,message:c,response:null,status:"error",error_detail:f,usage:_}),d=!0),l===null&&r!==null&&_&&(l=await s_(n,{...r,message:c,response:null,status:"error",error_detail:f,usage:_})),gn(i,r,c,f,"error"),u=Gr(f,l),{status:"error",errorKind:p instanceof be?"target":"provider",message:f,teamChatLogId:l,messageId:l===null?null:dt(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await PA(n,r,dt(l)),s!==null&&await LA(n,s.row,s.leaseId)&&t.onInflightReleased?.(s.leaseId),i!==null&&await bA(n,i,u??Gr("chat turn exited without a terminal outcome",null))}}function TA(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function EA(t,e,n){let r=await oe(t,i=>(Xg(i,e,n),Tr(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await oe(t,i=>Kg(i,r,e,n));return{busy:!s,idleReclaim:s}}async function vA(t,e,n){let r=await l_(t,e,n);if(r!==null)return Xr(r);let s=await oe(t,i=>i.getAgentInflight(e,n));return s!==null?d_(e,n,s):`${n} is busy; wait and retry`}async function wA(t,e,n){let r=await oe(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${$l(jl({holderPid:r.holder_pid,since:r.started_at}))}`}async function SA(t,e){try{return(await oe(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:CA(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return ue()&&We(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function bA(t,e,n){try{await oe(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){ue()&&We(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function RA(t,e,n){try{await oe(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){ue()&&We(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function kA(t,e,n){try{await oe(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){ue()&&We(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function IA(t,e){if(e===null)return;let n=setInterval(()=>{oe(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{ue()&&We(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},i_);return n.unref?.(),n}function a_(t){return t!==void 0&&t.length>0?{config_warnings:JSON.stringify(t)}:{}}function AA(t,e,n){return{status:"done",result_summary:Hi(t),error:null,team_chat_log_id:e,...a_(n)}}function Wl(t,e){return{status:"busy",result_summary:Hi(t),error:t,team_chat_log_id:e}}function Gr(t,e,n,r){return{status:"error",result_summary:n===void 0?sm(t,500):Hi(n),error:t,team_chat_log_id:e,...a_(r)}}function Hi(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function CA(t,e,n){return`lmctl prompt ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function NA(t,e){let n=Qg(e,t);if(n.ok)return{sender:Zg(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(zg("chat",e,t))}async function xA(t,e){if(e.explicitRoot!==void 0)return await oe(t,r=>ft(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await oe(t,r=>Wg(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function OA(t,e){return await oe(t,n=>{let r=ue(),s=Is(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:Wi(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&We(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:n_(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&We(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:n_(s.current)})),{acquired:!1,current:s.current})})}async function l_(t,e,n){return await oe(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(Il(o).live)return o;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:Il(s).live?s:null})}function n_(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function LA(t,e,n){try{return await oe(t,r=>r.releaseAgentInflight(e,n))}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1841
+ `)}return!1}function d_(t,e,n){return`${e} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function DA(t,e){let n=Vr(e.message);try{return await oe(t,r=>r.beginTeamChatLog({usage:e.usage,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,message_type:e.message_type??null,created_at:e.started_at??new Date().toISOString()}))}catch(r){return t.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
1842
+ `),null}}async function r_(t,e,n){let r=Vr(n.message),s=n.response===null?null:Vr(n.response);try{await oe(t,i=>i.finishTeamChatLog(e,{usage:n.usage,root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,receiver_provider:n.receiver_provider,receiver_session_id:n.receiver_session_id,provider_prompt:n.message,message:r.text,response:s?.text??null,origin:n.origin,status:n.status,error_detail:n.error_detail,truncated:r.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(i){t.stderr.write(`warning: failed to finish chat log ${e}: ${i instanceof Error?i.message:String(i)}
1843
+ `)}}async function PA(t,e,n){if(e!==null)try{await oe(t,r=>{r.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,n)})}catch(r){t.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
1844
+ `)}}async function s_(t,e){let n=Vr(e.message),r=e.response===null?null:Vr(e.response);try{return await oe(t,s=>s.insertTeamChatLog({usage:e.usage,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:r?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,message_type:e.message_type??null,created_at:e.started_at??new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1845
+ `),null}}function gn(t,e,n,r,s){t!==null||e===null||M({event:"chat_attempt_error",reason:s,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,origin:e.origin,error_detail:r,message_preview:Hi(n)})}function Vr(t){return t.length<=t_?{text:t,truncated:!1}:{text:t.slice(0,t_),truncated:!0}}var m_=new WeakMap;function p_(t,e){let n=e&&typeof e=="object"?m_.get(e):void 0;return n?.ctx===t?n:void 0}function Bi(t,e,n,r){let s=new Set(e.listRootTeams().map(a=>a.teamfile_path));for(let a of new Set([t.cwd,r]))try{for(let l of MA(a))/\.(?:lmctl|lmc)$/i.test(l)&&s.add(c_(a,l))}catch(l){if(l.code!=="ENOENT")throw l}let i=new Map;for(let a of s){let l;try{l=zn(a,e)}catch(d){if(/missing on disk|teamfile not found/.test(fe(d)))continue;throw d}if(l.parseErrors.length)throw Error("Cannot resolve native ownership: "+l.parseErrors.join("; "));for(let d of l.members){if(d.teamfile===void 0&&(d.provider!==n.provider||d.session!==n.sessionid))continue;let u=pn(a,d.alias,e);u.provider===n.provider&&u.sessionid===n.sessionid&&i.set(JSON.stringify([ft(u.teamfile,e),u.alias]),u)}}if(i.size>1)throw Error("Native session owner is ambiguous");let o=i.values().next().value;return o?{member:{...o,...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{}},known:!0}:{member:{teamfile:"native:"+n.provider+":"+n.sessionid,alias:n.sessionid,provider:n.provider,sessionid:n.sessionid,sessiondir:r,isLead:!1,...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{}},known:!1}}function Hl(t,e){return t.alias+" is servicing "+e.sender_alias+" ("+e.sender_teamfile+") since "+e.started_at+" \u2014 wait and retry"}function f_(t,e=!1){if(t.released)return;let n=e?t.dal.db.pragma("busy_timeout",{simple:!0}):void 0;e&&t.dal.db.pragma("busy_timeout=0");try{if(!t.dal.releaseAgentInflight(t.lease.row,t.lease.leaseId))throw Error("Native session lease release refused: ownership changed");t.released=!0}finally{e&&t.dal.db.pragma("busy_timeout="+n)}}async function Bl(t){return t.closing||(t.closed=!0,t.stopHeartbeat(),t.controller.abort(),t.closing=(async()=>{let e=u_.now(),n;try{let r=(async()=>{await t.conversation?.close(),await t.active})();await Promise.race([r,new Promise((s,i)=>{n=setTimeout(()=>i(Error("Native session cleanup exceeded its 5 second deadline")),Math.max(1,5e3-(u_.now()-e)))})])}finally{n&&clearTimeout(n),f_(t,!0),t.untrack()}})()),t.closing}function jA(t){t.closed=!0,t.stopHeartbeat(),t.controller.abort(),t.conversation&&t.conversation.close().catch(()=>{}),f_(t,!0),t.untrack()}async function Xl(t,e,n={},r){let s;try{let i=Li(t);if(i)return i;if(!e||typeof e!="object"||Array.isArray(e))return ee("invalid_argument","Native session member must be a map");for(let R of["provider","sessionid"])if(typeof e[R]!="string"||!e[R].trim())return ee("invalid_argument","Native session requires provider and sessionid");for(let R of["sessiondir","model","effort"])if(e[R]!==void 0&&(typeof e[R]!="string"||!e[R].trim()))return ee("invalid_argument","Native session "+R+" must be a nonempty string");if(!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).some(R=>!["permissionMode","idleTimeoutMs"].includes(R)))return ee("invalid_argument","Native session options must contain permissionMode or idleTimeoutMs");if(n.permissionMode!==void 0&&!["yolo","plan"].includes(n.permissionMode))return ee("invalid_argument","permissionMode must be yolo or plan");if(n.idleTimeoutMs!==void 0&&(!Number.isFinite(n.idleTimeoutMs)||n.idleTimeoutMs<0))return ee("invalid_argument","idleTimeoutMs must be finite and nonnegative");let o=vr(t),a=UA(t.cwd,e.sessiondir??t.cwd),l;try{l=Bi(t,o,e,a)}catch(R){return ee("invalid_argument",fe(R))}let d=Ai(t);if(!await d.getSession(e.sessionid,e.provider))return ee("not_found","Native session was not found");if(t.closed)return ee("cancelled","Context is closed");let c=l.member,m=Tr(o,c.teamfile,c.alias);if(m.busy)return{status:"busy",error:m.reason==="in-flight"?Hl(c,m.inFlight):m.source==="terminal-lock"?Xr(m.terminalLock):c.alias+" is busy (interactive terminal); wait and retry"};let p={receiver_teamfile:c.teamfile,receiver_alias:c.alias,sender_teamfile:c.teamfile,sender_alias:"operator",started_at:new Date().toISOString()},f=o.getAgentInflight(c.teamfile,c.alias),g=f!==null&&(f.native_provider!==null&&f.native_provider!==void 0||f.native_session_id!==null&&f.native_session_id!==void 0);if(g&&!r)return{status:"busy",error:Hl(c,f)};let _=r&&g?o.tryAcquireNativeHolder(p,r):void 0,h=_?_.acquired?{acquired:!0,lease:_.current,leaseId:_.lease_id}:{acquired:!1,current:_.current}:Is(o,{...p,ttlMs:It(t.env),...r?{nativeHolder:r}:{}});if(!h.acquired)return{status:"busy",error:Hl(c,h.current)};let E=Object.freeze({id:"native-session-"+FA()});s={ctx:t,dal:o,ref:E,member:c,ownerKnown:l.known,options:{...n},lease:{row:h.lease,leaseId:h.leaseId},controller:new AbortController,closed:!1,released:!1,stopHeartbeat(){},untrack(){}};let y=s;y.untrack=Jc(t,{close:()=>Bl(y),finalizeSync:()=>jA(y)});let T=ks(R=>o.heartbeatAgentInflight(y.lease.row,y.lease.leaseId,R),{intervalMs:Rs(t.env)});y.stopHeartbeat=()=>clearInterval(T);let v=$f({provider:e.provider,sessionId:e.sessionid,cwd:c.sessiondir,env:{...t.env},model:c.model,effort:c.effort,permissionMode:n.permissionMode??"yolo",timeoutMs:n.idleTimeoutMs??0,execution:"auto",requireResume:!0,registry:d,userConfig:Us(t.env.HOME?c_(t.env.HOME,".lmctl/config.toml"):void 0)});v.then(R=>{y.closed&&R.close().catch(()=>{})}).catch(()=>{});let b,S=new Promise((R,O)=>{b=()=>O(Error("Context is closed")),t.signal.addEventListener("abort",b,{once:!0}),t.signal.aborted&&b()});try{y.conversation=await Promise.race([v,S])}finally{t.signal.removeEventListener("abort",b)}if(t.closed||y.closed)throw Error("Context is closed");return m_.set(E,y),Ls({session:E})}catch(i){if(s)try{await Bl(s)}catch(o){return ee("provider",fe(i)+"; "+fe(o))}return ee(t?.closed?"cancelled":"provider",fe(i))}}async function ql(t,e,n,r=void 0){let s=(l,d="invalid_argument")=>({status:"error",reply:"",error:l,code:d,messageId:null,teamChatLogId:null}),i=Li(t);if(i)return s(i.error,i.code);let o=p_(t,e);if(!o||o.closed||!o.conversation)return s("Invalid or closed native session reference");if(typeof n!="string")return s("Native session prompt must be a string");if(o.active)return{status:"busy",reply:"",error:"Batch already has an active turn",messageId:null,teamChatLogId:null};let a;o.active=new Promise(l=>{a=l});try{if(o.ownerKnown){let d=pn(o.member.teamfile,o.member.alias,o.dal);if(d.provider!==o.member.provider||d.sessionid!==o.member.sessionid)throw Error("Session binding changed; native turn cancelled")}let l=await o_({signal:AbortSignal.any([t.signal,o.controller.signal]),teamfile:o.member.teamfile,alias:o.member.alias,resolvedNativeTarget:o.member,prompt:n,expectedSession:{provider:o.member.provider,sessionid:o.member.sessionid},permissionMode:o.options.permissionMode??"yolo",idleTimeoutMs:o.options.idleTimeoutMs,heldLease:o.lease,conversation:o.conversation,registry:Ai(t),onAccepted:r?.onAccepted,env:{...t.env,...r?.attribution},io:{...Gf(t),dal:o.dal}});return{status:l.status,reply:"replyText"in l?l.replyText:"",error:l.status==="ok"?null:"message"in l?l.message:"provider "+l.status,messageId:"messageId"in l?l.messageId:null,teamChatLogId:l.teamChatLogId}}catch(l){return s(fe(l),"provider")}finally{a(),o.active=void 0}}async function Jl(t,e){try{let n=p_(t,e);return n?(await Bl(n),Ls({})):ee("invalid_argument","Invalid native session reference")}catch(n){return ee("provider",fe(n))}}import{closeSync as RW,existsSync as kW,lstatSync as $A,mkdirSync as WA,openSync as IW,readFileSync as AW,rmSync as CW,writeFileSync as NW}from"node:fs";import{createHash as g_,randomUUID as OW}from"node:crypto";import{tmpdir as HA}from"node:os";import{join as __,resolve as PW}from"node:path";var Xi=1024*1024;function h_(t){let e=t.env,n=Us(e.HOME?__(e.HOME,".lmctl/config.toml"):void 0);return g_("sha256").update(JSON.stringify({HOME:e.HOME,KIMI_CODE_HOME:e.KIMI_CODE_HOME,XDG_DATA_HOME:e.XDG_DATA_HOME,XDG_CONFIG_HOME:e.XDG_CONFIG_HOME,tools:n.tools})).digest("hex")}function y_(t){let e=g_("sha256").update(t.dbPath).digest("hex").slice(0,16),n=__(HA(),"lmctl-native-"+(process.getuid?.()??"user")+"-"+e);WA(n,{recursive:!0,mode:448});let r=$A(n);if(!r.isDirectory()||r.isSymbolicLink()||process.getuid&&r.uid!==process.getuid()||r.mode&63)throw Error("Native holder directory must be private and owned by this user");return n}var Vl=100;async function ZA(t){if(!t)throw Error("Native holder needs a private startup descriptor");let e=JA(t);if(!e.isFile()||e.isSymbolicLink()||e.mode&63||process.getuid&&e.uid!==process.getuid()||e.size>Xi)throw Error("Invalid holder startup descriptor");let n=JSON.parse(GA(t,"utf8"));Gl(t,{force:!0});let r=N=>{let A=n.resultFile+".tmp";VA(A,JSON.stringify(N),{flag:"wx",mode:384}),KA(A,n.resultFile)},s=Kc({env:{...n.env,LMCTL_DB:n.dbPath},cwd:n.cwd,dbPath:n.dbPath,pid:process.pid,onProgress:(N,A)=>{(A==="stderr"?process.stderr:process.stdout).write(N+`
1846
+ `)}});if(s.status!=="ok"){r(s);return}let i=s;hg({stdout:process.stdout,stderr:process.stderr});let o=vr(i),a=Bi(i,o,n.member,zA(i.cwd,n.member.sessiondir??i.cwd)).member,l=bs(process.pid);if(!l){r({status:"error",code:"closed",error:"Native holder process identity cannot be verified on this host"}),await i.close();return}let d={cwd:a.sessiondir,model:a.model,effort:a.effort,permissionMode:n.options.permissionMode??"yolo",idleTimeoutMs:n.options.idleTimeoutMs??3e5,profile:h_(i)},u=y_(i),c=YA(u,QA().slice(0,16)+".sock"),m=!1,p=!1,f=!1,g,_,h=new Set,E,y,T=BA(N=>{h.add(N),N.once("close",()=>h.delete(N)),N.on("error",()=>{});let A=Buffer.alloc(0),w=!1,I=setTimeout(()=>N.destroy(),2e3),C=x=>{if(N.destroyed)return;let P=JSON.stringify(x)+`
1847
+ `;if(Buffer.byteLength(P)>Xi){N.destroy();return}N.write(P)},k=x=>{C({kind:"result",result:x}),N.end()};N.on("data",x=>{if(w){N.destroy();return}if(A=Buffer.concat([A,x]),A.length>Xi){clearTimeout(I),N.destroy();return}let P=A.indexOf(10);if(P<0)return;w=!0,clearTimeout(I);let L;try{if(A.length!==P+1)throw Error("multiple frames");L=JSON.parse(A.subarray(0,P).toString())}catch{k({status:"error",code:"invalid_argument",error:"Malformed native holder frame"});return}if(!L||!["turn","close"].includes(L.kind)||L.provider!==n.member.provider||L.sessionid!==n.member.sessionid||L.generation!==y.native_generation||!v()){k({status:"error",reply:"",messageId:null,teamChatLogId:null,code:"closed",error:"Native holder lease generation or identity is no longer current"});return}if(!L.member||!L.options||L.profile!==d.profile||L.member.sessiondir!==void 0&&L.member.sessiondir!==d.cwd||L.member.model!==void 0&&L.member.model!==d.model||L.member.effort!==void 0&&L.member.effort!==d.effort||L.options.permissionMode!==void 0&&L.options.permissionMode!==d.permissionMode||L.options.idleTimeoutMs!==void 0&&L.options.idleTimeoutMs!==d.idleTimeoutMs){k({status:"error",reply:"",messageId:null,teamChatLogId:null,code:"invalid_argument",error:"Native holder configuration conflicts with this request"});return}if(p||f){k({status:"busy",reply:"",messageId:null,teamChatLogId:null,error:"Batch already has an active turn"});return}if(L.kind==="close"){f=!0,S(N).then(()=>{k({status:"ok",error:null}),setTimeout(()=>N.destroy(),Vl)},W=>{k({status:"error",code:"provider",error:fe(W)}),setTimeout(()=>N.destroy(),Vl)});return}if(typeof L.prompt!="string"||!L.attribution||typeof L.attribution!="object"||Object.keys(L.attribution).some(W=>!["LMCTL_SELF_SESSIONID","LMCTL_INVOCATION_ID"].includes(W))||Object.values(L.attribution).some(W=>W!==void 0&&typeof W!="string")){k({status:"error",code:"invalid_argument",error:"Invalid turn frame"});return}p=!0,clearTimeout(g),ql(i,E.session,L.prompt,{attribution:{LMCTL_SELF_SESSIONID:L.attribution.LMCTL_SELF_SESSIONID,LMCTL_INVOCATION_ID:L.attribution.LMCTL_INVOCATION_ID},onAccepted:W=>C({kind:"accepted",messageId:W})}).then(k,W=>k({status:"error",reply:"",error:fe(W),code:"provider",messageId:null,teamChatLogId:null})).finally(()=>{p=!1,R()})}),N.once("close",()=>clearTimeout(I))});function v(){let N=o.findNativeHolder(n.member.provider,n.member.sessionid);return N?.native_generation===y?.native_generation&&N?.holder_pid===process.pid&&bs(process.pid)===l}let b;function S(N){if(b)return b;f=!0,clearTimeout(g),clearInterval(_);let A,w;return b=new Promise((I,C)=>{A=I,w=C}),(async()=>{T.close(),await new Promise(I=>setTimeout(I,Vl));for(let I of h)I!==N&&I.destroy();try{if(y&&!i.closed){let C=o.db.pragma("busy_timeout",{simple:!0});o.db.pragma("busy_timeout=0");try{o.updateNativeHolderPhase(y.receiver_teamfile,y.receiver_alias,y.native_generation,"closing")}catch{}finally{o.db.pragma("busy_timeout="+C)}}if(E?.status==="ok"&&i.closed){let C=await Jl(i,E.session);if(C.status!=="ok")throw Error(C.error)}let I=await i.close();if(I.errors.length)throw Error(I.errors.join("; "))}finally{Gl(c,{force:!0}),m&&Gl(n.resultFile,{force:!0})}})().then(A,w),b}function R(){f||p||(clearTimeout(g),g=setTimeout(()=>{p||S().catch(N=>process.stderr.write(fe(N)+`
1848
+ `))},d.idleTimeoutMs>0?d.idleTimeoutMs:3e5))}let O=N=>{f=!0,i.finalizeSync(N),S().finally(()=>{for(let A of h)A.destroy();process.exit(N==="SIGINT"?130:143)})};process.once("SIGINT",()=>O("SIGINT")),process.once("SIGTERM",()=>O("SIGTERM"));try{if(o.db.prepare("SELECT * FROM agent_inflight WHERE native_provider=? AND native_session_id=?").get(n.member.provider,n.member.sessionid)){r({status:"busy",error:a.alias+" is busy; wait and retry"}),await S();return}if(E=await Xl(i,n.member,{permissionMode:d.permissionMode,idleTimeoutMs:0},{provider:n.member.provider,sessionId:n.member.sessionid,endpoint:c,phase:"starting",processIdentity:{bootId:l.split(":")[0],startTime:l.split(":")[1]},configJson:JSON.stringify(d)}),E.status!=="ok"){let A=o.findNativeHolder(n.member.provider,n.member.sessionid);r(A&&A.holder_pid!==process.pid?{status:"busy",error:a.alias+" is busy; wait and retry"}:E),await S();return}if(y=o.findNativeHolder(n.member.provider,n.member.sessionid),!y||y.holder_pid!==process.pid)throw Error("Holder lease was lost during open");if(await new Promise((A,w)=>{T.once("error",w),T.listen(c,()=>{XA(c,384),A()})}),!o.publishNativeHolder(y.receiver_teamfile,y.receiver_alias,y.native_generation,c,"ready"))throw Error("Holder lease was lost before publication");y=o.findNativeHolder(n.member.provider,n.member.sessionid),m=!0,r({status:"ok",error:null}),R(),_=setInterval(()=>{v()||S().catch(A=>process.stderr.write(fe(A)+`
1849
+ `))},Rs(i.env)),await new Promise(A=>T.once("close",A))}catch(N){if(!qA(n.resultFile))try{r({status:"error",code:"provider",error:fe(N)})}catch{}throw await S(),N}}await ZA(process.argv[2]).catch(t=>{process.stderr.write("native holder: "+fe(t)+`
1850
+ `),process.exitCode=1});