@lmctl-ai/lmctl 0.2.255 → 0.2.256

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.
@@ -1,1851 +0,0 @@
1
- var S_=Object.create;var Zl=Object.defineProperty;var b_=Object.getOwnPropertyDescriptor;var R_=Object.getOwnPropertyNames;var k_=Object.getPrototypeOf,I_=Object.prototype.hasOwnProperty;var A_=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var C_=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of R_(e))!I_.call(t,s)&&s!==n&&Zl(t,s,{get:()=>e[s],enumerable:!(r=b_(e,s))||r.enumerable});return t};var ed=(t,e,n)=>(n=t!=null?S_(k_(t)):{},C_(e||!t||!t.__esModule?Zl(n,"default",{value:t,enumerable:!0}):n,t));var xl=A_(Ae=>{"use strict";function tr(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 ig(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 Tt(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 Cl(t,e,n){let r=" ".repeat(Math.max(0,e-Tt(t)));return n?r+t:t+r}function og(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(Tt(t)<=e)return t;let r=Tt(n)>e?"\u2026":n,s=Tt(r);if(e<=s)return r;let i="",o=0;for(let a of t){let l=Tt(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 ag(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 lg(t){if(!Array.isArray(t))throw new TypeError("grids must be an array of grids");let e=[];for(let n of t){let r=og(n);r.headers!==void 0&&tr(r.headers);for(let s of r.rows.map(tr))s.forEach((i,o)=>{e[o]=Math.max(e[o]??0,ag(i)?.places??0)})}return e}Ae.measureDecimalPlaces=lg;function dg(t,e,n){let r=dI(n)??[],s=e.includes("decimal")?lg(t):[];return Array.from({length:Math.max(r.length,s.length)},(i,o)=>Math.max(r[o]??0,s[o]??0))}function ug(t,e){let n=ag(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 cg(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=ig(n),o=dg(t,i,r),a=[],l=(d,u)=>{a[d]=Math.max(a[d]??0,u)};for(let d of t){let u=og(d);u.headers!==void 0&&tr(u.headers).forEach((c,m)=>{l(m,Tt(c))});for(let c of u.rows.map(tr))c.forEach((m,p)=>{let g=i[p]==="decimal"?ug(m,o[p]??0)??m:m;l(p,Tt(g))})}return a.map((d,u)=>{let c=s[u];return c===void 0?d:Math.min(d,c)})}Ae.measureColumns=cg;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 mg(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=ig(r),m=oI(l),p=dg([t],c,d),g=e??cg([{rows:t,headers:n}],{max:a,align:c,decimalPlaces:p}),_=t.map(tr);n!==void 0&&_.unshift(tr(n));let f=_.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=g[v]||0,R=s&&b>0&&(v!==y||i)?aI(T,b,m):T;if(c[v]==="decimal"){let S=n!==void 0&&E===0?null:ug(T,p[v]??0),O=Cl(S!==null&&Tt(S)<=b?S:R,b,!0);return v===y&&S!==null?O.trimEnd():O}return c[v]==="right"?Cl(R,b,!0):v===y?R:Cl(R,b,!1)}).join(" ")}).join(`
2
- `);return f===""||u===""?f:`${u}${f.split(`
3
- `).join(`
4
- ${u}`)}`}Ae.renderGrid=mg;function pg(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l}={}){return mg(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=pg(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:i,max:o,ellipsis:a,decimalPlaces:l});u&&d.write(`${u}
5
- `)}Ae.formatTable=pg;Ae.printTable=cI;function sg(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=sg(e);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=sg(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":""}`}Ae.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`}Ae.formatCount=pI;var Nl=[["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=Nl.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=Nl.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 g=c==="d"||c==="w"?`${p}${c}`:`${at(p)}${c}`;l.push({text:g,zero:!1}),u=!0}else u&&l.push({text:`${at(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 Nl.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(" ")}Ae.formatDuration=fI;function fg(t){return t===void 0?new Date:t instanceof Date?t:typeof t=="number"||typeof t=="string"?new Date(t):new Date(NaN)}function at(t){return String(t).padStart(2,"0")}function gg(t){let e=fg(t);return Number.isNaN(e.getTime())?"unknown":`${at(e.getHours())}:${at(e.getMinutes())}:${at(e.getSeconds())}`}Ae.formatClock=gg;function gI(t){let e=fg(t);return Number.isNaN(e.getTime())?"unknown":`${`${e.getFullYear()}-${at(e.getMonth()+1)}-${at(e.getDate())}`} ${gg(e)}`}Ae.formatLocalTimestamp=gI;function _I(t){return typeof t=="number"&&Number.isFinite(t)?`${Math.round(t*100)}%`:"?%"}Ae.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)||Tt(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)}`}Ae.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=`${at(r)}:${at(s)}:${at(e)}`;return n>0?`${n}d ${i}`:i}Ae.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")}`)}Ae.escapeCell=TI});import{createServer as BA}from"node:net";import{chmodSync as XA,existsSync as qA,lstatSync as JA,readFileSync as GA,rmSync as Vl,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 td="root_teamfile <> '(direct)'",rr=td+" AND COALESCE(accounting_only,0)=0";function nd(t){return t.prepare("PRAGMA table_info(team_chat_log)").all().some(e=>e.name==="accounting_only")?rr:td}import{stat as KT,realpath as YT}from"node:fs/promises";import{existsSync as N_}from"node:fs";import{createRequire as x_}from"node:module";var Vi=null;function O_(){return Vi===null&&(Vi=x_(import.meta.url)("node:sqlite").DatabaseSync),Vi}var L_={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"},D_={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 P_(t){let e=D_[t];if(e!==void 0)return e;let n=L_[t&255];return n!==void 0?n:`SQLITE_UNKNOWN_${t}`}function Gt(t){throw t&&typeof t=="object"&&"errcode"in t&&typeof t.errcode=="number"&&(t.code=P_(t.errcode)),t}var Yi=class{name;handle;savepointId=0;constructor(e,n={}){if(n.fileMustExist===!0&&e!==":memory:"&&!N_(e))throw new Error("unable to open database file");this.name=e;try{this.handle=new(O_())(e,{readOnly:n.readonly===!0})}catch(r){Gt(r)}this.exec("PRAGMA busy_timeout = 5000"),this.exec(`PRAGMA foreign_keys = ${n.foreignKeys===!0?"ON":"OFF"}`)}prepare(e){try{return new zi(this.handle.prepare(e))}catch(n){Gt(n)}}exec(e){try{this.handle.exec(e)}catch(n){Gt(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){Gt(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(!M_(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(!U_(o))throw o}throw i}}};function M_(t){return t instanceof Error&&/cannot rollback - no transaction is active/i.test(t.message)}function U_(t){return t instanceof Error&&/no such savepoint:/i.test(t.message)}var Tn=Yi,zi=class{constructor(e){this.handle=e;this.handle.setAllowBareNamedParameters(!0)}rawMode=!1;get(...e){try{let n=this.handle.get(...Ki(e));return this.normalizeRow(n)}catch(n){Gt(n)}}all(...e){try{return this.handle.all(...Ki(e)).map(n=>this.normalizeRow(n))}catch(n){Gt(n)}}run(...e){try{let n=this.handle.run(...Ki(e));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}catch(n){Gt(n)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Qi(e)?Object.values(e):Qi(e)?{...e}:e}};function Ki(t){return t.length===1&&F_(t[0])?[t[0]]:t}function F_(t){if(!Qi(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Qi(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Zi(t){return new Tn(t,{readonly:!0,fileMustExist:!0})}import{join as Le,resolve as Tu}from"node:path";import{homedir as zT}from"node:os";import{readdir as G_}from"node:fs/promises";import{join as od,sep as ad}from"node:path";import{createHash as j_}from"node:crypto";import{lstat as $_,readFile as W_,realpath as rd,stat as sd}from"node:fs/promises";import{isAbsolute as id,relative as H_,resolve as B_,sep as X_}from"node:path";var ir="bx3",Ne={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 sr(t){return X(t)}function Fe(t){if(typeof t!="string"&&typeof t!="number")return null;let e=new Date(t);return Number.isFinite(e.getTime())?e.toISOString():null}function Y(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 ee(t,e){return t<e?-1:t>e?1:0}var Me=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}},q_=0,Ue=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${q_++}`,this.map.has(n)||this.map.set(n,e)}entries(){return[...this.map.values()]}};function ke(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 ze(t,e,n){let r={},s=sr(t.cacheWrite5m),i=sr(t.cacheWrite1h),o=sr(t.reasoning),a=sr(t.webSearch),l=sr(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 J_=new Set(["schedulewakeup","taskcreate","taskupdate","taskoutput","taskstop","todowrite","todoread","croncreate","crondelete","cronlist","monitor","listagents","toolsearch","askuserquestion","exitplanmode","agent","skill","job"]);function vt(t){return typeof t=="string"&&J_.has(t.toLowerCase())}function pe(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 En(t){let e=F(t);return e&&typeof e.content=="string"?Buffer.byteLength(e.content,"utf8"):null}async function ve(t,e){if(!id(t))return null;let n=await $_(t).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await rd(t).catch(()=>null);if(!r)return null;for(let s of e){let i=await rd(s).catch(()=>B_(s)),o=H_(i,r);if(o===""||!o.startsWith(`..${X_}`)&&o!==".."&&!id(o))return r}return null}async function xe(t,e){Y(e);let n=await sd(t).catch(()=>null);if(!n?.isFile()||n.size>e.maxBytes)return null;let r=await W_(t,{signal:e.signal});e.signal.throwIfAborted();let s=await sd(t).catch(()=>null);return!s?.isFile()||n.dev!==s.dev||n.ino!==s.ino||n.size!==s.size||n.mtimeMs!==s.mtimeMs?null:{revision:`${ir}:sha256:${j_("sha256").update(r).digest("hex")}`,data:r}}function zr(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 vn=class{constructor(e){this.format=e}async discover(e,n,r){Y(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 G_(l,{withFileTypes:!0}).catch(m=>(m.code!=="ENOENT"&&(o=!0),[])),c=m=>od(l,m.name)+(m.isDirectory()?ad:"");for(let m of u.sort((p,g)=>ee(c(p),c(g)))){e.signal.throwIfAborted();let p=od(l,m.name),g=m.isDirectory()&&r?.startsWith(p+ad);if(!(r&&!g&&ee(c(m),r)<=0)){if(!g&&++i>e.maxRows){o=!0;break}if(m.isDirectory())await a(p,d+1);else if(m.isFile()){let _=this.format.sessionId(p);_&&s.push({provider:this.format.provider,sessionid:_,source_id:p})}if(s.length>=n){o=!0;break}}}};return await a(this.format.root,0),s.sort((l,d)=>ee(l.source_id,d.source_id)),{sources:s.slice(0,n),truncated:o||s.length>n}}async bytes(e,n){if(Y(n),e.provider!==this.format.provider||this.format.sessionId(e.source_id)!==e.sessionid)return null;let r=await ve(e.source_id,[this.format.root]);if(!r)return null;let s=await xe(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 wn(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 Y_}from"node:fs/promises";import{join as Sn,resolve as z_}from"node:path";import{createReadStream as ld}from"node:fs";import{createInterface as dd}from"node:readline";import{stat as V_}from"node:fs/promises";import{homedir as K_}from"node:os";var J=K_();function ud(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*ae(t,e){let n=ld(t,{encoding:"utf-8"}),r=dd({input:n,crlfDelay:1/0});try{for await(let s of r){let i=s.trim();if(!i)continue;let o=ud(i);o!==void 0?yield o:e?.()}}finally{n.destroy()}}async function je(t,e){let n=[],r=ld(t,{encoding:"utf-8"}),s=dd({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=ud(o);if(a!==void 0&&n.push(a),n.length>=e)break}}finally{s.close(),r.destroy()}return n}async function ge(t){let e=await V_(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function ne(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 Xe(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var cd=/^[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 z_(t||process.env.XDG_DATA_HOME||Sn(J,".local","share"))}function Q_(t){return Sn(Zr(t),"muse","sessions")}function Z_(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 pd(t,e){let n,r,s,i,o,a=[],l=new Map,d=new Map,u=new Set,c,m,p=()=>{m="partial"},g=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},_=h=>{if(h.retained_frame&&Array.isArray(h.children)){for(let R of h.children)try{if(typeof R?.record_json!="string")throw new Error("missing record_json");_(JSON.parse(R.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 R of[h.id,E])if(!(typeof R!="string"||R.length===0)&&u.has(R))return;for(let R of[h.id,E])typeof R=="string"&&R.length>0&&u.add(R);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=g(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 R=typeof E=="string"&&E.length>0?E:typeof h.id=="string"&&h.id.length>0?h.id:void 0;if(!R)p();else{b.responseIds.push(R);let $={};if(v.usage&&typeof v.usage=="object")for(let P 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 oe=v.usage[P];typeof oe=="number"&&Number.isSafeInteger(oe)&&oe>=0&&($[P]=oe)}Object.keys($).length>0&&(b.turn.rawUsage=[...b.turn.rawUsage??[],{responseId:R,values:$}]),d.set(R,Z_(R,y,v.model,$))}if(!v.usage)return;let S={},O=v.usage.input_tokens,C=v.usage.cache_read_tokens??v.usage.input_cache_read_tokens,k=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 C=="number"&&C>O||typeof w=="number"&&typeof C=="number"&&C>w||typeof w=="number"&&typeof k=="number"&&k>w||typeof w=="number"&&typeof C=="number"&&typeof k=="number"&&C+k>w,A=I?void 0:typeof C=="number"?C:void 0,x=I?void 0:typeof k=="number"?k:void 0,N;I||(typeof v.usage.input_uncached_tokens=="number"?N=v.usage.input_uncached_tokens:typeof w=="number"&&typeof C=="number"&&typeof k=="number"&&w>=C+k&&(N=w-C-k)),N!==void 0&&N<0&&(N=void 0);let D=v.usage.output_tokens,L=v.usage.reasoning_tokens;typeof N=="number"&&Number.isSafeInteger(N)&&N>=0&&(S.inputTokens=N),typeof A=="number"&&Number.isSafeInteger(A)&&A>=0&&(S.cachedInputTokens=A),typeof x=="number"&&Number.isSafeInteger(x)&&x>=0&&(S.cacheWriteInputTokens=x),typeof D=="number"&&Number.isSafeInteger(D)&&D>=0&&(S.outputTokens=D),typeof L=="number"&&Number.isSafeInteger(L)&&L>=0&&(S.reasoningOutputTokens=L),c=S}};return{visit:_,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=wn(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 eh(t,e,n){let r=pd(e,n);for(let s of t)r.visit(s);return r.finish()}function th(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 g of p.children){if(d>=r.maxRows){l=!0;return}let _;try{if(typeof g?.record_json!="string")throw new Error("missing record_json");_=JSON.parse(g.record_json)}catch{l=!0;continue}u(_)}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=eh(a,e,n);return c&&l&&(c.captureStatus="partial"),c}function fd(t){return{provider:"muse",root:Q_(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:th}}async function md(t,e){let n=pd(t,e);for await(let r of ae(e,n.markPartial))n.visit(r);return n.finish()}var Qr=class{name="muse";dataHome;constructor(e={}){this.dataHome=Zr(e.museDataHome)}get root(){return Sn(this.dataHome,"muse","sessions")}getWatchPaths(){return[{directory:this.root,filePattern:/session\.jsonl$/}]}async files(e=this.root,n=0){let r;try{r=await Y_(e,{withFileTypes:!0})}catch{return[]}let s=[];for(let i of r)i.isFile()&&i.name==="session.jsonl"?s.push(Sn(e,i.name)):i.isDirectory()&&n<4&&s.push(...await this.files(Sn(e,i.name),n+1));return s}async resolveSessionPath(e){return cd.test(e)?(await this.files()).find(n=>n.endsWith(Sn(e,"session.jsonl")))??null:null}async loadSession(e){let n=await this.resolveSessionPath(e);return n?md(e,n):null}async discoverSessions(){let e=[];for(let n of await this.files())try{let r=n.split(/[\\/]/).at(-2);if(!cd.test(r))continue;let s=await md(r,n);s&&e.push(s)}catch{}return e}async deleteSession(){return!1}};import{readFile as gd,readdir as nh,rm as rh,stat as _d}from"node:fs/promises";import{basename as sh,join as bn,resolve as ih}from"node:path";var vd=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;function ns(t){return ih(t||process.env.MINIPLAYER_HOME||bn(process.env.XDG_DATA_HOME||bn(J,".local","share"),"miniplayer"))}var ts=class{name="miniplayer";home;constructor(e={}){this.home=ns(e.miniplayerHome)}getWatchPaths(){return[{directory:bn(this.home,"sessions"),filePattern:/\.json$/}]}async discoverSessions(){let e;try{e=await nh(bn(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(!vd.test(e))return null;let n=bn(this.home,"sessions",`${e}.json`);try{return(await _d(n)).isFile()?n:null}catch{return null}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;try{let r=wd(JSON.parse(await gd(n,"utf8")),e,n);if(!r)return null;let s="complete";try{let i=JSON.parse(await gd(`${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 _d(`${n}.lock`),new Error("Cannot delete a locked miniplayer session")}catch(r){if(r.code!=="ENOENT")throw r}return await rh(n),!0}};function es(t){if(typeof t=="string")return t;try{return JSON.stringify(t)??String(t)}catch{return String(t)}}function eo(t){return!t||typeof t!="object"?"tool":typeof t.toolName=="string"?t.toolName:typeof t.name=="string"?t.name:"tool"}function hd(t){if(!t||typeof t!="object")return null;let e=t.toolCallId??t.id;return typeof e=="string"&&e.length>0?e:null}function yd(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Td(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 Ed(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 wd(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=g=>{if(typeof g!="string")return;let _=new Date(g);return Number.isFinite(_.getTime())?_: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 g of r.messages){if(!g||!["user","assistant"].includes(g.role)||typeof g.content!="string")return null;a.push({role:g.role,content:g.content,timestamp:s(g.timestamp)??o})}}else{if(!Array.isArray(r.turns))return null;let g=new Set,_=new Set;for(let f of r.turns){if(!f||typeof f.responseId!="string"||!f.responseId||typeof f.input?.text!="string")return null;if(g.has(f.responseId)){u=!0;continue}g.add(f.responseId);let h=s(f.startedAt),E=s(f.completedAt??f.endedAt);if(!h)return null;let y=typeof f.model=="string"?f.model:void 0;["complete","running","failed","aborted"].includes(f.status)||(u=!0);let T=f.status==="complete"?"complete":f.status==="running"?"in_progress":f.status==="failed"?"failed":f.status==="aborted"?"aborted":"unknown";c=T==="failed"||T==="unknown"?"aborted":T,(T!=="complete"||f.partial===!0)&&(u=!0);let v=Array.isArray(f.modelResponses),b=v?f.modelResponses:[],R=[];l.push({id:f.responseId,startedAt:h,completedAt:E,model:y,prompt:f.input.text,status:T,responseIds:R}),a.push({role:"user",timestamp:h,content:f.input.text});let S=Array.isArray(f.toolEvents)&&f.toolEvents.length>0;if(!v&&!S){let I=f.usage??{},A=Ed({...f,usage:I});Object.keys(A.rawUsage).length&&(l.at(-1).rawUsage=[{responseId:f.responseId,values:A.rawUsage}]),R.push(f.responseId),d.push({response_id:f.responseId,timestamp:(E??h).toISOString(),model:y??null,model_provider:typeof f.provider=="string"?f.provider:null,tokens:A.tokens,files_read:[],files_written:[],read_bytes:Buffer.byteLength(f.input.text,"utf8"),write_bytes:0,external_io:[{direction:"read",kind:"prompt",id:f.responseId,ref:null,bytes:Buffer.byteLength(f.input.text,"utf8"),basis:"input_text"}],pricing_facts:A.pricingFacts}),T!=="complete"&&!f.usage&&(u=!0),typeof f.output?.text=="string"&&a.push({role:"assistant",timestamp:E??h,content:f.output.text,model:y});continue}let O=new Map,C=new Map,k=new Set,w=[];for(let I of b){if(!I||typeof I!="object"||typeof I.responseId!="string"||!I.responseId){u=!0;continue}if(R.includes(I.responseId)){u=!0;continue}let A=I,x=w.length;w.push({response:A,index:x,filesRead:[],filesWritten:[],io:[]}),R.push(I.responseId),_.has(I.responseId)&&(u=!0),_.add(I.responseId),A.toolCalls!==void 0&&!Array.isArray(A.toolCalls)&&(u=!0,w[x].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 N of Array.isArray(A.toolCalls)?A.toolCalls:[]){let D=hd(N),L=eo(N);if(D)O.set(D,x),C.set(D,L);else{u=!0;let $=L==="list_directory"||L==="read_file"||L==="webget"||L==="shell"||L==="tool",P=L==="write_file"||L==="shell"||L==="tool";$&&w[x].io.push({direction:"read",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"}),P&&w[x].io.push({direction:"write",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"})}}}R.length===0&&b.length>0&&(u=!0);for(let I of Array.isArray(f.toolEvents)?f.toolEvents:[]){let A=I&&typeof I=="object"?I:{},x=hd(A),N=x?O.get(x):void 0,D=eo(A),L=yd(A.result),$=A.status==="failed"||A.error!==void 0;if(A.type==="tool_call"?a.push({role:"tool_use",timestamp:s(A?.timestamp)??h,content:es(A?.input??A?.args),toolName:D,toolInput:es(A?.input??A?.args),toolInputData:yd(A?.input??A?.args)??void 0,...x?{toolCallId:x}:{}}):a.push({role:"tool_result",timestamp:s(A?.timestamp)??E??h,content:es($?A?.error:A?.result),toolName:D,...x?{toolCallId:x}:{}}),N===void 0){u=!0;continue}let P=w[N];(A.type==="tool_result"||$||A.result!==void 0)&&k.add(x);let oe=L?.path,W=X(L?.bytesRead??L?.bytesWritten);A.type!=="tool_call"&&(D==="read_file"&&!$&&typeof oe=="string"&&W!==null?P.filesRead.push({path:oe,bytes:W}):D==="write_file"&&!$&&typeof oe=="string"&&W!==null?P.filesWritten.push({path:oe,bytes:W}):D==="webget"&&!$&&W!==null?P.io.push({direction:"read",kind:"web",id:x,ref:Td(L?.finalUrl??L?.url),bytes:W,basis:"certified_counter"}):D==="shell"||$?(D!=="write_file"&&P.io.push({direction:"read",kind:"unattributed",id:x,ref:null,bytes:null,basis:"unknown"}),(D==="shell"||D==="write_file")&&P.io.push({direction:"write",kind:"unattributed",id:x,ref:null,bytes:null,basis:"unknown"})):D==="list_directory"||D==="read_file"||D==="webget"?P.io.push({direction:"read",kind:D==="webget"?"web":"unattributed",id:x,ref:D==="webget"?Td(L?.finalUrl??L?.url):null,bytes:null,basis:"unknown"}):D==="write_file"?P.io.push({direction:"write",kind:"unattributed",id:x,ref:null,bytes:null,basis:"unknown"}):P.io.push({direction:"read",kind:"unattributed",id:x,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:x,ref:null,bytes:null,basis:"unknown"}))}for(let[I,A]of C)if(!k.has(I)){let x=w[O.get(I)],N=A==="list_directory"||A==="read_file"||A==="webget"||A==="shell",D=A==="write_file"||A==="shell";N&&x.io.push({direction:"read",kind:"unattributed",id:I,ref:null,bytes:null,basis:"unknown"}),D&&x.io.push({direction:"write",kind:"unattributed",id:I,ref:null,bytes:null,basis:"unknown"}),u=!0}for(let I of w){let A=I.response,x=Ed(A),N=s(A.completedAt??A.startedAt)??E??h;new Set((Array.isArray(A.toolCalls)?A.toolCalls:[]).map(P=>eo(P))).has("shell")&&!I.io.some(P=>P.kind==="unattributed"&&P.direction==="read")&&I.io.push({direction:"read",kind:"unattributed",id:A.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:A.responseId,ref:null,bytes:null,basis:"unknown"}),I.index===0&&I.io.unshift({direction:"read",kind:"prompt",id:f.responseId,ref:null,bytes:Buffer.byteLength(f.input.text,"utf8"),basis:"input_text"});let L=I.io.some(P=>P.direction==="read"&&P.bytes===null),$=I.io.some(P=>P.direction==="write"&&P.bytes===null);if(d.push({response_id:A.responseId,timestamp:N.toISOString(),model:typeof A.model=="string"?A.model:null,model_provider:typeof A.provider=="string"?A.provider:typeof f.provider=="string"?f.provider:null,tokens:x.tokens,files_read:L?null:I.filesRead,files_written:$?null:I.filesWritten,read_bytes:L?null:I.filesRead.reduce((P,oe)=>P+(oe.bytes??0),0)+I.io.filter(P=>P.direction==="read").reduce((P,oe)=>P+(oe.bytes??0),0),write_bytes:$?null:I.filesWritten.reduce((P,oe)=>P+(oe.bytes??0),0)+I.io.filter(P=>P.direction==="write").reduce((P,oe)=>P+(oe.bytes??0),0),external_io:I.io,pricing_facts:x.pricingFacts}),Object.keys(x.rawUsage).length){let P=l.at(-1);P.rawUsage=[...P.rawUsage??[],{responseId:A.responseId,values:x.rawUsage}]}}l.at(-1).responseIds=R,R.length!==b.length&&(u=!0),typeof f.output?.text=="string"&&a.push({role:"assistant",timestamp:E??h,content:f.output.text,model:y})}}let m=a.filter(g=>g.role==="user").map(g=>g.content),p=wn(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 rs(t){return{provider:"miniplayer",root:bn(ns(t),"sessions"),revision:"miniplayer-data-v3",sessionId(e){let n=sh(e,".json");return e.endsWith(".json")&&vd.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:wd(i,n,r)}catch{return null}}}}import{createHash as ho}from"node:crypto";import{createRequire as eT}from"node:module";import{lstat as tT,readFile as nT,readdir as rT,realpath as go,stat as nu}from"node:fs/promises";import{basename as as,dirname as sT,isAbsolute as ru,join as Yt,relative as iT,resolve as ut,sep as oT}from"node:path";import{createHash as oh}from"node:crypto";import{createRequire as ah}from"node:module";import{readdir as lh,realpath as dh}from"node:fs/promises";import{basename as Sd,dirname as uh,join as bd,resolve as Rd}from"node:path";var wt="agy",ss="agy-tokens-v1",ch=ah(import.meta.url);function mh(){return ch("node:sqlite").DatabaseSync}function ph(){return process.env.HOME||process.env.USERPROFILE||""}function Vt(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 Qe(t,e){return t.find(n=>n.field===e)}function fh(t){let e=new Map;for(let n of t){if(n.field!==20||n.bytes===void 0)continue;let r=Vt(n.bytes),s=Qe(r,1)?.bytes,i=Qe(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 gh(t){let e=Qe(Vt(t),5)?.bytes;if(e===void 0)return null;let n=Qe(Vt(e),1)?.bytes;if(n===void 0)return null;let r=Vt(n),s=Qe(r,1)?.varint;if(s===void 0)return null;let i=Qe(r,2)?.varint??0,o=s*1e3+Math.floor(i/1e6),a=new Date(o);return Number.isFinite(a.getTime())?a.toISOString():null}function _h(t){let e=Qe(t,4)?.bytes,n=e!==void 0?Vt(e):[],r=s=>{let i=Qe(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 hh(t){let e=Qe(Vt(t),1)?.bytes;if(e===void 0)return null;let n=Vt(e),r=fh(n),s=r.get("request_id");if(s===void 0||s.length===0)return null;let i=Qe(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}=_h(n);return{requestId:s,model:o,lastStepIndex:d,tokens:u,thinkingOutputTokens:c}}function kd(t,e){Y(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=oh("sha256");i.update("rev:").update(ss).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=hh(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 g=Buffer.from(p);if(l+=g.length,l>e.maxBytes)return null;i.update("s").update(String(c)).update("\0").update(g).update(`
11
- `);let _=gh(g);_!==null&&d.set(c,_)}return{revision:`${ir}+${ss}:sha256:${i.digest("hex")}`,generations:o,timestamps:d}}function yh(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:ze({reasoning:e.thinkingOutputTokens},e.tokens.output,e.tokens.input_cache_write)}))}var or=class{conversationsDir;sqliteBusyTimeoutMs;constructor(e={}){this.conversationsDir=Rd(e.agyConversationsDir??bd(ph(),".gemini","antigravity-cli","conversations")),this.sqliteBusyTimeoutMs=e.sqliteBusyTimeoutMs??5e3}async discover(e,n,r=null){Y(e);let s=await lh(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 dh(bd(this.conversationsDir,o.name)).catch(()=>null);a!==null&&(r!==null&&ee(a,r)<=0||i.push(a))}return i.sort(ee),{sources:i.slice(0,n).map(o=>({provider:wt,sessionid:Sd(o,".db"),source_id:o})),truncated:!1}}async open(e){let n=await ve(e.source_id,[this.conversationsDir]);if(n===null||Sd(n,".db")!==e.sessionid||Rd(uh(n))!==this.conversationsDir)return null;try{let r=new(mh())(n,{open:!0,readOnly:!0});return r.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),r}catch{return null}}async inspect(e,n){if(Y(n),e.provider!==wt)return{status:"unsupported"};let r=await this.open(e);if(r===null)return{status:"unavailable"};try{let s=kd(r,n);return s?{status:"ready",revision:s.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}async read(e,n,r){if(Y(r),e.provider!==wt)return{status:"unsupported"};let s=await this.open(e);if(s===null)return{status:"unavailable"};try{s.exec("BEGIN");let i=kd(s,r);if(i===null||i.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let o=yh(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 Id(t={}){return new or(t)}import{readdir as Nh,realpath as xh}from"node:fs/promises";import{basename as to,dirname as Cd,join as Od,resolve as Ld}from"node:path";import Oh from"node:zlib";import Th from"node:zlib";var Eh=Th.zstdDecompressSync,vh=40,wh=181,Sh=47,bh=253,Rh=42,kh=77,Ih=24;function Ah(t,e){return t[e]===vh&&t[e+1]===wh&&t[e+2]===Sh&&t[e+3]===bh}function Ad(t,e){return(t[e]&240)===80&&t[e+1]===Rh&&t[e+2]===kh&&t[e+3]===Ih}function Ch(t,e){if(Ad(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!Ah(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 ar(t){let e=[],n=0;for(;n+4<=t.length;){let r=Ch(t,n);if(r===void 0||r<=0)break;e.push(t.subarray(n,n+r)),n+=r}return e}function is(t){let e=[];for(let n of ar(t))Ad(n,0)||e.push(Eh(n).toString("utf8"));return e.join("")}var St="dsh",Lh=Oh.zstdDecompressSync;function Dd(t){return/^session(\.v\d+)?\.jsonl\.zstd$/.test(t)}var Dh=5e5,Ph=new Set(["read","read_image"]),Mh=new Set(["write","edit"]),Uh=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 Fh(t){return Uh.has(t)||vt(t)}function jh(){return process.env.HOME||process.env.USERPROFILE||""}function $h(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 Nd(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 Wh(t){return t.length>=4&&(t[0]&240)===80&&t[1]===42&&t[2]===77&&t[3]===24}function Hh(t,e){let n=ar(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(),Wh(o))continue;if(o.length>e.maxBytes)return{text:s.join(""),truncated:!0};let a;try{a=Lh(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 Bh(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 Xh(t){if(typeof t=="string")try{return F(JSON.parse(t))}catch{return null}return F(t)}function xd(t,e){return typeof t!="number"||typeof e!="number"?null:`${t}\0${e}`}function qh(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 g=F(p?.chunk),_=F(g?.usage),f=xd(p?.turn,p?.step);_&&f!==null&&typeof p?.turn=="number"&&typeof p?.step=="number"&&a.set(f,{turn:p.turn,step:p.step,usage:_,time:m.time});continue}if(m.type==="request/header"){let g=F(F(p?.header)?.config);typeof g?.provider=="string"&&g.provider&&(l=g.provider),typeof g?.model=="string"&&g.model&&(d=g.model);continue}if(m.type==="user/message"){if(F(p?.source)?.kind!=="user")continue;let _=typeof p?.id=="string"&&p.id?p.id:null;i.push({id:_,bytes:$h(p?.content)});continue}if(m.type==="assistant/message"){let g=F(p?.message),_=F(g?.source),f=typeof g?.id=="string"&&g.id?g.id:null,h=xd(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=f}if(E===null)return{status:"partial"};let y=Nd(F(p?.usage)),T=s.get(E);if(!T){if(T={meta:{response_id:E,timestamp:Fe(typeof m.time=="number"?m.time:null),model:(typeof _?.model=="string"&&_.model?_.model:null)??d,tokens:y??{...Ne},files_read:[],files_written:[]},obs:new Me,io:new Ue,reasoning:null,provider:typeof _?.provider=="string"&&_.provider?_.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 g=u!==null?s.get(u):void 0;if(!g)continue;let _=typeof p?.callId=="string"&&p.callId?p.callId:null,f=typeof p?.name=="string"?p.name.toLowerCase():"",h=Xh(p?.arguments),E=(typeof h?.file_path=="string"&&h.file_path?h.file_path:null)??(typeof h?.path=="string"&&h.path?h.path:null);Ph.has(f)?E!==null?g.obs.record(_??"","read",E,null):pe(g.io,_):Mh.has(f)?E!==null?g.obs.record(_??"","written",E,En(h)):pe(g.io,_):Fh(f)||pe(g.io,_);continue}}for(let[m,{turn:p,step:g,usage:_,time:f}]of a){if(o.has(m))continue;r.signal.throwIfAborted();let h=Nd(_),E=new Ue;pe(E,null);let y={meta:{response_id:`dsh:turn-step:${p}/${g}`,timestamp:Fe(typeof f=="number"?f:null),model:d,tokens:h??{...Ne},files_read:[],files_written:[]},obs:new Me,io:E,reasoning:X(_.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:g,reasoning:_,provider:f}of s.values()){let h=p.files("read"),E=p.files("written"),y=g.entries();c.push({...m,files_read:h,files_written:E,external_io:y,read_bytes:ke(h,y,"read"),write_bytes:ke(E,y,"written"),model_provider:l??f,pricing_facts:ze({reasoning:_??void 0},m.tokens.output,m.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:c}}var no=class{sessionsDir;maxDiscoveryTraversalVisits;constructor(e={}){let n=e.dshHome??process.env.DSH_HOME??Od(jh(),".dsh");this.sessionsDir=Ld(n,"sessions"),this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):Dh}async discover(e,n,r=null){Y(e);let{paths:s,truncated:i}=await Jh(this.sessionsDir,n,this.maxDiscoveryTraversalVisits,e,r);return{sources:s.map(o=>({provider:St,sessionid:to(Cd(o)),source_id:o})),truncated:i}}matches(e,n){return Dd(to(n))&&to(Cd(n))===e.sessionid}async inspect(e,n){if(Y(n),e.provider!==St)return{status:"unsupported"};let r=await ve(e.source_id,[this.sessionsDir]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await xe(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){if(Y(r),e.provider!==St)return{status:"unsupported"};let s=await ve(e.source_id,[this.sessionsDir]);if(!s||!this.matches(e,s))return{status:"unavailable"};let i=await xe(s,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let{text:o,truncated:a}=Hh(i.data,r);return a?{status:"partial"}:qh(Bh(o),e,n,r)}};async function Jh(t,e,n,r,s){let i=[],o=0,a=!1;async function l(d,u){r.signal.throwIfAborted();let c=await Nh(d,{withFileTypes:!0}).catch(()=>[]);c.sort((m,p)=>ee(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=Od(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()&&Dd(m.name)){let g=await xh(p).catch(()=>Ld(p));(s===null||ee(g,s)>0)&&i.push(g)}}}return await l(t,0),{paths:i.sort(ee),truncated:a}}function Pd(t={}){return new no(t)}import{readdir as Gh,realpath as Vh}from"node:fs/promises";import{basename as os,dirname as Kh,join as ro,resolve as Md}from"node:path";var bt="qwen",Yh="qwen-code.api_response",zh="qwen-code.tool_call",Ud="chats",Qh=new Set(["read_file"]),Zh=new Set(["write_file"]),ey=5e5;function ty(){return process.env.HOME||process.env.USERPROFILE||""}function ny(){let t=ty();return[ro(t,".qwen","projects"),ro(t,".qwen.bk1","projects")]}function ry(t){return t.type!=="system"||t.subtype!=="ui_telemetry"?null:F(F(t.systemPayload)?.uiEvent)}function sy(t){let e=t["event.name"];return typeof e=="string"&&e.length>0?e:null}function iy(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 oy(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 ay(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=oy(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 ly(t,e,n,r){let{promptBytes:s,resolve:i}=ay(t),o=new Set,a=new Map,l=0;for(let u of t){r.signal.throwIfAborted();let c=ry(u);if(c===null)continue;let m=sy(c);if(m===Yh){let E=typeof c.response_id=="string"&&c.response_id?c.response_id:null;if(E===null)return{status:"unsupported"};let y=iy(c);if(y===null)return{status:"partial"};let T=a.get(E);if(!T){if(T={meta:{response_id:E,timestamp:Fe(c["event.timestamp"]??u.timestamp),model:typeof c.model=="string"&&c.model?c.model:null,tokens:{...Ne},files_read:[],files_written:[]},obs:new Me,io:new Ue,thoughts:null},a.set(E,T),a.size>r.maxRows)return{status:"partial"};let b=typeof u.uuid=="string"&&u.uuid?u.uuid:null,R=b===null?{kind:"broken"}:i(b);if(R.kind==="broken")T.io.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"});else if(R.kind==="found"&&!o.has(R.uuid)){o.add(R.uuid);let S=s.get(R.uuid)??null;T.io.record({direction:"read",kind:"prompt",id:R.uuid,ref:null,bytes:S,basis:S===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!==zh)continue;let p=typeof c.response_id=="string"&&c.response_id?c.response_id:null;if(p===null)continue;let g=a.get(p);if(g===void 0)return{status:"partial"};let _=typeof c.function_name=="string"?c.function_name.toLowerCase():"",f=F(c.function_args),h=`tool-${l++}`;if(Qh.has(_)){let E=typeof f?.file_path=="string"?f.file_path:null;E!==null?g.obs.record(h,"read",E,null):pe(g.io,h)}else if(Zh.has(_)){let E=typeof f?.file_path=="string"?f.file_path:null;E!==null?g.obs.record(h,"written",E,En(f)):pe(g.io,h)}else vt(_)||pe(g.io,h)}let d=[];for(let{meta:u,obs:c,io:m,thoughts:p}of a.values()){let g=c.files("read"),_=c.files("written"),f=m.entries();d.push({...u,files_read:g,files_written:_,external_io:f,read_bytes:ke(g,f,"read"),write_bytes:ke(_,f,"written"),model_provider:null,pricing_facts:ze({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 dy(t,e,n,r,s){let i=[],o=0,a=!1;async function l(d){r.signal.throwIfAborted();let u=await Gh(d,{withFileTypes:!0}).catch(()=>[]);u.sort((c,m)=>ee(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=ro(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")&&os(d)===Ud){let p=await Vh(m).catch(()=>Md(m));(s===null||ee(p,s)>0)&&i.push(p)}}}return await l(t),{paths:i.sort(ee),truncated:a}}function uy(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 so=class{roots;maxDiscoveryTraversalVisits;constructor(e={}){this.roots=(e.qwenProjectsDirs??ny()).map(n=>Md(n)),this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):ey}async discover(e,n,r=null){Y(e);let s=new Map,i=!1;for(let a of this.roots){e.signal.throwIfAborted();let l=await dy(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(ee).slice(0,n).map(a=>({provider:bt,sessionid:os(a,".jsonl"),source_id:a})),truncated:i}}matches(e,n){return os(n,".jsonl")===e.sessionid&&os(Kh(n))===Ud}async inspect(e,n){if(Y(n),e.provider!==bt)return{status:"unsupported"};let r=await ve(e.source_id,[...this.roots]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await xe(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){if(Y(r),e.provider!==bt)return{status:"unsupported"};let s=await ve(e.source_id,[...this.roots]);if(!s||!this.matches(e,s))return{status:"unavailable"};let i=await xe(s,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let o=zr(i.data,r);return o?uy(o,e.sessionid)?ly(o,e,n,r):{status:"unavailable"}:{status:"partial"}}};function Fd(t={}){return new so(t)}import{createHash as cy}from"node:crypto";import{createRequire as my}from"node:module";import{join as lr,resolve as io}from"node:path";var Kt="opencode",py=my(import.meta.url);function fy(){return py("node:sqlite").DatabaseSync}function jd(){return process.env.HOME||process.env.USERPROFILE||""}function gy(){let t=process.env.XDG_DATA_HOME||lr(jd(),".local","share"),e=process.env.XDG_CONFIG_HOME||lr(jd(),".config");return[lr(t,"opencode","opencode.db"),lr(t,"opencode","opencode-local.db"),lr(e,"opencode","opencode.db")]}var _y=["read","read_file","view","view_file","view_image"],hy=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],yy=["filePath","path","file","file_path","filepath","notebook_path","paths"],Ty=new Set(["session-job-notification"]);function Ey(t){if(typeof t!="string")return null;let e=t.toLowerCase();return e==="apply_patch"?"apply_patch":_y.includes(e)?"read":hy.includes(e)?"written":null}function $d(t,e=yy){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 vy(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 wy(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 Sy(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 by(t,e=!1){let n=F(t);if(!n)return{...Ne};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?{...Ne}: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?{...Ne}:r+s+i+a+l===0?{...Ne}:{input_uncached:r+l,input_cached:a,input_cache_write:l,output:s+i}}function Wd(t,e,n){Y(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=cy("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:`${ir}:sha256:${d.digest("hex")}`,messages:o,parts:a}}function Ry(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&&!Ty.has(o)&&(r=!0))}return n?e:r?"unknown":null}function ky(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=Ry(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 Me,m=new Ue,p=0,g=o.get(d.id);g&&m.record({direction:"read",kind:"prompt",id:g.id,ref:null,bytes:g.bytes,basis:g.bytes===null?"unknown":"input_text"});for(let R of s.get(d.id)??[]){let S;try{S=F(JSON.parse(R.data))}catch{return{status:"partial"}}if(S?.type!=="tool")continue;let O=typeof S.tool=="string"?S.tool.toLowerCase():"",C=Ey(S.tool),k=F(S.state),w=F(k?.input),I=typeof S.callID=="string"&&S.callID?S.callID:typeof k?.callID=="string"&&k.callID?k.callID:R.id;if(C==="written")c.record(I,"written",$d(w),vy(w));else if(C==="apply_patch"){let A=w?.patchText;if(typeof A=="string")for(let x of wy(A))c.record(I,"written",x.path,x.bytes);else pe(m,I)}else if(C==="read"){let A=$d(w,["filePath","path","file","file_path"]);if(A===null)continue;let x=null;if(k?.status==="completed"){let N=F(F(k.metadata)?.display);N?.type==="file"&&typeof N.text=="string"&&(x=Buffer.byteLength(N.text,"utf8"))}c.record(I,"read",A,x)}else if(O==="webfetch"){p+=1;let A=k?.status==="completed"?k.output:void 0;m.record({direction:"read",kind:"web",id:I,ref:Sy(w?.url),bytes:typeof A=="string"?Buffer.byteLength(A,"utf8"):null,basis:typeof A=="string"?"normalized_content":"unknown"})}else vt(S.tool)||pe(m,I)}let _=F(u.time),f=F(u.model)?.modelID??u.modelID,h=by(u.tokens,r.requireBillingCounters),E=F(u.tokens),y=c.files("read"),T=c.files("written"),v=m.entries(),b=ze({reasoning:E?.reasoning,webFetch:p>0?p:void 0},h.output,h.input_cache_write);if(l.push({response_id:d.id,timestamp:Fe(_?.created??d.time_created),model:typeof f=="string"&&f?f:null,tokens:h,files_read:y,files_written:T,external_io:v,read_bytes:ke(y,v,"read"),write_bytes:ke(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 dr=class{dbPaths;sqliteBusyTimeoutMs;constructor(e={}){this.dbPaths=(e.dbPaths??gy()).map(n=>io(n)),this.sqliteBusyTimeoutMs=e.sqliteBusyTimeoutMs??5e3}openDb(e){if(!this.dbPaths.includes(io(e)))return null;try{let n=new(fy())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),n}catch{return null}}async discover(e,n,r=null){Y(e);let s=new Map;for(let o of this.dbPaths){e.signal.throwIfAborted();let a=await ve(o,[io(o,"..")]);if(!a||r&&ee(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:Kt,sessionid:c.id,source_id:a})}catch{}finally{l.close()}}return{sources:[...s.values()].sort((o,a)=>ee(`${o.source_id}\0${o.sessionid}`,`${a.source_id}\0${a.sessionid}`)).slice(0,n),truncated:!1}}inspect(e,n){if(Y(n),e.provider!==Kt)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=Wd(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(Y(r),e.provider!==Kt)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=Wd(s,e.sessionid,r);if(!o||o.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=ky(e,n,o,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function Hd(t={}){return new dr(t)}import{readdir as Iy,realpath as Ay,stat as Cy}from"node:fs/promises";import{basename as Bd,dirname as Ny,join as Xd,resolve as qd}from"node:path";var Rt="copilot",Jd="events.jsonl",xy=new Set(["report_intent"]),Oy=new Set(["view"]);function Ly(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 Dy(t){let e=t?.content;return typeof e=="string"?Buffer.byteLength(e,"utf8"):null}function Py(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)=>ee(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 My(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 g=Dy(m);s.has(p)?s.get(p)===null&&g!==null&&s.set(p,g):s.set(p,g)}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=Fe(c.timestamp),{entry:y,incomplete:T}=Py(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 g=typeof m.interactionId=="string"?m.interactionId:null,_=i.get(p);if(!_){if(_={meta:{response_id:p,timestamp:Fe(c.timestamp),model:typeof m.model=="string"&&m.model?m.model:null,tokens:{...Ne},files_read:[],files_written:[]},obs:new Me,io:new Ue,promptRecorded:!1},i.set(p,_),i.size>r.maxRows)return{snapshot:{status:"partial"},sessionUsage:null};if(g!==null&&s.has(g)){if(!o.has(g)){o.add(g);let h=s.get(g);_.io.record({direction:"read",kind:"prompt",id:g,ref:null,bytes:h,basis:h===null?"unknown":"input_text"}),_.promptRecorded=!0}}else _.io.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})}let f=X(m.outputTokens);if(f!==null&&(_.meta.tokens.output=(_.meta.tokens.output??0)+f),_.meta.model===null&&typeof m.model=="string"&&m.model&&(_.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),R=typeof b?.path=="string"?b.path:null,S=typeof b?.file_text=="string"?Buffer.byteLength(b.file_text,"utf8"):null;R!==null?_.obs.record(T??p,"written",R,S):pe(_.io,T)}else if(y==="apply_patch")if(typeof v=="string"){let b=Ly(v);if(b.length>0)for(let R of b)_.obs.record(T??p,"written",R.path,R.bytes);else pe(_.io,T)}else pe(_.io,T);else if(Oy.has(y)){let b=F(v),R=typeof b?.path=="string"?b.path:null;R!==null?_.obs.record(T??p,"read",R,null):pe(_.io,T)}else xy.has(y)||pe(_.io,T)}}let u=[];for(let{meta:c,obs:m,io:p}of i.values()){let g=m.files("read"),_=m.files("written"),f=p.entries();u.push({...c,files_read:g,files_written:_,external_io:f,read_bytes:ke(g,f,"read"),write_bytes:ke(_,f,"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 Uy(){return process.env.HOME||process.env.USERPROFILE||""}var oo=class{sessionStateDir;constructor(e={}){this.sessionStateDir=qd(e.copilotSessionStateDir??Xd(Uy(),".copilot","session-state"))}async discover(e,n,r=null){Y(e);let s;try{s=await Iy(this.sessionStateDir)}catch{return{sources:[],truncated:!1}}let i=[];for(let o of s.sort(ee)){e.signal.throwIfAborted();let a=Xd(this.sessionStateDir,o,Jd);if(!(await Cy(a).catch(()=>null))?.isFile())continue;let d=await Ay(a).catch(()=>qd(a)),u={provider:Rt,sessionid:o,source_id:d};r!==null&&ee(`${d}\0${o}`,r)<=0||i.push(u)}return i.sort((o,a)=>ee(`${o.source_id}\0${o.sessionid}`,`${a.source_id}\0${a.sessionid}`)),{sources:i.slice(0,n),truncated:!1}}matches(e,n){return Bd(n)===Jd&&Bd(Ny(n))===e.sessionid}async inspect(e,n){if(Y(n),e.provider!==Rt)return{status:"unsupported"};let r=await ve(e.source_id,[this.sessionStateDir]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await xe(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(Y(r),e.provider!==Rt)return{snapshot:{status:"unsupported"},sessionUsage:null};let s=await ve(e.source_id,[this.sessionStateDir]);if(!s||!this.matches(e,s))return{snapshot:{status:"unavailable"},sessionUsage:null};let i=await xe(s,r).catch(()=>null);if(!i||i.revision!==n)return{snapshot:{status:"partial"},sessionUsage:null};let o=zr(i.data,r);return o?My(o,e,n,r):{snapshot:{status:"partial"},sessionUsage:null}}};function Gd(t={}){return new oo(t)}import{readdir as Vd,readFile as Fy,realpath as ao,stat as Kd}from"node:fs/promises";import{basename as cr,dirname as kn,isAbsolute as uo,join as Rn,relative as Qd,resolve as ur,sep as Zd}from"node:path";var kt="kimi",co="wire.jsonl",eu="agents",jy=new Set(["1.4","1.5"]),$y=5e5,Wy=8*1024*1024,Hy=new Set(["read"]),By=new Set(["write","edit"]),Xy=new Set(["todolist","tasklist","taskoutput","taskstop","waitfor","creategoal","updategoal","getgoal","enterplanmode","exitplanmode","agentswarm","agent","skill","croncreate","crondelete","cronlist"]);function qy(t){return Xy.has(t)||vt(t)}function Jy(){return process.env.HOME||process.env.USERPROFILE||""}function Gy(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 Yd(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 Vy(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 Ky=new Set(["system_trigger","cron_job","task"]);function Yy(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&&!jy.has(i))return{status:"unsupported"};let o=zy(e.source_id),a=new Map,l=new Map,d=[],u=new Set,c=new Set,m=null,p=!1,g=E=>`${o}/${E}`,_=(E,y)=>{let T=g(E),v=a.get(T);return v||(v={meta:{response_id:T,timestamp:Fe(typeof y=="number"?y:null),model:null,tokens:{...Ne},files_read:[],files_written:[]},obs:new Me,io:new Ue,turnStepKey:null,tokensSource:"none"},a.set(T,v)),v},f=(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&&Ky.has(v))continue;if(b!==null){if(u.has(b))continue;u.add(b)}v==="user"?d.push({bytes:Vy(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(g(T));if(!v){p=!0;continue}if(v.tokensSource==="record"){p=!0;continue}let b=Yd(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=_(T,E.time);if(a.size>r.maxRows)return{status:"partial"};if(c.add(T),f(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=_(T,E.time);if(a.size>r.maxRows)return{status:"partial"};c.delete(T),m=T,f(v,y);let b=Yd(y.usage);b&&(v.meta.tokens=b),v.tokensSource="end",v.meta.timestamp===null&&(v.meta.timestamp=Fe(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=_(T,E.time);if(a.size>r.maxRows)return{status:"partial"};let b=typeof y.name=="string"?y.name.toLowerCase():"",R=typeof y.toolCallId=="string"&&y.toolCallId?y.toolCallId:null,S=F(y.args),O=typeof S?.path=="string"&&S.path?S.path:typeof S?.file_path=="string"&&S.file_path?S.file_path:null;Hy.has(b)?O!==null?v.obs.record(R??"","read",O,null):pe(v.io,R):By.has(b)?O!==null?v.obs.record(R??"","written",O,En(S)):pe(v.io,R):qy(b)||pe(v.io,R);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"),R=y.files("written"),S=T.entries();h.push({...E,files_read:b,files_written:R,external_io:S,read_bytes:ke(b,S,"read"),write_bytes:ke(R,S,"written"),model_provider:null,pricing_facts:ze({},E.tokens.output,E.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:h,...p?{capture_status:"partial"}:{}}}function lo(t){return cr(t)===co&&cr(kn(kn(t)))===eu}function zd(t){return cr(kn(kn(kn(t))))}function zy(t){return cr(kn(t))}function Qy(t,e){let n=Qd(e,t);return n===""||!n.startsWith(`..${Zd}`)&&n!==".."&&!uo(n)}function Zy(t){if(t instanceof Error&&t.name==="AbortError")throw t}var mr=class{home;sessionsDir;indexPath;maxDiscoveryTraversalVisits;constructor(e={}){this.home=ur(e.kimiHome??process.env.KIMI_CODE_HOME??Rn(Jy(),".kimi-code")),this.sessionsDir=Rn(this.home,"sessions"),this.indexPath=Rn(this.home,"session_index.jsonl"),this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):$y}async discover(e,n,r=null){Y(e);let s=new Set,i=!1,o=await ao(this.sessionsDir).catch(()=>ur(this.sessionsDir)),a=m=>{lo(m)&&Qy(m,o)&&s.add(m)},l=0,d=async(m,p)=>{if(e.signal.throwIfAborted(),i)return;let g=await Vd(m,{withFileTypes:!0}).catch(()=>[]);g.sort((_,f)=>ee(_.name,f.name));for(let _ of g){if(e.signal.throwIfAborted(),l+=1,l>this.maxDiscoveryTraversalVisits){i=!0;return}let f=Rn(m,_.name);if(_.isDirectory()&&!_.isSymbolicLink()&&p<4){if(await d(f,p+1),i)return}else _.isFile()&&_.name===co&&lo(f)&&a(await ao(f).catch(()=>ur(f)))}};await d(this.sessionsDir,0);try{await this.unionIndex(a,e)}catch(m){Zy(m)}let u=[...s].sort(ee);return{sources:(r===null?u:u.filter(m=>ee(m,r)>0)).slice(0,n).map(m=>({provider:kt,sessionid:zd(m),source_id:m})),truncated:i}}async unionIndex(e,n){let r=await Kd(this.indexPath).catch(()=>null);if(!r?.isFile()||r.size>Wy)return;let s=await Fy(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||!uo(l)||cr(l)!==a)continue;let d=Qd(this.sessionsDir,ur(l));if(d.startsWith(`..${Zd}`)||d===".."||uo(d))continue;let u=Rn(l,eu),c=await Vd(u,{withFileTypes:!0}).catch(()=>[]);for(let m of c){if(!m.isDirectory())continue;let p=Rn(u,m.name,co);(await Kd(p).catch(()=>null))?.isFile()&&e(await ao(p).catch(()=>ur(p)))}}}matches(e,n){return lo(n)&&zd(n)===e.sessionid}async inspect(e,n){if(Y(n),e.provider!==kt)return{status:"unsupported"};let r=await ve(e.source_id,[this.sessionsDir]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await xe(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){if(Y(r),e.provider!==kt)return{status:"unsupported"};let s=await ve(e.source_id,[this.sessionsDir]);if(!s||!this.matches(e,s))return{status:"unavailable"};let i=await xe(s,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let o=Gy(i.data,r);return o?Yy(o,e,n,r):{status:"partial"}}};function tu(t={}){return new mr(t)}var It=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)}},aT=0,At=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${aT++}`,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)}},lT=new Set(["schedulewakeup","taskcreate","taskupdate","taskoutput","taskstop","todowrite","todoread","croncreate","crondelete","cronlist","monitor","listagents","toolsearch","askuserquestion","exitplanmode","agent","skill","job"]);function yo(t){return typeof t=="string"&&lT.has(t.toLowerCase())}function gr(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 du(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 Cn(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 An(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}function To(t,e,n){let r={},s=An(t.cacheWrite5m),i=An(t.cacheWrite1h),o=An(t.reasoning),a=An(t.webSearch),l=An(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 In=["claude","codex","lmplayer",wt,St,Kt,Rt,bt,kt,"muse","miniplayer"],pr={input_uncached:null,input_cached:null,input_cache_write:null,output:null},dT=5e5,Eo="bx3",uT=eT(import.meta.url);function ls(){return process.env.HOME||process.env.USERPROFILE||""}function cT(){if(process.env.OPENCODE_DB)return[ut(process.env.OPENCODE_DB)];let t=process.env.XDG_DATA_HOME||Yt(ls(),".local","share");return[Yt(t,"lmplayer","opencode-local.db"),Yt(t,"lmplayer","opencode-dev.db")]}function mT(){return uT("node:sqlite").DatabaseSync}function q(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}function Oe(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}function vo(t){if(typeof t!="string"&&typeof t!="number")return null;let e=new Date(t);return Number.isFinite(e.getTime())?e.toISOString():null}function fr(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 ds(t){return`${t.source_id}\0${t.sessionid}`}function Ct(t,e){return t<e?-1:t>e?1:0}function mo(t,e){return Ct(ds(t),ds(e))}var po=["claude","codex","lmplayer"];function pT(t){let e={version:2,pos:t.pos,done:t.done,rr:t.rr};return Buffer.from(JSON.stringify(e),"utf8").toString("base64url")}function su(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 fT(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>=po.length)throw new Error("invalid passive session discovery cursor");let o=i,a=su({source_id:e.source_id,sessionid:e.sessionid}),l=new Map([[po[o],a]]),d=new Set(po.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,su(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 gT=["read","read_file","view","view_file","view_image"],_T=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],hT=["filePath","path","file","file_path","filepath","notebook_path","paths"];function uu(t){if(typeof t!="string")return null;let e=t.toLowerCase();return e==="apply_patch"?"apply_patch":gT.includes(e)?"read":_T.includes(e)?"written":null}function yT(t){return typeof t=="string"?(()=>{try{return JSON.parse(t)}catch{return t}})():t}function us(t,e=hT){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 cu(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 cs(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 TT=[["text(await tools.apply_patch(",2],["await tools.apply_patch(",1],["tools.apply_patch(",1]];function ET(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 TT)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 iu(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 ou(t,e){fr(e);let n=await nu(t).catch(()=>null);if(!n?.isFile()||n.size>e.maxBytes)return null;let r=await nT(t,{signal:e.signal});e.signal.throwIfAborted();let s=await nu(t).catch(()=>null);return!s?.isFile()||n.dev!==s.dev||n.ino!==s.ino||n.size!==s.size||n.mtimeMs!==s.mtimeMs?null:{revision:`${Eo}:sha256:${ho("sha256").update(r).digest("hex")}`,data:r}}function vT(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 wT(t){return as(sT(t))==="subagents"}function ST(t){let e=q(t);if(!e)return null;let n=Oe(e.input_tokens),r=Oe(e.output_tokens);if(n===null||r===null)return null;let s=e.cache_read_input_tokens===void 0?0:Oe(e.cache_read_input_tokens),i=e.cache_creation_input_tokens===void 0?0:Oe(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 bT(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=iu(u.content);c=p!==null?Buffer.byteLength(p,"utf8"):null}else if(Array.isArray(u.content)){let p=u.content.map(q).filter(g=>g?.type==="text"&&typeof g.text=="string").map(g=>g.text);if(p.length===1){let g=iu(p[0]);c=g!==null?Buffer.byteLength(g,"utf8"):null}else c=null}else c=null;n.set(u.tool_use_id,{bytes:c,cleanPath:m})}}return n}function RT(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 kT(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 IT(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),kT(o))){n.add(a);let l=RT(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 AT(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=An(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 CT(t,e,n,r,s=!1){let i=bT(t,r),{promptBytes:o,parent:a,resolve:l}=IT(t),d=new Set,u=(g,_)=>{let f=o.get(_)??null;g.record({direction:"read",kind:"prompt",id:_,ref:null,bytes:f,basis:f===null?"unknown":"input_text"})},c=g=>{g.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})},m=new Map;for(let g of t){if(r.signal.throwIfAborted(),g.type!=="assistant"||g.isSidechain===!0&&!s||g.isMeta===!0)continue;let _=q(g.message);if(!_||typeof _.id!="string"||_.id.length===0)continue;let f=m.get(_.id);if(!f){if(f={meta:{response_id:_.id,timestamp:vo(g.timestamp),model:null,tokens:{...pr},files_read:[],files_written:[]},obs:new It,io:new At,pricingRaw:{}},m.set(_.id,f),m.size>r.maxRows)return{status:"partial"};let E=typeof g.uuid=="string"&&g.uuid?g.uuid:null;if(E===null)c(f.io);else{let y=l(E);if(y.kind==="broken")c(f.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 R=a.get(b)??null;if(R===null){v=null;continue}let S=l(R);v=S.kind==="found"?S.uuid:null}for(let b=T.length-1;b>=0;b-=1)u(f.io,T[b])}}}let h=q(_.usage);if(h){let E=ST(h);E&&(f.meta.tokens=E),AT(f.pricingRaw,h)}if(typeof _.model=="string"&&_.model&&(f.meta.model=_.model),Array.isArray(_.content))for(let E of _.content){let y=q(E);if(y?.type!=="tool_use")continue;let T=typeof y.id=="string"&&y.id?y.id:_.id,v=uu(y.name),b=yT(y.input),R=typeof y.name=="string"?y.name.toLowerCase():"";if(v==="read"){let S=us(b,["file_path","filePath","path","file"]);if(S===null)continue;let O=i.get(T),C=O===void 0||O.cleanPath!==null&&O.cleanPath!==S?null:O.bytes;f.obs.record(T,"read",S,C)}else if(v==="written")f.obs.record(T,"written",us(b),cu(b));else if(v==="apply_patch"){let S=typeof b=="string"?b:q(b)?.input;if(typeof S=="string")for(let O of cs(S))f.obs.record(T,"written",O.path,O.bytes)}else R==="webfetch"||R==="websearch"?f.io.record({direction:"read",kind:"web",id:T,ref:du(q(b)?.url),bytes:null,basis:"unknown"}):yo(y.name)||gr(f.io,T)}}let p=[];for(let{meta:g,obs:_,io:f,pricingRaw:h}of m.values()){let E=_.files("read"),y=_.files("written"),T=f.entries();p.push({...g,files_read:E,files_written:y,external_io:T,read_bytes:Cn(E,T,"read"),write_bytes:Cn(y,T,"written"),model_provider:null,pricing_facts:To(h,g.tokens.output,g.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:p}}function NT(t){let e=q(t);if(!e)return null;let n=Oe(e.input_tokens),r=Oe(e.cached_input_tokens),s=Oe(e.output_tokens);if(n===null||r===null||s===null||r>n)return null;let i=e.cache_write_input_tokens===void 0?null:Oe(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 xT(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 cs(i))e.record(r,"written",o.path,o.bytes);return}if(typeof i=="string"){let o=ET(i);if(o!==null){if(r!==null)for(let a of cs(o))e.record(r,"written",a.path,a.bytes);return}}yo(s)||gr(n,r)}function OT(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 LT(t,e,n,r){let s=new Map,i=new Map,o=null,a=null,l=new It,d=new At,u=0,c=!1,m=!0,p=new Set;for(let _ of t){r.signal.throwIfAborted();let f=q(_.payload);if(_.type==="session_meta"&&f&&typeof f.model_provider=="string"&&f.model_provider){a=f.model_provider;continue}if(_.type==="turn_context"&&f){let T=typeof f.model=="string"&&f.model?f.model:null;T&&(o=T),T&&typeof f.turn_id=="string"&&i.set(f.turn_id,T);continue}if(_.type==="response_item"&&f){if(f.type==="function_call"||f.type==="custom_tool_call")xT(f,l,d);else if(f.type==="local_shell_call")gr(d,typeof f.call_id=="string"?f.call_id:null);else if(f.type==="web_search_call")u+=1,d.record({direction:"read",kind:"web",id:typeof f.id=="string"?f.id:null,ref:null,bytes:null,basis:"unknown"});else if(f.type==="message"&&f.role==="user"){let T=OT(f),v=typeof f.id=="string"&&f.id?f.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(_.type==="event_msg"&&f?.type==="token_count"){c=!0,m&&(l=new It,d=new At,u=0);continue}if(_.type!=="token_usage_record"||!f)continue;if(typeof f.response_id!="string"||f.response_id.length===0)return{status:"unsupported"};let h=NT(f.usage);if(!h)return{status:"partial"};let E=typeof f.turn_id=="string"?i.get(f.turn_id)??o:o,y=s.get(f.response_id);if(!y&&(y={meta:{response_id:f.response_id,timestamp:null,model:null,tokens:h,files_read:[],files_written:[]},obs:new It,io:new At,rawUsage:null,webSearch:0},s.set(f.response_id,y),s.size>r.maxRows))return{status:"partial"};m=!1,y.meta.timestamp=vo(_.timestamp),y.meta.model=E??null,y.meta.tokens=h,y.rawUsage=q(f.usage),y.obs.absorb(l),y.io.absorb(d),y.webSearch+=u,l=new It,d=new At,u=0}if(c&&s.size===0)return{status:"unsupported"};let g=[];for(let{meta:_,obs:f,io:h,rawUsage:E,webSearch:y}of s.values()){let T=f.files("read"),v=f.files("written"),b=h.entries(),R=q(E),S=To({reasoning:R?.reasoning_output_tokens,webSearch:y>0?y:void 0},_.tokens.output,_.tokens.input_cache_write);g.push({..._,files_read:T,files_written:v,external_io:b,read_bytes:Cn(T,b,"read"),write_bytes:Cn(v,b,"written"),model_provider:a,pricing_facts:S})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:g,...c?{capture_status:"partial"}:{}}}function DT(t,e=!1){let n=q(t);if(!n)return{...pr};let r=n.input===void 0?e?null:0:Oe(n.input),s=n.output===void 0?e?null:0:Oe(n.output),i=n.reasoning===void 0?e?null:0:Oe(n.reasoning),o=q(n.cache),a=o?.read===void 0?e?null:0:Oe(o.read),l=o?.write===void 0?e?null:0:Oe(o.write);return e&&r===0&&s===0&&i===0&&a===0&&l===0?{...pr}: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?{...pr}:r+s+i+a+l===0?{...pr}:{input_uncached:r+l,input_cached:a,input_cache_write:l,output:s+i}}function au(t,e,n){fr(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=Oe(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=ho("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:`${Eo}:sha256:${d.digest("hex")}`,messages:o,parts:a}}var PT=new Set(["session-job-notification"]);function MT(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&&!PT.has(o)&&(r=!0))}return n?e:r?"unknown":null}function UT(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=MT(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 It,m=new At,p=0,g=o.get(d.id);g&&m.record({direction:"read",kind:"prompt",id:g.id,ref:null,bytes:g.bytes,basis:g.bytes===null?"unknown":"input_text"});for(let R of s.get(d.id)??[]){let S;try{S=q(JSON.parse(R.data))}catch{return{status:"partial"}}if(S?.type!=="tool")continue;let O=typeof S.tool=="string"?S.tool.toLowerCase():"",C=uu(S.tool),k=q(S.state),w=q(k?.input),I=typeof S.callID=="string"&&S.callID?S.callID:typeof k?.callID=="string"&&k.callID?k.callID:R.id;if(C==="written")c.record(I,"written",us(w),cu(w));else if(C==="apply_patch"){let A=w?.patchText;if(typeof A=="string")for(let x of cs(A))c.record(I,"written",x.path,x.bytes);else gr(m,I)}else if(C==="read"){let A=us(w,["filePath","path","file","file_path"]);if(A===null)continue;let x=null;if(k?.status==="completed"){let N=q(q(k.metadata)?.display);N?.type==="file"&&typeof N.text=="string"&&(x=Buffer.byteLength(N.text,"utf8"))}c.record(I,"read",A,x)}else if(O==="webfetch"){p+=1;let A=k?.status==="completed"?k.output:void 0;m.record({direction:"read",kind:"web",id:I,ref:du(w?.url),bytes:typeof A=="string"?Buffer.byteLength(A,"utf8"):null,basis:typeof A=="string"?"normalized_content":"unknown"})}else yo(S.tool)||gr(m,I)}let _=q(u.time),f=q(u.model)?.modelID??u.modelID,h=DT(u.tokens,r.requireBillingCounters),E=q(u.tokens),y=c.files("read"),T=c.files("written"),v=m.entries(),b=To({reasoning:E?.reasoning,webFetch:p>0?p:void 0},h.output,h.input_cache_write);if(l.push({response_id:d.id,timestamp:vo(_?.created??d.time_created),model:typeof f=="string"&&f?f:null,tokens:h,files_read:y,files_written:T,external_io:v,read_bytes:Cn(y,v,"read"),write_bytes:Cn(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 fo(t,e){if(!ru(t))return null;let n=await tT(t).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await go(t).catch(()=>null);if(!r)return null;for(let s of e){let i=await go(s).catch(()=>ut(s)),o=iT(i,r);if(o===""||!o.startsWith(`..${oT}`)&&o!==".."&&!ru(o))return r}return null}async function lu(t,e,n,r,s=null){let i=[],o=0,a=!1;async function l(d){r.signal.throwIfAborted();let u=await rT(d,{withFileTypes:!0}).catch(()=>[]);u.sort((c,m)=>Ct(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=Yt(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 go(m).catch(()=>ut(m));(s===null||Ct(p,s)>0)&&i.push(p)}}}return await l(t),{paths:i.sort(Ct),truncated:a}}function FT(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 _o=class{claudeProjectsDir;codexSessionDirs;lmplayerDbPaths;sqliteBusyTimeoutMs;maxDiscoveryTraversalVisits;agyReader;dshReader;qwenReader;opencodeReader;copilotReader;kimiReader;sessionDataReaders;constructor(e={}){this.sessionDataReaders=Object.fromEntries([fd(e.museDataHome),rs(e.miniplayerHome)].map(n=>[n.provider,new vn(n)])),this.claudeProjectsDir=ut(e.claudeProjectsDir??Yt(ls(),".claude","projects")),this.codexSessionDirs=(e.codexSessionDirs??[Yt(ls(),".codex","sessions"),Yt(ls(),".code","sessions")]).map(n=>ut(n)),this.lmplayerDbPaths=(e.lmplayerDbPaths??cT()).map(n=>ut(n)),this.sqliteBusyTimeoutMs=e.sqliteBusyTimeoutMs??5e3,this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):dT,this.agyReader=Id(e.agyConversationsDir?{agyConversationsDir:e.agyConversationsDir}:{}),this.dshReader=Pd(e.dshHome?{dshHome:e.dshHome}:{}),this.qwenReader=Fd(e.qwenProjectsDirs?{qwenProjectsDirs:e.qwenProjectsDirs}:{}),this.opencodeReader=Hd(e.opencodeDbPaths?{dbPaths:e.opencodeDbPaths}:{}),this.copilotReader=Gd(e.copilotSessionStateDir?{copilotSessionStateDir:e.copilotSessionStateDir}:{}),this.kimiReader=tu(e.kimiHome?{kimiHome:e.kimiHome}:{})}capabilities(){let e=ho("sha256").update(JSON.stringify({claudeProjectsDir:this.claudeProjectsDir,codexSessionDirs:this.codexSessionDirs,lmplayerDbPaths:this.lmplayerDbPaths,agyExtractionRevisionTag:ss,sessionData:Object.values(this.sessionDataReaders).map(({format:n})=>[n.provider,n.root,n.revision])})).digest("hex");return{scope:"account",revision:`${Eo}:${e}`,providers:[...In],metering:{muse:"partial",miniplayer:"partial",claude:"per_response",codex:"per_response",lmplayer:"per_response",opencode:"per_response",[bt]:"per_response",[St]:"per_response",[wt]:"partial",[Rt]:"partial",[kt]:"per_response"}}}async discover(e){if(fr(e),!Number.isSafeInteger(e.maxSources)||e.maxSources<=0)throw new Error("maxSources must be a positive safe integer");let n=fT(e.after),r=n?.pos??new Map,s=n?.done??new Set,i=n?.rr??0,o=In.filter(f=>!s.has(f));if(o.length===0)return{sources:[],complete:!0,cursor:null};let a=new Map,l=new Map;for(let f of o){e.signal.throwIfAborted();let h=r.get(f)??null,{sources:E,truncated:y}=await this.discoverProvider(In.indexOf(f),e,e.maxSources+1,h);if(y)throw new Error(`passive session discovery exceeded the traversal budget for provider "${f}"; cannot certify a complete or progressing sweep`);let T=h?ds({provider:f,source_id:h.source_id,sessionid:h.sessionid}):null,v=T===null?E:E.filter(b=>Ct(ds(b),T)>0);l.set(f,v.length>e.maxSources),a.set(f,v.slice(0,e.maxSources))}let d=i%o.length,u=o.map((f,h)=>o[(h+d)%o.length]),c=new Map(o.map(f=>[f,0])),m=[],p=!0;for(;m.length<e.maxSources&&p;){p=!1;for(let f of u){if(m.length>=e.maxSources)break;let h=a.get(f),E=c.get(f);E<h.length&&(m.push(h[E]),c.set(f,E+1),p=!0)}}let g={},_=[...s];for(let f of o){let h=a.get(f),E=c.get(f);if(!l.get(f)&&E===h.length){_.push(f);continue}if(E>0){let T=h[E-1];g[f]={source_id:T.source_id,sessionid:T.sessionid}}else{let T=r.get(f);T&&(g[f]=T)}}return In.every(f=>_.includes(f))?{sources:m,complete:!0,cursor:null}:{sources:m,complete:!1,cursor:pT({pos:g,done:_,rr:i+1})}}async inspect(e,n){if(fr(n),!In.includes(e.provider))return{status:"unsupported"};if(e.provider==="claude"||e.provider==="codex"){let r=e.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,s=await fo(e.source_id,r);if(!s||!this.jsonlSourceMatches(e,s))return{status:"unavailable"};let i=await ou(s,n).catch(()=>null);return i?{status:"ready",revision:i.revision}:{status:"partial"}}return e.provider==="lmplayer"?this.inspectLmplayer(e,n):e.provider===wt?this.agyReader.inspect(e,n):e.provider===St?this.dshReader.inspect(e,n):e.provider===Kt?this.opencodeReader.inspect(e,n):e.provider===Rt?this.copilotReader.inspect(e,n):e.provider===bt?this.qwenReader.inspect(e,n):e.provider===kt?this.kimiReader.inspect(e,n):this.sessionDataReaders[e.provider]?.inspect(e,n)??{status:"unsupported"}}async read(e,n,r){if(fr(r),e.provider==="claude"||e.provider==="codex"){let s=e.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,i=await fo(e.source_id,s);if(!i||!this.jsonlSourceMatches(e,i))return{status:"unavailable"};let o=await ou(i,r).catch(()=>null);if(!o)return{status:"partial"};if(o.revision!==n)return{status:"partial"};let a=vT(o.data,r);return a?e.provider==="claude"?CT(a,e,n,r,wT(i)):LT(a,e,n,r):{status:"partial"}}if(e.provider==="lmplayer")return this.readLmplayer(e,n,r);if(e.provider===wt)return this.agyReader.read(e,n,r);if(e.provider===St)return this.dshReader.read(e,n,r);if(e.provider===Kt)return this.opencodeReader.read(e,n,r);if(e.provider===bt)return this.qwenReader.read(e,n,r);if(e.provider===Rt){let{snapshot:s,sessionUsage:i}=await this.copilotReader.readWithUsage(e,n,r);return s.status!=="complete"?s:{...s,session_usage:i}}return e.provider===kt?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 lu(this.claudeProjectsDir,r,this.maxDiscoveryTraversalVisits,n,i);return{sources:o.map(l=>({provider:"claude",sessionid:as(l,".jsonl"),source_id:l})).sort(mo),truncated:a}}if(e===1){let o=[],a=!1;for(let l of[...this.codexSessionDirs].sort(Ct)){let d=await lu(l,r,this.maxDiscoveryTraversalVisits,n,i);d.truncated&&(a=!0);for(let u of d.paths){let c=as(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(mo).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[In[e]].discover(n,r,i)}jsonlSourceMatches(e,n){let r=as(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(ut(e)))return null;try{let n=new(mT())(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=>ut(a)))].sort(Ct);for(let a of i){e.signal.throwIfAborted();let l=await fo(a,[ut(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&&Ct(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(g=>typeof g.id=="string"&&g.id?g.id:"").filter(Boolean);if(m.length===0)break;let p=a===0?new Set:FT(s.slice(0,a),m);for(let g of m){if(o.length>=n)break;p.has(g)||o.push({provider:"lmplayer",sessionid:g,source_id:l})}if(u=m[m.length-1],o.length>=n||c.length<n)break}}return o.sort(mo).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=au(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=au(s,e.sessionid,r);if(!o||o.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=UT(e,n,o,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function mu(t={}){return new _o(t)}import{createHash as gu}from"node:crypto";import{opendir as $T,open as WT,realpath as _u}from"node:fs/promises";import{constants as wo}from"node:fs";import{join as HT,relative as BT,isAbsolute as XT,basename as qT,dirname as JT}from"node:path";function _r(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 zt(t){let e=_r(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?jT(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 jT(t,e){for(let[n,r]of Object.entries(e))if(r!==void 0){if(n==="tokens"&&pu(t.tokens)&&pu(r)){t.tokens={...t.tokens,...r};continue}t[n]=r}}function pu(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function fu(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 ct=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,GT=t=>{let e=typeof t=="number"||typeof t=="string"?new Date(t):null;return e&&Number.isFinite(e.getTime())?e.toISOString():null},hu=(t,e,n)=>({response_id:t,timestamp:GT(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 VT(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 g=p.usage,_=hu(m.id,m.timestamp,p.model);if(!g||typeof g!="object")return;_.tokens={input_uncached:ct(g.input),input_cached:ct(g.cacheRead),input_cache_write:ct(g.cacheWrite),output:ct(g.output)},_.pricing_facts={reasoning_output_tokens:ct(g.reasoning)},_.providerCostUsd=typeof g.cost?.total=="number"&&Number.isFinite(g.cost.total)&&g.cost.total>=0?g.cost.total:null,c.push(_)}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=zt(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=ct(c.input),p=ct(c.cached),g=ct(c.output),_=ct(c.thoughts),f=hu(u.id,u.timestamp,u.model);f.tokens={input_uncached:m!==null&&p!==null&&p<=m?m-p:null,input_cached:p,input_cache_write:null,output:g!==null&&_!==null&&Number.isSafeInteger(g+_)?g+_:null},f.pricing_facts={reasoning_output_tokens:_},d.push(f)}return d}catch{return}}function So(t,e){let n=async(s,i)=>{i.signal.throwIfAborted();let o=await _u(s),a=await _u(e),l=BT(a,o);if(l===".."||l.startsWith("../")||l.startsWith("..\\")||XT(l))throw Error("outside native root");let d=await WT(o,wo.O_RDONLY|wo.O_NOFOLLOW|wo.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 g=await d.read(c,m,c.length-m,m);if(!g.bytesRead)break;m+=g.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:zt(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 $T(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=HT(d,m.name);if(m.isDirectory())await l(p,u+1);else if(m.isFile()&&/\.jsonl?$/.test(m.name)&&(t!=="gemini"||qT(JT(p))==="chats"&&m.name.startsWith("session-"))){let g=await n(p,s).catch(()=>{});if(g===void 0){s.signal.throwIfAborted(),a=!1;continue}let _=r(g);typeof _=="string"&&_?i.push({provider:t,sessionid:_,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:gu("sha256").update(o).digest("hex")}},async read(s,i,o){let a=await n(s.source_id,o);if(gu("sha256").update(a).digest("hex")!==i)return{status:"partial"};if(a.split(`
29
- `).length>o.maxRows)return{status:"partial"};let l=VT(t,a,s.sessionid);return l&&l.length<=o.maxRows?{status:"complete",source:s,revision:i,responses:l}:{status:"partial"}}}}var ms=["kimi","opencode","gemini","miniplayer","pi","agy","lmplayer"],bo=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null;function QT(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 _ of Object.values(c))_!==null&&bo(_)===null&&(n=!0);let g=p;return["kimi","opencode","miniplayer","lmplayer"].includes(t)&&(m===null||p===null||m>p?(g=null,n=!0):g=p-m),(g===null||c.input_cached===null||c.output===null)&&(n=!0),{...u,tokens:{...c,input_uncached:g}}}),s=wn(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=>bo(m)===null))return n=!0,null;let c=u.reduce((m,p)=>m+p,0);return bo(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 yu(t,e,n,r){let s=[],i=new Set;for(let o of t){r.signal?.throwIfAborted();let a=Tu(o),l;try{if(!(await KT(a)).isFile())return{sources:s,complete:!1};let d=await YT(a);if(i.has(d))continue;i.add(d),l=Zi(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 ZT(t,e,n){let r=e.HOME||e.USERPROFILE||zT(),s=e.XDG_DATA_HOME||Le(r,".local","share"),i=e.XDG_CONFIG_HOME||Le(r,".config");if(t==="pi")return So("pi",e.PI_CODING_AGENT_DIR?Le(e.PI_CODING_AGENT_DIR,"sessions"):Le(r,".pi","agent","sessions"));if(t==="gemini")return So("gemini",Le(e.GEMINI_CLI_HOME||Le(r,".gemini"),"tmp"));if(t==="miniplayer"){let l=new vn(rs(e.MINIPLAYER_HOME||Le(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=[Le(s,"opencode","opencode.db"),Le(s,"opencode","opencode-local.db"),Le(i,"opencode","opencode.db")].map(u=>Tu(u)),d=new dr({dbPaths:l,sqliteBusyTimeoutMs:0});return{discover:u=>yu(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 mr({kimiHome:e.KIMI_CODE_HOME||Le(r,".kimi-code")}):new or({agyConversationsDir:Le(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]:[Le(s,"lmplayer","opencode-local.db"),Le(s,"lmplayer","opencode-dev.db")],a=mu({lmplayerDbPaths:o,sqliteBusyTimeoutMs:0});return{discover:l=>yu(o,t,n,l),inspect:(l,d)=>a.inspect(l,d),read:(l,d,u)=>a.read(l,d,u)}}async function Eu(t,e,n,r){if(!ms.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=Zi(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??ZT(t.provider,r.env??process.env,e),c=await u.discover(d);if(c.complete!==!0)return;let m=c.sources.filter(g=>g.provider===t.provider&&(g.sessionid===e||t.provider==="lmplayer"&&g.sessionid==="")).map(g=>({...g,sessionid:e}));if(!m.length)return;let p;for(let g of m){s.signal.throwIfAborted();let _=await u.inspect(g,d);if(_.status!=="ready")return;let f=await u.read(g,_.revision,d);if(s.signal.throwIfAborted(),f.status!=="complete"||f.capture_status!==void 0||f.source?.provider!==t.provider||f.source?.sessionid!==e||f.source?.source_id!==g.source_id||f.revision!==_.revision)return;let h=Date.parse(t.startedAt),E=Date.parse(n);if(!Number.isFinite(h)||!Number.isFinite(E)||E<h)return;let y=f.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 R of T){let S=new Date(R.timestamp).toISOString();if(b.get(t.attempt_key,t.provider,e,S,S))return}}finally{l.pragma("busy_timeout = "+v)}p=T}return p?QT(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 Ze(t){return t.some(e=>e!=null&&(typeof e!="number"||!Number.isSafeInteger(e)||e<0))}import{randomUUID as OE}from"node:crypto";var ps={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"},vu=`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 Nu}from"node:crypto";import{mkdirSync as xu,readFileSync as eE,renameSync as tE,writeFileSync as nE,existsSync as Ou}from"node:fs";import{homedir as rE}from"node:os";import{dirname as Lu,join as hs,resolve as ys}from"node:path";import{fileURLToPath as sE}from"node:url";var iE="https://lmctl.com/dataset/model_list.json",oE="https://lmctl.com/dataset/aliases.json",aE=1e3,lE=1e4,wu=6*60*60*1e3;function dE(){return hs(rE(),".lmctl","cache","lmprice")}var gs="model_list.json",_s="aliases.json",Du="meta.json",uE="model_list.meta.json";function On(t,e){return hs(t,e)}var hr=new WeakMap;function Ts(t,e){if(!t||!e)return null;let n=hr.get(t),r=hr.get(e);return n===void 0||r===void 0?null:Nu("sha256").update(n).update(r).digest("hex")}function Qt(t){try{let e=eE(t,"utf-8"),n=JSON.parse(e);return n&&typeof n=="object"&&hr.set(n,e),n}catch{return null}}function Pu(t,e){let n=`${t}.tmp-${process.pid}`;nE(n,e),tE(n,t)}function Ro(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 Ro(s.input_per_1m_tokens)&&Ro(s.output_per_1m_tokens)&&Ro(s.input_cache_read_per_1m_tokens)})}var cE=new Set(["established","asserted","unresolved"]);function en(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"&&cE.has(i.evidence)});return n&&r}var Su={etag:null,last_checked:null};function mE(t){let e=Qt(On(t,Du)),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=Qt(On(t,uE));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 pE(t){let e=mE(t),n=Qt(On(t,gs)),r=Qt(On(t,_s));return e.pair_sha256&&Ts(Zt(n)?n:null,en(r)?r:null)!==e.pair_sha256?{catalog:null,aliases:null,meta:{model_list:{...Su},aliases:{...Su}}}:{catalog:Zt(n)?n:null,aliases:en(r)?r:null,meta:e}}function bu(t,e){try{return xu(t,{recursive:!0}),Pu(On(t,Du),JSON.stringify(e)),!0}catch{return!1}}function ko(t){return(t&&typeof t=="object"?hr.get(t):void 0)??JSON.stringify(t)}function fs(t,e,n){try{xu(t,{recursive:!0}),Pu(On(t,e),ko(n))}catch{}}function fE(t,e){let n=gE(t),r=n?[ys(n,"data",e)]:[ys(t,"..","..","data",e)];for(let s of r)if(Ou(s))return s;return null}function gE(t){let e=ys(t);for(;;){if(Ou(ys(e,"package.json")))return e;let n=Lu(e);if(n===e)return null;e=n}}function Ru(t,e,n){let r=n!==void 0?n:fE(t,e);return r===null?null:Qt(r)}function Es(t=process.env){let e=t.LMCTL_PRICE_TTL;if(e===void 0||e==="")return wu;let n=Number(e);return!Number.isFinite(n)||n<0?wu:n*1e3}function _E(){let t=process.env.LMCTL_PRICE_DATA;return t!==void 0&&t!==""?t:null}async function ku(t,e,n,r){try{let s=await t(e,{method:"HEAD",signal:AbortSignal.timeout(aE)});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(lE)});if(!o.ok)return{kind:"failed"};let a=await o.text(),l=JSON.parse(a);return l&&typeof l=="object"&&hr.set(l,a),{kind:"payload",payload:l,etag:o.headers.get("etag")??i}}catch{return{kind:"failed"}}}var Io=null;var Iu=null;function Mu(t={}){return Object.keys(t).length===0?(Iu??=Au(t),Iu):Au(t)}async function Au(t){let e=Lu(sE(import.meta.url)),n=t.pinDir!==void 0?t.pinDir:_E();if(n!==null&&n!==""){let _=Qt(hs(n,gs)),f=Qt(hs(n,_s));if(Zt(_)&&en(f)){let h={sha256:Ts(_,f),catalog:_,aliases:f,source:"pinned",generatedAt:_.generated_at??null};return Io=h.generatedAt,h}return Cu(t,e)}let r=t.fetchImpl??fetch,s=t.cacheDir??dE(),i=t.now??Date.now(),o=t.ttlMs??Es(),a=pE(s),l=(_,f)=>_!==null&&f.last_checked!==null&&i>=Date.parse(f.last_checked)&&i-Date.parse(f.last_checked)<o,d=a.catalog,u=a.aliases,c=!1,m=!1,p={model_list:{...a.meta.model_list},aliases:{...a.meta.aliases}},g=!1;if(!l(d,a.meta.model_list)){let _=await ku(r,iE,d,a.meta.model_list.etag);_.kind==="failed"&&(m=!0),_.kind==="match"?(p.model_list.last_checked=new Date(i).toISOString(),g=!0):_.kind==="payload"&&(Zt(_.payload)?(p.model_list.last_checked=new Date(i).toISOString(),g=!0,d=_.payload,_.etag!==null&&(p.model_list.etag=_.etag),c=!0):m=!0)}if(!l(u,a.meta.aliases)){let _=await ku(r,oE,u,a.meta.aliases.etag);_.kind==="failed"&&(m=!0),_.kind==="match"?(p.aliases.last_checked=new Date(i).toISOString(),g=!0):_.kind==="payload"&&(en(_.payload)?(p.aliases.last_checked=new Date(i).toISOString(),g=!0,u=_.payload,_.etag!==null&&(p.aliases.etag=_.etag),c=!0):m=!0)}if(!m&&(g||c))if(d!==null&&u!==null){let _=Nu("sha256").update(ko(d)).update(ko(u)).digest("hex");bu(s,{...p,pair_sha256:_})&&_!==a.meta.pair_sha256&&(fs(s,gs,d),fs(s,_s,u))}else d!==a.catalog&&d!==null&&fs(s,gs,d),u!==a.aliases&&u!==null&&fs(s,_s,u),bu(s,p);if(d!==null||u!==null){let _={catalog:d,aliases:u,sha256:Ts(d,u),source:c?"network":"cache",refreshFailed:m,generatedAt:d?.generated_at??null};return Io=_.generatedAt,_}return{...Cu(t,e),refreshFailed:m}}function Cu(t,e){let n=Ru(e,"price-data.json",t.bundledPath),r=Ru(e,"price-aliases.json",t.bundledAliasesPath),s=Zt(n)?n:null,i=en(r)?r:null,o={catalog:s,aliases:i,sha256:Ts(s,i),source:s!==null||i!==null?"bundled":"unavailable",generatedAt:s?.generated_at??null};return Io=o.generatedAt,o}var Nn=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?t:null,xn=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null;function Uu(t){if(t.cacheWrite!==void 0)return xn(t.cacheWrite);if(t.cacheWrite5m===void 0&&t.cacheWrite1h===void 0)return 0;let e=xn(t.cacheWrite5m),n=xn(t.cacheWrite1h);return e===null||n===null?null:xn(e+n)}function Ao(t,e){let n=xn(t.cacheWrite5m===void 0?0:t.cacheWrite5m),r=xn(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 Co(t,e){let n=Nn(e.input_per_1m_tokens),r=Nn(e.output_per_1m_tokens),s=Nn(e.input_cache_read_per_1m_tokens),i=Nn(e.source_cost_fields?.cache_creation_input_token_cost),o=Nn(e.input_cache_write_per_1m_tokens)??(i===null?n:i*1e6),a=Nn(e.source_cost_fields?.cache_creation_input_token_cost_above_1hr),l=a===null?o:a*1e6,d=Uu(t),u=Ao(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 Fu(t,e){if(e===null)return null;let n=Co(t,e),r=Uu(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 tn(t){return t.toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function Ln(t){let e=t.source_model_id.toLowerCase(),n=e.slice(e.lastIndexOf("/")+1);return tn(n)}function $u(t){let e=new Set,n=r=>{let s=r.toLowerCase().split("/");for(let i=0;i<s.length;i+=1)e.add(tn(s.slice(i).join("/")))};return n(t.source_model_id),t.gateway_id&&n(t.gateway_id),e}function hE(t,e){let n=new Set,r=l=>{n.add(tn(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 nn(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=>hE(r,t.vendorPrefixes),matchRow(r,s){if(!n(r))return!1;let i=$u(r);return s.some(o=>i.has(o))}}}var Wu=nn({vendorPrefixes:["anthropic"],family:/claude/,firstPartyProviders:["anthropic"]}),Hu=nn({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)(-|$)/}),Bu=nn({vendorPrefixes:["google","gemini"],family:/gemini|gemma/,firstPartyProviders:["gemini","google","vertex_ai-language-models"],nonChatName:/embedding|imagen|-image|tts|audio|veo|lyria|live|realtime|video/}),Xu=nn({vendorPrefixes:["moonshot","moonshotai"],family:/kimi|moonshot/,firstPartyProviders:["moonshot"]}),qu=nn({vendorPrefixes:["dashscope","qwen"],family:/qwen/,firstPartyProviders:["dashscope"]}),Ju=nn({vendorPrefixes:["deepseek","nousresearch"],family:/deepseek|nous|hermes-\d/,firstPartyProviders:["deepseek","nousresearch"]}),yE=/\s*\(([^()]+)\)\s*$/;function TE(t){let e=t.trim(),n=yE.exec(e);return n?{model:e.slice(0,n.index).trim(),effort:n[1].trim()}:{model:e,effort:null}}var EE={"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"},vE=["gemini","google","vertex_ai-language-models","anthropic"],wE={normalize(t){let{model:e}=TE(t),n=EE[e.toLowerCase()];return n===void 0?[]:[tn(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=$u(t);return e.some(r=>n.has(r))}},Gu=nn({vendorPrefixes:["deepseek"],family:/deepseek/,firstPartyProviders:["deepseek"]}),Vu={claude:Wu,codex:Hu,gemini:Bu,agy:wE,kimi:Xu,qwen:qu,hermes:Ju,deepseek:Gu},ju={claude:Wu.firstPartyProviders,codex:Hu.firstPartyProviders,gemini:Bu.firstPartyProviders,agy:vE,kimi:Xu.firstPartyProviders,qwen:qu.firstPartyProviders,hermes:Ju.firstPartyProviders,deepseek:Gu.firstPartyProviders};function SE(t,e,n){let r=e.trim().toLowerCase(),s=tn(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 bE(t,e,n){let r=[];for(let[s,i]of Object.entries(Vu))s!==n&&SE(i,t,e)&&r.push(s);return r}function vs(t){return t==="moonshot"?0:t==="litellm"?1:t==="openrouter"?2:t==="manual"?3:4}function RE(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 kE(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}${tn(a)}`,d=e.get(l);if(d===void 0){e.set(l,r);continue}if(!RE(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 Ku(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 Yu(t,e){return t.map(Ku).sort((n,r)=>{let s=vs(n.source)-vs(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 ws(t){return t.pricing.input_per_1m_tokens!==null&&t.pricing.output_per_1m_tokens!==null}function IE(t,e,n){let r=kE(t),s=Yu(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 No(t,e,n,r){if(t.length===0)return{kind:"known-unpriced",id:e};let s=IE(t,e,n);if(r!==void 0){let o=t.map(Ku),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||!ws(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(ws);return i===void 0?{kind:"known-unpriced",id:e}:i.estimated?{kind:"estimated",model:s}:{kind:"priced",model:s}}var xo=[];function AE(t,e){return t.standards.find(n=>n.standard_slug.toLowerCase()===e.toLowerCase())??null}function CE(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=Ln(l),u=n.records.filter(c=>Ln(c)!==d?!1:c.mode===void 0||c.mode===null||c.mode==="chat");return u.length===0?{kind:"known-unpriced",id:r}:No(u,d,xo)}function NE(t,e,n,r){if(n===null||!Array.isArray(n.records))return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};if(r!==null){let _=[e.trim().toLowerCase()];_.push(`${t.toLowerCase()}/${_[0]}`);let f=r.aliases.find(h=>_.includes(h.alias.toLowerCase()));if(f){if(f.evidence==="unresolved"||f.standard_slug===null)return{state:{kind:"unresolved",alias:f.alias},viaAlias:!0,pinRoute:null};let h=AE(r,f.standard_slug);return{state:CE(f,h,n),viaAlias:!0,pinRoute:h?.catalog_record_id??null}}}let s=Vu[t];if(!s)return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};let i=e.trim().toLowerCase(),o=s.normalize(e),a=_=>({state:_,viaAlias:!1,pinRoute:null}),l=tn(i),d=n.records.filter(_=>_.source_model_id.toLowerCase()===i&&s.matchRow(_,[l]));if(d.length>0){let _=Ln(d[0]),f=n.records.filter(h=>s.matchRow(h,[_])&&Ln(h)===_);return a(No(f.length>0?f:d,_,ju[t]??xo,t==="codex"?"openai":void 0))}let u=n.records.filter(_=>s.matchRow(_,o));if(u.length===0){let _=bE(e,n,t);return _.length>0?a({kind:"wrong-provider",declared:e,otherProviders:_}):a({kind:"unknown",declared:e})}let c=new Map;for(let _ of u){let f=Ln(_),h=c.get(f);h?h.push(_):c.set(f,[_])}let m=ju[t]??xo,p=null,g=null;for(let _ of c.values()){let f=Yu(_,m);(g===null||xE(f[0],g[0],m)<0)&&(p=_,g=f)}return a(No(p,Ln(p[0]),m,t==="codex"?"openai":void 0))}function zu(t,e,n,r){let{state:s,viaAlias:i,pinRoute:o}=NE(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&&ws(d))return{state:s,offer:d,provenance:"alias-pin"}}let l=a.find(ws)??null;return{state:s,offer:l,provenance:i&&o!==null?"alias-pin":"route-preference"}}function xE(t,e,n){let r=vs(t.source)-vs(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 Qu(t){return{startedAt:new Date().toISOString(),attempt_key:OE(),provider:t.provider,model_requested:t.modelRequested,cwd:t.cwd,native_session_id:t.sessionId||null}}function Zu(t,e){return e?"cancelled":/\bstall(?:ed|ing)?\b/i.test(t)?"stalled":"error"}var mt=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,LE=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?t:null;async function Oo(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)||ms.includes(t.provider)&&e.usage?.source==="wire"?e.usage:r&&ms.includes(t.provider)?await Eu(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:mt(i.inputUncached),tok_cache_read:mt(i.cacheRead),tok_cache_write:mt(i.cacheWrite),tok_output:mt(i.output),tok_reasoning:mt(i.reasoning),model_reported:i.modelReported,provider_cost_usd:LE(i.providerCostUsd)}),i.invalidCounters||Ze([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(g=>{a=setTimeout(()=>g(null),1e3)})]).finally(()=>{a&&clearTimeout(a)});if(!l||!l.catalog)return s.cost_reason="price_data_unavailable",s;let d=zu(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(g=>(g.record_id??g.source+":"+g.source_model_id)===d.offer.route),c=d.offer.pricing,m={input:mt(i.inputUncached)??0,output:mt(i.output)??0,cachedInput:mt(i.cacheRead)??0,cacheWrite:mt(i.cacheWrite)??0,...i.cacheWrite5m==null?{}:{cacheWrite5m:i.cacheWrite5m},...i.cacheWrite1h==null?{}:{cacheWrite1h:i.cacheWrite1h}},p=Co(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=Fu(m,c)===null?"rate_missing":null,s}catch{return{...s,usage_reason:"recorder_failed",cost_reason:"usage_unavailable"}}}function rn(t,e,n){try{let r=Object.entries(n).filter(([s])=>Object.hasOwn(ps,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 Mc}from"node:crypto";import{existsSync as $c,mkdirSync as Sv,renameSync as bv,rmdirSync as Rv}from"node:fs";import{hostname as Wo}from"node:os";var ec=`
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 XE,mkdirSync as qE,readFileSync as oc}from"node:fs";import{randomUUID as JE}from"node:crypto";import{homedir as GE}from"node:os";import{dirname as ac,join as VE,resolve as lc}from"node:path";import{fileURLToPath as KE,pathToFileURL as YE}from"node:url";import{createHash as ME}from"node:crypto";import{createHash as DE}from"node:crypto";function PE(t,e,n){return DE("sha256").update(`${t}\0${e}\0${n}`).digest("hex")}function De(t,e,n){let r=PE(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 z={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 sn(t,e){return t==null?null:{teamfile:t,alias:e??""}}function UE(t,e,n){return`lease_${ME("sha256").update(`${t}\0${e}\0${n}`).digest("hex").slice(0,16)}`}function Ss(t,e,n,r){n.forEach((s,i)=>{De(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 FE(t){let e=`msg_tcl_${t.id}`,n=sn(t.sender_teamfile,t.sender_alias),r=sn(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:z.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:z.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 jE(t){let e=`msg_mbx_${t.id}`,n=sn(t.sender_teamfile,t.sender_alias),r=sn(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:z.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:z.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:z.RESPONSE_DELIVERED,ts:t.delivered_at,payload:{...i,message_type:"response",receipt:t.receipt}}),{streamId:e,events:o}}return o.push({event_type:z.CREATE,ts:t.created_at,payload:{...i,message_type:"request",content:t.payload,correlation_status:"legacy-unavailable"}}),o.push({event_type:z.ENQUEUE,ts:t.created_at,payload:{...i,message_type:"request"}}),t.waited_at!==null&&o.push({event_type:z.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:z.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:z.DELIVERED,ts:t.delivered_at,payload:{...i,receipt:t.receipt}}),{streamId:e,events:o}}function $E(t){let e=`inv_${t.id}`,n=sn(t.target_teamfile,t.target_alias),r={table:"tracked_invocation",id:t.id},s=[{event_type:z.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:z.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:z.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 WE(t){let e=UE(t.receiver_teamfile,t.receiver_alias,t.started_at),n=sn(t.receiver_teamfile,t.receiver_alias),r=sn(t.sender_teamfile,t.sender_alias);return{streamId:e,events:[{event_type:z.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 bs(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function tc(t){let e={appended:0,skipped:0},n={team_chat_log:0,agent_mailbox:0,tracked_invocation:0,agent_inflight:0};t.transaction(()=>{if(bs(t,"team_chat_log"))for(let i of t.prepare("SELECT * FROM team_chat_log WHERE "+nd(t)+" ORDER BY id").all()){let o=e.appended+e.skipped,{streamId:a,events:l}=FE(i);Ss(t,a,l,e),n.team_chat_log+=e.appended+e.skipped-o}if(bs(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}=jE(i);Ss(t,a,l,e),n.agent_mailbox+=e.appended+e.skipped-o}if(bs(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}=$E(i);Ss(t,a,l,e),n.tracked_invocation+=e.appended+e.skipped-o}if(bs(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}=WE(i);Ss(t,a,l,e),n.agent_inflight+=e.appended+e.skipped-o}HE(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 HE(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);BE(t,n.seq,n.stream_id,n.event_type,r)}}function ye(t,e,n){let r=t[e];return r!=null?r[n]??null:null}function BE(t,e,n,r,s){switch(r){case z.ENQUEUE:case z.RESPONSE_ENQUEUE:{let i=r===z.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,ye(s,"sender","teamfile"),ye(s,"sender","alias"),ye(s,"receiver","teamfile"),ye(s,"receiver","alias"),e,e);break}case z.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 z.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 z.DELIVERED:case z.RESPONSE_DELIVERED:t.prepare("DELETE FROM message_pending WHERE message_id=?").run(n);break;case z.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(ye(s,"receiver","teamfile"),ye(s,"receiver","alias"),s.lease_id??null,ye(s,"sender","teamfile"),ye(s,"sender","alias"),s.holder_pid??null,s.holder_host??null,s.started_at??null,e);break;case z.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(ye(s,"receiver","teamfile"),ye(s,"receiver","alias"));break;case z.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,ye(s,"sender","teamfile"),ye(s,"sender","alias"),s.holder_pid??null,s.holder_host??null,e,ye(s,"receiver","teamfile"),ye(s,"receiver","alias"));break;case z.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(ye(s,"receiver","teamfile"),ye(s,"receiver","alias"),s.lock_id??n,e);break;case z.TERMINAL_LOCK_RELEASE:case z.TERMINAL_LOCK_EXPIRE:t.prepare(`UPDATE agent_state SET terminal_lock_id=NULL, last_seq=?
105
- WHERE receiver_teamfile=? AND receiver_alias=?`).run(e,ye(s,"receiver","teamfile"),ye(s,"receiver","alias"));break;case z.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??"",ye(s,"target","teamfile"),ye(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 z.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 z.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 dc=ac(KE(import.meta.url)),uc=lc(dc,"schema.sql"),zE=lc(dc,"migrations"),xt=66,on=class extends Error{dbPath;dbVersion;buildVersion;constructor(e,n,r=xt,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 Rs(t){t.dbPath!==":memory:"&&qE(ac(t.dbPath),{recursive:!0});let e=new Tn(t.dbPath);try{e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let n=yr(e),r=t.buildVersionForTests??xt,s=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1";if(n>r)return nc(e,t.dbPath,r,s),e;if(n===xt)return rc(e),e;let i=n>0&&n<47;i&&e.pragma("foreign_keys = OFF");try{e.transaction(()=>{let o=yr(e);o>r&&nc(e,t.dbPath,r,s)||(o===0&&(e.exec(oc(uc,"utf8")),e.pragma("user_version = "+xt)),o>0&&o<63&&e.exec("DROP VIEW IF EXISTS turn_usage"),QE(e,o),rc(e))}).immediate()}finally{i&&e.pragma("foreign_keys = ON")}return e}catch(n){try{e.close()}catch{}throw n}}function nc(t,e,n,r){return t.transaction(()=>{let s=yr(t);if(s<=n)return!1;let i=ZE(t,s);if(tv={dbVersion:s,buildVersion:n},i>n&&!r)throw new on(e,s,n);return i>n&&ev(e,s,n),!0})()}function QE(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&&(qe(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&&(qe(t,"team_chat_log")?sc(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&&qe(t,"team_chat_log")&&!G(t,"team_chat_log").has("origin")&&sc(t),n<47&&n!==0){if(Nt(t,"tracked_invocation"),qe(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(qe(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&&(Nt(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&&(Nt(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(qe(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&&(Nt(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&&(Nt(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&&(Nt(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&&(qe(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&&(qe(t,"agent_mailbox")&&tc(t),t.exec("DROP TABLE IF EXISTS agent_mailbox;"),t.pragma("user_version = 57"),n=57),n<58&&n!==0&&(Nt(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&&(Nt(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(yr(t)<63){let r=G(t,"team_chat_log");for(let[s,i]of Object.entries(ps))r.has(s)||t.exec(`ALTER TABLE team_chat_log ADD COLUMN ${s} ${i}`);t.exec(vu),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(ec),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(qe(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}XE(zE)}function rc(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(JE(),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 qe(t,e){return t.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}function Nt(t,e){if(!qe(t,e)&&(t.exec(oc(uc,"utf8").replace(/-- v63 usage objects begin[\s\S]*?-- v63 usage objects end/,"")),!qe(t,e)))throw new Error(`schema.sql did not create expected table: ${e}`)}function sc(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 yr(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function ZE(t,e){try{if(!qe(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 ic=!1;function ev(t,e,n){ic||(ic=!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 tv=null;function nv(){return process.env.LMCTL_DB??VE(GE(),".lmctl","state.db")}if(process.argv[1]&&(process.argv[1].endsWith("migrate.ts")||process.argv[1].endsWith("migrate.js"))&&import.meta.url===YE(process.argv[1]).href)try{let t=Rs({dbPath:process.argv[2]??nv()});try{process.stdout.write("migrated user_version="+yr(t)+`
954
- `)}finally{t.close()}}catch(t){if(!(t instanceof on))throw t;process.stderr.write("error: "+t.message+`
955
- `),process.exitCode=1}function cc(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 mc=`
1136
- ...[truncated]`;function pc(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 Je(t){if(t==null)return null;if(Buffer.byteLength(t,"utf8")<=65536)return t;let n=Buffer.byteLength(mc,"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")}${mc}`}var Tr="terminal_lock",Er="member";function vr(t,e){return JSON.stringify([t,e])}function fc(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 gc}from"node:fs";function $e(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 ks(t){if(!Number.isInteger(t)||(t??0)<=0)return null;let e=rv();if(e===null)return null;try{let n=gc(`/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 rv(){try{let t=gc("/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 dv}from"node:crypto";import{hostname as uv}from"node:os";import{hostname as Dn}from"node:os";var _c=8*60*60*1e3,hc=12e4,Lo=3e4;function Is(t=process.env){let e=t.LMCTL_INFLIGHT_HEARTBEAT_MS;if(e===void 0||e.trim()==="")return Lo;let n=Number(e);return!Number.isFinite(n)||n<=0?Lo:Math.max(1,Math.trunc(n))}function As(t,e={}){let n=setInterval(()=>{Promise.resolve().then(()=>t(new Date().toISOString())).then(r=>{r||clearInterval(n)}).catch(r=>e.onError?.(r))},e.intervalMs??Lo);return n.unref?.(),n}function Cs(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(!Ns(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 yc(t){return t.status!=="running"?null:t.holder_host===Dn()&&t.holder_pid!==null&&t.holder_pid>0?$e(t.holder_pid)?"live":"dead":"unknown"}function wr(t,e,n){let r,s=t.getTerminalLock(e,n);if(s!==null){if(sv(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===Dn()?"dead-pid":"stale"}}let i=iv(t,e,n);if(i!==null){if(ov(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===Dn())?"dead-pid":"stale"}}let o=t.getAgentInflight(e,n);if(o!==null){let a=new Date(Date.now()-Ot()).toISOString();if(!Ns(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:Dn(),reason:o.holder_pid===null?"stale":"dead-pid"}}return r===void 0?{busy:!1}:{busy:!1,reclaimable:r}}function sv(t){if(t.holder_host===Dn())return $e(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=lv():!1}function iv(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 ov(t){return t.holder_pid!==null&&(t.holder_host===null||t.holder_host===Dn())?$e(t.holder_pid):av(t)}function av(t){let e=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(e)?Date.now()-e<=Ot():!1}function Ns(t,e){return t.holder_pid===null?t.started_at<e:!$e(t.holder_pid)}function Ot(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return _c;let n=Number(e);return!Number.isFinite(n)||n<=0?_c:n}function lv(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return hc;let n=Number(e);return!Number.isFinite(n)||n<=0?hc:n}var cv=60*60*1e3;function Lt(t,e){return{teamfile:t,alias:e}}function Tc(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 Do(t,e){return t===null?null:Lt(t,e??"")}function pt(t){return`msg_tcl_${t}`}function an(t){return`inv_${t}`}function Pn(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 mv(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>cv?null:r.currently_handling_message_id}function pv(t,e,n){let r=mv(t,e,n);return r===null?{}:{causation:{request_message_id:r}}}function Po(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 Mo(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 fv(t,e){let n=e??new Date(Date.now()-Ot()).toISOString();return Ns({holder_pid:t.holder_pid,started_at:t.started_at??""},n)}function gv(t,e,n){return e==="force"||e==="session-idle"?e:n?"force":t.holder_pid!==null&&!$e(t.holder_pid)?"dead-pid":"stale"}function _v(t){return{sender:Do(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at}}function Mn(t,e){if(t!==1)throw new Error(`event projection CAS failed during ${e}`)}function Uo(t,e,n){let r=pt(e),s=Do(n.sender_teamfile,n.sender_alias),i=Tc(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 De(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,...pv(t,n.sender_teamfile,n.sender_alias)}},()=>{Po(t,n.receiver_teamfile,n.receiver_alias,r,n.created_at)}),r}function xs(t,e,n){let r=pt(e),s={message_id:r,message_type:"request",sender:Do(n.sender_teamfile,n.sender_alias),receiver:Tc(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 De(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}},()=>{Mo(t,n.receiver_teamfile,n.receiver_alias,r)}),r}function hv(t){return{sender:Lt(t.sender_teamfile,t.sender_alias),holder_pid:t.holder_pid,holder_host:null,started_at:t.started_at}}function Ec(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);Mn(s.changes,r)}function vc(t,e,n,r,s=null,i=!1){let o=uv();if(n!==null&&r===null)throw new Error("agent inflight takeover is missing a reclaim reason");let a=Pn(t,e.receiver_teamfile,e.receiver_alias);if(a!==null&&a.lease_id!==null){if(!(i||fv(a,s)))throw new Error("event projection rejected INFLIGHT_TAKE: receiver already holds a live lease");let c=gv(a,r,i),m=_v(a),p=a.lease_id;De(t,{stream_id:p,event_type:"INFLIGHT_RECLAIM",observedLastSeq:a.last_seq,ts:e.started_at,payload:{receiver:Lt(e.receiver_teamfile,e.receiver_alias),reason:c,previous_holder:m}},g=>Ec(t,a,g,"INFLIGHT_RECLAIM")),a=Pn(t,e.receiver_teamfile,e.receiver_alias)}let l=a?.last_seq??0,d=`lease_${dv()}`;return De(t,{stream_id:d,event_type:"INFLIGHT_TAKE",observedLastSeq:l,ts:e.started_at,payload:{lease_id:d,receiver:Lt(e.receiver_teamfile,e.receiver_alias),sender:Lt(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);Mn(c.changes,"INFLIGHT_TAKE")}),d}function wc(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 Sr(t,e,n,r){let s=Pn(t,e.receiver_teamfile,e.receiver_alias);s===null||s.lease_id===null||De(t,{stream_id:s.lease_id,event_type:n,observedLastSeq:s.last_seq,payload:{receiver:Lt(e.receiver_teamfile,e.receiver_alias),...n==="INFLIGHT_RECLAIM"?{reason:r??"stale",previous_holder:hv(e)}:{lease_id:s.lease_id}}},i=>Ec(t,s,i,n))}function Sc(t,e){let n=Pn(t,e.teamfile,e.alias),r=n?.last_seq??0;De(t,{stream_id:e.lock_id,event_type:"TERMINAL_LOCK_TAKE",observedLastSeq:r,ts:e.started_at,payload:{receiver:Lt(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);Mn(i.changes,"TERMINAL_LOCK_TAKE")})}function Fo(t,e,n=!1){let r=Pn(t,e.teamfile,e.alias);r===null||r.terminal_lock_id!==e.lock_id||De(t,{stream_id:e.lock_id,event_type:n?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE",observedLastSeq:r.last_seq,payload:{receiver:Lt(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);Mn(i.changes,n?"TERMINAL_LOCK_EXPIRE":"TERMINAL_LOCK_RELEASE")})}function bc(t,e,n){let r=Pn(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);Mn(s.changes,"terminal INVOCATION_START")}function Rc(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 kc(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);Mn(s.changes,"terminal INVOCATION_FINISH")}var yv="INVOCATION_START",Tv="INVOCATION_FINISH",Ev="INVOCATION_NOTIFY_CLAIM";function Ic(t,e){return t.prepare("SELECT last_seq FROM invocation_state WHERE invocation_id = ?").get(e)??null}function jo(t){return t.launch_source==="terminal"&&t.target_teamfile!==null}function Ac(t,e){let n=an(e.id),r=e.target_teamfile===null?null:{teamfile:e.target_teamfile,alias:e.target_alias??""},s=e.last_heartbeat_at??e.started_at;De(t,{stream_id:n,event_type:yv,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),jo(e)&&bc(t,i,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function Os(t,e){let n=an(e.id),r=Ic(t,n);return r===null?!1:(De(t,{stream_id:n,event_type:Tv,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}`);jo(e)&&kc(t,s,n)}),!0)}function Cc(t,e,n,r){let s=an(e.id),i=Ic(t,s);return i===null?!1:(De(t,{stream_id:s,event_type:Ev,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 Nc(t,e,n){let r=an(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),jo(e)&&Rc(t,r,n)}function xc(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,an(e))}function Oc(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,an(e))}var vv="other",wv=["not_enough_information","dont_know","other_work"],Jx=new Set([vv,...wv]),Lc="@abort",Dc="invalid_decision";var Pc="workflow_escalation";function j(){return new Date().toISOString()}function kv(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!$c(t))return e;let n;try{n=new Tn(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 Iv(t){if(t===":memory:"||!$c(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{bv(r,`${e}${n}`)}catch{}}return e}function Uc(t,e){let n=e instanceof Error?e.message:String(e);try{let r=kv(t),s=Iv(t),i=new Ls(Rs({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${xt} (${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 $o(t,e){let n;try{return n=Rs({dbPath:t,allowSchemaSkew:e}),{dal:new Ls(n)}}catch(r){if(r instanceof on)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 Av=3,Wc=".recovery.lock",Cv=20,Nv=50;function xv(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function Ov(t){if(t===":memory:")return!0;try{return Sv(`${t}${Wc}`),!0}catch{return!1}}function Lv(t){if(t!==":memory:")try{Rv(`${t}${Wc}`)}catch{}}function et(t){let e=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1";if(t.recover===!1){let s=$o(t.path,e);if(s.dal)return s.dal;throw s.cause}let n={};for(let s=0;s<Av;s+=1)if(n=$o(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>xt){let s=n.cause instanceof Error?n.cause.message:String(n.cause);throw new on(t.path,n.dbVersion,xt,s)}for(let s=0;s<Cv;s+=1){if(Ov(t.path))try{return Uc(t.path,n.cause)}finally{Lv(t.path)}xv(Nv);let i=$o(t.path,e);if(i.dal!==void 0)return i.dal}return Uc(t.path,n.cause)}var Ls=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Fv(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 g=this.getJob(a.id);return{claimed:!1,reason:g?.locked_until!==null&&g?.locked_until!==void 0&&g.locked_until>=i?"locked":"not_claimable",job_id:n,status:g?.status??a.status,locked_by:g?.locked_by??a.locked_by,locked_until:g?.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)=>jv("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!==Pc)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!==Lc&&!a.includes(r))return{resumed:!1,reason:Dc};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=vc(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){Fc(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){Fc(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=Mc(),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&&rn(this.db,r,e.usage),Uo(this.db,r,e),e.usage&&rn(this.db,r,e.usage),xs(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&&rn(this.db,r,e.usage),Uo(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&&rn(this.db,e,n.usage),xs(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),rn(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}`);rn(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{Po(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>Mo(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??Wo(),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,Je(e.command),n,e.holder_pid??null,r,s,Je(e.meta),e.launch_source??e.kind,e.request_payload??null,e.parent_invocation_id??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return Ac(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,Je(n.result_summary),Je(n.error),n.team_chat_log_id??null,Je(n.meta),Je(n.config_warnings),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Os(this.db,i),i.status==="cancelled"&&i.signal!==null&&i.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(i.team_chat_log_id,i.error??`holder received ${i.signal}`),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,Je(r.result_summary),Je(r.error),r.team_chat_log_id??null,Je(r.meta),Je(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 Os(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 Nc(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(xc(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:(Oc(this.db,e,pt(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=j();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Je(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 Os(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||xs(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 Cc(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:wc(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&&Sr(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&&Sr(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&&Sr(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&&(Sr(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(Tr,vr(e,n),Er);return r===void 0?null:fc(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&Fo(this.db,r,!0),this.stmts.upsertRuntimeState.run(Tr,vr(e.teamfile,e.alias),Er,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&Sc(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(Tr,vr(e,n),Er,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(Tr,vr(e,n),Er);return i.changes===1&&Fo(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:Mv(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&&!Uv(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Mc(),holder_pid:process.pid,holder_host:Wo(),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 Fc(t,e,n){let r=jc(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 jc(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 jc(t){let e=Dv(t),n=e===null?null:Pv(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))Ds(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function Dv(t){try{let e=JSON.parse(t);return Ds(e)?e:null}catch{return null}}function Pv(t,e){let n=t[e];return Ds(n)?n:null}function Ds(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Mv(t){try{let e=JSON.parse(t);return!Ds(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 Uv(t,e){return t===null?!0:t.holder_host===Wo()?!$e(t.holder_pid):t.last_heartbeat<e}function Fv(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 "+rr+" ORDER BY created_at ASC, id ASC"),listTeamChatLogSinceId:t.prepare("SELECT * FROM team_chat_log WHERE id > ? AND "+rr+" 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 "+rr),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
- `),...pc(t),...cc(t)}}function jv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}import{homedir as $v}from"node:os";import{join as Hc}from"node:path";var Wv=".lmctl",Hv="state.db";function Bv(t=process.env){let e=t.LMCTL_HOME;return e!==void 0&&e.length>0?e:Hc(t.HOME||$v(),Wv)}function Bc(t=process.env){return Hc(Bv(t),Hv)}function Un(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:Bc(e)}function Xc(t,e=process.env){return e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0&&e.LMCTL_DB!==Bc(e)?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}import{isAbsolute as Xv,resolve as qc,join as Jc}from"node:path";function _e(t){try{if(t instanceof Error){let e=t.message;if(typeof e=="string")return e}return String(t)}catch{return"Unprintable error"}}function Ps(t){return{...t,status:"ok",error:null}}function Z(t,e,n){return{...n,status:"error",code:t,error:e}}var Ho=new WeakMap;function Gc(t,e){let n=Ho.get(t);if(!n||t.closed)throw Error("Context is closed");return n.resources.add(e),()=>n.resources.delete(e)}function br(t){let e=Ho.get(t);if(!e)throw Error("Unknown context");return e.dal()}var qv=new WeakMap;var Vc=new WeakSet;function Kc(t){return t!==null&&typeof t=="object"&&Vc.has(t)}function Yc(t){try{if(!t||typeof t!="object"||Array.isArray(t))return Z("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(_=>!n.includes(_)))return Z("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!Xv(e.cwd))return Z("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...e.env});if(Object.values(r).some(_=>_!==void 0&&typeof _!="string"))return Z("invalid_argument","Environment values must be strings or undefined");for(let _ of["onProgress","onWarning","clock"])if(e[_]!==void 0&&typeof e[_]!="function")return Z("invalid_argument",_+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return Z("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return Z("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return Z("invalid_argument","pid must be a positive integer");let s=qc(e.cwd),i=r.LMCTL_HOME||(r.HOME?Jc(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(i?Jc(i,"state.db"):void 0)))return Z("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,d,u,c=new AbortController,m=new Set,p=_=>{if(l){try{l.close()}catch(f){_.push(_e(f))}l=void 0}},g=Object.freeze({status:"ok",error:null,pid:e.pid,signal:c.signal,env:r,cwd:s,dbPath:qc(s,Un(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 _;return d=new Promise(f=>{_=f}),a=!0,c.abort(),(async()=>{let f=[],h=0;for(let E of[...m])try{await E.close(),h++,m.delete(E)}catch(y){f.push(_e(y))}f.length||p(f),_({released:h,errors:f})})(),d},finalizeSync(_){if(u)return u;a=!0;let f=[],h={released:0,errors:f};u=h,d??=Promise.resolve(h);for(let E of[...m])try{E.finalizeSync(_),h.released++,m.delete(E)}catch(y){f.push(_e(y))}return c.abort(_),f.length||p(f),h}});return Ho.set(g,{resources:m,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=et({path:g.dbPath})}}),Vc.add(g),qv.set(g,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),g}catch(e){return Z("invalid_argument","Invalid context: "+_e(e))}}import{readdirSync as MA}from"node:fs";import{join as m_,resolve as UA}from"node:path";import{randomUUID as FA}from"node:crypto";import{performance as c_}from"node:perf_hooks";var ln="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model.";function Rr(t){return t!=="gemini"}function Ms(t){if(!Rr(t))throw new Error(ln)}var Fn=class extends Error{};async function ft(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 Fn(`session identity mismatch: expected "${n}", got "${t.sessionId}"`);let i=await t.sendTurn(r,s);if(i.sessionId!==n)throw Object.assign(new Fn(`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 Bo(t,e){Ms(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 g=new AbortController;u=g;let _=()=>g.abort();p.signal?.addEventListener("abort",_,{once:!0});try{let f=i?await ft(i,t.name,a,m,{...p,signal:g.signal}):await t.sendTurn(m,{...e,...p,signal:g.signal,requireResume:n,timeoutMs:e.timeoutMs??0});if(g.signal.aborted)throw Object.assign(new Error("Aborted"),{usage:f.usage,sessionId:f.sessionId});if(n&&f.sessionId!==e.sessionId)throw d=!0,Object.assign(new Fn(`session identity mismatch: expected "${e.sessionId}", got "${f.sessionId}"`),{usage:f.usage,sessionId:f.sessionId});return f.status!=="empty"&&f.status!=="stalled"&&l++,f}catch(f){throw g.signal.aborted&&i&&t.protocol?.persistentCancellation==="session"&&(d=!0),f instanceof Fn&&(d=!0,await i?.close()),f}finally{p.signal?.removeEventListener("abort",_),u=void 0}},close(){return c||(d=!0,u?.abort(),c=i?i.close():Promise.resolve()),c}}}import{platform as zc}from"node:os";import{realpathSync as Jv}from"node:fs";import{resolve as Gv}from"node:path";function Xo(t){let e=Gv(t);try{return Jv(e)}catch{return e}}var Us=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=Xo(e.workspace);i=i.filter(a=>Xo(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=zc()==="darwin"||zc()==="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 Dt(t){let e=new Us;for(let n of t)e.registerAdapter(n);return e}import{join as sa}from"node:path";import{mkdir as aS}from"node:fs/promises";var Ie=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,Vv=(t,e)=>t===null||e===null?null:Ie(t+e),qo=(t,e)=>JSON.stringify([t,e]),Jo=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(qo(e,n))}turn(e,n=""){return new Go(this,e,n)}};function Vo(){return new Jo}var Go=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(qo(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(qo(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=>Ie(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=Ie(e.emittedAtMs)??u,m=Ie(e.ordinal)??Ie(r.ordinal),p=JSON.stringify([this.thread,this.id,d,l(a.last),c,u,m]),g=c!==null||m!==null;if(g&&this.session.seen.has(p))return!1;g&&this.session.seen.add(p);let _=a.last,f=Ie(_.inputTokens),h=Ie(_.cachedInputTokens),y={source:"wire",inputUncached:f===null||h===null||h>f?null:f-h,cacheRead:h,cacheWrite:Ie(_.cacheWriteInputTokens??0),output:Ie(_.outputTokens),reasoning:Ie(_.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:Ze([_.inputTokens,_.cachedInputTokens,_.cacheWriteInputTokens,_.outputTokens,_.reasoningOutputTokens])||f!==null&&h!==null&&h>f};[y.inputUncached,y.cacheRead,y.cacheWrite,y.output].includes(null)&&(y.reason="counter_not_exposed");let T=r.model??_.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],R=y[v];b!==null&&R!==null&&Ie(b+R)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[v]=Vv(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 Ko(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 Yo(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 Qc(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=Ie(a.input_tokens),d=Ie(a.cached_input_tokens);s={source:"wire",inputUncached:l===null||d===null||d>l?null:l-d,cacheRead:d,cacheWrite:0,output:Ie(a.output_tokens),reasoning:Ie(a.reasoning_output_tokens),modelReported:typeof o.model=="string"?o.model:null,providerCostUsd:null,reason:null,invalidCounters:Ze([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(Yo(t)||Ko(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 mm}from"node:child_process";import{mkdirSync as qw}from"node:fs";import{readFileSync as Kv,writeFileSync as NO,mkdirSync as xO}from"node:fs";import{join as Yv,dirname as LO}from"node:path";import{homedir as zv}from"node:os";var zo={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:""}}}},Qv={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 Zv(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function ew(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=Zv(t.slice(e+1).trim());return n?{key:n,value:r}:null}function tw(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function Fs(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function nw(){return Yv(zv(),".lmctl","config.toml")}function js(t){let e=t??nw(),n;try{n=Kv(e,"utf-8")}catch{return{tools:{}}}return rw(n)}function Zc(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 rw(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=Zc(i.min);m!==null&&(c.min=m)}if(i.max!==void 0){let m=Zc(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=tw(m);if(p!==null){if(o=!0,l(),p.startsWith("tool.")){let _=".profile.",f=p.indexOf(_);f!==-1?s={kind:"tool",tool:p.slice(5,f),profile:p.slice(f+_.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 g=ew(m);g&&s.kind!=="none"?i[g.key]=g.value:g&&!o&&(a[g.key]=g.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 sw(t,e,n){if(!n)return"";let r=t.tools[e]??zo[e],s=r?.profiles?.[n]?.flags??zo[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 em(t,e){return!!t.tools[e]}function tm(t,e,n,r,s){let i=t.tools[e]??zo[e],o;if(i?.agent){let l=Fs(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=Qv[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(Fs).join(" ");o=`printf '%s\\n' ${Fs(r)} | ${u}`}else o=d.map(Fs).join(" ")}let a=sw(t,e,s);return a&&(o+=" "+a),o}function nm(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 iw="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: ${iw}`,$s=`send this exact lmctl seed instruction: "${V}"`,ow=`
1710
-
1711
- Teamfile `,aw=`
1712
-
1713
- After this seed finishes, use \`lmctl prompt `,lw=' <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 rm(t){let e=t?.prompt??V;if(t?.teamfile!==void 0){let n=t.teamfileContent??"";e=`${V}${ow}${t.teamfile}:
1714
- ${n}${aw}${JSON.stringify(t.teamfile)}${lw}`}return t?.flightToken&&(e=`${t.flightToken.startsWith("[lmctl-seed:")?t.flightToken:`[lmctl-seed:${t.flightToken}]`}
1715
- ${e}`),e}import{existsSync as Hw}from"node:fs";import{readFileSync as dm,appendFileSync as xw,mkdirSync as Ow,existsSync as JO,readdirSync as GO,unlinkSync as VO}from"node:fs";import{join as Hs,dirname as Lw}from"node:path";import{homedir as Dw}from"node:os";import{randomUUID as dw}from"node:crypto";import{chmodSync as sm,mkdirSync as uw,readdirSync as cw,statSync as mw,unlinkSync as pw,writeFileSync as fw}from"node:fs";import{homedir as gw,tmpdir as _w}from"node:os";import{join as kr}from"node:path";function dn(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var hw=500,yw=1e6,Tw=50,Ew=20*1024*1024,vw=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,ww=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi;function Sw(t){return dn(t.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\|$)/g,"")).replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g,"\uFFFD")}function Ir(t){return Sw(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(ww,"$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 bw(){let t=process.env.LMCTL_HOME||(process.env.NODE_ENV==="test"?kr(_w(),`lmctl-test-${process.pid}`,".lmctl"):kr(process.env.HOME||gw(),".lmctl"));return kr(t,"provider-errors")}function Rw(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 kw(t,e){try{let n=cw(t).filter(s=>vw.test(s)).sort().map(s=>{let i=kr(t,s);return{path:i,size:mw(i).size}}),r=n.reduce((s,i)=>s+i.size,0);for(let s=0;s<n.length&&(n.length-s>Tw||r>Ew);s++){let i=n[s];i.path!==e&&(pw(i.path),r-=i.size)}}catch{}}function Iw(t,e){let n=bw(),r=kr(n,`stderr-${Date.now()}-${process.pid}-${dw()}.log`);try{uw(n,{recursive:!0,mode:448}),sm(n,448);let s=`[${new Date().toISOString()}] provider=${e}
1718
- ${Rw(t,yw,"provider output not saved")}
1719
- `;return fw(r,s,{encoding:"utf8",flag:"wx",mode:384}),sm(r,384),kw(n,r),{path:r,saved:!0}}catch{return{path:r,saved:!1}}}function Aw(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 gt(t){return Array.from(t)}function Cw(t,e){let n=gt(t),r=`\u2026[${n.length} characters clipped]\u2026`,s=Math.max(2,e-gt(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-gt(a).length-gt(l).length;return`${a}\u2026[${d} characters clipped]\u2026${l}`}function Nw(t,e){let n=t.join(`
1720
- `);if(gt(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=gt(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:Cw(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(g=>g.line)),p.join(`
1721
- `)};for(let c=0;c<a;c++){let m=[...l,t[c]],p=u(m);if(gt(p).length>e)break;l=m,d=p}return l.length===0&&(d=u(l)),gt(d).length>e&&(d=gt(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=Ir(t),r=e.fullOutput===void 0?n:Ir(e.fullOutput),{lines:s,duplicates:i}=Aw(n.trim().split(/\r\n|\r|\n/)),o=Nw(s,Math.max(64,e.maxChars??hw)),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=Iw(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 im(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 om(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 jn(t,e){return e===""?t:`${t}:${e.includes(`
1728
- `)?`
1729
- `:" "}${e}`}var um=!1,am=!1,lm=0,Pw=5e3;function Zo(){return Hs(Dw(),".lmctl")}function ue(){if(um||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-lm>=Pw&&(am=jw(),lm=t),am}function Mw(){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 Ws=null;function Qo(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 Ir(t);if(Array.isArray(t))return t.map(r=>Qo(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]=Qo(i,s,n);return n.delete(t),r}return t}function Uw(t){return Qo(t)}function We(t,e){if(e?.verbose){if(!um)return}else if(!e?.always&&!ue())return;try{Fw();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,...Uw(t)};xw(Ws,JSON.stringify(n)+`
1730
- `)}catch{}}function Fw(){if(!Ws){let e=Mw().slice(0,13).replace("T","-");Ws=Hs(Zo(),`debug-${e}.log`)}Ow(Lw(Ws),{recursive:!0})}function He(...t){We({event:"legacy",msg:t.join(" ")})}function we(...t){We({event:"legacy",msg:t.join(" ")},{verbose:!0})}function U(t){We(t,{always:!0})}function jw(){return $w()||Ww()}function $w(){try{let t=dm(Hs(Zo(),"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 Ww(){try{let t=dm(Hs(Zo(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var ea="LMCTL_SELF_SESSIONID",Bw="LMCTL_LAUNCH_SOURCE";function cm(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&&!Hw(e);if(!n&&!r)return t;U({event:"claude_execpath_sanitized",reason:n?"wrong_platform_exe":"missing_file",value:e,platform:process.platform});let s={...t};return delete s.CLAUDE_CODE_EXECPATH,s}function $n(t,e){let n={...t??process.env,PWD:e};return delete n.OLDPWD,n}function Xw(t,e){return e===void 0||e.length===0?t:{...t??process.env,[ea]:e}}function Se(t,e,n,r="chat"){return{...Xw($n(t,e),n),[Bw]:r}}var Wn=class extends Error{constructor(e,n){super(e,n),this.name=this.constructor.name}},ce=class extends Wn{},he=class extends Wn{constructor(n,r,s=null,i){super(n);this.exitCode=r;this.signal=s;this.stderr=i}};var Bs=class extends Wn{rpcCode;rpcData;constructor(e,n,r){super(e),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}};function Ar(t,e){let n;if(e&&typeof e=="object"){let r=e.code;typeof r=="number"&&(n=r)}return new Bs(t,n,e)}var un=class t extends Error{cancelReason;constructor(e,n){super(e),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,t.prototype)}},Q=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"}):(qw(e,{recursive:!0}),new Promise(r=>{let s;try{try{n?.onDispatch?.()}catch{}s=mm(this.binary,this.seedArgsFor(n),{cwd:e,env:$n(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=dn(o).trim(),c=dn(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:$s,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&&em(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:f=>{l=f,r.onUsage?.(f)},onSessionId:f=>{f&&(d=f),r.onSessionId?.(f)},onDelta:f=>{a+=f,c(),r.onDelta?.(f)},onProgress:f=>{f.kind!=="api_retry"&&c(),r.onProgress?.(f)}},g=this.transportFn(n,p).then(f=>(m(),{...f,status:f.status??"ok"})).catch(f=>{throw m(),o==="external"?Object.assign(new un("Turn cancelled","external"),{usage:f.usage??l,sessionId:d}):f}),_=new Promise(f=>{u=f});return Promise.race([g,_])}runOneShotAgent(e,n,r){let s=tm(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:nm(n.env),d=mm(s,{shell:!0,cwd:n.cwd,env:Se(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,c=!1,m,p,g=!1,_=null,f=null,h=()=>{clearTimeout(m),m=setTimeout(()=>{!Yo(y)&&!Ko(y)&&v(_,f)},100)},E=l>0?setTimeout(()=>{c=!0,d.kill(),this.name==="codex"&&v(null)},l):void 0,y="",T="";if(d.stdout?.on("data",b=>{let R=b.toString();y+=R,n.onDelta?.(R),g&&!u&&h()}),d.stderr?.on("data",b=>{T+=b.toString(),g&&!u&&h()}),n.signal){if(n.signal.aborted)return clearTimeout(E),d.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>d.kill(),{once:!0})}let v=(b,R=null)=>{if(u)return;u=!0,clearTimeout(E),clearTimeout(m),clearTimeout(p),this.name==="codex"&&(d.stdout?.destroy(),d.stderr?.destroy());let S=Date.now()-i,O=this.name==="codex"?Qc(y):{};O.usage&&n.onUsage?.(O.usage),O.sessionId&&n.onSessionId?.(O.sessionId);let C=k=>Object.assign(k,{usage:O.usage,sessionId:O.sessionId??n.sessionId});if(this.name==="codex"&&n.signal?.aborted)a(C(new un("Turn cancelled","external")));else if(c)a(C(new Error(`Agent command timed out after ${l}ms`)));else if(b===0||b===null&&R===null)o({text:y.trim(),sessionId:O.sessionId??n.sessionId,durationMs:S,...O.usage?{usage:O.usage}:{}});else{let k=T.trim();a(C(new he(k?de(k,{provider:this.name}):R?`Agent command terminated by ${R}`:`Agent command exited with code ${b}`,b,R,T)))}};this.name==="codex"?(d.on("close",(b,R)=>v(b,R)),d.on("exit",(b,R)=>{u||(g=!0,_=b,f=R,h(),p=setTimeout(()=>v(b,R),5e3))})):d.on("exit",(b,R)=>v(b,R)),d.on("error",b=>{u||(u=!0,clearTimeout(E),clearTimeout(m),clearTimeout(p),a(b))})})}};var Te=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,Pt=t=>typeof t=="string"&&t.length>0&&t!=="<synthetic>"?t:null,pm=()=>({source:"wire",inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:null});function fm(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&&Te(i+o)===null&&(e.invalidCounters=!0),e[s]=i===null||o===null?null:Te(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 Xs=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=Pt(r?.first?.id),i=Pt(r?.last?.id),o=Pt(r?.stream?.id),a=Pt(r?.stream?.kind),l=s&&i&&o&&a?JSON.stringify([this.session,a,o,s,i]):Pt(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=Te(e.promptTokens),c=Te(d.outputTokens),m=Te(d.cacheReadTokens),p=Te(d.cacheWriteTokens),g=u===0,_=m??(g?0:null),f=p??(g?0:null),h=u!==null&&_!==null&&f!==null&&_+f<=u?u-_-f:null,E=(_??0)>0||(f??0)>0,y={...pm(),inputUncached:h,cacheRead:_,cacheWrite:f,output:c,reasoning:Te(d.reasoningTokens),modelReported:Pt(e.modelId),invalidCounters:Ze([e.promptTokens,e.totalTokens,d.inputTokens,d.cachedTokens,d.cacheReadTokens,d.cacheWriteTokens,d.outputTokens,d.reasoningTokens])||E||h===null||c===null||Te(e.totalTokens)!==null&&u!==null&&c!==null&&e.totalTokens!==u+c||Te(d.reasoningTokens)!==null&&c!==null&&d.reasoningTokens>c};return this.parts.push(y),!0}usage(){return fm(this.parts)}},Hn=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=>Te(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=>Te(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=Te(d.turn)!==null&&Te(d.step)!==null?["step",d.turn,d.step]:Pt(d.message?.id)?["message",d.message.id]:["seq",l.seq],p=JSON.stringify([this.session,...m]);if(this.seen.has(p))continue;let g=a.get(p);(!g||u||!g.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,{...pm(),inputUncached:Te(m.inputTokens),cacheRead:Te(m.cacheReadTokens),output:Te(m.outputTokens),reasoning:Te(m.reasoningTokens),modelReported:Pt(c.message?.source?.model),invalidCounters:o||[m.inputTokens,m.cacheReadTokens,m.outputTokens].some(p=>Te(p)===null)||Ze([m.inputTokens,m.cacheReadTokens,m.outputTokens,m.reasoningTokens])||Te(m.reasoningTokens)!==null&&Te(m.outputTokens)!==null&&m.reasoningTokens>m.outputTokens})}}lastUsage(){let e=[...this.parts.values()].at(-1);return e?{...e}:void 0}usage(){let e=fm([...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 iS}from"node:child_process";import{randomBytes as oS}from"node:crypto";import{realpath as Gs}from"node:fs/promises";import{createInterface as Jw}from"node:readline";var Gw=1;function Mt(t,e){let n=e.protocol??"acp",r=Jw({input:t.stdout}),s=new Map,i=(a,l={},d)=>new Promise((u,c)=>{let m=Gw++;s.set(m,{resolve:u,reject:c,onResponse:d});let p=JSON.stringify({jsonrpc:"2.0",id:m,method:a,params:l});We({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);U({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(We({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(Ar(`${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"){U({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)`}});We({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 ce(`${n.toUpperCase()} RPC channel closed`)){r.close();for(let l of s.values())l.reject(a);s.clear()}}}import*as na from"node:child_process";var Vw=1e3;function Kw(t){if(typeof na.spawnSync=="function")try{na.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function gm(t){return t.exitCode!==null||t.signalCode!==null}function ta(t,e){return gm(t)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,t.removeListener("exit",s),n(!1))},e);t.once("exit",s)})}async function te(t,e={}){let n=Date.now(),r=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??Kw;if(gm(t))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await ta(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 ta(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await ta(t,Vw)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var Yw=2e3,qs=8*60*60*1e3,zw=5e3,Qw=1e3,Zw=50,ra=Symbol("check-timed-out");async function Js(t,e,n){if(typeof t=="boolean")return t;let r,s;try{return await Promise.race([t,new Promise(i=>{r=setTimeout(()=>i(ra),e),r.unref?.(),n!==void 0&&(s=()=>i(ra),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function tt(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();eS(t,e,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function eS(t,e,n,r){let s=t.pollMs??Yw,i=t.maxHoldMs??qs,o=t.settleMs??zw,a=t.backgroundGraceMs??Qw,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 Js(t.hasOutstandingWork(),c,e.signal)}catch{return u("check-error")}if(m===ra)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 _=a-(Date.now()-n);await new Promise(f=>setTimeout(f,Math.max(0,Math.min(s,Zw,_))).unref?.());continue}if(!l||o<=0)return u("cleared");d===null&&(d=Date.now(),we(`${e.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let g=Math.max(d,e.lastEventAtMs());if(!e.isTurnInFlight()&&Date.now()-g>=o)return u("cleared")}if(l||(l=!0,t.onHold?.(),we(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return U({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-n}),u("max-hold");let p=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(g=>setTimeout(g,p).unref?.())}}function _m(t){ue()&&We({event:"legacy",msg:`[debug] ${t}`},{always:!0})}var tS={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},nS={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 Ut(t,e){let n=nS[t];if(n)return n[e]??n.yolo}var rS=new Set(["codex","opencode","kimi","dsh","hermes","pi","miniplayer","muse"]);function sS(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 Ee(t,e,n="yolo"){if(rS.has(t)){_m(`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"?Ut(t,"plan"):tS[t];if(!r){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw U({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ce(s)}if(!sS(e,r)){let s=r.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw U({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:n,args:e.join(" "),message:i}),new ce(i)}_m(`YOLO ${t} [mode=${n}]: argv flag '${r.join(" ")}'`)}function Cr(){let t=oS(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 Vs(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]:[]];Ee("muse",n,t.permissionMode??"yolo");let r=iS(t.progPath??"muse",n,{cwd:t.cwd,env:Se(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,g=om(),_=Date.now(),f=t.sessionId;r.stderr.setEncoding("utf8"),r.stderr.on("data",w=>{g.append(w)});let h=(w,I,A)=>{if(s===w){if(s=void 0,w.id&&o.add(w.id),I){let x=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:x?{...x,outcome:w.outcome}:void 0,sessionId:f})}else A&&(A.usage=w.usage.usage());w.cleanup(),w.drained(),w.settled||(w.settled=!0,I?w.reject(I):(p++,w.resolve(A)))}},E=w=>{a||(a=w,s&&h(s,a),T.close(a),!m&&!d&&te(r,{softDelayMs:t.closeTimeoutMs??2e3,killDelayMs:t.closeTimeoutMs??2e3}).catch(()=>{}))},y=(w,I)=>{let A=I.params;if(!A||A.sessionId!==f)return;let x=I.method;if(x==="view/gap"||x==="session/closed"){E(new Error(`Muse ${x}: the conversation cannot continue without reopening`));return}if(x==="turn/unqueued"&&A.turnId===w.id){w.outcome="cancelled",h(w,new un("Muse queued turn cancelled","external"));return}x==="turn/started"&&A.turnId===w.id&&(w.queued=!1);let N=A.item,D=A.turnId??N?.turnId;if(D&&D!==w.id||x==="session/tokenUsage"&&(w.settled||A.turnId!==w.id||!w.usage.event(A,w.id)))return;w.opts.onEvent?.(I);let L={kind:"other",raw:I};if(["item/started","item/updated","item/completed"].includes(x)&&N?.turnId===w.id&&typeof N.itemId=="string"){let P=w.items.get(N.itemId);if(P&&typeof N.revision=="number"&&N.revision<=P.revision)return;w.items.set(N.itemId,{...N}),(N.kind==="toolCall"||N.kind==="userShell")&&x!=="item/updated"?L={kind:x==="item/completed"?"tool_result":"tool_use",id:N.itemId,tool:N.tool??N.kind,summary:N.failureReason??N.fallbackText,...x==="item/completed"?{status:N.status==="completed"?"ok":"error"}:{},...N.durationMs!==void 0?{elapsedMs:N.durationMs}:{},raw:I}:N.kind==="reasoning"?L={kind:"thinking",raw:I}:N.kind==="agentMessage"&&(L={kind:"text",raw:I})}else if(x==="item/delta"&&typeof A.itemId=="string"&&typeof A.delta=="string"){let P=w.items.get(A.itemId);if(!P)return;P.kind==="agentMessage"&&(A.field===void 0||A.field==="text")?(P.text=(P.text??"")+A.delta,w.cancelled||w.opts.onDelta?.(A.delta),L={kind:"text",raw:I}):P.kind==="reasoning"&&(L={kind:"thinking",raw:I})}if(w.cancelled||w.opts.onProgress?.(L),x!=="turn/completed"||A.turnId!==w.id)return;if(!["completed","failed","cancelled"].includes(A.terminal)){E(new Error(`Muse returned an unknown turn terminal: ${String(A.terminal)}`));return}if(w.cancelled||A.terminal==="cancelled"){w.outcome="cancelled",h(w,new un("Muse turn cancelled",w.cancelled?"external":"provider"));return}if(A.terminal!=="completed"){w.outcome="error",h(w,new Error(A.error?.message??A.reason??`Muse turn ended with ${String(A.terminal)}`));return}let $=[...w.items.values()].filter(P=>P.kind==="agentMessage");h(w,void 0,{text:$.map(P=>typeof P.text=="string"?P.text:"").join(`
1736
- `),sessionId:f,durationMs:typeof A.durationMs=="number"?A.durationMs:Date.now()-w.started,stopReason:A.terminal,...$.some(P=>P.truncated)?{warnings:["Muse reported a truncated response; inspect the native transcript for complete content"]}:{}})},T=Mt(r,{provider:"muse",protocol:"msp",onProtocolError:E,onNotification:w=>{if(_=Date.now(),w.method==="view/gap"||w.method==="session/closed"){w.params?.sessionId===f&&!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,A=Cr())=>(await T.sendRpc(w,{...I,commandId:A})).result,b=w=>{!w.id||w.interruptSent||s!==w||(w.interruptSent=!0,v("turn/interrupt",{sessionId:f,turnId:w.id}).catch(I=>{s===w&&E(I instanceof Error?I:new Error(String(I)))}))},R=w=>{!w.id||w.unqueueSent||s!==w||(w.unqueueSent=!0,v("turn/unqueue",{sessionId:f,turnId:w.id}).catch(I=>{let A=I instanceof Error?I.message:String(I);/already started|not queued|launch boundary|turn is running/i.test(A)?(w.queued=!1,b(w)):s===w&&E(I instanceof Error?I:new Error(A))}))},S=w=>{w.queued?R(w):b(w)};r.on("error",w=>E(new Error(`Unable to start Muse: ${w.message}`)));let O=()=>{d||m||a||c||(c=!0,te(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(jn(`Muse exited (${I??w}) after ${p} completed prompt(s)`,g.text().trim()?de(g.text(),{provider:"muse"}):""))),s&&h(s,new Error("Muse session closed"))});let C=()=>{if(l)return l;d=!0;let w=!!s;return s&&(s.cancelled=!0,S(s)),l=(async()=>{m||(await new Promise(I=>tt(u?t.holdOpen:void 0,{isAborted:()=>w,hasChildExited:()=>m,isTurnInFlight:()=>!!s,lastEventAtMs:()=>_,closeStdin:()=>{r.stdin.end(),I()},label:"muse"})),await te(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},k=()=>{E(new Error("Aborted")),C()};t.signal?.addEventListener("abort",k,{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 Gs(w.museHome)!==await Gs(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",x=(t.create?await v("session/start",{sessionId:f,workspaceRoot:t.cwd,approvalMode:I,...t.model?{modelId:t.model}:{}}):await v("session/resume",{sessionId:f,excludeItems:!0}))?.session;if(x?.sessionId!==f)throw new Error(`Muse did not return requested session "${f}"`);if(typeof x.workspaceRoot!="string"||await Gs(x.workspaceRoot)!==await Gs(t.cwd))throw new Error("Muse session belongs to a different working directory");if(x.activeTurnId||x.status!=="idle")throw new Error(`Muse session is not idle (${String(x.status)})`);if((await v("session/setApprovalMode",{sessionId:f,mode:I}))?.effectiveMode?.mode!==I)throw new Error("Muse did not apply the requested approval mode");if(!t.create&&t.model&&x.modelId!==t.model&&(await v("session/setModel",{sessionId:f,model:{modelId:t.model,...x.providerId?{providerId:x.providerId}:{}}}))?.status!=="accepted")throw new Error("Muse did not accept the requested model");u=!0}catch(w){throw await C(),a??w}finally{t.signal?.removeEventListener("abort",k)}return{provider:"muse",sessionId:f,get completedTurns(){return p},close:C,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((A,x)=>{let N,D=new Promise(P=>{N=P}),L={usage:new Xs(f,i),commandId:Cr(),events:[],items:new Map,opts:I,started:Date.now(),cancelled:!1,interruptSent:!1,unqueueSent:!1,queued:!1,settled:!1,resolve:A,reject:x,drain:D,drained:N,cleanup:()=>{}};s=L;let $=()=>{L.cancelled=!0,L.settled=!0,x(Object.assign(new Error("Aborted"),{usage:L.usage.usage(),sessionId:f})),S(L)};L.cleanup=()=>I.signal?.removeEventListener("abort",$),I.signal?.addEventListener("abort",$,{once:!0}),v("turn/start",{sessionId:f,input:[{type:"text",text:w}],...t.effort?{reasoningEffort:t.effort}:{}},L.commandId).then(P=>{if(s===L){if(P?.commandId!==L.commandId||P.status!=="accepted"||!["started","queued"].includes(P.disposition)||typeof P.turnId!="string"||P.turnId.length===0||o.has(P.turnId)){E(new Error("Muse did not admit a fresh turn; refusing ambiguous dispatch"));return}L.id=P.turnId,L.queued=P.disposition==="queued",L.cancelled&&S(L);for(let oe of L.events)s===L&&y(L,oe);L.events=[]}},P=>{s===L&&h(L,P instanceof Error?P:new Error(String(P)))})})}}}function ia(t={}){let e=Zr(t.museDataHome),n=s=>({...s??process.env,XDG_DATA_HOME:e}),r=async(s,i)=>{if(i.bundleSession)return ft(i.bundleSession,"muse",i.sessionId,s,i);let o=i.sessionId||Cr(),a=await Vs({...i,sessionId:o,create:i.sessionId==="",env:n(i.env),expectedHome:sa(e,"muse")});try{return await a.sendTurn(s,i)}finally{await a.close()}};return new class extends Q{constructor(){super({provider:new Qr({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 Vs({...s,env:n(s.env),expectedHome:sa(e,"muse")})}async seed(s,i){await aS(s,{recursive:!0});let o=Cr(),a,l;try{a=await Vs({sessionId:o,cwd:s,create:!0,env:n(i?.env),signal:i?.signal,expectedHome:sa(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 vm}from"node:child_process";import{existsSync as wm}from"node:fs";function ym(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 Ks(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=aa(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&&(hm(s,n),typeof c.model=="string"&&(s.model=c.model))),p==="assistant"){let g=c.message;typeof g?.model=="string"&&g.model!=="<synthetic>"&&o.add(g.model);let _=g?.content;if(Array.isArray(_))for(let f of _)f.type==="text"&&f.text&&t.onText?.(f.text)}if(p==="result"&&(r=!0,e.push(c),s)){hm(s,typeof c.session_id=="string"?c.session_id:n);let g=c.usage,_=c.total_cost_usd,f=typeof _=="number"&&Number.isFinite(_)&&_>=0,h=s.cost,E=f&&h!==null&&_>=h?_-h:null;if(s.cost=f?_:null,g&&typeof g=="object"){let y=g.cache_creation,T=l(g.cache_creation_input_tokens),v=Ao({cacheWrite5m:y?.ephemeral_5m_input_tokens,cacheWrite1h:y?.ephemeral_1h_input_tokens},T),b=g.output_tokens_details,R={source:"wire",inputUncached:l(g.input_tokens),cacheRead:l(g.cache_read_input_tokens),cacheWrite:l(g.cache_creation_input_tokens),output:l(g.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:Ze([g.input_tokens,g.cache_read_input_tokens,g.cache_creation_input_tokens,g.output_tokens,b?.thinking_tokens])};if([R.inputUncached,R.cacheRead,R.cacheWrite,R.output].includes(null)&&(R.reason="counter_not_exposed"),!i)i=R;else{for(let S of["inputUncached","cacheRead","cacheWrite","output","reasoning","cacheWrite5m","cacheWrite1h","providerCostUsd"])i[S]=d(i[S]??null,R[S]??null);i.reason=i.reason||R.reason,i.invalidCounters||=R.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=Tm(e),c=ym(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 Tm(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(g=>typeof g=="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 oa(t){return{cost:t?null:0,model:null,sessionId:null,resultIds:new Set}}function hm(t,e){e&&(t.sessionId!==null&&t.sessionId!==e&&(t.cost=null,t.model=null),t.sessionId=e)}function aa(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 Ys}from"node:path";import{readdir as lS}from"node:fs/promises";var dS={claude:"claude",qwen:"qwen"};function Sm(){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 bm(){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 Rm(t){let n=t.message?.content;return Array.isArray(n)?n.some(r=>r?.type==="tool_use"):!1}function uS(t){let e=t.stderr.trim(),n=t.signal?`terminated by ${t.signal}`:`exited with code ${t.exitCode}`,r=`lmctl: ${t.tool} ${n} 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
- ${r}`:r}var cS={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]};function km(t){let e=t.tool||"claude",n=t.binaryPath||dS[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=Ut(e,s)??cS[e]??["--dangerously-skip-permissions"];if(r.push(...i),Ee(e,r,s),t.cwd&&!wm(t.cwd))throw U({event:"transport_error",provider:e,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),new ce(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});let o=Se(t.env,t.cwd,t.sessionId);return{tool:e,binary:n,args:r,spawnEnv:e==="claude"?cm(o):o}}function Im(t,e){return new Promise((n,r)=>{let s=Date.now(),i,o,a,l;try{({tool:i,binary:o,args:a,spawnEnv:l}=km(e))}catch(W){return r(W instanceof Error?W:new Error(String(W)))}let d=vm(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:l});d.stdin?.on("error",W=>{we(`stream-json: stdin pipe error, ignored (exit handler reports): ${W.message}`)});let u=!1;if(e.signal){if(e.signal.aborted)return u=!0,U({event:"transport_abort",provider:i,phase:"pre_spawn"}),te(d).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,U({event:"transport_abort",provider:i}),te(d).catch(()=>{}),r(Object.assign(new Error("Aborted"),{usage:D.usage()}))},{once:!0})}let c="",m=!1,p=!1,g=0,_=!1,f="",h="",E,y,T=null,v=null,b=!1,R=!1,S=Sm(),O=bm();function C(){E!==void 0&&(clearTimeout(E),E=void 0)}function k(){y!==void 0&&(clearTimeout(y),y=void 0)}let w=null;function I(){return m||u||D.sawResult()}function A(W){return W==="text_done"?S:O}async function x(W){if(W==="text_done"?E=void 0:y=void 0,I()||T!==null)return;w??=Date.now();let se=A(W);if(e.holdOpen){let dt=(e.holdOpen.maxHoldMs??qs)-(Date.now()-w),yn=dt>0?await Js(Promise.resolve(e.holdOpen.hasOutstandingWork()).catch(()=>!1),dt,e.signal):!1;if(I()||(W==="text_done"?E!==void 0:y!==void 0))return;if(yn===!0){U({event:"transport_stall_grace_deferred",provider:i,grace_kind:W,grace_ms:se,reason:"outstanding_dispatched_work"}),N(W);return}}v=W,T=W==="text_done"?`${i} finished responding but never emitted its closing result event (${se}ms of silence after its last message)`:`${i} went silent mid-turn and never emitted its closing result event (${se}ms of silence)`,U({event:"transport_stall_grace_fired",provider:i,grace_kind:W,grace_ms:se}),te(d).catch(()=>{})}function N(W){let se=setTimeout(()=>{x(W)},A(W));se.unref?.(),W==="text_done"?(C(),E=se):(k(),y=se)}let D=Ks({usageState:i==="claude"?oa(!!e.sessionId):void 0,onEvent:W=>{g=Date.now(),_=W.type!=="result",W.type==="system"&&W.subtype==="init"&&(h=W.session_id||h),W.type==="assistant"?(b=!Rm(W),R=b&&W.message?.stop_reason==="pause_turn"):(W.type==="result"||W.type==="user")&&(b=!1,R=!1),C(),i==="claude"&&b&&!R&&!D.sawResult()&&N("text_done"),k(),i==="claude"&&!D.sawResult()&&N("tool_use_silence"),e.onEvent?.(W)},onText:W=>{f+=W,e.onText?.(W)}});function L(){p||(p=!0,tt(e.holdOpen,{isAborted:()=>u,hasChildExited:()=>m,isTurnInFlight:()=>_,lastEventAtMs:()=>g,closeStdin:()=>{d.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function $(W){let se=D.sawResult();D.processLine(W);let re=D.usage();re&&e.onUsage?.(re),!se&&D.sawResult()&&L()}d.stdout?.on("data",W=>{c+=W.toString();let se=c.split(`
1745
- `);c=se.pop()||"";for(let re of se)$(re)});let P="";d.stderr?.on("data",W=>{P+=W.toString()}),d.on("error",W=>{U({event:"transport_error",provider:i,error_class:"TransportConnectionError",error_message:W.message}),r(new ce(`Failed to spawn ${o}: ${W.message}`,{cause:W}))}),d.on("exit",(W,se)=>{if(m=!0,C(),k(),u)return;c.trim()&&$(c);let re=D.finalize();if(re?.isError)U({event:"transport_error",provider:i,error_class:"Error",reason:"provider_result_error",error_message:re.errorMessage}),r(Object.assign(new Error(`${i} reported an error for this turn (no assistant output)`+(e.sessionId?` \u2014 session=${e.sessionId}`:"")+`: ${re.errorMessage??"unknown error"}`),{usage:re.usage,sessionId:re.sessionId}));else if(re)we(`stream-json: result ${re.result.slice(0,80)}${re.result.length>80?"...":""} (${re.durationMs}ms)`),n({result:re.result,sessionId:re.sessionId,durationMs:re.durationMs,numTurns:re.numTurns,usage:re.usage,exitCode:W});else if(T!==null&&v==="text_done"&&f.trim().length>0)U({event:"transport_stall_finalized",provider:i,reason:T,text_len:f.length}),n({result:f,sessionId:h||e.sessionId||"",durationMs:Date.now()-s,numTurns:1,exitCode:W,warnings:[T]});else if(T!==null&&v==="tool_use_silence"){let dt=P.trim()?`
1746
- ${de(P,{provider:i})}`:"",yn=`${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})`:"")+dt;U({event:"transport_error",provider:i,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:W,signal:se,stderr_summary:yn}),r(new he(yn,W,se,P))}else{let dt=T!==null?`${T} \u2014 and produced no usable content to fall back on`+(e.sessionId?` (session=${e.sessionId})`:"")+(P.trim()?`
1747
- ${de(P,{provider:i})}`:""):uS({tool:i,exitCode:W,signal:se,stderr:P});U({event:"transport_error",provider:i,error_class:"Error",reason:T!==null?"provider_stalled_no_content":"provider_no_result",exit_code:W,signal:se,stderr_summary:dt}),r(new he(dt,W,se,P))}});let oe=JSON.stringify({type:"user",message:{role:"user",content:t}});d.stdin?.write(oe+`
1748
- `),we(`stream-json: prompt sent (${t.length} chars)`)})}function mS(t){return t==="qwen"?[Ys(J,".qwen","projects")]:[Ys(J,".claude","projects")]}async function Em(t,e,n){let r=n??mS(t),s=null;for(let a of r){let l;try{l=await lS(a)}catch{continue}for(let d of l){for(let u of[Ys(a,d,`${e}.jsonl`),Ys(a,d,"chats",`${e}.jsonl`)])if(wm(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 je(s,5).catch(()=>[])).map(a=>a?.sessionId).find(a=>typeof a=="string"&&a.length>0);if(o!==e)throw new Error(`stream-json bundle: session file ${s} header does not match the requested session (expected "${e}", header carries ${o??"no sessionId"}) \u2014 the session was likely re-seeded externally; aborting instead of writing into the wrong session`)}async function Am(t){let{tool:e,binary:n,args:r,spawnEnv:s}=km(t),i=vm(n,r,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:s}),o=Date.now();i.stdin?.on("error",M=>{we(`stream-json bundle: stdin pipe error, ignored (exit handler reports): ${M.message}`)});let a={exited:!1,exitCode:null,signal:null,lastEventAtMs:0,turnActive:!1,completedTurns:0,closed:!1,closing:null},l=t.sessionId||"",d=e==="claude"?oa(!!t.sessionId):void 0,u=d?.resultIds??new Set,c=null,m="";i.stderr?.on("data",M=>{m+=M.toString()});let p="",g="",_=!1,f=!1,h=null,E=null,y=null,T,v,b=Sm(),R=bm(),S=null,O=[],C=()=>a.exited?Promise.resolve():new Promise(M=>{O.push(M)}),k=()=>new he(`stream-json bundle process (${e}) exited${a.signal!==null?` by ${a.signal}`:a.exitCode!==null?` with code ${a.exitCode}`:""} after ${a.completedTurns} completed prompt(s); the bundle cannot continue`,a.exitCode,a.signal,m);function w(){T!==void 0&&(clearTimeout(T),T=void 0)}function I(){v!==void 0&&(clearTimeout(v),v=void 0)}function A(){return a.exited||S===null||S.aborted||S.processor.sawResult()}function x(M){return M==="text_done"?b:R}async function N(M){if(M==="text_done"?T=void 0:v=void 0,A()||h!==null)return;y??=Date.now();let H=x(M);if(t.holdOpen){let fe=(t.holdOpen.maxHoldMs??qs)-(Date.now()-y),Ve=fe>0?await Js(Promise.resolve(t.holdOpen.hasOutstandingWork()).catch(()=>!1),fe,void 0):!1;if(A()||(M==="text_done"?T!==void 0:v!==void 0))return;if(Ve===!0){U({event:"transport_stall_grace_deferred",provider:e,grace_kind:M,grace_ms:H,reason:"outstanding_dispatched_work"}),D(M);return}}E=M,h=M==="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)`,U({event:"transport_stall_grace_fired",provider:e,grace_kind:M,grace_ms:H}),te(i).catch(()=>{})}function D(M){let H=setTimeout(()=>{N(M)},x(M));H.unref?.(),M==="text_done"?(w(),T=H):(I(),v=H)}let L=!1,$,P,oe=new Promise((M,H)=>{$=M,P=H});oe.catch(()=>{});let W=setTimeout(()=>{L||(L=!0,P(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);W.unref?.();function se(M){L||(L=!0,clearTimeout(W),M?P(M):$())}let re="";function dt(M){if(a.lastEventAtMs=Date.now(),M.type==="system"&&M.subtype==="init"){if(d&&typeof M.model=="string"&&(d.model=M.model),g=M.session_id||g,t.sessionId&&typeof M.session_id=="string"&&M.session_id.length>0&&M.session_id!==t.sessionId){let le=new Error(`stream-json bundle: provider resumed a different session (init reported "${M.session_id}", expected "${t.sessionId}")`);se(le),te(i).catch(()=>{});return}se()}let H=S?.processor.sawResult()??!0;M.type==="assistant"?(_=!Rm(M),f=_&&M.message?.stop_reason==="pause_turn"):(M.type==="result"||M.type==="user")&&(_=!1,f=!1),w(),e==="claude"&&a.turnActive&&_&&!f&&!H&&D("text_done"),I(),e==="claude"&&a.turnActive&&!H&&D("tool_use_silence")}function yn(){let M=S;if(M===null)return;let H=M.processor.finalize();if(H!==null){if(S=null,a.turnActive=!1,w(),I(),H.isError){U({event:"transport_error",provider:e,error_class:"Error",reason:"provider_result_error",error_message:H.errorMessage}),M.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,we(`stream-json bundle: result ${H.result.slice(0,80)}${H.result.length>80?"...":""} (${H.durationMs}ms)`),M.resolve({result:H.result,sessionId:H.sessionId||l,durationMs:H.durationMs,numTurns:H.numTurns,usage:H.usage})}}function Yl(M){if(!M.trim())return;let H;try{H=JSON.parse(M)}catch{return}let le=aa(H,g||l);if(le&&u.has(le))return;let fe=S;if(fe===null&&le&&(u.add(le),d&&(d.cost=null)),dt(H),fe!==null){let Ve=fe.processor.sawResult();fe.processor.processLine(M),fe.onEventForward?.(H),!Ve&&fe.processor.sawResult()&&yn()}}i.stdout?.on("data",M=>{re+=M.toString();let H=re.split(`
1749
- `);re=H.pop()||"";for(let le of H)Yl(le)}),i.on("error",M=>{if(c=new ce(`Failed to spawn ${n}: ${M.message}`,{cause:M}),U({event:"transport_error",provider:e,error_class:"TransportConnectionError",error_message:M.message}),se(c),S!==null){let H=S;S=null,a.turnActive=!1,H.reject(c)}}),i.on("exit",(M,H)=>{a.exited=!0,a.exitCode=M,a.signal=H,w(),I(),re.trim()&&Yl(re),se(a.exited&&!L?new he(`stream-json bundle: ${e} ${H?`terminated by ${H}`:`exited (code ${String(M)})`} before its init event`,M,H):void 0);let le=S;if(le!==null&&(S=null,a.turnActive=!1,!le.aborted))if(h!==null&&E==="text_done"&&p.trim().length>0)U({event:"transport_stall_finalized",provider:e,reason:h,text_len:p.length}),le.resolve({result:p,sessionId:g||t.sessionId||"",durationMs:Date.now()-le.startMs,numTurns:1,warnings:[h]});else if(h!==null&&E==="tool_use_silence"){let fe=m.trim()?de(m,{provider:e}):"";U({event:"transport_error",provider:e,error_class:"Error",reason:"provider_stalled_mid_turn",exit_code:M,signal:H,...fe?{stderr_summary:fe}:{}}),le.reject(new he(`${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})`:"")+(fe?`
1750
- ${fe}`:""),M,H,m))}else{let fe=k(),Ve=m.trim()?de(m,{provider:e}):"";U({event:"transport_error",provider:e,error_class:"Error",reason:h!==null?"provider_stalled_no_content":"provider_no_result",exit_code:M,signal:H,...Ve?{stderr_summary:Ve}:{}}),le.reject(new he(Ve?`${fe.message}
1751
- ${Ve}`:fe.message,M,H,m))}for(let fe of O.splice(0))fe()});try{t.sessionId&&await Em(e,t.sessionId,t.sessionFileRoots),await oe}catch(M){let H=c??(M instanceof Error?M:new Error(String(M))),le=t.closeTimeoutMs??2e3;throw await te(i,{softDelayMs:Math.min(1e3,le),killDelayMs:Math.min(1e3,le)}).catch(()=>{}),H}let E_=M=>new Promise(H=>{setTimeout(H,M).unref?.()});return{tool:e,get sessionId(){return l},get completedTurns(){return a.completedTurns},async sendTurn(M,H={}){if(a.closed||a.closing!==null)throw new Error(`stream-json bundle session (${e}) is closed`);if(a.exited)throw k();if(S!==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 le=()=>(a.closed=!0,te(i).catch(()=>{}),new Error("Aborted"));if(H.signal?.aborted)throw le();if(t.sessionId&&(await Em(e,t.sessionId,t.sessionFileRoots),a.exited))throw k();if(H.signal?.aborted)throw le();return p="",_=!1,f=!1,h=null,E=null,y=null,new Promise((fe,Ve)=>{let zl=Ks({usageState:d,resultIds:u,sessionId:g||l,onText:Ql=>{p+=Ql,H.onText?.(Ql)}}),Gi={processor:zl,resolve:fe,reject:Ve,startMs:Date.now(),aborted:!1,onEventForward:H.onEvent};S=Gi,a.turnActive=!0;let v_=()=>{Gi.aborted=!0,U({event:"transport_abort",provider:e}),a.closed=!0,te(i).catch(()=>{}),S===Gi&&(S=null,a.turnActive=!1),Ve(Object.assign(new Error("Aborted"),{usage:zl.usage()}))};H.signal?.addEventListener("abort",v_,{once:!0});let w_=JSON.stringify({type:"user",message:{role:"user",content:M}});i.stdin?.write(`${w_}
1752
- `),we(`stream-json bundle: prompt sent (${M.length} chars)`)})},close(){return a.closing!==null||(a.closing=(async()=>{if(a.closed=!0,!a.exited&&(t.holdOpen!==void 0?await new Promise(M=>{tt(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>a.exited,isTurnInFlight:()=>a.turnActive,lastEventAtMs:()=>a.lastEventAtMs,closeStdin:()=>{i.stdin?.end(),M()},label:e})}):i.stdin?.end(),!a.exited)){let M=t.closeTimeoutMs??2e3;await Promise.race([C(),E_(M)]),a.exited||await te(i,{stdinEnd:!1,softDelayMs:Math.min(1e3,M),killDelayMs:Math.min(1e3,M)}).catch(()=>{})}})()),a.closing}}}import{spawn as xm}from"node:child_process";import{createInterface as Om}from"node:readline";import{existsSync as pS,readFileSync as fS}from"node:fs";import{fileURLToPath as gS}from"node:url";function la(t={}){return[]}function da(t){return t==="plan"?"read-only":"danger-full-access"}function Cm(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function zs(){return{agentItems:new Map,resultText:""}}function Bn(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 Qs(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function Nm(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 ei(t,e){let n=Nm(t);return n.willRetry||(e.pendingCodexError=n.turnError),n}function ti(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 Lm(){return Cm(_S)}function Ft(t,e){we(`[codex:${t}] ${JSON.stringify(e)}`)}function hS(t){let e=t.stderr.trim(),n=`lmctl: codex app-server ${t.signal?`terminated by ${t.signal}`:`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 Dm(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?la():[];n.push(...s),ue()&&He(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:r,injected:s.length>0}));let i=t.permissionMode??"yolo",o=da(i);if(Ee("codex",n,i),t.cwd&&!pS(t.cwd))throw U({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),new ce(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:e,codexArgs:n,sandbox:o,permissionMode:i,spawnEnv:Se(t.env,t.cwd,t.threadId)}}function Pm(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 Mm(t,e){return new Promise((n,r)=>{let s,i,o;try{({binary:s,codexArgs:i,sandbox:o}=Dm(e))}catch(C){return r(C instanceof Error?C:new Error(String(C)))}let a=xm(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Se(e.env,e.cwd,e.threadId)}),l=Vo(),d=l.turn(e.threadId||""),u=C=>Object.assign(C,{usage:d.usage(),sessionId:_}),c=!1;if(e.signal){if(e.signal.aborted)return c=!0,U({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),te(a).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{c=!0,U({event:"transport_abort",provider:"codex"}),te(a).catch(()=>{}),r(u(new Error("Aborted")))},{once:!0})}let m=Om({input:a.stdout}),p=new Map,g=1,_=e.threadId||"",f="",h=!1,E=!1,y=Date.now(),T=zs(),v=Zs();function b(C,k={}){return new Promise((w,I)=>{let A=g++;p.set(A,{resolve:w,reject:I});let x=JSON.stringify({jsonrpc:"2.0",id:A,method:C,params:k});a.stdin?.write(x+`
1757
- `)})}function R(C,k={}){let w=JSON.stringify({jsonrpc:"2.0",method:C,params:k});a.stdin?.write(w+`
1758
- `)}m.on("line",C=>{let k;try{k=JSON.parse(C)}catch{return}if(typeof k.id=="number"&&p.has(k.id)){Pm(l,k);let x=p.get(k.id);if(p.delete(k.id),k.error){let N=k.error,D=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(k.error);x.reject(Ar(`codex app-server error: ${D}`,N))}else x.resolve(k);e.onEvent?.(k);return}let w=k.method;if(!w){e.onEvent?.(k);return}if(c||!d.event(k))return;let I=d.usage();if(I&&e.onUsage?.(I),w==="thread/started"){let N=k.params?.thread;N?.id&&(_=N.id,e.onSessionId?.(_))}let A=ue()?x=>{Ft("item.text/buffer-mismatch",{itemId:x.itemId,threadId:x.threadId??null,turnId:x.turnId??null,expectedFromItemText:x.expectedFromItemText,gotFromBuffer:x.gotFromBuffer,expectedLen:x.expectedFromItemText.length,gotLen:x.gotFromBuffer.length})}:void 0;if(w==="turn/started"){let x=k.params,N=x?.turn;N?.id&&(f=N.id),Bn(k,T,e.onDelta,A),ue()&&Ft("turn/started",{params:x??null})}if(ue()&&(w==="item/started"||w==="item/completed")){let x=k.params;x?.item?.type==="agentMessage"&&Ft(w,{params:x??null})}if(w==="item/started"||w==="item/agentMessage/delta"||w==="item/completed"){if(w==="item/agentMessage/delta"){let x=k.params;ue()&&Ft("agentMessage/delta",{params:x??null})}Bn(k,T,e.onDelta,A)}if(w==="turn/completed"){d.finish();let x=k.params;if(ue())for(let[D,L]of T.agentItems.entries())L.buffer&&Ft("turn/completed/unflushed-item",{itemId:D,phase:L.phase,bufferLen:L.buffer.length});Qs(T),ue()&&Ft("turn/completed",{params:x??null});let N=ti(k,v);N.shouldReject?(ue()&&Ft("turn/completed/terminal-reject",{message:N.turnError.message}),E=!0,h=!0,a.stdin?.end(),r(u(N.turnError))):(h=!0,a.stdin?.end())}if(w==="error"){let x=ei(k,v);if(ue()){let N=k.params,D=N?.error,L=typeof D?.message=="string"?D.message:"(no message)";Ft(x.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:x.willRetry,params:N??null})}}e.onEvent?.(k)});let S="";a.stderr?.on("data",C=>{S+=C.toString()});let O=C=>{U({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:C.message});let k=new ce(`Failed to spawn codex app-server: ${C.message}`,{cause:C});for(let w of p.values())w.reject(u(k));p.clear(),r(u(k))};a.on("error",O),a.stdin?.on("error",O),a.on("exit",(C,k)=>{if(c||E)return;if(h){n({result:T.resultText,usage:d.usage(),threadId:_,turnId:f,durationMs:Date.now()-y,exitCode:C});return}if(v.pendingCodexError){r(u(v.pendingCodexError));return}let w=hS({exitCode:C,signal:k,stderr:S});U({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:C,signal:k,stderr_summary:w}),r(u(new he(w,C,k,S)))}),(async()=>{try{if(await b("initialize",Lm()),R("initialized",{}),e.threadId)try{let C=b("thread/resume",{threadId:e.threadId,sandbox:o,approvalPolicy:"never",...e.model?{model:e.model}:{}}),k,w=new Promise((I,A)=>{k=setTimeout(()=>A(new Error("resume timeout")),3e4)});try{let A=(await Promise.race([C,w])).result?.thread?.id;if(e.requireResume&&A!==e.threadId)throw new Error(`thread/resume did not return the requested thread "${e.threadId}" (got "${A??"unknown"}")`)}finally{clearTimeout(k)}_=e.threadId,e.onSessionId?.(_)}catch(C){if(e.requireResume)throw C;process.stderr.write(`[codex] thread/resume failed, creating new thread
1759
- `),U({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:C instanceof Error?C.message:String(C)});let w=(await b("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:o,...e.model?{model:e.model}:{}})).result?.thread;w?.id&&(_=w.id,e.onSessionId?.(_))}else{let k=(await b("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:o,...e.model?{model:e.model}:{}})).result?.thread;k?.id&&(_=k.id,e.onSessionId?.(_))}d=l.turn(_),await b("turn/start",{threadId:_,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(C){te(a).catch(()=>{}),r(C instanceof Error?C:new Error(String(C)))}})()})}async function Um(t){let{binary:e,codexArgs:n,sandbox:r}=Dm(t),s=xm(e,n,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Se(t.env,t.cwd,t.threadId)}),i=Date.now(),o={exited:!1,exitCode:null,signal:null,completedTurns:0,closed:!1,closing:null},a=t.threadId||"",l=Vo(),d=null,u="";s.stderr?.on("data",k=>{u+=k.toString()});let c=Om({input:s.stdout}),m=new Map,p=1;function g(k,w={}){return new Promise((I,A)=>{let x=p++;m.set(x,{resolve:I,reject:A});let N=JSON.stringify({jsonrpc:"2.0",id:x,method:k,params:w});s.stdin?.write(N+`
1760
- `)})}function _(k,w={}){let I=JSON.stringify({jsonrpc:"2.0",method:k,params:w});s.stdin?.write(I+`
1761
- `)}let f=[],h=()=>o.exited?Promise.resolve():new Promise(k=>{f.push(k)}),E=()=>new he(`codex bundle process exited${o.signal!==null?` by ${o.signal}`:o.exitCode!==null?` with code ${o.exitCode}`:""} after ${o.completedTurns} completed prompt(s); the bundle cannot continue`,o.exitCode,o.signal,u),y=null,T=null,v,b,R=k=>{k.turnId&&g("turn/interrupt",{threadId:a,turnId:k.turnId}).catch(()=>{})};function S(k){let w=y;w===null||w.settled||(w.settled=!0,y=null,w.usage.finish(),k&&w.reject(Object.assign(k,{usage:w.usage.usage(),sessionId:a})))}c.on("line",k=>{let w;try{w=JSON.parse(k)}catch{return}if(typeof w.id=="number"&&m.has(w.id)){Pm(l,w);let L=m.get(w.id);if(m.delete(w.id),w.error){let $=w.error,P=typeof $?.message=="string"&&$.message.length>0?$.message:JSON.stringify(w.error);L.reject(Ar(`codex app-server error: ${P}`,$))}else L.resolve(w);y?.onEvent?.(w);return}let I=w.method;if(!I){y?.onEvent?.(w);return}if(I==="thread/started"){let $=w.params?.thread;$?.id&&(a=$.id,t.onSessionId?.(a))}let A=w.params,x=A?.turnId??A?.turn?.id;if(T&&(I==="turn/started"&&!T.turnId&&x&&(T.usage.bind(x),T.usage.finish(),T.turnId=x,R(T)),I==="turn/completed"&&x===T.turnId&&(l.remember(a,x),T=null,b?.()),I.startsWith("turn/")||I.startsWith("item/")||I==="error"))return;let N=y;if(x&&N?.turnId&&x!==N.turnId||N!==null&&!N.usage.event(w))return;let D=N?.usage.usage();if(D&&N?.onUsage?.(D),I==="turn/started"&&N!==null){let $=w.params?.turn;$?.id&&(N.turnId=$.id),Bn(w,N.agentState,N.onDelta,void 0)}if(N!==null&&(I==="item/started"||I==="item/agentMessage/delta"||I==="item/completed")&&Bn(w,N.agentState,N.onDelta,void 0),I==="turn/completed"&&N!==null&&!N.settled){Qs(N.agentState);let L=ti(w,N.turnState);N.settled=!0,N.usage.finish(),y=null,L.shouldReject?N.reject(Object.assign(L.turnError,{usage:N.usage.usage(),sessionId:a})):(o.completedTurns+=1,N.resolve({text:N.agentState.resultText,usage:N.usage.usage(),sessionId:a,turnId:N.turnId,durationMs:Date.now()-N.startMs}))}I==="error"&&N!==null&&ei(w,N.turnState),N?.onEvent?.(w)});let O=k=>{d=new ce(`Failed to spawn codex app-server: ${k.message}`,{cause:k}),U({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:k.message});for(let w of m.values())w.reject(d);m.clear(),S(d)};s.on("error",O),s.stdin?.on("error",O),s.on("exit",(k,w)=>{o.exited=!0,b?.(),o.exitCode=k,o.signal=w;let I=E();for(let x of m.values())x.reject(I);m.clear();let A=y;if(A!==null&&!A.settled)if(A.settled=!0,A.usage.finish(),y=null,A.turnState.pendingCodexError)A.reject(Object.assign(A.turnState.pendingCodexError,{usage:A.usage.usage(),sessionId:a}));else{let x=u.trim()?de(u,{provider:"codex"}):"";U({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:k,signal:w,...x?{stderr_summary:x}:{}}),A.reject(Object.assign(new he(x?`${I.message}
1762
- ${x}`:I.message,k,w,u),{usage:A.usage.usage(),sessionId:a}))}for(let x of f.splice(0))x()});try{if(await g("initialize",Lm()),_("initialized",{}),t.threadId){let k;try{k=await g("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=k.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 g("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(k){let w=d??(k instanceof Error?k:new Error(String(k))),I=t.closeTimeoutMs??2e3;throw await te(s,{softDelayMs:Math.min(1e3,I),killDelayMs:Math.min(1e3,I)}).catch(()=>{}),w}let C=k=>new Promise(w=>{setTimeout(w,k).unref?.()});return{provider:"codex",get sessionId(){return a},get completedTurns(){return o.completedTurns},async sendTurn(k,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,A)=>{let x={usage:l.turn(a),onUsage:w.onUsage,agentState:zs(),turnState:Zs(),resolve:I,reject:A,startMs:Date.now(),turnId:"",onDelta:w.onDelta,onEvent:w.onEvent,settled:!1};y=x;let N=()=>{x.settled||(x.settled=!0,y=null,T=x,v=new Promise(D=>{b=D}),R(x),w.signal?.removeEventListener("abort",N),x.usage.finish(),A(Object.assign(new Error("Aborted"),{usage:x.usage.usage(),sessionId:a})))};w.signal?.addEventListener("abort",N,{once:!0}),g("turn/start",{threadId:a,input:[{type:"text",text:k}],...t.model?{model:t.model}:{}}).then(D=>{x.usage.bind(D.result?.turn?.id)}).catch(D=>{if(x.settled){T===x&&(T=null,b?.());return}x.settled=!0,y=null,w.signal?.removeEventListener("abort",N),x.usage.finish(),A(Object.assign(o.exited?E():D instanceof Error?D:new Error(String(D)),{usage:x.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(k=>{tt(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>o.exited,isTurnInFlight:()=>y!==null,lastEventAtMs:()=>i,closeStdin:()=>{s.stdin?.end(),k()},label:"codex"})}):s.stdin?.end(),!o.exited)){let k=t.closeTimeoutMs??2e3;await Promise.race([h(),C(k)]),o.exited||await te(s,{stdinEnd:!1,softDelayMs:Math.min(1e3,k),killDelayMs:Math.min(1e3,k)}).catch(()=>{})}})()),o.closing}}}import{spawn as rp}from"node:child_process";import{existsSync as XS}from"node:fs";var jm="(?:png|jpe?g|webp|heic|pdf)",yS=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${jm}\\s*`,"gi"),TS=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${jm}\\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 ni(t){let e=[...t.matchAll(yS)];if(e.length>0){let n=e[e.length-1],r=(n.index??0)+n[0].length;return Fm(t.slice(r).trimStart())}return Fm(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 Fm(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 _t(t,e=""){let n=t.result;return typeof n?.sessionId=="string"&&n.sessionId.length>0?n.sessionId:e}function $m(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 ri(t={}){let e="",n="",r="",s=!1,i=!1,o=!1,a=t.isolateResult??(t.tool==="gemini"?ni: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=$m(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,g=typeof p?.text=="string"?p.text:"";return g&&i&&(n+=g,t.onDelta?.(g)),!0},finalize(){return s?l():null}}}var si={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 Wm}from"node:fs";import{join as ii}from"node:path";function Hm(t,e){let n=e.GEMINI_DIR??process.env.GEMINI_DIR??ii(J,".gemini"),r=ii(n,"tmp"),s;try{s=Wm(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=ii(r,a,"chats"),d;try{d=Wm(l)}catch{continue}for(let u of d){if(!u.endsWith(".json"))continue;let c;try{c=RS(ii(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 Nr={name:"gemini",binary:"gemini",baseArgs:["--acp","-y","--skip-trust"],argv(t){let e=[...Nr.baseArgs];if(t.permissionMode==="plan"){let n=Ut("gemini","plan"),r=Ut("gemini","yolo");e=e.filter(s=>!(r??[]).includes(s)),n&&e.push(...n)}return t.model&&e.push("--model",t.model),e},isolateResult:ni,sessionIdentity:{verifyLoadedSession:t=>{Hm(t.requestedSessionId,t.env)},recheckSession:t=>{Hm(t.requestedSessionId,t.env)}}};import{existsSync as kS,readFileSync as IS}from"node:fs";import{join as ua}from"node:path";function Bm(t,e){let n=e.COPILOT_HOME??process.env.COPILOT_HOME??ua(J,".copilot"),r=ua(n,"session-state",t),s=ua(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 xr={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
- `),U({event:"acp_plan_mode_unsupported",provider:"copilot",requested_mode:"plan",effective_mode:"yolo"})),t.model&&(process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${t.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1764
- `),U({event:"acp_model_unsupported",provider:"copilot",model:t.model})),[...xr.baseArgs]},yoloAssertion:"always-yolo",sessionIdentity:{verifyLoadedSession:t=>{Bm(t.requestedSessionId,t.env)},recheckSession:t=>{Bm(t.requestedSessionId,t.env)}}};import{spawn as MS}from"node:child_process";import{resolve as Zm}from"node:path";import{existsSync as AS,mkdirSync as CS,readFileSync as NS,writeFileSync as Xm}from"node:fs";import{join as qm,resolve as eP}from"node:path";var Jm={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 Gm(t,e={}){let n=qm(t,".opencode"),r=qm(n,"opencode.json");if(!AS(r)){CS(n,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return Xm(r,o+`
1765
- `,"utf-8"),!0}let s;try{s=JSON.parse(NS(r,"utf-8"))}catch{return console.log(Jm.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Jm.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)||U({event:"opencode_yolo_override",provider:"opencode",config_path:r,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&Xm(r,JSON.stringify(s,null,2)+`
1766
- `,"utf-8"),i}import{existsSync as ma,readdirSync as OS,statSync as Vm}from"node:fs";import{join as jt}from"node:path";import{createRequire as LS}from"node:module";var ca=null;function pa(){return ca===null&&(ca=LS(import.meta.url)("node:sqlite").DatabaseSync),ca}function Km(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Ym(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 zm(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 Qm(){let t=process.env.XDG_DATA_HOME||jt(J,".local","share"),e=process.env.XDG_CONFIG_HOME||jt(J,".config");return[jt(t,"opencode","opencode.db"),jt(e,"opencode","opencode.db")]}function DS(){return fa(process.env,J)}function fa(t,e){if(t.OPENCODE_DB)return[t.OPENCODE_DB];let n=t.XDG_DATA_HOME||jt(e,".local","share"),r=jt(n,"lmplayer"),s=jt(r,"opencode-local.db"),i=[s];try{let o=OS(r).filter(a=>/^opencode.*\.db$/u.test(a)).map(a=>jt(r,a)).filter(a=>a!==s).sort((a,l)=>{try{return Vm(l).mtimeMs-Vm(a).mtimeMs}catch{return 0}});i.push(...o)}catch{}return i}function PS(t){return t==="lmplayer"?DS():Qm()}var Xn=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=>ma(e))}openDb(e){if(!ma(e))return null;let n=new(pa())(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,g,_=Km(),f=[];for(let E of u){let y;try{y=JSON.parse(E.data)}catch{continue}g||(g=y.model?.modelID||y.modelID),(y.role==="user"||y.role==="assistant")&&c++,y.role==="user"&&f.push(E.id),y.role==="assistant"&&Ym(_,y.tokens)}let h=[...f.length>0?[f[0]]:[],...f.length>1?[f[f.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:g,startCommand:this.startCommand,firstUserMessage:m,lastUserMessage:p,messageCount:c,filePath:n,...zm(_)})}}catch(s){U({event:"opencode_discover_sessions_failed",provider:this.name,db_path:n,error_message:s instanceof Error?s.message:String(s)})}finally{r.close()}}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,e);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(e,n,r){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1771
- FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=[],d=0,u,c,m,p=Km();for(let g of o){let _;try{_=JSON.parse(g.data)}catch{continue}u||(u=_.model?.modelID||_.modelID);let f=_.model?.modelID||_.modelID,h=new Date(_.time?.created||g.time_created),E=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g.id);if(_.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(_.role==="assistant"){Ym(p,_.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:f}):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:Xe(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,...zm(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(pa())(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 ga(t,e){let n=e?.dbPath!==void 0?[e.dbPath]:Qm();for(let r of n){if(!ma(r))continue;let s=new(pa())(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 Or(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 cn={name:"opencode",binary:"opencode",baseArgs:["acp"],argv:()=>[...cn.baseArgs],preSpawn(t){try{Gm(t.cwd)}catch(e){U({event:"opencode_config_install_failed",cwd:t.cwd,error_message:e instanceof Error?e.message:String(e)})}},sessionSetup:[Or({id:"model",provider:"opencode",configId:"model",value:t=>t.model}),Or({id:"effort",provider:"opencode",configId:"effort",value:t=>t.effort})],probe:ep,sessionIdentity:{verifyLoadedSession:t=>{let e=ga(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(Zm(e.directory)!==Zm(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(ga(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 ep(t){let e;try{e=MS(t.binaryPath??cn.binary,[...cn.baseArgs],{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Se(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=Mt(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}te(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=_t(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 _a,resolve as jS}from"node:path";var $S=/runtime\s+\S+\s+does not exist in workspace\s+\S+/;function np(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 ha=t=>t.permissionMode==="plan"?"plan":"auto";async function tp(t,e){let n=jS(e.KIMI_CODE_HOME??process.env.KIMI_CODE_HOME??_a(J,".kimi-code")),r=_a(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(_a(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 Lr={name:"kimi",binary:"kimi",baseArgs:["acp"],argv:()=>[...Lr.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:ha(t)})},describeFailure:(t,e)=>{let n=ha(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=${ha(t)}) ok`},Or({id:"model",provider:"kimi",configId:"model",value:t=>t.model})],onExitFinalization(t){let e=np(t.result);e!==null&&U({event:"kimi_runtime_dead",provider:"kimi",session_id:t.sessionId,matched_text:e})},filterExpectedStderr:WS,sessionIdentity:{verifyLoadedSession:async t=>{await tp(t.requestedSessionId,t.env)},recheckSession:async t=>{await tp(t.requestedSessionId,t.env)}}};var Dr={name:"hermes",binary:"hermes",baseArgs:["acp"],argv(t){if(t.permissionMode==="plan")throw new Error('provider "hermes" does not support --permission-mode plan');return[...Dr.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:si,gemini:Nr,copilot:xr,opencode:cn,kimi:Lr,hermes:Dr};function Pr(t){return HS[t]}var BS={miniplayer:{binary:si.binary,args:si.baseArgs},gemini:{binary:Nr.binary,args:Nr.baseArgs},copilot:{binary:xr.binary,args:xr.baseArgs},opencode:{binary:cn.binary,args:cn.baseArgs},kimi:{binary:Lr.binary,args:Lr.baseArgs},hermes:{binary:Dr.binary,args:Dr.baseArgs}};function sp(t,e){let n=Pr(t)?.modeVocabulary;if(!n)throw new ce(`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 ce(`provider "${t}" has no ACP mode "${e}" (known: ${n.known.join(", ")}).`);if(!n.selectable.includes(e))throw new ce(`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 ${t.signal?`terminated by ${t.signal}`:`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 Pr(t)?.filterExpectedStderr?.(e)??e}function ip(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 op(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&&we(s.successLog(i))}catch(o){let a=s.describeFailure(i,o);if(U({event:a.event,provider:t.name,...a.fields}),a.stderrLine&&process.stderr.write(a.stderrLine),a.warning&&e.warnings.push(a.warning),s.onFailure==="fail-closed")throw new Error(a.message)}}}function ap(t,e,n){let r=Se(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(Ee(e.tool,i,o),e.cwd&&!XS(e.cwd))throw U({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),new ce(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})});return{binary:s,spawnArgs:i,spawnEnv:r}}async function lp(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
- `),U({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=_t(m),s.setSessionId(a),{sessionId:a,sessionResponse:m}}let u=_t(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=_t(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=_t(d,r.sessionId);l=d,s.setSessionId(a)}else{let d=await e("session/new",{cwd:r.cwd,mcpServers:[]});a=_t(d),l=d,s.setSessionId(a)}return{sessionId:a,sessionResponse:l}}function dp(t,e){let n=Pr(e.tool);if(!n)return Promise.reject(new Error(`No ACP config for tool "${e.tool}"`));if(e.acpMode!==void 0)try{sp(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:S=>{o.push(S)}}},l,d,u;try{({binary:l,spawnArgs:d,spawnEnv:u}=ap(n,e,a))}catch(S){return s(S instanceof Error?S:new Error(String(S)))}let c=rp(l,d,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:u}),m=Date.now(),p=!1,g=!1,_=0,f=!1,h=!1;if(e.signal){if(e.signal.aborted)return p=!0,U({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),te(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{p=!0,U({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-m}),te(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let E=e.sessionId||"",y=ri({tool:e.tool,onDelta:e.onDelta,...n.isolateResult?{isolateResult:n.isolateResult}:{}});y.setSessionId(E);let T=Mt(c,{provider:e.tool,onEvent:S=>{_=Date.now(),ip(S)&&(h=!0),e.onEvent?.(S)},onNotification:S=>{_=Date.now(),y.processMessage(S)}}),{sendRpc:v,sendNotification:b}=T,R="";c.stderr?.on("data",S=>{R+=S.toString()}),c.on("error",S=>{T.close(S),U({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:S.message,elapsed_ms:Date.now()-m}),s(new ce(`Failed to spawn ${n.binary} ${n.baseArgs.join(" ")}: ${S.message}`,{cause:S}))}),c.on("exit",(S,O)=>{if(g=!0,T.close(new he(`ACP process ${O?`terminated by ${O}`:`exited with code ${String(S)}`}`,S,O)),p)return;let C=y.finalize();if(C!==null)n.onExitFinalization?.({...a,sessionId:C.sessionId,result:C.result,stopReason:C.stopReason,exitCode:S}),r({result:C.result,sessionId:C.sessionId,durationMs:Date.now()-m,stopReason:C.stopReason,exitCode:S,sawActivity:C.sawActivity,...o.length>0?{warnings:o}:{}});else{let k=JS(e.tool,R),w=qS({tool:e.tool,exitCode:S,signal:O,stderr:k,fullOutput:R});U({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:S,signal:O,stderr_summary:w,elapsed_ms:Date.now()-m}),s(new he(w,S,O,R))}}),(async()=>{try{let S=await lp({sendRpc:v,sendNotification:b,opts:e,outputProcessor:y});E=S.sessionId,e.onSessionId?.(E);let O=S.sessionResponse;await op(n,a,{sessionId:E,response:O},v),y.beginTurn(),f=!0,we(`acp: prompt sent (${t.length} chars)`);let C;if(await v("session/prompt",{sessionId:E,prompt:[{type:"text",text:t}]},k=>{k.error?y.cancelTurn():C=y.completeTurn(k)}),!C)throw new Error("ACP prompt completed without a result boundary");f=!1,we(`acp: result received (${C.result.length} chars, stopReason=${C.stopReason})`),tt(e.holdOpen,{isAborted:()=>p,hasChildExited:()=>g,isTurnInFlight:()=>f,lastEventAtMs:()=>_,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>h})}catch(S){te(c).catch(()=>{}),s(S instanceof Error?S:new Error(String(S)))}})()})}async function up(t){let e=Pr(t.tool);if(!e)throw new Error(`No ACP config for tool "${t.tool}"`);t.acpMode!==void 0&&sp(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}=ap(e,t,i),d=rp(o,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:l}),u=Date.now(),c={exited:!1,exitCode:null,signal:null,lastEventAtMs:0,turnInFlight:!1,backgroundJobLaunched:!1,completedTurns:0,closed:!1,closing:null,telemetryFired:!1},m,p=t.sessionId||"",g=null,_="";d.stderr?.on("data",O=>{_+=O.toString()});let f,h,E=ri({tool:t.tool,onDelta:O=>f?.(O),...e.isolateResult?{isolateResult:e.isolateResult}:{}});E.setSessionId(p);let y=Mt(d,{provider:t.tool,onEvent:O=>{c.lastEventAtMs=Date.now(),ip(O)&&(c.backgroundJobLaunched=!0),h?.(O)},onNotification:O=>{c.lastEventAtMs=Date.now(),E.processMessage(O)}}),T=()=>new he(`ACP bundle process (${t.tool}) exited${c.signal!==null?` by ${c.signal}`:c.exitCode!==null?` with code ${c.exitCode}`:""} after ${c.completedTurns} completed prompt(s); the bundle cannot continue`,c.exitCode,c.signal,_),v=[],b=()=>c.exited?Promise.resolve():new Promise(O=>{v.push(O)}),R=null;d.on("error",O=>{g=new ce(`Failed to spawn ${e.binary} ${e.baseArgs.join(" ")}: ${O.message}`,{cause:O}),U({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,C)=>{if(c.exited=!0,c.exitCode=O,c.signal=C,y.close(new he(`ACP process ${C?`terminated by ${C}`:`exited with code ${String(O)}`}`,O,C)),!c.telemetryFired){c.telemetryFired=!0;let k=E.finalize();k!==null&&e.onExitFinalization?.({...i,sessionId:k.sessionId,result:k.result,stopReason:k.stopReason,exitCode:O})}if(R!==null){let k=R;R=null,k(T())}for(let k of v.splice(0))k()});try{let O=await lp({sendRpc:y.sendRpc,sendNotification:y.sendNotification,opts:t,outputProcessor:E,strictSessionIdentity:!0,verifyLoadResponse:e.sessionIdentity===void 0?void 0:async C=>e.sessionIdentity.verifyLoadedSession({...i,requestedSessionId:t.sessionId,loadResponse:C,cwd:t.cwd,env:l})});p=O.sessionId,t.onSessionId?.(p),await op(e,i,{sessionId:O.sessionId,response:O.sessionResponse},y.sendRpc)}catch(O){let C=g??(O instanceof Error?O:new Error(String(O)));throw te(d).catch(()=>{}),C}let S=O=>new Promise(C=>{setTimeout(C,O).unref?.()});return{tool:t.tool,get sessionId(){return p},get completedTurns(){return c.completedTurns},async sendTurn(O,C={}){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(C.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(C.signal?.aborted)throw new Error("Aborted")}c.turnInFlight=!0,f=C.onDelta,h=C.onEvent;let k=Date.now();try{E.beginTurn(),we(`acp: bundle prompt sent (${O.length} chars)`);let w,I=!1;if(await new Promise((x,N)=>{R=N;let D,L=()=>{I=!0,m=Promise.resolve().then(()=>D).catch(()=>{}),E.cancelTurn(),y.sendNotification("session/cancel",{sessionId:p}),N(new Error("Aborted"))},$=C.signal;$?.addEventListener("abort",L,{once:!0}),D=y.sendRpc("session/prompt",{sessionId:p,prompt:[{type:"text",text:O}]},P=>{I||(P.error?E.cancelTurn():w=E.completeTurn(P),f=void 0,h=void 0)}),D.then(P=>{$?.removeEventListener("abort",L),x(P)},P=>{$?.removeEventListener("abort",L),N(P instanceof Error?P:new Error(String(P)))})}),R=null,!w)throw new Error("ACP prompt completed without a result boundary");c.turnInFlight=!1,c.completedTurns+=1,we(`acp: bundle result received (${w.result.length} chars, stopReason=${w.stopReason})`);let A=s&&r.length>0?[...r]:void 0;return s=!1,{result:w.result,sessionId:w.sessionId,stopReason:w.stopReason,durationMs:Date.now()-k,sawActivity:w.sawActivity,...A!==void 0?{warnings:A}:{}}}catch(w){throw R=null,E.cancelTurn(),c.turnInFlight=!1,c.exited?T():w}finally{f=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(C=>{tt(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>c.exited,isTurnInFlight:()=>c.turnInFlight,lastEventAtMs:()=>c.lastEventAtMs,closeStdin:()=>{d.stdin?.end(),C()},label:t.tool,wasBackgroundJobLaunched:()=>c.backgroundJobLaunched})}):d.stdin?.end(),c.exited))return;let O=t.closeTimeoutMs??2e3;await Promise.race([b(),S(O)]),c.exited||await te(d,{stdinEnd:!1,softDelayMs:Math.min(1e3,O),killDelayMs:Math.min(1e3,O)}).catch(()=>{})})()),c.closing}}}function me(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 cp(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 mp(){let t=new Map;return(e,n)=>{VS(e,cp(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(me(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(me(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:me(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=me(JSON.stringify(d))),e({kind:"tool_use",tool:a,summary:me(u),id:l,raw:i})}else if(o==="thinking"||o==="redacted_thinking"){let a=i.thinking||i.data||"";e({kind:"thinking",summary:me(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 oi(t,e){let n=e.binary==="qwen"?"qwen":"claude",r=e.onProgress?mp():void 0;if(e.bundleSession!==void 0)return ft(e.bundleSession,n,e.sessionId,t,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal});let s=await Im(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 ai(t){let e=t.binary==="qwen"?"qwen":"claude",n=await Am({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=mp(),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 pp(){let t=new Map;return(e,n)=>{KS(e,cp(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:me(a)});return}if(i==="agent_thought_chunk"||i==="thought"||i==="reasoning"){let a=s.content?.text||"";e({kind:"thinking",summary:me(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=me(JSON.stringify(d))),e({kind:"tool_use",tool:o,summary:me(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 ${me(d,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:i})}}function fp(t,e){if(e!==void 0)return t===""&&!e?"empty":void 0}async function Ke(t,e){let n=e.acpTool||e.binary,r=e.onProgress?pp():void 0;if(e.bundleSession!==void 0)return ft(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";We({event:"model_ignored",provider:n,model:e.model,reason:a}),s.push(`copilot ignored model=${e.model}: ${a}`)}let i=await dp(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,...fp(i.result,i.sawActivity)!==void 0?{status:"empty"}:{},...o.length>0?{warnings:o}:{}}}async function nt(t){let e=t.acpTool||t.binary,n=await up({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=pp(),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,...fp(o.result,o.sawActivity)?{status:"empty"}:{},...o.warnings!==void 0?{warnings:o.warnings}:{}}},close:()=>n.close()}}function gp(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: ${me(o,120)}`}:{kind:"other",summary:`codex error: ${me(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:me(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",g=[];typeof u=="number"?g.push(`exit ${u}`):c&&g.push(c),typeof m=="number"&&g.push(`${Math.round(m/1e3)}s`),e({kind:"tool_result",summary:g.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:me(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:me(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:me(s)}:{kind:"text",summary:me(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:me(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: ${me(o,60)}`:me(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: ${me(o,60)}`:me(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 _p(t,e){if(e.bundleSession!==void 0)return ft(e.bundleSession,"codex",e.sessionId,t,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal});let n=await Mm(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=>gp(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 hp(t){let e=await Um({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&&gp(i,r.onProgress)}});return{text:s.text,...s.usage?{usage:s.usage}:{},sessionId:s.sessionId,durationMs:s.durationMs}},close:()=>e.close()}}function ya(t={}){let e=ns(t.miniplayerHome),n=r=>({...r??process.env,MINIPLAYER_HOME:e});return new class extends Q{constructor(){super({provider:new ts({miniplayerHome:e}),protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeSession:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none",leaderSetupHint:"Miniplayer provides native file, shell and web tools. A stored session can be resumed (history is rebuilt from its completed turns)."},binary:"miniplayer",seedArgs:[],resumeTemplate:"",startTemplate:"miniplayer run",transport:(r,s)=>Ke(r,{...s,env:n(s.env),acpTool:"miniplayer"})})}openSession(r){return nt({...r,env:n(r.env),binary:"miniplayer",acpTool:"miniplayer"})}manualSeedHint(){return{launchCommand:"miniplayer --help",postLaunchNote:'Use lmctl prompt --provider miniplayer --model <model> "<prompt>". Each invocation creates a fresh run unless a session id is given.',lsCommand:"lmctl ls --provider miniplayer"}}resumeCommand(){throw new Error("miniplayer has no interactive terminal; use lmctl prompt or lmctl batch")}async seed(r,s){try{s?.signal?.throwIfAborted();try{s?.onDispatch?.()}catch{}let i=await Ke(s?.prompt??V,{binary:"miniplayer",acpTool:"miniplayer",sessionId:"",requireResume:!1,cwd:r,env:n(s?.env),signal:s?.signal,model:s?.model});return{success:!0,sessionId:i.sessionId,usage:i.usage}}catch(i){return{success:!1,usage:i?.usage,error:`miniplayer seed failed: ${i instanceof Error?i.message:String(i)}`}}}}}import{join as vp}from"node:path";import{readdir as li,stat as yp,unlink as YS}from"node:fs/promises";import{join as qn,basename as Tp}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 ne(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 Ep(t){let e=0,n=0,r=0,s=0,i=0,o=0,a,l,d=new Map,u=[];for await(let g of ae(t))if(!g.isSidechain){if(g.type==="user"&&!g.isMeta&&g.message){let _=g.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;e++,l=B(_.trim(),80)}}else if(g.type==="assistant"&&g.message){let _=g.message.content;if(Array.isArray(_))for(let h of _)h.type==="text"&&e++;let f=g.message.usage;if(f){let h=eb(f),E=g.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=g=>{let _=tb(g);n+=g.input+g.cacheRead+_.total,r+=g.cacheRead,s+=_.total,c+=_.fiveMinute,m+=_.oneHour,i+=g.output};for(let g of d.values())p(g);for(let g of u)p(g);return{messageCount:e,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalCacheWrite5mInputTokens:c,totalCacheWrite1hInputTokens:m,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a,lastUserMessage:l}}var di=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||qn(J,".claude"),this.projectsDir=qn(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await li(this.projectsDir)}catch{return e}for(let r of n){let s=qn(this.projectsDir,r);if(!(await yp(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await li(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Tp(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let d=qn(s,a);try{let u=await this.extractSummary(d,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,n){let r=await je(e,50),s=await ge(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 g=p.message.content;if(typeof g=="string"){if(g.includes("<command-name>")||g.includes("<local-command-"))continue;d||(d=B(g.trim(),80)),u=B(g.trim(),80)}}if(!i)return null;let m=await Ep(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 ge(n),s=[],i="",o,a,l,d,u,c,m,p=e,g,_=[];for await(let h of ae(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.")&&_.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),g=void 0,s.push({role:"user",timestamp:E,content:ne(y.trim())})}else if(Array.isArray(y)){for(let T of y)if(T.type==="tool_result"){let v=typeof T.content=="string"?ne(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"?g="in_progress":typeof h.message.stop_reason=="string"&&(g="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:ne(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 f=await Ep(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:g,firstUserMessage:u,lastUserMessage:c,messageCount:f.messageCount,filePath:n,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalCacheWrite5mInputTokens:f.totalCacheWrite5mInputTokens||void 0,totalCacheWrite1hInputTokens:f.totalCacheWrite1hInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage,messages:s,userPrompts:_}}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 li(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=qn(this.projectsDir,o);if(!(await yp(a).catch(()=>null))?.isDirectory())continue;let d;try{d=await li(a)}catch{continue}for(let u of d){if(!u.endsWith(".jsonl"))continue;let c=Tp(u,".jsonl");/^[0-9a-f]{8}-/.test(c)&&r.push({filePath:qn(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 je(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 Ea(t){return new Ta(t)}var Ta=class extends Q{claudeDir;constructor(e){super({provider:new di(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:oi}),this.claudeDir=e?.claudeDir??vp(J,".claude")}openSession(e){return ai({...e,binary:"claude",sessionFileRoots:e.sessionFileRoots??[vp(this.claudeDir,"projects")]})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}};import{readdir as sb,stat as wp,unlink as ib}from"node:fs/promises";import{join as Mr,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 va(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 Ur(t,e,n){let r=lb(n.role,n.timestamp,n.content);e.has(r)||(e.add(r),t.push(n))}function Sp(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 Jn(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 Jn(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 bp(t){let e=0,n=0,r=0,s=0,i=0,o,a,l=new Set,d,u;for await(let c of ae(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 g=0;g<m.content.length;g++){let _=m.content[g];va(p,g)||_.type==="input_text"&&typeof _.text=="string"&&_.text&&(e++,u=B(_.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 _=JSON.stringify([c.timestamp??null,c.ordinal??null,m,p]);if(!l.has(_)){l.add(_);let f=[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],f.forEach((h,E)=>{a[E]+=h})}}let g=db(c.payload.info.last_token_usage);g&&(o=g),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 ui=class{name="codex";codexDirs;constructor(e={}){let n=[Mr(J,".codex"),Mr(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:Mr(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let n of this.codexDirs){let r=Mr(n,"sessions");try{await wp(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=Mr(e,s),o=await wp(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 je(e,30),r=await ge(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,d,u,c,m;for(let g of n){if(g.type==="session_meta"&&g.payload&&(g.payload.id&&(s=g.payload.id),g.payload.cwd&&(i=g.payload.cwd),g.payload.cli_version&&(o=g.payload.cli_version),g.payload.timestamp&&(l=new Date(g.payload.timestamp)),g.payload.originator&&(c=g.payload.originator),g.payload.source&&(m=g.payload.source)),g.type==="turn_context"&&g.payload&&(g.payload.model&&(a=g.payload.model),!i&&g.payload.cwd&&(i=g.payload.cwd)),g.type==="event_msg"&&g.payload?.type==="user_message"){let _=g.payload.message||g.payload.text;_&&(d||(d=B(_.trim(),80)),u=B(_.trim(),80))}if(g.type==="response_item"&&g.payload?.type==="message"&&g.payload.role==="user"&&g.payload.content){let _=g.payload.internal_chat_message_metadata_passthrough?.content_item_kinds;for(let f=0;f<g.payload.content.length;f++){let h=g.payload.content[f];va(_,f)||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 bp(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:Sp(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 ge(n),s=[],i="",o,a,l,d,u,c=e,m,p,g=new Set,_=[],f=new Set,h=[],E=(v,b)=>{let R=h.find(S=>!S.mirrored&&S.source!==b&&S.text===v);R?R.mirrored=!0:h.push({text:v,source:b,mirrored:!1})},y=()=>{_.push(...h.map(v=>v.text)),h=[]};for await(let v of ae(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=Sp(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 R=v.payload;if(R.type==="message"){if(R.role==="user"&&R.content){let S=R.internal_chat_message_metadata_passthrough?.content_item_kinds;if(Array.isArray(S)){let O=R.content.filter((C,k)=>S[k]==="user.text"&&typeof C.text=="string").map(C=>C.text).join(`
1795
- `);S.includes("user.text")&&O&&(!R.id||!f.has(R.id))&&(E(O,"metadata"),R.id&&f.add(R.id))}for(let O=0;O<R.content.length;O++){let C=R.content[O];if(!va(S,O)&&C.type==="input_text"&&typeof C.text=="string"&&C.text){let k=C.text.trim();d||(d=B(k,80)),u=B(k,80),Ur(s,g,{role:"user",timestamp:b,content:ne(k)})}}continue}if(R.role==="assistant"&&R.content){for(let S of R.content)S.type==="output_text"&&typeof S.text=="string"&&S.text&&Ur(s,g,{role:"assistant",timestamp:b,content:ne(S.text),model:a});continue}if(R.role!=="user"&&R.role!=="assistant"&&R.content){for(let S of R.content)(S.type==="input_text"||S.type==="output_text")&&typeof S.text=="string"&&S.text&&Ur(s,g,{role:"system",timestamp:b,content:ne(S.text.trim())});continue}}if(R.type==="function_call"){s.push({role:"tool_use",timestamp:b,content:R.name||"unknown tool",toolName:R.name,toolInput:R.arguments!==void 0?ne(Jn(R.arguments)):void 0,toolInputData:ub(R.arguments),toolCallId:R.call_id});continue}if(R.type==="function_call_output"){s.push({role:"tool_result",timestamp:b,content:ne(Jn(R.output)),toolCallId:R.call_id});continue}if(R.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:b,content:R.name||"unknown tool",toolName:R.name,toolInput:R.input!==void 0?ne(Jn(R.input)):void 0,toolInputData:cb(R.name,R.input),toolCallId:R.call_id});continue}if(R.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:b,content:ne(Jn(R.output)),toolCallId:R.call_id});continue}if(R.type==="reasoning"&&R.summary){let S=R.summary.map(O=>Jn(O.text)).join(`
1796
- `);S.trim()&&Ur(s,g,{role:"thinking",timestamp:b,content:ne(S)});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 R=v.payload.message||v.payload.text;R&&Ur(s,g,{role:"thinking",timestamp:b,content:ne(R)})}}if(!i)return null;y();let T=await bp(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:_}}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 je(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}};import{execFile as mb}from"node:child_process";import{realpathSync as Rp,readdirSync as pb}from"node:fs";import{homedir as fb}from"node:os";import{join as ci,resolve as kp,sep as gb}from"node:path";function ba(t){return new Sa(t)}var wa="gpt-5.6-sol",Sa=class extends Q{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 ui(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:_p})}async preflightNativeLaunch(e){let n=performance.now()+1800,r=(O,C)=>new Promise(k=>{let w=Math.ceil(n-performance.now());if(w<=0){k(void 0);return}let I,A=()=>{try{I?.kill("SIGKILL")}catch{}},x=()=>{A()},N=()=>{A()},D=()=>{A()};process.once("exit",x),process.once("SIGINT",N),process.once("SIGTERM",D);let L=()=>{process.removeListener("exit",x),process.removeListener("SIGINT",N),process.removeListener("SIGTERM",D)};I=mb(O,C,{cwd:e.cwd,env:e.env,signal:e.signal,timeout:w,killSignal:"SIGKILL",maxBuffer:65536},($,P)=>{L(),k($?void 0:P)})}),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,g="To align your CLI: npm i -g @openai/codex@"+u,_=p+"; using the daemon's binary. "+g,f={kind:"ok",message:p+"; no matching daemon binary is available, launching the PATH CLI. "+g},h=kp(e.cwd,e.env.CODEX_HOME||ci(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(/\+.*$/,""),R=b(u),S=process.arch==="arm64"?"aarch64":"x86_64";for(let O of["app-server-daemon","standalone"]){let C=ci(h,"packages",O,"releases");try{y.push(Rp(C)+gb);let k=pb(C).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===R||w.startsWith(u+"-")||w.startsWith(R+"-"));k.sort((w,I)=>{let A=w.includes(S)?0:1,x=I.includes(S)?0:1;return A!==x?A-x:w.localeCompare(I)});for(let w of k)E.push(ci(C,w,"bin",T)),E.push(ci(C,w,T))}catch{}}for(let O of new Set(E)){if(performance.now()>=n||e.signal?.aborted)break;let C;try{if(C=Rp(kp(e.cwd,O)),!y.some(I=>C.startsWith(I)))continue}catch{continue}let w=(await r(C,["--version"]))?.trim().match(/^codex(?:-cli)?\s+([0-9A-Za-z.+-]+)/)?.[1];if(w&&(w===u||b(w)===R))return{kind:"use-binary",binary:C,message:_}}return f}openSession(e){return hp({...e,model:e.model??wa})}seedArgsFor(e){let n=super.seedArgsFor(e),r=e?.model??wa;return[...n.slice(0,-1),"--model",r,n[n.length-1]]}turnOptsFor(e){return e.model?e:{...e,model:wa}}};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 Fr,readFile as Ip,stat as mi,unlink as hb}from"node:fs/promises";import{join as Be,basename as yb,dirname as Tb}from"node:path";import{cwd as Eb}from"node:process";function Ra(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ap(t){return t==="user"}function ka(t){return t==="gemini"||t==="assistant"}function mn(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 pi(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function Cp(t){let e=0,n=0,r=0,s=0,i=0,o;for(let a of t){if(!ka(a.type)||!a.tokens)continue;let l=pi(a.tokens.input),d=pi(a.tokens.cached),u=Math.max(l-d,0),c=pi(a.tokens.output),m=pi(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 jr(t,e){let n=e;for(;n&&!t.has(n);){t.add(n);let r=Tb(n);if(r===n)break;n=r}}var fi=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let n=e.geminiDir||Be(J,".gemini");this.geminiProjectsFile=Be(n,"projects.json"),this.geminiTmpDir=Be(n,"tmp");let r=e.claudeDir||Be(J,".claude");this.claudeProjectsDir=Be(r,"projects");let s=[Be(J,".codex"),Be(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=>Be(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 ge(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=mn(h.timestamp),y=h.type,T=ne(Ra(h.content));if(Ap(y)){let b=Ra(h.content);b&&o.push(b);let R=T.trim();R&&(c||(c=B(R,80)),m=B(R,80)),i.push({role:"user",timestamp:E,content:R||T});continue}if(ka(y)){h.model&&(p=h.model);for(let b of h.thoughts||[]){let R=[b.subject,b.description].filter(Boolean).join(`
1798
- `).trim();R&&i.push({role:"thinking",timestamp:mn(b.timestamp,E),content:ne(R)})}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 g=mn(r.startTime,s.createdAt),_=mn(r.lastUpdated,s.modifiedAt),f=Cp(a);return{provider:"gemini",sessionId:l,cwd:u,createdAt:g,modifiedAt:_,model:p,startCommand:"gemini",firstUserMessage:c,lastUserMessage:m,messageCount:i.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:n,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage,messages:i,userPrompts:o}}async extractSummary(e){let n=await this.readSessionFile(e);if(!n)return null;let r=await ge(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(Ap(p.type)){c++;let g=Ra(p.content).trim();g&&(l||(l=B(ne(g),80)),d=B(ne(g),80))}else ka(p.type)&&(c++,p.model&&(u=p.model));let m=Cp(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:mn(n.startTime,r.createdAt),modifiedAt:mn(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 Ip(e,"utf-8");if(_r(n)==="unknown")return U({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:n.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return zt(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 Fr(this.geminiTmpDir)}catch{return e}for(let r of n){let s=Be(this.geminiTmpDir,r,"chats");if(!(await mi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Fr(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(Be(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 ge(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:mn(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;jr(e,Eb());for(let r of this.extraWorkspacePaths)jr(e,r);for(let r of await this.collectGeminiProjectPaths())jr(e,r);for(let r of await this.collectCodexCwds())jr(e,r);for(let r of await this.collectClaudeCwds())jr(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 Ip(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(e).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await je(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,n;try{n=await Fr(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=Be(this.claudeProjectsDir,r);if(!(await mi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await Fr(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Be(s,a),u=(await je(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let n=[];if(!(await mi(e).catch(()=>null))?.isDirectory())return n;let s;try{s=await Fr(e)}catch{return n}for(let i of s){let o=Be(e,i),a=await mi(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 Aa(t){return new Ia(t)}var Ia=class extends Q{constructor(e){super({provider:new fi(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(ln))})}seed(e,n){return Promise.resolve({success:!1,error:ln})}sendTurn(e,n){return Promise.reject(new Error(ln))}openSession(e){return Promise.reject(new Error(ln))}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:$s,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=_r(s),o=zt(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,fu(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 Np,readFile as Nb,rm as xb,stat as Gn}from"node:fs/promises";import{basename as Ob,join as Ye}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 Ca(){return{shutdownTotals:null,assistantOutputSum:0}}function Op(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 xp(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 pn(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=Ca(),r;for await(let s of ae(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++;Op(n,s)}return{messageCount:e,tokens:n,lastUserMessage:r}}var gi=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||Ye(J,".copilot");this.sessionStateDir=Ye(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await Np(this.sessionStateDir)}catch{return e}for(let r of n){let s=Ye(this.sessionStateDir,r);if((await Gn(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=Ye(n,"events.jsonl"),i=await Gn(s).catch(()=>null),o=i?s:Ye(n,"workspace.yaml"),a=await ge(i?s:n),l=[],d=[],u=r?.cwd||"(unknown workspace)",c,m,p,g,_,f,h=r?.id||Ob(n)||e,E=Ca();if(i)for await(let y of ae(s)){let T=pn(y.timestamp)||a.modifiedAt;if(Op(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&&(f=pn(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&&(g||(g=B(b,80)),_=B(b,80)),l.push({role:"user",timestamp:T,content:ne(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:ne(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:Xe(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:ne(v),toolDetailedContent:b?ne(b):void 0,toolCallId:y.data.toolCallId});continue}if(y.type==="assistant.reasoning"&&y.data?.content){l.push({role:"thinking",timestamp:T,content:ne(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:ne(v)});continue}}if(!g){let y=(r?.summary||"").trim();y&&(g=B(y,80))}return Mb(l),{provider:"copilot",sessionId:h,cwd:u,createdAt:f??pn(r?.created_at)??a.createdAt,modifiedAt:pn(r?.updated_at)??a.modifiedAt,model:c,cliVersion:m,startCommand:"copilot",gitBranch:p,firstUserMessage:g,lastUserMessage:_,messageCount:l.filter(y=>y.role==="user"||y.role==="assistant").length,filePath:o,...xp(E),messages:l,userPrompts:d}}async extractSummary(e,n){let r=await this.readWorkspaceYaml(e),s=Ye(e,"events.jsonl"),i=await Gn(s).catch(()=>null),o=i?s:Ye(e,"workspace.yaml"),a=await ge(i?s:e),l=i?await je(s,20):[],d=r?.id||n,u=r?.cwd||"(unknown workspace)",c,m,p,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=pn(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&&(g||(g=B(E,80)),_=B(E,80))}if(!g){let h=(r?.summary||"").trim();h&&(g=B(h,80))}let f=i?await Pb(s):{messageCount:0,tokens:Ca()};return{provider:"copilot",sessionId:d,cwd:u,createdAt:p??pn(r?.created_at)??a.createdAt,modifiedAt:pn(r?.updated_at)??a.modifiedAt,model:c,cliVersion:m,startCommand:"copilot",firstUserMessage:g,lastUserMessage:f.lastUserMessage??_,messageCount:f.messageCount,filePath:o,...xp(f.tokens)}}async readWorkspaceYaml(e){let n=Ye(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 Np(this.sessionStateDir)}catch{return null}if(n.includes(e)){let s=Ye(this.sessionStateDir,e);if((await Gn(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(e)){let i=Ye(this.sessionStateDir,s);(await Gn(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=Ye(this.sessionStateDir,s);if(!(await Gn(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 xa(t){return new Na(t)}var Na=class extends Q{copilotDir;constructor(e){super({provider:new gi(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)=>Ke(n,{...r,acpTool:"copilot"})}),this.copilotDir=e?.copilotDir}openSession(e){return nt({...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 We({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}};function La(t){return new Oa(t)}var Oa=class extends Q{constructor(e){super({provider:new Xn(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)=>Ke(n,{...r,acpTool:"opencode"})})}openSession(e){return nt({...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 Lp,readdir as Dp,rm as $b,stat as Pp}from"node:fs/promises";import{basename as Wb,dirname as Hb,isAbsolute as Mp,join as fn,relative as Bb,resolve as Da}from"node:path";var Xb="1.4",qb="1.5",Jb=new Set([Xb,qb]),_i=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=Da(e?.kimiHome??process.env.KIMI_CODE_HOME??fn(J,".kimi-code")),this.sessionsDir=fn(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 fn(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 Dp(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=fn(this.sessionsDir,s.name),o;try{o=await Dp(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=fn(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await Lp(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:Da(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:fn(n,"state.json"),wirePath:fn(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!Mp(e)||Wb(e)!==n)return!1;let r=Bb(this.sessionsDir,Da(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Mp(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 Lp(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 Pp(e.wirePath)}catch{return null}let s=await Pp(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=Pa(n.createdAt)??s.birthtime,a=Pa(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,g=0,_,f;for await(let h of ae(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,R=h.usage?.output??0;d+=T,u+=v,c+=b,m+=R,h.usageScope==="turn"&&(_=T+v+b,f={inputTokens:T,cachedInputTokens:v,cacheWriteInputTokens:b,outputTokens:R,totalTokens:_+R});continue}if(h.type==="turn.prompt"&&h.origin?.kind==="user"){let T=Up(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}),g++);continue}if(h.type==="turn.steer"){let T=Up(h.input);T&&(n.push({role:"system",timestamp:E,content:T}),g++);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}),g++):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:Fp(y.args),toolInputData:Xe(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:g,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:_,lastTokenUsage:f}}};function Pa(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):Pa(t)??new Date(0)}function Up(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 Fp(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:Fp(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 Ua(t){return new Ma(t)}var Ma=class extends Q{kimiHome;constructor(e){super({provider:new _i(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)=>Ke(n,{...r,acpTool:"kimi"})}),this.kimiHome=e?.kimiHome}openSession(e){return nt({...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 ja(t){return new Fa(t)}var Fa=class extends Q{constructor(e){super({provider:new Xn({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 jp({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);Ee("lmplayer",r);try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}let s=await Wp(this.binary,r,{cwd:e,env:$n(n?.env,e),signal:n?.signal});return s.code!==0&&s.code!==null?{success:!1,error:$p(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=jp({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});Ee("lmplayer",r,e.permissionMode??"yolo");let s=await Wp(e.binary,r,{cwd:e.cwd,env:Se(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($p(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function jp(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(...Ut("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function $p(t){let n=[dn(t.stderr).trim(),t.error].filter(Boolean).join(`
1804
- `);return n?de(n,{provider:"lmplayer"}):`exit code ${t.code}`}function Wp(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(_){s(_);return}let o="",a="",l="",d,u,c,m=[],p=!1,g=_=>{let f=_.trim();if(!f)return;let h;try{h=JSON.parse(f)}catch{m.push(_),n.onText?.(_);return}if(!Vn(h))return;let E=hi(h,!1);d===void 0&&E!==void 0&&(d=E),u=hi(h,!0)??u;let y=eR(h);y!==void 0&&(c=y);let T=Hp(h);T&&(m.push(T),n.onText?.(T))};i.stdout?.on("data",_=>{let f=_.toString("utf8");o+=f,l+=f;let h=l.indexOf(`
1805
- `);for(;h>=0;){let E=l.slice(0,h);l=l.slice(h+1),g(E),h=l.indexOf(`
1806
- `)}}),i.stderr?.on("data",_=>{a+=_.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",_=>{p||(p=!0,l.length>0&&g(l),r({code:_,stdout:o,stderr:a,sessionId:d??u,text:m.join(""),error:c}))}),i.on("error",_=>{p||(p=!0,s(_))})})}function eR(t){let e=t.error;if(typeof e=="string"&&e.length>0)return e;if(Vn(e)){let n=e.data;if(Vn(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 Hp(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(Vn(n)){let r=Hp(n);if(r)return r}}}function hi(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(Vn(n)){let r=hi(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(Vn(s)){let i=hi(s,e);if(i!==void 0)return i}}}function Vn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}import{readdir as yi,readFile as tR,rm as nR}from"node:fs/promises";import{basename as Bp,join as $t}from"node:path";function rR(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function $r(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=$r(e.promptTokenCount),r=$r(e.cachedContentTokenCount),s=$r(e.candidatesTokenCount),i=$r(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:$r(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 Xp(t){return t.type==="user"||t.message?.role==="user"}function qp(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Jp(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 Gp(t){return t.model||t.message?.model}function oR(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:Kp(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Wr(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 Wr(e.output??e.error??t)}return Wr(t)}function Kp(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Vp(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:Wr(t.args,!0),toolInputData:Xe(t.args),toolCallId:t.id,model:n}}var Ti=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||$t(J,".qwen")}async discoverSessions(){let e=$t(this.baseDir,"projects"),n;try{n=await yi(e)}catch{return[]}let r=[];for(let s of n){let i=$t(e,s,"chats"),o;try{o=await yi(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),d=$t(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 ge(e),i="(unknown)",o,a,l,d,u=0;for await(let c of ae(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)),Xp(c)){let m=Jp(c).trim();m&&(l||(l=B(m,80)),d=B(m,80),u++)}if(qp(c)){let m=Gp(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=Bp(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await ge(e),s="(unknown)",i,o,a,l,d,u,c=[],m=rR();for await(let p of ae(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 g=p.message,_=p.timestamp?new Date(p.timestamp):r.modifiedAt;if(p.type==="tool_result"){let f=Kp(p).filter(h=>h.functionResponse!==void 0);f.length===0&&p.toolCallResult?.callId&&c.push({role:"tool_result",timestamp:_,content:Wr(p.toolCallResult.resultDisplay??p.toolCallResult.error??p.toolCallResult.status)??"tool result",toolCallId:p.toolCallResult.callId});for(let h of f){let E=h.functionResponse,y=aR(E.response),T=Wr(p.toolCallResult?.resultDisplay);c.push({role:"tool_result",timestamp:_,content:T??y??p.toolCallResult?.status??"tool result",toolName:E.name,toolCallId:p.toolCallResult?.callId??E.id,...y!==void 0?{toolDetailedContent:y}:{}})}}else if(Xp(p)){let f=Jp(p);f.trim()&&(d||(d=B(f.trim(),80)),u=B(f.trim(),80)),c.push({role:"user",timestamp:_,content:f})}else if(qp(p)){let f=Gp(p);if(f&&(i=f),Array.isArray(g.content))for(let h of g.content)h.type==="text"&&h.text?c.push({role:"assistant",timestamp:_,content:h.text,model:f}):h.type==="thinking"&&h.thinking?c.push({role:"thinking",timestamp:_,content:h.thinking}):h.functionCall&&c.push(Vp(h.functionCall,_,f));else if(typeof g.content=="string")c.push({role:"assistant",timestamp:_,content:g.content,model:f});else if(Array.isArray(g.parts))for(let h of g.parts)if(h.thought||h.type==="thinking"){let E=h.thinking||h.text;E&&c.push({role:"thinking",timestamp:_,content:E})}else h.functionCall?c.push(Vp(h.functionCall,_,f)):h.text&&c.push({role:"assistant",timestamp:_,content:h.text,model:f})}}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=$t(this.baseDir,"projects");try{let r=await yi(n),s=[];for(let i of r){let o=$t(n,i,"chats",`${e}.jsonl`);try{return await tR(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=$t(n,i,"chats"),a;try{a=await yi(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Bp(l,".jsonl").startsWith(e)&&s.push($t(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 Wa(t){return new $a(t)}var $a=class extends Q{constructor(e){super({provider:new Ti(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:oi})}openSession(e){return ai({...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 Yp,readFile as zp,rm as Qp,stat as Zp}from"node:fs/promises";import{basename as Ha,join as rt}from"node:path";import{fileURLToPath as lR}from"node:url";var Ei=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||rt(J,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:rt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=rt(this.baseDir,"conversations"),n;try{n=await Yp(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Ha(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return rt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return rt(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 Zp(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 ae(r)){let m=rf(c.content);if(m&&(a=m),ef(c)){let p=nf(c.content).trim();p&&(l||(l=B(p,80)),d=B(p,80)),u++}else tf(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=of(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 ae(i)){let p=uR(m.created_at,s.modifiedAt),g=rf(m.content);if(g&&(a=g),ef(m)){let _=nf(m.content),f=_.trim();f&&(l||(l=B(f,80)),d=B(f,80)),o.push({role:"user",timestamp:p,content:_});continue}if(Array.isArray(m.tool_calls))for(let _ of m.tool_calls){let f=_.name||"tool",h=mR(_.args),E=Xe(_.args),y={role:"tool_use",timestamp:p,content:h,toolName:f,toolInput:h,toolInputData:E};o.push(y),u.push({name:f,stepIndex:m.step_index,input:E,message:y})}if(tf(m)&&m.content)o.push({role:"assistant",timestamp:p,content:m.content,model:a});else if(cR(m)&&m.content){let _=_R(m,r),f=_===void 0?null:await this.readTaskLog(r,_),h={role:"tool_result",timestamp:f?.modifiedAt??p,content:m.content,toolName:m.type?.toLowerCase(),backgroundTaskId:_,...f===null?{}:{toolDetailedContent:f.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 Zp(n),n}catch{}let r=rt(this.baseDir,"conversations");try{let s=[];for(let i of await Yp(r)){if(!i.endsWith(".db"))continue;Ha(i,".db").startsWith(e)&&s.push(rt(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=of(n);return r?(await Qp(this.conversationPath(r),{force:!0}),await Qp(rt(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=rt(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await zp(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=rt(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([zp(r,"utf8"),ge(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}};async function dR(t){let e=await Promise.all(t.map(n=>ge(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 ef(t){return t.type==="USER_INPUT"}function tf(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function cR(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function nf(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function rf(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 ae(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 sf(t.filter(i=>!e.has(i)&&SR(i)===r),n.event.step_index);let s=vR(n.event);if(s!==void 0)return sf(t.filter(i=>!e.has(i)&&TR(i.name,n.event.type)&&af(ER(i))===s),n.event.step_index)}function sf(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]),af(e)}function af(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 of(t){if(t.endsWith(".db"))return Ha(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 lf}from"node:string_decoder";function vi(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:Se(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 lf("utf8"),u=new lf("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 g=p?`signal ${p}`:`exit code ${m}`,_=l.trim()||a.trim();i(new Error(jn(`${t} failed (${g})`,_?de(_,{provider:t}):"")))}),r.signal?.aborted?c():r.signal?.addEventListener("abort",c,{once:!0})})}function Xa(t){return new Ba(t)}var Ba=class extends Q{constructor(e){super({provider:new Ei(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:rm({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=vi({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)=>Ee("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 gf}from"node:crypto";import{existsSync as _f,statSync as WR}from"node:fs";import{readFile as HR,mkdir as BR}from"node:fs/promises";import{existsSync as Hr,readdirSync as NR,statSync as df}from"node:fs";import{readdir as qa,rm as xR}from"node:fs/promises";import uf,{join as st}from"node:path";var wi=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||process.env.DSH_HOME||st(J,".dsh");this.sessionsDir=st(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await qa(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await qa(st(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=cf(r),i=mf(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(st(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=st(this.sessionsDir,r,n),a=st(this.sessionsDir,s,n);!Hr(o)&&Hr(a)&&(i=s);let l=st(this.sessionsDir,i,n);return Kn(l)}async findSessionDir(e){let n;try{n=await qa(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=st(this.sessionsDir,r,s);try{let o=Kn(i);if(Hr(o))return{cwdDir:r,sessionDir:s,filePath:o}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=st(this.sessionsDir,e,n),i=Kn(s),o=await r(i),a=is(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=st(this.sessionsDir,e,n),s=Kn(r),i=await this.readRecords(e,n);return i.length===0?null:mf(i,s,cf(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 Kn(t,e){let n=e??(process.platform==="win32"?uf.win32:uf.posix),r=t,s="session.jsonl.zstd";if((t.endsWith(".jsonl.zstd")||t.endsWith(".jsonl"))&&(r=n.dirname(t),s=n.basename(t)),!Hr(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);df(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(Hr(t)&&df(t).isFile())return t}catch{}return n.join(r,s)}function Ja(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 cf(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:Ja(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:Ja(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:Ja(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 mf(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 g=p.data?.header;g?.config?.model&&(a=g.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 Hn("",-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+)/,pf=2e4;function Ga(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=>Ga(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]=Ga(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 ht=class t extends Error{method;detail;constructor(e,n,r=[]){let s=Ga(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 ff(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 Va=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 ht(e,`transport error: ${m instanceof Error?m.message:String(m)}`,this.getSecretsToRedact(s))}if(d.status>=300&&d.status<400)throw new ht(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 ht(e,`transport error: ${p instanceof Error?p.message:String(p)}`,this.getSecretsToRedact(s))}if(d.status>=300&&d.status<400)throw new ht(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 ht(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 ht(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 ht(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&&ff(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(),ff(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 ${pf}ms `+(p?`
1813
- ${de(p,{provider:"dsh"})}`:"(no output captured)")))},pf);s.stdout?.on("data",p=>{let g=p.toString();if(l+=g,a+=g,i||o)return;let _=a.split(`
1814
- `);a=_.pop()??"";for(let f of _){let h=jR.exec(f);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,g)=>{let _=g?`signal ${g}`:`exit code ${p}`;c(new Error(jn(`dsh web exited before reporting a boot URL (${_})`,d.trim()?de(d,{provider:"dsh"}):"")))})})}},Wt;async function Si(t,e=n=>Va.spawn(n)){if(Wt){let n=await Wt.catch(()=>{});if(n?.alive)return n;Wt=void 0}return Wt=e(t),Wt}async function Br(){if(!Wt)return;(await Wt.catch(()=>{}))?.shutdown(),Wt=void 0}var Ka=new Map,XR=500,Ya=8*60*60*1e3;function Za(t){return new Qa(t)}var Qa=class extends Q{dshProvider;usageSeen=new Set;constructor(e){let n=new wi(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-${gf()}`,s=za(n?.env??process.env);Ee("dsh",[],"yolo");try{let i;try{i=await Si(s)}catch(a){return{success:!1,error:`dsh sidecar failed to start: ${bi(a)}`}}try{await i.rpc("session.create",{sessionId:r,cwd:e})}catch(a){return{success:!1,error:`session.create failed: ${bi(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: ${bi(a)}`}}let o=n?.prompt??V;try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}let a=await this.promptAndWait(i,e,r,o,Ya,n?.signal);return{success:!0,sessionId:r,usage:a.usage}}catch(a){return{success:!1,sessionId:r,usage:a?.usage,error:`seed turn failed: ${bi(a)}`}}}finally{await Br()}}async dshPromptTurn(e,n){let r=Date.now();if(n.bundleSession!==void 0)return ft(n.bundleSession,"dsh",n.sessionId,e,{onDelta:n.onDelta,onProgress:n.onProgress,signal:n.signal});let s=za(n.env??process.env);Ee("dsh",[],n.permissionMode??"yolo");let i=!n.sessionId,o=i?`session-${gf()}`:n.sessionId,a;try{let l=await Si(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??Ya,n.signal)}finally{await Br()}return n.onProgress?.({kind:"system",summary:"dsh turn completed"}),{...a,sessionId:o,durationMs:Date.now()-r}}async openSession(e){let n=za(e.env??process.env);Ee("dsh",[],e.permissionMode??"yolo");let r=await Si(n),s=Ri(this.dshProvider.sessionFilePath(e.cwd,e.sessionId)),i=!1;try{i=_f(s)&&WR(s).isFile()}catch{i=!1}if(!i)throw await Br(),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 Br())};return{provider:"dsh",sessionId:o,get completedTurns(){return l},async sendTurn(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(_.signal?.aborted)throw new Error("Aborted");if(s=Ri(s),!_f(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 f=Date.now();try{let h,E=a.promptAndWait(r,e.cwd,o,g,Ya,_.signal,b=>{h=b});E.catch(()=>{});let y=()=>{},T=new Promise((b,R)=>{y=()=>{(async()=>{d=!0,await p()})().finally(()=>R(Object.assign(new Error("Aborted"),{usage:h,sessionId:o})))},_.signal?.addEventListener("abort",y,{once:!0})}),v;try{v=await Promise.race([E,T])}finally{_.signal?.removeEventListener("abort",y)}return l+=1,{...v,sessionId:o,durationMs:Date.now()-f}}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=Ri(this.dshProvider.sessionFilePath(n,r)),u=!1,c=await hf(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 Hn(r,m,this.usageSeen);u&&p.invalidateOwnership();let g=JSON.stringify([d,r]),_=Ka.get(g)??new Set;if(_.size){p.invalidateOwnership();for(let E of _)E.invalidateOwnership()}_.add(p),Ka.set(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=Ri(d);let y=await hf(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)),R=b?JR(b):"";if(v?.kind!=="completed"&&!R)throw new Error(qR(v));p.finish();let S=p.usage();return{text:R,sessionId:r,durationMs:Date.now()-l,usage:S?{...S,...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{_.delete(p),_.size||Ka.delete(g)}}};function za(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 bi(t){return t instanceof Error?t.message:String(t)}async function hf(t,e){let n;try{n=await HR(t)}catch{return e?.(),[]}e&&ar(n).reduce((i,o)=>i+o.length,0)!==n.length&&e?.();let r=is(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 Ri(t,e){return Kn(t,e)}import{mkdir as tk}from"node:fs/promises";import{existsSync as GR}from"node:fs";import{join as wf,resolve as VR}from"node:path";import{createRequire as KR}from"node:module";var el=null;function YR(){return el===null&&(el=KR(import.meta.url)("node:sqlite").DatabaseSync),el}var yf="acp";function tl(t={}){return VR(t.hermesHome?.trim()||process.env.HERMES_HOME?.trim()||wf(J,".hermes"))}function zR(t={}){return wf(tl(t),"state.db")}var Tf=`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 Xr(t){let e=typeof t=="number"&&Number.isFinite(t)?t:0;return new Date(e*1e3)}function Pe(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 Ef(t){return Pe(t.cwd)??Pe(QR(t.model_config).cwd)??"(unknown)"}var ki=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(),U({event:"hermes_store_unavailable",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),null}}selectSessionRow(e,n){return e.prepare(`SELECT ${Tf} FROM sessions WHERE id = ? AND source = ?`).get(n,yf)??null}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let n=e.prepare(`SELECT ${Tf} FROM sessions
1818
- WHERE source = ?
1819
- ORDER BY COALESCE(last_activity_at, started_at) DESC
1820
- LIMIT ?`).all(yf,this.discoverLimit),r=[];for(let s of n){let i=this.previewTexts(e,s.id);r.push({provider:this.name,sessionId:s.id,slug:Pe(s.title),cwd:Ef(s),createdAt:Xr(s.started_at),modifiedAt:Xr(s.last_activity_at??s.started_at),model:Pe(s.model),startCommand:this.name,firstUserMessage:i.first,lastUserMessage:i.last,messageCount:s.message_count??0,filePath:this.dbPath,...vf(s)})}return r}catch(n){return U({event:"hermes_discover_sessions_failed",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),[]}finally{e.close()}}activeMessageRows(e,n){let r=new Set(e.prepare("PRAGMA table_info(messages)").all().map(a=>a.name)),i=`id, session_id, role, content, tool_call_id, tool_calls, tool_name,
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=Xr(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:Pe(d.tool_call_id),toolName:Pe(d.tool_name)});continue}c.length>0&&i.push({role:"assistant",timestamp:u,content:c,model:Pe(r.model),stopReason:Pe(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:Pe(m.function?.name)??"tool_call",toolName:Pe(m.function?.name),toolCallId:Pe(m.call_id)??Pe(m.id),toolInput:typeof m.function?.arguments=="string"?m.function.arguments:JSON.stringify(m.function?.arguments??{}),toolInputData:Xe(p)})}}return{provider:this.name,sessionId:r.id,slug:Pe(r.title),cwd:Ef(r),createdAt:Xr(r.started_at),modifiedAt:Xr(r.last_activity_at??r.started_at),model:Pe(r.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:l,messageCount:r.message_count??i.length,filePath:this.dbPath,...vf(r),messages:i,userPrompts:o}}catch(r){return U({event:"hermes_load_session_failed",provider:this.name,session_id:e,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),null}finally{n.close()}}async resolveSessionPath(e){let n=this.openDb();if(!n)return null;try{return this.selectSessionRow(n,e)?this.dbPath:null}catch{return null}finally{n.close()}}async deleteSession(e){return!1}};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 vf(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 Sf(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 rl(t){return new nl(t)}var nl=class extends Q{hermesProvider;hermesHome;constructor(e){let n=new ki(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)=>Ke(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:Sf(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=tl(e)}async openSession(e){return nt({...e,env:{...e.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:Sf(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";U({event:"hermes_effort_ignored",provider:this.name,effort:n.effort,reason:i}),r.push(`hermes seed ignored effort=${n.effort}: ${i}`)}let s;try{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}:{}}):(U({event:"hermes_seed_contract_violation",provider:this.name,session_id:s.sessionId,reason:"session/new did not return a UUID session id"}),{success:!1,error:`hermes ACP session/new did not return a UUID session id (got ${JSON.stringify(s.sessionId)})`})}};import{readdir as bf,rm as ik,stat as ok}from"node:fs/promises";import{join as sl}from"node:path";var Ii=class{name="pi";baseDir;constructor(e={}){this.baseDir=e.piDir||sl(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 bf(this.baseDir)}catch{return[]}let n=[];for(let r of e){let s=sl(this.baseDir,r);try{if(!(await ok(s)).isDirectory())continue;for(let i of await bf(s))i.endsWith(".jsonl")&&n.push(sl(s,i))}catch{}}return n}async readHeader(e){for await(let n of ae(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 ge(e),s,i,o,a=0,l=0,d=0,u=0,c=0,m=0,p=0,g;for await(let _ of ae(e)){if(_.type==="model_change"&&_.provider&&_.modelId){s=`${_.provider}/${_.modelId}`;continue}if(_.type!=="message"||!_.message)continue;let f=_.message;if(f.provider&&f.model&&(s=`${f.provider}/${f.model}`),f.role==="user"){let h=il(f).trim();h&&(i||(i=B(h,80)),o=B(h,80)),a++}else if(f.role==="assistant"){a++;let h=f.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,g={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:g}}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 ae(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:il(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:Rf(d.arguments),toolName:d.name??"tool",toolInput:Rf(d.arguments),toolInputData:d.arguments,toolCallId:d.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:l,content:il(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 il(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 Rf(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}function al(t){return new ol(t)}var ol=class extends Q{constructor(e){super({provider:new Ii(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=vi({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)=>Ee("pi",t,e.permissionMode??"yolo")});import{createHash as lk}from"node:crypto";import{existsSync as dk,mkdirSync as dl,readFileSync as uk,renameSync as ck,rmdirSync as Lf,statSync as mk,writeFileSync as pk}from"node:fs";import{dirname as pl,join as kf,resolve as ll}from"node:path";var Yn=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 Df(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Ai(t){return Math.max(1,Math.ceil(t.length/4))}function zn(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return ll(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?kf(pl(ll(n)),".lmctl-claude-mock","sessions.json"):kf(ll(t),".lmctl-claude-mock","sessions.json")}function If(){return{schemaVersion:1,sessions:{}}}function qr(t){if(!dk(t))return If();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=ul(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return If()}}function Pf(t,e){dl(pl(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,Af=1e4;function Tk(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function Ek(t){let e=`${t}.lock`;dl(pl(t),{recursive:!0});let n=Date.now()+Af;for(;;)try{return dl(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-mk(e).mtimeMs>hk){try{Lf(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${Af}ms: ${e}`);Tk(yk)}}function vk(t){try{Lf(t)}catch{}}function Mf(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 Uf(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(Sk)}}function Ci(t,e=process.cwd()){let n=Yn.get(t);if(n!==void 0)return n;let s=qr(zn(e)).sessions[t];if(s===void 0)return;let i=Uf(s);return Yn.set(i.sessionId,i),i}function Cf(t){Yn.set(t.sessionId,t);let e=zn(t.cwd);Mf(e,()=>{let n=qr(e);n.sessions[t.sessionId]=bk({...t,filePath:e}),Pf(e,n)})}function Rk(t,e=process.cwd()){let n=zn(e);return Mf(n,()=>{let r=qr(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],Pf(n,r)),s})}function kk(){let t=qr(zn()),e=Object.values(t.sessions).map(Uf);for(let n of e)Yn.set(n.sessionId,n);return e}function ul(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function Nf(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=ul(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=ul(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function xf(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=Nf(n[t]??n[Df(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let i=Nf(r[s]);if(i!==void 0)return i}}}function Of(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 cl=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of kk())e.set(n.sessionId,n);for(let n of Yn.values())e.set(n.sessionId,n);return[...e.values()].map(Of)}async loadSession(e){let n=Ci(e);return n===void 0?null:{...Of(n),messages:n.messages.slice()}}async resolveSessionPath(e){return Ci(e)?.filePath??null}async deleteSession(e){let n=Yn.delete(e),r=Rk(e);return n||r}},ml=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new cl;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=zn(e),a=Ci(s,e),l=n?.prompt??"ClaudeMock seed",d=Ai(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+=Ai("ACK: ClaudeMock seeded"),Cf(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=Ci(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=qr(zn(n.cwd)),a=Ik(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await xf(l),new Error(a.error);let d=a?.kind==="success"?a.text:`ClaudeMock ack: ${Df(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+=Ai(e),s.totalOutputTokens+=Ai(d),Cf(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await xf(l),{text:d,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}};function fl(){return new ml}function Ht(t){let e=[ia({museDataHome:t?.museDataHome}),ya({miniplayerHome:t?.miniplayerHome}),Ea({claudeDir:t?.claudeDir}),ba({codexDir:t?.codexDir,codeDir:t?.codeDir}),Aa({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),xa({copilotDir:t?.copilotDir}),La({dbPaths:t?.opencodeDbPaths}),Ua({kimiHome:t?.kimiHome}),ja({lmplayerDbPath:t?.lmplayerDbPath,lmplayerDbPaths:t?.lmplayerDbPaths}),Wa({qwenDir:t?.qwenDir}),Xa({agyDir:t?.agyDir}),Za({dshHome:t?.dshHome}),rl({hermesHome:t?.hermesHome}),al({piDir:t?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(fl()),e}var gl=null;function Ff(){return gl===null&&(gl=Dt(Ht())),gl}function jf(t,e){Ms(e);let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function $f(t){let e=t.registry??Ff(),n=jf(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 Bo(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 Wf(t){return Bo(jf(t.registry??Ff(),t.provider),t)}import{join as be}from"node:path";var Hf=new WeakMap;function Ni(t){let e=Hf.get(t);if(e)return e;let n=t.env.HOME;if(!n)return Dt(Ht());let r=t.env.XDG_DATA_HOME||be(n,".local/share"),s=t.env.XDG_CONFIG_HOME||be(n,".config");return e=Dt(Ht({museDataHome:r,miniplayerHome:t.env.MINIPLAYER_HOME||be(r,"miniplayer"),claudeDir:be(n,".claude"),codexDir:be(n,".codex"),codeDir:be(n,".code"),geminiDir:be(n,".gemini"),copilotDir:be(n,".copilot"),qwenDir:be(n,".qwen"),opencodeDbPaths:[be(r,"opencode/opencode.db"),be(s,"opencode/opencode.db")],agyDir:be(n,".gemini/antigravity-cli"),dshHome:be(n,".dsh"),hermesHome:t.env.HERMES_HOME??be(n,".hermes"),kimiHome:t.env.KIMI_CODE_HOME??be(n,".kimi-code"),piDir:be(n,".pi/agent/sessions"),lmplayerDbPaths:fa(t.env,n)})),Hf.set(t,e),e}var Xt=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))Xt(e);Object.freeze(t)}return t},Ak=Xt(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed"]),ij=Xt({status:"string",error:"string|null",code:"ErrorCode?"}),oj=Xt(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),aj=Xt(["Provider1.Provider","Provider1.Model1","Provider1.Model2","Provider1.Model3","Provider2.Provider","Provider2.Model1","Provider2.Model2","Provider2.Model3","Provider3.Provider","Provider3.Model1","Provider3.Model2","Provider3.Model3"]),lj=Xt(["Provider1","Provider2","Provider3"]),dj=Xt({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),K={name:"ctx",type:"context"},_l={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},it={name:"teamfile",type:"string"},xi={name:"alias",type:"string"},Bt={name:"prompt",type:"string"},Oi={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"}]},Di=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],Qn={name:"options",type:"map",optional:!0,keys:Di},Bf={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},Xf={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},qf={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},Zn={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},Li={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"}],Jf={name:"options",type:"map",optional:!0,keys:Ck},Gf={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},Nk=Xt([{name:"resolveProfilePath",implemented:!0,params:[K,_l],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[K,_l],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:[K,{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:[K,it],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[it]}},{name:"resolveMember",implemented:!0,params:[K,it,xi],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:[it,xi]}},{name:"lintTeam",implemented:!0,params:[K,it],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:[it]}},{name:"seedTeam",implemented:!0,params:[K,it,Bf],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:[it,Bf]}},{name:"promptAgent",implemented:!0,params:[K,Oi,Bt,Qn],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...Gf,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[Oi,Bt,Qn]}},{name:"promptMember",implemented:!0,params:[K,{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"},...Di]}],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:[it,xi,Bt,{name:"options",type:"map",optional:!0,keys:[...Di,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[K,{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:[K,Zn,qf],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:[Oi,{...qf,optional:!0}]}},{name:"getSession",implemented:!0,params:[K,Zn],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:[Zn]}},{name:"reserveSession",implemented:!0,params:[K,Zn],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:[K,Zn,{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:[K,{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"},...Di]}],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:[K,{name:"batch",type:"BatchRef"},Bt,{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:[K,{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:[K,Xf],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:[Xf]}},{name:"openTerminal",implemented:!0,params:[K,{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:[it,xi]}},{name:"sessionAdmission",implemented:!0,params:[K,Zn],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:[K,{name:"reservation",type:"SessionReservation"},Oi,Bt,Qn],statuses:["ok","busy","stalled","empty","error"],results:{...Gf,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[K,{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:[K,{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:[K,{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"}]},Qn],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:[K,{name:"session",type:"NativeSessionRef"},Bt],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:[K,{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:[K,{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:[K,Li,Bt,Qn],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:[Li,Bt,Qn]}},{name:"nativeSessionClose",implemented:!0,params:[K,Li],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:[Li]}},{name:"loadProperties",implemented:!0,params:[K,_l],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:[K,Jf],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:[Jf]}}]);function Pi(t){if(!Kc(t))return Z("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return Z("cancelled","Context is closed")}function Vf(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 Ej,renameSync as vj,existsSync as Lk}from"node:fs";import{basename as Dk,resolve as Ui,dirname as hl}from"node:path";var Mi=["title","description","members"],xk=new Set(Mi),ot=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}};function Kf(t){if(t.length===0||!t.startsWith("---"))throw new ot("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1824
- `);if(e[0]!=="---")throw new ot("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 ot(`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 ot(`unknown frontmatter key "${d}" \u2014 allowed keys: ${Mi.join(", ")}`);n[d]=u}if(r===-1)throw new ot("frontmatter not closed (missing trailing `---` on its own line)");for(let o of Mi)if(n[o]===void 0)throw new ot(`missing required frontmatter key "${o}" \u2014 required: ${Mi.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 yl(t){return/\.(?:lmctl|lmc)$/i.test(t)}function Tl(t){return Dk(t).replace(/\.(?:lmctl|lmc)$/i,"")}function El(t){let e=Ok(t,"utf-8"),n=hl(Ui(t)),r=vl(e,Tl(t),{baseDir:n,sourcePath:Ui(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Ui(n,s.sessiondir));return r}var Yf=["alias","provider","sessionid","sessiondir","teamfile","model","effort"];function vl(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=Kf(i)}catch(l){if(l instanceof ot)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(!Yf.includes(p))throw new Error(`line ${u}: unknown key "${p}" on _MEMBER_ line: ${d.trim()}
1827
- allowed keys: ${Yf.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 wl(t){return t.members.find(e=>e.alias.toLowerCase()===Pk.toLowerCase())}function Sl(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=Ui(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=El(i),l=wl(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Sl(l,hl(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||hl(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function zf(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 rg}from"node:path";import{createHash as $k}from"node:crypto";import{existsSync as Qf,readFileSync as Zf,realpathSync as Wk}from"node:fs";import{dirname as Hk,resolve as eg}from"node:path";var bl=5,Fi=class extends Error{constructor(e){super(e),this.name="ForeignSessionidOwnershipError"}};function yt(t,e){let n=eg(t);if(Qf(n))return Wk(n);if(e!==void 0){let r=Xk(t,n,e);if(r!==null)return r}return n}function tg(t,e){let n=Hk(e),r=vl(t,Tl(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=eg(n,s.sessiondir));return r}function er(t,e,n=r=>{process.stderr.write(`warning: ${r}
1828
- `)}){let r=yt(t,Bk(e)?e:void 0);if(Qf(r)){let i=Zf(r,"utf8"),o=tg(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>=bl)}function Jk(t,e,n){let r=yt(e),s=n.members.filter(i=>i.teamfile===void 0&&i.session!==void 0&&i.session.length>=bl);if(s.length!==0)for(let i of t.listRootTeams()){let o,a;try{if(o=yt(i.teamfile_path),o===r)continue;a=Zf(o,"utf8")}catch(d){if(Gk(d))continue;throw d}let l=tg(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)>=bl);if(u!==void 0)throw new Fi(`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 Fi))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 Oj,openSync as Lj,readFileSync as Kk,statSync as Yk,unlinkSync as Dj,writeFileSync as Pj}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:ng(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 ng(t);try{return process.kill(n,0),!0}catch(r){return r.code!=="ESRCH"}}function ng(t){try{return Date.now()-Yk(t).mtimeMs<3e5}catch{return!1}}function Rl(t,e){return Qk(zk(t,e))}var Re=class extends Error{constructor(e,n){super(e),this.name="ChatTargetError",n&&Object.defineProperty(this,"kind",{value:n})}};var kl=/^[A-Za-z][A-Za-z0-9_-]*$/;function eI(t){return kl.test(t)}function Il(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),n=t.slice(0,e),r=t.slice(e+1);return!yl(n)||!kl.test(r)?null:{teamfile:n,alias:r}}function gn(t,e,n){if(!yl(t))throw new Re(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl or .lmc extension).`);if(!eI(e))throw new Re(`lmctl: "${e}" is not a valid alias (must match ${kl.source}).`);let r=yt(t,n);if(n===void 0&&!Zk(r))throw new Re(`lmctl: teamfile not found: ${t}`,"not_found");let s;try{s=er(r,n)}catch(o){throw new Re(`lmctl: ${t}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new Re(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let i=zf(s,e);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new Re(`lmctl: alias "${e}" not found in ${t}.
1829
- Known aliases: ${o}`,"not_found")}if(i.teamfile!==void 0){let o=Sl(i,rg(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(Rl(r,i.alias))throw new Re(`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=>Rl(r,o.alias))?new Re(`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 Re(`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??rg(r),isLead:wl(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}import{hostname as tI,networkInterfaces as Jj}from"node:os";var nI=12e4;function rI(t=process.env){return sI(t.LMCTL_TERMINAL_LOCK_STALE_MS,nI)}function Al(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 Jr(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 Tg}from"node:fs";import{dirname as RI,join as ji}from"node:path";import{createHash as kI}from"node:crypto";var EI=ed(xl(),1);function Et(t){let e=t.env?.LMCTL_DB;return e!==void 0&&e.length>0?e:Un(void 0,{...process.env,...t.env})}async function ie(t,e){if(t.dal!==void 0)return e(t.dal);let n=et({path:Et(t)});try{return await e(n)}finally{n.close()}}function hg(t){if(t===void 0)return null;let e=Number.parseInt(t,10);return Number.isInteger(e)&&e>0?e:null}var _g=!1;function yg(t){if(t.stdout!==process.stdout||_g)return;_g=!0;let e=n=>{throw n.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),n};process.stdout.on("error",e)}var Gr={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null};var bg=t=>t.record_id??t.source+":"+t.source_model_id,Eg=t=>t===null||typeof t=="number"&&Number.isFinite(t)&&t>=0;function Dl(t){if(!Zt(t.catalog)||!en(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=bg(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(!Eg(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&&!Eg(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 vg(t){let e=vI(t,Tg.O_RDONLY|Tg.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 wg=t=>JSON.parse(t.replace(/^\uFEFF/,""));function AI(t,e=ji(RI(t),"aliases.json")){let n=vg(t),r=vg(e),s;try{s=wg(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=wg(r),o={catalog:s,aliases:i,source:"pinned",generatedAt:s?.generated_at||null,sha256:kI("sha256").update(n).update(r).digest("hex")};return Dl(o),o}function Ll(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 Dl(i),i})():null}finally{t.pragma("busy_timeout = "+e)}}function CI(t,e,n={}){Dl(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(bg(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 Ol=new WeakMap;async function NI(t,e={}){let n=e.now??Date.now(),r={...process.env,...e.env},s=Ll(t),i=Ol.get(t),o=i&&i.hash===s?.sha256?i.at:Date.parse(s?.fetchedAt??"");if(!e.force&&s&&n>=o&&n-o<Es(r))return{status:"unchanged",snapshot:s};let a=e.load??(()=>r.LMCTL_PRICE_DATA?Promise.resolve(AI(ji(r.LMCTL_PRICE_DATA,"model_list.json"))):Mu({cacheDir:r.LMCTL_HOME?ji(r.LMCTL_HOME,"cache","lmprice"):r.HOME?ji(r.HOME,".lmctl","cache","lmprice"):void 0,ttlMs:e.force?0:Es(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(Ol.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=Ll(t);return Ol.set(t,{hash:c?.sha256??null,at:n}),{status:u,snapshot:c}}async function Sg(t,e){try{return(await NI(t,{env:e,budgetMs:900})).snapshot??Gr}catch(n){if(/^SQLITE_(BUSY|LOCKED)(_|$)/.test(String(n?.code)))return Gr;try{return Ll(t)??Gr}catch{return Gr}}}async function Pl(t){if(t.dal)return Sg(t.dal.db,t.env);let e;try{return e=et({path:Et(t),recover:!1}),await Sg(e.db,t.env)}catch{return Gr}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 kg}from"node:os";import{dirname as Vr,join as Ce,resolve as UI}from"node:path";var $i="lmctl",Wi="lmctl0",FI={existsSync:xI,mkdirSync:OI,readFileSync:LI,writeFileSync:MI,renameSync:DI,unlinkSync:PI},Ge=FI,Ml;function Ig(t,e,n){let r=Vr(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())lt(Ce(o,".mcp.json"),"mcpServers",[qt(),Jt()]),a.has("opencode")&&lt(Ce(o,".opencode","opencode.json"),"mcp",[Ag(),Cg()]),a.has("kimi")&&lt(Ce(o,".kimi-code","mcp.json"),"mcpServers",[qt(),Jt()]);for(let o of s)HI(o)}function jI(t=Ml??kg()){return Ce(t,".copilot","mcp-config.json")}function $I(t,e){Ge.mkdirSync(Vr(t),{recursive:!0});let n=Ce(Vr(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Ge.writeFileSync(n,`${JSON.stringify(e,null,2)}
1831
- `,"utf8"),Ge.renameSync(n,t)}catch(r){try{Ge.unlinkSync(n)}catch{}throw r}}function WI(t,e){Ge.mkdirSync(Vr(t),{recursive:!0});let n=Ce(Vr(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Ge.writeFileSync(n,e,"utf8"),Ge.renameSync(n,t)}catch(r){try{Ge.unlinkSync(n)}catch{}throw r}}function lt(t,e,n){try{if(!Ge.existsSync(t))return;let r=JSON.parse(Ge.readFileSync(t,"utf8"));if(!nr(r)||!nr(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),U({event:"mcp_cleanup",path:t,removed:i})}catch{}}function qt(){return{name:Wi,shouldRemove:YI}}function Ag(){return{name:Wi,shouldRemove:zI}}function Jt(){return{name:$i,shouldRemove:VI}}function Cg(){return{name:$i,shouldRemove:KI}}function HI(t){let e=Ml??kg();switch(t){case"copilot":lt(jI(e),"mcpServers",[qt(),Jt()]);return;case"claude":lt(Ce(e,".claude.json"),"mcpServers",[qt(),Jt()]);return;case"gemini":lt(Ce(e,".gemini","settings.json"),"mcpServers",[qt(),Jt()]);return;case"qwen":lt(Ce(e,".qwen","settings.json"),"mcpServers",[qt(),Jt()]);return;case"agy":lt(Ce(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[qt(),Jt()]);return;case"opencode":lt(Ce(e,".config","opencode","opencode.json"),"mcp",[Ag(),Cg()]);return;case"kimi":lt(Ce(Ml===void 0?process.env.KIMI_CODE_HOME??Ce(e,".kimi-code"):Ce(e,".kimi-code"),"mcp.json"),"mcpServers",[qt(),Jt()]);return;case"codex":BI(Ce(e,".codex","config.toml"));return;default:return}}function BI(t){try{if(!Ge.existsSync(t))return;let e=Ge.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=Ng(l);if(d===null)return;if(d!==void 0){if(Rg(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&&Rg(u,n)){i.add(u[1]);continue}s.push(l)}if(i.size===0)return;WI(t,s.join(`
1832
- `)),U({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function Rg(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=Ng(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]!==$i&&d[1]!==Wi)continue;let u=e.get(d[1])??{};if(d[2]==="command"){let c=xg(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===$i&&Lg(i.command,i.args)&&r.add(s),s===Wi&&Dg(i.command,i.args)&&r.add(s);return r}function qI(t,e){if(t.startsWith("mcp_servers"))return Hi(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=Hi(t);return n===null?null:[...e,...n]}function Ng(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Hi(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 Hi(n)}function Hi(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 xg(t){let e=Og(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=Og(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=>xg(s.trim()));return r.some(s=>s===null)?null:r}function Og(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 nr(t)?t.type==="stdio"&&typeof t.command=="string"&&Lg(t.command,t.args):!1}function KI(t){return!nr(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"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&Pg(t.command[0],[t.command[1],t.command[2]])}function YI(t){return nr(t)?t.type==="stdio"&&Dg(t.command,t.args):!1}function zI(t){return!nr(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Ug(t.command[0])&&t.command[1]==="mcp"}function Lg(t,e){return Mg(t)&&Fg(e)||Pg(t,e)}function Dg(t,e){return Ug(t)&&Fg(e)}function Pg(t,e){return QI(t)&&Array.isArray(e)&&e.length===2&&ZI(e[0])&&e[1]==="mcp"}function Mg(t){return typeof t=="string"&&Ul(t)==="lmctl"}function Ug(t){return typeof t=="string"&&Ul(t)==="lmctl0"}function QI(t){if(typeof t!="string")return!1;let e=Ul(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 Ul(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function Fg(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function nr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}import{basename as eA}from"node:path";var tA=6e4,nA=2,jg=8*60*60*1e3;function Wg(t,e){let n=new Date(e.now.getTime()-Bi()).toISOString(),r=Xg(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&&!$g(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=>$g(p,o)),d=l.map(p=>p.at).filter(p=>p!==null).sort((p,g)=>g-p)[0]??null,u=d!==null&&e.now.getTime()-d<tA,c=Fl(e.sender,r).length;return{stop:l.length>=1&&u&&c>=nA,chain:oA(a)}}function Hg(t,e){let n=new Date(e.now.getTime()-Bi()).toISOString(),r=Xg(t,n),s=Fl(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 Bi(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return jg;let n=Number(e);return!Number.isFinite(n)||n<=0?jg:n}function Bg(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 Xg(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(_n(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([_n(t)]);for(let a=0;a<64;a+=1){let l=r.get(_n(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=_n(l.sender);if(o.has(u))break;s.unshift(d),o.add(u),i=l.sender}return s}function Fl(t,e){let n=_n(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=_n(l.sender),u=_n(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=Fl(t,e);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function $g(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function _n(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(yc(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 qg(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 E$=new Set(Object.keys(lA));var jl=null;function Jg(){return jl===null&&(jl=Dt(Ht())),jl}function Gg(t,e){return Jg().getSession(t,e)}async function Vg(t){return(await Jg().resolveSessions(t)).map(n=>n.provider.name)}var Kg=36e5;function dA(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return Kg;let n=Number(e);return!Number.isFinite(n)||n<=0?Kg:n}async function uA(t,e,n){try{let r=gn(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 Vg(s);if(d.length!==1)return null;i=d[0]}let o=await Gg(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 Yg(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&&U({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var zg=ed(xl(),1);function cA(t){return t===null?null:$e(t)?"live":"dead"}function $l(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,zg.formatDuration)(t)}function Wl(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 Qg(t,e=process.env,n){let r=n?.db?.name??Un(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 ${Xc(r,s)}
1839
- To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function Zg(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[ea];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let i of e.listRootTeams()){let o;try{o=er(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 e_(t){let e=Il(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var $$=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=et({path:Et(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&&$e(a.holder_pid)),pollMs:fA,settleMs:gA,maxHoldMs:Ot(n),onHold:()=>U({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&U({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function t_(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 $f(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&&He(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 n_=256*1024,o_=3e4;async function a_(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,p=()=>{let g=t.signal?.reason;if(i===null||!["SIGINT","SIGTERM","SIGHUP"].includes(g))return;let _;try{_=n.dal??et({path:Et(n)}),_.finishTrackedInvocation(i,{status:"cancelled",signal:g,exit_code:g==="SIGINT"?130:g==="SIGTERM"?143:129,error:`prompt holder received ${g}`,team_chat_log_id:l}),s!==null&&_.releaseAgentInflight(s.row,s.leaseId)}catch(f){n.stderr.write(`error: failed to record holder ${g}: ${String(f)}
1841
- `)}finally{n.dal===void 0&&_?.close()}};t.signal?.addEventListener("abort",p,{once:!0});try{let g=t.resolvedNativeTarget,_=g!==void 0;if(_&&(t.heldLease===void 0||t.conversation===void 0))throw new Re("native session turns require a caller-held lease and conversation");let f=_?g:await ie(n,N=>gn(t.teamfile,t.alias,N));if(t.expectedSession!==void 0&&(f.provider!==t.expectedSession.provider||f.sessionid!==t.expectedSession.sessionid))throw new Re(`session changed for ${f.alias}; expected ${t.expectedSession.provider}:${t.expectedSession.sessionid}, found ${f.provider}:${f.sessionid}`);if(_&&(t.conversation.provider!==f.provider||t.conversation.sessionId!==f.sessionid))throw new Re("native session changed for "+f.alias+"; expected "+f.provider+":"+f.sessionid+", found "+t.conversation.provider+":"+t.conversation.sessionId);let h=f.teamfile,E=await ie(n,N=>NA(N,t.env??process.env)),y=E.sender,T=_?"native:"+f.provider+":"+f.sessionid:await xA(n,{explicitRoot:t.rootFlag,sender:y,receiverTeamfile:h,operatorOrigin:E.origin==="operator"}),v=t.env??process.env;if(!_){let N=await ie(n,D=>D.getRootTeam(T)?.name??null);N!==null&&(v.LMBEE_TEAM_NAME=N)}if(i=await SA(n,{receiverTeamfile:h,receiverAlias:f.alias,sender:y,rootTeamfile:T,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:E.origin,parentInvocationId:hg(v.LMCTL_INVOCATION_ID)}),o=IA(n,i),t.signal?.aborted)throw p(),Error("Chat turn cancelled");i!==null&&(v.LMCTL_INVOCATION_ID=String(i));try{_||Ig(n,El(h),h)}catch{}r={root_teamfile:T,sender_teamfile:y?.teamfile??null,sender_alias:y?.alias??null,receiver_teamfile:h,receiver_alias:f.alias,receiver_provider:f.provider,receiver_session_id:f.sessionid,origin:E.origin,message_type:t.messageType??null};let b=await d_(n,h,f.alias);if(b!==null){let N=Jr(b);return hn(i,r,t.prompt,N,"unavailable"),u=Hl(N,null),{status:"busy",message:N,teamChatLogId:null}}let R=!1;if(t.heldLease!==void 0){let N=t.heldLease;if(!await ie(n,L=>{let $=L.getAgentInflight(h,f.alias);return $===null||$.sender_teamfile!==N.row.sender_teamfile||$.sender_alias!==N.row.sender_alias||$.started_at!==N.row.started_at||$.holder_pid!==process.pid?!1:L.heartbeatAgentInflight(N.row,N.leaseId,new Date().toISOString())})){let L=`bundle lease lost for ${f.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return hn(i,r,t.prompt,L,"unavailable"),u=Kr(L,null),{status:"error",errorKind:"provider",message:L,teamChatLogId:null,messageId:null}}}else{let N=await EA(n,h,f.alias);if(N.busy){let D=await vA(n,h,f.alias);return D+=await wA(n,h,f.alias),hn(i,r,t.prompt,D,"unavailable"),u=Hl(D,null),{status:"busy",message:D,teamChatLogId:null}}R=N.idleReclaim}if(y!==null&&y.teamfile!==h){let N=await ie(n,D=>Wg(D,{root:T,sender:y,receiverTeamfile:h,receiverAlias:f.alias,now:new Date}));if(N.stop){let D=Bg(N.chain);return hn(i,r,t.prompt,D,"cycle"),u=Kr(D,null),{status:"error",errorKind:"cycle",message:D,teamChatLogId:null,messageId:null}}}if(t.heldLease===void 0){let N=await OA(n,{receiver_teamfile:h,receiver_alias:f.alias,sender_teamfile:y?.teamfile??h,sender_alias:y?.alias??"operator",...R?{force:!0,reclaimReason:"session-idle"}:{}});if(!N.acquired){let D=u_(h,f.alias,N.current);return D+=` ${Wl($l({holderPid:N.current.holder_pid,since:N.current.started_at}))}`,hn(i,r,t.prompt,D,"unavailable"),u=Hl(D,null),{status:"busy",message:D,teamChatLogId:null}}s={row:N.lease,leaseId:N.leaseId},t.onInflightAcquired?.(s),a=As(D=>ie(n,L=>L.heartbeatAgentInflight(s.row,s.leaseId,D)),{intervalMs:o_,onError:D=>{ue()&&He(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:D instanceof Error?D.message:String(D)}))}})}if(t.signal?.aborted)throw Error("Chat turn cancelled");m=Qu({provider:f.provider,modelRequested:f.model??null,cwd:f.sessiondir,sessionId:f.sessionid}),r&&(r.started_at=m.startedAt);let S=await t_({sender:y??{teamfile:h,alias:"operator"},receiver:{teamfile:h,alias:f.alias,provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir,...f.model!==void 0?{model:f.model}:{},...f.effort!==void 0?{effort:f.effort}:{},...f.isLead!==void 0?{isLead:f.isLead}:{}},signal:t.signal,newMessage:t.prompt,newMessageFrom:y===null?"operator":`${y.teamfile}:${y.alias}`,..._?{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:N=>e({kind:"delta",chunk:N}),onProgress:N=>e({kind:"progress",alias:f.alias,event:N}),onPromptBuilt:async N=>{c=N,l===null&&(l=await DA(n,{...r,message:N,usage:m}),l!==null&&(t.onAccepted?.(pt(l)),i!==null&&await kA(n,i,l))),i!==null&&await RA(n,i,N)}});c=S.prompt;let O=S.status==="stalled",C=S.status==="empty",k=null,w=O?`provider stalled${S.stalledAfterMs!==void 0?` after ${S.stalledAfterMs}ms`:""}`:C?"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,I=O||C||S.status==="error"?"error":"ok",A=await Oo(m,{status:S.status,sessionId:S.sessionId,usage:S.usage},()=>Pl(n),{db:n.dal?.db,dbPath:Et(n),env:n.env});l!==null?(await s_(n,l,{...r,message:c,response:S.receipt,status:I,error_detail:w,usage:A}),d=!0,k=l):k=await i_(n,{...r,message:c,response:S.receipt,status:I,error_detail:w,usage:A});let x=S.status!=="error"?S.warnings:void 0;if(O||C){let N=w;hn(i,r,c,N,"error"),u=Kr(N,k,S.receipt,x)}else u=AA(S.receipt,k,x);return{status:O?"stalled":C?"empty":"ok",replyText:S.receipt,wroteDelta:S.wroteDelta,teamChatLogId:k,messageId:k===null?null:pt(k),durationMs:S.durationMs}}catch(g){let _=g instanceof Error?g.message:String(g),f=g,h=m?await Oo(m,{status:Zu(_,!!t.signal?.aborted),usage:f?.usage,sessionId:f?.sessionId},()=>Pl(n),{db:n.dal?.db,dbPath:Et(n),env:n.env}):void 0;return l!==null&&!d&&r!==null&&(await s_(n,l,{...r,message:c,response:null,status:"error",error_detail:_,usage:h}),d=!0),l===null&&r!==null&&h&&(l=await i_(n,{...r,message:c,response:null,status:"error",error_detail:_,usage:h})),hn(i,r,c,_,"error"),u={...Kr(_,l),signal:g?.signal??null,exit_code:g?.exitCode??null},{status:"error",errorKind:g instanceof Re?"target":"provider",message:_,teamChatLogId:l,messageId:l===null?null:pt(l)}}finally{t.signal?.removeEventListener("abort",p),o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await PA(n,r,pt(l)),s!==null&&await LA(n,s.row,s.leaseId)&&t.onInflightReleased?.(s.leaseId),i!==null&&await bA(n,i,u??Kr("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 ie(t,i=>(qg(i,e,n),wr(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await ie(t,i=>Yg(i,r,e,n));return{busy:!s,idleReclaim:s}}async function vA(t,e,n){let r=await d_(t,e,n);if(r!==null)return Jr(r);let s=await ie(t,i=>i.getAgentInflight(e,n));return s!==null?u_(e,n,s):`${n} is busy; wait and retry`}async function wA(t,e,n){let r=await ie(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${Wl($l({holderPid:r.holder_pid,since:r.started_at}))}`}async function SA(t,e){try{return(await ie(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()&&He(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function bA(t,e,n){try{await ie(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){ue()&&He(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 ie(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){ue()&&He(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 ie(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){ue()&&He(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(()=>{ie(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{ue()&&He(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},o_);return n.unref?.(),n}function l_(t){return t!==void 0&&t.length>0?{config_warnings:JSON.stringify(t)}:{}}function AA(t,e,n){return{status:"done",result_summary:Xi(t),error:null,team_chat_log_id:e,...l_(n)}}function Hl(t,e){return{status:"busy",result_summary:Xi(t),error:t,team_chat_log_id:e}}function Kr(t,e,n,r){return{status:"error",result_summary:n===void 0?im(t,500):Xi(n),error:t,team_chat_log_id:e,...l_(r)}}function Xi(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=Zg(e,t);if(n.ok)return{sender:e_(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Qg("chat",e,t))}async function xA(t,e){if(e.explicitRoot!==void 0)return await ie(t,r=>yt(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await ie(t,r=>Hg(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function OA(t,e){return await ie(t,n=>{let r=ue(),s=Cs(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:Bi(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&He(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:r_(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&He(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:r_(s.current)})),{acquired:!1,current:s.current})})}async function d_(t,e,n){return await ie(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(Al(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:Al(s).live?s:null})}function r_(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 ie(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)}
1842
- `)}return!1}function u_(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=Yr(e.message);try{return await ie(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)}
1843
- `),null}}async function s_(t,e,n){let r=Yr(n.message),s=n.response===null?null:Yr(n.response);try{await ie(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)}
1844
- `)}}async function PA(t,e,n){if(e!==null)try{await ie(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)}
1845
- `)}}async function i_(t,e){let n=Yr(e.message),r=e.response===null?null:Yr(e.response);try{return await ie(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)}
1846
- `),null}}function hn(t,e,n,r,s){t!==null||e===null||U({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:Xi(n)})}function Yr(t){return t.length<=n_?{text:t,truncated:!1}:{text:t.slice(0,n_),truncated:!0}}var p_=new WeakMap;function f_(t,e){let n=e&&typeof e=="object"?p_.get(e):void 0;return n?.ctx===t?n:void 0}function qi(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(m_(a,l))}catch(l){if(l.code!=="ENOENT")throw l}let i=new Map;for(let a of s){let l;try{l=er(a,e)}catch(d){if(/missing on disk|teamfile not found/.test(_e(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=gn(a,d.alias,e);u.provider===n.provider&&u.sessionid===n.sessionid&&i.set(JSON.stringify([yt(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 Bl(t,e){return t.alias+" is servicing "+e.sender_alias+" ("+e.sender_teamfile+") since "+e.started_at+" \u2014 wait and retry"}function g_(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 Xl(t){return t.closing||(t.closed=!0,t.stopHeartbeat(),t.controller.abort(),t.closing=(async()=>{let e=c_.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-(c_.now()-e)))})])}finally{n&&clearTimeout(n),g_(t,!0),t.untrack()}})()),t.closing}function jA(t){t.closed=!0,t.stopHeartbeat(),t.controller.abort(),t.conversation&&t.conversation.close().catch(()=>{}),g_(t,!0),t.untrack()}async function ql(t,e,n={},r){let s;try{let i=Pi(t);if(i)return i;if(!e||typeof e!="object"||Array.isArray(e))return Z("invalid_argument","Native session member must be a map");for(let S of["provider","sessionid"])if(typeof e[S]!="string"||!e[S].trim())return Z("invalid_argument","Native session requires provider and sessionid");for(let S of["sessiondir","model","effort"])if(e[S]!==void 0&&(typeof e[S]!="string"||!e[S].trim()))return Z("invalid_argument","Native session "+S+" must be a nonempty string");if(!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).some(S=>!["permissionMode","idleTimeoutMs"].includes(S)))return Z("invalid_argument","Native session options must contain permissionMode or idleTimeoutMs");if(n.permissionMode!==void 0&&!["yolo","plan"].includes(n.permissionMode))return Z("invalid_argument","permissionMode must be yolo or plan");if(n.idleTimeoutMs!==void 0&&(!Number.isFinite(n.idleTimeoutMs)||n.idleTimeoutMs<0))return Z("invalid_argument","idleTimeoutMs must be finite and nonnegative");let o=br(t),a=UA(t.cwd,e.sessiondir??t.cwd),l;try{l=qi(t,o,e,a)}catch(S){return Z("invalid_argument",_e(S))}let d=Ni(t);if(!await d.getSession(e.sessionid,e.provider))return Z("not_found","Native session was not found");if(t.closed)return Z("cancelled","Context is closed");let c=l.member,m=wr(o,c.teamfile,c.alias);if(m.busy)return{status:"busy",error:m.reason==="in-flight"?Bl(c,m.inFlight):m.source==="terminal-lock"?Jr(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()},g=o.getAgentInflight(c.teamfile,c.alias),_=g!==null&&(g.native_provider!==null&&g.native_provider!==void 0||g.native_session_id!==null&&g.native_session_id!==void 0);if(_&&!r)return{status:"busy",error:Bl(c,g)};let f=r&&_?o.tryAcquireNativeHolder(p,r):void 0,h=f?f.acquired?{acquired:!0,lease:f.current,leaseId:f.lease_id}:{acquired:!1,current:f.current}:Cs(o,{...p,ttlMs:Ot(t.env),...r?{nativeHolder:r}:{}});if(!h.acquired)return{status:"busy",error:Bl(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=Gc(t,{close:()=>Xl(y),finalizeSync:()=>jA(y)});let T=As(S=>o.heartbeatAgentInflight(y.lease.row,y.lease.leaseId,S),{intervalMs:Is(t.env)});y.stopHeartbeat=()=>clearInterval(T);let v=Wf({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:js(t.env.HOME?m_(t.env.HOME,".lmctl/config.toml"):void 0)});v.then(S=>{y.closed&&S.close().catch(()=>{})}).catch(()=>{});let b,R=new Promise((S,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,R])}finally{t.signal.removeEventListener("abort",b)}if(t.closed||y.closed)throw Error("Context is closed");return p_.set(E,y),Ps({session:E})}catch(i){if(s)try{await Xl(s)}catch(o){return Z("provider",_e(i)+"; "+_e(o))}return Z(t?.closed?"cancelled":"provider",_e(i))}}async function Jl(t,e,n,r=void 0){let s=(l,d="invalid_argument")=>({status:"error",reply:"",error:l,code:d,messageId:null,teamChatLogId:null}),i=Pi(t);if(i)return s(i.error,i.code);let o=f_(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=gn(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 a_({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:Ni(t),onAccepted:r?.onAccepted,env:{...t.env,...r?.attribution},io:{...Vf(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(_e(l),"provider")}finally{a(),o.active=void 0}}async function Gl(t,e){try{let n=f_(t,e);return n?(await Xl(n),Ps({})):Z("invalid_argument","Invalid native session reference")}catch(n){return Z("provider",_e(n))}}import{closeSync as AW,existsSync as CW,lstatSync as $A,mkdirSync as WA,openSync as NW,readFileSync as xW,rmSync as OW,writeFileSync as LW}from"node:fs";import{createHash as __,randomUUID as PW}from"node:crypto";import{tmpdir as HA}from"node:os";import{join as h_,resolve as FW}from"node:path";var Ji=1024*1024;function y_(t){let e=t.env,n=js(e.HOME?h_(e.HOME,".lmctl/config.toml"):void 0);return __("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 T_(t){let e=__("sha256").update(t.dbPath).digest("hex").slice(0,16),n=h_(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 Kl=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>Ji)throw Error("Invalid holder startup descriptor");let n=JSON.parse(GA(t,"utf8"));Vl(t,{force:!0});let r=C=>{let k=n.resultFile+".tmp";VA(k,JSON.stringify(C),{flag:"wx",mode:384}),KA(k,n.resultFile)},s=Yc({env:{...n.env,LMCTL_DB:n.dbPath},cwd:n.cwd,dbPath:n.dbPath,pid:process.pid,onProgress:(C,k)=>{(k==="stderr"?process.stderr:process.stdout).write(C+`
1847
- `)}});if(s.status!=="ok"){r(s);return}let i=s;yg({stdout:process.stdout,stderr:process.stderr});let o=br(i),a=qi(i,o,n.member,zA(i.cwd,n.member.sessiondir??i.cwd)).member,l=ks(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:y_(i)},u=T_(i),c=YA(u,QA().slice(0,16)+".sock"),m=!1,p=!1,g=!1,_,f,h=new Set,E,y,T=BA(C=>{h.add(C),C.once("close",()=>h.delete(C)),C.on("error",()=>{});let k=Buffer.alloc(0),w=!1,I=setTimeout(()=>C.destroy(),2e3),A=N=>{if(C.destroyed)return;let D=JSON.stringify(N)+`
1848
- `;if(Buffer.byteLength(D)>Ji){C.destroy();return}C.write(D)},x=N=>{A({kind:"result",result:N}),C.end()};C.on("data",N=>{if(w){C.destroy();return}if(k=Buffer.concat([k,N]),k.length>Ji){clearTimeout(I),C.destroy();return}let D=k.indexOf(10);if(D<0)return;w=!0,clearTimeout(I);let L;try{if(k.length!==D+1)throw Error("multiple frames");L=JSON.parse(k.subarray(0,D).toString())}catch{x({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()){x({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){x({status:"error",reply:"",messageId:null,teamChatLogId:null,code:"invalid_argument",error:"Native holder configuration conflicts with this request"});return}if(p||g){x({status:"busy",reply:"",messageId:null,teamChatLogId:null,error:"Batch already has an active turn"});return}if(L.kind==="close"){g=!0,R(C).then(()=>{x({status:"ok",error:null}),setTimeout(()=>C.destroy(),Kl)},$=>{x({status:"error",code:"provider",error:_e($)}),setTimeout(()=>C.destroy(),Kl)});return}if(typeof L.prompt!="string"||!L.attribution||typeof L.attribution!="object"||Object.keys(L.attribution).some($=>!["LMCTL_SELF_SESSIONID","LMCTL_INVOCATION_ID"].includes($))||Object.values(L.attribution).some($=>$!==void 0&&typeof $!="string")){x({status:"error",code:"invalid_argument",error:"Invalid turn frame"});return}p=!0,clearTimeout(_),Jl(i,E.session,L.prompt,{attribution:{LMCTL_SELF_SESSIONID:L.attribution.LMCTL_SELF_SESSIONID,LMCTL_INVOCATION_ID:L.attribution.LMCTL_INVOCATION_ID},onAccepted:$=>A({kind:"accepted",messageId:$})}).then(x,$=>x({status:"error",reply:"",error:_e($),code:"provider",messageId:null,teamChatLogId:null})).finally(()=>{p=!1,S()})}),C.once("close",()=>clearTimeout(I))});function v(){let C=o.findNativeHolder(n.member.provider,n.member.sessionid);return C?.native_generation===y?.native_generation&&C?.holder_pid===process.pid&&ks(process.pid)===l}let b;function R(C){if(b)return b;g=!0,clearTimeout(_),clearInterval(f);let k,w;return b=new Promise((I,A)=>{k=I,w=A}),(async()=>{T.close(),await new Promise(I=>setTimeout(I,Kl));for(let I of h)I!==C&&I.destroy();try{if(y&&!i.closed){let A=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="+A)}}if(E?.status==="ok"&&i.closed){let A=await Gl(i,E.session);if(A.status!=="ok")throw Error(A.error)}let I=await i.close();if(I.errors.length)throw Error(I.errors.join("; "))}finally{Vl(c,{force:!0}),m&&Vl(n.resultFile,{force:!0})}})().then(k,w),b}function S(){g||p||(clearTimeout(_),_=setTimeout(()=>{p||R().catch(C=>process.stderr.write(_e(C)+`
1849
- `))},d.idleTimeoutMs>0?d.idleTimeoutMs:3e5))}let O=C=>{g=!0,i.finalizeSync(C),R().finally(()=>{for(let k of h)k.destroy();process.exit(C==="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 R();return}if(E=await ql(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 k=o.findNativeHolder(n.member.provider,n.member.sessionid);r(k&&k.holder_pid!==process.pid?{status:"busy",error:a.alias+" is busy; wait and retry"}:E),await R();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((k,w)=>{T.once("error",w),T.listen(c,()=>{XA(c,384),k()})}),!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}),S(),f=setInterval(()=>{v()||R().catch(k=>process.stderr.write(_e(k)+`
1850
- `))},Is(i.env)),await new Promise(k=>T.once("close",k))}catch(C){if(!qA(n.resultFile))try{r({status:"error",code:"provider",error:_e(C)})}catch{}throw await R(),C}}await ZA(process.argv[2]).catch(t=>{process.stderr.write("native holder: "+_e(t)+`
1851
- `),process.exitCode=1});