@lmctl-ai/lmctl 0.2.228 → 0.2.229
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/build-info.json +1 -1
- package/dist/cli/index.js +420 -419
- package/dist/cli/lmscript.js +287 -286
- package/dist/cli/native-holder-worker.js +177 -176
- package/package.json +1 -1
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
var
|
|
2
|
-
`);return
|
|
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
3
|
`).join(`
|
|
4
|
-
${u}`)}`}
|
|
5
|
-
`)}
|
|
6
|
-
`?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}
|
|
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
|
|
8
|
-
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function B(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function Be(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var ud=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function zr(t){return Y_(t||process.env.XDG_DATA_HOME||vn(J,".local","share"))}function z_(t){return vn(zr(t),"muse","sessions")}function Q_(t,e,n,r){let s=r?.input_tokens,i=r?.cache_read_tokens??r?.input_cache_read_tokens,o=r?.cache_write_tokens??r?.input_cache_write_tokens,a=typeof r?.promptTokens=="number"?r.promptTokens:typeof r?.prompt_tokens=="number"?r.prompt_tokens:void 0,l=typeof s=="number"&&typeof i=="number"&&i>s||typeof a=="number"&&typeof i=="number"&&i>a||typeof a=="number"&&typeof o=="number"&&o>a||typeof a=="number"&&typeof i=="number"&&typeof o=="number"&&i+o>a,d=l?null:typeof i=="number"?i:null,u=l?null:typeof o=="number"?o:null,c=null;return l||(typeof r?.input_uncached_tokens=="number"?c=r.input_uncached_tokens:typeof a=="number"&&typeof i=="number"&&typeof o=="number"&&a>=i+o&&(c=a-i-o)),{response_id:t,timestamp:e.toISOString(),model:typeof n=="string"&&n.length>0?n:null,tokens:{input_uncached:typeof c=="number"?c:null,input_cached:typeof d=="number"?d:null,input_cache_write:typeof u=="number"?u:null,output:typeof r?.output_tokens=="number"?r.output_tokens:null},files_read:null,files_written:null}}function md(t,e){let n,r,s,i,o,a=[],l=new Map,d=new Map,u=new Set,c,m,p=()=>{m="partial"},f=h=>{if(typeof h!="string"||h.length===0){p();return}let E=l.get(h);return E||(E={id:h,turn:{id:h,status:"unknown"},responseIds:[]},l.set(h,E)),E},g=h=>{if(h.retained_frame&&Array.isArray(h.children)){for(let S of h.children)try{if(typeof S?.record_json!="string")throw new Error("missing record_json");g(JSON.parse(S.record_json))}catch{p()}return}if(h.stream?.kind!=="session"||h.stream?.id!==t)return;if(h.schema_version!==1){p();return}if(h.payload_type?.startsWith("runtime.session")&&h.payload_schema_version!==1){p();return}let E=h.payload?.source_run_record_id;for(let S of[h.id,E])if(!(typeof S!="string"||S.length===0)&&u.has(S))return;for(let S of[h.id,E])typeof S=="string"&&S.length>0&&u.add(S);let y=typeof h.recorded_at=="number"&&Number.isFinite(h.recorded_at)?new Date(h.recorded_at/1e3):void 0;if(h.recorded_at!==void 0&&(!y||!Number.isFinite(y.getTime()))){p();return}y&&Number.isFinite(y.getTime())&&((!s||y<s)&&(s=y),(!i||y>i)&&(i=y));let T=h.payload;if(h.payload_type==="runtime.session.metadata"&&(typeof T?.record?.workspace_root=="string"&&(n=T.record.workspace_root),typeof T?.record?.model_id=="string"&&(r=T.record.model_id)),h.payload_type!=="runtime.session"||T?.kind!=="run")return;let v=T.event,b=f(T.run_id);if(!v||!y||!b){v||p();return}if(v.kind==="started"&&typeof v.prompt=="string")a.push({role:"user",content:v.prompt,timestamp:y}),b.turn.startedAt=y,b.turn.prompt=v.prompt,b.turn.status="in_progress",o="in_progress";else if(v.kind==="assistant_message_committed"&&typeof v.text=="string")a.push({role:"assistant",content:v.text,timestamp:y});else if(v.kind==="terminal")b.turn.completedAt=y,b.turn.status=v.terminal==="completed"?"complete":"aborted",o=b.turn.status;else if(v.kind==="model_completed"){typeof v.model=="string"&&v.model.length>0&&(r=v.model,b.turn.model=v.model);let S=typeof E=="string"&&E.length>0?E:typeof h.id=="string"&&h.id.length>0?h.id:void 0;if(!S)p();else{b.responseIds.push(S);let W={};if(v.usage&&typeof v.usage=="object")for(let D of["input_tokens","output_tokens","cached_tokens","reasoning_tokens","input_uncached_tokens","cache_read_tokens","input_cache_read_tokens","cache_write_tokens","input_cache_write_tokens","promptTokens","prompt_tokens"]){let ae=v.usage[D];typeof ae=="number"&&Number.isSafeInteger(ae)&&ae>=0&&(W[D]=ae)}Object.keys(W).length>0&&(b.turn.rawUsage=[...b.turn.rawUsage??[],{responseId:S,values:W}]),d.set(S,Q_(S,y,v.model,W))}if(!v.usage)return;let R={},O=v.usage.input_tokens,N=v.usage.cache_read_tokens??v.usage.input_cache_read_tokens,A=v.usage.cache_write_tokens??v.usage.input_cache_write_tokens,w=typeof v.usage.promptTokens=="number"?v.usage.promptTokens:typeof v.usage.prompt_tokens=="number"?v.usage.prompt_tokens:void 0,I=typeof O=="number"&&typeof N=="number"&&N>O||typeof w=="number"&&typeof N=="number"&&N>w||typeof w=="number"&&typeof A=="number"&&A>w||typeof w=="number"&&typeof N=="number"&&typeof A=="number"&&N+A>w,C=I?void 0:typeof N=="number"?N:void 0,k=I?void 0:typeof A=="number"?A:void 0,x;I||(typeof v.usage.input_uncached_tokens=="number"?x=v.usage.input_uncached_tokens:typeof w=="number"&&typeof N=="number"&&typeof A=="number"&&w>=N+A&&(x=w-N-A)),x!==void 0&&x<0&&(x=void 0);let P=v.usage.output_tokens,L=v.usage.reasoning_tokens;typeof x=="number"&&Number.isSafeInteger(x)&&x>=0&&(R.inputTokens=x),typeof C=="number"&&Number.isSafeInteger(C)&&C>=0&&(R.cachedInputTokens=C),typeof k=="number"&&Number.isSafeInteger(k)&&k>=0&&(R.cacheWriteInputTokens=k),typeof P=="number"&&Number.isSafeInteger(P)&&P>=0&&(R.outputTokens=P),typeof L=="number"&&Number.isSafeInteger(L)&&L>=0&&(R.reasoningOutputTokens=L),c=R}};return{visit:g,finish:()=>{if(!n||!s||!i)return null;let h=a.filter(v=>v.role==="user").map(v=>v.content),E=[...l.values()].map(v=>({...v.turn,...v.responseIds.length>0?{responseIds:[...v.responseIds]}:{}})),y=[...d.values()],T=En(y,m!=="partial");return{provider:"muse",sessionId:t,filePath:e,cwd:n,createdAt:s,modifiedAt:i,model:r,messages:a,messageCount:a.length,firstUserMessage:h[0],lastUserMessage:h.at(-1),userPrompts:h,turnStatus:o,totalInputTokens:T.input_uncached??void 0,totalCachedInputTokens:T.input_cached??void 0,totalCacheWriteInputTokens:T.input_cache_write??void 0,totalOutputTokens:T.output??void 0,lastTokenUsage:c,turns:E,responses:y,...m?{captureStatus:m}:{}}},markPartial:p}}function Z_(t,e,n){let r=md(e,n);for(let s of t)r.visit(s);return r.finish()}function eh(t,e,n,r){r.signal.throwIfAborted();let s=Math.max(0,r.maxBytes),i=t.length<=s?t:t.subarray(0,Math.max(0,t.subarray(0,s).lastIndexOf(10))),o=i.length!==t.length,a=[],l=o,d=0,u=m=>{if(!m||typeof m!="object"||Array.isArray(m)){l=!0;return}let p=m;if(p.retained_frame&&Array.isArray(p.children)){for(let f of p.children){if(d>=r.maxRows){l=!0;return}let g;try{if(typeof f?.record_json!="string")throw new Error("missing record_json");g=JSON.parse(f.record_json)}catch{l=!0;continue}u(g)}return}if(d>=r.maxRows){l=!0;return}a.push(p),d++};for(let m of i.toString("utf8").split(/\r?\n/u)){if(r.signal.throwIfAborted(),m.trim()==="")continue;let p;try{p=JSON.parse(m)}catch{l=!0;continue}u(p)}let c=Z_(a,e,n);return c&&l&&(c.captureStatus="partial"),c}function pd(t){return{provider:"muse",root:z_(t),revision:"muse-session-v2",sessionId:n=>n.replaceAll("\\","/").match(/\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\/session\.jsonl$/iu)?.[1]??null,decode:eh}}async function cd(t,e){let n=md(t,e);for await(let r of le(e,n.markPartial))n.visit(r);return n.finish()}var Yr=class{name="muse";dataHome;constructor(e={}){this.dataHome=zr(e.museDataHome)}get root(){return vn(this.dataHome,"muse","sessions")}getWatchPaths(){return[{directory:this.root,filePattern:/session\.jsonl$/}]}async files(e=this.root,n=0){let r;try{r=await K_(e,{withFileTypes:!0})}catch{return[]}let s=[];for(let i of r)i.isFile()&&i.name==="session.jsonl"?s.push(vn(e,i.name)):i.isDirectory()&&n<4&&s.push(...await this.files(vn(e,i.name),n+1));return s}async resolveSessionPath(e){return ud.test(e)?(await this.files()).find(n=>n.endsWith(vn(e,"session.jsonl")))??null:null}async loadSession(e){let n=await this.resolveSessionPath(e);return n?cd(e,n):null}async discoverSessions(){let e=[];for(let n of await this.files())try{let r=n.split(/[\\/]/).at(-2);if(!ud.test(r))continue;let s=await cd(r,n);s&&e.push(s)}catch{}return e}async deleteSession(){return!1}};import{readFile as fd,readdir as th,rm as nh,stat as gd}from"node:fs/promises";import{basename as rh,join as wn,resolve as sh}from"node:path";var Ed=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;function es(t){return sh(t||process.env.MINIPLAYER_HOME||wn(process.env.XDG_DATA_HOME||wn(J,".local","share"),"miniplayer"))}var Zr=class{name="miniplayer";home;constructor(e={}){this.home=es(e.miniplayerHome)}getWatchPaths(){return[{directory:wn(this.home,"sessions"),filePattern:/\.json$/}]}async discoverSessions(){let e;try{e=await th(wn(this.home,"sessions"))}catch{return[]}return(await Promise.all(e.filter(r=>r.endsWith(".json")).map(r=>this.loadSession(r.slice(0,-5))))).filter(r=>r!==null)}async resolveSessionPath(e){if(!Ed.test(e))return null;let n=wn(this.home,"sessions",`${e}.json`);try{return(await gd(n)).isFile()?n:null}catch{return null}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;try{let r=vd(JSON.parse(await fd(n,"utf8")),e,n);if(!r)return null;let s="complete";try{let i=JSON.parse(await fd(`${n}.lock`,"utf8"));if(Number.isInteger(i.pid)&&i.pid>0)try{process.kill(i.pid,0),s="in_progress"}catch{s="aborted"}}catch{}return{...r,...s!=="complete"?{turnStatus:s}:{}}}catch{return null}}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{throw await gd(`${n}.lock`),new Error("Cannot delete a locked miniplayer session")}catch(r){if(r.code!=="ENOENT")throw r}return await nh(n),!0}};function Qr(t){if(typeof t=="string")return t;try{return JSON.stringify(t)??String(t)}catch{return String(t)}}function Zi(t){return!t||typeof t!="object"?"tool":typeof t.toolName=="string"?t.toolName:typeof t.name=="string"?t.name:"tool"}function _d(t){if(!t||typeof t!="object")return null;let e=t.toolCallId??t.id;return typeof e=="string"&&e.length>0?e:null}function hd(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function yd(t){if(typeof t!="string")return null;try{let e=new URL(t);return e.username="",e.password="",e.search="",e.hash="",e.toString()}catch{return null}}function Td(t){let e=t.usage&&typeof t.usage=="object"&&!Array.isArray(t.usage)?t.usage:{},n={};for(let[l,d]of Object.entries(e))X(d)!==null&&(n[l]=d);let r=X(e.inputTokens),s=X(e.cachedInputTokens),i=X(t.cacheWriteInputTokens??e.cacheWriteInputTokens),o=X(e.outputTokens),a=null;return t.usageConvention==="input-includes-cache"&&r!==null&&s!==null&&s<=r&&(a=r-s),t.usageConvention==="input-excludes-cache"&&r!==null&&i!==null&&(a=r+i),t.usageConvention==="synthetic"&&r===0&&s===0&&(i===0||i===null)&&o===0&&(a=0),{tokens:{input_uncached:a,input_cached:s,input_cache_write:i,output:o},rawUsage:n,pricingFacts:X(e.reasoningTokens)===null?null:{reasoning_output_tokens:X(e.reasoningTokens)}}}function vd(t,e,n){if(!t||typeof t!="object")return null;let r=t;if(![1,2].includes(r.version)||r.id!==e||typeof r.cwd!="string")return null;let s=f=>{if(typeof f!="string")return;let g=new Date(f);return Number.isFinite(g.getTime())?g:void 0},i=s(r.createdAt),o=s(r.updatedAt);if(!i||!o)return null;let a=[],l=[],d=[],u=r.version===1,c="complete";if(r.version===1){if(!Array.isArray(r.messages))return null;for(let f of r.messages){if(!f||!["user","assistant"].includes(f.role)||typeof f.content!="string")return null;a.push({role:f.role,content:f.content,timestamp:s(f.timestamp)??o})}}else{if(!Array.isArray(r.turns))return null;let f=new Set,g=new Set;for(let _ of r.turns){if(!_||typeof _.responseId!="string"||!_.responseId||typeof _.input?.text!="string")return null;if(f.has(_.responseId)){u=!0;continue}f.add(_.responseId);let h=s(_.startedAt),E=s(_.completedAt??_.endedAt);if(!h)return null;let y=typeof _.model=="string"?_.model:void 0;["complete","running","failed","aborted"].includes(_.status)||(u=!0);let T=_.status==="complete"?"complete":_.status==="running"?"in_progress":_.status==="failed"?"failed":_.status==="aborted"?"aborted":"unknown";c=T==="failed"||T==="unknown"?"aborted":T,(T!=="complete"||_.partial===!0)&&(u=!0);let v=Array.isArray(_.modelResponses),b=v?_.modelResponses:[],S=[];l.push({id:_.responseId,startedAt:h,completedAt:E,model:y,prompt:_.input.text,status:T,responseIds:S}),a.push({role:"user",timestamp:h,content:_.input.text});let R=Array.isArray(_.toolEvents)&&_.toolEvents.length>0;if(!v&&!R){let I=_.usage??{},C=Td({..._,usage:I});Object.keys(C.rawUsage).length&&(l.at(-1).rawUsage=[{responseId:_.responseId,values:C.rawUsage}]),S.push(_.responseId),d.push({response_id:_.responseId,timestamp:(E??h).toISOString(),model:y??null,model_provider:typeof _.provider=="string"?_.provider:null,tokens:C.tokens,files_read:[],files_written:[],read_bytes:Buffer.byteLength(_.input.text,"utf8"),write_bytes:0,external_io:[{direction:"read",kind:"prompt",id:_.responseId,ref:null,bytes:Buffer.byteLength(_.input.text,"utf8"),basis:"input_text"}],pricing_facts:C.pricingFacts}),T!=="complete"&&!_.usage&&(u=!0),typeof _.output?.text=="string"&&a.push({role:"assistant",timestamp:E??h,content:_.output.text,model:y});continue}let O=new Map,N=new Map,A=new Set,w=[];for(let I of b){if(!I||typeof I!="object"||typeof I.responseId!="string"||!I.responseId){u=!0;continue}if(S.includes(I.responseId)){u=!0;continue}let C=I,k=w.length;w.push({response:C,index:k,filesRead:[],filesWritten:[],io:[]}),S.push(I.responseId),g.has(I.responseId)&&(u=!0),g.add(I.responseId),C.toolCalls!==void 0&&!Array.isArray(C.toolCalls)&&(u=!0,w[k].io.push({direction:"read",kind:"unattributed",id:I.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:I.responseId,ref:null,bytes:null,basis:"unknown"}));for(let x of Array.isArray(C.toolCalls)?C.toolCalls:[]){let P=_d(x),L=Zi(x);if(P)O.set(P,k),N.set(P,L);else{u=!0;let W=L==="list_directory"||L==="read_file"||L==="webget"||L==="shell"||L==="tool",D=L==="write_file"||L==="shell"||L==="tool";W&&w[k].io.push({direction:"read",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"}),D&&w[k].io.push({direction:"write",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"})}}}S.length===0&&b.length>0&&(u=!0);for(let I of Array.isArray(_.toolEvents)?_.toolEvents:[]){let C=I&&typeof I=="object"?I:{},k=_d(C),x=k?O.get(k):void 0,P=Zi(C),L=hd(C.result),W=C.status==="failed"||C.error!==void 0;if(C.type==="tool_call"?a.push({role:"tool_use",timestamp:s(C?.timestamp)??h,content:Qr(C?.input??C?.args),toolName:P,toolInput:Qr(C?.input??C?.args),toolInputData:hd(C?.input??C?.args)??void 0,...k?{toolCallId:k}:{}}):a.push({role:"tool_result",timestamp:s(C?.timestamp)??E??h,content:Qr(W?C?.error:C?.result),toolName:P,...k?{toolCallId:k}:{}}),x===void 0){u=!0;continue}let D=w[x];(C.type==="tool_result"||W||C.result!==void 0)&&A.add(k);let ae=L?.path,$=X(L?.bytesRead??L?.bytesWritten);C.type!=="tool_call"&&(P==="read_file"&&!W&&typeof ae=="string"&&$!==null?D.filesRead.push({path:ae,bytes:$}):P==="write_file"&&!W&&typeof ae=="string"&&$!==null?D.filesWritten.push({path:ae,bytes:$}):P==="webget"&&!W&&$!==null?D.io.push({direction:"read",kind:"web",id:k,ref:yd(L?.finalUrl??L?.url),bytes:$,basis:"certified_counter"}):P==="shell"||W?(P!=="write_file"&&D.io.push({direction:"read",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}),(P==="shell"||P==="write_file")&&D.io.push({direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"})):P==="list_directory"||P==="read_file"||P==="webget"?D.io.push({direction:"read",kind:P==="webget"?"web":"unattributed",id:k,ref:P==="webget"?yd(L?.finalUrl??L?.url):null,bytes:null,basis:"unknown"}):P==="write_file"?D.io.push({direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}):D.io.push({direction:"read",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:k,ref:null,bytes:null,basis:"unknown"}))}for(let[I,C]of N)if(!A.has(I)){let k=w[O.get(I)],x=C==="list_directory"||C==="read_file"||C==="webget"||C==="shell",P=C==="write_file"||C==="shell";x&&k.io.push({direction:"read",kind:"unattributed",id:I,ref:null,bytes:null,basis:"unknown"}),P&&k.io.push({direction:"write",kind:"unattributed",id:I,ref:null,bytes:null,basis:"unknown"}),u=!0}for(let I of w){let C=I.response,k=Td(C),x=s(C.completedAt??C.startedAt)??E??h;new Set((Array.isArray(C.toolCalls)?C.toolCalls:[]).map(D=>Zi(D))).has("shell")&&!I.io.some(D=>D.kind==="unattributed"&&D.direction==="read")&&I.io.push({direction:"read",kind:"unattributed",id:C.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:C.responseId,ref:null,bytes:null,basis:"unknown"}),I.index===0&&I.io.unshift({direction:"read",kind:"prompt",id:_.responseId,ref:null,bytes:Buffer.byteLength(_.input.text,"utf8"),basis:"input_text"});let L=I.io.some(D=>D.direction==="read"&&D.bytes===null),W=I.io.some(D=>D.direction==="write"&&D.bytes===null);if(d.push({response_id:C.responseId,timestamp:x.toISOString(),model:typeof C.model=="string"?C.model:null,model_provider:typeof C.provider=="string"?C.provider:typeof _.provider=="string"?_.provider:null,tokens:k.tokens,files_read:L?null:I.filesRead,files_written:W?null:I.filesWritten,read_bytes:L?null:I.filesRead.reduce((D,ae)=>D+(ae.bytes??0),0)+I.io.filter(D=>D.direction==="read").reduce((D,ae)=>D+(ae.bytes??0),0),write_bytes:W?null:I.filesWritten.reduce((D,ae)=>D+(ae.bytes??0),0)+I.io.filter(D=>D.direction==="write").reduce((D,ae)=>D+(ae.bytes??0),0),external_io:I.io,pricing_facts:k.pricingFacts}),Object.keys(k.rawUsage).length){let D=l.at(-1);D.rawUsage=[...D.rawUsage??[],{responseId:C.responseId,values:k.rawUsage}]}}l.at(-1).responseIds=S,S.length!==b.length&&(u=!0),typeof _.output?.text=="string"&&a.push({role:"assistant",timestamp:E??h,content:_.output.text,model:y})}}let m=a.filter(f=>f.role==="user").map(f=>f.content),p=En(d,!u);return{provider:"miniplayer",sessionId:e,cwd:r.cwd,filePath:n,createdAt:i,modifiedAt:o,model:typeof r.model=="string"?r.model:void 0,messages:a,messageCount:a.length,userPrompts:m,firstUserMessage:m[0],lastUserMessage:m.at(-1),turns:l,responses:d,turnStatus:c,...u?{captureStatus:"partial"}:{},totalInputTokens:p.input_uncached??void 0,totalCachedInputTokens:p.input_cached??void 0,totalCacheWriteInputTokens:p.input_cache_write??void 0,totalOutputTokens:p.output??void 0}}function ts(t){return{provider:"miniplayer",root:wn(es(t),"sessions"),revision:"miniplayer-data-v3",sessionId(e){let n=rh(e,".json");return e.endsWith(".json")&&Ed.test(n)?n:null},decode(e,n,r,s){s.signal.throwIfAborted();try{let i=JSON.parse(e.toString("utf8"));return(Array.isArray(i.turns)?i.turns.reduce((a,l)=>a+1+(Array.isArray(l?.modelResponses)?l.modelResponses.length:0)+(Array.isArray(l?.toolEvents)?l.toolEvents.length:0),0):Array.isArray(i.messages)?i.messages.length:0)>s.maxRows?null:vd(i,n,r)}catch{return null}}}}import{createHash as _o}from"node:crypto";import{createRequire as Zy}from"node:module";import{lstat as eT,readFile as tT,readdir as nT,realpath as fo,stat as tu}from"node:fs/promises";import{basename as is,dirname as rT,isAbsolute as nu,join as Vt,relative as sT,resolve as ot,sep as iT}from"node:path";import{createHash as ih}from"node:crypto";import{createRequire as oh}from"node:module";import{readdir as ah,realpath as lh}from"node:fs/promises";import{basename as wd,dirname as dh,join as Sd,resolve as bd}from"node:path";var ht="agy",ns="agy-tokens-v1",uh=oh(import.meta.url);function ch(){return uh("node:sqlite").DatabaseSync}function mh(){return process.env.HOME||process.env.USERPROFILE||""}function Jt(t){let e=[],n=0,r=()=>{let s=0n,i=0n;for(;;){if(n>=t.length||i>63n)return null;let o=t[n++];if(s|=BigInt(o&127)<<i,i+=7n,!(o&128))break}return s<=BigInt(Number.MAX_SAFE_INTEGER)?Number(s):null};for(;n<t.length;){let s=r();if(s===null)return e;let i=s>>>3,o=s&7;if(i===0)return e;if(o===0){let a=r();if(a===null)return e;e.push({field:i,wire:o,varint:a})}else if(o===1){if(n+8>t.length)return e;n+=8,e.push({field:i,wire:o})}else if(o===5){if(n+4>t.length)return e;n+=4,e.push({field:i,wire:o})}else if(o===2){let a=r();if(a===null||n+a>t.length)return e;e.push({field:i,wire:o,bytes:t.subarray(n,n+a)}),n+=a}else return e}return e}function Ke(t,e){return t.find(n=>n.field===e)}function ph(t){let e=new Map;for(let n of t){if(n.field!==20||n.bytes===void 0)continue;let r=Jt(n.bytes),s=Ke(r,1)?.bytes,i=Ke(r,2)?.bytes;if(s===void 0||i===void 0)continue;let o=s.toString("utf8");e.has(o)||e.set(o,i.toString("utf8"))}return e}function fh(t){let e=Ke(Jt(t),5)?.bytes;if(e===void 0)return null;let n=Ke(Jt(e),1)?.bytes;if(n===void 0)return null;let r=Jt(n),s=Ke(r,1)?.varint;if(s===void 0)return null;let i=Ke(r,2)?.varint??0,o=s*1e3+Math.floor(i/1e6),a=new Date(o);return Number.isFinite(a.getTime())?a.toISOString():null}function gh(t){let e=Ke(t,4)?.bytes,n=e!==void 0?Jt(e):[],r=s=>{let i=Ke(n,s)?.varint;return i===void 0?null:X(i)};return{tokens:{input_uncached:r(2),input_cached:r(5),input_cache_write:r(4),output:r(3)},thinkingOutputTokens:r(9)}}function _h(t){let e=Ke(Jt(t),1)?.bytes;if(e===void 0)return null;let n=Jt(e),r=ph(n),s=r.get("request_id");if(s===void 0||s.length===0)return null;let i=Ke(n,19)?.bytes,o=i!==void 0&&i.length>0?i.toString("utf8"):null,a=r.get("last_step_index"),l=a===void 0?Number.NaN:Number(a),d=Number.isSafeInteger(l)&&l>=0?l:null,{tokens:u,thinkingOutputTokens:c}=gh(n);return{requestId:s,model:o,lastStepIndex:d,tokens:u,thinkingOutputTokens:c}}function Rd(t,e){z(e);let n=t.prepare("SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) AS total FROM gen_metadata").get(),r=X(n?.total);if(r===null||r>e.maxBytes)return null;let s=t.prepare("SELECT idx, data FROM gen_metadata ORDER BY idx LIMIT ?").all(e.maxRows+1);if(s.length>e.maxRows)return null;let i=ih("sha256");i.update("rev:").update(ns).update(`
|
|
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 Ye(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 ze(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=ze(r,1)?.bytes,i=ze(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=ze(Vt(t),5)?.bytes;if(e===void 0)return null;let n=ze(Vt(e),1)?.bytes;if(n===void 0)return null;let r=Vt(n),s=ze(r,1)?.varint;if(s===void 0)return null;let i=ze(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=ze(t,4)?.bytes,n=e!==void 0?Vt(e):[],r=s=>{let i=ze(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=ze(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=ze(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
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=
|
|
11
|
-
`);let
|
|
12
|
-
`)){if(!n.trim())continue;let r;try{r=JSON.parse(n)}catch{continue}let s=typeof r.type=="string"?r.type:"";s.endsWith("-chunks")||s==="assistant/chunk"&&F(F(r.data)?.chunk)?.type!=="usage"||e.push(r)}return e}function Bh(t){if(typeof t=="string")try{return F(JSON.parse(t))}catch{return null}return F(t)}function Nd(t,e){return typeof t!="number"||typeof e!="number"?null:`${t}\0${e}`}function Xh(t,e,n,r){let s=new Map,i=[],o=new Set,a=new Map,l=null,d=null,u=null;for(let m of t){r.signal.throwIfAborted();let p=F(m.data);if(m.type==="assistant/chunk"){let f=F(p?.chunk),g=F(f?.usage),_=Nd(p?.turn,p?.step);g&&_!==null&&typeof p?.turn=="number"&&typeof p?.step=="number"&&a.set(_,{turn:p.turn,step:p.step,usage:g,time:m.time});continue}if(m.type==="request/header"){let f=F(F(p?.header)?.config);typeof f?.provider=="string"&&f.provider&&(l=f.provider),typeof f?.model=="string"&&f.model&&(d=f.model);continue}if(m.type==="user/message"){if(F(p?.source)?.kind!=="user")continue;let g=typeof p?.id=="string"&&p.id?p.id:null;i.push({id:g,bytes:jh(p?.content)});continue}if(m.type==="assistant/message"){let f=F(p?.message),g=F(f?.source),_=typeof f?.id=="string"&&f.id?f.id:null,h=Nd(p?.turn,p?.step),E;if(h!==null)o.add(h),E=`dsh:turn-step:${p.turn}/${p.step}`;else{if(F(p?.usage))return{status:"partial"};E=_}if(E===null)return{status:"partial"};let y=Cd(F(p?.usage)),T=s.get(E);if(!T){if(T={meta:{response_id:E,timestamp:Ue(typeof m.time=="number"?m.time:null),model:(typeof g?.model=="string"&&g.model?g.model:null)??d,tokens:y??{...Ce},files_read:[],files_written:[]},obs:new Pe,io:new Me,reasoning:null,provider:typeof g?.provider=="string"&&g.provider?g.provider:null},s.set(E,T),s.size>r.maxRows)return{status:"partial"};for(let v of i)T.io.record({direction:"read",kind:"prompt",id:v.id,ref:null,bytes:v.bytes,basis:v.bytes===null?"unknown":"input_text"});i.length=0}if(y){T.meta.tokens=y;let v=X(F(p?.usage)?.reasoningTokens);v!==null&&(T.reasoning=v)}u=E;continue}if(m.type==="tool/call"){let f=u!==null?s.get(u):void 0;if(!f)continue;let g=typeof p?.callId=="string"&&p.callId?p.callId:null,_=typeof p?.name=="string"?p.name.toLowerCase():"",h=Bh(p?.arguments),E=(typeof h?.file_path=="string"&&h.file_path?h.file_path:null)??(typeof h?.path=="string"&&h.path?h.path:null);Dh.has(_)?E!==null?f.obs.record(g??"","read",E,null):me(f.io,g):Ph.has(_)?E!==null?f.obs.record(g??"","written",E,yn(h)):me(f.io,g):Uh(_)||me(f.io,g);continue}}for(let[m,{turn:p,step:f,usage:g,time:_}]of a){if(o.has(m))continue;r.signal.throwIfAborted();let h=Cd(g),E=new Me;me(E,null);let y={meta:{response_id:`dsh:turn-step:${p}/${f}`,timestamp:Ue(typeof _=="number"?_:null),model:d,tokens:h??{...Ce},files_read:[],files_written:[]},obs:new Pe,io:E,reasoning:X(g.reasoningTokens),provider:l};if(s.set(y.meta.response_id,y),s.size>r.maxRows)return{status:"partial"}}let c=[];for(let{meta:m,obs:p,io:f,reasoning:g,provider:_}of s.values()){let h=p.files("read"),E=p.files("written"),y=f.entries();c.push({...m,files_read:h,files_written:E,external_io:y,read_bytes:Re(h,y,"read"),write_bytes:Re(E,y,"written"),model_provider:l??_,pricing_facts:Ve({reasoning:g??void 0},m.tokens.output,m.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:c}}var to=class{sessionsDir;maxDiscoveryTraversalVisits;constructor(e={}){let n=e.dshHome??process.env.DSH_HOME??xd(Fh(),".dsh");this.sessionsDir=Od(n,"sessions"),this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):Lh}async discover(e,n,r=null){z(e);let{paths:s,truncated:i}=await qh(this.sessionsDir,n,this.maxDiscoveryTraversalVisits,e,r);return{sources:s.map(o=>({provider:yt,sessionid:eo(Ad(o)),source_id:o})),truncated:i}}matches(e,n){return Ld(eo(n))&&eo(Ad(n))===e.sessionid}async inspect(e,n){if(z(n),e.provider!==yt)return{status:"unsupported"};let r=await ye(e.source_id,[this.sessionsDir]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await Ne(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){if(z(r),e.provider!==yt)return{status:"unsupported"};let s=await ye(e.source_id,[this.sessionsDir]);if(!s||!this.matches(e,s))return{status:"unavailable"};let i=await Ne(s,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let{text:o,truncated:a}=Wh(i.data,r);return a?{status:"partial"}:Xh(Hh(o),e,n,r)}};async function qh(t,e,n,r,s){let i=[],o=0,a=!1;async function l(d,u){r.signal.throwIfAborted();let c=await Ch(d,{withFileTypes:!0}).catch(()=>[]);c.sort((m,p)=>te(m.name,p.name));for(let m of c){if(r.signal.throwIfAborted(),i.length>=e)return;if(o+=1,o>n){a=!0;return}let p=xd(d,m.name);if(m.isDirectory()&&!m.isSymbolicLink()&&u<2){if(await l(p,u+1),a||i.length>=e)return}else if(m.isFile()&&Ld(m.name)){let f=await Nh(p).catch(()=>Od(p));(s===null||te(f,s)>0)&&i.push(f)}}}return await l(t,0),{paths:i.sort(te),truncated:a}}function Dd(t={}){return new to(t)}import{readdir as Jh,realpath as Gh}from"node:fs/promises";import{basename as ss,dirname as Vh,join as no,resolve as Pd}from"node:path";var Tt="qwen",Kh="qwen-code.api_response",Yh="qwen-code.tool_call",Md="chats",zh=new Set(["read_file"]),Qh=new Set(["write_file"]),Zh=5e5;function ey(){return process.env.HOME||process.env.USERPROFILE||""}function ty(){let t=ey();return[no(t,".qwen","projects"),no(t,".qwen.bk1","projects")]}function ny(t){return t.type!=="system"||t.subtype!=="ui_telemetry"?null:F(F(t.systemPayload)?.uiEvent)}function ry(t){let e=t["event.name"];return typeof e=="string"&&e.length>0?e:null}function sy(t){let e=X(t.input_token_count),n=X(t.output_token_count),r=X(t.cached_content_token_count),s=X(t.total_token_count);if(e===null||n===null||r===null||s===null||r>e||e+n!==s)return null;let i=t.thoughts_token_count===void 0?null:X(t.thoughts_token_count);return t.thoughts_token_count!==void 0&&(i===null||i>n)?null:{input_uncached:e-r,input_cached:r,input_cache_write:null,output:n}}function iy(t){let e=F(t)?.parts;if(!Array.isArray(e))return null;let n=0,r=!1;for(let s of e){let i=F(s);!i||i.thought===!0||typeof i.text=="string"&&(n+=Buffer.byteLength(i.text,"utf8"),r=!0)}return r?n:null}function oy(t){let e=new Map,n=new Set,r=new Map;for(let o of t){let a=typeof o.uuid=="string"&&o.uuid?o.uuid:null;if(a!==null&&(e.set(a,typeof o.parentUuid=="string"&&o.parentUuid?o.parentUuid:null),o.type==="user")){n.add(a);let l=iy(o.message);l!==null&&r.set(a,l)}}let s=new Map;return{promptBytes:r,resolve:o=>{let a=[],l=new Set,d=o,u;for(;;){let c=s.get(d);if(c){u=c;break}if(n.has(d)){u={kind:"found",uuid:d};break}if(!e.has(d)){u={kind:"broken"};break}if(l.has(d)){u={kind:"broken"};break}l.add(d),a.push(d);let m=e.get(d)??null;if(m===null){u={kind:"clean"};break}d=m}for(let c of a)s.set(c,u);return u}}}function ay(t,e,n,r){let{promptBytes:s,resolve:i}=oy(t),o=new Set,a=new Map,l=0;for(let u of t){r.signal.throwIfAborted();let c=ny(u);if(c===null)continue;let m=ry(c);if(m===Kh){let E=typeof c.response_id=="string"&&c.response_id?c.response_id:null;if(E===null)return{status:"unsupported"};let y=sy(c);if(y===null)return{status:"partial"};let T=a.get(E);if(!T){if(T={meta:{response_id:E,timestamp:Ue(c["event.timestamp"]??u.timestamp),model:typeof c.model=="string"&&c.model?c.model:null,tokens:{...Ce},files_read:[],files_written:[]},obs:new Pe,io:new Me,thoughts:null},a.set(E,T),a.size>r.maxRows)return{status:"partial"};let b=typeof u.uuid=="string"&&u.uuid?u.uuid:null,S=b===null?{kind:"broken"}:i(b);if(S.kind==="broken")T.io.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"});else if(S.kind==="found"&&!o.has(S.uuid)){o.add(S.uuid);let R=s.get(S.uuid)??null;T.io.record({direction:"read",kind:"prompt",id:S.uuid,ref:null,bytes:R,basis:R===null?"unknown":"input_text"})}}T.meta.tokens=y,typeof c.model=="string"&&c.model&&(T.meta.model=c.model);let v=X(c.thoughts_token_count);v!==null&&(T.thoughts=v);continue}if(m!==Yh)continue;let p=typeof c.response_id=="string"&&c.response_id?c.response_id:null;if(p===null)continue;let f=a.get(p);if(f===void 0)return{status:"partial"};let g=typeof c.function_name=="string"?c.function_name.toLowerCase():"",_=F(c.function_args),h=`tool-${l++}`;if(zh.has(g)){let E=typeof _?.file_path=="string"?_.file_path:null;E!==null?f.obs.record(h,"read",E,null):me(f.io,h)}else if(Qh.has(g)){let E=typeof _?.file_path=="string"?_.file_path:null;E!==null?f.obs.record(h,"written",E,yn(_)):me(f.io,h)}else _t(g)||me(f.io,h)}let d=[];for(let{meta:u,obs:c,io:m,thoughts:p}of a.values()){let f=c.files("read"),g=c.files("written"),_=m.entries();d.push({...u,files_read:f,files_written:g,external_io:_,read_bytes:Re(f,_,"read"),write_bytes:Re(g,_,"written"),model_provider:null,pricing_facts:Ve({reasoning:p??void 0},u.tokens.output,u.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:d}}async function ly(t,e,n,r,s){let i=[],o=0,a=!1;async function l(d){r.signal.throwIfAborted();let u=await Jh(d,{withFileTypes:!0}).catch(()=>[]);u.sort((c,m)=>te(c.name,m.name));for(let c of u){if(r.signal.throwIfAborted(),i.length>=e)return;if(o+=1,o>n){a=!0;return}let m=no(d,c.name);if(c.isDirectory()&&!c.isSymbolicLink()){if(await l(m),a||i.length>=e)return}else if(c.isFile()&&c.name.endsWith(".jsonl")&&ss(d)===Md){let p=await Gh(m).catch(()=>Pd(m));(s===null||te(p,s)>0)&&i.push(p)}}}return await l(t),{paths:i.sort(te),truncated:a}}function dy(t,e){for(let n of t){let r=n.sessionId;if(typeof r=="string"&&r.length>0&&r!==e)return!1}return!0}var ro=class{roots;maxDiscoveryTraversalVisits;constructor(e={}){this.roots=(e.qwenProjectsDirs??ty()).map(n=>Pd(n)),this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):Zh}async discover(e,n,r=null){z(e);let s=new Map,i=!1;for(let a of this.roots){e.signal.throwIfAborted();let l=await ly(a,n,this.maxDiscoveryTraversalVisits,e,r);l.truncated&&(i=!0);for(let d of l.paths)s.set(d,d)}return{sources:[...s.keys()].sort(te).slice(0,n).map(a=>({provider:Tt,sessionid:ss(a,".jsonl"),source_id:a})),truncated:i}}matches(e,n){return ss(n,".jsonl")===e.sessionid&&ss(Vh(n))===Md}async inspect(e,n){if(z(n),e.provider!==Tt)return{status:"unsupported"};let r=await ye(e.source_id,[...this.roots]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await Ne(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){if(z(r),e.provider!==Tt)return{status:"unsupported"};let s=await ye(e.source_id,[...this.roots]);if(!s||!this.matches(e,s))return{status:"unavailable"};let i=await Ne(s,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let o=Kr(i.data,r);return o?dy(o,e.sessionid)?ay(o,e,n,r):{status:"unavailable"}:{status:"partial"}}};function Ud(t={}){return new ro(t)}import{createHash as uy}from"node:crypto";import{createRequire as cy}from"node:module";import{join as ir,resolve as so}from"node:path";var Gt="opencode",my=cy(import.meta.url);function py(){return my("node:sqlite").DatabaseSync}function Fd(){return process.env.HOME||process.env.USERPROFILE||""}function fy(){let t=process.env.XDG_DATA_HOME||ir(Fd(),".local","share"),e=process.env.XDG_CONFIG_HOME||ir(Fd(),".config");return[ir(t,"opencode","opencode.db"),ir(t,"opencode","opencode-local.db"),ir(e,"opencode","opencode.db")]}var gy=["read","read_file","view","view_file","view_image"],_y=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],hy=["filePath","path","file","file_path","filepath","notebook_path","paths"],yy=new Set(["session-job-notification"]);function Ty(t){if(typeof t!="string")return null;let e=t.toLowerCase();return e==="apply_patch"?"apply_patch":gy.includes(e)?"read":_y.includes(e)?"written":null}function jd(t,e=hy){let n=F(t);if(!n)return null;for(let r of e){let s=n[r];if(typeof s=="string"&&s.length>0)return s;if(Array.isArray(s)){for(let i of s)if(typeof i=="string"&&i.length>0)return i}}return null}function Ey(t){let e=F(t);if(!e)return null;if(typeof e.content=="string")return Buffer.byteLength(e.content,"utf8");if(typeof e.newString=="string")return Buffer.byteLength(e.newString,"utf8");if(typeof e.new_string=="string")return Buffer.byteLength(e.new_string,"utf8");if(typeof e.newSource=="string")return Buffer.byteLength(e.newSource,"utf8");if(Array.isArray(e.edits)){let n=0;for(let r of e.edits){let s=F(r),i=s?.newString??s?.new_string;if(typeof i!="string")return null;n+=Buffer.byteLength(i,"utf8")}return n}return null}function vy(t){let e=new Map,n=null,r=()=>{n&&(e.set(n.path,(e.get(n.path)??0)+n.bytes),n=null)};for(let s of t.split(`
|
|
13
|
-
`)){let i=s.replace(/\r$/,""),o=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(i);if(o){r(),n={path:o[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(i);if(a){n&&(n.path=a[1].trim());continue}if(i.startsWith("*** ")){r();continue}n&&i.startsWith("+")&&(n.bytes+=Buffer.byteLength(i.slice(1),"utf8")+1)}return r(),[...e].map(([s,i])=>({path:s,bytes:i}))}function
|
|
14
|
-
`)}return{revision:`${
|
|
15
|
-
`)){let i=s.replace(/\r$/,""),o=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(i);if(o){r(),n={path:o[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(i);if(a){n&&(n.path=a[1].trim());continue}if(i.startsWith("*** ")){r();continue}n&&i.startsWith("+")&&(n.bytes+=Buffer.byteLength(i.slice(1),"utf8")+1)}return r(),[...e].map(([s,i])=>({path:s,bytes:i}))}function Ly(t){let e=t?.content;return typeof e=="string"?Buffer.byteLength(e,"utf8"):null}function Dy(t,e,n){let r=F(t);if(!r)return{entry:null,incomplete:t!=null};let s=[],i=!1;for(let[a,l]of Object.entries(r)){let d=F(l);if(!d){i=!0;continue}let u=F(d.usage),c=F(d.requests),m=F(d.tokenDetails),p=F(m?.input);s.push({model:a,requests_count:c?X(c.count):null,input_tokens:u?X(u.inputTokens):null,input_other_tokens:p?X(p.tokenCount):null,cache_read_tokens:u?X(u.cacheReadTokens):null,cache_write_tokens:u?X(u.cacheWriteTokens):null,output_tokens:u?X(u.outputTokens):null,reasoning_tokens:u?X(u.reasoningTokens):null})}s.sort((a,l)=>te(a.model,l.model));let o=i||s.length>0;return e===null?{entry:null,incomplete:o}:{entry:{native_id:e,recorded_at:n,kind:"copilot_session_shutdown",semantics:"reported_scope_unknown",models:s},incomplete:i}}function Py(t,e,n,r){let s=new Map;for(let c of t){if(c.type!=="user.message")continue;let m=F(c.data),p=typeof m?.interactionId=="string"?m.interactionId:null;if(p===null)continue;let f=Ly(m);s.has(p)?s.get(p)===null&&f!==null&&s.set(p,f):s.set(p,f)}let i=new Map,o=new Set,a=new Map,l=!1,d=1e3;for(let c of t){if(r.signal.throwIfAborted(),c.type==="session.shutdown"){let h=typeof c.id=="string"&&c.id?c.id:null,E=Ue(c.timestamp),{entry:y,incomplete:T}=Dy(F(c.data)?.modelMetrics,h,E);if(T&&(l=!0),y){let v=a.get(y.native_id);if(v&&JSON.stringify(v)!==JSON.stringify(y))l=!0;else if(a.set(y.native_id,y),a.size>d)return{snapshot:{status:"partial"},sessionUsage:null}}continue}if(c.type!=="assistant.message")continue;let m=F(c.data);if(!m)continue;let p=typeof m.messageId=="string"&&m.messageId?m.messageId:typeof c.id=="string"&&c.id?c.id:null;if(p===null)continue;let f=typeof m.interactionId=="string"?m.interactionId:null,g=i.get(p);if(!g){if(g={meta:{response_id:p,timestamp:Ue(c.timestamp),model:typeof m.model=="string"&&m.model?m.model:null,tokens:{...Ce},files_read:[],files_written:[]},obs:new Pe,io:new Me,promptRecorded:!1},i.set(p,g),i.size>r.maxRows)return{snapshot:{status:"partial"},sessionUsage:null};if(f!==null&&s.has(f)){if(!o.has(f)){o.add(f);let h=s.get(f);g.io.record({direction:"read",kind:"prompt",id:f,ref:null,bytes:h,basis:h===null?"unknown":"input_text"}),g.promptRecorded=!0}}else g.io.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})}let _=X(m.outputTokens);if(_!==null&&(g.meta.tokens.output=(g.meta.tokens.output??0)+_),g.meta.model===null&&typeof m.model=="string"&&m.model&&(g.meta.model=m.model),Array.isArray(m.toolRequests))for(let h of m.toolRequests){let E=F(h);if(!E)continue;let y=typeof E.name=="string"?E.name.toLowerCase():"",T=typeof E.toolCallId=="string"&&E.toolCallId?E.toolCallId:null,v=E.arguments;if(y==="create"){let b=F(v),S=typeof b?.path=="string"?b.path:null,R=typeof b?.file_text=="string"?Buffer.byteLength(b.file_text,"utf8"):null;S!==null?g.obs.record(T??p,"written",S,R):me(g.io,T)}else if(y==="apply_patch")if(typeof v=="string"){let b=Oy(v);if(b.length>0)for(let S of b)g.obs.record(T??p,"written",S.path,S.bytes);else me(g.io,T)}else me(g.io,T);else if(xy.has(y)){let b=F(v),S=typeof b?.path=="string"?b.path:null;S!==null?g.obs.record(T??p,"read",S,null):me(g.io,T)}else Ny.has(y)||me(g.io,T)}}let u=[];for(let{meta:c,obs:m,io:p}of i.values()){let f=m.files("read"),g=m.files("written"),_=p.entries();u.push({...c,files_read:f,files_written:g,external_io:_,read_bytes:Re(f,_,"read"),write_bytes:Re(g,_,"written"),model_provider:null,pricing_facts:null})}return l?{snapshot:{status:"partial"},sessionUsage:null}:{snapshot:{status:"complete",source:e,revision:n,checkpoint:n,responses:u},sessionUsage:a.size>0?[...a.values()]:null}}function My(){return process.env.HOME||process.env.USERPROFILE||""}var io=class{sessionStateDir;constructor(e={}){this.sessionStateDir=Xd(e.copilotSessionStateDir??Bd(My(),".copilot","session-state"))}async discover(e,n,r=null){z(e);let s;try{s=await ky(this.sessionStateDir)}catch{return{sources:[],truncated:!1}}let i=[];for(let o of s.sort(te)){e.signal.throwIfAborted();let a=Bd(this.sessionStateDir,o,qd);if(!(await Ay(a).catch(()=>null))?.isFile())continue;let d=await Iy(a).catch(()=>Xd(a)),u={provider:Et,sessionid:o,source_id:d};r!==null&&te(`${d}\0${o}`,r)<=0||i.push(u)}return i.sort((o,a)=>te(`${o.source_id}\0${o.sessionid}`,`${a.source_id}\0${a.sessionid}`)),{sources:i.slice(0,n),truncated:!1}}matches(e,n){return Hd(n)===qd&&Hd(Cy(n))===e.sessionid}async inspect(e,n){if(z(n),e.provider!==Et)return{status:"unsupported"};let r=await ye(e.source_id,[this.sessionStateDir]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await Ne(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){return(await this.readWithUsage(e,n,r)).snapshot}async readWithUsage(e,n,r){if(z(r),e.provider!==Et)return{snapshot:{status:"unsupported"},sessionUsage:null};let s=await ye(e.source_id,[this.sessionStateDir]);if(!s||!this.matches(e,s))return{snapshot:{status:"unavailable"},sessionUsage:null};let i=await Ne(s,r).catch(()=>null);if(!i||i.revision!==n)return{snapshot:{status:"partial"},sessionUsage:null};let o=Kr(i.data,r);return o?Py(o,e,n,r):{snapshot:{status:"partial"},sessionUsage:null}}};function Jd(t={}){return new io(t)}import{readdir as Gd,readFile as Uy,realpath as oo,stat as Vd}from"node:fs/promises";import{basename as lr,dirname as bn,isAbsolute as lo,join as Sn,relative as zd,resolve as ar,sep as Qd}from"node:path";var vt="kimi",uo="wire.jsonl",Zd="agents",Fy=new Set(["1.4","1.5"]),jy=5e5,$y=8*1024*1024,Wy=new Set(["read"]),Hy=new Set(["write","edit"]),By=new Set(["todolist","tasklist","taskoutput","taskstop","waitfor","creategoal","updategoal","getgoal","enterplanmode","exitplanmode","agentswarm","agent","skill","croncreate","crondelete","cronlist"]);function Xy(t){return By.has(t)||_t(t)}function qy(){return process.env.HOME||process.env.USERPROFILE||""}function Jy(t,e){if(t.length>0&&t[t.length-1]!==10)return null;let n=[],r=0;for(;r<t.length;){e.signal.throwIfAborted();let s=t.indexOf(10,r);s===-1&&(s=t.length);let i=t.toString("utf8",r,s);if(r=s+1,!!i.trim())try{let o=F(JSON.parse(i));if(!o)return null;n.push(o)}catch{return null}}return n}function Kd(t){let e=F(t);if(!e)return null;let n=X(e.inputOther),r=X(e.inputCacheRead),s=X(e.inputCacheCreation),i=X(e.output);return n===null||r===null||s===null||i===null?null:{input_uncached:n+s,input_cached:r,input_cache_write:s,output:i}}function Gy(t){if(!Array.isArray(t))return null;let e=0,n=!1;for(let r of t){let s=F(r);s?.type==="text"&&typeof s.text=="string"&&(e+=Buffer.byteLength(s.text,"utf8"),n=!0)}return n?e:null}var Vy=new Set(["system_trigger","cron_job","task"]);function Ky(t,e,n,r){let s=t.find(E=>E.type==="metadata"),i=s&&typeof s.protocol_version=="string"?s.protocol_version:null;if(i!==null&&!Fy.has(i))return{status:"unsupported"};let o=Yy(e.source_id),a=new Map,l=new Map,d=[],u=new Set,c=new Set,m=null,p=!1,f=E=>`${o}/${E}`,g=(E,y)=>{let T=f(E),v=a.get(T);return v||(v={meta:{response_id:T,timestamp:Ue(typeof y=="number"?y:null),model:null,tokens:{...Ce},files_read:[],files_written:[]},obs:new Pe,io:new Me,turnStepKey:null,tokensSource:"none"},a.set(T,v)),v},_=(E,y)=>{if(E.turnStepKey!==null)return;let T=y.turnId===void 0?null:String(y.turnId),v=y.step===void 0?null:String(y.step);T!==null&&v!==null&&(E.turnStepKey=`${T}.${v}`)};for(let E of t){if(r.signal.throwIfAborted(),E.type==="turn.prompt"){let T=F(E.origin),v=typeof T?.kind=="string"?T.kind:null,b=typeof E.promptId=="string"&&E.promptId?E.promptId:null;if(v!==null&&Vy.has(v))continue;if(b!==null){if(u.has(b))continue;u.add(b)}v==="user"?d.push({bytes:Gy(E.input),id:b}):d.push({bytes:null,id:b});continue}if(E.type==="usage.record"){if(c.size>1){p=!0;continue}if(c.size===0){m===null&&(p=!0);continue}let[T]=c,v=a.get(f(T));if(!v){p=!0;continue}if(v.tokensSource==="record"){p=!0;continue}let b=Kd(E.usage);b&&(v.meta.tokens=b,v.tokensSource="record");continue}if(E.type==="llm.request"){let T=typeof E.turnStep=="string"?E.turnStep:null,v=(typeof E.modelAlias=="string"&&E.modelAlias?E.modelAlias:null)??(typeof E.model=="string"&&E.model?E.model:null);T!==null&&v!==null&&(l.has(T)?l.get(T)!==v&&l.set(T,null):l.set(T,v));continue}if(E.type!=="context.append_loop_event")continue;let y=F(E.event);if(y){if(y.type==="step.begin"){let T=typeof y.uuid=="string"&&y.uuid?y.uuid:null;if(T===null)continue;let v=g(T,E.time);if(a.size>r.maxRows)return{status:"partial"};if(c.add(T),_(v,y),d.length>0){for(let b of d)v.io.record({direction:"read",kind:"prompt",id:b.id,ref:null,bytes:b.bytes,basis:b.bytes===null?"unknown":"input_text"});d.length=0}continue}if(y.type==="step.end"){let T=typeof y.uuid=="string"&&y.uuid?y.uuid:null;if(T===null)continue;let v=g(T,E.time);if(a.size>r.maxRows)return{status:"partial"};c.delete(T),m=T,_(v,y);let b=Kd(y.usage);b&&(v.meta.tokens=b),v.tokensSource="end",v.meta.timestamp===null&&(v.meta.timestamp=Ue(typeof E.time=="number"?E.time:null));continue}if(y.type==="tool.call"){let T=typeof y.stepUuid=="string"&&y.stepUuid?y.stepUuid:null;if(T===null)continue;let v=g(T,E.time);if(a.size>r.maxRows)return{status:"partial"};let b=typeof y.name=="string"?y.name.toLowerCase():"",S=typeof y.toolCallId=="string"&&y.toolCallId?y.toolCallId:null,R=F(y.args),O=typeof R?.path=="string"&&R.path?R.path:typeof R?.file_path=="string"&&R.file_path?R.file_path:null;Wy.has(b)?O!==null?v.obs.record(S??"","read",O,null):me(v.io,S):Hy.has(b)?O!==null?v.obs.record(S??"","written",O,yn(R)):me(v.io,S):Xy(b)||me(v.io,S);continue}}}let h=[];for(let{meta:E,obs:y,io:T,turnStepKey:v}of a.values()){E.model===null&&v!==null&&(E.model=l.get(v)??null);let b=y.files("read"),S=y.files("written"),R=T.entries();h.push({...E,files_read:b,files_written:S,external_io:R,read_bytes:Re(b,R,"read"),write_bytes:Re(S,R,"written"),model_provider:null,pricing_facts:Ve({},E.tokens.output,E.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:h,...p?{capture_status:"partial"}:{}}}function ao(t){return lr(t)===uo&&lr(bn(bn(t)))===Zd}function Yd(t){return lr(bn(bn(bn(t))))}function Yy(t){return lr(bn(t))}function zy(t,e){let n=zd(e,t);return n===""||!n.startsWith(`..${Qd}`)&&n!==".."&&!lo(n)}function Qy(t){if(t instanceof Error&&t.name==="AbortError")throw t}var dr=class{home;sessionsDir;indexPath;maxDiscoveryTraversalVisits;constructor(e={}){this.home=ar(e.kimiHome??process.env.KIMI_CODE_HOME??Sn(qy(),".kimi-code")),this.sessionsDir=Sn(this.home,"sessions"),this.indexPath=Sn(this.home,"session_index.jsonl"),this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):jy}async discover(e,n,r=null){z(e);let s=new Set,i=!1,o=await oo(this.sessionsDir).catch(()=>ar(this.sessionsDir)),a=m=>{ao(m)&&zy(m,o)&&s.add(m)},l=0,d=async(m,p)=>{if(e.signal.throwIfAborted(),i)return;let f=await Gd(m,{withFileTypes:!0}).catch(()=>[]);f.sort((g,_)=>te(g.name,_.name));for(let g of f){if(e.signal.throwIfAborted(),l+=1,l>this.maxDiscoveryTraversalVisits){i=!0;return}let _=Sn(m,g.name);if(g.isDirectory()&&!g.isSymbolicLink()&&p<4){if(await d(_,p+1),i)return}else g.isFile()&&g.name===uo&&ao(_)&&a(await oo(_).catch(()=>ar(_)))}};await d(this.sessionsDir,0);try{await this.unionIndex(a,e)}catch(m){Qy(m)}let u=[...s].sort(te);return{sources:(r===null?u:u.filter(m=>te(m,r)>0)).slice(0,n).map(m=>({provider:vt,sessionid:Yd(m),source_id:m})),truncated:i}}async unionIndex(e,n){let r=await Vd(this.indexPath).catch(()=>null);if(!r?.isFile()||r.size>$y)return;let s=await Uy(this.indexPath,{signal:n.signal});for(let i of s.toString("utf8").split(`
|
|
16
|
-
`)){if(n.signal.throwIfAborted(),!i.trim())continue;let o;try{o=F(JSON.parse(i))}catch{continue}let a=typeof o?.sessionId=="string"?o.sessionId:null,l=typeof o?.sessionDir=="string"?o.sessionDir:null;if(!a||!l||!
|
|
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
|
|
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:Ye({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:Ye({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:Ye({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=Ye({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:Ye({},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
18
|
`))return null;let e=[];for(let n of t.split(`
|
|
19
19
|
`)){let r=/^\s*\d+\t(.*)$/s.exec(n);if(r===null)return null;e.push(r[1])}return e.join(`
|
|
20
|
-
`)}async function iu(t,e){cr(e);let n=await tu(t).catch(()=>null);if(!n?.isFile()||n.size>e.maxBytes)return null;let r=await tT(t,{signal:e.signal});e.signal.throwIfAborted();let s=await tu(t).catch(()=>null);return!s?.isFile()||n.dev!==s.dev||n.ino!==s.ino||n.size!==s.size||n.mtimeMs!==s.mtimeMs?null:{revision:`${To}:sha256:${_o("sha256").update(r).digest("hex")}`,data:r}}function ET(t,e){if(t.length>0&&t[t.length-1]!==10)return null;let n=[],r=0;for(;r<t.length;){e.signal.throwIfAborted();let s=t.indexOf(10,r);s===-1&&(s=t.length);let i=t.toString("utf8",r,s);if(r=s+1,!!i.trim())try{let o=q(JSON.parse(i));if(!o)return null;n.push(o)}catch{return null}}return n}function vT(t){return is(rT(t))==="subagents"}function wT(t){let e=q(t);if(!e)return null;let n=xe(e.input_tokens),r=xe(e.output_tokens);if(n===null||r===null)return null;let s=e.cache_read_input_tokens===void 0?0:xe(e.cache_read_input_tokens),i=e.cache_creation_input_tokens===void 0?0:xe(e.cache_creation_input_tokens);return s===null||i===null?null:{input_uncached:n+i,input_cached:s,input_cache_write:i,output:r}}function ST(t,e){let n=new Map;for(let r of t){if(e.signal.throwIfAborted(),r.type!=="user")continue;let s=q(r.message),i=Array.isArray(s?.content)?s.content:null;if(!i)continue;let o=i.map(q).filter(u=>u?.type==="tool_result"),a=o.length===1,l=q(r.toolUseResult),d=l?.type==="text"?q(l.file):null;for(let u of o){if(typeof u.tool_use_id!="string"||u.tool_use_id.length===0)continue;let c,m=null;if(u.is_error===!0)c=null;else if(a&&d&&typeof d.content=="string")c=Buffer.byteLength(d.content,"utf8"),m=typeof d.filePath=="string"?d.filePath:null;else if(typeof u.content=="string"){let p=su(u.content);c=p!==null?Buffer.byteLength(p,"utf8"):null}else if(Array.isArray(u.content)){let p=u.content.map(q).filter(f=>f?.type==="text"&&typeof f.text=="string").map(f=>f.text);if(p.length===1){let f=su(p[0]);c=f!==null?Buffer.byteLength(f,"utf8"):null}else c=null}else c=null;n.set(u.tool_use_id,{bytes:c,cleanPath:m})}}return n}function bT(t){let e=t?.content;if(typeof e=="string")return Buffer.byteLength(e,"utf8");if(Array.isArray(e)){let n=0,r=!1;for(let s of e){let i=q(s);i?.type==="text"&&typeof i.text=="string"&&(n+=Buffer.byteLength(i.text,"utf8"),r=!0)}if(r)return n}return null}function RT(t){if(t.type!=="user"||t.toolUseResult!==void 0||t.isMeta===!0||t.isCompactSummary===!0||t.isVisibleInTranscriptOnly===!0||t.promptSource==="system"||t.scheduledTaskId!==void 0||t.scheduledFireId!==void 0)return!1;let e=q(t.message)?.content;return!(Array.isArray(e)&&e.some(n=>q(n)?.type==="tool_result"))}function kT(t){let e=new Map,n=new Set,r=new Map;for(let o of t){let a=typeof o.uuid=="string"&&o.uuid?o.uuid:null;if(a!==null&&(e.set(a,typeof o.parentUuid=="string"&&o.parentUuid?o.parentUuid:null),RT(o))){n.add(a);let l=bT(q(o.message));l!==null&&r.set(a,l)}}let s=new Map;return{promptBytes:r,parent:e,resolve:o=>{let a=[],l=new Set,d=o,u;for(;;){let c=s.get(d);if(c){u=c;break}if(n.has(d)){u={kind:"found",uuid:d};break}if(!e.has(d)){u={kind:"broken"};break}if(l.has(d)){u={kind:"broken"};break}l.add(d),a.push(d);let m=e.get(d)??null;if(m===null){u={kind:"clean"};break}d=m}for(let c of a)s.set(c,u);return u}}}function IT(t,e){let n=q(e.cache_creation),r=q(e.output_tokens_details),s=q(e.server_tool_use),i=(o,a)=>{let l=kn(a);l!==null&&(t[o]=l)};i("cacheWrite5m",n?.ephemeral_5m_input_tokens),i("cacheWrite1h",n?.ephemeral_1h_input_tokens),i("reasoning",r?.thinking_tokens),i("webSearch",s?.web_search_requests),i("webFetch",s?.web_fetch_requests)}function AT(t,e,n,r,s=!1){let i=ST(t,r),{promptBytes:o,parent:a,resolve:l}=kT(t),d=new Set,u=(f,g)=>{let _=o.get(g)??null;f.record({direction:"read",kind:"prompt",id:g,ref:null,bytes:_,basis:_===null?"unknown":"input_text"})},c=f=>{f.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})},m=new Map;for(let f of t){if(r.signal.throwIfAborted(),f.type!=="assistant"||f.isSidechain===!0&&!s||f.isMeta===!0)continue;let g=q(f.message);if(!g||typeof g.id!="string"||g.id.length===0)continue;let _=m.get(g.id);if(!_){if(_={meta:{response_id:g.id,timestamp:Eo(f.timestamp),model:null,tokens:{...ur},files_read:[],files_written:[]},obs:new wt,io:new St,pricingRaw:{}},m.set(g.id,_),m.size>r.maxRows)return{status:"partial"};let E=typeof f.uuid=="string"&&f.uuid?f.uuid:null;if(E===null)c(_.io);else{let y=l(E);if(y.kind==="broken")c(_.io);else if(y.kind==="found"){let T=[],v=y.uuid;for(;v!==null&&!d.has(v);){let b=v;d.add(b),T.push(b);let S=a.get(b)??null;if(S===null){v=null;continue}let R=l(S);v=R.kind==="found"?R.uuid:null}for(let b=T.length-1;b>=0;b-=1)u(_.io,T[b])}}}let h=q(g.usage);if(h){let E=wT(h);E&&(_.meta.tokens=E),IT(_.pricingRaw,h)}if(typeof g.model=="string"&&g.model&&(_.meta.model=g.model),Array.isArray(g.content))for(let E of g.content){let y=q(E);if(y?.type!=="tool_use")continue;let T=typeof y.id=="string"&&y.id?y.id:g.id,v=du(y.name),b=hT(y.input),S=typeof y.name=="string"?y.name.toLowerCase():"";if(v==="read"){let R=ls(b,["file_path","filePath","path","file"]);if(R===null)continue;let O=i.get(T),N=O===void 0||O.cleanPath!==null&&O.cleanPath!==R?null:O.bytes;_.obs.record(T,"read",R,N)}else if(v==="written")_.obs.record(T,"written",ls(b),uu(b));else if(v==="apply_patch"){let R=typeof b=="string"?b:q(b)?.input;if(typeof R=="string")for(let O of ds(R))_.obs.record(T,"written",O.path,O.bytes)}else S==="webfetch"||S==="websearch"?_.io.record({direction:"read",kind:"web",id:T,ref:lu(q(b)?.url),bytes:null,basis:"unknown"}):ho(y.name)||mr(_.io,T)}}let p=[];for(let{meta:f,obs:g,io:_,pricingRaw:h}of m.values()){let E=g.files("read"),y=g.files("written"),T=_.entries();p.push({...f,files_read:E,files_written:y,external_io:T,read_bytes:In(E,T,"read"),write_bytes:In(y,T,"written"),model_provider:null,pricing_facts:yo(h,f.tokens.output,f.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:p}}function CT(t){let e=q(t);if(!e)return null;let n=xe(e.input_tokens),r=xe(e.cached_input_tokens),s=xe(e.output_tokens);if(n===null||r===null||s===null||r>n)return null;let i=e.cache_write_input_tokens===void 0?null:xe(e.cache_write_input_tokens);return e.cache_write_input_tokens!==void 0&&i===null?null:{input_uncached:n-r,input_cached:r,input_cache_write:i,output:s}}function NT(t,e,n){let r=typeof t.call_id=="string"&&t.call_id?t.call_id:null,s=typeof t.name=="string"?t.name.toLowerCase():"",i=t.type==="custom_tool_call"?t.input:t.arguments;if(s==="apply_patch"&&typeof i=="string"){if(r!==null)for(let o of ds(i))e.record(r,"written",o.path,o.bytes);return}if(typeof i=="string"){let o=TT(i);if(o!==null){if(r!==null)for(let a of ds(o))e.record(r,"written",a.path,a.bytes);return}}ho(s)||mr(n,r)}function xT(t){let n=q(t.internal_chat_message_metadata_passthrough)?.content_item_kinds,r=t.content;if(!Array.isArray(n))return"unknown";if(!Array.isArray(r))return"injected";let s=0,i=!1;for(let o=0;o<r.length;o+=1){if(n[o]!=="user.text")continue;let a=q(r[o]);a&&typeof a.text=="string"&&(s+=Buffer.byteLength(a.text,"utf8"),i=!0)}return i?{bytes:s}:"injected"}function OT(t,e,n,r){let s=new Map,i=new Map,o=null,a=null,l=new wt,d=new St,u=0,c=!1,m=!0,p=new Set;for(let g of t){r.signal.throwIfAborted();let _=q(g.payload);if(g.type==="session_meta"&&_&&typeof _.model_provider=="string"&&_.model_provider){a=_.model_provider;continue}if(g.type==="turn_context"&&_){let T=typeof _.model=="string"&&_.model?_.model:null;T&&(o=T),T&&typeof _.turn_id=="string"&&i.set(_.turn_id,T);continue}if(g.type==="response_item"&&_){if(_.type==="function_call"||_.type==="custom_tool_call")NT(_,l,d);else if(_.type==="local_shell_call")mr(d,typeof _.call_id=="string"?_.call_id:null);else if(_.type==="web_search_call")u+=1,d.record({direction:"read",kind:"web",id:typeof _.id=="string"?_.id:null,ref:null,bytes:null,basis:"unknown"});else if(_.type==="message"&&_.role==="user"){let T=xT(_),v=typeof _.id=="string"&&_.id?_.id:null;T==="unknown"?d.record({direction:"read",kind:"prompt",id:v,ref:null,bytes:null,basis:"unknown"}):T!=="injected"&&(v===null?d.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"}):p.has(v)||(p.add(v),d.record({direction:"read",kind:"prompt",id:v,ref:null,bytes:T.bytes,basis:"input_text"})))}continue}if(g.type==="event_msg"&&_?.type==="token_count"){c=!0,m&&(l=new wt,d=new St,u=0);continue}if(g.type!=="token_usage_record"||!_)continue;if(typeof _.response_id!="string"||_.response_id.length===0)return{status:"unsupported"};let h=CT(_.usage);if(!h)return{status:"partial"};let E=typeof _.turn_id=="string"?i.get(_.turn_id)??o:o,y=s.get(_.response_id);if(!y&&(y={meta:{response_id:_.response_id,timestamp:null,model:null,tokens:h,files_read:[],files_written:[]},obs:new wt,io:new St,rawUsage:null,webSearch:0},s.set(_.response_id,y),s.size>r.maxRows))return{status:"partial"};m=!1,y.meta.timestamp=Eo(g.timestamp),y.meta.model=E??null,y.meta.tokens=h,y.rawUsage=q(_.usage),y.obs.absorb(l),y.io.absorb(d),y.webSearch+=u,l=new wt,d=new St,u=0}if(c&&s.size===0)return{status:"unsupported"};let f=[];for(let{meta:g,obs:_,io:h,rawUsage:E,webSearch:y}of s.values()){let T=_.files("read"),v=_.files("written"),b=h.entries(),S=q(E),R=yo({reasoning:S?.reasoning_output_tokens,webSearch:y>0?y:void 0},g.tokens.output,g.tokens.input_cache_write);f.push({...g,files_read:T,files_written:v,external_io:b,read_bytes:In(T,b,"read"),write_bytes:In(v,b,"written"),model_provider:a,pricing_facts:R})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:f,...c?{capture_status:"partial"}:{}}}function LT(t,e=!1){let n=q(t);if(!n)return{...ur};let r=n.input===void 0?e?null:0:xe(n.input),s=n.output===void 0?e?null:0:xe(n.output),i=n.reasoning===void 0?e?null:0:xe(n.reasoning),o=q(n.cache),a=o?.read===void 0?e?null:0:xe(o.read),l=o?.write===void 0?e?null:0:xe(o.write);return e&&r===0&&s===0&&i===0&&a===0&&l===0?{...ur}:e?{input_uncached:r!==null&&l!==null&&Number.isSafeInteger(r+l)?r+l:null,input_cached:a,input_cache_write:l,output:s!==null&&i!==null&&Number.isSafeInteger(s+i)?s+i:null}:r===null||s===null||i===null||a===null||l===null?{...ur}:r+s+i+a+l===0?{...ur}:{input_uncached:r+l,input_cached:a,input_cache_write:l,output:s+i}}function ou(t,e,n){cr(n);let r=n.maxRows*20,s=t.prepare("SELECT (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM message WHERE session_id=?) + (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM part WHERE session_id=?) AS total").get(e,e),i=xe(s?.total);if(i===null||i>n.maxBytes)return null;let o=t.prepare("SELECT id,time_created,time_updated,data FROM message WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1),a=t.prepare("SELECT id,message_id,time_created,time_updated,data FROM part WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1);if(o.length+a.length>r)return null;let l=0,d=_o("sha256");for(let u of[...o,...a]){n.signal.throwIfAborted();let c=JSON.stringify(u);if(l+=Buffer.byteLength(c),l>n.maxBytes)return null;d.update(c).update(`
|
|
21
|
-
`)}return{revision:`${To}:sha256:${d.digest("hex")}`,messages:o,parts:a}}var DT=new Set(["session-job-notification"]);function PT(t){let e=0,n=!1,r=!1;for(let s of t){let i;try{i=q(JSON.parse(s.data))}catch{continue}let o=typeof i?.type=="string"?i.type:"";i?.synthetic===!0||i?.ignored===!0||(o==="text"&&typeof i.text=="string"?(e+=Buffer.byteLength(i.text,"utf8"),n=!0):o&&!DT.has(o)&&(r=!0))}return n?e:r?"unknown":null}function MT(t,e,n,r){let s=new Map;for(let d of n.parts){let u=s.get(d.message_id)??[];u.push(d),s.set(d.message_id,u)}let i=new Map;for(let d of n.messages){let u;try{u=q(JSON.parse(d.data))}catch{continue}if(u?.role!=="user")continue;let c=PT(s.get(d.id)??[]);c==="unknown"?i.set(d.id,null):c!==null&&i.set(d.id,c)}let o=new Map,a=new Set;for(let d of n.messages){let u;try{u=q(JSON.parse(d.data))}catch{continue}if(u?.role!=="assistant")continue;let c=typeof u.parentID=="string"?u.parentID:null;c!==null&&i.has(c)&&!a.has(c)&&(a.add(c),o.set(d.id,{id:c,bytes:i.get(c)}))}let l=[];for(let d of n.messages){r.signal.throwIfAborted();let u;try{u=q(JSON.parse(d.data))}catch{return{status:"partial"}}if(r.requireBillingCounters&&u&&Object.hasOwn(u,"tokens")&&u.role!=="assistant")return{status:"partial"};if(!u||u.role!=="assistant")continue;let c=new wt,m=new St,p=0,f=o.get(d.id);f&&m.record({direction:"read",kind:"prompt",id:f.id,ref:null,bytes:f.bytes,basis:f.bytes===null?"unknown":"input_text"});for(let S of s.get(d.id)??[]){let R;try{R=q(JSON.parse(S.data))}catch{return{status:"partial"}}if(R?.type!=="tool")continue;let O=typeof R.tool=="string"?R.tool.toLowerCase():"",N=du(R.tool),A=q(R.state),w=q(A?.input),I=typeof R.callID=="string"&&R.callID?R.callID:typeof A?.callID=="string"&&A.callID?A.callID:S.id;if(N==="written")c.record(I,"written",ls(w),uu(w));else if(N==="apply_patch"){let C=w?.patchText;if(typeof C=="string")for(let k of ds(C))c.record(I,"written",k.path,k.bytes);else mr(m,I)}else if(N==="read"){let C=ls(w,["filePath","path","file","file_path"]);if(C===null)continue;let k=null;if(A?.status==="completed"){let x=q(q(A.metadata)?.display);x?.type==="file"&&typeof x.text=="string"&&(k=Buffer.byteLength(x.text,"utf8"))}c.record(I,"read",C,k)}else if(O==="webfetch"){p+=1;let C=A?.status==="completed"?A.output:void 0;m.record({direction:"read",kind:"web",id:I,ref:lu(w?.url),bytes:typeof C=="string"?Buffer.byteLength(C,"utf8"):null,basis:typeof C=="string"?"normalized_content":"unknown"})}else ho(R.tool)||mr(m,I)}let g=q(u.time),_=q(u.model)?.modelID??u.modelID,h=LT(u.tokens,r.requireBillingCounters),E=q(u.tokens),y=c.files("read"),T=c.files("written"),v=m.entries(),b=yo({reasoning:E?.reasoning,webFetch:p>0?p:void 0},h.output,h.input_cache_write);if(l.push({response_id:d.id,timestamp:Eo(g?.created??d.time_created),model:typeof _=="string"&&_?_:null,tokens:h,files_read:y,files_written:T,external_io:v,read_bytes:In(y,v,"read"),write_bytes:In(T,v,"written"),model_provider:typeof u.providerID=="string"&&u.providerID?u.providerID:null,pricing_facts:b}),l.length>r.maxRows)return{status:"partial"}}return{status:"complete",source:t,revision:e,checkpoint:e,responses:l}}async function po(t,e){if(!nu(t))return null;let n=await eT(t).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await fo(t).catch(()=>null);if(!r)return null;for(let s of e){let i=await fo(s).catch(()=>ot(s)),o=sT(i,r);if(o===""||!o.startsWith(`..${iT}`)&&o!==".."&&!nu(o))return r}return null}async function au(t,e,n,r,s=null){let i=[],o=0,a=!1;async function l(d){r.signal.throwIfAborted();let u=await nT(d,{withFileTypes:!0}).catch(()=>[]);u.sort((c,m)=>bt(c.name,m.name));for(let c of u){if(r.signal.throwIfAborted(),i.length>=e)return;if(o+=1,o>n){a=!0;return}let m=Vt(d,c.name);if(c.isDirectory()&&!c.isSymbolicLink()){if(await l(m),a||i.length>=e)return}else if(c.isFile()&&c.name.endsWith(".jsonl")){let p=await fo(m).catch(()=>ot(m));(s===null||bt(p,s)>0)&&i.push(p)}}}return await l(t),{paths:i.sort(bt),truncated:a}}function UT(t,e){let n=new Set;if(e.length===0)return n;let r=400;for(let{db:s}of t)for(let i=0;i<e.length;i+=r){let o=e.slice(i,i+r);try{let a=s.prepare(`SELECT id FROM session WHERE id IN (${o.map(()=>"?").join(",")})`).all(...o);for(let l of a)typeof l.id=="string"&&n.add(l.id)}catch{}}return n}var go=class{claudeProjectsDir;codexSessionDirs;lmplayerDbPaths;sqliteBusyTimeoutMs;maxDiscoveryTraversalVisits;agyReader;dshReader;qwenReader;opencodeReader;copilotReader;kimiReader;sessionDataReaders;constructor(e={}){this.sessionDataReaders=Object.fromEntries([pd(e.museDataHome),ts(e.miniplayerHome)].map(n=>[n.provider,new Tn(n)])),this.claudeProjectsDir=ot(e.claudeProjectsDir??Vt(os(),".claude","projects")),this.codexSessionDirs=(e.codexSessionDirs??[Vt(os(),".codex","sessions"),Vt(os(),".code","sessions")]).map(n=>ot(n)),this.lmplayerDbPaths=(e.lmplayerDbPaths??uT()).map(n=>ot(n)),this.sqliteBusyTimeoutMs=e.sqliteBusyTimeoutMs??5e3,this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):lT,this.agyReader=kd(e.agyConversationsDir?{agyConversationsDir:e.agyConversationsDir}:{}),this.dshReader=Dd(e.dshHome?{dshHome:e.dshHome}:{}),this.qwenReader=Ud(e.qwenProjectsDirs?{qwenProjectsDirs:e.qwenProjectsDirs}:{}),this.opencodeReader=Wd(e.opencodeDbPaths?{dbPaths:e.opencodeDbPaths}:{}),this.copilotReader=Jd(e.copilotSessionStateDir?{copilotSessionStateDir:e.copilotSessionStateDir}:{}),this.kimiReader=eu(e.kimiHome?{kimiHome:e.kimiHome}:{})}capabilities(){let e=_o("sha256").update(JSON.stringify({claudeProjectsDir:this.claudeProjectsDir,codexSessionDirs:this.codexSessionDirs,lmplayerDbPaths:this.lmplayerDbPaths,agyExtractionRevisionTag:ns,sessionData:Object.values(this.sessionDataReaders).map(({format:n})=>[n.provider,n.root,n.revision])})).digest("hex");return{scope:"account",revision:`${To}:${e}`,providers:[...Rn],metering:{muse:"partial",miniplayer:"partial",claude:"per_response",codex:"per_response",lmplayer:"per_response",opencode:"per_response",[Tt]:"per_response",[yt]:"per_response",[ht]:"partial",[Et]:"partial",[vt]:"per_response"}}}async discover(e){if(cr(e),!Number.isSafeInteger(e.maxSources)||e.maxSources<=0)throw new Error("maxSources must be a positive safe integer");let n=pT(e.after),r=n?.pos??new Map,s=n?.done??new Set,i=n?.rr??0,o=Rn.filter(_=>!s.has(_));if(o.length===0)return{sources:[],complete:!0,cursor:null};let a=new Map,l=new Map;for(let _ of o){e.signal.throwIfAborted();let h=r.get(_)??null,{sources:E,truncated:y}=await this.discoverProvider(Rn.indexOf(_),e,e.maxSources+1,h);if(y)throw new Error(`passive session discovery exceeded the traversal budget for provider "${_}"; cannot certify a complete or progressing sweep`);let T=h?as({provider:_,source_id:h.source_id,sessionid:h.sessionid}):null,v=T===null?E:E.filter(b=>bt(as(b),T)>0);l.set(_,v.length>e.maxSources),a.set(_,v.slice(0,e.maxSources))}let d=i%o.length,u=o.map((_,h)=>o[(h+d)%o.length]),c=new Map(o.map(_=>[_,0])),m=[],p=!0;for(;m.length<e.maxSources&&p;){p=!1;for(let _ of u){if(m.length>=e.maxSources)break;let h=a.get(_),E=c.get(_);E<h.length&&(m.push(h[E]),c.set(_,E+1),p=!0)}}let f={},g=[...s];for(let _ of o){let h=a.get(_),E=c.get(_);if(!l.get(_)&&E===h.length){g.push(_);continue}if(E>0){let T=h[E-1];f[_]={source_id:T.source_id,sessionid:T.sessionid}}else{let T=r.get(_);T&&(f[_]=T)}}return Rn.every(_=>g.includes(_))?{sources:m,complete:!0,cursor:null}:{sources:m,complete:!1,cursor:mT({pos:f,done:g,rr:i+1})}}async inspect(e,n){if(cr(n),!Rn.includes(e.provider))return{status:"unsupported"};if(e.provider==="claude"||e.provider==="codex"){let r=e.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,s=await po(e.source_id,r);if(!s||!this.jsonlSourceMatches(e,s))return{status:"unavailable"};let i=await iu(s,n).catch(()=>null);return i?{status:"ready",revision:i.revision}:{status:"partial"}}return e.provider==="lmplayer"?this.inspectLmplayer(e,n):e.provider===ht?this.agyReader.inspect(e,n):e.provider===yt?this.dshReader.inspect(e,n):e.provider===Gt?this.opencodeReader.inspect(e,n):e.provider===Et?this.copilotReader.inspect(e,n):e.provider===Tt?this.qwenReader.inspect(e,n):e.provider===vt?this.kimiReader.inspect(e,n):this.sessionDataReaders[e.provider]?.inspect(e,n)??{status:"unsupported"}}async read(e,n,r){if(cr(r),e.provider==="claude"||e.provider==="codex"){let s=e.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,i=await po(e.source_id,s);if(!i||!this.jsonlSourceMatches(e,i))return{status:"unavailable"};let o=await iu(i,r).catch(()=>null);if(!o)return{status:"partial"};if(o.revision!==n)return{status:"partial"};let a=ET(o.data,r);return a?e.provider==="claude"?AT(a,e,n,r,vT(i)):OT(a,e,n,r):{status:"partial"}}if(e.provider==="lmplayer")return this.readLmplayer(e,n,r);if(e.provider===ht)return this.agyReader.read(e,n,r);if(e.provider===yt)return this.dshReader.read(e,n,r);if(e.provider===Gt)return this.opencodeReader.read(e,n,r);if(e.provider===Tt)return this.qwenReader.read(e,n,r);if(e.provider===Et){let{snapshot:s,sessionUsage:i}=await this.copilotReader.readWithUsage(e,n,r);return s.status!=="complete"?s:{...s,session_usage:i}}return e.provider===vt?this.kimiReader.read(e,n,r):this.sessionDataReaders[e.provider]?this.sessionDataReaders[e.provider].read(e,n,r):{status:"unsupported"}}async discoverProvider(e,n,r,s){let i=s?.source_id??null;if(e===0){let{paths:o,truncated:a}=await au(this.claudeProjectsDir,r,this.maxDiscoveryTraversalVisits,n,i);return{sources:o.map(l=>({provider:"claude",sessionid:is(l,".jsonl"),source_id:l})).sort(co),truncated:a}}if(e===1){let o=[],a=!1;for(let l of[...this.codexSessionDirs].sort(bt)){let d=await au(l,r,this.maxDiscoveryTraversalVisits,n,i);d.truncated&&(a=!0);for(let u of d.paths){let c=is(u,".jsonl"),m=c.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u);o.push({provider:"codex",sessionid:m?.[1]??c,source_id:u})}}return{sources:o.sort(co).slice(0,r),truncated:a}}if(e===2)return{sources:await this.discoverLmplayer(n,r,s),truncated:!1};if(e===3)return this.agyReader.discover(n,r,i);if(e===4)return this.dshReader.discover(n,r,i);if(e===5)return this.opencodeReader.discover(n,r,s);if(e===6){let o=s?`${s.source_id}\0${s.sessionid}`:null;return this.copilotReader.discover(n,r,o)}return e===7?this.qwenReader.discover(n,r,i):e===8?this.kimiReader.discover(n,r,i):this.sessionDataReaders[Rn[e]].discover(n,r,i)}jsonlSourceMatches(e,n){let r=is(n,".jsonl");return e.provider==="claude"?r===e.sessionid:(r.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u)?.[1]??r)===e.sessionid}openLmplayer(e){if(!this.lmplayerDbPaths.includes(ot(e)))return null;try{let n=new(cT())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),n}catch{return null}}async discoverLmplayer(e,n,r){let s=[];try{let i=[...new Set(this.lmplayerDbPaths.map(a=>ot(a)))].sort(bt);for(let a of i){e.signal.throwIfAborted();let l=await po(a,[ot(a,"..")]);if(!l)continue;let d=this.openLmplayer(l);d&&s.push({path:l,db:d})}let o=[];for(let a=0;a<s.length&&o.length<n;a+=1){e.signal.throwIfAborted();let{path:l,db:d}=s[a];if(r&&bt(l,r.source_id)<0)continue;let u=r?.source_id===l?r.sessionid:"";for(;;){e.signal.throwIfAborted();let c;try{c=d.prepare("SELECT id FROM session WHERE id > ? ORDER BY id LIMIT ?").all(u,n)}catch{break}if(c.length===0)break;let m=c.map(f=>typeof f.id=="string"&&f.id?f.id:"").filter(Boolean);if(m.length===0)break;let p=a===0?new Set:UT(s.slice(0,a),m);for(let f of m){if(o.length>=n)break;p.has(f)||o.push({provider:"lmplayer",sessionid:f,source_id:l})}if(u=m[m.length-1],o.length>=n||c.length<n)break}}return o.sort(co).slice(0,n)}finally{for(let{db:i}of s)try{i.close()}catch{}}}inspectLmplayer(e,n){let r=this.openLmplayer(e.source_id);if(!r)return{status:"unavailable"};try{if(r.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return{status:"unavailable"};let i=ou(r,e.sessionid,n);return i?{status:"ready",revision:i.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}readLmplayer(e,n,r){let s=this.openLmplayer(e.source_id);if(!s)return{status:"unavailable"};try{if(s.exec("BEGIN"),s.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return s.exec("ROLLBACK"),{status:"unavailable"};let o=ou(s,e.sessionid,r);if(!o||o.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=MT(e,n,o,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}};function cu(t={}){return new go(t)}import{createHash as fu}from"node:crypto";import{opendir as jT,open as $T,realpath as gu}from"node:fs/promises";import{constants as vo}from"node:fs";import{join as WT,relative as HT,isAbsolute as BT,basename as XT,dirname as qT}from"node:path";function pr(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);if(e.length>1)try{let r=JSON.parse(e[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(t)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function Kt(t){let e=pr(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let n=t.split(`
|
|
22
|
-
`).map(a=>a).filter(a=>a.trim().length>0);if(n.length===0)throw new Error("gemini session file is empty");let r=n[0],s;try{s=JSON.parse(r)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<n.length;a++){let l;try{l=JSON.parse(n[a])}catch{continue}if(l===null||typeof l!="object")continue;let d=l;if("$set"in d&&d.$set&&typeof d.$set=="object"){Object.assign(s,d.$set);continue}if(typeof d.id=="string"||typeof d.type=="string"){let u=d;if(typeof u.id=="string"){let c=o.get(u.id);c?
|
|
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
23
|
`)+`
|
|
24
|
-
`}var
|
|
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
|
|
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=
|
|
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
27
|
`)<0?s.length:s.indexOf(`
|
|
28
|
-
`))).id:
|
|
29
|
-
`).length>o.maxRows)return{status:"partial"};let l=
|
|
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 Qe(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
30
|
CREATE INDEX IF NOT EXISTS idx_team_chat_started ON team_chat_log(created_at);
|
|
31
31
|
CREATE INDEX IF NOT EXISTS idx_team_chat_provider_model ON team_chat_log(provider, model_reported);
|
|
32
32
|
CREATE INDEX IF NOT EXISTS idx_team_chat_provider_session ON team_chat_log(provider, native_session_id);
|
|
@@ -45,7 +45,7 @@ CREATE VIEW IF NOT EXISTS turn_usage AS SELECT
|
|
|
45
45
|
+COALESCE(tok_cache_write,0)*COALESCE(rate_cache_write_1m,rate_input_1m,0)
|
|
46
46
|
+COALESCE(tok_output,0)*COALESCE(rate_output_1m,0))/1e6 END AS cost_usd
|
|
47
47
|
FROM team_chat_log WHERE attempt_key IS NOT NULL;
|
|
48
|
-
`;import{createHash as Cu}from"node:crypto";import{mkdirSync as Nu,readFileSync as ZT,renameSync as eE,writeFileSync as tE,existsSync as xu}from"node:fs";import{homedir as nE}from"node:os";import{dirname as Ou,join as gs,resolve as _s}from"node:path";import{fileURLToPath as rE}from"node:url";var sE="https://lmctl.com/dataset/model_list.json",iE="https://lmctl.com/dataset/aliases.json",oE=1e3,aE=1e4,vu=6*60*60*1e3;function lE(){return gs(nE(),".lmctl","cache","lmprice")}var ps="model_list.json",fs="aliases.json",Lu="meta.json",dE="model_list.meta.json";function Nn(t,e){return gs(t,e)}var fr=new WeakMap;function hs(t,e){if(!t||!e)return null;let n=fr.get(t),r=fr.get(e);return n===void 0||r===void 0?null:Cu("sha256").update(n).update(r).digest("hex")}function Yt(t){try{let e=ZT(t,"utf-8"),n=JSON.parse(e);return n&&typeof n=="object"&&fr.set(n,e),n}catch{return null}}function Du(t,e){let n=`${t}.tmp-${process.pid}`;tE(n,e),eE(n,t)}function bo(t){return t===null||typeof t=="number"}function zt(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.schema_version!==1||!Array.isArray(e.records)||e.records.length===0?!1:e.records.every(n=>{if(typeof n!="object"||n===null)return!1;let r=n;if(typeof r.source!="string"||typeof r.source_model_id!="string"||typeof r.pricing!="object"||r.pricing===null)return!1;let s=r.pricing;return bo(s.input_per_1m_tokens)&&bo(s.output_per_1m_tokens)&&bo(s.input_cache_read_per_1m_tokens)})}var uE=new Set(["established","asserted","unresolved"]);function Qt(t){if(typeof t!="object"||t===null)return!1;let e=t;if(e.schema_version!==1||!Array.isArray(e.standards)||!Array.isArray(e.aliases))return!1;let n=e.standards.every(s=>{if(typeof s!="object"||s===null)return!1;let i=s;return typeof i.standard_slug=="string"&&(i.catalog_record_id===null||typeof i.catalog_record_id=="string")}),r=e.aliases.every(s=>{if(typeof s!="object"||s===null)return!1;let i=s;return typeof i.alias=="string"&&(i.standard_slug===null||typeof i.standard_slug=="string")&&typeof i.evidence=="string"&&uE.has(i.evidence)});return n&&r}var wu={etag:null,last_checked:null};function cE(t){let e=Yt(Nn(t,Lu)),n={etag:typeof e?.model_list?.etag=="string"?e.model_list.etag:null,last_checked:typeof e?.model_list?.last_checked=="string"?e.model_list.last_checked:null},r={etag:typeof e?.aliases?.etag=="string"?e.aliases.etag:null,last_checked:typeof e?.aliases?.last_checked=="string"?e.aliases.last_checked:null};if(e===null){let s=Yt(Nn(t,dE));s&&(n.etag=typeof s.etag=="string"?s.etag:null,n.last_checked=typeof s.fetchedAt=="string"?s.fetchedAt:null)}return{model_list:n,aliases:r,...typeof e?.pair_sha256=="string"?{pair_sha256:e.pair_sha256}:{}}}function mE(t){let e=cE(t),n=Yt(Nn(t,ps)),r=Yt(Nn(t,fs));return e.pair_sha256&&hs(zt(n)?n:null,Qt(r)?r:null)!==e.pair_sha256?{catalog:null,aliases:null,meta:{model_list:{...wu},aliases:{...wu}}}:{catalog:zt(n)?n:null,aliases:Qt(r)?r:null,meta:e}}function Su(t,e){try{return Nu(t,{recursive:!0}),Du(Nn(t,Lu),JSON.stringify(e)),!0}catch{return!1}}function Ro(t){return(t&&typeof t=="object"?fr.get(t):void 0)??JSON.stringify(t)}function ms(t,e,n){try{Nu(t,{recursive:!0}),Du(Nn(t,e),Ro(n))}catch{}}function pE(t,e){let n=fE(t),r=n?[_s(n,"data",e)]:[_s(t,"..","..","data",e)];for(let s of r)if(xu(s))return s;return null}function fE(t){let e=_s(t);for(;;){if(xu(_s(e,"package.json")))return e;let n=Ou(e);if(n===e)return null;e=n}}function bu(t,e,n){let r=n!==void 0?n:pE(t,e);return r===null?null:Yt(r)}function ys(t=process.env){let e=t.LMCTL_PRICE_TTL;if(e===void 0||e==="")return vu;let n=Number(e);return!Number.isFinite(n)||n<0?vu:n*1e3}function gE(){let t=process.env.LMCTL_PRICE_DATA;return t!==void 0&&t!==""?t:null}async function Ru(t,e,n,r){try{let s=await t(e,{method:"HEAD",signal:AbortSignal.timeout(oE)});if(!s.ok)return{kind:"failed"};let i=s.headers.get("etag");if(n!==null&&i!==null&&i===r)return{kind:"match"};let o=await t(e,{signal:AbortSignal.timeout(aE)});if(!o.ok)return{kind:"failed"};let a=await o.text(),l=JSON.parse(a);return l&&typeof l=="object"&&fr.set(l,a),{kind:"payload",payload:l,etag:o.headers.get("etag")??i}}catch{return{kind:"failed"}}}var ko=null;var ku=null;function Pu(t={}){return Object.keys(t).length===0?(ku??=Iu(t),ku):Iu(t)}async function Iu(t){let e=Ou(rE(import.meta.url)),n=t.pinDir!==void 0?t.pinDir:gE();if(n!==null&&n!==""){let g=Yt(gs(n,ps)),_=Yt(gs(n,fs));if(zt(g)&&Qt(_)){let h={sha256:hs(g,_),catalog:g,aliases:_,source:"pinned",generatedAt:g.generated_at??null};return ko=h.generatedAt,h}return Au(t,e)}let r=t.fetchImpl??fetch,s=t.cacheDir??lE(),i=t.now??Date.now(),o=t.ttlMs??ys(),a=mE(s),l=(g,_)=>g!==null&&_.last_checked!==null&&i>=Date.parse(_.last_checked)&&i-Date.parse(_.last_checked)<o,d=a.catalog,u=a.aliases,c=!1,m=!1,p={model_list:{...a.meta.model_list},aliases:{...a.meta.aliases}},f=!1;if(!l(d,a.meta.model_list)){let g=await Ru(r,sE,d,a.meta.model_list.etag);g.kind==="failed"&&(m=!0),g.kind==="match"?(p.model_list.last_checked=new Date(i).toISOString(),f=!0):g.kind==="payload"&&(zt(g.payload)?(p.model_list.last_checked=new Date(i).toISOString(),f=!0,d=g.payload,g.etag!==null&&(p.model_list.etag=g.etag),c=!0):m=!0)}if(!l(u,a.meta.aliases)){let g=await Ru(r,iE,u,a.meta.aliases.etag);g.kind==="failed"&&(m=!0),g.kind==="match"?(p.aliases.last_checked=new Date(i).toISOString(),f=!0):g.kind==="payload"&&(Qt(g.payload)?(p.aliases.last_checked=new Date(i).toISOString(),f=!0,u=g.payload,g.etag!==null&&(p.aliases.etag=g.etag),c=!0):m=!0)}if(!m&&(f||c))if(d!==null&&u!==null){let g=Cu("sha256").update(Ro(d)).update(Ro(u)).digest("hex");Su(s,{...p,pair_sha256:g})&&g!==a.meta.pair_sha256&&(ms(s,ps,d),ms(s,fs,u))}else d!==a.catalog&&d!==null&&ms(s,ps,d),u!==a.aliases&&u!==null&&ms(s,fs,u),Su(s,p);if(d!==null||u!==null){let g={catalog:d,aliases:u,sha256:hs(d,u),source:c?"network":"cache",refreshFailed:m,generatedAt:d?.generated_at??null};return ko=g.generatedAt,g}return{...Au(t,e),refreshFailed:m}}function Au(t,e){let n=bu(e,"price-data.json",t.bundledPath),r=bu(e,"price-aliases.json",t.bundledAliasesPath),s=zt(n)?n:null,i=Qt(r)?r:null,o={catalog:s,aliases:i,sha256:hs(s,i),source:s!==null||i!==null?"bundled":"unavailable",generatedAt:s?.generated_at??null};return ko=o.generatedAt,o}var An=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?t:null,Cn=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null;function Mu(t){if(t.cacheWrite!==void 0)return Cn(t.cacheWrite);if(t.cacheWrite5m===void 0&&t.cacheWrite1h===void 0)return 0;let e=Cn(t.cacheWrite5m),n=Cn(t.cacheWrite1h);return e===null||n===null?null:Cn(e+n)}function Io(t,e){let n=Cn(t.cacheWrite5m===void 0?0:t.cacheWrite5m),r=Cn(t.cacheWrite1h===void 0?0:t.cacheWrite1h);return n!==null&&r!==null&&Number.isSafeInteger(n+r)&&n+r===e?{five:n,one:r}:null}function Ao(t,e){let n=An(e.input_per_1m_tokens),r=An(e.output_per_1m_tokens),s=An(e.input_cache_read_per_1m_tokens),i=An(e.source_cost_fields?.cache_creation_input_token_cost),o=An(e.input_cache_write_per_1m_tokens)??(i===null?n:i*1e6),a=An(e.source_cost_fields?.cache_creation_input_token_cost_above_1hr),l=a===null?o:a*1e6,d=Mu(t),u=Io(t,d),c=d===null?null:u===null||d===0?o:u.five>0&&o===null||u.one>0&&l===null?null:(u.five*(o??0)+u.one*(l??0))/d;return{inputPer1m:n,outputPer1m:r,cacheReadPer1m:s,cacheWritePer1m:c}}function Uu(t,e){if(e===null)return null;let n=Ao(t,e),r=Mu(t);if(r===null||t.input>0&&n.inputPer1m===null||t.output>0&&n.outputPer1m===null||t.cachedInput>0&&n.cacheReadPer1m===null||r>0&&n.cacheWritePer1m===null)return null;let s=(t.input*(n.inputPer1m??0)+t.output*(n.outputPer1m??0)+t.cachedInput*(n.cacheReadPer1m??0)+r*(n.cacheWritePer1m??0))/1e6;return Number(s.toPrecision(10))}function Zt(t){return t.toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function xn(t){let e=t.source_model_id.toLowerCase(),n=e.slice(e.lastIndexOf("/")+1);return Zt(n)}function ju(t){let e=new Set,n=r=>{let s=r.toLowerCase().split("/");for(let i=0;i<s.length;i+=1)e.add(Zt(s.slice(i).join("/")))};return n(t.source_model_id),t.gateway_id&&n(t.gateway_id),e}function _E(t,e){let n=new Set,r=l=>{n.add(Zt(l))},s=t.trim().toLowerCase(),i=null,o=s.indexOf(":");o>0&&!s.slice(0,o).includes("/")&&(i=s.slice(0,o),r(s),s=s.slice(o+1)),r(s);let a=s.slice(s.lastIndexOf("/")+1);r(a);for(let l of e)r(`${l}/${a}`);return i!==null&&r(`${i}/${a}`),[...n]}function en(t){let e=r=>!(r.mode!==void 0&&r.mode!==null&&r.mode!=="chat"||t.nonChatName&&t.nonChatName.test(r.source_model_id.toLowerCase())),n=r=>e(r)&&t.family.test(r.source_model_id.toLowerCase());return{firstPartyProviders:t.firstPartyProviders,isChatModel:e,coversRecord:n,normalize:r=>_E(r,t.vendorPrefixes),matchRow(r,s){if(!n(r))return!1;let i=ju(r);return s.some(o=>i.has(o))}}}var $u=en({vendorPrefixes:["anthropic"],family:/claude/,firstPartyProviders:["anthropic"]}),Wu=en({vendorPrefixes:["openai"],family:/(^|\/)(gpt-|o\d|chatgpt|ft:gpt)|openai\//,firstPartyProviders:["openai"],nonChatName:/(^|[-/])(tts|transcribe(?:-\w+)?|realtime(?:-\w+)?|search(?:-\w+)*|image(?:-\w+)?|audio(?:-\w+)?|whisper(?:-\w+)?|dall-e(?:-\w+)?|embedding|moderation)(-|$)/}),Hu=en({vendorPrefixes:["google","gemini"],family:/gemini|gemma/,firstPartyProviders:["gemini","google","vertex_ai-language-models"],nonChatName:/embedding|imagen|-image|tts|audio|veo|lyria|live|realtime|video/}),Bu=en({vendorPrefixes:["moonshot","moonshotai"],family:/kimi|moonshot/,firstPartyProviders:["moonshot"]}),Xu=en({vendorPrefixes:["dashscope","qwen"],family:/qwen/,firstPartyProviders:["dashscope"]}),qu=en({vendorPrefixes:["deepseek","nousresearch"],family:/deepseek|nous|hermes-\d/,firstPartyProviders:["deepseek","nousresearch"]}),hE=/\s*\(([^()]+)\)\s*$/;function yE(t){let e=t.trim(),n=hE.exec(e);return n?{model:e.slice(0,n.index).trim(),effort:n[1].trim()}:{model:e,effort:null}}var TE={"gemini 3.8 flash":"gemini-3.8-flash","gemini 3.7 flash":"gemini-3.7-flash","gemini 3.6 flash":"gemini-3.6-flash","gemini 3.1 pro":"gemini/gemini-3.1-pro-preview","claude sonnet 4.6":"claude-sonnet-4-6"},EE=["gemini","google","vertex_ai-language-models","anthropic"],vE={normalize(t){let{model:e}=yE(t),n=TE[e.toLowerCase()];return n===void 0?[]:[Zt(n)]},isChatModel(t){return t.mode===void 0||t.mode===null||t.mode==="chat"},coversRecord(t){return this.isChatModel(t)&&/gemini|claude/.test(t.source_model_id.toLowerCase())},matchRow(t,e){if(!this.coversRecord(t))return!1;let n=ju(t);return e.some(r=>n.has(r))}},Ju=en({vendorPrefixes:["deepseek"],family:/deepseek/,firstPartyProviders:["deepseek"]}),Gu={claude:$u,codex:Wu,gemini:Hu,agy:vE,kimi:Bu,qwen:Xu,hermes:qu,deepseek:Ju},Fu={claude:$u.firstPartyProviders,codex:Wu.firstPartyProviders,gemini:Hu.firstPartyProviders,agy:EE,kimi:Bu.firstPartyProviders,qwen:Xu.firstPartyProviders,hermes:qu.firstPartyProviders,deepseek:Ju.firstPartyProviders};function wE(t,e,n){let r=e.trim().toLowerCase(),s=Zt(r);if(n.records.some(o=>o.source_model_id.toLowerCase()===r&&t.matchRow(o,[s])))return!0;let i=t.normalize(e);return i.length>0&&n.records.some(o=>t.matchRow(o,i))}function SE(t,e,n){let r=[];for(let[s,i]of Object.entries(Gu))s!==n&&wE(i,t,e)&&r.push(s);return r}function Ts(t){return t==="moonshot"?0:t==="litellm"?1:t==="openrouter"?2:t==="manual"?3:4}function bE(t,e){return t.input_per_1m_tokens===e.input_per_1m_tokens&&t.output_per_1m_tokens===e.output_per_1m_tokens&&t.input_cache_read_per_1m_tokens===e.input_cache_read_per_1m_tokens&&(t.input_cache_write_per_1m_tokens??null)===(e.input_cache_write_per_1m_tokens??null)&&(t.source_cost_fields?.cache_creation_input_token_cost??null)===(e.source_cost_fields?.cache_creation_input_token_cost??null)&&(t.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)===(e.source_cost_fields?.cache_creation_input_token_cost_above_1hr??null)}function RE(t){let e=new Map,n=[];for(let r of t){let s=r.source_model_id.toLowerCase(),i=s.lastIndexOf("/"),o=i===-1?"":s.slice(0,i+1),a=i===-1?s:s.slice(i+1),l=`${r.source}:${o}${Zt(a)}`,d=e.get(l);if(d===void 0){e.set(l,r);continue}if(!bE(d.pricing,r.pricing)){n.push(r);continue}/\d\.\d/.test(d.source_model_id)&&!/\d\.\d/.test(r.source_model_id)&&e.set(l,r)}return[...e.values(),...n]}function Vu(t){return{route:t.record_id??`${t.source}:${t.source_model_id}`,source:t.source,sourceModelId:t.source_model_id,provider:t.provider??null,pricing:t.pricing,estimated:t.source==="manual"}}function Ku(t,e){return t.map(Vu).sort((n,r)=>{let s=Ts(n.source)-Ts(r.source);if(s!==0)return s;let i=n.provider!==null&&e.includes(n.provider)?0:1,o=r.provider!==null&&e.includes(r.provider)?0:1;return i!==o?i-o:n.sourceModelId.localeCompare(r.sourceModelId)})}function Es(t){return t.pricing.input_per_1m_tokens!==null&&t.pricing.output_per_1m_tokens!==null}function kE(t,e,n){let r=RE(t),s=Ku(r,n),o=r.find(a=>(a.record_id??`${a.source}:${a.source_model_id}`)===s[0].route)?.context_window?.input_tokens??void 0;return{id:s[0].sourceModelId,normalizedId:e,offers:s,...o!=null?{contextWindow:o}:{}}}function Co(t,e,n,r){if(t.length===0)return{kind:"known-unpriced",id:e};let s=kE(t,e,n);if(r!==void 0){let o=t.map(Vu),a=o.filter(u=>u.provider===r&&!u.sourceModelId.includes("/")&&u.source!=="openrouter"&&!u.estimated),l=a.length>0?a:o;if(l.length!==1||!Es(l[0]))return{kind:"known-unpriced",id:e};let d=l[0];s.offers=[d,...s.offers.filter(u=>u.route!==d.route)],s.id=d.sourceModelId}let i=s.offers.find(Es);return i===void 0?{kind:"known-unpriced",id:e}:i.estimated?{kind:"estimated",model:s}:{kind:"priced",model:s}}var No=[];function IE(t,e){return t.standards.find(n=>n.standard_slug.toLowerCase()===e.toLowerCase())??null}function AE(t,e,n){let r=t.standard_slug;if(e===null||e.catalog_record_id===null)return{kind:"known-unpriced",id:r};let s=e.catalog_record_id,i=c=>c.record_id??c.source+":"+c.source_model_id,o=n.records.find(c=>i(c)===s),a=o?[]:n.records.filter(c=>i(c).toLowerCase()===s.toLowerCase()),l=o??(a.length===1?a[0]:void 0);if(!l)return{kind:"known-unpriced",id:r};let d=xn(l),u=n.records.filter(c=>xn(c)!==d?!1:c.mode===void 0||c.mode===null||c.mode==="chat");return u.length===0?{kind:"known-unpriced",id:r}:Co(u,d,No)}function CE(t,e,n,r){if(n===null||!Array.isArray(n.records))return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};if(r!==null){let g=[e.trim().toLowerCase()];g.push(`${t.toLowerCase()}/${g[0]}`);let _=r.aliases.find(h=>g.includes(h.alias.toLowerCase()));if(_){if(_.evidence==="unresolved"||_.standard_slug===null)return{state:{kind:"unresolved",alias:_.alias},viaAlias:!0,pinRoute:null};let h=IE(r,_.standard_slug);return{state:AE(_,h,n),viaAlias:!0,pinRoute:h?.catalog_record_id??null}}}let s=Gu[t];if(!s)return{state:{kind:"no-catalog"},viaAlias:!1,pinRoute:null};let i=e.trim().toLowerCase(),o=s.normalize(e),a=g=>({state:g,viaAlias:!1,pinRoute:null}),l=Zt(i),d=n.records.filter(g=>g.source_model_id.toLowerCase()===i&&s.matchRow(g,[l]));if(d.length>0){let g=xn(d[0]),_=n.records.filter(h=>s.matchRow(h,[g])&&xn(h)===g);return a(Co(_.length>0?_:d,g,Fu[t]??No,t==="codex"?"openai":void 0))}let u=n.records.filter(g=>s.matchRow(g,o));if(u.length===0){let g=SE(e,n,t);return g.length>0?a({kind:"wrong-provider",declared:e,otherProviders:g}):a({kind:"unknown",declared:e})}let c=new Map;for(let g of u){let _=xn(g),h=c.get(_);h?h.push(g):c.set(_,[g])}let m=Fu[t]??No,p=null,f=null;for(let g of c.values()){let _=Ku(g,m);(f===null||NE(_[0],f[0],m)<0)&&(p=g,f=_)}return a(Co(p,xn(p[0]),m,t==="codex"?"openai":void 0))}function Yu(t,e,n,r){let{state:s,viaAlias:i,pinRoute:o}=CE(t,e,n,r);if(s.kind!=="priced"&&s.kind!=="estimated")return{state:s,offer:null,provenance:null};let a=s.model.offers;if(i&&o!==null){let d=a.find(u=>u.route===o)??a.find(u=>u.route.toLowerCase()===o.toLowerCase());if(d!==void 0&&Es(d))return{state:s,offer:d,provenance:"alias-pin"}}let l=a.find(Es)??null;return{state:s,offer:l,provenance:i&&o!==null?"alias-pin":"route-preference"}}function NE(t,e,n){let r=Ts(t.source)-Ts(e.source);if(r!==0)return r;let s=t.provider!==null&&n.includes(t.provider)?0:1,i=e.provider!==null&&n.includes(e.provider)?0:1;return s!==i?s-i:t.sourceModelId.localeCompare(e.sourceModelId)}function zu(t){return{startedAt:new Date().toISOString(),attempt_key:xE(),provider:t.provider,model_requested:t.modelRequested,cwd:t.cwd,native_session_id:t.sessionId||null}}function Qu(t,e){return e?"cancelled":/\bstall(?:ed|ing)?\b/i.test(t)?"stalled":"error"}var lt=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,OE=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?t:null;async function xo(t,e,n=async()=>({catalog:null,aliases:null,source:"unavailable",generatedAt:null}),r){let s={...t,ended_at:new Date().toISOString(),turn_outcome:e.status,native_session_id:e.sessionId||t.native_session_id||null};try{let i=["claude","codex","muse","dsh"].includes(t.provider)||us.includes(t.provider)&&e.usage?.source==="wire"?e.usage:r&&us.includes(t.provider)?await Tu(t,e.sessionId||String(t.native_session_id??""),String(s.ended_at),r):void 0;if(e.status!=="cancelled"&&(i?.outcome==="cancelled"||i?.outcome==="error")&&(s.turn_outcome=i.outcome),!i||i.source===null)return s.usage_source=null,s.usage_reason=t.provider==="ClaudeMock"?"mock_estimate":s.turn_outcome!=="ok"?"turn_not_completed":["copilot","hermes"].includes(t.provider)?"session_totals_only":"native_record_missing",s.cost_reason="usage_unavailable",s;if(Object.assign(s,{usage_source:i.source,usage_reason:i.reason,tok_input_uncached:lt(i.inputUncached),tok_cache_read:lt(i.cacheRead),tok_cache_write:lt(i.cacheWrite),tok_output:lt(i.output),tok_reasoning:lt(i.reasoning),model_reported:i.modelReported,provider_cost_usd:OE(i.providerCostUsd)}),i.invalidCounters||Ye([i.inputUncached,i.cacheRead,i.cacheWrite,i.output,i.reasoning]))return s.usage_reason="counter_not_exposed",s.cost_reason="usage_unavailable",s;if(i.mixedModels)return s.cost_reason="mixed_models",s.model_reported=null,s;let o=i.modelReported||t.model_requested;if(!o)return s.cost_reason="model_unknown",s;let a,l=await Promise.race([n(),new Promise(f=>{a=setTimeout(()=>f(null),1e3)})]).finally(()=>{a&&clearTimeout(a)});if(!l||!l.catalog)return s.cost_reason="price_data_unavailable",s;let d=Yu(t.provider,o,l.catalog,l.aliases);if(!d.offer)return s.cost_reason=d.state.kind==="unresolved"?"model_unresolved":d.state.kind==="unknown"||d.state.kind==="wrong-provider"?"model_unknown":"model_unpriced",s;let u=l.catalog.records.find(f=>(f.record_id??f.source+":"+f.source_model_id)===d.offer.route),c=d.offer.pricing,m={input:lt(i.inputUncached)??0,output:lt(i.output)??0,cachedInput:lt(i.cacheRead)??0,cacheWrite:lt(i.cacheWrite)??0,...i.cacheWrite5m==null?{}:{cacheWrite5m:i.cacheWrite5m},...i.cacheWrite1h==null?{}:{cacheWrite1h:i.cacheWrite1h}},p=Ao(m,c);return Object.assign(s,{price_record_id:u?.record_id??null,price_snapshot_sha256:l.sha256??null,rate_input_1m:p.inputPer1m,rate_output_1m:p.outputPer1m,rate_cache_read_1m:p.cacheReadPer1m,rate_cache_write_1m:p.cacheWritePer1m}),s.cost_reason=Uu(m,c)===null?"rate_missing":null,s}catch{return{...s,usage_reason:"recorder_failed",cost_reason:"usage_unavailable"}}}function tn(t,e,n){try{let r=Object.entries(n).filter(([s])=>Object.hasOwn(cs,s));if(!r.length)return;t.prepare(`UPDATE team_chat_log SET ${r.map(([s])=>`${s}=?`).join(",")} WHERE id=? AND ended_at IS NULL`).run(...r.map(([,s])=>s??null),e)}catch(r){for(let i of["usage_source","model_reported","tok_input_uncached","tok_cache_read","tok_cache_write","tok_output","tok_reasoning","price_record_id","price_snapshot_sha256","rate_input_1m","rate_output_1m","rate_cache_read_1m","rate_cache_write_1m","provider_cost_usd"])n[i]=null;n.usage_reason="recorder_failed",n.cost_reason="usage_unavailable";let s=r?.code??"";if(/^SQLITE_(?:BUSY|LOCKED)(?:_|$)/.test(s))return;try{t.prepare("UPDATE team_chat_log SET attempt_key=COALESCE(attempt_key,?),provider=COALESCE(provider,?),native_session_id=COALESCE(native_session_id,?),cwd=COALESCE(cwd,?),model_requested=COALESCE(model_requested,?),ended_at=COALESCE(ended_at,?),turn_outcome=COALESCE(turn_outcome,?),usage_reason='recorder_failed',cost_reason='usage_unavailable' WHERE id=? AND ended_at IS NULL").run(n.attempt_key??null,n.provider??null,n.native_session_id??null,n.cwd??null,n.model_requested??null,n.ended_at??null,n.turn_outcome??null,e)}catch{}}}import{randomUUID as Pc}from"node:crypto";import{existsSync as jc,mkdirSync as wv,renameSync as Sv,rmdirSync as bv}from"node:fs";import{hostname as $o}from"node:os";var Zu=`
|
|
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||Qe([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
49
|
CREATE TABLE IF NOT EXISTS price_snapshot (
|
|
50
50
|
sha256 TEXT PRIMARY KEY,
|
|
51
51
|
generated_at TEXT,
|
|
@@ -81,33 +81,33 @@ CREATE TABLE IF NOT EXISTS price_alias (
|
|
|
81
81
|
evidence TEXT,
|
|
82
82
|
catalog_record_id TEXT
|
|
83
83
|
);
|
|
84
|
-
`;import{existsSync as
|
|
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
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
|
|
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
87
|
(message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
88
88
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
|
|
89
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,
|
|
91
|
-
WHERE message_id=?`).run(s.lease_id??null,s.pid??null,e,n);break;case
|
|
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
92
|
SET lifecycle_state='queued', delivery_lease_id=NULL,
|
|
93
93
|
delivery_holder_pid=NULL, last_seq=?
|
|
94
|
-
WHERE message_id=?`).run(e,n);break;case
|
|
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
95
|
(receiver_teamfile, receiver_alias, lease_id, sender_teamfile, sender_alias, holder_pid, holder_host, started_at, last_seq)
|
|
96
96
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
97
97
|
ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
|
|
98
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(
|
|
100
|
-
WHERE receiver_teamfile=? AND receiver_alias=?`).run(s.lease_id??null,
|
|
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
101
|
(receiver_teamfile, receiver_alias, terminal_lock_id, last_seq)
|
|
102
102
|
VALUES (?, ?, ?, ?)
|
|
103
103
|
ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
|
|
104
|
-
terminal_lock_id=excluded.terminal_lock_id, last_seq=excluded.last_seq`).run(
|
|
105
|
-
WHERE receiver_teamfile=? AND receiver_alias=?`).run(e,
|
|
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
106
|
(invocation_id, kind, origin, launch_source, from_identity, target_teamfile, target_alias, root_teamfile,
|
|
107
107
|
cwd, command, request_message_id, request_payload, holder_pid, holder_host, status, started_at, last_seq)
|
|
108
108
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?)
|
|
109
|
-
ON CONFLICT(invocation_id) DO NOTHING`).run(n,s.kind??"chat",s.origin??"unknown",s.launch_source??"",s.from_identity??"",
|
|
110
|
-
WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,e,n);break;case
|
|
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
111
|
CREATE TABLE IF NOT EXISTS session_size (
|
|
112
112
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
113
113
|
team_name TEXT NOT NULL,
|
|
@@ -521,7 +521,7 @@ CREATE TABLE IF NOT EXISTS price_alias (
|
|
|
521
521
|
updated_at TEXT NOT NULL,
|
|
522
522
|
PRIMARY KEY(user_id, device_id, period)
|
|
523
523
|
);
|
|
524
|
-
`),t.pragma("user_version = 36"),n=36),n<37&&n!==0&&(
|
|
524
|
+
`),t.pragma("user_version = 36"),n=36),n<37&&n!==0&&(qe(t,"team_connection")&&t.exec(`
|
|
525
525
|
CREATE TABLE IF NOT EXISTS team_connection_v37 (
|
|
526
526
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
527
527
|
source_teamfile TEXT NOT NULL,
|
|
@@ -646,7 +646,7 @@ CREATE TABLE IF NOT EXISTS price_alias (
|
|
|
646
646
|
ON agent_mailbox(sender_teamfile, sender_alias, created_at);
|
|
647
647
|
CREATE INDEX IF NOT EXISTS idx_agent_mailbox_created
|
|
648
648
|
ON agent_mailbox(created_at);
|
|
649
|
-
`),t.pragma("user_version = 45"),n=45),n<46&&n!==0&&(
|
|
649
|
+
`),t.pragma("user_version = 45"),n=45),n<46&&n!==0&&(qe(t,"team_chat_log")?sc(t):t.exec(`
|
|
650
650
|
CREATE TABLE IF NOT EXISTS team_chat_log (
|
|
651
651
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
652
652
|
root_teamfile TEXT NOT NULL,
|
|
@@ -665,18 +665,18 @@ CREATE TABLE IF NOT EXISTS price_alias (
|
|
|
665
665
|
`),t.exec(`
|
|
666
666
|
CREATE INDEX IF NOT EXISTS idx_team_chat_log_root_time
|
|
667
667
|
ON team_chat_log(root_teamfile, created_at);
|
|
668
|
-
`),t.pragma("user_version = 46"),n=46),n>=46&&
|
|
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
669
|
CREATE INDEX IF NOT EXISTS idx_agent_mailbox_sender_delivery_wait
|
|
670
670
|
ON agent_mailbox(sender_teamfile, sender_alias, delivered_at, waited_at, id);
|
|
671
671
|
CREATE INDEX IF NOT EXISTS idx_agent_mailbox_lane_delivery
|
|
672
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&&(
|
|
673
|
+
`)}t.pragma("user_version = 48"),n=48}if(n<49&&n!==0&&(Nt(t,"tracked_invocation"),t.exec(`
|
|
674
674
|
UPDATE tracked_invocation
|
|
675
675
|
SET notified_by = 'migration-baseline',
|
|
676
676
|
notified_at = COALESCE(ended_at, started_at)
|
|
677
677
|
WHERE status IN ('done', 'error', 'busy', 'cancelled')
|
|
678
678
|
AND notified_by IS NULL;
|
|
679
|
-
`),t.pragma("user_version = 49"),n=49),n<50&&n!==0&&(
|
|
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
680
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_agent_mailbox_response_request_unique
|
|
681
681
|
ON agent_mailbox(request_mailbox_id)
|
|
682
682
|
WHERE message_type = 'response' AND request_mailbox_id IS NOT NULL;
|
|
@@ -692,7 +692,7 @@ CREATE TABLE IF NOT EXISTS price_alias (
|
|
|
692
692
|
BEGIN
|
|
693
693
|
SELECT RAISE(ABORT, 'agent_mailbox response requires request_mailbox_id');
|
|
694
694
|
END;
|
|
695
|
-
`)}t.pragma("user_version = 51"),n=51}if(n<52&&n!==0&&(
|
|
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
696
|
CREATE TABLE IF NOT EXISTS message_event (
|
|
697
697
|
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
698
698
|
event_id TEXT NOT NULL UNIQUE,
|
|
@@ -774,7 +774,7 @@ CREATE TABLE IF NOT EXISTS price_alias (
|
|
|
774
774
|
ON invocation_state(target_teamfile, target_alias, status, launch_source);
|
|
775
775
|
CREATE INDEX IF NOT EXISTS idx_invocation_state_from_time
|
|
776
776
|
ON invocation_state(from_identity, started_at DESC);
|
|
777
|
-
`),t.pragma("user_version = 53"),n=53),n<54&&n!==0&&(
|
|
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
778
|
CREATE TABLE tracked_invocation_v56 (
|
|
779
779
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
780
780
|
kind TEXT NOT NULL CHECK(kind IN ('chat', 'exec')),
|
|
@@ -828,13 +828,13 @@ CREATE TABLE IF NOT EXISTS price_alias (
|
|
|
828
828
|
ON tracked_invocation(scope_teamfile, status, started_at);
|
|
829
829
|
CREATE INDEX IF NOT EXISTS idx_tracked_invocation_status_ended
|
|
830
830
|
ON tracked_invocation(status, ended_at);
|
|
831
|
-
`),t.pragma("user_version = 56"),n=56),n<57&&n!==0&&(
|
|
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
832
|
CREATE TABLE IF NOT EXISTS state_ledger_identity (
|
|
833
833
|
singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
|
|
834
834
|
instance_id TEXT NOT NULL,
|
|
835
835
|
created_at TEXT NOT NULL
|
|
836
836
|
);
|
|
837
|
-
`),t.pragma("user_version = 59"),n=59),n<60&&n!==0&&(
|
|
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
838
|
CREATE TABLE IF NOT EXISTS schema_meta (
|
|
839
839
|
key TEXT PRIMARY KEY,
|
|
840
840
|
value TEXT NOT NULL
|
|
@@ -917,9 +917,9 @@ CREATE TABLE IF NOT EXISTS prompt_task_reassignments(
|
|
|
917
917
|
);
|
|
918
918
|
|
|
919
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(
|
|
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
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}
|
|
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
923
|
DROP TABLE IF EXISTS team_chat_log_v46;
|
|
924
924
|
CREATE TABLE team_chat_log_v46 (
|
|
925
925
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
@@ -948,11 +948,11 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
948
948
|
FROM team_chat_log;
|
|
949
949
|
DROP TABLE team_chat_log;
|
|
950
950
|
ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
|
|
951
|
-
`)}finally{t.pragma("foreign_keys = ON")}}function
|
|
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
952
|
`),process.argv.includes("--json")&&process.stderr.write(`${JSON.stringify({schema_skew:{db_version:e,build_version:n,mode:"best_effort"}})}
|
|
953
|
-
`))}var
|
|
954
|
-
`)}finally{t.close()}}catch(t){if(!(t instanceof
|
|
955
|
-
`),process.exitCode=1}function
|
|
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
956
|
INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
|
|
957
957
|
VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
|
|
958
958
|
ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
|
|
@@ -1132,8 +1132,8 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1132
1132
|
WHERE s.receiver_teamfile = agent_inflight.receiver_teamfile
|
|
1133
1133
|
AND s.receiver_alias = agent_inflight.receiver_alias
|
|
1134
1134
|
AND s.lease_id = ?)
|
|
1135
|
-
`)}}var
|
|
1136
|
-
...[truncated]`;function
|
|
1135
|
+
`)}}var mc=`
|
|
1136
|
+
...[truncated]`;function pc(t){return{insertTrackedInvocation:t.prepare(`
|
|
1137
1137
|
INSERT INTO tracked_invocation (
|
|
1138
1138
|
kind, origin, scope_teamfile, from_identity, target_teamfile, target_alias,
|
|
1139
1139
|
root_teamfile, cwd, command, status, started_at, holder_pid, holder_host,
|
|
@@ -1213,36 +1213,36 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1213
1213
|
AND holder_host IS ?
|
|
1214
1214
|
AND started_at = ?
|
|
1215
1215
|
AND last_heartbeat_at IS ?
|
|
1216
|
-
`)}}function
|
|
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
1217
|
FROM tracked_invocation
|
|
1218
1218
|
WHERE target_teamfile = ?
|
|
1219
1219
|
AND target_alias = ?
|
|
1220
1220
|
AND status = 'running'
|
|
1221
1221
|
AND launch_source = 'terminal'
|
|
1222
1222
|
ORDER BY started_at DESC, id DESC
|
|
1223
|
-
LIMIT 1`,e,n)[0]??null}function
|
|
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
1224
|
holder_pid, holder_host, started_at, terminal_lock_id,
|
|
1225
1225
|
terminal_invocation_id, currently_handling_message_id,
|
|
1226
1226
|
currently_handling_since, last_seq
|
|
1227
1227
|
FROM agent_state
|
|
1228
|
-
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e,n)??null}function
|
|
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
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>
|
|
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
1231
|
(receiver_teamfile, receiver_alias, currently_handling_message_id,
|
|
1232
1232
|
currently_handling_since, last_seq)
|
|
1233
1233
|
VALUES (?, ?, ?, ?, 0)
|
|
1234
1234
|
ON CONFLICT(receiver_teamfile, receiver_alias) DO UPDATE SET
|
|
1235
1235
|
currently_handling_message_id = excluded.currently_handling_message_id,
|
|
1236
|
-
currently_handling_since = excluded.currently_handling_since`).run(e,n,r,s)}function
|
|
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
1237
|
SET currently_handling_message_id = NULL,
|
|
1238
1238
|
currently_handling_since = NULL
|
|
1239
1239
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1240
|
-
AND currently_handling_message_id = ?`).run(e,n,r).changes===1}function
|
|
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
1241
|
SET lease_id = NULL, sender_teamfile = NULL, sender_alias = NULL,
|
|
1242
1242
|
holder_pid = NULL, holder_host = NULL, started_at = NULL,
|
|
1243
1243
|
last_heartbeat_at = NULL, last_seq = ?
|
|
1244
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);
|
|
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
1246
|
(receiver_teamfile, receiver_alias, lease_id, sender_teamfile,
|
|
1247
1247
|
sender_alias, holder_pid, holder_host, started_at,
|
|
1248
1248
|
last_heartbeat_at, last_seq)
|
|
@@ -1251,18 +1251,18 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1251
1251
|
holder_pid = ?, holder_host = ?, started_at = ?,
|
|
1252
1252
|
last_heartbeat_at = ?, last_seq = ?
|
|
1253
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);
|
|
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
1255
|
SET last_heartbeat_at = ?
|
|
1256
1256
|
WHERE receiver_teamfile = ? AND receiver_alias = ?
|
|
1257
1257
|
AND lease_id = ?
|
|
1258
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
|
|
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
1260
|
(receiver_teamfile, receiver_alias, terminal_lock_id, last_seq)
|
|
1261
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
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);
|
|
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
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);
|
|
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
1266
|
(receiver_teamfile, receiver_alias, terminal_invocation_id,
|
|
1267
1267
|
terminal_invocation_pid, terminal_invocation_host,
|
|
1268
1268
|
terminal_invocation_heartbeat_at, last_seq)
|
|
@@ -1271,31 +1271,31 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1271
1271
|
terminal_invocation_host = ?,
|
|
1272
1272
|
terminal_invocation_heartbeat_at = ?, last_seq = ?
|
|
1273
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);
|
|
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
1275
|
SET terminal_invocation_heartbeat_at = ?
|
|
1276
|
-
WHERE terminal_invocation_id = ?`).run(n,e).changes===1}function
|
|
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
1277
|
terminal_invocation_id, last_seq
|
|
1278
1278
|
FROM agent_state WHERE terminal_invocation_id = ?`).get(n);if(r===void 0)return;let s=t.prepare(`UPDATE agent_state
|
|
1279
1279
|
SET terminal_invocation_id = NULL, terminal_invocation_pid = NULL,
|
|
1280
1280
|
terminal_invocation_host = NULL,
|
|
1281
1281
|
terminal_invocation_heartbeat_at = NULL, last_seq = ?
|
|
1282
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);
|
|
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
1284
|
(invocation_id, kind, origin, launch_source, from_identity, target_teamfile, target_alias,
|
|
1285
1285
|
root_teamfile, cwd, command, request_message_id, request_payload, holder_pid, holder_host,
|
|
1286
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),
|
|
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
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}`);
|
|
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
1290
|
`:`
|
|
1291
|
-
`)),i}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${t}: unusable (${n}), and recovery into a fresh database also failed (${s}). Check that the containing directory is writable, or move the file aside manually and retry.`)}}function jo(t,e){let n;try{return n=Ss({dbPath:t,allowSchemaSkew:e}),{dal:new xs(n)}}catch(r){if(r instanceof rn)throw r;let s;if(n!==void 0)try{s=n.pragma("user_version",{simple:!0})}catch{}try{n?.close()}catch{}return{cause:r,dbVersion:s}}}var Iv=3,$c=".recovery.lock",Av=20,Cv=50;function Nv(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function xv(t){if(t===":memory:")return!0;try{return wv(`${t}${$c}`),!0}catch{return!1}}function Ov(t){if(t!==":memory:")try{bv(`${t}${$c}`)}catch{}}function Ct(t){let e=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1";if(t.recover===!1){let s=jo(t.path,e);if(s.dal)return s.dal;throw s.cause}let n={};for(let s=0;s<Iv;s+=1)if(n=jo(t.path,e),n.dal!==void 0)return n.dal;let r=n.cause?.code;if(typeof r=="string"&&/^SQLITE_(BUSY|LOCKED)/.test(r))throw new Error(t.path+": database is busy; retry this command after the other writer finishes.",{cause:n.cause});if(n.dbVersion!==void 0&&n.dbVersion>kt){let s=n.cause instanceof Error?n.cause.message:String(n.cause);throw new rn(t.path,n.dbVersion,kt,s)}for(let s=0;s<Av;s+=1){if(xv(t.path))try{return Mc(t.path,n.cause)}finally{Ov(t.path)}Nv(Cv);let i=jo(t.path,e);if(i.dal!==void 0)return i.dal}return Mc(t.path,n.cause)}var xs=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=Uv(e),this.claimTxn=e.transaction((n,r,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(n,r,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=e.transaction((n,r,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let d=i(l);if(d.concurrency_key!==null&&(l.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,s,l.id)?.count??0)>=Math.max(1,d.concurrent_limit)))continue;if(this.stmts.claimJob.run(n,r,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=e.transaction((n,r,s,i,o)=>{let a=this.getJob(n);if(a===null)return{claimed:!1,reason:"not_found",job_id:n};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=a.status==="queued"&&a.available_at<=i,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!d&&!u)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=o(a);if(c.concurrency_key!==null&&(a.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,i,a.id)?.count??0)>=Math.max(1,c.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(r,s,i,a.id,i,i,i).changes!==1){let f=this.getJob(a.id);return{claimed:!1,reason:f?.locked_until!==null&&f?.locked_until!==void 0&&f.locked_until>=i?"locked":"not_claimable",job_id:n,status:f?.status??a.status,locked_by:f?.locked_by??a.locked_by,locked_until:f?.locked_until??a.locked_until}}let p=this.getJob(a.id);return p===null?{claimed:!1,reason:"not_found",job_id:n}:{claimed:!0,job:p}}),this.resumeRunTxn=e.transaction((n,r,s)=>Fv("state_not_found")),this.resumeInteractiveTxn=e.transaction((n,r,s,i)=>{let o=this.getInteractiveSessionByStepId(n);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,r,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(n),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==Dc)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let u=JSON.parse(i.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(o=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(c=>typeof c=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(r!==Oc&&!a.includes(r))return{resumed:!1,reason:Lc};let d={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(d=u)}catch{d={}}return d[o]=r,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(d),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,n),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(n,r={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(n.receiver_teamfile,n.receiver_alias);if(r.nativeHolder!==void 0&&s!==null&&(s.native_provider!==null&&s.native_provider!==void 0||s.native_session_id!==null&&s.native_session_id!==void 0||s.native_endpoint!==null&&s.native_endpoint!==void 0))return this.db.exec("COMMIT"),{acquired:!1,current:s};let i=r.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...n,holder_pid:process.pid,stale_before:r.stale_before??null,force:r.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:r.reclaim_reason??(r.force===!0?"force":r.reclaim_observed!==void 0?"dead-pid":"stale"),d=Ec(this.db,o,s,l,r.stale_before??null,r.force===!0);this.stmts.clearNativeHolderMetadata.run(n.receiver_teamfile,n.receiver_alias);let u=r.nativeHolder;u!==void 0&&this.stmts.setNativeHolderMetadata.run({receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,provider:u.provider,session_id:u.sessionId,endpoint:u.endpoint,phase:u.phase,generation:d,boot_id:u.processIdentity?.bootId??null,start_time:u.processIdentity?.startTime??null,config_json:u.configJson}),a={acquired:!0,current:o,lease_id:d}}else a={acquired:!1,current:this.getAgentInflight(n.receiver_teamfile,n.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...n){let r=e.trim().toLowerCase();if(!r.startsWith("select")&&!r.startsWith("with")&&!r.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(e).all(...n)}insertWorkflow(e){Uc(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,j()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,e.definition,e.author??null,j());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,e.definition),i}upsertWorkflow(e){Uc(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(e.name);if(n===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,e.definition,e.author??null,j());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??n.definition_schema_version,s,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,e.definition),this.getWorkflow(n.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,j())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,n){return(n===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,n))??null}findWorkflowByName(e,n){return this.getWorkflowByName(e,n)}insertWorkflowVersion(e,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,n,r??null,j());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==e)return null;let s=1;try{let i=JSON.parse(r.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(n,r.definition,s,e),this.syncWorkflowTriggers(e,r.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,j()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,n){return this.stmts.setTriggerCursor.run(n,j(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,n){return this.stmts.setTriggerFailure.run(j(),n,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,n){let r;try{r=JSON.parse(n)}catch{return}if(r===null||typeof r!="object"||Array.isArray(r))return;let s=r.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let n=this.stmts.insertTeam.run(e.name,j());return this.stmts.getTeam.get(n.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let n=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,j());return this.stmts.getTeamMember.get(n.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,n){return this.stmts.findTeamMemberByAlias.get(e,n)??null}updateTeamMemberSession(e,n){return this.stmts.updateTeamMemberSession.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,n,r){return this.stmts.setMemberState.run(n,r??null,j(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,n){return this.stmts.setMemberPromptSnapshot.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,n){return this.stmts.setMemberProviderResolved.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,n){return this.stmts.setMemberRolePrompt.run(n,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,n){let r=this.stmts.getTeamMember.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"role_prompt"),i=Object.prototype.hasOwnProperty.call(n,"model"),o=Object.prototype.hasOwnProperty.call(n,"provider");return this.stmts.updateTeamMemberMeta.run(s?n.role_prompt??null:r.role_prompt,i?n.model??null:r.model,o?n.provider??r.provider:r.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let n=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,j());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(e){let n=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",j());return this.stmts.getProject.get(n.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,n){return this.stmts.setProjectIntakeConfig.run(n,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,n){let r=this.stmts.getProject.get(e);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"local_path"),i=Object.prototype.hasOwnProperty.call(n,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(n,"default_branch"),a=Object.prototype.hasOwnProperty.call(n,"intake_config");return this.stmts.updateProjectSettings.run(s?n.local_path:r.local_path,i?n.durable_memory_mode:r.durable_memory_mode,o?n.default_branch??null:r.default_branch,a?n.intake_config??null:r.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let n=JSON.parse(e.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let n=e.condition??null,r=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,n,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,j());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,n={}){return n.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let n=j(),r=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,n={}){return this.stmts.listIssuesForProject.all(e).filter(r=>!(n.status!==void 0&&!n.status.includes(r.status)||n.severity!==void 0&&!n.severity.includes(r.severity)||n.ai_test_path!==void 0&&r.ai_test_path!==n.ai_test_path))}claimNextIssue(e,n){return this.stmts.claimNextIssue.get(n,j(),e)??null}claimIssue(e,n){return this.stmts.claimIssue.get(n,j(),e)??null}closeIssue(e,n,r){let s=j(),i=this.stmts.closeIssue.get(n,r??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,n){let r=this.stmts.reopenIssue.get(n,j(),e);if(r===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return r}updateIssue(e,n){let r=this.getIssue(e);if(r===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(n,"labels"),i=Object.prototype.hasOwnProperty.call(n,"ai_test_path"),o=this.stmts.updateIssue.get(n.title??r.title,n.body??r.body,n.severity??r.severity,s?n.labels??null:r.labels,i?n.ai_test_path??null:r.ai_test_path,j(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,n){let r=this.stmts.getWebuiSession.get(e);if(r!==void 0)return r;let s=j();return this.stmts.insertWebuiSession.run(e,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,j(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,n){if(this.stmts.setWebuiSessionChatbot.run(n,j(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,n){let r=Pc(),s=j();return this.stmts.insertChatbotSession.run(r,e,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,n,r,s){let i=j(),o=this.stmts.insertChatbotMessage.run(e,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,n){this.stmts.upsertConfig.run(e,n,j())}getConfigAll(){let e=this.stmts.listConfig.all(),n={};for(let r of e)n[r.key]=r.value;return n}enqueueJob(e){let n=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??j(),e.dedupe_key??null,e.concurrency_key??null,j());if(n.changes===1)return this.stmts.getJob.get(n.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let n=j(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,r,n)}claimNextJobWithConcurrency(e){let n=j(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,r,n,e.evaluator)}claimJobByIdWithConcurrency(e){let n=j(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,r,n,e.evaluator)}releaseJob(e,n,r){let s=n==="queued"||n==="running"?null:j();return this.stmts.releaseJob.run(n,r??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,n){return this.stmts.findJobByDedupe.get(e,n)??null}insertRun(e){let n=this.getWorkflow(e.workflow_id);if(n===null)throw new Error(`workflow not found: ${e.workflow_id}`);let r=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,n.active_version_id,e.parent_run_id??null,j()),s=this.stmts.getRun.get(r.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,n){return this.stmts.setJobRun.run(n,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,j()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,n){return this.stmts.setPromptDispatchCompleted.run(n??j(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let n=e.id??"default";this.stmts.ensureWorkspace.run(n,e.name??"Default workspace",e.idleThresholdMs??6e5,j());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let n=j(),r=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,n,n),s=Number(r.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(e){let n=this.getWebProject(e.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??n.name,e.config_json===void 0?n.config_json:e.config_json,j(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(j(),e).changes===1}loadMailboxCursor(e,n){return this.stmts.loadMailboxCursor.get(e,n)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,n,r){return this.stmts.loadUsage.get(e,n,r)??null}sumUsageForPeriod(e,n){let r=this.stmts.sumUsageForPeriod.get(e,n);return{put:r?.put??0,get:r?.get??0,list:r?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.message_type??null,e.created_at),r=Number(n.lastInsertRowid);return e.usage&&tn(this.db,r,e.usage),Mo(this.db,r,e),e.usage&&tn(this.db,r,e.usage),Cs(this.db,r,e),r})()}beginTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.message_type??null,e.created_at),r=Number(n.lastInsertRowid);return e.usage&&tn(this.db,r,e.usage),Mo(this.db,r,e),r})()}finishTeamChatLog(e,n){this.db.transaction(()=>{if(this.db.prepare("SELECT ended_at FROM team_chat_log WHERE id=?").get(e)?.ended_at!=null)return;if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);n.usage&&tn(this.db,e,n.usage),Cs(this.db,e,n)})()}insertDirectTurn(e,n,r){return this.db.transaction(()=>{let s=this.db.prepare("SELECT id FROM team_chat_log WHERE attempt_key = ?").get(e.attempt_key);if(s!==void 0)return s.id;let i=this.stmts.insertTeamChatLog.run(r?.teamfile??"(direct)",null,null,r?.teamfile??"(direct)",r?.alias??e.provider,"","",n,"running",null,0,null,e.startedAt),o=Number(i.lastInsertRowid);return this.db.prepare("UPDATE team_chat_log SET accounting_only=1 WHERE id=?").run(o),tn(this.db,o,e),o})()}finishDirectTurn(e,n){this.db.transaction(()=>{if(this.db.prepare("SELECT ended_at FROM team_chat_log WHERE id = ?").get(e)?.ended_at!=null)return;let s=n.turn_outcome==="ok"?"ok":"error";if(this.stmts.updateTeamChatLogResponse.run("",s,null,0,e).changes!==1)throw new Error(`direct turn row disappeared during finish: ${e}`);tn(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{Do(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>Po(this.db,e,n,r))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,n=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let n=e.started_at??j(),r=e.holder_host??$o(),s=e.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,qe(e.command),n,e.holder_pid??null,r,s,qe(e.meta),e.launch_source??e.kind,e.request_payload??null,e.parent_invocation_id??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return Ic(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,n,r={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,n];r.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(r.sinceMs).toISOString())),r.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(r.untilMs).toISOString()));let o=Math.max(1,Math.trunc(r.limit??200));return this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${s.join(" AND ")} ORDER BY started_at DESC LIMIT ?`).all(...i,o)}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}listRecentlyFinishedTrackedInvocations(e){return this.stmts.listRecentlyFinishedTrackedInvocations.all(e)}listFinishedTrackedInvocationChildren(e,n){if(e.length===0)return[];let r=e.map(()=>"?").join(", ");return this.db.prepare(`
|
|
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 Ze(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
1292
|
SELECT * FROM tracked_invocation
|
|
1293
1293
|
WHERE parent_invocation_id IN (${r})
|
|
1294
1294
|
AND ended_at IS NOT NULL
|
|
1295
1295
|
AND ended_at >= ?
|
|
1296
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,
|
|
1298
|
-
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&Er(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Er(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(_r,yr(e,n),hr);return r===void 0?null:pc(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&Uo(this.db,r,!0),this.stmts.upsertRuntimeState.run(_r,yr(e.teamfile,e.alias),hr,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&wc(this.db,e)})()}heartbeatTerminalLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,n);if(i===null||i.lock_id!==r)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(_r,yr(e,n),hr,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(_r,yr(e,n),hr);return i.changes===1&&Uo(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,n,r){let s=this.stmts.getRuntimeState.get(e,n,r);return s===void 0?null:Pv(s.data)}tryAcquireRuntimeProcessLock(e,n,r,s,i=j()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,n,r);if(o!==null&&!Mv(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Pc(),holder_pid:process.pid,holder_host:$o(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,n,r,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,n){return this.stmts.setRunCurrentState.run(n,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,n,r){return this.stmts.setRunPausedState.run(n,r,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,n){return this.stmts.setRunPendingEscalationDecision.run(n,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,n){return this.stmts.setRunTerminalState.run(n,j(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,n){return this.resumeRunTxn(e,n,j())}insertStep(e){let n=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,j());return this.stmts.getStep.get(n.lastInsertRowid)}finishStep(e,n,r){return this.stmts.finishStep.run(n??null,r??null,j(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let n=this.stmts.listLatestStepOutcomesByState.all(e),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(e){let n=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??j(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(n.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let n=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,j());return this.stmts.getStepArtifact.get(n.lastInsertRowid)}insertExternalObject(e){let r=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,j()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:r}}insertExternalSignal(e){let n=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,j()),r=n.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:r}}raiseAttention(e){let n=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,j());return this.stmts.getAttention.get(n.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(j(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let n=j();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,n,n),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,n){return this.stmts.getDurableMemoryByName.get(e,n)??null}deleteDurableMemory(e,n){return this.stmts.deleteDurableMemory.run(e,n).changes>0}listDurableMemory(e,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(e,n):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(e).filter(s=>n.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(e){let n=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??j());return this.stmts.getSessionSize.get(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,n,r=20){return this.stmts.sessionSizeHistory.all(e,n,r)}insertSessionEvent(e){let n=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(n.lastInsertRowid)}listSessionEvents(e,n){return n!==void 0?this.stmts.listSessionEventsSince.all(e,n):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,n=1e3){return this.stmts.listAllEventsSince.all(e,n)}latestAgentCall(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(n===void 0)return null;try{let r=JSON.parse(n.payload);return typeof r.alias!="string"||typeof r.provider!="string"?null:{alias:r.alias,provider:r.provider,...typeof r.model=="string"?{model:r.model}:{}}}catch{return null}}agentCallTokenTotals(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),r=0,s=0,i=0;for(let o of n)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(r+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:r,totalOutputTokens:s,agentCallCount:i}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let n=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(n.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,n,r){return this.stmts.findUnackedDrift.get(e,n??null,r)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let n=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,n,n),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,n){return this.stmts.getInteractiveSessionByRunAndState.get(e,n)??null}setInteractiveAgentOutput(e,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),e)}resumeInteractive(e,n,r){return this.resumeInteractiveTxn(e,n,r,j())}resumeEscalation(e,n){return this.resumeEscalationTxn(e,n,j())}};function Uc(t,e,n){let r=Fc(e);if(r.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return r;let d=n(l);if(d===null)throw new Error(`unknown workflow reference: ${l}`);return Fc(d.definition)},a=l=>{let d=i.indexOf(l);if(d>=0)throw new Error(`cycle detected: ${[...i.slice(d),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let u of o(l))a(u)}finally{i.pop()}s.add(l)}};a(t)}function Fc(t){let e=Lv(t),n=e===null?null:Dv(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))Os(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function Lv(t){try{let e=JSON.parse(t);return Os(e)?e:null}catch{return null}}function Dv(t,e){let n=t[e];return Os(n)?n:null}function Os(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Pv(t){try{let e=JSON.parse(t);return!Os(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function Mv(t,e){return t===null?!0:t.holder_host===$o()?!je(t.holder_pid):t.last_heartbeat<e}function Uv(t){return{getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
|
|
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
1299
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
1300
1300
|
VALUES (?, ?, ?, ?, ?)
|
|
1301
1301
|
ON CONFLICT(scope, key, kind) DO UPDATE SET
|
|
@@ -1682,7 +1682,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1682
1682
|
message, response, origin, status, error_detail, truncated, message_type, created_at
|
|
1683
1683
|
)
|
|
1684
1684
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1685
|
-
`),listTeamChatLog:t.prepare("SELECT * FROM team_chat_log WHERE root_teamfile = ? AND "+
|
|
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
1686
|
INSERT INTO team_chat_log_cursor (cursor_key, last_pushed_id, updated_at)
|
|
1687
1687
|
VALUES (?, ?, ?)
|
|
1688
1688
|
ON CONFLICT(cursor_key) DO UPDATE SET
|
|
@@ -1695,156 +1695,157 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1695
1695
|
error_detail = ?,
|
|
1696
1696
|
truncated = ?
|
|
1697
1697
|
WHERE id = ?
|
|
1698
|
-
`),getTeamChatLogById:t.prepare("SELECT * FROM team_chat_log WHERE id = ? AND "+
|
|
1698
|
+
`),getTeamChatLogById:t.prepare("SELECT * FROM team_chat_log WHERE id = ? AND "+rr),terminalizeTeamChatLogIfRunning:t.prepare(`
|
|
1699
1699
|
UPDATE team_chat_log
|
|
1700
1700
|
SET status = ?,
|
|
1701
1701
|
error_detail = ?,
|
|
1702
1702
|
response = NULL
|
|
1703
1703
|
WHERE id = ?
|
|
1704
1704
|
AND status = 'running'
|
|
1705
|
-
`),...mc(t),...uc(t)}}function Fv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}import{homedir as jv}from"node:os";import{join as Wc}from"node:path";var $v=".lmctl",Wv="state.db";function Hv(t=process.env){let e=t.LMCTL_HOME;return e!==void 0&&e.length>0?e:Wc(t.HOME||jv(),$v)}function Hc(t=process.env){return Wc(Hv(t),Wv)}function Pn(t,e=process.env){return t!==void 0&&t.length>0?t:e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0?e.LMCTL_DB:Hc(e)}function Bc(t,e=process.env){return e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0&&e.LMCTL_DB!==Hc(e)?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}import{isAbsolute as Bv,resolve as Xc,join as qc}from"node:path";function fe(t){try{if(t instanceof Error){let e=t.message;if(typeof e=="string")return e}return String(t)}catch{return"Unprintable error"}}function Ls(t){return{...t,status:"ok",error:null}}function ee(t,e,n){return{...n,status:"error",code:t,error:e}}var Wo=new WeakMap;function Jc(t,e){let n=Wo.get(t);if(!n||t.closed)throw Error("Context is closed");return n.resources.add(e),()=>n.resources.delete(e)}function vr(t){let e=Wo.get(t);if(!e)throw Error("Unknown context");return e.dal()}var Xv=new WeakMap;var Gc=new WeakSet;function Vc(t){return t!==null&&typeof t=="object"&&Gc.has(t)}function Kc(t){try{if(!t||typeof t!="object"||Array.isArray(t))return ee("invalid_argument","Context needs an explicit options map");let e={...t},n=["pid","env","cwd","dbPath","dal","onProgress","onWarning","clock","interactive"];if(Object.keys(e).some(g=>!n.includes(g)))return ee("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!Bv(e.cwd))return ee("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...e.env});if(Object.values(r).some(g=>g!==void 0&&typeof g!="string"))return ee("invalid_argument","Environment values must be strings or undefined");for(let g of["onProgress","onWarning","clock"])if(e[g]!==void 0&&typeof e[g]!="function")return ee("invalid_argument",g+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return ee("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return ee("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return ee("invalid_argument","pid must be a positive integer");let s=Xc(e.cwd),i=r.LMCTL_HOME||(r.HOME?qc(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(i?qc(i,"state.db"):void 0)))return ee("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,d,u,c=new AbortController,m=new Set,p=g=>{if(l){try{l.close()}catch(_){g.push(fe(_))}l=void 0}},f=Object.freeze({status:"ok",error:null,pid:e.pid,signal:c.signal,env:r,cwd:s,dbPath:Xc(s,Pn(e.dbPath,r)),dal:e.dal,interactive:e.interactive??r.LMCTL_NON_INTERACTIVE!=="1",onProgress:e.onProgress??(()=>{}),onWarning:e.onWarning??(()=>{}),clock:e.clock??Date.now,get closed(){return a},close(){if(d)return d;let g;return d=new Promise(_=>{g=_}),a=!0,c.abort(),(async()=>{let _=[],h=0;for(let E of[...m])try{await E.close(),h++,m.delete(E)}catch(y){_.push(fe(y))}_.length||p(_),g({released:h,errors:_})})(),d},finalizeSync(g){if(u)return u;a=!0;let _=[],h={released:0,errors:_};u=h,d??=Promise.resolve(h);for(let E of[...m])try{E.finalizeSync(g),h.released++,m.delete(E)}catch(y){_.push(fe(y))}return c.abort(g),_.length||p(_),h}});return Wo.set(f,{resources:m,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=Ct({path:f.dbPath})}}),Gc.add(f),Xv.set(f,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),f}catch(e){return ee("invalid_argument","Invalid context: "+fe(e))}}import{readdirSync as MA}from"node:fs";import{join as c_,resolve as UA}from"node:path";import{randomUUID as FA}from"node:crypto";import{performance as u_}from"node:perf_hooks";var on="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model.";function wr(t){return t!=="gemini"}function Ds(t){if(!wr(t))throw new Error(on)}var Mn=class extends Error{};async function ut(t,e,n,r,s){if(t.provider!==e)throw new Error(`bundle session provider mismatch: session serves "${t.provider}", turn targets "${e}"`);if(t.sessionId!==n)throw new Mn(`session identity mismatch: expected "${n}", got "${t.sessionId}"`);let i=await t.sendTurn(r,s);if(i.sessionId!==n)throw Object.assign(new Mn(`session identity mismatch: expected "${n}", got "${i.sessionId}"`),{usage:i.usage,sessionId:i.sessionId});return{...i,...i.text===""&&i.sawActivity===!1?{status:"empty"}:{}}}async function Ho(t,e){Ds(t.name);let n=e.requireResume??!0;if(n&&!e.sessionId.trim())throw new Error("conversation requires an existing session ID");let r=e.userConfig?.tools[t.name]?.agent!==void 0,s=e.execution!=="per-turn"&&t.openSession!==void 0&&!r;if(e.execution==="persistent"&&!s)throw new Error(`provider "${t.name}" does not support persistent sessions with this configuration`);let i=s?await t.openSession(e):void 0,o=!n&&e.sessionId==="";if(i&&(i.provider!==t.name||typeof i.sessionId!="string"||!i.sessionId.trim()||!o&&i.sessionId!==e.sessionId))throw await i.close(),new Error(`session identity mismatch opening ${t.name}: expected "${e.sessionId}", got "${i.sessionId}" (${i.provider})`);let a=i?.sessionId??e.sessionId,l=0,d=!1,u,c;return{provider:t.name,sessionId:a,execution:s?"persistent":"per-turn",transport:r?"custom":t.protocol?.transport??"unknown",cancellation:r?"unknown":s?t.protocol?.persistentCancellation??"unknown":t.protocol?.perTurnCancellation??"unknown",get completedTurns(){return l},async sendTurn(m,p={}){if(d)throw new Error("conversation is closed");if(u)throw new Error("conversation already has an active turn");if(p.signal?.aborted)throw new Error("Aborted");let f=new AbortController;u=f;let g=()=>f.abort();p.signal?.addEventListener("abort",g,{once:!0});try{let _=i?await ut(i,t.name,a,m,{...p,signal:f.signal}):await t.sendTurn(m,{...e,...p,signal:f.signal,requireResume:n,timeoutMs:e.timeoutMs??0});if(f.signal.aborted)throw Object.assign(new Error("Aborted"),{usage:_.usage,sessionId:_.sessionId});if(n&&_.sessionId!==e.sessionId)throw d=!0,Object.assign(new Mn(`session identity mismatch: expected "${e.sessionId}", got "${_.sessionId}"`),{usage:_.usage,sessionId:_.sessionId});return _.status!=="empty"&&_.status!=="stalled"&&l++,_}catch(_){throw f.signal.aborted&&i&&t.protocol?.persistentCancellation==="session"&&(d=!0),_ instanceof Mn&&(d=!0,await i?.close()),_}finally{p.signal?.removeEventListener("abort",g),u=void 0}},close(){return c||(d=!0,u?.abort(),c=i?i.close():Promise.resolve()),c}}}import{platform as Yc}from"node:os";import{realpathSync as qv}from"node:fs";import{resolve as Jv}from"node:path";function Bo(t){let e=Jv(t);try{return qv(e)}catch{return e}}var Ps=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(e?.workspace){let o=Bo(e.workspace);i=i.filter(a=>Bo(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=Yc()==="darwin"||Yc()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}};function Nt(t){let e=new Ps;for(let n of t)e.registerAdapter(n);return e}import{join as ra}from"node:path";import{mkdir as oS}from"node:fs/promises";var ke=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,Gv=(t,e)=>t===null||e===null?null:ke(t+e),Xo=(t,e)=>JSON.stringify([t,e]),qo=class{finished=new Set;seen=new Set;models=new Map;reportModel(e,n){typeof n=="string"&&n&&n!=="<synthetic>"&&this.models.set(e,n)}remember(e,n){typeof n=="string"&&n&&this.finished.add(Xo(e,n))}turn(e,n=""){return new Jo(this,e,n)}};function Go(){return new qo}var Jo=class{constructor(e,n,r){this.session=e;this.thread=n;this.id=r}value;ended=!1;reported=new Set;bind(e){return typeof e!="string"||!e||this.ended||this.session.finished.has(Xo(this.thread,e))||this.id&&this.id!==e?!1:(this.id=e,!0)}event(e){let n=e.method,r=e.params,s=r?.turn,i=r?.turnId??s?.id,o=typeof r?.threadId=="string"?r.threadId:this.thread;if(this.thread&&o!==this.thread||(this.thread||(this.thread=o),typeof i=="string"&&this.session.finished.has(Xo(o,i))))return!1;if(n==="turn/started")return this.bind(i);if(this.id&&i&&i!==this.id)return!1;if(n==="turn/completed")return this.id?!this.ended:this.bind(i);if(n!=="thread/tokenUsage/updated")return!0;if(this.ended||!this.id||r?.threadId!==this.thread||r?.turnId!==this.id)return!1;let a=r.tokenUsage;if(!a?.last||typeof a.last!="object"||Array.isArray(a.last)||[a.last.inputTokens,a.last.cachedInputTokens,a.last.outputTokens].every(v=>v==null))return!0;let l=v=>["inputTokens","cachedInputTokens","cacheWriteInputTokens","outputTokens","reasoningOutputTokens","totalTokens"].map(b=>v[b]??null),d=a.total&&["inputTokens","cachedInputTokens","outputTokens"].every(v=>ke(a.total[v])!==null)?l(a.total):null,u=typeof e.id=="string"&&e.id.length>0||typeof e.id=="number"&&Number.isSafeInteger(e.id)?e.id:null,c=ke(e.emittedAtMs)??u,m=ke(e.ordinal)??ke(r.ordinal),p=JSON.stringify([this.thread,this.id,d,l(a.last),c,u,m]),f=c!==null||m!==null;if(f&&this.session.seen.has(p))return!1;f&&this.session.seen.add(p);let g=a.last,_=ke(g.inputTokens),h=ke(g.cachedInputTokens),y={source:"wire",inputUncached:_===null||h===null||h>_?null:_-h,cacheRead:h,cacheWrite:ke(g.cacheWriteInputTokens??0),output:ke(g.outputTokens),reasoning:ke(g.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:Ye([g.inputTokens,g.cachedInputTokens,g.cacheWriteInputTokens,g.outputTokens,g.reasoningOutputTokens])||_!==null&&h!==null&&h>_};[y.inputUncached,y.cacheRead,y.cacheWrite,y.output].includes(null)&&(y.reason="counter_not_exposed");let T=r.model??g.model;if(typeof T=="string"&&T&&T!=="<synthetic>"&&this.reported.add(T),!this.value)this.value=y;else{for(let v of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let b=this.value[v],S=y[v];b!==null&&S!==null&&ke(b+S)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[v]=Gv(this.value[v],y[v])}this.value.reason=this.value.reason||y.reason,this.value.invalidCounters||=y.invalidCounters}return!0}usage(){if(this.value)return{...this.value,modelReported:this.reported.size>1?null:[...this.reported][0]??this.session.models.get(this.thread)??null,mixedModels:this.reported.size>1}}finish(){this.ended=!0,this.id&&this.session.remember(this.thread,this.id)}};function Vo(t){let e=!1;for(let n of t.split(`
|
|
1706
|
-
`)){let r;try{r=JSON.parse(n)}catch{continue}let s=r.type;typeof s=="string"&&(s.endsWith(".started")&&(e=!0),["turn.completed","turn.failed","turn.aborted","turn.cancelled","error"].includes(s)&&(e=!1))}return e}function
|
|
1707
|
-
`).at(-1)?.trimStart()??"";if(!e.startsWith("{"))return!1;try{return JSON.parse(e),!1}catch{return!0}}function
|
|
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=
|
|
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=
|
|
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??=Ze({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:Qe([_.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:Qe([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
1710
|
|
|
1711
|
-
Teamfile `,
|
|
1711
|
+
Teamfile `,aw=`
|
|
1712
1712
|
|
|
1713
|
-
After this seed finishes, use \`lmctl prompt `,
|
|
1714
|
-
${n}${
|
|
1715
|
-
${e}`),e}import{existsSync as
|
|
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
1716
|
\u2026 ${i} characters of ${n} \u2026
|
|
1717
|
-
${t.slice(-s)}`}function
|
|
1718
|
-
${
|
|
1719
|
-
`;return
|
|
1720
|
-
`);if(
|
|
1721
|
-
`)};for(let c=0;c<a;c++){let m=[...l,t[c]],p=u(m);if(
|
|
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
1722
|
|
|
1723
|
-
[provider stderr: ${a.join("; ")}; ${d}]`}function
|
|
1723
|
+
[provider stderr: ${a.join("; ")}; ${d}]`}function im(t,e=500){let n=t.indexOf(`
|
|
1724
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
|
|
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
1726
|
\u2026 ${s} characters of provider stderr dropped \u2026
|
|
1727
|
-
${r}`}}}function
|
|
1727
|
+
${r}`}}}function jn(t,e){return e===""?t:`${t}:${e.includes(`
|
|
1728
1728
|
`)?`
|
|
1729
|
-
`:" "}${e}`}var
|
|
1730
|
-
`)}catch{}}function
|
|
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
|
|
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=
|
|
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:Qe([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)||Qe([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
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);
|
|
1735
|
-
`);return}e.onNotification?.(d)}),{sendRpc:i,sendNotification:o,close(a=new
|
|
1736
|
-
`),sessionId:
|
|
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 et(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=>et(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
1737
|
|
|
1738
1738
|
--- additional response (turn ${n+1} of ${t.length}; likely an injected mid-call notification) ---
|
|
1739
1739
|
|
|
1740
|
-
`+t[n]);return e.join("")}function
|
|
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:Qe([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
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
1742
|
${de(e,{provider:t.tool})}
|
|
1743
1743
|
|
|
1744
|
-
${
|
|
1745
|
-
`);c=
|
|
1746
|
-
${de(
|
|
1747
|
-
${de(
|
|
1748
|
-
`),
|
|
1749
|
-
`);
|
|
1750
|
-
${
|
|
1751
|
-
${
|
|
1752
|
-
`),
|
|
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,et(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=>{et(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
1753
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
|
|
1754
1754
|
${de(e,{provider:"codex"})}
|
|
1755
1755
|
|
|
1756
|
-
${n}`:n}function
|
|
1757
|
-
`)})}function
|
|
1758
|
-
`)}m.on("line",
|
|
1759
|
-
`),
|
|
1760
|
-
`)})}function
|
|
1761
|
-
`)}let
|
|
1762
|
-
${
|
|
1763
|
-
`),
|
|
1764
|
-
`),
|
|
1765
|
-
`,"utf-8"),!0}let s;try{s=JSON.parse(NS(r,"utf-8"))}catch{return console.log(
|
|
1766
|
-
`,"utf-8"),i}import{existsSync as
|
|
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=>{et(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
1767
|
s.time_created, s.time_updated
|
|
1768
1768
|
FROM session s
|
|
1769
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,
|
|
1771
|
-
FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=[],d=0,u,c,m,p=
|
|
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(
|
|
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
1773
|
s.time_created, s.time_updated
|
|
1774
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
1775
|
s.time_created, s.time_updated
|
|
1776
1776
|
FROM session s
|
|
1777
1777
|
WHERE s.id LIKE ?
|
|
1778
1778
|
ORDER BY s.time_updated DESC
|
|
1779
|
-
LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}};function
|
|
1780
|
-
`,warning:`${t.provider} ignored ${t.configId}=${r}: ${s}`,message:s}},successLog:e=>`acp: set_config_option(${t.configId}=${t.value(e)}) ok`}}var
|
|
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
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
|
|
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:
|
|
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
1784
|
One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
|
|
1785
1785
|
${de(e,{provider:t.tool,...t.fullOutput===void 0?{}:{fullOutput:t.fullOutput}})}
|
|
1786
1786
|
|
|
1787
|
-
${n}`:n}function JS(t,e){return
|
|
1788
|
-
`),M({event:"acp_session_resume_fallback",provider:r.tool,session_id:r.sessionId,error_message:c instanceof Error?c.message:String(c)});let m=await e("session/new",{cwd:r.cwd,mcpServers:[]});return a=mt(m),s.setSessionId(a),{sessionId:a,sessionResponse:m}}let u=mt(d);if(r.requireResume&&u!==""&&u!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${u}"`);if(i){let c=mt(d);if(c!==""&&c!==r.sessionId)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received "${c}"`);if(c===""){if(t.verifyLoadResponse===void 0)throw new Error(`ACP session/load did not return the requested session id: expected "${r.sessionId}", received none`);await t.verifyLoadResponse(d)}a=r.sessionId}else a=mt(d,r.sessionId);l=d,s.setSessionId(a)}else{let d=await e("session/new",{cwd:r.cwd,mcpServers:[]});a=mt(d),l=d,s.setSessionId(a)}return{sessionId:a,sessionResponse:l}}function lp(t,e){let n=Lr(e.tool);if(!n)return Promise.reject(new Error(`No ACP config for tool "${e.tool}"`));if(e.acpMode!==void 0)try{rp(e.tool,e.acpMode)}catch(r){return Promise.reject(r)}return new Promise((r,s)=>{let i=e.permissionMode??"yolo",o=[],a={permissionMode:i,...e.model!==void 0?{model:e.model}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.acpMode!==void 0?{acpMode:e.acpMode}:{},purpose:"chat",warnings:{push:R=>{o.push(R)}}},l,d,u;try{({binary:l,spawnArgs:d,spawnEnv:u}=op(n,e,a))}catch(R){return s(R instanceof Error?R:new Error(String(R)))}let c=np(l,d,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:u}),m=Date.now(),p=!1,f=!1,g=0,_=!1,h=!1;if(e.signal){if(e.signal.aborted)return p=!0,M({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),ne(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{p=!0,M({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-m}),ne(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let E=e.sessionId||"",y=ti({tool:e.tool,onDelta:e.onDelta,...n.isolateResult?{isolateResult:n.isolateResult}:{}});y.setSessionId(E);let T=Ot(c,{provider:e.tool,onEvent:R=>{g=Date.now(),sp(R)&&(h=!0),e.onEvent?.(R)},onNotification:R=>{g=Date.now(),y.processMessage(R)}}),{sendRpc:v,sendNotification:b}=T,S="";c.stderr?.on("data",R=>{S+=R.toString()}),c.on("error",R=>{T.close(R),M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:R.message,elapsed_ms:Date.now()-m}),s(new ie(`Failed to spawn ${n.binary} ${n.baseArgs.join(" ")}: ${R.message}`,{cause:R}))}),c.on("exit",R=>{if(f=!0,T.close(new ie(`ACP process exited with code ${String(R)}`)),p)return;let O=y.finalize();if(O!==null)n.onExitFinalization?.({...a,sessionId:O.sessionId,result:O.result,stopReason:O.stopReason,exitCode:R}),r({result:O.result,sessionId:O.sessionId,durationMs:Date.now()-m,stopReason:O.stopReason,exitCode:R,sawActivity:O.sawActivity,...o.length>0?{warnings:o}:{}});else{let N=JS(e.tool,S),A=qS({tool:e.tool,exitCode:R,stderr:N,fullOutput:S});M({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:R,stderr_summary:A,elapsed_ms:Date.now()-m}),s(new Error(A))}}),(async()=>{try{let R=await ap({sendRpc:v,sendNotification:b,opts:e,outputProcessor:y});E=R.sessionId,e.onSessionId?.(E);let O=R.sessionResponse;await ip(n,a,{sessionId:E,response:O},v),y.beginTurn(),_=!0,Te(`acp: prompt sent (${t.length} chars)`);let N;if(await v("session/prompt",{sessionId:E,prompt:[{type:"text",text:t}]},A=>{A.error?y.cancelTurn():N=y.completeTurn(A)}),!N)throw new Error("ACP prompt completed without a result boundary");_=!1,Te(`acp: result received (${N.result.length} chars, stopReason=${N.stopReason})`),ze(e.holdOpen,{isAborted:()=>p,hasChildExited:()=>f,isTurnInFlight:()=>_,lastEventAtMs:()=>g,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>h})}catch(R){ne(c).catch(()=>{}),s(R instanceof Error?R:new Error(String(R)))}})()})}async function dp(t){let e=Lr(t.tool);if(!e)throw new Error(`No ACP config for tool "${t.tool}"`);t.acpMode!==void 0&&rp(t.tool,t.acpMode);let n=t.permissionMode??"yolo",r=[],s=!0,i={permissionMode:n,...t.model!==void 0?{model:t.model}:{},...t.effort!==void 0?{effort:t.effort}:{},...t.acpMode!==void 0?{acpMode:t.acpMode}:{},purpose:"chat",warnings:{push:O=>{r.push(O)}}},{binary:o,spawnArgs:a,spawnEnv:l}=op(e,t,i),d=np(o,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:l}),u=Date.now(),c={exited:!1,exitCode:null,lastEventAtMs:0,turnInFlight:!1,backgroundJobLaunched:!1,completedTurns:0,closed:!1,closing:null,telemetryFired:!1},m,p=t.sessionId||"",f=null,g="";d.stderr?.on("data",O=>{g+=O.toString()});let _,h,E=ti({tool:t.tool,onDelta:O=>_?.(O),...e.isolateResult?{isolateResult:e.isolateResult}:{}});E.setSessionId(p);let y=Ot(d,{provider:t.tool,onEvent:O=>{c.lastEventAtMs=Date.now(),sp(O)&&(c.backgroundJobLaunched=!0),h?.(O)},onNotification:O=>{c.lastEventAtMs=Date.now(),E.processMessage(O)}}),T=()=>new Error(`ACP bundle process (${t.tool}) exited${c.exitCode!==null?` with code ${c.exitCode}`:""} after ${c.completedTurns} completed prompt(s); the bundle cannot continue`),v=[],b=()=>c.exited?Promise.resolve():new Promise(O=>{v.push(O)}),S=null;d.on("error",O=>{f=new ie(`Failed to spawn ${e.binary} ${e.baseArgs.join(" ")}: ${O.message}`,{cause:O}),M({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:O.message,elapsed_ms:Date.now()-u}),y.close(O)}),d.on("exit",O=>{if(c.exited=!0,c.exitCode=O,y.close(new ie(`ACP process exited with code ${String(O)}`)),!c.telemetryFired){c.telemetryFired=!0;let N=E.finalize();N!==null&&e.onExitFinalization?.({...i,sessionId:N.sessionId,result:N.result,stopReason:N.stopReason,exitCode:O})}if(S!==null){let N=S;S=null,N(T())}for(let N of v.splice(0))N()});try{let O=await ap({sendRpc:y.sendRpc,sendNotification:y.sendNotification,opts:t,outputProcessor:E,strictSessionIdentity:!0,verifyLoadResponse:e.sessionIdentity===void 0?void 0:async N=>e.sessionIdentity.verifyLoadedSession({...i,requestedSessionId:t.sessionId,loadResponse:N,cwd:t.cwd,env:l})});p=O.sessionId,t.onSessionId?.(p),await ip(e,i,{sessionId:O.sessionId,response:O.sessionResponse},y.sendRpc)}catch(O){let N=f??(O instanceof Error?O:new Error(String(O)));throw ne(d).catch(()=>{}),N}let R=O=>new Promise(N=>{setTimeout(N,O).unref?.()});return{tool:t.tool,get sessionId(){return p},get completedTurns(){return c.completedTurns},async sendTurn(O,N={}){if(m&&await m,c.closed||c.closing!==null)throw new Error(`ACP bundle session (${t.tool}) is closed`);if(c.exited)throw T();if(c.turnInFlight)throw new Error(`ACP bundle session (${t.tool}) has a turn still in flight \u2014 a stalled turn poisons the bundle; close it instead of sending`);if(N.signal?.aborted)throw new Error("Aborted");if(e.sessionIdentity?.recheckSession!==void 0){if(await e.sessionIdentity.recheckSession({requestedSessionId:p,cwd:t.cwd,env:l}),c.exited)throw T();if(N.signal?.aborted)throw new Error("Aborted")}c.turnInFlight=!0,_=N.onDelta,h=N.onEvent;let A=Date.now();try{E.beginTurn(),Te(`acp: bundle prompt sent (${O.length} chars)`);let w,I=!1;if(await new Promise((k,x)=>{S=x;let P,L=()=>{I=!0,m=Promise.resolve().then(()=>P).catch(()=>{}),E.cancelTurn(),y.sendNotification("session/cancel",{sessionId:p}),x(new Error("Aborted"))},W=N.signal;W?.addEventListener("abort",L,{once:!0}),P=y.sendRpc("session/prompt",{sessionId:p,prompt:[{type:"text",text:O}]},D=>{I||(D.error?E.cancelTurn():w=E.completeTurn(D),_=void 0,h=void 0)}),P.then(D=>{W?.removeEventListener("abort",L),k(D)},D=>{W?.removeEventListener("abort",L),x(D instanceof Error?D:new Error(String(D)))})}),S=null,!w)throw new Error("ACP prompt completed without a result boundary");c.turnInFlight=!1,c.completedTurns+=1,Te(`acp: bundle result received (${w.result.length} chars, stopReason=${w.stopReason})`);let C=s&&r.length>0?[...r]:void 0;return s=!1,{result:w.result,sessionId:w.sessionId,stopReason:w.stopReason,durationMs:Date.now()-A,sawActivity:w.sawActivity,...C!==void 0?{warnings:C}:{}}}catch(w){throw S=null,E.cancelTurn(),c.turnInFlight=!1,c.exited?T():w}finally{_=void 0,h=void 0}},close(){return c.closing!==null||(c.closing=(async()=>{if(c.closed=!0,c.exited||(t.holdOpen!==void 0?await new Promise(N=>{ze(t.holdOpen,{isAborted:()=>!1,hasChildExited:()=>c.exited,isTurnInFlight:()=>c.turnInFlight,lastEventAtMs:()=>c.lastEventAtMs,closeStdin:()=>{d.stdin?.end(),N()},label:t.tool,wasBackgroundJobLaunched:()=>c.backgroundJobLaunched})}):d.stdin?.end(),c.exited))return;let O=t.closeTimeoutMs??2e3;await Promise.race([b(),R(O)]),c.exited||await ne(d,{stdinEnd:!1,softDelayMs:Math.min(1e3,O),killDelayMs:Math.min(1e3,O)}).catch(()=>{})})()),c.closing}}}function ce(t,e=120){let n=t.replace(/\s+/g," ").trim();return n.length>e?n.slice(0,e-1)+"\u2026":n}var GS=256;function up(t,e){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(t.size>=GS){let r=t.keys().next().value;r!==void 0&&t.delete(r)}t.set(n.id,Date.now()),e(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=t.get(n.id);if(r!==void 0){e({...n,elapsedMs:Date.now()-r}),t.delete(n.id);return}}e(n)}}function cp(){let t=new Map;return(e,n)=>{VS(e,up(t,n))}}function VS(t,e){let n=t.type;if(n==="system"){let r=t.subtype;if(r==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,d=[];s!==void 0&&d.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&d.push(`HTTP ${o}`),l!==void 0&&d.push(`retry in ${Math.round(l/1e3)}s`),a&&d.push(ce(a,60));let u=d.length>0?d.join(", "):r;e({kind:"api_retry",summary:u});return}if(r==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(ce(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:r||"system",raw:t});return}if(n==="assistant"||n==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:ce(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,d=i.input,u="";d&&(typeof d.command=="string"?u=d.command:typeof d.file_path=="string"?u=d.file_path:typeof d.path=="string"?u=d.path:typeof d.pattern=="string"?u=d.pattern:typeof d.url=="string"?u=d.url:u=ce(JSON.stringify(d))),e({kind:"tool_use",tool:a,summary:ce(u),id:l,raw:i})}else if(o==="thinking"||o==="redacted_thinking"){let a=i.thinking||i.data||"";e({kind:"thinking",summary:ce(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",d=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,u,c=i.content;if(typeof c=="string")u=`${c.split(`
|
|
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})`),et(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=>{et(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
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
|
|
1791
|
-
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${
|
|
1792
|
-
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${
|
|
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.")&&
|
|
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
|
|
1795
|
-
`);
|
|
1796
|
-
`);
|
|
1797
|
-
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:
|
|
1798
|
-
`).trim();
|
|
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
|
|
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
|
|
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
|
|
1802
|
-
`,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return
|
|
1803
|
-
`).trim():""}function
|
|
1804
|
-
`);return n?de(n,{provider:"lmplayer"}):`exit code ${t.code}`}function
|
|
1805
|
-
`);for(;h>=0;){let E=l.slice(0,h);l=l.slice(h+1),
|
|
1806
|
-
`)}}),i.stderr?.on("data",
|
|
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 tt(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:!1,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none",leaderSetupHint:"Miniplayer provides native file, shell and web tools. Live ACP sessions cannot be resumed after exit."},binary:"miniplayer",seedArgs:[],resumeTemplate:"",startTemplate:"miniplayer run",transport:(r,s)=>{if(s.sessionId||s.requireResume)throw new Error('miniplayer does not support resume; use lmctl prompt --provider miniplayer --model <model> "<prompt>"');return tt(r,{...s,env:n(s.env),acpTool:"miniplayer",requireResume:!1})}})}openSession(r){if(r.sessionId)throw new Error("miniplayer cannot reopen a closed ACP session; start a fresh conversation");return 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.',lsCommand:"lmctl ls --provider miniplayer"}}resumeCommand(){throw new Error("miniplayer has no interactive terminal or session resume")}async seed(){return{success:!1,error:'miniplayer does not support team session resume; use lmctl prompt --provider miniplayer --model <model> "<prompt>"'}}}}import{join as 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 Ke}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||Ke(J,".copilot");this.sessionStateDir=Ke(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=Ke(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=Ke(n,"events.jsonl"),i=await Gn(s).catch(()=>null),o=i?s:Ke(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=Ke(e,"events.jsonl"),i=await Gn(s).catch(()=>null),o=i?s:Ke(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=Ke(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=Ke(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=Ke(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=Ke(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)=>tt(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)=>tt(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)=>tt(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
1807
|
`):Array.isArray(e.parts)?e.parts.filter(n=>!n.thought&&n.type!=="thinking").map(n=>n.text||"").join(`
|
|
1808
|
-
`):"":""}function Jp(t){return t.model||t.message?.model}function oR(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:Vp(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function jr(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function aR(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return jr(e.output??e.error??t)}return jr(t)}function Vp(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Gp(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:jr(t.args,!0),toolInputData:Be(t.args),toolCallId:t.id,model:n}}var hi=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Mt(J,".qwen")}async discoverSessions(){let e=Mt(this.baseDir,"projects"),n;try{n=await _i(e)}catch{return[]}let r=[];for(let s of n){let i=Mt(e,s,"chats"),o;try{o=await _i(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),d=Mt(i,a);try{let u=await this.extractSummary(d,l);u&&r.push(u)}catch{}}}return r}async extractSummary(e,n){let r=!1,s=await pe(e),i="(unknown)",o,a,l,d,u=0;for await(let c of le(e)){if(r=!0,c.cwd&&(i=c.cwd,c.version&&(a=c.version)),c.type==="system"&&c.cwd&&(i=c.cwd,c.version&&(a=c.version),c.model&&(o=c.model)),Bp(c)){let m=qp(c).trim();m&&(l||(l=B(m,80)),d=B(m,80),u++)}if(Xp(c)){let m=Jp(c);m&&(o=m),u+=oR(c)}}return r?{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:d,messageCount:u,filePath:e}:null}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Hp(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await pe(e),s="(unknown)",i,o,a,l,d,u,c=[],m=rR();for await(let p of le(e)){if(sR(m,p.usageMetadata),p.cwd&&(s=p.cwd,p.version&&(o=p.version),p.gitBranch&&(a=p.gitBranch)),p.type==="system"&&p.cwd&&(s=p.cwd,p.version&&(o=p.version),p.model&&(i=p.model),p.gitBranch&&(a=p.gitBranch)),!p.message)continue;let f=p.message,g=p.timestamp?new Date(p.timestamp):r.modifiedAt;if(p.type==="tool_result"){let _=Vp(p).filter(h=>h.functionResponse!==void 0);_.length===0&&p.toolCallResult?.callId&&c.push({role:"tool_result",timestamp:g,content:jr(p.toolCallResult.resultDisplay??p.toolCallResult.error??p.toolCallResult.status)??"tool result",toolCallId:p.toolCallResult.callId});for(let h of _){let E=h.functionResponse,y=aR(E.response),T=jr(p.toolCallResult?.resultDisplay);c.push({role:"tool_result",timestamp:g,content:T??y??p.toolCallResult?.status??"tool result",toolName:E.name,toolCallId:p.toolCallResult?.callId??E.id,...y!==void 0?{toolDetailedContent:y}:{}})}}else if(Bp(p)){let _=qp(p);_.trim()&&(d||(d=B(_.trim(),80)),u=B(_.trim(),80)),c.push({role:"user",timestamp:g,content:_})}else if(Xp(p)){let _=Jp(p);if(_&&(i=_),Array.isArray(f.content))for(let h of f.content)h.type==="text"&&h.text?c.push({role:"assistant",timestamp:g,content:h.text,model:_}):h.type==="thinking"&&h.thinking?c.push({role:"thinking",timestamp:g,content:h.thinking}):h.functionCall&&c.push(Gp(h.functionCall,g,_));else if(typeof f.content=="string")c.push({role:"assistant",timestamp:g,content:f.content,model:_});else if(Array.isArray(f.parts))for(let h of f.parts)if(h.thought||h.type==="thinking"){let E=h.thinking||h.text;E&&c.push({role:"thinking",timestamp:g,content:E})}else h.functionCall?c.push(Gp(h.functionCall,g,_)):h.text&&c.push({role:"assistant",timestamp:g,content:h.text,model:_})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:d,lastUserMessage:u,messageCount:c.filter(p=>p.role==="user"||p.role==="assistant").length,filePath:e,...iR(m),messages:c}}async resolveSessionPath(e){let n=Mt(this.baseDir,"projects");try{let r=await _i(n),s=[];for(let i of r){let o=Mt(n,i,"chats",`${e}.jsonl`);try{return await tR(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=Mt(n,i,"chats"),a;try{a=await _i(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Hp(l,".jsonl").startsWith(e)&&s.push(Mt(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await nR(n),!0}catch{return!1}}};function $a(t){return new ja(t)}var ja=class extends Z{constructor(e){super({provider:new hi(e),protocol:{transport:"stream-json",perTurnCancellation:"process",persistentCancellation:"session"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",V,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:si})}openSession(e){return ii({...e,binary:"qwen"})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}};import{basename as kR}from"node:path";import{randomUUID as IR}from"node:crypto";import{readdir as Kp,readFile as Yp,rm as zp,stat as Qp}from"node:fs/promises";import{basename as Wa,join as et}from"node:path";import{fileURLToPath as lR}from"node:url";var yi=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||et(J,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:et(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=et(this.baseDir,"conversations"),n;try{n=await Kp(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Wa(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return et(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return et(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Qp(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await dR([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,d,u=0;if(r)for await(let c of le(r)){let m=nf(c.content);if(m&&(a=m),Zp(c)){let p=tf(c.content).trim();p&&(l||(l=B(p,80)),d=B(p,80)),u++}else ef(c)&&c.content&&u++}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:d,messageCount:u,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=sf(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,d=s.lastUserMessage,u=[],c=[];if(i)for await(let m of le(i)){let p=uR(m.created_at,s.modifiedAt),f=nf(m.content);if(f&&(a=f),Zp(m)){let g=tf(m.content),_=g.trim();_&&(l||(l=B(_,80)),d=B(_,80)),o.push({role:"user",timestamp:p,content:g});continue}if(Array.isArray(m.tool_calls))for(let g of m.tool_calls){let _=g.name||"tool",h=mR(g.args),E=Be(g.args),y={role:"tool_use",timestamp:p,content:h,toolName:_,toolInput:h,toolInputData:E};o.push(y),u.push({name:_,stepIndex:m.step_index,input:E,message:y})}if(ef(m)&&m.content)o.push({role:"assistant",timestamp:p,content:m.content,model:a});else if(cR(m)&&m.content){let g=_R(m,r),_=g===void 0?null:await this.readTaskLog(r,g),h={role:"tool_result",timestamp:_?.modifiedAt??p,content:m.content,toolName:m.type?.toLowerCase(),backgroundTaskId:g,..._===null?{}:{toolDetailedContent:_.content}};o.push(h),c.push({event:m,message:h})}m.thinking&&o.push({role:"thinking",timestamp:p,content:m.thinking})}return hR(u,c),{...s,model:a,firstUserMessage:l,lastUserMessage:d,messageCount:o.filter(m=>m.role==="user"||m.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await Qp(n),n}catch{}let r=et(this.baseDir,"conversations");try{let s=[];for(let i of await Kp(r)){if(!i.endsWith(".db"))continue;Wa(i,".db").startsWith(e)&&s.push(et(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=sf(n);return r?(await zp(this.conversationPath(r),{force:!0}),await zp(et(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await pR(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=et(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await Yp(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=et(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([Yp(r,"utf8"),pe(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}};async function dR(t){let e=await Promise.all(t.map(n=>pe(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function uR(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function Zp(t){return t.type==="USER_INPUT"}function ef(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function cR(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function tf(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function nf(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function mR(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function pR(t){for await(let e of le(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=fR(s);if(i)return i}let r=gR(e.content);if(r)return r}return null}function fR(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function gR(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function _R(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function hR(t,e){let n=new Set;for(let r of e){let s=yR(t,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function yR(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:wR(n.event.content);if(r!==void 0)return rf(t.filter(i=>!e.has(i)&&SR(i)===r),n.event.step_index);let s=vR(n.event);if(s!==void 0)return rf(t.filter(i=>!e.has(i)&&TR(i.name,n.event.type)&&of(ER(i))===s),n.event.step_index)}function rf(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function TR(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function ER(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function vR(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),of(e)}function of(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return lR(e)}catch{return}}function wR(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function SR(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function sf(t){if(t.endsWith(".db"))return Wa(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}import{spawn as bR}from"node:child_process";import{StringDecoder as af}from"node:string_decoder";function Ti(t){return async(e,n)=>{let r=Date.now(),s=t.buildArgs(e,n);t.assertArgs?.(s,n),n.onProgress?.({kind:"system",summary:`${t.label} -p one-shot started (no streaming events)`});let{stdout:i}=await RR(t.label,n.binary,s,{cwd:n.cwd,env:Ee(n.env,n.cwd,n.sessionId),signal:n.signal});return n.onProgress?.({kind:"system",summary:`${t.label} -p one-shot completed`}),{text:i.trimEnd(),sessionId:n.sessionId,durationMs:Date.now()-r}}}function RR(t,e,n,r){return new Promise((s,i)=>{if(r.signal?.aborted){i(new Error(`${t} turn aborted`));return}let o;try{o=bR(e,n,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(m){i(m);return}let a="",l="",d=new af("utf8"),u=new af("utf8");o.stdout?.on("data",m=>{a+=d.write(m)}),o.stderr?.on("data",m=>{l+=u.write(m)});let c=()=>{o.kill("SIGTERM"),i(new Error(`${t} turn aborted`))};o.on("error",m=>{r.signal?.removeEventListener("abort",c),i(m)}),o.on("close",(m,p)=>{if(r.signal?.removeEventListener("abort",c),a+=d.end(),l+=u.end(),m===0){s({stdout:a,stderr:l});return}let f=p?`signal ${p}`:`exit code ${m}`,g=l.trim()||a.trim();i(new Error(Un(`${t} failed (${f})`,g?de(g,{provider:t}):"")))}),r.signal?.aborted?c():r.signal?.addEventListener("abort",c,{once:!0})})}function Ba(t){return new Ha(t)}var Ha=class extends Z{constructor(e){super({provider:new yi(e),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",V,"--dangerously-skip-permissions","--print-timeout","2m"],seedTimeoutMs:13e4,resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:AR})}async sendTurn(e,n){if(n.requireResume){let s=await this.resolvePath(n.sessionId);if(s===null||kR(s)!==`${n.sessionId}.db`)throw new Error(`agy cannot resume missing conversation "${n.sessionId}"`)}let r=await super.sendTurn(e,n);return n.permissionMode==="plan"?{...r,warnings:[...r.warnings??[],"agy does not enforce plan mode; this turn used full permissions"]}:r}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}async seed(e,n){let r=IR(),s=`[lmctl-seed:${r}]`,i=await super.seed(e,{...n,prompt:nm({flightToken:r,prompt:n?.prompt})});if(!i.success&&(i.errorCode==="ENOENT"||i.errorCode==="ABORT_ERR"))return i;let o=(await this.provider.discoverSessions()).filter(a=>a.firstUserMessage?.startsWith(s));if(i.success&&o.length===1)return{...i,sessionId:o[0].sessionId};for(let a of o)await this.provider.deleteSession(a.sessionId);return{...i,success:!1,error:i.error??`agy seed created ${o.length} identifiable sessions; expected one`}}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}},AR=Ti({label:"agy",buildArgs:(t,e)=>{let n=[...e.sessionId?["--conversation",e.sessionId]:[],"-p",t,"--dangerously-skip-permissions","--print-timeout",CR(e.timeoutMs)];return e.model&&n.push("--model",e.model),n},assertArgs:(t,e)=>he("agy",t,e.permissionMode??"yolo")});function CR(t){return t!==void 0&&t<=0?"0":t===void 0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}import{randomUUID as ff}from"node:crypto";import{existsSync as gf,statSync as WR}from"node:fs";import{readFile as HR,mkdir as BR}from"node:fs/promises";import{existsSync as $r,readdirSync as NR,statSync as lf}from"node:fs";import{readdir as Xa,rm as xR}from"node:fs/promises";import df,{join as tt}from"node:path";var Ei=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||process.env.DSH_HOME||tt(J,".dsh");this.sessionsDir=tt(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await Xa(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await Xa(tt(this.sessionsDir,r))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(r,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.findSessionDir(e);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=uf(r),i=cf(r,n.filePath,s);return i?{...i,turnStatus:PR(r),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let n=await this.findSessionDir(e);return n?(await xR(tt(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,n){let r=OR(e),s=LR(e),i=r,o=tt(this.sessionsDir,r,n),a=tt(this.sessionsDir,s,n);!$r(o)&&$r(a)&&(i=s);let l=tt(this.sessionsDir,i,n);return Jn(l)}async findSessionDir(e){let n;try{n=await Xa(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=tt(this.sessionsDir,r,s);try{let o=Jn(i);if($r(o))return{cwdDir:r,sessionDir:s,filePath:o}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=tt(this.sessionsDir,e,n),i=Jn(s),o=await r(i),a=rs(o),l=[];for(let d of a.split(`
|
|
1809
|
-
`))if(d.trim())try{let u=JSON.parse(d);if(u.type?.endsWith("-chunks")||u.type==="assistant/chunk"&&u.data?.chunk?.type!=="usage")continue;l.push(u)}catch{}return l}async readSummary(e,n){let r=tt(this.sessionsDir,e,n),s=Jn(r),i=await this.readRecords(e,n);return i.length===0?null:cf(i,s,uf(i))}};function OR(t){if(t.length===0)throw new Error("cannot encode an empty project path");let e="",n=!1;for(let s=0;s<t.length;s++){let i=t.charCodeAt(s),o=String.fromCharCode(i);o==="/"||o==="\\"||o===":"?(n||(e+="-"),n=!0):o!=="~"&&/^[A-Za-z0-9._-]$/.test(o)?(e+=o,n=!1):(e+="~"+i.toString(16).toUpperCase().padStart(4,"0"),n=!1)}return`--${(e.replace(/^-+/,"")||"root").slice(0,251)}--`}function LR(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Jn(t,e){let n=e??(process.platform==="win32"?df.win32:df.posix),r=t,s="session.jsonl.zstd";if((t.endsWith(".jsonl.zstd")||t.endsWith(".jsonl"))&&(r=n.dirname(t),s=n.basename(t)),!$r(r))return t.endsWith(".jsonl.zstd")||t.endsWith(".jsonl")?t:n.join(t,s);try{let i=NR(r),o=[];for(let a of i){let l=/^session(?:\.v(\d+))?\.jsonl\.zstd$/.exec(a);if(l){let d=l[1]?parseInt(l[1],10):0;if(Number.isSafeInteger(d))try{let u=n.join(r,a);lf(u).isFile()&&o.push({name:a,version:d})}catch{}}}if(o.length>0)return o.sort((a,l)=>l.version-a.version),n.join(r,o[0].name)}catch{}try{if($r(t)&&lf(t).isFile())return t}catch{}return n.join(r,s)}function qa(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join("")}function DR(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&e.push(n.text);return e}function uf(t){let e=[];for(let n of t){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let i=r;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:qa(i.content)})}else if(n.type==="assistant/message"){let i=r.message;for(let o of DR(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:qa(i?.content),model:i?.source?.model})}else if(n.type==="tool/call"){let i=r,o;if(typeof i.arguments=="string")try{o=JSON.parse(i.arguments)}catch{}else i.arguments&&typeof i.arguments=="object"&&(o=i.arguments);e.push({role:"tool_use",timestamp:s,content:typeof i.arguments=="string"?i.arguments:JSON.stringify(i.arguments??{}),toolName:i.name,toolCallId:i.callId,toolInputData:o})}else if(n.type==="tool/result"){let i=r,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:qa(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function PR(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function cf(t,e,n){let r=t.find(p=>p.type==="session");if(!r)return null;let s=r,i=r.data,o=s.id??i?.id;if(!o)return null;let a;for(let p of t)if(p.type==="request/header"){let f=p.data?.header;f?.config?.model&&(a=f.config.model)}let l=t.map(p=>p.time).filter(p=>typeof p=="number"),d=s.createdAt??i?.createdAt,u=d?new Date(d):new Date(0),c=l.length>0?new Date(Math.max(...l)):u,m=n.filter(p=>p.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:u,modifiedAt:c,model:a,firstUserMessage:m[0]?.content,lastUserMessage:m.at(-1)?.content,messageCount:n.filter(p=>p.role==="user"||p.role==="assistant").length,filePath:e,...MR(t)}}function MR(t){let e=new Map;for(let o of t){let a=o.data?.turn??null,l=e.get(a)??[];l.push(o),e.set(a,l)}let n=[],r=[];for(let o of e.values()){let a=new jn("",-1,new Set);a.update(o);let l=a.usage();l&&(n.push(l),r.push(a.lastUsage()))}if(!n.length)return{};let s=o=>{if(n.some(l=>l.invalidCounters||l[o]===null))return;let a=n.reduce((l,d)=>l+d[o],0);return Number.isSafeInteger(a)?a:void 0},i=r.at(-1);return{totalInputTokens:s("inputUncached"),totalCachedInputTokens:s("cacheRead"),totalOutputTokens:s("output"),totalReasoningOutputTokens:s("reasoning"),lastInputTokens:i.inputUncached!==null&&i.cacheRead!==null?i.inputUncached+i.cacheRead:void 0,lastTokenUsage:{totalTokens:i.inputUncached!==null&&i.cacheRead!==null&&i.output!==null?i.inputUncached+i.cacheRead+i.output:void 0,inputTokens:i.inputUncached??void 0,cachedInputTokens:i.cacheRead??void 0,outputTokens:i.output??void 0,reasoningOutputTokens:i.reasoning??void 0}}}import{spawn as UR}from"node:child_process";import{randomUUID as FR}from"node:crypto";var jR=/dsh web:\s*(https?:\/\/\S+)/,mf=2e4;function Ja(t,e=[]){if(t==null)return t;if(typeof t=="string"){let n=t;for(let r of e)r&&typeof r=="string"&&r.length>=8&&n.includes(r)&&(n=n.replaceAll(r,"[REDACTED]"));return n=n.replace(/(?:sk-|dsh-)[A-Za-z0-9_\-\.]+/gi,"[REDACTED]"),n=n.replace(/(?:token=)[A-Za-z0-9_\-\.]+/gi,"token=[REDACTED]"),n=n.replace(/bearer\s+[A-Za-z0-9_\-\.]+/gi,"Bearer [REDACTED]"),n}if(Array.isArray(t))return t.map(n=>Ja(n,e));if(typeof t=="object"){let n={};for(let[r,s]of Object.entries(t))/api[_-]?key|secret|token|password|auth|authorization|credential|cookie/i.test(r)?n[r]="[REDACTED]":n[r]=Ja(s,e);return n}return t}function $R(t){let e;try{e=new URL(t)}catch{throw new Error("invalid dsh boot URL: malformed URL")}if(e.protocol!=="http:")throw new Error(`invalid dsh boot URL scheme "${e.protocol}": must be http:`);if(e.username||e.password)throw new Error("invalid dsh boot URL: userinfo credentials are not allowed");let n=e.hostname;if(!(n==="127.0.0.1"||n==="localhost"||n==="::1"||n==="[::1]"))throw new Error(`invalid dsh boot URL host "${n}": loopback host (127.0.0.1 or localhost) required`);return e}var pt=class t extends Error{method;detail;constructor(e,n,r=[]){let s=Ja(n,r),i=typeof s=="string"?s:JSON.stringify(s);super(`dsh RPC ${e} failed: ${i}`),this.name="DshRpcCallError",this.method=e,this.detail=s,Object.setPrototypeOf(this,t.prototype)}};function pf(t,e=2e3){if(!t||t.exitCode!==null||t.signalCode!==null)return;try{t.kill("SIGTERM")}catch{}let n,r=()=>{n!==void 0&&(clearTimeout(n),n=void 0)};if(t.once("exit",r),t.exitCode!==null||t.signalCode!==null){r();return}n=setTimeout(()=>{n=void 0;try{t.exitCode===null&&t.signalCode===null&&t.kill("SIGKILL")}catch{}},e),n.unref()}var Ga=class t{constructor(e,n,r,s=!1,i){this.baseUrl=e;this.child=n;this.cookie=r;this.isV2=s;this.tokenUrl=i;if(this.cookie&&this.recordSecret(this.cookie),this.tokenUrl){this.recordSecret(this.tokenUrl);try{let a=new URL(this.tokenUrl).searchParams.get("token");a&&this.recordSecret(a)}catch{}}}static MAX_RETAINED_SECRETS=8;cookieExchangePromise;knownSecrets=[];recordSecret(e){if(!e||typeof e!="string"||e.length<8)return;let n=r=>{if(r.length<8)return;let s=this.knownSecrets.indexOf(r);for(s!==-1&&this.knownSecrets.splice(s,1),this.knownSecrets.push(r);this.knownSecrets.length>t.MAX_RETAINED_SECRETS;)this.knownSecrets.shift()};if(n(e),e.includes("=")){let r=e.split("=")[1];r&&r.length>=8&&n(r)}}getSecretsToRedact(e=[]){let n=new Set;for(let r of this.knownSecrets)r&&r.length>=8&&n.add(r);if(this.cookie&&this.cookie.length>=8){n.add(this.cookie);let r=this.cookie.split("=")[1];r&&r.length>=8&&n.add(r)}if(this.tokenUrl)try{let s=new URL(this.tokenUrl).searchParams.get("token");s&&s.length>=8&&n.add(s)}catch{}for(let r of e)if(r&&r.length>=8&&(n.add(r),r.includes("="))){let s=r.split("=")[1];s&&s.length>=8&&n.add(s)}return Array.from(n)}static forTesting(e,n){let r=e,s=n?.isV2??!1,i=n?.cookie;try{let o=new URL(e);o.searchParams.has("token")&&(s=!0,r=o.origin)}catch{}return new t(r,void 0,i,s,e)}static async fromBootUrl(e,n,r){let s=$R(e),i=s.searchParams.has("token"),o;if(i)for(let a=0;a<5;a++){if(r?.aborted)throw new Error("dsh web boot aborted");try{let d=(await fetch(e,{redirect:"manual",signal:r})).headers.get("set-cookie");if(d){o=d.split(";")[0];break}}catch(l){if(r?.aborted)throw l;await new Promise(d=>setTimeout(d,100))}}return new t(s.origin,n,o,i,e)}async ensureCookie(e=!1){return this.tokenUrl?this.cookie&&!e?this.cookie:(this.cookieExchangePromise||(this.cookieExchangePromise=(async()=>{for(let n=0;n<5;n++)try{let r=AbortSignal.timeout(1e4),i=(await fetch(this.tokenUrl,{redirect:"manual",signal:r})).headers.get("set-cookie");if(i)return this.cookie=i.split(";")[0],this.recordSecret(this.cookie),this.cookie}catch{await new Promise(r=>setTimeout(r,100))}return this.cookie})().finally(()=>{this.cookieExchangePromise=void 0})),this.cookieExchangePromise):this.cookie}async rpc(e,n){this.isV2&&await this.ensureCookie();let r=this.cookie,s=r?[r]:[],i=`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,o=this.isV2?e.includes("/")?e:e.replace(/\./g,"/"):e.includes(".")?e:e.replace(/\//g,"."),a=n;if(this.isV2){let m=n;if(o==="session/prompt"&&m&&typeof m=="object"){let p=m;p.requestId||(m={...p,requestId:FR()})}m&&typeof m=="object"&&"args"in m?a=m:a={args:{request:m}}}let l={"content-type":"application/json"};this.cookie&&(l.cookie=this.cookie);let d;try{d=await fetch(`${this.baseUrl}/api/${o}`,{method:"POST",headers:l,body:JSON.stringify({type:"client-request",rpcId:i,method:o,payload:a}),redirect:"manual"})}catch(m){throw new pt(e,`transport error: ${m instanceof Error?m.message:String(m)}`,this.getSecretsToRedact(s))}if(d.status>=300&&d.status<400)throw new pt(e,`redirects are not permitted (HTTP ${d.status})`,this.getSecretsToRedact(s));if((d.status===401||d.status===403)&&this.isV2&&this.tokenUrl){let m=await this.ensureCookie(!0);if(m&&m!==l.cookie){l.cookie=m,s.push(m);try{d=await fetch(`${this.baseUrl}/api/${o}`,{method:"POST",headers:l,body:JSON.stringify({type:"client-request",rpcId:i,method:o,payload:a}),redirect:"manual"})}catch(p){throw new pt(e,`transport error: ${p instanceof Error?p.message:String(p)}`,this.getSecretsToRedact(s))}if(d.status>=300&&d.status<400)throw new pt(e,`redirects are not permitted (HTTP ${d.status})`,this.getSecretsToRedact(s))}}let u;try{u=await d.json()}catch{u=void 0}if(!d.ok)throw new pt(e,u??d.statusText,this.getSecretsToRedact(s));let c=u&&typeof u=="object"?u.result:void 0;if(!c||typeof c!="object"||typeof c.ok!="boolean")throw new pt(e,"malformed response: HTTP 200 but body is not a well-formed {result:{ok,\u2026}} envelope",this.getSecretsToRedact(s));if(c.ok===!1)throw new pt(e,c.error??c,this.getSecretsToRedact(s));return"value"in c?c.value:void 0}get alive(){return this.child!==void 0&&this.child.exitCode===null&&this.child.signalCode===null}shutdown(){this.child!==void 0&&this.alive&&pf(this.child,2e3)}static spawn(e){return new Promise((n,r)=>{let s=UR("dsh",["web","--no-open","--port","0"],{env:e,stdio:["ignore","pipe","pipe"]}),i=!1,o=!1,a="",l="",d="",u=new AbortController,c=p=>{i||(i=!0,clearTimeout(m),u.abort(),pf(s,2e3),r(p))},m=setTimeout(()=>{let p=[l?`stdout:
|
|
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
1810
|
${l}`:"",d?`stderr:
|
|
1811
1811
|
${d}`:""].filter(Boolean).join(`
|
|
1812
|
-
`);c(new Error(`dsh web sidecar did not report a boot URL within ${
|
|
1813
|
-
${de(p,{provider:"dsh"})}`:"(no output captured)")))},
|
|
1814
|
-
`);a=
|
|
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
|
|
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
1816
|
last_activity_at, message_count, input_tokens, output_tokens,
|
|
1817
|
-
cache_read_tokens, cache_write_tokens, reasoning_tokens, cwd, title`;function
|
|
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
1818
|
WHERE source = ?
|
|
1819
1819
|
ORDER BY COALESCE(last_activity_at, started_at) DESC
|
|
1820
|
-
LIMIT ?`).all(
|
|
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
1821
|
timestamp, finish_reason${["_compressed_summary","display_kind"].filter(a=>r.has(a)).map(a=>`, ${a}`).join("")}`,o="WHERE session_id = ? AND role IN ('user', 'assistant', 'tool')";try{return e.prepare(`SELECT ${i} FROM messages ${o} AND active = 1 ORDER BY id ASC`).all(n)}catch(a){if(!/no such column/i.test(a instanceof Error?a.message:String(a)))throw a;return e.prepare(`SELECT ${i} FROM messages ${o} ORDER BY id ASC`).all(n)}}previewTexts(e,n){try{let[r,s]=["ASC","DESC"].map(i=>{let o=`SELECT content FROM messages WHERE session_id = ?
|
|
1822
|
-
AND role = 'user' AND content != ''`,a;try{a=e.prepare(`${o} AND active = 1 ORDER BY id ${i} LIMIT 1`).get(n)}catch(l){if(!/no such column: active/i.test(String(l)))throw l;a=e.prepare(`${o} ORDER BY id ${i} LIMIT 1`).get(n)}return a?B(a.content,80):void 0});return{first:r,last:s}}catch{return{}}}async loadSession(e){let n=this.openDb();if(!n)return null;try{let r=this.selectSessionRow(n,e);if(!r)return null;let s=this.activeMessageRows(n,e),i=[],o=[],a,l;for(let d of s){let u=Hr(d.timestamp),c=d.content??"";if(d.role==="user"){c&&d._compressed_summary!==1&&d.display_kind!=="hidden"&&o.push(c),c.length>0&&(a||(a=B(c,80)),l=B(c,80)),i.push({role:"user",timestamp:u,content:c||"(empty)"});continue}if(d.role==="tool"){i.push({role:"tool_result",timestamp:u,content:c,toolCallId:De(d.tool_call_id),toolName:De(d.tool_name)});continue}c.length>0&&i.push({role:"assistant",timestamp:u,content:c,model:De(r.model),stopReason:De(d.finish_reason)});for(let m of ZR(d.tool_calls)){let p=ek(m.function?.arguments);i.push({role:"tool_use",timestamp:u,content:De(m.function?.name)??"tool_call",toolName:De(m.function?.name),toolCallId:De(m.call_id)??De(m.id),toolInput:typeof m.function?.arguments=="string"?m.function.arguments:JSON.stringify(m.function?.arguments??{}),toolInputData:Be(p)})}}return{provider:this.name,sessionId:r.id,slug:De(r.title),cwd:Tf(r),createdAt:Hr(r.started_at),modifiedAt:Hr(r.last_activity_at??r.started_at),model:De(r.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:l,messageCount:r.message_count??i.length,filePath:this.dbPath,...Ef(r),messages:i,userPrompts:o}}catch(r){return M({event:"hermes_load_session_failed",provider:this.name,session_id:e,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),null}finally{n.close()}}async resolveSessionPath(e){let n=this.openDb();if(!n)return null;try{return this.selectSessionRow(n,e)?this.dbPath:null}catch{return null}finally{n.close()}}async deleteSession(e){return!1}};function ZR(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function ek(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t;if(typeof t!="string")return{};try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function Ef(t){let e=t.input_tokens??0,n=t.output_tokens??0,r=t.cache_read_tokens??0,s=t.cache_write_tokens??0,i=t.reasoning_tokens??0;return(t.message_count??0)>0&&e+n+r+s+i>0?{totalInputTokens:e,totalCachedInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:n,totalReasoningOutputTokens:i}:{}}var nk=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function rk(t){return nk.test(t)}var sk="dont_ask";function wf(t){if(t==="plan")throw new Error(`provider "hermes" does not support --permission-mode plan: Hermes's ACP mode ladder (default/accept_edits/dont_ask) governs file edits only and has no plan-equivalent, so lmctl refuses rather than silently running the member with edit auto-approval.`);return sk}function nl(t){return new tl(t)}var tl=class extends Z{hermesProvider;hermesHome;constructor(e){let n=new bi(e);super({provider:n,protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn"},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Hermes has no provider-side leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"hermes",seedArgs:[],resumeTemplate:"hermes --yolo --resume {{session_id}}",startTemplate:"hermes",transport:async(r,s)=>Qe(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:wf(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=el(e)}async openSession(e){return Ze({...e,env:{...e.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:wf(e.permissionMode)})}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(e,n){await tk(e,{recursive:!0});let r=[];if(n?.effort){let i="hermes has no ACP-level effort surface";M({event:"hermes_effort_ignored",provider:this.name,effort:n.effort,reason:i}),r.push(`hermes seed ignored effort=${n.effort}: ${i}`)}let s;try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}s=await this.sendTurn(n?.prompt??V,{sessionId:"",cwd:e,env:n?.env,signal:n?.signal,model:n?.model})}catch(i){return{success:!1,error:`hermes ACP seed failed: ${i instanceof Error?i.message:String(i)}`}}return rk(s.sessionId)?(r.push(...s.warnings??[]),{success:!0,sessionId:s.sessionId,usage:s.usage,...r.length>0?{warnings:r}:{}}):(M({event:"hermes_seed_contract_violation",provider:this.name,session_id:s.sessionId,reason:"session/new did not return a UUID session id"}),{success:!1,error:`hermes ACP session/new did not return a UUID session id (got ${JSON.stringify(s.sessionId)})`})}};import{readdir as Sf,rm as ik,stat as ok}from"node:fs/promises";import{join as rl}from"node:path";var Ri=class{name="pi";baseDir;constructor(e={}){this.baseDir=e.piDir||rl(J,".pi","agent","sessions")}getWatchPaths(){return[{directory:this.baseDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[];for(let n of await this.listSessionFiles())try{let r=await this.extractSummary(n);r&&e.push(r)}catch{}return e}async listSessionFiles(){let e;try{e=await Sf(this.baseDir)}catch{return[]}let n=[];for(let r of e){let s=rl(this.baseDir,r);try{if(!(await ok(s)).isDirectory())continue;for(let i of await Sf(s))i.endsWith(".jsonl")&&n.push(rl(s,i))}catch{}}return n}async readHeader(e){for await(let n of le(e))return n.type==="session"?n:null;return null}async extractSummary(e){let n=await this.readHeader(e);if(!n)return null;let r=await pe(e),s,i,o,a=0,l=0,d=0,u=0,c=0,m=0,p=0,f;for await(let g of le(e)){if(g.type==="model_change"&&g.provider&&g.modelId){s=`${g.provider}/${g.modelId}`;continue}if(g.type!=="message"||!g.message)continue;let _=g.message;if(_.provider&&_.model&&(s=`${_.provider}/${_.model}`),_.role==="user"){let h=sl(_).trim();h&&(i||(i=B(h,80)),o=B(h,80)),a++}else if(_.role==="assistant"){a++;let h=_.usage;h&&(l+=h.input??0,d+=h.cacheRead??0,u+=h.cacheWrite??0,c+=h.output??0,m+=h.reasoning??0,p=h.input??0,f={inputTokens:h.input,cachedInputTokens:h.cacheRead,cacheWriteInputTokens:h.cacheWrite,outputTokens:h.output,reasoningOutputTokens:h.reasoning,totalTokens:h.totalTokens})}}return{provider:"pi",sessionId:n.id,cwd:n.cwd??"(unknown)",createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:s,startCommand:"pi",firstUserMessage:i,lastUserMessage:o,messageCount:a,filePath:e,totalInputTokens:l,totalCachedInputTokens:d,totalCacheWriteInputTokens:u,totalOutputTokens:c,totalReasoningOutputTokens:m,lastInputTokens:p,lastTokenUsage:f}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=await this.extractSummary(n);if(!r)return null;let s=[],i=r.model;for await(let o of le(n)){if(o.type==="model_change"&&o.provider&&o.modelId){i=`${o.provider}/${o.modelId}`;continue}if(o.type!=="message"||!o.message)continue;let a=o.message;a.provider&&a.model&&(i=`${a.provider}/${a.model}`);let l=a.timestamp?new Date(a.timestamp):r.modifiedAt;if(a.role==="user")s.push({role:"user",timestamp:l,content:sl(a)});else if(a.role==="assistant"&&Array.isArray(a.content))for(let d of a.content)d.type==="text"&&d.text?s.push({role:"assistant",timestamp:l,content:d.text,model:i}):d.type==="thinking"&&d.thinking?s.push({role:"thinking",timestamp:l,content:d.thinking}):d.type==="toolCall"&&s.push({role:"tool_use",timestamp:l,content:bf(d.arguments),toolName:d.name??"tool",toolInput:bf(d.arguments),toolInputData:d.arguments,toolCallId:d.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:l,content:sl(a),toolName:a.toolName,toolCallId:a.toolCallId})}return{...r,model:i,messages:s}}async resolveSessionPath(e){let n=`_${e}.jsonl`,r=[];for(let s of await this.listSessionFiles()){if(s.endsWith(n))return s;s.split("_").pop()?.replace(/\.jsonl$/,"")?.startsWith(e)&&r.push(s)}return r.length===1?r[0]:null}async deleteSession(e){let n=await this.resolveSessionPath(e);return n?(await ik(n,{force:!0}),!0):!1}};function sl(t){return typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(e=>e.type==="text"&&e.text).map(e=>e.text).join(" "):""}function bf(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}function ol(t){return new il(t)}var il=class extends Z{constructor(e){super({provider:new Ri(e),protocol:{transport:"print",perTurnCancellation:"process"},capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"pi uses one-shot print turns; no streaming events are available."},binary:"pi",seedArgs:["-p",V],resumeTemplate:"pi --session {{session_id}}",startTemplate:"pi",transport:ak})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}manualSeedHint(e){return{launchCommand:`cd ${e} && pi`,postLaunchNote:"Send the lmctl seed instruction, wait for the session file to write, then exit.",lsCommand:`lmctl ls --provider pi --sessiondir ${e}`}}},ak=Ti({label:"pi",buildArgs:(t,e)=>{let n=[...e.sessionId?["--session",e.sessionId]:[],"-p",t];return e.model&&n.push("--model",e.model),n},assertArgs:(t,e)=>he("pi",t,e.permissionMode??"yolo")});import{createHash as lk}from"node:crypto";import{existsSync as dk,mkdirSync as ll,readFileSync as uk,renameSync as ck,rmdirSync as Of,statSync as mk,writeFileSync as pk}from"node:fs";import{dirname as ml,join as Rf,resolve as al}from"node:path";var Gn=new Map;function fk(t){return lk("sha256").update(t).digest("hex").slice(0,8)}function gk(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function _k(t,e){let n=e?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function Lf(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function ki(t){return Math.max(1,Math.ceil(t.length/4))}function Vn(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return al(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?Rf(ml(al(n)),".lmctl-claude-mock","sessions.json"):Rf(al(t),".lmctl-claude-mock","sessions.json")}function kf(){return{schemaVersion:1,sessions:{}}}function Br(t){if(!dk(t))return kf();try{let e=JSON.parse(uk(t,"utf8")),n=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},r=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=dl(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return kf()}}function Df(t,e){ll(ml(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;pk(n,`${JSON.stringify(e,null,2)}
|
|
1823
|
-
`,"utf8"),ck(n,t)}var hk=5e3,yk=15,If=1e4;function Tk(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function Ek(t){let e=`${t}.lock`;ll(ml(t),{recursive:!0});let n=Date.now()+If;for(;;)try{return ll(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-mk(e).mtimeMs>hk){try{Of(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${If}ms: ${e}`);Tk(yk)}}function vk(t){try{Of(t)}catch{}}function Pf(t,e){let n=Ek(t);try{return e()}finally{vk(n)}}function wk(t){return{...t,timestamp:t.timestamp.toISOString()}}function Sk(t){return{...t,timestamp:new Date(t.timestamp)}}function bk(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(wk)}}function Mf(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(Sk)}}function Ii(t,e=process.cwd()){let n=Gn.get(t);if(n!==void 0)return n;let s=Br(Vn(e)).sessions[t];if(s===void 0)return;let i=Mf(s);return Gn.set(i.sessionId,i),i}function Af(t){Gn.set(t.sessionId,t);let e=Vn(t.cwd);Pf(e,()=>{let n=Br(e);n.sessions[t.sessionId]=bk({...t,filePath:e}),Df(e,n)})}function Rk(t,e=process.cwd()){let n=Vn(e);return Pf(n,()=>{let r=Br(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],Df(n,r)),s})}function kk(){let t=Br(Vn()),e=Object.values(t.sessions).map(Mf);for(let n of e)Gn.set(n.sessionId,n);return e}function dl(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function Cf(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=dl(t.delayMs);return{kind:"success",text:t.text,...e!==void 0?{delayMs:e}:{}}}if(t!==void 0&&typeof t.error=="string"&&typeof t.text!="string"){let e=dl(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function Nf(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function Ik(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=Cf(n[t]??n[Lf(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let i=Cf(r[s]);if(i!==void 0)return i}}}function xf(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}var ul=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of kk())e.set(n.sessionId,n);for(let n of Gn.values())e.set(n.sessionId,n);return[...e.values()].map(xf)}async loadSession(e){let n=Ii(e);return n===void 0?null:{...xf(n),messages:n.messages.slice()}}async resolveSessionPath(e){return Ii(e)?.filePath??null}async deleteSession(e){let n=Gn.delete(e),r=Rk(e);return n||r}},cl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new ul;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,n){try{n?.onDispatch?.()}catch{}let r=gk(_k(e,n)),s=`mock-${r}-${fk(`${e}:${r}`)}`,i=new Date,o=Vn(e),a=Ii(s,e),l=n?.prompt??"ClaudeMock seed",d=ki(l),u={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return u.messages.push({role:"user",timestamp:i,content:l}),u.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),u.totalInputTokens+=d,u.totalOutputTokens+=ki("ACK: ClaudeMock seeded"),Af(u),{success:!0,sessionId:s}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,n){let r=Date.now(),s=Ii(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=Br(Vn(n.cwd)),a=Ik(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await Nf(l),new Error(a.error);let d=a?.kind==="success"?a.text:`ClaudeMock ack: ${Lf(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:d,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=ki(e),s.totalOutputTokens+=ki(d),Af(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await Nf(l),{text:d,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}};function pl(){return new cl}function Ft(t){let e=[sa({museDataHome:t?.museDataHome}),ha({miniplayerHome:t?.miniplayerHome}),Ta({claudeDir:t?.claudeDir}),Sa({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ia({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Na({copilotDir:t?.copilotDir}),Oa({dbPaths:t?.opencodeDbPaths}),Ma({kimiHome:t?.kimiHome}),Fa({lmplayerDbPath:t?.lmplayerDbPath,lmplayerDbPaths:t?.lmplayerDbPaths}),$a({qwenDir:t?.qwenDir}),Ba({agyDir:t?.agyDir}),Qa({dshHome:t?.dshHome}),nl({hermesHome:t?.hermesHome}),ol({piDir:t?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(pl()),e}var fl=null;function Uf(){return fl===null&&(fl=Nt(Ft())),fl}function Ff(t,e){Ds(e);let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function jf(t){let e=t.registry??Uf(),n=Ff(e,t.provider),r={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen,requireResume:t.requireResume,bundleSession:t.bundleSession},s=t.bundleSession===void 0?await Ho(n,{...r,execution:"per-turn",requireResume:t.requireResume??!1}):void 0,i;try{i=s?await s.sendTurn(t.prompt,{onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal}):await n.sendTurn(t.prompt,r)}finally{await s?.close()}return{text:i.text,...i.usage?{usage:i.usage}:{},sessionId:i.sessionId,durationMs:i.durationMs,stopReason:i.stopReason,numTurns:i.numTurns,status:i.status,stalledAfterMs:i.stalledAfterMs,...i.warnings!==void 0?{warnings:i.warnings}:{}}}async function $f(t){return Ho(Ff(t.registry??Uf(),t.provider),t)}import{join as Se}from"node:path";var Wf=new WeakMap;function Ai(t){let e=Wf.get(t);if(e)return e;let n=t.env.HOME;if(!n)return Nt(Ft());let r=t.env.XDG_DATA_HOME||Se(n,".local/share"),s=t.env.XDG_CONFIG_HOME||Se(n,".config");return e=Nt(Ft({museDataHome:r,miniplayerHome:t.env.MINIPLAYER_HOME||Se(r,"miniplayer"),claudeDir:Se(n,".claude"),codexDir:Se(n,".codex"),codeDir:Se(n,".code"),geminiDir:Se(n,".gemini"),copilotDir:Se(n,".copilot"),qwenDir:Se(n,".qwen"),opencodeDbPaths:[Se(r,"opencode/opencode.db"),Se(s,"opencode/opencode.db")],agyDir:Se(n,".gemini/antigravity-cli"),dshHome:Se(n,".dsh"),hermesHome:t.env.HERMES_HOME??Se(n,".hermes"),kimiHome:t.env.KIMI_CODE_HOME??Se(n,".kimi-code"),piDir:Se(n,".pi/agent/sessions"),lmplayerDbPaths:pa(t.env,n)})),Wf.set(t,e),e}var $t=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))$t(e);Object.freeze(t)}return t},Ak=$t(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed"]),rj=$t({status:"string",error:"string|null",code:"ErrorCode?"}),sj=$t(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),ij=$t(["Provider1.Provider","Provider1.Model1","Provider1.Model2","Provider1.Model3","Provider2.Provider","Provider2.Model1","Provider2.Model2","Provider2.Model3","Provider3.Provider","Provider3.Model1","Provider3.Model2","Provider3.Model3"]),oj=$t(["Provider1","Provider2","Provider3"]),aj=$t({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),Y={name:"ctx",type:"context"},gl={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},nt={name:"teamfile",type:"string"},Ci={name:"alias",type:"string"},jt={name:"prompt",type:"string"},Ni={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"alias",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"},{name:"sessiondir",type:"string"},{name:"sessionid",type:"string"}]},Oi=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],Kn={name:"options",type:"map",optional:!0,keys:Oi},Hf={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},Bf={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},Xf={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},Yn={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},xi={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0},{name:"sessiondir",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"}]},Ck=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"}],qf={name:"options",type:"map",optional:!0,keys:Ck},Jf={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},Nk=$t([{name:"resolveProfilePath",implemented:!0,params:[Y,gl],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[Y,gl],statuses:["ok","error"],results:{error:"string|null",profile:"{path,raw,config}",values:"{Provider1..3,Model1..3,Directory,NonInteractive}",path:"string?",line:"number?",column:"number?"},effects:["file-read"],summary:"Read and validate the complete init profile without discovery or writes."},{name:"profileValues",implemented:!0,params:[{name:"config",type:"map"}],statuses:["ok","error"],results:{error:"string|null",Provider1:"string",Provider2:"string",Provider3:"string",Model1:"string",Model2:"string",Model3:"string"},effects:[],summary:"Validate and map slots to first-model environment values."},{name:"readPrompts",implemented:!0,params:[Y,{name:"path",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"single",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",prompts:"string[]"},effects:["file-read"],summary:"Read prompt records without exiting the caller.",scriptBinding:{name:"lm_read_prompts",params:[{name:"batchfile",type:"string"},{name:"single",type:"boolean",optional:!0}]}},{name:"listMembers",implemented:!0,params:[Y,nt],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[nt]}},{name:"resolveMember",implemented:!0,params:[Y,nt,Ci],statuses:["ok","not_found","error"],results:{error:"string|null",member:"Member",isLead:"boolean",teamfile:"string"},effects:["file-read","db"],summary:"Resolve a team member with an explicit missing outcome.",scriptBinding:{name:"lm_member",params:[nt,Ci]}},{name:"lintTeam",implemented:!0,params:[Y,nt],statuses:["ok","error"],results:{error:"string|null",errors:"list",warnings:"list",counts:"map"},effects:["file-read","db"],summary:"Return structured lint findings.",scriptBinding:{name:"lm_lint",params:[nt]}},{name:"seedTeam",implemented:!0,params:[Y,nt,Hf],statuses:["ok","error"],results:{error:"string|null",seeded:"SeededMember[]"},effects:["provider","db","file-write"],summary:"Seed a team with explicit optional preambles.",scriptBinding:{name:"lm_seed",params:[nt,Hf]}},{name:"promptAgent",implemented:!0,params:[Y,Ni,jt,Kn],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...Jf,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[Ni,jt,Kn]}},{name:"promptMember",implemented:!0,params:[Y,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"prompt",type:"string",required:!0},{name:"messageType",type:"string"},...Oi]}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn a team member through native team admission.",scriptBinding:{name:"lm_prompt",params:[nt,Ci,jt,{name:"options",type:"map",optional:!0,keys:[...Oi,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[Y,{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"workspace",type:"string"},{name:"all",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",sessions:"Session[]"},effects:["file-read"],summary:"List native sessions in an explicit workspace.",scriptBinding:{name:"lm_session_list",params:[{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"sessiondir",type:"string"},{name:"all",type:"boolean"}]}]}},{name:"deleteSession",implemented:!0,params:[Y,Yn,Xf],statuses:["deleted","not_found","busy","error"],results:{error:"string|null"},effects:["provider","file-write"],summary:"Delete a session only with explicit force admission.",scriptBinding:{name:"lm_session_delete",params:[Ni,{...Xf,optional:!0}]}},{name:"getSession",implemented:!0,params:[Y,Yn],statuses:["ok","not_found","error"],results:{error:"string|null",messages:"{role,content}[]"},effects:["provider","file-read"],summary:"Read native session messages.",scriptBinding:{name:"lm_session_get",params:[Yn]}},{name:"reserveSession",implemented:!0,params:[Y,Yn],statuses:["ok","busy","error"],results:{error:"string|null",reservation:"SessionReservation"},effects:[],summary:"Reserve context-local handoff admission and return a capability."},{name:"releaseSession",implemented:!0,params:[Y,Yn,{name:"reservation",type:"SessionReservation",optional:!0}],statuses:["ok","error"],results:{error:"string|null"},effects:[],summary:"Release context-local handoff admission; an optional capability makes owned cleanup idempotent and replacement-safe."},{name:"openTeamBatch",returnsResource:!0,implemented:!0,params:[Y,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"label",type:"string",required:!0},{name:"promptCount",type:"number",required:!0},{name:"legacy",type:"boolean"},...Oi]}],statuses:["ok","busy","error"],results:{error:"string|null",batch:"opaque context-bound BatchRef"},effects:["provider","db"],summary:"Open a managed team batch; member-map composition remains language-owned."},{name:"batchTurn",implemented:!0,params:[Y,{name:"batch",type:"BatchRef"},jt,{name:"index",type:"number"},{name:"total",type:"number"}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn an owned live batch reference."},{name:"closeBatch",implemented:!0,params:[Y,{name:"batch",type:"BatchRef"},{name:"options",type:"map",keys:[{name:"status",type:"string",required:!0,values:["done","error","cancelled"]},{name:"error",type:"string"}]}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close an owned batch."},{name:"readRatelimits",implemented:!0,params:[Y,Bf],statuses:["ok","error"],results:{error:"string|null",readings:"list"},effects:["file-read","network"],summary:"Read provider rate-limit data.",scriptBinding:{name:"lm_ratelimit_readings",params:[Bf]}},{name:"openTerminal",implemented:!0,params:[Y,{name:"target",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0}]},{name:"streams",type:"map",keys:[{name:"stdin",type:"stream",required:!0},{name:"stdout",type:"stream",required:!0},{name:"stderr",type:"stream",required:!0}]}],statuses:["ok","error"],results:{error:"string|null",code:"number|null",signal:"string|null"},effects:["provider","db","tty"],summary:"Open a native terminal with caller-supplied streams.",scriptBinding:{name:"lm_terminal",params:[nt,Ci]}},{name:"sessionAdmission",implemented:!0,params:[Y,Yn],statuses:["ok","busy","error"],results:{error:"string|null",busyReason:"turn|handoff?"},effects:[],summary:"Query context-local session admission without exposing mutable sets."},{name:"promptReservedAgent",implemented:!0,params:[Y,{name:"reservation",type:"SessionReservation"},Ni,jt,Kn],statuses:["ok","busy","stalled","empty","error"],results:{...Jf,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[Y,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Synchronously release one batch on a close deadline without cancelling unrelated batches."},{name:"inspectBatch",implemented:!0,params:[Y,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null",id:"string",closed:"boolean",member:"Member",rootId:"number|null"},effects:[],summary:"Read batch metadata without exposing native transports or lease capabilities."},{name:"openNativeSession",returnsResource:!0,implemented:!0,params:[Y,{name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0},{name:"sessiondir",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"}]},Kn],statuses:["ok","busy","error"],results:{error:"string|null",session:"opaque context-bound NativeSessionRef"},effects:["provider","db","file-read"],summary:"Open a script-owned native conversation with existing receiver admission."},{name:"nativeSessionTurn",implemented:!0,params:[Y,{name:"session",type:"NativeSessionRef"},jt],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Record one unframed conversational turn through the existing recorder."},{name:"closeNativeSession",implemented:!0,params:[Y,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close a script-owned native conversation and release its lease."},{name:"finalizeNativeSessionSync",implemented:!0,params:[Y,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Critical synchronous native conversation lease release."},{name:"nativeSessionRequest",implemented:!0,params:[Y,xi,jt,Kn],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null",code:"ErrorCode?"},effects:["provider","db"],summary:"Send one stateless turn to a detached native-session holder, starting one when absent.",scriptBinding:{name:"lm_session_turn",params:[xi,jt,Kn]}},{name:"nativeSessionClose",implemented:!0,params:[Y,xi],statuses:["ok","busy","error"],results:{error:"string|null",code:"ErrorCode?"},effects:["provider","db"],summary:"Close an idle detached native-session holder; an absent holder is already closed.",scriptBinding:{name:"lm_session_close",params:[xi]}},{name:"loadProperties",implemented:!0,params:[Y,gl],statuses:["ok","error"],results:{error:"string|null",path:"string",properties:"map",flat:"map",line:"number?",column:"number?"},effects:["file-read"],summary:"Read the complete hierarchical init.toml properties document through the canonical reader."},{name:"listRunning",implemented:!0,params:[Y,qf],statuses:["ok","error"],results:{error:"string|null",running:"RunningRow[]",dead:"DeadRow[]",idle:"IdleRow[]"},effects:["db"],summary:"DB-wide view of tracked invocation activity. Observation only; dispatch and branch on status busy, never gate on this.",scriptBinding:{name:"lm_running",params:[qf]}}]);function Li(t){if(!Vc(t))return ee("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return ee("cancelled","Context is closed")}function Gf(t,e){let n=r=>s=>{e?.(s,r),r==="stderr"&&s.startsWith("warning:")?t.onWarning(s):t.onProgress(s,r)};return{cwd:t.cwd,env:{...t.env,LMCTL_DB:t.dbPath},dal:t.dal,stdout:{write:n("stdout")},stderr:{write:n("stderr")}}}import{readFileSync as Ok,writeFileSync as yj,renameSync as Tj,existsSync as Lk}from"node:fs";import{basename as Dk,resolve as Pi,dirname as _l}from"node:path";var Di=["title","description","members"],xk=new Set(Di),rt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}};function Vf(t){if(t.length===0||!t.startsWith("---"))throw new rt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1824
|
-
`);if(e[0]!=="---")throw new
|
|
1825
|
-
`);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=
|
|
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(!
|
|
1827
|
-
allowed keys: ${
|
|
1828
|
-
`)}){let r=
|
|
1829
|
-
Known aliases: ${o}`,"not_found")}if(i.teamfile!==void 0){let o=
|
|
1830
|
-
Run: lmctl seed ${t}`);return{teamfile:r,alias:i.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir??ng(r),isLead:vl(s)?.alias===i.alias,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{}}}import{hostname as tI,networkInterfaces as Xj}from"node:os";var nI=12e4;function rI(t=process.env){return sI(t.LMCTL_TERMINAL_LOCK_STALE_MS,nI)}function Il(t,e={}){let n=e.now??new Date,r=e.localHost??tI(),s=e.staleMs??rI();if(t.holder_host===r)return(e.isProcessAlive??iI)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.last_heartbeat);return Number.isFinite(i)?n.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Xr(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function sI(t,e){if(t===void 0||t.trim()==="")return e;let n=t.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?e:r}function iI(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}import{openSync as vI,closeSync as wI,fstatSync as SI,readSync as bI,constants as yg}from"node:fs";import{dirname as RI,join as Ui}from"node:path";import{createHash as kI}from"node:crypto";var EI=Zl(Nl(),1);function Wt(t){let e=t.env?.LMCTL_DB;return e!==void 0&&e.length>0?e:Pn(void 0,{...process.env,...t.env})}async function oe(t,e){if(t.dal!==void 0)return e(t.dal);let n=Ct({path:Wt(t)});try{return await e(n)}finally{n.close()}}function _g(t){if(t===void 0)return null;let e=Number.parseInt(t,10);return Number.isInteger(e)&&e>0?e:null}var gg=!1;function hg(t){if(t.stdout!==process.stdout||gg)return;gg=!0;let e=n=>{throw n.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),n};process.stdout.on("error",e)}var qr={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null};var Sg=t=>t.record_id??t.source+":"+t.source_model_id,Tg=t=>t===null||typeof t=="number"&&Number.isFinite(t)&&t>=0;function Ll(t){if(!zt(t.catalog)||!Qt(t.aliases)||!t.sha256||!/^[a-f0-9]{64}$/.test(t.sha256))throw Error("invalid or incomplete price snapshot (catalog, aliases and SHA-256 required)");if(!["network","cache","bundled","pinned"].includes(t.source)||t.generatedAt!==null&&typeof t.generatedAt!="string")throw Error("invalid price snapshot metadata");if(t.catalog.records.length>1e5||t.aliases.aliases.length>1e5||t.aliases.standards.length>1e5)throw Error("price snapshot exceeds the 100000-entry limit");let e=i=>{if(i.length>65536)throw Error("price identity exceeds the 65536-character limit")},n=new Set,r=new Set,s=new Set;for(let i of t.catalog.records){let o=Sg(i);if(!o||n.has(o))throw Error("duplicate or missing price record id");n.add(o),e(o),e(i.source),e(i.source_model_id);for(let u of[i.source,i.source_model_id])if(typeof u!="string"||!u.trim())throw Error("invalid price record identity");let a=i;for(let u of[i.provider,i.mode,i.gateway_id,i.record_id,a.vendor_model_id,a.canonical_slug])if(u!=null&&typeof u!="string")throw Error("invalid price record metadata");for(let u of[i.pricing.input_per_1m_tokens,i.pricing.output_per_1m_tokens,i.pricing.input_cache_read_per_1m_tokens,i.pricing.input_cache_write_per_1m_tokens??null])if(!Tg(u))throw Error("price rates must be finite nonnegative numbers or null");let l=i.pricing.source_cost_fields;if(l!=null&&(typeof l!="object"||Array.isArray(l)))throw Error("invalid source cost fields");for(let u of["cache_creation_input_token_cost","cache_creation_input_token_cost_above_1hr"])if(l?.[u]!==void 0&&!Tg(l[u]))throw Error("source blend rates must be finite nonnegative numbers or null");let d=i.pricing.currency;if(d!=null&&d!=="USD")throw Error("price currency must be USD")}for(let i of t.aliases.standards){e(i.standard_slug),i.catalog_record_id!==null&&e(i.catalog_record_id);let o=i.standard_slug.toLowerCase();if(!o||r.has(o))throw Error("duplicate price standard");r.add(o)}for(let i of t.aliases.aliases){e(i.alias),i.standard_slug!==null&&e(i.standard_slug);let o=i.alias.toLowerCase();if(!o||s.has(o))throw Error("duplicate price alias");if(s.add(o),i.standard_slug!==null&&!r.has(i.standard_slug.toLowerCase()))throw Error("price alias references missing standard")}}var II=64*1024*1024;function Eg(t){let e=vI(t,yg.O_RDONLY|yg.O_NONBLOCK);try{let n=SI(e);if(!n.isFile()||n.size>II)throw Error("price file must be a regular file within the 64 MiB size limit");let r=Buffer.alloc(n.size+1),s=0;for(;s<r.length;){let i=bI(e,r,s,r.length-s,null);if(i===0)break;s+=i}if(s!==n.size)throw Error("price file changed while reading; retry with a complete file");return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(r.subarray(0,s))}finally{wI(e)}}var vg=t=>JSON.parse(t.replace(/^\uFEFF/,""));function AI(t,e=Ui(RI(t),"aliases.json")){let n=Eg(t),r=Eg(e),s;try{s=vg(n)}catch{s=null}if(!s||!("records"in Object(s))){let a=n.trim().split(/\r?\n/).filter(d=>d.trim()).map(d=>JSON.parse(d)),l=a[0]?.schema_version!==void 0&&a[0]?.pricing===void 0&&a[0]?.source_model_id===void 0?a.shift():{};s={schema_version:l.schema_version??1,generated_at:l.generated_at??"",records:a}}let i=vg(r),o={catalog:s,aliases:i,source:"pinned",generatedAt:s?.generated_at||null,sha256:kI("sha256").update(n).update(r).digest("hex")};return Ll(o),o}function Ol(t){let e=t.pragma("busy_timeout",{simple:!0});try{return t.pragma("busy_timeout = 0"),t.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='price_snapshot'").get()?t.transaction(()=>{let n=t.prepare("SELECT * FROM price_snapshot").get();if(!n)return null;let r=t.prepare("SELECT * FROM price_record ORDER BY ordinal").all().map(o=>{if(typeof o.record_id!="string"||!o.record_id||o.currency!=="USD"||o.unit!=="per_1m_tokens")throw Error("invalid stored price identity, currency or unit");let a=JSON.parse(o.record_json);return{...a,record_id:o.record_id,pricing:{...a.pricing,input_per_1m_tokens:o.input_1m,output_per_1m_tokens:o.output_1m,input_cache_read_per_1m_tokens:o.cache_read_1m,input_cache_write_per_1m_tokens:o.cache_write_1m,source_cost_fields:JSON.parse(o.source_cost_fields??"{}")}}});if(r.length!==n.record_count)throw Error("incomplete stored price snapshot");let s=t.prepare("SELECT alias,standard_slug,evidence FROM price_alias ORDER BY alias").all(),i={catalog:{schema_version:1,generated_at:n.generated_at??"",records:r},aliases:{schema_version:1,standards:JSON.parse(n.standards_json),aliases:s},source:n.source,generatedAt:n.generated_at,sha256:n.sha256,fetchedAt:n.fetched_at,loadedAt:n.loaded_at,recordCount:n.record_count};return Ll(i),i})():null}finally{t.pragma("busy_timeout = "+e)}}function CI(t,e,n={}){Ll(e);let r=()=>t.prepare("SELECT sha256 FROM price_snapshot").get()?.sha256===e.sha256,s=t.pragma("busy_timeout",{simple:!0});try{return t.pragma("busy_timeout = 0"),r()?"unchanged":t.transaction(()=>{if(r())return"unchanged";t.exec("DELETE FROM price_alias; DELETE FROM price_record; DELETE FROM price_snapshot;");let i=t.prepare("INSERT INTO price_record(record_id,source,provider,source_model_id,vendor_model_id,canonical_slug,currency,unit,input_1m,output_1m,cache_read_1m,cache_write_1m,source_cost_fields,record_json,ordinal) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");e.catalog.records.forEach((d,u)=>{let c=d;i.run(Sg(d),d.source,d.provider??null,d.source_model_id,c.vendor_model_id??null,c.canonical_slug??null,"USD","per_1m_tokens",d.pricing.input_per_1m_tokens,d.pricing.output_per_1m_tokens,d.pricing.input_cache_read_per_1m_tokens,d.pricing.input_cache_write_per_1m_tokens??null,JSON.stringify(d.pricing.source_cost_fields??{}),JSON.stringify(d),u)});let o=t.prepare("INSERT INTO price_alias(alias,standard_slug,evidence,catalog_record_id) VALUES(?,?,?,?)"),a=new Map(e.aliases.standards.map(d=>[d.standard_slug.toLowerCase(),d]));for(let d of e.aliases.aliases){let u=a.get(d.standard_slug?.toLowerCase()??"");o.run(d.alias.toLowerCase(),d.standard_slug,d.evidence,u?.catalog_record_id??null)}let l=new Date(n.now??Date.now()).toISOString();return t.prepare("INSERT INTO price_snapshot(sha256,generated_at,source,fetched_at,loaded_at,record_count,standards_json) VALUES(?,?,?,?,?,?,?)").run(e.sha256,e.generatedAt,e.source,l,l,e.catalog.records.length,JSON.stringify(e.aliases.standards)),"updated"}).immediate()}catch(i){if(/^SQLITE_(BUSY|LOCKED|READONLY)(_|$)/.test(String(i?.code)))return"deferred";throw i}finally{t.pragma("busy_timeout = "+s)}}var xl=new WeakMap;async function NI(t,e={}){let n=e.now??Date.now(),r={...process.env,...e.env},s=Ol(t),i=xl.get(t),o=i&&i.hash===s?.sha256?i.at:Date.parse(s?.fetchedAt??"");if(!e.force&&s&&n>=o&&n-o<ys(r))return{status:"unchanged",snapshot:s};let a=e.load??(()=>r.LMCTL_PRICE_DATA?Promise.resolve(AI(Ui(r.LMCTL_PRICE_DATA,"model_list.json"))):Pu({cacheDir:r.LMCTL_HOME?Ui(r.LMCTL_HOME,"cache","lmprice"):r.HOME?Ui(r.HOME,".lmctl","cache","lmprice"):void 0,ttlMs:e.force?0:ys(r)})),l,d;try{d=await(e.budgetMs===void 0?a():Promise.race([a(),new Promise(m=>{l=setTimeout(()=>m(null),e.budgetMs)})]))}finally{clearTimeout(l)}if(xl.set(t,{hash:s?.sha256??null,at:n}),!d?.catalog||!d.aliases||!d.sha256||d.refreshFailed&&(s||d.source!=="bundled"))return{status:"unavailable",snapshot:s};let u=CI(t,d,{now:n}),c=Ol(t);return xl.set(t,{hash:c?.sha256??null,at:n}),{status:u,snapshot:c}}async function wg(t,e){try{return(await NI(t,{env:e,budgetMs:900})).snapshot??qr}catch(n){if(/^SQLITE_(BUSY|LOCKED)(_|$)/.test(String(n?.code)))return qr;try{return Ol(t)??qr}catch{return qr}}}async function Dl(t){if(t.dal)return wg(t.dal.db,t.env);let e;try{return e=Ct({path:Wt(t),recover:!1}),await wg(e.db,t.env)}catch{return qr}finally{try{e?.close()}catch{}}}import{existsSync as xI,mkdirSync as OI,readFileSync as LI,renameSync as DI,unlinkSync as PI,writeFileSync as MI}from"node:fs";import{homedir as Rg}from"node:os";import{dirname as Jr,join as Ae,resolve as UI}from"node:path";var Fi="lmctl",ji="lmctl0",FI={existsSync:xI,mkdirSync:OI,readFileSync:LI,writeFileSync:MI,renameSync:DI,unlinkSync:PI},Je=FI,Pl;function kg(t,e,n){let r=Jr(UI(n)),s=new Set,i=new Map;for(let o of e.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??r,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())it(Ae(o,".mcp.json"),"mcpServers",[Ht(),Bt()]),a.has("opencode")&&it(Ae(o,".opencode","opencode.json"),"mcp",[Ig(),Ag()]),a.has("kimi")&&it(Ae(o,".kimi-code","mcp.json"),"mcpServers",[Ht(),Bt()]);for(let o of s)HI(o)}function jI(t=Pl??Rg()){return Ae(t,".copilot","mcp-config.json")}function $I(t,e){Je.mkdirSync(Jr(t),{recursive:!0});let n=Ae(Jr(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Je.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
1831
|
-
`,"utf8"),
|
|
1832
|
-
`)),
|
|
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)=>tt(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"]),sj=Xt({status:"string",error:"string|null",code:"ErrorCode?"}),ij=Xt(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),oj=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"]),aj=Xt(["Provider1","Provider2","Provider3"]),lj=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 Tj,renameSync as Ej,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 xj,openSync as Oj,readFileSync as Kk,statSync as Yk,unlinkSync as Lj,writeFileSync as Dj}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 qj}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=Ze({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=Ze({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")&<(Ce(o,".opencode","opencode.json"),"mcp",[Ag(),Cg()]),a.has("kimi")&<(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
1833
|
FROM tracked_invocation
|
|
1834
1834
|
WHERE target_teamfile = ?
|
|
1835
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
|
|
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 T$=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
1837
|
The session marker may be stale or the team may not be registered in this lmctl database.
|
|
1838
|
-
Consulted ${
|
|
1839
|
-
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function
|
|
1840
|
-
`)}function yA(t){return`${t.teamfile}:${t.alias}`}var t_=256*1024,i_=3e4;async function o_(t){let e=t.onEvent??(()=>{}),n=TA(t.io,e),r=null,s=null,i=null,o,a,l=null,d=!1,u=null,c=t.prompt,m;try{let p=t.resolvedNativeTarget,f=p!==void 0;if(f&&(t.heldLease===void 0||t.conversation===void 0))throw new be("native session turns require a caller-held lease and conversation");let g=f?p:await oe(n,k=>pn(t.teamfile,t.alias,k));if(t.expectedSession!==void 0&&(g.provider!==t.expectedSession.provider||g.sessionid!==t.expectedSession.sessionid))throw new be(`session changed for ${g.alias}; expected ${t.expectedSession.provider}:${t.expectedSession.sessionid}, found ${g.provider}:${g.sessionid}`);if(f&&(t.conversation.provider!==g.provider||t.conversation.sessionId!==g.sessionid))throw new be("native session changed for "+g.alias+"; expected "+g.provider+":"+g.sessionid+", found "+t.conversation.provider+":"+t.conversation.sessionId);let _=g.teamfile,h=await oe(n,k=>NA(k,t.env??process.env)),E=h.sender,y=f?"native:"+g.provider+":"+g.sessionid:await xA(n,{explicitRoot:t.rootFlag,sender:E,receiverTeamfile:_,operatorOrigin:h.origin==="operator"}),T=t.env??process.env;if(!f){let k=await oe(n,x=>x.getRootTeam(y)?.name??null);k!==null&&(T.LMBEE_TEAM_NAME=k)}i=await SA(n,{receiverTeamfile:_,receiverAlias:g.alias,sender:E,rootTeamfile:y,provider:g.provider,model:g.model,sessionId:g.sessionid,cwd:g.sessiondir,prompt:t.prompt,origin:h.origin,parentInvocationId:_g(T.LMCTL_INVOCATION_ID)}),o=IA(n,i),i!==null&&(T.LMCTL_INVOCATION_ID=String(i));try{f||kg(n,Tl(_),_)}catch{}r={root_teamfile:y,sender_teamfile:E?.teamfile??null,sender_alias:E?.alias??null,receiver_teamfile:_,receiver_alias:g.alias,receiver_provider:g.provider,receiver_session_id:g.sessionid,origin:h.origin,message_type:t.messageType??null};let v=await l_(n,_,g.alias);if(v!==null){let k=Xr(v);return gn(i,r,t.prompt,k,"unavailable"),u=Wl(k,null),{status:"busy",message:k,teamChatLogId:null}}let b=!1;if(t.heldLease!==void 0){let k=t.heldLease;if(!await oe(n,P=>{let L=P.getAgentInflight(_,g.alias);return L===null||L.sender_teamfile!==k.row.sender_teamfile||L.sender_alias!==k.row.sender_alias||L.started_at!==k.row.started_at||L.holder_pid!==process.pid?!1:P.heartbeatAgentInflight(k.row,k.leaseId,new Date().toISOString())})){let P=`bundle lease lost for ${g.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return gn(i,r,t.prompt,P,"unavailable"),u=Gr(P,null),{status:"error",errorKind:"provider",message:P,teamChatLogId:null,messageId:null}}}else{let k=await EA(n,_,g.alias);if(k.busy){let x=await vA(n,_,g.alias);return x+=await wA(n,_,g.alias),gn(i,r,t.prompt,x,"unavailable"),u=Wl(x,null),{status:"busy",message:x,teamChatLogId:null}}b=k.idleReclaim}if(E!==null&&E.teamfile!==_){let k=await oe(n,x=>$g(x,{root:y,sender:E,receiverTeamfile:_,receiverAlias:g.alias,now:new Date}));if(k.stop){let x=Hg(k.chain);return gn(i,r,t.prompt,x,"cycle"),u=Gr(x,null),{status:"error",errorKind:"cycle",message:x,teamChatLogId:null,messageId:null}}}if(t.heldLease===void 0){let k=await OA(n,{receiver_teamfile:_,receiver_alias:g.alias,sender_teamfile:E?.teamfile??_,sender_alias:E?.alias??"operator",...b?{force:!0,reclaimReason:"session-idle"}:{}});if(!k.acquired){let x=d_(_,g.alias,k.current);return x+=` ${$l(jl({holderPid:k.current.holder_pid,since:k.current.started_at}))}`,gn(i,r,t.prompt,x,"unavailable"),u=Wl(x,null),{status:"busy",message:x,teamChatLogId:null}}s={row:k.lease,leaseId:k.leaseId},t.onInflightAcquired?.(s),a=ks(x=>oe(n,P=>P.heartbeatAgentInflight(s.row,s.leaseId,x)),{intervalMs:i_,onError:x=>{ue()&&We(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:x instanceof Error?x.message:String(x)}))}})}if(t.signal?.aborted)throw Error("Chat turn cancelled");m=zu({provider:g.provider,modelRequested:g.model??null,cwd:g.sessiondir,sessionId:g.sessionid}),r&&(r.started_at=m.startedAt);let S=await e_({sender:E??{teamfile:_,alias:"operator"},receiver:{teamfile:_,alias:g.alias,provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir,...g.model!==void 0?{model:g.model}:{},...g.effort!==void 0?{effort:g.effort}:{},...g.isLead!==void 0?{isLead:g.isLead}:{}},signal:t.signal,newMessage:t.prompt,newMessageFrom:E===null?"operator":`${E.teamfile}:${E.alias}`,...f?{literalPrompt:!0}:{},io:n,permissionMode:t.permissionMode,...t.expectedSession!==void 0?{requireResume:!0}:{},...t.bundleSession!==void 0?{bundleSession:t.bundleSession}:{},...t.conversation!==void 0?{bundleSession:t.conversation}:{},...t.registry!==void 0?{registry:t.registry}:{},env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:k=>e({kind:"delta",chunk:k}),onProgress:k=>e({kind:"progress",alias:g.alias,event:k}),onPromptBuilt:async k=>{c=k,l===null&&(l=await DA(n,{...r,message:k,usage:m}),l!==null&&(t.onAccepted?.(dt(l)),i!==null&&await kA(n,i,l))),i!==null&&await RA(n,i,k)}});c=S.prompt;let R=S.status==="stalled",O=S.status==="empty",N=null,A=R?`provider stalled${S.stalledAfterMs!==void 0?` after ${S.stalledAfterMs}ms`:""}`:O?"provider returned no content and no observed activity for this turn -- often an upstream failure (rate limit, quota, auth) the provider did not report as an error":S.status==="error"?S.error??S.receipt:null,w=R||O||S.status==="error"?"error":"ok",I=await xo(m,{status:S.status,sessionId:S.sessionId,usage:S.usage},()=>Dl(n),{db:n.dal?.db,dbPath:Wt(n),env:n.env});l!==null?(await r_(n,l,{...r,message:c,response:S.receipt,status:w,error_detail:A,usage:I}),d=!0,N=l):N=await s_(n,{...r,message:c,response:S.receipt,status:w,error_detail:A,usage:I});let C=S.status!=="error"?S.warnings:void 0;if(R||O){let k=A;gn(i,r,c,k,"error"),u=Gr(k,N,S.receipt,C)}else u=AA(S.receipt,N,C);return{status:R?"stalled":O?"empty":"ok",replyText:S.receipt,wroteDelta:S.wroteDelta,teamChatLogId:N,messageId:N===null?null:dt(N),durationMs:S.durationMs}}catch(p){let f=p instanceof Error?p.message:String(p),g=p,_=m?await xo(m,{status:Qu(f,!!t.signal?.aborted),usage:g?.usage,sessionId:g?.sessionId},()=>Dl(n),{db:n.dal?.db,dbPath:Wt(n),env:n.env}):void 0;return l!==null&&!d&&r!==null&&(await r_(n,l,{...r,message:c,response:null,status:"error",error_detail:f,usage:_}),d=!0),l===null&&r!==null&&_&&(l=await s_(n,{...r,message:c,response:null,status:"error",error_detail:f,usage:_})),gn(i,r,c,f,"error"),u=Gr(f,l),{status:"error",errorKind:p instanceof be?"target":"provider",message:f,teamChatLogId:l,messageId:l===null?null:dt(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await PA(n,r,dt(l)),s!==null&&await LA(n,s.row,s.leaseId)&&t.onInflightReleased?.(s.leaseId),i!==null&&await bA(n,i,u??Gr("chat turn exited without a terminal outcome",null))}}function TA(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function EA(t,e,n){let r=await oe(t,i=>(Xg(i,e,n),Tr(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await oe(t,i=>Kg(i,r,e,n));return{busy:!s,idleReclaim:s}}async function vA(t,e,n){let r=await l_(t,e,n);if(r!==null)return Xr(r);let s=await oe(t,i=>i.getAgentInflight(e,n));return s!==null?d_(e,n,s):`${n} is busy; wait and retry`}async function wA(t,e,n){let r=await oe(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${$l(jl({holderPid:r.holder_pid,since:r.started_at}))}`}async function SA(t,e){try{return(await oe(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:CA(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return ue()&&We(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function bA(t,e,n){try{await oe(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){ue()&&We(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function RA(t,e,n){try{await oe(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){ue()&&We(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function kA(t,e,n){try{await oe(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){ue()&&We(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function IA(t,e){if(e===null)return;let n=setInterval(()=>{oe(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{ue()&&We(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},i_);return n.unref?.(),n}function a_(t){return t!==void 0&&t.length>0?{config_warnings:JSON.stringify(t)}:{}}function AA(t,e,n){return{status:"done",result_summary:Hi(t),error:null,team_chat_log_id:e,...a_(n)}}function Wl(t,e){return{status:"busy",result_summary:Hi(t),error:t,team_chat_log_id:e}}function Gr(t,e,n,r){return{status:"error",result_summary:n===void 0?sm(t,500):Hi(n),error:t,team_chat_log_id:e,...a_(r)}}function Hi(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function CA(t,e,n){return`lmctl prompt ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function NA(t,e){let n=Qg(e,t);if(n.ok)return{sender:Zg(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(zg("chat",e,t))}async function xA(t,e){if(e.explicitRoot!==void 0)return await oe(t,r=>ft(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await oe(t,r=>Wg(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function OA(t,e){return await oe(t,n=>{let r=ue(),s=Is(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:Wi(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&We(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:n_(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&We(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:n_(s.current)})),{acquired:!1,current:s.current})})}async function l_(t,e,n){return await oe(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(Il(o).live)return o;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:Il(s).live?s:null})}function n_(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function LA(t,e,n){try{return await oe(t,r=>r.releaseAgentInflight(e,n))}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
|
|
1841
|
-
`)}return!1}function d_(t,e,n){return`${e} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function DA(t,e){let n=Vr(e.message);try{return await oe(t,r=>r.beginTeamChatLog({usage:e.usage,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,message_type:e.message_type??null,created_at:e.started_at??new Date().toISOString()}))}catch(r){return t.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
|
|
1842
|
-
`)
|
|
1843
|
-
`)}}async function
|
|
1844
|
-
`)}}async function
|
|
1845
|
-
`)
|
|
1846
|
-
`)}})
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
`))},
|
|
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 j$=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=Ze({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??Ze({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 IW,existsSync as AW,lstatSync as $A,mkdirSync as WA,openSync as CW,readFileSync as NW,rmSync as xW,writeFileSync as OW}from"node:fs";import{createHash as __,randomUUID as DW}from"node:crypto";import{tmpdir as HA}from"node:os";import{join as h_,resolve as UW}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)+`
|
|
1850
1851
|
`),process.exitCode=1});
|