@lmctl-ai/lmctl 0.2.454 → 0.2.455

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -1380,7 +1380,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
1380
1380
  status, started_at, last_heartbeat_at, last_seq)
1381
1381
  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,o),eh(e)&&cb(t,o,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function Ed(t,e){let n=Zs(e.id),r=fb(t,n);return r===null?!1:(Vt(t,{stream_id:n,event_type:Rj,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
1382
1382
  SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
1383
- 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}`);eh(e)&&ub(t,s,n)}),!0)}function pb(t,e,n,r){let s=Zs(e.id),o=fb(t,s);return o===null?!1:(Vt(t,{stream_id:s,event_type:Lj,observedLastSeq:o.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},i=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,i,s,o.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function hb(t,e,n){let r=Zs(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),eh(e)&&db(t,r,n)}function _b(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Zs(e))}function gb(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Zs(e))}var xj,Rj,Lj,yb=C(()=>{"use strict";ud();wd();xj="INVOCATION_START",Rj="INVOCATION_FINISH",Lj="INVOCATION_NOTIFY_CLAIM"});var Cj,Oj,IZ,wb,Eb,Tb,vb=C(()=>{"use strict";Cj="other",Oj=["not_enough_information","dont_know","other_work"],IZ=new Set([Cj,...Oj]),wb="@abort",Eb="invalid_decision",Tb="workflow_escalation"});import{randomUUID as Sb}from"node:crypto";import{existsSync as Ab,mkdirSync as Dj,renameSync as Mj,rmdirSync as $j}from"node:fs";import{hostname as th}from"node:os";function nh(t){return t.provider_resolved??t.provider}function ee(){return new Date().toISOString()}function Pj(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!Ab(t))return e;let n;try{n=new Ln(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 Uj(t){if(t===":memory:"||!Ab(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{Mj(r,`${e}${n}`)}catch{}}return e}function bb(t,e){let n=e instanceof Error?e.message:String(e);try{let r=Pj(t),s=Uj(t),o=new Zo(Ma({dbPath:t}));for(let i of r.rootTeams)o.upsertRootTeam(i);for(let{key:i,value:a}of r.config)o.setConfig(i,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${Cn} (${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}.
1383
+ 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}`);eh(e)&&ub(t,s,n)}),!0)}function pb(t,e,n,r){let s=Zs(e.id),o=fb(t,s);return o===null?!1:(Vt(t,{stream_id:s,event_type:Lj,observedLastSeq:o.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},i=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,i,s,o.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function hb(t,e,n){let r=Zs(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),eh(e)&&db(t,r,n)}function _b(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Zs(e))}function gb(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Zs(e))}var xj,Rj,Lj,yb=C(()=>{"use strict";ud();wd();xj="INVOCATION_START",Rj="INVOCATION_FINISH",Lj="INVOCATION_NOTIFY_CLAIM"});var Cj,Oj,bZ,wb,Eb,Tb,vb=C(()=>{"use strict";Cj="other",Oj=["not_enough_information","dont_know","other_work"],bZ=new Set([Cj,...Oj]),wb="@abort",Eb="invalid_decision",Tb="workflow_escalation"});import{randomUUID as Sb}from"node:crypto";import{existsSync as Ab,mkdirSync as Dj,renameSync as Mj,rmdirSync as $j}from"node:fs";import{hostname as th}from"node:os";function nh(t){return t.provider_resolved??t.provider}function ee(){return new Date().toISOString()}function Pj(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!Ab(t))return e;let n;try{n=new Ln(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 Uj(t){if(t===":memory:"||!Ab(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{Mj(r,`${e}${n}`)}catch{}}return e}function bb(t,e){let n=e instanceof Error?e.message:String(e);try{let r=Pj(t),s=Uj(t),o=new Zo(Ma({dbPath:t}));for(let i of r.rootTeams)o.upsertRootTeam(i);for(let{key:i,value:a}of r.config)o.setConfig(i,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${Cn} (${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}.
1384
1384
  `:`
1385
1385
  `)),o}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 Td(t,e,n=!1){let r;try{return r=Ma({dbPath:t,allowSchemaSkew:e,readonly:n}),{dal:new Zo(r)}}catch(s){if(s instanceof On)throw s;let o;if(r!==void 0)try{o=r.pragma("user_version",{simple:!0})}catch{}try{r?.close()}catch{}return{cause:s,dbVersion:o}}}function Hj(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function Bj(t){if(t===":memory:")return!0;try{return Dj(`${t}${Nb}`),!0}catch{return!1}}function Xj(t){if(t!==":memory:")try{$j(`${t}${Nb}`)}catch{}}function Ye(t){let e=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1";if(t.readonly){let s=Td(t.path,e,!0);if(s.dal)return s.dal;throw s.cause}if(t.recover===!1){let s=Td(t.path,e);if(s.dal)return s.dal;throw s.cause}let n={};for(let s=0;s<Fj;s+=1)if(n=Td(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>Cn){let s=n.cause instanceof Error?n.cause.message:String(n.cause);throw new On(t.path,n.dbVersion,Cn,s)}for(let s=0;s<jj;s+=1){if(Bj(t.path))try{return bb(t.path,n.cause)}finally{Xj(t.path)}Hj(Wj);let o=Td(t.path,e);if(o.dal!==void 0)return o.dal}return bb(t.path,n.cause)}function Ib(t,e,n){let r=kb(e);if(r.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return kb(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let d of i(l))a(d)}finally{o.pop()}s.add(l)}};a(t)}function kb(t){let e=qj(t),n=e===null?null:Gj(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))vd(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function qj(t){try{let e=JSON.parse(t);return vd(e)?e:null}catch{return null}}function Gj(t,e){let n=t[e];return vd(n)?n:null}function vd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Jj(t){try{let e=JSON.parse(t);return!vd(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 Vj(t,e){return t===null?!0:t.holder_host===th()?!$t(t.holder_pid):t.last_heartbeat<e}function Kj(t){return{getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
1386
1386
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
@@ -1823,11 +1823,11 @@ ${PW(t,LW,"provider output not saved")}
1823
1823
  \u2026 ${s} characters of provider stderr dropped \u2026
1824
1824
  ${r}`}}}function ni(t,e){return e===""?t:`${t}:${e.includes(`
1825
1825
  `)?`
1826
- `:" "}${e}`}var RW,LW,CW,OW,DW,MW,sn=C(()=>{"use strict";Id();RW=500,LW=1e6,CW=50,OW=20*1024*1024,DW=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,MW=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi});import{readFileSync as rI,appendFileSync as BW,mkdirSync as XW,existsSync as cee,readdirSync as dee,unlinkSync as uee}from"node:fs";import{join as Nd,dirname as qW}from"node:path";import{homedir as GW}from"node:os";function dh(){return Nd(GW(),".lmctl")}function uh(){ri=!0,process.env.LMCTL_DEBUG="1"}function sI(){return{cliDebug:ri,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function oI(t){ri=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function $e(){if(ri||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-nI>=JW&&(tI=YW(),nI=t),tI}function Ga(){return ri||process.env.LMCTL_DEBUG==="1"}function VW(){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}`)}function ch(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 qa(t);if(Array.isArray(t))return t.map(r=>ch(r,"",n));if(t&&typeof t=="object"){if(n.has(t))return"[Circular]";n.add(t);let r={};for(let[s,o]of Object.entries(t))r[s]=ch(o,s,n);return n.delete(t),r}return t}function KW(t){return ch(t)}function Et(t,e){if(e?.verbose){if(!ri)return}else if(!e?.always&&!$e())return;try{zW();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,...KW(t)};BW(Ad,JSON.stringify(n)+`
1826
+ `:" "}${e}`}var RW,LW,CW,OW,DW,MW,sn=C(()=>{"use strict";Id();RW=500,LW=1e6,CW=50,OW=20*1024*1024,DW=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,MW=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi});import{readFileSync as rI,appendFileSync as BW,mkdirSync as XW,existsSync as lee,readdirSync as cee,unlinkSync as dee}from"node:fs";import{join as Nd,dirname as qW}from"node:path";import{homedir as GW}from"node:os";function dh(){return Nd(GW(),".lmctl")}function uh(){ri=!0,process.env.LMCTL_DEBUG="1"}function sI(){return{cliDebug:ri,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function oI(t){ri=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function $e(){if(ri||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-nI>=JW&&(tI=YW(),nI=t),tI}function Ga(){return ri||process.env.LMCTL_DEBUG==="1"}function VW(){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}`)}function ch(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 qa(t);if(Array.isArray(t))return t.map(r=>ch(r,"",n));if(t&&typeof t=="object"){if(n.has(t))return"[Circular]";n.add(t);let r={};for(let[s,o]of Object.entries(t))r[s]=ch(o,s,n);return n.delete(t),r}return t}function KW(t){return ch(t)}function Et(t,e){if(e?.verbose){if(!ri)return}else if(!e?.always&&!$e())return;try{zW();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,...KW(t)};BW(Ad,JSON.stringify(n)+`
1827
1827
  `)}catch{}}function zW(){if(!Ad){let e=VW().slice(0,13).replace("T","-");Ad=Nd(dh(),`debug-${e}.log`)}XW(qW(Ad),{recursive:!0})}function At(...t){Et({event:"legacy",msg:t.join(" ")})}function pt(...t){Et({event:"legacy",msg:t.join(" ")},{verbose:!0})}function B(t){Et(t,{always:!0})}function YW(){return QW()||ZW()}function QW(){try{let t=rI(Nd(dh(),"config.toml"),"utf-8");for(let e of t.split(`
1828
1828
  `)){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 ZW(){try{let t=rI(Nd(dh(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var ri,tI,nI,JW,Ad,Ee=C(()=>{"use strict";sn();ri=!1,tI=!1,nI=0,JW=5e3;Ad=null});function yH(t,e){if(!e||t.includes(e))return!1;let n=0;for(let r of t.split(`
1829
1829
  `))/^\s{2,}\S.*\([A-Za-z]+\)\s*$/.test(r)&&n++;return n>=3}function Ir(t,e={}){if(typeof t!="string"||t==="")return e.status==="busy"?{class:"receiver_busy",rule:"status-busy"}:e.status==="empty"?{class:"upstream_undisclosed",rule:"status-empty"}:e.status==="stalled"?{class:"transport_interrupted",rule:"status-stalled"}:{class:"unknown",rule:null};for(let n of wH)if(n.test(t,e))return{class:n.class,rule:n.rule};return{class:"unknown",rule:null}}var vn,wH,xd=C(()=>{"use strict";vn=t=>e=>t.test(e);wH=[{rule:"self-session-unregistered",class:"self_session_unregistered",test:vn(/LMCTL_SELF_SESSIONID is set but does not match any member of a registered team\b/i)},{rule:"usage-limit",class:"quota_exhausted",test:vn(/usage limit|out of usage credits|quota (has been )?(reached|exhausted)|Insufficient Balance/i)},{rule:"spawn-enoent",class:"binary_missing",test:vn(/spawn \S+ ENOENT/i)},{rule:"auth-message",class:"auth_required",test:vn(/Unauthorized|Incorrect API key|invalid api key|not logged in|Authentication required|login required/i)},{rule:"no-content-no-activity",class:"upstream_undisclosed",test:vn(/no content and no observed activity/i)},{rule:"throttled",class:"upstream_throttled",test:vn(/rate.?limit|too many requests|at capacity|(?:\bhttp\b[^\n]{0,20}|\bstatus(?: code)?\W{0,3}|\berror\W{0,3}|\bcode\W{0,3})429\b/i)},{rule:"connection-interrupted",class:"transport_interrupted",test:vn(/connection to the agent was interrupted|stalled for \d+s|provider stalled after/i)},{rule:"context-window",class:"context_exhausted",test:vn(/ran out of room in the model's context window|context (length|window) (exceeded|full)/i)},{rule:"receiver-held",class:"receiver_busy",test:vn(/is held by a terminal|is servicing /i)},{rule:"holder-dead",class:"holder_died",test:vn(/holder process verified not alive|holder_pid confirmed dead|received SIGTERM/i)},{rule:"model-list",class:"model_not_offered",test:(t,e)=>yH(t,e.model)},{rule:"model-message",class:"model_not_offered",test:vn(/model is not supported|model .{0,60}(does not exist|not found|unavailable)|unknown model|invalid model/i)},{rule:"conversation-gone",class:"stale_session",test:vn(/No conversation found with session ID|conversation \S+ not found/i)}]});import{openSync as EH,closeSync as TH,fstatSync as vH,readSync as SH,constants as dI}from"node:fs";import{dirname as bH,join as Rd}from"node:path";import{createHash as IH}from"node:crypto";function ph(t){if(!qs(t.catalog)||!Gs(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=o=>{if(o.length>65536)throw Error("price identity exceeds the 65536-character limit")},n=new Set,r=new Set,s=new Set;for(let o of t.catalog.records){let i=pI(o);if(!i||n.has(i))throw Error("duplicate or missing price record id");n.add(i),e(i),e(o.source),e(o.source_model_id);for(let d of[o.source,o.source_model_id])if(typeof d!="string"||!d.trim())throw Error("invalid price record identity");let a=o;for(let d of[o.provider,o.mode,o.gateway_id,o.record_id,a.vendor_model_id,a.canonical_slug])if(d!=null&&typeof d!="string")throw Error("invalid price record metadata");for(let d of[o.pricing.input_per_1m_tokens,o.pricing.output_per_1m_tokens,o.pricing.input_cache_read_per_1m_tokens,o.pricing.input_cache_write_per_1m_tokens??null])if(!uI(d))throw Error("price rates must be finite nonnegative numbers or null");let l=o.pricing.source_cost_fields;if(l!=null&&(typeof l!="object"||Array.isArray(l)))throw Error("invalid source cost fields");for(let d of["cache_creation_input_token_cost","cache_creation_input_token_cost_above_1hr"])if(l?.[d]!==void 0&&!uI(l[d]))throw Error("source blend rates must be finite nonnegative numbers or null");let c=o.pricing.currency;if(c!=null&&c!=="USD")throw Error("price currency must be USD")}for(let o of t.aliases.standards){e(o.standard_slug),o.catalog_record_id!==null&&e(o.catalog_record_id);let i=o.standard_slug.toLowerCase();if(!i||r.has(i))throw Error("duplicate price standard");r.add(i)}for(let o of t.aliases.aliases){e(o.alias),o.standard_slug!==null&&e(o.standard_slug);let i=o.alias.toLowerCase();if(!i||s.has(i))throw Error("duplicate price alias");if(s.add(i),o.standard_slug!==null&&!r.has(o.standard_slug.toLowerCase()))throw Error("price alias references missing standard")}}function fI(t){let e=EH(t,dI.O_RDONLY|dI.O_NONBLOCK);try{let n=vH(e);if(!n.isFile()||n.size>kH)throw Error("price file must be a regular file within the 64 MiB size limit");let r=Buffer.alloc(n.size+1),s=0;for(;s<r.length;){let o=SH(e,r,s,r.length-s,null);if(o===0)break;s+=o}if(s!==n.size)throw Error("price file changed while reading; retry with a complete file");return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(r.subarray(0,s))}finally{TH(e)}}function hh(t,e=Rd(bH(t),"aliases.json")){let n=fI(t),r=fI(e),s;try{s=mI(n)}catch{s=null}if(!s||!("records"in Object(s))){let a=n.trim().split(/\r?\n/).filter(c=>c.trim()).map(c=>JSON.parse(c)),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 o=mI(r),i={catalog:s,aliases:o,source:"pinned",generatedAt:s?.generated_at||null,sha256:IH("sha256").update(n).update(r).digest("hex")};return ph(i),i}function si(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(i=>{if(typeof i.record_id!="string"||!i.record_id||i.currency!=="USD"||i.unit!=="per_1m_tokens")throw Error("invalid stored price identity, currency or unit");let a=JSON.parse(i.record_json);return{...a,record_id:i.record_id,pricing:{...a.pricing,input_per_1m_tokens:i.input_1m,output_per_1m_tokens:i.output_1m,input_cache_read_per_1m_tokens:i.cache_read_1m,input_cache_write_per_1m_tokens:i.cache_write_1m,source_cost_fields:JSON.parse(i.source_cost_fields??"{}")}}});if(r.length!==n.record_count)throw Error("incomplete stored price snapshot");let s=t.prepare("SELECT alias,standard_slug,evidence FROM price_alias ORDER BY alias").all(),o={catalog:{schema_version:1,generated_at:n.generated_at??"",records:r},aliases:{schema_version:1,standards:JSON.parse(n.standards_json),aliases:s},source:n.source,generatedAt:n.generated_at,sha256:n.sha256,fetchedAt:n.fetched_at,loadedAt:n.loaded_at,recordCount:n.record_count};return ph(o),o})():null}finally{t.pragma("busy_timeout = "+e)}}function _h(t,e,n={}){ph(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 o=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((c,d)=>{let u=c;o.run(pI(c),c.source,c.provider??null,c.source_model_id,u.vendor_model_id??null,u.canonical_slug??null,"USD","per_1m_tokens",c.pricing.input_per_1m_tokens,c.pricing.output_per_1m_tokens,c.pricing.input_cache_read_per_1m_tokens,c.pricing.input_cache_write_per_1m_tokens??null,JSON.stringify(c.pricing.source_cost_fields??{}),JSON.stringify(c),d)});let i=t.prepare("INSERT INTO price_alias(alias,standard_slug,evidence,catalog_record_id) VALUES(?,?,?,?)"),a=new Map(e.aliases.standards.map(c=>[c.standard_slug.toLowerCase(),c]));for(let c of e.aliases.aliases){let d=a.get(c.standard_slug?.toLowerCase()??"");i.run(c.alias.toLowerCase(),c.standard_slug,c.evidence,d?.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(o){if(/^SQLITE_(BUSY|LOCKED|READONLY)(_|$)/.test(String(o?.code)))return"deferred";throw o}finally{t.pragma("busy_timeout = "+s)}}async function gh(t,e={}){let n=e.now??Date.now(),r={...process.env,...e.env},s=si(t),o=mh.get(t),i=o&&o.hash===s?.sha256?o.at:Date.parse(s?.fetchedAt??"");if(!e.force&&s&&n>=i&&n-i<Js(r))return{status:"unchanged",snapshot:s};let a=e.load??(()=>r.LMCTL_PRICE_DATA?Promise.resolve(hh(Rd(r.LMCTL_PRICE_DATA,"model_list.json"))):Dt({cacheDir:r.LMCTL_HOME?Rd(r.LMCTL_HOME,"cache","lmprice"):r.HOME?Rd(r.HOME,".lmctl","cache","lmprice"):void 0,ttlMs:e.force?0:Js(r)})),l,c;try{c=await(e.budgetMs===void 0?a():Promise.race([a(),new Promise(f=>{l=setTimeout(()=>f(null),e.budgetMs)})]))}finally{clearTimeout(l)}if(mh.set(t,{hash:s?.sha256??null,at:n}),!c?.catalog||!c.aliases||!c.sha256||c.refreshFailed&&(s||c.source!=="bundled"))return{status:"unavailable",snapshot:s};let d=_h(t,c,{now:n}),u=si(t);return mh.set(t,{hash:u?.sha256??null,at:n}),{status:d,snapshot:u}}async function Ld(t,e){try{return(await gh(t,{env:e,budgetMs:900})).snapshot??Ja}catch(n){if(/^SQLITE_(BUSY|LOCKED)(_|$)/.test(String(n?.code)))return Ja;try{return si(t)??Ja}catch{return Ja}}}async function yh(t){if(t.dal)return Ld(t.dal.db,t.env);let e;try{return e=Ye({path:Pe(t),recover:!1}),await Ld(e.db,t.env)}catch{return Ja}finally{try{e?.close()}catch{}}}var Ja,pI,uI,kH,mI,mh,Cd=C(()=>{"use strict";_n();Pt();he();Ja={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null},pI=t=>t.record_id??t.source+":"+t.source_model_id,uI=t=>t===null||typeof t=="number"&&Number.isFinite(t)&&t>=0;kH=64*1024*1024;mI=t=>JSON.parse(t.replace(/^\uFEFF/,""));mh=new WeakMap});function kr(t){return t!=="gemini"}function Od(t){if(!kr(t))throw new Error(ds)}var ds,oi=C(()=>{"use strict";ds="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model."});function hI(t){if(t.length===0||!t.startsWith("---"))throw new zn("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1830
- `);if(e[0]!=="---")throw new zn("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){r=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new zn(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!AH.has(c))throw new zn(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Dd.join(", ")}`);n[c]=d}if(r===-1)throw new zn("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Dd)if(n[i]===void 0)throw new zn(`missing required frontmatter key "${i}" \u2014 required: ${Dd.join(", ")}`);let s=0;for(let i=0;i<=r;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=n.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:n.title,description:n.description,members:o,bodyOffset:s}}var Dd,AH,zn,_I=C(()=>{"use strict";Dd=["title","description","members"],AH=new Set(Dd),zn=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function no(t){return wh.has(t)}var wh,Va=C(()=>{"use strict";wh=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as NH,writeFileSync as $ee,renameSync as Pee,existsSync as yI}from"node:fs";import{basename as xH,resolve as ii,dirname as Eh}from"node:path";function RH(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],o=r[2]!==void 0?r[2]:r[3];e[s]=o}return e}function LH(t){return/^\s*_(?:MEMBER|AGENT)_\s+\S/.test(t)}function CH(t){return/^\s*_SESSION_\s+\S/.test(t)}function OH(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function st(t){return/\.(?:lmctl|lmc)$/i.test(t)}function Ka(t){return xH(t).replace(/\.(?:lmctl|lmc)$/i,"")}function Fe(t){let e=NH(t,"utf-8"),n=Eh(ii(t)),r=ai(e,Ka(t),{baseDir:n,sourcePath:ii(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=ii(n,s.sessiondir));return r}function ai(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
1830
+ `);if(e[0]!=="---")throw new zn("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){r=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new zn(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!AH.has(c))throw new zn(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Dd.join(", ")}`);n[c]=d}if(r===-1)throw new zn("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Dd)if(n[i]===void 0)throw new zn(`missing required frontmatter key "${i}" \u2014 required: ${Dd.join(", ")}`);let s=0;for(let i=0;i<=r;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=n.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:n.title,description:n.description,members:o,bodyOffset:s}}var Dd,AH,zn,_I=C(()=>{"use strict";Dd=["title","description","members"],AH=new Set(Dd),zn=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function no(t){return wh.has(t)}var wh,Va=C(()=>{"use strict";wh=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as NH,writeFileSync as Mee,renameSync as $ee,existsSync as yI}from"node:fs";import{basename as xH,resolve as ii,dirname as Eh}from"node:path";function RH(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],o=r[2]!==void 0?r[2]:r[3];e[s]=o}return e}function LH(t){return/^\s*_(?:MEMBER|AGENT)_\s+\S/.test(t)}function CH(t){return/^\s*_SESSION_\s+\S/.test(t)}function OH(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function st(t){return/\.(?:lmctl|lmc)$/i.test(t)}function Ka(t){return xH(t).replace(/\.(?:lmctl|lmc)$/i,"")}function Fe(t){let e=NH(t,"utf-8"),n=Eh(ii(t)),r=ai(e,Ka(t),{baseDir:n,sourcePath:ii(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=ii(n,s.sessiondir));return r}function ai(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
1831
1831
  `);o=l>=0?o.slice(l+1):""}let i=null;if(o.startsWith("---"))try{i=hI(o)}catch(l){if(l instanceof zn)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
1832
1832
  `);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(CH(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(OH(c)||!LH(c))continue;let u=RH(c);for(let m of Object.keys(u))if(!gI.includes(m))throw new Error(`line ${d}: unknown key "${m}" on _MEMBER_ line: ${c.trim()}
1833
1833
  allowed keys: ${gI.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}if(!u.alias){s.push(`line ${d}: member line missing required alias: ${c.trim()}`);continue}let f={alias:u.alias,provider:u.provider||"",extra:{}};u.sessionid&&(f.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(f.sessiondir=u.sessiondir),u.teamfile&&(f.teamfile=u.teamfile),u.model&&(f.model=u.model),u.effort&&(f.effort=u.effort),r.push(f)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:i}}function za(t,e){let n=[];for(let o of t.parseErrors)n.push({field:"session",message:o});let r=t.members.filter(o=>o.alias.toLowerCase()===Th.toLowerCase());r.length>1&&n.push({field:Th,message:`${r.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&n.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?ii(e,o.teamfile):ii(o.teamfile);if(!yI(a))n.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Fe(a),c=li(l);c?c.session||n.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else wh.has(o.provider)?kr(o.provider)||n.push({field:o.alias,message:ds}):n.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&n.push({field:o.alias,message:"sessiondir is empty"})}return n}function li(t){return t.members.find(e=>e.alias.toLowerCase()===Th.toLowerCase())}function vh(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=ii(e,t.teamfile),i=n??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!yI(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Fe(o),l=li(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return vh(l,Eh(o),i,r);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Eh(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Md(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var Th,gI,Tt=C(()=>{"use strict";oi();_I();Va();Th="Lead";gI=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as DH}from"node:crypto";import{existsSync as wI,readFileSync as EI,realpathSync as MH}from"node:fs";import{dirname as $H,resolve as TI}from"node:path";function Qe(t,e){let n=TI(t);if(wI(n))return MH(n);if(e!==void 0){let r=UH(t,n,e);if(r!==null)return r}return n}function Pd(t,e){let n=$H(e),r=ai(t,Ka(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=TI(n,s.sessiondir));return r}function Yn(t,e,n=r=>{process.stderr.write(`warning: ${r}
@@ -1846,7 +1846,7 @@ ${r}`}}}function ni(t,e){return e===""?t:`${t}:${e.includes(`
1846
1846
  AND status = 'running'`,e,n),s=0;for(let o of r)Lh(t,o)!==null&&(s+=1);return s}var qd=C(()=>{"use strict";Nt();Pt();En()});function Gd(t,e,n){return kr(t)&&e.tools[t]?.agent===void 0&&n.includes(t)}async function Nr(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 ui(`session identity mismatch: expected "${n}", got "${t.sessionId}"`);let o=await t.sendTurn(r,s);if(o.sessionId!==n)throw Object.assign(new ui(`session identity mismatch: expected "${n}", got "${o.sessionId}"`),{usage:o.usage,sessionId:o.sessionId});return{...o,...o.text===""&&o.sawActivity===!1?{status:"empty"}:{}}}async function Jd(t,e){Od(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 o=s?await t.openSession(e):void 0,i=!n&&e.sessionId==="";if(o&&(o.provider!==t.name||typeof o.sessionId!="string"||!o.sessionId.trim()||!i&&o.sessionId!==e.sessionId))throw await o.close(),new Error(`session identity mismatch opening ${t.name}: expected "${e.sessionId}", got "${o.sessionId}" (${o.provider})`);let a=o?.sessionId??e.sessionId,l=0,c=!1,d,u;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(f,m={}){if(c)throw new Error("conversation is closed");if(d)throw new Error("conversation already has an active turn");if(m.signal?.aborted)throw new Error("Aborted");let p=new AbortController;d=p;let _=()=>p.abort();m.signal?.addEventListener("abort",_,{once:!0});try{let h=o?await Nr(o,t.name,a,f,{...m,signal:p.signal}):await t.sendTurn(f,{...e,...m,signal:p.signal,requireResume:n,timeoutMs:e.timeoutMs??0});if(p.signal.aborted)throw Object.assign(new Error("Aborted"),{usage:h.usage,sessionId:h.sessionId});if(n&&h.sessionId!==e.sessionId)throw c=!0,Object.assign(new ui(`session identity mismatch: expected "${e.sessionId}", got "${h.sessionId}"`),{usage:h.usage,sessionId:h.sessionId});return h.status!=="empty"&&h.status!=="stalled"&&l++,h}catch(h){throw p.signal.aborted&&o&&t.protocol?.persistentCancellation==="session"&&(c=!0),h instanceof ui&&(c=!0,await o?.close()),h}finally{m.signal?.removeEventListener("abort",_),d=void 0}},close(){return u||(c=!0,d?.abort(),u=o?o.close():Promise.resolve()),u}}}var ui,fi=C(()=>{"use strict";oi();ui=class extends Error{}});import{realpathSync as AB}from"node:fs";import{resolve as NB}from"node:path";function Ch(t){let e=NB(t);try{return AB(e)}catch{return e}}var JI=C(()=>{"use strict"});import{platform as VI}from"node:os";function mi(t){let e=new el;for(let n of t)e.registerAdapter(n);return e}var el,Oh=C(()=>{"use strict";JI();el=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(r.map(i=>i.discoverSessions()));for(let i of s)n.push(...i);let o=n;if(e?.workspace){let i=Ch(e.workspace);o=o.filter(a=>Ch(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let o=await s.loadSession(e);if(o)return o}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(o=>o.name===n):this.providers,s=[];for(let o of r){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=VI()==="darwin"||VI()==="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 Ph(){return new Mh}function Uh(t){let e=!1;for(let n of t.split(`
1847
1847
  `)){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 Fh(t){let e=t.trimEnd().split(`
1848
1848
  `).at(-1)?.trimStart()??"";if(!e.startsWith("{"))return!1;try{return JSON.parse(e),!1}catch{return!0}}function KI(t){let e,n=!1,r=!1,s;for(let o of t.split(`
1849
- `)){let i;try{i=JSON.parse(o)}catch{continue}if(i.type==="thread.started"&&typeof i.thread_id=="string"&&(e=i.thread_id),i.type==="turn.started"&&(n=!0),i.type!=="turn.completed"||!n||r)continue;r=!0;let a=i.usage;if(!a)continue;let l=jt(a.input_tokens),c=jt(a.cached_input_tokens);s={source:"wire",inputUncached:l===null||c===null||c>l?null:l-c,cacheRead:c,cacheWrite:0,output:jt(a.output_tokens),reasoning:jt(a.reasoning_output_tokens),modelReported:typeof i.model=="string"?i.model:null,providerCostUsd:null,reason:null,invalidCounters:Gn([a.input_tokens,a.cached_input_tokens,a.output_tokens,a.reasoning_output_tokens])||l!==null&&c!==null&&c>l},[s.inputUncached,s.cacheRead,s.output].includes(null)&&(s.reason="counter_not_exposed")}return(Fh(t)||Uh(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}}var jt,xB,Dh,Mh,$h,jh=C(()=>{"use strict";Ra();jt=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,xB=(t,e)=>t===null||e===null?null:jt(t+e),Dh=(t,e)=>JSON.stringify([t,e]),Mh=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(Dh(e,n))}turn(e,n=""){return new $h(this,e,n)}};$h=class{session;thread;id;value;ended=!1;reported=new Set;constructor(e,n,r){this.session=e,this.thread=n,this.id=r}bind(e){return typeof e!="string"||!e||this.ended||this.session.finished.has(Dh(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,o=r?.turnId??s?.id,i=typeof r?.threadId=="string"?r.threadId:this.thread;if(this.thread&&i!==this.thread||(this.thread||(this.thread=i),typeof o=="string"&&this.session.finished.has(Dh(i,o))))return!1;if(n==="turn/started")return this.bind(o);if(this.id&&o&&o!==this.id)return!1;if(n==="turn/completed")return this.id?!this.ended:this.bind(o);if(n!=="thread/tokenUsage/updated")return!0;if(this.ended||!this.id||r?.threadId!==this.thread||r?.turnId!==this.id)return!1;let a=r.tokenUsage;if(!a?.last||typeof a.last!="object"||Array.isArray(a.last)||[a.last.inputTokens,a.last.cachedInputTokens,a.last.outputTokens].every(T=>T==null))return!0;let l=T=>["inputTokens","cachedInputTokens","cacheWriteInputTokens","outputTokens","reasoningOutputTokens","totalTokens"].map(v=>T[v]??null),c=a.total&&["inputTokens","cachedInputTokens","outputTokens"].every(T=>jt(a.total[T])!==null)?l(a.total):null,d=typeof e.id=="string"&&e.id.length>0||typeof e.id=="number"&&Number.isSafeInteger(e.id)?e.id:null,u=jt(e.emittedAtMs)??d,f=jt(e.ordinal)??jt(r.ordinal),m=JSON.stringify([this.thread,this.id,c,l(a.last),u,d,f]),p=u!==null||f!==null;if(p&&this.session.seen.has(m))return!1;p&&this.session.seen.add(m);let _=a.last,h=jt(_.inputTokens),g=jt(_.cachedInputTokens),y={source:"wire",inputUncached:h===null||g===null||g>h?null:h-g,cacheRead:g,cacheWrite:jt(_.cacheWriteInputTokens??0),output:jt(_.outputTokens),reasoning:jt(_.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:Gn([_.inputTokens,_.cachedInputTokens,_.cacheWriteInputTokens,_.outputTokens,_.reasoningOutputTokens])||h!==null&&g!==null&&g>h};[y.inputUncached,y.cacheRead,y.cacheWrite,y.output].includes(null)&&(y.reason="counter_not_exposed");let E=r.model??_.model;if(typeof E=="string"&&E&&E!=="<synthetic>"&&this.reported.add(E),!this.value)this.value=y;else{for(let T of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let v=this.value[T],b=y[T];v!==null&&b!==null&&jt(v+b)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[T]=xB(this.value[T],y[T])}this.value.reason=this.value.reason||y.reason,this.value.invalidCounters||=y.invalidCounters}return!0}usage(){if(this.value)return{...this.value,modelReported:this.reported.size>1?null:[...this.reported][0]??this.session.models.get(this.thread)??null,mixedModels:this.reported.size>1}}finish(){this.ended=!0,this.id&&this.session.remember(this.thread,this.id)}}});import{readFileSync as RB,writeFileSync as Ite,mkdirSync as kte}from"node:fs";import{join as LB,dirname as Nte}from"node:path";import{homedir as CB}from"node:os";function DB(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function MB(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=DB(t.slice(e+1).trim());return n?{key:n,value:r}:null}function $B(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function Vd(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function PB(){return LB(CB(),".lmctl","config.toml")}function Kd(t){let e=t??PB(),n;try{n=RB(e,"utf-8")}catch{return{tools:{}}}return UB(n)}function zI(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 UB(t){let e={},n={},r=t.split(`
1849
+ `)){let i;try{i=JSON.parse(o)}catch{continue}if(i.type==="thread.started"&&typeof i.thread_id=="string"&&(e=i.thread_id),i.type==="turn.started"&&(n=!0),i.type!=="turn.completed"||!n||r)continue;r=!0;let a=i.usage;if(!a)continue;let l=jt(a.input_tokens),c=jt(a.cached_input_tokens);s={source:"wire",inputUncached:l===null||c===null||c>l?null:l-c,cacheRead:c,cacheWrite:0,output:jt(a.output_tokens),reasoning:jt(a.reasoning_output_tokens),modelReported:typeof i.model=="string"?i.model:null,providerCostUsd:null,reason:null,invalidCounters:Gn([a.input_tokens,a.cached_input_tokens,a.output_tokens,a.reasoning_output_tokens])||l!==null&&c!==null&&c>l},[s.inputUncached,s.cacheRead,s.output].includes(null)&&(s.reason="counter_not_exposed")}return(Fh(t)||Uh(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}}var jt,xB,Dh,Mh,$h,jh=C(()=>{"use strict";Ra();jt=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,xB=(t,e)=>t===null||e===null?null:jt(t+e),Dh=(t,e)=>JSON.stringify([t,e]),Mh=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(Dh(e,n))}turn(e,n=""){return new $h(this,e,n)}};$h=class{session;thread;id;value;ended=!1;reported=new Set;constructor(e,n,r){this.session=e,this.thread=n,this.id=r}bind(e){return typeof e!="string"||!e||this.ended||this.session.finished.has(Dh(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,o=r?.turnId??s?.id,i=typeof r?.threadId=="string"?r.threadId:this.thread;if(this.thread&&i!==this.thread||(this.thread||(this.thread=i),typeof o=="string"&&this.session.finished.has(Dh(i,o))))return!1;if(n==="turn/started")return this.bind(o);if(this.id&&o&&o!==this.id)return!1;if(n==="turn/completed")return this.id?!this.ended:this.bind(o);if(n!=="thread/tokenUsage/updated")return!0;if(this.ended||!this.id||r?.threadId!==this.thread||r?.turnId!==this.id)return!1;let a=r.tokenUsage;if(!a?.last||typeof a.last!="object"||Array.isArray(a.last)||[a.last.inputTokens,a.last.cachedInputTokens,a.last.outputTokens].every(T=>T==null))return!0;let l=T=>["inputTokens","cachedInputTokens","cacheWriteInputTokens","outputTokens","reasoningOutputTokens","totalTokens"].map(v=>T[v]??null),c=a.total&&["inputTokens","cachedInputTokens","outputTokens"].every(T=>jt(a.total[T])!==null)?l(a.total):null,d=typeof e.id=="string"&&e.id.length>0||typeof e.id=="number"&&Number.isSafeInteger(e.id)?e.id:null,u=jt(e.emittedAtMs)??d,f=jt(e.ordinal)??jt(r.ordinal),m=JSON.stringify([this.thread,this.id,c,l(a.last),u,d,f]),p=u!==null||f!==null;if(p&&this.session.seen.has(m))return!1;p&&this.session.seen.add(m);let _=a.last,h=jt(_.inputTokens),g=jt(_.cachedInputTokens),y={source:"wire",inputUncached:h===null||g===null||g>h?null:h-g,cacheRead:g,cacheWrite:jt(_.cacheWriteInputTokens??0),output:jt(_.outputTokens),reasoning:jt(_.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:Gn([_.inputTokens,_.cachedInputTokens,_.cacheWriteInputTokens,_.outputTokens,_.reasoningOutputTokens])||h!==null&&g!==null&&g>h};[y.inputUncached,y.cacheRead,y.cacheWrite,y.output].includes(null)&&(y.reason="counter_not_exposed");let E=r.model??_.model;if(typeof E=="string"&&E&&E!=="<synthetic>"&&this.reported.add(E),!this.value)this.value=y;else{for(let T of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let v=this.value[T],b=y[T];v!==null&&b!==null&&jt(v+b)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[T]=xB(this.value[T],y[T])}this.value.reason=this.value.reason||y.reason,this.value.invalidCounters||=y.invalidCounters}return!0}usage(){if(this.value)return{...this.value,modelReported:this.reported.size>1?null:[...this.reported][0]??this.session.models.get(this.thread)??null,mixedModels:this.reported.size>1}}finish(){this.ended=!0,this.id&&this.session.remember(this.thread,this.id)}}});import{readFileSync as RB,writeFileSync as bte,mkdirSync as Ite}from"node:fs";import{join as LB,dirname as Ate}from"node:path";import{homedir as CB}from"node:os";function DB(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function MB(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=DB(t.slice(e+1).trim());return n?{key:n,value:r}:null}function $B(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function Vd(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function PB(){return LB(CB(),".lmctl","config.toml")}function Kd(t){let e=t??PB(),n;try{n=RB(e,"utf-8")}catch{return{tools:{}}}return UB(n)}function zI(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 UB(t){let e={},n={},r=t.split(`
1850
1850
  `),s={kind:"none"},o={},i=!1,a={};function l(){if(s.kind==="tool"){let u=e[s.tool]??{};if(s.profile){let f=u.profiles?.[s.profile]??{};o.description&&(f.description=o.description),o.flags!==void 0&&(f.flags=o.flags),u.profiles||(u.profiles={}),u.profiles[s.profile]=f}else o.start&&(u.start=o.start),o.resume&&(u.resume=o.resume),o.agent&&(u.agent=o.agent),o.profile_flag!==void 0&&(u.profile_flag=o.profile_flag);e[s.tool]=u}else if(s.kind==="compact"){let u=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(o.min!==void 0){let f=zI(o.min);f!==null&&(u.min=f)}if(o.max!==void 0){let f=zI(o.max);f!==null&&(u.max=f)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=u):n.global=u}o={}}for(let u of r){let f=u.trim();if(!f||f.startsWith("#"))continue;let m=$B(f);if(m!==null){if(i=!0,l(),m.startsWith("tool.")){let _=".profile.",h=m.indexOf(_);h!==-1?s={kind:"tool",tool:m.slice(5,h),profile:m.slice(h+_.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=MB(f);p&&s.kind!=="none"?o[p.key]=p.value:p&&!i&&(a[p.key]=p.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let d=a.site_name;return d!==void 0&&d.length>0&&(c.site_name=d),c}function YI(t){return t.site_name??null}function FB(t,e,n){if(!n)return"";let r=t.tools[e]??Wh[e],s=r?.profiles?.[n]?.flags??Wh[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 QI(t,e){return!!t.tools[e]}function ZI(t,e,n,r,s){let o=t.tools[e]??Wh[e],i;if(o?.agent){let l=Vd(r);i=o.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=OB[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let d=c.map(Vd).join(" ");i=`printf '%s\\n' ${Vd(r)} | ${d}`}else i=c.map(Vd).join(" ")}let a=FB(t,e,s);return a&&(i+=" "+a),i}var Wh,OB,zd=C(()=>{"use strict";Wh={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:""}}}},OB={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 ek(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 tk=C(()=>{"use strict"});function Qd(t){let e=t?.prompt??ue;if(t?.teamfile!==void 0){let n=t.teamfileContent??"";e=`${ue}${rk}${t.teamfile}:
1851
1851
  ${n}${Bh}${JSON.stringify(t.teamfile)}${Xh}`}return t?.flightToken&&(e=`${t.flightToken.startsWith("[lmctl-seed:")?t.flightToken:`[lmctl-seed:${t.flightToken}]`}
1852
1852
  ${e}`),e}function nk(t){let e=t.trim(),n=e.match(/^\[lmctl-seed:[0-9a-zA-Z_-]+\](?:\r?\n|\s+)/);if(n&&(e=e.slice(n[0].length).trim()),e===ue)return!0;let r=`${ue}${rk}`;if(!e.startsWith(r)||!e.endsWith(Xh))return!1;let s=e.slice(r.length),o=s.slice(0,-Xh.length),i=o.lastIndexOf(Bh);if(i===-1)return!1;let a=o.slice(i+Bh.length),l;try{if(l=JSON.parse(a),typeof l!="string")return!1}catch{return!1}let c=`${l}:
@@ -1948,10 +1948,9 @@ ${He(m,{provider:"dsh"})}`:"(no output captured)")))},wA);s.stdout?.on("data",m=
1948
1948
  LIMIT ?`).all(IA,this.discoverLimit),r=[];for(let s of n){let o=this.previewTexts(e,s.id);r.push({provider:this.name,sessionId:s.id,slug:Kt(s.title),cwd:AA(s),createdAt:Sl(s.started_at),modifiedAt:Sl(s.last_activity_at??s.started_at),model:Kt(s.model),startCommand:this.name,firstUserMessage:o.first,lastUserMessage:o.last,messageCount:s.message_count??0,filePath:this.dbPath,...NA(s)})}return r}catch(n){return B({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)),o=`id, session_id, role, content, tool_call_id, tool_calls, tool_name,
1949
1949
  timestamp, finish_reason${["_compressed_summary","display_kind"].filter(a=>r.has(a)).map(a=>`, ${a}`).join("")}`,i="WHERE session_id = ? AND role IN ('user', 'assistant', 'tool')";try{return e.prepare(`SELECT ${o} FROM messages ${i} AND active = 1 ORDER BY id ASC`).all(n)}catch(a){if(!/no such column/i.test(a instanceof Error?a.message:String(a)))throw a;return e.prepare(`SELECT ${o} FROM messages ${i} ORDER BY id ASC`).all(n)}}previewTexts(e,n){try{let[r,s]=["ASC","DESC"].map(o=>{let i=`SELECT content FROM messages WHERE session_id = ?
1950
1950
  AND role = 'user' AND content != ''`,a;try{a=e.prepare(`${i} AND active = 1 ORDER BY id ${o} LIMIT 1`).get(n)}catch(l){if(!/no such column: active/i.test(String(l)))throw l;a=e.prepare(`${i} ORDER BY id ${o} LIMIT 1`).get(n)}return a?te(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),o=[],i=[],a,l;for(let c of s){let d=Sl(c.timestamp),u=c.content??"";if(c.role==="user"){u&&c._compressed_summary!==1&&c.display_kind!=="hidden"&&i.push(u),u.length>0&&(a||(a=te(u,80)),l=te(u,80)),o.push({role:"user",timestamp:d,content:u||"(empty)"});continue}if(c.role==="tool"){o.push({role:"tool_result",timestamp:d,content:u,toolCallId:Kt(c.tool_call_id),toolName:Kt(c.tool_name)});continue}u.length>0&&o.push({role:"assistant",timestamp:d,content:u,model:Kt(r.model),stopReason:Kt(c.finish_reason)});for(let f of Zq(c.tool_calls)){let m=eG(f.function?.arguments);o.push({role:"tool_use",timestamp:d,content:Kt(f.function?.name)??"tool_call",toolName:Kt(f.function?.name),toolCallId:Kt(f.call_id)??Kt(f.id),toolInput:typeof f.function?.arguments=="string"?f.function.arguments:JSON.stringify(f.function?.arguments??{}),toolInputData:hn(m)})}}return{provider:this.name,sessionId:r.id,slug:Kt(r.title),cwd:AA(r),createdAt:Sl(r.started_at),modifiedAt:Sl(r.last_activity_at??r.started_at),model:Kt(r.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:l,messageCount:r.message_count??o.length,filePath:this.dbPath,...NA(r),messages:o,userPrompts:i}}catch(r){return B({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}}});import{mkdir as tG}from"node:fs/promises";function rG(t){return nG.test(t)}function LA(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 sG}function Tg(t){return new Eg(t)}var nG,sG,Eg,vg=C(()=>{"use strict";xt();RA();Rr();ht();Ee();nG=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;sG="dont_ask";Eg=class extends ke{hermesProvider;hermesHome;constructor(e){let n=new ju(e);super({provider:n,protocol:{transport:"acp",perTurnCancellation:"process",persistentCancellation:"turn",persistentResume:!0},capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Hermes has no provider-side leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"hermes",seedArgs:[],resumeTemplate:"hermes --yolo --resume {{session_id}}",startTemplate:"hermes",transport:async(r,s)=>$n(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:LA(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=wg(e)}async openSession(e){return rr({...e,env:{...e.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:LA(e.permissionMode)})}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(e,n){await tG(e,{recursive:!0});let r=[];if(n?.effort){let o="hermes has no ACP-level effort surface";B({event:"hermes_effort_ignored",provider:this.name,effort:n.effort,reason:o}),r.push(`hermes seed ignored effort=${n.effort}: ${o}`)}let s;try{n?.signal?.throwIfAborted();try{n?.onDispatch?.()}catch{}s=await this.sendTurn(n?.prompt??ue,{sessionId:"",cwd:e,env:n?.env,signal:n?.signal,model:n?.model})}catch(o){return{success:!1,error:`hermes ACP seed failed: ${o instanceof Error?o.message:String(o)}`}}return rG(s.sessionId)?(r.push(...s.warnings??[]),{success:!0,sessionId:s.sessionId,usage:s.usage,...r.length>0?{warnings:r}:{}}):(B({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 CA,rm as oG,stat as iG}from"node:fs/promises";import{join as Sg}from"node:path";function bg(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 OA(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}var Wu,DA=C(()=>{"use strict";nt();Wu=class{name="pi";baseDir;constructor(e={}){this.baseDir=e.piDir||Sg(le,".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 CA(this.baseDir)}catch{return[]}let n=[];for(let r of e){let s=Sg(this.baseDir,r);try{if(!(await iG(s)).isDirectory())continue;for(let o of await CA(s))o.endsWith(".jsonl")&&n.push(Sg(s,o))}catch{}}return n}async readHeader(e){for await(let n of Ue(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 ze(e),s,o,i,a=0,l=0,c=0,d=0,u=0,f=0,m=0,p;for await(let _ of Ue(e)){if(_.type==="model_change"&&_.provider&&_.modelId){s=`${_.provider}/${_.modelId}`;continue}if(_.type!=="message"||!_.message)continue;let h=_.message;if(h.provider&&h.model&&(s=`${h.provider}/${h.model}`),h.role==="user"){let g=bg(h).trim();g&&(o||(o=te(g,80)),i=te(g,80)),a++}else if(h.role==="assistant"){a++;let g=h.usage;g&&(l+=g.input??0,c+=g.cacheRead??0,d+=g.cacheWrite??0,u+=g.output??0,f+=g.reasoning??0,m=g.input??0,p={inputTokens:g.input,cachedInputTokens:g.cacheRead,cacheWriteInputTokens:g.cacheWrite,outputTokens:g.output,reasoningOutputTokens:g.reasoning,totalTokens:g.totalTokens})}}return{provider:"pi",sessionId:n.id,cwd:n.cwd??"(unknown)",createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:s,startCommand:"pi",firstUserMessage:o,lastUserMessage:i,messageCount:a,filePath:e,totalInputTokens:l,totalCachedInputTokens:c,totalCacheWriteInputTokens:d,totalOutputTokens:u,totalReasoningOutputTokens:f,lastInputTokens:m,lastTokenUsage:p}}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=[],o=r.model;for await(let i of Ue(n)){if(i.type==="model_change"&&i.provider&&i.modelId){o=`${i.provider}/${i.modelId}`;continue}if(i.type!=="message"||!i.message)continue;let a=i.message;a.provider&&a.model&&(o=`${a.provider}/${a.model}`);let l=a.timestamp?new Date(a.timestamp):r.modifiedAt;if(a.role==="user")s.push({role:"user",timestamp:l,content:bg(a)});else if(a.role==="assistant"&&Array.isArray(a.content))for(let c of a.content)c.type==="text"&&c.text?s.push({role:"assistant",timestamp:l,content:c.text,model:o}):c.type==="thinking"&&c.thinking?s.push({role:"thinking",timestamp:l,content:c.thinking}):c.type==="toolCall"&&s.push({role:"tool_use",timestamp:l,content:OA(c.arguments),toolName:c.name??"tool",toolInput:OA(c.arguments),toolInputData:c.arguments,toolCallId:c.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:l,content:bg(a),toolName:a.toolName,toolCallId:a.toolCallId})}return{...r,model:o,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 oG(n,{force:!0}),!0):!1}}});function kg(t){return new Ig(t)}var Ig,aG,Ag=C(()=>{"use strict";DA();xt();ht();nr();sg();Ig=class extends ke{constructor(e){super({provider:new Wu(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",ue],resumeTemplate:"pi --session {{session_id}}",startTemplate:"pi",transport:aG})}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}`}}},aG=Mu({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)=>ct("pi",t,e.permissionMode??"yolo")})});import{createHash as lG}from"node:crypto";import{existsSync as cG,mkdirSync as xg,readFileSync as dG,renameSync as uG,rmdirSync as HA,statSync as fG,writeFileSync as mG}from"node:fs";import{dirname as Og,join as MA,resolve as Ng}from"node:path";function pG(t){return lG("sha256").update(t).digest("hex").slice(0,8)}function hG(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function _G(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 BA(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Hu(t){return Math.max(1,Math.ceil(t.length/4))}function bi(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return Ng(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?MA(Og(Ng(n)),".lmctl-claude-mock","sessions.json"):MA(Ng(t),".lmctl-claude-mock","sessions.json")}function $A(){return{schemaVersion:1,sessions:{}}}function bl(t){if(!cG(t))return $A();try{let e=JSON.parse(dG(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,o=Rg(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...o!==void 0?{defaultDelayMs:o}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return $A()}}function XA(t,e){xg(Og(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;mG(n,`${JSON.stringify(e,null,2)}
1951
- `,"utf8"),uG(n,t)}function wG(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function EG(t){let e=`${t}.lock`;xg(Og(t),{recursive:!0});let n=Date.now()+PA;for(;;)try{return xg(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-fG(e).mtimeMs>gG){try{HA(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${PA}ms: ${e}`);wG(yG)}}function TG(t){try{HA(t)}catch{}}function qA(t,e){let n=EG(t);try{return e()}finally{TG(n)}}function vG(t){return{...t,timestamp:t.timestamp.toISOString()}}function SG(t){return{...t,timestamp:new Date(t.timestamp)}}function bG(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(vG)}}function GA(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(SG)}}function Bu(t,e=process.cwd()){let n=Si.get(t);if(n!==void 0)return n;let s=bl(bi(e)).sessions[t];if(s===void 0)return;let o=GA(s);return Si.set(o.sessionId,o),o}function UA(t){Si.set(t.sessionId,t);let e=bi(t.cwd);qA(e,()=>{let n=bl(e);n.sessions[t.sessionId]=bG({...t,filePath:e}),XA(e,n)})}function IG(t,e=process.cwd()){let n=bi(e);return qA(n,()=>{let r=bl(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],XA(n,r)),s})}function kG(){let t=bl(bi()),e=Object.values(t.sessions).map(GA);for(let n of e)Si.set(n.sessionId,n);return e}function Rg(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function FA(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=Rg(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=Rg(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function jA(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function AG(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=FA(n[t]??n[BA(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let o=FA(r[s]);if(o!==void 0)return o}}}function WA(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}}}function Dg(){return new Cg}var Si,gG,yG,PA,Lg,Cg,Mg=C(()=>{"use strict";Si=new Map;gG=5e3,yG=15,PA=1e4;Lg=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of kG())e.set(n.sessionId,n);for(let n of Si.values())e.set(n.sessionId,n);return[...e.values()].map(WA)}async loadSession(e){let n=Bu(e);return n===void 0?null:{...WA(n),messages:n.messages.slice()}}async resolveSessionPath(e){return Bu(e)?.filePath??null}async deleteSession(e){let n=Si.delete(e),r=IG(e);return n||r}},Cg=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Lg;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=hG(_G(e,n)),s=`mock-${r}-${pG(`${e}:${r}`)}`,o=new Date,i=bi(e),a=Bu(s,e),l=n?.prompt??"ClaudeMock seed",c=Hu(l),d={sessionId:s,cwd:e,filePath:i,createdAt:a?.createdAt??o,modifiedAt:o,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:o,content:l}),d.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Hu("ACK: ClaudeMock seeded"),UA(d),{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=Bu(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let o=new Date,i=bl(bi(n.cwd)),a=AG(e,i),l=a?.delayMs??i.defaultDelayMs;if(a?.kind==="error")throw await jA(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${BA(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:c,model:n.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Hu(e),s.totalOutputTokens+=Hu(c),UA(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await jA(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Ss(t){let e=[Qh({museDataHome:t?.museDataHome}),T_({miniplayerHome:t?.miniplayerHome}),b_({claudeDir:t?.claudeDir}),x_({codexDir:t?.codexDir,codeDir:t?.codeDir}),D_({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),U_({copilotDir:t?.copilotDir}),W_({dbPaths:t?.opencodeDbPaths}),G_({kimiHome:t?.kimiHome}),K_({lmplayerDbPath:t?.lmplayerDbPath,lmplayerDbPaths:t?.lmplayerDbPaths}),Q_({qwenDir:t?.qwenDir}),ig({agyDir:t?.agyDir}),_g({dshHome:t?.dshHome}),Tg({hermesHome:t?.hermesHome}),kg({piDir:t?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Dg()),e}var $g=C(()=>{"use strict";Zh();Zh();v_();v_();I_();R_();M_();F_();H_();J_();z_();Z_();ag();gg();vg();Ag();Mg();I_();R_();M_();F_();H_();J_();z_();Z_();ag();gg();vg();Ag();Mg()});var JA,VA,KA=C(()=>{"use strict";JA=["claude","qwen","codex","dsh","miniplayer","muse","gemini","copilot","opencode","kimi","hermes"],VA=["agy","pi","lmplayer"]});var Fg={};ye(Fg,{BUNDLE_CAPABLE_PROVIDERS:()=>JA,BUNDLE_NEVER_CAPABLE_PROVIDERS:()=>VA,ProviderRegistry:()=>el,TransportConnectionError:()=>je,TransportError:()=>ps,TransportJsonError:()=>Zd,TransportProcessError:()=>Be,TransportRpcError:()=>nl,_resetDefaultRegistryForTests:()=>CG,bundleSupportedProviders:()=>kl,canUsePersistentSession:()=>Gd,chat:()=>Il,countTokens:()=>PG,createAdapterRegistry:()=>mi,createAllAdapters:()=>Ss,deleteSession:()=>$G,listSessions:()=>Ug,openBundleSession:()=>Pg,openConversation:()=>OG,seed:()=>DG});import{accessSync as NG,constants as xG,statSync as RG}from"node:fs";import{join as LG,delimiter as zA}from"node:path";function bs(){return Xu===null&&(Xu=mi(Ss())),Xu}function CG(){Xu=null}function qu(t,e){Od(e);let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function Il(t){let e=t.registry??bs(),n=qu(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 Jd(n,{...r,execution:"per-turn",requireResume:t.requireResume??!1}):void 0,o;try{o=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:o.text,...o.usage?{usage:o.usage}:{},sessionId:o.sessionId,durationMs:o.durationMs,stopReason:o.stopReason,numTurns:o.numTurns,status:o.status,stalledAfterMs:o.stalledAfterMs,...o.warnings!==void 0?{warnings:o.warnings}:{}}}function kl(t){return(t??bs()).getAllAdapters().filter(n=>kr(n.name)&&n.openSession!==void 0).map(n=>n.name)}async function Pg(t){let e=t.registry??bs(),n=qu(e,t.provider);if(n.openSession===void 0)throw new Error(`provider "${t.provider}" does not support bundle sessions in this version (supported: ${kl(e).join(", ")})`);return Jd(n,{...t,execution:"persistent"})}async function OG(t){return Jd(qu(t.registry??bs(),t.provider),t)}async function DG(t){let e=t.registry??bs(),n=qu(e,t.provider);if(n.seedBinary==="agy"){let d=t.env??process.env,u=d.PATH??d.Path??"/usr/bin:/bin",f=zA===";"?["",...(d.PATHEXT??".EXE;.CMD;.BAT").split(";")]:[""];if(!u.split(zA).some(p=>{try{return f.some(_=>{try{let h=LG(p||t.cwd,"agy"+_);return NG(h,xG.X_OK),RG(h).isFile()}catch{return!1}})}catch{return!1}}))return{success:!1,error:"Failed to spawn agy: executable not found on PATH",errorCode:"ENOENT"}}if(t.signal?.aborted)return{success:!1,error:"seed cancelled before dispatch",errorCode:"ABORT_ERR"};let r=await YA(e,t.provider,t.cwd);if(t.signal?.aborted)return{success:!1,error:"seed cancelled before dispatch",errorCode:"ABORT_ERR"};let s=await n.seed(t.cwd,{...t.env?{env:t.env}:{},...t.signal?{signal:t.signal}:{},onDispatch:t.onDispatch,model:t.model,effort:t.effort,prompt:t.prompt}),o;try{o=s.usage}catch{}let i={usage:o},a=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(s.success&&s.sessionId)return{success:!0,sessionId:s.sessionId,...a,...i};if(!s.success&&(s.errorCode==="ENOENT"||s.errorCode==="ABORT_ERR"))return{success:!1,error:s.error,errorCode:s.errorCode,sessionId:s.sessionId,...a,...i};let l=await YA(e,t.provider,t.cwd),c=MG(r,l);return s.success?c?{success:!0,sessionId:c,...a,...i}:{success:!0,...a,...i}:(c&&await n.delete?.(c).catch(()=>{}),{success:!1,error:s.error,errorCode:s.errorCode,sessionId:s.sessionId,...a,...i})}async function YA(t,e,n){let r=await t.listAll({provider:e,workspace:n}),s=new Map;for(let o of r)s.set(o.sessionId,o.modifiedAt);return s}function MG(t,e){let n=[];for(let r of e.keys())t.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function Ug(t={}){return(t.registry??bs()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function $G(t,e,n=bs()){return n.deleteSession(e,t)}async function PG(t){let n=await(t.registry??bs()).getSession(t.sessionId,t.provider);if(!n)throw new Error(`session "${t.sessionId}" not found`);let r=n.totalInputTokens??0,s=n.totalCachedInputTokens??0,o=n.totalCacheWriteInputTokens??0,i=n.totalOutputTokens??0,a=n.totalReasoningOutputTokens??0;return{provider:n.provider,sessionId:n.sessionId,input:r,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:r+s+o+i+a,lastTurn:n.lastTokenUsage}}var Xu,Cr=C(()=>{"use strict";fi();oi();Oh();$g();fi();Oh();$g();KA();hs();Xu=null});import{mkdirSync as UG,readFileSync as FG,renameSync as jG,writeFileSync as WG}from"node:fs";import{join as QA}from"node:path";function BG(t){let e=t.state;return{state:{kind:e.kind,...typeof e.alias=="string"?{alias:e.alias}:{},...typeof e.id=="string"?{id:e.id}:{},...Array.isArray(e.otherProviders)?{otherProviders:e.otherProviders.filter(n=>typeof n=="string")}:{}},offer:t.offer?{route:t.offer.route,source:t.offer.source,sourceModelId:t.offer.sourceModelId,provider:t.offer.provider,pricing:t.offer.pricing,estimated:t.offer.estimated}:null,provenance:t.provenance??null}}function Gu(t){let e=new Map;return{available:t.catalog!==null,source:t.source,generatedAt:t.generatedAt,resolve(n,r){let s=Al(n,r),o=e.get(s);return o||(o=BG(Mt(n,r,t.catalog,t.aliases)),e.set(s,o)),o}}}function XG(t){try{let e=JSON.parse(FG(t,"utf8"));return e&&e.v===ZA&&typeof e.key=="string"&&e.entries&&typeof e.entries=="object"?e:null}catch{return null}}function qG(t,e){try{UG(QA(t,".."),{recursive:!0});let n=`${t}.${process.pid}.tmp`;WG(n,JSON.stringify(e),{mode:384}),jG(n,t)}catch{}}async function eN(t,e={}){let n=e.env??process.env,r=e.loadSnapshot??(()=>Dt());if(n.LMCTL_COST_INDEX==="off")return Gu(await r());let s=e.indexPath??(n.LMCTL_COST_INDEX||QA(TS(),"cost-index.json")),o=Fp(n,e.now),i=o.fresh?XG(s):null,a=i&&i.key===o.key?i:null,l=[...new Map(t.map(([p,_])=>[Al(p,_),[p,_]])).values()];if(a&&a.source!=="unavailable"&&l.every(([p,_])=>a.entries[Al(p,_)])){let p=a.entries;return{available:!0,source:a.source,generatedAt:a.generatedAt,resolve:(_,h)=>p[Al(_,h)]??{state:{kind:"unavailable"},offer:null,provenance:null}}}let c=await r(),d=Gu(c),u=Fp(n,e.now),f=JSON.parse(u.key)[3],m=!!c.sha256&&(c.source==="pinned"&&u.key.startsWith('["pinned"')||(c.source==="cache"||c.source==="network")&&f===c.sha256);if(c.catalog!==null&&m){let p=a&&a.key===u.key?a.entries:i&&i.key===u.key?i.entries:{},_=Object.keys(p).length>=HG?{}:{...p};for(let[h,g]of l)_[Al(h,g)]=d.resolve(h,g);qG(s,{v:ZA,key:u.key,source:c.source,generatedAt:c.generatedAt,entries:_})}return d}var ZA,HG,Al,jg=C(()=>{"use strict";_n();is();ZA=1,HG=2e3,Al=(t,e)=>`${t}\0${e}`});function tN(t){let e=o=>t.reduce((i,a)=>Wg(i,a[o]),0),n=t.some(o=>o.cacheWrite5m!==void 0||o.cacheWrite1h!==void 0),r=t.some(o=>o.reasoning!==void 0),s=[...new Set(t.map(o=>o.model).filter(o=>!!o))];return{response_ids:t.map(o=>o.responseId).filter(o=>!!o),responses:t.length,model:s.length===1?s[0]:s.length?s.join(", "):null,input:e("input"),output:e("output"),cache_read:e("cacheRead"),cache_write:e("cacheWrite"),...n?{cache_write_5m:t.reduce((o,i)=>o+(i.cacheWrite5m??0),0),cache_write_1h:t.reduce((o,i)=>o+(i.cacheWrite1h??0),0)}:{},...r?{reasoning:t.reduce((o,i)=>Wg(o,i.reasoning??null),0)}:{}}}function JG(t,e,n,r){switch(n){case"unresolved":return`alias "${r.alias}" is deliberately unresolved in the lmprice alias table`;case"known-unpriced":return`"${r.id}" is a known model with no published price row`;case"unknown":return`model "${e}" not found in lmprice catalog for provider "${t}"`;case"wrong-provider":return`model "${e}" is not offered by provider "${t}" (found under: ${(r.otherProviders??[]).join(", ")})`;default:return`no lmprice catalog coverage for provider "${t}"`}}function VG(t,e,n){let r=[],s=null,o=null,i=!1,a=null;if(!e.model)s="the transcript does not name the model of this response";else if(!n.available)s="lmprice catalog unavailable";else{let f=n.resolve(t,e.model);f.offer?(a=f.offer.pricing,o=f.offer.route,i=f.offer.estimated):s=JG(t,e.model,f.state.kind,f.state)}let l=a?ss({input:e.input??0,output:e.output??0,cachedInput:e.cacheRead??0},a):null,c=(f,m)=>a?ss({input:0,output:0,cachedInput:0,cacheWrite:f+m,cacheWrite5m:f,cacheWrite1h:m},a).cacheWritePer1m:null,d=(f,m,p)=>({type:f,tokens:m,rate_per_mtok:p,usd:m===null||p===null?m===0?0:null:Ju(m*p/1e6)});if(r.push(d("input",e.input,l?.inputPer1m??null)),r.push(d("cache_read",e.cacheRead,l?.cacheReadPer1m??null)),e.cacheWrite5m!==void 0||e.cacheWrite1h!==void 0){let f=e.cacheWrite5m??0,m=e.cacheWrite1h??0;e.cacheWrite!==null&&f+m!==e.cacheWrite?(r.push(d("cache_write",e.cacheWrite,null)),s??="the 5m/1h cache-write split does not add up to the total"):((f||!m)&&r.push(d("cache_write_5m",f,c(f,0))),m&&r.push(d("cache_write_1h",m,c(0,m))))}else r.push(d("cache_write",e.cacheWrite,e.cacheWrite===null?null:c(e.cacheWrite,0)));r.push(d("output",e.output,l?.outputPer1m??null)),e.reasoning!==void 0&&r.push({type:"reasoning",tokens:e.reasoning,rate_per_mtok:l?.outputPer1m??null,usd:null,included_in:"output"});for(let f of r)if(!f.included_in){if(f.tokens===null){s??=`the transcript does not record ${f.type.replace(/_/g," ")} tokens`;continue}f.usd===null&&(s??=`no ${f.type.replace(/_/g," ")} price for "${e.model}"`)}let u=s?null:Ju(r.reduce((f,m)=>f+(m.included_in?0:m.usd??0),0));return{lines:r,total:u,reason:s,route:o,estimated:i}}function nN(t,e,n){let r=GG(n),s=e.map(c=>VG(t,c,r)),o=new Map;for(let c of s)for(let d of c.lines){let u=o.get(d.type);if(!u){o.set(d.type,{...d});continue}u.tokens=Wg(u.tokens,d.tokens),u.usd=d.included_in||u.usd===null||d.usd===null?null:Ju(u.usd+d.usd),u.rate_per_mtok!==d.rate_per_mtok&&(u.rate_per_mtok=null)}let i=s.find(c=>c.reason)?.reason??null,a=[...new Set(e.map(c=>c.model).filter(c=>!!c))],l=[...new Set(s.map(c=>c.route).filter(c=>!!c))];return{total:i?null:Ju(s.reduce((c,d)=>c+(d.total??0),0)),currency:"USD",breakdown:[...o.values()],model:a.length?a.join(", "):null,price_route:l.length?l.join(", "):null,rates_source:r.source,rates_generated_at:r.generatedAt,...s.some(c=>c.estimated)?{estimated:!0}:{},unknown_reason:i}}function rN(t){let e=t?.usage;if(!e||typeof e!="object")return null;let n=i=>typeof i=="number"&&Number.isSafeInteger(i)&&i>=0?i:null,r=e.cache_creation??null,s=r?n(r.ephemeral_5m_input_tokens):null,o=r?n(r.ephemeral_1h_input_tokens):null;return{...typeof t?.id=="string"?{responseId:t.id}:{},...typeof t?.model=="string"&&t.model!=="<synthetic>"?{model:t.model}:{},input:n(e.input_tokens),output:n(e.output_tokens),cacheRead:e.cache_read_input_tokens===void 0?0:n(e.cache_read_input_tokens),cacheWrite:e.cache_creation_input_tokens===void 0?0:n(e.cache_creation_input_tokens),...s!==null&&o!==null?{cacheWrite5m:s,cacheWrite1h:o}:{}}}function sN(t,e){let n=t?.last_token_usage;if(!n||typeof n!="object")return null;let r=i=>typeof i=="number"&&Number.isSafeInteger(i)&&i>=0?i:null,s=r(n.input_tokens),o=r(n.cached_input_tokens);return{...e?{model:e}:{},input:s===null||o===null||o>s?null:s-o,cacheRead:o,cacheWrite:n.cache_write_input_tokens===void 0?0:r(n.cache_write_input_tokens),output:r(n.output_tokens),...n.reasoning_output_tokens!==void 0?{reasoning:r(n.reasoning_output_tokens)}:{}}}var GG,Ju,Wg,Hg=C(()=>{"use strict";_n();jg();GG=t=>"resolve"in t?t:Gu(t),Ju=t=>Number(t.toPrecision(10)),Wg=(t,e)=>t===null||e===null?null:t+e});import{open as oN,stat as iN}from"node:fs/promises";function zG(t){let e=[];for(let n of t){if(n.role==="tool_use"){e.push(n);continue}if(n.role!=="tool_result")continue;let r=e.pop();if(!r)continue;n.toolName=r.toolName;let s=n.toolCallId??r.toolCallId;s&&(r.toolCallId=s,n.toolCallId=s)}}function Bg(t){return typeof t=="string"?t:Array.isArray(t)&&t.flatMap(n=>{if(!n||typeof n!="object")return[];let r=n;return typeof r.text=="string"&&(!r.type||/text/i.test(String(r.type)))?[r.text]:[]}).join(`
1952
- `)||null}function lN(t,e,n=!1){if(!t||typeof t!="object")return[];let r=t,s=new Date(String(r.timestamp??r.created_at??""));if(Number.isNaN(s.getTime()))return[];if(e==="claude"){if(r.isSidechain||r.type!=="user"&&r.type!=="assistant")return[];let o=r.message,i=o?.role;if(i!=="user"&&i!=="assistant")return[];let a=[],l=Array.isArray(o?.content)?o.content:[];if(n&&Array.isArray(o?.content))for(let c of l){if(!c||typeof c!="object")continue;let d=c;d.type==="tool_use"?a.push({role:"tool_use",timestamp:s,content:JSON.stringify(d.input??{}),toolName:typeof d.name=="string"?d.name:"tool",...typeof d.id=="string"?{toolCallId:d.id}:{}}):d.type==="tool_result"?a.push({role:"tool_result",timestamp:s,content:Bg(d.content)??"",toolName:typeof d.name=="string"?d.name:void 0,...typeof d.tool_use_id=="string"?{toolCallId:d.tool_use_id}:{}}):d.type==="text"&&typeof d.text=="string"&&d.text&&a.push({role:i,content:d.text,timestamp:s,...typeof o?.model=="string"?{model:o.model}:{}})}else{let c=Bg(o?.content);c&&a.push({role:i,content:c,timestamp:s,...typeof o?.model=="string"?{model:o.model}:{}})}return a}if(e==="codex"){if(r.type!=="response_item")return[];let o=r.payload;if(o?.type==="message"&&(o.role==="user"||o.role==="assistant")){let i=Bg(o.content);return i?[{role:o.role,content:i,timestamp:s}]:[]}return n&&o?.type==="function_call"?[{role:"tool_use",timestamp:s,content:String(o.arguments??""),toolName:String(o.name??"tool"),...typeof o.call_id=="string"?{toolCallId:o.call_id}:{}}]:n&&o?.type==="function_call_output"?[{role:"tool_result",timestamp:s,content:String(o.output??""),...typeof o.call_id=="string"?{toolCallId:o.call_id}:{}}]:[]}if(e==="agy"){let o=String(r.type??"").toLowerCase(),i=/user|input|prompt/.test(o)?"user":/assistant|response/.test(o)?"assistant":null,a=[];if(n&&Array.isArray(r.tool_calls))for(let l of r.tool_calls){if(!l||typeof l!="object")continue;let c=l,d="";try{d=c.args===void 0?"":JSON.stringify(c.args)}catch{d=String(c.args)}a.push({role:"tool_use",timestamp:s,content:d,toolName:typeof c.name=="string"?c.name:"tool",...c.args&&typeof c.args=="object"&&!Array.isArray(c.args)?{toolInputData:c.args}:{},...Number.isSafeInteger(r.step_index)?{toolCallId:`agy-step-${r.step_index}`}:{}})}if(i&&typeof r.content=="string"&&r.content){let l=r.content;if(i==="user"){let c=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(l);c&&(l=c[1])}l&&a.push({role:i,content:l,timestamp:s})}else n&&r.source==="MODEL"&&o!=="planner_response"&&typeof r.content=="string"&&r.content&&a.push({role:"tool_result",timestamp:s,content:r.content,...Number.isSafeInteger(r.step_index)?{toolCallId:`agy-step-${r.step_index}`}:{}});return n&&typeof r.thinking=="string"&&r.thinking&&a.push({role:"thinking",timestamp:s,content:r.thinking}),a}return[]}function YG(t,e){if(!t||typeof t!="object")return null;let n=t;if(e==="claude")return n.isSidechain||n.type!=="assistant"?null:rN(n.message);if(e==="codex"){let r=n.payload;return n.type!=="event_msg"||r?.type!=="token_count"?null:sN(r.info,void 0)}return null}async function cN(t,e,n,r,s=!1){if(!["claude","codex","agy"].includes(e)||!/\.jsonl$/i.test(t))return null;let o=(await iN(t)).size,i=Math.max(0,o-KG),a=await oN(t,"r");try{let l=o,c=Buffer.alloc(0),d=[],u=[],f=new Set,m=[],p=!1,_=()=>e==="codex"&&m.length>0,h=E=>{let T=e==="codex"?QG(E):null;if(T){for(let N of m.splice(0))N.model=T;return!p||_()}if(p)return _();let v=YG(E,e);v?.responseId&&(f.has(v.responseId)?v=null:f.add(v.responseId)),v&&e==="codex"&&m.push(v);let b=lN(E,e,s);if(!b.length)return v&&u.push(v),!0;let k=b[b.length-1],I=[...v?[v]:[],...u.reverse()];u=[];for(let N of[...b].reverse())if(r&&N.timestamp<r||(N===k&&I.length&&(N.usage=I),e==="codex"&&N.role==="assistant"&&m.push(N),d.push(N),d.length>n))return p=!0,_();return!0},g=!0;for(;l>i&&g;){let E=Math.min(aN,l-i);l-=E;let T=Buffer.alloc(E);await a.read(T,0,E,l);let b=Buffer.concat([T,c]).toString("utf8").split(`
1953
- `);c=Buffer.from(b.shift()??"","utf8");for(let k of b.reverse()){if(!k.trim())continue;let I;try{I=JSON.parse(k)}catch{continue}if(!(g=h(I)))break}}if(l===0&&c.length>0&&g)try{h(JSON.parse(c.toString("utf8")))}catch{}let w=p||l>i||i>0,y=d.slice(0,n).reverse();return e==="agy"&&s&&zG(y),{messages:y,truncated:w}}finally{await a.close()}}function Xg(t,e,n,r=90){let s=Math.max(0,e-r),o=Math.min(t.length,e+n+r);if(s>0){let i=t.indexOf(" ",s);i>=0&&i<e&&(s=i+1)}if(o<t.length){let i=t.lastIndexOf(" ",o);i>e+n&&(o=i)}return`${s>0?"...":""}${t.slice(s,o).replace(/\s+/g," ").trim()}${o<t.length?"...":""}`}async function dN(t,e,n,r){if(!["claude","codex","agy"].includes(e)||!/\.jsonl$/i.test(t))return null;let s=r.now??Date.now,o=n.toLowerCase(),i=(await iN(t)).size,a=Math.max(0,i-r.maxBytes),l=await oN(t,"r"),c=[],d=null,u=f=>{if(!f.trim()||!f.toLowerCase().includes(o))return!1;let m=[];try{m=lN(JSON.parse(f),e,!1)}catch{return!1}for(let p of[...m].reverse()){if(r.since&&p.timestamp<r.since)return!0;if(p.role!=="user"&&p.role!=="assistant"||!p.content.toLowerCase().includes(o))continue;let _=r.redact?r.redact(p.content):p.content,h=_.toLowerCase().indexOf(o);if(!(h<0)&&(c.push({role:p.role,timestamp:p.timestamp.toISOString(),snippet:Xg(_,h,n.length),match_at:h,content_length:_.length}),c.length>=r.maxHits))return d="hits",!0}return!1};try{let f=i,m=Buffer.alloc(0);e:for(;f>a;){if(s()>=r.deadline){d="time";break}let p=Math.min(aN,f-a);f-=p;let _=Buffer.alloc(p);await l.read(_,0,p,f);let h=Buffer.concat([_,m]).toString("utf8").split(`
1954
- `);m=Buffer.from(h.shift()??"","utf8");for(let g of h.reverse())if(u(g))break e}return!d&&f===0&&m.length&&u(m.toString("utf8")),!d&&f>0&&f<=a&&a>0&&(d="bytes"),{hits:c,scanned_bytes:i-f,file_bytes:i,complete:f===0&&d!=="time",stopped:d}}finally{await l.close()}}var aN,KG,QG,uN=C(()=>{"use strict";Hg();aN=64*1024,KG=8*1024*1024;QG=t=>{let e=t??{},n=e.payload;return e.type==="turn_context"&&typeof n?.model=="string"&&n.model?n.model:null}});import{stat as ZG}from"node:fs/promises";function Vu(t){return kr(t)&&tJ.has(t)}function uo(){return qg===null&&(qg=mi(Ss())),qg}function Gg(t,e,n={}){if(!Vu(t))return null;try{let r=uo().getAdapter?.(t);if(r===void 0)return null;let s=r.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&n.isLead===!0?lu({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?eJ[t]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:t,model:n.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...o,...a??[],...i,...fN[t]??[]]}catch{return null}}async function pN(t,e){try{let n=uo().getAdapter(t);return n?.preflightNativeLaunch?await n.preflightNativeLaunch(e):{kind:"ok"}}catch{return{kind:"ok"}}}function hN(t){try{return uo().getAdapter(t)?.nativeLaunchFailureHint}catch{return}}function _N(t,e,n={}){let r=Gg(t,e,n);return r===null?null:r.join(" ")}function _t(t,e){return uo().getSession(t,e)}async function Jg(t,e,n,r,s=!1){let o=await uo().resolveSession(t,e);if(!o)return null;let a=(e==="agy"?await Du(o.filePath):null)??o.filePath,l=await cN(a,e,n,r,s);if(!l)return o.provider.loadSession(t);let c=await ZG(a);return{provider:e,sessionId:t,cwd:"",createdAt:c.birthtime,modifiedAt:c.mtime,messageCount:l.messages.length,filePath:a,messages:l.messages,captureStatus:l.truncated?"partial":void 0}}async function gN(t,e,n,r){let s=await uo().resolveSession(t,e);if(!s)return null;let o=e==="agy"?await Du(s.filePath):null,i=await dN(o??s.filePath,e,n,r);if(i)return{...i,reader:"bounded"};let a=await s.provider.loadSession(t);if(!a)return null;let l=n.toLowerCase(),c=[],d=null;for(let u of[...a.messages??[]].reverse()){if((r.now??Date.now)()>=r.deadline){d="time";break}if(r.since&&u.timestamp<r.since)break;if(u.role!=="user"&&u.role!=="assistant"||!u.content.toLowerCase().includes(l))continue;let f=r.redact?r.redact(u.content):u.content,m=f.toLowerCase().indexOf(l);if(!(m<0)&&(c.push({role:u.role,timestamp:u.timestamp.toISOString(),snippet:Xg(f,m,n.length),match_at:m,content_length:f.length}),c.length>=r.maxHits)){d="hits";break}}return{hits:c,scanned_bytes:0,file_bytes:0,complete:d!=="time",stopped:d,reader:"full"}}async function Is(t){return(await uo().resolveSessions(t)).map(n=>n.provider.name)}var fN,eJ,tJ,mN,qg,Fn=C(()=>{"use strict";oi();Cr();s_();uN();rg();fN={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:[]},eJ={muse:t=>["--model",t],claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t],kimi:t=>["--model",t],hermes:t=>["--model",t],pi:t=>["--model",t]},tJ=new Set(Object.keys(fN)),mN=/^[\w.:-]+$/;qg=null});function nJ(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return yN;let n=Number(e);return!Number.isFinite(n)||n<=0?yN:n}async function rJ(t,e,n){try{let r=lt(e,n,t),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let o;if(typeof r.provider=="string"&&r.provider.trim()!=="")o=r.provider;else{let c=await Is(s);if(c.length!==1)return null;o=c[0]}let i=await _t(s,o);if(i===null)return null;let a=i.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function wN(t,e,n,r,s){if(!e.busy||e.reason!=="in-flight")return!1;let o=s??nJ(),i=await rJ(t,n,r),a=i!==null&&i>=o;return a&&B({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,idle_ms:i,idle_minutes:i===null?null:Math.round(i/6e4),threshold_ms:o,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var yN,EN=C(()=>{"use strict";Ee();Fn();Nt();yN=36e5});function sJ(t){return t===null?null:$t(t)?"live":"dead"}function Vg(t){let e=t.nowMs??Date.now(),n=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:sJ(t.holderPid),since:t.since,idle_ms:Number.isFinite(n)?Math.max(0,e-n):null}}function oJ(t){return(0,TN.formatDuration)(t)}function Kg(t){let e=[];return t.idle_ms!==null&&e.push(`active ${oJ(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("; ")})`}var TN,vN=C(()=>{"use strict";Qs();TN=pn(rn(),1)});import{randomUUID as iJ}from"node:crypto";import{hostname as SN,networkInterfaces as aJ}from"node:os";function bN(t){let e=(t.now??new Date).toISOString();return{lock_id:iJ(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??SN(),holder_ips:t.ips??fJ(),started_at:e,last_heartbeat:e}}function IN(t=process.env){return kN(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,lJ)}function dJ(t=process.env){return kN(t.LMCTL_TERMINAL_LOCK_STALE_MS,cJ)}function zg(t,e={}){let n=e.now??new Date,r=e.localHost??SN(),s=e.staleMs??dJ();if(t.holder_host===r)return(e.isProcessAlive??uJ)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(t.last_heartbeat);return Number.isFinite(o)?n.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Nl(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function kN(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 uJ(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"}}function fJ(){let t=new Set;for(let e of Object.values(aJ()))for(let n of e??[])n.internal||t.add(n.address);return[...t].sort()}var lJ,cJ,Ku=C(()=>{"use strict";lJ=15e3,cJ=12e4});function mJ(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
1951
+ `,"utf8"),uG(n,t)}function wG(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function EG(t){let e=`${t}.lock`;xg(Og(t),{recursive:!0});let n=Date.now()+PA;for(;;)try{return xg(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-fG(e).mtimeMs>gG){try{HA(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${PA}ms: ${e}`);wG(yG)}}function TG(t){try{HA(t)}catch{}}function qA(t,e){let n=EG(t);try{return e()}finally{TG(n)}}function vG(t){return{...t,timestamp:t.timestamp.toISOString()}}function SG(t){return{...t,timestamp:new Date(t.timestamp)}}function bG(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(vG)}}function GA(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(SG)}}function Bu(t,e=process.cwd()){let n=Si.get(t);if(n!==void 0)return n;let s=bl(bi(e)).sessions[t];if(s===void 0)return;let o=GA(s);return Si.set(o.sessionId,o),o}function UA(t){Si.set(t.sessionId,t);let e=bi(t.cwd);qA(e,()=>{let n=bl(e);n.sessions[t.sessionId]=bG({...t,filePath:e}),XA(e,n)})}function IG(t,e=process.cwd()){let n=bi(e);return qA(n,()=>{let r=bl(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],XA(n,r)),s})}function kG(){let t=bl(bi()),e=Object.values(t.sessions).map(GA);for(let n of e)Si.set(n.sessionId,n);return e}function Rg(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function FA(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=Rg(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=Rg(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function jA(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function AG(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=FA(n[t]??n[BA(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let o=FA(r[s]);if(o!==void 0)return o}}}function WA(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}}}function Dg(){return new Cg}var Si,gG,yG,PA,Lg,Cg,Mg=C(()=>{"use strict";Si=new Map;gG=5e3,yG=15,PA=1e4;Lg=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of kG())e.set(n.sessionId,n);for(let n of Si.values())e.set(n.sessionId,n);return[...e.values()].map(WA)}async loadSession(e){let n=Bu(e);return n===void 0?null:{...WA(n),messages:n.messages.slice()}}async resolveSessionPath(e){return Bu(e)?.filePath??null}async deleteSession(e){let n=Si.delete(e),r=IG(e);return n||r}},Cg=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Lg;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=hG(_G(e,n)),s=`mock-${r}-${pG(`${e}:${r}`)}`,o=new Date,i=bi(e),a=Bu(s,e),l=n?.prompt??"ClaudeMock seed",c=Hu(l),d={sessionId:s,cwd:e,filePath:i,createdAt:a?.createdAt??o,modifiedAt:o,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:o,content:l}),d.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Hu("ACK: ClaudeMock seeded"),UA(d),{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=Bu(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let o=new Date,i=bl(bi(n.cwd)),a=AG(e,i),l=a?.delayMs??i.defaultDelayMs;if(a?.kind==="error")throw await jA(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${BA(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:c,model:n.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Hu(e),s.totalOutputTokens+=Hu(c),UA(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await jA(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Ss(t){let e=[Qh({museDataHome:t?.museDataHome}),T_({miniplayerHome:t?.miniplayerHome}),b_({claudeDir:t?.claudeDir}),x_({codexDir:t?.codexDir,codeDir:t?.codeDir}),D_({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),U_({copilotDir:t?.copilotDir}),W_({dbPaths:t?.opencodeDbPaths}),G_({kimiHome:t?.kimiHome}),K_({lmplayerDbPath:t?.lmplayerDbPath,lmplayerDbPaths:t?.lmplayerDbPaths}),Q_({qwenDir:t?.qwenDir}),ig({agyDir:t?.agyDir}),_g({dshHome:t?.dshHome}),Tg({hermesHome:t?.hermesHome}),kg({piDir:t?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Dg()),e}var $g=C(()=>{"use strict";Zh();Zh();v_();v_();I_();R_();M_();F_();H_();J_();z_();Z_();ag();gg();vg();Ag();Mg();I_();R_();M_();F_();H_();J_();z_();Z_();ag();gg();vg();Ag();Mg()});var JA,VA,KA=C(()=>{"use strict";JA=["claude","qwen","codex","dsh","miniplayer","muse","gemini","copilot","opencode","kimi","hermes"],VA=["agy","pi","lmplayer"]});var Fg={};ye(Fg,{BUNDLE_CAPABLE_PROVIDERS:()=>JA,BUNDLE_NEVER_CAPABLE_PROVIDERS:()=>VA,ProviderRegistry:()=>el,TransportConnectionError:()=>je,TransportError:()=>ps,TransportJsonError:()=>Zd,TransportProcessError:()=>Be,TransportRpcError:()=>nl,_resetDefaultRegistryForTests:()=>CG,bundleSupportedProviders:()=>kl,canUsePersistentSession:()=>Gd,chat:()=>Il,countTokens:()=>PG,createAdapterRegistry:()=>mi,createAllAdapters:()=>Ss,deleteSession:()=>$G,listSessions:()=>Ug,openBundleSession:()=>Pg,openConversation:()=>OG,seed:()=>DG});import{accessSync as NG,constants as xG,statSync as RG}from"node:fs";import{join as LG,delimiter as zA}from"node:path";function bs(){return Xu===null&&(Xu=mi(Ss())),Xu}function CG(){Xu=null}function qu(t,e){Od(e);let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function Il(t){let e=t.registry??bs(),n=qu(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 Jd(n,{...r,execution:"per-turn",requireResume:t.requireResume??!1}):void 0,o;try{o=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:o.text,...o.usage?{usage:o.usage}:{},sessionId:o.sessionId,durationMs:o.durationMs,stopReason:o.stopReason,numTurns:o.numTurns,status:o.status,stalledAfterMs:o.stalledAfterMs,...o.warnings!==void 0?{warnings:o.warnings}:{}}}function kl(t){return(t??bs()).getAllAdapters().filter(n=>kr(n.name)&&n.openSession!==void 0).map(n=>n.name)}async function Pg(t){let e=t.registry??bs(),n=qu(e,t.provider);if(n.openSession===void 0)throw new Error(`provider "${t.provider}" does not support bundle sessions in this version (supported: ${kl(e).join(", ")})`);return Jd(n,{...t,execution:"persistent"})}async function OG(t){return Jd(qu(t.registry??bs(),t.provider),t)}async function DG(t){let e=t.registry??bs(),n=qu(e,t.provider);if(n.seedBinary==="agy"){let d=t.env??process.env,u=d.PATH??d.Path??"/usr/bin:/bin",f=zA===";"?["",...(d.PATHEXT??".EXE;.CMD;.BAT").split(";")]:[""];if(!u.split(zA).some(p=>{try{return f.some(_=>{try{let h=LG(p||t.cwd,"agy"+_);return NG(h,xG.X_OK),RG(h).isFile()}catch{return!1}})}catch{return!1}}))return{success:!1,error:"Failed to spawn agy: executable not found on PATH",errorCode:"ENOENT"}}if(t.signal?.aborted)return{success:!1,error:"seed cancelled before dispatch",errorCode:"ABORT_ERR"};let r=await YA(e,t.provider,t.cwd);if(t.signal?.aborted)return{success:!1,error:"seed cancelled before dispatch",errorCode:"ABORT_ERR"};let s=await n.seed(t.cwd,{...t.env?{env:t.env}:{},...t.signal?{signal:t.signal}:{},onDispatch:t.onDispatch,model:t.model,effort:t.effort,prompt:t.prompt}),o;try{o=s.usage}catch{}let i={usage:o},a=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(s.success&&s.sessionId)return{success:!0,sessionId:s.sessionId,...a,...i};if(!s.success&&(s.errorCode==="ENOENT"||s.errorCode==="ABORT_ERR"))return{success:!1,error:s.error,errorCode:s.errorCode,sessionId:s.sessionId,...a,...i};let l=await YA(e,t.provider,t.cwd),c=MG(r,l);return s.success?c?{success:!0,sessionId:c,...a,...i}:{success:!0,...a,...i}:(c&&await n.delete?.(c).catch(()=>{}),{success:!1,error:s.error,errorCode:s.errorCode,sessionId:s.sessionId,...a,...i})}async function YA(t,e,n){let r=await t.listAll({provider:e,workspace:n}),s=new Map;for(let o of r)s.set(o.sessionId,o.modifiedAt);return s}function MG(t,e){let n=[];for(let r of e.keys())t.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function Ug(t={}){return(t.registry??bs()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function $G(t,e,n=bs()){return n.deleteSession(e,t)}async function PG(t){let n=await(t.registry??bs()).getSession(t.sessionId,t.provider);if(!n)throw new Error(`session "${t.sessionId}" not found`);let r=n.totalInputTokens??0,s=n.totalCachedInputTokens??0,o=n.totalCacheWriteInputTokens??0,i=n.totalOutputTokens??0,a=n.totalReasoningOutputTokens??0;return{provider:n.provider,sessionId:n.sessionId,input:r,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:r+s+o+i+a,lastTurn:n.lastTokenUsage}}var Xu,Cr=C(()=>{"use strict";fi();oi();Oh();$g();fi();Oh();$g();KA();hs();Xu=null});import{mkdirSync as UG,readFileSync as FG,renameSync as jG,writeFileSync as WG}from"node:fs";import{join as QA}from"node:path";function BG(t){let e=t.state;return{state:{kind:e.kind,...typeof e.alias=="string"?{alias:e.alias}:{},...typeof e.id=="string"?{id:e.id}:{},...Array.isArray(e.otherProviders)?{otherProviders:e.otherProviders.filter(n=>typeof n=="string")}:{}},offer:t.offer?{route:t.offer.route,source:t.offer.source,sourceModelId:t.offer.sourceModelId,provider:t.offer.provider,pricing:t.offer.pricing,estimated:t.offer.estimated}:null,provenance:t.provenance??null}}function Gu(t){let e=new Map;return{available:t.catalog!==null,source:t.source,generatedAt:t.generatedAt,resolve(n,r){let s=Al(n,r),o=e.get(s);return o||(o=BG(Mt(n,r,t.catalog,t.aliases)),e.set(s,o)),o}}}function XG(t){try{let e=JSON.parse(FG(t,"utf8"));return e&&e.v===ZA&&typeof e.key=="string"&&e.entries&&typeof e.entries=="object"?e:null}catch{return null}}function qG(t,e){try{UG(QA(t,".."),{recursive:!0});let n=`${t}.${process.pid}.tmp`;WG(n,JSON.stringify(e),{mode:384}),jG(n,t)}catch{}}async function eN(t,e={}){let n=e.env??process.env,r=e.loadSnapshot??(()=>Dt());if(n.LMCTL_COST_INDEX==="off")return Gu(await r());let s=e.indexPath??(n.LMCTL_COST_INDEX||QA(TS(),"cost-index.json")),o=Fp(n,e.now),i=o.fresh?XG(s):null,a=i&&i.key===o.key?i:null,l=[...new Map(t.map(([p,_])=>[Al(p,_),[p,_]])).values()];if(a&&a.source!=="unavailable"&&l.every(([p,_])=>a.entries[Al(p,_)])){let p=a.entries;return{available:!0,source:a.source,generatedAt:a.generatedAt,resolve:(_,h)=>p[Al(_,h)]??{state:{kind:"unavailable"},offer:null,provenance:null}}}let c=await r(),d=Gu(c),u=Fp(n,e.now),f=JSON.parse(u.key)[3],m=!!c.sha256&&(c.source==="pinned"&&u.key.startsWith('["pinned"')||(c.source==="cache"||c.source==="network")&&f===c.sha256);if(c.catalog!==null&&m){let p=a&&a.key===u.key?a.entries:i&&i.key===u.key?i.entries:{},_=Object.keys(p).length>=HG?{}:{...p};for(let[h,g]of l)_[Al(h,g)]=d.resolve(h,g);qG(s,{v:ZA,key:u.key,source:c.source,generatedAt:c.generatedAt,entries:_})}return d}var ZA,HG,Al,jg=C(()=>{"use strict";_n();is();ZA=1,HG=2e3,Al=(t,e)=>`${t}\0${e}`});function tN(t){let e=o=>t.reduce((i,a)=>Wg(i,a[o]),0),n=t.some(o=>o.cacheWrite5m!==void 0||o.cacheWrite1h!==void 0),r=t.some(o=>o.reasoning!==void 0),s=[...new Set(t.map(o=>o.model).filter(o=>!!o))];return{response_ids:t.map(o=>o.responseId).filter(o=>!!o),responses:t.length,model:s.length===1?s[0]:s.length?s.join(", "):null,input:e("input"),output:e("output"),cache_read:e("cacheRead"),cache_write:e("cacheWrite"),...n?{cache_write_5m:t.reduce((o,i)=>o+(i.cacheWrite5m??0),0),cache_write_1h:t.reduce((o,i)=>o+(i.cacheWrite1h??0),0)}:{},...r?{reasoning:t.reduce((o,i)=>Wg(o,i.reasoning??null),0)}:{}}}function JG(t,e,n,r){switch(n){case"unresolved":return`alias "${r.alias}" is deliberately unresolved in the lmprice alias table`;case"known-unpriced":return`"${r.id}" is a known model with no published price row`;case"unknown":return`model "${e}" not found in lmprice catalog for provider "${t}"`;case"wrong-provider":return`model "${e}" is not offered by provider "${t}" (found under: ${(r.otherProviders??[]).join(", ")})`;default:return`no lmprice catalog coverage for provider "${t}"`}}function VG(t,e,n){let r=[],s=null,o=null,i=!1,a=null;if(!e.model)s="the transcript does not name the model of this response";else if(!n.available)s="lmprice catalog unavailable";else{let f=n.resolve(t,e.model);f.offer?(a=f.offer.pricing,o=f.offer.route,i=f.offer.estimated):s=JG(t,e.model,f.state.kind,f.state)}let l=a?ss({input:e.input??0,output:e.output??0,cachedInput:e.cacheRead??0},a):null,c=(f,m)=>a?ss({input:0,output:0,cachedInput:0,cacheWrite:f+m,cacheWrite5m:f,cacheWrite1h:m},a).cacheWritePer1m:null,d=(f,m,p)=>({type:f,tokens:m,rate_per_mtok:p,usd:m===null||p===null?m===0?0:null:Ju(m*p/1e6)});if(r.push(d("input",e.input,l?.inputPer1m??null)),r.push(d("cache_read",e.cacheRead,l?.cacheReadPer1m??null)),e.cacheWrite5m!==void 0||e.cacheWrite1h!==void 0){let f=e.cacheWrite5m??0,m=e.cacheWrite1h??0;e.cacheWrite!==null&&f+m!==e.cacheWrite?(r.push(d("cache_write",e.cacheWrite,null)),s??="the 5m/1h cache-write split does not add up to the total"):((f||!m)&&r.push(d("cache_write_5m",f,c(f,0))),m&&r.push(d("cache_write_1h",m,c(0,m))))}else r.push(d("cache_write",e.cacheWrite,e.cacheWrite===null?null:c(e.cacheWrite,0)));r.push(d("output",e.output,l?.outputPer1m??null)),e.reasoning!==void 0&&r.push({type:"reasoning",tokens:e.reasoning,rate_per_mtok:l?.outputPer1m??null,usd:null,included_in:"output"});for(let f of r)if(!f.included_in){if(f.tokens===null){s??=`the transcript does not record ${f.type.replace(/_/g," ")} tokens`;continue}f.usd===null&&(s??=`no ${f.type.replace(/_/g," ")} price for "${e.model}"`)}let u=s?null:Ju(r.reduce((f,m)=>f+(m.included_in?0:m.usd??0),0));return{lines:r,total:u,reason:s,route:o,estimated:i}}function nN(t,e,n){let r=GG(n),s=e.map(c=>VG(t,c,r)),o=new Map;for(let c of s)for(let d of c.lines){let u=o.get(d.type);if(!u){o.set(d.type,{...d});continue}u.tokens=Wg(u.tokens,d.tokens),u.usd=d.included_in||u.usd===null||d.usd===null?null:Ju(u.usd+d.usd),u.rate_per_mtok!==d.rate_per_mtok&&(u.rate_per_mtok=null)}let i=s.find(c=>c.reason)?.reason??null,a=[...new Set(e.map(c=>c.model).filter(c=>!!c))],l=[...new Set(s.map(c=>c.route).filter(c=>!!c))];return{total:i?null:Ju(s.reduce((c,d)=>c+(d.total??0),0)),currency:"USD",breakdown:[...o.values()],model:a.length?a.join(", "):null,price_route:l.length?l.join(", "):null,rates_source:r.source,rates_generated_at:r.generatedAt,...s.some(c=>c.estimated)?{estimated:!0}:{},unknown_reason:i}}function rN(t){let e=t?.usage;if(!e||typeof e!="object")return null;let n=i=>typeof i=="number"&&Number.isSafeInteger(i)&&i>=0?i:null,r=e.cache_creation??null,s=r?n(r.ephemeral_5m_input_tokens):null,o=r?n(r.ephemeral_1h_input_tokens):null;return{...typeof t?.id=="string"?{responseId:t.id}:{},...typeof t?.model=="string"&&t.model!=="<synthetic>"?{model:t.model}:{},input:n(e.input_tokens),output:n(e.output_tokens),cacheRead:e.cache_read_input_tokens===void 0?0:n(e.cache_read_input_tokens),cacheWrite:e.cache_creation_input_tokens===void 0?0:n(e.cache_creation_input_tokens),...s!==null&&o!==null?{cacheWrite5m:s,cacheWrite1h:o}:{}}}function sN(t,e){let n=t?.last_token_usage;if(!n||typeof n!="object")return null;let r=i=>typeof i=="number"&&Number.isSafeInteger(i)&&i>=0?i:null,s=r(n.input_tokens),o=r(n.cached_input_tokens);return{...e?{model:e}:{},input:s===null||o===null||o>s?null:s-o,cacheRead:o,cacheWrite:n.cache_write_input_tokens===void 0?0:r(n.cache_write_input_tokens),output:r(n.output_tokens),...n.reasoning_output_tokens!==void 0?{reasoning:r(n.reasoning_output_tokens)}:{}}}var GG,Ju,Wg,Hg=C(()=>{"use strict";_n();jg();GG=t=>"resolve"in t?t:Gu(t),Ju=t=>Number(t.toPrecision(10)),Wg=(t,e)=>t===null||e===null?null:t+e});import{open as oN,stat as iN}from"node:fs/promises";function KG(t){let e=[];for(let n of t){if(n.role==="tool_use"){e.push(n);continue}if(n.role!=="tool_result")continue;let r=e.pop();if(!r)continue;n.toolName=r.toolName;let s=n.toolCallId??r.toolCallId;s&&(r.toolCallId=s,n.toolCallId=s)}}function Bg(t){return typeof t=="string"?t:Array.isArray(t)&&t.flatMap(n=>{if(!n||typeof n!="object")return[];let r=n;return typeof r.text=="string"&&(!r.type||/text/i.test(String(r.type)))?[r.text]:[]}).join(`
1952
+ `)||null}function lN(t,e,n=!1){if(!t||typeof t!="object")return[];let r=t,s=new Date(String(r.timestamp??r.created_at??""));if(Number.isNaN(s.getTime()))return[];if(e==="claude"){if(r.isSidechain||r.type!=="user"&&r.type!=="assistant")return[];let o=r.message,i=o?.role;if(i!=="user"&&i!=="assistant")return[];let a=[],l=Array.isArray(o?.content)?o.content:[];if(n&&Array.isArray(o?.content))for(let c of l){if(!c||typeof c!="object")continue;let d=c;d.type==="tool_use"?a.push({role:"tool_use",timestamp:s,content:JSON.stringify(d.input??{}),toolName:typeof d.name=="string"?d.name:"tool",...typeof d.id=="string"?{toolCallId:d.id}:{}}):d.type==="tool_result"?a.push({role:"tool_result",timestamp:s,content:Bg(d.content)??"",toolName:typeof d.name=="string"?d.name:void 0,...typeof d.tool_use_id=="string"?{toolCallId:d.tool_use_id}:{}}):d.type==="text"&&typeof d.text=="string"&&d.text&&a.push({role:i,content:d.text,timestamp:s,...typeof o?.model=="string"?{model:o.model}:{}})}else{let c=Bg(o?.content);c&&a.push({role:i,content:c,timestamp:s,...typeof o?.model=="string"?{model:o.model}:{}})}return a}if(e==="codex"){if(r.type!=="response_item")return[];let o=r.payload;if(o?.type==="message"&&(o.role==="user"||o.role==="assistant")){let i=Bg(o.content);return i?[{role:o.role,content:i,timestamp:s}]:[]}return n&&o?.type==="function_call"?[{role:"tool_use",timestamp:s,content:String(o.arguments??""),toolName:String(o.name??"tool"),...typeof o.call_id=="string"?{toolCallId:o.call_id}:{}}]:n&&o?.type==="function_call_output"?[{role:"tool_result",timestamp:s,content:String(o.output??""),...typeof o.call_id=="string"?{toolCallId:o.call_id}:{}}]:[]}if(e==="agy"){let o=String(r.type??"").toLowerCase(),i=/user|input|prompt/.test(o)?"user":/assistant|response/.test(o)?"assistant":null,a=[];if(n&&Array.isArray(r.tool_calls))for(let l of r.tool_calls){if(!l||typeof l!="object")continue;let c=l,d="";try{d=c.args===void 0?"":JSON.stringify(c.args)}catch{d=String(c.args)}a.push({role:"tool_use",timestamp:s,content:d,toolName:typeof c.name=="string"?c.name:"tool",...c.args&&typeof c.args=="object"&&!Array.isArray(c.args)?{toolInputData:c.args}:{},...Number.isSafeInteger(r.step_index)?{toolCallId:`agy-step-${r.step_index}`}:{}})}if(i&&typeof r.content=="string"&&r.content){let l=r.content;if(i==="user"){let c=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(l);c&&(l=c[1])}l&&a.push({role:i,content:l,timestamp:s})}else n&&r.source==="MODEL"&&o!=="planner_response"&&typeof r.content=="string"&&r.content&&a.push({role:"tool_result",timestamp:s,content:r.content,...Number.isSafeInteger(r.step_index)?{toolCallId:`agy-step-${r.step_index}`}:{}});return n&&typeof r.thinking=="string"&&r.thinking&&a.push({role:"thinking",timestamp:s,content:r.thinking}),a}return[]}function zG(t,e){if(!t||typeof t!="object")return null;let n=t;if(e==="claude")return n.isSidechain||n.type!=="assistant"?null:rN(n.message);if(e==="codex"){let r=n.payload;return n.type!=="event_msg"||r?.type!=="token_count"?null:sN(r.info,void 0)}return null}async function cN(t,e,n,r,s=!1){if(!["claude","codex","agy"].includes(e)||!/\.jsonl$/i.test(t))return null;let o=(await iN(t)).size,i=0,a=await oN(t,"r");try{let l=o,c=[],d=[],u=[],f=new Set,m=[],p=!1,_=()=>e==="codex"&&m.length>0,h=E=>{let T=e==="codex"?YG(E):null;if(T){for(let N of m.splice(0))N.model=T;return!p||_()}if(p)return _();let v=zG(E,e);v?.responseId&&(f.has(v.responseId)?v=null:f.add(v.responseId)),v&&e==="codex"&&m.push(v);let b=lN(E,e,s);if(!b.length)return v&&u.push(v),!0;let k=b[b.length-1],I=[...v?[v]:[],...u.reverse()];u=[];for(let N of[...b].reverse())if(r&&N.timestamp<r||(N===k&&I.length&&(N.usage=I),e==="codex"&&N.role==="assistant"&&m.push(N),d.push(N),d.length>n))return p=!0,_();return!0},g=!0;for(;l>i&&g;){let E=Math.min(aN,l-i);l-=E;let T=Buffer.alloc(E);await a.read(T,0,E,l);let v=T.length;for(let b=T.lastIndexOf(10);b>=0;b=T.lastIndexOf(10,b-1)){let k=Buffer.concat([T.subarray(b+1,v),...c]).toString("utf8");if(c=[],v=b,k.trim()){let I;try{I=JSON.parse(k)}catch{if(b===0)break;continue}if(!(g=h(I)))break}if(b===0)break}g&&v>0&&c.unshift(T.subarray(0,v))}if(l===0&&c.length>0&&g)try{h(JSON.parse(Buffer.concat(c).toString("utf8")))}catch{}let w=p||l>i||i>0,y=d.slice(0,n).reverse();return e==="agy"&&s&&KG(y),{messages:y,truncated:w}}finally{await a.close()}}function Xg(t,e,n,r=90){let s=Math.max(0,e-r),o=Math.min(t.length,e+n+r);if(s>0){let i=t.indexOf(" ",s);i>=0&&i<e&&(s=i+1)}if(o<t.length){let i=t.lastIndexOf(" ",o);i>e+n&&(o=i)}return`${s>0?"...":""}${t.slice(s,o).replace(/\s+/g," ").trim()}${o<t.length?"...":""}`}async function dN(t,e,n,r){if(!["claude","codex","agy"].includes(e)||!/\.jsonl$/i.test(t))return null;let s=r.now??Date.now,o=n.toLowerCase(),i=(await iN(t)).size,a=Math.max(0,i-r.maxBytes),l=await oN(t,"r"),c=[],d=null,u=f=>{if(!f.trim()||!f.toLowerCase().includes(o))return!1;let m=[];try{m=lN(JSON.parse(f),e,!1)}catch{return!1}for(let p of[...m].reverse()){if(r.since&&p.timestamp<r.since)return!0;if(p.role!=="user"&&p.role!=="assistant"||!p.content.toLowerCase().includes(o))continue;let _=r.redact?r.redact(p.content):p.content,h=_.toLowerCase().indexOf(o);if(!(h<0)&&(c.push({role:p.role,timestamp:p.timestamp.toISOString(),snippet:Xg(_,h,n.length),match_at:h,content_length:_.length}),c.length>=r.maxHits))return d="hits",!0}return!1};try{let f=i,m=Buffer.alloc(0);e:for(;f>a;){if(s()>=r.deadline){d="time";break}let p=Math.min(aN,f-a);f-=p;let _=Buffer.alloc(p);await l.read(_,0,p,f);let h=Buffer.concat([_,m]).toString("utf8").split(`
1953
+ `);m=Buffer.from(h.shift()??"","utf8");for(let g of h.reverse())if(u(g))break e}return!d&&f===0&&m.length&&u(m.toString("utf8")),!d&&f>0&&f<=a&&a>0&&(d="bytes"),{hits:c,scanned_bytes:i-f,file_bytes:i,complete:f===0&&d!=="time",stopped:d}}finally{await l.close()}}var aN,YG,uN=C(()=>{"use strict";Hg();aN=64*1024;YG=t=>{let e=t??{},n=e.payload;return e.type==="turn_context"&&typeof n?.model=="string"&&n.model?n.model:null}});import{stat as QG}from"node:fs/promises";function Vu(t){return kr(t)&&eJ.has(t)}function uo(){return qg===null&&(qg=mi(Ss())),qg}function Gg(t,e,n={}){if(!Vu(t))return null;try{let r=uo().getAdapter?.(t);if(r===void 0)return null;let s=r.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&n.isLead===!0?lu({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?ZG[t]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:t,model:n.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...o,...a??[],...i,...fN[t]??[]]}catch{return null}}async function pN(t,e){try{let n=uo().getAdapter(t);return n?.preflightNativeLaunch?await n.preflightNativeLaunch(e):{kind:"ok"}}catch{return{kind:"ok"}}}function hN(t){try{return uo().getAdapter(t)?.nativeLaunchFailureHint}catch{return}}function _N(t,e,n={}){let r=Gg(t,e,n);return r===null?null:r.join(" ")}function _t(t,e){return uo().getSession(t,e)}async function Jg(t,e,n,r,s=!1){let o=await uo().resolveSession(t,e);if(!o)return null;let a=(e==="agy"?await Du(o.filePath):null)??o.filePath,l=await cN(a,e,n,r,s);if(!l)return o.provider.loadSession(t);let c=await QG(a);return{provider:e,sessionId:t,cwd:"",createdAt:c.birthtime,modifiedAt:c.mtime,messageCount:l.messages.length,filePath:a,messages:l.messages,captureStatus:l.truncated?"partial":void 0}}async function gN(t,e,n,r){let s=await uo().resolveSession(t,e);if(!s)return null;let o=e==="agy"?await Du(s.filePath):null,i=await dN(o??s.filePath,e,n,r);if(i)return{...i,reader:"bounded"};let a=await s.provider.loadSession(t);if(!a)return null;let l=n.toLowerCase(),c=[],d=null;for(let u of[...a.messages??[]].reverse()){if((r.now??Date.now)()>=r.deadline){d="time";break}if(r.since&&u.timestamp<r.since)break;if(u.role!=="user"&&u.role!=="assistant"||!u.content.toLowerCase().includes(l))continue;let f=r.redact?r.redact(u.content):u.content,m=f.toLowerCase().indexOf(l);if(!(m<0)&&(c.push({role:u.role,timestamp:u.timestamp.toISOString(),snippet:Xg(f,m,n.length),match_at:m,content_length:f.length}),c.length>=r.maxHits)){d="hits";break}}return{hits:c,scanned_bytes:0,file_bytes:0,complete:d!=="time",stopped:d,reader:"full"}}async function Is(t){return(await uo().resolveSessions(t)).map(n=>n.provider.name)}var fN,ZG,eJ,mN,qg,Fn=C(()=>{"use strict";oi();Cr();s_();uN();rg();fN={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:[]},ZG={muse:t=>["--model",t],claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t],kimi:t=>["--model",t],hermes:t=>["--model",t],pi:t=>["--model",t]},eJ=new Set(Object.keys(fN)),mN=/^[\w.:-]+$/;qg=null});function tJ(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return yN;let n=Number(e);return!Number.isFinite(n)||n<=0?yN:n}async function nJ(t,e,n){try{let r=lt(e,n,t),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let o;if(typeof r.provider=="string"&&r.provider.trim()!=="")o=r.provider;else{let c=await Is(s);if(c.length!==1)return null;o=c[0]}let i=await _t(s,o);if(i===null)return null;let a=i.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function wN(t,e,n,r,s){if(!e.busy||e.reason!=="in-flight")return!1;let o=s??tJ(),i=await nJ(t,n,r),a=i!==null&&i>=o;return a&&B({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,idle_ms:i,idle_minutes:i===null?null:Math.round(i/6e4),threshold_ms:o,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var yN,EN=C(()=>{"use strict";Ee();Fn();Nt();yN=36e5});function rJ(t){return t===null?null:$t(t)?"live":"dead"}function Vg(t){let e=t.nowMs??Date.now(),n=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:rJ(t.holderPid),since:t.since,idle_ms:Number.isFinite(n)?Math.max(0,e-n):null}}function sJ(t){return(0,TN.formatDuration)(t)}function Kg(t){let e=[];return t.idle_ms!==null&&e.push(`active ${sJ(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("; ")})`}var TN,vN=C(()=>{"use strict";Qs();TN=pn(rn(),1)});import{randomUUID as oJ}from"node:crypto";import{hostname as SN,networkInterfaces as iJ}from"node:os";function bN(t){let e=(t.now??new Date).toISOString();return{lock_id:oJ(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??SN(),holder_ips:t.ips??uJ(),started_at:e,last_heartbeat:e}}function IN(t=process.env){return kN(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,aJ)}function cJ(t=process.env){return kN(t.LMCTL_TERMINAL_LOCK_STALE_MS,lJ)}function zg(t,e={}){let n=e.now??new Date,r=e.localHost??SN(),s=e.staleMs??cJ();if(t.holder_host===r)return(e.isProcessAlive??dJ)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let o=Date.parse(t.last_heartbeat);return Number.isFinite(o)?n.getTime()-o<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Nl(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function kN(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 dJ(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"}}function uJ(){let t=new Set;for(let e of Object.values(iJ()))for(let n of e??[])n.internal||t.add(n.address);return[...t].sort()}var aJ,lJ,Ku=C(()=>{"use strict";aJ=15e3,lJ=12e4});function fJ(t){return`lmctl ${t}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
1955
1954
  manually, outside a member session that lmctl started. Running lmctl this way is
1956
1955
  not officially supported.
1957
1956
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function fo(t,e=process.env,n){let r=n?.db?.name??mt(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.
@@ -1961,20 +1960,20 @@ For a deliberately isolated database, remove the inherited session marker explic
1961
1960
  env -u LMCTL_SELF_SESSIONID lmctl ...
1962
1961
  In LMScript, before lm_* calls: set_env("LMCTL_SELF_SESSIONID", null);
1963
1962
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function AN(t){return`unknown option --from
1964
- ${mJ(t)}`}function zu(t,e){let n=Yg(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function Yg(t,e){let n=t[Gh];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let o of e.listRootTeams()){let i;try{i=Yn(o.teamfile_path,e)}catch{continue}for(let a of i.members)a.teamfile===void 0&&a.session===n&&r.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var xl=C(()=>{"use strict";Pt();Fs();Mn();Kn();Qn()});function mo(t){let e=Ar(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Yu=C(()=>{"use strict";Nt()});function Qg(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,o=()=>t.dal!==void 0?t.dal:(s===null&&(s=Ye({path:Pe(t)})),s),i=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>o().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&&$t(a.holder_pid)),pollMs:pJ,settleMs:hJ,maxHoldMs:zo(n),onHold:()=>B({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{i(),!(!a.held&&a.reason==="cleared")&&B({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function NN(t){let e=t.literalPrompt?t.newMessage:_J(t.newMessage,{newMessageFrom:t.newMessageFrom??gJ(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=$e(),s=0,o=0,i=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,i=Buffer.byteLength(c,"utf8"),o+=i),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};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=Qg(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await Il(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&&At(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:o,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:i,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 _J(t,e={}){return[`--- new prompt (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
1965
- `)}function gJ(t){return`${t.teamfile}:${t.alias}`}var cce,pJ,hJ,Zg=C(()=>{"use strict";Cr();Ee();he();Pt();Qs();En();cce=60*60*1e3,pJ=2e3,hJ=5e3});async function Qu(t){let e=t.onEvent??(()=>{}),n=yJ(t.io,e),r=null,s=null,o=null,i,a,l=null,c=!1,d=null,u=t.prompt,f,m=()=>{let p=t.signal?.reason;if(o===null||!["SIGINT","SIGTERM","SIGHUP"].includes(p))return;let _;try{_=n.dal??Ye({path:Pe(n)}),_.finishTrackedInvocation(o,{status:"cancelled",signal:p,exit_code:p==="SIGINT"?130:p==="SIGTERM"?143:129,error:`prompt holder received ${p}`,team_chat_log_id:l}),s!==null&&_.releaseAgentInflight(s.row,s.leaseId)}catch(h){n.stderr.write(`error: failed to record holder ${p}: ${String(h)}
1966
- `)}finally{n.dal===void 0&&_?.close()}};t.signal?.addEventListener("abort",m,{once:!0});try{let p=t.resolvedNativeTarget,_=p!==void 0;if(_&&(t.heldLease===void 0||t.conversation===void 0))throw new De("native session turns require a caller-held lease and conversation");let h=_?p:await G(n,D=>lt(t.teamfile,t.alias,D));if(t.expectedSession!==void 0&&(h.provider!==t.expectedSession.provider||h.sessionid!==t.expectedSession.sessionid))throw new De(`session changed for ${h.alias}; expected ${t.expectedSession.provider}:${t.expectedSession.sessionid}, found ${h.provider}:${h.sessionid}`);if(_&&(t.conversation.provider!==h.provider||t.conversation.sessionId!==h.sessionid))throw new De("native session changed for "+h.alias+"; expected "+h.provider+":"+h.sessionid+", found "+t.conversation.provider+":"+t.conversation.sessionId);let g=h.teamfile,w=await G(n,D=>xJ(D,t.env??process.env)),y=w.sender,E=_?"native:"+h.provider+":"+h.sessionid:await RJ(n,{explicitRoot:t.rootFlag,sender:y,receiverTeamfile:g,operatorOrigin:w.origin==="operator"}),T=t.env??process.env;if(!_){let D=await G(n,M=>M.getRootTeam(E)?.name??null);D!==null&&(T.LMBEE_TEAM_NAME=D)}if(o=await vJ(n,{receiverTeamfile:g,receiverAlias:h.alias,sender:y,rootTeamfile:E,provider:h.provider,model:h.model,sessionId:h.sessionid,cwd:h.sessiondir,prompt:t.prompt,origin:w.origin,parentInvocationId:ti(T.LMCTL_INVOCATION_ID)}),i=kJ(n,o),t.signal?.aborted)throw m(),Error("Chat turn cancelled");o!==null&&(T.LMCTL_INVOCATION_ID=String(o));try{_||di(n,Fe(g),g)}catch{}r={root_teamfile:E,sender_teamfile:y?.teamfile??null,sender_alias:y?.alias??null,receiver_teamfile:g,receiver_alias:h.alias,receiver_provider:h.provider,receiver_session_id:h.sessionid,origin:w.origin,message_type:t.messageType??null};let v=await MN(n,g,h.alias);if(v!==null){let D=Nl(v);return po(o,r,t.prompt,D,"unavailable"),d=ey(D,null),{status:"busy",message:D,teamChatLogId:null}}let b=!1;if(t.heldLease!==void 0){let D=t.heldLease;if(!await G(n,P=>{let W=P.getAgentInflight(g,h.alias);return W===null||W.sender_teamfile!==D.row.sender_teamfile||W.sender_alias!==D.row.sender_alias||W.started_at!==D.row.started_at||W.holder_pid!==process.pid?!1:P.heartbeatAgentInflight(D.row,D.leaseId,new Date().toISOString())})){let P=`bundle lease lost for ${h.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return po(o,r,t.prompt,P,"unavailable"),d=Rl(P,null),{status:"error",errorKind:"provider",message:P,teamChatLogId:null,messageId:null}}}else{let D=await wJ(n,g,h.alias);if(D.busy){let M=await EJ(n,g,h.alias);return M+=await TJ(n,g,h.alias),po(o,r,t.prompt,M,"unavailable"),d=ey(M,null),{status:"busy",message:M,teamChatLogId:null}}b=D.idleReclaim}if(y!==null&&y.teamfile!==g){let D=await G(n,M=>BI(M,{root:E,sender:y,receiverTeamfile:g,receiverAlias:h.alias,now:new Date}));if(D.stop){let M=qI(D.chain);return po(o,r,t.prompt,M,"cycle"),d=Rl(M,null),{status:"error",errorKind:"cycle",message:M,teamChatLogId:null,messageId:null}}}if(t.heldLease===void 0){let D=await LJ(n,{receiver_teamfile:g,receiver_alias:h.alias,sender_teamfile:y?.teamfile??g,sender_alias:y?.alias??"operator",...b?{force:!0,reclaimReason:"session-idle"}:{}});if(!D.acquired){let M=$N(g,h.alias,D.current);return M+=` ${Kg(Vg({holderPid:D.current.holder_pid,since:D.current.started_at}))}`,po(o,r,t.prompt,M,"unavailable"),d=ey(M,null),{status:"busy",message:M,teamChatLogId:null}}s={row:D.lease,leaseId:D.leaseId},t.onInflightAcquired?.(s),a=hd(M=>G(n,P=>P.heartbeatAgentInflight(s.row,s.leaseId,M)),{intervalMs:ON,onError:M=>{$e()&&At(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:M instanceof Error?M.message:String(M)}))}})}if(t.signal?.aborted)throw Error("Chat turn cancelled");f=dd({provider:h.provider,modelRequested:h.model??null,cwd:h.sessiondir,sessionId:h.sessionid}),r&&(r.started_at=f.startedAt);let k=await NN({sender:y??{teamfile:g,alias:"operator"},receiver:{teamfile:g,alias:h.alias,provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.isLead!==void 0?{isLead:h.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:D=>e({kind:"delta",chunk:D}),onProgress:D=>e({kind:"progress",alias:h.alias,event:D}),onPromptBuilt:async D=>{u=D,l===null&&(l=await OJ(n,{...r,message:D,usage:f}),l!==null&&(t.onAccepted?.(vr(l)),o!==null&&await IJ(n,o,l))),o!==null&&await bJ(n,o,D)}});u=k.prompt;let I=k.status==="stalled",N=k.status==="empty",A=null,S=I?`provider stalled${k.stalledAfterMs!==void 0?` after ${k.stalledAfterMs}ms`:""}`:N?"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":k.status==="error"?k.error??k.receipt:null,x=I||N||k.status==="error"?"error":"ok",R=await Oa(f,{status:k.status,sessionId:k.sessionId,usage:k.usage},()=>yh(n),{db:n.dal?.db,dbPath:Pe(n),env:n.env});l!==null?(await LN(n,l,{...r,message:u,response:k.receipt,status:x,error_detail:S,usage:R}),c=!0,A=l):A=await CN(n,{...r,message:u,response:k.receipt,status:x,error_detail:S,usage:R});let L=k.status!=="error"?k.warnings:void 0;if(I||N){let D=S;po(o,r,u,D,"error"),d=Rl(D,A,k.receipt,L)}else d=AJ(k.receipt,A,L);return{status:I?"stalled":N?"empty":"ok",replyText:k.receipt,wroteDelta:k.wroteDelta,teamChatLogId:A,messageId:A===null?null:vr(A),durationMs:k.durationMs,usage:R,errorClass:I||N?Ir(S,{model:f.model_requested,status:I?"stalled":"empty"}).class:null}}catch(p){let _=p instanceof Error?p.message:String(p),h=p,g=f?await Oa(f,{status:Jo(_,!!t.signal?.aborted),usage:h?.usage,sessionId:h?.sessionId},()=>yh(n),{db:n.dal?.db,dbPath:Pe(n),env:n.env}):void 0;return l!==null&&!c&&r!==null&&(await LN(n,l,{...r,message:u,response:null,status:"error",error_detail:_,usage:g}),c=!0),l===null&&r!==null&&g&&(l=await CN(n,{...r,message:u,response:null,status:"error",error_detail:_,usage:g})),po(o,r,u,_,"error"),d={...Rl(_,l),signal:p?.signal??null,exit_code:p?.exitCode??null},{status:"error",errorKind:p instanceof De?"target":"provider",message:_,teamChatLogId:l,messageId:l===null?null:vr(l),usage:g,errorClass:Ir(_,{model:f?.model_requested}).class}}finally{t.signal?.removeEventListener("abort",m),i!==void 0&&clearInterval(i),a!==void 0&&clearInterval(a),l!==null&&await DJ(n,r,vr(l)),s!==null&&await CJ(n,s.row,s.leaseId)&&t.onInflightReleased?.(s.leaseId),o!==null&&await SJ(n,o,d??Rl("chat turn exited without a terminal outcome",null))}}function yJ(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function wJ(t,e,n){let r=await G(t,o=>(Xd(o,e,n),wn(o,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await G(t,o=>wN(o,r,e,n));return{busy:!s,idleReclaim:s}}async function EJ(t,e,n){let r=await MN(t,e,n);if(r!==null)return Nl(r);let s=await G(t,o=>o.getAgentInflight(e,n));return s!==null?$N(e,n,s):`${n} is busy; wait and retry`}async function TJ(t,e,n){let r=await G(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${Kg(Vg({holderPid:r.holder_pid,since:r.started_at}))}`}async function vJ(t,e){try{return(await G(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:NJ(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 $e()&&At(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function SJ(t,e,n){try{await G(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){$e()&&At(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function bJ(t,e,n){try{await G(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){$e()&&At(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function IJ(t,e,n){try{await G(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){$e()&&At(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function kJ(t,e){if(e===null)return;let n=setInterval(()=>{G(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{$e()&&At(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},ON);return n.unref?.(),n}function DN(t){return t!==void 0&&t.length>0?{config_warnings:JSON.stringify(t)}:{}}function AJ(t,e,n){return{status:"done",result_summary:Zu(t),error:null,team_chat_log_id:e,...DN(n)}}function ey(t,e){return{status:"busy",result_summary:Zu(t),error:t,team_chat_log_id:e}}function Rl(t,e,n,r){return{status:"error",result_summary:n===void 0?Qb(t,500):Zu(n),error:t,team_chat_log_id:e,...DN(r)}}function Zu(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function NJ(t,e,n){return`lmctl prompt ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function xJ(t,e){let n=zu(e,t);if(n.ok)return{sender:mo(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(fo("chat",e,t))}async function RJ(t,e){if(e.explicitRoot!==void 0)return await G(t,r=>Qe(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await G(t,r=>XI(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function LJ(t,e){return await G(t,n=>{let r=$e(),s=ls(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:ms(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&At(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:RN(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&At(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:RN(s.current)})),{acquired:!1,current:s.current})})}async function MN(t,e,n){return await G(t,r=>{for(let o=0;o<2;o+=1){let i=r.getTerminalLock(e,n);if(i===null)return null;if(zg(i).live)return i;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,i.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:zg(s).live?s:null})}function RN(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 CJ(t,e,n){try{return await G(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)}
1967
- `)}return!1}function $N(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 OJ(t,e){let n=Ll(e.message);try{return await G(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)}
1963
+ ${fJ(t)}`}function zu(t,e){let n=Yg(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function Yg(t,e){let n=t[Gh];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let o of e.listRootTeams()){let i;try{i=Yn(o.teamfile_path,e)}catch{continue}for(let a of i.members)a.teamfile===void 0&&a.session===n&&r.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var xl=C(()=>{"use strict";Pt();Fs();Mn();Kn();Qn()});function mo(t){let e=Ar(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Yu=C(()=>{"use strict";Nt()});function Qg(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,o=()=>t.dal!==void 0?t.dal:(s===null&&(s=Ye({path:Pe(t)})),s),i=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>o().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&&$t(a.holder_pid)),pollMs:mJ,settleMs:pJ,maxHoldMs:zo(n),onHold:()=>B({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{i(),!(!a.held&&a.reason==="cleared")&&B({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function NN(t){let e=t.literalPrompt?t.newMessage:hJ(t.newMessage,{newMessageFrom:t.newMessageFrom??_J(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=$e(),s=0,o=0,i=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,i=Buffer.byteLength(c,"utf8"),o+=i),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};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=Qg(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await Il(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&&At(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:o,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:i,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 hJ(t,e={}){return[`--- new prompt (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
1964
+ `)}function _J(t){return`${t.teamfile}:${t.alias}`}var lce,mJ,pJ,Zg=C(()=>{"use strict";Cr();Ee();he();Pt();Qs();En();lce=60*60*1e3,mJ=2e3,pJ=5e3});async function Qu(t){let e=t.onEvent??(()=>{}),n=gJ(t.io,e),r=null,s=null,o=null,i,a,l=null,c=!1,d=null,u=t.prompt,f,m=()=>{let p=t.signal?.reason;if(o===null||!["SIGINT","SIGTERM","SIGHUP"].includes(p))return;let _;try{_=n.dal??Ye({path:Pe(n)}),_.finishTrackedInvocation(o,{status:"cancelled",signal:p,exit_code:p==="SIGINT"?130:p==="SIGTERM"?143:129,error:`prompt holder received ${p}`,team_chat_log_id:l}),s!==null&&_.releaseAgentInflight(s.row,s.leaseId)}catch(h){n.stderr.write(`error: failed to record holder ${p}: ${String(h)}
1965
+ `)}finally{n.dal===void 0&&_?.close()}};t.signal?.addEventListener("abort",m,{once:!0});try{let p=t.resolvedNativeTarget,_=p!==void 0;if(_&&(t.heldLease===void 0||t.conversation===void 0))throw new De("native session turns require a caller-held lease and conversation");let h=_?p:await G(n,D=>lt(t.teamfile,t.alias,D));if(t.expectedSession!==void 0&&(h.provider!==t.expectedSession.provider||h.sessionid!==t.expectedSession.sessionid))throw new De(`session changed for ${h.alias}; expected ${t.expectedSession.provider}:${t.expectedSession.sessionid}, found ${h.provider}:${h.sessionid}`);if(_&&(t.conversation.provider!==h.provider||t.conversation.sessionId!==h.sessionid))throw new De("native session changed for "+h.alias+"; expected "+h.provider+":"+h.sessionid+", found "+t.conversation.provider+":"+t.conversation.sessionId);let g=h.teamfile,w=await G(n,D=>NJ(D,t.env??process.env)),y=w.sender,E=_?"native:"+h.provider+":"+h.sessionid:await xJ(n,{explicitRoot:t.rootFlag,sender:y,receiverTeamfile:g,operatorOrigin:w.origin==="operator"}),T=t.env??process.env;if(!_){let D=await G(n,M=>M.getRootTeam(E)?.name??null);D!==null&&(T.LMBEE_TEAM_NAME=D)}if(o=await TJ(n,{receiverTeamfile:g,receiverAlias:h.alias,sender:y,rootTeamfile:E,provider:h.provider,model:h.model,sessionId:h.sessionid,cwd:h.sessiondir,prompt:t.prompt,origin:w.origin,parentInvocationId:ti(T.LMCTL_INVOCATION_ID)}),i=IJ(n,o),t.signal?.aborted)throw m(),Error("Chat turn cancelled");o!==null&&(T.LMCTL_INVOCATION_ID=String(o));try{_||di(n,Fe(g),g)}catch{}r={root_teamfile:E,sender_teamfile:y?.teamfile??null,sender_alias:y?.alias??null,receiver_teamfile:g,receiver_alias:h.alias,receiver_provider:h.provider,receiver_session_id:h.sessionid,origin:w.origin,message_type:t.messageType??null};let v=await MN(n,g,h.alias);if(v!==null){let D=Nl(v);return po(o,r,t.prompt,D,"unavailable"),d=ey(D,null),{status:"busy",message:D,teamChatLogId:null}}let b=!1;if(t.heldLease!==void 0){let D=t.heldLease;if(!await G(n,P=>{let W=P.getAgentInflight(g,h.alias);return W===null||W.sender_teamfile!==D.row.sender_teamfile||W.sender_alias!==D.row.sender_alias||W.started_at!==D.row.started_at||W.holder_pid!==process.pid?!1:P.heartbeatAgentInflight(D.row,D.leaseId,new Date().toISOString())})){let P=`bundle lease lost for ${h.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return po(o,r,t.prompt,P,"unavailable"),d=Rl(P,null),{status:"error",errorKind:"provider",message:P,teamChatLogId:null,messageId:null}}}else{let D=await yJ(n,g,h.alias);if(D.busy){let M=await wJ(n,g,h.alias);return M+=await EJ(n,g,h.alias),po(o,r,t.prompt,M,"unavailable"),d=ey(M,null),{status:"busy",message:M,teamChatLogId:null}}b=D.idleReclaim}if(y!==null&&y.teamfile!==g){let D=await G(n,M=>BI(M,{root:E,sender:y,receiverTeamfile:g,receiverAlias:h.alias,now:new Date}));if(D.stop){let M=qI(D.chain);return po(o,r,t.prompt,M,"cycle"),d=Rl(M,null),{status:"error",errorKind:"cycle",message:M,teamChatLogId:null,messageId:null}}}if(t.heldLease===void 0){let D=await RJ(n,{receiver_teamfile:g,receiver_alias:h.alias,sender_teamfile:y?.teamfile??g,sender_alias:y?.alias??"operator",...b?{force:!0,reclaimReason:"session-idle"}:{}});if(!D.acquired){let M=$N(g,h.alias,D.current);return M+=` ${Kg(Vg({holderPid:D.current.holder_pid,since:D.current.started_at}))}`,po(o,r,t.prompt,M,"unavailable"),d=ey(M,null),{status:"busy",message:M,teamChatLogId:null}}s={row:D.lease,leaseId:D.leaseId},t.onInflightAcquired?.(s),a=hd(M=>G(n,P=>P.heartbeatAgentInflight(s.row,s.leaseId,M)),{intervalMs:ON,onError:M=>{$e()&&At(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:M instanceof Error?M.message:String(M)}))}})}if(t.signal?.aborted)throw Error("Chat turn cancelled");f=dd({provider:h.provider,modelRequested:h.model??null,cwd:h.sessiondir,sessionId:h.sessionid}),r&&(r.started_at=f.startedAt);let k=await NN({sender:y??{teamfile:g,alias:"operator"},receiver:{teamfile:g,alias:h.alias,provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.isLead!==void 0?{isLead:h.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:D=>e({kind:"delta",chunk:D}),onProgress:D=>e({kind:"progress",alias:h.alias,event:D}),onPromptBuilt:async D=>{u=D,l===null&&(l=await CJ(n,{...r,message:D,usage:f}),l!==null&&(t.onAccepted?.(vr(l)),o!==null&&await bJ(n,o,l))),o!==null&&await SJ(n,o,D)}});u=k.prompt;let I=k.status==="stalled",N=k.status==="empty",A=null,S=I?`provider stalled${k.stalledAfterMs!==void 0?` after ${k.stalledAfterMs}ms`:""}`:N?"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":k.status==="error"?k.error??k.receipt:null,x=I||N||k.status==="error"?"error":"ok",R=await Oa(f,{status:k.status,sessionId:k.sessionId,usage:k.usage},()=>yh(n),{db:n.dal?.db,dbPath:Pe(n),env:n.env});l!==null?(await LN(n,l,{...r,message:u,response:k.receipt,status:x,error_detail:S,usage:R}),c=!0,A=l):A=await CN(n,{...r,message:u,response:k.receipt,status:x,error_detail:S,usage:R});let L=k.status!=="error"?k.warnings:void 0;if(I||N){let D=S;po(o,r,u,D,"error"),d=Rl(D,A,k.receipt,L)}else d=kJ(k.receipt,A,L);return{status:I?"stalled":N?"empty":"ok",replyText:k.receipt,wroteDelta:k.wroteDelta,teamChatLogId:A,messageId:A===null?null:vr(A),durationMs:k.durationMs,usage:R,errorClass:I||N?Ir(S,{model:f.model_requested,status:I?"stalled":"empty"}).class:null}}catch(p){let _=p instanceof Error?p.message:String(p),h=p,g=f?await Oa(f,{status:Jo(_,!!t.signal?.aborted),usage:h?.usage,sessionId:h?.sessionId},()=>yh(n),{db:n.dal?.db,dbPath:Pe(n),env:n.env}):void 0;return l!==null&&!c&&r!==null&&(await LN(n,l,{...r,message:u,response:null,status:"error",error_detail:_,usage:g}),c=!0),l===null&&r!==null&&g&&(l=await CN(n,{...r,message:u,response:null,status:"error",error_detail:_,usage:g})),po(o,r,u,_,"error"),d={...Rl(_,l),signal:p?.signal??null,exit_code:p?.exitCode??null},{status:"error",errorKind:p instanceof De?"target":"provider",message:_,teamChatLogId:l,messageId:l===null?null:vr(l),usage:g,errorClass:Ir(_,{model:f?.model_requested}).class}}finally{t.signal?.removeEventListener("abort",m),i!==void 0&&clearInterval(i),a!==void 0&&clearInterval(a),l!==null&&await OJ(n,r,vr(l)),s!==null&&await LJ(n,s.row,s.leaseId)&&t.onInflightReleased?.(s.leaseId),o!==null&&await vJ(n,o,d??Rl("chat turn exited without a terminal outcome",null))}}function gJ(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function yJ(t,e,n){let r=await G(t,o=>(Xd(o,e,n),wn(o,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await G(t,o=>wN(o,r,e,n));return{busy:!s,idleReclaim:s}}async function wJ(t,e,n){let r=await MN(t,e,n);if(r!==null)return Nl(r);let s=await G(t,o=>o.getAgentInflight(e,n));return s!==null?$N(e,n,s):`${n} is busy; wait and retry`}async function EJ(t,e,n){let r=await G(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${Kg(Vg({holderPid:r.holder_pid,since:r.started_at}))}`}async function TJ(t,e){try{return(await G(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:AJ(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 $e()&&At(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function vJ(t,e,n){try{await G(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){$e()&&At(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function SJ(t,e,n){try{await G(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){$e()&&At(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function bJ(t,e,n){try{await G(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){$e()&&At(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function IJ(t,e){if(e===null)return;let n=setInterval(()=>{G(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{$e()&&At(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},ON);return n.unref?.(),n}function DN(t){return t!==void 0&&t.length>0?{config_warnings:JSON.stringify(t)}:{}}function kJ(t,e,n){return{status:"done",result_summary:Zu(t),error:null,team_chat_log_id:e,...DN(n)}}function ey(t,e){return{status:"busy",result_summary:Zu(t),error:t,team_chat_log_id:e}}function Rl(t,e,n,r){return{status:"error",result_summary:n===void 0?Qb(t,500):Zu(n),error:t,team_chat_log_id:e,...DN(r)}}function Zu(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function AJ(t,e,n){return`lmctl prompt ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function NJ(t,e){let n=zu(e,t);if(n.ok)return{sender:mo(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(fo("chat",e,t))}async function xJ(t,e){if(e.explicitRoot!==void 0)return await G(t,r=>Qe(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await G(t,r=>XI(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function RJ(t,e){return await G(t,n=>{let r=$e(),s=ls(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:ms(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&At(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:RN(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&At(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:RN(s.current)})),{acquired:!1,current:s.current})})}async function MN(t,e,n){return await G(t,r=>{for(let o=0;o<2;o+=1){let i=r.getTerminalLock(e,n);if(i===null)return null;if(zg(i).live)return i;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,i.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:zg(s).live?s:null})}function RN(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 LJ(t,e,n){try{return await G(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)}
1966
+ `)}return!1}function $N(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 CJ(t,e){let n=Ll(e.message);try{return await G(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)}
1968
1967
  `),null}}async function LN(t,e,n){let r=Ll(n.message),s=n.response===null?null:Ll(n.response);try{await G(t,o=>o.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(o){t.stderr.write(`warning: failed to finish chat log ${e}: ${o instanceof Error?o.message:String(o)}
1969
- `)}}async function DJ(t,e,n){if(e!==null)try{await G(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)}
1968
+ `)}}async function OJ(t,e,n){if(e!==null)try{await G(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)}
1970
1969
  `)}}async function CN(t,e){let n=Ll(e.message),r=e.response===null?null:Ll(e.response);try{return await G(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)}
1971
1970
  `),null}}function po(t,e,n,r,s){t!==null||e===null||B({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:Zu(n)})}function Ll(t){return t.length<=xN?{text:t,truncated:!1}:{text:t.slice(0,xN),truncated:!0}}var xN,ON,ty=C(()=>{"use strict";Da();xd();Cd();sn();Pt();Nt();Tt();Hd();Qn();Bd();Ee();he();En();qd();EN();vN();Ku();xl();Yu();Zg();wd();xN=256*1024,ON=3e4});import*as PN from"node:readline";var Or,ef=C(()=>{"use strict";he();Or=class{io;override;rl;queue=[];waiters=[];ended=!1;constructor(e,n){this.io=e,this.override=n}get interactive(){return!Dn(this.io)&&(this.override!==void 0||(this.io.stdin??process.stdin).isTTY===!0)}async ask(e){if(!this.interactive)throw new Error(`More information is needed: ${e.trim()} Run interactively or use an explicit command with all arguments.`);let n;if(this.override?n=await this.override(e):(this.rl||(this.rl=PN.createInterface({input:this.io.stdin??process.stdin,terminal:!1}),this.rl.on("line",r=>{let s=this.waiters.shift();s?s(r):this.queue.push(r)}),this.rl.on("close",()=>{for(this.ended=!0;this.waiters.length;)this.waiters.shift()(null)})),this.io.stderr.write(e),n=this.queue.length?this.queue.shift():this.ended?null:await new Promise(r=>this.waiters.push(r))),n===null)throw new Error("Input ended; no further action taken.");return n.trim()}async confirm(e){let n=await this.ask(`${e} [y/N]: `);return/^(y|yes)$/i.test(n)}async choose(e,n,r=!1){if(n.length===1&&!r)return n[0];if(!n.length)throw new Error(`No choices available for ${e}`);for(this.io.stderr.write(`${e}
1972
1971
  ${n.map((s,o)=>` ${o+1}) ${s}`).join(`
1973
1972
  `)}
1974
1973
  `);;){let s=await this.ask("Choose a number or exact value: "),o=n.filter(i=>i.toLowerCase()===s.toLowerCase());if(o.length===1)return o[0];if(/^[1-9]\d*$/.test(s)&&Number(s)<=n.length)return n[Number(s)-1];this.io.stderr.write(`Choose one of the listed values.
1975
- `)}}close(){this.rl?.close()}}});function tf(t){return/\S\s+\S/u.test(t)}function UN(t){let[e,...n]=t;if(!e||e.startsWith("-"))return null;if(/^https?:\/\//i.test(e)&&/\.lms(?:[?#].*)?$/i.test(e))return{kind:"hosted-script",url:e,rest:n};if(/\.lms$/i.test(e))return{kind:"script",file:e,rest:n};if(n.some(o=>["--force","-f","--yes","-y"].includes(o)))throw new Error("Force/yes flags are not allowed in inferred mode; destructive changes require confirmation.");if(n.some(o=>o.startsWith("-")&&!tf(o)))throw new Error("Use an explicit command for options; no inferred action was taken.");if(/\.lmb$/i.test(e))return{kind:"batch",file:e,rest:n};let r=Ar(e)??(e.endsWith(":")&&st(e.slice(0,-1))?{teamfile:e.slice(0,-1),alias:""}:null);if(r||st(e)){let o=r?.teamfile??e,i=r?.alias,a=[...n];return!i&&a.length&&!tf(a[0])&&(i=a.shift()),{kind:"team",file:o,...i!==void 0?{alias:i}:{},...a.length?a.some(tf)?{prompt:a.join(" ")}:{pendingPrompt:a.join(" ")}:{}}}let s=n.length?n.some(tf)?{prompt:n.join(" ")}:{pendingPrompt:n.join(" ")}:{};return Ah(e)?{kind:"session",id:e,...s}:{kind:"models",query:e,...s}}function nf(t,e){let n=t.toLowerCase(),r=e.filter(s=>s.toLowerCase()===n);return[...new Set(r.length?r:e.filter(s=>s.toLowerCase().startsWith(n)))]}var FN=C(()=>{"use strict";Tt();Nt()});import{spawnSync as ay}from"node:child_process";import{existsSync as WN,readFileSync as HN}from"node:fs";import{homedir as BN}from"node:os";import{resolve as oy}from"node:path";function Ai(t,e){return e.code==="ETIMEDOUT"?`${t} did not respond within lint's own spawn timeout (${e.message}) \u2014 this does not mean the provider itself is unreachable, only that this specific check didn't finish in time.`:`${t} could not be run: ${e.message}`}function PJ(){let t=ay("agy",["models"],{encoding:"utf-8",timeout:$J});return{status:t.status,stdout:t.stdout??"",error:t.error}}function FJ(t){let e=[],n={};for(let r of t.split(/\r?\n/)){let s=r.trim(),o=s.indexOf(" ");if(o<0)continue;let i=s.slice(0,o).trim(),a=s.slice(o+1).trim();i&&(e.push(i),a&&(n[i]=a))}return{models:e,displayNames:n}}function ho(t){if(!t&&ny)return ny;let e=o=>(t||(ny=o),o),n;try{n=(t??UJ??PJ)()}catch(o){return e({available:!1,models:[],reason:o instanceof Error?Ai("agy models",o):`agy models could not be run: ${String(o)}`})}if(n.error)return e({available:!1,models:[],reason:Ai("agy models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${n.status??"unknown"}`});let{models:r,displayNames:s}=FJ(n.stdout);return r.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:r,displayNames:s})}function WJ(){let t=ay("codex",["debug","models"],{encoding:"utf-8",timeout:jJ});return{status:t.status,stdout:t.stdout??"",error:t.error}}function BJ(t){let e;try{e=JSON.parse(t)}catch{return}let n=e.models;if(!Array.isArray(n))return;let r=[];for(let s of n){if(!s||typeof s!="object")continue;let{slug:o,visibility:i}=s;typeof o=="string"&&i==="list"&&r.push(o)}return r}function _o(t){if(!t&&ry)return ry;let e=s=>(t||(ry=s),s),n;try{n=(t??HJ??WJ)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?Ai("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:Ai("codex debug models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`codex debug models exited with status ${n.status??"unknown"}`});let r=BJ(n.stdout);return r===void 0?e({available:!1,models:[],reason:"codex debug models did not return parseable JSON"}):r.length===0?e({available:!1,models:[],reason:"codex debug models returned no user-visible models"}):e({available:!0,models:r})}function qJ(t){let e=ay("opencode",t?["models",t]:["models"],{encoding:"utf-8",timeout:XJ});return{status:e.status,stdout:e.stdout??"",error:e.error}}function ly(t,e){if(!e&&sy.has(t))return sy.get(t);let n=i=>(e||sy.set(t,i),i),r=t?`opencode models ${t}`:"opencode models",s;try{s=(e??qJ)(t)}catch(i){return n({available:!1,models:[],reason:i instanceof Error?Ai(r,i):`${r} could not be run: ${String(i)}`})}if(s.error)return n({available:!1,models:[],reason:Ai(r,s.error)});if(s.status!==0)return n({available:!1,models:[],reason:`${r} exited with status ${s.status??"unknown"}`});let o=s.stdout.split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0);return o.length===0?n({available:!1,models:[],reason:`${r} returned no models`}):n({available:!0,models:o})}function cy(t,e={}){let n=[];for(let r of t){let s=r.provider.trim().toLowerCase();if(r.effort&&s!=="opencode"&&s!=="lmplayer"&&s!=="qwen"&&s!=="muse"&&n.push(`[${r.alias}] effort="${r.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),s==="qwen"&&r.effort&&n.push(`[${r.alias}] effort="${r.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),s==="copilot"){if(!r.model)continue;n.push(`[${r.alias}] model="${r.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(s!=="lmplayer"){if(s==="opencode"){if(r.effort&&!r.model&&n.push(`[${r.alias}] effort="${r.effort}" has no effect without model= on an opencode member.`),!r.model)continue;let o=JJ(e.opencodeConfigPath);if(!o.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for opencode: ${o.reason}.`);continue}if(o.models.includes(r.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(r.model))continue;if(!r.model.includes("/")){let l=o.models.filter(c=>c.endsWith(`/${r.model}`));n.push(l.length>0?`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${r.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}let i=r.model.slice(0,r.model.indexOf("/")),a=ly(i,e.opencodeModelsRunner);if(a.available&&a.models.includes(r.model))continue;if(a.available&&!a.models.includes(r.model)){n.push(`[${r.alias}] model="${r.model}" was not found in opencode's LOCALLY-VISIBLE live catalog for "${i}" (checked \`opencode models ${i}\`) -- this is unresolved, not a confirmed unavailability: it could mean opencode genuinely doesn't serve this model, OR that your local catalog/auth for "${i}" is stale/incomplete. Declaring it in opencode.json may or may not help; if it doesn't, check whether a non-opencode provider serves this model directly (e.g. \`lmctl lint\` with model= against provider=codex/claude/gemini/agy).`);continue}n.push(`[${r.alias}] model="${r.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(s==="kimi"){if(!r.model)continue;let o=go(e.kimiConfigPath);o.available?o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not declared in Kimi's [models] config. Valid configured models: ${Cl(o.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for kimi: ${o.reason}.`);continue}if(s==="agy"){if(!r.model)continue;let o=ho(e.agyModelsRunner);o.available?o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${Cl(o.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for agy: ${o.reason}.`);continue}if(s==="dsh"){if(!r.model||ki.includes(r.model))continue;Ii.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in dsh's built-in catalog. Valid pinned models: ${Cl(Ii)}. Valid server-resolved aliases (DeepSeek resolves these to its current model server-side -- pinning to a specific version instead is a DOWNGRADE, not a safer choice): ${Cl(ki)}. The catalog is patchable via dsh profile overlays \u2014 a model added that way warns here even though it may resolve.`);continue}if(s==="hermes"){if(!r.model)continue;let o=r.model.indexOf(":");(o<=0||o===r.model.length-1)&&n.push(`[${r.alias}] model="${r.model}" should use <provider>:<model> from Hermes's ACP catalog. lmctl checks the shape only; provider and model availability are resolved by Hermes.`);continue}if(s!=="pi"){if(s==="codex"){if(!r.model)continue;r.model===jN&&n.push(`[${r.alias}] model="${jN}" is banned as a build model (operator, 2026-09-06) -- it's a fast/cheap classification model, not intended for build work, and there's no cost reason left to reach for it. Use model=gpt-5.6-sol (or leave model= unset) for build work; if this member genuinely does non-build/classification work, this warning can be ignored.`);let o=_o(e.codexModelsRunner);if(!o.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for codex: ${o.reason}.`);continue}o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in codex's live model catalog (\`codex debug models\`). Valid models: ${Cl(o.models)}`);continue}r.model&&(XN.has(s)||n.push(`[${r.alias}] model="${r.model}" cannot be verified for provider "${s}": no model validation path exists for this provider.`))}}}return n}async function qN(t,e={}){let n=t.filter(i=>i.model!==void 0&&XN.has(i.provider.trim().toLowerCase()));if(n.length===0)return{warnings:[],errors:[]};let r=e.snapshot??await Dt();if(r.catalog===null)return{warnings:[],errors:[]};let s=[],o=[];for(let i of n){let a=i.provider.trim().toLowerCase(),l=i.model,c=cd(a,l,r.catalog,r.aliases);if(c.kind==="unknown"){let d=DS(r.catalog,a)??0;s.push(`[${i.alias}] model "${l}" is unknown to the lmprice catalog for provider "${a}" (${d} known) -- not necessarily wrong: may be a model too new for lmprice to have published yet, or a typo. A matching lmprice catalog/alias entry would resolve this; lint cannot otherwise confirm whether ${a} accepts it.`)}else c.kind==="wrong-provider"?o.push({field:i.alias,message:`model "${l}" is not offered by provider "${a}" -- it is a recognized model, but only under: ${c.otherProviders.join(", ")}. Declare provider="${c.otherProviders[0]}" (or another listed provider), or use a model "${a}" actually offers.`}):c.kind==="known-unpriced"&&s.push(`[${i.alias}] model "${l}" is recognized in the lmprice catalog but has no price information \u2014 cost will be unavailable`);if(a==="claude"&&(c.kind==="priced"||c.kind==="known-unpriced"||c.kind==="estimated")&&MJ.test(l)){let d=l.replace(/(\d)\.(?=\d)/g,"$1-");s.push(`[${i.alias}] model="${l}" matches the lmprice catalog only through its OpenRouter-style spelling ("." between version numbers); claude's own CLI expects "-" there and does an exact match, so it may reject this string verbatim even though lint recognizes it. If seed/chat fails with "issue with the selected model," try model="${d}" instead.`)}}return{warnings:s,errors:o}}async function GN(t,e={}){return(await qN(t,e)).warnings}async function JN(t,e={}){return(await qN(t,e)).errors}function go(t){let e=process.env.KIMI_CODE_HOME||oy(BN(),".kimi-code"),n=t??oy(e,"config.toml");if(!WN(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=HN(n,"utf-8")}catch(o){return{available:!1,models:[],reason:`${n} could not be read: ${o instanceof Error?o.message:String(o)}`}}let s=new Set;for(let o of r.split(/\r?\n/)){if(/^\s*\[/.test(o)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(o))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let i=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(o);if(!i)continue;let a=GJ(i[1]);if(i[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s]}}function GJ(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function JJ(t){let e=t??oy(BN(),".config","opencode","opencode.json");if(!WN(e))return{available:!0,models:[]};let n;try{n=JSON.parse(HN(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:VJ(n)}}function VJ(t){if(!iy(t))return[];let e=rf(t.provider)??rf(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!iy(s))continue;let o=rf(s.models)??rf(s.model);if(o)for(let i of Object.keys(o))n.add(i.startsWith(`${r}/`)?i:`${r}/${i}`)}return[...n].sort()}function rf(t){return iy(t)?t:null}function iy(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Cl(t){return t.length>0?t.join(", "):"(none)"}var XN,MJ,Ii,ki,jN,$J,ny,UJ,jJ,ry,HJ,XJ,sy,Ni=C(()=>{"use strict";_n();is();XN=new Set(Object.keys(Jn).filter(t=>t!=="codex"&&t!=="kimi")),MJ=/\d\.(?=\d)/,Ii=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],ki=["deepseek-flash","deepseek-pro"],jN="gpt-5.3-codex-spark",$J=15e3;ny=null;jJ=5e3;ry=null;XJ=5e3;sy=new Map});function sf(t){return["agy","opencode","copilot","hermes","pi","lmplayer","miniplayer"].includes(t)}function VN(t){if(!/(?:^|[/:])(?:gpt-|o\d(?:-|$)|chatgpt-|claude[ -]|gemini[ -])/i.test(t))return!1;let e=/claude/i.test(t)?"claude":/gemini/i.test(t)?"gemini":"codex";return Jn[e].isChatModel({source:"",source_model_id:t,pricing:{input_per_1m_tokens:null,output_per_1m_tokens:null,input_cache_read_per_1m_tokens:null}})}function KJ(t,e){let n=[];for(let r of e.records){let s=r.source_model_id,o;if(t==="copilot")r.provider==="github_copilot"&&s.startsWith("github_copilot/")&&(o=s.slice(15));else if(["hermes","pi","lmplayer","miniplayer"].includes(t))r.source==="openrouter"&&/^(openai|anthropic|google)\//.test(s)&&(o=t==="hermes"?`openrouter:${s}`:t==="pi"?`openrouter/${s}`:s);else{let i={claude:"anthropic",gemini:"gemini",qwen:"dashscope"}[t],a=Jn[t];if(i&&r.source==="litellm"&&r.provider===i&&a?.coversRecord(r)){o=s.startsWith(`${i}/`)?s.slice(i.length+1):s;let l=t==="claude"?"claude-":t==="gemini"?"gemini-":"qwen";(o.includes("/")||!o.startsWith(l))&&(o=void 0)}}!o||r.mode!=null&&r.mode!=="chat"||o.includes(":batch")||o.includes(":free")||sf(t)&&!VN(o)||n.push(o)}return[...new Set(n)].sort()}async function of(t){let e;switch(t){case"dsh":e=[...ki,...Ii];break;case"codex":e=_o().models;break;case"agy":e=ho().models;break;case"kimi":e=go().models;break;case"opencode":e=ly("").models;break;default:{let{catalog:n}=await Dt();e=n?KJ(t,n):[]}}return[...new Set(e.filter(n=>!sf(t)||VN(n)))].sort()}var dy=C(()=>{"use strict";_n();is();Ni()});var ZN={};ye(ZN,{MODEL_PROVIDERS:()=>Dr,knownModelNames:()=>or,runModels:()=>af});function YN(t,e){switch(t){case"codex":return _o();case"agy":return ho();case"kimi":return go();case"claude":{let n=e.catalog?.records??[],r=n.flatMap(o=>o.native?.claude_code&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(o.native.claude_code)?[o.native.claude_code]:[]),s=r.length?r:n.flatMap(o=>{let i=o.source_model_id.split("/").at(-1);return o.provider==="anthropic"&&o.mode==="chat"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(i)?[i]:[]});return s.length?{available:!0,models:[...new Set(s)]}:{available:!1,models:[],reason:"No Claude Code ids in the available catalog"}}default:return{available:!1,models:[]}}}async function or(t){if(!Dr.includes(t))return of(t);let e=t==="claude"?await Dt():{catalog:null,aliases:null,source:"unavailable",generatedAt:null};return YN(t,e).models}function uy(t,e){return t==="agy"?e.replace(/-(low|medium|high)$/i,""):e}function fy(t,e,n){if(!Dr.includes(t)||!n.catalog)return;let r=YJ[t],s=uy(t,e);return n.catalog.records.find(o=>o.native?.[r]===s)}function Ol(t,e,n){let r=Mt(t,e,n.catalog,n.aliases).state;return r.kind==="priced"||r.kind==="estimated"||r.kind==="known-unpriced"}function QJ(t,e,n){if(fy(t,e,n))return!0;let r=QN(t,e,n)?.state;return r?.kind==="priced"||r?.kind==="estimated"||r?.kind==="known-unpriced"}function ZJ(t,e,n){let r=n.catalog?.records??[];if(t==="claude"||!n.catalog)return[];let s=new Set;if(t==="codex")for(let i of r)if(i.native?.codex)s.add(i.native.codex);else{let a=i.source_model_id.split("/").at(-1);/^(?:gpt-|o\d|chatgpt|ft:gpt)/i.test(a)&&Ol("codex",a,n)&&s.add(a)}else if(t==="agy"){let i=new Set;for(let a of r){if(a.native?.agy){i.add(uy("agy",a.native.agy));continue}if(a.mode!=="chat")continue;let l=a.source_model_id.split("/").at(-1);(/^gemini-\d/.test(l)?Ol("gemini",l,n):a.provider==="anthropic"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(l)?Ol("claude",l,n):/^gpt-oss-\d/.test(l)?Ol("codex",l,n):!1)&&i.add(l)}for(let a of i)for(let l of["low","medium","high"])s.add(`${a}-${l}`)}else if(t==="kimi"){for(let i of r)i.native?.kimi&&s.add(i.native.kimi);for(let i of r){if(i.native?.kimi)continue;let a=i.source_model_id.split("/").at(-1),l=a.startsWith("kimi-")?`kimi-code/${a.slice(5)}`:a;/^kimi-code\/[a-z0-9][a-z0-9._-]*$/i.test(l)&&Ol("kimi",l,n)&&s.add(l)}}let o=new Set(e);return[...s].filter(i=>!o.has(i)&&QJ(t,i,n))}function QN(t,e,n){if(!n.catalog)return null;if(fy(t,e,n)||t!=="agy")return Mt(t,e,n.catalog,n.aliases);let s=uy("agy",e);if(!/^(?:gemini-\d|claude-[a-z]+-\d|gpt-oss-\d)/.test(s))return null;let o=n.catalog.records.map(i=>{let a=i.source_model_id.split("/").at(-1).toLowerCase();return i.mode!=="chat"||a!==s.toLowerCase()?i:{...i,native:{...i.native,agy:s}}});return Mt("agy",s,{...n.catalog,records:o},n.aliases)}function zN(t,e,n,r,s){let o=fy(t,e,r),i=QN(t,e,r),a=i?.offer??null,l=i?.state,c=l?.kind==="priced"||l?.kind==="estimated"?l.model.id:l?.kind==="known-unpriced"?l.id:null;return{id:e,display_name:n,status:s,catalog_model:o?.source_model_id??c,pricing:{input_per_1m_tokens:a?.pricing.input_per_1m_tokens??null,output_per_1m_tokens:a?.pricing.output_per_1m_tokens??null,input_cache_read_per_1m_tokens:a?.pricing.input_cache_read_per_1m_tokens??null},price_resolution:l?.kind??(r.catalog?"unknown":"no-catalog"),price_source_model_id:a?.sourceModelId??null,price_estimated:a?.estimated??!1}}async function af(t,e,n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(KN),0;let r=ce(t,[],["--old","--json"]),s=r.positionals.find(u=>u!=="all"&&!Dr.includes(u)),o=r.error??(s===void 0?void 0:`unknown provider: ${s} (valid targets: all, ${Dr.join(", ")})`);if(o!==void 0)return e.stderr.write(`error: ${o}
1974
+ `)}}close(){this.rl?.close()}}});function tf(t){return/\S\s+\S/u.test(t)}function UN(t){let[e,...n]=t;if(!e||e.startsWith("-"))return null;if(/^https?:\/\//i.test(e)&&/\.lms(?:[?#].*)?$/i.test(e))return{kind:"hosted-script",url:e,rest:n};if(/\.lms$/i.test(e))return{kind:"script",file:e,rest:n};if(n.some(o=>["--force","-f","--yes","-y"].includes(o)))throw new Error("Force/yes flags are not allowed in inferred mode; destructive changes require confirmation.");if(n.some(o=>o.startsWith("-")&&!tf(o)))throw new Error("Use an explicit command for options; no inferred action was taken.");if(/\.lmb$/i.test(e))return{kind:"batch",file:e,rest:n};let r=Ar(e)??(e.endsWith(":")&&st(e.slice(0,-1))?{teamfile:e.slice(0,-1),alias:""}:null);if(r||st(e)){let o=r?.teamfile??e,i=r?.alias,a=[...n];return!i&&a.length&&!tf(a[0])&&(i=a.shift()),{kind:"team",file:o,...i!==void 0?{alias:i}:{},...a.length?a.some(tf)?{prompt:a.join(" ")}:{pendingPrompt:a.join(" ")}:{}}}let s=n.length?n.some(tf)?{prompt:n.join(" ")}:{pendingPrompt:n.join(" ")}:{};return Ah(e)?{kind:"session",id:e,...s}:{kind:"models",query:e,...s}}function nf(t,e){let n=t.toLowerCase(),r=e.filter(s=>s.toLowerCase()===n);return[...new Set(r.length?r:e.filter(s=>s.toLowerCase().startsWith(n)))]}var FN=C(()=>{"use strict";Tt();Nt()});import{spawnSync as ay}from"node:child_process";import{existsSync as WN,readFileSync as HN}from"node:fs";import{homedir as BN}from"node:os";import{resolve as oy}from"node:path";function Ai(t,e){return e.code==="ETIMEDOUT"?`${t} did not respond within lint's own spawn timeout (${e.message}) \u2014 this does not mean the provider itself is unreachable, only that this specific check didn't finish in time.`:`${t} could not be run: ${e.message}`}function $J(){let t=ay("agy",["models"],{encoding:"utf-8",timeout:MJ});return{status:t.status,stdout:t.stdout??"",error:t.error}}function UJ(t){let e=[],n={};for(let r of t.split(/\r?\n/)){let s=r.trim(),o=s.indexOf(" ");if(o<0)continue;let i=s.slice(0,o).trim(),a=s.slice(o+1).trim();i&&(e.push(i),a&&(n[i]=a))}return{models:e,displayNames:n}}function ho(t){if(!t&&ny)return ny;let e=o=>(t||(ny=o),o),n;try{n=(t??PJ??$J)()}catch(o){return e({available:!1,models:[],reason:o instanceof Error?Ai("agy models",o):`agy models could not be run: ${String(o)}`})}if(n.error)return e({available:!1,models:[],reason:Ai("agy models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${n.status??"unknown"}`});let{models:r,displayNames:s}=UJ(n.stdout);return r.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:r,displayNames:s})}function jJ(){let t=ay("codex",["debug","models"],{encoding:"utf-8",timeout:FJ});return{status:t.status,stdout:t.stdout??"",error:t.error}}function HJ(t){let e;try{e=JSON.parse(t)}catch{return}let n=e.models;if(!Array.isArray(n))return;let r=[];for(let s of n){if(!s||typeof s!="object")continue;let{slug:o,visibility:i}=s;typeof o=="string"&&i==="list"&&r.push(o)}return r}function _o(t){if(!t&&ry)return ry;let e=s=>(t||(ry=s),s),n;try{n=(t??WJ??jJ)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?Ai("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:Ai("codex debug models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`codex debug models exited with status ${n.status??"unknown"}`});let r=HJ(n.stdout);return r===void 0?e({available:!1,models:[],reason:"codex debug models did not return parseable JSON"}):r.length===0?e({available:!1,models:[],reason:"codex debug models returned no user-visible models"}):e({available:!0,models:r})}function XJ(t){let e=ay("opencode",t?["models",t]:["models"],{encoding:"utf-8",timeout:BJ});return{status:e.status,stdout:e.stdout??"",error:e.error}}function ly(t,e){if(!e&&sy.has(t))return sy.get(t);let n=i=>(e||sy.set(t,i),i),r=t?`opencode models ${t}`:"opencode models",s;try{s=(e??XJ)(t)}catch(i){return n({available:!1,models:[],reason:i instanceof Error?Ai(r,i):`${r} could not be run: ${String(i)}`})}if(s.error)return n({available:!1,models:[],reason:Ai(r,s.error)});if(s.status!==0)return n({available:!1,models:[],reason:`${r} exited with status ${s.status??"unknown"}`});let o=s.stdout.split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0);return o.length===0?n({available:!1,models:[],reason:`${r} returned no models`}):n({available:!0,models:o})}function cy(t,e={}){let n=[];for(let r of t){let s=r.provider.trim().toLowerCase();if(r.effort&&s!=="opencode"&&s!=="lmplayer"&&s!=="qwen"&&s!=="muse"&&n.push(`[${r.alias}] effort="${r.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),s==="qwen"&&r.effort&&n.push(`[${r.alias}] effort="${r.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),s==="copilot"){if(!r.model)continue;n.push(`[${r.alias}] model="${r.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(s!=="lmplayer"){if(s==="opencode"){if(r.effort&&!r.model&&n.push(`[${r.alias}] effort="${r.effort}" has no effect without model= on an opencode member.`),!r.model)continue;let o=GJ(e.opencodeConfigPath);if(!o.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for opencode: ${o.reason}.`);continue}if(o.models.includes(r.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(r.model))continue;if(!r.model.includes("/")){let l=o.models.filter(c=>c.endsWith(`/${r.model}`));n.push(l.length>0?`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${r.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}let i=r.model.slice(0,r.model.indexOf("/")),a=ly(i,e.opencodeModelsRunner);if(a.available&&a.models.includes(r.model))continue;if(a.available&&!a.models.includes(r.model)){n.push(`[${r.alias}] model="${r.model}" was not found in opencode's LOCALLY-VISIBLE live catalog for "${i}" (checked \`opencode models ${i}\`) -- this is unresolved, not a confirmed unavailability: it could mean opencode genuinely doesn't serve this model, OR that your local catalog/auth for "${i}" is stale/incomplete. Declaring it in opencode.json may or may not help; if it doesn't, check whether a non-opencode provider serves this model directly (e.g. \`lmctl lint\` with model= against provider=codex/claude/gemini/agy).`);continue}n.push(`[${r.alias}] model="${r.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(s==="kimi"){if(!r.model)continue;let o=go(e.kimiConfigPath);o.available?o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not declared in Kimi's [models] config. Valid configured models: ${Cl(o.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for kimi: ${o.reason}.`);continue}if(s==="agy"){if(!r.model)continue;let o=ho(e.agyModelsRunner);o.available?o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${Cl(o.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for agy: ${o.reason}.`);continue}if(s==="dsh"){if(!r.model||ki.includes(r.model))continue;Ii.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in dsh's built-in catalog. Valid pinned models: ${Cl(Ii)}. Valid server-resolved aliases (DeepSeek resolves these to its current model server-side -- pinning to a specific version instead is a DOWNGRADE, not a safer choice): ${Cl(ki)}. The catalog is patchable via dsh profile overlays \u2014 a model added that way warns here even though it may resolve.`);continue}if(s==="hermes"){if(!r.model)continue;let o=r.model.indexOf(":");(o<=0||o===r.model.length-1)&&n.push(`[${r.alias}] model="${r.model}" should use <provider>:<model> from Hermes's ACP catalog. lmctl checks the shape only; provider and model availability are resolved by Hermes.`);continue}if(s!=="pi"){if(s==="codex"){if(!r.model)continue;r.model===jN&&n.push(`[${r.alias}] model="${jN}" is banned as a build model (operator, 2026-09-06) -- it's a fast/cheap classification model, not intended for build work, and there's no cost reason left to reach for it. Use model=gpt-5.6-sol (or leave model= unset) for build work; if this member genuinely does non-build/classification work, this warning can be ignored.`);let o=_o(e.codexModelsRunner);if(!o.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for codex: ${o.reason}.`);continue}o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in codex's live model catalog (\`codex debug models\`). Valid models: ${Cl(o.models)}`);continue}r.model&&(XN.has(s)||n.push(`[${r.alias}] model="${r.model}" cannot be verified for provider "${s}": no model validation path exists for this provider.`))}}}return n}async function qN(t,e={}){let n=t.filter(i=>i.model!==void 0&&XN.has(i.provider.trim().toLowerCase()));if(n.length===0)return{warnings:[],errors:[]};let r=e.snapshot??await Dt();if(r.catalog===null)return{warnings:[],errors:[]};let s=[],o=[];for(let i of n){let a=i.provider.trim().toLowerCase(),l=i.model,c=cd(a,l,r.catalog,r.aliases);if(c.kind==="unknown"){let d=DS(r.catalog,a)??0;s.push(`[${i.alias}] model "${l}" is unknown to the lmprice catalog for provider "${a}" (${d} known) -- not necessarily wrong: may be a model too new for lmprice to have published yet, or a typo. A matching lmprice catalog/alias entry would resolve this; lint cannot otherwise confirm whether ${a} accepts it.`)}else c.kind==="wrong-provider"?o.push({field:i.alias,message:`model "${l}" is not offered by provider "${a}" -- it is a recognized model, but only under: ${c.otherProviders.join(", ")}. Declare provider="${c.otherProviders[0]}" (or another listed provider), or use a model "${a}" actually offers.`}):c.kind==="known-unpriced"&&s.push(`[${i.alias}] model "${l}" is recognized in the lmprice catalog but has no price information \u2014 cost will be unavailable`);if(a==="claude"&&(c.kind==="priced"||c.kind==="known-unpriced"||c.kind==="estimated")&&DJ.test(l)){let d=l.replace(/(\d)\.(?=\d)/g,"$1-");s.push(`[${i.alias}] model="${l}" matches the lmprice catalog only through its OpenRouter-style spelling ("." between version numbers); claude's own CLI expects "-" there and does an exact match, so it may reject this string verbatim even though lint recognizes it. If seed/chat fails with "issue with the selected model," try model="${d}" instead.`)}}return{warnings:s,errors:o}}async function GN(t,e={}){return(await qN(t,e)).warnings}async function JN(t,e={}){return(await qN(t,e)).errors}function go(t){let e=process.env.KIMI_CODE_HOME||oy(BN(),".kimi-code"),n=t??oy(e,"config.toml");if(!WN(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=HN(n,"utf-8")}catch(o){return{available:!1,models:[],reason:`${n} could not be read: ${o instanceof Error?o.message:String(o)}`}}let s=new Set;for(let o of r.split(/\r?\n/)){if(/^\s*\[/.test(o)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(o))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let i=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(o);if(!i)continue;let a=qJ(i[1]);if(i[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s]}}function qJ(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function GJ(t){let e=t??oy(BN(),".config","opencode","opencode.json");if(!WN(e))return{available:!0,models:[]};let n;try{n=JSON.parse(HN(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:JJ(n)}}function JJ(t){if(!iy(t))return[];let e=rf(t.provider)??rf(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!iy(s))continue;let o=rf(s.models)??rf(s.model);if(o)for(let i of Object.keys(o))n.add(i.startsWith(`${r}/`)?i:`${r}/${i}`)}return[...n].sort()}function rf(t){return iy(t)?t:null}function iy(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Cl(t){return t.length>0?t.join(", "):"(none)"}var XN,DJ,Ii,ki,jN,MJ,ny,PJ,FJ,ry,WJ,BJ,sy,Ni=C(()=>{"use strict";_n();is();XN=new Set(Object.keys(Jn).filter(t=>t!=="codex"&&t!=="kimi")),DJ=/\d\.(?=\d)/,Ii=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],ki=["deepseek-flash","deepseek-pro"],jN="gpt-5.3-codex-spark",MJ=15e3;ny=null;FJ=5e3;ry=null;BJ=5e3;sy=new Map});function sf(t){return["agy","opencode","copilot","hermes","pi","lmplayer","miniplayer"].includes(t)}function VN(t){if(!/(?:^|[/:])(?:gpt-|o\d(?:-|$)|chatgpt-|claude[ -]|gemini[ -])/i.test(t))return!1;let e=/claude/i.test(t)?"claude":/gemini/i.test(t)?"gemini":"codex";return Jn[e].isChatModel({source:"",source_model_id:t,pricing:{input_per_1m_tokens:null,output_per_1m_tokens:null,input_cache_read_per_1m_tokens:null}})}function VJ(t,e){let n=[];for(let r of e.records){let s=r.source_model_id,o;if(t==="copilot")r.provider==="github_copilot"&&s.startsWith("github_copilot/")&&(o=s.slice(15));else if(["hermes","pi","lmplayer","miniplayer"].includes(t))r.source==="openrouter"&&/^(openai|anthropic|google)\//.test(s)&&(o=t==="hermes"?`openrouter:${s}`:t==="pi"?`openrouter/${s}`:s);else{let i={claude:"anthropic",gemini:"gemini",qwen:"dashscope"}[t],a=Jn[t];if(i&&r.source==="litellm"&&r.provider===i&&a?.coversRecord(r)){o=s.startsWith(`${i}/`)?s.slice(i.length+1):s;let l=t==="claude"?"claude-":t==="gemini"?"gemini-":"qwen";(o.includes("/")||!o.startsWith(l))&&(o=void 0)}}!o||r.mode!=null&&r.mode!=="chat"||o.includes(":batch")||o.includes(":free")||sf(t)&&!VN(o)||n.push(o)}return[...new Set(n)].sort()}async function of(t){let e;switch(t){case"dsh":e=[...ki,...Ii];break;case"codex":e=_o().models;break;case"agy":e=ho().models;break;case"kimi":e=go().models;break;case"opencode":e=ly("").models;break;default:{let{catalog:n}=await Dt();e=n?VJ(t,n):[]}}return[...new Set(e.filter(n=>!sf(t)||VN(n)))].sort()}var dy=C(()=>{"use strict";_n();is();Ni()});var ZN={};ye(ZN,{MODEL_PROVIDERS:()=>Dr,knownModelNames:()=>or,runModels:()=>af});function YN(t,e){switch(t){case"codex":return _o();case"agy":return ho();case"kimi":return go();case"claude":{let n=e.catalog?.records??[],r=n.flatMap(o=>o.native?.claude_code&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(o.native.claude_code)?[o.native.claude_code]:[]),s=r.length?r:n.flatMap(o=>{let i=o.source_model_id.split("/").at(-1);return o.provider==="anthropic"&&o.mode==="chat"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(i)?[i]:[]});return s.length?{available:!0,models:[...new Set(s)]}:{available:!1,models:[],reason:"No Claude Code ids in the available catalog"}}default:return{available:!1,models:[]}}}async function or(t){if(!Dr.includes(t))return of(t);let e=t==="claude"?await Dt():{catalog:null,aliases:null,source:"unavailable",generatedAt:null};return YN(t,e).models}function uy(t,e){return t==="agy"?e.replace(/-(low|medium|high)$/i,""):e}function fy(t,e,n){if(!Dr.includes(t)||!n.catalog)return;let r=zJ[t],s=uy(t,e);return n.catalog.records.find(o=>o.native?.[r]===s)}function Ol(t,e,n){let r=Mt(t,e,n.catalog,n.aliases).state;return r.kind==="priced"||r.kind==="estimated"||r.kind==="known-unpriced"}function YJ(t,e,n){if(fy(t,e,n))return!0;let r=QN(t,e,n)?.state;return r?.kind==="priced"||r?.kind==="estimated"||r?.kind==="known-unpriced"}function QJ(t,e,n){let r=n.catalog?.records??[];if(t==="claude"||!n.catalog)return[];let s=new Set;if(t==="codex")for(let i of r)if(i.native?.codex)s.add(i.native.codex);else{let a=i.source_model_id.split("/").at(-1);/^(?:gpt-|o\d|chatgpt|ft:gpt)/i.test(a)&&Ol("codex",a,n)&&s.add(a)}else if(t==="agy"){let i=new Set;for(let a of r){if(a.native?.agy){i.add(uy("agy",a.native.agy));continue}if(a.mode!=="chat")continue;let l=a.source_model_id.split("/").at(-1);(/^gemini-\d/.test(l)?Ol("gemini",l,n):a.provider==="anthropic"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(l)?Ol("claude",l,n):/^gpt-oss-\d/.test(l)?Ol("codex",l,n):!1)&&i.add(l)}for(let a of i)for(let l of["low","medium","high"])s.add(`${a}-${l}`)}else if(t==="kimi"){for(let i of r)i.native?.kimi&&s.add(i.native.kimi);for(let i of r){if(i.native?.kimi)continue;let a=i.source_model_id.split("/").at(-1),l=a.startsWith("kimi-")?`kimi-code/${a.slice(5)}`:a;/^kimi-code\/[a-z0-9][a-z0-9._-]*$/i.test(l)&&Ol("kimi",l,n)&&s.add(l)}}let o=new Set(e);return[...s].filter(i=>!o.has(i)&&YJ(t,i,n))}function QN(t,e,n){if(!n.catalog)return null;if(fy(t,e,n)||t!=="agy")return Mt(t,e,n.catalog,n.aliases);let s=uy("agy",e);if(!/^(?:gemini-\d|claude-[a-z]+-\d|gpt-oss-\d)/.test(s))return null;let o=n.catalog.records.map(i=>{let a=i.source_model_id.split("/").at(-1).toLowerCase();return i.mode!=="chat"||a!==s.toLowerCase()?i:{...i,native:{...i.native,agy:s}}});return Mt("agy",s,{...n.catalog,records:o},n.aliases)}function zN(t,e,n,r,s){let o=fy(t,e,r),i=QN(t,e,r),a=i?.offer??null,l=i?.state,c=l?.kind==="priced"||l?.kind==="estimated"?l.model.id:l?.kind==="known-unpriced"?l.id:null;return{id:e,display_name:n,status:s,catalog_model:o?.source_model_id??c,pricing:{input_per_1m_tokens:a?.pricing.input_per_1m_tokens??null,output_per_1m_tokens:a?.pricing.output_per_1m_tokens??null,input_cache_read_per_1m_tokens:a?.pricing.input_cache_read_per_1m_tokens??null},price_resolution:l?.kind??(r.catalog?"unknown":"no-catalog"),price_source_model_id:a?.sourceModelId??null,price_estimated:a?.estimated??!1}}async function af(t,e,n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(KN),0;let r=ce(t,[],["--old","--json"]),s=r.positionals.find(u=>u!=="all"&&!Dr.includes(u)),o=r.error??(s===void 0?void 0:`unknown provider: ${s} (valid targets: all, ${Dr.join(", ")})`);if(o!==void 0)return e.stderr.write(`error: ${o}
1976
1975
  ${KN}`),2;let i=n.selections?.map(u=>u.provider)??(r.positionals.length===0||r.positionals.includes("all")?[...Dr]:Dr.filter(u=>r.positionals.includes(u)));e.stderr.write(`querying models: ${i.join(", ")} ...
1977
- `);let a=await(n.loadSnapshot??Dt)(),l=z(r,"--old"),c=[];for(let u of i){let f;try{let g=n.selections?.find(w=>w.provider===u);f=g?.models!==void 0?{available:!0,models:g.models}:n.loadModels?await n.loadModels(u,a):YN(u,a)}catch(g){f={available:!1,models:[],reason:g instanceof Error?g.message:String(g)}}let m=zJ[u]??"provider model list",p=f.available?[...new Set(f.models)].map(g=>zN(u,g,f.displayNames?.[g]??null,a,u==="claude"?"unverified":"valid")):[],_=p.filter(g=>g.catalog_model===null).map(g=>g.id),h=f.available&&l?ZJ(u,f.models,a).map(g=>zN(u,g,null,a,"old")):[];c.push({provider:u,status:f.available?"ok":"unavailable",source:m,reason:f.reason??null,models:[...p,...h],unmatched:_})}if(z(r,"--json"))return Y(e,{schema_version:2,currency:"USD",unit:"per_million_tokens",price_data_source:a.source,price_data_generated_at:a.generatedAt,providers:c}),0;e.stdout.write(`USD per million tokens (API reference rates, not subscription charges). n/a = unknown.
1976
+ `);let a=await(n.loadSnapshot??Dt)(),l=z(r,"--old"),c=[];for(let u of i){let f;try{let g=n.selections?.find(w=>w.provider===u);f=g?.models!==void 0?{available:!0,models:g.models}:n.loadModels?await n.loadModels(u,a):YN(u,a)}catch(g){f={available:!1,models:[],reason:g instanceof Error?g.message:String(g)}}let m=KJ[u]??"provider model list",p=f.available?[...new Set(f.models)].map(g=>zN(u,g,f.displayNames?.[g]??null,a,u==="claude"?"unverified":"valid")):[],_=p.filter(g=>g.catalog_model===null).map(g=>g.id),h=f.available&&l?QJ(u,f.models,a).map(g=>zN(u,g,null,a,"old")):[];c.push({provider:u,status:f.available?"ok":"unavailable",source:m,reason:f.reason??null,models:[...p,...h],unmatched:_})}if(z(r,"--json"))return Y(e,{schema_version:2,currency:"USD",unit:"per_million_tokens",price_data_source:a.source,price_data_generated_at:a.generatedAt,providers:c}),0;e.stdout.write(`USD per million tokens (API reference rates, not subscription charges). n/a = unknown.
1978
1977
  `),e.stdout.write(`Price catalog: ${a.source}${a.generatedAt?` (${a.generatedAt})`:""}
1979
1978
  `);let d=u=>u===null?"n/a":`$${u}`;for(let u of c){let f=u.provider==="agy",m=f?["MODEL","DISPLAY","STATUS","INPUT","OUTPUT","CACHE READ"]:["MODEL","STATUS","INPUT","OUTPUT","CACHE READ"];if(e.stdout.write(`
1980
1979
  ${u.provider} (${u.source})
@@ -1982,7 +1981,7 @@ ${u.provider} (${u.source})
1982
1981
  `),e.stdout.write(` ${u.unmatched.length} live ids have no catalog row yet (lmprice dataset ${a.catalog?.generated_at?.slice(0,10)??"unknown"}; run lmctl prices update after lmprice publishes)
1983
1982
  `);continue}let p=u.models.map(y=>[(0,jn.escapeCell)(y.id),...f?[(0,jn.escapeCell)(y.display_name??"")]:[],(0,jn.escapeCell)(y.status),d(y.pricing.input_per_1m_tokens),d(y.pricing.output_per_1m_tokens),d(y.pricing.input_cache_read_per_1m_tokens)]),_=f?["left","left","left","decimal","decimal","decimal"]:["left","left","decimal","decimal","decimal"],h=(0,jn.measureDecimalPlaces)([p]),g={align:_,decimalPlaces:h},w=(0,jn.measureColumns)([{rows:p,headers:m}],g);e.stdout.write(`${(0,jn.renderGrid)(p,{headers:m,widths:w,margin:2,...g})}
1984
1983
  `),e.stdout.write(` ${u.unmatched.length} live ids have no catalog row yet (lmprice dataset ${a.catalog?.generated_at?.slice(0,10)??"unknown"}; run lmctl prices update after lmprice publishes)
1985
- `)}return 0}var jn,Dr,KN,zJ,YJ,Dl=C(()=>{"use strict";jn=pn(rn(),1);he();Ni();dy();_n();is();Dr=["codex","agy","claude","kimi"],KN=`usage: lmctl models [provider ...] [--old] [--json]
1984
+ `)}return 0}var jn,Dr,KN,KJ,zJ,Dl=C(()=>{"use strict";jn=pn(rn(),1);he();Ni();dy();_n();is();Dr=["codex","agy","claude","kimi"],KN=`usage: lmctl models [provider ...] [--old] [--json]
1986
1985
 
1987
1986
  List model ids accepted by each provider, joined to the available price catalog.
1988
1987
  Providers: all (default), codex, agy, claude, kimi. Multiple providers are allowed.
@@ -1992,7 +1991,7 @@ Old catalog-known ids are omitted unless --old is used. Claude catalog ids are u
1992
1991
  --json Emit schema_version 2 with native ids, catalog matches and per-million pricing.
1993
1992
  --old Include ids known to the catalog that the provider no longer reports.
1994
1993
  -h Show this help.
1995
- `,zJ={codex:"codex debug models",agy:"agy models",claude:"lmprice native.claude_code",kimi:"Kimi [models] config"},YJ={codex:"codex",agy:"agy",claude:"claude_code",kimi:"kimi"}});function eV(t){if(t.cost_reason!=null||t.usage_source==null)return null;let e=r=>Mr(r)??0,n=Mr(t.rate_input_1m);return(e(t.tok_input_uncached)*e(t.rate_input_1m)+e(t.tok_cache_read)*e(t.rate_cache_read_1m)+e(t.tok_cache_write)*(Mr(t.rate_cache_write_1m)??n??0)+e(t.tok_output)*e(t.rate_output_1m))/1e6}function my(t){return t?{source:lf(t.usage_source),reason:lf(t.usage_reason),inputUncached:Mr(t.tok_input_uncached),cacheRead:Mr(t.tok_cache_read),cacheWrite:Mr(t.tok_cache_write),output:Mr(t.tok_output),reasoning:Mr(t.tok_reasoning),modelReported:lf(t.model_reported),costUsd:eV(t),costReason:lf(t.cost_reason),providerCostUsd:Mr(t.provider_cost_usd)}:null}var Mr,lf,ex=C(()=>{"use strict";Mr=t=>typeof t=="number"&&Number.isFinite(t)?t:null,lf=t=>typeof t=="string"&&t!==""?t:null});function ks(t){try{if(t instanceof Error){let e=t.message;if(typeof e=="string")return e}return String(t)}catch{return"Unprintable error"}}function zt(t,e,n){return{...n,status:"error",code:t,error:e}}var cf=C(()=>{"use strict"});function ir(t){try{return t?.usage}catch{return}}function df(t,e,n,r){let s,o,i,a=!1;try{i=dd(e),s=t.dal??Ye({path:Pe(t),recover:!1}),o=s.insertDirectTurn(i,n,r)}catch{}return{async finish(l){if(!a){a=!0;try{s&&o!==void 0&&i&&s.finishDirectTurn(o,await Oa(i,l,()=>Ld(s.db,t.env),{db:s.db,env:t.env}))}catch{}finally{if(s&&s!==t.dal)try{s.close()}catch{}}}}}}function uf(t,e,n){let r=t,s,o;s=ir(r)??ir(n);try{o=r?.sessionId??n?.sessionId}catch{o=n?.sessionId}return{status:Jo(ks(t),e.aborted),usage:s,sessionId:o}}var py=C(()=>{"use strict";Pt();he();Cd();Da();cf()});var tx={};ye(tx,{runFreshPrompt:()=>rV});import{resolve as tV}from"node:path";import{stat as nV}from"node:fs/promises";async function rV(t,e){let n=tV(e.cwd??process.cwd(),t.sessiondir??"."),r=new AbortController,s=()=>r.abort();process.once("SIGINT",s),process.once("SIGTERM",s);let o=!1,i,a={status:"error"};try{if(!(await nV(n)).isDirectory())throw new Error(`sessiondir is not a directory: ${n}`);i=df(e,{provider:t.provider,modelRequested:t.model,cwd:n,sessionId:""},"operator");let l=await Il({provider:t.provider,model:t.model,cwd:n,sessionId:"",prompt:t.prompt,requireResume:!1,timeoutMs:0,permissionMode:t.permissionMode,signal:r.signal,onDelta:t.json?void 0:c=>{o=!0,e.stdout.write(c)},onProgress:t.verbose?c=>{(c.kind==="tool_use"||c.kind==="tool_result"||c.kind==="api_retry")&&e.stderr.write(`[${t.provider}] ${c.kind}${c.summary?`: ${c.summary}`:""}
1994
+ `,KJ={codex:"codex debug models",agy:"agy models",claude:"lmprice native.claude_code",kimi:"Kimi [models] config"},zJ={codex:"codex",agy:"agy",claude:"claude_code",kimi:"kimi"}});function ZJ(t){if(t.cost_reason!=null||t.usage_source==null)return null;let e=r=>Mr(r)??0,n=Mr(t.rate_input_1m);return(e(t.tok_input_uncached)*e(t.rate_input_1m)+e(t.tok_cache_read)*e(t.rate_cache_read_1m)+e(t.tok_cache_write)*(Mr(t.rate_cache_write_1m)??n??0)+e(t.tok_output)*e(t.rate_output_1m))/1e6}function my(t){return t?{source:lf(t.usage_source),reason:lf(t.usage_reason),inputUncached:Mr(t.tok_input_uncached),cacheRead:Mr(t.tok_cache_read),cacheWrite:Mr(t.tok_cache_write),output:Mr(t.tok_output),reasoning:Mr(t.tok_reasoning),modelReported:lf(t.model_reported),costUsd:ZJ(t),costReason:lf(t.cost_reason),providerCostUsd:Mr(t.provider_cost_usd)}:null}var Mr,lf,ex=C(()=>{"use strict";Mr=t=>typeof t=="number"&&Number.isFinite(t)?t:null,lf=t=>typeof t=="string"&&t!==""?t:null});function ks(t){try{if(t instanceof Error){let e=t.message;if(typeof e=="string")return e}return String(t)}catch{return"Unprintable error"}}function zt(t,e,n){return{...n,status:"error",code:t,error:e}}var cf=C(()=>{"use strict"});function ir(t){try{return t?.usage}catch{return}}function df(t,e,n,r){let s,o,i,a=!1;try{i=dd(e),s=t.dal??Ye({path:Pe(t),recover:!1}),o=s.insertDirectTurn(i,n,r)}catch{}return{async finish(l){if(!a){a=!0;try{s&&o!==void 0&&i&&s.finishDirectTurn(o,await Oa(i,l,()=>Ld(s.db,t.env),{db:s.db,env:t.env}))}catch{}finally{if(s&&s!==t.dal)try{s.close()}catch{}}}}}}function uf(t,e,n){let r=t,s,o;s=ir(r)??ir(n);try{o=r?.sessionId??n?.sessionId}catch{o=n?.sessionId}return{status:Jo(ks(t),e.aborted),usage:s,sessionId:o}}var py=C(()=>{"use strict";Pt();he();Cd();Da();cf()});var tx={};ye(tx,{runFreshPrompt:()=>nV});import{resolve as eV}from"node:path";import{stat as tV}from"node:fs/promises";async function nV(t,e){let n=eV(e.cwd??process.cwd(),t.sessiondir??"."),r=new AbortController,s=()=>r.abort();process.once("SIGINT",s),process.once("SIGTERM",s);let o=!1,i,a={status:"error"};try{if(!(await tV(n)).isDirectory())throw new Error(`sessiondir is not a directory: ${n}`);i=df(e,{provider:t.provider,modelRequested:t.model,cwd:n,sessionId:""},"operator");let l=await Il({provider:t.provider,model:t.model,cwd:n,sessionId:"",prompt:t.prompt,requireResume:!1,timeoutMs:0,permissionMode:t.permissionMode,signal:r.signal,onDelta:t.json?void 0:c=>{o=!0,e.stdout.write(c)},onProgress:t.verbose?c=>{(c.kind==="tool_use"||c.kind==="tool_result"||c.kind==="api_retry")&&e.stderr.write(`[${t.provider}] ${c.kind}${c.summary?`: ${c.summary}`:""}
1996
1995
  `)}:void 0,env:e.env});a={status:r.signal.aborted?"cancelled":l.status??"ok",sessionId:l.sessionId,usage:ir(l)};for(let c of l.warnings??[])t.json||e.stderr.write(`warning: ${c}
1997
1996
  `);return t.json?e.stdout.write(`${JSON.stringify({status:l.status??"ok",provider:t.provider,requestedModel:t.model,sessionId:l.sessionId,replyText:l.text,...l.warnings?{warnings:l.warnings}:{},...l.status==="empty"||l.status==="stalled"?{errorClass:Ir(null,{status:l.status,model:t.model}).class}:{}})}
1998
1997
  `):o?l.text.length>0&&!l.text.endsWith(`
@@ -2002,17 +2001,17 @@ Old catalog-known ids are omitted unless --old is used. Claude catalog ids are u
2002
2001
  `}`),l.status==="empty"||l.status==="stalled"?1:(e.stderr.write(`note: fresh ${t.provider} session ${l.sessionId||"(provider did not report an id)"} completed
2003
2002
  `),0)}catch(l){a=uf(l,r.signal,a);let c=l instanceof Error?l.message:String(l);return t.json?e.stdout.write(`${JSON.stringify({status:"error",provider:t.provider,requestedModel:t.model,error:c,errorClass:Ir(c,{model:t.model}).class})}
2004
2003
  `):e.stderr.write(`error: ${c}
2005
- `),1}finally{await i?.finish(a),process.removeListener("SIGINT",s),process.removeListener("SIGTERM",s)}}var nx=C(()=>{"use strict";Cr();py();xd()});function rx(t,e){return new Error("Invalid template reference "+JSON.stringify(t)+" at offset "+e+"; use a simple name, PROPS.path or ARGV[n]. Assign a temporary variable first and pass it in vars.")}function aV(t){if(typeof t!="string")throw new Error("expand: text must be a string");let e=[],n=0;for(;n<t.length;){let r=t.indexOf("${",n);if(r<0){e.push(t.slice(n));break}if(r>n&&t[r-1]==="$"){e.push(t.slice(n,r-1),"${"),n=r+2;continue}e.push(t.slice(n,r));let s=t.indexOf("}",r+2);if(s<0)throw rx(t.slice(r+2),r);let o=t.slice(r+2,s),i=oV.exec(o),a=iV.exec(o);if(i)e.push({kind:"property",name:o,key:i[1],offset:r});else if(a&&Number.isSafeInteger(Number(a[1])))e.push({kind:"argument",name:o,index:Number(a[1]),offset:r});else if(sV.test(o)&&o!=="PROPS"&&o!=="ARGV")e.push({kind:"variable",name:o,offset:r});else throw rx(o,r);n=s+1}return e}function sx(t,e,n=r=>r!==null&&typeof r=="object"?JSON.stringify(r):String(r)){let r=[],s=new Map;for(let o of aV(t)){if(typeof o=="string"){r.push(o);continue}let i;try{i=e(o)}catch(a){s.set(o.name,a instanceof Error?a.message:String(a));continue}if(i===void 0){s.set(o.name,"not defined");continue}r.push(n(i))}if(s.size)throw new Error("expand: missing references: "+[...s].map(([o,i])=>o+" ("+i+")").join("; "));return r.join("")}var hy,sV,oV,iV,ox=C(()=>{hy="[_a-zA-Z][_a-zA-Z0-9]*",sV=new RegExp("^"+hy+"$"),oV=new RegExp("^PROPS\\.("+hy+"(?:\\."+hy+")*)$"),iV=/^ARGV\[(0|[1-9][0-9]*)\]$/});function ix(t){return{Provider1:t.provider1.provider,Provider2:t.provider2.provider,Provider3:t.provider3.provider,Model1:t.provider1.model1,Model2:t.provider2.model1,Model3:t.provider3.model1}}var ax=C(()=>{"use strict"});function lV(t,e){let n=t.slice(0,e).split(/\r?\n/);return[n.length,n.pop().length+1]}function cV(t,e,n){let r=t.split(/\r?\n/),s="",o=(Math.log10(e+1)|0)+1;for(let i=e-1;i<=e+1;i++){let a=r[i-1];a&&(s+=i.toString().padEnd(o," "),s+=": ",s+=a,s+=`
2004
+ `),1}finally{await i?.finish(a),process.removeListener("SIGINT",s),process.removeListener("SIGTERM",s)}}var nx=C(()=>{"use strict";Cr();py();xd()});function rx(t,e){return new Error("Invalid template reference "+JSON.stringify(t)+" at offset "+e+"; use a simple name, PROPS.path or ARGV[n]. Assign a temporary variable first and pass it in vars.")}function iV(t){if(typeof t!="string")throw new Error("expand: text must be a string");let e=[],n=0;for(;n<t.length;){let r=t.indexOf("${",n);if(r<0){e.push(t.slice(n));break}if(r>n&&t[r-1]==="$"){e.push(t.slice(n,r-1),"${"),n=r+2;continue}e.push(t.slice(n,r));let s=t.indexOf("}",r+2);if(s<0)throw rx(t.slice(r+2),r);let o=t.slice(r+2,s),i=sV.exec(o),a=oV.exec(o);if(i)e.push({kind:"property",name:o,key:i[1],offset:r});else if(a&&Number.isSafeInteger(Number(a[1])))e.push({kind:"argument",name:o,index:Number(a[1]),offset:r});else if(rV.test(o)&&o!=="PROPS"&&o!=="ARGV")e.push({kind:"variable",name:o,offset:r});else throw rx(o,r);n=s+1}return e}function sx(t,e,n=r=>r!==null&&typeof r=="object"?JSON.stringify(r):String(r)){let r=[],s=new Map;for(let o of iV(t)){if(typeof o=="string"){r.push(o);continue}let i;try{i=e(o)}catch(a){s.set(o.name,a instanceof Error?a.message:String(a));continue}if(i===void 0){s.set(o.name,"not defined");continue}r.push(n(i))}if(s.size)throw new Error("expand: missing references: "+[...s].map(([o,i])=>o+" ("+i+")").join("; "));return r.join("")}var hy,rV,sV,oV,ox=C(()=>{hy="[_a-zA-Z][_a-zA-Z0-9]*",rV=new RegExp("^"+hy+"$"),sV=new RegExp("^PROPS\\.("+hy+"(?:\\."+hy+")*)$"),oV=/^ARGV\[(0|[1-9][0-9]*)\]$/});function ix(t){return{Provider1:t.provider1.provider,Provider2:t.provider2.provider,Provider3:t.provider3.provider,Model1:t.provider1.model1,Model2:t.provider2.model1,Model3:t.provider3.model1}}var ax=C(()=>{"use strict"});function aV(t,e){let n=t.slice(0,e).split(/\r?\n/);return[n.length,n.pop().length+1]}function lV(t,e,n){let r=t.split(/\r?\n/),s="",o=(Math.log10(e+1)|0)+1;for(let i=e-1;i<=e+1;i++){let a=r[i-1];a&&(s+=i.toString().padEnd(o," "),s+=": ",s+=a,s+=`
2006
2005
  `,i===e&&(s+=" ".repeat(o+n+2),s+=`^
2007
- `))}return s}var se,yo=C(()=>{se=class t extends Error{line;column;codeblock;constructor(e,n){let[r,s]=lV(n.toml,n.ptr),o=cV(n.toml,r,s);super(`Invalid TOML document: ${e}
2006
+ `))}return s}var se,yo=C(()=>{se=class t extends Error{line;column;codeblock;constructor(e,n){let[r,s]=aV(n.toml,n.ptr),o=lV(n.toml,r,s);super(`Invalid TOML document: ${e}
2008
2007
 
2009
2008
  ${o}`,n),this.line=r,this.column=s,this.codeblock=o}static x(e,n,r){throw new t(e,{toml:n.s,ptr:r??n.p})}}});function ff(t){let e=t.p,n=t.s.charCodeAt(t.p++),r=n,s=n===39,o=n===t.s.charCodeAt(t.p)&&n===t.s.charCodeAt(t.p+1);o&&((n=t.s.charCodeAt(t.p+=2))===10?t.p++:n===13&&t.s.charCodeAt(t.p+1)===10&&(t.p+=2));let i="",a=t.p,l=0;for(;t.p<t.s.length;t.p++)if(n=t.s.charCodeAt(t.p),o&&(n===10||n===13&&t.s.charCodeAt(t.p+1)===10))l=l&&3;else if(n<32&&n!==9||n===127)se.x("control characters are not allowed in strings",t);else if((!l||l===3)&&n===r&&(!o||t.s.charCodeAt(t.p+1)===r&&t.s.charCodeAt(t.p+2)===r)){if(o&&(t.s.charCodeAt(t.p+3)===r&&t.p++,t.s.charCodeAt(t.p+3)===r&&t.p++),!l){let c=t.s.slice(a,t.p);i=i?i+c:c}return t.p+=o?3:1,i}else if(!l)!s&&n===92&&(i+=t.s.slice(a,a=t.p),l=1);else if(l===1)if(n===120||n===117||n===85){let c=t.p++-1,d=0,u=n===120?2:n===117?4:8;for(let f=0;f<u;f++,t.p++){let m=t.s.charCodeAt(t.p),p=m>=48&&m<=57?m-48:m>=65&&m<=70?m-65+10:m>=97&&m<=102?m-97+10:-1;p<0&&se.x("invalid non-hex character in unicode escape",t),d=d<<4|p}(d<0||d>1114111||d>=55296&&d<=57343)&&se.x("invalid unicode escape",t,c),i+=String.fromCodePoint(d),a=t.p--,l=0}else o&&(n===32||n===9)?l=2:(n===98?i+="\b":n===116?i+=" ":n===110?i+=`
2010
- `:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":se.x("unrecognised escape sequence",t),a=t.p+1,l=0);else n!==32&&n!==9&&(l===2&&se.x("invalid escape: only line-ending whitespace may be escaped",t,a),l=!s&&n===92?1:0,a=t.p);se.x("unfinished string",t,e)}var _y=C(()=>{yo();});var dV,Ml,gy=C(()=>{dV=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,Ml=class t extends Date{#t=!1;#n=!1;#e=null;constructor(e,n,r){let s=!0,o=!0,i="Z",a;if(typeof e=="string")if(n)e:{if(n<3){if(+e.slice(11,13)>23){e="";break e}n===2?(i=null,e+="Z"):(a=e.charCodeAt(e.length-1))!==90&&a!==122&&(i=e.slice(e.length-6)),r&&(e=e.slice(0,10)+"T"+e.slice(11))}else n===4&&(e=+e.slice(0,2)>23?"":`0000-01-01T${e}Z`);s=n!==4,o=n!==3}else{let l=e.match(dV);l?(l[1]||(s=!1,e=`0000-01-01T${e}`),o=!!l[2],o&&e[10]===" "&&(e=e.replace(" ","T")),l[2]&&+l[2]>23?e="":(i=l[3]||null,!i&&o&&(e+="Z"))):e=""}super(e),isNaN(this.getTime())||(this.#t=s,this.#n=o,this.#e=i)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let e=super.toISOString();if(this.isDate())return e.slice(0,10);if(this.isTime())return e.slice(11,23);if(this.#e===null)return e.slice(0,-1);if(this.#e==="Z"||this.#e==="z")return e;let n=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return n=this.#e[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(e,n="Z"){let r=new t(e);return r.#e=n,r}static wrapAsLocalDateTime(e){let n=new t(e);return n.#e=null,n}static wrapAsLocalDate(e){let n=new t(e);return n.#n=!1,n.#e=null,n}static wrapAsLocalTime(e){let n=new t(e);return n.#t=!1,n.#e=null,n}}});function an(t,e=10){return e===16?t>47&&t<58||t>64&&t<71||t>96&&t<103:t>47&&t<48+e}function wy(t,e){return t===32||t===9||t===10||t===13||e&&(t===e||t===44)||t===35}function Pl(t,e){let n=t.p,r=t.s.charCodeAt(t.p);if(r===91||r===123){t.d--||se.x("document contains excessively nested structures. aborting.",t);let s=r===91?dx(t):cx(t);return t.d++,s}return r===34||r===39?ff(t):r===116?((t.s.charCodeAt(++t.p)!==114||t.s.charCodeAt(++t.p)!==117||t.s.charCodeAt(++t.p)!==101)&&se.x("invalid value",t,n),t.p++,!0):r===102?((t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==108||t.s.charCodeAt(++t.p)!==115||t.s.charCodeAt(++t.p)!==101)&&se.x("invalid value",t,n),t.p++,!1):r===43||r===45?mf(t,t.p,t.s.charCodeAt(++t.p),44-r,e):t.s.charCodeAt(t.p+4)===45&&t.s.charCodeAt(t.p+7)===45?uV(t,r,e):t.s.charCodeAt(t.p+2)===58?fV(t,r,e):mf(t,t.p,r,0,e)}function mf(t,e,n,r,s){let o=n,i=0,a=!1;if(o===105)return(t.s.charCodeAt(++t.p)!==110||t.s.charCodeAt(++t.p)!==102)&&se.x("invalid value",t,e),t.p++,(r||1)/0;if(o===110)return(t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==110)&&se.x("invalid value",t,e),t.p++,NaN;if(o===48){if(++t.p>=t.s.length||wy(o=t.s.charCodeAt(t.p),s))return t.bi===!0?0n:0;if(!r){if(o===120)return yy(t,e,16,s);if(o===98)return yy(t,e,2,s);if(o===111)return yy(t,e,8,s)}o===46?i=2:o===101||o===69?i=4:se.x("illegal leading zero",t,e)}else an(o)||se.x("invalid value",t,e);for(;++t.p<t.s.length&&(o=t.s.charCodeAt(t.p),!wy(o,s));)i||(i=1),o===95?(i&1||se.x("illegal underscore",t),i+=11,a=!0):i===1&&o===46?i=2:(i===1||i===3)&&(o===101||o===69)?i=4:i===4&&(o===43||o===45)||(an(o)?i>9?i-=11:i&1||i++:se.x("illegal character in numeric literal",t));if(!i){let c=(n-48)*(r||1);return t.bi===!0?BigInt(c):c}i&1||se.x("unfinished numeric value",t,e);let l=t.s.slice(e,t.p);return a&&(l=l.replaceAll("_","")),i>1?parseFloat(l):lx(t,l,10,e)}function yy(t,e,n,r){let s,o=1;for(;++t.p<t.s.length&&(s=t.s.charCodeAt(t.p),!wy(s,r));)s===95?(o&1&&se.x("illegal underscore",t),o=3):an(s,n)?o&1&&o--:se.x("illegal character in numeric literal",t);o&1&&se.x("unfinished numeric value",t);let i=t.s.slice(e+2,t.p);return o&&(i=i.replaceAll("_","")),lx(t,i,n,e)}function lx(t,e,n,r){if(t.bi!==!0)e:{let s=parseInt(e,n);if(!Number.isSafeInteger(s)){if(t.bi)break e;se.x("integer value cannot be represented losslessly",t,r)}return s}return BigInt(n===10?e:(n===2?"0b":n===8?"0o":"0x")+e)}function uV(t,e,n){let r=t.p++,s;if(!an(e)||!an(t.s.charCodeAt(t.p++))||!an(t.s.charCodeAt(t.p++))||!an(t.s.charCodeAt(t.p++)))return mf(t,t.p=r,e,0,n);if(t.p+=5,an(t.s.charCodeAt(t.p++))||se.x("invalid date-time: date part is malformed",t,r),t.p>=t.s.length||((e=t.s.charCodeAt(t.p))!==32||(s=!0,!an(t.s.charCodeAt(t.p+1))))&&e!==84&&e!==116){let i=t.s.slice(r,t.p);return $l(t,i,3,!1,r)}if(t.s.charCodeAt(t.p+=3)!==58&&se.x("invalid date-time: time part is malformed",t,r),t.s.charCodeAt(t.p+=3)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;an(t.s.charCodeAt(++t.p)););if(e=t.s.charCodeAt(t.p)){if(e===90||e===122){let i=t.s.slice(r,++t.p);return $l(t,i,1,s,r,"[+00:00]")}if(e===43||e===45){let i=t.s.slice(r,t.p+=6);return $l(t,i,1,s,r,!t.ld&&"["+t.s.slice(t.p-6,t.p)+"]")}}let o=t.s.slice(r,t.p);return $l(t,o,2,s,r)}function fV(t,e,n){let r=t.p;if(!an(e)||!an(t.s.charCodeAt(++t.p)))return mf(t,--t.p,e,0,n);if(t.s.charCodeAt(t.p+=4)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;an(t.s.charCodeAt(++t.p)););let s=t.s.slice(r,t.p);return $l(t,s,4,!1,r)}function $l(t,e,n,r,s,o){if(t.ld){let i=new Ml(e,n,r);return i.isValid()||se.x("invalid date",t,s),i}try{switch(o&&(e+=o),n){case 1:return Temporal.ZonedDateTime.from(e);case 2:return Temporal.PlainDateTime.from(e);case 3:return Temporal.PlainDate.from(e);case 4:return Temporal.PlainTime.from(e)}}catch(i){se.x(i instanceof Error?i.message:""+i,t,s)}}var Ey=C(()=>{_y();Ty();yo();gy();});function mV(t){for(;t.p<t.s.length;t.p++){let e=t.s.charCodeAt(t.p);if(e===10)break;if(e===13&&t.s.charCodeAt(t.p+1)===10){t.p++;break}(e<32&&e!==9||e===127)&&se.x("control characters are not allowed in comments",t)}}function Wn(t,e,n){let r;for(;t.p<t.s.length;){for(;t.p<t.s.length&&((r=t.s.charCodeAt(t.p))===32||r===9||!e&&(r===10||r===13&&t.s.charCodeAt(t.p+1)===10));)t.p++;if(n||r!==35)break;mV(t)}}var vy=C(()=>{yo();});function pf(t,e=61){let n,r=0,s=[],o,i=t.s.charCodeAt(n=t.p);do{if(i===e)return r||se.x("unexpected end of key",t),r===1&&s.push(t.s.slice(o,t.p)),t.p++,s;i===46?(r||se.x("illegal empty bare key",t),r===1&&s.push(t.s.slice(o,t.p)),r=0):!r&&(i===34||i===39)?(i===t.s.charCodeAt(t.p+1)&&i===t.s.charCodeAt(t.p+2)&&se.x("illegal quoted key: multiline strings are not allowed",t),s.push(ff(t)),r=2,t.p--):i===32||i===9?r===1&&(s.push(t.s.slice(o,t.p)),r=2):r===2||i<48&&i!==45||i>57&&i<65||i>90&&i<97&&i!==95||i>122?se.x("illegal character in key",t):r||(r=1,o=t.p)}while(i=t.s.charCodeAt(++t.p));se.x("incomplete key-value: cannot find end of key",t,n)}function cx(t){let e=t.p++,n=Object.create(null),r=new Set,s;for(;t.p<t.s.length;){if(Wn(t),(s=t.s.charCodeAt(t.p))===125)return t.p++,n;let o,i=n,a=!1,l=t.p,c=pf(t);for(let u=0;u<c.length;u++){u&&(i=a?i[o]:i[o]=Object.create(null)),o=c[u],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&se.x("trying to redefine an already defined value",t,l);let f=o==="__proto__";if(t.uk&&(f||o==="constructor")){i=t.uk!==1&&se.x("document contains an unsafe property",t,l);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&se.x("trying to redefine an already defined value",t,l),Wn(t,!0,!0);let d=Pl(t,125);if(i&&typeof(i[o]=d)=="object"&&r.add(d),Wn(t),(s=t.s.charCodeAt(t.p++))===125)return n;s!==44&&se.x("expected comma or end of structure",t,t.p-1)}se.x("unfinished table",t,e)}function dx(t){let e=t.p++,n=[],r;for(;t.p<t.s.length;){if(Wn(t),(r=t.s.charCodeAt(t.p))===93)return t.p++,n;if(n.push(Pl(t,93)),Wn(t),(r=t.s.charCodeAt(t.p++))===93)return n;r!==44&&se.x("expected comma or end of structure",t,t.p-1)}se.x("unfinished array",t,e)}var Ty=C(()=>{_y();Ey();vy();yo();});function ux(t,e,n,r,s){let o=n,i=r,a,l=!1,c;for(let d=0;d<e.length;d++){if(d){if(o=l?o[a]:o[a]=Object.create(null),i=(c=i[a]).c,s===0&&(c.t===1||c.t===2))return null;if(c.t===2){let u=o.length-1;o=o[u],i=i[u].c}}if(a=e[d],(l=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!l){let u=a==="__proto__";if(t.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:d<e.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(c=i[a],c.t!==s&&!(s===1&&c.t===3)||(s===2&&(c.d||(c.d=!0,o[a]=[]),o[a].push(o=Object.create(null)),c.c[c.i++]=c={t:1,d:!1,i:0,c:Object.create(null)}),c.d))return null;if(c.d=!0,s===1)o=l?o[a]:o[a]=Object.create(null);else if(s===0&&l)return null;return[a,o,c.c]}function fx(t,e,n){(e===null||t.uk===2)&&se.x(e===null?"trying to redefine an already defined table or value":"document contains an unsafe property",t,n)}function xi(t,e={}){let n={s:t,p:0,d:e.maxDepth??1e3,bi:e.integersAsBigInt??!1,ld:e.useLegacyDate??!0,uk:e.unsafeKeyBehaviour==="throw"?2:e.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),o,i=!1,a=r,l=s;for(t.charCodeAt(0)===65279&&n.p++,Wn(n);n.p<t.length;){if(t.charCodeAt(n.p)===91){let c=t.charCodeAt(++n.p)===91;o=n.p+=+c,i=!1;let d=pf(n,93);c&&(t.charCodeAt(n.p)!==93&&se.x("expected end of table array declaration",n),n.p++);let u=ux(n,d,r,s,c?2:1);u?(l=u[2],a=u[1]):(fx(n,u,o),i=!0)}else{o=n.p;let c=pf(n),d=ux(n,c,a,l,0);!d&&!i&&fx(n,d,o),Wn(n,!0,!0);let u=Pl(n,void 0);d&&!i&&(d[1][d[0]]=u)}Wn(n,!0),n.p<t.length&&(o=t.charCodeAt(n.p))!==10&&(o!==13||t.charCodeAt(n.p+1)!==10)&&se.x("each key-value declaration must be followed by an end-of-line",n),Wn(n)}return r}var mx=C(()=>{Ty();Ey();vy();yo();});var $de,px=C(()=>{$de=!!"".isWellFormed});var Sy=C(()=>{mx();px();gy();yo();});import{readFileSync as pV}from"node:fs";import{homedir as hV}from"node:os";import{join as hx,resolve as _V}from"node:path";function bn(t=process.env,e){let n=t.LMCTL_HOME||(t.HOME===void 0?process.env.LMCTL_HOME:void 0);return e!==void 0?_V(e):hx(n||hx(t.HOME||hV(),".lmctl"),"init.toml")}function gV(t,e,n,r,s){return e==="missing"?"Missing "+t:e==="read"?"Cannot read "+t+": "+n:"Invalid "+t+":"+r+":"+s+": "+n}function ar(t,e="<init.toml>"){let{document:n}=_x(t,e),r={};for(let o of wo){let i=n[o];if(i===void 0)continue;if(!i||typeof i!="object"||Array.isArray(i)||i instanceof Date)throw new vt(e,"schema","["+o+"] must be a table with provider and model1");let a={};for(let l of Ul){let c=i[l];if(typeof c!="string"||!c.trim())throw new vt(e,"schema",o+"."+l+" must be a nonempty string");a[l]=c}r[o]=a}let s={raw:t,document:n,path:e,slots:r};return Object.defineProperty(s,"config",{enumerable:!1,get(){let o=wo.find(i=>!r[i]);if(o)throw new vt(e,"schema","["+o+"] is not in "+e+"; this needs the example slots ["+wo.join("], [")+"] -- add ["+o+"] with provider and model1");return{provider1:r.Provider1,provider2:r.Provider2,provider3:r.Provider3}}}),s}function _x(t,e="<init.toml>"){let n;try{n=xi(t.startsWith("\uFEFF")?t.slice(1):t,{integersAsBigInt:"asNeeded",useLegacyDate:!0})}catch(r){let s=r;throw new vt(e,"syntax",s.message,s.line??1,(s.column??1)+(t.startsWith("\uFEFF")&&s.line===1?1:0))}return{raw:t,document:n,path:e}}function yV(t){let e;try{e=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(pV(t))}catch(n){let r=n;throw new vt(t,r.code==="ENOENT"?"missing":"read",r.message)}return e}function Fl(t=bn()){return ar(yV(t),t)}var wo,Ul,vt,hf=C(()=>{"use strict";Sy();wo=["Provider1","Provider2","Provider3"],Ul=["provider","model1"];vt=class extends Error{path;kind;line;column;detail;constructor(e,n,r,s=1,o=1){let i=gV(e,n,r,s,o);super(n==="missing"?i+". Run lmctl init first.":i+". Fix the file or run lmctl init."),this.path=e,this.kind=n,this.line=s,this.column=o,this.detail=i}}});function wV(t){let e=[],n=0;for(;n<t.length;){let r=t[n];if(r==="\r"||r===`
2009
+ `:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":se.x("unrecognised escape sequence",t),a=t.p+1,l=0);else n!==32&&n!==9&&(l===2&&se.x("invalid escape: only line-ending whitespace may be escaped",t,a),l=!s&&n===92?1:0,a=t.p);se.x("unfinished string",t,e)}var _y=C(()=>{yo();});var cV,Ml,gy=C(()=>{cV=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,Ml=class t extends Date{#t=!1;#n=!1;#e=null;constructor(e,n,r){let s=!0,o=!0,i="Z",a;if(typeof e=="string")if(n)e:{if(n<3){if(+e.slice(11,13)>23){e="";break e}n===2?(i=null,e+="Z"):(a=e.charCodeAt(e.length-1))!==90&&a!==122&&(i=e.slice(e.length-6)),r&&(e=e.slice(0,10)+"T"+e.slice(11))}else n===4&&(e=+e.slice(0,2)>23?"":`0000-01-01T${e}Z`);s=n!==4,o=n!==3}else{let l=e.match(cV);l?(l[1]||(s=!1,e=`0000-01-01T${e}`),o=!!l[2],o&&e[10]===" "&&(e=e.replace(" ","T")),l[2]&&+l[2]>23?e="":(i=l[3]||null,!i&&o&&(e+="Z"))):e=""}super(e),isNaN(this.getTime())||(this.#t=s,this.#n=o,this.#e=i)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let e=super.toISOString();if(this.isDate())return e.slice(0,10);if(this.isTime())return e.slice(11,23);if(this.#e===null)return e.slice(0,-1);if(this.#e==="Z"||this.#e==="z")return e;let n=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return n=this.#e[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(e,n="Z"){let r=new t(e);return r.#e=n,r}static wrapAsLocalDateTime(e){let n=new t(e);return n.#e=null,n}static wrapAsLocalDate(e){let n=new t(e);return n.#n=!1,n.#e=null,n}static wrapAsLocalTime(e){let n=new t(e);return n.#t=!1,n.#e=null,n}}});function an(t,e=10){return e===16?t>47&&t<58||t>64&&t<71||t>96&&t<103:t>47&&t<48+e}function wy(t,e){return t===32||t===9||t===10||t===13||e&&(t===e||t===44)||t===35}function Pl(t,e){let n=t.p,r=t.s.charCodeAt(t.p);if(r===91||r===123){t.d--||se.x("document contains excessively nested structures. aborting.",t);let s=r===91?dx(t):cx(t);return t.d++,s}return r===34||r===39?ff(t):r===116?((t.s.charCodeAt(++t.p)!==114||t.s.charCodeAt(++t.p)!==117||t.s.charCodeAt(++t.p)!==101)&&se.x("invalid value",t,n),t.p++,!0):r===102?((t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==108||t.s.charCodeAt(++t.p)!==115||t.s.charCodeAt(++t.p)!==101)&&se.x("invalid value",t,n),t.p++,!1):r===43||r===45?mf(t,t.p,t.s.charCodeAt(++t.p),44-r,e):t.s.charCodeAt(t.p+4)===45&&t.s.charCodeAt(t.p+7)===45?dV(t,r,e):t.s.charCodeAt(t.p+2)===58?uV(t,r,e):mf(t,t.p,r,0,e)}function mf(t,e,n,r,s){let o=n,i=0,a=!1;if(o===105)return(t.s.charCodeAt(++t.p)!==110||t.s.charCodeAt(++t.p)!==102)&&se.x("invalid value",t,e),t.p++,(r||1)/0;if(o===110)return(t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==110)&&se.x("invalid value",t,e),t.p++,NaN;if(o===48){if(++t.p>=t.s.length||wy(o=t.s.charCodeAt(t.p),s))return t.bi===!0?0n:0;if(!r){if(o===120)return yy(t,e,16,s);if(o===98)return yy(t,e,2,s);if(o===111)return yy(t,e,8,s)}o===46?i=2:o===101||o===69?i=4:se.x("illegal leading zero",t,e)}else an(o)||se.x("invalid value",t,e);for(;++t.p<t.s.length&&(o=t.s.charCodeAt(t.p),!wy(o,s));)i||(i=1),o===95?(i&1||se.x("illegal underscore",t),i+=11,a=!0):i===1&&o===46?i=2:(i===1||i===3)&&(o===101||o===69)?i=4:i===4&&(o===43||o===45)||(an(o)?i>9?i-=11:i&1||i++:se.x("illegal character in numeric literal",t));if(!i){let c=(n-48)*(r||1);return t.bi===!0?BigInt(c):c}i&1||se.x("unfinished numeric value",t,e);let l=t.s.slice(e,t.p);return a&&(l=l.replaceAll("_","")),i>1?parseFloat(l):lx(t,l,10,e)}function yy(t,e,n,r){let s,o=1;for(;++t.p<t.s.length&&(s=t.s.charCodeAt(t.p),!wy(s,r));)s===95?(o&1&&se.x("illegal underscore",t),o=3):an(s,n)?o&1&&o--:se.x("illegal character in numeric literal",t);o&1&&se.x("unfinished numeric value",t);let i=t.s.slice(e+2,t.p);return o&&(i=i.replaceAll("_","")),lx(t,i,n,e)}function lx(t,e,n,r){if(t.bi!==!0)e:{let s=parseInt(e,n);if(!Number.isSafeInteger(s)){if(t.bi)break e;se.x("integer value cannot be represented losslessly",t,r)}return s}return BigInt(n===10?e:(n===2?"0b":n===8?"0o":"0x")+e)}function dV(t,e,n){let r=t.p++,s;if(!an(e)||!an(t.s.charCodeAt(t.p++))||!an(t.s.charCodeAt(t.p++))||!an(t.s.charCodeAt(t.p++)))return mf(t,t.p=r,e,0,n);if(t.p+=5,an(t.s.charCodeAt(t.p++))||se.x("invalid date-time: date part is malformed",t,r),t.p>=t.s.length||((e=t.s.charCodeAt(t.p))!==32||(s=!0,!an(t.s.charCodeAt(t.p+1))))&&e!==84&&e!==116){let i=t.s.slice(r,t.p);return $l(t,i,3,!1,r)}if(t.s.charCodeAt(t.p+=3)!==58&&se.x("invalid date-time: time part is malformed",t,r),t.s.charCodeAt(t.p+=3)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;an(t.s.charCodeAt(++t.p)););if(e=t.s.charCodeAt(t.p)){if(e===90||e===122){let i=t.s.slice(r,++t.p);return $l(t,i,1,s,r,"[+00:00]")}if(e===43||e===45){let i=t.s.slice(r,t.p+=6);return $l(t,i,1,s,r,!t.ld&&"["+t.s.slice(t.p-6,t.p)+"]")}}let o=t.s.slice(r,t.p);return $l(t,o,2,s,r)}function uV(t,e,n){let r=t.p;if(!an(e)||!an(t.s.charCodeAt(++t.p)))return mf(t,--t.p,e,0,n);if(t.s.charCodeAt(t.p+=4)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;an(t.s.charCodeAt(++t.p)););let s=t.s.slice(r,t.p);return $l(t,s,4,!1,r)}function $l(t,e,n,r,s,o){if(t.ld){let i=new Ml(e,n,r);return i.isValid()||se.x("invalid date",t,s),i}try{switch(o&&(e+=o),n){case 1:return Temporal.ZonedDateTime.from(e);case 2:return Temporal.PlainDateTime.from(e);case 3:return Temporal.PlainDate.from(e);case 4:return Temporal.PlainTime.from(e)}}catch(i){se.x(i instanceof Error?i.message:""+i,t,s)}}var Ey=C(()=>{_y();Ty();yo();gy();});function fV(t){for(;t.p<t.s.length;t.p++){let e=t.s.charCodeAt(t.p);if(e===10)break;if(e===13&&t.s.charCodeAt(t.p+1)===10){t.p++;break}(e<32&&e!==9||e===127)&&se.x("control characters are not allowed in comments",t)}}function Wn(t,e,n){let r;for(;t.p<t.s.length;){for(;t.p<t.s.length&&((r=t.s.charCodeAt(t.p))===32||r===9||!e&&(r===10||r===13&&t.s.charCodeAt(t.p+1)===10));)t.p++;if(n||r!==35)break;fV(t)}}var vy=C(()=>{yo();});function pf(t,e=61){let n,r=0,s=[],o,i=t.s.charCodeAt(n=t.p);do{if(i===e)return r||se.x("unexpected end of key",t),r===1&&s.push(t.s.slice(o,t.p)),t.p++,s;i===46?(r||se.x("illegal empty bare key",t),r===1&&s.push(t.s.slice(o,t.p)),r=0):!r&&(i===34||i===39)?(i===t.s.charCodeAt(t.p+1)&&i===t.s.charCodeAt(t.p+2)&&se.x("illegal quoted key: multiline strings are not allowed",t),s.push(ff(t)),r=2,t.p--):i===32||i===9?r===1&&(s.push(t.s.slice(o,t.p)),r=2):r===2||i<48&&i!==45||i>57&&i<65||i>90&&i<97&&i!==95||i>122?se.x("illegal character in key",t):r||(r=1,o=t.p)}while(i=t.s.charCodeAt(++t.p));se.x("incomplete key-value: cannot find end of key",t,n)}function cx(t){let e=t.p++,n=Object.create(null),r=new Set,s;for(;t.p<t.s.length;){if(Wn(t),(s=t.s.charCodeAt(t.p))===125)return t.p++,n;let o,i=n,a=!1,l=t.p,c=pf(t);for(let u=0;u<c.length;u++){u&&(i=a?i[o]:i[o]=Object.create(null)),o=c[u],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&se.x("trying to redefine an already defined value",t,l);let f=o==="__proto__";if(t.uk&&(f||o==="constructor")){i=t.uk!==1&&se.x("document contains an unsafe property",t,l);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&se.x("trying to redefine an already defined value",t,l),Wn(t,!0,!0);let d=Pl(t,125);if(i&&typeof(i[o]=d)=="object"&&r.add(d),Wn(t),(s=t.s.charCodeAt(t.p++))===125)return n;s!==44&&se.x("expected comma or end of structure",t,t.p-1)}se.x("unfinished table",t,e)}function dx(t){let e=t.p++,n=[],r;for(;t.p<t.s.length;){if(Wn(t),(r=t.s.charCodeAt(t.p))===93)return t.p++,n;if(n.push(Pl(t,93)),Wn(t),(r=t.s.charCodeAt(t.p++))===93)return n;r!==44&&se.x("expected comma or end of structure",t,t.p-1)}se.x("unfinished array",t,e)}var Ty=C(()=>{_y();Ey();vy();yo();});function ux(t,e,n,r,s){let o=n,i=r,a,l=!1,c;for(let d=0;d<e.length;d++){if(d){if(o=l?o[a]:o[a]=Object.create(null),i=(c=i[a]).c,s===0&&(c.t===1||c.t===2))return null;if(c.t===2){let u=o.length-1;o=o[u],i=i[u].c}}if(a=e[d],(l=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!l){let u=a==="__proto__";if(t.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:d<e.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(c=i[a],c.t!==s&&!(s===1&&c.t===3)||(s===2&&(c.d||(c.d=!0,o[a]=[]),o[a].push(o=Object.create(null)),c.c[c.i++]=c={t:1,d:!1,i:0,c:Object.create(null)}),c.d))return null;if(c.d=!0,s===1)o=l?o[a]:o[a]=Object.create(null);else if(s===0&&l)return null;return[a,o,c.c]}function fx(t,e,n){(e===null||t.uk===2)&&se.x(e===null?"trying to redefine an already defined table or value":"document contains an unsafe property",t,n)}function xi(t,e={}){let n={s:t,p:0,d:e.maxDepth??1e3,bi:e.integersAsBigInt??!1,ld:e.useLegacyDate??!0,uk:e.unsafeKeyBehaviour==="throw"?2:e.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),o,i=!1,a=r,l=s;for(t.charCodeAt(0)===65279&&n.p++,Wn(n);n.p<t.length;){if(t.charCodeAt(n.p)===91){let c=t.charCodeAt(++n.p)===91;o=n.p+=+c,i=!1;let d=pf(n,93);c&&(t.charCodeAt(n.p)!==93&&se.x("expected end of table array declaration",n),n.p++);let u=ux(n,d,r,s,c?2:1);u?(l=u[2],a=u[1]):(fx(n,u,o),i=!0)}else{o=n.p;let c=pf(n),d=ux(n,c,a,l,0);!d&&!i&&fx(n,d,o),Wn(n,!0,!0);let u=Pl(n,void 0);d&&!i&&(d[1][d[0]]=u)}Wn(n,!0),n.p<t.length&&(o=t.charCodeAt(n.p))!==10&&(o!==13||t.charCodeAt(n.p+1)!==10)&&se.x("each key-value declaration must be followed by an end-of-line",n),Wn(n)}return r}var mx=C(()=>{Ty();Ey();vy();yo();});var Mde,px=C(()=>{Mde=!!"".isWellFormed});var Sy=C(()=>{mx();px();gy();yo();});import{readFileSync as mV}from"node:fs";import{homedir as pV}from"node:os";import{join as hx,resolve as hV}from"node:path";function bn(t=process.env,e){let n=t.LMCTL_HOME||(t.HOME===void 0?process.env.LMCTL_HOME:void 0);return e!==void 0?hV(e):hx(n||hx(t.HOME||pV(),".lmctl"),"init.toml")}function _V(t,e,n,r,s){return e==="missing"?"Missing "+t:e==="read"?"Cannot read "+t+": "+n:"Invalid "+t+":"+r+":"+s+": "+n}function ar(t,e="<init.toml>"){let{document:n}=_x(t,e),r={};for(let o of wo){let i=n[o];if(i===void 0)continue;if(!i||typeof i!="object"||Array.isArray(i)||i instanceof Date)throw new vt(e,"schema","["+o+"] must be a table with provider and model1");let a={};for(let l of Ul){let c=i[l];if(typeof c!="string"||!c.trim())throw new vt(e,"schema",o+"."+l+" must be a nonempty string");a[l]=c}r[o]=a}let s={raw:t,document:n,path:e,slots:r};return Object.defineProperty(s,"config",{enumerable:!1,get(){let o=wo.find(i=>!r[i]);if(o)throw new vt(e,"schema","["+o+"] is not in "+e+"; this needs the example slots ["+wo.join("], [")+"] -- add ["+o+"] with provider and model1");return{provider1:r.Provider1,provider2:r.Provider2,provider3:r.Provider3}}}),s}function _x(t,e="<init.toml>"){let n;try{n=xi(t.startsWith("\uFEFF")?t.slice(1):t,{integersAsBigInt:"asNeeded",useLegacyDate:!0})}catch(r){let s=r;throw new vt(e,"syntax",s.message,s.line??1,(s.column??1)+(t.startsWith("\uFEFF")&&s.line===1?1:0))}return{raw:t,document:n,path:e}}function gV(t){let e;try{e=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(mV(t))}catch(n){let r=n;throw new vt(t,r.code==="ENOENT"?"missing":"read",r.message)}return e}function Fl(t=bn()){return ar(gV(t),t)}var wo,Ul,vt,hf=C(()=>{"use strict";Sy();wo=["Provider1","Provider2","Provider3"],Ul=["provider","model1"];vt=class extends Error{path;kind;line;column;detail;constructor(e,n,r,s=1,o=1){let i=_V(e,n,r,s,o);super(n==="missing"?i+". Run lmctl init first.":i+". Fix the file or run lmctl init."),this.path=e,this.kind=n,this.line=s,this.column=o,this.detail=i}}});function yV(t){let e=[],n=0;for(;n<t.length;){let r=t[n];if(r==="\r"||r===`
2011
2010
  `){let o=n;n+=r==="\r"&&t[n+1]===`
2012
2011
  `?2:1,e.push({start:o,end:n,text:`
2013
2012
  `,kind:"newline"});continue}if(/\s/.test(r)){n++;continue}if(r==="#"){for(;n<t.length&&t[n]!=="\r"&&t[n]!==`
2014
- `;)n++;continue}let s=n;if(r==='"'||r==="'"){let o=t.startsWith(r.repeat(3),n);n+=o?3:1;let i=!1;for(;n<t.length;){if(r==='"'&&t[n]==="\\"){n+=2;continue}if(t[n]===r){if(!o){n++,i=!0;break}if(t.startsWith(r.repeat(3),n)){for(;t[n]===r;)n++;i=!0;break}}n++}if(!i)throw new Error("cannot locate string boundary");e.push({start:s,end:n,text:t.slice(s,n),kind:"string",multiline:o});continue}if("[]=.{},".includes(r)){n++,e.push({start:s,end:n,text:r,kind:"symbol"});continue}for(;n<t.length&&!/\s/.test(t[n])&&!`"'#[]=.{},`.includes(t[n]);)n++;if(n===s)throw new Error("cannot locate token");e.push({start:s,end:n,text:t.slice(s,n),kind:"word"})}return e}function EV(t){let e=xi(t+" = 0"),n=[];for(;e&&typeof e=="object"&&!Array.isArray(e);){let r=Object.entries(e);if(r.length!==1)throw new Error("ambiguous key");n.push(r[0][0]),e=r[0][1]}return n}function TV(t){let e=xi(t+`
2015
- __init_edit_marker__ = 0`),n=[];for(;e&&typeof e=="object"&&!Array.isArray(e);){let r=Object.entries(e);if(r.length!==1)return[];if(r[0][0]==="__init_edit_marker__")return n;n.push(r[0][0]),e=r[0][1]}return[]}function by(t){return'"'+Array.from(t).map(e=>{let n=e.codePointAt(0);if(n>=55296&&n<=57343)throw new Error("managed string contains an invalid Unicode scalar");return e==='"'?'\\"':e==="\\"?"\\\\":n<32||n===127?"\\u"+n.toString(16).padStart(4,"0"):e}).join("")+'"'}function gx(t,e,n=[]){if(n.length===2&&wo.includes(n[0])&&Ul.includes(n[1])||Object.is(t,e))return!0;if(t instanceof Date||e instanceof Date)return t instanceof Date&&e instanceof Date&&t.toISOString()===e.toISOString();if(!t||!e||typeof t!="object"||typeof e!="object"||Array.isArray(t)!==Array.isArray(e))return!1;let r=Object.keys(t),s=Object.keys(e);return r.length!==s.length||r.some(o=>!Object.hasOwn(e,o))?!1:r.every(o=>gx(t[o],e[o],[...n,o]))}function yx(t,e){try{let n=ar(t),r=wo.filter(m=>n.slots[m]),s=wo.filter(m=>!n.slots[m]),o=[];for(let m of r)for(let p of Ul){let _=n.slots[m][p],h=e[m.toLowerCase()][p];_!==h&&o.push({section:m,key:p,oldValue:_,newValue:h,line:1})}if(!o.length)return{ok:!0,text:t,changes:o,absent:s};let i=new Map,a=wV(t),l=0,c=[];for(;l<a.length;){if(a[l].kind==="newline"){l++;continue}let m=l;if(a[l].text==="["){for(;l<a.length&&a[l].kind!=="newline";)l++;c=TV(t.slice(a[m].start,a[l-1].end));continue}for(;l<a.length&&a[l].text!=="=";)l++;if(l===a.length)throw new Error("cannot locate assignment");let p=EV(t.slice(a[m].start,a[l-1].end));l++;let _=l,h=0;for(;l<a.length;){let g=a[l];if(g.kind==="newline"&&h===0)break;g.kind==="symbol"&&((g.text==="["||g.text==="{")&&h++,(g.text==="]"||g.text==="}")&&h--),l++}if(c.length===1&&p.length===1&&l-_===1){let g=a[_];g.kind==="string"&&!g.multiline&&i.set(c[0]+"."+p[0],g)}}let d=o.map(m=>{let p=i.get(m.section+"."+m.key);if(!p)throw new Error("cannot edit "+m.section+"."+m.key+" in place (multiline, dotted or inline managed layout); edit by hand");return m.line=t.slice(0,p.start).split(/\r\n|\r|\n/).length,{start:p.start,end:p.end,text:by(m.newValue)}}).sort((m,p)=>p.start-m.start),u=t;for(let m of d)u=u.slice(0,m.start)+m.text+u.slice(m.end);let f=ar(u);for(let m of r)for(let p of Ul)if(f.slots[m]?.[p]!==e[m.toLowerCase()][p])throw new Error("managed-value verification failed");if(!gx(n.document,f.document))throw new Error("unmanaged semantic verification failed");return{ok:!0,text:u,changes:o,absent:s}}catch(n){return{ok:!1,error:n instanceof vt?n.detail:n.message,line:n.line}}}var wx=C(()=>{"use strict";Sy();hf()});import*as Ex from"node:child_process";function SV(t,e){try{let n=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return n.status===0?{found:!0,version:(n.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:n.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function _f(t,e={}){let n=e.spawnSync===void 0&&process.env[bV]==="1",r=e.spawnSync??Ex.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ri[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(n){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=SV(a,r);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function Tx(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ri).join(", ")})`;let e=vV[t.provider],n=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${n}`:`provider "${t.provider}" binary '${t.binary}' not installed${n}`}var Ri,vV,bV,jl=C(()=>{"use strict";Ri={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy",kimi:"kimi",dsh:"dsh",hermes:"hermes",miniplayer:"miniplayer",muse:"muse",pi:"pi"},vV={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",lmplayer:"Install lmplayer and ensure the lmplayer binary is on PATH.",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google",kimi:"https://github.com/MoonshotAI/kimi-code",dsh:"https://github.com/deepseek-ai/deepseek-harness",hermes:"https://github.com/NousResearch/hermes-agent",pi:"https://github.com/badlogic/pi-mono"};bV="LMCTL_SKIP_BINARY_CHECK"});import{spawnSync as IV}from"node:child_process";function Sx(t){return Li.filter(e=>t.includes(e))}function kV(t,e){if(e.length===0)throw new Error(`No model ids are available for detected provider "${t}"`);if(t!=="claude")return e[0];let n=e.filter(s=>/^claude-[a-z]+-\d+(?:-\d+)?$/.test(s));if(n.length===0)throw new Error("No undated Claude Code model id is available in the catalog");let r=s=>s.match(/-(\d+)(?:-(\d+))?$/).slice(1).map(o=>Number(o??0));return n.reduce((s,o)=>{let i=r(s),a=r(o);return a[0]>i[0]||a[0]===i[0]&&a[1]>i[1]?o:s})}async function bx(t){switch(t){case"codex":{let e=_o();if(!e.available)throw new Error(e.reason??"codex returned no models");return e.models}case"agy":{let e=ho();if(!e.available)throw new Error(e.reason??"agy returned no models");return e.models}case"kimi":{let e=go();if(!e.available)throw new Error(e.reason??"Kimi config has no models");return e.models}case"claude":{let n=(await Dt()).catalog?.records??[],r=n.flatMap(s=>s.native?.claude_code?[s.native.claude_code]:[]);return r.length?[...new Set(r)]:[...new Set(n.flatMap(s=>{let o=s.source_model_id.split("/").at(-1);return s.provider==="anthropic"&&s.mode==="chat"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(o)?[o]:[]}))]}default:throw new Error(`Unsupported init provider "${t}"`)}}function Ix(t,e){let n=t.filter((l,c)=>t.indexOf(l)===c),r=n.length>0?n:["claude"],[s,o=s,i=s]=r,a=l=>({provider:l,model1:kV(l,e[l]??[])});return{provider1:a(s),provider2:a(o),provider3:a(i)}}function gf(t=IV){return _f(Li,{spawnSync:t}).filter(e=>e.found).map(e=>e.provider)}function vx(t){return by(t)}function Wl(t){let e=(n,r)=>[`[${n}]`,`provider = ${vx(r.provider)}`,`model1 = ${vx(r.model1)}`].join(`
2013
+ `;)n++;continue}let s=n;if(r==='"'||r==="'"){let o=t.startsWith(r.repeat(3),n);n+=o?3:1;let i=!1;for(;n<t.length;){if(r==='"'&&t[n]==="\\"){n+=2;continue}if(t[n]===r){if(!o){n++,i=!0;break}if(t.startsWith(r.repeat(3),n)){for(;t[n]===r;)n++;i=!0;break}}n++}if(!i)throw new Error("cannot locate string boundary");e.push({start:s,end:n,text:t.slice(s,n),kind:"string",multiline:o});continue}if("[]=.{},".includes(r)){n++,e.push({start:s,end:n,text:r,kind:"symbol"});continue}for(;n<t.length&&!/\s/.test(t[n])&&!`"'#[]=.{},`.includes(t[n]);)n++;if(n===s)throw new Error("cannot locate token");e.push({start:s,end:n,text:t.slice(s,n),kind:"word"})}return e}function wV(t){let e=xi(t+" = 0"),n=[];for(;e&&typeof e=="object"&&!Array.isArray(e);){let r=Object.entries(e);if(r.length!==1)throw new Error("ambiguous key");n.push(r[0][0]),e=r[0][1]}return n}function EV(t){let e=xi(t+`
2014
+ __init_edit_marker__ = 0`),n=[];for(;e&&typeof e=="object"&&!Array.isArray(e);){let r=Object.entries(e);if(r.length!==1)return[];if(r[0][0]==="__init_edit_marker__")return n;n.push(r[0][0]),e=r[0][1]}return[]}function by(t){return'"'+Array.from(t).map(e=>{let n=e.codePointAt(0);if(n>=55296&&n<=57343)throw new Error("managed string contains an invalid Unicode scalar");return e==='"'?'\\"':e==="\\"?"\\\\":n<32||n===127?"\\u"+n.toString(16).padStart(4,"0"):e}).join("")+'"'}function gx(t,e,n=[]){if(n.length===2&&wo.includes(n[0])&&Ul.includes(n[1])||Object.is(t,e))return!0;if(t instanceof Date||e instanceof Date)return t instanceof Date&&e instanceof Date&&t.toISOString()===e.toISOString();if(!t||!e||typeof t!="object"||typeof e!="object"||Array.isArray(t)!==Array.isArray(e))return!1;let r=Object.keys(t),s=Object.keys(e);return r.length!==s.length||r.some(o=>!Object.hasOwn(e,o))?!1:r.every(o=>gx(t[o],e[o],[...n,o]))}function yx(t,e){try{let n=ar(t),r=wo.filter(m=>n.slots[m]),s=wo.filter(m=>!n.slots[m]),o=[];for(let m of r)for(let p of Ul){let _=n.slots[m][p],h=e[m.toLowerCase()][p];_!==h&&o.push({section:m,key:p,oldValue:_,newValue:h,line:1})}if(!o.length)return{ok:!0,text:t,changes:o,absent:s};let i=new Map,a=yV(t),l=0,c=[];for(;l<a.length;){if(a[l].kind==="newline"){l++;continue}let m=l;if(a[l].text==="["){for(;l<a.length&&a[l].kind!=="newline";)l++;c=EV(t.slice(a[m].start,a[l-1].end));continue}for(;l<a.length&&a[l].text!=="=";)l++;if(l===a.length)throw new Error("cannot locate assignment");let p=wV(t.slice(a[m].start,a[l-1].end));l++;let _=l,h=0;for(;l<a.length;){let g=a[l];if(g.kind==="newline"&&h===0)break;g.kind==="symbol"&&((g.text==="["||g.text==="{")&&h++,(g.text==="]"||g.text==="}")&&h--),l++}if(c.length===1&&p.length===1&&l-_===1){let g=a[_];g.kind==="string"&&!g.multiline&&i.set(c[0]+"."+p[0],g)}}let d=o.map(m=>{let p=i.get(m.section+"."+m.key);if(!p)throw new Error("cannot edit "+m.section+"."+m.key+" in place (multiline, dotted or inline managed layout); edit by hand");return m.line=t.slice(0,p.start).split(/\r\n|\r|\n/).length,{start:p.start,end:p.end,text:by(m.newValue)}}).sort((m,p)=>p.start-m.start),u=t;for(let m of d)u=u.slice(0,m.start)+m.text+u.slice(m.end);let f=ar(u);for(let m of r)for(let p of Ul)if(f.slots[m]?.[p]!==e[m.toLowerCase()][p])throw new Error("managed-value verification failed");if(!gx(n.document,f.document))throw new Error("unmanaged semantic verification failed");return{ok:!0,text:u,changes:o,absent:s}}catch(n){return{ok:!1,error:n instanceof vt?n.detail:n.message,line:n.line}}}var wx=C(()=>{"use strict";Sy();hf()});import*as Ex from"node:child_process";function vV(t,e){try{let n=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return n.status===0?{found:!0,version:(n.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:n.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function _f(t,e={}){let n=e.spawnSync===void 0&&process.env[SV]==="1",r=e.spawnSync??Ex.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ri[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(n){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=vV(a,r);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function Tx(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ri).join(", ")})`;let e=TV[t.provider],n=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${n}`:`provider "${t.provider}" binary '${t.binary}' not installed${n}`}var Ri,TV,SV,jl=C(()=>{"use strict";Ri={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy",kimi:"kimi",dsh:"dsh",hermes:"hermes",miniplayer:"miniplayer",muse:"muse",pi:"pi"},TV={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",lmplayer:"Install lmplayer and ensure the lmplayer binary is on PATH.",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google",kimi:"https://github.com/MoonshotAI/kimi-code",dsh:"https://github.com/deepseek-ai/deepseek-harness",hermes:"https://github.com/NousResearch/hermes-agent",pi:"https://github.com/badlogic/pi-mono"};SV="LMCTL_SKIP_BINARY_CHECK"});import{spawnSync as bV}from"node:child_process";function Sx(t){return Li.filter(e=>t.includes(e))}function IV(t,e){if(e.length===0)throw new Error(`No model ids are available for detected provider "${t}"`);if(t!=="claude")return e[0];let n=e.filter(s=>/^claude-[a-z]+-\d+(?:-\d+)?$/.test(s));if(n.length===0)throw new Error("No undated Claude Code model id is available in the catalog");let r=s=>s.match(/-(\d+)(?:-(\d+))?$/).slice(1).map(o=>Number(o??0));return n.reduce((s,o)=>{let i=r(s),a=r(o);return a[0]>i[0]||a[0]===i[0]&&a[1]>i[1]?o:s})}async function bx(t){switch(t){case"codex":{let e=_o();if(!e.available)throw new Error(e.reason??"codex returned no models");return e.models}case"agy":{let e=ho();if(!e.available)throw new Error(e.reason??"agy returned no models");return e.models}case"kimi":{let e=go();if(!e.available)throw new Error(e.reason??"Kimi config has no models");return e.models}case"claude":{let n=(await Dt()).catalog?.records??[],r=n.flatMap(s=>s.native?.claude_code?[s.native.claude_code]:[]);return r.length?[...new Set(r)]:[...new Set(n.flatMap(s=>{let o=s.source_model_id.split("/").at(-1);return s.provider==="anthropic"&&s.mode==="chat"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(o)?[o]:[]}))]}default:throw new Error(`Unsupported init provider "${t}"`)}}function Ix(t,e){let n=t.filter((l,c)=>t.indexOf(l)===c),r=n.length>0?n:["claude"],[s,o=s,i=s]=r,a=l=>({provider:l,model1:IV(l,e[l]??[])});return{provider1:a(s),provider2:a(o),provider3:a(i)}}function gf(t=bV){return _f(Li,{spawnSync:t}).filter(e=>e.found).map(e=>e.provider)}function vx(t){return by(t)}function Wl(t){let e=(n,r)=>[`[${n}]`,`provider = ${vx(r.provider)}`,`model1 = ${vx(r.model1)}`].join(`
2016
2015
  `);return`# Generated by \`lmctl init\`. This is a STARTING POINT, not a fixed answer --
2017
2016
  # lmctl properties: hierarchical keys such as Provider1.provider, Provider1.model1,
2018
2017
  # and user-defined top-level Env1. edit any value below to change what \`lmctl plan\`/\`lmctl quickrun\` resolve to.
@@ -2035,17 +2034,17 @@ ${e("Provider1",t.provider1)}
2035
2034
  ${e("Provider2",t.provider2)}
2036
2035
 
2037
2036
  ${e("Provider3",t.provider3)}
2038
- `}function Ci(t){try{return Fl(bn(process.env,t)).config}catch(e){if(e instanceof vt&&e.kind==="missing")return null;throw e}}function kx(t,e){return yx(t,e)}function Ax(t,e,n={}){let r={...ix(e)},s=n.properties??Object.fromEntries([1,2,3].map(o=>{let i=e["provider"+o];return["Provider"+o,{Provider:i.provider,Model1:i.model1}]}));return sx(t,o=>{if(o.kind==="variable")return Object.hasOwn(r,o.name)?r[o.name]:void 0;if(o.kind==="argument")return n.argv?.[o.index];let i=o.key.split(".");/^Provider[123]$/.test(i[0])&&i.length===2&&["provider","model1"].includes(i[1])&&(i[1]=i[1][0].toUpperCase()+i[1].slice(1));let a=s;for(let d of i){if(!a||typeof a!="object"||!Object.hasOwn(a,d))throw Error("Property '"+o.key+"' is not defined in "+(n.path??"~/.lmctl/init.toml")+"; define it there or run lmctl init");a=a[d]}let l=new Set,c=(d,u)=>{if(d instanceof Date)return d.toISOString();if(d===null||typeof d=="string"||typeof d=="boolean"||typeof d=="number"&&Number.isFinite(d))return d;if(d&&typeof d=="object"&&(Array.isArray(d)||[Object.prototype,null].includes(Object.getPrototypeOf(d)))){if(l.has(d))throw Error("Property '"+u+"' contains a cycle in "+(n.path??"~/.lmctl/init.toml"));l.add(d);try{if(Array.isArray(d))return d.map((m,p)=>c(m,u+"."+p));let f=Object.create(null);for(let[m,p]of Object.entries(d))f[m]=c(p,u+"."+m);return f}finally{l.delete(d)}}throw Error("Property '"+u+"' has an unsupported value type: "+typeof d+" in "+(n.path??"~/.lmctl/init.toml"))};return c(a,o.key)})}var Li,Eo=C(()=>{"use strict";ox();ax();hf();hf();wx();Ni();_n();jl();Li=["claude","codex","agy","kimi"]});import{homedir as AV}from"node:os";function Nx(t,e){let n=new Set;return{text:t.replace(xV,(s,o)=>{let i=o.trim(),a=NV[i];return a===void 0?(n.add(i),s):a(e)}),unknownNames:[...n].sort()}}function xx(t){return{workdir:t.workdir,teamfile:t.teamfile,date:RV(t.date)}}function RV(t){return t.toISOString().slice(0,10)}var NV,xV,Rx=C(()=>{"use strict";Tt();NV={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>Ka(t.teamfile),home:()=>AV(),date:t=>t.date},xV=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Oy={};ye(Oy,{_setAgyModelsRunnerForTests:()=>PV,_setCatalogSnapshotForTests:()=>$V,_setCodexModelsRunnerForTests:()=>UV,_setLintOpenCodeConfigProbeForTests:()=>WV,_setLintSessiondirFsOpsForTests:()=>jV,_setTeamfileSeedForTests:()=>FV,buildRootTeamRegistrationRow:()=>Hx,lintTeamfileStructured:()=>YV,registerRootTeam:()=>yf,runLint:()=>As,runSeed:()=>Bl,seedTeamfile:()=>Di,sha256Text:()=>Wx,validateMemberSpec:()=>ln});import{createHash as LV}from"node:crypto";import{accessSync as CV,constants as Lx,existsSync as OV,readFileSync as Ay,realpathSync as Ny,statSync as DV,writeFileSync as Cx}from"node:fs";import{dirname as vo,resolve as Dx}from"node:path";function $V(t){Hl=t??void 0}function Ux(t){return GN(t,Hl!==void 0?{snapshot:Hl}:{})}function Fx(t){return JN(t,Hl!==void 0?{snapshot:Hl}:{})}function PV(t){Ly=t??void 0}function UV(t){Cy=t??void 0}function FV(t){$x=t===null,Mx=t??(async e=>{let{seed:n}=await Promise.resolve().then(()=>(Cr(),Fg)),r=await n(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings,usage:ir(r)}:{error:r.error??"provider seed failed",errorCode:r.errorCode,usage:ir(r),sessionId:r.sessionId}})}function jV(t){To=t===null?xy:{...xy,...t}}function WV(t){Px=t??ul}async function HV(t,e,n){let r=t.filter(o=>o.teamfile===void 0&&o.provider.trim().toLowerCase()==="opencode"&&o.model!==void 0&&o.model.length>0);return(await Promise.all(r.map(async o=>({member:o,result:await Px({cwd:o.sessiondir??e,model:o.model,...o.effort!==void 0?{effort:o.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:o,result:i})=>i.status==="rejected"?[`[${o.alias}] ${i.option}="${i.value}" rejected by opencode: ${i.error}`]:[])}function BV(t,e){let n=vo(e),r=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??n,a=Dx(i);if(r.has(a))continue;let l=XV(a);l!==void 0&&(r.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function XV(t){try{if(To.existsSync(t)){if(!To.statSync(t).isDirectory())return"ENOTDIR";To.accessSync(t,Lx.W_OK);return}let e=GV(t);if(e===void 0)return;if(!To.statSync(e).isDirectory())return"ENOTDIR";To.accessSync(e,Lx.W_OK);return}catch(e){return JV(e)??"permission check failed"}}function qV(t){let e=Dx(t);try{return Ny(e)}catch{return e}}function GV(t){let e=t;for(;;){try{if(To.existsSync(e))return e}catch{return}let n=vo(e);if(n===e)return;e=n}}function JV(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function jx(t,e){let n;try{n=await G(e,l=>Qe(t,l))}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let r;try{r=Fe(n)}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let s=za(r,vo(n));e.stderr.write(`notice: checking teamfile and models ...
2039
- `);let o=cy(r.members,{agyModelsRunner:Ly,codexModelsRunner:Cy});o.push(...await Ux(r.members)),s.push(...await Fx(r.members));let i=Ay(n,"utf8"),a=Nx(i,xx({workdir:vo(n),teamfile:n,date:new Date})).unknownNames;a.length>0&&o.push(`unknown template placeholder${a.length===1?"":"s"}: ${a.map(l=>`{{${l}}}`).join(", ")}`),o.push(...c_(r.members,vo(n))),o.push(...BV(r.members,n)),o.push(...await HV(r.members,vo(n),e.env));for(let l of s)e.stderr.write(`error: ${l.field}: ${l.message}
2040
- `);for(let l of r.members)Ry([l],e),l.session!==void 0&&l.session.length<Oi&&o.push(`${l.alias}: sessionid is shorter than ${Oi} chars; run lmctl seed to refresh it`);return{ok:!0,result:{config:r,absTeamfile:n,errors:s,warnings:o}}}async function As(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(MV),0;let n=ce(t,[],[]);if(n.error!==void 0)return e.stderr.write(`error: ${n.error}
2037
+ `}function Ci(t){try{return Fl(bn(process.env,t)).config}catch(e){if(e instanceof vt&&e.kind==="missing")return null;throw e}}function kx(t,e){return yx(t,e)}function Ax(t,e,n={}){let r={...ix(e)},s=n.properties??Object.fromEntries([1,2,3].map(o=>{let i=e["provider"+o];return["Provider"+o,{Provider:i.provider,Model1:i.model1}]}));return sx(t,o=>{if(o.kind==="variable")return Object.hasOwn(r,o.name)?r[o.name]:void 0;if(o.kind==="argument")return n.argv?.[o.index];let i=o.key.split(".");/^Provider[123]$/.test(i[0])&&i.length===2&&["provider","model1"].includes(i[1])&&(i[1]=i[1][0].toUpperCase()+i[1].slice(1));let a=s;for(let d of i){if(!a||typeof a!="object"||!Object.hasOwn(a,d))throw Error("Property '"+o.key+"' is not defined in "+(n.path??"~/.lmctl/init.toml")+"; define it there or run lmctl init");a=a[d]}let l=new Set,c=(d,u)=>{if(d instanceof Date)return d.toISOString();if(d===null||typeof d=="string"||typeof d=="boolean"||typeof d=="number"&&Number.isFinite(d))return d;if(d&&typeof d=="object"&&(Array.isArray(d)||[Object.prototype,null].includes(Object.getPrototypeOf(d)))){if(l.has(d))throw Error("Property '"+u+"' contains a cycle in "+(n.path??"~/.lmctl/init.toml"));l.add(d);try{if(Array.isArray(d))return d.map((m,p)=>c(m,u+"."+p));let f=Object.create(null);for(let[m,p]of Object.entries(d))f[m]=c(p,u+"."+m);return f}finally{l.delete(d)}}throw Error("Property '"+u+"' has an unsupported value type: "+typeof d+" in "+(n.path??"~/.lmctl/init.toml"))};return c(a,o.key)})}var Li,Eo=C(()=>{"use strict";ox();ax();hf();hf();wx();Ni();_n();jl();Li=["claude","codex","agy","kimi"]});import{homedir as kV}from"node:os";function Nx(t,e){let n=new Set;return{text:t.replace(NV,(s,o)=>{let i=o.trim(),a=AV[i];return a===void 0?(n.add(i),s):a(e)}),unknownNames:[...n].sort()}}function xx(t){return{workdir:t.workdir,teamfile:t.teamfile,date:xV(t.date)}}function xV(t){return t.toISOString().slice(0,10)}var AV,NV,Rx=C(()=>{"use strict";Tt();AV={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>Ka(t.teamfile),home:()=>kV(),date:t=>t.date},NV=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Oy={};ye(Oy,{_setAgyModelsRunnerForTests:()=>$V,_setCatalogSnapshotForTests:()=>MV,_setCodexModelsRunnerForTests:()=>PV,_setLintOpenCodeConfigProbeForTests:()=>jV,_setLintSessiondirFsOpsForTests:()=>FV,_setTeamfileSeedForTests:()=>UV,buildRootTeamRegistrationRow:()=>Hx,lintTeamfileStructured:()=>zV,registerRootTeam:()=>yf,runLint:()=>As,runSeed:()=>Bl,seedTeamfile:()=>Di,sha256Text:()=>Wx,validateMemberSpec:()=>ln});import{createHash as RV}from"node:crypto";import{accessSync as LV,constants as Lx,existsSync as CV,readFileSync as Ay,realpathSync as Ny,statSync as OV,writeFileSync as Cx}from"node:fs";import{dirname as vo,resolve as Dx}from"node:path";function MV(t){Hl=t??void 0}function Ux(t){return GN(t,Hl!==void 0?{snapshot:Hl}:{})}function Fx(t){return JN(t,Hl!==void 0?{snapshot:Hl}:{})}function $V(t){Ly=t??void 0}function PV(t){Cy=t??void 0}function UV(t){$x=t===null,Mx=t??(async e=>{let{seed:n}=await Promise.resolve().then(()=>(Cr(),Fg)),r=await n(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings,usage:ir(r)}:{error:r.error??"provider seed failed",errorCode:r.errorCode,usage:ir(r),sessionId:r.sessionId}})}function FV(t){To=t===null?xy:{...xy,...t}}function jV(t){Px=t??ul}async function WV(t,e,n){let r=t.filter(o=>o.teamfile===void 0&&o.provider.trim().toLowerCase()==="opencode"&&o.model!==void 0&&o.model.length>0);return(await Promise.all(r.map(async o=>({member:o,result:await Px({cwd:o.sessiondir??e,model:o.model,...o.effort!==void 0?{effort:o.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:o,result:i})=>i.status==="rejected"?[`[${o.alias}] ${i.option}="${i.value}" rejected by opencode: ${i.error}`]:[])}function HV(t,e){let n=vo(e),r=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??n,a=Dx(i);if(r.has(a))continue;let l=BV(a);l!==void 0&&(r.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function BV(t){try{if(To.existsSync(t)){if(!To.statSync(t).isDirectory())return"ENOTDIR";To.accessSync(t,Lx.W_OK);return}let e=qV(t);if(e===void 0)return;if(!To.statSync(e).isDirectory())return"ENOTDIR";To.accessSync(e,Lx.W_OK);return}catch(e){return GV(e)??"permission check failed"}}function XV(t){let e=Dx(t);try{return Ny(e)}catch{return e}}function qV(t){let e=t;for(;;){try{if(To.existsSync(e))return e}catch{return}let n=vo(e);if(n===e)return;e=n}}function GV(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function jx(t,e){let n;try{n=await G(e,l=>Qe(t,l))}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let r;try{r=Fe(n)}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let s=za(r,vo(n));e.stderr.write(`notice: checking teamfile and models ...
2038
+ `);let o=cy(r.members,{agyModelsRunner:Ly,codexModelsRunner:Cy});o.push(...await Ux(r.members)),s.push(...await Fx(r.members));let i=Ay(n,"utf8"),a=Nx(i,xx({workdir:vo(n),teamfile:n,date:new Date})).unknownNames;a.length>0&&o.push(`unknown template placeholder${a.length===1?"":"s"}: ${a.map(l=>`{{${l}}}`).join(", ")}`),o.push(...c_(r.members,vo(n))),o.push(...HV(r.members,n)),o.push(...await WV(r.members,vo(n),e.env));for(let l of s)e.stderr.write(`error: ${l.field}: ${l.message}
2039
+ `);for(let l of r.members)Ry([l],e),l.session!==void 0&&l.session.length<Oi&&o.push(`${l.alias}: sessionid is shorter than ${Oi} chars; run lmctl seed to refresh it`);return{ok:!0,result:{config:r,absTeamfile:n,errors:s,warnings:o}}}async function As(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(DV),0;let n=ce(t,[],[]);if(n.error!==void 0)return e.stderr.write(`error: ${n.error}
2041
2040
  `),2;if(n.positionals.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2042
2041
  `),2;let r=n.positionals[0],s=await jx(r,e);if(!s.ok)return lr(e,s.message);let{errors:o,warnings:i}=s.result;for(let a of i)e.stderr.write(`warning: ${a}
2043
2042
  `);return e.stderr.write(`notice: ${o.length} error${o.length===1?"":"s"}, ${i.length} warning${i.length===1?"":"s"}
2044
2043
  `),o.length>0?1:(e.stdout.write(`ok
2045
- `),0)}function zV(t,e){let n=VV.exec(t);if(n){let s=e.get(n[1].toLowerCase());if(s!==void 0)return{alias:s,message:n[2]}}let r=KV.exec(t);if(r){let s=e.get(r[1].toLowerCase());if(s!==void 0)return{alias:s,message:r[2]}}return{alias:"",message:t}}async function YV(t,e){let n=await jx(t,e);if(!n.ok)return{status:"error",errors:[{alias:"",message:n.message}],warnings:[],counts:{errors:1,warnings:0}};let{config:r,errors:s,warnings:o}=n.result,i=new Map(r.members.map(c=>[c.alias.toLowerCase(),c.alias])),a=s.map(c=>({alias:i.get(c.field.toLowerCase())??"",message:c.message})),l=o.map(c=>zV(c,i));for(let c of l)e.stderr.write(`warning: ${c.alias?`${c.alias}: `:""}${c.message}
2044
+ `),0)}function KV(t,e){let n=JV.exec(t);if(n){let s=e.get(n[1].toLowerCase());if(s!==void 0)return{alias:s,message:n[2]}}let r=VV.exec(t);if(r){let s=e.get(r[1].toLowerCase());if(s!==void 0)return{alias:s,message:r[2]}}return{alias:"",message:t}}async function zV(t,e){let n=await jx(t,e);if(!n.ok)return{status:"error",errors:[{alias:"",message:n.message}],warnings:[],counts:{errors:1,warnings:0}};let{config:r,errors:s,warnings:o}=n.result,i=new Map(r.members.map(c=>[c.alias.toLowerCase(),c.alias])),a=s.map(c=>({alias:i.get(c.field.toLowerCase())??"",message:c.message})),l=o.map(c=>KV(c,i));for(let c of l)e.stderr.write(`warning: ${c.alias?`${c.alias}: `:""}${c.message}
2046
2045
  `);return e.stderr.write(`notice: ${a.length} error${a.length===1?"":"s"}, ${l.length} warning${l.length===1?"":"s"}
2047
- `),{status:a.length>0?"error":"ok",errors:a,warnings:l,counts:{errors:a.length,warnings:l.length}}}async function Bl(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Iy),0;let n=ce(t,[],[]);return n.error!==void 0?Ox(e,n.error,Iy):n.positionals.length!==1?Ox(e,"expected <teamfile.lmctl>",Iy):Di(n.positionals[0],e)}function QV(t,e,n,r){if(e.preamble===void 0)return t.toLowerCase()!=="lead"?void 0:Qd({teamfile:n,teamfileContent:r});if(typeof e.preamble=="string")return e.preamble;for(let[s,o]of Object.entries(e.preamble))if(s.toLowerCase()===t.toLowerCase())return o}async function Di(t,e,n={}){let r;try{r=await G(e,y=>Qe(t,y))}catch(y){return lr(e,`${t}: ${y instanceof Error?y.message:String(y)}`)}let s;try{s=Ny(r)}catch(y){return lr(e,`${t}: ${y instanceof Error?y.message:String(y)}`)}let o=vo(r),i;try{i=Fe(r)}catch(y){return lr(e,`${t}: ${y instanceof Error?y.message:String(y)}`)}let a=Ay(r,"utf8"),l=a.split(`
2048
- `),c=a,d=ZV(l),u=za(i,o);if(u.length>0){Ry(i.members,e);for(let y of u)e.stderr.write(`error: ${y.field}: ${y.message}
2046
+ `),{status:a.length>0?"error":"ok",errors:a,warnings:l,counts:{errors:a.length,warnings:l.length}}}async function Bl(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Iy),0;let n=ce(t,[],[]);return n.error!==void 0?Ox(e,n.error,Iy):n.positionals.length!==1?Ox(e,"expected <teamfile.lmctl>",Iy):Di(n.positionals[0],e)}function YV(t,e,n,r){if(e.preamble===void 0)return t.toLowerCase()!=="lead"?void 0:Qd({teamfile:n,teamfileContent:r});if(typeof e.preamble=="string")return e.preamble;for(let[s,o]of Object.entries(e.preamble))if(s.toLowerCase()===t.toLowerCase())return o}async function Di(t,e,n={}){let r;try{r=await G(e,y=>Qe(t,y))}catch(y){return lr(e,`${t}: ${y instanceof Error?y.message:String(y)}`)}let s;try{s=Ny(r)}catch(y){return lr(e,`${t}: ${y instanceof Error?y.message:String(y)}`)}let o=vo(r),i;try{i=Fe(r)}catch(y){return lr(e,`${t}: ${y instanceof Error?y.message:String(y)}`)}let a=Ay(r,"utf8"),l=a.split(`
2047
+ `),c=a,d=QV(l),u=za(i,o);if(u.length>0){Ry(i.members,e);for(let y of u)e.stderr.write(`error: ${y.field}: ${y.message}
2049
2048
  `);return 1}try{di(e,i,r)}catch{}Ry(i.members,e),e.stderr.write(`notice: checking teamfile and models ...
2050
2049
  `);for(let y of cy(i.members,{agyModelsRunner:Ly,codexModelsRunner:Cy}))e.stderr.write(`warning: ${y}
2051
2050
  `);for(let y of await Ux(i.members))e.stderr.write(`warning: ${y}
@@ -2058,22 +2057,22 @@ ${e("Provider3",t.provider3)}
2058
2057
  `);let T=Wa(e,I=>`${y.alias}: still launching (${I}s elapsed)
2059
2058
  `),v=m?l.map((I,N)=>N===d.get(y.alias.toLowerCase())?I.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,""):I).join(`
2060
2059
  `):l.join(`
2061
- `),b=QV(y.alias,n,r,v),k;try{k=kI(r,y.alias)}catch(I){return T.stop(),lr(e,I instanceof Error?I.message:String(I))}try{let I,N;try{I=await Mx({env:e.env,signal:n.signal,onDispatch:()=>{N??=df(e,{provider:y.provider,cwd:E,modelRequested:y.model??null,sessionId:""},"operator",{teamfile:r,alias:y.alias})},provider:y.provider,cwd:E,...y.model!==void 0?{model:y.model}:{},...y.effort!==void 0?{effort:y.effort}:{},...b!==void 0?{prompt:b}:{}}),await N?.finish({status:n.signal?.aborted?"cancelled":I.error!==void 0||!I.sessionId||I.sessionId.length<Oi?Jo(I.error??"",I.errorCode==="ABORT_ERR"):"ok",sessionId:I.sessionId,usage:ir(I)})}catch(L){throw await N?.finish(uf(L,{aborted:n.signal?.aborted||L?.code==="ABORT_ERR"})),L}finally{T.stop()}if(n.signal?.aborted)return lr(e,"Seed cancelled during dispatch.");for(let L of I.warnings??[])e.stderr.write(`warning: ${y.alias}: ${L}
2060
+ `),b=YV(y.alias,n,r,v),k;try{k=kI(r,y.alias)}catch(I){return T.stop(),lr(e,I instanceof Error?I.message:String(I))}try{let I,N;try{I=await Mx({env:e.env,signal:n.signal,onDispatch:()=>{N??=df(e,{provider:y.provider,cwd:E,modelRequested:y.model??null,sessionId:""},"operator",{teamfile:r,alias:y.alias})},provider:y.provider,cwd:E,...y.model!==void 0?{model:y.model}:{},...y.effort!==void 0?{effort:y.effort}:{},...b!==void 0?{prompt:b}:{}}),await N?.finish({status:n.signal?.aborted?"cancelled":I.error!==void 0||!I.sessionId||I.sessionId.length<Oi?Jo(I.error??"",I.errorCode==="ABORT_ERR"):"ok",sessionId:I.sessionId,usage:ir(I)})}catch(L){throw await N?.finish(uf(L,{aborted:n.signal?.aborted||L?.code==="ABORT_ERR"})),L}finally{T.stop()}if(n.signal?.aborted)return lr(e,"Seed cancelled during dispatch.");for(let L of I.warnings??[])e.stderr.write(`warning: ${y.alias}: ${L}
2062
2061
  `);if(I.error!==void 0||I.sessionId===void 0||I.sessionId.length<Oi){let L=`provider did not report a sessionid; no new session was found for ${E} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${y.alias}: seed failed${I.error!==void 0?`: ${I.error}`:`; ${L}`}
2063
2062
  `),1}let A=d.get(y.alias.toLowerCase());if(A===void 0)return e.stderr.write(`error: ${y.alias}: could not find matching _MEMBER_ line to update
2064
- `),1;let S=qV(E),x=ky(l[A],"sessionid",I.sessionId);x=ky(x,"sessiondir",S);let R=y.model;if(y.model===void 0){let L;try{L=(await _t(I.sessionId,y.provider))?.model}catch{L=void 0}L!==void 0&&L.length>0&&(x=ky(x,"model",L),R=L)}if((m||n.guardFile)&&Ay(r,"utf8")!==c)return lr(e,`Teamfile changed during seeding; new session ${I.sessionId} was not attached. Existing bindings preserved.`);l[A]=x,p+=1,c=l.join(`
2063
+ `),1;let S=XV(E),x=ky(l[A],"sessionid",I.sessionId);x=ky(x,"sessiondir",S);let R=y.model;if(y.model===void 0){let L;try{L=(await _t(I.sessionId,y.provider))?.model}catch{L=void 0}L!==void 0&&L.length>0&&(x=ky(x,"model",L),R=L)}if((m||n.guardFile)&&Ay(r,"utf8")!==c)return lr(e,`Teamfile changed during seeding; new session ${I.sessionId} was not attached. Existing bindings preserved.`);l[A]=x,p+=1,c=l.join(`
2065
2064
  `),Cx(r,c,"utf8"),n.onSeeded?.({alias:y.alias,provider:y.provider,sessionid:I.sessionId,sessiondir:S,...R!==void 0?{model:R}:{}}),e.stdout.write(`${y.alias}: seeded ${I.sessionId} provider=${y.provider} sessiondir=${S} model=${R?JSON.stringify(R):"default (not reported)"}
2066
2065
  `)}finally{k()}}let h=l.join(`
2067
- `),g=rK(h,Ny(r));g!==h&&Cx(r,g,"utf8"),p===0&&e.stdout.write(`no members needed seeding
2068
- `);let w=new Date().toISOString();try{await G(e,y=>{yf(y,{teamfilePath:s,name:i.name,rawText:g,now:w})})}catch(y){return lr(e,y instanceof Error?y.message:String(y))}return 0}function Wx(t){return LV("sha256").update(t).digest("hex")}function Hx(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:Wx(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function yf(t,e){let n=Pd(e.rawText,e.teamfilePath);Ya(t,e.teamfilePath,n);let r=Hx(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function ZV(t){let e=new Map;for(let n=0;n<t.length;n+=1){let r=t[n];if(!/^\s*_(?:MEMBER|AGENT)_\s+\S/.test(r))continue;let s=tK(r,"alias");s!==void 0&&e.set(s.toLowerCase(),n)}return e}function eK(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function tK(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function ky(t,e,n){let r=`${e}=${nK(n)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${r}`):`${t.trimEnd()} ${r}`}function nK(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function rK(t,e){let n=`#teamfile: ${e}`,r=t.indexOf(`
2066
+ `),g=nK(h,Ny(r));g!==h&&Cx(r,g,"utf8"),p===0&&e.stdout.write(`no members needed seeding
2067
+ `);let w=new Date().toISOString();try{await G(e,y=>{yf(y,{teamfilePath:s,name:i.name,rawText:g,now:w})})}catch(y){return lr(e,y instanceof Error?y.message:String(y))}return 0}function Wx(t){return RV("sha256").update(t).digest("hex")}function Hx(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:Wx(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function yf(t,e){let n=Pd(e.rawText,e.teamfilePath);Ya(t,e.teamfilePath,n);let r=Hx(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function QV(t){let e=new Map;for(let n=0;n<t.length;n+=1){let r=t[n];if(!/^\s*_(?:MEMBER|AGENT)_\s+\S/.test(r))continue;let s=eK(r,"alias");s!==void 0&&e.set(s.toLowerCase(),n)}return e}function ZV(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function eK(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function ky(t,e,n){let r=`${e}=${tK(n)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${r}`):`${t.trimEnd()} ${r}`}function tK(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function nK(t,e){let n=`#teamfile: ${e}`,r=t.indexOf(`
2069
2068
  `),s=r>=0?t.slice(0,r):t,o=r>=0?t.slice(r+1):"";return s===n?t:s.startsWith("#teamfile:")?o.length>0?`${n}
2070
2069
  ${o}`:`${n}
2071
2070
  `:t.length>0?`${n}
2072
2071
  ${t}`:`${n}
2073
- `}function ln(t){if(!eK(t.alias))return`invalid alias "${t.alias}"`;if(!no(t.provider))return`invalid provider "${t.provider}"`}function lr(t,e){return t.stderr.write(`error: ${e}
2072
+ `}function ln(t){if(!ZV(t.alias))return`invalid alias "${t.alias}"`;if(!no(t.provider))return`invalid provider "${t.provider}"`}function lr(t,e){return t.stderr.write(`error: ${e}
2074
2073
  `),1}function Ox(t,e,n){return t.stderr.write(`error: ${e}
2075
2074
  ${n}`),2}function Ry(t,e){for(let n of t)n.teamfile!==void 0&&e.stderr.write(`warning: member "${n.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
2076
- `)}var Oi,MV,Iy,xy,Mx,$x,To,Px,Ly,Cy,Hl,VV,KV,$r=C(()=>{"use strict";Da();py();jl();Tt();Ni();d_();E_();Va();Fn();he();Qn();Rx();Hd();kh();ht();Oi=5,MV=`usage: lmctl lint <teamfile.lmctl>
2075
+ `)}var Oi,DV,Iy,xy,Mx,$x,To,Px,Ly,Cy,Hl,JV,VV,$r=C(()=>{"use strict";Da();py();jl();Tt();Ni();d_();E_();Va();Fn();he();Qn();Rx();Hd();kh();ht();Oi=5,DV=`usage: lmctl lint <teamfile.lmctl>
2077
2076
 
2078
2077
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2079
2078
  For opencode members with model=, lint also asks the local ACP provider to
@@ -2133,7 +2132,7 @@ possibly work, seed reports it as an error and seeds nothing.
2133
2132
  and save it to <file> (lmctl.com curates these, not lmctl itself).
2134
2133
  Refuses to overwrite an existing <file> unless --force is given.
2135
2134
  --script <name> With --save-script, fetch commands/<name>.lms instead of the default
2136
- `,xy={existsSync:OV,statSync:DV,accessSync:CV},Mx=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Cr(),Fg)),n=await e(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings,usage:ir(n)}:{error:n.error??"provider seed failed",errorCode:n.errorCode,usage:ir(n),sessionId:n.sessionId}},$x=!0,To=xy,Px=ul;VV=/^\[([^\]]+)\]\s+(.*)$/s,KV=/^([^:\s][^:]*):\s+(.*)$/s});function Xx(t){return My[t.trim().toLowerCase()]}function qx(t){let e=t.split(":");if(e.length<2)return{error:`invalid member spec "${t}" \u2014 expected Alias:provider[:model]`};let[n,r]=e,s=e.length>2?e.slice(2).join(":"):void 0;if(n===""||r==="")return{error:`invalid member spec "${t}" \u2014 expected Alias:provider[:model]`};let o=ln({alias:n,provider:r});return o!==void 0?{error:o}:s!==void 0&&s===""?{error:`invalid member spec "${t}" \u2014 empty model`}:{spec:{alias:n,provider:r,...s!==void 0?{model:s}:{}}}}function Bx(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function sK(t){return[`_MEMBER_ provider=${t.provider} alias=${Bx(t.alias)}`,...t.model!==void 0?[`model=${Bx(t.model)}`]:[]].join(" ")}function Ns(t){let{teamName:e,members:n}=t,r=n.map(sK).join(`
2135
+ `,xy={existsSync:CV,statSync:OV,accessSync:LV},Mx=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Cr(),Fg)),n=await e(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings,usage:ir(n)}:{error:n.error??"provider seed failed",errorCode:n.errorCode,usage:ir(n),sessionId:n.sessionId}},$x=!0,To=xy,Px=ul;JV=/^\[([^\]]+)\]\s+(.*)$/s,VV=/^([^:\s][^:]*):\s+(.*)$/s});function Xx(t){return My[t.trim().toLowerCase()]}function qx(t){let e=t.split(":");if(e.length<2)return{error:`invalid member spec "${t}" \u2014 expected Alias:provider[:model]`};let[n,r]=e,s=e.length>2?e.slice(2).join(":"):void 0;if(n===""||r==="")return{error:`invalid member spec "${t}" \u2014 expected Alias:provider[:model]`};let o=ln({alias:n,provider:r});return o!==void 0?{error:o}:s!==void 0&&s===""?{error:`invalid member spec "${t}" \u2014 empty model`}:{spec:{alias:n,provider:r,...s!==void 0?{model:s}:{}}}}function Bx(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function rK(t){return[`_MEMBER_ provider=${t.provider} alias=${Bx(t.alias)}`,...t.model!==void 0?[`model=${Bx(t.model)}`]:[]].join(" ")}function Ns(t){let{teamName:e,members:n}=t,r=n.map(rK).join(`
2137
2136
  `);return`# ${e}
2138
2137
  #
2139
2138
  # This is a starting point, not a finished teamfile -- edit alias/provider/model
@@ -2145,10 +2144,10 @@ ${r}
2145
2144
  `}function Jx(t){return t.split(`
2146
2145
  `).map(e=>Gx.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_(?:MEMBER|AGENT)_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 ").replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_(?:MEMBER|AGENT)_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
2147
2146
  `)}function Dy(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function Ef(t){let e=[];for(let n of t.split(`
2148
- `)){if(!Gx.test(n))continue;let r=Dy(n,"alias"),s=Dy(n,"provider");if(r===void 0||s===void 0)continue;let o=Dy(n,"model");e.push({alias:r,provider:s,...o!==void 0&&o!==""?{model:o}:{}})}return e}var My,wf,Gx,Tf=C(()=>{"use strict";$r();My={1:["Lead"],lead:["Lead"],2:["Lead","Reviewer"],"lead-reviewer":["Lead","Reviewer"],3:["Lead","Coder","Reviewer"],"lead-coder-reviewer":["Lead","Coder","Reviewer"]},wf="1|2|3|lead|lead-reviewer|lead-coder-reviewer";Gx=/^\s*_(?:MEMBER|AGENT)_\s+\S/});var Wy={};ye(Wy,{PROVIDER_NAMES:()=>Ui,adoptSession:()=>jy,chooseMember:()=>Gl,chooseTeamfile:()=>Uy,completeTeamfile:()=>Vx,createPromptTeam:()=>Fy,field:()=>Mi,prepareTeam:()=>ql,setField:()=>xs});import{existsSync as Xl,mkdirSync as $y,readFileSync as vf,readdirSync as oK,statSync as iK,writeFileSync as Py}from"node:fs";import{basename as $i,dirname as Sf,extname as bf,resolve as Pi}from"node:path";function Mi(t,e){return new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t)?.slice(1).find(n=>n!==void 0)}function xs(t,e,n){if(/["\r\n]/.test(n))throw new Error(`${e} cannot contain quotes or newlines in a teamfile.`);let r=`${e}=${/\s/.test(n)?`"${n}"`:n}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${r}`):`${t.trimEnd()} ${r}`}async function aK(t,e){let n=Ci(),r=[...new Set(n?Object.values(n).map(s=>s.provider):[])];for(e.stderr.write(`Providers from lmctl init: ${r.join(", ")||"(none saved)"}; another supported provider may be typed.
2147
+ `)){if(!Gx.test(n))continue;let r=Dy(n,"alias"),s=Dy(n,"provider");if(r===void 0||s===void 0)continue;let o=Dy(n,"model");e.push({alias:r,provider:s,...o!==void 0&&o!==""?{model:o}:{}})}return e}var My,wf,Gx,Tf=C(()=>{"use strict";$r();My={1:["Lead"],lead:["Lead"],2:["Lead","Reviewer"],"lead-reviewer":["Lead","Reviewer"],3:["Lead","Coder","Reviewer"],"lead-coder-reviewer":["Lead","Coder","Reviewer"]},wf="1|2|3|lead|lead-reviewer|lead-coder-reviewer";Gx=/^\s*_(?:MEMBER|AGENT)_\s+\S/});var Wy={};ye(Wy,{PROVIDER_NAMES:()=>Ui,adoptSession:()=>jy,chooseMember:()=>Gl,chooseTeamfile:()=>Uy,completeTeamfile:()=>Vx,createPromptTeam:()=>Fy,field:()=>Mi,prepareTeam:()=>ql,setField:()=>xs});import{existsSync as Xl,mkdirSync as $y,readFileSync as vf,readdirSync as sK,statSync as oK,writeFileSync as Py}from"node:fs";import{basename as $i,dirname as Sf,extname as bf,resolve as Pi}from"node:path";function Mi(t,e){return new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t)?.slice(1).find(n=>n!==void 0)}function xs(t,e,n){if(/["\r\n]/.test(n))throw new Error(`${e} cannot contain quotes or newlines in a teamfile.`);let r=`${e}=${/\s/.test(n)?`"${n}"`:n}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${r}`):`${t.trimEnd()} ${r}`}async function iK(t,e){let n=Ci(),r=[...new Set(n?Object.values(n).map(s=>s.provider):[])];for(e.stderr.write(`Providers from lmctl init: ${r.join(", ")||"(none saved)"}; another supported provider may be typed.
2149
2148
  `);;){let s=await t.ask("Provider: ");if(Ui.includes(s))return s;e.stderr.write(`Known providers: ${Ui.join(", ")}
2150
2149
  `)}}async function Vx(t,e,n,r={},s){let o=Xl(t),i=o?vf(t,"utf8"):"",a=i.split(`
2151
- `),l=a.map((m,p)=>/^\s*_(?:MEMBER|AGENT)_(?:\s|$)/.test(m)?p:-1).filter(m=>m>=0);if(!l.length){let m=s?[s]:(await e.ask("Member aliases [Lead] (comma separated): ")||"Lead").split(",").map(p=>p.trim());for(let p of m)l.push(a.length),a.push(xs("_MEMBER_","alias",p))}let c=new Set;for(let m of l){let p=a[m],_=Mi(p,"alias");if(_||(_=await e.ask(`Alias for member on line ${m+1}: `)),!/^[A-Za-z][A-Za-z0-9_-]*$/.test(_)||c.has(_.toLowerCase()))throw new Error(`Invalid or duplicate alias: ${_}`);if(c.add(_.toLowerCase()),p=xs(p,"alias",_),!Mi(p,"teamfile")){let h=Mi(p,"provider");h||(h=await aK(e,n));let g=ln({alias:_,provider:h});if(g)throw new Error(g);if(p=xs(p,"provider",h),!Mi(p,"model")&&!Mi(p,"sessionid")){let w=await(r.models??or)(h).catch(()=>[]);w.length&&n.stderr.write(`Models for ${h}:
2150
+ `),l=a.map((m,p)=>/^\s*_(?:MEMBER|AGENT)_(?:\s|$)/.test(m)?p:-1).filter(m=>m>=0);if(!l.length){let m=s?[s]:(await e.ask("Member aliases [Lead] (comma separated): ")||"Lead").split(",").map(p=>p.trim());for(let p of m)l.push(a.length),a.push(xs("_MEMBER_","alias",p))}let c=new Set;for(let m of l){let p=a[m],_=Mi(p,"alias");if(_||(_=await e.ask(`Alias for member on line ${m+1}: `)),!/^[A-Za-z][A-Za-z0-9_-]*$/.test(_)||c.has(_.toLowerCase()))throw new Error(`Invalid or duplicate alias: ${_}`);if(c.add(_.toLowerCase()),p=xs(p,"alias",_),!Mi(p,"teamfile")){let h=Mi(p,"provider");h||(h=await iK(e,n));let g=ln({alias:_,provider:h});if(g)throw new Error(g);if(p=xs(p,"provider",h),!Mi(p,"model")&&!Mi(p,"sessionid")){let w=await(r.models??or)(h).catch(()=>[]);w.length&&n.stderr.write(`Models for ${h}:
2152
2151
  ${w.map(E=>` ${E}`).join(`
2153
2152
  `)}
2154
2153
  `);let y=await e.ask(`Model for ${_} (blank for provider default): `);y&&(p=xs(p,"model",y))}}a[m]=p}let d=a.join(`
@@ -2156,25 +2155,25 @@ ${w.map(E=>` ${E}`).join(`
2156
2155
  `));if(o||(d=Ns({teamName:$i(t,bf(t)),members:u.members})),d!==i){if(o&&vf(t,"utf8")!==i)throw new Error("Teamfile changed while completing it; nothing was written.");$y(Sf(t),{recursive:!0}),Py(t,d.endsWith(`
2157
2156
  `)?d:`${d}
2158
2157
  `,o?{encoding:"utf8"}:{encoding:"utf8",flag:"wx"}),n.stderr.write(`Wrote ${t}
2159
- `)}}async function ql(t,e,n,r={},s){if(!st(t))throw new Error("Expected a .lmctl or .lmc teamfile.");let o=Xl(t)?await(r.lint??As)([t],n):0,i=Xl(t)?Fe(t):null,a=!i||!i.members.length||i.parseErrors.length>0||i.members.some(d=>!d.teamfile&&!d.model&&!d.session);a&&await Vx(t,e,n,r,s);let l=a?await(r.lint??As)([t],n):o;return l!==0?l:Fe(t).members.some(d=>!d.teamfile&&!d.session)?r.seed?r.seed([t],n):Di(t,n,{guardFile:!0}):0}async function Uy(t,e){let n=oK(e).filter(r=>st(r)&&iK(Pi(e,r)).isFile()).sort().map(r=>Pi(e,r));return n.length===1?n[0]:n.length>1?t.choose("Teamfile:",n):Pi(e,await t.ask("Teamfile path: "))}async function Gl(t,e,n){let r=Fe(t).members.map(s=>s.alias);if(e){let s=r.filter(i=>i.toLowerCase()===e.toLowerCase()),o=s.length?s:r.filter(i=>i.toLowerCase().startsWith(e.toLowerCase()));return o.length?n.choose(`Member matching ${e}:`,o):n.choose(`No member matches ${e}. Choose a member:`,r,!0)}return n.choose("Member:",r)}async function Fy(t,e,n,r){let s=Pi(n,await r.ask(`Teamfile [${t}.lmc]: `)||`${t}.lmc`);if(!st(s))throw new Error("Choose a .lmc or .lmctl teamfile.");if(Xl(s))throw new Error(`Teamfile already exists: ${s}. Use its alias to prompt the existing member.`);let o=await r.ask("Alias [Lead]: ")||"Lead",i=ln({alias:o,provider:t});if(i)throw new Error(i);xs("_MEMBER_","model",e);let a=Ns({teamName:$i(s,bf(s)),members:[{alias:o,provider:t,model:e}]});return $y(Sf(s),{recursive:!0}),Py(s,a,{encoding:"utf8",flag:"wx"}),{file:s,alias:o}}async function jy(t,e,n,r,s,o,i){if(!s.interactive)return o.stdout.write(`Session is not registered. Run interactively to create a teamfile for it.
2158
+ `)}}async function ql(t,e,n,r={},s){if(!st(t))throw new Error("Expected a .lmctl or .lmc teamfile.");let o=Xl(t)?await(r.lint??As)([t],n):0,i=Xl(t)?Fe(t):null,a=!i||!i.members.length||i.parseErrors.length>0||i.members.some(d=>!d.teamfile&&!d.model&&!d.session);a&&await Vx(t,e,n,r,s);let l=a?await(r.lint??As)([t],n):o;return l!==0?l:Fe(t).members.some(d=>!d.teamfile&&!d.session)?r.seed?r.seed([t],n):Di(t,n,{guardFile:!0}):0}async function Uy(t,e){let n=sK(e).filter(r=>st(r)&&oK(Pi(e,r)).isFile()).sort().map(r=>Pi(e,r));return n.length===1?n[0]:n.length>1?t.choose("Teamfile:",n):Pi(e,await t.ask("Teamfile path: "))}async function Gl(t,e,n){let r=Fe(t).members.map(s=>s.alias);if(e){let s=r.filter(i=>i.toLowerCase()===e.toLowerCase()),o=s.length?s:r.filter(i=>i.toLowerCase().startsWith(e.toLowerCase()));return o.length?n.choose(`Member matching ${e}:`,o):n.choose(`No member matches ${e}. Choose a member:`,r,!0)}return n.choose("Member:",r)}async function Fy(t,e,n,r){let s=Pi(n,await r.ask(`Teamfile [${t}.lmc]: `)||`${t}.lmc`);if(!st(s))throw new Error("Choose a .lmc or .lmctl teamfile.");if(Xl(s))throw new Error(`Teamfile already exists: ${s}. Use its alias to prompt the existing member.`);let o=await r.ask("Alias [Lead]: ")||"Lead",i=ln({alias:o,provider:t});if(i)throw new Error(i);xs("_MEMBER_","model",e);let a=Ns({teamName:$i(s,bf(s)),members:[{alias:o,provider:t,model:e}]});return $y(Sf(s),{recursive:!0}),Py(s,a,{encoding:"utf8",flag:"wx"}),{file:s,alias:o}}async function jy(t,e,n,r,s,o,i){if(!s.interactive)return o.stdout.write(`Session is not registered. Run interactively to create a teamfile for it.
2160
2159
  `),null;if(!await s.confirm("Create a teamfile and alias for this existing session?"))return null;let a=await s.ask(`Teamfile [${e}.lmc]: `)||`${e}.lmc`,l=Pi(r,a);if(!st(l))throw new Error("Choose a .lmc or .lmctl teamfile.");let c=Xl(l)?vf(l,"utf8"):void 0,d=await s.ask("Alias [Lead]: ")||"Lead",u=ln({alias:d,provider:e});if(u)throw new Error(u);if(c!==void 0&&!await s.confirm(`Overwrite ${l}?`))return null;let f=Ns({teamName:$i(l,bf(l)),members:[{alias:d,provider:e,...n?{model:n}:{}}]});if(f=f.split(`
2161
2160
  `).map(m=>m.startsWith("_MEMBER_")?xs(m,"sessionid",t):m).join(`
2162
2161
  `),i||(i=Pi(r,await s.ask(`Session directory [${r}]: `)||r)),i&&(f=f.split(`
2163
2162
  `).map(m=>m.startsWith("_MEMBER_")?xs(m,"sessiondir",i):m).join(`
2164
2163
  `)),await G(o,m=>Ya(m,l,ai(f,$i(l)))),c!==void 0&&vf(l,"utf8")!==c)throw new Error("Teamfile changed; adoption cancelled.");return $y(Sf(l),{recursive:!0}),Py(l,f,c===void 0?{encoding:"utf8",flag:"wx"}:{encoding:"utf8"}),await G(o,m=>yf(m,{teamfilePath:Qe(l),name:$i(l,bf(l)),rawText:f,now:new Date().toISOString()})),o.stdout.write(`Registered ${l}:${d} -> ${t}
2165
- `),{file:l,alias:d}}var Ui,If=C(()=>{"use strict";Qn();Tt();Eo();jl();Dl();$r();Tf();he();Ui=Object.keys(Ri)});var Xy={};ye(Xy,{resolvePromptInput:()=>Hy,runChat:()=>By});import{readFileSync as lK,openSync as cK}from"node:fs";import{homedir as dK}from"node:os";import{join as uK}from"node:path";import{spawn as fK}from"node:child_process";function pK(t){let[e,n]=t;if(!e)return t;if(!Ar(e)){let r=e.indexOf(":");if(r>0&&Qa(e.slice(0,r))&&st(e.slice(r+1)))return[`${e.slice(r+1)}:${e.slice(0,r)}`,...t.slice(1)]}return Qa(e)&&n&&st(n)?[n,e,...t.slice(2)]:t}function hK(t){return uK(dK(),".lmctl",`daemonize-${t}.log`)}function _K(t){let e=process.stdout.isTTY===!0,n=process.stderr.isTTY===!0;if(!e&&!n)return{stdio:["ignore","inherit","inherit"],logPath:null};let r=hK(t),s=cK(r,"a");return{stdio:["ignore",e?s:"inherit",n?s:"inherit"],logPath:r}}function gK(t,e){let{stdio:n,logPath:r}=_K(process.pid),s=fK(process.argv[0],[process.argv[1],"chat",...t],{detached:!0,stdio:n,env:{...process.env,[kf]:"1"}});return s.on("error",o=>{e.stderr.write(`error: --daemonize failed to spawn the detached child: ${o.message}
2164
+ `),{file:l,alias:d}}var Ui,If=C(()=>{"use strict";Qn();Tt();Eo();jl();Dl();$r();Tf();he();Ui=Object.keys(Ri)});var Xy={};ye(Xy,{resolvePromptInput:()=>Hy,runChat:()=>By});import{readFileSync as aK,openSync as lK}from"node:fs";import{homedir as cK}from"node:os";import{join as dK}from"node:path";import{spawn as uK}from"node:child_process";function mK(t){let[e,n]=t;if(!e)return t;if(!Ar(e)){let r=e.indexOf(":");if(r>0&&Qa(e.slice(0,r))&&st(e.slice(r+1)))return[`${e.slice(r+1)}:${e.slice(0,r)}`,...t.slice(1)]}return Qa(e)&&n&&st(n)?[n,e,...t.slice(2)]:t}function pK(t){return dK(cK(),".lmctl",`daemonize-${t}.log`)}function hK(t){let e=process.stdout.isTTY===!0,n=process.stderr.isTTY===!0;if(!e&&!n)return{stdio:["ignore","inherit","inherit"],logPath:null};let r=pK(t),s=lK(r,"a");return{stdio:["ignore",e?s:"inherit",n?s:"inherit"],logPath:r}}function _K(t,e){let{stdio:n,logPath:r}=hK(process.pid),s=uK(process.argv[0],[process.argv[1],"chat",...t],{detached:!0,stdio:n,env:{...process.env,[kf]:"1"}});return s.on("error",o=>{e.stderr.write(`error: --daemonize failed to spawn the detached child: ${o.message}
2166
2165
  `)}),s.unref(),e.stdout.write(`${JSON.stringify({status:"detached",pid:s.pid??null,logPath:r})}
2167
2166
  `),0}async function By(t,e={stdout:process.stdout,stderr:process.stderr}){t.includes("--json")&&(e=Sd(e));let n=e.env??process.env;if(t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Kx}
2168
- `),0;if(t.includes("--daemonize")&&n[kf]!=="1")return gK(t.filter(i=>i!=="--daemonize"),e);n[kf]==="1"&&(bd(e),delete process.env[kf]);let r=yK(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2167
+ `),0;if(t.includes("--daemonize")&&n[kf]!=="1")return _K(t.filter(i=>i!=="--daemonize"),e);n[kf]==="1"&&(bd(e),delete process.env[kf]);let r=gK(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2169
2168
  ${Kx}
2170
2169
  `),2;if(r.provider!==void 0){if(r.promptFile!==void 0){let a=await Hy(r.promptFile,e);if(typeof a!="string")return e.stderr.write(`error: ${a.error}
2171
2170
  `),2;r.prompt=a}if(!r.prompt)return e.stderr.write(`error: prompt text is required with --provider (or provide --prompt-file)
2172
2171
  `),2;let{runFreshPrompt:i}=await Promise.resolve().then(()=>(nx(),tx));return i({provider:r.provider,model:r.model,...r.sessiondir!==void 0?{sessiondir:r.sessiondir}:{},prompt:r.prompt,permissionMode:r.permissionMode,...r.json===!0?{json:!0}:{},...r.verbose===!0?{verbose:!0}:{}},e)}let s=new Or(e);try{let i=Ar(r.target??"");if(i){if(r.alias&&r.alias!==i.alias)throw new Error("Specify one teamfile and alias.");r.target=i.teamfile,r.alias=i.alias}if(r.target&&!st(r.target))throw new Error("prompt is teamfile-only: a teamfile and alias are required.");if((!r.target||!r.alias)&&!s.interactive)throw new Error('A teamfile and alias are required. Use: lmctl prompt <teamfile> <alias> "<prompt>"');if(!r.target){let{chooseTeamfile:a}=await Promise.resolve().then(()=>(If(),Wy));r.target=await a(s,e.cwd??process.cwd())}if(!st(r.target))throw new Error("Choose a .lmctl or .lmc teamfile.");if(!r.alias){let{chooseMember:a}=await Promise.resolve().then(()=>(If(),Wy));r.alias=await a(r.target,void 0,s)}if(!r.promptFile&&!r.prompt){if(!s.interactive)throw new Error(`prompt text is required. Use: lmctl prompt ${r.target} ${r.alias} "<prompt>"`);if(r.prompt=await s.ask(`Prompt for ${r.target} ${r.alias}: `),!r.prompt)throw new Error("prompt text is required")}}catch(i){return e.stderr.write(`error: ${i instanceof Error?i.message:String(i)}
2173
2172
  `),2}finally{s.close()}if(r.promptFile!==void 0){let i=await Hy(r.promptFile,e);if(typeof i!="string")return e.stderr.write(`error: ${i.error}
2174
- `),2;r.prompt=i}let o=Zn(mK,{target:r.target,alias:r.alias,flags:{}});if(o.mode==="error")return e.stderr.write(`error: ${o.message}
2173
+ `),2;r.prompt=i}let o=Zn(fK,{target:r.target,alias:r.alias,flags:{}});if(o.mode==="error")return e.stderr.write(`error: ${o.message}
2175
2174
  `),2;if(o.mode==="managed")return 2;if(o.mode==="ai-team"){if(o.alias===void 0)return e.stderr.write(`error: prompt: alias required (internal)
2176
2175
  `),2;e.stderr.write(`${o.alias}: turn running; this can take minutes
2177
- `);let i=Kb(e,{teamfile:o.teamfile,alias:o.alias}),a=new AbortController,l,c,d=_=>{l===void 0&&(l=_==="SIGINT"?130:_==="SIGTERM"?143:129,a.abort(_),c=setTimeout(()=>process.exit(l),1e3),c.unref())},u=()=>d("SIGINT"),f=()=>d("SIGTERM"),m=()=>d("SIGHUP");process.on("SIGINT",u),process.on("SIGTERM",f),process.on("SIGHUP",m);let p;try{p=await Qu({signal:a.signal,teamfile:o.teamfile,alias:o.alias,prompt:r.prompt,permissionMode:r.permissionMode,idleTimeoutMs:0,...r.rootFlag!==void 0?{rootFlag:r.rootFlag}:{},env:n,io:e,onEvent:_=>{i.poke(_),!(r.json===!0&&_.kind==="delta")&&TK(e,_,r.verbose===!0)},...r.json===!0?{onAccepted:_=>{i.poke(),e.stdout.write(`${JSON.stringify({status:"accepted",message_id:_})}
2176
+ `);let i=Kb(e,{teamfile:o.teamfile,alias:o.alias}),a=new AbortController,l,c,d=_=>{l===void 0&&(l=_==="SIGINT"?130:_==="SIGTERM"?143:129,a.abort(_),c=setTimeout(()=>process.exit(l),1e3),c.unref())},u=()=>d("SIGINT"),f=()=>d("SIGTERM"),m=()=>d("SIGHUP");process.on("SIGINT",u),process.on("SIGTERM",f),process.on("SIGHUP",m);let p;try{p=await Qu({signal:a.signal,teamfile:o.teamfile,alias:o.alias,prompt:r.prompt,permissionMode:r.permissionMode,idleTimeoutMs:0,...r.rootFlag!==void 0?{rootFlag:r.rootFlag}:{},env:n,io:e,onEvent:_=>{i.poke(_),!(r.json===!0&&_.kind==="delta")&&EK(e,_,r.verbose===!0)},...r.json===!0?{onAccepted:_=>{i.poke(),e.stdout.write(`${JSON.stringify({status:"accepted",message_id:_})}
2178
2177
  `)}}:{}})}finally{i.stop(),c!==void 0&&clearTimeout(c),process.removeListener("SIGINT",u),process.removeListener("SIGTERM",f),process.removeListener("SIGHUP",m)}return l!==void 0?l:r.json===!0?p.status==="busy"?(e.stdout.write(`${JSON.stringify({status:"busy",message:p.message,teamChatLogId:p.teamChatLogId,errorClass:Ir(p.message,{status:"busy"}).class})}
2179
2178
  `),1):p.status==="error"?(e.stdout.write(`${JSON.stringify({status:"error",errorKind:p.errorKind,message:p.message,errorClass:p.errorClass??Ir(p.message).class,teamChatLogId:p.teamChatLogId,...p.messageId===null?{}:{message_id:p.messageId},...p.usage?{usage:my(p.usage)}:{}})}
2180
2179
  `),1):(e.stdout.write(`${JSON.stringify({status:p.status,replyText:p.replyText,teamChatLogId:p.teamChatLogId,...p.messageId===null?{}:{message_id:p.messageId},turn_finished:!0,note:zx(o.alias),...p.errorClass?{errorClass:p.errorClass}:{},...p.usage?{usage:my(p.usage)}:{}})}
@@ -2187,34 +2186,34 @@ ${Kx}
2187
2186
  `):e.stdout.write(`${p.replyText}${p.replyText.endsWith(`
2188
2187
  `)?"":`
2189
2188
  `}`),e.stderr.write(`note: ${zx(o.alias)}
2190
- `),p.status==="stalled"?1:0)}return 2}function zx(t){return`${t}'s turn has finished and exited; resubmit \`lmctl prompt\` to continue (no persistent session is left running)`}function yK(t){let e=[],n="yolo",r,s,o,i,a,l=!1,c=!1;for(let p=0;p<t.length;p+=1){let _=t[p];if(_==="--permission-mode"){let h=t[++p];if(h===void 0||h.startsWith("--"))return"missing value for --permission-mode";if(h!=="plan"&&h!=="yolo")return`--permission-mode must be one of plan|yolo (got "${h}")`;n=h;continue}if(_==="--from"||_.startsWith("--from="))return AN("prompt");if(_.startsWith("I_am="))return`unknown argument: ${_}`;if(_==="--root"){let h=t[++p];if(h===void 0||h.startsWith("--"))return"missing value for --root";r=h;continue}if(_==="--prompt-file"){let h=t[++p];if(h===void 0||h!=="-"&&h.startsWith("--"))return"missing value for --prompt-file";s=h;continue}if(_==="--provider"||_==="--model"||_==="--sessiondir"){let h=t[++p];if(h===void 0||h.startsWith("--"))return`missing value for ${_}`;_==="--provider"?o=h:_==="--model"?i=h:a=h;continue}if(_==="--force"||_.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl prompt)";if(_==="--json"){l=!0;continue}if(_==="--verbose"){c=!0;continue}if(_.startsWith("--"))return`unknown flag: ${_}`;e.push(_)}if(o===void 0&&(e=pK(e)),o!==void 0){if(e.length>(s===void 0?1:0))return"--provider fresh mode cannot be combined with a teamfile or alias; provide one prompt or --prompt-file";if(i===void 0)return"--model is required with --provider"}else if(i!==void 0||a!==void 0)return"--model and --sessiondir require --provider";if(o!==void 0){let p={prompt:s===void 0?e[0]??"":"",permissionMode:n};return s!==void 0&&(p.promptFile=s),l&&(p.json=!0),c&&(p.verbose=!0),p.provider=o,p.model=i,a!==void 0&&(p.sessiondir=a),p}let d,u,f="";if(s!==void 0){if(e.length!==0)if(e.length===1)d=e[0];else if(e.length===2)d=e[0],u=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";f=""}else if(e.length!==0)if(e.length===1)d=e[0];else if(e.length===2)d=e[0],st(d)?u=e[1]:f=e[1];else if(e.length===3)d=e[0],u=e[1],f=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;let m={prompt:f,permissionMode:n};return d!==void 0&&(m.target=d),u!==void 0&&(m.alias=u),r!==void 0&&(m.rootFlag=r),s!==void 0&&(m.promptFile=s),l&&(m.json=l),c&&(m.verbose=c),o!==void 0&&(m.provider=o),i!==void 0&&(m.model=i),a!==void 0&&(m.sessiondir=a),m}async function Hy(t,e,n=process.stdin){let r;try{r=t==="-"?await wK(n):lK(t,"utf8")}catch(o){let i=o instanceof Error?o.message:String(o);return{error:`--prompt-file ${t}: ${i}`}}let s=r.endsWith(`\r
2189
+ `),p.status==="stalled"?1:0)}return 2}function zx(t){return`${t}'s turn has finished and exited; resubmit \`lmctl prompt\` to continue (no persistent session is left running)`}function gK(t){let e=[],n="yolo",r,s,o,i,a,l=!1,c=!1;for(let p=0;p<t.length;p+=1){let _=t[p];if(_==="--permission-mode"){let h=t[++p];if(h===void 0||h.startsWith("--"))return"missing value for --permission-mode";if(h!=="plan"&&h!=="yolo")return`--permission-mode must be one of plan|yolo (got "${h}")`;n=h;continue}if(_==="--from"||_.startsWith("--from="))return AN("prompt");if(_.startsWith("I_am="))return`unknown argument: ${_}`;if(_==="--root"){let h=t[++p];if(h===void 0||h.startsWith("--"))return"missing value for --root";r=h;continue}if(_==="--prompt-file"){let h=t[++p];if(h===void 0||h!=="-"&&h.startsWith("--"))return"missing value for --prompt-file";s=h;continue}if(_==="--provider"||_==="--model"||_==="--sessiondir"){let h=t[++p];if(h===void 0||h.startsWith("--"))return`missing value for ${_}`;_==="--provider"?o=h:_==="--model"?i=h:a=h;continue}if(_==="--force"||_.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl prompt)";if(_==="--json"){l=!0;continue}if(_==="--verbose"){c=!0;continue}if(_.startsWith("--"))return`unknown flag: ${_}`;e.push(_)}if(o===void 0&&(e=mK(e)),o!==void 0){if(e.length>(s===void 0?1:0))return"--provider fresh mode cannot be combined with a teamfile or alias; provide one prompt or --prompt-file";if(i===void 0)return"--model is required with --provider"}else if(i!==void 0||a!==void 0)return"--model and --sessiondir require --provider";if(o!==void 0){let p={prompt:s===void 0?e[0]??"":"",permissionMode:n};return s!==void 0&&(p.promptFile=s),l&&(p.json=!0),c&&(p.verbose=!0),p.provider=o,p.model=i,a!==void 0&&(p.sessiondir=a),p}let d,u,f="";if(s!==void 0){if(e.length!==0)if(e.length===1)d=e[0];else if(e.length===2)d=e[0],u=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";f=""}else if(e.length!==0)if(e.length===1)d=e[0];else if(e.length===2)d=e[0],st(d)?u=e[1]:f=e[1];else if(e.length===3)d=e[0],u=e[1],f=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;let m={prompt:f,permissionMode:n};return d!==void 0&&(m.target=d),u!==void 0&&(m.alias=u),r!==void 0&&(m.rootFlag=r),s!==void 0&&(m.promptFile=s),l&&(m.json=l),c&&(m.verbose=c),o!==void 0&&(m.provider=o),i!==void 0&&(m.model=i),a!==void 0&&(m.sessiondir=a),m}async function Hy(t,e,n=process.stdin){let r;try{r=t==="-"?await yK(n):aK(t,"utf8")}catch(o){let i=o instanceof Error?o.message:String(o);return{error:`--prompt-file ${t}: ${i}`}}let s=r.endsWith(`\r
2191
2190
  `)?r.slice(0,-2):r.endsWith(`
2192
- `)?r.slice(0,-1):r;return s.length===0?{error:`--prompt-file ${t}: file is empty; a prompt is required`}:s}async function wK(t){let e=[];for await(let n of t)e.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(e).toString("utf8")}function EK(t,e,n,r=!1){if(n.kind!=="tool_use"&&n.kind!=="tool_result"&&n.kind!=="api_retry")return;let s=n.kind==="tool_use"?`[${e}] tool_use ${n.tool??"tool"}${n.summary?`: ${n.summary}`:""}`:n.kind==="tool_result"?`[${e}] tool_result${n.status?` ${n.status}`:""}${n.summary?`: ${n.summary}`:""}`:`[${e}] api_retry${n.summary?`: ${n.summary}`:""}`;B({event:"chat_progress",alias:e,progress_kind:n.kind,line:s}),r&&t.stderr.write(`${s}
2193
- `)}function TK(t,e,n=!1){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?EK(t,e.alias,e.event,n):t.stderr.write(e.message)}var mK,Kx,kf,Af=C(()=>{"use strict";xd();ex();ef();Nt();Tt();Nt();he();Nt();ty();xl();Ee();he();mK={name:"prompt",allowsBareTeamfile:!1,supportsRaw:!1},Kx=`usage: lmctl prompt <teamfile> <alias> "<prompt>" [--json] [--verbose]
2191
+ `)?r.slice(0,-1):r;return s.length===0?{error:`--prompt-file ${t}: file is empty; a prompt is required`}:s}async function yK(t){let e=[];for await(let n of t)e.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(e).toString("utf8")}function wK(t,e,n,r=!1){if(n.kind!=="tool_use"&&n.kind!=="tool_result"&&n.kind!=="api_retry")return;let s=n.kind==="tool_use"?`[${e}] tool_use ${n.tool??"tool"}${n.summary?`: ${n.summary}`:""}`:n.kind==="tool_result"?`[${e}] tool_result${n.status?` ${n.status}`:""}${n.summary?`: ${n.summary}`:""}`:`[${e}] api_retry${n.summary?`: ${n.summary}`:""}`;B({event:"chat_progress",alias:e,progress_kind:n.kind,line:s}),r&&t.stderr.write(`${s}
2192
+ `)}function EK(t,e,n=!1){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?wK(t,e.alias,e.event,n):t.stderr.write(e.message)}var fK,Kx,kf,Af=C(()=>{"use strict";xd();ex();ef();Nt();Tt();Nt();he();Nt();ty();xl();Ee();he();fK={name:"prompt",allowsBareTeamfile:!1,supportsRaw:!1},Kx=`usage: lmctl prompt <teamfile> <alias> "<prompt>" [--json] [--verbose]
2194
2193
  lmctl prompt <teamfile> <alias> --prompt-file <file-path> [--json] [--verbose]
2195
2194
 
2196
2195
  lmctl prompt --provider <name> --model <model> "<prompt>" [--sessiondir <dir>] [--json] [--verbose]
2197
2196
  lmctl prompt --provider <name> --model <model> --prompt-file <file-path> [--sessiondir <dir>] [--json] [--verbose]
2198
2197
 
2199
2198
  --json Emit JSON results.
2200
- --verbose Show provider progress on stderr.`;kf="LMCTL_CHAT_DAEMONIZED"});import{spawn as vK}from"node:child_process";import{accessSync as Zx,closeSync as SK,constants as eR,lstatSync as bK,openSync as IK,readFileSync as kK,readSync as AK,realpathSync as NK,statSync as tR}from"node:fs";import{basename as qy,dirname as So,delimiter as xK,resolve as Nf,join as Fi}from"node:path";import{fileURLToPath as RK}from"node:url";import{constants as Yx}from"node:os";import*as nR from"node:path";function Gy(t){if(Zx(t,eR.X_OK),!tR(t).isFile())throw Error("not a file");return NK(t)}function rR(t){try{let e=IK(t,"r");try{let n=Buffer.alloc(2048);return n.subarray(0,AK(e,n,0,n.length,0)).toString("utf8").match(/lmscript-shim-protocol\s+(\d+)/)?.[1]}finally{SK(e)}}catch{return}}function Qx(t){return rR(t)===CK.split(" ").at(-1)}function OK(t,e=Nf(So(RK(import.meta.url)),"../../bin"),n=process.cwd(),r=process.argv[1]){if(t.LMSCRIPT_BIN){let _=Nf(n,t.LMSCRIPT_BIN),h;try{h=Gy(_)}catch{throw Error(`LMSCRIPT_BIN is set to ${_}, which is not an executable file; correct it, or unset it to use the sibling binary`)}let g=rR(h);if(g!==void 0&&g!=="2")throw Error(`LMSCRIPT_BIN ${_} declares protocol ${g}; this shim requires protocol 2`);return h}let s=[],o=So(e),i=So(o),a;try{let _=JSON.parse(kK(Fi(i,"package.json"),"utf8"));a=Array.isArray(_.workspaces)?_.workspaces:_.workspaces?.packages}catch{}let l=_=>Array.isArray(a)&&a.some(h=>typeof h=="string"&&LK(_,h.replace(/^\.\//,"").replace(/\/$/,""))),c=l(qy(o))&&l("lmscript"),d=_=>{try{return bK(_),!0}catch(h){if(h.code==="ENOENT")return!1;throw h}},u=_=>{let h;try{h=Gy(_)}catch{throw Error(`Standalone lmscript sibling ${_} is not an executable file; repair the sibling instead of falling through to another copy`)}if(!Qx(h))throw Error(`Standalone lmscript sibling ${_} is not a compatible lmscript (requires protocol 2)`);return h};if(c){let _=Fi(i,"lmscript","bin","lmscript"),h=`npm run build --prefix ${i}`;if(!d(_))throw Error(`Standalone lmscript workspace sibling ${_} is missing; run ${h}`);let g;try{g=u(_)}catch(y){throw Error(`${y instanceof Error?y.message:String(y)}; run ${h}`)}let w=Fi(i,"lmscript","dist","runner.js");try{if(Zx(w,eR.R_OK),!tR(w).isFile())throw Error("not a file")}catch{throw Error(`Standalone lmscript sibling found but ${w} is missing or not a readable file; run ${h}`)}return g}let f=So(o),m=qy(f)==="node_modules"?f:qy(So(f))==="node_modules"?So(f):void 0,p=[Fi(e,"lmscript"),...m?[Fi(m,"lmscript","bin","lmscript")]:[],...r?[Fi(So(Nf(n,r)),"lmscript")]:[]];for(let _ of new Set(p)){if(d(_))return u(_);s.push(_)}for(let _ of new Set((t.PATH??"").split(xK).filter(Boolean).map(h=>Nf(n,h,"lmscript")))){let h;try{h=Gy(_)}catch{s.push(_);continue}if(Qx(h))return h;s.push(_+" (not a compatible lmscript)")}throw Error("Standalone lmscript not found; set LMSCRIPT_BIN or install the sibling binary. Tried: "+s.join(", "))}async function Jl(t,e){let n={...process.env,...e.env},r=e.cwd??process.cwd(),s;try{s=OK(n,void 0,r)}catch(o){return e.stderr.write("error: "+String(o.message)+`
2201
- `),1}return new Promise(o=>{let i=!e.stdin||e.stdin===process.stdin,a=e.stdout===process.stdout,l=e.stderr===process.stderr,c=vK(process.execPath,[s,...t],{cwd:r,env:{...n,LMSCRIPT_LIFELINE_FD:"3"},detached:process.platform!=="win32",stdio:[i?"inherit":"pipe",a?"inherit":"pipe",l?"inherit":"pipe","pipe"]});c.stdio[3]?.on("error",()=>{});let d=!1,u=g=>{d||(d=!0,process.removeListener("SIGINT",m),process.removeListener("SIGTERM",p),process.removeListener("SIGHUP",_),process.removeListener("SIGWINCH",h),o(g))},f=g=>{try{c.pid&&process.platform!=="win32"?process.kill(-c.pid,g):c.kill(g)}catch(w){w.code!=="ESRCH"&&e.stderr.write("error: signal forwarding failed: "+String(w)+`
2199
+ --verbose Show provider progress on stderr.`;kf="LMCTL_CHAT_DAEMONIZED"});import{spawn as TK}from"node:child_process";import{accessSync as Zx,closeSync as vK,constants as eR,lstatSync as SK,openSync as bK,readFileSync as IK,readSync as kK,realpathSync as AK,statSync as tR}from"node:fs";import{basename as qy,dirname as So,delimiter as NK,resolve as Nf,join as Fi}from"node:path";import{fileURLToPath as xK}from"node:url";import{constants as Yx}from"node:os";import*as nR from"node:path";function Gy(t){if(Zx(t,eR.X_OK),!tR(t).isFile())throw Error("not a file");return AK(t)}function rR(t){try{let e=bK(t,"r");try{let n=Buffer.alloc(2048);return n.subarray(0,kK(e,n,0,n.length,0)).toString("utf8").match(/lmscript-shim-protocol\s+(\d+)/)?.[1]}finally{vK(e)}}catch{return}}function Qx(t){return rR(t)===LK.split(" ").at(-1)}function CK(t,e=Nf(So(xK(import.meta.url)),"../../bin"),n=process.cwd(),r=process.argv[1]){if(t.LMSCRIPT_BIN){let _=Nf(n,t.LMSCRIPT_BIN),h;try{h=Gy(_)}catch{throw Error(`LMSCRIPT_BIN is set to ${_}, which is not an executable file; correct it, or unset it to use the sibling binary`)}let g=rR(h);if(g!==void 0&&g!=="2")throw Error(`LMSCRIPT_BIN ${_} declares protocol ${g}; this shim requires protocol 2`);return h}let s=[],o=So(e),i=So(o),a;try{let _=JSON.parse(IK(Fi(i,"package.json"),"utf8"));a=Array.isArray(_.workspaces)?_.workspaces:_.workspaces?.packages}catch{}let l=_=>Array.isArray(a)&&a.some(h=>typeof h=="string"&&RK(_,h.replace(/^\.\//,"").replace(/\/$/,""))),c=l(qy(o))&&l("lmscript"),d=_=>{try{return SK(_),!0}catch(h){if(h.code==="ENOENT")return!1;throw h}},u=_=>{let h;try{h=Gy(_)}catch{throw Error(`Standalone lmscript sibling ${_} is not an executable file; repair the sibling instead of falling through to another copy`)}if(!Qx(h))throw Error(`Standalone lmscript sibling ${_} is not a compatible lmscript (requires protocol 2)`);return h};if(c){let _=Fi(i,"lmscript","bin","lmscript"),h=`npm run build --prefix ${i}`;if(!d(_))throw Error(`Standalone lmscript workspace sibling ${_} is missing; run ${h}`);let g;try{g=u(_)}catch(y){throw Error(`${y instanceof Error?y.message:String(y)}; run ${h}`)}let w=Fi(i,"lmscript","dist","runner.js");try{if(Zx(w,eR.R_OK),!tR(w).isFile())throw Error("not a file")}catch{throw Error(`Standalone lmscript sibling found but ${w} is missing or not a readable file; run ${h}`)}return g}let f=So(o),m=qy(f)==="node_modules"?f:qy(So(f))==="node_modules"?So(f):void 0,p=[Fi(e,"lmscript"),...m?[Fi(m,"lmscript","bin","lmscript")]:[],...r?[Fi(So(Nf(n,r)),"lmscript")]:[]];for(let _ of new Set(p)){if(d(_))return u(_);s.push(_)}for(let _ of new Set((t.PATH??"").split(NK).filter(Boolean).map(h=>Nf(n,h,"lmscript")))){let h;try{h=Gy(_)}catch{s.push(_);continue}if(Qx(h))return h;s.push(_+" (not a compatible lmscript)")}throw Error("Standalone lmscript not found; set LMSCRIPT_BIN or install the sibling binary. Tried: "+s.join(", "))}async function Jl(t,e){let n={...process.env,...e.env},r=e.cwd??process.cwd(),s;try{s=CK(n,void 0,r)}catch(o){return e.stderr.write("error: "+String(o.message)+`
2200
+ `),1}return new Promise(o=>{let i=!e.stdin||e.stdin===process.stdin,a=e.stdout===process.stdout,l=e.stderr===process.stderr,c=TK(process.execPath,[s,...t],{cwd:r,env:{...n,LMSCRIPT_LIFELINE_FD:"3"},detached:process.platform!=="win32",stdio:[i?"inherit":"pipe",a?"inherit":"pipe",l?"inherit":"pipe","pipe"]});c.stdio[3]?.on("error",()=>{});let d=!1,u=g=>{d||(d=!0,process.removeListener("SIGINT",m),process.removeListener("SIGTERM",p),process.removeListener("SIGHUP",_),process.removeListener("SIGWINCH",h),o(g))},f=g=>{try{c.pid&&process.platform!=="win32"?process.kill(-c.pid,g):c.kill(g)}catch(w){w.code!=="ESRCH"&&e.stderr.write("error: signal forwarding failed: "+String(w)+`
2202
2201
  `)}},m=()=>f("SIGINT"),p=()=>f("SIGTERM"),_=()=>f("SIGHUP");process.on("SIGINT",m),process.on("SIGTERM",p),process.on("SIGHUP",_);let h=()=>f("SIGWINCH");process.on("SIGWINCH",h),c.stdout?.on("data",g=>e.stdout.write(String(g))),c.stderr?.on("data",g=>e.stderr.write(String(g))),i||(e.stdin.pipe(c.stdin),c.stdin.on("error",w=>{w.code!=="EPIPE"&&e.stderr.write("error: child stdin: "+w.message+`
2203
2202
  `)})),c.once("error",g=>{e.stderr.write(`error: could not start ${s}: ${g.message}
2204
- `),u(1)}),c.once("close",(g,w)=>u(g??(w&&Yx.signals[w]?128+Yx.signals[w]:1)))})}var LK,CK,Jy=C(()=>{"use strict";LK=nR.matchesGlob,CK="lmscript-shim-protocol 2"});var oR={};ye(oR,{runScript:()=>xf});async function xf(t,e={stdout:process.stdout,stderr:process.stderr}){if(bd(e),!t.length)return O(e,sR);if(["help","--help","-h"].includes(t[0])){let n="",r=!0,o=await Jl(t,{...e,stdout:{write:i=>{if(!r){e.stdout.write(i);return}n+=i;let a=n.indexOf(`
2203
+ `),u(1)}),c.once("close",(g,w)=>u(g??(w&&Yx.signals[w]?128+Yx.signals[w]:1)))})}var RK,LK,Jy=C(()=>{"use strict";RK=nR.matchesGlob,LK="lmscript-shim-protocol 2"});var oR={};ye(oR,{runScript:()=>xf});async function xf(t,e={stdout:process.stdout,stderr:process.stderr}){if(bd(e),!t.length)return O(e,sR);if(["help","--help","-h"].includes(t[0])){let n="",r=!0,o=await Jl(t,{...e,stdout:{write:i=>{if(!r){e.stdout.write(i);return}n+=i;let a=n.indexOf(`
2205
2204
  `);a<0||(e.stdout.write(n.slice(0,a+1).startsWith("Usage: lmscript ")?"Usage: "+sR.slice(7)+`
2206
- `:n.slice(0,a+1)),e.stdout.write(n.slice(a+1)),n="",r=!1)}}});return n&&e.stdout.write(n),o}return Jl(t,e)}var sR,Vy=C(()=>{"use strict";Jy();he();sR="usage: lmctl script [--check|--dry-run|--lint] [--dry-loop-limit N] [--plan-format text|json] [--resumepoint PATH] [--pref FILE] <file>|-| -e <code> [args...]"});import{execFileSync as Ky}from"node:child_process";import{dirname as iR,resolve as DK}from"node:path";function aR(t){return(0,zy.formatCount)(t)}async function Yy(t,e){return G(t,n=>{let r=n.query(`SELECT config_warnings FROM tracked_invocation
2205
+ `:n.slice(0,a+1)),e.stdout.write(n.slice(a+1)),n="",r=!1)}}});return n&&e.stdout.write(n),o}return Jl(t,e)}var sR,Vy=C(()=>{"use strict";Jy();he();sR="usage: lmctl script [--check|--dry-run|--lint] [--dry-loop-limit N] [--plan-format text|json] [--resumepoint PATH] [--pref FILE] <file>|-| -e <code> [args...]"});import{execFileSync as Ky}from"node:child_process";import{dirname as iR,resolve as OK}from"node:path";function aR(t){return(0,zy.formatCount)(t)}async function Yy(t,e){return G(t,n=>{let r=n.query(`SELECT config_warnings FROM tracked_invocation
2207
2206
  WHERE target_teamfile = ? AND target_alias = ? AND config_warnings IS NOT NULL
2208
- ORDER BY started_at DESC LIMIT 1`,e.teamfile,e.alias);if(r.length!==0)try{let s=JSON.parse(r[0].config_warnings);if(!Array.isArray(s))return;let o=s.filter(i=>typeof i=="string"&&i.length>0);return o.length>0?o:void 0}catch{return}})}function Vl(t,e,n,r){let s=Qe(t,e);if(n.has(s))return[];n.add(s);let o=Yn(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...Vl(DK(iR(s),a.teamfile),e,n,[...r,a.alias]));continue}i.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session!==void 0&&a.session.length>0?a.session:null,model:a.model??null})}return i}async function Kl(t,e){try{let n=await G(t,r=>e.map(s=>{let o=wn(r,s.teamfile,s.alias);return[ji(s.teamfile,s.alias),MK(o)]}));return new Map(n)}catch{return new Map}}function ji(t,e){return`${t}\0${e.toLowerCase()}`}function MK(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:Rf(t.reclaimable===void 0?null:{source:t.reclaimable.source,holderPid:t.reclaimable.holder_pid,holderHost:t.reclaimable.holder_host,reason:t.reclaimable.reason})}function Rf(t=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:t}}function Lf(t){if(t.state!=="idle")return`busy (${t.reason})`;if(t.reclaimable!==null){let{holderPid:e,holderHost:n,reason:r}=t.reclaimable;return`idle (reclaimable lock: ${e!==null?`pid ${e}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead -- the provider process ended before the turn completed":"stale"})`}return"idle"}function Qy(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function In(t){return t==null?"unknown":(0,zy.formatCount)(t)}function lR(t){return t==="n/a"?t:In(t)}function cR(t,e,n=String){return t!==void 0?n(t):e?"n/a":"unknown"}function Zy(t){let e=iR(t),n;try{Ky("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{n=Ky("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let r=n.split(/\r?\n/).map(o=>Number.parseInt(o.trim(),10)).filter(o=>Number.isFinite(o)&&o>0);if(r.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=r.slice(0,2).map((o,i)=>({ref:i===0?"HEAD":`HEAD~${i}`,timestamp:new Date(o*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:$K(e)}}function $K(t){let e;try{e=Ky("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let n=0,r=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?r+=1:n+=1);return{uncommittedTracked:n,untracked:r}}function ew(t,e){let n=e.getTime();return t.messages.filter(r=>(r.role==="user"||r.role==="assistant")&&Number.isFinite(r.timestamp.getTime())&&r.timestamp.getTime()>n).length}function tw(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(n=>typeof n=="number"&&Number.isFinite(n));return e.length===0?null:e.reduce((n,r)=>n+r,0)}var zy,nw=C(()=>{"use strict";zy=pn(rn(),1);En();he();Qn()});async function dR(t,e){return G(e,n=>{let r=[];for(let s of n.listRootTeams())try{for(let o of Fe(s.teamfile_path).members)!o.teamfile&&o.session===t&&r.push({file:s.teamfile_path,member:o})}catch{}return r})}async function Cf(t,e){let n=await _t(e,t).catch(()=>null),r=n?.createdAt?.getTime();return{provider:t,sessiondir:n?.cwd,sessionid:e,model:n?.model??null,running:n?.turnStatus==="in_progress"?"busy":"unregistered",ageMs:r!==void 0&&Number.isFinite(r)?Math.max(0,Date.now()-r):null,context:n?.lastInputTokens??null}}async function rw(t,e,n){let r=await G(e,i=>Vl(t,i,new Set,[])),s=n?r.filter(i=>i.alias.toLowerCase()===n.toLowerCase()||i.reportPath.toLowerCase()===n.toLowerCase()):r;if(n&&!s.length)throw new Error(`No member "${n}" in ${t}`);let o=await Kl(e,s);return Promise.all(s.map(async i=>{let a=i.sessionid?await Cf(i.provider,i.sessionid):{provider:i.provider,sessionid:null,model:null,running:"not seeded",ageMs:null,context:null};return{...a,file:i.teamfile,alias:i.alias,model:i.model??a.model,running:i.sessionid?a.running==="busy"?"busy":o.get(ji(i.teamfile,i.alias))?.state??"unknown":"not seeded"}}))}function Of(t,e){let n=t.map(r=>[r.alias??"-",r.provider,r.model??"n/a",r.running,r.ageMs===null?"n/a":(0,Rs.formatDuration)(r.ageMs),r.context===null?"n/a":(0,Rs.formatCount)(r.context),r.sessionid??"-"].map(Rs.escapeCell));e.stdout.write(`${(0,Rs.formatTable)(n,{headers:["ALIAS","PROVIDER","MODEL","RUNNING","AGE","CONTEXT","SESSION"],margin:2})}
2207
+ ORDER BY started_at DESC LIMIT 1`,e.teamfile,e.alias);if(r.length!==0)try{let s=JSON.parse(r[0].config_warnings);if(!Array.isArray(s))return;let o=s.filter(i=>typeof i=="string"&&i.length>0);return o.length>0?o:void 0}catch{return}})}function Vl(t,e,n,r){let s=Qe(t,e);if(n.has(s))return[];n.add(s);let o=Yn(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...Vl(OK(iR(s),a.teamfile),e,n,[...r,a.alias]));continue}i.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session!==void 0&&a.session.length>0?a.session:null,model:a.model??null})}return i}async function Kl(t,e){try{let n=await G(t,r=>e.map(s=>{let o=wn(r,s.teamfile,s.alias);return[ji(s.teamfile,s.alias),DK(o)]}));return new Map(n)}catch{return new Map}}function ji(t,e){return`${t}\0${e.toLowerCase()}`}function DK(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:Rf(t.reclaimable===void 0?null:{source:t.reclaimable.source,holderPid:t.reclaimable.holder_pid,holderHost:t.reclaimable.holder_host,reason:t.reclaimable.reason})}function Rf(t=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:t}}function Lf(t){if(t.state!=="idle")return`busy (${t.reason})`;if(t.reclaimable!==null){let{holderPid:e,holderHost:n,reason:r}=t.reclaimable;return`idle (reclaimable lock: ${e!==null?`pid ${e}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead -- the provider process ended before the turn completed":"stale"})`}return"idle"}function Qy(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function In(t){return t==null?"unknown":(0,zy.formatCount)(t)}function lR(t){return t==="n/a"?t:In(t)}function cR(t,e,n=String){return t!==void 0?n(t):e?"n/a":"unknown"}function Zy(t){let e=iR(t),n;try{Ky("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{n=Ky("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let r=n.split(/\r?\n/).map(o=>Number.parseInt(o.trim(),10)).filter(o=>Number.isFinite(o)&&o>0);if(r.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=r.slice(0,2).map((o,i)=>({ref:i===0?"HEAD":`HEAD~${i}`,timestamp:new Date(o*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:MK(e)}}function MK(t){let e;try{e=Ky("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let n=0,r=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?r+=1:n+=1);return{uncommittedTracked:n,untracked:r}}function ew(t,e){let n=e.getTime();return t.messages.filter(r=>(r.role==="user"||r.role==="assistant")&&Number.isFinite(r.timestamp.getTime())&&r.timestamp.getTime()>n).length}function tw(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(n=>typeof n=="number"&&Number.isFinite(n));return e.length===0?null:e.reduce((n,r)=>n+r,0)}var zy,nw=C(()=>{"use strict";zy=pn(rn(),1);En();he();Qn()});async function dR(t,e){return G(e,n=>{let r=[];for(let s of n.listRootTeams())try{for(let o of Fe(s.teamfile_path).members)!o.teamfile&&o.session===t&&r.push({file:s.teamfile_path,member:o})}catch{}return r})}async function Cf(t,e){let n=await _t(e,t).catch(()=>null),r=n?.createdAt?.getTime();return{provider:t,sessiondir:n?.cwd,sessionid:e,model:n?.model??null,running:n?.turnStatus==="in_progress"?"busy":"unregistered",ageMs:r!==void 0&&Number.isFinite(r)?Math.max(0,Date.now()-r):null,context:n?.lastInputTokens??null}}async function rw(t,e,n){let r=await G(e,i=>Vl(t,i,new Set,[])),s=n?r.filter(i=>i.alias.toLowerCase()===n.toLowerCase()||i.reportPath.toLowerCase()===n.toLowerCase()):r;if(n&&!s.length)throw new Error(`No member "${n}" in ${t}`);let o=await Kl(e,s);return Promise.all(s.map(async i=>{let a=i.sessionid?await Cf(i.provider,i.sessionid):{provider:i.provider,sessionid:null,model:null,running:"not seeded",ageMs:null,context:null};return{...a,file:i.teamfile,alias:i.alias,model:i.model??a.model,running:i.sessionid?a.running==="busy"?"busy":o.get(ji(i.teamfile,i.alias))?.state??"unknown":"not seeded"}}))}function Of(t,e){let n=t.map(r=>[r.alias??"-",r.provider,r.model??"n/a",r.running,r.ageMs===null?"n/a":(0,Rs.formatDuration)(r.ageMs),r.context===null?"n/a":(0,Rs.formatCount)(r.context),r.sessionid??"-"].map(Rs.escapeCell));e.stdout.write(`${(0,Rs.formatTable)(n,{headers:["ALIAS","PROVIDER","MODEL","RUNNING","AGE","CONTEXT","SESSION"],margin:2})}
2209
2208
  `),e.stdout.write(`Context is the last completed turn; unavailable values are n/a.
2210
- `)}function uR(t){return t.running==="idle"&&t.ageMs!==null&&t.ageMs>=7*864e5&&t.context!==null&&t.context>=1e5}async function fR(t,e,n,r){return G(r,async s=>{if(wn(s,t,e).busy)throw new Error(`${e} is busy; its session was not replaced.`);let o=ls(s,{receiver_teamfile:t,receiver_alias:e,sender_teamfile:t,sender_alias:e,ttlMs:8*60*60*1e3});if(!o.acquired)throw new Error(`${e} is busy; its session was not replaced.`);try{let i=Fe(t).members.find(a=>a.alias.toLowerCase()===e.toLowerCase());if(!i||i.session!==n)throw new Error("Session binding changed; refresh cancelled.");if((await Cf(i.provider,n)).running==="busy")throw new Error(`${e} is running; its session was not replaced.`);return await Di(t,{...r,dal:s},{replaceSession:{alias:e,sessionid:n}})}finally{s.releaseAgentInflight(o.lease,o.leaseId)}})}var Rs,mR=C(()=>{"use strict";Tt();Fn();nw();he();Rs=pn(rn(),1);En();$r()});var sw={};ye(sw,{runInferred:()=>jK,runInferredBatch:()=>TR,sendInferredPrompt:()=>Wi});import{existsSync as hR,mkdtempSync as _R,readFileSync as PK,rmSync as gR,writeFileSync as yR}from"node:fs";import{tmpdir as wR}from"node:os";import{resolve as Df,join as Mf}from"node:path";async function Wi(t,e,n,r={}){let s=_R(Mf(wR(),"lmctl-intent-prompt-")),o=Mf(s,"prompt.txt");try{return yR(o,`${e}\r
2209
+ `)}function uR(t){return t.running==="idle"&&t.ageMs!==null&&t.ageMs>=7*864e5&&t.context!==null&&t.context>=1e5}async function fR(t,e,n,r){return G(r,async s=>{if(wn(s,t,e).busy)throw new Error(`${e} is busy; its session was not replaced.`);let o=ls(s,{receiver_teamfile:t,receiver_alias:e,sender_teamfile:t,sender_alias:e,ttlMs:8*60*60*1e3});if(!o.acquired)throw new Error(`${e} is busy; its session was not replaced.`);try{let i=Fe(t).members.find(a=>a.alias.toLowerCase()===e.toLowerCase());if(!i||i.session!==n)throw new Error("Session binding changed; refresh cancelled.");if((await Cf(i.provider,n)).running==="busy")throw new Error(`${e} is running; its session was not replaced.`);return await Di(t,{...r,dal:s},{replaceSession:{alias:e,sessionid:n}})}finally{s.releaseAgentInflight(o.lease,o.leaseId)}})}var Rs,mR=C(()=>{"use strict";Tt();Fn();nw();he();Rs=pn(rn(),1);En();$r()});var sw={};ye(sw,{runInferred:()=>FK,runInferredBatch:()=>TR,sendInferredPrompt:()=>Wi});import{existsSync as hR,mkdtempSync as _R,readFileSync as $K,rmSync as gR,writeFileSync as yR}from"node:fs";import{tmpdir as wR}from"node:os";import{resolve as Df,join as Mf}from"node:path";async function Wi(t,e,n,r={}){let s=_R(Mf(wR(),"lmctl-intent-prompt-")),o=Mf(s,"prompt.txt");try{return yR(o,`${e}\r
2211
2210
  `,{encoding:"utf8",mode:384}),await(r.chat??By)([...t,"--prompt-file",o],n)}finally{gR(s,{recursive:!0,force:!0})}}async function pR(t,e,n,r,s){let o=await(s.rows??rw)(t,r,e);Of(o,r);for(let i of o)if(!(!i.file||!i.alias||!i.sessionid||!uR(i))&&(r.stdout.write(`${i.alias}: old and large (at least 7 days and 100,000 context tokens). A refresh starts a new context; the old transcript remains.
2212
- `),n.interactive&&await n.confirm(`Replace ${i.file}:${i.alias}'s session ${i.sessionid}?`))){let a=await(s.refresh??fR)(i.file,i.alias,i.sessionid,r);if(a)return a;Of(await(s.rows??rw)(t,r,e),r)}return 0}async function UK(t,e,n){let r=await fetch(t,{cache:"no-store"});if(!r.ok)throw new Error(`HTTP ${r.status} fetching ${t}`);let s=await r.text(),o=n.cwd??process.cwd(),i=_R(Mf(wR(),"lmctl-hosted-script-")),a=Mf(i,"hosted.lms");try{return yR(a,s,"utf8"),n.stderr.write(`Running ${t} (only run scripts you trust)
2213
- `),await xf(["--base-dir",o,"--source-name",t,a,...e],{...n,cwd:o})}finally{gR(i,{recursive:!0,force:!0})}}async function ER(t,e){if(t.startsWith("-"))throw new Error("Use an explicit command for options; no inferred action was taken.");return await e.confirm(`Is ${JSON.stringify(t)} the prompt to send?`)?t:null}async function FK(t,e,n,r,s,o){let i=t.indexOf("/"),a=i>0?t.slice(0,i):t,l=nf(a,Ui),c=[];if(l.length){let p=await n.choose("Provider:",l);if(i<0&&e===void 0&&o===void 0)return(s.model??af)([],r,{selections:[{provider:p}]});let _=await(s.models??or)(p).catch(()=>[]),h;if(i>0){let g=t.slice(i+1);if(!g)throw new Error("A model name is required after provider/.");let w=nf(g,_);w.length?c.push(...w.map(y=>({provider:p,model:y}))):c.push({provider:p,model:g})}else{if(_.length?h=await n.choose("Model:",_):h=await n.ask(`Model for ${p}: `),!h)throw new Error("A model name is required.");c.push({provider:p,model:h})}}else{let p=await Promise.all(Dr.map(async h=>({provider:h,names:await(s.models??or)(h).catch(()=>[])}))),_=p.flatMap(({provider:h,names:g})=>g.filter(w=>w.toLowerCase()===t.toLowerCase()).map(w=>({provider:h,model:w})));if(c.push(..._.length?_:p.flatMap(({provider:h,names:g})=>nf(t,g).map(w=>({provider:h,model:w})))),!c.length)return null}if(o!==void 0){let p=await ER(o,n);if(p===null)return 0;e=p}if(e===void 0){let p=[...new Set(c.map(_=>_.provider))].map(_=>({provider:_,models:c.filter(h=>h.provider===_).map(h=>h.model)}));return(s.model??af)([],r,{selections:p})}let d=await n.choose("Prompt destination:",c.map(p=>`${p.provider}/${p.model}`)),u=c.find(p=>`${p.provider}/${p.model}`===d),f=await Fy(u.provider,u.model,r.cwd??process.cwd(),n),m=await ql(f.file,n,r,s,f.alias);return m||Wi([f.file,f.alias],e,r,s)}async function TR(t,e,n,r={}){let s=new Or(n,r.ask);try{let o=Df(n.cwd??process.cwd(),t);if(!hR(o))throw new Error(`Batch file not found: ${o}`);if(!PK(o,"utf8").trim())throw new Error(`Batch file has no prompts: ${o}`);if(e.length>2||e.some(c=>c.startsWith("-")))throw new Error("Expected .lmb [teamfile [alias]]; force/yes flags are not allowed in inferred mode.");let i=e[0]?Df(n.cwd??process.cwd(),e[0]):await Uy(s,n.cwd??process.cwd()),a=await ql(i,s,n,r,e[1]);if(a)return a;let l=await Gl(i,e[1],s);return(r.batch??iw)([i,l,o],n)}catch(o){return n.stderr.write(`error: ${o instanceof Error?o.message:String(o)}
2214
- `),2}finally{s.close()}}async function jK(t,e,n={}){let r=new Or(e,n.ask);try{let s=UN(t);if(!s)return null;if(s.kind==="script")return await xf([Df(e.cwd??process.cwd(),s.file),...s.rest],e);if(s.kind==="hosted-script")return await UK(s.url,s.rest,e);if(s.kind==="batch")return r.close(),TR(s.file,s.rest,e,n);if(s.kind==="models")return await FK(s.query,s.prompt,r,e,n,s.pendingPrompt);if(s.pendingPrompt!==void 0){let d=await ER(s.pendingPrompt,r);if(d===null)return 0;s.prompt=d}if(s.kind==="team"){let d=Df(e.cwd??process.cwd(),s.file),u=s.alias;if(hR(d)&&(u!==void 0||s.prompt!==void 0)){let m=Fe(d);if(!m.parseErrors.length&&m.members.length){u=await Gl(d,u,r);let p=m.members.find(_=>_.alias===u);if(s.prompt!==void 0&&(p.session||p.teamfile))return await Wi([d,u],s.prompt,e,n)}}let f=await ql(d,r,e,n,u);return f||(u=u!==void 0||s.prompt!==void 0?await Gl(d,u,r):void 0,s.prompt!==void 0?await Wi([d,u],s.prompt,e,n):await pR(d,u,r,e,n))}let o=await(n.registrations??dR)(s.id,e);if(o.length){let d=await r.choose("Registered session:",o.map(f=>`${f.file}:${f.member.alias}`)),u=o.find(f=>`${f.file}:${f.member.alias}`===d);return s.prompt!==void 0?await Wi([u.file,u.member.alias],s.prompt,e,n):await pR(u.file,u.member.alias,r,e,n)}let i=await(n.findProviders??Is)(s.id),a=i.length?await r.choose("Session provider:",i):await r.choose("Session provider:",Ui),l=await(n.summary??Cf)(a,s.id);Of([l],e);let c=await jy(s.id,a,l.model,e.cwd??process.cwd(),r,e,l.sessiondir);if(s.prompt!==void 0){if(!c)throw new Error("A teamfile and alias are required before sending a prompt.");return Wi([c.file,c.alias],s.prompt,e,n)}return 0}catch(s){return e.stderr.write(`error: ${s instanceof Error?s.message:String(s)}
2215
- `),2}finally{r.close()}}var ow=C(()=>{"use strict";Tt();ef();FN();Dl();Af();Vy();aw();Fn();If();mR()});var bR={};ye(bR,{runBatch:()=>iw});import{readFileSync as WK}from"node:fs";async function iw(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(vR),0;let n=ce(t,[],["--legacy","--single"]);if(n.error!==void 0)return O(e,n.error);if(n.positionals.length===1&&/\.lmb$/i.test(n.positionals[0])&&Object.keys(n.flags).length===0){let{runInferredBatch:w}=await Promise.resolve().then(()=>(ow(),sw));return w(n.positionals[0],[],e)}if(n.positionals.length!==3)return O(e,vR.trimEnd());let[r,s,o]=n.positionals,i=n.flags["--legacy"]===!0,a=n.flags["--single"]===!0,l,c;try{let w=WK(o,"utf8").replace(/^\uFEFF/u,"").replace(/\r\n?/gu,`
2216
- `);if(l=a?[w.trim()].filter(y=>y.length>0):w.split(/\n\s*\n/u).map(y=>y.trim()).filter(Boolean),l.length===0)return O(e,`batch: ${o}: no prompts found`);c=lt(r,s,e.dal)}catch(w){return O(e,`batch: ${w instanceof Error?w.message:String(w)}`)}let d=!i&&l.length>1&&await XK(c),u={...e.env??process.env},f=await qK(e,{member:c,batchfile:o,promptCount:l.length,parentInvocationId:ti(u.LMCTL_INVOCATION_ID)}),m={status:"error",error:"batch exited without a terminal outcome"},p=w=>{m=w},_=w=>{f!==null&&(JK(e,f,{status:"cancelled",signal:w,error:`batch interrupted by ${w}`}),process.exit(w==="SIGINT"?130:143))},h=()=>_("SIGINT"),g=()=>_("SIGTERM");f!==null&&(u.LMCTL_INVOCATION_ID=String(f),process.once("SIGINT",h),process.once("SIGTERM",g)),e.stderr.write(`batch ${eo()}: starting ${l.length} prompt${l.length===1?"":"s"} -> ${c.alias} (teamfile=${r} input=${o})
2217
- `);try{return d?await HK(e,{member:c,prompts:l,env:u,setRootFinish:p,teamfile:r,batchfile:o}):await lw(e,{member:c,prompts:l,env:u,setRootFinish:p,teamfile:r,batchfile:o})}finally{f!==null&&(process.removeListener("SIGINT",h),process.removeListener("SIGTERM",g),await GK(e,f,m))}}async function lw(t,e){let{member:n,prompts:r,env:s}=e;for(let[o,i]of r.entries()){t.stderr.write(`
2211
+ `),n.interactive&&await n.confirm(`Replace ${i.file}:${i.alias}'s session ${i.sessionid}?`))){let a=await(s.refresh??fR)(i.file,i.alias,i.sessionid,r);if(a)return a;Of(await(s.rows??rw)(t,r,e),r)}return 0}async function PK(t,e,n){let r=await fetch(t,{cache:"no-store"});if(!r.ok)throw new Error(`HTTP ${r.status} fetching ${t}`);let s=await r.text(),o=n.cwd??process.cwd(),i=_R(Mf(wR(),"lmctl-hosted-script-")),a=Mf(i,"hosted.lms");try{return yR(a,s,"utf8"),n.stderr.write(`Running ${t} (only run scripts you trust)
2212
+ `),await xf(["--base-dir",o,"--source-name",t,a,...e],{...n,cwd:o})}finally{gR(i,{recursive:!0,force:!0})}}async function ER(t,e){if(t.startsWith("-"))throw new Error("Use an explicit command for options; no inferred action was taken.");return await e.confirm(`Is ${JSON.stringify(t)} the prompt to send?`)?t:null}async function UK(t,e,n,r,s,o){let i=t.indexOf("/"),a=i>0?t.slice(0,i):t,l=nf(a,Ui),c=[];if(l.length){let p=await n.choose("Provider:",l);if(i<0&&e===void 0&&o===void 0)return(s.model??af)([],r,{selections:[{provider:p}]});let _=await(s.models??or)(p).catch(()=>[]),h;if(i>0){let g=t.slice(i+1);if(!g)throw new Error("A model name is required after provider/.");let w=nf(g,_);w.length?c.push(...w.map(y=>({provider:p,model:y}))):c.push({provider:p,model:g})}else{if(_.length?h=await n.choose("Model:",_):h=await n.ask(`Model for ${p}: `),!h)throw new Error("A model name is required.");c.push({provider:p,model:h})}}else{let p=await Promise.all(Dr.map(async h=>({provider:h,names:await(s.models??or)(h).catch(()=>[])}))),_=p.flatMap(({provider:h,names:g})=>g.filter(w=>w.toLowerCase()===t.toLowerCase()).map(w=>({provider:h,model:w})));if(c.push(..._.length?_:p.flatMap(({provider:h,names:g})=>nf(t,g).map(w=>({provider:h,model:w})))),!c.length)return null}if(o!==void 0){let p=await ER(o,n);if(p===null)return 0;e=p}if(e===void 0){let p=[...new Set(c.map(_=>_.provider))].map(_=>({provider:_,models:c.filter(h=>h.provider===_).map(h=>h.model)}));return(s.model??af)([],r,{selections:p})}let d=await n.choose("Prompt destination:",c.map(p=>`${p.provider}/${p.model}`)),u=c.find(p=>`${p.provider}/${p.model}`===d),f=await Fy(u.provider,u.model,r.cwd??process.cwd(),n),m=await ql(f.file,n,r,s,f.alias);return m||Wi([f.file,f.alias],e,r,s)}async function TR(t,e,n,r={}){let s=new Or(n,r.ask);try{let o=Df(n.cwd??process.cwd(),t);if(!hR(o))throw new Error(`Batch file not found: ${o}`);if(!$K(o,"utf8").trim())throw new Error(`Batch file has no prompts: ${o}`);if(e.length>2||e.some(c=>c.startsWith("-")))throw new Error("Expected .lmb [teamfile [alias]]; force/yes flags are not allowed in inferred mode.");let i=e[0]?Df(n.cwd??process.cwd(),e[0]):await Uy(s,n.cwd??process.cwd()),a=await ql(i,s,n,r,e[1]);if(a)return a;let l=await Gl(i,e[1],s);return(r.batch??iw)([i,l,o],n)}catch(o){return n.stderr.write(`error: ${o instanceof Error?o.message:String(o)}
2213
+ `),2}finally{s.close()}}async function FK(t,e,n={}){let r=new Or(e,n.ask);try{let s=UN(t);if(!s)return null;if(s.kind==="script")return await xf([Df(e.cwd??process.cwd(),s.file),...s.rest],e);if(s.kind==="hosted-script")return await PK(s.url,s.rest,e);if(s.kind==="batch")return r.close(),TR(s.file,s.rest,e,n);if(s.kind==="models")return await UK(s.query,s.prompt,r,e,n,s.pendingPrompt);if(s.pendingPrompt!==void 0){let d=await ER(s.pendingPrompt,r);if(d===null)return 0;s.prompt=d}if(s.kind==="team"){let d=Df(e.cwd??process.cwd(),s.file),u=s.alias;if(hR(d)&&(u!==void 0||s.prompt!==void 0)){let m=Fe(d);if(!m.parseErrors.length&&m.members.length){u=await Gl(d,u,r);let p=m.members.find(_=>_.alias===u);if(s.prompt!==void 0&&(p.session||p.teamfile))return await Wi([d,u],s.prompt,e,n)}}let f=await ql(d,r,e,n,u);return f||(u=u!==void 0||s.prompt!==void 0?await Gl(d,u,r):void 0,s.prompt!==void 0?await Wi([d,u],s.prompt,e,n):await pR(d,u,r,e,n))}let o=await(n.registrations??dR)(s.id,e);if(o.length){let d=await r.choose("Registered session:",o.map(f=>`${f.file}:${f.member.alias}`)),u=o.find(f=>`${f.file}:${f.member.alias}`===d);return s.prompt!==void 0?await Wi([u.file,u.member.alias],s.prompt,e,n):await pR(u.file,u.member.alias,r,e,n)}let i=await(n.findProviders??Is)(s.id),a=i.length?await r.choose("Session provider:",i):await r.choose("Session provider:",Ui),l=await(n.summary??Cf)(a,s.id);Of([l],e);let c=await jy(s.id,a,l.model,e.cwd??process.cwd(),r,e,l.sessiondir);if(s.prompt!==void 0){if(!c)throw new Error("A teamfile and alias are required before sending a prompt.");return Wi([c.file,c.alias],s.prompt,e,n)}return 0}catch(s){return e.stderr.write(`error: ${s instanceof Error?s.message:String(s)}
2214
+ `),2}finally{r.close()}}var ow=C(()=>{"use strict";Tt();ef();FN();Dl();Af();Vy();aw();Fn();If();mR()});var bR={};ye(bR,{runBatch:()=>iw});import{readFileSync as jK}from"node:fs";async function iw(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(vR),0;let n=ce(t,[],["--legacy","--single"]);if(n.error!==void 0)return O(e,n.error);if(n.positionals.length===1&&/\.lmb$/i.test(n.positionals[0])&&Object.keys(n.flags).length===0){let{runInferredBatch:w}=await Promise.resolve().then(()=>(ow(),sw));return w(n.positionals[0],[],e)}if(n.positionals.length!==3)return O(e,vR.trimEnd());let[r,s,o]=n.positionals,i=n.flags["--legacy"]===!0,a=n.flags["--single"]===!0,l,c;try{let w=jK(o,"utf8").replace(/^\uFEFF/u,"").replace(/\r\n?/gu,`
2215
+ `);if(l=a?[w.trim()].filter(y=>y.length>0):w.split(/\n\s*\n/u).map(y=>y.trim()).filter(Boolean),l.length===0)return O(e,`batch: ${o}: no prompts found`);c=lt(r,s,e.dal)}catch(w){return O(e,`batch: ${w instanceof Error?w.message:String(w)}`)}let d=!i&&l.length>1&&await BK(c),u={...e.env??process.env},f=await XK(e,{member:c,batchfile:o,promptCount:l.length,parentInvocationId:ti(u.LMCTL_INVOCATION_ID)}),m={status:"error",error:"batch exited without a terminal outcome"},p=w=>{m=w},_=w=>{f!==null&&(GK(e,f,{status:"cancelled",signal:w,error:`batch interrupted by ${w}`}),process.exit(w==="SIGINT"?130:143))},h=()=>_("SIGINT"),g=()=>_("SIGTERM");f!==null&&(u.LMCTL_INVOCATION_ID=String(f),process.once("SIGINT",h),process.once("SIGTERM",g)),e.stderr.write(`batch ${eo()}: starting ${l.length} prompt${l.length===1?"":"s"} -> ${c.alias} (teamfile=${r} input=${o})
2216
+ `);try{return d?await WK(e,{member:c,prompts:l,env:u,setRootFinish:p,teamfile:r,batchfile:o}):await lw(e,{member:c,prompts:l,env:u,setRootFinish:p,teamfile:r,batchfile:o})}finally{f!==null&&(process.removeListener("SIGINT",h),process.removeListener("SIGTERM",g),await qK(e,f,m))}}async function lw(t,e){let{member:n,prompts:r,env:s}=e;for(let[o,i]of r.entries()){t.stderr.write(`
2218
2217
  batch ${eo()}: prompt ${o+1}/${r.length} -> ${n.alias}
2219
2218
  ${i}${i.endsWith(`
2220
2219
  `)?"":`
@@ -2227,11 +2226,11 @@ ${i}${i.endsWith(`
2227
2226
  `)?"":`
2228
2227
  `}
2229
2228
  `)),m.status!=="ok"){let p=m.status==="stalled"?"provider stalled":m.status==="empty"?"provider returned no content and no observed activity for this turn":m.message,_=`batch: stopped at prompt ${o+1}/${r.length} (${o} completed): ${p}; later prompts were not sent`;return e.setRootFinish({status:m.status==="busy"?"busy":"error",exit_code:1,error:_,result_summary:`${o}/${r.length} prompts completed`}),O(t,_)}}catch(m){f();let p=`batch: stopped at prompt ${o+1}/${r.length} (${o} completed): ${m instanceof Error?m.message:String(m)}; later prompts were not sent`;return e.setRootFinish({status:"error",exit_code:1,error:p,result_summary:`${o}/${r.length} prompts completed`}),O(t,p)}finally{try{f()}finally{a.stop()}}}return t.stderr.write(`batch ${eo()}: completed ${r.length}/${r.length} prompts
2230
- `),e.setRootFinish({status:"done",exit_code:0,result_summary:`batch completed ${r.length}/${r.length} prompts`}),0}async function HK(t,e){let{member:n,prompts:r,env:s}=e,o=await G(t,f=>(Xd(f,n.teamfile,n.alias),wn(f,n.teamfile,n.alias)));if(o.busy){let f=o.reason==="in-flight"?`${n.alias} is servicing ${o.inFlight.sender_alias} (${o.inFlight.sender_teamfile}) since ${o.inFlight.started_at} \u2014 wait and retry`:o.source==="terminal-lock"?Nl(o.terminalLock):`${n.alias} is busy (interactive terminal); wait and retry`;return e.setRootFinish({status:"busy",exit_code:1,error:f,result_summary:"0 prompts completed"}),O(t,`batch: cannot start bundle: ${f}`)}let i=await G(t,f=>BK(s,f)),a=await G(t,f=>ls(f,{receiver_teamfile:n.teamfile,receiver_alias:n.alias,sender_teamfile:i?.teamfile??n.teamfile,sender_alias:i?.alias??"operator",ttlMs:ms()}));if(!a.acquired){let f=`${n.alias} is servicing ${a.current.sender_alias} (${a.current.sender_teamfile}) since ${a.current.started_at} \u2014 wait and retry`;return e.setRootFinish({status:"busy",exit_code:1,error:f,result_summary:"0 prompts completed"}),O(t,`batch: cannot start bundle: ${f}`)}let l={row:a.lease,leaseId:a.leaseId},c=hd(f=>G(t,m=>m.heartbeatAgentInflight(l.row,l.leaseId,f))),d,u=Wa(t,f=>`batch ${eo()}: opening provider session (${f}s elapsed)
2229
+ `),e.setRootFinish({status:"done",exit_code:0,result_summary:`batch completed ${r.length}/${r.length} prompts`}),0}async function WK(t,e){let{member:n,prompts:r,env:s}=e,o=await G(t,f=>(Xd(f,n.teamfile,n.alias),wn(f,n.teamfile,n.alias)));if(o.busy){let f=o.reason==="in-flight"?`${n.alias} is servicing ${o.inFlight.sender_alias} (${o.inFlight.sender_teamfile}) since ${o.inFlight.started_at} \u2014 wait and retry`:o.source==="terminal-lock"?Nl(o.terminalLock):`${n.alias} is busy (interactive terminal); wait and retry`;return e.setRootFinish({status:"busy",exit_code:1,error:f,result_summary:"0 prompts completed"}),O(t,`batch: cannot start bundle: ${f}`)}let i=await G(t,f=>HK(s,f)),a=await G(t,f=>ls(f,{receiver_teamfile:n.teamfile,receiver_alias:n.alias,sender_teamfile:i?.teamfile??n.teamfile,sender_alias:i?.alias??"operator",ttlMs:ms()}));if(!a.acquired){let f=`${n.alias} is servicing ${a.current.sender_alias} (${a.current.sender_teamfile}) since ${a.current.started_at} \u2014 wait and retry`;return e.setRootFinish({status:"busy",exit_code:1,error:f,result_summary:"0 prompts completed"}),O(t,`batch: cannot start bundle: ${f}`)}let l={row:a.lease,leaseId:a.leaseId},c=hd(f=>G(t,m=>m.heartbeatAgentInflight(l.row,l.leaseId,f))),d,u=Wa(t,f=>`batch ${eo()}: opening provider session (${f}s elapsed)
2231
2230
  `);try{let f={...s};try{let m=await G(t,p=>p.getRootTeam(n.teamfile)?.name??null);m!==null&&(f.LMBEE_TEAM_NAME=m)}catch{}d=await Pg({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,env:f,...n.model!==void 0?{model:n.model}:{},...n.effort!==void 0?{effort:n.effort}:{},alias:n.alias,isLead:n.isLead,permissionMode:"yolo",holdOpen:Qg(t,{teamfile:n.teamfile,alias:n.alias},f)})}catch(f){return B({event:"persistent_session_open_failed",provider:n.provider,session_id:n.sessionid,error_message:f instanceof Error?f.message:String(f)}),clearInterval(c),await SR(t,l),lw(t,{member:n,prompts:r,env:s,setRootFinish:e.setRootFinish,teamfile:e.teamfile,batchfile:e.batchfile})}finally{u.stop()}try{return await lw(t,{member:n,prompts:r,env:s,setRootFinish:e.setRootFinish,teamfile:e.teamfile,batchfile:e.batchfile,heldLease:l,bundleSession:d})}finally{await d.close(),clearInterval(c),await SR(t,l)}}async function SR(t,e){try{await G(t,n=>{n.releaseAgentInflight(e.row,e.leaseId)})}catch(n){t.stderr.write(`warning: failed to release batch bundle lease: ${n instanceof Error?n.message:String(n)}
2232
- `)}}function BK(t,e){let n=zu(t,e);if(n.ok)return mo(n.identity);if(n.reason==="unset")return null;throw new Error(fo("batch",t,e))}async function XK(t){let e=t.provider.trim().toLowerCase();return Gd(e,Kd(),kl())}async function qK(t,e){try{let{member:n}=e;return await G(t,r=>r.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:n.teamfile,from_identity:`${n.teamfile}:batch`,target_teamfile:n.teamfile,target_alias:n.alias,root_teamfile:n.teamfile,cwd:n.sessiondir,command:`lmctl batch ${n.teamfile} ${n.alias} ${e.batchfile}`,holder_pid:process.pid,launch_source:"exec",parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({batchfile:e.batchfile,prompt_count:e.promptCount,provider:n.provider,sessionid:n.sessionid,...n.model!==void 0?{model:n.model}:{}})}).id)}catch(n){return t.stderr.write(`warning: failed to start batch root invocation: ${n instanceof Error?n.message:String(n)}
2233
- `),null}}async function GK(t,e,n){try{await G(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){t.stderr.write(`warning: failed to finish batch root invocation: ${r instanceof Error?r.message:String(r)}
2234
- `)}}function JK(t,e,n){try{if(t.dal!==void 0){t.dal.finishTrackedInvocation(e,n);return}let r=Ye({path:mt()});try{r.finishTrackedInvocation(e,n)}finally{r.close()}}catch{}}var vR,aw=C(()=>{"use strict";Ee();ty();he();Kn();Nt();Pt();En();qd();Bd();Ku();xl();Yu();zd();Zg();Cr();vR=`usage: lmctl batch <teamfile> <alias> <batchfile> [--legacy] [--single]
2231
+ `)}}function HK(t,e){let n=zu(t,e);if(n.ok)return mo(n.identity);if(n.reason==="unset")return null;throw new Error(fo("batch",t,e))}async function BK(t){let e=t.provider.trim().toLowerCase();return Gd(e,Kd(),kl())}async function XK(t,e){try{let{member:n}=e;return await G(t,r=>r.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:n.teamfile,from_identity:`${n.teamfile}:batch`,target_teamfile:n.teamfile,target_alias:n.alias,root_teamfile:n.teamfile,cwd:n.sessiondir,command:`lmctl batch ${n.teamfile} ${n.alias} ${e.batchfile}`,holder_pid:process.pid,launch_source:"exec",parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({batchfile:e.batchfile,prompt_count:e.promptCount,provider:n.provider,sessionid:n.sessionid,...n.model!==void 0?{model:n.model}:{}})}).id)}catch(n){return t.stderr.write(`warning: failed to start batch root invocation: ${n instanceof Error?n.message:String(n)}
2232
+ `),null}}async function qK(t,e,n){try{await G(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){t.stderr.write(`warning: failed to finish batch root invocation: ${r instanceof Error?r.message:String(r)}
2233
+ `)}}function GK(t,e,n){try{if(t.dal!==void 0){t.dal.finishTrackedInvocation(e,n);return}let r=Ye({path:mt()});try{r.finishTrackedInvocation(e,n)}finally{r.close()}}catch{}}var vR,aw=C(()=>{"use strict";Ee();ty();he();Kn();Nt();Pt();En();qd();Bd();Ku();xl();Yu();zd();Zg();Cr();vR=`usage: lmctl batch <teamfile> <alias> <batchfile> [--legacy] [--single]
2235
2234
  lmctl batch <file.lmb> (infer or ask for teamfile and member)
2236
2235
 
2237
2236
  Send blank-line-separated paragraphs as prompts, one completed turn at a
@@ -2259,21 +2258,21 @@ lease) -- the pre-bundle behavior -- as an opt-out while bundle is new.
2259
2258
  --single sends the WHOLE file as ONE prompt: blank lines are content, not
2260
2259
  separators. A single prompt (one paragraph, or --single) never bundles and
2261
2260
  never takes a batch-level lease -- one plain turn.
2262
- `});import{execFile as VK}from"node:child_process";import{readFile as IR,readdir as kR,readlink as KK,stat as zK}from"node:fs/promises";import{basename as YK,isAbsolute as AR,resolve as NR}from"node:path";function ZK(t){let e=[];for(let n of t.split(`
2263
- `)){let r=n.split(RR);if(r.length!==6)continue;let[s,o,i,a,l,c]=r;!/^\d+$/.test(o)||!/^\d+$/.test(a)||!/^\d+$/.test(l)||!s||e.push({target:`${s}:${o}.${a}`,session:s,window_index:Number(o),window_name:i.slice(0,64),pane_index:Number(a),pane_pid:Number(l),active:c==="1"})}return e}function LR(t){let e=n=>!!n&&(YK(n)==="lmctl"||/\/lmctl[^/]*\/(?:.*\/)?(?:dist\/cli\/index|bin\/lmctl)(?:\.[cm]?js)?$/.test(n)||/@lmctl-ai\/lmctl\//.test(n));for(let n=1;n<t.length;n++){if(t[n]!=="terminal"||!e(t[n-1]))continue;let r=t.slice(n+1);if(r.some(i=>i==="--size"))return null;let s=r.filter(i=>!i.startsWith("-"));if(!s.length)return null;if(s.length>=2&&xR.test(s[1]))return{teamfile:s[0],alias:s[1]};let o=s[0].lastIndexOf(":");return o>0&&xR.test(s[0].slice(o+1))?{teamfile:s[0].slice(0,o),alias:s[0].slice(o+1)}:null}return null}async function CR(t,e,n){if(!AR(t)&&!e)return null;let r=AR(t)?NR(t):NR(e,t);return r.endsWith(".lmctl")||await n.exists(r)?r:await n.exists(`${r}.lmctl`)?`${r}.lmctl`:r}function OR(t="/proc"){return{async children(e){let n=[];for(let r of await kR(t).catch(()=>[])){if(!/^\d+$/.test(r))continue;let s=await IR(`${t}/${r}/stat`,"utf8").catch(()=>"");Number(s.slice(s.lastIndexOf(")")+2).split(" ")[1])===e&&n.push(Number(r))}return n},async info(e){let n=await IR(`${t}/${e}/cmdline`).catch(()=>null);if(!n||!n.length)return null;let r=n.toString("utf8").split("\0");return r.at(-1)===""&&r.pop(),{argv:r,cwd:await KK(`${t}/${e}/cwd`).catch(()=>null)}},async exists(e){try{return(await zK(e)).isFile()}catch{return!1}},async pids(){return(await kR(t).catch(()=>[])).filter(e=>/^\d+$/.test(e)).map(Number)}}}async function ez(t,e){let n=[],r=[t.pane_pid];for(let s=0;s<zl.depth&&r.length;s++){let o=[];for(let i of r){let a=await e.info(i),l=a?LR(a.argv):null;if(l){let c=await CR(l.teamfile,a.cwd,e);c&&n.push({teamfile:c,alias:l.alias,pid:i});continue}o.push(...await e.children(i))}r=o}return n}async function $f(t,e,n){let r=new Map;if(!t.length)return r;let s=new Set(t.map(o=>`${o.teamfile}:${o.alias}`));for(let o of e)for(let i of await ez(o,n)){let a=`${i.teamfile}:${i.alias}`;if(!s.has(a))continue;let l=r.get(a)??[];l.some(c=>c.target===o.target)||l.push({target:o.target,session:o.session,window_index:o.window_index,window_name:o.window_name,pane_index:o.pane_index,pid:i.pid}),r.set(a,l)}return r}function tz(t){let e=t.LMCTL_SITE_TMUX_SOCKET;return e?e.startsWith("/")?["-S",e]:["-L",e]:[]}function nz(t){let e=t.TMUX_TMPDIR??process.env.TMUX_TMPDIR;return{...t,PATH:t.PATH??process.env.PATH,...e?{TMUX_TMPDIR:e}:{}}}function DR(t){let e=tz(t),n=nz(t);return(r,s={})=>new Promise((o,i)=>{VK("tmux",[...e,...r],{timeout:s.timeoutMs??1e4,env:n,maxBuffer:1024*1024},(a,l,c)=>{if(a){let d=new Error(`tmux ${r[0]} failed: ${(String(c||"").trim()||a.message).slice(0,300)}`);i(d)}else o(String(l))})})}async function Pf(t,e=100){let n="";for(let r=0;r<2;r++)try{return{panes:ZK(await t(["list-panes","-a","-F",QK])),error:null}}catch(s){if(n=s instanceof Error?s.message:String(s),/no server running|error connecting to|ENOENT|not found/i.test(n))return{panes:[],error:null};r===0&&await new Promise(o=>setTimeout(o,e))}return{panes:[],error:n.slice(0,200)}}async function rz(t){return(await Pf(t)).panes}async function MR(t,e){if(!e.pids)return null;for(let n of await e.pids()){let r=await e.info(n),s=r?LR(r.argv):null;if(s&&s.alias===t.alias&&await CR(s.teamfile,r.cwd,e)===t.teamfile)return n}return null}async function $R(t,e,n,r,s){if(typeof s!="string"||!s.length||s.includes("\0")||Buffer.byteLength(s)>zl.textBytes)return{ok:!1,code:"text_invalid",message:`the text must be 1 to ${zl.textBytes} bytes, without NUL`};let i=(await rz(t)).find(l=>l.target===r);if(!i)return{ok:!1,code:"pane_gone",message:`tmux pane ${r} no longer exists`};let a=(await $f([n],[i],e)).get(`${n.teamfile}:${n.alias}`)??[];if(!a.length)return{ok:!1,code:"pane_not_associated",message:`tmux pane ${r} no longer runs lmctl terminal ${n.teamfile} ${n.alias}`};if(/[\r\n]/.test(s)){let l=`lmctl-${process.pid}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;await t(["set-buffer","-b",l,"--",s.replace(/\r\n?/g,`
2264
- `)]),await t(["paste-buffer","-p","-r","-d","-b",l,"-t",r])}else await t(["send-keys","-t",r,"-l","--",s]);return await t(["send-keys","-t",r,"Enter"]),{ok:!0,place:a[0]}}var zl,RR,QK,xR,PR=C(()=>{"use strict";zl={textBytes:8192,depth:6},RR="<<lmctl-sep>>",QK=["#{session_name}","#{window_index}","#{window_name}","#{pane_index}","#{pane_pid}","#{pane_active}"].join(RR);xR=/^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/});var sc={};ye(sc,{LmctlRunError:()=>rc,NEW_SESSION_NAME:()=>yw,NEW_SESSION_SCHEMA:()=>dw,SEARCH_CAPS:()=>Ls,SEARCH_SCHEMA:()=>ww,SHELL_CAPS:()=>ec,SITE_SCHEMA:()=>nc,TAIL_SCHEMA:()=>qf,afterCursor:()=>iL,answerText:()=>uL,attentionSites:()=>bw,auditShell:()=>mw,childEnv:()=>nL,consoleTargets:()=>tL,disableSite:()=>yL,enableSite:()=>gL,failureAnswer:()=>cn,failureText:()=>Gf,isTranscriptBookkeeping:()=>Tw,listOrgs:()=>pL,listSites:()=>dL,liveTailView:()=>oL,lmctlMessage:()=>ZR,modelsFrom:()=>hw,newSessionCommands:()=>TL,newSessionTeamfile:()=>cL,nextCursor:()=>aL,parseAllow:()=>Ew,parseCursor:()=>vw,promptRefusal:()=>Ff,promptSite:()=>fL,readAppkey:()=>YR,redact:()=>St,removeSite:()=>hL,resolveTarget:()=>Ql,runConfiguredSite:()=>wz,runShellCommand:()=>eL,runSite:()=>Tz,scheduleSite:()=>EL,searchLocal:()=>lL,searchSites:()=>vL,serveSite:()=>Sw,sessionsFrom:()=>pw,siteApiUrl:()=>zR,siteConfigPath:()=>Xi,siteStatus:()=>Jf,tailSite:()=>mL,tailView:()=>sL,takeRepeated:()=>Bf,usageCostView:()=>Hf});import{spawn as qR}from"node:child_process";import{mkdirSync as sz,readFileSync as tc,renameSync as oz,rmSync as iz,writeFileSync as az}from"node:fs";import{appendFile as lz,chmod as cz,lstat as dz,mkdir as Zl,mkdtemp as UR,readFile as uz,rename as GR,rm as FR,stat as fz,writeFile as Yl}from"node:fs/promises";import{homedir as _w,hostname as mz,tmpdir as jR}from"node:os";import{basename as Bi,join as Ze,resolve as gw}from"node:path";import{createHash as pz}from"node:crypto";function zR(t){return(t.LMCTL_SITE_API_URL?.trim()||"https://lmctl.ai").replace(/\/+$/,"")}function YR(t,e=n=>tc(n,"utf8")){let n=t.LMCTL_APPKEY?.trim();if(n&&!n.includes(`
2261
+ `});import{execFile as JK}from"node:child_process";import{readFile as IR,readdir as kR,readlink as VK,stat as KK}from"node:fs/promises";import{basename as zK,isAbsolute as AR,resolve as NR}from"node:path";function QK(t){let e=[];for(let n of t.split(`
2262
+ `)){let r=n.split(RR);if(r.length!==6)continue;let[s,o,i,a,l,c]=r;!/^\d+$/.test(o)||!/^\d+$/.test(a)||!/^\d+$/.test(l)||!s||e.push({target:`${s}:${o}.${a}`,session:s,window_index:Number(o),window_name:i.slice(0,64),pane_index:Number(a),pane_pid:Number(l),active:c==="1"})}return e}function LR(t){let e=n=>!!n&&(zK(n)==="lmctl"||/\/lmctl[^/]*\/(?:.*\/)?(?:dist\/cli\/index|bin\/lmctl)(?:\.[cm]?js)?$/.test(n)||/@lmctl-ai\/lmctl\//.test(n));for(let n=1;n<t.length;n++){if(t[n]!=="terminal"||!e(t[n-1]))continue;let r=t.slice(n+1);if(r.some(i=>i==="--size"))return null;let s=r.filter(i=>!i.startsWith("-"));if(!s.length)return null;if(s.length>=2&&xR.test(s[1]))return{teamfile:s[0],alias:s[1]};let o=s[0].lastIndexOf(":");return o>0&&xR.test(s[0].slice(o+1))?{teamfile:s[0].slice(0,o),alias:s[0].slice(o+1)}:null}return null}async function CR(t,e,n){if(!AR(t)&&!e)return null;let r=AR(t)?NR(t):NR(e,t);return r.endsWith(".lmctl")||await n.exists(r)?r:await n.exists(`${r}.lmctl`)?`${r}.lmctl`:r}function OR(t="/proc"){return{async children(e){let n=[];for(let r of await kR(t).catch(()=>[])){if(!/^\d+$/.test(r))continue;let s=await IR(`${t}/${r}/stat`,"utf8").catch(()=>"");Number(s.slice(s.lastIndexOf(")")+2).split(" ")[1])===e&&n.push(Number(r))}return n},async info(e){let n=await IR(`${t}/${e}/cmdline`).catch(()=>null);if(!n||!n.length)return null;let r=n.toString("utf8").split("\0");return r.at(-1)===""&&r.pop(),{argv:r,cwd:await VK(`${t}/${e}/cwd`).catch(()=>null)}},async exists(e){try{return(await KK(e)).isFile()}catch{return!1}},async pids(){return(await kR(t).catch(()=>[])).filter(e=>/^\d+$/.test(e)).map(Number)}}}async function ZK(t,e){let n=[],r=[t.pane_pid];for(let s=0;s<zl.depth&&r.length;s++){let o=[];for(let i of r){let a=await e.info(i),l=a?LR(a.argv):null;if(l){let c=await CR(l.teamfile,a.cwd,e);c&&n.push({teamfile:c,alias:l.alias,pid:i});continue}o.push(...await e.children(i))}r=o}return n}async function $f(t,e,n){let r=new Map;if(!t.length)return r;let s=new Set(t.map(o=>`${o.teamfile}:${o.alias}`));for(let o of e)for(let i of await ZK(o,n)){let a=`${i.teamfile}:${i.alias}`;if(!s.has(a))continue;let l=r.get(a)??[];l.some(c=>c.target===o.target)||l.push({target:o.target,session:o.session,window_index:o.window_index,window_name:o.window_name,pane_index:o.pane_index,pid:i.pid}),r.set(a,l)}return r}function ez(t){let e=t.LMCTL_SITE_TMUX_SOCKET;return e?e.startsWith("/")?["-S",e]:["-L",e]:[]}function tz(t){let e=t.TMUX_TMPDIR??process.env.TMUX_TMPDIR;return{...t,PATH:t.PATH??process.env.PATH,...e?{TMUX_TMPDIR:e}:{}}}function DR(t){let e=ez(t),n=tz(t);return(r,s={})=>new Promise((o,i)=>{JK("tmux",[...e,...r],{timeout:s.timeoutMs??1e4,env:n,maxBuffer:1024*1024},(a,l,c)=>{if(a){let d=new Error(`tmux ${r[0]} failed: ${(String(c||"").trim()||a.message).slice(0,300)}`);i(d)}else o(String(l))})})}async function Pf(t,e=100){let n="";for(let r=0;r<2;r++)try{return{panes:QK(await t(["list-panes","-a","-F",YK])),error:null}}catch(s){if(n=s instanceof Error?s.message:String(s),/no server running|error connecting to|ENOENT|not found/i.test(n))return{panes:[],error:null};r===0&&await new Promise(o=>setTimeout(o,e))}return{panes:[],error:n.slice(0,200)}}async function nz(t){return(await Pf(t)).panes}async function MR(t,e){if(!e.pids)return null;for(let n of await e.pids()){let r=await e.info(n),s=r?LR(r.argv):null;if(s&&s.alias===t.alias&&await CR(s.teamfile,r.cwd,e)===t.teamfile)return n}return null}async function $R(t,e,n,r,s){if(typeof s!="string"||!s.length||s.includes("\0")||Buffer.byteLength(s)>zl.textBytes)return{ok:!1,code:"text_invalid",message:`the text must be 1 to ${zl.textBytes} bytes, without NUL`};let i=(await nz(t)).find(l=>l.target===r);if(!i)return{ok:!1,code:"pane_gone",message:`tmux pane ${r} no longer exists`};let a=(await $f([n],[i],e)).get(`${n.teamfile}:${n.alias}`)??[];if(!a.length)return{ok:!1,code:"pane_not_associated",message:`tmux pane ${r} no longer runs lmctl terminal ${n.teamfile} ${n.alias}`};if(/[\r\n]/.test(s)){let l=`lmctl-${process.pid}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;await t(["set-buffer","-b",l,"--",s.replace(/\r\n?/g,`
2263
+ `)]),await t(["paste-buffer","-p","-r","-d","-b",l,"-t",r])}else await t(["send-keys","-t",r,"-l","--",s]);return await t(["send-keys","-t",r,"Enter"]),{ok:!0,place:a[0]}}var zl,RR,YK,xR,PR=C(()=>{"use strict";zl={textBytes:8192,depth:6},RR="<<lmctl-sep>>",YK=["#{session_name}","#{window_index}","#{window_name}","#{pane_index}","#{pane_pid}","#{pane_active}"].join(RR);xR=/^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/});var sc={};ye(sc,{LmctlRunError:()=>rc,NEW_SESSION_NAME:()=>yw,NEW_SESSION_SCHEMA:()=>dw,SEARCH_CAPS:()=>Ls,SEARCH_SCHEMA:()=>ww,SHELL_CAPS:()=>ec,SITE_SCHEMA:()=>nc,TAIL_SCHEMA:()=>qf,afterCursor:()=>iL,answerText:()=>uL,attentionSites:()=>bw,auditShell:()=>mw,childEnv:()=>nL,consoleTargets:()=>tL,disableSite:()=>yL,enableSite:()=>gL,failureAnswer:()=>cn,failureText:()=>Gf,isTranscriptBookkeeping:()=>Tw,listOrgs:()=>pL,listSites:()=>dL,liveTailView:()=>oL,lmctlMessage:()=>ZR,modelsFrom:()=>hw,newSessionCommands:()=>TL,newSessionTeamfile:()=>cL,nextCursor:()=>aL,parseAllow:()=>Ew,parseCursor:()=>vw,promptRefusal:()=>Ff,promptSite:()=>fL,readAppkey:()=>YR,redact:()=>St,removeSite:()=>hL,resolveTarget:()=>Ql,runConfiguredSite:()=>yz,runShellCommand:()=>eL,runSite:()=>Ez,scheduleSite:()=>EL,searchLocal:()=>lL,searchSites:()=>vL,serveSite:()=>Sw,sessionsFrom:()=>pw,siteApiUrl:()=>zR,siteConfigPath:()=>Xi,siteStatus:()=>Jf,tailSite:()=>mL,tailView:()=>sL,takeRepeated:()=>Bf,usageCostView:()=>Hf});import{spawn as qR}from"node:child_process";import{mkdirSync as rz,readFileSync as tc,renameSync as sz,rmSync as oz,writeFileSync as iz}from"node:fs";import{appendFile as az,chmod as lz,lstat as cz,mkdir as Zl,mkdtemp as UR,readFile as dz,rename as GR,rm as FR,stat as uz,writeFile as Yl}from"node:fs/promises";import{homedir as _w,hostname as fz,tmpdir as jR}from"node:os";import{basename as Bi,join as Ze,resolve as gw}from"node:path";import{createHash as mz}from"node:crypto";function zR(t){return(t.LMCTL_SITE_API_URL?.trim()||"https://lmctl.ai").replace(/\/+$/,"")}function YR(t,e=n=>tc(n,"utf8")){let n=t.LMCTL_APPKEY?.trim();if(n&&!n.includes(`
2265
2264
  `))return n;let r=[t.LMCTL_APPKEY_FILE?.trim(),Ze(t.XDG_CONFIG_HOME?.trim()||Ze(t.HOME||_w(),".config"),"lmctl","appkey.json")];for(let s of r){if(!s)continue;let o;try{o=e(s).trim()}catch{continue}if(o){if(o.startsWith("{")){try{let i=JSON.parse(o).appkey;if(typeof i=="string"&&i.trim())return i.trim()}catch{}continue}if(!o.includes(`
2266
2265
  `))return o}}return null}function cr(t,e){let n=t.env??process.env,r=YR(n);if(!r)return null;let s=zR(n);async function o(i,a,l,c=!0,d={}){let u=await e.fetch(s+a,{method:i,headers:{authorization:`Bearer ${r}`,...l===void 0?{}:{"content-type":"application/json"},...d},...l===void 0?{}:{body:JSON.stringify(l)},...c&&e.signal?{signal:e.signal}:{}}),f=await u.text(),m=null;try{m=f?JSON.parse(f):null}catch{m=null}if(u.status>=400){let p=m?.error;throw new An(u.status,typeof p=="string"?p:"request_failed")}return{status:u.status,json:m}}return{call:o,base:s}}function Ne(t){return t instanceof An||t instanceof Error?t.message:String(t)}function ZR(t){for(let e of t.trim().split(`
2267
- `).reverse())try{let n=JSON.parse(e);if(n&&(n.status==="error"||n.status==="failed")&&typeof(n.message??n.error)=="string")return String(n.message??n.error)}catch{}return null}function eL(t,e,n,r,s=ec.outputBytes){return new Promise(o=>{let i=Date.now(),a={out:{chunks:[],bytes:0,kept:0},err:{chunks:[],bytes:0,kept:0}},l=(_,h)=>{if(_.bytes+=h.length,_.kept<s){let g=h.subarray(0,s-_.kept);_.chunks.push(g),_.kept+=g.length}},c=!1,d=!1,u=(_,h,g)=>{d||(d=!0,clearTimeout(p),o({exit_code:_,signal:h,timed_out:c,stdout:Buffer.concat(a.out.chunks).toString(),stderr:Buffer.concat(a.err.chunks).toString(),stdout_bytes:a.out.bytes,stderr_bytes:a.err.bytes,stdout_truncated:a.out.bytes>s,stderr_truncated:a.err.bytes>s,started_at:new Date(i).toISOString(),ended_at:new Date().toISOString(),duration_ms:Date.now()-i,...g?{spawn_error:g}:{}}))},f=qR("bash",["-lc",t],{cwd:e,env:r,detached:!0,stdio:["ignore","pipe","pipe"]}),m=()=>{try{f.pid&&process.kill(-f.pid,"SIGKILL")}catch{}},p=setTimeout(()=>{c=!0,m()},n);f.stdout.on("data",_=>l(a.out,_)),f.stderr.on("data",_=>l(a.err,_)),f.on("error",_=>u(null,null,_.message)),f.on("exit",()=>setTimeout(m,300)),f.on("close",(_,h)=>u(_,h))})}async function mw(t,e){await Zl(Ze(t,".."),{recursive:!0,mode:448}),await lz(t,`${JSON.stringify(e)}
2268
- `,{mode:384}),await cz(t,384)}function Gf(t){let e=t;if(typeof t=="string")try{let r=JSON.parse(t);e=r?.detail??(typeof r?.error=="string"?r:null)}catch{return null}if(!e||typeof e!="object"||typeof e.error!="string")return null;let n=(r,s)=>s==null||s===""?[]:[`${r}: ${s}`];return[...n("error",e.error),...n("message",e.message),...n("exit code",e.exit_code),...n("signal",e.signal),...e.timed_out?["timed out: yes"]:[],...n("command",e.command),...n("started",e.started_at),...n("ended",e.ended_at),...n("duration",typeof e.duration_ms=="number"?`${e.duration_ms} ms`:null),...n("site",e.site),...n("job",e.job_id),...e.stdout_tail?["--- stdout (tail)",String(e.stdout_tail).replace(/\n$/,"")]:[],...e.stderr_tail?["--- stderr (tail)",String(e.stderr_tail).replace(/\n$/,"")]:[]].join(`
2269
- `)}function cn(t,e,n,r){let s=n instanceof rc?n.run:null,o={error:e,message:St(Ne(n)).slice(0,4e3),exit_code:s?.exit_code??null,signal:s?.signal??null,timed_out:s?.timed_out??!1,command:s?St(s.command.join(" ")).slice(0,2e3):null,stdout_tail:s?St(Wf(s.stdout_tail)):null,stderr_tail:s?St(Wf(s.stderr_tail)):null,started_at:s?.started_at??null,ended_at:s?.ended_at??new Date(r.now).toISOString(),duration_ms:s?.duration_ms??null,site:r.site,job_id:r.job};return{status:t,headers:{"content-type":"application/json"},body:JSON.stringify({error:e,detail:o})}}function Ew(t,e){return t.map(n=>{let r=n.lastIndexOf(":"),s=r>0&&Xf.test(n.slice(r+1))?n.slice(r+1):null;return{teamfile:gw(e,s===null?n:n.slice(0,r)),alias:s}})}function qi(t){let e=t.lastIndexOf(":");if(e<=0)return null;let n=t.slice(e+1);return Xf.test(n)?{teamfile:t.slice(0,e),alias:n}:null}function pw(t,e,n,r=Date.now()){let s=new Map,o=(c,d)=>n||!e.length||e.some(u=>u.teamfile===c&&(u.alias===null||u.alias===d)),i=t??{};if(Array.isArray(i.sessions))for(let c of i.sessions){let d=c??{};if(typeof d.team_path!="string"||!d.team_path.startsWith("/")||typeof d.member!="string"||!Xf.test(d.member))continue;let u=`${d.team_path}:${d.member}`;if(s.has(u))continue;let f=d.busy===!0,m=d.terminal_held===!0,p=typeof d.state=="string"?d.state.slice(0,16):null,_=WR(d.last_activity_at),h=WR(d.started_at),g=!f&&_?Math.max(0,Math.round((r-Date.parse(_))/1e3)):null,w=d.can_prompt===!0&&!f&&!m;s.set(u,{target:u,teamfile:d.team_path,alias:d.member,state:f?"busy":g===null?"unknown":"idle",idle_seconds:g,model:typeof d.model=="string"?d.model.slice(0,128):null,allowed:o(d.team_path,d.member),running_seconds:(f||d.liveness==="dead")&&h?Math.max(0,Math.round((r-Date.parse(h))/1e3)):null,stuck:d.liveness==="dead",last_status:d.liveness==="dead"?null:p==="error"?"error":p==="done"?"done":null,last_error:null,id:typeof d.id=="string"?d.id:`${d.team_path}#${d.member}`,kind:typeof d.kind=="string"?d.kind.slice(0,16):null,run_state:p,liveness:typeof d.liveness=="string"?d.liveness.slice(0,16):null,started_at:h,last_activity_at:_,busy:f,terminal_held:m,can_prompt:w,cannot_prompt_reason:w?null:typeof d.cannot_prompt_reason=="string"?d.cannot_prompt_reason.slice(0,64):f?"busy":m?"terminal-held":"unavailable-target"})}let a=t??{},l=c=>typeof c=="number"&&Number.isFinite(c)&&c>=0?c:null;for(let[c,d]of[["running",a.running],["dead",a.dead],["idle",a.idle]])for(let u of Array.isArray(d)?d:[]){let f=u;if(typeof f.target!="string"||!f.target.startsWith("/"))continue;let m=qi(f.target);if(!m||s.has(f.target))continue;let p=l(f.idle_ms),_=c==="running"?l(f.running_for_ms):c==="dead"?l(f.age_ms):null,h=c==="idle"&&(f.status==="error"||f.status==="aborted");s.set(f.target,{target:f.target,teamfile:m.teamfile,alias:m.alias,state:c==="idle"?p===null?"unknown":"idle":"busy",idle_seconds:c==="idle"&&p!==null?Math.round(p/1e3):null,model:typeof f.model=="string"?f.model:null,allowed:o(m.teamfile,m.alias),running_seconds:_===null?null:Math.round(_/1e3),stuck:c==="dead",last_status:c==="idle"&&typeof f.status=="string"?f.status.slice(0,32):null,last_error:h&&typeof f.error=="string"&&f.error?St(f.error).slice(0,200):null,id:`${m.teamfile}#${m.alias}`,busy:c!=="idle",terminal_held:!1,can_prompt:c==="idle",cannot_prompt_reason:c==="idle"?null:c==="dead"?"unavailable-target":"busy"})}for(let c of e){if(c.alias===null)continue;let d=`${c.teamfile}:${c.alias}`;s.has(d)||s.set(d,{target:d,teamfile:c.teamfile,alias:c.alias,state:"unknown",idle_seconds:null,model:null,allowed:!0,id:`${c.teamfile}#${c.alias}`,busy:!1,terminal_held:!1,can_prompt:!0,cannot_prompt_reason:null})}return[...s.values()].slice(0,JR)}function tL(t){return t.filter(e=>e.allowed).map(e=>({teamfile:Bi(e.teamfile),path:e.teamfile,alias:e.alias,provider:null,state:e.state,idle_seconds:e.state==="idle"?e.idle_seconds:null,...e.running_seconds!=null?{running_seconds:e.running_seconds}:{},...e.stuck?{stuck:!0}:{},...e.last_status?{last_status:e.last_status}:{},...e.last_error?{last_error:e.last_error}:{},...e.id?{id:e.id}:{},...e.model?{model:e.model}:{},...e.kind?{kind:e.kind}:{},...e.run_state?{run_state:e.run_state}:{},...e.liveness?{liveness:e.liveness}:{},...e.started_at?{started_at:e.started_at}:{},...e.last_activity_at?{last_activity_at:e.last_activity_at}:{},busy:e.busy===!0,terminal_held:e.terminal_held===!0,can_prompt:e.can_prompt!==!1,cannot_prompt_reason:e.can_prompt===!1?e.cannot_prompt_reason??"unavailable-target":null,...e.tmux?.panes?.length?{tmux:e.tmux}:{}}))}function Ql(t,e,n){let r=t.filter(i=>i.allowed&&i.alias===n),s=r.filter(i=>i.teamfile===e);if(s.length===1)return s[0];if(e.includes("/"))return null;let o=r.filter(i=>Bi(i.teamfile)===e);return o.length===1?o[0]:null}function Ff(t){if(t.can_prompt!==!1&&t.busy!==!0&&t.terminal_held!==!0)return null;let e=t.terminal_held?"terminal-held":t.busy?"busy":t.cannot_prompt_reason??"unavailable-target";return{status:409,body:e==="terminal-held"?"session_terminal_held":e==="busy"?"session_busy":"session_unavailable"}}function nL(t){let e={};for(let[n,r]of Object.entries(t))/^LMCTL_(APPKEY|SELF_|INVOCATION_ID|LAUNCH_SOURCE)/.test(n)||n==="LMCTL_SITE_API_URL"||n==="CLAUDECODE"||n.startsWith("CLAUDE_CODE_")||(e[n]=r);return e}function St(t,e=[]){let n=t;for(let r of e)r&&r.length>=6&&(n=n.split(r).join("[redacted-session-id]"));return n.replace(/lmk_[A-Za-z0-9_-]{8,}/g,"[redacted-appkey]").replace(/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]*/g,"[redacted-token]").replace(/\b(Bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi,"$1 [redacted-token]").replace(/\b(?:sk|pk|rk)-[A-Za-z0-9_-]{16,}|\b(?:ghp|gho|ghs|github_pat)_[A-Za-z0-9_]{16,}|\bxox[abprs]-[A-Za-z0-9-]{10,}|\bAKIA[A-Z0-9]{16}\b/g,"[redacted-token]").replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z ]*PRIVATE KEY-----|$)/g,"[redacted-private-key]").replace(/\bAIza[0-9A-Za-z_-]{30,}/g,"[redacted-token]").replace(/\b(session_?id|sessionid)(\s*[=:]\s*"?)[A-Za-z0-9._:-]{6,}/gi,"$1$2[redacted-session-id]").replace(/\b((?:aws_)?secret(?:_access)?_?key|api_?key|access_?token|refresh_?token|client_?secret|password|passwd|secret|token)(\s*[=:]\s*["']?)[^\s"',;]{8,}/gi,"$1$2[redacted-secret]").replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi,"[redacted-id]").replace(/\b[a-f0-9]{40,}\b/gi,"[redacted-token]")}function Tw(t){let e=t??{};if(e.role!=="system")return!1;let n=e.content;if(n&&typeof n=="object"&&HR.has(String(n.type)))return!0;if(typeof n!="string"||!n.trimStart().startsWith("{"))return!1;try{return HR.has(String(JSON.parse(n).type))}catch{return!1}}function Hf(t){let e=t??{};if(!e.usage||typeof e.usage!="object"||!e.cost||typeof e.cost!="object")return{};let n=e.usage,r=e.cost;return{usage:{response_ids:Array.isArray(n.response_ids)?n.response_ids.filter(s=>typeof s=="string").slice(0,50).map(s=>s.slice(0,80)):[],responses:kn(n.responses)??0,model:bo(n.model,120),input:kn(n.input),output:kn(n.output),cache_read:kn(n.cache_read),cache_write:kn(n.cache_write),...n.cache_write_5m!==void 0?{cache_write_5m:kn(n.cache_write_5m)}:{},...n.cache_write_1h!==void 0?{cache_write_1h:kn(n.cache_write_1h)}:{},...n.reasoning!==void 0?{reasoning:kn(n.reasoning)}:{}},cost:{total:kn(r.total),currency:"USD",model:bo(r.model,120),price_route:bo(r.price_route),rates_source:bo(r.rates_source,20),rates_generated_at:bo(r.rates_generated_at,40),unknown_reason:bo(r.unknown_reason,300),...r.estimated===!0?{estimated:!0}:{},breakdown:(Array.isArray(r.breakdown)?r.breakdown:[]).filter(s=>s&&gz.has(s.type??"")).slice(0,8).map(s=>{let o=s;return{type:o.type,tokens:kn(o.tokens),rate_per_mtok:kn(o.rate_per_mtok),usd:kn(o.usd),...o.included_in==="output"?{included_in:"output"}:{}}})}}}function sL(t,e){let n=e??{},r=typeof n.sessionId=="string"?[n.sessionId]:[],s=(Array.isArray(n.messages)?n.messages:[]).filter(i=>!Tw(i)).map(i=>{let a=i??{},l=typeof a.content=="string"?a.content:JSON.stringify(a.content??""),c=St(l,r);return{role:typeof a.role=="string"?a.role:"other",timestamp:typeof a.timestamp=="string"?a.timestamp:null,model:typeof a.model=="string"?a.model:null,text:c.slice(0,jf),clipped:c.length>jf,...Hf(i)}}),o=n.truncated===!0;for(;s.length&&Buffer.byteLength(JSON.stringify(s))>KR;)s.shift(),o=!0;return{schema:qf,target:t,provider:typeof n.provider=="string"?n.provider:null,truncated:o,...rL(e?.usage_coverage),messages:s}}function oL(t,e){let n=e??{},r=typeof n.sessionId=="string"?[n.sessionId]:[],s=d=>typeof d=="string"&&/^c1\.[0-9a-z.]{1,60}$/.test(d),o=[],i=s(n.next_cursor)?n.next_cursor:null,a=!1,l=2;for(let d of Array.isArray(n.messages)?n.messages:[]){if(Tw(d))continue;let u=d??{},f=St(typeof u.content=="string"?u.content:JSON.stringify(u.content??""),r),m={role:typeof u.role=="string"?u.role:"other",timestamp:typeof u.timestamp=="string"?u.timestamp:null,model:typeof u.model=="string"?u.model:null,tool:typeof u.toolName=="string"?u.toolName.slice(0,80):null,text:f.slice(0,jf),clipped:f.length>jf,cursor:s(u.cursor)?u.cursor:null,...Hf(d)},p=Buffer.byteLength(JSON.stringify(m))+1;if(o.length&&l+p>KR){a=!0,i=o[o.length-1].cursor??i;break}l+=p,o.push(m)}let c=(Array.isArray(e?.updates)?e.updates:[]).slice(0,20).filter(d=>s(d?.cursor)).map(d=>({cursor:d.cursor,...Hf(d)})).filter(d=>d.cost);return{schema:qf,target:t,provider:typeof n.provider=="string"?n.provider:null,live:!0,reset:n.reset===!0,truncated:n.truncated===!0,more:a,next_cursor:i,...rL(e?.usage_coverage),...c.length?{updates:c}:{},messages:o}}function vw(t){if(t==null||t==="")return null;if(typeof t!="string"||t.length>64)return"invalid";let e=/^([0-9T:.+\-Z]{10,40})\|(\d{1,4})$/.exec(t);return!e||Number.isNaN(Date.parse(e[1]))?"invalid":{ts:e[1],seen:Number(e[2])}}function iL(t,e){if(!e)return t;let n=Date.parse(e.ts),r=e.seen;return t.filter(s=>{let o=s.timestamp?Date.parse(s.timestamp):NaN;return Number.isNaN(o)||o<n?!1:o===n&&r>0?(r--,!1):!0})}function aL(t,e){let n=t.filter(i=>i.timestamp&&!Number.isNaN(Date.parse(i.timestamp)));if(!n.length)return e?`${e.ts}|${e.seen}`:null;let r=n[n.length-1].timestamp,s=Date.parse(r),o=n.filter(i=>Date.parse(i.timestamp)===s).length;return e&&Date.parse(e.ts)===s&&(o+=e.seen),`${r}|${o}`}function Bf(t,e){let n=[],r=[];for(let s=0;s<t.length;s++){if(t[s]!==e){r.push(t[s]);continue}let o=t[s+1];if(o===void 0||o.startsWith("--"))return{error:`missing value for ${e}`};n.push(o),s++}return{values:n,rest:r}}async function lL(t,e,n=Date.now){let r=ce(t,["--targets-file","--text-file","--since","--total-ms","--per-session-ms","--per-session-bytes"],["--json"]);if(r.error||r.positionals.length)return O(e,r.error??"usage: lmctl site search-local --targets-file F --text-file T [--since ISO]");let s,o;try{s=JSON.parse(tc(F(r,"--targets-file")??"","utf8")),o=tc(F(r,"--text-file")??"","utf8")}catch{return O(e,"lmctl site search-local: cannot read the targets or the text")}let i=F(r,"--since"),a=i?new Date(i):void 0,l=Math.min(Number(F(r,"--total-ms")??Ls.totalMs),6e4),c=Math.min(Number(F(r,"--per-session-ms")??Ls.perSessionMs),1e4),d=Math.min(Number(F(r,"--per-session-bytes")??Ls.perSessionBytes),32*1024*1024),u=n(),f=[];for(let m of s.slice(0,JR)){let p={target:`${m.teamfile}:${m.alias}`,teamfile:m.teamfile,alias:m.alias,provider:null,reader:null,hits:[],scanned_bytes:0,file_bytes:0,complete:!1,stopped:null,skipped:null};if(n()-u>=l){f.push({...p,skipped:"time_cap"});continue}try{let _=await G(e,g=>lt(m.teamfile,m.alias,g)).catch(()=>{let g=Fe(m.teamfile).members.find(w=>w.alias===m.alias);if(!g?.session)throw new Error("unresolved");return{provider:g.provider,sessionid:g.session}});if(!_.sessionid){f.push({...p,skipped:"no_session"});continue}let h=await gN(_.sessionid,_.provider,o,{maxBytes:d,deadline:Math.min(n()+c,u+l),maxHits:Ls.hitsPerSession,since:a,now:n,redact:g=>St(g)});if(!h){f.push({...p,provider:_.provider,skipped:"transcript_not_found"});continue}f.push({...p,provider:_.provider,reader:h.reader,hits:h.hits.map(g=>({role:g.role,timestamp:g.timestamp,snippet:g.snippet})),scanned_bytes:h.scanned_bytes,file_bytes:h.file_bytes,complete:h.complete,stopped:h.stopped})}catch{f.push({...p,skipped:"unreadable"})}}return Y(e,{schema:ww,elapsed_ms:n()-u,results:f}),0}function hw(t,e=!1){let n=[];for(let r of t?.providers??[])if(!(typeof r.provider!="string"||r.status!=="ok"||!/^[a-z]{2,16}$/.test(r.provider)))for(let s of r.models??[])typeof s.id=="string"&&hz.test(s.id)&&n.push({provider:r.provider,model:s.id});return e&&n.push({provider:"ClaudeMock",model:"claude-mock"}),n.slice(0,60)}function cL(t,e,n){return`_TEAM_ name=${t}
2266
+ `).reverse())try{let n=JSON.parse(e);if(n&&(n.status==="error"||n.status==="failed")&&typeof(n.message??n.error)=="string")return String(n.message??n.error)}catch{}return null}function eL(t,e,n,r,s=ec.outputBytes){return new Promise(o=>{let i=Date.now(),a={out:{chunks:[],bytes:0,kept:0},err:{chunks:[],bytes:0,kept:0}},l=(_,h)=>{if(_.bytes+=h.length,_.kept<s){let g=h.subarray(0,s-_.kept);_.chunks.push(g),_.kept+=g.length}},c=!1,d=!1,u=(_,h,g)=>{d||(d=!0,clearTimeout(p),o({exit_code:_,signal:h,timed_out:c,stdout:Buffer.concat(a.out.chunks).toString(),stderr:Buffer.concat(a.err.chunks).toString(),stdout_bytes:a.out.bytes,stderr_bytes:a.err.bytes,stdout_truncated:a.out.bytes>s,stderr_truncated:a.err.bytes>s,started_at:new Date(i).toISOString(),ended_at:new Date().toISOString(),duration_ms:Date.now()-i,...g?{spawn_error:g}:{}}))},f=qR("bash",["-lc",t],{cwd:e,env:r,detached:!0,stdio:["ignore","pipe","pipe"]}),m=()=>{try{f.pid&&process.kill(-f.pid,"SIGKILL")}catch{}},p=setTimeout(()=>{c=!0,m()},n);f.stdout.on("data",_=>l(a.out,_)),f.stderr.on("data",_=>l(a.err,_)),f.on("error",_=>u(null,null,_.message)),f.on("exit",()=>setTimeout(m,300)),f.on("close",(_,h)=>u(_,h))})}async function mw(t,e){await Zl(Ze(t,".."),{recursive:!0,mode:448}),await az(t,`${JSON.stringify(e)}
2267
+ `,{mode:384}),await lz(t,384)}function Gf(t){let e=t;if(typeof t=="string")try{let r=JSON.parse(t);e=r?.detail??(typeof r?.error=="string"?r:null)}catch{return null}if(!e||typeof e!="object"||typeof e.error!="string")return null;let n=(r,s)=>s==null||s===""?[]:[`${r}: ${s}`];return[...n("error",e.error),...n("message",e.message),...n("exit code",e.exit_code),...n("signal",e.signal),...e.timed_out?["timed out: yes"]:[],...n("command",e.command),...n("started",e.started_at),...n("ended",e.ended_at),...n("duration",typeof e.duration_ms=="number"?`${e.duration_ms} ms`:null),...n("site",e.site),...n("job",e.job_id),...e.stdout_tail?["--- stdout (tail)",String(e.stdout_tail).replace(/\n$/,"")]:[],...e.stderr_tail?["--- stderr (tail)",String(e.stderr_tail).replace(/\n$/,"")]:[]].join(`
2268
+ `)}function cn(t,e,n,r){let s=n instanceof rc?n.run:null,o={error:e,message:St(Ne(n)).slice(0,4e3),exit_code:s?.exit_code??null,signal:s?.signal??null,timed_out:s?.timed_out??!1,command:s?St(s.command.join(" ")).slice(0,2e3):null,stdout_tail:s?St(Wf(s.stdout_tail)):null,stderr_tail:s?St(Wf(s.stderr_tail)):null,started_at:s?.started_at??null,ended_at:s?.ended_at??new Date(r.now).toISOString(),duration_ms:s?.duration_ms??null,site:r.site,job_id:r.job};return{status:t,headers:{"content-type":"application/json"},body:JSON.stringify({error:e,detail:o})}}function Ew(t,e){return t.map(n=>{let r=n.lastIndexOf(":"),s=r>0&&Xf.test(n.slice(r+1))?n.slice(r+1):null;return{teamfile:gw(e,s===null?n:n.slice(0,r)),alias:s}})}function qi(t){let e=t.lastIndexOf(":");if(e<=0)return null;let n=t.slice(e+1);return Xf.test(n)?{teamfile:t.slice(0,e),alias:n}:null}function pw(t,e,n,r=Date.now()){let s=new Map,o=(c,d)=>n||!e.length||e.some(u=>u.teamfile===c&&(u.alias===null||u.alias===d)),i=t??{};if(Array.isArray(i.sessions))for(let c of i.sessions){let d=c??{};if(typeof d.team_path!="string"||!d.team_path.startsWith("/")||typeof d.member!="string"||!Xf.test(d.member))continue;let u=`${d.team_path}:${d.member}`;if(s.has(u))continue;let f=d.busy===!0,m=d.terminal_held===!0,p=typeof d.state=="string"?d.state.slice(0,16):null,_=WR(d.last_activity_at),h=WR(d.started_at),g=!f&&_?Math.max(0,Math.round((r-Date.parse(_))/1e3)):null,w=d.can_prompt===!0&&!f&&!m;s.set(u,{target:u,teamfile:d.team_path,alias:d.member,state:f?"busy":g===null?"unknown":"idle",idle_seconds:g,model:typeof d.model=="string"?d.model.slice(0,128):null,allowed:o(d.team_path,d.member),running_seconds:(f||d.liveness==="dead")&&h?Math.max(0,Math.round((r-Date.parse(h))/1e3)):null,stuck:d.liveness==="dead",last_status:d.liveness==="dead"?null:p==="error"?"error":p==="done"?"done":null,last_error:null,id:typeof d.id=="string"?d.id:`${d.team_path}#${d.member}`,kind:typeof d.kind=="string"?d.kind.slice(0,16):null,run_state:p,liveness:typeof d.liveness=="string"?d.liveness.slice(0,16):null,started_at:h,last_activity_at:_,busy:f,terminal_held:m,can_prompt:w,cannot_prompt_reason:w?null:typeof d.cannot_prompt_reason=="string"?d.cannot_prompt_reason.slice(0,64):f?"busy":m?"terminal-held":"unavailable-target"})}let a=t??{},l=c=>typeof c=="number"&&Number.isFinite(c)&&c>=0?c:null;for(let[c,d]of[["running",a.running],["dead",a.dead],["idle",a.idle]])for(let u of Array.isArray(d)?d:[]){let f=u;if(typeof f.target!="string"||!f.target.startsWith("/"))continue;let m=qi(f.target);if(!m||s.has(f.target))continue;let p=l(f.idle_ms),_=c==="running"?l(f.running_for_ms):c==="dead"?l(f.age_ms):null,h=c==="idle"&&(f.status==="error"||f.status==="aborted");s.set(f.target,{target:f.target,teamfile:m.teamfile,alias:m.alias,state:c==="idle"?p===null?"unknown":"idle":"busy",idle_seconds:c==="idle"&&p!==null?Math.round(p/1e3):null,model:typeof f.model=="string"?f.model:null,allowed:o(m.teamfile,m.alias),running_seconds:_===null?null:Math.round(_/1e3),stuck:c==="dead",last_status:c==="idle"&&typeof f.status=="string"?f.status.slice(0,32):null,last_error:h&&typeof f.error=="string"&&f.error?St(f.error).slice(0,200):null,id:`${m.teamfile}#${m.alias}`,busy:c!=="idle",terminal_held:!1,can_prompt:c==="idle",cannot_prompt_reason:c==="idle"?null:c==="dead"?"unavailable-target":"busy"})}for(let c of e){if(c.alias===null)continue;let d=`${c.teamfile}:${c.alias}`;s.has(d)||s.set(d,{target:d,teamfile:c.teamfile,alias:c.alias,state:"unknown",idle_seconds:null,model:null,allowed:!0,id:`${c.teamfile}#${c.alias}`,busy:!1,terminal_held:!1,can_prompt:!0,cannot_prompt_reason:null})}return[...s.values()].slice(0,JR)}function tL(t){return t.filter(e=>e.allowed).map(e=>({teamfile:Bi(e.teamfile),path:e.teamfile,alias:e.alias,provider:null,state:e.state,idle_seconds:e.state==="idle"?e.idle_seconds:null,...e.running_seconds!=null?{running_seconds:e.running_seconds}:{},...e.stuck?{stuck:!0}:{},...e.last_status?{last_status:e.last_status}:{},...e.last_error?{last_error:e.last_error}:{},...e.id?{id:e.id}:{},...e.model?{model:e.model}:{},...e.kind?{kind:e.kind}:{},...e.run_state?{run_state:e.run_state}:{},...e.liveness?{liveness:e.liveness}:{},...e.started_at?{started_at:e.started_at}:{},...e.last_activity_at?{last_activity_at:e.last_activity_at}:{},busy:e.busy===!0,terminal_held:e.terminal_held===!0,can_prompt:e.can_prompt!==!1,cannot_prompt_reason:e.can_prompt===!1?e.cannot_prompt_reason??"unavailable-target":null,...e.tmux?.panes?.length?{tmux:e.tmux}:{}}))}function Ql(t,e,n){let r=t.filter(i=>i.allowed&&i.alias===n),s=r.filter(i=>i.teamfile===e);if(s.length===1)return s[0];if(e.includes("/"))return null;let o=r.filter(i=>Bi(i.teamfile)===e);return o.length===1?o[0]:null}function Ff(t){if(t.can_prompt!==!1&&t.busy!==!0&&t.terminal_held!==!0)return null;let e=t.terminal_held?"terminal-held":t.busy?"busy":t.cannot_prompt_reason??"unavailable-target";return{status:409,body:e==="terminal-held"?"session_terminal_held":e==="busy"?"session_busy":"session_unavailable"}}function nL(t){let e={};for(let[n,r]of Object.entries(t))/^LMCTL_(APPKEY|SELF_|INVOCATION_ID|LAUNCH_SOURCE)/.test(n)||n==="LMCTL_SITE_API_URL"||n==="CLAUDECODE"||n.startsWith("CLAUDE_CODE_")||(e[n]=r);return e}function St(t,e=[]){let n=t;for(let r of e)r&&r.length>=6&&(n=n.split(r).join("[redacted-session-id]"));return n.replace(/lmk_[A-Za-z0-9_-]{8,}/g,"[redacted-appkey]").replace(/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]*/g,"[redacted-token]").replace(/\b(Bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi,"$1 [redacted-token]").replace(/\b(?:sk|pk|rk)-[A-Za-z0-9_-]{16,}|\b(?:ghp|gho|ghs|github_pat)_[A-Za-z0-9_]{16,}|\bxox[abprs]-[A-Za-z0-9-]{10,}|\bAKIA[A-Z0-9]{16}\b/g,"[redacted-token]").replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z ]*PRIVATE KEY-----|$)/g,"[redacted-private-key]").replace(/\bAIza[0-9A-Za-z_-]{30,}/g,"[redacted-token]").replace(/\b(session_?id|sessionid)(\s*[=:]\s*"?)[A-Za-z0-9._:-]{6,}/gi,"$1$2[redacted-session-id]").replace(/\b((?:aws_)?secret(?:_access)?_?key|api_?key|access_?token|refresh_?token|client_?secret|password|passwd|secret|token)(\s*[=:]\s*["']?)[^\s"',;]{8,}/gi,"$1$2[redacted-secret]").replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi,"[redacted-id]").replace(/\b[a-f0-9]{40,}\b/gi,"[redacted-token]")}function Tw(t){let e=t??{};if(e.role!=="system")return!1;let n=e.content;if(n&&typeof n=="object"&&HR.has(String(n.type)))return!0;if(typeof n!="string"||!n.trimStart().startsWith("{"))return!1;try{return HR.has(String(JSON.parse(n).type))}catch{return!1}}function Hf(t){let e=t??{};if(!e.usage||typeof e.usage!="object"||!e.cost||typeof e.cost!="object")return{};let n=e.usage,r=e.cost;return{usage:{response_ids:Array.isArray(n.response_ids)?n.response_ids.filter(s=>typeof s=="string").slice(0,50).map(s=>s.slice(0,80)):[],responses:kn(n.responses)??0,model:bo(n.model,120),input:kn(n.input),output:kn(n.output),cache_read:kn(n.cache_read),cache_write:kn(n.cache_write),...n.cache_write_5m!==void 0?{cache_write_5m:kn(n.cache_write_5m)}:{},...n.cache_write_1h!==void 0?{cache_write_1h:kn(n.cache_write_1h)}:{},...n.reasoning!==void 0?{reasoning:kn(n.reasoning)}:{}},cost:{total:kn(r.total),currency:"USD",model:bo(r.model,120),price_route:bo(r.price_route),rates_source:bo(r.rates_source,20),rates_generated_at:bo(r.rates_generated_at,40),unknown_reason:bo(r.unknown_reason,300),...r.estimated===!0?{estimated:!0}:{},breakdown:(Array.isArray(r.breakdown)?r.breakdown:[]).filter(s=>s&&_z.has(s.type??"")).slice(0,8).map(s=>{let o=s;return{type:o.type,tokens:kn(o.tokens),rate_per_mtok:kn(o.rate_per_mtok),usd:kn(o.usd),...o.included_in==="output"?{included_in:"output"}:{}}})}}}function sL(t,e){let n=e??{},r=typeof n.sessionId=="string"?[n.sessionId]:[],s=(Array.isArray(n.messages)?n.messages:[]).filter(i=>!Tw(i)).map(i=>{let a=i??{},l=typeof a.content=="string"?a.content:JSON.stringify(a.content??""),c=St(l,r);return{role:typeof a.role=="string"?a.role:"other",timestamp:typeof a.timestamp=="string"?a.timestamp:null,model:typeof a.model=="string"?a.model:null,text:c.slice(0,jf),clipped:c.length>jf,...Hf(i)}}),o=n.truncated===!0;for(;s.length&&Buffer.byteLength(JSON.stringify(s))>KR;)s.shift(),o=!0;return{schema:qf,target:t,provider:typeof n.provider=="string"?n.provider:null,truncated:o,...rL(e?.usage_coverage),messages:s}}function oL(t,e){let n=e??{},r=typeof n.sessionId=="string"?[n.sessionId]:[],s=d=>typeof d=="string"&&/^c1\.[0-9a-z.]{1,60}$/.test(d),o=[],i=s(n.next_cursor)?n.next_cursor:null,a=!1,l=2;for(let d of Array.isArray(n.messages)?n.messages:[]){if(Tw(d))continue;let u=d??{},f=St(typeof u.content=="string"?u.content:JSON.stringify(u.content??""),r),m={role:typeof u.role=="string"?u.role:"other",timestamp:typeof u.timestamp=="string"?u.timestamp:null,model:typeof u.model=="string"?u.model:null,tool:typeof u.toolName=="string"?u.toolName.slice(0,80):null,text:f.slice(0,jf),clipped:f.length>jf,cursor:s(u.cursor)?u.cursor:null,...Hf(d)},p=Buffer.byteLength(JSON.stringify(m))+1;if(o.length&&l+p>KR){a=!0,i=o[o.length-1].cursor??i;break}l+=p,o.push(m)}let c=(Array.isArray(e?.updates)?e.updates:[]).slice(0,20).filter(d=>s(d?.cursor)).map(d=>({cursor:d.cursor,...Hf(d)})).filter(d=>d.cost);return{schema:qf,target:t,provider:typeof n.provider=="string"?n.provider:null,live:!0,reset:n.reset===!0,truncated:n.truncated===!0,more:a,next_cursor:i,...rL(e?.usage_coverage),...c.length?{updates:c}:{},messages:o}}function vw(t){if(t==null||t==="")return null;if(typeof t!="string"||t.length>64)return"invalid";let e=/^([0-9T:.+\-Z]{10,40})\|(\d{1,4})$/.exec(t);return!e||Number.isNaN(Date.parse(e[1]))?"invalid":{ts:e[1],seen:Number(e[2])}}function iL(t,e){if(!e)return t;let n=Date.parse(e.ts),r=e.seen;return t.filter(s=>{let o=s.timestamp?Date.parse(s.timestamp):NaN;return Number.isNaN(o)||o<n?!1:o===n&&r>0?(r--,!1):!0})}function aL(t,e){let n=t.filter(i=>i.timestamp&&!Number.isNaN(Date.parse(i.timestamp)));if(!n.length)return e?`${e.ts}|${e.seen}`:null;let r=n[n.length-1].timestamp,s=Date.parse(r),o=n.filter(i=>Date.parse(i.timestamp)===s).length;return e&&Date.parse(e.ts)===s&&(o+=e.seen),`${r}|${o}`}function Bf(t,e){let n=[],r=[];for(let s=0;s<t.length;s++){if(t[s]!==e){r.push(t[s]);continue}let o=t[s+1];if(o===void 0||o.startsWith("--"))return{error:`missing value for ${e}`};n.push(o),s++}return{values:n,rest:r}}async function lL(t,e,n=Date.now){let r=ce(t,["--targets-file","--text-file","--since","--total-ms","--per-session-ms","--per-session-bytes"],["--json"]);if(r.error||r.positionals.length)return O(e,r.error??"usage: lmctl site search-local --targets-file F --text-file T [--since ISO]");let s,o;try{s=JSON.parse(tc(F(r,"--targets-file")??"","utf8")),o=tc(F(r,"--text-file")??"","utf8")}catch{return O(e,"lmctl site search-local: cannot read the targets or the text")}let i=F(r,"--since"),a=i?new Date(i):void 0,l=Math.min(Number(F(r,"--total-ms")??Ls.totalMs),6e4),c=Math.min(Number(F(r,"--per-session-ms")??Ls.perSessionMs),1e4),d=Math.min(Number(F(r,"--per-session-bytes")??Ls.perSessionBytes),32*1024*1024),u=n(),f=[];for(let m of s.slice(0,JR)){let p={target:`${m.teamfile}:${m.alias}`,teamfile:m.teamfile,alias:m.alias,provider:null,reader:null,hits:[],scanned_bytes:0,file_bytes:0,complete:!1,stopped:null,skipped:null};if(n()-u>=l){f.push({...p,skipped:"time_cap"});continue}try{let _=await G(e,g=>lt(m.teamfile,m.alias,g)).catch(()=>{let g=Fe(m.teamfile).members.find(w=>w.alias===m.alias);if(!g?.session)throw new Error("unresolved");return{provider:g.provider,sessionid:g.session}});if(!_.sessionid){f.push({...p,skipped:"no_session"});continue}let h=await gN(_.sessionid,_.provider,o,{maxBytes:d,deadline:Math.min(n()+c,u+l),maxHits:Ls.hitsPerSession,since:a,now:n,redact:g=>St(g)});if(!h){f.push({...p,provider:_.provider,skipped:"transcript_not_found"});continue}f.push({...p,provider:_.provider,reader:h.reader,hits:h.hits.map(g=>({role:g.role,timestamp:g.timestamp,snippet:g.snippet})),scanned_bytes:h.scanned_bytes,file_bytes:h.file_bytes,complete:h.complete,stopped:h.stopped})}catch{f.push({...p,skipped:"unreadable"})}}return Y(e,{schema:ww,elapsed_ms:n()-u,results:f}),0}function hw(t,e=!1){let n=[];for(let r of t?.providers??[])if(!(typeof r.provider!="string"||r.status!=="ok"||!/^[a-z]{2,16}$/.test(r.provider)))for(let s of r.models??[])typeof s.id=="string"&&pz.test(s.id)&&n.push({provider:r.provider,model:s.id});return e&&n.push({provider:"ClaudeMock",model:"claude-mock"}),n.slice(0,60)}function cL(t,e,n){return`_TEAM_ name=${t}
2270
2269
  _MEMBER_ alias=Lead provider=${e}${e==="ClaudeMock"?"":` model=${n}`}
2271
- `}async function Uf(t){try{let e=JSON.parse(await uz(t,"utf8"));return Array.isArray(e?.sessions)?e.sessions:[]}catch{return[]}}async function BR(t,e){await Zl(Ze(t,".."),{recursive:!0,mode:448});let n=`${t}.${process.pid}.tmp`;await Yl(n,`${JSON.stringify({schema:"lmctl-site-new-sessions/1",sessions:e},null,2)}
2270
+ `}async function Uf(t){try{let e=JSON.parse(await dz(t,"utf8"));return Array.isArray(e?.sessions)?e.sessions:[]}catch{return[]}}async function BR(t,e){await Zl(Ze(t,".."),{recursive:!0,mode:448});let n=`${t}.${process.pid}.tmp`;await Yl(n,`${JSON.stringify({schema:"lmctl-site-new-sessions/1",sessions:e},null,2)}
2272
2271
  `,{mode:384}),await GR(n,t)}async function Sw(t,e,n){let r=Bf(t,"--allow");if("error"in r)return O(e,`${r.error}
2273
2272
  ${ve}`);let s=Bf(r.rest,"--new-session-root");if("error"in s)return O(e,`${s.error}
2274
2273
  ${ve}`);let o={values:r.values,rest:s.rest},i=ce(o.rest,["--name","--interval","--org","--since","--new-session-cap"],["--allow-tracked","--once","--allow-shell"]);if(i.error)return O(e,`${i.error}
2275
2274
  ${ve}`);let a=e.env??process.env,l=F(i,"--name")??"";if(!Pr.test(l))return O(e,"lmctl site serve: --name must be 1-53 characters [A-Za-z0-9._-], starting with a letter or digit");let c=Ew(o.values,e.cwd??process.cwd());if(i.positionals.length)return O(e,ve);let d=z(i,"--allow-tracked"),u=F(i,"--org");if(u!==void 0&&!Cs.test(u))return O(e,"lmctl site serve: --org must be an organization id (lmctl site orgs)");let f=F(i,"--since")??"24h";if(!/^(\d{1,4}[mhd]|\d{4}-\d{2}-\d{2}T[0-9:.]+Z)$/.test(f))return O(e,"lmctl site serve: --since must be a duration such as 24h or an ISO 8601 UTC time");let m=Number(F(i,"--interval")??60);if(!Number.isFinite(m)||m<30||m>240)return O(e,"lmctl site serve: --interval must be 30-240 seconds (reports expire after 5 minutes)");let p=a.HOME||_w(),_=(s.values.length?s.values:[Ze(p,".local/state/lmctl-site/sessions")]).map(j=>gw(e.cwd??process.cwd(),j));if(_.some(j=>!j.startsWith("/")||j==="/"||j.includes("\0")))return O(e,"lmctl site serve: --new-session-root must be an absolute directory other than /");let h=Number(F(i,"--new-session-cap")??0);if(!Number.isSafeInteger(h)||h<0||h>50)return O(e,"lmctl site serve: --new-session-cap must be 0-50 per hour");let g=Ze(p,".local/state/lmctl-site/new-sessions.json"),w=z(i,"--allow-shell")||a.LMCTL_SITE_ALLOW_SHELL==="1",y=Ze(p,".lmctl","site-shell-audit.jsonl"),E=!1,T=n.tmux??DR(a),v=n.proc??OR(),b=cr(e,n);if(!b)return O(e,dr);let k=`site-${l}`,I=j=>e.stderr.write(`${new Date(n.now()).toISOString()} site ${l}: ${j}
2276
- `);try{await b.call("POST","/v1/mailboxes",{name:k,...u?{org:u}:{}})}catch(j){return j instanceof An&&j.code==="name_taken"?O(e,`lmctl site serve: the name ${l} is taken by another account or organization; choose another --name`):j instanceof An&&j.code==="org_not_found"?O(e,`lmctl site serve: you are not an owner of organization ${u}`):O(e,`lmctl site serve: cannot create the relay mailbox: ${Ne(j)}`)}I(`serving ${b.base} for ${u?`organization ${u}`:"your personal organization"} (relay mailbox ${k}); sessions: lmctl running --json --since ${f}; offered: ${c.length&&!d?`only ${c.map(j=>j.alias?`${j.teamfile}:${j.alias}`:j.teamfile).join(", ")}`:"every session"} (prompted only while lmctl says can_prompt)`);let N=[],A=nL(a),S={...A,LMCTL_READ_ONLY:"1"},x={...A};delete x.LMCTL_READ_ONLY;let R=3e4,L=new Map,D=new Map,M=(j,X,K)=>{D.get(j)!==X&&(D.set(j,X),I(`tmux: ${K}`))},P=null;function W(){return P||(P=$().finally(()=>{P=null})),P}async function $(){let j=N;try{let K=await n.lmctl(["running","--json","--since",f],{timeoutMs:3e4,env:S});j=pw(JSON.parse(K),c,d,n.now())}catch(K){I(`lmctl running failed: ${Ne(K)}`),j=[...N]}if(h)for(let K of await Uf(g))K.archived_at||j.some(q=>q.teamfile===K.teamfile&&q.alias===K.alias)||j.push({target:`${K.teamfile}:${K.alias}`,teamfile:K.teamfile,alias:K.alias,state:"unknown",idle_seconds:null,model:K.model,allowed:!0,id:`${K.teamfile}#${K.alias}`,busy:!1,terminal_held:!1,can_prompt:!0,cannot_prompt_reason:null});let X=j.filter(K=>K.terminal_held===!0);for(let K of[...L.keys()])X.some(q=>`${q.teamfile}:${q.alias}`===K)||(L.delete(K),D.delete(K));if(X.length){let K=await Pf(T),q=new Map,de=K.error?`tmux did not answer (${K.error})`:"no tmux pane runs its lmctl terminal";if(!K.error)try{q=await $f(X.map(ne=>({teamfile:ne.teamfile,alias:ne.alias})),K.panes,v)}catch(ne){de=`the association failed (${Ne(ne)})`}let ge=n.now();for(let ne of X){let Z=`${ne.teamfile}:${ne.alias}`,Te=`${Bi(ne.teamfile)}:${ne.alias}`,we=q.get(Z);if(we?.length){let ae=we.map(({pid:Re,...tt})=>tt);ne.tmux={panes:ae},L.set(Z,{panes:ae,at:ge}),M(Z,`found ${ae.map(Re=>Re.target).join(",")}`,`${Te} is in ${ae.map(Re=>Re.target).join(", ")}`)}else{let ae=L.get(Z);ae&&ge-ae.at<=R?(ne.tmux={panes:ae.panes,stale:!0,checked_at:new Date(ae.at).toISOString()},M(Z,"stale",`${Te}: pane not found now (${de}); keeping ${ae.panes[0].target} from ${Math.round((ge-ae.at)/1e3)} s ago`)):(ne.tmux=null,M(Z,"missing",`${Te}: no pane (${de})`))}}}N=j}let pe=[],J=0;async function fe(){if(!(!h||n.now()-J<36e5)){J=n.now();try{pe=hw(JSON.parse(await n.lmctl(["models","--json"],{timeoutMs:6e4,env:S})),a.LMCTL_ENABLE_MOCK_PROVIDER==="1")}catch(j){pe=a.LMCTL_ENABLE_MOCK_PROVIDER==="1"?hw(null,!0):[],I(`lmctl models failed: ${Ne(j)}`)}}}async function Se(){if(!h)return;await fe();let j=n.now()-36e5,X=(await Uf(g)).filter(K=>Date.parse(K.created_at)>j).length;return{roots:_,models:pe,cap_per_hour:h,created_last_hour:X}}let qe=0,ut="",qr=0,Bn=!1,H=0,V=()=>JSON.stringify(N.filter(j=>j.allowed).map(j=>[j.target,j.busy===!0,j.terminal_held===!0,j.can_prompt!==!1]).sort());async function _e(j=!1,X=!1,K=!1){for(let q=0;q<2;q++){let de={schema:nc,host:mz(),stopped:j,sessions:j?[]:N},ge=j?void 0:await Se(),ne=V();try{let Te=(await b.call("POST","/api/running/report",{device_id:l,...u?{org:u}:{},payload:de,targets:j?[]:tL(N),...ge?{new_session:ge}:{},...w&&!j?{shell:{enabled:!0,home:p}}:{},...X?{state_change:!0}:{}},!j)).json?.quick_check_s,we=typeof Te=="number"&&Number.isInteger(Te)&&Te>=2&&Te<=60?Te:0;return we!==qe&&I(we?`a queued prompt waits here: checking sessions every ${we} s`:"no queued prompt waits here: back to the report interval"),qe=we,ut=ne,qr=n.now(),Bn=!0,H=0,!0}catch(Z){if(X&&K&&q===0&&Z instanceof An&&Z.status===429){if(await n.sleep(3500,n.signal),n.signal?.aborted)return!1;continue}if(X&&Z instanceof An&&Z.status===429)return!1;if(!j&&Bn&&Z instanceof An&&Z.status===429)return H=n.now()+21e3,!1;if(q===0&&Z instanceof An&&Z.status===429){if(await n.sleep(21e3,j?void 0:n.signal),!j&&n.signal?.aborted)return!1;continue}return I(`report failed: ${Ne(Z)}`),!1}}return!1}async function We(j){let X=j.request??{};if(X.op==="new_session")return Gm(j,X);if(X.op==="search")return fa(j,X);if(X.op==="shell")return Yt(j,X);if(X.op==="tmux_send")return $c(j,X);if(X.op==="report_now"){await W();let re=await _e(!1,!0,!0);return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:"lmctl-site-report/1",reported:re,quick_check_s:qe})}}if(X.op==="archive_session")return Jm(j,X);let K,q,de,ge,ne,Z,Te;if(typeof X.op=="string")({op:K,teamfile:q,alias:de,text:ge,lines:ne}=X),Z=X.since,Te=X.tools,typeof X.path=="string"&&X.path.startsWith("/")&&(q=X.path);else if(X.method==="POST"&&X.path==="/prompt"){let re={};try{re=typeof X.body=="string"?JSON.parse(X.body):X.body??{}}catch{return{status:400,body:"invalid_body"}}K="prompt";let Me=typeof re.target=="string"?qi(re.target):null;q=Me?.teamfile,de=Me?.alias,ge=re.text}else if(X.method==="POST"&&X.path==="/tail"){let re={};try{re=typeof X.body=="string"?JSON.parse(X.body):X.body??{}}catch{return{status:400,body:"invalid_body"}}K="tail";let Me=typeof re.target=="string"?qi(re.target):null;q=Me?.teamfile,de=Me?.alias,ne=re.lines,Z=re.since,Te=re.tools}else return X.method==="GET"&&X.path==="/sessions"?{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:nc,sessions:N})}:{status:400,body:"invalid_op"};if(K!=="prompt"&&K!=="idle"&&K!=="tail"&&K!=="live_tail")return{status:400,body:"invalid_op"};let we=(re,Me,Ke)=>cn(re,Me,Ke,{job:j.id,site:l,now:n.now()});if(typeof q!="string"||typeof de!="string"||!Xf.test(de))return{status:403,body:"target_not_allowed"};await W();let ae=Ql(N,q,de);if(!ae)return{status:403,body:"target_not_allowed"};let Re=()=>{let re=Ql(N,ae.teamfile,ae.alias)??ae;return{state:re.state,idle_seconds:re.state==="idle"?re.idle_seconds:null,busy:re.busy===!0,terminal_held:re.terminal_held===!0,can_prompt:Ff(re)===null,cannot_prompt_reason:Ff(re)?re.terminal_held?"terminal-held":re.busy?"busy":re.cannot_prompt_reason??"unavailable-target":null}};if(K==="idle")return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify(Re())};if(K==="live_tail"){let re=X.after;if(re!=null&&(typeof re!="string"||!/^c1\.[0-9a-z.]{1,60}$/.test(re)))return{status:400,body:"after_invalid"};let Me=ne===void 0?Hi:Number(ne);if(!Number.isSafeInteger(Me)||Me<1||Me>Hi)return{status:400,body:"lines_invalid"};try{let Ke=["tail",ae.teamfile,ae.alias,"--lines",String(Me),"--tools","--json",...re?["--after",re]:[]],Rn=await n.lmctl(Ke,{timeoutMs:2e4,env:S});return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({...oL(ae.target,JSON.parse(Rn)),session:Re()})}}catch(Ke){let Rn=Ne(Ke);return I(`job ${j.id}: live tail failed: ${St(Rn)}`),/session not found/i.test(Rn)?we(404,"transcript_not_found",Ke):/timed out/i.test(Rn)?we(504,"tail_timeout",Ke):we(502,"tail_failed",Ke)}}if(K==="tail"){let re=ne===void 0?VR:Number(ne);if(!Number.isSafeInteger(re)||re<1||re>Hi)return{status:400,body:"lines_invalid"};let Me=vw(Z);if(Me==="invalid")return{status:400,body:"since_invalid"};if(Te!==void 0&&typeof Te!="boolean")return{status:400,body:"tools_invalid"};try{let Ke=["tail",ae.teamfile,ae.alias,"--lines",String(Me?Hi:re),...Me?["--since",Me.ts]:[],...Te===!1?[]:["--tools"],"--json"],Rn=await n.lmctl(Ke,{timeoutMs:3e4,env:S}),zm=sL(ae.target,JSON.parse(Rn)),LT=iL(zm.messages,Me);return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({...zm,messages:LT,truncated:Me?!1:zm.truncated,next_cursor:aL(LT,Me),session:Re()})}}catch(Ke){let Rn=Ne(Ke);return I(`job ${j.id}: tail failed: ${St(Rn)}`),/session not found/i.test(Rn)?we(404,"transcript_not_found",Ke):/timed out/i.test(Rn)?we(504,"tail_timeout",Ke):we(502,"tail_failed",Ke)}}if(typeof ge!="string"||!ge.length||ge.includes("\0")||Buffer.byteLength(ge)>Io)return{status:400,body:"text_invalid"};let tt=Ff(ae);if(tt)return I(`job ${j.id}: refused ${ae.target}: ${tt.body}`),{...tt,measured:Re()};let Qt=Number(X.timeout_s),ma=Math.min(Number.isFinite(Qt)&&Qt>0?Qt*1e3:fw*1e3,fw*1e3),Pc=await UR(Ze(jR(),"lmctl-site-prompt-"));try{let re=Ze(Pc,"prompt");await Yl(re,ge,{mode:384,flag:"wx"}),I(`job ${j.id}: prompt ${ae.target}`);let Me=await n.lmctl(["prompt",ae.teamfile,ae.alias,"--prompt-file",re,"--json"],{timeoutMs:ma,env:x});await W(),_e();let Ke=Buffer.from(Me);return{status:200,headers:{"content-type":"application/x-ndjson"},body:Ke.subarray(Math.max(0,Ke.length-uw)).toString(),measured:Re()}}catch(re){return I(`job ${j.id}: prompt failed: ${St(Ne(re))}`),await W(),{...we(502,"execution_failed",re),measured:Re()}}finally{await FR(Pc,{recursive:!0,force:!0})}}async function Yt(j,X){if(!w)return{status:403,body:"shell_not_enabled"};let K=X.command,q=X.cwd,de=X.timeout_s??ec.defaultTimeoutS;if(typeof K!="string"||!K.trim()||K.includes("\0")||Buffer.byteLength(K)>ec.commandBytes)return{status:400,body:"command_invalid"};if(typeof q!="string"||!q.startsWith("/")||q.includes("\0")||q.length>1024)return{status:400,body:"cwd_invalid"};if(!Number.isSafeInteger(de)||de<1||de>ec.maxTimeoutS)return{status:400,body:"timeout_invalid"};let ge={job:j.id,site:l,now:n.now()};try{if(!(await fz(q)).isDirectory())throw new Error("not a directory")}catch{return cn(400,"cwd_not_found",new Error(`the working directory ${q} does not exist on this machine or is not a directory`),ge)}if(E)return{status:409,body:"shell_busy"};E=!0;let ne=X.by&&typeof X.by=="object"?X.by:{};try{I(`job ${j.id}: shell in ${q} (${Buffer.byteLength(K)} bytes, timeout ${de} s)`);let Z=await eL(K,q,de*1e3,x);return await mw(y,{at:new Date(n.now()).toISOString(),job_id:j.id,run_id:typeof ne.run_id=="string"?ne.run_id:null,user:typeof ne.user=="string"?ne.user:null,org:typeof ne.org=="string"?ne.org:null,site:l,cwd:q,command:cw(K),exit_code:Z.exit_code,signal:Z.signal,timed_out:Z.timed_out,duration_ms:Z.duration_ms,stdout_bytes:Z.stdout_bytes,stderr_bytes:Z.stderr_bytes,...Z.spawn_error?{spawn_error:Z.spawn_error}:{}}).catch(Te=>I(`shell audit write failed: ${Ne(Te)}`)),Z.spawn_error?cn(502,"shell_failed",new Error(Z.spawn_error),ge):{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:_z,...Z,cwd:q,stdout:cw(Z.stdout),stderr:cw(Z.stderr)})}}finally{E=!1}}async function $c(j,X){if(!w)return{status:403,body:"shell_not_enabled"};let K={job:j.id,site:l,now:n.now()},q=X.text,de=X.pane,ge=typeof X.path=="string"?X.path:X.teamfile,ne=X.alias;if(typeof ge!="string"||typeof ne!="string")return{status:400,body:"target_invalid"};if(de!=null&&(typeof de!="string"||!/^[^:\s]{1,128}:\d{1,4}\.\d{1,4}$/.test(de)))return{status:400,body:"pane_invalid"};if(typeof q!="string"||!q.length||q.includes("\0")||Buffer.byteLength(q)>zl.textBytes)return{status:400,body:"text_invalid"};await W();let Z=Ql(N,ge,ne);if(!Z)return{status:404,body:"unknown_target"};if(Z.terminal_held!==!0)return cn(409,"not_terminal_held",new Error(`${Bi(Z.teamfile)}:${Z.alias} is not held by a terminal now; send it as a session prompt instead`),K);let Te=X.by&&typeof X.by=="object"?X.by:{},we=async(ae,Re=de)=>mw(y,{at:new Date(n.now()).toISOString(),op:"tmux_send",job_id:j.id,run_id:typeof Te.run_id=="string"?Te.run_id:null,user:typeof Te.user=="string"?Te.user:null,org:typeof Te.org=="string"?Te.org:null,target:`${Z.teamfile}:${Z.alias}`,pane:Re??null,bytes:Buffer.byteLength(q),sha256:pz("sha256").update(q).digest("hex"),result:ae});try{let ae={teamfile:Z.teamfile,alias:Z.alias},Re=`${Bi(Z.teamfile)}:${Z.alias}`,tt=typeof de=="string"?de:null;if(!tt){let re=await Pf(T);if(re.error)return await we("tmux_unavailable","-"),cn(503,"tmux_unavailable",new Error(`tmux did not answer (${re.error}); try again`),K);if(tt=(await $f([ae],re.panes,v)).get(`${ae.teamfile}:${ae.alias}`)?.[0]?.target??null,!tt){let Me=await MR(ae,v),Ke=Me?"terminal_not_in_tmux":"pane_not_found";return await we(Ke,"-"),cn(409,Ke,new Error(Me?`the lmctl terminal holding ${Re} runs outside tmux (pid ${Me}), so nothing can be typed into it from here`:`no tmux pane runs lmctl terminal for ${Re} now`),K)}}let Qt=await $R(T,v,ae,tt,q);if(!Qt.ok)return await we(Qt.code,tt),cn(409,Qt.code,new Error(Qt.message),K);await we("sent",tt),I(`job ${j.id}: typed ${Buffer.byteLength(q)} bytes into tmux ${tt}`);let{pid:ma,...Pc}=Qt.place;return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:"lmctl-site-tmux/1",sent:!0,pane:Pc,bytes:Buffer.byteLength(q)})}}catch(ae){return await we("failed"),cn(502,"tmux_failed",ae,K)}}async function fa(j,X){let K=X.text,q=X.since??"24h";if(typeof K!="string"||K.trim().length<2||Buffer.byteLength(K)>200||K.includes("\0"))return{status:400,body:"text_invalid"};if(!["24h","7d","all"].includes(q))return{status:400,body:"since_invalid"};let de=[];try{de=pw(JSON.parse(await n.lmctl(["running","--json","--since",q==="all"?"30d":q],{timeoutMs:3e4,env:S})),c,d,n.now())}catch(Z){return I(`job ${j.id}: search: lmctl running failed: ${St(Ne(Z))}`),cn(502,"search_failed",Z,{job:j.id,site:l,now:n.now()})}let ge=de.filter(Z=>Z.allowed).map(Z=>({teamfile:Z.teamfile,alias:Z.alias})),ne=await UR(Ze(jR(),"lmctl-site-search-"));try{await Yl(Ze(ne,"targets.json"),JSON.stringify(ge),{mode:384}),await Yl(Ze(ne,"text"),K,{mode:384});let Z=q==="all"?void 0:new Date(n.now()-(q==="7d"?7*864e5:864e5)).toISOString(),Te=await n.lmctl(["site","search-local","--targets-file",Ze(ne,"targets.json"),"--text-file",Ze(ne,"text"),...Z?["--since",Z]:[]],{timeoutMs:Ls.totalMs+15e3,env:S}),we=JSON.parse(Te),ae=Ls.totalHits,Re=we.results.map(tt=>{let Qt=tt.hits.slice(0,Math.max(0,ae)).map(ma=>({...ma,snippet:St(ma.snippet).slice(0,400)}));return ae-=Qt.length,{...tt,target:void 0,hits:Qt,truncated:!tt.complete||tt.hits.length>Qt.length}});return I(`job ${j.id}: search over ${ge.length} sessions in ${we.elapsed_ms} ms`),{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:ww,elapsed_ms:we.elapsed_ms,sessions:ge.length,hits:Ls.totalHits-ae,results:Re})}}catch(Z){return I(`job ${j.id}: search failed: ${St(Ne(Z))}`),cn(502,"search_failed",Z,{job:j.id,site:l,now:n.now()})}finally{await FR(ne,{recursive:!0,force:!0})}}async function Gm(j,X){let K=(Re,tt)=>({status:Re,headers:{"content-type":"application/json"},body:JSON.stringify(tt)});if(!h)return{status:403,body:"new_session_disabled"};let q=X.name,de=X.root,ge=X.provider,ne=X.model;if(typeof q!="string"||!yw.test(q))return{status:400,body:"name_invalid"};if(typeof de!="string"||!_.includes(de))return{status:403,body:"root_not_allowed"};if(await fe(),!pe.some(Re=>Re.provider===ge&&Re.model===ne))return{status:400,body:"model_not_offered"};let Z=await Uf(g);if(Z.filter(Re=>Date.parse(Re.created_at)>n.now()-36e5).length>=h)return{status:429,body:"new_session_cap"};let Te=Ze(de,q),we=Ze(Te,`${q}.lmctl`);try{return await dz(Te),{status:409,body:"name_taken"}}catch{}try{await Zl(de,{recursive:!0,mode:448}),await Zl(Te,{mode:448}),await Yl(we,cL(q,ge,ne),{mode:384,flag:"wx"}),I(`job ${j.id}: new session ${we} (${ge} ${ne})`),await n.lmctl(["seed",we],{timeoutMs:18e4,env:x})}catch(Re){return I(`job ${j.id}: new session failed: ${St(Ne(Re))}`),cn(502,"new_session_failed",Re,{job:j.id,site:l,now:n.now()})}let ae={name:q,root:de,dir:Te,teamfile:we,alias:"Lead",provider:ge,model:ne,created_at:new Date(n.now()).toISOString()};return await BR(g,[...Z,ae]),await W(),_e(),K(200,{schema:dw,teamfile:we,path:we,alias:"Lead",provider:ge,model:ne,created_at:ae.created_at})}async function Jm(j,X){let K=await Uf(g),q=K.find(ne=>ne.name===X.name&&ne.root===X.root&&!ne.archived_at);if(!q)return{status:404,body:"not_created_here"};await W();let de=Ql(N,q.teamfile,q.alias);if(de&&(de.busy||de.terminal_held))return{status:409,body:de.terminal_held?"session_terminal_held":"session_busy"};let ge=Ze(q.root,".archived",`${q.name}-${new Date(n.now()).toISOString().replace(/[:.]/g,"-")}`);try{await Zl(Ze(q.root,".archived"),{recursive:!0,mode:448}),await GR(q.dir,ge)}catch(ne){return I(`job ${j.id}: archive failed: ${St(Ne(ne))}`),cn(502,"archive_failed",ne,{job:j.id,site:l,now:n.now()})}return q.archived_at=new Date(n.now()).toISOString(),q.archived_to=ge,await BR(g,K),I(`job ${j.id}: archived ${q.teamfile} -> ${ge}`),{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:dw,archived:!0,teamfile:q.teamfile,archived_at:q.archived_at})}}let Gr=new Set,Vm=encodeURIComponent(k),Km=0,RT=0;for(;!n.signal?.aborted;){if(n.now()-Math.max(Km,qr)>=m*1e3||H&&n.now()>=H){if(Km=n.now(),H=0,await W(),await _e(),z(i,"--once"))break}else qe&&n.now()-RT>=qe*1e3&&(RT=n.now(),await W(),V()!==ut&&await _e(!1,!0)&&(Km=n.now()));if(Gr.size>=4){await b.call("GET",`/v1/rpc/${Vm}/next?capacity=0`).catch(()=>{}),await Promise.race([...Gr,n.sleep(2e4,n.signal)]);continue}let j=null,X=n.now();try{let q=await b.call("GET",`/v1/rpc/${Vm}/next?wait_s=${Math.min(20,m,qe||20)}`);j=q.status===200?q.json:null,!j&&n.now()-X<500&&await n.sleep(1e3,n.signal)}catch(q){if(n.signal?.aborted)break;I(`relay poll failed: ${Ne(q)}`),await n.sleep(2e3,n.signal);continue}if(!j?.id)continue;let K=(async()=>{let q=await We(j);await b.call("POST",`/v1/rpc/${Vm}/${encodeURIComponent(j.id)}/response`,q,!1).catch(de=>I(`job ${j.id}: respond failed: ${Ne(de)}`))})();Gr.add(K),K.finally(()=>Gr.delete(K))}return await Promise.allSettled([...Gr]),await _e(!0),I("stopped"),0}async function bw(t,e,n,r=!1){let s=ce(t,["--org","--stalled-min"],["--json","--all","--attention"]);if(s.error||s.positionals.length)return O(e,s.error??ve);let o=F(s,"--org");if(o!==void 0&&!Cs.test(o))return O(e,"lmctl site attention: --org must be an organization id (lmctl site orgs)");let i=F(s,"--stalled-min");if(i!==void 0&&!(/^\d+$/.test(i)&&Number(i)>=1&&Number(i)<=1440))return O(e,"lmctl site attention: --stalled-min must be 1-1440 minutes");let a=cr(e,n);if(!a)return O(e,dr);let l;try{l=(await a.call("GET",`/api/sessions${i?`?stalled_min=${i}`:""}`,void 0,!0,o?{"x-lmctl-org":o}:{})).json}catch(p){return O(e,`lmctl site attention: ${Ne(p)}`)}let c=(l.targets??[]).filter(p=>p.attention),u=r||z(s,"--all")?c:c.filter(p=>p.attention.needs),f=c.filter(p=>p.attention.needs).length;if(z(s,"--json"))return Y(e,{attention:f,sessions:u}),0;let m=new Set(c.map(p=>p.siteid)).size;e.stdout.write(`${f?`${f} session${f===1?" needs":"s need"} attention`:"nothing needs attention"} (${c.length} session${c.length===1?"":"s"} on ${m} site${m===1?"":"s"})
2275
+ `);try{await b.call("POST","/v1/mailboxes",{name:k,...u?{org:u}:{}})}catch(j){return j instanceof An&&j.code==="name_taken"?O(e,`lmctl site serve: the name ${l} is taken by another account or organization; choose another --name`):j instanceof An&&j.code==="org_not_found"?O(e,`lmctl site serve: you are not an owner of organization ${u}`):O(e,`lmctl site serve: cannot create the relay mailbox: ${Ne(j)}`)}I(`serving ${b.base} for ${u?`organization ${u}`:"your personal organization"} (relay mailbox ${k}); sessions: lmctl running --json --since ${f}; offered: ${c.length&&!d?`only ${c.map(j=>j.alias?`${j.teamfile}:${j.alias}`:j.teamfile).join(", ")}`:"every session"} (prompted only while lmctl says can_prompt)`);let N=[],A=nL(a),S={...A,LMCTL_READ_ONLY:"1"},x={...A};delete x.LMCTL_READ_ONLY;let R=3e4,L=new Map,D=new Map,M=(j,X,K)=>{D.get(j)!==X&&(D.set(j,X),I(`tmux: ${K}`))},P=null;function W(){return P||(P=$().finally(()=>{P=null})),P}async function $(){let j=N;try{let K=await n.lmctl(["running","--json","--since",f],{timeoutMs:3e4,env:S});j=pw(JSON.parse(K),c,d,n.now())}catch(K){I(`lmctl running failed: ${Ne(K)}`),j=[...N]}if(h)for(let K of await Uf(g))K.archived_at||j.some(q=>q.teamfile===K.teamfile&&q.alias===K.alias)||j.push({target:`${K.teamfile}:${K.alias}`,teamfile:K.teamfile,alias:K.alias,state:"unknown",idle_seconds:null,model:K.model,allowed:!0,id:`${K.teamfile}#${K.alias}`,busy:!1,terminal_held:!1,can_prompt:!0,cannot_prompt_reason:null});let X=j.filter(K=>K.terminal_held===!0);for(let K of[...L.keys()])X.some(q=>`${q.teamfile}:${q.alias}`===K)||(L.delete(K),D.delete(K));if(X.length){let K=await Pf(T),q=new Map,de=K.error?`tmux did not answer (${K.error})`:"no tmux pane runs its lmctl terminal";if(!K.error)try{q=await $f(X.map(ne=>({teamfile:ne.teamfile,alias:ne.alias})),K.panes,v)}catch(ne){de=`the association failed (${Ne(ne)})`}let ge=n.now();for(let ne of X){let Z=`${ne.teamfile}:${ne.alias}`,Te=`${Bi(ne.teamfile)}:${ne.alias}`,we=q.get(Z);if(we?.length){let ae=we.map(({pid:Re,...tt})=>tt);ne.tmux={panes:ae},L.set(Z,{panes:ae,at:ge}),M(Z,`found ${ae.map(Re=>Re.target).join(",")}`,`${Te} is in ${ae.map(Re=>Re.target).join(", ")}`)}else{let ae=L.get(Z);ae&&ge-ae.at<=R?(ne.tmux={panes:ae.panes,stale:!0,checked_at:new Date(ae.at).toISOString()},M(Z,"stale",`${Te}: pane not found now (${de}); keeping ${ae.panes[0].target} from ${Math.round((ge-ae.at)/1e3)} s ago`)):(ne.tmux=null,M(Z,"missing",`${Te}: no pane (${de})`))}}}N=j}let pe=[],J=0;async function fe(){if(!(!h||n.now()-J<36e5)){J=n.now();try{pe=hw(JSON.parse(await n.lmctl(["models","--json"],{timeoutMs:6e4,env:S})),a.LMCTL_ENABLE_MOCK_PROVIDER==="1")}catch(j){pe=a.LMCTL_ENABLE_MOCK_PROVIDER==="1"?hw(null,!0):[],I(`lmctl models failed: ${Ne(j)}`)}}}async function Se(){if(!h)return;await fe();let j=n.now()-36e5,X=(await Uf(g)).filter(K=>Date.parse(K.created_at)>j).length;return{roots:_,models:pe,cap_per_hour:h,created_last_hour:X}}let qe=0,ut="",qr=0,Bn=!1,H=0,V=()=>JSON.stringify(N.filter(j=>j.allowed).map(j=>[j.target,j.busy===!0,j.terminal_held===!0,j.can_prompt!==!1]).sort());async function _e(j=!1,X=!1,K=!1){for(let q=0;q<2;q++){let de={schema:nc,host:fz(),stopped:j,sessions:j?[]:N},ge=j?void 0:await Se(),ne=V();try{let Te=(await b.call("POST","/api/running/report",{device_id:l,...u?{org:u}:{},payload:de,targets:j?[]:tL(N),...ge?{new_session:ge}:{},...w&&!j?{shell:{enabled:!0,home:p}}:{},...X?{state_change:!0}:{}},!j)).json?.quick_check_s,we=typeof Te=="number"&&Number.isInteger(Te)&&Te>=2&&Te<=60?Te:0;return we!==qe&&I(we?`a queued prompt waits here: checking sessions every ${we} s`:"no queued prompt waits here: back to the report interval"),qe=we,ut=ne,qr=n.now(),Bn=!0,H=0,!0}catch(Z){if(X&&K&&q===0&&Z instanceof An&&Z.status===429){if(await n.sleep(3500,n.signal),n.signal?.aborted)return!1;continue}if(X&&Z instanceof An&&Z.status===429)return!1;if(!j&&Bn&&Z instanceof An&&Z.status===429)return H=n.now()+21e3,!1;if(q===0&&Z instanceof An&&Z.status===429){if(await n.sleep(21e3,j?void 0:n.signal),!j&&n.signal?.aborted)return!1;continue}return I(`report failed: ${Ne(Z)}`),!1}}return!1}async function We(j){let X=j.request??{};if(X.op==="new_session")return Gm(j,X);if(X.op==="search")return fa(j,X);if(X.op==="shell")return Yt(j,X);if(X.op==="tmux_send")return $c(j,X);if(X.op==="report_now"){await W();let re=await _e(!1,!0,!0);return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:"lmctl-site-report/1",reported:re,quick_check_s:qe})}}if(X.op==="archive_session")return Jm(j,X);let K,q,de,ge,ne,Z,Te;if(typeof X.op=="string")({op:K,teamfile:q,alias:de,text:ge,lines:ne}=X),Z=X.since,Te=X.tools,typeof X.path=="string"&&X.path.startsWith("/")&&(q=X.path);else if(X.method==="POST"&&X.path==="/prompt"){let re={};try{re=typeof X.body=="string"?JSON.parse(X.body):X.body??{}}catch{return{status:400,body:"invalid_body"}}K="prompt";let Me=typeof re.target=="string"?qi(re.target):null;q=Me?.teamfile,de=Me?.alias,ge=re.text}else if(X.method==="POST"&&X.path==="/tail"){let re={};try{re=typeof X.body=="string"?JSON.parse(X.body):X.body??{}}catch{return{status:400,body:"invalid_body"}}K="tail";let Me=typeof re.target=="string"?qi(re.target):null;q=Me?.teamfile,de=Me?.alias,ne=re.lines,Z=re.since,Te=re.tools}else return X.method==="GET"&&X.path==="/sessions"?{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:nc,sessions:N})}:{status:400,body:"invalid_op"};if(K!=="prompt"&&K!=="idle"&&K!=="tail"&&K!=="live_tail")return{status:400,body:"invalid_op"};let we=(re,Me,Ke)=>cn(re,Me,Ke,{job:j.id,site:l,now:n.now()});if(typeof q!="string"||typeof de!="string"||!Xf.test(de))return{status:403,body:"target_not_allowed"};await W();let ae=Ql(N,q,de);if(!ae)return{status:403,body:"target_not_allowed"};let Re=()=>{let re=Ql(N,ae.teamfile,ae.alias)??ae;return{state:re.state,idle_seconds:re.state==="idle"?re.idle_seconds:null,busy:re.busy===!0,terminal_held:re.terminal_held===!0,can_prompt:Ff(re)===null,cannot_prompt_reason:Ff(re)?re.terminal_held?"terminal-held":re.busy?"busy":re.cannot_prompt_reason??"unavailable-target":null}};if(K==="idle")return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify(Re())};if(K==="live_tail"){let re=X.after;if(re!=null&&(typeof re!="string"||!/^c1\.[0-9a-z.]{1,60}$/.test(re)))return{status:400,body:"after_invalid"};let Me=ne===void 0?Hi:Number(ne);if(!Number.isSafeInteger(Me)||Me<1||Me>Hi)return{status:400,body:"lines_invalid"};try{let Ke=["tail",ae.teamfile,ae.alias,"--lines",String(Me),"--tools","--json",...re?["--after",re]:[]],Rn=await n.lmctl(Ke,{timeoutMs:2e4,env:S});return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({...oL(ae.target,JSON.parse(Rn)),session:Re()})}}catch(Ke){let Rn=Ne(Ke);return I(`job ${j.id}: live tail failed: ${St(Rn)}`),/session not found/i.test(Rn)?we(404,"transcript_not_found",Ke):/timed out/i.test(Rn)?we(504,"tail_timeout",Ke):we(502,"tail_failed",Ke)}}if(K==="tail"){let re=ne===void 0?VR:Number(ne);if(!Number.isSafeInteger(re)||re<1||re>Hi)return{status:400,body:"lines_invalid"};let Me=vw(Z);if(Me==="invalid")return{status:400,body:"since_invalid"};if(Te!==void 0&&typeof Te!="boolean")return{status:400,body:"tools_invalid"};try{let Ke=["tail",ae.teamfile,ae.alias,"--lines",String(Me?Hi:re),...Me?["--since",Me.ts]:[],...Te===!1?[]:["--tools"],"--json"],Rn=await n.lmctl(Ke,{timeoutMs:3e4,env:S}),zm=sL(ae.target,JSON.parse(Rn)),LT=iL(zm.messages,Me);return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({...zm,messages:LT,truncated:Me?!1:zm.truncated,next_cursor:aL(LT,Me),session:Re()})}}catch(Ke){let Rn=Ne(Ke);return I(`job ${j.id}: tail failed: ${St(Rn)}`),/session not found/i.test(Rn)?we(404,"transcript_not_found",Ke):/timed out/i.test(Rn)?we(504,"tail_timeout",Ke):we(502,"tail_failed",Ke)}}if(typeof ge!="string"||!ge.length||ge.includes("\0")||Buffer.byteLength(ge)>Io)return{status:400,body:"text_invalid"};let tt=Ff(ae);if(tt)return I(`job ${j.id}: refused ${ae.target}: ${tt.body}`),{...tt,measured:Re()};let Qt=Number(X.timeout_s),ma=Math.min(Number.isFinite(Qt)&&Qt>0?Qt*1e3:fw*1e3,fw*1e3),Pc=await UR(Ze(jR(),"lmctl-site-prompt-"));try{let re=Ze(Pc,"prompt");await Yl(re,ge,{mode:384,flag:"wx"}),I(`job ${j.id}: prompt ${ae.target}`);let Me=await n.lmctl(["prompt",ae.teamfile,ae.alias,"--prompt-file",re,"--json"],{timeoutMs:ma,env:x});await W(),_e();let Ke=Buffer.from(Me);return{status:200,headers:{"content-type":"application/x-ndjson"},body:Ke.subarray(Math.max(0,Ke.length-uw)).toString(),measured:Re()}}catch(re){return I(`job ${j.id}: prompt failed: ${St(Ne(re))}`),await W(),{...we(502,"execution_failed",re),measured:Re()}}finally{await FR(Pc,{recursive:!0,force:!0})}}async function Yt(j,X){if(!w)return{status:403,body:"shell_not_enabled"};let K=X.command,q=X.cwd,de=X.timeout_s??ec.defaultTimeoutS;if(typeof K!="string"||!K.trim()||K.includes("\0")||Buffer.byteLength(K)>ec.commandBytes)return{status:400,body:"command_invalid"};if(typeof q!="string"||!q.startsWith("/")||q.includes("\0")||q.length>1024)return{status:400,body:"cwd_invalid"};if(!Number.isSafeInteger(de)||de<1||de>ec.maxTimeoutS)return{status:400,body:"timeout_invalid"};let ge={job:j.id,site:l,now:n.now()};try{if(!(await uz(q)).isDirectory())throw new Error("not a directory")}catch{return cn(400,"cwd_not_found",new Error(`the working directory ${q} does not exist on this machine or is not a directory`),ge)}if(E)return{status:409,body:"shell_busy"};E=!0;let ne=X.by&&typeof X.by=="object"?X.by:{};try{I(`job ${j.id}: shell in ${q} (${Buffer.byteLength(K)} bytes, timeout ${de} s)`);let Z=await eL(K,q,de*1e3,x);return await mw(y,{at:new Date(n.now()).toISOString(),job_id:j.id,run_id:typeof ne.run_id=="string"?ne.run_id:null,user:typeof ne.user=="string"?ne.user:null,org:typeof ne.org=="string"?ne.org:null,site:l,cwd:q,command:cw(K),exit_code:Z.exit_code,signal:Z.signal,timed_out:Z.timed_out,duration_ms:Z.duration_ms,stdout_bytes:Z.stdout_bytes,stderr_bytes:Z.stderr_bytes,...Z.spawn_error?{spawn_error:Z.spawn_error}:{}}).catch(Te=>I(`shell audit write failed: ${Ne(Te)}`)),Z.spawn_error?cn(502,"shell_failed",new Error(Z.spawn_error),ge):{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:hz,...Z,cwd:q,stdout:cw(Z.stdout),stderr:cw(Z.stderr)})}}finally{E=!1}}async function $c(j,X){if(!w)return{status:403,body:"shell_not_enabled"};let K={job:j.id,site:l,now:n.now()},q=X.text,de=X.pane,ge=typeof X.path=="string"?X.path:X.teamfile,ne=X.alias;if(typeof ge!="string"||typeof ne!="string")return{status:400,body:"target_invalid"};if(de!=null&&(typeof de!="string"||!/^[^:\s]{1,128}:\d{1,4}\.\d{1,4}$/.test(de)))return{status:400,body:"pane_invalid"};if(typeof q!="string"||!q.length||q.includes("\0")||Buffer.byteLength(q)>zl.textBytes)return{status:400,body:"text_invalid"};await W();let Z=Ql(N,ge,ne);if(!Z)return{status:404,body:"unknown_target"};if(Z.terminal_held!==!0)return cn(409,"not_terminal_held",new Error(`${Bi(Z.teamfile)}:${Z.alias} is not held by a terminal now; send it as a session prompt instead`),K);let Te=X.by&&typeof X.by=="object"?X.by:{},we=async(ae,Re=de)=>mw(y,{at:new Date(n.now()).toISOString(),op:"tmux_send",job_id:j.id,run_id:typeof Te.run_id=="string"?Te.run_id:null,user:typeof Te.user=="string"?Te.user:null,org:typeof Te.org=="string"?Te.org:null,target:`${Z.teamfile}:${Z.alias}`,pane:Re??null,bytes:Buffer.byteLength(q),sha256:mz("sha256").update(q).digest("hex"),result:ae});try{let ae={teamfile:Z.teamfile,alias:Z.alias},Re=`${Bi(Z.teamfile)}:${Z.alias}`,tt=typeof de=="string"?de:null;if(!tt){let re=await Pf(T);if(re.error)return await we("tmux_unavailable","-"),cn(503,"tmux_unavailable",new Error(`tmux did not answer (${re.error}); try again`),K);if(tt=(await $f([ae],re.panes,v)).get(`${ae.teamfile}:${ae.alias}`)?.[0]?.target??null,!tt){let Me=await MR(ae,v),Ke=Me?"terminal_not_in_tmux":"pane_not_found";return await we(Ke,"-"),cn(409,Ke,new Error(Me?`the lmctl terminal holding ${Re} runs outside tmux (pid ${Me}), so nothing can be typed into it from here`:`no tmux pane runs lmctl terminal for ${Re} now`),K)}}let Qt=await $R(T,v,ae,tt,q);if(!Qt.ok)return await we(Qt.code,tt),cn(409,Qt.code,new Error(Qt.message),K);await we("sent",tt),I(`job ${j.id}: typed ${Buffer.byteLength(q)} bytes into tmux ${tt}`);let{pid:ma,...Pc}=Qt.place;return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:"lmctl-site-tmux/1",sent:!0,pane:Pc,bytes:Buffer.byteLength(q)})}}catch(ae){return await we("failed"),cn(502,"tmux_failed",ae,K)}}async function fa(j,X){let K=X.text,q=X.since??"24h";if(typeof K!="string"||K.trim().length<2||Buffer.byteLength(K)>200||K.includes("\0"))return{status:400,body:"text_invalid"};if(!["24h","7d","all"].includes(q))return{status:400,body:"since_invalid"};let de=[];try{de=pw(JSON.parse(await n.lmctl(["running","--json","--since",q==="all"?"30d":q],{timeoutMs:3e4,env:S})),c,d,n.now())}catch(Z){return I(`job ${j.id}: search: lmctl running failed: ${St(Ne(Z))}`),cn(502,"search_failed",Z,{job:j.id,site:l,now:n.now()})}let ge=de.filter(Z=>Z.allowed).map(Z=>({teamfile:Z.teamfile,alias:Z.alias})),ne=await UR(Ze(jR(),"lmctl-site-search-"));try{await Yl(Ze(ne,"targets.json"),JSON.stringify(ge),{mode:384}),await Yl(Ze(ne,"text"),K,{mode:384});let Z=q==="all"?void 0:new Date(n.now()-(q==="7d"?7*864e5:864e5)).toISOString(),Te=await n.lmctl(["site","search-local","--targets-file",Ze(ne,"targets.json"),"--text-file",Ze(ne,"text"),...Z?["--since",Z]:[]],{timeoutMs:Ls.totalMs+15e3,env:S}),we=JSON.parse(Te),ae=Ls.totalHits,Re=we.results.map(tt=>{let Qt=tt.hits.slice(0,Math.max(0,ae)).map(ma=>({...ma,snippet:St(ma.snippet).slice(0,400)}));return ae-=Qt.length,{...tt,target:void 0,hits:Qt,truncated:!tt.complete||tt.hits.length>Qt.length}});return I(`job ${j.id}: search over ${ge.length} sessions in ${we.elapsed_ms} ms`),{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:ww,elapsed_ms:we.elapsed_ms,sessions:ge.length,hits:Ls.totalHits-ae,results:Re})}}catch(Z){return I(`job ${j.id}: search failed: ${St(Ne(Z))}`),cn(502,"search_failed",Z,{job:j.id,site:l,now:n.now()})}finally{await FR(ne,{recursive:!0,force:!0})}}async function Gm(j,X){let K=(Re,tt)=>({status:Re,headers:{"content-type":"application/json"},body:JSON.stringify(tt)});if(!h)return{status:403,body:"new_session_disabled"};let q=X.name,de=X.root,ge=X.provider,ne=X.model;if(typeof q!="string"||!yw.test(q))return{status:400,body:"name_invalid"};if(typeof de!="string"||!_.includes(de))return{status:403,body:"root_not_allowed"};if(await fe(),!pe.some(Re=>Re.provider===ge&&Re.model===ne))return{status:400,body:"model_not_offered"};let Z=await Uf(g);if(Z.filter(Re=>Date.parse(Re.created_at)>n.now()-36e5).length>=h)return{status:429,body:"new_session_cap"};let Te=Ze(de,q),we=Ze(Te,`${q}.lmctl`);try{return await cz(Te),{status:409,body:"name_taken"}}catch{}try{await Zl(de,{recursive:!0,mode:448}),await Zl(Te,{mode:448}),await Yl(we,cL(q,ge,ne),{mode:384,flag:"wx"}),I(`job ${j.id}: new session ${we} (${ge} ${ne})`),await n.lmctl(["seed",we],{timeoutMs:18e4,env:x})}catch(Re){return I(`job ${j.id}: new session failed: ${St(Ne(Re))}`),cn(502,"new_session_failed",Re,{job:j.id,site:l,now:n.now()})}let ae={name:q,root:de,dir:Te,teamfile:we,alias:"Lead",provider:ge,model:ne,created_at:new Date(n.now()).toISOString()};return await BR(g,[...Z,ae]),await W(),_e(),K(200,{schema:dw,teamfile:we,path:we,alias:"Lead",provider:ge,model:ne,created_at:ae.created_at})}async function Jm(j,X){let K=await Uf(g),q=K.find(ne=>ne.name===X.name&&ne.root===X.root&&!ne.archived_at);if(!q)return{status:404,body:"not_created_here"};await W();let de=Ql(N,q.teamfile,q.alias);if(de&&(de.busy||de.terminal_held))return{status:409,body:de.terminal_held?"session_terminal_held":"session_busy"};let ge=Ze(q.root,".archived",`${q.name}-${new Date(n.now()).toISOString().replace(/[:.]/g,"-")}`);try{await Zl(Ze(q.root,".archived"),{recursive:!0,mode:448}),await GR(q.dir,ge)}catch(ne){return I(`job ${j.id}: archive failed: ${St(Ne(ne))}`),cn(502,"archive_failed",ne,{job:j.id,site:l,now:n.now()})}return q.archived_at=new Date(n.now()).toISOString(),q.archived_to=ge,await BR(g,K),I(`job ${j.id}: archived ${q.teamfile} -> ${ge}`),{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:dw,archived:!0,teamfile:q.teamfile,archived_at:q.archived_at})}}let Gr=new Set,Vm=encodeURIComponent(k),Km=0,RT=0;for(;!n.signal?.aborted;){if(n.now()-Math.max(Km,qr)>=m*1e3||H&&n.now()>=H){if(Km=n.now(),H=0,await W(),await _e(),z(i,"--once"))break}else qe&&n.now()-RT>=qe*1e3&&(RT=n.now(),await W(),V()!==ut&&await _e(!1,!0)&&(Km=n.now()));if(Gr.size>=4){await b.call("GET",`/v1/rpc/${Vm}/next?capacity=0`).catch(()=>{}),await Promise.race([...Gr,n.sleep(2e4,n.signal)]);continue}let j=null,X=n.now();try{let q=await b.call("GET",`/v1/rpc/${Vm}/next?wait_s=${Math.min(20,m,qe||20)}`);j=q.status===200?q.json:null,!j&&n.now()-X<500&&await n.sleep(1e3,n.signal)}catch(q){if(n.signal?.aborted)break;I(`relay poll failed: ${Ne(q)}`),await n.sleep(2e3,n.signal);continue}if(!j?.id)continue;let K=(async()=>{let q=await We(j);await b.call("POST",`/v1/rpc/${Vm}/${encodeURIComponent(j.id)}/response`,q,!1).catch(de=>I(`job ${j.id}: respond failed: ${Ne(de)}`))})();Gr.add(K),K.finally(()=>Gr.delete(K))}return await Promise.allSettled([...Gr]),await _e(!0),I("stopped"),0}async function bw(t,e,n,r=!1){let s=ce(t,["--org","--stalled-min"],["--json","--all","--attention"]);if(s.error||s.positionals.length)return O(e,s.error??ve);let o=F(s,"--org");if(o!==void 0&&!Cs.test(o))return O(e,"lmctl site attention: --org must be an organization id (lmctl site orgs)");let i=F(s,"--stalled-min");if(i!==void 0&&!(/^\d+$/.test(i)&&Number(i)>=1&&Number(i)<=1440))return O(e,"lmctl site attention: --stalled-min must be 1-1440 minutes");let a=cr(e,n);if(!a)return O(e,dr);let l;try{l=(await a.call("GET",`/api/sessions${i?`?stalled_min=${i}`:""}`,void 0,!0,o?{"x-lmctl-org":o}:{})).json}catch(p){return O(e,`lmctl site attention: ${Ne(p)}`)}let c=(l.targets??[]).filter(p=>p.attention),u=r||z(s,"--all")?c:c.filter(p=>p.attention.needs),f=c.filter(p=>p.attention.needs).length;if(z(s,"--json"))return Y(e,{attention:f,sessions:u}),0;let m=new Set(c.map(p=>p.siteid)).size;e.stdout.write(`${f?`${f} session${f===1?" needs":"s need"} attention`:"nothing needs attention"} (${c.length} session${c.length===1?"":"s"} on ${m} site${m===1?"":"s"})
2277
2276
  `);for(let p of u)e.stdout.write(`${p.attention.state.toUpperCase().padEnd(8)} ${p.siteid} ${p.path??p.teamfile}:${p.alias} ${p.attention.reason}
2278
2277
  `);return 0}async function dL(t,e,n){if(t.includes("--attention"))return bw(t,e,n,!0);let r=ce(t,["--org"],["--json"]);if(r.error||r.positionals.length)return O(e,r.error??ve);let s=F(r,"--org");if(s!==void 0&&!Cs.test(s))return O(e,"lmctl site list: --org must be an organization id (lmctl site orgs)");let o=cr(e,n);if(!o)return O(e,dr);let i;try{i=(await o.call("GET",`/api/running/me${s?`?org=${encodeURIComponent(s)}`:""}`)).json?.devices??[]}catch(l){return O(e,`lmctl site list: ${Ne(l)}`)}let a=i.filter(l=>l.payload?.schema===nc&&!l.payload.stopped).map(l=>({site:String(l.device_id),reported_at:typeof l.reported_at=="string"?l.reported_at:null,host:String(l.payload.host??""),sessions:l.payload.sessions??[]})).sort((l,c)=>l.site.localeCompare(c.site));if(z(r,"--json"))return Y(e,{schema:nc,sites:a}),0;if(!a.length)return e.stdout.write(`no sites reported in the last 5 minutes (start one with: lmctl site serve --name NAME)
2279
2278
  `),0;for(let l of a){let c=l.reported_at?Math.max(0,Math.round((n.now()-Date.parse(l.reported_at))/1e3)):null;e.stdout.write(`${l.site} (host ${l.host||"?"}, reported ${c===null?"?":`${c}s ago`}, ${l.sessions.length} session${l.sessions.length===1?"":"s"})
@@ -2298,20 +2297,20 @@ ${w.text}${w.clipped?`
2298
2297
  `:`(idle${g.session?.can_prompt===!1&&g.session.cannot_prompt_reason?`, cannot prompt: ${g.session.cannot_prompt_reason}`:""})
2299
2298
  `),h=w}}d=g.next_cursor??d,u&&await n.sleep(f*1e3,n.signal)}while(u&&!n.signal?.aborted);return 0}async function pL(t,e,n){let r=ce(t,[],["--json"]);if(r.error||r.positionals.length)return O(e,r.error??ve);let s=cr(e,n);if(!s)return O(e,dr);let o;try{o=(await s.call("GET","/api/orgs")).json.orgs}catch(i){return O(e,`lmctl site orgs: ${Ne(i)}`)}if(z(r,"--json"))return Y(e,{orgs:o}),0;for(let i of o)e.stdout.write(`${i.id} ${i.kind} ${i.name}
2300
2299
  `);return 0}async function hL(t,e,n){let[r,...s]=t;if(!r||s.length||!Pr.test(r))return O(e,ve);let o=cr(e,n);if(!o)return O(e,dr);try{await o.call("DELETE",`/v1/mailboxes/${encodeURIComponent(`site-${r}`)}`)}catch(i){return O(e,`lmctl site remove: ${Ne(i)}`)}return e.stdout.write(`removed the relay mailbox of ${r}
2301
- `),0}function Xi(t){return Ze(t.LMCTL_HOME||Ze(t.HOME||_w(),".lmctl"),"site.json")}function _L(t){let e;try{e=tc(Xi(t),"utf8")}catch{return null}let n=JSON.parse(e);if(typeof n.name!="string"||!Pr.test(n.name)||!Array.isArray(n.allow)||n.allow.some(r=>typeof r!="string"))throw new Error(`invalid ${Xi(t)}`);if(n.org!==void 0&&(typeof n.org!="string"||!Cs.test(n.org)))throw new Error(`invalid org in ${Xi(t)}`);return{name:n.name,...n.org?{org:n.org}:{},allow:n.allow,allowTracked:n.allowTracked===!0,interval:Number.isFinite(n.interval)?Number(n.interval):60}}function yz(t){return["--name",t.name,...t.org?["--org",t.org]:[],...t.allow.flatMap(e=>["--allow",e]),...t.allowTracked?["--allow-tracked"]:[],"--interval",String(t.interval)]}async function gL(t,e){let n=Bf(t,"--allow");if("error"in n)return O(e,`${n.error}
2302
- ${ve}`);let r=ce(n.rest,["--name","--interval","--org"],["--allow-tracked"]);if(r.error||r.positionals.length)return O(e,r.error??ve);let s=F(r,"--name")??"";if(!Pr.test(s))return O(e,"lmctl site enable: --name must be 1-53 characters [A-Za-z0-9._-], starting with a letter or digit");let o=Number(F(r,"--interval")??60);if(!Number.isFinite(o)||o<30||o>240)return O(e,"lmctl site enable: --interval must be 30-240 seconds");let i=F(r,"--org");if(i!==void 0&&!Cs.test(i))return O(e,"lmctl site enable: --org must be an organization id (lmctl site orgs)");let a=e.env??process.env,l=Ew(n.values,e.cwd??process.cwd()).map(d=>d.alias?`${d.teamfile}:${d.alias}`:d.teamfile),c=Xi(a);return sz(Ze(c,".."),{recursive:!0}),az(`${c}.tmp`,`${JSON.stringify({name:s,...i?{org:i}:{},allow:l,allowTracked:z(r,"--allow-tracked"),interval:o},null,2)}
2303
- `,{mode:384}),oz(`${c}.tmp`,c),e.stdout.write(`site ${s} enabled in ${c}; the lmctl daemon runs it from its next start (lmctl serve stop && lmctl serve start, or lmctl serve install)
2304
- `),0}function yL(t,e){if(t.length)return O(e,ve);let n=Xi(e.env??process.env);return iz(n,{force:!0}),e.stdout.write(`site agent disabled (${n} removed); it stops when the lmctl daemon restarts
2300
+ `),0}function Xi(t){return Ze(t.LMCTL_HOME||Ze(t.HOME||_w(),".lmctl"),"site.json")}function _L(t){let e;try{e=tc(Xi(t),"utf8")}catch{return null}let n=JSON.parse(e);if(typeof n.name!="string"||!Pr.test(n.name)||!Array.isArray(n.allow)||n.allow.some(r=>typeof r!="string"))throw new Error(`invalid ${Xi(t)}`);if(n.org!==void 0&&(typeof n.org!="string"||!Cs.test(n.org)))throw new Error(`invalid org in ${Xi(t)}`);return{name:n.name,...n.org?{org:n.org}:{},allow:n.allow,allowTracked:n.allowTracked===!0,interval:Number.isFinite(n.interval)?Number(n.interval):60}}function gz(t){return["--name",t.name,...t.org?["--org",t.org]:[],...t.allow.flatMap(e=>["--allow",e]),...t.allowTracked?["--allow-tracked"]:[],"--interval",String(t.interval)]}async function gL(t,e){let n=Bf(t,"--allow");if("error"in n)return O(e,`${n.error}
2301
+ ${ve}`);let r=ce(n.rest,["--name","--interval","--org"],["--allow-tracked"]);if(r.error||r.positionals.length)return O(e,r.error??ve);let s=F(r,"--name")??"";if(!Pr.test(s))return O(e,"lmctl site enable: --name must be 1-53 characters [A-Za-z0-9._-], starting with a letter or digit");let o=Number(F(r,"--interval")??60);if(!Number.isFinite(o)||o<30||o>240)return O(e,"lmctl site enable: --interval must be 30-240 seconds");let i=F(r,"--org");if(i!==void 0&&!Cs.test(i))return O(e,"lmctl site enable: --org must be an organization id (lmctl site orgs)");let a=e.env??process.env,l=Ew(n.values,e.cwd??process.cwd()).map(d=>d.alias?`${d.teamfile}:${d.alias}`:d.teamfile),c=Xi(a);return rz(Ze(c,".."),{recursive:!0}),iz(`${c}.tmp`,`${JSON.stringify({name:s,...i?{org:i}:{},allow:l,allowTracked:z(r,"--allow-tracked"),interval:o},null,2)}
2302
+ `,{mode:384}),sz(`${c}.tmp`,c),e.stdout.write(`site ${s} enabled in ${c}; the lmctl daemon runs it from its next start (lmctl serve stop && lmctl serve start, or lmctl serve install)
2303
+ `),0}function yL(t,e){if(t.length)return O(e,ve);let n=Xi(e.env??process.env);return oz(n,{force:!0}),e.stdout.write(`site agent disabled (${n} removed); it stops when the lmctl daemon restarts
2305
2304
  `),0}function Jf(t,e){let n=ce(t,[],["--json"]);if(n.error||n.positionals.length)return O(e,n.error??ve);let r;try{r=_L(e.env??process.env)}catch(s){return O(e,Ne(s))}return z(n,"--json")?(Y(e,{enabled:r!==null,config:r}),0):(e.stdout.write(r?`enabled: site ${r.name}${r.org?` for organization ${r.org}`:""}, allow ${r.allowTracked?"every tracked session":r.allow.join(", ")||"nothing (list only)"}, every ${r.interval} s (runs inside lmctl serve daemon)
2306
2305
  `:`disabled (lmctl site enable --name NAME ... to run a site agent inside the lmctl daemon)
2307
- `),0)}async function wz(t,e,n={}){let r;try{r=_L(t.env??process.env)}catch(s){return t.stderr.write(`lmctl site: ${Ne(s)}; site agent not started
2308
- `),1}return r?Sw(yz(r),t,{...wL(!1),...n,signal:e}):0}function wL(t=!0){let e=new AbortController;if(t)for(let n of["SIGINT","SIGTERM"])process.once(n,()=>e.abort());return{fetch,signal:e.signal,now:Date.now,sleep:(n,r)=>new Promise(s=>{let o=setTimeout(s,n);r?.addEventListener("abort",()=>{clearTimeout(o),s()},{once:!0})}),lmctl:(n,{timeoutMs:r,env:s})=>new Promise((o,i)=>{let a=qR(process.execPath,[process.argv[1],...n],{env:s,stdio:["ignore","pipe","pipe"]}),l=Date.now(),c="";a.stdout.setEncoding("utf8"),a.stdout.on("data",m=>{c+=m,c.length>4*uw&&(c=c.slice(-2*uw))});let d="";a.stderr.setEncoding("utf8"),a.stderr.on("data",m=>{d=(d+m).slice(-4*QR)});let u=!1,f=setTimeout(()=>{u=!0,a.kill("SIGKILL")},r);a.on("error",m=>{clearTimeout(f),i(m)}),a.on("close",(m,p)=>{if(clearTimeout(f),m===0){o(c);return}let _=ZR(c)??d.trim().split(`
2306
+ `),0)}async function yz(t,e,n={}){let r;try{r=_L(t.env??process.env)}catch(s){return t.stderr.write(`lmctl site: ${Ne(s)}; site agent not started
2307
+ `),1}return r?Sw(gz(r),t,{...wL(!1),...n,signal:e}):0}function wL(t=!0){let e=new AbortController;if(t)for(let n of["SIGINT","SIGTERM"])process.once(n,()=>e.abort());return{fetch,signal:e.signal,now:Date.now,sleep:(n,r)=>new Promise(s=>{let o=setTimeout(s,n);r?.addEventListener("abort",()=>{clearTimeout(o),s()},{once:!0})}),lmctl:(n,{timeoutMs:r,env:s})=>new Promise((o,i)=>{let a=qR(process.execPath,[process.argv[1],...n],{env:s,stdio:["ignore","pipe","pipe"]}),l=Date.now(),c="";a.stdout.setEncoding("utf8"),a.stdout.on("data",m=>{c+=m,c.length>4*uw&&(c=c.slice(-2*uw))});let d="";a.stderr.setEncoding("utf8"),a.stderr.on("data",m=>{d=(d+m).slice(-4*QR)});let u=!1,f=setTimeout(()=>{u=!0,a.kill("SIGKILL")},r);a.on("error",m=>{clearTimeout(f),i(m)}),a.on("close",(m,p)=>{if(clearTimeout(f),m===0){o(c);return}let _=ZR(c)??d.trim().split(`
2309
2308
  `).slice(-2).join(" "),h={command:["lmctl",...n],exit_code:m,signal:p??null,timed_out:u,stdout_tail:Wf(c),stderr_tail:Wf(d),started_at:new Date(l).toISOString(),ended_at:new Date().toISOString(),duration_ms:Date.now()-l};i(new rc(u?`lmctl ${n[0]} timed out after ${r} ms`:`lmctl ${n[0]} exited ${m??p}${_?`: ${_}`:""}`,h))})})}}function XR(t){let e=t.kind==="repeat"?`every ${t.every_min} min`:"once",n=t.last_result?`last ${t.last_result.state} ${t.last_result.at}`:"no run yet";return`${t.id} ${t.siteid} ${t.path??t.teamfile}:${t.alias} ${e} ${t.state}${t.waiting?` (${t.waiting})`:""} ${t.next_run_at?`next ${t.next_run_at} `:""}${n} runs ${t.runs}, failed ${t.failures}`}async function EL(t,e,n){let[r,...s]=t,o=ce(s,["--every","--org"],["--json","--run-now"]);if(o.error)return O(e,`${o.error}
2310
2309
  ${ve}`);let i=F(o,"--org");if(i!==void 0&&!Cs.test(i))return O(e,"lmctl site schedule: --org must be an organization id (lmctl site orgs)");let a=z(o,"--json"),l=cr(e,n);if(!l)return O(e,dr);let c=i?{"x-lmctl-org":i}:{},d=async(f,m,p)=>(await l.call(f,`/api/sessions/schedules${m}`,p,!0,c)).json,u=o.positionals;try{if(r==="add"){let[f,m,p,..._]=u;if(!f||!m||p===void 0||_.length)return O(e,ve);if(!Pr.test(f))return O(e,`lmctl site schedule: invalid site name ${f}`);let h=qi(m);if(!h)return O(e,"lmctl site schedule: the target must be TEAMFILE:ALIAS (as lmctl site list shows it, or the teamfile basename)");if(!p.trim()||Buffer.byteLength(p)>Io)return O(e,`lmctl site schedule: the prompt must be 1-${Io} bytes`);let g=F(o,"--every"),w=g===void 0?void 0:Number(g);if(w!==void 0&&(!Number.isSafeInteger(w)||w<1||w>1440))return O(e,"lmctl site schedule: --every must be 1-1440 minutes");if(z(o,"--run-now")&&w===void 0)return O(e,"lmctl site schedule: --run-now goes with --every (without --every the prompt runs now once)");let y=h.teamfile.startsWith("/"),E=await d("POST","",{siteid:f,teamfile:y?Bi(h.teamfile):h.teamfile,...y?{path:h.teamfile}:{},alias:h.alias,text:p,...w!==void 0?{every_min:w,run_now:z(o,"--run-now")}:{}}),T=E.schedule;return a?(Y(e,E),0):(e.stdout.write(T.kind==="once"?`running ${T.id} on ${f} (job ${String(E.job_id)}); the answer: lmctl site schedule show ${T.id}
2311
2310
  `:`scheduled ${T.id} on ${f}: every ${T.every_min} min, ${T.state==="running"?"running now":`next run ${T.next_run_at}`}
2312
2311
  `),0)}if(r==="list"){let[f,...m]=u;if(m.length)return O(e,ve);let p=(await d("GET",f?`?siteid=${encodeURIComponent(f)}`:"")).schedules??[];if(a)return Y(e,{schedules:p}),0;if(!p.length)return e.stdout.write(`no scheduled prompts
2313
2312
  `),0;for(let _ of p)e.stdout.write(`${XR(_)}
2314
- `);return 0}if(["show","run","enable","disable","rm"].includes(r??"")){let[f,...m]=u;if(!f||m.length)return O(e,ve);if(!Ez.test(f))return O(e,`lmctl site schedule: invalid schedule id ${f} (see lmctl site schedule list)`);let p=r==="show"?await d("GET",`/${f}`):r==="rm"?await d("DELETE",`/${f}`):await d("POST",`/${f}/${r}`,{});if(a)return Y(e,p),0;if(r==="rm")return e.stdout.write(`deleted ${f}
2313
+ `);return 0}if(["show","run","enable","disable","rm"].includes(r??"")){let[f,...m]=u;if(!f||m.length)return O(e,ve);if(!wz.test(f))return O(e,`lmctl site schedule: invalid schedule id ${f} (see lmctl site schedule list)`);let p=r==="show"?await d("GET",`/${f}`):r==="rm"?await d("DELETE",`/${f}`):await d("POST",`/${f}/${r}`,{});if(a)return Y(e,p),0;if(r==="rm")return e.stdout.write(`deleted ${f}
2315
2314
  `),0;let _=p.schedule;if(e.stdout.write(`${XR(_)}
2316
2315
  `),r==="run"&&e.stdout.write(`started job ${String(p.job_id)}
2317
2316
  `),r==="show"){e.stdout.write(`prompt: ${_.text}
@@ -2330,10 +2329,10 @@ ${ve}`);let o=F(s,"--org");if(o!==void 0&&!Cs.test(o))return O(n,`lmctl site ${t
2330
2329
  ${ve}`);let[s,...o]=r.positionals;if(s===void 0||o.length)return O(e,ve);if(s.trim().length<2||Buffer.byteLength(s)>200)return O(e,"lmctl site search: the text must be 2-200 bytes");let i=F(r,"--site"),a=F(r,"--since")??"24h",l=Number(F(r,"--limit")??50);if(i!==void 0&&!Pr.test(i))return O(e,`lmctl site search: invalid site name ${i}`);if(!["24h","7d","all"].includes(a))return O(e,"lmctl site search: --since must be 24h, 7d or all");if(!Number.isSafeInteger(l)||l<1||l>100)return O(e,"lmctl site search: --limit must be 1-100");let c=F(r,"--org");if(c!==void 0&&!Cs.test(c))return O(e,"lmctl site search: --org must be an organization id (lmctl site orgs)");let d=cr(e,n);if(!d)return O(e,dr);let u=c?{"x-lmctl-org":c}:{};try{let f=(await d.call("POST","/api/sessions/search",{text:s,since:a,limit:l,...i?{site:i}:{}},!0,u)).json,m=n.now()+Number(F(r,"--timeout")??60)*1e3,p;for(;p=(await d.call("GET",`/api/sessions/search/${f.search_id}`,void 0,!0,u)).json,!(["done","truncated","failed"].includes(p.state)||n.now()>=m||n.signal?.aborted);)await n.sleep(500,n.signal);if(z(r,"--json"))return Y(e,p),p.state==="failed"?1:0;let _=p.results.reduce((h,g)=>h+g.hits.length,0);e.stdout.write(`${_} match${_===1?"":"es"} in ${p.results.length} session${p.results.length===1?"":"s"} (${p.state}; sites: ${p.sites.map(h=>`${h.siteid} ${h.state}`).join(", ")}${p.skipped?`; ${p.skipped} not searched`:""})
2331
2330
  `);for(let h of p.results){e.stdout.write(`== ${h.siteid} ${h.path}:${h.alias}${h.truncated?" (searched the newest part only)":""}
2332
2331
  `);for(let g of h.hits)e.stdout.write(` ${g.timestamp} ${g.role==="user"?"request ":"response"} ${g.snippet}
2333
- `)}return p.state==="failed"?1:0}catch(f){return O(e,`lmctl site search: ${Ne(f)}`)}}async function Tz(t,e,n=wL()){let[r,...s]=t;if(!r||r==="--help"||r==="-h"||r==="help")return e.stdout.write(`${ve}
2332
+ `)}return p.state==="failed"?1:0}catch(f){return O(e,`lmctl site search: ${Ne(f)}`)}}async function Ez(t,e,n=wL()){let[r,...s]=t;if(!r||r==="--help"||r==="-h"||r==="help")return e.stdout.write(`${ve}
2334
2333
  `),r?0:2;if(s.includes("--help")||s.includes("-h"))return e.stdout.write(`${ve}
2335
2334
  `),0;switch(r){case"serve":return Sw(s,e,n);case"list":return dL(s,e,n);case"prompt":return fL(s,e,n);case"remove":return hL(s,e,n);case"orgs":return pL(s,e,n);case"tail":return mL(s,e,n);case"schedule":return EL(s,e,n);case"attention":return bw(s,e,n);case"new-session":case"sessions-created":case"archive-session":return TL(r,s,e,n);case"search-local":return lL(s,e);case"search":return vL(s,e,n);case"enable":return gL(s,e);case"disable":return yL(s,e);case"status":return Jf(s,e);default:return O(e,`lmctl site: unknown subcommand ${r}
2336
- ${ve}`)}}var nc,Pr,Xf,Cs,Io,yw,dw,hz,ww,Ls,uw,JR,VR,Hi,jf,KR,qf,fw,ve,An,dr,QR,rc,Wf,_z,ec,cw,WR,HR,kn,bo,gz,rL,Ez,Gi=C(()=>{"use strict";he();Nt();Tt();Fn();PR();nc="lmctl-site/1",Pr=/^[A-Za-z0-9][A-Za-z0-9._-]{0,52}$/,Xf=/^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/,Cs=/^[A-Za-z0-9_-]{1,128}$/,Io=8192,yw=/^[a-z0-9][a-z0-9-]{1,39}$/,dw="lmctl-site-new-session/1",hz=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,79}$/,ww="lmctl-site-search/1",Ls={perSessionBytes:8*1024*1024,perSessionMs:3e3,totalMs:25e3,hitsPerSession:5,totalHits:100},uw=256*1024,JR=100,VR=20,Hi=50,jf=4e3,KR=64*1024,qf="lmctl-site-tail/1",fw=3*3600,ve=`usage: lmctl site serve --name NAME [--org ORG] [--since 24h] [--allow TEAMFILE[:ALIAS]]... [--interval SECONDS]
2335
+ ${ve}`)}}var nc,Pr,Xf,Cs,Io,yw,dw,pz,ww,Ls,uw,JR,VR,Hi,jf,KR,qf,fw,ve,An,dr,QR,rc,Wf,hz,ec,cw,WR,HR,kn,bo,_z,rL,wz,Gi=C(()=>{"use strict";he();Nt();Tt();Fn();PR();nc="lmctl-site/1",Pr=/^[A-Za-z0-9][A-Za-z0-9._-]{0,52}$/,Xf=/^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/,Cs=/^[A-Za-z0-9_-]{1,128}$/,Io=8192,yw=/^[a-z0-9][a-z0-9-]{1,39}$/,dw="lmctl-site-new-session/1",pz=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,79}$/,ww="lmctl-site-search/1",Ls={perSessionBytes:8*1024*1024,perSessionMs:3e3,totalMs:25e3,hitsPerSession:5,totalHits:100},uw=256*1024,JR=100,VR=20,Hi=50,jf=4e3,KR=64*1024,qf="lmctl-site-tail/1",fw=3*3600,ve=`usage: lmctl site serve --name NAME [--org ORG] [--since 24h] [--allow TEAMFILE[:ALIAS]]... [--interval SECONDS]
2337
2336
  [--new-session-root DIR]... [--new-session-cap N] [--allow-shell]
2338
2337
  lmctl site list [--org ORG] [--json] [--attention]
2339
2338
  lmctl site attention [--all] [--stalled-min N] [--org ORG] [--json]
@@ -2382,24 +2381,24 @@ ${ve}`)}}var nc,Pr,Xf,Cs,Io,yw,dw,hz,ww,Ls,uw,JR,VR,Hi,jf,KR,qf,fw,ve,An,dr,QR,r
2382
2381
  disable stop running the site agent in the daemon from its next start; status shows the stored settings
2383
2382
 
2384
2383
  Server: LMCTL_SITE_API_URL (default https://lmctl.ai). Identity: LMCTL_APPKEY, LMCTL_APPKEY_FILE or
2385
- $XDG_CONFIG_HOME/lmctl/appkey.json (same appkey as the lmctl.ai tools).`;An=class extends Error{status;code;constructor(e,n){super(`${e} ${n}`),this.status=e,this.code=n}};dr="lmctl site: no appkey found (set LMCTL_APPKEY or LMCTL_APPKEY_FILE, or put it in ~/.config/lmctl/appkey.json)";QR=8*1024,rc=class extends Error{run;constructor(e,n){super(e),this.run=n,this.name="LmctlRunError"}},Wf=(t,e=QR)=>{let n=Buffer.from(t);return n.length<=e?t:n.subarray(n.length-e).toString().replace(/^\uFFFD+/,"")};_z="lmctl-site-shell/1",ec={defaultTimeoutS:30,maxTimeoutS:120,outputBytes:64*1024,commandBytes:8192},cw=t=>t.replace(/lmk_[A-Za-z0-9_-]{8,}/g,"[redacted-appkey]").replace(/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]*/g,"[redacted-token]");WR=t=>typeof t=="string"&&!Number.isNaN(Date.parse(t))?t:null;HR=new Set(["queue-operation","file-history-snapshot","summary"]);kn=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?t:null,bo=(t,e=160)=>typeof t=="string"?t.slice(0,e):null,gz=new Set(["input","output","cache_read","cache_write","cache_write_5m","cache_write_1h","reasoning"]);rL=t=>{let e=t??null;return e&&(e.state==="per_response"||e.state==="unavailable")?{usage_coverage:{state:e.state,reason:bo(e.reason,300)}}:{}};Ez=/^[a-f0-9]{24}$/});function Iw(t,e){let n=Number(t.pragma("busy_timeout",{simple:!0}));t.pragma("busy_timeout = 0");try{return e()}finally{t.pragma(`busy_timeout = ${n}`)}}function Ji(t,e){return t.prepare("SELECT 1 FROM on_demand_launches WHERE job_id = ?").get(e)!==void 0}function SL(t,e,n,r){if(t.prepare(`UPDATE on_demand_launches SET phase = 'dispatching', run_id = ?, updated_at = ?
2384
+ $XDG_CONFIG_HOME/lmctl/appkey.json (same appkey as the lmctl.ai tools).`;An=class extends Error{status;code;constructor(e,n){super(`${e} ${n}`),this.status=e,this.code=n}};dr="lmctl site: no appkey found (set LMCTL_APPKEY or LMCTL_APPKEY_FILE, or put it in ~/.config/lmctl/appkey.json)";QR=8*1024,rc=class extends Error{run;constructor(e,n){super(e),this.run=n,this.name="LmctlRunError"}},Wf=(t,e=QR)=>{let n=Buffer.from(t);return n.length<=e?t:n.subarray(n.length-e).toString().replace(/^\uFFFD+/,"")};hz="lmctl-site-shell/1",ec={defaultTimeoutS:30,maxTimeoutS:120,outputBytes:64*1024,commandBytes:8192},cw=t=>t.replace(/lmk_[A-Za-z0-9_-]{8,}/g,"[redacted-appkey]").replace(/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]*/g,"[redacted-token]");WR=t=>typeof t=="string"&&!Number.isNaN(Date.parse(t))?t:null;HR=new Set(["queue-operation","file-history-snapshot","summary"]);kn=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?t:null,bo=(t,e=160)=>typeof t=="string"?t.slice(0,e):null,_z=new Set(["input","output","cache_read","cache_write","cache_write_5m","cache_write_1h","reasoning"]);rL=t=>{let e=t??null;return e&&(e.state==="per_response"||e.state==="unavailable")?{usage_coverage:{state:e.state,reason:bo(e.reason,300)}}:{}};wz=/^[a-f0-9]{24}$/});function Iw(t,e){let n=Number(t.pragma("busy_timeout",{simple:!0}));t.pragma("busy_timeout = 0");try{return e()}finally{t.pragma(`busy_timeout = ${n}`)}}function Ji(t,e){return t.prepare("SELECT 1 FROM on_demand_launches WHERE job_id = ?").get(e)!==void 0}function SL(t,e,n,r){if(t.prepare(`UPDATE on_demand_launches SET phase = 'dispatching', run_id = ?, updated_at = ?
2386
2385
  WHERE conversation_id = ? AND generation = ? AND job_id = ? AND phase = 'reserved' AND receipt_path = ?`).run(n,new Date().toISOString(),r.conversationId,r.generation,e,r.receiptPath).changes!==1)throw new Error("On-demand generation no longer owns this dispatch")}function bL(t,e,n,r){return t.prepare(`SELECT 1 FROM on_demand_launches WHERE conversation_id = ? AND generation = ?
2387
- AND job_id = ? AND run_id = ? AND phase = 'dispatching'`).get(r.conversationId,r.generation,e,n)!==void 0}var kw=C(()=>{"use strict"});import{randomUUID as vz}from"node:crypto";function Vi(t){return typeof t=="number"&&Number.isFinite(t)&&Math.abs(t)<=864e13}function kL(t){if(t===null||typeof t!="object")return!1;let e=t;return typeof e.previous_tick_at=="string"&&Number.isFinite(Date.parse(e.previous_tick_at))&&typeof e.tick_at=="string"&&Number.isFinite(Date.parse(e.tick_at))&&Vi(e.gap_ms)&&Vi(e.interval_ms)&&e.interval_ms>0&&Vi(e.approx_missed_ticks)&&Vi(e.skipped_overlaps)&&typeof e.same_process=="boolean"&&Vi(e.pid)}function AL(t){let e=t.prepare("SELECT v FROM kv WHERE k = ?").get(IL);if(e===void 0)return null;try{let n=JSON.parse(e.v);return Vi(n.at_ms)&&typeof n.proc=="string"?{at_ms:n.at_ms,proc:n.proc,pid:typeof n.pid=="number"?n.pid:0}:null}catch{return null}}function NL(t,e,n,r=bz,s=process.pid){let o=n.atMs??e;return t.transaction(()=>{let i=AL(t),a=null;if(i!==null&&o-i.at_ms>Sz*n.intervalMs&&o>i.at_ms){let l=o-i.at_ms;a={previous_tick_at:new Date(i.at_ms).toISOString(),tick_at:new Date(o).toISOString(),gap_ms:l,interval_ms:n.intervalMs,approx_missed_ticks:Math.max(0,Math.round(l/n.intervalMs)-1),skipped_overlaps:i.proc===r?n.skippedOverlaps:0,same_process:i.proc===r,pid:s},t.prepare("INSERT INTO events(ts, scan, team, status, note) VALUES (?, NULL, ?, ?, ?)").run(a.tick_at,Aw,Nw,JSON.stringify(a))}return t.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(IL,JSON.stringify({at_ms:o,proc:r,pid:s})),a}).immediate()}function oc(t){let e=Math.round(t/6e4);return e<1?`${Math.round(t/1e3)}s`:e<120?`${e}m`:`${Math.floor(e/60)}h${String(e%60).padStart(2,"0")}m`}function Vf(t){return`no cron evaluation for ${oc(t.gap_ms)} (every ${oc(t.interval_ms)}; about ${t.approx_missed_ticks} ticks missed), ${t.same_process?`same process pid ${t.pid}`:"a different process than the previous evaluation (restart)"}${t.same_process?`, ${t.skipped_overlaps} interval fires dropped while a tick was still running`:""}`}function xL(t,e=20){let n=t.prepare("SELECT note FROM events WHERE team = ? AND status = ? ORDER BY id DESC LIMIT ?").all(Aw,Nw,e),r=[];for(let s of n)try{let o=JSON.parse(s.note??"");kL(o)&&r.push(o)}catch{}return r}function ic(t,e){let n=AL(t),r=new Date(e-24*36e5).toISOString(),s=t.prepare("SELECT note FROM events WHERE team = ? AND status = ? AND ts >= ? ORDER BY id DESC LIMIT 100000").all(Aw,Nw,r),o=0,i=0;for(let a of s)try{let l=JSON.parse(a.note??"");if(!kL(l))continue;o+=1,i=Math.max(i,l.gap_ms)}catch{}return{last_tick_at:n===null?null:new Date(n.at_ms).toISOString(),last_tick_age_ms:n===null?null:Math.max(0,e-n.at_ms),gaps_24h:o,longest_gap_24h_ms:i}}var IL,Aw,Nw,Sz,bz,xw=C(()=>{"use strict";IL="cron.last_tick",Aw="lmcron",Nw="tick_gap",Sz=2,bz=vz()});function Ce(){return`${new Date().toISOString().replace("Z","000Z")}`}function Ur(t,e){if(!t.trim())throw new ko("INVALID_ARGUMENT",`${e} must not be blank`);return t}var ko,Ao=C(()=>{"use strict";ko=class extends Error{code;exitCode;constructor(e,n,r=2){super(n),this.code=e,this.exitCode=r}}});var U,No=C(()=>{"use strict";U=class extends Error{code;exitCode;constructor(e,n,r=2){super(n),this.code=e,this.exitCode=r}}});function Lw(t){let e;try{if(typeof t!="string")throw new Error("expected a cron expression string");let n=t.trim().split(/\s+/);if(n.length!==5)throw new Error("expected five fields: minute hour day-of-month month day-of-week");e="minute";let r=ac(n[0],0,59);e="hour";let s=ac(n[1],0,23);e="dayOfMonth";let o=ac(n[2],1,31);e="month";let i=ac(n[3],1,12);e="dayOfWeek";let a=ac(n[4],0,7,c=>c===7?0:c);return{ok:!0,schedule:{__brand:"CronSchedule",minute:r,hour:s,dayOfMonth:o,month:i,dayOfWeek:a}}}catch(n){let r=n instanceof Error?n.message:String(n);return{ok:!1,error:e?{message:r,field:e}:{message:r}}}}function ac(t,e,n,r=s=>s){if(t.length===0)throw new Error("empty field");let s=new Set;for(let o of t.split(",")){if(o.length===0)throw new Error(`invalid list in "${t}"`);let i=o.split("/");if(i.length>2)throw new Error(`invalid step in "${o}"`);let a=i[0],l=i[1]===void 0?1:Rw(i[1],1,n-e+1,o),c=a.split("-");if(c.length>2)throw new Error(`invalid range in "${o}"`);let d=a==="*"?e:Rw(c[0],e,n,o),u=a==="*"?n:c[1]!==void 0?Rw(c[1],e,n,o):i[1]?n:d;if(d>u)throw new Error(`range starts after it ends in "${o}"`);for(let f=d;f<=u;f+=l)s.add(r(f))}return{values:s,wildcard:t.split(",").some(o=>o.split("/")[0]==="*")}}function Rw(t,e,n,r){if(!/^\d+$/.test(t))throw new Error(`expected an integer in "${r}"`);let s=Number(t);if(!Number.isSafeInteger(s)||s<e||s>n)throw new Error(`value ${t} is outside ${e}-${n}`);return s}function Iz(t,e){let n=t;if(!n.minute.values.has(e.getMinutes())||!n.hour.values.has(e.getHours())||!n.month.values.has(e.getMonth()+1))return!1;let r=n.dayOfMonth.values.has(e.getDate()),s=n.dayOfWeek.values.has(e.getDay());return n.dayOfMonth.wildcard?s:n.dayOfWeek.wildcard?r:r||s}function RL(t,e,n){let r=e.getTime(),s=n.getTime();if(s<r)throw new RangeError("untilInclusive must not precede sinceExclusive");for(let o=(Math.floor(r/6e4)+1)*6e4;o<=s;o+=6e4)if(Iz(t,new Date(o)))return!0;return!1}var LL=C(()=>{"use strict"});import{spawn as kz}from"node:child_process";import{closeSync as Az,existsSync as Nz,mkdirSync as xz,openSync as Rz,readdirSync as Lz,unlinkSync as Cz}from"node:fs";import{homedir as Oz}from"node:os";import{join as Kf}from"node:path";function zf(){return process.env.LMBEE_CRON_LOG_DIR?process.env.LMBEE_CRON_LOG_DIR:Kf(Oz(),".lmbee","cron-logs")}function $z(t,e){try{let n=Lz(t).sort();for(let r of n.slice(0,Math.max(0,n.length-e)))try{Cz(Kf(t,r))}catch{}}catch{}}function Pz(t,e){return[...e.spawnPrefix??(e.systemdUnitName!==void 0?[...CL,"--unit",e.systemdUnitName,"--"]:[...CL,"--"]),"sh","-c",t]}function lc(t,e={}){let n=Kf(e.logDir??zf(),String(t.id));Nz(n)||xz(n,{recursive:!0});let r=Kf(n,`${new Date().toISOString().replace(/[:.]/g,"-")}.log`),s=Rz(r,"a"),o=Pz(t.action_payload,e),[i,...a]=o,l;try{l=kz(i,a,{detached:!0,stdio:["ignore",s,s],...e.cwd!==void 0?{cwd:e.cwd}:{},...e.env!==void 0?{env:e.env}:{}})}finally{Az(s)}l.unref();let c=l.pid??null;if(c!==null)try{e.onSpawn?.(c)}catch{}let d=!1,u=e.timeoutMs===void 0?OL:e.timeoutMs,f=e.sigkillGraceMs??Mz,m=u===null?void 0:setTimeout(()=>{if(d)return;let _=l.pid;if(_!==void 0){try{process.kill(-_,"SIGTERM")}catch{}setTimeout(()=>{try{process.kill(-_,0)}catch{return}try{process.kill(-_,"SIGKILL")}catch{}},f).unref()}process.stderr.write(`[lmcron] job ${t.id} timed out after ${u}ms, sending SIGTERM
2388
- `)},u??OL);m?.unref();let p=(_,h)=>{d||(d=!0,m!==void 0&&clearTimeout(m),$z(n,Dz),e.onExit?.(_,h,c,r))};l.on("error",_=>{process.stderr.write(`[lmcron] job ${t.id} spawn error: ${_.message}
2389
- `),p(null,_)}),l.on("exit",_=>{p(_)})}var CL,Dz,OL,Mz,Cw=C(()=>{"use strict";CL=["systemd-run","--user","--scope","--collect","--quiet"],Dz=10,OL=50*6e4,Mz=5e3});import{createHash as Uz,randomUUID as Fz}from"node:crypto";function fc(t){let{run_token_hash:e,...n}=t;return n}function DL(t){return Uz("sha256").update(t,"utf8").digest("hex")}function dn(t){try{return t()}catch(e){if(e instanceof U)throw e;if(e instanceof ko)throw new U(e.code,e.message,e.exitCode);let n=e&&typeof e=="object"&&"code"in e?String(e.code):void 0,r=e instanceof Error?e.message:String(e);throw n!==void 0&&(n.startsWith("SQLITE_BUSY")||n.startsWith("SQLITE_LOCKED"))?new U("DB_BUSY","Database busy; retry after the current writer completes",5):n!==void 0&&n.startsWith("SQLITE_CONSTRAINT")?new U("STRUCTURAL_ERROR",r,2):new U("STORAGE_ERROR",r,1)}}function ML(t,e){return dn(()=>t.prepare("SELECT * FROM cron_runs WHERE id = ?").get(e)??null)}function bt(t,e){let n=ML(t,e);if(n===null)throw new U("NOT_FOUND",`Cron run ${e} does not exist`,3);return n}function Wz(t,e){return t.prepare("SELECT * FROM cron_runs WHERE run_token_hash = ?").get(e)??null}function Ki(t,e){return dn(()=>t.prepare(`SELECT * FROM cron_runs WHERE job_id = ? AND (${jz}) ORDER BY id DESC LIMIT 1`).get(e)??null)}function mc(t,e,n,r){return dn(()=>{let s=Ki(t,e);if(s!==null)return s.status==="escalated"?{kind:"escalation",run:s}:{kind:"overlap",run:s};let o=Fz(),i=Ce();try{let a=t.prepare(`INSERT INTO cron_runs(job_id, run_token_hash, status, execution_state, trigger_kind, config_snapshot, created_at, updated_at)
2386
+ AND job_id = ? AND run_id = ? AND phase = 'dispatching'`).get(r.conversationId,r.generation,e,n)!==void 0}var kw=C(()=>{"use strict"});import{randomUUID as Tz}from"node:crypto";function Vi(t){return typeof t=="number"&&Number.isFinite(t)&&Math.abs(t)<=864e13}function kL(t){if(t===null||typeof t!="object")return!1;let e=t;return typeof e.previous_tick_at=="string"&&Number.isFinite(Date.parse(e.previous_tick_at))&&typeof e.tick_at=="string"&&Number.isFinite(Date.parse(e.tick_at))&&Vi(e.gap_ms)&&Vi(e.interval_ms)&&e.interval_ms>0&&Vi(e.approx_missed_ticks)&&Vi(e.skipped_overlaps)&&typeof e.same_process=="boolean"&&Vi(e.pid)}function AL(t){let e=t.prepare("SELECT v FROM kv WHERE k = ?").get(IL);if(e===void 0)return null;try{let n=JSON.parse(e.v);return Vi(n.at_ms)&&typeof n.proc=="string"?{at_ms:n.at_ms,proc:n.proc,pid:typeof n.pid=="number"?n.pid:0}:null}catch{return null}}function NL(t,e,n,r=Sz,s=process.pid){let o=n.atMs??e;return t.transaction(()=>{let i=AL(t),a=null;if(i!==null&&o-i.at_ms>vz*n.intervalMs&&o>i.at_ms){let l=o-i.at_ms;a={previous_tick_at:new Date(i.at_ms).toISOString(),tick_at:new Date(o).toISOString(),gap_ms:l,interval_ms:n.intervalMs,approx_missed_ticks:Math.max(0,Math.round(l/n.intervalMs)-1),skipped_overlaps:i.proc===r?n.skippedOverlaps:0,same_process:i.proc===r,pid:s},t.prepare("INSERT INTO events(ts, scan, team, status, note) VALUES (?, NULL, ?, ?, ?)").run(a.tick_at,Aw,Nw,JSON.stringify(a))}return t.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(IL,JSON.stringify({at_ms:o,proc:r,pid:s})),a}).immediate()}function oc(t){let e=Math.round(t/6e4);return e<1?`${Math.round(t/1e3)}s`:e<120?`${e}m`:`${Math.floor(e/60)}h${String(e%60).padStart(2,"0")}m`}function Vf(t){return`no cron evaluation for ${oc(t.gap_ms)} (every ${oc(t.interval_ms)}; about ${t.approx_missed_ticks} ticks missed), ${t.same_process?`same process pid ${t.pid}`:"a different process than the previous evaluation (restart)"}${t.same_process?`, ${t.skipped_overlaps} interval fires dropped while a tick was still running`:""}`}function xL(t,e=20){let n=t.prepare("SELECT note FROM events WHERE team = ? AND status = ? ORDER BY id DESC LIMIT ?").all(Aw,Nw,e),r=[];for(let s of n)try{let o=JSON.parse(s.note??"");kL(o)&&r.push(o)}catch{}return r}function ic(t,e){let n=AL(t),r=new Date(e-24*36e5).toISOString(),s=t.prepare("SELECT note FROM events WHERE team = ? AND status = ? AND ts >= ? ORDER BY id DESC LIMIT 100000").all(Aw,Nw,r),o=0,i=0;for(let a of s)try{let l=JSON.parse(a.note??"");if(!kL(l))continue;o+=1,i=Math.max(i,l.gap_ms)}catch{}return{last_tick_at:n===null?null:new Date(n.at_ms).toISOString(),last_tick_age_ms:n===null?null:Math.max(0,e-n.at_ms),gaps_24h:o,longest_gap_24h_ms:i}}var IL,Aw,Nw,vz,Sz,xw=C(()=>{"use strict";IL="cron.last_tick",Aw="lmcron",Nw="tick_gap",vz=2,Sz=Tz()});function Ce(){return`${new Date().toISOString().replace("Z","000Z")}`}function Ur(t,e){if(!t.trim())throw new ko("INVALID_ARGUMENT",`${e} must not be blank`);return t}var ko,Ao=C(()=>{"use strict";ko=class extends Error{code;exitCode;constructor(e,n,r=2){super(n),this.code=e,this.exitCode=r}}});var U,No=C(()=>{"use strict";U=class extends Error{code;exitCode;constructor(e,n,r=2){super(n),this.code=e,this.exitCode=r}}});function Lw(t){let e;try{if(typeof t!="string")throw new Error("expected a cron expression string");let n=t.trim().split(/\s+/);if(n.length!==5)throw new Error("expected five fields: minute hour day-of-month month day-of-week");e="minute";let r=ac(n[0],0,59);e="hour";let s=ac(n[1],0,23);e="dayOfMonth";let o=ac(n[2],1,31);e="month";let i=ac(n[3],1,12);e="dayOfWeek";let a=ac(n[4],0,7,c=>c===7?0:c);return{ok:!0,schedule:{__brand:"CronSchedule",minute:r,hour:s,dayOfMonth:o,month:i,dayOfWeek:a}}}catch(n){let r=n instanceof Error?n.message:String(n);return{ok:!1,error:e?{message:r,field:e}:{message:r}}}}function ac(t,e,n,r=s=>s){if(t.length===0)throw new Error("empty field");let s=new Set;for(let o of t.split(",")){if(o.length===0)throw new Error(`invalid list in "${t}"`);let i=o.split("/");if(i.length>2)throw new Error(`invalid step in "${o}"`);let a=i[0],l=i[1]===void 0?1:Rw(i[1],1,n-e+1,o),c=a.split("-");if(c.length>2)throw new Error(`invalid range in "${o}"`);let d=a==="*"?e:Rw(c[0],e,n,o),u=a==="*"?n:c[1]!==void 0?Rw(c[1],e,n,o):i[1]?n:d;if(d>u)throw new Error(`range starts after it ends in "${o}"`);for(let f=d;f<=u;f+=l)s.add(r(f))}return{values:s,wildcard:t.split(",").some(o=>o.split("/")[0]==="*")}}function Rw(t,e,n,r){if(!/^\d+$/.test(t))throw new Error(`expected an integer in "${r}"`);let s=Number(t);if(!Number.isSafeInteger(s)||s<e||s>n)throw new Error(`value ${t} is outside ${e}-${n}`);return s}function bz(t,e){let n=t;if(!n.minute.values.has(e.getMinutes())||!n.hour.values.has(e.getHours())||!n.month.values.has(e.getMonth()+1))return!1;let r=n.dayOfMonth.values.has(e.getDate()),s=n.dayOfWeek.values.has(e.getDay());return n.dayOfMonth.wildcard?s:n.dayOfWeek.wildcard?r:r||s}function RL(t,e,n){let r=e.getTime(),s=n.getTime();if(s<r)throw new RangeError("untilInclusive must not precede sinceExclusive");for(let o=(Math.floor(r/6e4)+1)*6e4;o<=s;o+=6e4)if(bz(t,new Date(o)))return!0;return!1}var LL=C(()=>{"use strict"});import{spawn as Iz}from"node:child_process";import{closeSync as kz,existsSync as Az,mkdirSync as Nz,openSync as xz,readdirSync as Rz,unlinkSync as Lz}from"node:fs";import{homedir as Cz}from"node:os";import{join as Kf}from"node:path";function zf(){return process.env.LMBEE_CRON_LOG_DIR?process.env.LMBEE_CRON_LOG_DIR:Kf(Cz(),".lmbee","cron-logs")}function Mz(t,e){try{let n=Rz(t).sort();for(let r of n.slice(0,Math.max(0,n.length-e)))try{Lz(Kf(t,r))}catch{}}catch{}}function $z(t,e){return[...e.spawnPrefix??(e.systemdUnitName!==void 0?[...CL,"--unit",e.systemdUnitName,"--"]:[...CL,"--"]),"sh","-c",t]}function lc(t,e={}){let n=Kf(e.logDir??zf(),String(t.id));Az(n)||Nz(n,{recursive:!0});let r=Kf(n,`${new Date().toISOString().replace(/[:.]/g,"-")}.log`),s=xz(r,"a"),o=$z(t.action_payload,e),[i,...a]=o,l;try{l=Iz(i,a,{detached:!0,stdio:["ignore",s,s],...e.cwd!==void 0?{cwd:e.cwd}:{},...e.env!==void 0?{env:e.env}:{}})}finally{kz(s)}l.unref();let c=l.pid??null;if(c!==null)try{e.onSpawn?.(c)}catch{}let d=!1,u=e.timeoutMs===void 0?OL:e.timeoutMs,f=e.sigkillGraceMs??Dz,m=u===null?void 0:setTimeout(()=>{if(d)return;let _=l.pid;if(_!==void 0){try{process.kill(-_,"SIGTERM")}catch{}setTimeout(()=>{try{process.kill(-_,0)}catch{return}try{process.kill(-_,"SIGKILL")}catch{}},f).unref()}process.stderr.write(`[lmcron] job ${t.id} timed out after ${u}ms, sending SIGTERM
2387
+ `)},u??OL);m?.unref();let p=(_,h)=>{d||(d=!0,m!==void 0&&clearTimeout(m),Mz(n,Oz),e.onExit?.(_,h,c,r))};l.on("error",_=>{process.stderr.write(`[lmcron] job ${t.id} spawn error: ${_.message}
2388
+ `),p(null,_)}),l.on("exit",_=>{p(_)})}var CL,Oz,OL,Dz,Cw=C(()=>{"use strict";CL=["systemd-run","--user","--scope","--collect","--quiet"],Oz=10,OL=50*6e4,Dz=5e3});import{createHash as Pz,randomUUID as Uz}from"node:crypto";function fc(t){let{run_token_hash:e,...n}=t;return n}function DL(t){return Pz("sha256").update(t,"utf8").digest("hex")}function dn(t){try{return t()}catch(e){if(e instanceof U)throw e;if(e instanceof ko)throw new U(e.code,e.message,e.exitCode);let n=e&&typeof e=="object"&&"code"in e?String(e.code):void 0,r=e instanceof Error?e.message:String(e);throw n!==void 0&&(n.startsWith("SQLITE_BUSY")||n.startsWith("SQLITE_LOCKED"))?new U("DB_BUSY","Database busy; retry after the current writer completes",5):n!==void 0&&n.startsWith("SQLITE_CONSTRAINT")?new U("STRUCTURAL_ERROR",r,2):new U("STORAGE_ERROR",r,1)}}function ML(t,e){return dn(()=>t.prepare("SELECT * FROM cron_runs WHERE id = ?").get(e)??null)}function bt(t,e){let n=ML(t,e);if(n===null)throw new U("NOT_FOUND",`Cron run ${e} does not exist`,3);return n}function jz(t,e){return t.prepare("SELECT * FROM cron_runs WHERE run_token_hash = ?").get(e)??null}function Ki(t,e){return dn(()=>t.prepare(`SELECT * FROM cron_runs WHERE job_id = ? AND (${Fz}) ORDER BY id DESC LIMIT 1`).get(e)??null)}function mc(t,e,n,r){return dn(()=>{let s=Ki(t,e);if(s!==null)return s.status==="escalated"?{kind:"escalation",run:s}:{kind:"overlap",run:s};let o=Uz(),i=Ce();try{let a=t.prepare(`INSERT INTO cron_runs(job_id, run_token_hash, status, execution_state, trigger_kind, config_snapshot, created_at, updated_at)
2390
2389
  VALUES (?, ?, 'pending', 'active', ?, ?, ?, ?)`).run(e,DL(o),n,r,i,i);return{kind:"claimed",run:bt(t,Number(a.lastInsertRowid)),token:o}}catch(a){let l=a&&typeof a=="object"&&"code"in a?String(a.code):void 0;if(l!==void 0&&l.startsWith("SQLITE_CONSTRAINT")){let c=Ki(t,e);if(c!==null)return c.status==="escalated"?{kind:"escalation",run:c}:{kind:"overlap",run:c}}throw a}})}function zi(t,e,n,r){return dn(()=>t.prepare(`UPDATE cron_runs SET status = 'running', execution_identity = ?, pid = ?, started_at = ?, updated_at = ?
2391
- WHERE id = ? AND status = 'pending'`).run(JSON.stringify(n),r,Ce(),Ce(),e).changes===1)}function Yi(t,e,n,r){t.prepare("UPDATE cron_runs SET execution_identity = ?, pid = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(n),r,Ce(),e)}function Hz(t,e){dn(()=>t.prepare(`UPDATE cron_runs SET execution_state = 'gone', execution_gone_at = ?, execution_uncertain_reason = NULL, updated_at = ?
2390
+ WHERE id = ? AND status = 'pending'`).run(JSON.stringify(n),r,Ce(),Ce(),e).changes===1)}function Yi(t,e,n,r){t.prepare("UPDATE cron_runs SET execution_identity = ?, pid = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(n),r,Ce(),e)}function Wz(t,e){dn(()=>t.prepare(`UPDATE cron_runs SET execution_state = 'gone', execution_gone_at = ?, execution_uncertain_reason = NULL, updated_at = ?
2392
2391
  WHERE id = ? AND execution_state != 'gone'`).run(Ce(),Ce(),e))}function pc(t,e,n){dn(()=>t.prepare(`UPDATE cron_runs SET execution_state = 'uncertain', execution_uncertain_reason = ?, updated_at = ?
2393
- WHERE id = ? AND execution_state != 'gone'`).run(n.slice(0,1024),Ce(),e))}function cc(t,e,n){let r=Ur(t,e);if(Buffer.byteLength(r,"utf8")>n)throw new U("INVALID_ARGUMENT",`${e} exceeds ${n} bytes`);return r}function Bz(t){if(t===void 0)return[];if(!Array.isArray(t))throw new U("INVALID_ARGUMENT","artifacts must be an array");if(t.length>Yf)throw new U("INVALID_ARGUMENT",`at most ${Yf} artifacts are allowed`);return t.map(e=>{if(typeof e!="string")throw new U("INVALID_ARGUMENT","artifacts must be strings");return cc(e,"artifact",Dw)})}function $L(t,e){if(t.status!=="succeeded"&&t.status!=="failed"&&t.status!=="escalated")throw new U("INVALID_ARGUMENT",'status must be "succeeded", "failed", or "escalated"');let n=cc(t.summary,"summary",xo),r=Bz(t.artifacts),s=null,o=null,i=null;if(t.status==="escalated"){s=cc(t.action??"","requested action",dc),i=t.reason!==void 0?cc(t.reason,"escalation reason",dc):n;let a=t.owner!==void 0?cc(t.owner,"owner",Ow):e;if(a===null||a.trim().length===0)throw new U("INVALID_ARGUMENT","an escalation requires an owner or a job with a configured default escalation owner");o=a}return{status:t.status,summary:n,artifacts:JSON.stringify(r),escalationAction:s,escalationOwner:o,escalationReason:i}}function PL(t,e){return t.status===e.status&&t.summary===e.summary&&t.artifacts===e.artifacts&&t.escalation_action===e.escalationAction&&t.escalation_owner===e.escalationOwner&&t.escalation_reason===e.escalationReason}function UL(t){try{let e=JSON.parse(t.config_snapshot);return typeof e.escalationOwner=="string"&&e.escalationOwner.trim().length>0?e.escalationOwner:null}catch{return null}}function $w(t,e,n){let r=$L(n,UL(e)),s=Ce();if(t.prepare(`UPDATE cron_runs SET status = ?, summary = ?, artifacts = ?, escalation_reason = ?, escalation_action = ?,
2392
+ WHERE id = ? AND execution_state != 'gone'`).run(n.slice(0,1024),Ce(),e))}function cc(t,e,n){let r=Ur(t,e);if(Buffer.byteLength(r,"utf8")>n)throw new U("INVALID_ARGUMENT",`${e} exceeds ${n} bytes`);return r}function Hz(t){if(t===void 0)return[];if(!Array.isArray(t))throw new U("INVALID_ARGUMENT","artifacts must be an array");if(t.length>Yf)throw new U("INVALID_ARGUMENT",`at most ${Yf} artifacts are allowed`);return t.map(e=>{if(typeof e!="string")throw new U("INVALID_ARGUMENT","artifacts must be strings");return cc(e,"artifact",Dw)})}function $L(t,e){if(t.status!=="succeeded"&&t.status!=="failed"&&t.status!=="escalated")throw new U("INVALID_ARGUMENT",'status must be "succeeded", "failed", or "escalated"');let n=cc(t.summary,"summary",xo),r=Hz(t.artifacts),s=null,o=null,i=null;if(t.status==="escalated"){s=cc(t.action??"","requested action",dc),i=t.reason!==void 0?cc(t.reason,"escalation reason",dc):n;let a=t.owner!==void 0?cc(t.owner,"owner",Ow):e;if(a===null||a.trim().length===0)throw new U("INVALID_ARGUMENT","an escalation requires an owner or a job with a configured default escalation owner");o=a}return{status:t.status,summary:n,artifacts:JSON.stringify(r),escalationAction:s,escalationOwner:o,escalationReason:i}}function PL(t,e){return t.status===e.status&&t.summary===e.summary&&t.artifacts===e.artifacts&&t.escalation_action===e.escalationAction&&t.escalation_owner===e.escalationOwner&&t.escalation_reason===e.escalationReason}function UL(t){try{let e=JSON.parse(t.config_snapshot);return typeof e.escalationOwner=="string"&&e.escalationOwner.trim().length>0?e.escalationOwner:null}catch{return null}}function $w(t,e,n){let r=$L(n,UL(e)),s=Ce();if(t.prepare(`UPDATE cron_runs SET status = ?, summary = ?, artifacts = ?, escalation_reason = ?, escalation_action = ?,
2394
2393
  escalation_owner = ?, reported_at = ?, finished_at = ?, updated_at = ?
2395
- WHERE id = ? AND status IN ${uc} AND reported_at IS NULL`).run(r.status,r.summary,r.artifacts,r.escalationReason,r.escalationAction,r.escalationOwner,s,s,s,e.id).changes===0){let i=bt(t,e.id);if(PL(i,r))return i;throw new U("CONFLICTING_REPORT",`Cron run ${e.id} already has a different terminal report`,4)}return bt(t,e.id)}function FL(t,e,n){return dn(()=>{let r=Wz(t,DL(e));if(r===null)throw new U("NOT_FOUND","No cron run matches the supplied report token",3);if(r.reported_at!==null||r.status!=="pending"&&r.status!=="running"){let s=$L(n,UL(r));if(PL(r,s))return r;throw new U("CONFLICTING_REPORT",`Cron run ${r.id} already has a different terminal report`,4)}return $w(t,r,n)})}function Qi(t,e,n){let r=t.transaction(()=>{let s=bt(t,e);s.reported_at===null&&(s.status==="pending"||s.status==="running")&&n.report!==void 0&&$w(t,s,n.report);let o=bt(t,e);if(o.reported_at===null&&(o.status==="pending"||o.status==="running")&&n.fallback!==void 0){let i=n.fallback.ok?"succeeded":"failed";t.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${uc} AND reported_at IS NULL`).run(i,n.fallback.summary.slice(0,xo),Ce(),Ce(),e)}return Hz(t,e),bt(t,e)});return dn(()=>r.immediate())}function jL(t,e,n){let r=t.transaction(()=>{let s=bt(t,e);s.reported_at===null&&(s.status==="pending"||s.status==="running")&&n.report!==void 0&&$w(t,s,n.report);let o=bt(t,e);if(o.reported_at===null&&(o.status==="pending"||o.status==="running")&&n.fallback!==void 0){let i=n.fallback.ok?"succeeded":"failed";t.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${uc} AND reported_at IS NULL`).run(i,n.fallback.summary.slice(0,xo),Ce(),Ce(),e)}return bt(t,e)});return dn(()=>r.immediate())}function Pw(t,e,n){return dn(()=>{let r=ML(t,e);if(r===null)return null;if(r.reported_at!==null||r.status!=="pending"&&r.status!=="running")return r;let s=n.ok?"succeeded":"failed";return t.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${uc} AND reported_at IS NULL`).run(s,n.summary.slice(0,xo),Ce(),Ce(),r.id),bt(t,r.id)})}function WL(t,e,n={}){let r=t.transaction(()=>{let s=bt(t,e),o=n.resolution!==void 0?n.resolution.trim():"",i=n.actor!==void 0?n.actor.trim():"",a=n.note!==void 0?n.note.trim():"",l=!1;if(s.execution_state!=="gone"){if(n.confirmStopped!==!0)throw new U("EXECUTION_FENCED",`Cron run ${e} execution state is "${s.execution_state}"; verify the process is gone and retry with --confirm-stopped`,4);t.prepare(`UPDATE cron_runs SET execution_state = 'gone', execution_gone_at = ?, execution_uncertain_reason = NULL,
2394
+ WHERE id = ? AND status IN ${uc} AND reported_at IS NULL`).run(r.status,r.summary,r.artifacts,r.escalationReason,r.escalationAction,r.escalationOwner,s,s,s,e.id).changes===0){let i=bt(t,e.id);if(PL(i,r))return i;throw new U("CONFLICTING_REPORT",`Cron run ${e.id} already has a different terminal report`,4)}return bt(t,e.id)}function FL(t,e,n){return dn(()=>{let r=jz(t,DL(e));if(r===null)throw new U("NOT_FOUND","No cron run matches the supplied report token",3);if(r.reported_at!==null||r.status!=="pending"&&r.status!=="running"){let s=$L(n,UL(r));if(PL(r,s))return r;throw new U("CONFLICTING_REPORT",`Cron run ${r.id} already has a different terminal report`,4)}return $w(t,r,n)})}function Qi(t,e,n){let r=t.transaction(()=>{let s=bt(t,e);s.reported_at===null&&(s.status==="pending"||s.status==="running")&&n.report!==void 0&&$w(t,s,n.report);let o=bt(t,e);if(o.reported_at===null&&(o.status==="pending"||o.status==="running")&&n.fallback!==void 0){let i=n.fallback.ok?"succeeded":"failed";t.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${uc} AND reported_at IS NULL`).run(i,n.fallback.summary.slice(0,xo),Ce(),Ce(),e)}return Wz(t,e),bt(t,e)});return dn(()=>r.immediate())}function jL(t,e,n){let r=t.transaction(()=>{let s=bt(t,e);s.reported_at===null&&(s.status==="pending"||s.status==="running")&&n.report!==void 0&&$w(t,s,n.report);let o=bt(t,e);if(o.reported_at===null&&(o.status==="pending"||o.status==="running")&&n.fallback!==void 0){let i=n.fallback.ok?"succeeded":"failed";t.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${uc} AND reported_at IS NULL`).run(i,n.fallback.summary.slice(0,xo),Ce(),Ce(),e)}return bt(t,e)});return dn(()=>r.immediate())}function Pw(t,e,n){return dn(()=>{let r=ML(t,e);if(r===null)return null;if(r.reported_at!==null||r.status!=="pending"&&r.status!=="running")return r;let s=n.ok?"succeeded":"failed";return t.prepare(`UPDATE cron_runs SET status = ?, summary = ?, finished_at = ?, updated_at = ? WHERE id = ? AND status IN ${uc} AND reported_at IS NULL`).run(s,n.summary.slice(0,xo),Ce(),Ce(),r.id),bt(t,r.id)})}function WL(t,e,n={}){let r=t.transaction(()=>{let s=bt(t,e),o=n.resolution!==void 0?n.resolution.trim():"",i=n.actor!==void 0?n.actor.trim():"",a=n.note!==void 0?n.note.trim():"",l=!1;if(s.execution_state!=="gone"){if(n.confirmStopped!==!0)throw new U("EXECUTION_FENCED",`Cron run ${e} execution state is "${s.execution_state}"; verify the process is gone and retry with --confirm-stopped`,4);t.prepare(`UPDATE cron_runs SET execution_state = 'gone', execution_gone_at = ?, execution_uncertain_reason = NULL,
2396
2395
  execution_confirmation_note = ?, updated_at = ? WHERE id = ? AND execution_state != 'gone'`).run(Ce(),a||o||"confirmed stopped by operator",Ce(),e),l=!0}s.status==="escalated"&&s.escalation_resolved_at===null&&(t.prepare(`UPDATE cron_runs SET escalation_resolved_at = ?, escalation_resolution = ?, escalation_resolution_actor = ?,
2397
2396
  escalation_resolution_note = ?, updated_at = ? WHERE id = ? AND escalation_resolved_at IS NULL`).run(Ce(),o||"resolved",i||"operator",a||o||"resolved",Ce(),e),l=!0);let c=bt(t,e);if(c.reported_at===null&&(c.status==="pending"||c.status==="running")&&(t.prepare(`UPDATE cron_runs SET status = 'failed', summary = ?, finished_at = ?, updated_at = ?
2398
- WHERE id = ? AND status IN ${uc} AND reported_at IS NULL`).run(`reconciled by operator without a worker report: ${a||o||"execution confirmed stopped"}`.slice(0,xo),Ce(),Ce(),e),l=!0),!l)throw new U("INVALID_ARGUMENT",`Cron run ${e} has no fenced execution or unresolved escalation to resolve`);let d=Ce();return t.prepare("UPDATE cron_jobs SET last_checked_ts = ?, updated_at = ? WHERE id = ? AND (last_checked_ts IS NULL OR last_checked_ts < ?)").run(d,d,s.job_id,d),bt(t,e)});return dn(()=>r.immediate())}function HL(t,e){if(!Number.isSafeInteger(e.limit)||e.limit<1||e.limit>1e4)throw new U("INVALID_ARGUMENT",`limit must be a positive integer <= ${1e4}`);return dn(()=>{let n=["id > ?"],r=[e.after];e.jobId!==void 0&&(n.push("job_id = ?"),r.push(e.jobId)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status));let s=t.prepare(`SELECT * FROM cron_runs WHERE ${n.join(" AND ")} ORDER BY id LIMIT ?`).all(...r,e.limit+1),o=s.length>e.limit,i=o?s.slice(0,e.limit):s;return{rows:i,next_cursor:o?i[i.length-1].id:null}})}function Gz(t){if(t===null)return null;let e=qz.exec(t);return e===null?null:Number(e[1])}function Jz(t){if(t===null)return null;let e=(t.split(`
2397
+ WHERE id = ? AND status IN ${uc} AND reported_at IS NULL`).run(`reconciled by operator without a worker report: ${a||o||"execution confirmed stopped"}`.slice(0,xo),Ce(),Ce(),e),l=!0),!l)throw new U("INVALID_ARGUMENT",`Cron run ${e} has no fenced execution or unresolved escalation to resolve`);let d=Ce();return t.prepare("UPDATE cron_jobs SET last_checked_ts = ?, updated_at = ? WHERE id = ? AND (last_checked_ts IS NULL OR last_checked_ts < ?)").run(d,d,s.job_id,d),bt(t,e)});return dn(()=>r.immediate())}function HL(t,e){if(!Number.isSafeInteger(e.limit)||e.limit<1||e.limit>1e4)throw new U("INVALID_ARGUMENT",`limit must be a positive integer <= ${1e4}`);return dn(()=>{let n=["id > ?"],r=[e.after];e.jobId!==void 0&&(n.push("job_id = ?"),r.push(e.jobId)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status));let s=t.prepare(`SELECT * FROM cron_runs WHERE ${n.join(" AND ")} ORDER BY id LIMIT ?`).all(...r,e.limit+1),o=s.length>e.limit,i=o?s.slice(0,e.limit):s;return{rows:i,next_cursor:o?i[i.length-1].id:null}})}function qz(t){if(t===null)return null;let e=Xz.exec(t);return e===null?null:Number(e[1])}function Gz(t){if(t===null)return null;let e=(t.split(`
2399
2398
  `)[0]??"").replace(/[\u0000-\u001f\u007f-\u009f]/g," ").trim();return e.length>160?`${e.slice(0,157)}...`:e}function Uw(t,e){let n=new Map;return dn(()=>{let r=t.prepare("SELECT id, status, execution_state, started_at, finished_at, summary FROM cron_runs WHERE job_id = ? ORDER BY id DESC LIMIT ?"),s=t.prepare(`SELECT id, status, execution_state, pid, COALESCE(started_at, created_at) AS since FROM cron_runs
2400
- WHERE job_id = ? AND execution_state != 'gone' ORDER BY id LIMIT 1`);for(let o of e){let i=r.all(o,Xz),a=i[0],l=s.get(o);n.set(o,{last_run:a===void 0?null:{id:a.id,status:a.status,execution_state:a.execution_state,started_at:a.started_at,finished_at:a.finished_at,exit_code:Gz(a.summary),summary:Jz(a.summary)},recent_runs:{window:i.length,succeeded:i.filter(c=>c.status==="succeeded").length,failed:i.filter(c=>c.status==="failed").length,escalated:i.filter(c=>c.status==="escalated").length,unfinished:i.filter(c=>c.status==="pending"||c.status==="running").length},holding_fence:l===void 0?null:{id:l.id,status:l.status,execution_state:l.execution_state,since:l.since,pid:l.pid}})}return n})}var xo,dc,Ow,Yf,Dw,Mw,uc,jz,Xz,qz,Qf=C(()=>{"use strict";Ao();Ao();No();xo=16*1024,dc=16*1024,Ow=512,Yf=100,Dw=4096,Mw=1024*1024,uc="('pending','running')",jz="execution_state != 'gone' OR (status = 'escalated' AND escalation_resolved_at IS NULL)";Xz=20,qz=/\bexit(?:ed)?(?: with)?(?: code)? (-?\d{1,4})\b/});import{spawn as jw}from"node:child_process";import{fileURLToPath as Vz}from"node:url";import{createHash as Kz}from"node:crypto";import{existsSync as zz,mkdirSync as Yz,mkdtempSync as Qz,readFileSync as Zz,renameSync as e6,rmSync as Ww,writeFileSync as Xw}from"node:fs";import{homedir as t6,tmpdir as n6}from"node:os";import{isAbsolute as r6,join as gc,resolve as Nn}from"node:path";function hc(){return{text:"",overflow:!1}}function _c(t,e){if(t.overflow)return;let n=t.text+e.toString("utf8");n.length>em?(t.text=n.slice(0,em),t.overflow=!0):t.text=n}function at(t){return t instanceof Error?t.message:String(t)}function d6(t,e,n){try{pc(t,e,n)}catch{}}function gt(t,e,n){try{return Qi(t,e,n),!0}catch(r){return process.stderr.write(`[lmcron] run ${e} completion could not be committed (fence retained): ${at(r)}
2401
- `),!1}}function un(t,e,n,r){d6(t,e,n);try{jL(t,e,r)}catch(s){process.stderr.write(`[lmcron] run ${e} outcome could not be persisted (fence retained): ${at(s)}
2402
- `)}}function Hw(t,e,n){if(t===null)throw new Error(`${n}: disabling timeout is supported only for script workers`);let r=t??e;if(!Number.isFinite(r)||r<=0||r>BL)throw new Error(`${n} must be a positive number of milliseconds <= ${BL}`);return r}function tm(t){if(!XL.has(t))throw new U("INVALID_ARGUMENT",`provider "${t}" is not one of lmctl's supported providers (${[...XL].join(", ")})`);return t}function qw(t){if(!u6.test(t))throw new U("INVALID_ARGUMENT",`model "${t}" is not a safe lmctl model token (no whitespace, quotes, '=' or control characters)`);return t}function yc(t){if(!r6(t))throw new U("INVALID_ARGUMENT",`sessiondir "${t}" must be an absolute path`);if(/["\u0000-\u001f\u007f]/.test(t))throw new U("INVALID_ARGUMENT",`sessiondir contains a quote, newline, or control character that lmctl cannot represent: ${JSON.stringify(t)}`);return t}function f6(t){let e=["_MEMBER_",`alias=${t.alias}`,`provider=${tm(t.provider)}`];return t.model!==null&&t.model!==void 0&&e.push(`model=${qw(t.model)}`),e.push(`sessiondir="${yc(t.sessiondir)}"`),e.join(" ")}function m6(t){let e=t.name,n=e!==void 0&&e.length>0?Nn(e):":memory:";return Kz("sha256").update(n,"utf8").digest("hex").slice(0,16)}function p6(){return process.env.LMBEE_CRON_SESSION_DIR?process.env.LMBEE_CRON_SESSION_DIR:gc(t6(),".lmbee","cron-sessions")}function qL(t){return`'${t.replace(/'/g,"'\\''")}'`}function h6(t){let e=t.name;return e!==void 0&&e.length>0&&e!==":memory:"?`LMCTL_DB=${qL(Nn(e))} LMBEE_DB=${qL(Nn(e))} `:""}function _6(t,e,n){let r=h6(n);return`${t}
2399
+ WHERE job_id = ? AND execution_state != 'gone' ORDER BY id LIMIT 1`);for(let o of e){let i=r.all(o,Bz),a=i[0],l=s.get(o);n.set(o,{last_run:a===void 0?null:{id:a.id,status:a.status,execution_state:a.execution_state,started_at:a.started_at,finished_at:a.finished_at,exit_code:qz(a.summary),summary:Gz(a.summary)},recent_runs:{window:i.length,succeeded:i.filter(c=>c.status==="succeeded").length,failed:i.filter(c=>c.status==="failed").length,escalated:i.filter(c=>c.status==="escalated").length,unfinished:i.filter(c=>c.status==="pending"||c.status==="running").length},holding_fence:l===void 0?null:{id:l.id,status:l.status,execution_state:l.execution_state,since:l.since,pid:l.pid}})}return n})}var xo,dc,Ow,Yf,Dw,Mw,uc,Fz,Bz,Xz,Qf=C(()=>{"use strict";Ao();Ao();No();xo=16*1024,dc=16*1024,Ow=512,Yf=100,Dw=4096,Mw=1024*1024,uc="('pending','running')",Fz="execution_state != 'gone' OR (status = 'escalated' AND escalation_resolved_at IS NULL)";Bz=20,Xz=/\bexit(?:ed)?(?: with)?(?: code)? (-?\d{1,4})\b/});import{spawn as jw}from"node:child_process";import{fileURLToPath as Jz}from"node:url";import{createHash as Vz}from"node:crypto";import{existsSync as Kz,mkdirSync as zz,mkdtempSync as Yz,readFileSync as Qz,renameSync as Zz,rmSync as Ww,writeFileSync as Xw}from"node:fs";import{homedir as e6,tmpdir as t6}from"node:os";import{isAbsolute as n6,join as gc,resolve as Nn}from"node:path";function hc(){return{text:"",overflow:!1}}function _c(t,e){if(t.overflow)return;let n=t.text+e.toString("utf8");n.length>em?(t.text=n.slice(0,em),t.overflow=!0):t.text=n}function at(t){return t instanceof Error?t.message:String(t)}function c6(t,e,n){try{pc(t,e,n)}catch{}}function gt(t,e,n){try{return Qi(t,e,n),!0}catch(r){return process.stderr.write(`[lmcron] run ${e} completion could not be committed (fence retained): ${at(r)}
2400
+ `),!1}}function un(t,e,n,r){c6(t,e,n);try{jL(t,e,r)}catch(s){process.stderr.write(`[lmcron] run ${e} outcome could not be persisted (fence retained): ${at(s)}
2401
+ `)}}function Hw(t,e,n){if(t===null)throw new Error(`${n}: disabling timeout is supported only for script workers`);let r=t??e;if(!Number.isFinite(r)||r<=0||r>BL)throw new Error(`${n} must be a positive number of milliseconds <= ${BL}`);return r}function tm(t){if(!XL.has(t))throw new U("INVALID_ARGUMENT",`provider "${t}" is not one of lmctl's supported providers (${[...XL].join(", ")})`);return t}function qw(t){if(!d6.test(t))throw new U("INVALID_ARGUMENT",`model "${t}" is not a safe lmctl model token (no whitespace, quotes, '=' or control characters)`);return t}function yc(t){if(!n6(t))throw new U("INVALID_ARGUMENT",`sessiondir "${t}" must be an absolute path`);if(/["\u0000-\u001f\u007f]/.test(t))throw new U("INVALID_ARGUMENT",`sessiondir contains a quote, newline, or control character that lmctl cannot represent: ${JSON.stringify(t)}`);return t}function u6(t){let e=["_MEMBER_",`alias=${t.alias}`,`provider=${tm(t.provider)}`];return t.model!==null&&t.model!==void 0&&e.push(`model=${qw(t.model)}`),e.push(`sessiondir="${yc(t.sessiondir)}"`),e.join(" ")}function f6(t){let e=t.name,n=e!==void 0&&e.length>0?Nn(e):":memory:";return Vz("sha256").update(n,"utf8").digest("hex").slice(0,16)}function m6(){return process.env.LMBEE_CRON_SESSION_DIR?process.env.LMBEE_CRON_SESSION_DIR:gc(e6(),".lmbee","cron-sessions")}function qL(t){return`'${t.replace(/'/g,"'\\''")}'`}function p6(t){let e=t.name;return e!==void 0&&e.length>0&&e!==":memory:"?`LMCTL_DB=${qL(Nn(e))} LMBEE_DB=${qL(Nn(e))} `:""}function h6(t,e,n){let r=p6(n);return`${t}
2403
2402
 
2404
2403
  ---
2405
2404
  When you have finished, report the outcome exactly once by running this command (the token is
@@ -2409,7 +2408,7 @@ run-specific; do not change it):
2409
2408
 
2410
2409
  Use --status failed if the work did not succeed, or --status escalated together with
2411
2410
  --requested-action "requested operator action" and optionally --owner NAME if a human decision is
2412
- required. Never report succeeded unless the work actually succeeded.`}function g6(t,e){return`${t}
2411
+ required. Never report succeeded unless the work actually succeeded.`}function _6(t,e){return`${t}
2413
2412
 
2414
2413
  ---
2415
2414
  Respond with EXACTLY one line of strict JSON and no other text, using this run token verbatim:
@@ -2418,36 +2417,36 @@ Respond with EXACTLY one line of strict JSON and no other text, using this run t
2418
2417
 
2419
2418
  For an escalation use {"run_token":"...","status":"escalated","summary":"...","escalation":{"owner":"...","reason":"...","requestedAction":"..."}}.
2420
2419
  Escalation reason and requestedAction are required. Never claim succeeded unless the work actually
2421
- succeeded.`}function zL(t,e){if(t===null)return{ok:!1,reason:"no output"};if(Buffer.byteLength(t,"utf8")>Mw)return{ok:!1,reason:`result exceeds ${Mw} bytes`};let n=t.trim();if(n.length===0)return{ok:!1,reason:"empty output"};let r;try{r=JSON.parse(n)}catch{return{ok:!1,reason:"output is not a single JSON object"}}if(typeof r!="object"||r===null||Array.isArray(r))return{ok:!1,reason:"output is not a JSON object"};let s=r;for(let l of Object.keys(s))if(!y6.has(l))return{ok:!1,reason:`unknown field "${l}"`};if(s.run_token!==e)return{ok:!1,reason:"run token missing or mismatched"};let o=s.status;if(o!=="succeeded"&&o!=="failed"&&o!=="escalated")return{ok:!1,reason:"status must be succeeded, failed, or escalated"};if(typeof s.summary!="string"||s.summary.trim().length===0)return{ok:!1,reason:"summary must be a nonblank string"};if(Buffer.byteLength(s.summary,"utf8")>xo)return{ok:!1,reason:"summary is too large"};let i=[];if(s.artifacts!==void 0){if(!Array.isArray(s.artifacts)||s.artifacts.length>Yf)return{ok:!1,reason:"artifacts must be an array of at most 100 strings"};for(let l of s.artifacts)if(typeof l!="string"||l.trim().length===0||Buffer.byteLength(l,"utf8")>Dw)return{ok:!1,reason:"each artifact must be a nonblank string of at most 4096 bytes"};i=s.artifacts}let a={status:o,summary:s.summary.trim(),artifacts:i};if(o==="escalated"){let l=s.escalation;if(typeof l!="object"||l===null||Array.isArray(l))return{ok:!1,reason:"an escalated result requires an escalation object"};let c=l;for(let d of Object.keys(c))if(!w6.has(d))return{ok:!1,reason:`unknown escalation field "${d}"`};if(typeof c.reason!="string"||c.reason.trim().length===0||Buffer.byteLength(c.reason,"utf8")>dc)return{ok:!1,reason:"escalation.reason is required and bounded"};if(typeof c.requestedAction!="string"||c.requestedAction.trim().length===0||Buffer.byteLength(c.requestedAction,"utf8")>dc)return{ok:!1,reason:"escalation.requestedAction is required and bounded"};if(a.reason=c.reason.trim(),a.action=c.requestedAction.trim(),c.owner!==void 0){if(typeof c.owner!="string"||c.owner.trim().length===0||c.owner.length>Ow)return{ok:!1,reason:"escalation.owner must be a nonblank string of at most 512 chars"};a.owner=c.owner.trim()}}return{ok:!0,result:a}}function E6(t,e,n){let r=e.session_alias??"Worker";if(e.session_teamfile!==null&&e.session_seeded_at!==null)return{teamfile:e.session_teamfile,alias:r};if(e.working_directory===null||e.provider===null)throw new U("INVALID_ARGUMENT",`session job ${e.id} requires provider and an absolute working_directory`);let s=gc(n??p6(),m6(t)),o=e.session_generation??0,i=e.session_teamfile??gc(s,`job-${e.id}-g${o}.lmctl`);if(e.session_teamfile!==null)return{teamfile:e.session_teamfile,alias:r};if(zz(i))return t.prepare("UPDATE cron_jobs SET session_teamfile = ?, session_alias = ?, updated_at = ? WHERE id = ?").run(i,r,new Date().toISOString(),e.id),{teamfile:i,alias:r};Yz(s,{recursive:!0});let a=f6({alias:r,provider:e.provider,model:e.model,sessiondir:e.working_directory});return Xw(i,`#teamfile: ${i}
2420
+ succeeded.`}function zL(t,e){if(t===null)return{ok:!1,reason:"no output"};if(Buffer.byteLength(t,"utf8")>Mw)return{ok:!1,reason:`result exceeds ${Mw} bytes`};let n=t.trim();if(n.length===0)return{ok:!1,reason:"empty output"};let r;try{r=JSON.parse(n)}catch{return{ok:!1,reason:"output is not a single JSON object"}}if(typeof r!="object"||r===null||Array.isArray(r))return{ok:!1,reason:"output is not a JSON object"};let s=r;for(let l of Object.keys(s))if(!g6.has(l))return{ok:!1,reason:`unknown field "${l}"`};if(s.run_token!==e)return{ok:!1,reason:"run token missing or mismatched"};let o=s.status;if(o!=="succeeded"&&o!=="failed"&&o!=="escalated")return{ok:!1,reason:"status must be succeeded, failed, or escalated"};if(typeof s.summary!="string"||s.summary.trim().length===0)return{ok:!1,reason:"summary must be a nonblank string"};if(Buffer.byteLength(s.summary,"utf8")>xo)return{ok:!1,reason:"summary is too large"};let i=[];if(s.artifacts!==void 0){if(!Array.isArray(s.artifacts)||s.artifacts.length>Yf)return{ok:!1,reason:"artifacts must be an array of at most 100 strings"};for(let l of s.artifacts)if(typeof l!="string"||l.trim().length===0||Buffer.byteLength(l,"utf8")>Dw)return{ok:!1,reason:"each artifact must be a nonblank string of at most 4096 bytes"};i=s.artifacts}let a={status:o,summary:s.summary.trim(),artifacts:i};if(o==="escalated"){let l=s.escalation;if(typeof l!="object"||l===null||Array.isArray(l))return{ok:!1,reason:"an escalated result requires an escalation object"};let c=l;for(let d of Object.keys(c))if(!y6.has(d))return{ok:!1,reason:`unknown escalation field "${d}"`};if(typeof c.reason!="string"||c.reason.trim().length===0||Buffer.byteLength(c.reason,"utf8")>dc)return{ok:!1,reason:"escalation.reason is required and bounded"};if(typeof c.requestedAction!="string"||c.requestedAction.trim().length===0||Buffer.byteLength(c.requestedAction,"utf8")>dc)return{ok:!1,reason:"escalation.requestedAction is required and bounded"};if(a.reason=c.reason.trim(),a.action=c.requestedAction.trim(),c.owner!==void 0){if(typeof c.owner!="string"||c.owner.trim().length===0||c.owner.length>Ow)return{ok:!1,reason:"escalation.owner must be a nonblank string of at most 512 chars"};a.owner=c.owner.trim()}}return{ok:!0,result:a}}function w6(t,e,n){let r=e.session_alias??"Worker";if(e.session_teamfile!==null&&e.session_seeded_at!==null)return{teamfile:e.session_teamfile,alias:r};if(e.working_directory===null||e.provider===null)throw new U("INVALID_ARGUMENT",`session job ${e.id} requires provider and an absolute working_directory`);let s=gc(n??m6(),f6(t)),o=e.session_generation??0,i=e.session_teamfile??gc(s,`job-${e.id}-g${o}.lmctl`);if(e.session_teamfile!==null)return{teamfile:e.session_teamfile,alias:r};if(Kz(i))return t.prepare("UPDATE cron_jobs SET session_teamfile = ?, session_alias = ?, updated_at = ? WHERE id = ?").run(i,r,new Date().toISOString(),e.id),{teamfile:i,alias:r};zz(s,{recursive:!0});let a=u6({alias:r,provider:e.provider,model:e.model,sessiondir:e.working_directory});return Xw(i,`#teamfile: ${i}
2422
2421
  # private single-member session for lmctl cron job ${e.id} (generation ${o})
2423
2422
 
2424
2423
  ${a}
2425
- `,{mode:384}),t.prepare("UPDATE cron_jobs SET session_teamfile = ?, session_alias = ?, updated_at = ? WHERE id = ?").run(i,r,new Date().toISOString(),e.id),{teamfile:i,alias:r}}function Gw(t){try{return process.kill(-t,0),!0}catch{return!1}}function Bw(t,e){if(t.pid===void 0)return;let n=t.pid;try{process.kill(-n,"SIGTERM")}catch{return}setTimeout(()=>{try{process.kill(-n,0)}catch{return}try{process.kill(-n,"SIGKILL")}catch{}},e).unref()}function GL(t){return t.action_kind==="session"&&t.provider===null&&t.session_teamfile!==null&&t.session_seeded_at!==null}function T6(t){let e=null,n=null,r=null,s=null;for(let o of t.split(`
2426
- `)){let i=o.trim();if(i.length===0)continue;let a;try{a=JSON.parse(i)}catch{continue}if(typeof a!="object"||a===null)continue;let l=a,c=typeof l.message=="string"?l.message:String(l.status);l.status==="ok"&&typeof l.replyText=="string"?e=l.replyText:l.status==="stalled"?n=c:l.status==="busy"?r=c:(l.status==="error"||l.status==="failed")&&(s=c)}return n!==null?{kind:"stalled",message:n}:r!==null?{kind:"busy",message:r}:s!==null?{kind:"error",message:s}:e!==null?{kind:"completed",text:e}:{kind:"none"}}function Jw(t,e){try{let n=Zz(t,"utf8").trim();return n.length>e?n.slice(-e):n}catch{return""}}function Fw(t,e,n,r){let s=t.receiptPath+".tmp-"+process.pid,o={adopted:!1,conversationId:t.conversationId,generation:t.generation,jobId:e,runId:n,error:r};try{Xw(s,JSON.stringify(o),{mode:384,flag:"wx"}),e6(s,t.receiptPath)}catch{try{Ww(s,{force:!0})}catch{}}}function I6(t){try{return process.kill(-t,0),!1}catch(e){return e.code==="ESRCH"}}function YL(t,e){let n=e.isInFlight??(l=>Zf.has(l)),r=e.processGroupGone??I6,s=e.runOrphanAfterMs??S6,o=e.pendingOrphanAfterMs??b6,i=t.prepare(`SELECT id, job_id, status, execution_state, pid, created_at, started_at, reported_at FROM cron_runs
2424
+ `,{mode:384}),t.prepare("UPDATE cron_jobs SET session_teamfile = ?, session_alias = ?, updated_at = ? WHERE id = ?").run(i,r,new Date().toISOString(),e.id),{teamfile:i,alias:r}}function Gw(t){try{return process.kill(-t,0),!0}catch{return!1}}function Bw(t,e){if(t.pid===void 0)return;let n=t.pid;try{process.kill(-n,"SIGTERM")}catch{return}setTimeout(()=>{try{process.kill(-n,0)}catch{return}try{process.kill(-n,"SIGKILL")}catch{}},e).unref()}function GL(t){return t.action_kind==="session"&&t.provider===null&&t.session_teamfile!==null&&t.session_seeded_at!==null}function E6(t){let e=null,n=null,r=null,s=null;for(let o of t.split(`
2425
+ `)){let i=o.trim();if(i.length===0)continue;let a;try{a=JSON.parse(i)}catch{continue}if(typeof a!="object"||a===null)continue;let l=a,c=typeof l.message=="string"?l.message:String(l.status);l.status==="ok"&&typeof l.replyText=="string"?e=l.replyText:l.status==="stalled"?n=c:l.status==="busy"?r=c:(l.status==="error"||l.status==="failed")&&(s=c)}return n!==null?{kind:"stalled",message:n}:r!==null?{kind:"busy",message:r}:s!==null?{kind:"error",message:s}:e!==null?{kind:"completed",text:e}:{kind:"none"}}function Jw(t,e){try{let n=Qz(t,"utf8").trim();return n.length>e?n.slice(-e):n}catch{return""}}function Fw(t,e,n,r){let s=t.receiptPath+".tmp-"+process.pid,o={adopted:!1,conversationId:t.conversationId,generation:t.generation,jobId:e,runId:n,error:r};try{Xw(s,JSON.stringify(o),{mode:384,flag:"wx"}),Zz(s,t.receiptPath)}catch{try{Ww(s,{force:!0})}catch{}}}function b6(t){try{return process.kill(-t,0),!1}catch(e){return e.code==="ESRCH"}}function YL(t,e){let n=e.isInFlight??(l=>Zf.has(l)),r=e.processGroupGone??b6,s=e.runOrphanAfterMs??v6,o=e.pendingOrphanAfterMs??S6,i=t.prepare(`SELECT id, job_id, status, execution_state, pid, created_at, started_at, reported_at FROM cron_runs
2427
2426
  WHERE execution_state IN ('active', 'uncertain') AND trigger_kind LIKE 'script%'`).all(),a=[];for(let l of i){if(n(l.id))continue;let c=Date.parse(l.started_at??""),d=Date.parse(l.created_at),u=Number.isFinite(c)?c:d,f=Number.isFinite(u)?e.nowMs-u:Number.POSITIVE_INFINITY,m;if(l.status==="pending"){if(f<o)continue;m=`it never started (still pending after ${Number.isFinite(f)?`${Math.round(f/6e4)} minutes`:"an unknown time"})`}else if(l.pid!==null){if(!r(l.pid))continue;m=`its process (pid ${l.pid}) has exited`}else{if(Ji(t,l.job_id)||f<s)continue;m=`no pid was recorded and it has been held for ${Number.isFinite(f)?`${Math.round(f/36e5)} hours`:"an unknown time"}`}let p=Ce(),_=l.status!=="pending"&&l.status!=="running",h=`outcome unknown: the process that started this run is gone and nothing recorded how it ended (${m}); released by lmcron reconciliation`,g=`fence released by lmcron reconciliation: ${m}`;try{t.transaction(()=>{let y="id = ? AND status = ? AND execution_state = ? AND pid IS ? AND started_at IS ? AND reported_at IS ?",E=[l.id,l.status,l.execution_state,l.pid,l.started_at,l.reported_at];return _?t.prepare(`UPDATE cron_runs SET execution_state = 'gone', execution_gone_at = ?, execution_uncertain_reason = NULL, execution_confirmation_note = ?, updated_at = ? WHERE ${y}`).run(p,g,p,...E).changes:t.prepare(`UPDATE cron_runs SET status = 'failed', summary = ?, finished_at = ?, execution_state = 'gone', execution_gone_at = ?, execution_uncertain_reason = NULL,
2428
2427
  execution_confirmation_note = ?, updated_at = ? WHERE ${y}`).run(h.slice(0,4e3),p,p,g,p,...E).changes}).immediate()===1&&a.push(l.id)}catch(w){process.stderr.write(`[lmcron] run ${l.id} could not be released (fence retained): ${at(w)}
2429
- `)}}return a}function VL(t){let{db:e,job:n,run:r}=t,s=t.onDemand===void 0?n.action_payload:[process.execPath,Vz(new URL("./on-demand-worker.cjs",import.meta.url)),Nn(e.name),t.onDemand.conversationId,String(t.onDemand.generation),String(n.id),String(r.id),n.action_payload,t.onDemand.receiptPath].map(o=>`'${o.replaceAll("'","'\\''")}'`).join(" ");try{if(!zi(e,r.id,{kind:"script",cwd:n.working_directory},null)){t.onDemand!==void 0&&Fw(t.onDemand,n.id,r.id,"run was no longer pending; not started"),process.stderr.write(`[lmcron] run ${r.id} of job ${n.id} was no longer pending when it was about to start; not started
2430
- `);return}}catch(o){t.onDemand!==void 0&&Fw(t.onDemand,n.id,r.id,`pre-spawn mark running failed: ${at(o)}`),gt(e,r.id,{fallback:{ok:!1,summary:`script setup failed before spawn: ${at(o)}`}});return}Zf.add(r.id);try{lc({id:n.id,action_payload:s},{onSpawn:o=>{try{Yi(e,r.id,{kind:"script",cwd:n.working_directory},o)}catch{}},...t.logDir!==void 0?{logDir:t.logDir}:{},...n.working_directory!==null?{cwd:n.working_directory}:{},...t.spawnPrefixes?.script!==void 0?{spawnPrefix:t.spawnPrefixes.script}:{},...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},...t.sigkillGraceMs!==void 0?{sigkillGraceMs:t.sigkillGraceMs}:{},...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{},onExit:(o,i,a,l)=>{let c=()=>{if(Zf.delete(r.id),i!==void 0){gt(e,r.id,{fallback:{ok:!1,summary:`script spawn error: ${i.message}`}});return}let d=o===0||o===JL,u=Jw(l,v6),f=o===JL?`script no-op (exit ${o})${u?`: ${u}`:""}`:`script exited with code ${o}${u?`: ${u}`:""}`;a!==null&&Gw(a)?un(e,r.id,"process group still alive after exit",{fallback:{ok:d,summary:f}}):gt(e,r.id,{fallback:{ok:d,summary:f}})};if(t.onDemand===void 0)return c();try{Iw(e,c)}catch{}}})}catch(o){Zf.delete(r.id),t.onDemand!==void 0&&Fw(t.onDemand,n.id,r.id,`script spawn error: ${at(o)}`),gt(e,r.id,{fallback:{ok:!1,summary:`script spawn error: ${at(o)}`}})}}function k6(t){let{db:e,job:n,run:r}=t,s,o,i,a;try{s=Hw(t.timeoutMs,a6,"timeoutMs"),o=t.sigkillGraceMs??KL,i=[...t.spawnPrefixes?.miniplayer??i6,"run",...n.model!==null?["-m",n.model]:[]],a=g6(n.action_payload,t.runToken)}catch(h){gt(e,r.id,{fallback:{ok:!1,summary:`miniplayer setup failed before spawn: ${at(h)}`}});return}let[l,...c]=i,d;try{d=jw(l,c,{detached:!0,stdio:["pipe","pipe","pipe"],...n.working_directory!==null?{cwd:n.working_directory}:{},...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{}})}catch(h){gt(e,r.id,{fallback:{ok:!1,summary:`miniplayer spawn error: ${at(h)}`}});return}d.unref();let u=hc(),f=hc(),m=!1,p=!1,_=setTimeout(()=>{m||(m=!0,Bw(d,o),un(e,r.id,`miniplayer timed out after ${s}ms`,{fallback:{ok:!1,summary:`miniplayer timed out after ${s}ms`}}))},s);_.unref(),d.on("spawn",()=>p=!0),d.stdout?.on("data",h=>_c(u,h)),d.stderr?.on("data",h=>_c(f,h)),d.stdin?.on("error",()=>{}),d.on("error",h=>{if(m)return;m=!0,clearTimeout(_);let g={fallback:{ok:!1,summary:`miniplayer spawn error: ${h.message}`}};p?un(e,r.id,`miniplayer post-spawn error: ${h.message}`,g):gt(e,r.id,g)}),d.on("close",(h,g)=>{if(m)return;m=!0,clearTimeout(_);let w=d.pid??null,y=w!==null&&Gw(w),E=u.overflow?{ok:!1,reason:`output exceeded the ${em}-byte capture limit`}:zL(u.text,t.runToken),T=E.ok?{report:E.result}:{fallback:{ok:!1,summary:`miniplayer produced no valid structured result (${E.reason})`+(h!==0||g!==null?`; exit ${g??h}: ${f.text.trim().slice(-300)}`:"")}};y?un(e,r.id,"miniplayer process group still alive after wrapper exit",T):u.overflow?un(e,r.id,"miniplayer output exceeded the capture limit; result not trusted",T):gt(e,r.id,T)});try{zi(e,r.id,{kind:"miniplayer",model:n.model},d.pid??null)}catch(h){process.stderr.write(`[lmcron] miniplayer run ${r.id} state write failed after spawn: ${at(h)}
2428
+ `)}}return a}function VL(t){let{db:e,job:n,run:r}=t,s=t.onDemand===void 0?n.action_payload:[process.execPath,Jz(new URL("./on-demand-worker.cjs",import.meta.url)),Nn(e.name),t.onDemand.conversationId,String(t.onDemand.generation),String(n.id),String(r.id),n.action_payload,t.onDemand.receiptPath].map(o=>`'${o.replaceAll("'","'\\''")}'`).join(" ");try{if(!zi(e,r.id,{kind:"script",cwd:n.working_directory},null)){t.onDemand!==void 0&&Fw(t.onDemand,n.id,r.id,"run was no longer pending; not started"),process.stderr.write(`[lmcron] run ${r.id} of job ${n.id} was no longer pending when it was about to start; not started
2429
+ `);return}}catch(o){t.onDemand!==void 0&&Fw(t.onDemand,n.id,r.id,`pre-spawn mark running failed: ${at(o)}`),gt(e,r.id,{fallback:{ok:!1,summary:`script setup failed before spawn: ${at(o)}`}});return}Zf.add(r.id);try{lc({id:n.id,action_payload:s},{onSpawn:o=>{try{Yi(e,r.id,{kind:"script",cwd:n.working_directory},o)}catch{}},...t.logDir!==void 0?{logDir:t.logDir}:{},...n.working_directory!==null?{cwd:n.working_directory}:{},...t.spawnPrefixes?.script!==void 0?{spawnPrefix:t.spawnPrefixes.script}:{},...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},...t.sigkillGraceMs!==void 0?{sigkillGraceMs:t.sigkillGraceMs}:{},...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{},onExit:(o,i,a,l)=>{let c=()=>{if(Zf.delete(r.id),i!==void 0){gt(e,r.id,{fallback:{ok:!1,summary:`script spawn error: ${i.message}`}});return}let d=o===0||o===JL,u=Jw(l,T6),f=o===JL?`script no-op (exit ${o})${u?`: ${u}`:""}`:`script exited with code ${o}${u?`: ${u}`:""}`;a!==null&&Gw(a)?un(e,r.id,"process group still alive after exit",{fallback:{ok:d,summary:f}}):gt(e,r.id,{fallback:{ok:d,summary:f}})};if(t.onDemand===void 0)return c();try{Iw(e,c)}catch{}}})}catch(o){Zf.delete(r.id),t.onDemand!==void 0&&Fw(t.onDemand,n.id,r.id,`script spawn error: ${at(o)}`),gt(e,r.id,{fallback:{ok:!1,summary:`script spawn error: ${at(o)}`}})}}function I6(t){let{db:e,job:n,run:r}=t,s,o,i,a;try{s=Hw(t.timeoutMs,i6,"timeoutMs"),o=t.sigkillGraceMs??KL,i=[...t.spawnPrefixes?.miniplayer??o6,"run",...n.model!==null?["-m",n.model]:[]],a=_6(n.action_payload,t.runToken)}catch(h){gt(e,r.id,{fallback:{ok:!1,summary:`miniplayer setup failed before spawn: ${at(h)}`}});return}let[l,...c]=i,d;try{d=jw(l,c,{detached:!0,stdio:["pipe","pipe","pipe"],...n.working_directory!==null?{cwd:n.working_directory}:{},...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{}})}catch(h){gt(e,r.id,{fallback:{ok:!1,summary:`miniplayer spawn error: ${at(h)}`}});return}d.unref();let u=hc(),f=hc(),m=!1,p=!1,_=setTimeout(()=>{m||(m=!0,Bw(d,o),un(e,r.id,`miniplayer timed out after ${s}ms`,{fallback:{ok:!1,summary:`miniplayer timed out after ${s}ms`}}))},s);_.unref(),d.on("spawn",()=>p=!0),d.stdout?.on("data",h=>_c(u,h)),d.stderr?.on("data",h=>_c(f,h)),d.stdin?.on("error",()=>{}),d.on("error",h=>{if(m)return;m=!0,clearTimeout(_);let g={fallback:{ok:!1,summary:`miniplayer spawn error: ${h.message}`}};p?un(e,r.id,`miniplayer post-spawn error: ${h.message}`,g):gt(e,r.id,g)}),d.on("close",(h,g)=>{if(m)return;m=!0,clearTimeout(_);let w=d.pid??null,y=w!==null&&Gw(w),E=u.overflow?{ok:!1,reason:`output exceeded the ${em}-byte capture limit`}:zL(u.text,t.runToken),T=E.ok?{report:E.result}:{fallback:{ok:!1,summary:`miniplayer produced no valid structured result (${E.reason})`+(h!==0||g!==null?`; exit ${g??h}: ${f.text.trim().slice(-300)}`:"")}};y?un(e,r.id,"miniplayer process group still alive after wrapper exit",T):u.overflow?un(e,r.id,"miniplayer output exceeded the capture limit; result not trusted",T):gt(e,r.id,T)});try{zi(e,r.id,{kind:"miniplayer",model:n.model},d.pid??null)}catch(h){process.stderr.write(`[lmcron] miniplayer run ${r.id} state write failed after spawn: ${at(h)}
2431
2430
  `)}try{d.stdin?.write(a),d.stdin?.end()}catch(h){process.stderr.write(`[lmcron] miniplayer run ${r.id} stdin write failed: ${at(h)}
2432
- `)}}function A6(t){let{db:e,job:n,run:r}=t,s,o,i;try{s=Hw(t.timeoutMs,l6,"timeoutMs"),o=Hw(t.seedTimeoutMs,c6,"seedTimeoutMs"),i=t.sigkillGraceMs??KL}catch(y){gt(e,r.id,{fallback:{ok:!1,summary:`session setup failed before spawn: ${at(y)}`}});return}let a,l;try{({teamfile:a,alias:l}=E6(e,n,t.sessionDir))}catch(y){gt(e,r.id,{fallback:{ok:!1,summary:`session teamfile creation failed: ${at(y)}`}});return}let c=()=>{let y=t.spawnPrefixes?.chat??s6,E,T,v;try{let D=GL(n)?n.action_payload:_6(n.action_payload,t.runToken,e);E=Qz(gc(n6(),"lmbee-cron-session-")),T=gc(E,`${r.id}.md`),Xw(T,D,{mode:384}),v=[...y,"prompt",`${a}:${l}`,"--prompt-file",T,"--json"]}catch(D){gt(e,r.id,{fallback:{ok:!1,summary:`session dispatch setup failed before spawn: ${at(D)}`}});return}let[b,...k]=v,I;try{I=jw(b,k,{detached:!0,stdio:["ignore","pipe","pipe"],...n.working_directory!==null?{cwd:n.working_directory}:{},...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{}})}catch(D){try{Ww(E,{recursive:!0,force:!0})}catch{}gt(e,r.id,{fallback:{ok:!1,summary:`session dispatch spawn error: ${at(D)}`}});return}I.unref();let N=hc(),A=hc(),S=!1,x=!1,R=()=>{try{Ww(E,{recursive:!0,force:!0})}catch{}},L=setTimeout(()=>{S||(S=!0,Bw(I,i),un(e,r.id,`session timed out after ${s}ms`,{fallback:{ok:!1,summary:`session timed out after ${s}ms`}}))},s);L.unref(),I.on("spawn",()=>x=!0),I.stdout?.on("data",D=>_c(N,D)),I.stderr?.on("data",D=>_c(A,D)),I.on("error",D=>{if(S)return;S=!0,clearTimeout(L);let M={fallback:{ok:!1,summary:`session dispatch spawn error: ${D.message}`}};x?un(e,r.id,`session post-spawn error: ${D.message}`,M):(R(),gt(e,r.id,M))}),I.on("close",D=>{if(S)return;S=!0,clearTimeout(L);let M=I.pid??null,P=M!==null&&Gw(M),W=N.overflow?{kind:"overflow"}:T6(N.text),$=W.kind==="completed"?zL(W.text,t.runToken):null,pe=W.kind==="completed"&&!P&&!N.overflow,J=$!==null&&$.ok?{report:$.result}:W.kind==="completed"&&GL(n)&&!N.overflow?{fallback:{ok:!0,summary:`answered: ${W.text.trim().slice(-400)}`}}:{fallback:{ok:!1,summary:(W.kind==="completed"?"session ended without a valid report":W.kind==="stalled"?"session stalled (native turn still running)":W.kind==="busy"?"session was busy; not started":W.kind==="error"?`session provider error: ${W.message}`:W.kind==="overflow"?`session output exceeded the ${em}-byte capture limit`:"session ended without positive completion")+(D!==0?` (exit ${D}: ${A.text.trim().slice(-300)})`:"")}};if(pe){if($!==null&&!$.ok){R(),gt(e,r.id,J);return}if(gt(e,r.id,J)){R();return}return}let fe=W.kind==="stalled"?`session stalled (native turn still running): ${W.message}`:W.kind==="busy"?`session busy (a live worker may own it): ${W.message}`:W.kind==="error"?`session provider error (termination unconfirmed): ${W.message}`:W.kind==="overflow"?"session output exceeded the capture limit; result not trusted":P?"session process group still alive after wrapper exit":`session wrapper exited without positive completion (code ${D})`;un(e,r.id,fe,J)});try{zi(e,r.id,{kind:"session",provider:n.provider,model:n.model,teamfile:a,alias:l},I.pid??null)}catch(D){process.stderr.write(`[lmcron] session run ${r.id} state write failed after spawn: ${at(D)}
2433
- `)}try{Yi(e,r.id,{kind:"session",phase:"dispatch",teamfile:a,alias:l},I.pid??null)}catch{}};if(n.session_seeded_at!==null){c();return}let u=[...t.spawnPrefixes?.seed??o6,"seed",a],f=u[0],m=u.slice(1),p;try{p=jw(f,m,{detached:!0,stdio:["ignore","ignore","pipe"],...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{}})}catch(y){gt(e,r.id,{fallback:{ok:!1,summary:`session seed spawn error: ${at(y)}`}});return}p.unref();let _=hc(),h=!1,g=!1,w=setTimeout(()=>{h||(h=!0,Bw(p,i),un(e,r.id,`session seed timed out after ${o}ms; provider initialization may still be running`,{fallback:{ok:!1,summary:`session seed timed out after ${o}ms`}}))},o);w.unref(),p.on("spawn",()=>g=!0),p.stderr?.on("data",y=>_c(_,y)),p.on("error",y=>{if(h)return;h=!0,clearTimeout(w);let E={fallback:{ok:!1,summary:`session seed spawn error: ${y.message}`}};g?un(e,r.id,`session seed post-spawn error: ${y.message}`,E):gt(e,r.id,E)}),p.on("close",y=>{if(!h){if(h=!0,clearTimeout(w),y!==0){un(e,r.id,`session seed failed (exit ${y}); provider initialization may still be running`,{fallback:{ok:!1,summary:`session seed failed (exit ${y}): ${_.text.trim().slice(-300)}`}});return}try{e.prepare("UPDATE cron_jobs SET session_seeded_at = ?, updated_at = ? WHERE id = ?").run(new Date().toISOString(),new Date().toISOString(),n.id)}catch(E){un(e,r.id,`session seeded but recording identity failed: ${at(E)}`,{fallback:{ok:!1,summary:"session seeded but recording seed state failed; will recover on retry"}});return}c()}});try{Yi(e,r.id,{kind:"session",phase:"seed",teamfile:a,alias:l},p.pid??null)}catch{}}function Vw(t){if(Ji(t.db,t.job.id)){if(t.onDemand===void 0||!bL(t.db,t.job.id,t.run.id,t.onDemand))return;Iw(t.db,()=>VL(t));return}try{switch(t.job.action_kind){case"script":VL(t);return;case"miniplayer":k6(t);return;case"session":A6(t);return;default:gt(t.db,t.run.id,{fallback:{ok:!1,summary:`unsupported run worker kind: ${t.job.action_kind}`}})}}catch(e){un(t.db,t.run.id,`unexpected worker dispatch failure: ${at(e)}`,{fallback:{ok:!1,summary:`worker dispatch error: ${at(e)}`}})}}var s6,o6,i6,a6,l6,c6,BL,KL,em,XL,u6,y6,w6,v6,JL,Zf,S6,b6,QL=C(()=>{"use strict";kw();Ao();No();Qf();Cw();s6=["systemd-run","--user","--scope","--collect","--quiet","--","lmctl"],o6=["lmctl"],i6=["miniplayer"],a6=10*6e4,l6=50*6e4,c6=50*6e4,BL=24*60*6e4,KL=5e3,em=1024*1024;XL=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","ClaudeMock"]),u6=/^[A-Za-z0-9][A-Za-z0-9._:@/+~-]*$/;y6=new Set(["run_token","status","summary","artifacts","escalation"]),w6=new Set(["owner","reason","requestedAction"]);v6=500,JL=75;Zf=new Set,S6=24*36e5,b6=5*6e4});import{execFileSync as N6}from"node:child_process";function nC(...t){throw new U("KIND_RETIRED",tC)}function x6(t){return t==="enqueue"||t==="command"||t==="script"||t==="session"||t==="miniplayer"}function R6(t){return t==="script"||t==="session"||t==="miniplayer"}function fn(t){return t instanceof Error?t.message:String(t)}function Zi(t){let e=t&&typeof t=="object"&&"code"in t?String(t.code):void 0;if(e!==void 0&&(e.startsWith("SQLITE_BUSY")||e.startsWith("SQLITE_LOCKED")))throw new U("DB_BUSY","Database busy; retry after the current writer completes",5);let n=t instanceof Error?t.message:String(t);throw e!==void 0&&e.startsWith("SQLITE_CONSTRAINT")?new U("STRUCTURAL_ERROR",n,2):new U("STORAGE_ERROR",n,1)}function jr(t){try{return t()}catch(e){if(e instanceof U)throw e;if(e instanceof ko)throw new U(e.code,e.message,e.exitCode);return Zi(e)}}function nm(t,e){t.prepare("UPDATE cron_jobs SET revision = revision + 1, updated_at = ? WHERE id = ?").run(Ce(),e)}function rm(t,e){return jr(()=>t.prepare("SELECT * FROM cron_jobs WHERE id = ?").get(e)??null)}function Je(t,e){let n=rm(t,e);if(n===null)throw new U("NOT_FOUND",`Cron job ${e} does not exist`,3);return n}function sm(t,e){if(Ur(e,"action_payload"),t==="enqueue")throw new U("KIND_RETIRED",tC)}function om(t){let{actionKind:e}=t;if(e==="session"&&t.targeted)t.provider&&tm(t.provider),t.workingDirectory&&yc(t.workingDirectory);else if(e==="session"){if(t.provider===void 0||t.provider===null||t.provider.trim().length===0)throw new U("INVALID_ARGUMENT","a session job requires a nonblank provider");if(tm(t.provider),t.workingDirectory===void 0||t.workingDirectory===null||t.workingDirectory.trim().length===0)throw new U("INVALID_ARGUMENT","a session job requires an absolute working_directory (--cwd)");yc(t.workingDirectory)}else if(t.provider!==void 0&&t.provider!==null&&t.provider.trim().length>0)throw new U("INVALID_ARGUMENT",`provider is only valid for session jobs (not ${e})`);if(t.model!==void 0&&t.model!==null&&t.model.trim().length===0)throw new U("INVALID_ARGUMENT","model, if given, must be nonblank");if(t.model!==void 0&&t.model!==null&&t.model.trim().length>0&&e!=="session"&&e!=="miniplayer")throw new U("INVALID_ARGUMENT",`model is only valid for session/miniplayer jobs (not ${e})`);if(t.model!==void 0&&t.model!==null&&t.model.trim().length>0&&qw(t.model),t.workingDirectory!==void 0&&t.workingDirectory!==null&&t.workingDirectory.trim().length>0&&e==="enqueue")throw new U("INVALID_ARGUMENT","working_directory is not valid for enqueue jobs");if(t.workingDirectory!==void 0&&t.workingDirectory!==null&&t.workingDirectory.trim().length===0)throw new U("INVALID_ARGUMENT","working_directory, if given, must be nonblank");if(t.escalationOwner!==void 0&&t.escalationOwner!==null&&t.escalationOwner.trim().length===0)throw new U("INVALID_ARGUMENT","escalation_owner, if given, must be nonblank")}function wc(t){let e=Ur(t,"timezone");try{new Intl.DateTimeFormat(void 0,{timeZone:e})}catch{throw new U("INVALID_ARGUMENT",`timezone "${e}" is not a recognized IANA zone name`)}return e}function Ec(t){let e=Lw(t);if(!e.ok){let n=e.error.field?` (field: ${e.error.field})`:"";throw new U("INVALID_SCHEDULE",`${e.error.message}${n}`)}}function im(t,e){let n=t.transaction(()=>{if(e.id!==void 0&&(!Number.isSafeInteger(e.id)||e.id<1))throw new U("INVALID_ARGUMENT","id, if given, must be a positive safe integer");let r=Ur(e.title,"title");if(!x6(e.actionKind))throw new U("INVALID_ARGUMENT",'action_kind must be "enqueue", "command", "script", "session", or "miniplayer"');if(Ec(e.scheduleExpr),sm(e.actionKind,e.actionPayload),e.sessionTarget&&e.actionKind!=="session")throw new U("INVALID_ARGUMENT","a session target is only for session jobs");om({actionKind:e.actionKind,provider:e.provider??null,model:e.model??null,workingDirectory:e.workingDirectory??null,escalationOwner:e.escalationOwner??null,targeted:e.sessionTarget!==void 0});let s=e.timezone!==void 0?wc(e.timezone):null,o=Ce();try{let i=t.prepare(e.id!==void 0?`INSERT INTO cron_jobs(id, title, schedule_expr, action_kind, action_payload, provider, model,
2431
+ `)}}function k6(t){let{db:e,job:n,run:r}=t,s,o,i;try{s=Hw(t.timeoutMs,a6,"timeoutMs"),o=Hw(t.seedTimeoutMs,l6,"seedTimeoutMs"),i=t.sigkillGraceMs??KL}catch(y){gt(e,r.id,{fallback:{ok:!1,summary:`session setup failed before spawn: ${at(y)}`}});return}let a,l;try{({teamfile:a,alias:l}=w6(e,n,t.sessionDir))}catch(y){gt(e,r.id,{fallback:{ok:!1,summary:`session teamfile creation failed: ${at(y)}`}});return}let c=()=>{let y=t.spawnPrefixes?.chat??r6,E,T,v;try{let D=GL(n)?n.action_payload:h6(n.action_payload,t.runToken,e);E=Yz(gc(t6(),"lmbee-cron-session-")),T=gc(E,`${r.id}.md`),Xw(T,D,{mode:384}),v=[...y,"prompt",`${a}:${l}`,"--prompt-file",T,"--json"]}catch(D){gt(e,r.id,{fallback:{ok:!1,summary:`session dispatch setup failed before spawn: ${at(D)}`}});return}let[b,...k]=v,I;try{I=jw(b,k,{detached:!0,stdio:["ignore","pipe","pipe"],...n.working_directory!==null?{cwd:n.working_directory}:{},...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{}})}catch(D){try{Ww(E,{recursive:!0,force:!0})}catch{}gt(e,r.id,{fallback:{ok:!1,summary:`session dispatch spawn error: ${at(D)}`}});return}I.unref();let N=hc(),A=hc(),S=!1,x=!1,R=()=>{try{Ww(E,{recursive:!0,force:!0})}catch{}},L=setTimeout(()=>{S||(S=!0,Bw(I,i),un(e,r.id,`session timed out after ${s}ms`,{fallback:{ok:!1,summary:`session timed out after ${s}ms`}}))},s);L.unref(),I.on("spawn",()=>x=!0),I.stdout?.on("data",D=>_c(N,D)),I.stderr?.on("data",D=>_c(A,D)),I.on("error",D=>{if(S)return;S=!0,clearTimeout(L);let M={fallback:{ok:!1,summary:`session dispatch spawn error: ${D.message}`}};x?un(e,r.id,`session post-spawn error: ${D.message}`,M):(R(),gt(e,r.id,M))}),I.on("close",D=>{if(S)return;S=!0,clearTimeout(L);let M=I.pid??null,P=M!==null&&Gw(M),W=N.overflow?{kind:"overflow"}:E6(N.text),$=W.kind==="completed"?zL(W.text,t.runToken):null,pe=W.kind==="completed"&&!P&&!N.overflow,J=$!==null&&$.ok?{report:$.result}:W.kind==="completed"&&GL(n)&&!N.overflow?{fallback:{ok:!0,summary:`answered: ${W.text.trim().slice(-400)}`}}:{fallback:{ok:!1,summary:(W.kind==="completed"?"session ended without a valid report":W.kind==="stalled"?"session stalled (native turn still running)":W.kind==="busy"?"session was busy; not started":W.kind==="error"?`session provider error: ${W.message}`:W.kind==="overflow"?`session output exceeded the ${em}-byte capture limit`:"session ended without positive completion")+(D!==0?` (exit ${D}: ${A.text.trim().slice(-300)})`:"")}};if(pe){if($!==null&&!$.ok){R(),gt(e,r.id,J);return}if(gt(e,r.id,J)){R();return}return}let fe=W.kind==="stalled"?`session stalled (native turn still running): ${W.message}`:W.kind==="busy"?`session busy (a live worker may own it): ${W.message}`:W.kind==="error"?`session provider error (termination unconfirmed): ${W.message}`:W.kind==="overflow"?"session output exceeded the capture limit; result not trusted":P?"session process group still alive after wrapper exit":`session wrapper exited without positive completion (code ${D})`;un(e,r.id,fe,J)});try{zi(e,r.id,{kind:"session",provider:n.provider,model:n.model,teamfile:a,alias:l},I.pid??null)}catch(D){process.stderr.write(`[lmcron] session run ${r.id} state write failed after spawn: ${at(D)}
2432
+ `)}try{Yi(e,r.id,{kind:"session",phase:"dispatch",teamfile:a,alias:l},I.pid??null)}catch{}};if(n.session_seeded_at!==null){c();return}let u=[...t.spawnPrefixes?.seed??s6,"seed",a],f=u[0],m=u.slice(1),p;try{p=jw(f,m,{detached:!0,stdio:["ignore","ignore","pipe"],...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{}})}catch(y){gt(e,r.id,{fallback:{ok:!1,summary:`session seed spawn error: ${at(y)}`}});return}p.unref();let _=hc(),h=!1,g=!1,w=setTimeout(()=>{h||(h=!0,Bw(p,i),un(e,r.id,`session seed timed out after ${o}ms; provider initialization may still be running`,{fallback:{ok:!1,summary:`session seed timed out after ${o}ms`}}))},o);w.unref(),p.on("spawn",()=>g=!0),p.stderr?.on("data",y=>_c(_,y)),p.on("error",y=>{if(h)return;h=!0,clearTimeout(w);let E={fallback:{ok:!1,summary:`session seed spawn error: ${y.message}`}};g?un(e,r.id,`session seed post-spawn error: ${y.message}`,E):gt(e,r.id,E)}),p.on("close",y=>{if(!h){if(h=!0,clearTimeout(w),y!==0){un(e,r.id,`session seed failed (exit ${y}); provider initialization may still be running`,{fallback:{ok:!1,summary:`session seed failed (exit ${y}): ${_.text.trim().slice(-300)}`}});return}try{e.prepare("UPDATE cron_jobs SET session_seeded_at = ?, updated_at = ? WHERE id = ?").run(new Date().toISOString(),new Date().toISOString(),n.id)}catch(E){un(e,r.id,`session seeded but recording identity failed: ${at(E)}`,{fallback:{ok:!1,summary:"session seeded but recording seed state failed; will recover on retry"}});return}c()}});try{Yi(e,r.id,{kind:"session",phase:"seed",teamfile:a,alias:l},p.pid??null)}catch{}}function Vw(t){if(Ji(t.db,t.job.id)){if(t.onDemand===void 0||!bL(t.db,t.job.id,t.run.id,t.onDemand))return;Iw(t.db,()=>VL(t));return}try{switch(t.job.action_kind){case"script":VL(t);return;case"miniplayer":I6(t);return;case"session":k6(t);return;default:gt(t.db,t.run.id,{fallback:{ok:!1,summary:`unsupported run worker kind: ${t.job.action_kind}`}})}}catch(e){un(t.db,t.run.id,`unexpected worker dispatch failure: ${at(e)}`,{fallback:{ok:!1,summary:`worker dispatch error: ${at(e)}`}})}}var r6,s6,o6,i6,a6,l6,BL,KL,em,XL,d6,g6,y6,T6,JL,Zf,v6,S6,QL=C(()=>{"use strict";kw();Ao();No();Qf();Cw();r6=["systemd-run","--user","--scope","--collect","--quiet","--","lmctl"],s6=["lmctl"],o6=["miniplayer"],i6=10*6e4,a6=50*6e4,l6=50*6e4,BL=24*60*6e4,KL=5e3,em=1024*1024;XL=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","ClaudeMock"]),d6=/^[A-Za-z0-9][A-Za-z0-9._:@/+~-]*$/;g6=new Set(["run_token","status","summary","artifacts","escalation"]),y6=new Set(["owner","reason","requestedAction"]);T6=500,JL=75;Zf=new Set,v6=24*36e5,S6=5*6e4});import{execFileSync as A6}from"node:child_process";function nC(...t){throw new U("KIND_RETIRED",tC)}function N6(t){return t==="enqueue"||t==="command"||t==="script"||t==="session"||t==="miniplayer"}function x6(t){return t==="script"||t==="session"||t==="miniplayer"}function fn(t){return t instanceof Error?t.message:String(t)}function Zi(t){let e=t&&typeof t=="object"&&"code"in t?String(t.code):void 0;if(e!==void 0&&(e.startsWith("SQLITE_BUSY")||e.startsWith("SQLITE_LOCKED")))throw new U("DB_BUSY","Database busy; retry after the current writer completes",5);let n=t instanceof Error?t.message:String(t);throw e!==void 0&&e.startsWith("SQLITE_CONSTRAINT")?new U("STRUCTURAL_ERROR",n,2):new U("STORAGE_ERROR",n,1)}function jr(t){try{return t()}catch(e){if(e instanceof U)throw e;if(e instanceof ko)throw new U(e.code,e.message,e.exitCode);return Zi(e)}}function nm(t,e){t.prepare("UPDATE cron_jobs SET revision = revision + 1, updated_at = ? WHERE id = ?").run(Ce(),e)}function rm(t,e){return jr(()=>t.prepare("SELECT * FROM cron_jobs WHERE id = ?").get(e)??null)}function Je(t,e){let n=rm(t,e);if(n===null)throw new U("NOT_FOUND",`Cron job ${e} does not exist`,3);return n}function sm(t,e){if(Ur(e,"action_payload"),t==="enqueue")throw new U("KIND_RETIRED",tC)}function om(t){let{actionKind:e}=t;if(e==="session"&&t.targeted)t.provider&&tm(t.provider),t.workingDirectory&&yc(t.workingDirectory);else if(e==="session"){if(t.provider===void 0||t.provider===null||t.provider.trim().length===0)throw new U("INVALID_ARGUMENT","a session job requires a nonblank provider");if(tm(t.provider),t.workingDirectory===void 0||t.workingDirectory===null||t.workingDirectory.trim().length===0)throw new U("INVALID_ARGUMENT","a session job requires an absolute working_directory (--cwd)");yc(t.workingDirectory)}else if(t.provider!==void 0&&t.provider!==null&&t.provider.trim().length>0)throw new U("INVALID_ARGUMENT",`provider is only valid for session jobs (not ${e})`);if(t.model!==void 0&&t.model!==null&&t.model.trim().length===0)throw new U("INVALID_ARGUMENT","model, if given, must be nonblank");if(t.model!==void 0&&t.model!==null&&t.model.trim().length>0&&e!=="session"&&e!=="miniplayer")throw new U("INVALID_ARGUMENT",`model is only valid for session/miniplayer jobs (not ${e})`);if(t.model!==void 0&&t.model!==null&&t.model.trim().length>0&&qw(t.model),t.workingDirectory!==void 0&&t.workingDirectory!==null&&t.workingDirectory.trim().length>0&&e==="enqueue")throw new U("INVALID_ARGUMENT","working_directory is not valid for enqueue jobs");if(t.workingDirectory!==void 0&&t.workingDirectory!==null&&t.workingDirectory.trim().length===0)throw new U("INVALID_ARGUMENT","working_directory, if given, must be nonblank");if(t.escalationOwner!==void 0&&t.escalationOwner!==null&&t.escalationOwner.trim().length===0)throw new U("INVALID_ARGUMENT","escalation_owner, if given, must be nonblank")}function wc(t){let e=Ur(t,"timezone");try{new Intl.DateTimeFormat(void 0,{timeZone:e})}catch{throw new U("INVALID_ARGUMENT",`timezone "${e}" is not a recognized IANA zone name`)}return e}function Ec(t){let e=Lw(t);if(!e.ok){let n=e.error.field?` (field: ${e.error.field})`:"";throw new U("INVALID_SCHEDULE",`${e.error.message}${n}`)}}function im(t,e){let n=t.transaction(()=>{if(e.id!==void 0&&(!Number.isSafeInteger(e.id)||e.id<1))throw new U("INVALID_ARGUMENT","id, if given, must be a positive safe integer");let r=Ur(e.title,"title");if(!N6(e.actionKind))throw new U("INVALID_ARGUMENT",'action_kind must be "enqueue", "command", "script", "session", or "miniplayer"');if(Ec(e.scheduleExpr),sm(e.actionKind,e.actionPayload),e.sessionTarget&&e.actionKind!=="session")throw new U("INVALID_ARGUMENT","a session target is only for session jobs");om({actionKind:e.actionKind,provider:e.provider??null,model:e.model??null,workingDirectory:e.workingDirectory??null,escalationOwner:e.escalationOwner??null,targeted:e.sessionTarget!==void 0});let s=e.timezone!==void 0?wc(e.timezone):null,o=Ce();try{let i=t.prepare(e.id!==void 0?`INSERT INTO cron_jobs(id, title, schedule_expr, action_kind, action_payload, provider, model,
2434
2433
  working_directory, escalation_owner, enabled, timezone, created_at, updated_at)
2435
2434
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`:`INSERT INTO cron_jobs(title, schedule_expr, action_kind, action_payload, provider, model,
2436
2435
  working_directory, escalation_owner, enabled, timezone, created_at, updated_at)
2437
2436
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(...e.id!==void 0?[e.id]:[],r,e.scheduleExpr,e.actionKind,e.actionPayload,e.provider??null,e.model??null,e.workingDirectory??null,e.escalationOwner??null,e.enabled===!1?0:1,s,o,o);return e.sessionTarget&&t.prepare("UPDATE cron_jobs SET session_teamfile = ?, session_alias = ?, session_seeded_at = ? WHERE id = ?").run(e.sessionTarget.teamfile,e.sessionTarget.alias,o,Number(i.lastInsertRowid)),Je(t,Number(i.lastInsertRowid))}catch(i){Zi(i)}});return jr(()=>n.immediate())}function rC(t,e){if(!Number.isSafeInteger(e.limit)||e.limit<1||e.limit>1e4)throw new U("INVALID_ARGUMENT",`limit must be a positive integer <= ${1e4}`);return jr(()=>{let n=["id > ?"],r=[e.after];e.enabled!==void 0&&(n.push("enabled = ?"),r.push(e.enabled?1:0));let s=t.prepare(`SELECT * FROM cron_jobs WHERE ${n.join(" AND ")} ORDER BY id LIMIT ?`).all(...r,e.limit+1),o=s.length>e.limit,i=o?s.slice(0,e.limit):s;return{rows:i,meta:{next_cursor:o?i[i.length-1].id:null}}})}function sC(t,e,n){let r=t.transaction(()=>{let s=Je(t,e);if(n.ifRevision!==void 0&&s.revision!==n.ifRevision)throw new U("REVISION_CONFLICT",`Expected revision ${n.ifRevision}; current is ${s.revision}`,4);let o={};if(n.title!==void 0&&(o.title=Ur(n.title,"title")),n.scheduleExpr!==void 0&&(Ec(n.scheduleExpr),o.schedule_expr=n.scheduleExpr),n.actionPayload!==void 0&&(sm(s.action_kind,n.actionPayload),o.action_payload=n.actionPayload),n.timezone!==void 0&&(o.timezone=n.timezone===null?null:wc(n.timezone)),s.session_teamfile!==null&&(n.provider!==void 0&&n.provider!==s.provider||n.model!==void 0&&n.model!==s.model||n.workingDirectory!==void 0&&n.workingDirectory!==s.working_directory))throw new U("SESSION_IMMUTABLE","provider/model/cwd cannot change while a session is seeded; run `cron reset-session` first",2);if(n.provider!==void 0&&(o.provider=n.provider),n.model!==void 0&&(o.model=n.model),(n.provider!==void 0||n.model!==void 0)&&om({actionKind:s.action_kind,provider:n.provider??s.provider,model:n.model??s.model,workingDirectory:n.workingDirectory!==void 0?n.workingDirectory:s.working_directory}),n.workingDirectory!==void 0){if(s.action_kind==="enqueue")throw new U("INVALID_ARGUMENT","working_directory is not valid for enqueue jobs");if(n.workingDirectory===null){if(s.action_kind==="session")throw new U("INVALID_ARGUMENT","a session job requires an absolute working_directory");o.working_directory=null}else{let i=Ur(n.workingDirectory,"working_directory");s.action_kind==="session"&&yc(i),o.working_directory=i}}if(n.escalationOwner!==void 0&&(o.escalation_owner=n.escalationOwner===null?null:Ur(n.escalationOwner,"escalation_owner")),Object.keys(o).length===0)throw new U("INVALID_ARGUMENT","Update requires at least one field");try{t.prepare(`UPDATE cron_jobs SET ${Object.keys(o).map(i=>`${i} = ?`).join(",")} WHERE id = ?`).run(...Object.values(o),e)}catch(i){Zi(i)}return nm(t,e),Je(t,e)});return jr(r)}function oC(t,e,n){let r=t.transaction(()=>{Je(t,e);try{t.prepare("UPDATE cron_jobs SET enabled = ? WHERE id = ?").run(n?1:0,e)}catch(s){Zi(s)}return nm(t,e),Je(t,e)});return jr(()=>r.immediate())}function iC(t,e){let n=t.transaction(()=>{let r=Je(t,e);if(Ki(t,e)!==null)throw new U("EXECUTION_FENCED",`Cron job ${e} has a fenced execution or unresolved escalation; resolve it before removing the job`,4);try{t.prepare("DELETE FROM cron_jobs WHERE id = ?").run(e)}catch(s){Zi(s)}return r});return jr(n)}function aC(t,e){let n=t.transaction(()=>{if(Je(t,e).action_kind!=="session")throw new U("INVALID_ARGUMENT",`Cron job ${e} is not a session job`);if(Ki(t,e)!==null)throw new U("SESSION_ACTIVE",`Cron job ${e} has an active run; resolve it before resetting the session`,4);return t.prepare(`UPDATE cron_jobs SET session_teamfile = NULL, session_seeded_at = NULL, session_alias = NULL,
2438
- session_generation = session_generation + 1 WHERE id = ?`).run(e),nm(t,e),Je(t,e)});return jr(n)}function lC(t,e=N6){try{return e("systemctl",["--user","is-active","--quiet",t]),"active"}catch(n){let r=n.status;if(r===3)return"confirmed-gone";if(r===4)try{if(String(e("systemctl",["--user","show","-p","LoadState","--value",t],{encoding:"utf8"})).trim()==="not-found")return"confirmed-gone"}catch{}return"unknown"}}async function am(t,e,n,r={}){let s=r.enqueueImpl??nC,o=r.spawnCommandImpl??lc,i=r.isUnitStillRunningImpl??lC,a=new Date(n).toISOString(),l=[];if(r.tick!==void 0)try{let d=NL(t,n,r.tick);d!==null&&process.stderr.write(`[cron] tick gap: ${Vf(d)}
2439
- `)}catch(d){try{r.onJobError?.(0,d)}catch{}}try{YL(t,{nowMs:n})}catch(d){try{r.onJobError?.(0,d)}catch{}}let c=jr(()=>t.prepare("SELECT * FROM cron_jobs WHERE enabled = 1 ORDER BY id").all());for(let d of c)try{M6(t,d,e,n,a,s,o,i,r.logDir,l,r.onJobError,{...r.runSpawnPrefixes!==void 0?{runSpawnPrefixes:r.runSpawnPrefixes}:{},...r.sessionDir!==void 0?{sessionDir:r.sessionDir}:{},...r.runTimeoutMs!==void 0?{runTimeoutMs:r.runTimeoutMs}:{},...r.runSeedTimeoutMs!==void 0?{runSeedTimeoutMs:r.runSeedTimeoutMs}:{},executeRunImpl:r.executeRunImpl??Vw})}catch(u){try{r.onJobError?.(d.id,u)}catch{}try{Os(t,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",fn(u),a],d)}catch{}}return l}function ZL(t,e){let n=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(t),r=s=>Number(n.find(o=>o.type===s).value);return new Date(r("year"),r("month")-1,r("day"),r("hour"),r("minute"),r("second"))}function O6(t){return JSON.stringify({kind:"command",payload:t.action_payload,provider:t.provider,model:t.model,workingDirectory:t.working_directory,escalationOwner:t.escalation_owner})}function D6(t){if(t.execution_identity===null)return null;try{let e=JSON.parse(t.execution_identity);return typeof e.systemdUnit=="string"?e.systemdUnit:null}catch{return null}}function Kw(t,e,n){let r=Ki(t,e);if(r!==null)try{Qi(t,r.id,{fallback:{ok:!1,summary:n}})}catch{}}function cC(t,e,n,r,s){try{let o=O6(e),i=mc(t,e.id,n,o);if(i.kind!=="claimed"){let a=D6(i.run);a!==null&&s(a)==="confirmed-gone"&&(Kw(t,e.id,"reconciled: previous command execution confirmed gone before a new fire"),i=mc(t,e.id,n,o))}return i.kind!=="claimed"?null:(zi(t,i.run.id,{kind:"command",systemdUnit:r},null),i.run.id)}catch{return null}}function dC(t,e,n,r,s,o,i){if(e!==null)try{if(s!==null)try{Yi(t,e,{kind:"command",systemdUnit:i},s)}catch{}let a=Jw(o,C6),l=r?`command spawn error: ${r.message}`:`command exited with code ${n}${a?`: ${a}`:""}`;Qi(t,e,{fallback:{ok:r===void 0&&n===0,summary:l}})}catch{}}function uC(t,e,n){if(e!==null)try{Qi(t,e,{fallback:{ok:!1,summary:`command spawn failed: ${fn(n)}`}})}catch{}}function M6(t,e,n,r,s,o,i,a,l,c,d,u){let f=Lw(e.schedule_expr);if(!f.ok){Os(t,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",`Unparseable schedule_expr: ${f.error.message}`,s],e);return}let m=f.schedule;if(e.action_kind==="command"&&e.running_since_ts!==null){if(e.running_systemd_unit!==null&&a(e.running_systemd_unit)==="confirmed-gone"){t.prepare(`UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?,
2437
+ session_generation = session_generation + 1 WHERE id = ?`).run(e),nm(t,e),Je(t,e)});return jr(n)}function lC(t,e=A6){try{return e("systemctl",["--user","is-active","--quiet",t]),"active"}catch(n){let r=n.status;if(r===3)return"confirmed-gone";if(r===4)try{if(String(e("systemctl",["--user","show","-p","LoadState","--value",t],{encoding:"utf8"})).trim()==="not-found")return"confirmed-gone"}catch{}return"unknown"}}async function am(t,e,n,r={}){let s=r.enqueueImpl??nC,o=r.spawnCommandImpl??lc,i=r.isUnitStillRunningImpl??lC,a=new Date(n).toISOString(),l=[];if(r.tick!==void 0)try{let d=NL(t,n,r.tick);d!==null&&process.stderr.write(`[cron] tick gap: ${Vf(d)}
2438
+ `)}catch(d){try{r.onJobError?.(0,d)}catch{}}try{YL(t,{nowMs:n})}catch(d){try{r.onJobError?.(0,d)}catch{}}let c=jr(()=>t.prepare("SELECT * FROM cron_jobs WHERE enabled = 1 ORDER BY id").all());for(let d of c)try{D6(t,d,e,n,a,s,o,i,r.logDir,l,r.onJobError,{...r.runSpawnPrefixes!==void 0?{runSpawnPrefixes:r.runSpawnPrefixes}:{},...r.sessionDir!==void 0?{sessionDir:r.sessionDir}:{},...r.runTimeoutMs!==void 0?{runTimeoutMs:r.runTimeoutMs}:{},...r.runSeedTimeoutMs!==void 0?{runSeedTimeoutMs:r.runSeedTimeoutMs}:{},executeRunImpl:r.executeRunImpl??Vw})}catch(u){try{r.onJobError?.(d.id,u)}catch{}try{Os(t,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",fn(u),a],d)}catch{}}return l}function ZL(t,e){let n=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(t),r=s=>Number(n.find(o=>o.type===s).value);return new Date(r("year"),r("month")-1,r("day"),r("hour"),r("minute"),r("second"))}function C6(t){return JSON.stringify({kind:"command",payload:t.action_payload,provider:t.provider,model:t.model,workingDirectory:t.working_directory,escalationOwner:t.escalation_owner})}function O6(t){if(t.execution_identity===null)return null;try{let e=JSON.parse(t.execution_identity);return typeof e.systemdUnit=="string"?e.systemdUnit:null}catch{return null}}function Kw(t,e,n){let r=Ki(t,e);if(r!==null)try{Qi(t,r.id,{fallback:{ok:!1,summary:n}})}catch{}}function cC(t,e,n,r,s){try{let o=C6(e),i=mc(t,e.id,n,o);if(i.kind!=="claimed"){let a=O6(i.run);a!==null&&s(a)==="confirmed-gone"&&(Kw(t,e.id,"reconciled: previous command execution confirmed gone before a new fire"),i=mc(t,e.id,n,o))}return i.kind!=="claimed"?null:(zi(t,i.run.id,{kind:"command",systemdUnit:r},null),i.run.id)}catch{return null}}function dC(t,e,n,r,s,o,i){if(e!==null)try{if(s!==null)try{Yi(t,e,{kind:"command",systemdUnit:i},s)}catch{}let a=Jw(o,L6),l=r?`command spawn error: ${r.message}`:`command exited with code ${n}${a?`: ${a}`:""}`;Qi(t,e,{fallback:{ok:r===void 0&&n===0,summary:l}})}catch{}}function uC(t,e,n){if(e!==null)try{Qi(t,e,{fallback:{ok:!1,summary:`command spawn failed: ${fn(n)}`}})}catch{}}function D6(t,e,n,r,s,o,i,a,l,c,d,u){let f=Lw(e.schedule_expr);if(!f.ok){Os(t,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",`Unparseable schedule_expr: ${f.error.message}`,s],e);return}let m=f.schedule;if(e.action_kind==="command"&&e.running_since_ts!==null){if(e.running_systemd_unit!==null&&a(e.running_systemd_unit)==="confirmed-gone"){t.prepare(`UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?,
2440
2439
  last_fire_error = NULL, updated_at = ?
2441
- WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts = ? AND running_systemd_unit = ?`).run("reconciled",s,e.id,e.revision,e.running_since_ts,e.running_systemd_unit),Kw(t,e.id,"reconciled: command execution confirmed gone by systemd probe; no exit callback survived the restart");return}t.prepare("UPDATE cron_jobs SET last_fire_status = ?, updated_at = ? WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts = ?").run("skipped_overlap",s,e.id,e.revision,e.running_since_ts);return}let p=e.last_checked_ts!==null?Date.parse(e.last_checked_ts):Date.parse(e.created_at);if(p>r){Os(t,"UPDATE cron_jobs SET last_checked_ts = ?, last_fire_status = ?, last_fire_error = ?, updated_at = ?",[s,"error",`last_checked_ts (${e.last_checked_ts??e.created_at}) is after the current tick time -- checkpoint reset without firing`,s],e);return}let _=new Date(p),h=new Date(r);if(r-p>L6){Os(t,"UPDATE cron_jobs SET last_checked_ts = ?, last_fire_status = ?, updated_at = ?",[s,"skipped_stale",s],e);return}let g=e.timezone!==null?ZL(_,e.timezone):_,w=e.timezone!==null?ZL(h,e.timezone):h;if(!RL(m,g,w)){Os(t,"UPDATE cron_jobs SET last_checked_ts = ?, updated_at = ?",[s,s],e);return}let E=rm(t,e.id);if(!(E===null||E.enabled===0||E.revision!==e.revision)){if(R6(e.action_kind)){$6(t,e,s,c,d,u);return}if(e.action_kind==="enqueue")try{let T=JSON.parse(e.action_payload),v={from:T.from??"autopilot",dedupeKey:`cron:${e.id}:${_.toISOString()}`};t.transaction(()=>{let k=t.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(e.id);return k===void 0||k.enabled===0||k.revision!==e.revision||k.last_checked_ts!==e.last_checked_ts?!1:(o(t,n,T.to,T.prompt,v),t.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(s,s,"ok",s,e.id),!0)}).immediate()&&c.push(e.title)}catch(T){try{d?.(e.id,T)}catch{}try{Os(t,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",fn(T),s],e)}catch{}}else{let T=s,v=`lmcron-job-${e.id}-${T.replace(/[:.]/g,"-")}.scope`;if(t.prepare(`UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, running_since_ts = ?, running_systemd_unit = ?, updated_at = ?
2440
+ WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts = ? AND running_systemd_unit = ?`).run("reconciled",s,e.id,e.revision,e.running_since_ts,e.running_systemd_unit),Kw(t,e.id,"reconciled: command execution confirmed gone by systemd probe; no exit callback survived the restart");return}t.prepare("UPDATE cron_jobs SET last_fire_status = ?, updated_at = ? WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts = ?").run("skipped_overlap",s,e.id,e.revision,e.running_since_ts);return}let p=e.last_checked_ts!==null?Date.parse(e.last_checked_ts):Date.parse(e.created_at);if(p>r){Os(t,"UPDATE cron_jobs SET last_checked_ts = ?, last_fire_status = ?, last_fire_error = ?, updated_at = ?",[s,"error",`last_checked_ts (${e.last_checked_ts??e.created_at}) is after the current tick time -- checkpoint reset without firing`,s],e);return}let _=new Date(p),h=new Date(r);if(r-p>R6){Os(t,"UPDATE cron_jobs SET last_checked_ts = ?, last_fire_status = ?, updated_at = ?",[s,"skipped_stale",s],e);return}let g=e.timezone!==null?ZL(_,e.timezone):_,w=e.timezone!==null?ZL(h,e.timezone):h;if(!RL(m,g,w)){Os(t,"UPDATE cron_jobs SET last_checked_ts = ?, updated_at = ?",[s,s],e);return}let E=rm(t,e.id);if(!(E===null||E.enabled===0||E.revision!==e.revision)){if(x6(e.action_kind)){M6(t,e,s,c,d,u);return}if(e.action_kind==="enqueue")try{let T=JSON.parse(e.action_payload),v={from:T.from??"autopilot",dedupeKey:`cron:${e.id}:${_.toISOString()}`};t.transaction(()=>{let k=t.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(e.id);return k===void 0||k.enabled===0||k.revision!==e.revision||k.last_checked_ts!==e.last_checked_ts?!1:(o(t,n,T.to,T.prompt,v),t.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(s,s,"ok",s,e.id),!0)}).immediate()&&c.push(e.title)}catch(T){try{d?.(e.id,T)}catch{}try{Os(t,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",fn(T),s],e)}catch{}}else{let T=s,v=`lmcron-job-${e.id}-${T.replace(/[:.]/g,"-")}.scope`;if(t.prepare(`UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, running_since_ts = ?, running_systemd_unit = ?, updated_at = ?
2442
2441
  WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?) AND (running_since_ts IS ?)`).run(s,s,"ok",s,v,s,e.id,e.revision,e.last_checked_ts,e.running_since_ts).changes===0)return;let k=cC(t,e,e.action_kind,v,a),I={logDir:l,systemdUnitName:v,onExit:(N,A,S,x)=>{let R=N===0?"ok":"error",L=R==="ok"?null:A?fn(A):`Command exited with code ${N} -- see ${l??zf()}/${e.id}/ for output`;if(A)try{d?.(e.id,A)}catch{}try{t.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(R,L,new Date().toISOString(),e.id,T)}catch{}dC(t,k,N,A,S,x,v)}};try{i({id:e.id,action_payload:e.action_payload},I),c.push(e.title)}catch(N){try{d?.(e.id,N)}catch{}try{t.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",fn(N),s,e.id,T)}catch{}uC(t,k,N)}}}}async function eC(t,e){for(;!t();)await new Promise(n=>setTimeout(n,e))}async function zw(t,e,n,r={}){let s=r.enqueueImpl??nC,o=r.spawnCommandImpl??lc,i=r.isUnitStillRunningImpl??lC,a=r.executeRunImpl??Vw,l=r.logDir,c=r.pollMs??250,d=Je(t,e);if(Ji(t,e)&&r.onDemand===void 0)return{kind:"skipped_overlap",job:d};if(d.enabled===0)throw new U("DISABLED",`Cron job ${e} is disabled -- enable it first (\`cron enable ${e}\`), or a manual trigger would silently exercise a job the operator turned off on purpose`,4);let u=Ce();if(d.action_kind==="command"){if(d.running_since_ts!==null)return d.running_systemd_unit!==null&&i(d.running_systemd_unit)==="confirmed-gone"?(t.prepare(`UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = NULL, updated_at = ?
2443
2442
  WHERE id = ? AND revision = ? AND running_since_ts = ? AND running_systemd_unit = ?`).run("reconciled",u,d.id,d.revision,d.running_since_ts,d.running_systemd_unit),Kw(t,d.id,"reconciled: command execution confirmed gone by systemd probe; no exit callback survived the restart"),await zw(t,e,n,r)):{kind:"skipped_overlap",job:d};let p=u,_=`lmcron-job-${d.id}-${p.replace(/[:.]/g,"-")}-manual.scope`;if(t.prepare(`UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, running_since_ts = ?, running_systemd_unit = ?, updated_at = ?
2444
- WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts IS ?`).run(u,"ok",p,_,u,d.id,d.revision,d.running_since_ts).changes===0)return{kind:"skipped_overlap",job:Je(t,e)};let g=cC(t,d,`${d.action_kind}:manual`,_,i),w={logDir:l,systemdUnitName:_,onExit:(y,E,T,v)=>{let b=y===0?"ok":"error",k=b==="ok"?null:E?fn(E):`Command exited with code ${y} -- see ${l??zf()}/${d.id}/ for output`;try{t.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(b,k,new Date().toISOString(),d.id,p)}catch{}dC(t,g,y,E,T,v,_)}};try{o({id:d.id,action_payload:d.action_payload},w)}catch(y){uC(t,g,y);try{t.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",fn(y),u,d.id,p)}catch{}throw new U("SPAWN_FAILED",`manual trigger of job ${e} failed to spawn: ${fn(y)}`,1)}return await eC(()=>Je(t,e).running_since_ts!==p,c),{kind:"fired",job:Je(t,e)}}if(d.action_kind==="enqueue"){let p=JSON.parse(d.action_payload);return s(t,n,p.to,p.prompt,{from:p.from??"autopilot"}),t.prepare("UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(u,"ok",u,d.id),{kind:"fired",job:Je(t,e)}}let f=JSON.stringify({kind:d.action_kind,payload:d.action_payload,provider:d.provider,model:d.model,workingDirectory:d.working_directory,escalationOwner:d.escalation_owner}),m=t.transaction(()=>{let p=t.prepare("SELECT enabled, revision FROM cron_jobs WHERE id = ?").get(d.id);if(p===void 0||p.enabled===0||p.revision!==d.revision)return null;let _=mc(t,d.id,`${d.action_kind}:manual`,f);if(_.kind==="claimed"){r.onDemand!==void 0&&SL(t,d.id,_.run.id,r.onDemand);let h=r.disableOnClaim?"enabled = 0, ":"";t.prepare(`UPDATE cron_jobs SET ${h}last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?`).run(u,"ok",u,d.id)}return _}).immediate();if(m===null)throw new U("CONFLICT",`Cron job ${e} was modified concurrently -- re-run \`cron trigger ${e}\``,5);if(m.kind==="escalation")return{kind:"blocked_escalation",job:Je(t,e)};if(m.kind==="overlap")return{kind:"skipped_overlap",job:Je(t,e)};try{a({db:t,job:d,run:m.run,runToken:m.token,...r.onDemand!==void 0?{onDemand:r.onDemand}:{},...r.runSpawnPrefixes!==void 0?{spawnPrefixes:r.runSpawnPrefixes}:{},...r.sessionDir!==void 0?{sessionDir:r.sessionDir}:{},...r.runTimeoutMs!==void 0?{timeoutMs:r.runTimeoutMs}:{},...r.runSeedTimeoutMs!==void 0?{seedTimeoutMs:r.runSeedTimeoutMs}:{}})}catch(p){try{pc(t,m.run.id,`worker dispatch threw: ${fn(p)}`),Pw(t,m.run.id,{ok:!1,summary:`worker dispatch error: ${fn(p)}`})}catch{}throw new U("SPAWN_FAILED",`manual trigger of job ${e} failed to dispatch: ${fn(p)}`,1)}if(r.waitForCompletion===!1){let p=d;try{p=Je(t,e)}catch(_){console.warn(`[triggerCronJobNow] post-dispatch getCronJob read failed for job ${e}:`,_)}return{kind:"fired",job:p,runId:m.run.id}}return await eC(()=>{let p=bt(t,m.run.id);return p.status!=="pending"&&p.status!=="running"},c),{kind:"fired",job:Je(t,e),runId:m.run.id}}function $6(t,e,n,r,s,o){if(Ji(t,e.id))return;let i=JSON.stringify({kind:e.action_kind,payload:e.action_payload,provider:e.provider,model:e.model,workingDirectory:e.working_directory,escalationOwner:e.escalation_owner}),a=t.transaction(()=>{let l=t.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(e.id);if(l===void 0||l.enabled===0||l.revision!==e.revision||l.last_checked_ts!==e.last_checked_ts)return null;let c=mc(t,e.id,e.action_kind,i);return c.kind==="claimed"&&t.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(n,n,"ok",n,e.id),c}).immediate();if(a!==null){if(a.kind==="escalation"){Os(t,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["blocked_escalation",n],e);return}if(a.kind==="overlap"){Os(t,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["skipped_overlap",n],e);return}r.push(e.title);try{o.executeRunImpl({db:t,job:e,run:a.run,runToken:a.token,...o.runSpawnPrefixes!==void 0?{spawnPrefixes:o.runSpawnPrefixes}:{},...o.sessionDir!==void 0?{sessionDir:o.sessionDir}:{},...o.runTimeoutMs!==void 0?{timeoutMs:o.runTimeoutMs}:{},...o.runSeedTimeoutMs!==void 0?{seedTimeoutMs:o.runSeedTimeoutMs}:{}})}catch(l){try{pc(t,a.run.id,`worker dispatch threw: ${fn(l)}`),Pw(t,a.run.id,{ok:!1,summary:`worker dispatch error: ${fn(l)}`})}catch{}try{s?.(e.id,l)}catch{}}}}function Os(t,e,n,r){t.prepare(`${e} WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?)`).run(...n,r.id,r.revision,r.last_checked_ts)}function fC(t,e){let n=t.transaction(()=>{Je(t,e);try{t.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL WHERE id = ?").run(e)}catch(r){Zi(r)}return nm(t,e),Je(t,e)});return jr(n)}var tC,L6,C6,lm=C(()=>{"use strict";kw();xw();Ao();Ao();No();LL();Cw();Qf();QL();tC="the enqueue kind is retired (the lmbee prompt queue is gone in lmctl): recreate the job with --kind session --target TEAMFILE:ALIAS";L6=24*60*60*1e3;C6=500});function mC(t){let e=t.intervalMs??P6,n=t.evaluateCronJobsImpl??am,r=t.log??(c=>process.stderr.write(`${c}
2445
- `)),s=null,o=null,i=null,a=0;async function l(){if(i)return a+=1,(a===1||a%12===0)&&r(`[cron] tick skipped: the previous tick is still running (${a} interval fire${a===1?"":"s"} dropped since cron last evaluated)`),[];i=(async()=>{try{let c=a,d=await n(t.db,t.getTeams?.()??[],Date.now(),{onJobError:(u,f)=>t.onError?.(f),tick:{intervalMs:e,skippedOverlaps:c,atMs:Date.now()}});return a-=c,d.length&&r(`[cron] fired: ${d.join(", ")}`),d}catch(c){return t.onError?.(c),[]}})();try{return await i}finally{i=null}}return{start(){if(s)return;s=setInterval(()=>{l()},e),s.unref();let c=t.firstTickDelayMs===void 0?5e3:t.firstTickDelayMs;c!==null&&(o=setTimeout(()=>{o=null,l()},c),o.unref())},stop(){s&&(clearInterval(s),s=null),o&&(clearTimeout(o),o=null)},async drain(c=3e4){return this.stop(),i?await Promise.race([i.then(()=>!0,()=>!0),new Promise(u=>setTimeout(()=>u(!1),c).unref())]):!0},runTickNow:l,isRunning:()=>s!==null,isTicking:()=>i!==null}}var P6,pC=C(()=>{"use strict";lm();P6=18e5});var wC={};ye(wC,{runServeCommand:()=>G6});import{execFile as U6,spawn as F6}from"node:child_process";import{existsSync as Tc,mkdirSync as hC,readFileSync as Yw,rmSync as Qw,writeFileSync as _C}from"node:fs";import{homedir as dm,userInfo as j6}from"node:os";import{dirname as gC,join as Ro}from"node:path";import{promisify as W6}from"node:util";function H6(t){let e=t.XDG_CONFIG_HOME&&t.XDG_CONFIG_HOME.startsWith("/")?t.XDG_CONFIG_HOME:Ro(t.HOME||dm(),".config");return Ro(e,"systemd","user",Rt)}function cm(t){if(/[\u0000-\u001f\u007f]/.test(t))throw new Error("service paths may not contain control characters");return`"${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/%/g,"%%").replace(/\$/g,"$$$$")}"`}function B6(t,e,n,r,s,o){return[Zw,"[Unit]","Description=lmctl local service and cron runner","After=network.target","","[Service]","Type=simple",`WorkingDirectory=${r.replace(/%/g,"%%")}`,`ExecStart=${[t,e,"serve","daemon"].map(cm).join(" ")}`,"Restart=on-failure","RestartSec=5","TimeoutStopSec=infinity",`Environment=${cm(`LMCTL_DB=${n}`)}`,`Environment=${cm(`LMCTL_HOME=${o}`)}`,`Environment=${cm(`PATH=${s}`)}`,"StandardOutput=journal","StandardError=journal","","[Install]","WantedBy=default.target",""].join(`
2446
- `)}function yC(t){let e="",n="";if(Jf(["--json"],{env:t.env,cwd:t.cwd,stdout:{write:s=>{e+=s}},stderr:{write:s=>{n+=s}}})!==0)return{state:"invalid",error:`site configuration is invalid${n.trim()?`: ${n.trim()}`:""}`};try{let s=JSON.parse(e);return s.enabled!==!0?{state:"disabled"}:{state:"configured",name:typeof s.config?.name=="string"?s.config.name:void 0,allow:Array.isArray(s.config?.allow)?s.config.allow.filter(o=>typeof o=="string"):[],allowTracked:s.config?.allowTracked===!0}}catch{return{state:"invalid",error:"site configuration status could not be read"}}}async function Wr(t){let{stdout:e}=await tE("systemctl",["--user",...t]);return String(e??"").trim()}async function X6(t){let e=process.execPath,n=process.argv[1];if(!n)return t.stderr.write(`error: cannot locate the lmctl CLI entry point
2447
- `),1;let r=[e,n,"serve","daemon"].map(s=>`'${s.replace(/'/g,"'\\''")}'`).join(" ");try{if(process.platform==="darwin"){let s=`tell application "Terminal" to do script "${r.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`;await tE("osascript",["-e",s])}else if(process.platform==="win32")F6("cmd.exe",["/c","start","cmd.exe","/k",r],{detached:!0,stdio:"ignore"}).unref();else return t.stderr.write(`error: no service-manager support for ${process.platform}; run ${r} in a terminal
2443
+ WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts IS ?`).run(u,"ok",p,_,u,d.id,d.revision,d.running_since_ts).changes===0)return{kind:"skipped_overlap",job:Je(t,e)};let g=cC(t,d,`${d.action_kind}:manual`,_,i),w={logDir:l,systemdUnitName:_,onExit:(y,E,T,v)=>{let b=y===0?"ok":"error",k=b==="ok"?null:E?fn(E):`Command exited with code ${y} -- see ${l??zf()}/${d.id}/ for output`;try{t.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(b,k,new Date().toISOString(),d.id,p)}catch{}dC(t,g,y,E,T,v,_)}};try{o({id:d.id,action_payload:d.action_payload},w)}catch(y){uC(t,g,y);try{t.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",fn(y),u,d.id,p)}catch{}throw new U("SPAWN_FAILED",`manual trigger of job ${e} failed to spawn: ${fn(y)}`,1)}return await eC(()=>Je(t,e).running_since_ts!==p,c),{kind:"fired",job:Je(t,e)}}if(d.action_kind==="enqueue"){let p=JSON.parse(d.action_payload);return s(t,n,p.to,p.prompt,{from:p.from??"autopilot"}),t.prepare("UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(u,"ok",u,d.id),{kind:"fired",job:Je(t,e)}}let f=JSON.stringify({kind:d.action_kind,payload:d.action_payload,provider:d.provider,model:d.model,workingDirectory:d.working_directory,escalationOwner:d.escalation_owner}),m=t.transaction(()=>{let p=t.prepare("SELECT enabled, revision FROM cron_jobs WHERE id = ?").get(d.id);if(p===void 0||p.enabled===0||p.revision!==d.revision)return null;let _=mc(t,d.id,`${d.action_kind}:manual`,f);if(_.kind==="claimed"){r.onDemand!==void 0&&SL(t,d.id,_.run.id,r.onDemand);let h=r.disableOnClaim?"enabled = 0, ":"";t.prepare(`UPDATE cron_jobs SET ${h}last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?`).run(u,"ok",u,d.id)}return _}).immediate();if(m===null)throw new U("CONFLICT",`Cron job ${e} was modified concurrently -- re-run \`cron trigger ${e}\``,5);if(m.kind==="escalation")return{kind:"blocked_escalation",job:Je(t,e)};if(m.kind==="overlap")return{kind:"skipped_overlap",job:Je(t,e)};try{a({db:t,job:d,run:m.run,runToken:m.token,...r.onDemand!==void 0?{onDemand:r.onDemand}:{},...r.runSpawnPrefixes!==void 0?{spawnPrefixes:r.runSpawnPrefixes}:{},...r.sessionDir!==void 0?{sessionDir:r.sessionDir}:{},...r.runTimeoutMs!==void 0?{timeoutMs:r.runTimeoutMs}:{},...r.runSeedTimeoutMs!==void 0?{seedTimeoutMs:r.runSeedTimeoutMs}:{}})}catch(p){try{pc(t,m.run.id,`worker dispatch threw: ${fn(p)}`),Pw(t,m.run.id,{ok:!1,summary:`worker dispatch error: ${fn(p)}`})}catch{}throw new U("SPAWN_FAILED",`manual trigger of job ${e} failed to dispatch: ${fn(p)}`,1)}if(r.waitForCompletion===!1){let p=d;try{p=Je(t,e)}catch(_){console.warn(`[triggerCronJobNow] post-dispatch getCronJob read failed for job ${e}:`,_)}return{kind:"fired",job:p,runId:m.run.id}}return await eC(()=>{let p=bt(t,m.run.id);return p.status!=="pending"&&p.status!=="running"},c),{kind:"fired",job:Je(t,e),runId:m.run.id}}function M6(t,e,n,r,s,o){if(Ji(t,e.id))return;let i=JSON.stringify({kind:e.action_kind,payload:e.action_payload,provider:e.provider,model:e.model,workingDirectory:e.working_directory,escalationOwner:e.escalation_owner}),a=t.transaction(()=>{let l=t.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(e.id);if(l===void 0||l.enabled===0||l.revision!==e.revision||l.last_checked_ts!==e.last_checked_ts)return null;let c=mc(t,e.id,e.action_kind,i);return c.kind==="claimed"&&t.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(n,n,"ok",n,e.id),c}).immediate();if(a!==null){if(a.kind==="escalation"){Os(t,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["blocked_escalation",n],e);return}if(a.kind==="overlap"){Os(t,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["skipped_overlap",n],e);return}r.push(e.title);try{o.executeRunImpl({db:t,job:e,run:a.run,runToken:a.token,...o.runSpawnPrefixes!==void 0?{spawnPrefixes:o.runSpawnPrefixes}:{},...o.sessionDir!==void 0?{sessionDir:o.sessionDir}:{},...o.runTimeoutMs!==void 0?{timeoutMs:o.runTimeoutMs}:{},...o.runSeedTimeoutMs!==void 0?{seedTimeoutMs:o.runSeedTimeoutMs}:{}})}catch(l){try{pc(t,a.run.id,`worker dispatch threw: ${fn(l)}`),Pw(t,a.run.id,{ok:!1,summary:`worker dispatch error: ${fn(l)}`})}catch{}try{s?.(e.id,l)}catch{}}}}function Os(t,e,n,r){t.prepare(`${e} WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?)`).run(...n,r.id,r.revision,r.last_checked_ts)}function fC(t,e){let n=t.transaction(()=>{Je(t,e);try{t.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL WHERE id = ?").run(e)}catch(r){Zi(r)}return nm(t,e),Je(t,e)});return jr(n)}var tC,R6,L6,lm=C(()=>{"use strict";kw();xw();Ao();Ao();No();LL();Cw();Qf();QL();tC="the enqueue kind is retired (the lmbee prompt queue is gone in lmctl): recreate the job with --kind session --target TEAMFILE:ALIAS";R6=24*60*60*1e3;L6=500});function mC(t){let e=t.intervalMs??$6,n=t.evaluateCronJobsImpl??am,r=t.log??(c=>process.stderr.write(`${c}
2444
+ `)),s=null,o=null,i=null,a=0;async function l(){if(i)return a+=1,(a===1||a%12===0)&&r(`[cron] tick skipped: the previous tick is still running (${a} interval fire${a===1?"":"s"} dropped since cron last evaluated)`),[];i=(async()=>{try{let c=a,d=await n(t.db,t.getTeams?.()??[],Date.now(),{onJobError:(u,f)=>t.onError?.(f),tick:{intervalMs:e,skippedOverlaps:c,atMs:Date.now()}});return a-=c,d.length&&r(`[cron] fired: ${d.join(", ")}`),d}catch(c){return t.onError?.(c),[]}})();try{return await i}finally{i=null}}return{start(){if(s)return;s=setInterval(()=>{l()},e),s.unref();let c=t.firstTickDelayMs===void 0?5e3:t.firstTickDelayMs;c!==null&&(o=setTimeout(()=>{o=null,l()},c),o.unref())},stop(){s&&(clearInterval(s),s=null),o&&(clearTimeout(o),o=null)},async drain(c=3e4){return this.stop(),i?await Promise.race([i.then(()=>!0,()=>!0),new Promise(u=>setTimeout(()=>u(!1),c).unref())]):!0},runTickNow:l,isRunning:()=>s!==null,isTicking:()=>i!==null}}var $6,pC=C(()=>{"use strict";lm();$6=18e5});var wC={};ye(wC,{runServeCommand:()=>q6});import{execFile as P6,spawn as U6}from"node:child_process";import{existsSync as Tc,mkdirSync as hC,readFileSync as Yw,rmSync as Qw,writeFileSync as _C}from"node:fs";import{homedir as dm,userInfo as F6}from"node:os";import{dirname as gC,join as Ro}from"node:path";import{promisify as j6}from"node:util";function W6(t){let e=t.XDG_CONFIG_HOME&&t.XDG_CONFIG_HOME.startsWith("/")?t.XDG_CONFIG_HOME:Ro(t.HOME||dm(),".config");return Ro(e,"systemd","user",Rt)}function cm(t){if(/[\u0000-\u001f\u007f]/.test(t))throw new Error("service paths may not contain control characters");return`"${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/%/g,"%%").replace(/\$/g,"$$$$")}"`}function H6(t,e,n,r,s,o){return[Zw,"[Unit]","Description=lmctl local service and cron runner","After=network.target","","[Service]","Type=simple",`WorkingDirectory=${r.replace(/%/g,"%%")}`,`ExecStart=${[t,e,"serve","daemon"].map(cm).join(" ")}`,"Restart=on-failure","RestartSec=5","TimeoutStopSec=infinity",`Environment=${cm(`LMCTL_DB=${n}`)}`,`Environment=${cm(`LMCTL_HOME=${o}`)}`,`Environment=${cm(`PATH=${s}`)}`,"StandardOutput=journal","StandardError=journal","","[Install]","WantedBy=default.target",""].join(`
2445
+ `)}function yC(t){let e="",n="";if(Jf(["--json"],{env:t.env,cwd:t.cwd,stdout:{write:s=>{e+=s}},stderr:{write:s=>{n+=s}}})!==0)return{state:"invalid",error:`site configuration is invalid${n.trim()?`: ${n.trim()}`:""}`};try{let s=JSON.parse(e);return s.enabled!==!0?{state:"disabled"}:{state:"configured",name:typeof s.config?.name=="string"?s.config.name:void 0,allow:Array.isArray(s.config?.allow)?s.config.allow.filter(o=>typeof o=="string"):[],allowTracked:s.config?.allowTracked===!0}}catch{return{state:"invalid",error:"site configuration status could not be read"}}}async function Wr(t){let{stdout:e}=await tE("systemctl",["--user",...t]);return String(e??"").trim()}async function B6(t){let e=process.execPath,n=process.argv[1];if(!n)return t.stderr.write(`error: cannot locate the lmctl CLI entry point
2446
+ `),1;let r=[e,n,"serve","daemon"].map(s=>`'${s.replace(/'/g,"'\\''")}'`).join(" ");try{if(process.platform==="darwin"){let s=`tell application "Terminal" to do script "${r.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`;await tE("osascript",["-e",s])}else if(process.platform==="win32")U6("cmd.exe",["/c","start","cmd.exe","/k",r],{detached:!0,stdio:"ignore"}).unref();else return t.stderr.write(`error: no service-manager support for ${process.platform}; run ${r} in a terminal
2448
2447
  `),1}catch(s){return t.stderr.write(`error: could not open a terminal window: ${s instanceof Error?s.message:String(s)}
2449
2448
  `),1}return t.stdout.write(`Opened a terminal window and started the lmctl daemon there. This does not survive logout or reboot.
2450
- `),0}async function q6(t,e){if(t.length>0)return e.stderr.write(`error: unexpected lmctl serve daemon argument ${t[0]}
2449
+ `),0}async function X6(t,e){if(t.length>0)return e.stderr.write(`error: unexpected lmctl serve daemon argument ${t[0]}
2451
2450
  ${eE}
2452
2451
  `),2;let n=yC(e);if(n.state==="invalid")return e.stderr.write(`error: lmctl serve daemon cannot start: ${n.error}
2453
2452
  `),1;let r=Number(e.env?.LMCTL_CRON_INTERVAL_S??process.env.LMCTL_CRON_INTERVAL_S??1800),s=Ye({path:Pe(e)}),o=mC({db:s.db,intervalMs:Math.max(10,Number.isFinite(r)?r:1800)*1e3,onError:f=>e.stderr.write(`lmctl cron: ${f instanceof Error?f.message:String(f)}
@@ -2457,12 +2456,12 @@ ${eE}
2457
2456
  `,{mode:384}),e.stdout.write(`lmctl serve: native cron and site agent daemon started
2458
2457
  `);let a=new AbortController,{runConfiguredSite:l}=await Promise.resolve().then(()=>(Gi(),sc)),c=l(e,a.signal).catch(f=>(e.stderr.write(`lmctl site: agent failed: ${f instanceof Error?f.message:String(f)}
2459
2458
  `),1)),d=!1,u=()=>{if(d)return;d=!0,a.abort();let f=o.drain(3e4).then(m=>{m||e.stderr.write(`lmctl cron: a tick was still running at shutdown (left to the next daemon)
2460
- `)});Promise.allSettled([c,f]).finally(()=>{Qw(i,{force:!0}),s.close()})};return process.once("SIGINT",u),process.once("SIGTERM",u),await new Promise(f=>{let m=setInterval(()=>{d&&(clearInterval(m),f(0))},100)})}async function G6(t,e){let[n,...r]=t;if(n===void 0||n==="--help"||n==="-h"||n==="help")return e.stdout.write(`${eE}
2461
- `),0;if(n==="daemon")return q6(r,e);if(!["install","start","stop","status","uninstall"].includes(n)||n!=="status"&&r.length>0||n==="status"&&r.length>1||n==="status"&&r.length===1&&r[0]!=="--json")return e.stderr.write(`error: invalid lmctl serve command
2459
+ `)});Promise.allSettled([c,f]).finally(()=>{Qw(i,{force:!0}),s.close()})};return process.once("SIGINT",u),process.once("SIGTERM",u),await new Promise(f=>{let m=setInterval(()=>{d&&(clearInterval(m),f(0))},100)})}async function q6(t,e){let[n,...r]=t;if(n===void 0||n==="--help"||n==="-h"||n==="help")return e.stdout.write(`${eE}
2460
+ `),0;if(n==="daemon")return X6(r,e);if(!["install","start","stop","status","uninstall"].includes(n)||n!=="status"&&r.length>0||n==="status"&&r.length>1||n==="status"&&r.length===1&&r[0]!=="--json")return e.stderr.write(`error: invalid lmctl serve command
2462
2461
  ${eE}
2463
- `),2;if(process.platform!=="linux"){if(n==="install"||n==="start")return X6(e);if(n==="stop"){let m=Ro(e.env?.LMCTL_HOME||Ro(e.env?.HOME||dm(),".lmctl"),"serve.pid");if(!Tc(m))return e.stdout.write(`lmctl daemon is not running
2462
+ `),2;if(process.platform!=="linux"){if(n==="install"||n==="start")return B6(e);if(n==="stop"){let m=Ro(e.env?.LMCTL_HOME||Ro(e.env?.HOME||dm(),".lmctl"),"serve.pid");if(!Tc(m))return e.stdout.write(`lmctl daemon is not running
2464
2463
  `),0;let p=Number(Yw(m,"utf8").trim());return Number.isInteger(p)&&p>0&&process.kill(p,"SIGTERM"),Qw(m,{force:!0}),0}return e.stdout.write(`${n}: unsupported without a Linux systemd user service
2465
- `),n==="status"?0:1}let s=H6(e.env??process.env);if(n==="status"){let m=Tc(s),p="inactive",_="disabled",h="";try{p=await Wr(["is-active",Rt])}catch(T){p=String(T.stdout??"inactive").trim()}try{_=await Wr(["is-enabled",Rt])}catch(T){_=String(T.stdout??"disabled").trim()}try{h=await Wr(["show","--property=Result","--value",Rt])}catch{}h!==""&&h!=="success"&&(p="failed");let g=yC(e),w=m?p==="active"?"running":p==="inactive"?"stopped":p:"not installed",y={unit:Rt,installed:m,enabled:_,state:w,active:p,...h?{result:h}:{}},E=g.state==="invalid"?{state:"config_invalid",error:g.error}:g.state==="configured"?{state:"configured",daemon:p,name:g.name,allowed_targets:g.allow,allow_tracked:g.allowTracked}:{state:"disabled"};if(r[0]==="--json")e.stdout.write(`${JSON.stringify({service:y,site_agent:E})}
2464
+ `),n==="status"?0:1}let s=W6(e.env??process.env);if(n==="status"){let m=Tc(s),p="inactive",_="disabled",h="";try{p=await Wr(["is-active",Rt])}catch(T){p=String(T.stdout??"inactive").trim()}try{_=await Wr(["is-enabled",Rt])}catch(T){_=String(T.stdout??"disabled").trim()}try{h=await Wr(["show","--property=Result","--value",Rt])}catch{}h!==""&&h!=="success"&&(p="failed");let g=yC(e),w=m?p==="active"?"running":p==="inactive"?"stopped":p:"not installed",y={unit:Rt,installed:m,enabled:_,state:w,active:p,...h?{result:h}:{}},E=g.state==="invalid"?{state:"config_invalid",error:g.error}:g.state==="configured"?{state:"configured",daemon:p,name:g.name,allowed_targets:g.allow,allow_tracked:g.allowTracked}:{state:"disabled"};if(r[0]==="--json")e.stdout.write(`${JSON.stringify({service:y,site_agent:E})}
2466
2465
  `);else if(e.stdout.write(`service: ${Rt}; ${m?"installed":"not installed"}; ${_}; ${w}
2467
2466
  `),g.state==="invalid")e.stdout.write(`site agent: config invalid (${g.error})
2468
2467
  `);else if(g.state==="configured"){let T=g.allowTracked?"all tracked sessions":g.allow?.length?`${g.allow.length} configured target${g.allow.length===1?"":"s"}`:"list only";e.stdout.write(`site agent: configured for ${g.name}; allowed ${T}; daemon ${p}
@@ -2478,40 +2477,40 @@ ${eE}
2478
2477
  `),0}catch(m){return e.stderr.write(`error: systemctl --user start failed: ${m instanceof Error?m.message:String(m)}
2479
2478
  `),1}let o=e.env??process.env,i=Pe(e);if(!Tc(i))return e.stderr.write(`error: database ${i} does not exist; run lmctl once before installing the service
2480
2479
  `),1;let a=process.execPath,l=process.argv[1];if(!l)return e.stderr.write(`error: cannot locate the lmctl CLI entry point
2481
- `),1;let c=o.HOME||dm(),d=gC(s);hC(d,{recursive:!0});let u=o.LMCTL_HOME||Ro(c,".lmctl"),f=B6(a,l,i,c,o.PATH??process.env.PATH??"",u);if(Tc(s)&&!Yw(s,"utf8").startsWith(`${Zw}
2480
+ `),1;let c=o.HOME||dm(),d=gC(s);hC(d,{recursive:!0});let u=o.LMCTL_HOME||Ro(c,".lmctl"),f=H6(a,l,i,c,o.PATH??process.env.PATH??"",u);if(Tc(s)&&!Yw(s,"utf8").startsWith(`${Zw}
2482
2481
  `))return e.stderr.write(`error: ${s} already exists and is not managed by lmctl; leaving it untouched
2483
- `),1;_C(s,f,{mode:384});try{await tE("loginctl",["enable-linger",o.USER||j6().username]),await Wr(["daemon-reload"]),await Wr(["enable","--now",Rt])}catch(m){return e.stderr.write(`error: service unit was written but could not be enabled: ${m instanceof Error?m.message:String(m)}
2482
+ `),1;_C(s,f,{mode:384});try{await tE("loginctl",["enable-linger",o.USER||F6().username]),await Wr(["daemon-reload"]),await Wr(["enable","--now",Rt])}catch(m){return e.stderr.write(`error: service unit was written but could not be enabled: ${m instanceof Error?m.message:String(m)}
2484
2483
  `),1}return e.stdout.write(`${Rt} installed, enabled, started, and user lingering enabled
2485
- `),0}var tE,Zw,Rt,eE,EC=C(()=>{"use strict";he();Gi();Pt();pC();tE=W6(U6),Zw="# Managed by lmctl serve install",Rt="lmctl.service",eE=`usage: lmctl serve install|start|stop|status|uninstall
2484
+ `),0}var tE,Zw,Rt,eE,EC=C(()=>{"use strict";he();Gi();Pt();pC();tE=j6(P6),Zw="# Managed by lmctl serve install",Rt="lmctl.service",eE=`usage: lmctl serve install|start|stop|status|uninstall
2486
2485
  lmctl serve daemon
2487
2486
 
2488
2487
  install registers the daemon as a boot-surviving systemd user service on Linux and enables user lingering.
2489
- On other operating systems, install and start open a terminal window and start the daemon in it.`});function vc(t,e=[]){let n=new Set(e),r=[],s={};for(let o=0;o<t.length;o++){let i=t[o];if(i==="-h")s.help=!0;else if(i.startsWith("--")){let a=i.slice(2),l=t[o+1];!n.has(a)&&l!==void 0&&!l.startsWith("--")?(s[a]=l,o++):s[a]=!0}else r.push(i)}return{positionals:r,flags:s}}var nE=C(()=>{"use strict"});function TC(t){return mt(t)}var vC=C(()=>{"use strict";Fs();Pt();Kn()});import{existsSync as J6,readFileSync as V6,writeFileSync as K6}from"node:fs";function Z6(t){return{id:t.id,title:t.title,schedule_expr:t.schedule_expr,action_kind:t.action_kind,action_payload:t.action_payload,provider:t.provider,model:t.model,working_directory:t.working_directory,escalation_owner:t.escalation_owner,timezone:t.timezone,enabled:!!t.enabled}}function e4(t){return t instanceof Error&&"code"in t&&typeof t.code=="string"&&t.code.startsWith("SQLITE_BUSY")}function t4(t,e){let n;try{n=t.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'cron_jobs'").get()!==void 0?t.prepare("SELECT * FROM cron_jobs ORDER BY id").all():[]}catch(r){throw e4(r)?new U("SOURCE_BUSY","source database is locked by another process -- export never waits on locks (busy_timeout = 0); retry shortly",3):r}for(let r of n)if(r.action_kind!=="command"&&r.action_kind!=="script")throw new U("INVALID_ARGUMENT",`cron job ${r.id} "${r.title}" has action_kind "${r.action_kind}" -- export does not carry ${r.action_kind}-kind jobs, so no file was written (import would refuse it; never produce a transferable payload containing one -- re-create the job manually on the target)`);return{schema_version:1,kind:rE,exported_at:new Date().toISOString(),exported_from:e,jobs:n.map(Z6)}}function n4(t,e,n){let r=t4(t,n);try{K6(e,`${JSON.stringify(r,null,2)}
2490
- `,{flag:"wx"})}catch(s){throw s&&typeof s=="object"&&"code"in s&&s.code==="EEXIST"?new U("INVALID_ARGUMENT",`export path already exists: ${e} (rm it first; there is no --force)`):new U("INVALID_ARGUMENT",`cannot write export to ${e}: ${s instanceof Error?s.message:String(s)}`)}return r}function r4(t){let e=z6(t);Y6(e);let n=new Ln(e,{readonly:!0,fileMustExist:!0});return n.pragma("busy_timeout = 0"),{db:n,path:e,close:()=>n.close()}}function Sc(t,e,n){if(e.length>1)throw new U("INVALID_ARGUMENT",`cron ${t} takes exactly one PATH argument -- refusing unexpected extra argument ${JSON.stringify(e[1])}`);for(let r of Object.keys(n))if(r!=="json"&&r!=="help")throw new U("INVALID_ARGUMENT",`cron ${t} does not know flag "--${r}" (only --json and --help)`)}function kC(t){let{positionals:e,flags:n}=vc(t,["json","help"]),r=n.json===!0;try{if(n.help===!0)return{output:IC,exitCode:0};Sc("export",e,n);let s=e[0];if(s===void 0)throw new U("INVALID_ARGUMENT",`an export PATH is required
2491
- ${IC}`);let o=r4();try{let i=n4(o.db,s,o.path);return r?{output:JSON.stringify({schema_version:1,ok:!0,data:{path:s,exported_from:o.path,jobs:i.jobs.length}}),exitCode:0}:{output:`exported ${i.jobs.length} jobs to ${s}`,exitCode:0}}finally{o.close()}}catch(s){if(s instanceof U)return r?{output:JSON.stringify({schema_version:1,ok:!1,error:{code:s.code,message:s.message}}),exitCode:s.exitCode}:{output:`${s.code}: ${s.message}`,exitCode:s.exitCode};throw s}}function mn(t,e){throw new U("INVALID_ARGUMENT",`jobs[${t}]: ${e}`)}function s4(t,e){(typeof t!="object"||t===null||Array.isArray(t))&&mn(e,"must be a JSON object");let n=t;for(let c of Object.keys(n))bC.includes(c)||mn(e,`unknown key "${c}"`);for(let c of bC)c in n||mn(e,`missing key "${c}"`);let{id:r,title:s,schedule_expr:o,action_kind:i,action_payload:a,enabled:l}=n;(typeof r!="number"||!Number.isSafeInteger(r)||r<1)&&mn(e,"id must be a positive safe integer"),(typeof s!="string"||s.trim().length===0)&&mn(e,"title must be a nonblank string"),typeof o!="string"&&mn(e,"schedule_expr must be a string"),typeof i!="string"&&mn(e,"action_kind must be a string"),i==="enqueue"&&mn(e,"import does not carry enqueue-kind jobs (zero existed when this was designed; refusing rather than risking a payload current validation rejects -- create it manually)"),(i==="session"||i==="miniplayer")&&mn(e,`import does not carry ${i}-kind jobs (out of scope -- untested expansion; create it manually)`),i!=="command"&&i!=="script"&&mn(e,`action_kind "${i}" is not a known kind; only "command" and "script" are accepted`),typeof a!="string"&&mn(e,"action_payload must be a string"),typeof l!="boolean"&&mn(e,`enabled must be a JSON boolean (true/false), not ${JSON.stringify(l)}`);for(let c of Q6){let d=n[c];d!==null&&typeof d!="string"&&mn(e,`${c} must be a string or null`)}return n}function AC(t){let e;try{e=V6(t,"utf8")}catch(i){throw new U("INVALID_ARGUMENT",`cannot read import file ${t}: ${i instanceof Error?i.message:String(i)}`)}let n;try{n=JSON.parse(e)}catch(i){throw new U("INVALID_ARGUMENT",`import file ${t} is not valid JSON: ${i instanceof Error?i.message:String(i)}`)}if(typeof n!="object"||n===null||Array.isArray(n))throw new U("INVALID_ARGUMENT","import document must be a JSON object");let r=n;for(let i of Object.keys(r))if(!SC.includes(i))throw new U("INVALID_ARGUMENT",`unknown top-level key "${i}"`);for(let i of SC)if(!(i in r))throw new U("INVALID_ARGUMENT",`missing top-level key "${i}"`);if(r.schema_version!==1)throw new U("INVALID_ARGUMENT",`schema_version must be 1, got ${JSON.stringify(r.schema_version)}`);if(r.kind!==rE)throw new U("INVALID_ARGUMENT",`kind must be "${rE}", got ${JSON.stringify(r.kind)}`);for(let i of["exported_at","exported_from"])if(typeof r[i]!="string")throw new U("INVALID_ARGUMENT",`${i} must be a string, got ${JSON.stringify(r[i])}`);if(!Array.isArray(r.jobs))throw new U("INVALID_ARGUMENT","jobs must be an array");let s=r.jobs.map((i,a)=>s4(i,a)),o=new Set;for(let i of s){if(o.has(i.id))throw new U("INVALID_ARGUMENT",`duplicate id ${i.id} within the document`);o.add(i.id)}return s}function NC(t){return{...t,title:t.title.trim(),timezone:t.timezone===null?null:t.timezone.trim()}}function o4(t,e){let n=NC(e);return t.title===n.title&&t.schedule_expr===n.schedule_expr&&t.action_kind===n.action_kind&&t.action_payload===n.action_payload&&t.provider===n.provider&&t.model===n.model&&t.working_directory===n.working_directory&&t.escalation_owner===n.escalation_owner&&t.timezone===n.timezone&&!!t.enabled===n.enabled}function i4(t){let e=NC(t);return{id:e.id,title:e.title,scheduleExpr:e.schedule_expr,actionKind:e.action_kind,actionPayload:e.action_payload,enabled:e.enabled,...e.provider!==null?{provider:e.provider}:{},...e.model!==null?{model:e.model}:{},...e.working_directory!==null?{workingDirectory:e.working_directory}:{},...e.escalation_owner!==null?{escalationOwner:e.escalation_owner}:{},...e.timezone!==null?{timezone:e.timezone}:{}}}function xC(t){AC(t)}function RC(t,e){let n=AC(e),r=[],s=[];t.transaction(()=>{for(let a of n){let l=rm(t,a.id);if(l!==null){if(o4(l,a)){r.push({id:a.id,title:a.title});continue}throw new U("CONFLICT",`cron job ${a.id} already exists with a different definition: existing "${l.title}" vs import "${a.title}" -- refusing the whole file, nothing written`,4)}im(t,i4(a)),s.push(a)}}).immediate();let i=[];for(let a of s)a.working_directory!==null&&!J6(a.working_directory)&&i.push(`job ${a.id} "${a.title}": working_directory ${a.working_directory} does not exist on this host`);return{imported:s.length,skipped:r,warnings:i}}function LC(t){let e=[`imported ${t.imported}, skipped ${t.skipped.length} already-present`];for(let n of t.skipped)e.push(`skipped: ${n.id} "${n.title}"`);for(let n of t.warnings)e.push(`warning: ${n}`);return e.join(`
2492
- `)}var z6,Y6,rE,SC,bC,Q6,IC,sE=C(()=>{"use strict";Fs();vC();nE();No();lm();z6=t=>t||process.env.LMBEE_DB||TC(t),Y6=t=>{},rE="lmbee-cron-export",SC=["schema_version","kind","exported_at","exported_from","jobs"],bC=["id","title","schedule_expr","action_kind","action_payload","provider","model","working_directory","escalation_owner","timezone","enabled"],Q6=["provider","model","working_directory","escalation_owner","timezone"];IC=`usage: lmctl cron export PATH [--json] -- write all cron job DEFINITIONS (ids preserved) as one JSON document;
2493
- refuses if PATH already exists (rm it first; there is no --force). Definitions only, never execution state.`});import{existsSync as a4,readFileSync as l4}from"node:fs";import{resolve as c4}from"node:path";function Ds(t,e,n={}){if(t===void 0)return;if(typeof t!="string"||!/^\d+$/.test(t))throw new U("INVALID_ARGUMENT",`${e} must be a nonnegative integer`);let r=Number(t),s=n.minimum??1;if(!Number.isSafeInteger(r)||r<s||n.maximum!==void 0&&r>n.maximum){let o=n.maximum!==void 0?`between ${s} and ${n.maximum}`:`>= ${s}`;throw new U("INVALID_ARGUMENT",`${e} must be an integer ${o}`)}return r}function Hr(t,e){let n=Ds(t,e,{minimum:1});if(n===void 0)throw new U("INVALID_ARGUMENT",`${e} is required`);return n}function d4(t){return t==="enqueue"||t==="command"||t==="script"||t==="session"||t==="miniplayer"}function f4(t){return u4.includes(t)}function CC(t){let e=t.payload,n=t.prompt,r=t["prompt-file"];if([e,n,r].filter(o=>o!==void 0).length>1)throw new U("INVALID_ARGUMENT","provide only one of --payload, --prompt, or --prompt-file");if(r!==void 0){if(typeof r!="string")throw new U("INVALID_ARGUMENT","--prompt-file requires a path");try{return l4(r,"utf8")}catch(o){throw new U("INVALID_ARGUMENT",`cannot read --prompt-file ${r}: ${o instanceof Error?o.message:String(o)}`)}}if(typeof e=="string")return e;if(typeof n=="string")return n}function Ve(t){return typeof t=="string"?t:void 0}function Lt(t,e,n={}){return t?JSON.stringify({schema_version:1,ok:!0,data:e,meta:n}):h4(e,n)}function OC(t,e){return t?{output:JSON.stringify({schema_version:1,ok:!1,error:{code:e.code,message:e.message}}),exitCode:e.exitCode}:{output:`${e.code}: ${e.message}`,exitCode:e.exitCode}}function oE(t){return t.last_tick_at===null?"last cron evaluation: not recorded yet (the daemon predates the tick record, or has not ticked)":`last cron evaluation: ${t.last_tick_at} (${oc(t.last_tick_age_ms??0)} ago); gaps in the last 24h: ${t.gaps_24h}${t.gaps_24h>0?`, longest ${oc(t.longest_gap_24h_ms)}`:""}`}function p4(t){let e=t.last_run,n=t.recent_runs,r=t.holding_fence;if(e===void 0||n===void 0)return"";let s=[];return e===null?s.push("never run"):(s.push(e.exit_code!==null&&e.exit_code!==0&&e.status==="failed"?`${e.status} (exit ${e.exit_code})`:e.status),s.push(`${n.failed}/${n.window} failed${n.escalated>0?`, ${n.escalated} escalated`:""}`)),r!=null&&Date.now()-Date.parse(r.since)>m4&&s.push(`HOLDING FENCE run ${r.id} (${r.status}/${r.execution_state}) since ${r.since}`),s.join("; ")}function h4(t,e){let n;if(Array.isArray(t)){let s=o=>o!==null&&typeof o=="object"&&"title"in o;n=t.length===0?"(empty)":t.every(s)?(0,ea.formatTable)([["ID","ENABLED","KIND","SCHEDULE","LAST RUN","TITLE"],...t.map(o=>[...["id","enabled","action_kind","schedule_expr"].map(a=>(0,ea.escapeCell)(String(o[a]??""))),(0,ea.escapeCell)(p4(o)),(0,ea.escapeCell)(String(o.title??""))])]):t.map(o=>JSON.stringify(o)).join(`
2488
+ On other operating systems, install and start open a terminal window and start the daemon in it.`});function vc(t,e=[]){let n=new Set(e),r=[],s={};for(let o=0;o<t.length;o++){let i=t[o];if(i==="-h")s.help=!0;else if(i.startsWith("--")){let a=i.slice(2),l=t[o+1];!n.has(a)&&l!==void 0&&!l.startsWith("--")?(s[a]=l,o++):s[a]=!0}else r.push(i)}return{positionals:r,flags:s}}var nE=C(()=>{"use strict"});function TC(t){return mt(t)}var vC=C(()=>{"use strict";Fs();Pt();Kn()});import{existsSync as G6,readFileSync as J6,writeFileSync as V6}from"node:fs";function Q6(t){return{id:t.id,title:t.title,schedule_expr:t.schedule_expr,action_kind:t.action_kind,action_payload:t.action_payload,provider:t.provider,model:t.model,working_directory:t.working_directory,escalation_owner:t.escalation_owner,timezone:t.timezone,enabled:!!t.enabled}}function Z6(t){return t instanceof Error&&"code"in t&&typeof t.code=="string"&&t.code.startsWith("SQLITE_BUSY")}function e4(t,e){let n;try{n=t.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'cron_jobs'").get()!==void 0?t.prepare("SELECT * FROM cron_jobs ORDER BY id").all():[]}catch(r){throw Z6(r)?new U("SOURCE_BUSY","source database is locked by another process -- export never waits on locks (busy_timeout = 0); retry shortly",3):r}for(let r of n)if(r.action_kind!=="command"&&r.action_kind!=="script")throw new U("INVALID_ARGUMENT",`cron job ${r.id} "${r.title}" has action_kind "${r.action_kind}" -- export does not carry ${r.action_kind}-kind jobs, so no file was written (import would refuse it; never produce a transferable payload containing one -- re-create the job manually on the target)`);return{schema_version:1,kind:rE,exported_at:new Date().toISOString(),exported_from:e,jobs:n.map(Q6)}}function t4(t,e,n){let r=e4(t,n);try{V6(e,`${JSON.stringify(r,null,2)}
2489
+ `,{flag:"wx"})}catch(s){throw s&&typeof s=="object"&&"code"in s&&s.code==="EEXIST"?new U("INVALID_ARGUMENT",`export path already exists: ${e} (rm it first; there is no --force)`):new U("INVALID_ARGUMENT",`cannot write export to ${e}: ${s instanceof Error?s.message:String(s)}`)}return r}function n4(t){let e=K6(t);z6(e);let n=new Ln(e,{readonly:!0,fileMustExist:!0});return n.pragma("busy_timeout = 0"),{db:n,path:e,close:()=>n.close()}}function Sc(t,e,n){if(e.length>1)throw new U("INVALID_ARGUMENT",`cron ${t} takes exactly one PATH argument -- refusing unexpected extra argument ${JSON.stringify(e[1])}`);for(let r of Object.keys(n))if(r!=="json"&&r!=="help")throw new U("INVALID_ARGUMENT",`cron ${t} does not know flag "--${r}" (only --json and --help)`)}function kC(t){let{positionals:e,flags:n}=vc(t,["json","help"]),r=n.json===!0;try{if(n.help===!0)return{output:IC,exitCode:0};Sc("export",e,n);let s=e[0];if(s===void 0)throw new U("INVALID_ARGUMENT",`an export PATH is required
2490
+ ${IC}`);let o=n4();try{let i=t4(o.db,s,o.path);return r?{output:JSON.stringify({schema_version:1,ok:!0,data:{path:s,exported_from:o.path,jobs:i.jobs.length}}),exitCode:0}:{output:`exported ${i.jobs.length} jobs to ${s}`,exitCode:0}}finally{o.close()}}catch(s){if(s instanceof U)return r?{output:JSON.stringify({schema_version:1,ok:!1,error:{code:s.code,message:s.message}}),exitCode:s.exitCode}:{output:`${s.code}: ${s.message}`,exitCode:s.exitCode};throw s}}function mn(t,e){throw new U("INVALID_ARGUMENT",`jobs[${t}]: ${e}`)}function r4(t,e){(typeof t!="object"||t===null||Array.isArray(t))&&mn(e,"must be a JSON object");let n=t;for(let c of Object.keys(n))bC.includes(c)||mn(e,`unknown key "${c}"`);for(let c of bC)c in n||mn(e,`missing key "${c}"`);let{id:r,title:s,schedule_expr:o,action_kind:i,action_payload:a,enabled:l}=n;(typeof r!="number"||!Number.isSafeInteger(r)||r<1)&&mn(e,"id must be a positive safe integer"),(typeof s!="string"||s.trim().length===0)&&mn(e,"title must be a nonblank string"),typeof o!="string"&&mn(e,"schedule_expr must be a string"),typeof i!="string"&&mn(e,"action_kind must be a string"),i==="enqueue"&&mn(e,"import does not carry enqueue-kind jobs (zero existed when this was designed; refusing rather than risking a payload current validation rejects -- create it manually)"),(i==="session"||i==="miniplayer")&&mn(e,`import does not carry ${i}-kind jobs (out of scope -- untested expansion; create it manually)`),i!=="command"&&i!=="script"&&mn(e,`action_kind "${i}" is not a known kind; only "command" and "script" are accepted`),typeof a!="string"&&mn(e,"action_payload must be a string"),typeof l!="boolean"&&mn(e,`enabled must be a JSON boolean (true/false), not ${JSON.stringify(l)}`);for(let c of Y6){let d=n[c];d!==null&&typeof d!="string"&&mn(e,`${c} must be a string or null`)}return n}function AC(t){let e;try{e=J6(t,"utf8")}catch(i){throw new U("INVALID_ARGUMENT",`cannot read import file ${t}: ${i instanceof Error?i.message:String(i)}`)}let n;try{n=JSON.parse(e)}catch(i){throw new U("INVALID_ARGUMENT",`import file ${t} is not valid JSON: ${i instanceof Error?i.message:String(i)}`)}if(typeof n!="object"||n===null||Array.isArray(n))throw new U("INVALID_ARGUMENT","import document must be a JSON object");let r=n;for(let i of Object.keys(r))if(!SC.includes(i))throw new U("INVALID_ARGUMENT",`unknown top-level key "${i}"`);for(let i of SC)if(!(i in r))throw new U("INVALID_ARGUMENT",`missing top-level key "${i}"`);if(r.schema_version!==1)throw new U("INVALID_ARGUMENT",`schema_version must be 1, got ${JSON.stringify(r.schema_version)}`);if(r.kind!==rE)throw new U("INVALID_ARGUMENT",`kind must be "${rE}", got ${JSON.stringify(r.kind)}`);for(let i of["exported_at","exported_from"])if(typeof r[i]!="string")throw new U("INVALID_ARGUMENT",`${i} must be a string, got ${JSON.stringify(r[i])}`);if(!Array.isArray(r.jobs))throw new U("INVALID_ARGUMENT","jobs must be an array");let s=r.jobs.map((i,a)=>r4(i,a)),o=new Set;for(let i of s){if(o.has(i.id))throw new U("INVALID_ARGUMENT",`duplicate id ${i.id} within the document`);o.add(i.id)}return s}function NC(t){return{...t,title:t.title.trim(),timezone:t.timezone===null?null:t.timezone.trim()}}function s4(t,e){let n=NC(e);return t.title===n.title&&t.schedule_expr===n.schedule_expr&&t.action_kind===n.action_kind&&t.action_payload===n.action_payload&&t.provider===n.provider&&t.model===n.model&&t.working_directory===n.working_directory&&t.escalation_owner===n.escalation_owner&&t.timezone===n.timezone&&!!t.enabled===n.enabled}function o4(t){let e=NC(t);return{id:e.id,title:e.title,scheduleExpr:e.schedule_expr,actionKind:e.action_kind,actionPayload:e.action_payload,enabled:e.enabled,...e.provider!==null?{provider:e.provider}:{},...e.model!==null?{model:e.model}:{},...e.working_directory!==null?{workingDirectory:e.working_directory}:{},...e.escalation_owner!==null?{escalationOwner:e.escalation_owner}:{},...e.timezone!==null?{timezone:e.timezone}:{}}}function xC(t){AC(t)}function RC(t,e){let n=AC(e),r=[],s=[];t.transaction(()=>{for(let a of n){let l=rm(t,a.id);if(l!==null){if(s4(l,a)){r.push({id:a.id,title:a.title});continue}throw new U("CONFLICT",`cron job ${a.id} already exists with a different definition: existing "${l.title}" vs import "${a.title}" -- refusing the whole file, nothing written`,4)}im(t,o4(a)),s.push(a)}}).immediate();let i=[];for(let a of s)a.working_directory!==null&&!G6(a.working_directory)&&i.push(`job ${a.id} "${a.title}": working_directory ${a.working_directory} does not exist on this host`);return{imported:s.length,skipped:r,warnings:i}}function LC(t){let e=[`imported ${t.imported}, skipped ${t.skipped.length} already-present`];for(let n of t.skipped)e.push(`skipped: ${n.id} "${n.title}"`);for(let n of t.warnings)e.push(`warning: ${n}`);return e.join(`
2491
+ `)}var K6,z6,rE,SC,bC,Y6,IC,sE=C(()=>{"use strict";Fs();vC();nE();No();lm();K6=t=>t||process.env.LMBEE_DB||TC(t),z6=t=>{},rE="lmbee-cron-export",SC=["schema_version","kind","exported_at","exported_from","jobs"],bC=["id","title","schedule_expr","action_kind","action_payload","provider","model","working_directory","escalation_owner","timezone","enabled"],Y6=["provider","model","working_directory","escalation_owner","timezone"];IC=`usage: lmctl cron export PATH [--json] -- write all cron job DEFINITIONS (ids preserved) as one JSON document;
2492
+ refuses if PATH already exists (rm it first; there is no --force). Definitions only, never execution state.`});import{existsSync as i4,readFileSync as a4}from"node:fs";import{resolve as l4}from"node:path";function Ds(t,e,n={}){if(t===void 0)return;if(typeof t!="string"||!/^\d+$/.test(t))throw new U("INVALID_ARGUMENT",`${e} must be a nonnegative integer`);let r=Number(t),s=n.minimum??1;if(!Number.isSafeInteger(r)||r<s||n.maximum!==void 0&&r>n.maximum){let o=n.maximum!==void 0?`between ${s} and ${n.maximum}`:`>= ${s}`;throw new U("INVALID_ARGUMENT",`${e} must be an integer ${o}`)}return r}function Hr(t,e){let n=Ds(t,e,{minimum:1});if(n===void 0)throw new U("INVALID_ARGUMENT",`${e} is required`);return n}function c4(t){return t==="enqueue"||t==="command"||t==="script"||t==="session"||t==="miniplayer"}function u4(t){return d4.includes(t)}function CC(t){let e=t.payload,n=t.prompt,r=t["prompt-file"];if([e,n,r].filter(o=>o!==void 0).length>1)throw new U("INVALID_ARGUMENT","provide only one of --payload, --prompt, or --prompt-file");if(r!==void 0){if(typeof r!="string")throw new U("INVALID_ARGUMENT","--prompt-file requires a path");try{return a4(r,"utf8")}catch(o){throw new U("INVALID_ARGUMENT",`cannot read --prompt-file ${r}: ${o instanceof Error?o.message:String(o)}`)}}if(typeof e=="string")return e;if(typeof n=="string")return n}function Ve(t){return typeof t=="string"?t:void 0}function Lt(t,e,n={}){return t?JSON.stringify({schema_version:1,ok:!0,data:e,meta:n}):p4(e,n)}function OC(t,e){return t?{output:JSON.stringify({schema_version:1,ok:!1,error:{code:e.code,message:e.message}}),exitCode:e.exitCode}:{output:`${e.code}: ${e.message}`,exitCode:e.exitCode}}function oE(t){return t.last_tick_at===null?"last cron evaluation: not recorded yet (the daemon predates the tick record, or has not ticked)":`last cron evaluation: ${t.last_tick_at} (${oc(t.last_tick_age_ms??0)} ago); gaps in the last 24h: ${t.gaps_24h}${t.gaps_24h>0?`, longest ${oc(t.longest_gap_24h_ms)}`:""}`}function m4(t){let e=t.last_run,n=t.recent_runs,r=t.holding_fence;if(e===void 0||n===void 0)return"";let s=[];return e===null?s.push("never run"):(s.push(e.exit_code!==null&&e.exit_code!==0&&e.status==="failed"?`${e.status} (exit ${e.exit_code})`:e.status),s.push(`${n.failed}/${n.window} failed${n.escalated>0?`, ${n.escalated} escalated`:""}`)),r!=null&&Date.now()-Date.parse(r.since)>f4&&s.push(`HOLDING FENCE run ${r.id} (${r.status}/${r.execution_state}) since ${r.since}`),s.join("; ")}function p4(t,e){let n;if(Array.isArray(t)){let s=o=>o!==null&&typeof o=="object"&&"title"in o;n=t.length===0?"(empty)":t.every(s)?(0,ea.formatTable)([["ID","ENABLED","KIND","SCHEDULE","LAST RUN","TITLE"],...t.map(o=>[...["id","enabled","action_kind","schedule_expr"].map(a=>(0,ea.escapeCell)(String(o[a]??""))),(0,ea.escapeCell)(m4(o)),(0,ea.escapeCell)(String(o.title??""))])]):t.map(o=>JSON.stringify(o)).join(`
2494
2493
  `)}else typeof t=="string"?n=t:n=JSON.stringify(t,null,2);let r=e.next_cursor;return r!=null?`${n}
2495
- More records: --after ${String(r)}`:n}async function DC(t,e,n,r,s=[]){try{let o=()=>typeof t=="function"?t():t,i=()=>typeof s=="function"?s():s,[a,...l]=e,c=a==="add"?"create":a==="rm"?"remove":a;switch(c){case"tick":{let d=await am(o(),i(),Date.now(),{});return{output:Lt(r,{fired:d}),exitCode:0}}case"create":{let d=n.title;if(typeof d!="string")throw new U("INVALID_ARGUMENT","--title is required");let u=n.schedule;if(typeof u!="string")throw new U("INVALID_ARGUMENT","--schedule is required");let f=n.kind;if(typeof f!="string"||!d4(f))throw new U("INVALID_ARGUMENT",'--kind must be "enqueue", "command", "script", "session", or "miniplayer"');let m=CC(n);if(m===void 0)throw new U("INVALID_ARGUMENT",f==="session"||f==="miniplayer"?"--prompt or --prompt-file is required":"--payload is required");Ec(u);let p=null;if(n.target!==void 0){if(f!=="session")throw new U("INVALID_ARGUMENT","--target is only for --kind session");let h=String(n.target),g=h.lastIndexOf(":"),w=g>0?h.slice(g+1):"";if(!/^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/.test(w))throw new U("INVALID_ARGUMENT","--target must be TEAMFILE:ALIAS");let y=c4(h.slice(0,g));if(!a4(y))throw new U("INVALID_ARGUMENT",`--target teamfile not found: ${y}`);p={teamfile:y,alias:w}}sm(f,m),om({targeted:p!==null,actionKind:f,provider:Ve(n.provider)??null,model:Ve(n.model)??null,workingDirectory:Ve(n.cwd)??null,escalationOwner:Ve(n.owner)??null}),n.timezone!==void 0&&n.timezone!==""&&wc(String(n.timezone));let _=im(o(),{...p?{sessionTarget:p}:{},title:d,scheduleExpr:u,actionKind:f,actionPayload:m,enabled:n.disabled!==!0,timezone:typeof n.timezone=="string"?n.timezone:void 0,...Ve(n.provider)!==void 0?{provider:Ve(n.provider)}:{},...Ve(n.model)!==void 0?{model:Ve(n.model)}:{},...Ve(n.cwd)!==void 0?{workingDirectory:Ve(n.cwd)}:{},...Ve(n.owner)!==void 0?{escalationOwner:Ve(n.owner)}:{}});return{output:Lt(r,Je(o(),_.id)),exitCode:0}}case"show":{let d=Hr(l[0],"id"),u=Je(o(),d);return{output:Lt(r,{...u,...Uw(o(),[d]).get(d)}),exitCode:0}}case"list":{let d=n.enabled,u;if(d!==void 0){if(d!=="true"&&d!=="false")throw new U("INVALID_ARGUMENT",'--enabled must be "true" or "false"');u=d==="true"}let{rows:f,meta:m}=rC(o(),{enabled:u,limit:Ds(n.limit,"--limit",{maximum:1e4})??100,after:Ds(n.after,"--after",{minimum:0})??0}),p=Uw(o(),f.map(g=>g.id)),_=ic(o(),Date.now()),h=Lt(r,f.map(g=>({...g,...p.get(g.id)})),{...m,tick:_});return{output:r?h:`${h}
2494
+ More records: --after ${String(r)}`:n}async function DC(t,e,n,r,s=[]){try{let o=()=>typeof t=="function"?t():t,i=()=>typeof s=="function"?s():s,[a,...l]=e,c=a==="add"?"create":a==="rm"?"remove":a;switch(c){case"tick":{let d=await am(o(),i(),Date.now(),{});return{output:Lt(r,{fired:d}),exitCode:0}}case"create":{let d=n.title;if(typeof d!="string")throw new U("INVALID_ARGUMENT","--title is required");let u=n.schedule;if(typeof u!="string")throw new U("INVALID_ARGUMENT","--schedule is required");let f=n.kind;if(typeof f!="string"||!c4(f))throw new U("INVALID_ARGUMENT",'--kind must be "enqueue", "command", "script", "session", or "miniplayer"');let m=CC(n);if(m===void 0)throw new U("INVALID_ARGUMENT",f==="session"||f==="miniplayer"?"--prompt or --prompt-file is required":"--payload is required");Ec(u);let p=null;if(n.target!==void 0){if(f!=="session")throw new U("INVALID_ARGUMENT","--target is only for --kind session");let h=String(n.target),g=h.lastIndexOf(":"),w=g>0?h.slice(g+1):"";if(!/^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/.test(w))throw new U("INVALID_ARGUMENT","--target must be TEAMFILE:ALIAS");let y=l4(h.slice(0,g));if(!i4(y))throw new U("INVALID_ARGUMENT",`--target teamfile not found: ${y}`);p={teamfile:y,alias:w}}sm(f,m),om({targeted:p!==null,actionKind:f,provider:Ve(n.provider)??null,model:Ve(n.model)??null,workingDirectory:Ve(n.cwd)??null,escalationOwner:Ve(n.owner)??null}),n.timezone!==void 0&&n.timezone!==""&&wc(String(n.timezone));let _=im(o(),{...p?{sessionTarget:p}:{},title:d,scheduleExpr:u,actionKind:f,actionPayload:m,enabled:n.disabled!==!0,timezone:typeof n.timezone=="string"?n.timezone:void 0,...Ve(n.provider)!==void 0?{provider:Ve(n.provider)}:{},...Ve(n.model)!==void 0?{model:Ve(n.model)}:{},...Ve(n.cwd)!==void 0?{workingDirectory:Ve(n.cwd)}:{},...Ve(n.owner)!==void 0?{escalationOwner:Ve(n.owner)}:{}});return{output:Lt(r,Je(o(),_.id)),exitCode:0}}case"show":{let d=Hr(l[0],"id"),u=Je(o(),d);return{output:Lt(r,{...u,...Uw(o(),[d]).get(d)}),exitCode:0}}case"list":{let d=n.enabled,u;if(d!==void 0){if(d!=="true"&&d!=="false")throw new U("INVALID_ARGUMENT",'--enabled must be "true" or "false"');u=d==="true"}let{rows:f,meta:m}=rC(o(),{enabled:u,limit:Ds(n.limit,"--limit",{maximum:1e4})??100,after:Ds(n.after,"--after",{minimum:0})??0}),p=Uw(o(),f.map(g=>g.id)),_=ic(o(),Date.now()),h=Lt(r,f.map(g=>({...g,...p.get(g.id)})),{...m,tick:_});return{output:r?h:`${h}
2496
2495
  ${oE(_)}`,exitCode:0}}case"gaps":{let d=Ds(n.limit,"--limit",{maximum:1e4})??20,u=xL(o(),d);return r?{output:Lt(!0,u,{tick:ic(o(),Date.now())}),exitCode:0}:{output:u.length===0?`(no gaps recorded)
2497
2496
  ${oE(ic(o(),Date.now()))}`:`${u.map(f=>`${f.previous_tick_at} -> ${f.tick_at}: ${Vf(f)}`).join(`
2498
2497
  `)}
2499
- ${oE(ic(o(),Date.now()))}`,exitCode:0}}case"update":{let d=Hr(l[0],"id"),u=CC(n);typeof n.schedule=="string"&&Ec(n.schedule),n.timezone!==void 0&&n.timezone!==""&&wc(String(n.timezone));let f=Ds(n["if-revision"],"--if-revision"),m=sC(o(),d,{title:typeof n.title=="string"?n.title:void 0,scheduleExpr:typeof n.schedule=="string"?n.schedule:void 0,actionPayload:u,timezone:typeof n.timezone=="string"?n.timezone===""?null:n.timezone:void 0,provider:Ve(n.provider),model:Ve(n.model),workingDirectory:typeof n.cwd=="string"?n.cwd===""?null:n.cwd:void 0,escalationOwner:typeof n.owner=="string"?n.owner===""?null:n.owner:void 0,ifRevision:f});return{output:Lt(r,m),exitCode:0}}case"enable":case"disable":{let d=Hr(l[0],"id"),u=oC(o(),d,c==="enable");return{output:Lt(r,u),exitCode:0}}case"remove":{let d=Hr(l[0],"id"),u=iC(o(),d);return{output:Lt(r,u),exitCode:0}}case"reset":{let d=Hr(l[0],"id"),u=fC(o(),d);return{output:Lt(r,u),exitCode:0}}case"reset-session":{let d=Hr(l[0],"id"),u=aC(o(),d);return{output:Lt(r,u),exitCode:0}}case"runs":{let d=n.status;if(d!==void 0&&(typeof d!="string"||!f4(d)))throw new U("INVALID_ARGUMENT","--status must be one of pending|running|succeeded|failed|escalated");let u=n.job!==void 0?Ds(n.job,"--job"):void 0,{rows:f,next_cursor:m}=HL(o(),{...u!==void 0?{jobId:u}:{},...d!==void 0?{status:d}:{},limit:Ds(n.limit,"--limit",{maximum:1e4})??100,after:Ds(n.after,"--after",{minimum:0})??0});return{output:Lt(r,f.map(fc),{next_cursor:m}),exitCode:0}}case"run":{let d=Hr(l[0],"id");return{output:Lt(r,fc(bt(o(),d))),exitCode:0}}case"trigger":{let d=Hr(l[0],"id"),u=await zw(o(),d,i());return{output:Lt(r,{trigger:u.kind,job:u.job}),exitCode:0}}case"report":{let d=l[0];if(d===void 0)throw new U("INVALID_ARGUMENT","a run token is required");let u=n.status;if(typeof u!="string"||u!=="succeeded"&&u!=="failed"&&u!=="escalated")throw new U("INVALID_ARGUMENT",'--status must be "succeeded", "failed", or "escalated"');let f=n.summary;if(typeof f!="string")throw new U("INVALID_ARGUMENT","--summary is required");let m=typeof n.artifact=="string"?n.artifact:void 0,p=m!==void 0?m.split(",").map(g=>g.trim()).filter(g=>g.length>0):void 0,_=typeof n["requested-action"]=="string"?n["requested-action"]:Ve(n.action),h=FL(o(),d,{status:u,summary:f,...p!==void 0?{artifacts:p}:{},..._!==void 0?{action:_}:{},...Ve(n.owner)!==void 0?{owner:Ve(n.owner)}:{},...Ve(n.reason)!==void 0?{reason:Ve(n.reason)}:{}});return{output:Lt(r,fc(h)),exitCode:0}}case"import":{Sc("import",l,n);let d=l[0];if(d===void 0)throw new U("INVALID_ARGUMENT","an import PATH is required");let u=RC(o(),d);return{output:r?Lt(!0,u):LC(u),exitCode:0}}case"resolve":{let d=Hr(l[0],"id"),u=WL(o(),d,{resolution:Ve(n.resolution),actor:Ve(n.actor),note:Ve(n.note),confirmStopped:n["confirm-stopped"]===!0});return{output:Lt(r,fc(u)),exitCode:0}}default:return r?OC(r,new U("INVALID_ARGUMENT",um)):{output:um,exitCode:1}}}catch(o){if(o instanceof U)return OC(r,o);throw o}}var ea,u4,m4,um,MC,$C=C(()=>{"use strict";ea=pn(rn(),1);Ao();No();lm();xw();Qf();sE();u4=["pending","running","succeeded","failed","escalated"];m4=60*6e4;um='usage: lmctl cron create|add --title TEXT --schedule "m h dom mon dow" --kind command|script|session|miniplayer [--payload TEXT | --prompt TEXT | --prompt-file PATH] [--target TEAMFILE:ALIAS] [--provider P] [--model M] [--cwd DIR] [--owner NAME] [--disabled] [--timezone IANA-name] | show ID | list [--enabled true|false] [--limit N] [--after ID] | gaps [--limit N] | update ID [--title T] [--schedule EXPR] [--payload TEXT|--prompt TEXT|--prompt-file PATH] [--provider P] [--model M] [--cwd DIR] [--owner NAME] [--timezone IANA-name|""] [--if-revision N] | enable ID | disable ID | remove|rm ID | reset ID | reset-session ID | tick | export PATH | import PATH | runs [--job ID] [--status pending|running|succeeded|failed|escalated] [--limit N] [--after ID] | run RUN-ID | trigger ID | report RUN-TOKEN --status succeeded|failed|escalated --summary TEXT [--artifact A[,B]] [--requested-action TEXT] [--owner NAME] | resolve RUN-ID [--resolution TEXT] [--actor NAME] [--note TEXT] [--confirm-stopped]\nlmctl cron is lmctl\'s internal job scheduler: lmctl serve daemon fires due jobs (and lmctl cron tick runs one evaluation now); trigger runs a job at once, detached. A session job prompts a session with lmctl prompt: --target TEAMFILE:ALIAS names an existing session (never re-seeded), otherwise the job gets its own one-member session seeded on first run. The enqueue kind is retired.\nNOTE: a job fires at most once per daemon tick interval (default 30 minutes), regardless of how frequent its own schedule expression is -- lmcron catches up a missed window, coalesced to one fire, never one fire per missed minute.\nNOTE: `last_fire_status` is the DISPATCH outcome of the latest fire (`ok` = a run was started), not how the run ended. `show` and `list` add `last_run`, `recent_runs` (outcome counts over the last 20 runs) and `holding_fence` (a run still blocking the next fire); the `list` table shows them in LAST RUN, e.g. `failed (exit 124); 8/20 failed`. A script run whose process is gone is released by the next daemon tick.\nNOTE: export/import carry job DEFINITIONS only (ids preserved), NEVER execution state -- runtime/session columns reset on import, historical timestamps are deliberately omitted, and the overlap fences live in cron_runs, which is not migrated. At scheduler cutover, stop the old daemon BEFORE the new one ticks; never run both schedules concurrently.';MC=["disabled","confirm-stopped"]});var PC={};ye(PC,{runCronCommand:()=>g4});function _4(t,e){return t?JSON.stringify({schema_version:1,ok:!1,error:{code:e.code,message:e.message}}):`${e.code}: ${e.message}`}async function g4(t,e){let[n]=t;if(n===void 0||n==="help"||n==="--help"||n==="-h")return e.stdout.write(`${um}
2498
+ ${oE(ic(o(),Date.now()))}`,exitCode:0}}case"update":{let d=Hr(l[0],"id"),u=CC(n);typeof n.schedule=="string"&&Ec(n.schedule),n.timezone!==void 0&&n.timezone!==""&&wc(String(n.timezone));let f=Ds(n["if-revision"],"--if-revision"),m=sC(o(),d,{title:typeof n.title=="string"?n.title:void 0,scheduleExpr:typeof n.schedule=="string"?n.schedule:void 0,actionPayload:u,timezone:typeof n.timezone=="string"?n.timezone===""?null:n.timezone:void 0,provider:Ve(n.provider),model:Ve(n.model),workingDirectory:typeof n.cwd=="string"?n.cwd===""?null:n.cwd:void 0,escalationOwner:typeof n.owner=="string"?n.owner===""?null:n.owner:void 0,ifRevision:f});return{output:Lt(r,m),exitCode:0}}case"enable":case"disable":{let d=Hr(l[0],"id"),u=oC(o(),d,c==="enable");return{output:Lt(r,u),exitCode:0}}case"remove":{let d=Hr(l[0],"id"),u=iC(o(),d);return{output:Lt(r,u),exitCode:0}}case"reset":{let d=Hr(l[0],"id"),u=fC(o(),d);return{output:Lt(r,u),exitCode:0}}case"reset-session":{let d=Hr(l[0],"id"),u=aC(o(),d);return{output:Lt(r,u),exitCode:0}}case"runs":{let d=n.status;if(d!==void 0&&(typeof d!="string"||!u4(d)))throw new U("INVALID_ARGUMENT","--status must be one of pending|running|succeeded|failed|escalated");let u=n.job!==void 0?Ds(n.job,"--job"):void 0,{rows:f,next_cursor:m}=HL(o(),{...u!==void 0?{jobId:u}:{},...d!==void 0?{status:d}:{},limit:Ds(n.limit,"--limit",{maximum:1e4})??100,after:Ds(n.after,"--after",{minimum:0})??0});return{output:Lt(r,f.map(fc),{next_cursor:m}),exitCode:0}}case"run":{let d=Hr(l[0],"id");return{output:Lt(r,fc(bt(o(),d))),exitCode:0}}case"trigger":{let d=Hr(l[0],"id"),u=await zw(o(),d,i());return{output:Lt(r,{trigger:u.kind,job:u.job}),exitCode:0}}case"report":{let d=l[0];if(d===void 0)throw new U("INVALID_ARGUMENT","a run token is required");let u=n.status;if(typeof u!="string"||u!=="succeeded"&&u!=="failed"&&u!=="escalated")throw new U("INVALID_ARGUMENT",'--status must be "succeeded", "failed", or "escalated"');let f=n.summary;if(typeof f!="string")throw new U("INVALID_ARGUMENT","--summary is required");let m=typeof n.artifact=="string"?n.artifact:void 0,p=m!==void 0?m.split(",").map(g=>g.trim()).filter(g=>g.length>0):void 0,_=typeof n["requested-action"]=="string"?n["requested-action"]:Ve(n.action),h=FL(o(),d,{status:u,summary:f,...p!==void 0?{artifacts:p}:{},..._!==void 0?{action:_}:{},...Ve(n.owner)!==void 0?{owner:Ve(n.owner)}:{},...Ve(n.reason)!==void 0?{reason:Ve(n.reason)}:{}});return{output:Lt(r,fc(h)),exitCode:0}}case"import":{Sc("import",l,n);let d=l[0];if(d===void 0)throw new U("INVALID_ARGUMENT","an import PATH is required");let u=RC(o(),d);return{output:r?Lt(!0,u):LC(u),exitCode:0}}case"resolve":{let d=Hr(l[0],"id"),u=WL(o(),d,{resolution:Ve(n.resolution),actor:Ve(n.actor),note:Ve(n.note),confirmStopped:n["confirm-stopped"]===!0});return{output:Lt(r,fc(u)),exitCode:0}}default:return r?OC(r,new U("INVALID_ARGUMENT",um)):{output:um,exitCode:1}}}catch(o){if(o instanceof U)return OC(r,o);throw o}}var ea,d4,f4,um,MC,$C=C(()=>{"use strict";ea=pn(rn(),1);Ao();No();lm();xw();Qf();sE();d4=["pending","running","succeeded","failed","escalated"];f4=60*6e4;um='usage: lmctl cron create|add --title TEXT --schedule "m h dom mon dow" --kind command|script|session|miniplayer [--payload TEXT | --prompt TEXT | --prompt-file PATH] [--target TEAMFILE:ALIAS] [--provider P] [--model M] [--cwd DIR] [--owner NAME] [--disabled] [--timezone IANA-name] | show ID | list [--enabled true|false] [--limit N] [--after ID] | gaps [--limit N] | update ID [--title T] [--schedule EXPR] [--payload TEXT|--prompt TEXT|--prompt-file PATH] [--provider P] [--model M] [--cwd DIR] [--owner NAME] [--timezone IANA-name|""] [--if-revision N] | enable ID | disable ID | remove|rm ID | reset ID | reset-session ID | tick | export PATH | import PATH | runs [--job ID] [--status pending|running|succeeded|failed|escalated] [--limit N] [--after ID] | run RUN-ID | trigger ID | report RUN-TOKEN --status succeeded|failed|escalated --summary TEXT [--artifact A[,B]] [--requested-action TEXT] [--owner NAME] | resolve RUN-ID [--resolution TEXT] [--actor NAME] [--note TEXT] [--confirm-stopped]\nlmctl cron is lmctl\'s internal job scheduler: lmctl serve daemon fires due jobs (and lmctl cron tick runs one evaluation now); trigger runs a job at once, detached. A session job prompts a session with lmctl prompt: --target TEAMFILE:ALIAS names an existing session (never re-seeded), otherwise the job gets its own one-member session seeded on first run. The enqueue kind is retired.\nNOTE: a job fires at most once per daemon tick interval (default 30 minutes), regardless of how frequent its own schedule expression is -- lmcron catches up a missed window, coalesced to one fire, never one fire per missed minute.\nNOTE: `last_fire_status` is the DISPATCH outcome of the latest fire (`ok` = a run was started), not how the run ended. `show` and `list` add `last_run`, `recent_runs` (outcome counts over the last 20 runs) and `holding_fence` (a run still blocking the next fire); the `list` table shows them in LAST RUN, e.g. `failed (exit 124); 8/20 failed`. A script run whose process is gone is released by the next daemon tick.\nNOTE: export/import carry job DEFINITIONS only (ids preserved), NEVER execution state -- runtime/session columns reset on import, historical timestamps are deliberately omitted, and the overlap fences live in cron_runs, which is not migrated. At scheduler cutover, stop the old daemon BEFORE the new one ticks; never run both schedules concurrently.';MC=["disabled","confirm-stopped"]});var PC={};ye(PC,{runCronCommand:()=>_4});function h4(t,e){return t?JSON.stringify({schema_version:1,ok:!1,error:{code:e.code,message:e.message}}):`${e.code}: ${e.message}`}async function _4(t,e){let[n]=t;if(n===void 0||n==="help"||n==="--help"||n==="-h")return e.stdout.write(`${um}
2500
2499
  `),n===void 0?1:0;if(n==="export")try{let{output:s,exitCode:o}=kC(t.slice(1));return s&&e.stdout.write(`${s}
2501
2500
  `),o}catch(s){return e.stderr.write(`error: ${s instanceof Error?s.message:String(s)}
2502
- `),1}if(n==="import"){let{positionals:s,flags:o}=vc(t.slice(1),["json","help"]);if(o.help!==!0)try{Sc("import",s,o);let i=s[0];if(i===void 0)throw new U("INVALID_ARGUMENT","an import PATH is required");xC(i)}catch(i){if(i instanceof U)return e.stdout.write(`${_4(o.json===!0,i)}
2501
+ `),1}if(n==="import"){let{positionals:s,flags:o}=vc(t.slice(1),["json","help"]);if(o.help!==!0)try{Sc("import",s,o);let i=s[0];if(i===void 0)throw new U("INVALID_ARGUMENT","an import PATH is required");xC(i)}catch(i){if(i instanceof U)return e.stdout.write(`${h4(o.json===!0,i)}
2503
2502
  `),i.exitCode;throw i}}let r=vc(t,["json",...MC]);return G({...e,env:{...e.env,LMCTL_DB:Pe(e)}},async s=>{let o=await DC(()=>s.db,r.positionals,r.flags,r.flags.json===!0,[]);return o.output&&e.stdout.write(`${o.output}
2504
- `),o.exitCode})}var UC=C(()=>{"use strict";he();nE();$C();No();sE()});var Upe,FC=C(()=>{"use strict";Upe=Object.freeze({free:1e6,test:1e7})});import{mkdirSync as XC,readFileSync as qC,renameSync as GC,writeFileSync as JC}from"node:fs";import{homedir as VC}from"node:os";import{dirname as y4,join as jC}from"node:path";function lE(t){return t.length>0&&!t.includes(`
2505
- `)}function bc(t={}){let e=t.env??process.env,n=t.fs??{readFileSync:(l,c)=>qC(l,c)},r=t.homedir??VC,s=e.LMCTL_APPKEY?.trim();if(s&&lE(s))return{appkey:s,source:"env:LMCTL_APPKEY",envelope:null};let o=e.LMCTL_APPKEY_FILE?.trim();if(o){let l=WC(n,o,"env:LMCTL_APPKEY_FILE");if(l)return l}let i=zC(e,r),a=WC(n,i,"file:default");if(a)return a;throw new na}async function cE(t,e={}){let n=await YC("/whoami",{method:"GET",headers:{authorization:`Bearer ${t}`}},e,Lo);if(n.status===401)return{valid:!1};if(n.status!==200)throw new Lo(`appkey validation failed with status ${n.status}`,{status:n.status});let r=await dE(n,"validate appkey response",Lo);return{valid:!0,userId:Br(r,"user_id","validate appkey response",Lo),label:Br(r,"label","validate appkey response",Lo)}}async function T4(t={}){let e=await YC("/device/codes",{method:"POST",headers:{"content-type":"application/json"},body:"{}"},t,It);if(e.status!==200)throw new It(`device authorization start failed with status ${e.status}`,{status:e.status});let n=await dE(e,"device authorization response",It);return{deviceCode:Br(n,"device_code","device authorization response",It),userCode:Br(n,"user_code","device authorization response",It),verificationUri:Br(n,"verification_uri","device authorization response",It),intervalSec:ZC(HC(n,"interval","device authorization response",It)),expiresInSec:HC(n,"expires_in","device authorization response",It)}}async function v4(t,e={}){let n=e.sleepImpl??N4,r=e.now??Date.now,s=ZC(e.intervalSec??5),o=r(),i=0;for(;;){let a=BC(e.timeoutMs,o,r);if(a!==void 0&&a<=0)throw new ta(e.timeoutMs);i+=1;let l=await k4(t,e,a);if(l.status===200){let f=await dE(l,"device token response",It);return{appkey:Br(f,"appkey","device token response",It),userId:Br(f,"user_id","device token response",It),label:Br(f,"label","device token response",It),issuedAt:Br(f,"issued_at","device token response",It)}}if(l.status===410)throw new aE;if(l.status!==428)throw new It(`device token polling failed with status ${l.status}`,{status:l.status});let c=r()-o;if(await e.onPending?.({attempt:i,elapsedMs:c,intervalSec:s})===!1)throw new fm("device authorization polling cancelled by caller");let u=s*1e3;if(e.timeoutMs!==void 0){let f=BC(e.timeoutMs,o,r);if(f<=0)throw new ta(e.timeoutMs);if(f<=u)throw await n(f),new ta(e.timeoutMs)}await n(u)}}function S4(t,e={}){let n=e.env??process.env,r=e.homedir??VC,s=e.fs??{mkdirSync:(c,d)=>XC(c,d),writeFileSync:(c,d,u)=>JC(c,d,u),renameSync:(c,d)=>GC(c,d)},o=e.now??Date.now,i=zC(n,r),a={...t,version:t.version??1},l=`${i}.${process.pid}.${Math.trunc(o())}.tmp`;return s.mkdirSync(y4(i),{recursive:!0}),s.writeFileSync(l,`${JSON.stringify(a,null,2)}
2506
- `,{encoding:"utf8",mode:384}),s.renameSync(l,i),i}async function KC(t={}){let e=t.fs??{readFileSync:(a,l)=>qC(a,l),mkdirSync:(a,l)=>XC(a,l),writeFileSync:(a,l,c)=>JC(a,l,c),renameSync:(a,l)=>GC(a,l)},n=null;try{n=bc({env:t.env,fs:e,homedir:t.homedir})}catch(a){if(!(a instanceof na))throw a}if(n){if((await cE(n.appkey,t)).valid)return n;if(A4(n.source))throw new iE(n.source)}let r=await T4(t);if(await t.onDevicePrompt?.({userCode:r.userCode,verificationUri:r.verificationUri})===!1)throw new fm;let o=await v4(r.deviceCode,{authBaseUrl:t.authBaseUrl,env:t.env,fetchImpl:t.fetchImpl,intervalSec:r.intervalSec,now:t.now,onPending:t.onPending,sleepImpl:t.sleepImpl,timeoutMs:t.timeoutMs}),i={version:1,appkey:o.appkey,user_id:o.userId,label:o.label,issued_at:o.issuedAt};return S4(i,{env:t.env,fs:e,homedir:t.homedir,now:t.now}),{appkey:o.appkey,source:"device-flow",envelope:i}}function WC(t,e,n){let r;try{r=t.readFileSync(e,"utf8")}catch{return null}let s=r.trim();if(s.length===0)return null;if(s.startsWith("{")){let o;try{o=JSON.parse(s)}catch{o=void 0}if(o&&typeof o=="object"){let i=o;return typeof i.appkey=="string"&&lE(i.appkey.trim())?{appkey:i.appkey.trim(),source:n,envelope:i}:null}}return lE(s)?{appkey:s,source:n,envelope:null}:null}function zC(t,e){let n=t.XDG_CONFIG_HOME?.trim()||jC(e(),".config");return jC(n,"lmctl","appkey.json")}function b4(t){let e=t.env??process.env;return(t.authBaseUrl?.trim()||e.LMCTL_AUTH_BASE_URL?.trim()||w4).replace(/\/+$/,"")}function I4(t,e){if(t.fetchImpl)return t.fetchImpl;if(typeof globalThis.fetch=="function")return(n,r)=>globalThis.fetch(n,r);throw new e("global fetch is unavailable; pass fetchImpl explicitly")}async function YC(t,e,n,r){return await QC(t,e,n,r,n.timeoutMs)}async function k4(t,e,n){return await QC("/device/token",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({device_code:t})},e,It,n,e.timeoutMs!==void 0?()=>new ta(e.timeoutMs):void 0)}async function QC(t,e,n,r,s,o){let i=I4(n,r),a=`${b4(n)}${t}`,l=s??E4,c={...e},d=new AbortController;c.signal=d.signal;let u=setTimeout(()=>{d.abort()},l);try{return await i(a,c)}catch(f){throw d.signal.aborted?o?o():new r(`auth request timed out for ${t} after ${l}ms`,{cause:f}):f instanceof r?f:new r(`auth request failed for ${t}`,{cause:f})}finally{clearTimeout(u)}}async function dE(t,e,n){let r;try{r=await t.json()}catch(s){throw new n(`${e} was not valid JSON`,{cause:s,status:t.status})}if(!r||typeof r!="object"||Array.isArray(r))throw new n(`${e} must be a JSON object`,{status:t.status});return r}function Br(t,e,n,r){let s=t[e];if(typeof s!="string"||s.length===0)throw new r(`${n} missing string field ${e}`);return s}function HC(t,e,n,r){let s=t[e];if(typeof s!="number"||!Number.isFinite(s))throw new r(`${n} missing number field ${e}`);return s}function ZC(t){return Math.max(1,Math.floor(t))}function BC(t,e,n){if(t!==void 0)return t-(n()-e)}function A4(t){return t==="env:LMCTL_APPKEY"||t==="env:LMCTL_APPKEY_FILE"}function N4(t){return new Promise(e=>{setTimeout(e,t)})}var na,Lo,iE,It,aE,fm,ta,w4,E4,uE=C(()=>{"use strict";FC();na=class extends Error{code="APPKEY_NOT_FOUND";constructor(e="no lmctl appkey found; run `lmchat login` on a machine with a browser, or copy ~/.config/lmctl/appkey.json here, or set LMCTL_APPKEY"){super(e),this.name="AppkeyNotFoundError"}},Lo=class extends Error{code="APPKEY_VALIDATION_ERROR";status;constructor(e,n={}){super(e),this.name="AppkeyValidationError",this.status=n.status,this.cause=n.cause}},iE=class extends Error{code="APPKEY_INVALID";source;constructor(e){super(`${e} resolved an invalid lmctl appkey`),this.name="AppkeyInvalidError",this.source=e}},It=class extends Error{code="AUTH_API_ERROR";status;constructor(e,n={}){super(e),this.name="AuthApiError",this.status=n.status,this.cause=n.cause}},aE=class extends Error{code="DEVICE_FLOW_EXPIRED";constructor(e="device authorization expired; start again to get a new code"){super(e),this.name="DeviceFlowExpiredError"}},fm=class extends Error{code="DEVICE_FLOW_DECLINED";constructor(e="device authorization declined by caller"){super(e),this.name="DeviceFlowDeclinedError"}},ta=class extends Error{code="DEVICE_FLOW_TIMEOUT";timeoutMs;constructor(e,n=`device authorization timed out after ${e}ms`){super(n),this.name="DeviceFlowTimeoutError",this.timeoutMs=e}},w4="https://lmctl.ai/auth",E4=1e4});function fE(t){let e;try{e=new URL(t)}catch{return`"${t}" is not a URL`}return e.username!==""||e.password!==""?"the URL must not contain a user name or password":e.protocol==="https:"||e.protocol==="http:"&&x4.has(e.hostname)?null:e.protocol==="http:"?`plain http to ${e.hostname} would send your appkey unencrypted; use https (http is accepted only for localhost)`:`unsupported protocol ${e.protocol}`}function eO(t,e){let n=fE(t);if(n!==null)throw new Error(`${e}: ${n}`);return t}function mm(t=fetch){return(e,n)=>t(e,{...n,redirect:"error"})}var x4,mE=C(()=>{"use strict";x4=new Set(["localhost","127.0.0.1","[::1]","::1"])});import{spawn as R4}from"node:child_process";function L4(t,e,n=process.platform){return!e||t.SSH_CONNECTION||t.SSH_TTY?!1:n==="darwin"||n==="win32"?!0:!!(t.DISPLAY||t.WAYLAND_DISPLAY)}function C4(t){let[e,n]=process.platform==="darwin"?["open",[t]]:process.platform==="win32"?["cmd",["/c","start",'""',t]]:["xdg-open",[t]];try{let r=R4(e,n,{detached:!0,stdio:"ignore"});r.on("error",()=>{}),r.unref()}catch{}}async function tO(t){let e=t.env??process.env,n=t.resolveAppkeyImpl??bc;if(!(t.validate===!0&&t.interactive))try{return n({env:e})}catch(l){if(!(l instanceof na)||!t.interactive)throw l}let r=t.stderr??(l=>process.stderr.write(l)),s=t.ensureAppkeyImpl??KC,o=t.openBrowser??L4(e,!!process.stderr.isTTY),i=e.LMCTL_AUTH_BASE_URL?.trim()||e.LMCTL_AUTH_URL?.trim()||void 0;i!==void 0&&eO(i,"the auth endpoint (LMCTL_AUTH_BASE_URL / LMCTL_AUTH_URL)");let a=await s({env:e,fetchImpl:mm(),...i!==void 0?{authBaseUrl:i}:{},onDevicePrompt:({userCode:l,verificationUri:c})=>{r(`Signing in to lmctl.
2503
+ `),o.exitCode})}var UC=C(()=>{"use strict";he();nE();$C();No();sE()});var Ppe,FC=C(()=>{"use strict";Ppe=Object.freeze({free:1e6,test:1e7})});import{mkdirSync as XC,readFileSync as qC,renameSync as GC,writeFileSync as JC}from"node:fs";import{homedir as VC}from"node:os";import{dirname as g4,join as jC}from"node:path";function lE(t){return t.length>0&&!t.includes(`
2504
+ `)}function bc(t={}){let e=t.env??process.env,n=t.fs??{readFileSync:(l,c)=>qC(l,c)},r=t.homedir??VC,s=e.LMCTL_APPKEY?.trim();if(s&&lE(s))return{appkey:s,source:"env:LMCTL_APPKEY",envelope:null};let o=e.LMCTL_APPKEY_FILE?.trim();if(o){let l=WC(n,o,"env:LMCTL_APPKEY_FILE");if(l)return l}let i=zC(e,r),a=WC(n,i,"file:default");if(a)return a;throw new na}async function cE(t,e={}){let n=await YC("/whoami",{method:"GET",headers:{authorization:`Bearer ${t}`}},e,Lo);if(n.status===401)return{valid:!1};if(n.status!==200)throw new Lo(`appkey validation failed with status ${n.status}`,{status:n.status});let r=await dE(n,"validate appkey response",Lo);return{valid:!0,userId:Br(r,"user_id","validate appkey response",Lo),label:Br(r,"label","validate appkey response",Lo)}}async function E4(t={}){let e=await YC("/device/codes",{method:"POST",headers:{"content-type":"application/json"},body:"{}"},t,It);if(e.status!==200)throw new It(`device authorization start failed with status ${e.status}`,{status:e.status});let n=await dE(e,"device authorization response",It);return{deviceCode:Br(n,"device_code","device authorization response",It),userCode:Br(n,"user_code","device authorization response",It),verificationUri:Br(n,"verification_uri","device authorization response",It),intervalSec:ZC(HC(n,"interval","device authorization response",It)),expiresInSec:HC(n,"expires_in","device authorization response",It)}}async function T4(t,e={}){let n=e.sleepImpl??A4,r=e.now??Date.now,s=ZC(e.intervalSec??5),o=r(),i=0;for(;;){let a=BC(e.timeoutMs,o,r);if(a!==void 0&&a<=0)throw new ta(e.timeoutMs);i+=1;let l=await I4(t,e,a);if(l.status===200){let f=await dE(l,"device token response",It);return{appkey:Br(f,"appkey","device token response",It),userId:Br(f,"user_id","device token response",It),label:Br(f,"label","device token response",It),issuedAt:Br(f,"issued_at","device token response",It)}}if(l.status===410)throw new aE;if(l.status!==428)throw new It(`device token polling failed with status ${l.status}`,{status:l.status});let c=r()-o;if(await e.onPending?.({attempt:i,elapsedMs:c,intervalSec:s})===!1)throw new fm("device authorization polling cancelled by caller");let u=s*1e3;if(e.timeoutMs!==void 0){let f=BC(e.timeoutMs,o,r);if(f<=0)throw new ta(e.timeoutMs);if(f<=u)throw await n(f),new ta(e.timeoutMs)}await n(u)}}function v4(t,e={}){let n=e.env??process.env,r=e.homedir??VC,s=e.fs??{mkdirSync:(c,d)=>XC(c,d),writeFileSync:(c,d,u)=>JC(c,d,u),renameSync:(c,d)=>GC(c,d)},o=e.now??Date.now,i=zC(n,r),a={...t,version:t.version??1},l=`${i}.${process.pid}.${Math.trunc(o())}.tmp`;return s.mkdirSync(g4(i),{recursive:!0}),s.writeFileSync(l,`${JSON.stringify(a,null,2)}
2505
+ `,{encoding:"utf8",mode:384}),s.renameSync(l,i),i}async function KC(t={}){let e=t.fs??{readFileSync:(a,l)=>qC(a,l),mkdirSync:(a,l)=>XC(a,l),writeFileSync:(a,l,c)=>JC(a,l,c),renameSync:(a,l)=>GC(a,l)},n=null;try{n=bc({env:t.env,fs:e,homedir:t.homedir})}catch(a){if(!(a instanceof na))throw a}if(n){if((await cE(n.appkey,t)).valid)return n;if(k4(n.source))throw new iE(n.source)}let r=await E4(t);if(await t.onDevicePrompt?.({userCode:r.userCode,verificationUri:r.verificationUri})===!1)throw new fm;let o=await T4(r.deviceCode,{authBaseUrl:t.authBaseUrl,env:t.env,fetchImpl:t.fetchImpl,intervalSec:r.intervalSec,now:t.now,onPending:t.onPending,sleepImpl:t.sleepImpl,timeoutMs:t.timeoutMs}),i={version:1,appkey:o.appkey,user_id:o.userId,label:o.label,issued_at:o.issuedAt};return v4(i,{env:t.env,fs:e,homedir:t.homedir,now:t.now}),{appkey:o.appkey,source:"device-flow",envelope:i}}function WC(t,e,n){let r;try{r=t.readFileSync(e,"utf8")}catch{return null}let s=r.trim();if(s.length===0)return null;if(s.startsWith("{")){let o;try{o=JSON.parse(s)}catch{o=void 0}if(o&&typeof o=="object"){let i=o;return typeof i.appkey=="string"&&lE(i.appkey.trim())?{appkey:i.appkey.trim(),source:n,envelope:i}:null}}return lE(s)?{appkey:s,source:n,envelope:null}:null}function zC(t,e){let n=t.XDG_CONFIG_HOME?.trim()||jC(e(),".config");return jC(n,"lmctl","appkey.json")}function S4(t){let e=t.env??process.env;return(t.authBaseUrl?.trim()||e.LMCTL_AUTH_BASE_URL?.trim()||y4).replace(/\/+$/,"")}function b4(t,e){if(t.fetchImpl)return t.fetchImpl;if(typeof globalThis.fetch=="function")return(n,r)=>globalThis.fetch(n,r);throw new e("global fetch is unavailable; pass fetchImpl explicitly")}async function YC(t,e,n,r){return await QC(t,e,n,r,n.timeoutMs)}async function I4(t,e,n){return await QC("/device/token",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({device_code:t})},e,It,n,e.timeoutMs!==void 0?()=>new ta(e.timeoutMs):void 0)}async function QC(t,e,n,r,s,o){let i=b4(n,r),a=`${S4(n)}${t}`,l=s??w4,c={...e},d=new AbortController;c.signal=d.signal;let u=setTimeout(()=>{d.abort()},l);try{return await i(a,c)}catch(f){throw d.signal.aborted?o?o():new r(`auth request timed out for ${t} after ${l}ms`,{cause:f}):f instanceof r?f:new r(`auth request failed for ${t}`,{cause:f})}finally{clearTimeout(u)}}async function dE(t,e,n){let r;try{r=await t.json()}catch(s){throw new n(`${e} was not valid JSON`,{cause:s,status:t.status})}if(!r||typeof r!="object"||Array.isArray(r))throw new n(`${e} must be a JSON object`,{status:t.status});return r}function Br(t,e,n,r){let s=t[e];if(typeof s!="string"||s.length===0)throw new r(`${n} missing string field ${e}`);return s}function HC(t,e,n,r){let s=t[e];if(typeof s!="number"||!Number.isFinite(s))throw new r(`${n} missing number field ${e}`);return s}function ZC(t){return Math.max(1,Math.floor(t))}function BC(t,e,n){if(t!==void 0)return t-(n()-e)}function k4(t){return t==="env:LMCTL_APPKEY"||t==="env:LMCTL_APPKEY_FILE"}function A4(t){return new Promise(e=>{setTimeout(e,t)})}var na,Lo,iE,It,aE,fm,ta,y4,w4,uE=C(()=>{"use strict";FC();na=class extends Error{code="APPKEY_NOT_FOUND";constructor(e="no lmctl appkey found; run `lmchat login` on a machine with a browser, or copy ~/.config/lmctl/appkey.json here, or set LMCTL_APPKEY"){super(e),this.name="AppkeyNotFoundError"}},Lo=class extends Error{code="APPKEY_VALIDATION_ERROR";status;constructor(e,n={}){super(e),this.name="AppkeyValidationError",this.status=n.status,this.cause=n.cause}},iE=class extends Error{code="APPKEY_INVALID";source;constructor(e){super(`${e} resolved an invalid lmctl appkey`),this.name="AppkeyInvalidError",this.source=e}},It=class extends Error{code="AUTH_API_ERROR";status;constructor(e,n={}){super(e),this.name="AuthApiError",this.status=n.status,this.cause=n.cause}},aE=class extends Error{code="DEVICE_FLOW_EXPIRED";constructor(e="device authorization expired; start again to get a new code"){super(e),this.name="DeviceFlowExpiredError"}},fm=class extends Error{code="DEVICE_FLOW_DECLINED";constructor(e="device authorization declined by caller"){super(e),this.name="DeviceFlowDeclinedError"}},ta=class extends Error{code="DEVICE_FLOW_TIMEOUT";timeoutMs;constructor(e,n=`device authorization timed out after ${e}ms`){super(n),this.name="DeviceFlowTimeoutError",this.timeoutMs=e}},y4="https://lmctl.ai/auth",w4=1e4});function fE(t){let e;try{e=new URL(t)}catch{return`"${t}" is not a URL`}return e.username!==""||e.password!==""?"the URL must not contain a user name or password":e.protocol==="https:"||e.protocol==="http:"&&N4.has(e.hostname)?null:e.protocol==="http:"?`plain http to ${e.hostname} would send your appkey unencrypted; use https (http is accepted only for localhost)`:`unsupported protocol ${e.protocol}`}function eO(t,e){let n=fE(t);if(n!==null)throw new Error(`${e}: ${n}`);return t}function mm(t=fetch){return(e,n)=>t(e,{...n,redirect:"error"})}var N4,mE=C(()=>{"use strict";N4=new Set(["localhost","127.0.0.1","[::1]","::1"])});import{spawn as x4}from"node:child_process";function R4(t,e,n=process.platform){return!e||t.SSH_CONNECTION||t.SSH_TTY?!1:n==="darwin"||n==="win32"?!0:!!(t.DISPLAY||t.WAYLAND_DISPLAY)}function L4(t){let[e,n]=process.platform==="darwin"?["open",[t]]:process.platform==="win32"?["cmd",["/c","start",'""',t]]:["xdg-open",[t]];try{let r=x4(e,n,{detached:!0,stdio:"ignore"});r.on("error",()=>{}),r.unref()}catch{}}async function tO(t){let e=t.env??process.env,n=t.resolveAppkeyImpl??bc;if(!(t.validate===!0&&t.interactive))try{return n({env:e})}catch(l){if(!(l instanceof na)||!t.interactive)throw l}let r=t.stderr??(l=>process.stderr.write(l)),s=t.ensureAppkeyImpl??KC,o=t.openBrowser??R4(e,!!process.stderr.isTTY),i=e.LMCTL_AUTH_BASE_URL?.trim()||e.LMCTL_AUTH_URL?.trim()||void 0;i!==void 0&&eO(i,"the auth endpoint (LMCTL_AUTH_BASE_URL / LMCTL_AUTH_URL)");let a=await s({env:e,fetchImpl:mm(),...i!==void 0?{authBaseUrl:i}:{},onDevicePrompt:({userCode:l,verificationUri:c})=>{r(`Signing in to lmctl.
2507
2506
  open ${c}
2508
2507
  code ${l}
2509
2508
  Waiting for approval (Ctrl-C to cancel)...
2510
- `),o&&(t.openUrlImpl??C4)(c)}});return r(`Signed in; appkey saved (source: ${a.source}).
2511
- `),a}var nO=C(()=>{"use strict";uE();mE()});function ra(t,e){return{error:{code:t,message:e}}}var rO=C(()=>{"use strict"});var sO={};ye(sO,{whoamiCommand:()=>D4,whoamiData:()=>pE});function O4(t){let e=t.LMCTL_AUTH_URL?.trim()||t.LMCTL_AUTH_BASE_URL?.trim();return e?e.replace(/\/+$/,""):void 0}async function pE(t={}){let e=t.env??process.env,n=t.resolveAppkeyImpl??bc,r=t.validateAppkeyImpl??cE,s=O4(e),o;try{o=n({env:e})}catch(l){return{data:ra("no_appkey",l instanceof Error?l.message:String(l)),exitCode:3}}let i=s===void 0?null:fE(s);if(i!==null)return{data:ra("insecure_endpoint",`the auth endpoint is not safe for your appkey: ${i}`),exitCode:4};let a;try{a=await r(o.appkey,{env:e,fetchImpl:mm(),...s!==void 0?{authBaseUrl:s}:{}})}catch(l){return{data:ra("auth_unreachable",`could not validate appkey: ${l instanceof Error?l.message:String(l)}`),exitCode:4}}return a.valid?{data:{userId:a.userId,label:a.label,appkeySource:o.source},exitCode:0}:{data:ra("invalid_appkey",`appkey is invalid (source: ${o.source})`),exitCode:3}}async function D4(t={}){let{data:e,exitCode:n}=await pE(t);if(t.interactive===!0&&"error"in e&&(e.error.code==="no_appkey"||e.error.code==="invalid_appkey")){try{await(t.acquireAppkeyImpl??tO)({env:t.env??process.env,interactive:!0,validate:e.error.code==="invalid_appkey",...t.resolveAppkeyImpl?{resolveAppkeyImpl:t.resolveAppkeyImpl}:{}})}catch(r){let s=r instanceof Error?r.message:String(r),o=ra("no_appkey",`could not sign in: ${s}`);return{output:t.json?JSON.stringify(o):`could not sign in: ${s}`,exitCode:3}}({data:e,exitCode:n}=await pE(t))}return t.json?{output:JSON.stringify(e),exitCode:n}:"error"in e?{output:e.error.message,exitCode:n}:{output:`user_id: ${e.userId}
2509
+ `),o&&(t.openUrlImpl??L4)(c)}});return r(`Signed in; appkey saved (source: ${a.source}).
2510
+ `),a}var nO=C(()=>{"use strict";uE();mE()});function ra(t,e){return{error:{code:t,message:e}}}var rO=C(()=>{"use strict"});var sO={};ye(sO,{whoamiCommand:()=>O4,whoamiData:()=>pE});function C4(t){let e=t.LMCTL_AUTH_URL?.trim()||t.LMCTL_AUTH_BASE_URL?.trim();return e?e.replace(/\/+$/,""):void 0}async function pE(t={}){let e=t.env??process.env,n=t.resolveAppkeyImpl??bc,r=t.validateAppkeyImpl??cE,s=C4(e),o;try{o=n({env:e})}catch(l){return{data:ra("no_appkey",l instanceof Error?l.message:String(l)),exitCode:3}}let i=s===void 0?null:fE(s);if(i!==null)return{data:ra("insecure_endpoint",`the auth endpoint is not safe for your appkey: ${i}`),exitCode:4};let a;try{a=await r(o.appkey,{env:e,fetchImpl:mm(),...s!==void 0?{authBaseUrl:s}:{}})}catch(l){return{data:ra("auth_unreachable",`could not validate appkey: ${l instanceof Error?l.message:String(l)}`),exitCode:4}}return a.valid?{data:{userId:a.userId,label:a.label,appkeySource:o.source},exitCode:0}:{data:ra("invalid_appkey",`appkey is invalid (source: ${o.source})`),exitCode:3}}async function O4(t={}){let{data:e,exitCode:n}=await pE(t);if(t.interactive===!0&&"error"in e&&(e.error.code==="no_appkey"||e.error.code==="invalid_appkey")){try{await(t.acquireAppkeyImpl??tO)({env:t.env??process.env,interactive:!0,validate:e.error.code==="invalid_appkey",...t.resolveAppkeyImpl?{resolveAppkeyImpl:t.resolveAppkeyImpl}:{}})}catch(r){let s=r instanceof Error?r.message:String(r),o=ra("no_appkey",`could not sign in: ${s}`);return{output:t.json?JSON.stringify(o):`could not sign in: ${s}`,exitCode:3}}({data:e,exitCode:n}=await pE(t))}return t.json?{output:JSON.stringify(e),exitCode:n}:"error"in e?{output:e.error.message,exitCode:n}:{output:`user_id: ${e.userId}
2512
2511
  label: ${e.label}
2513
- appkey source: ${e.appkeySource}`,exitCode:n}}var oO=C(()=>{"use strict";uE();nO();mE();rO()});import{isAbsolute as M4,resolve as iO,join as aO}from"node:path";function cO(t){let e=lO.get(t);if(!e)throw Error("Unknown context");return e.dal()}function uO(t){return t!==null&&typeof t=="object"&&dO.has(t)}function fO(t){try{if(!t||typeof t!="object"||Array.isArray(t))return zt("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 zt("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!M4(e.cwd))return zt("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 zt("invalid_argument","Environment values must be strings or undefined");for(let _ of["onProgress","onWarning","clock"])if(e[_]!==void 0&&typeof e[_]!="function")return zt("invalid_argument",_+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return zt("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return zt("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return zt("invalid_argument","pid must be a positive integer");let s=iO(e.cwd),o=r.LMCTL_HOME||(r.HOME?aO(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(o?aO(o,"state.db"):void 0)))return zt("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,c,d,u=new AbortController,f=new Set,m=_=>{if(l){try{l.close()}catch(h){_.push(ks(h))}l=void 0}},p=Object.freeze({status:"ok",error:null,pid:e.pid,signal:u.signal,env:r,cwd:s,dbPath:iO(s,mt(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(c)return c;let _;return c=new Promise(h=>{_=h}),a=!0,u.abort(),(async()=>{let h=[],g=0;for(let w of[...f])try{await w.close(),g++,f.delete(w)}catch(y){h.push(ks(y))}h.length||m(h),_({released:g,errors:h})})(),c},finalizeSync(_){if(d)return d;a=!0;let h=[],g={released:0,errors:h};d=g,c??=Promise.resolve(g);let w=[];for(let y of[...f])try{let E=y.finalizeSync(_);E instanceof Promise?w.push(E.then(()=>{g.released++,f.delete(y)}).catch(T=>{h.push(ks(T))})):(g.released++,f.delete(y))}catch(E){h.push(ks(E))}return u.abort(_),w.length?c=Promise.all(w).then(()=>(h.length||m(h),g)):h.length||m(h),g}});return lO.set(p,{resources:f,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=Ye({path:p.dbPath})}}),dO.add(p),$4.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(e){return zt("invalid_argument","Invalid context: "+ks(e))}}var lO,$4,dO,pm=C(()=>{"use strict";Pt();Kn();cf();lO=new WeakMap;$4=new WeakMap,dO=new WeakSet});var Ms,yO,ihe,ahe,lhe,che,dhe,xe,hE,ur,hm,sa,_m,ym,gm,mO,pO,hO,oa,P4,_O,gO,wO,_E=C(()=>{"use strict";Ms=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))Ms(e);Object.freeze(t)}return t},yO=Ms(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),ihe=Ms({status:"string",error:"string|null",code:"ErrorCode?"}),ahe=Ms(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),lhe=Ms(["Provider1.Provider","Provider1.Model1","Provider2.Provider","Provider2.Model1","Provider3.Provider","Provider3.Model1"]),che=Ms(["Provider1","Provider2","Provider3"]),dhe=Ms({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),xe={name:"ctx",type:"context"},hE={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},ur={name:"teamfile",type:"string"},hm={name:"alias",type:"string"},sa={name:"prompt",type:"string"},_m={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"}]},ym=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],gm={name:"options",type:"map",optional:!0,keys:ym},mO={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},pO={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},hO={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},oa={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},P4=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"},{name:"reconcile",type:"boolean"}],_O={name:"options",type:"map",optional:!0,keys:P4},gO={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},wO=Ms([{name:"resolveProfilePath",implemented:!0,params:[xe,hE],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[xe,hE],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:"classifyFailure",implemented:!0,params:[{name:"text",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"model",type:"string"},{name:"status",type:"string"}]}],statuses:["ok","error"],results:{error:"string|null",class:"string",rule:"string|null"},effects:[],summary:"Classify a recorded provider failure text by the one classifier; text no rule recognises is `unknown`, never the nearest class.",scriptBinding:{name:"lm_classify_failure",params:[{name:"text",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"model",type:"string"},{name:"status",type:"string"}]}]}},{name:"readPrompts",implemented:!0,params:[xe,{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:[xe,ur],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[ur]}},{name:"resolveMember",implemented:!0,params:[xe,ur,hm],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:[ur,hm]}},{name:"lintTeam",implemented:!0,params:[xe,ur],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:[ur]}},{name:"seedTeam",implemented:!0,params:[xe,ur,mO],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:[ur,mO]}},{name:"promptAgent",implemented:!0,params:[xe,_m,sa,gm],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...gO,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[_m,sa,gm]}},{name:"promptMember",implemented:!0,params:[xe,{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"},...ym]}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null",errorKind:"cycle|provider|target?",code:"ErrorCode?",errorClass:"string|null",usage:"map|null"},effects:["provider","db"],summary:"Turn a team member through native team admission.",scriptBinding:{name:"lm_prompt",params:[ur,hm,sa,{name:"options",type:"map",optional:!0,keys:[...ym,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[xe,{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:[xe,oa,hO],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:[_m,{...hO,optional:!0}]}},{name:"getSession",implemented:!0,params:[xe,oa],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:[oa]}},{name:"reserveSession",implemented:!0,params:[xe,oa],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:[xe,oa,{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:[xe,{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"},...ym]}],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:[xe,{name:"batch",type:"BatchRef"},sa,{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:[xe,{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:[xe,pO],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:[pO]}},{name:"openTerminal",implemented:!0,params:[xe,{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:[ur,hm]}},{name:"sessionAdmission",implemented:!0,params:[xe,oa],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:[xe,{name:"reservation",type:"SessionReservation"},_m,sa,gm],statuses:["ok","busy","stalled","empty","error"],results:{...gO,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[xe,{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:[xe,{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:[xe,{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"}]},gm],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:[xe,{name:"session",type:"NativeSessionRef"},sa],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:[xe,{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:[xe,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Critical synchronous native conversation lease release."},{name:"loadProperties",implemented:!0,params:[xe,hE],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:[xe,_O],statuses:["ok","error"],results:{error:"string|null",running:"RunningRow[]",dead:"DeadRow[]",idle:"IdleRow[]"},effects:["db"],summary:"DB-wide view of tracked invocation activity. Read-only unless reconcile:true, which also aborts rows whose holder is confirmed dead. Dispatch and branch on status busy, never gate on this.",scriptBinding:{name:"lm_running",params:[_O]}}])});function EO(t){if(!uO(t))return zt("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return zt("cancelled","Context is closed")}function TO(t){return wO.find(e=>e.name===t)?.params.find(e=>e.name==="options")?.keys?.map(e=>e.name)??[]}var vO=C(()=>{"use strict";_E();pm();cf()});function wm(t,e,n){let r=new Map;return s=>{let o=_d(s);if(o!=="dead")return o;let i=Date.parse(s.started_at),a=Date.parse(s.last_heartbeat_at??"");if(a>i&&a<=e&&e-a<U4)return"unknown";if(s.target_teamfile===null||s.target_alias===null)return o;let l=`${s.target_teamfile}:${s.target_alias}`;if(!r.has(l)){let d=t.query("SELECT MAX(started_at) AS latest FROM tracked_invocation WHERE from_identity = ? AND origin = 'agent' AND started_at >= ? AND started_at <= ?",l,new Date(e-n).toISOString(),new Date(e).toISOString());r.set(l,Date.parse(d[0]?.latest??""))}let c=Number.isFinite(a)&&a<=e?Math.max(i,a):i;return r.get(l)>c?"unknown":o}}var U4,gE=C(()=>{"use strict";En();U4=9e4});import{isAbsolute as F4,resolve as j4}from"node:path";function Tm(t){return Number.isFinite(t)&&Math.abs(t)<=W4}function H4(t){if(t&&typeof t=="object"){let e=t.code;if(typeof e=="string"){if(yO.includes(e))return e;if(e==="SQLITE_BUSY"||e==="SQLITE_LOCKED")return"busy";if(e==="SQLITE_READONLY"||e.startsWith("SQLITE_READONLY")||e==="EACCES"||e==="EPERM"||e==="EISDIR")return"read";if(e==="ENOENT"||e==="SQLITE_CANTOPEN")return"missing";if(e==="ETIMEDOUT"||e==="ECANCELED"||e==="ABORT_ERR")return"cancelled"}let n=t.message;if(typeof n=="string"){if(n.includes("readonly database")||n.includes("SQLITE_READONLY"))return"read";if(n.includes("database is locked")||n.includes("SQLITE_BUSY"))return"busy"}}return"internal"}function EE(t,e=Date.now()){if(t===void 0)return{windowMs:SO};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let o=Number(n[1]),i=n[2],l=(i==="s"?o:i==="m"?o*60:i==="h"?o*3600:o*86400)*1e3;return!Number.isFinite(l)||l<0||!Tm(e-l)?{error:`invalid --since duration: ${t} (cutoff out of representable date range)`}:{windowMs:l}}let r=Date.parse(t);if(!Number.isFinite(r)||!Tm(r))return{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`};let s=Math.max(0,e-r);return Tm(e-s)?{windowMs:s}:{error:`invalid --since value: ${t} (cutoff out of representable date range)`}}function Em(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function wE(t,e){let n=t.target_teamfile,r=t.target_alias;if(n===null||r===null)return yE;let s=e.get(n);if(s===void 0){try{s=Fe(n)}catch{s=null}e.set(n,s)}return s===null?yE:Md(s,r)?.model??yE}async function bO(t,e={}){let n=EO(t);if(n)return{status:"error",error:n.error,code:n.code,running:[],dead:[],idle:[]};if(e!=null){if(typeof e!="object"||Array.isArray(e))return{status:"error",error:"Options must be a map",code:"invalid_argument",running:[],dead:[],idle:[]};let o=TO("listRunning");if(o.length>0){for(let i of Object.keys(e))if(!o.includes(i))return{status:"error",error:`Unknown option: ${i}`,code:"invalid_argument",running:[],dead:[],idle:[]}}if(e.teamfile!==void 0&&(typeof e.teamfile!="string"||!e.teamfile.trim()))return{status:"error",error:"teamfile must be a nonempty string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.member!==void 0&&typeof e.member!="string")return{status:"error",error:"member must be a string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.reconcile!==void 0&&typeof e.reconcile!="boolean")return{status:"error",error:"reconcile must be a boolean",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.tree!==void 0&&typeof e.tree!="boolean")return{status:"error",error:"tree must be a boolean",code:"invalid_argument",running:[],dead:[],idle:[]}}let r=t.clock(),s=SO;if(e?.since!==void 0)if(typeof e.since=="number"){if(!Number.isFinite(e.since)||e.since<0||!Tm(r-e.since))return{status:"error",error:"since must be a non-negative number of milliseconds within representable date range",code:"invalid_argument",running:[],dead:[],idle:[]};s=e.since}else if(typeof e.since=="string"){let o=EE(e.since,r);if("error"in o)return{status:"error",error:o.error,code:"invalid_argument",running:[],dead:[],idle:[]};s=o.windowMs}else return{status:"error",error:"since must be a duration string or number",code:"invalid_argument",running:[],dead:[],idle:[]};try{let o=cO(t),i=e?.teamfile!==void 0?F4(e.teamfile)?e.teamfile:j4(t.cwd,e.teamfile):void 0,a=i!==void 0?Qe(i,o):void 0,l=e?.member!==void 0?e.member.toLowerCase():void 0,c=E=>!(a!==void 0&&E.target_teamfile!==a||l!==void 0&&(E.target_alias??"").toLowerCase()!==l),d=o.listAllRunningTrackedInvocations().filter(c),u=new Map,f=wm(o,r,s),m=[],p=[];for(let E of d){let T=f(E),v=r-new Date(E.started_at).getTime(),b={id:E.id,kind:E.kind,origin:E.origin,from_identity:E.from_identity,target:Em(E),model:wE(E,u),started_at:E.started_at,last_heartbeat_at:E.last_heartbeat_at,parent_invocation_id:E.parent_invocation_id};if(T==="dead"){if(e?.reconcile===!0&&Lh(o,E)!==null)continue;p.push({...b,age_ms:v})}else m.push({...b,running_for_ms:v,holder_liveness:T??"unknown"})}let _=new Set(d.map(Em).filter(E=>E!==null)),h=new Date(r-s).toISOString(),g=o.listRecentlyFinishedTrackedInvocations(h).filter(c),w=new Set,y=[];for(let E of g){let T=Em(E);T===null||_.has(T)||w.has(T)||(w.add(T),y.push({id:E.id,kind:E.kind,origin:E.origin,from_identity:E.from_identity,target:T,model:wE(E,u),status:E.status,started_at:E.started_at,ended_at:E.ended_at,idle_ms:r-new Date(E.ended_at).getTime(),ran_ms:new Date(E.ended_at).getTime()-new Date(E.started_at).getTime(),error:E.error,parent_invocation_id:E.parent_invocation_id}))}if(e?.tree===!0){let E=new Set([...m.map(v=>v.id),...p.map(v=>v.id),...y.map(v=>v.id)]),T=[...E];for(;T.length>0;){let v=o.listFinishedTrackedInvocationChildren(T,h).filter(b=>!E.has(b.id)&&c(b));if(v.length===0)break;T=[];for(let b of v){E.add(b.id),T.push(b.id);let k=Em(b);y.push({id:b.id,kind:b.kind,origin:b.origin,from_identity:b.from_identity,target:k,model:wE(b,u),status:b.status,started_at:b.started_at,ended_at:b.ended_at,idle_ms:r-new Date(b.ended_at).getTime(),ran_ms:new Date(b.ended_at).getTime()-new Date(b.started_at).getTime(),error:b.error,parent_invocation_id:b.parent_invocation_id})}}}return{status:"ok",error:null,running:m,dead:p,idle:y}}catch(o){return{status:"error",error:o instanceof Error?o.message:String(o),code:H4(o),running:[],dead:[],idle:[]}}}var SO,W4,yE,IO=C(()=>{"use strict";pm();vO();_E();gE();qd();Tt();Qn();SO=24*60*60*1e3,W4=864e13;yE="default"});function TE(t){for(let e=t.length-1;e>=0;e-=1){let n=t[e],r=B4.exec(n.content);if(r===null){if(n.role==="assistant"&&n.content.trim().length>0)return null;continue}let s=Number.parseInt(r[1],10),o=r[2]===void 0?0:Number.parseInt(r[2],10),i=r[3].toLowerCase(),a=r[4]?.trim()??null,l=`${r[1]}${r[2]!==void 0?`:${r[2]}`:""}${i}`;return{state:"LIMITED",resets_at:a===null?null:X4(n.timestamp,s,o,i,a),reset_time:l,timezone:a,detected_at:n.timestamp.toISOString()}}return null}function X4(t,e,n,r,s){if(!Number.isFinite(t.getTime())||e<1||e>12||n<0||n>59)return null;let o=q4(e,r);try{let i=G4(t,s),a=kO(i.year,i.month,i.day,o,n,s);if(a.getTime()<=t.getTime()){let l=z4(i,1);a=kO(l.year,l.month,l.day,o,n,s)}return a.toISOString()}catch{return null}}function q4(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function G4(t,e){let n=AO(e,!1).formatToParts(t);return{year:Xr(n,"year"),month:Xr(n,"month"),day:Xr(n,"day")}}function kO(t,e,n,r,s,o){let i=Date.UTC(t,e-1,n,r,s,0,0);for(let a=0;a<3;a+=1){let l=J4(new Date(i),o);i=Date.UTC(t,e-1,n,r,s,0,0)-l}return new Date(i)}function J4(t,e){let n=AO(e,!0).formatToParts(t);return Date.UTC(Xr(n,"year"),Xr(n,"month")-1,Xr(n,"day"),Xr(n,"hour"),Xr(n,"minute"),Xr(n,"second"),0)-t.getTime()}function AO(t,e){let n=e?K4:V4,r=n.get(t);if(r!==void 0)return r;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return n.set(t,s),s}function Xr(t,e){let n=t.find(r=>r.type===e)?.value;if(n===void 0)throw new Error(`missing ${e}`);return Number.parseInt(n,10)}function z4(t,e){let n=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate()}}var B4,V4,K4,NO=C(()=>{"use strict";B4=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;V4=new Map,K4=new Map});var WO={};ye(WO,{appendIntent:()=>SE,formatAge:()=>Ic,formatDuration:()=>bm,resolveIntentLogPath:()=>OO,runStatus:()=>aY,shortIdentity:()=>fr});import{appendFileSync as Y4,existsSync as Q4,mkdirSync as Z4}from"node:fs";import{homedir as eY}from"node:os";import{basename as tY,dirname as CO,isAbsolute as nY,join as rY,resolve as sY}from"node:path";function OO(){return process.env.LMCTL_INTENT_LOG??rY(eY(),".lmctl","recent-intents.log")}function SE(t){try{let e=OO();Z4(CO(e),{recursive:!0});let n=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});Y4(e,`${n}
2514
- `)}catch{}}async function aY(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(oY),0;let n=t.find(a=>a==="--project"||a.startsWith("--project=")||a==="--web");if(n!==void 0)return O(e,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=ce(t,["--since"],["--json","--details"]);if(r.error!==void 0)return O(e,r.error);let s=z(r,"--json"),o=z(r,"--details");if(r.positionals.length>0){let a=await cY(e,r.positionals,{json:s,details:o,since:F(r,"--since")});return a===0&&SE({verb:"status",args:t}),a}if(o)return O(e,"--details only applies with a teamfile argument (lmctl status <teamfile> --details)");let i=xY(F(r,"--since"));if("error"in i)return O(e,i.error);try{let a=e.env??process.env;if(s){let l=await G(e,c=>RO(c,a,i.iso));Y(e,{schema_version:xE,...l})}else{let l=await G(e,async c=>TY(await RO(c,a,i.iso),{sinceIso:i.iso}));e.stdout.write(l)}return SE({verb:"status",args:t}),0}catch(a){return O(e,a instanceof Error?a.message:String(a))}}async function cY(t,e,n){if(e.length>2)return O(t,`too many positionals (${e.length}); expected <teamfile> [alias]`);if(n.since!==void 0)return O(t,"--since only applies to the activity view (lmctl status with no teamfile argument)");let r=Zn(lY,{target:e[0],alias:e[1],flags:{}});if(r.mode==="error")return O(t,r.message);if(r.mode!=="ai-team")return O(t,"lmctl status: expected <teamfile> [alias]");try{return r.alias===void 0?await RY(t,r.teamfile,n.json,n.details):await $Y(t,r.teamfile,r.alias,n.json)}catch(s){return s instanceof De?O(t,s.message):O(t,`status: ${s instanceof Error?s.message:String(s)}`)}}async function RO(t,e,n){let r=Date.now(),s=wm(t,r,Math.max(0,r-Date.parse(n))),o=Yg(e,t);if(!o.ok){if(o.reason==="not-found")throw new Error(fo("status",e,t));return await uY(t,s)}return await dY(t,o.identity,e,s)}async function dY(t,e,n,r){let s=mo(e),o=t.getRootTeam(s.teamfile);if(o===null)throw new Error(fo("status",n,t));let i=Yn(o.teamfile_path,t),a=IE(Sm(t,{from:s.value}),r),l=IE(Sm(t,{target_teamfile:s.teamfile,target_alias:s.alias}),r),c=hY([...bE(t,r,{from:s.value}),...bE(t,r,{target_teamfile:s.teamfile,target_alias:s.alias})]);return{scope:"self",identity:s.value,...DO(),team:{name:i.name,teamfile:o.teamfile_path},members:i.members.map(d=>mY(t,o.teamfile_path,d)),activity:{from_me:a.map(d=>kE(d,r)),to_me:l.map(d=>kE(d,r))},transcript_harvest:await MO(c)}}function DO(){let t=null;try{t=YI(Kd())}catch{}return{db_path:mt(),site_name:t}}async function uY(t,e){let n=t.listRootTeams();return{scope:"db",identity:null,...DO(),teams:n.map(r=>fY(t,r)),activity:IE(Sm(t),e).map(r=>kE(r,e)),transcript_harvest:await MO(bE(t,e))}}function fY(t,e){if(!Q4(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let n=0;try{n=Yn(e.teamfile_path,t).members.length}catch{n=0}return{name:e.name,teamfile:e.teamfile_path,member_count:n,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function mY(t,e,n){let r=n.teamfile===void 0?null:Qe(nY(n.teamfile)?n.teamfile:sY(CO(e),n.teamfile),t),s=wn(t,e,n.alias),o=s.busy&&s.reason==="in-flight"?pY(t,e,n.alias,s.inFlight):null;return{alias:n.alias,provider:n.provider,model:n.model??null,teamfile:e,referenced_teamfile:r,sessionid:n.session??null,sessiondir:n.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:o,reclaimable:!s.busy&&s.reclaimable!==void 0?s.reclaimable:null}}function pY(t,e,n,r){let s=r.sender_alias==="operator"?"operator":`${r.sender_teamfile}:${r.sender_alias}`,i=t.db.prepare(`
2512
+ appkey source: ${e.appkeySource}`,exitCode:n}}var oO=C(()=>{"use strict";uE();nO();mE();rO()});import{isAbsolute as D4,resolve as iO,join as aO}from"node:path";function cO(t){let e=lO.get(t);if(!e)throw Error("Unknown context");return e.dal()}function uO(t){return t!==null&&typeof t=="object"&&dO.has(t)}function fO(t){try{if(!t||typeof t!="object"||Array.isArray(t))return zt("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 zt("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!D4(e.cwd))return zt("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 zt("invalid_argument","Environment values must be strings or undefined");for(let _ of["onProgress","onWarning","clock"])if(e[_]!==void 0&&typeof e[_]!="function")return zt("invalid_argument",_+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return zt("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return zt("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return zt("invalid_argument","pid must be a positive integer");let s=iO(e.cwd),o=r.LMCTL_HOME||(r.HOME?aO(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(o?aO(o,"state.db"):void 0)))return zt("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,c,d,u=new AbortController,f=new Set,m=_=>{if(l){try{l.close()}catch(h){_.push(ks(h))}l=void 0}},p=Object.freeze({status:"ok",error:null,pid:e.pid,signal:u.signal,env:r,cwd:s,dbPath:iO(s,mt(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(c)return c;let _;return c=new Promise(h=>{_=h}),a=!0,u.abort(),(async()=>{let h=[],g=0;for(let w of[...f])try{await w.close(),g++,f.delete(w)}catch(y){h.push(ks(y))}h.length||m(h),_({released:g,errors:h})})(),c},finalizeSync(_){if(d)return d;a=!0;let h=[],g={released:0,errors:h};d=g,c??=Promise.resolve(g);let w=[];for(let y of[...f])try{let E=y.finalizeSync(_);E instanceof Promise?w.push(E.then(()=>{g.released++,f.delete(y)}).catch(T=>{h.push(ks(T))})):(g.released++,f.delete(y))}catch(E){h.push(ks(E))}return u.abort(_),w.length?c=Promise.all(w).then(()=>(h.length||m(h),g)):h.length||m(h),g}});return lO.set(p,{resources:f,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=Ye({path:p.dbPath})}}),dO.add(p),M4.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(e){return zt("invalid_argument","Invalid context: "+ks(e))}}var lO,M4,dO,pm=C(()=>{"use strict";Pt();Kn();cf();lO=new WeakMap;M4=new WeakMap,dO=new WeakSet});var Ms,yO,ohe,ihe,ahe,lhe,che,xe,hE,ur,hm,sa,_m,ym,gm,mO,pO,hO,oa,$4,_O,gO,wO,_E=C(()=>{"use strict";Ms=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))Ms(e);Object.freeze(t)}return t},yO=Ms(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),ohe=Ms({status:"string",error:"string|null",code:"ErrorCode?"}),ihe=Ms(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),ahe=Ms(["Provider1.Provider","Provider1.Model1","Provider2.Provider","Provider2.Model1","Provider3.Provider","Provider3.Model1"]),lhe=Ms(["Provider1","Provider2","Provider3"]),che=Ms({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),xe={name:"ctx",type:"context"},hE={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},ur={name:"teamfile",type:"string"},hm={name:"alias",type:"string"},sa={name:"prompt",type:"string"},_m={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"}]},ym=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],gm={name:"options",type:"map",optional:!0,keys:ym},mO={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},pO={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},hO={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},oa={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},$4=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"},{name:"reconcile",type:"boolean"}],_O={name:"options",type:"map",optional:!0,keys:$4},gO={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},wO=Ms([{name:"resolveProfilePath",implemented:!0,params:[xe,hE],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[xe,hE],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:"classifyFailure",implemented:!0,params:[{name:"text",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"model",type:"string"},{name:"status",type:"string"}]}],statuses:["ok","error"],results:{error:"string|null",class:"string",rule:"string|null"},effects:[],summary:"Classify a recorded provider failure text by the one classifier; text no rule recognises is `unknown`, never the nearest class.",scriptBinding:{name:"lm_classify_failure",params:[{name:"text",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"model",type:"string"},{name:"status",type:"string"}]}]}},{name:"readPrompts",implemented:!0,params:[xe,{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:[xe,ur],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[ur]}},{name:"resolveMember",implemented:!0,params:[xe,ur,hm],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:[ur,hm]}},{name:"lintTeam",implemented:!0,params:[xe,ur],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:[ur]}},{name:"seedTeam",implemented:!0,params:[xe,ur,mO],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:[ur,mO]}},{name:"promptAgent",implemented:!0,params:[xe,_m,sa,gm],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...gO,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[_m,sa,gm]}},{name:"promptMember",implemented:!0,params:[xe,{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"},...ym]}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null",errorKind:"cycle|provider|target?",code:"ErrorCode?",errorClass:"string|null",usage:"map|null"},effects:["provider","db"],summary:"Turn a team member through native team admission.",scriptBinding:{name:"lm_prompt",params:[ur,hm,sa,{name:"options",type:"map",optional:!0,keys:[...ym,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[xe,{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:[xe,oa,hO],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:[_m,{...hO,optional:!0}]}},{name:"getSession",implemented:!0,params:[xe,oa],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:[oa]}},{name:"reserveSession",implemented:!0,params:[xe,oa],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:[xe,oa,{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:[xe,{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"},...ym]}],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:[xe,{name:"batch",type:"BatchRef"},sa,{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:[xe,{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:[xe,pO],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:[pO]}},{name:"openTerminal",implemented:!0,params:[xe,{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:[ur,hm]}},{name:"sessionAdmission",implemented:!0,params:[xe,oa],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:[xe,{name:"reservation",type:"SessionReservation"},_m,sa,gm],statuses:["ok","busy","stalled","empty","error"],results:{...gO,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[xe,{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:[xe,{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:[xe,{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"}]},gm],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:[xe,{name:"session",type:"NativeSessionRef"},sa],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:[xe,{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:[xe,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Critical synchronous native conversation lease release."},{name:"loadProperties",implemented:!0,params:[xe,hE],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:[xe,_O],statuses:["ok","error"],results:{error:"string|null",running:"RunningRow[]",dead:"DeadRow[]",idle:"IdleRow[]"},effects:["db"],summary:"DB-wide view of tracked invocation activity. Read-only unless reconcile:true, which also aborts rows whose holder is confirmed dead. Dispatch and branch on status busy, never gate on this.",scriptBinding:{name:"lm_running",params:[_O]}}])});function EO(t){if(!uO(t))return zt("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return zt("cancelled","Context is closed")}function TO(t){return wO.find(e=>e.name===t)?.params.find(e=>e.name==="options")?.keys?.map(e=>e.name)??[]}var vO=C(()=>{"use strict";_E();pm();cf()});function wm(t,e,n){let r=new Map;return s=>{let o=_d(s);if(o!=="dead")return o;let i=Date.parse(s.started_at),a=Date.parse(s.last_heartbeat_at??"");if(a>i&&a<=e&&e-a<P4)return"unknown";if(s.target_teamfile===null||s.target_alias===null)return o;let l=`${s.target_teamfile}:${s.target_alias}`;if(!r.has(l)){let d=t.query("SELECT MAX(started_at) AS latest FROM tracked_invocation WHERE from_identity = ? AND origin = 'agent' AND started_at >= ? AND started_at <= ?",l,new Date(e-n).toISOString(),new Date(e).toISOString());r.set(l,Date.parse(d[0]?.latest??""))}let c=Number.isFinite(a)&&a<=e?Math.max(i,a):i;return r.get(l)>c?"unknown":o}}var P4,gE=C(()=>{"use strict";En();P4=9e4});import{isAbsolute as U4,resolve as F4}from"node:path";function Tm(t){return Number.isFinite(t)&&Math.abs(t)<=j4}function W4(t){if(t&&typeof t=="object"){let e=t.code;if(typeof e=="string"){if(yO.includes(e))return e;if(e==="SQLITE_BUSY"||e==="SQLITE_LOCKED")return"busy";if(e==="SQLITE_READONLY"||e.startsWith("SQLITE_READONLY")||e==="EACCES"||e==="EPERM"||e==="EISDIR")return"read";if(e==="ENOENT"||e==="SQLITE_CANTOPEN")return"missing";if(e==="ETIMEDOUT"||e==="ECANCELED"||e==="ABORT_ERR")return"cancelled"}let n=t.message;if(typeof n=="string"){if(n.includes("readonly database")||n.includes("SQLITE_READONLY"))return"read";if(n.includes("database is locked")||n.includes("SQLITE_BUSY"))return"busy"}}return"internal"}function EE(t,e=Date.now()){if(t===void 0)return{windowMs:SO};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let o=Number(n[1]),i=n[2],l=(i==="s"?o:i==="m"?o*60:i==="h"?o*3600:o*86400)*1e3;return!Number.isFinite(l)||l<0||!Tm(e-l)?{error:`invalid --since duration: ${t} (cutoff out of representable date range)`}:{windowMs:l}}let r=Date.parse(t);if(!Number.isFinite(r)||!Tm(r))return{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`};let s=Math.max(0,e-r);return Tm(e-s)?{windowMs:s}:{error:`invalid --since value: ${t} (cutoff out of representable date range)`}}function Em(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function wE(t,e){let n=t.target_teamfile,r=t.target_alias;if(n===null||r===null)return yE;let s=e.get(n);if(s===void 0){try{s=Fe(n)}catch{s=null}e.set(n,s)}return s===null?yE:Md(s,r)?.model??yE}async function bO(t,e={}){let n=EO(t);if(n)return{status:"error",error:n.error,code:n.code,running:[],dead:[],idle:[]};if(e!=null){if(typeof e!="object"||Array.isArray(e))return{status:"error",error:"Options must be a map",code:"invalid_argument",running:[],dead:[],idle:[]};let o=TO("listRunning");if(o.length>0){for(let i of Object.keys(e))if(!o.includes(i))return{status:"error",error:`Unknown option: ${i}`,code:"invalid_argument",running:[],dead:[],idle:[]}}if(e.teamfile!==void 0&&(typeof e.teamfile!="string"||!e.teamfile.trim()))return{status:"error",error:"teamfile must be a nonempty string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.member!==void 0&&typeof e.member!="string")return{status:"error",error:"member must be a string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.reconcile!==void 0&&typeof e.reconcile!="boolean")return{status:"error",error:"reconcile must be a boolean",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.tree!==void 0&&typeof e.tree!="boolean")return{status:"error",error:"tree must be a boolean",code:"invalid_argument",running:[],dead:[],idle:[]}}let r=t.clock(),s=SO;if(e?.since!==void 0)if(typeof e.since=="number"){if(!Number.isFinite(e.since)||e.since<0||!Tm(r-e.since))return{status:"error",error:"since must be a non-negative number of milliseconds within representable date range",code:"invalid_argument",running:[],dead:[],idle:[]};s=e.since}else if(typeof e.since=="string"){let o=EE(e.since,r);if("error"in o)return{status:"error",error:o.error,code:"invalid_argument",running:[],dead:[],idle:[]};s=o.windowMs}else return{status:"error",error:"since must be a duration string or number",code:"invalid_argument",running:[],dead:[],idle:[]};try{let o=cO(t),i=e?.teamfile!==void 0?U4(e.teamfile)?e.teamfile:F4(t.cwd,e.teamfile):void 0,a=i!==void 0?Qe(i,o):void 0,l=e?.member!==void 0?e.member.toLowerCase():void 0,c=E=>!(a!==void 0&&E.target_teamfile!==a||l!==void 0&&(E.target_alias??"").toLowerCase()!==l),d=o.listAllRunningTrackedInvocations().filter(c),u=new Map,f=wm(o,r,s),m=[],p=[];for(let E of d){let T=f(E),v=r-new Date(E.started_at).getTime(),b={id:E.id,kind:E.kind,origin:E.origin,from_identity:E.from_identity,target:Em(E),model:wE(E,u),started_at:E.started_at,last_heartbeat_at:E.last_heartbeat_at,parent_invocation_id:E.parent_invocation_id};if(T==="dead"){if(e?.reconcile===!0&&Lh(o,E)!==null)continue;p.push({...b,age_ms:v})}else m.push({...b,running_for_ms:v,holder_liveness:T??"unknown"})}let _=new Set(d.map(Em).filter(E=>E!==null)),h=new Date(r-s).toISOString(),g=o.listRecentlyFinishedTrackedInvocations(h).filter(c),w=new Set,y=[];for(let E of g){let T=Em(E);T===null||_.has(T)||w.has(T)||(w.add(T),y.push({id:E.id,kind:E.kind,origin:E.origin,from_identity:E.from_identity,target:T,model:wE(E,u),status:E.status,started_at:E.started_at,ended_at:E.ended_at,idle_ms:r-new Date(E.ended_at).getTime(),ran_ms:new Date(E.ended_at).getTime()-new Date(E.started_at).getTime(),error:E.error,parent_invocation_id:E.parent_invocation_id}))}if(e?.tree===!0){let E=new Set([...m.map(v=>v.id),...p.map(v=>v.id),...y.map(v=>v.id)]),T=[...E];for(;T.length>0;){let v=o.listFinishedTrackedInvocationChildren(T,h).filter(b=>!E.has(b.id)&&c(b));if(v.length===0)break;T=[];for(let b of v){E.add(b.id),T.push(b.id);let k=Em(b);y.push({id:b.id,kind:b.kind,origin:b.origin,from_identity:b.from_identity,target:k,model:wE(b,u),status:b.status,started_at:b.started_at,ended_at:b.ended_at,idle_ms:r-new Date(b.ended_at).getTime(),ran_ms:new Date(b.ended_at).getTime()-new Date(b.started_at).getTime(),error:b.error,parent_invocation_id:b.parent_invocation_id})}}}return{status:"ok",error:null,running:m,dead:p,idle:y}}catch(o){return{status:"error",error:o instanceof Error?o.message:String(o),code:W4(o),running:[],dead:[],idle:[]}}}var SO,j4,yE,IO=C(()=>{"use strict";pm();vO();_E();gE();qd();Tt();Qn();SO=24*60*60*1e3,j4=864e13;yE="default"});function TE(t){for(let e=t.length-1;e>=0;e-=1){let n=t[e],r=H4.exec(n.content);if(r===null){if(n.role==="assistant"&&n.content.trim().length>0)return null;continue}let s=Number.parseInt(r[1],10),o=r[2]===void 0?0:Number.parseInt(r[2],10),i=r[3].toLowerCase(),a=r[4]?.trim()??null,l=`${r[1]}${r[2]!==void 0?`:${r[2]}`:""}${i}`;return{state:"LIMITED",resets_at:a===null?null:B4(n.timestamp,s,o,i,a),reset_time:l,timezone:a,detected_at:n.timestamp.toISOString()}}return null}function B4(t,e,n,r,s){if(!Number.isFinite(t.getTime())||e<1||e>12||n<0||n>59)return null;let o=X4(e,r);try{let i=q4(t,s),a=kO(i.year,i.month,i.day,o,n,s);if(a.getTime()<=t.getTime()){let l=K4(i,1);a=kO(l.year,l.month,l.day,o,n,s)}return a.toISOString()}catch{return null}}function X4(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function q4(t,e){let n=AO(e,!1).formatToParts(t);return{year:Xr(n,"year"),month:Xr(n,"month"),day:Xr(n,"day")}}function kO(t,e,n,r,s,o){let i=Date.UTC(t,e-1,n,r,s,0,0);for(let a=0;a<3;a+=1){let l=G4(new Date(i),o);i=Date.UTC(t,e-1,n,r,s,0,0)-l}return new Date(i)}function G4(t,e){let n=AO(e,!0).formatToParts(t);return Date.UTC(Xr(n,"year"),Xr(n,"month")-1,Xr(n,"day"),Xr(n,"hour"),Xr(n,"minute"),Xr(n,"second"),0)-t.getTime()}function AO(t,e){let n=e?V4:J4,r=n.get(t);if(r!==void 0)return r;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return n.set(t,s),s}function Xr(t,e){let n=t.find(r=>r.type===e)?.value;if(n===void 0)throw new Error(`missing ${e}`);return Number.parseInt(n,10)}function K4(t,e){let n=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate()}}var H4,J4,V4,NO=C(()=>{"use strict";H4=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;J4=new Map,V4=new Map});var WO={};ye(WO,{appendIntent:()=>SE,formatAge:()=>Ic,formatDuration:()=>bm,resolveIntentLogPath:()=>OO,runStatus:()=>iY,shortIdentity:()=>fr});import{appendFileSync as z4,existsSync as Y4,mkdirSync as Q4}from"node:fs";import{homedir as Z4}from"node:os";import{basename as eY,dirname as CO,isAbsolute as tY,join as nY,resolve as rY}from"node:path";function OO(){return process.env.LMCTL_INTENT_LOG??nY(Z4(),".lmctl","recent-intents.log")}function SE(t){try{let e=OO();Q4(CO(e),{recursive:!0});let n=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});z4(e,`${n}
2513
+ `)}catch{}}async function iY(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(sY),0;let n=t.find(a=>a==="--project"||a.startsWith("--project=")||a==="--web");if(n!==void 0)return O(e,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=ce(t,["--since"],["--json","--details"]);if(r.error!==void 0)return O(e,r.error);let s=z(r,"--json"),o=z(r,"--details");if(r.positionals.length>0){let a=await lY(e,r.positionals,{json:s,details:o,since:F(r,"--since")});return a===0&&SE({verb:"status",args:t}),a}if(o)return O(e,"--details only applies with a teamfile argument (lmctl status <teamfile> --details)");let i=NY(F(r,"--since"));if("error"in i)return O(e,i.error);try{let a=e.env??process.env;if(s){let l=await G(e,c=>RO(c,a,i.iso));Y(e,{schema_version:xE,...l})}else{let l=await G(e,async c=>EY(await RO(c,a,i.iso),{sinceIso:i.iso}));e.stdout.write(l)}return SE({verb:"status",args:t}),0}catch(a){return O(e,a instanceof Error?a.message:String(a))}}async function lY(t,e,n){if(e.length>2)return O(t,`too many positionals (${e.length}); expected <teamfile> [alias]`);if(n.since!==void 0)return O(t,"--since only applies to the activity view (lmctl status with no teamfile argument)");let r=Zn(aY,{target:e[0],alias:e[1],flags:{}});if(r.mode==="error")return O(t,r.message);if(r.mode!=="ai-team")return O(t,"lmctl status: expected <teamfile> [alias]");try{return r.alias===void 0?await xY(t,r.teamfile,n.json,n.details):await MY(t,r.teamfile,r.alias,n.json)}catch(s){return s instanceof De?O(t,s.message):O(t,`status: ${s instanceof Error?s.message:String(s)}`)}}async function RO(t,e,n){let r=Date.now(),s=wm(t,r,Math.max(0,r-Date.parse(n))),o=Yg(e,t);if(!o.ok){if(o.reason==="not-found")throw new Error(fo("status",e,t));return await dY(t,s)}return await cY(t,o.identity,e,s)}async function cY(t,e,n,r){let s=mo(e),o=t.getRootTeam(s.teamfile);if(o===null)throw new Error(fo("status",n,t));let i=Yn(o.teamfile_path,t),a=IE(Sm(t,{from:s.value}),r),l=IE(Sm(t,{target_teamfile:s.teamfile,target_alias:s.alias}),r),c=pY([...bE(t,r,{from:s.value}),...bE(t,r,{target_teamfile:s.teamfile,target_alias:s.alias})]);return{scope:"self",identity:s.value,...DO(),team:{name:i.name,teamfile:o.teamfile_path},members:i.members.map(d=>fY(t,o.teamfile_path,d)),activity:{from_me:a.map(d=>kE(d,r)),to_me:l.map(d=>kE(d,r))},transcript_harvest:await MO(c)}}function DO(){let t=null;try{t=YI(Kd())}catch{}return{db_path:mt(),site_name:t}}async function dY(t,e){let n=t.listRootTeams();return{scope:"db",identity:null,...DO(),teams:n.map(r=>uY(t,r)),activity:IE(Sm(t),e).map(r=>kE(r,e)),transcript_harvest:await MO(bE(t,e))}}function uY(t,e){if(!Y4(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let n=0;try{n=Yn(e.teamfile_path,t).members.length}catch{n=0}return{name:e.name,teamfile:e.teamfile_path,member_count:n,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function fY(t,e,n){let r=n.teamfile===void 0?null:Qe(tY(n.teamfile)?n.teamfile:rY(CO(e),n.teamfile),t),s=wn(t,e,n.alias),o=s.busy&&s.reason==="in-flight"?mY(t,e,n.alias,s.inFlight):null;return{alias:n.alias,provider:n.provider,model:n.model??null,teamfile:e,referenced_teamfile:r,sessionid:n.session??null,sessiondir:n.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:o,reclaimable:!s.busy&&s.reclaimable!==void 0?s.reclaimable:null}}function mY(t,e,n,r){let s=r.sender_alias==="operator"?"operator":`${r.sender_teamfile}:${r.sender_alias}`,i=t.db.prepare(`
2515
2514
  SELECT * FROM tracked_invocation
2516
2515
  WHERE kind = 'chat'
2517
2516
  AND status = 'running'
@@ -2521,27 +2520,27 @@ appkey source: ${e.appkeySource}`,exitCode:n}}var oO=C(()=>{"use strict";uE();nO
2521
2520
  AND holder_pid IS ?
2522
2521
  ORDER BY started_at DESC, id DESC
2523
2522
  LIMIT 5
2524
- `).all(e,n,s,r.holder_pid).find(a=>a.request_payload!==null);return i?.request_payload===void 0||i.request_payload===null?null:{tracked_invocation_id:i.id,from_identity:i.from_identity,started_at:i.started_at,request_payload:i.request_payload,request_preview:NY(i.request_payload)}}function Sm(t,e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.target_teamfile!==void 0&&(n.push("target_teamfile = ?"),r.push(e.target_teamfile)),e.target_alias!==void 0&&(n.push("target_alias = ?"),r.push(e.target_alias));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`;return t.db.prepare(`
2523
+ `).all(e,n,s,r.holder_pid).find(a=>a.request_payload!==null);return i?.request_payload===void 0||i.request_payload===null?null:{tracked_invocation_id:i.id,from_identity:i.from_identity,started_at:i.started_at,request_payload:i.request_payload,request_preview:AY(i.request_payload)}}function Sm(t,e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.target_teamfile!==void 0&&(n.push("target_teamfile = ?"),r.push(e.target_teamfile)),e.target_alias!==void 0&&(n.push("target_alias = ?"),r.push(e.target_alias));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`;return t.db.prepare(`
2525
2524
  SELECT * FROM tracked_invocation
2526
2525
  ${s}
2527
2526
  ORDER BY started_at DESC, id DESC
2528
- `).all(...r)}function bE(t,e,n={}){return Sm(t,n).filter(s=>s.kind==="chat"&&s.status==="running"&&e(s)==="dead")}function hY(t){let e=new Set,n=[];for(let r of t)e.has(r.id)||(e.add(r.id),n.push(r));return n.sort((r,s)=>{let o=Date.parse(s.started_at)-Date.parse(r.started_at);return Number.isFinite(o)&&o!==0?o:s.id-r.id})}function IE(t,e){return t.filter(n=>e(n)!=="dead")}async function MO(t){let e=[];for(let n of t)e.push(await _Y(n));return e}async function _Y(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,n={tracked_invocation_id:t.id,from_identity:t.from_identity,target:e??"(unknown)",started_at:t.started_at,tail_hint:e===null?"":`lmctl tail "${t.target_teamfile}" ${t.target_alias}`};if(e===null)return Co(n,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return Co(n,"missing-request-payload",null,null);let r=gY(t.meta);if(r.provider===null||r.sessionid===null)return Co(n,"missing-session-metadata",r.provider,r.sessionid);if(!no(r.provider))return Co(n,"unsupported-provider",r.provider,r.sessionid);let s;try{s=await _t(r.sessionid,r.provider)}catch{return Co(n,"read-error",r.provider,r.sessionid)}if(s===null)return Co(n,"session-not-found",r.provider,r.sessionid);let o=yY(t.request_payload,s.messages);return o.state!=="completed"?Co(n,o.reason,r.provider,r.sessionid):{...n,state:"completed",reason:null,provider:r.provider,session_id:r.sessionid,result_payload:o.result,result_preview:jO(o.result),assistant_timestamp:o.assistantTimestamp,matched_user_index:o.userIndex}}function Co(t,e,n,r){return{...t,state:"unreconciled",reason:e,provider:n,session_id:r,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function gY(t){if(t===null||t.trim()==="")return{provider:null,sessionid:null};try{let e=JSON.parse(t);return{provider:typeof e.provider=="string"&&e.provider.length>0?e.provider:null,sessionid:typeof e.sessionid=="string"&&e.sessionid.length>0?e.sessionid:null}}catch{return{provider:null,sessionid:null}}}function yY(t,e){let n=e.map((o,i)=>({message:o,index:i})).filter(({message:o})=>o.role==="user"&&o.content===t);if(n.length===0)return{state:"unreconciled",reason:"request-not-found"};if(n.length>1)return{state:"unreconciled",reason:"duplicate-request"};let r=n[0].index,s=[];for(let o of e.slice(r+1)){if(o.role==="user")break;o.role==="assistant"&&o.content.trim().length>0&&s.push(o)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:r,result:s.map(o=>o.content).join(`
2527
+ `).all(...r)}function bE(t,e,n={}){return Sm(t,n).filter(s=>s.kind==="chat"&&s.status==="running"&&e(s)==="dead")}function pY(t){let e=new Set,n=[];for(let r of t)e.has(r.id)||(e.add(r.id),n.push(r));return n.sort((r,s)=>{let o=Date.parse(s.started_at)-Date.parse(r.started_at);return Number.isFinite(o)&&o!==0?o:s.id-r.id})}function IE(t,e){return t.filter(n=>e(n)!=="dead")}async function MO(t){let e=[];for(let n of t)e.push(await hY(n));return e}async function hY(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,n={tracked_invocation_id:t.id,from_identity:t.from_identity,target:e??"(unknown)",started_at:t.started_at,tail_hint:e===null?"":`lmctl tail "${t.target_teamfile}" ${t.target_alias}`};if(e===null)return Co(n,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return Co(n,"missing-request-payload",null,null);let r=_Y(t.meta);if(r.provider===null||r.sessionid===null)return Co(n,"missing-session-metadata",r.provider,r.sessionid);if(!no(r.provider))return Co(n,"unsupported-provider",r.provider,r.sessionid);let s;try{s=await _t(r.sessionid,r.provider)}catch{return Co(n,"read-error",r.provider,r.sessionid)}if(s===null)return Co(n,"session-not-found",r.provider,r.sessionid);let o=gY(t.request_payload,s.messages);return o.state!=="completed"?Co(n,o.reason,r.provider,r.sessionid):{...n,state:"completed",reason:null,provider:r.provider,session_id:r.sessionid,result_payload:o.result,result_preview:jO(o.result),assistant_timestamp:o.assistantTimestamp,matched_user_index:o.userIndex}}function Co(t,e,n,r){return{...t,state:"unreconciled",reason:e,provider:n,session_id:r,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function _Y(t){if(t===null||t.trim()==="")return{provider:null,sessionid:null};try{let e=JSON.parse(t);return{provider:typeof e.provider=="string"&&e.provider.length>0?e.provider:null,sessionid:typeof e.sessionid=="string"&&e.sessionid.length>0?e.sessionid:null}}catch{return{provider:null,sessionid:null}}}function gY(t,e){let n=e.map((o,i)=>({message:o,index:i})).filter(({message:o})=>o.role==="user"&&o.content===t);if(n.length===0)return{state:"unreconciled",reason:"request-not-found"};if(n.length>1)return{state:"unreconciled",reason:"duplicate-request"};let r=n[0].index,s=[];for(let o of e.slice(r+1)){if(o.role==="user")break;o.role==="assistant"&&o.content.trim().length>0&&s.push(o)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:r,result:s.map(o=>o.content).join(`
2529
2528
 
2530
- `),assistantTimestamp:wY(s[s.length-1]?.timestamp)}}function wY(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function EY(t){if(!(t===null||t.trim()===""))try{let e=JSON.parse(t);if(!Array.isArray(e))return;let n=e.filter(r=>typeof r=="string"&&r.length>0);return n.length>0?n:void 0}catch{return}}function kE(t,e){let n=EY(t.config_warnings),r={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:e(t),from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:LO(t.result_summary),error:LO(t.error),...n!==void 0?{config_warnings:n}:{}};return t.error!==null&&UO.set(r,t.error),r}function TY(t,e){return t.scope==="self"?SY(t,e):bY(t,e)}function vY(t){if(t===null)return"idle";let e=t.holder_pid!==null?`pid ${t.holder_pid}${t.holder_host!==null?` on ${t.holder_host}`:""}`:"holder",n=t.reason==="dead-pid"?"appears dead -- the provider process ended before the turn completed":"stale";return`idle (reclaimable lock: ${e} ${n})`}function SY(t,e){let n=[];n.push(`identity: ${t.identity}`),n.push(`team: ${t.team.name}`),n.push(`teamfile: ${t.team.teamfile}`),n.push(""),n.push("members:"),t.members.length===0&&n.push(" none");for(let r of t.members){let s=r.model===null?"":` model=${r.model}`,o=r.sessionid===null?"":` session=${r.sessionid}`,i=r.state==="idle"?vY(r.reclaimable):`busy (${r.reason})`,a=r.handling===null?"":` handling="${r.handling.request_preview}"`;n.push(` ${r.alias}: ${i} provider=${r.provider}${s}${o}${a}`)}return n.push(""),n.push("transcript harvest:"),PO(n,t.transcript_harvest,"self"),n.push(""),n.push("activity from me:"),AE(n,NE(t.activity.from_me,e.sinceIso),"from-me"),n.push(""),n.push("activity to me:"),AE(n,NE(t.activity.to_me,e.sinceIso),"to-me"),n.push(""),n.push($O(t)),n.join(`
2531
- `)}function bY(t,e){let n=[];n.push("scope: db"),n.push("identity: none"),n.push(""),n.push("teams:"),t.teams.length===0&&n.push(" none");for(let r of t.teams){let s=r.name===null?"(unnamed)":r.name;n.push(` ${s}: ${r.teamfile} (${r.member_count} members)`)}return n.push(""),n.push("transcript harvest:"),PO(n,t.transcript_harvest,"db"),n.push(""),n.push("recent activity:"),AE(n,NE(t.activity,e.sinceIso),"db"),n.push(""),n.push($O(t)),n.join(`
2532
- `)}function $O(t){return ja(t.db_path)}function AE(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,vm))IY(t,r,n);FO(t,e.length,vm,"older")}function PO(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,vm)){let s=n==="db"?` from ${fr(r.from_identity)} -> ${fr(r.target)}`:` -> ${fr(r.target)}`;if(r.state==="completed"){let o=r.result_preview===null?"":` "${r.result_preview}"`;t.push(` #${r.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${r.started_at}${o}`)}else t.push(` #${r.tracked_invocation_id} unreconciled${s} since ${r.started_at} (${r.reason??"unknown"})`);r.tail_hint.length>0&&t.push(` inspect: ${r.tail_hint}`)}FO(t,e.length,vm,"more transcript harvest rows")}function NE(t,e){let n=Date.parse(e);return Number.isFinite(n)?t.filter(r=>{let s=Date.parse(r.ended_at??r.started_at);return Number.isFinite(s)&&s>=n}):t}function IY(t,e,n){let r=AY(e,n),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,o=e.error??e.result,i=kd(UO.get(e)??"",vE),a=o===null?"":` "${i??jO(o)}"`;if(t.push(` #${e.id} ${kY(e)} ${e.kind}${r} ${s}${a}`),e.config_warnings!==void 0)for(let l of e.config_warnings)t.push(` config not applied: ${l}`)}function kY(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.status.toUpperCase()}function AY(t,e){if(e==="from-me")return t.target===null?"":` -> ${fr(t.target)}`;if(e==="to-me")return` from ${fr(t.from_identity)}`;let n=t.target===null?"":` -> ${fr(t.target)}`;return` from ${fr(t.from_identity)}${n}`}function FO(t,e,n,r){let s=e-n;s>0&&t.push(` (+${s} ${r} -- use --json)`)}function LO(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function jO(t){let e=Zb(t).replace(/\s+/g," ").trim();return e.length<=vE?e:`${e.slice(0,vE-3)}...`}function NY(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=xO?e:`${e.slice(0,xO-3)}...`}function bm(t){return(0,Wt.formatDuration)(t)}function Ic(t){return(0,Wt.formatRelativeTime)(t)}function fr(t){if(t==="operator")return t;try{let e=mo(t);return`${tY(e.teamfile)}:${e.alias}`}catch{return t}}function xY(t){if(t===void 0)return{iso:new Date(Date.now()-iY).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let r=Number(e[1]),s=e[2],o=s==="s"?r:s==="m"?r*60:s==="h"?r*3600:r*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}async function RY(t,e,n,r){let s=await G(t,d=>{let u=Qe(e,d),f=Yn(u,d);if(f.parseErrors.length>0)throw new Error(f.parseErrors.join("; "));return{teamfile:u,teamName:f.name,targets:Vl(u,d,new Set,[])}}),o=Zy(s.teamfile),i=o.kind==="repo"?o:null,a=await Kl(t,s.targets),l=[],c=0;for(let d of s.targets){let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,declaredModel:d.model,liveness:a.get(ji(d.teamfile,d.alias))??Rf(),probed:!1,detailLoaded:!1},f=await Yy(t,{teamfile:d.teamfile,alias:d.alias});if(f!==void 0&&(u.configWarnings=f),r&&d.sessionid!==null){u.probed=!0;let m=null;try{m=await _t(d.sessionid,d.provider)}catch(p){t.stderr.write(`warning: failed to load session "${d.sessionid}" for ${d.reportPath} (${d.provider}): ${p instanceof Error?p.message:String(p)}
2533
- `)}u.detailLoaded=m!==null,u.messageCount=m?.messageCount??null,u.observedModel=m?.model??"(unknown)",u.lastContext=m?.lastInputTokens??null,u.totalInputTokens=m?.totalInputTokens??null,u.totalOutputTokens=m?.totalOutputTokens??null,m?.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=m.totalCachedInputTokens),u.sessionLimit=m===null?null:TE(m.messages),i!==null&&(u.activitySinceLastCommit={messageCount:m===null?null:ew(m,i.since),tokens:null},u.cumulativeTokens=m===null?null:tw(m)??"n/a"),m?.messageCount===void 0?c=void 0:c!==void 0&&(c+=m.messageCount)}l.push(u)}return n?(Y(t,{schema_version:xE,scope:"team",team:s.teamName,teamfile:s.teamfile,details:r,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(d=>({ref:d.ref,timestamp:d.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(d=>{let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,seeded:d.sessionid!==null,model:d.declaredModel,liveness:d.liveness};return d.configWarnings!==void 0&&(u.config_warnings=d.configWarnings),d.probed&&(u.messageCount=d.messageCount??null,u.observed_model=d.observedModel,u.lastContext=d.lastContext??null,u.totalInputTokens=d.totalInputTokens??null,u.totalOutputTokens=d.totalOutputTokens??null,d.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=d.totalCachedInputTokens),u.sessionLimit=d.sessionLimit??null,d.activitySinceLastCommit!==void 0&&(u.activitySinceLastCommit=d.activitySinceLastCommit),d.cumulativeTokens!==void 0&&(u.cumulativeTokens=d.cumulativeTokens==="n/a"?null:d.cumulativeTokens)),u}),...r?{total:{messageCount:c??null}}:{}}),0):(t.stdout.write(OY(s.teamName,s.teamfile,o,l,r,c)),0)}function LY(t){return t.sessionid??"(not seeded)"}function CY(t){return t.sessionid===null?"not seeded":Lf(t.liveness)}function OY(t,e,n,r,s,o){let i=[],a=n.kind==="repo"?n:null;if(i.push(`TEAM: ${t}`),i.push(`teamfile: ${e}`),n.kind==="repo"){i.push("Git progress:");for(let _ of n.commits)i.push(` ${_.ref}: ${_.timestamp.toISOString()}`);i.push(` Uncommitted: ${In(n.working.uncommittedTracked)} changed (tracked), ${In(n.working.untracked)} untracked`)}else n.reason==="no-commits"?i.push(`Git progress: git repository in ${n.teamDir} has no commits (no commit-based progress to report)`):i.push(`Git progress: no git repository in ${n.teamDir} (no commit-based progress to report)`);if(!s){i.push("members:"),r.length===0&&i.push(" none");for(let _ of r){let h=_.declaredModel===null?"":` model=${_.declaredModel}`;if(_.sessionid===null?i.push(` ${_.reportPath}: not seeded provider=${_.provider}${h} (run: lmctl seed "${_.teamfile}")`):i.push(` ${_.reportPath}: ${Lf(_.liveness)} provider=${_.provider}${h} session=${_.sessionid}`),_.configWarnings!==void 0)for(let g of _.configWarnings)i.push(` config not applied: ${g}`)}return i.push(""),i.push("session detail (observed model, messages, tokens, limits) not probed -- use --details"),`${i.join(`
2529
+ `),assistantTimestamp:yY(s[s.length-1]?.timestamp)}}function yY(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function wY(t){if(!(t===null||t.trim()===""))try{let e=JSON.parse(t);if(!Array.isArray(e))return;let n=e.filter(r=>typeof r=="string"&&r.length>0);return n.length>0?n:void 0}catch{return}}function kE(t,e){let n=wY(t.config_warnings),r={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:e(t),from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:LO(t.result_summary),error:LO(t.error),...n!==void 0?{config_warnings:n}:{}};return t.error!==null&&UO.set(r,t.error),r}function EY(t,e){return t.scope==="self"?vY(t,e):SY(t,e)}function TY(t){if(t===null)return"idle";let e=t.holder_pid!==null?`pid ${t.holder_pid}${t.holder_host!==null?` on ${t.holder_host}`:""}`:"holder",n=t.reason==="dead-pid"?"appears dead -- the provider process ended before the turn completed":"stale";return`idle (reclaimable lock: ${e} ${n})`}function vY(t,e){let n=[];n.push(`identity: ${t.identity}`),n.push(`team: ${t.team.name}`),n.push(`teamfile: ${t.team.teamfile}`),n.push(""),n.push("members:"),t.members.length===0&&n.push(" none");for(let r of t.members){let s=r.model===null?"":` model=${r.model}`,o=r.sessionid===null?"":` session=${r.sessionid}`,i=r.state==="idle"?TY(r.reclaimable):`busy (${r.reason})`,a=r.handling===null?"":` handling="${r.handling.request_preview}"`;n.push(` ${r.alias}: ${i} provider=${r.provider}${s}${o}${a}`)}return n.push(""),n.push("transcript harvest:"),PO(n,t.transcript_harvest,"self"),n.push(""),n.push("activity from me:"),AE(n,NE(t.activity.from_me,e.sinceIso),"from-me"),n.push(""),n.push("activity to me:"),AE(n,NE(t.activity.to_me,e.sinceIso),"to-me"),n.push(""),n.push($O(t)),n.join(`
2530
+ `)}function SY(t,e){let n=[];n.push("scope: db"),n.push("identity: none"),n.push(""),n.push("teams:"),t.teams.length===0&&n.push(" none");for(let r of t.teams){let s=r.name===null?"(unnamed)":r.name;n.push(` ${s}: ${r.teamfile} (${r.member_count} members)`)}return n.push(""),n.push("transcript harvest:"),PO(n,t.transcript_harvest,"db"),n.push(""),n.push("recent activity:"),AE(n,NE(t.activity,e.sinceIso),"db"),n.push(""),n.push($O(t)),n.join(`
2531
+ `)}function $O(t){return ja(t.db_path)}function AE(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,vm))bY(t,r,n);FO(t,e.length,vm,"older")}function PO(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,vm)){let s=n==="db"?` from ${fr(r.from_identity)} -> ${fr(r.target)}`:` -> ${fr(r.target)}`;if(r.state==="completed"){let o=r.result_preview===null?"":` "${r.result_preview}"`;t.push(` #${r.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${r.started_at}${o}`)}else t.push(` #${r.tracked_invocation_id} unreconciled${s} since ${r.started_at} (${r.reason??"unknown"})`);r.tail_hint.length>0&&t.push(` inspect: ${r.tail_hint}`)}FO(t,e.length,vm,"more transcript harvest rows")}function NE(t,e){let n=Date.parse(e);return Number.isFinite(n)?t.filter(r=>{let s=Date.parse(r.ended_at??r.started_at);return Number.isFinite(s)&&s>=n}):t}function bY(t,e,n){let r=kY(e,n),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,o=e.error??e.result,i=kd(UO.get(e)??"",vE),a=o===null?"":` "${i??jO(o)}"`;if(t.push(` #${e.id} ${IY(e)} ${e.kind}${r} ${s}${a}`),e.config_warnings!==void 0)for(let l of e.config_warnings)t.push(` config not applied: ${l}`)}function IY(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.status.toUpperCase()}function kY(t,e){if(e==="from-me")return t.target===null?"":` -> ${fr(t.target)}`;if(e==="to-me")return` from ${fr(t.from_identity)}`;let n=t.target===null?"":` -> ${fr(t.target)}`;return` from ${fr(t.from_identity)}${n}`}function FO(t,e,n,r){let s=e-n;s>0&&t.push(` (+${s} ${r} -- use --json)`)}function LO(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function jO(t){let e=Zb(t).replace(/\s+/g," ").trim();return e.length<=vE?e:`${e.slice(0,vE-3)}...`}function AY(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=xO?e:`${e.slice(0,xO-3)}...`}function bm(t){return(0,Wt.formatDuration)(t)}function Ic(t){return(0,Wt.formatRelativeTime)(t)}function fr(t){if(t==="operator")return t;try{let e=mo(t);return`${eY(e.teamfile)}:${e.alias}`}catch{return t}}function NY(t){if(t===void 0)return{iso:new Date(Date.now()-oY).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let r=Number(e[1]),s=e[2],o=s==="s"?r:s==="m"?r*60:s==="h"?r*3600:r*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}async function xY(t,e,n,r){let s=await G(t,d=>{let u=Qe(e,d),f=Yn(u,d);if(f.parseErrors.length>0)throw new Error(f.parseErrors.join("; "));return{teamfile:u,teamName:f.name,targets:Vl(u,d,new Set,[])}}),o=Zy(s.teamfile),i=o.kind==="repo"?o:null,a=await Kl(t,s.targets),l=[],c=0;for(let d of s.targets){let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,declaredModel:d.model,liveness:a.get(ji(d.teamfile,d.alias))??Rf(),probed:!1,detailLoaded:!1},f=await Yy(t,{teamfile:d.teamfile,alias:d.alias});if(f!==void 0&&(u.configWarnings=f),r&&d.sessionid!==null){u.probed=!0;let m=null;try{m=await _t(d.sessionid,d.provider)}catch(p){t.stderr.write(`warning: failed to load session "${d.sessionid}" for ${d.reportPath} (${d.provider}): ${p instanceof Error?p.message:String(p)}
2532
+ `)}u.detailLoaded=m!==null,u.messageCount=m?.messageCount??null,u.observedModel=m?.model??"(unknown)",u.lastContext=m?.lastInputTokens??null,u.totalInputTokens=m?.totalInputTokens??null,u.totalOutputTokens=m?.totalOutputTokens??null,m?.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=m.totalCachedInputTokens),u.sessionLimit=m===null?null:TE(m.messages),i!==null&&(u.activitySinceLastCommit={messageCount:m===null?null:ew(m,i.since),tokens:null},u.cumulativeTokens=m===null?null:tw(m)??"n/a"),m?.messageCount===void 0?c=void 0:c!==void 0&&(c+=m.messageCount)}l.push(u)}return n?(Y(t,{schema_version:xE,scope:"team",team:s.teamName,teamfile:s.teamfile,details:r,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(d=>({ref:d.ref,timestamp:d.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(d=>{let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,seeded:d.sessionid!==null,model:d.declaredModel,liveness:d.liveness};return d.configWarnings!==void 0&&(u.config_warnings=d.configWarnings),d.probed&&(u.messageCount=d.messageCount??null,u.observed_model=d.observedModel,u.lastContext=d.lastContext??null,u.totalInputTokens=d.totalInputTokens??null,u.totalOutputTokens=d.totalOutputTokens??null,d.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=d.totalCachedInputTokens),u.sessionLimit=d.sessionLimit??null,d.activitySinceLastCommit!==void 0&&(u.activitySinceLastCommit=d.activitySinceLastCommit),d.cumulativeTokens!==void 0&&(u.cumulativeTokens=d.cumulativeTokens==="n/a"?null:d.cumulativeTokens)),u}),...r?{total:{messageCount:c??null}}:{}}),0):(t.stdout.write(CY(s.teamName,s.teamfile,o,l,r,c)),0)}function RY(t){return t.sessionid??"(not seeded)"}function LY(t){return t.sessionid===null?"not seeded":Lf(t.liveness)}function CY(t,e,n,r,s,o){let i=[],a=n.kind==="repo"?n:null;if(i.push(`TEAM: ${t}`),i.push(`teamfile: ${e}`),n.kind==="repo"){i.push("Git progress:");for(let _ of n.commits)i.push(` ${_.ref}: ${_.timestamp.toISOString()}`);i.push(` Uncommitted: ${In(n.working.uncommittedTracked)} changed (tracked), ${In(n.working.untracked)} untracked`)}else n.reason==="no-commits"?i.push(`Git progress: git repository in ${n.teamDir} has no commits (no commit-based progress to report)`):i.push(`Git progress: no git repository in ${n.teamDir} (no commit-based progress to report)`);if(!s){i.push("members:"),r.length===0&&i.push(" none");for(let _ of r){let h=_.declaredModel===null?"":` model=${_.declaredModel}`;if(_.sessionid===null?i.push(` ${_.reportPath}: not seeded provider=${_.provider}${h} (run: lmctl seed "${_.teamfile}")`):i.push(` ${_.reportPath}: ${Lf(_.liveness)} provider=${_.provider}${h} session=${_.sessionid}`),_.configWarnings!==void 0)for(let g of _.configWarnings)i.push(` config not applied: ${g}`)}return i.push(""),i.push("session detail (observed model, messages, tokens, limits) not probed -- use --details"),`${i.join(`
2534
2533
  `)}
2535
- `}let l=a!==null?["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT","MSGS SINCE COMMIT","TOKENS SINCE COMMIT","TOKENS (cumulative)"]:["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT"],c=l.map((_,h)=>h>=5?"right":"left"),d=!1,u=r.filter(_=>_.sessionLimit!=null),f=[];for(let _ of r){let h=cR(_.lastContext??void 0,_.detailLoaded,aR);(h==="n/a"||_.cumulativeTokens==="n/a")&&(d=!0);let g=[(0,Wt.escapeCell)(LY(_)),(0,Wt.escapeCell)(_.reportPath),(0,Wt.escapeCell)(_.provider),(0,Wt.escapeCell)(_.observedModel??"(unknown)"),CY(_),In(_.messageCount),h];a!==null&&g.push(In(_.activitySinceLastCommit?.messageCount),In(_.activitySinceLastCommit?.tokens),lR(_.cumulativeTokens)),f.push(g)}let m=["TOTAL","","","","",In(o)];a!==null&&m.push("",In(DY(r)),In(null),In(MY(r))),f.push(m);let p=(0,Wt.formatTable)(f,{headers:l,align:c,margin:2}).split(`
2534
+ `}let l=a!==null?["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT","MSGS SINCE COMMIT","TOKENS SINCE COMMIT","TOKENS (cumulative)"]:["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT"],c=l.map((_,h)=>h>=5?"right":"left"),d=!1,u=r.filter(_=>_.sessionLimit!=null),f=[];for(let _ of r){let h=cR(_.lastContext??void 0,_.detailLoaded,aR);(h==="n/a"||_.cumulativeTokens==="n/a")&&(d=!0);let g=[(0,Wt.escapeCell)(RY(_)),(0,Wt.escapeCell)(_.reportPath),(0,Wt.escapeCell)(_.provider),(0,Wt.escapeCell)(_.observedModel??"(unknown)"),LY(_),In(_.messageCount),h];a!==null&&g.push(In(_.activitySinceLastCommit?.messageCount),In(_.activitySinceLastCommit?.tokens),lR(_.cumulativeTokens)),f.push(g)}let m=["TOTAL","","","","",In(o)];a!==null&&m.push("",In(OY(r)),In(null),In(DY(r))),f.push(m);let p=(0,Wt.formatTable)(f,{headers:l,align:c,margin:2}).split(`
2536
2535
  `);if(i.push(p[0]),r.forEach((_,h)=>{if(i.push(p[h+1]),_.configWarnings!==void 0)for(let g of _.configWarnings)i.push(` config not applied: ${g}`)}),i.push(p[p.length-1]),d&&i.push("n/a = this provider does not expose a context/token total; absence is not a health signal."),i.push(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
2537
2536
  Right after a compaction the last completed turn IS the summarisation request, which carried the
2538
2537
  full pre-compaction prompt \u2014 so this reads the OLD large number while the live context is already
2539
2538
  small. Re-read after the next turn before concluding a compaction failed or gating on the value.`),u.length>0){i.push("Session limits:");for(let _ of u)i.push(` ${_.reportPath}: LIMITED resets_at=${Qy(_.sessionLimit)}`)}return`${i.join(`
2540
2539
  `)}
2541
- `}function DY(t){let e=0;for(let n of t){let r=n.activitySinceLastCommit?.messageCount;r==null?e=void 0:e!==void 0&&(e+=r)}return e}function MY(t){let e=0;for(let n of t){let r=n.cumulativeTokens;r==null||r==="n/a"?e=void 0:e!==void 0&&(e+=r)}return e}async function $Y(t,e,n,r){let s=await G(t,p=>lt(e,n,p)),o;try{o=await _t(s.sessionid,s.provider)}catch(p){return O(t,`status: failed to load session: ${p instanceof Error?p.message:String(p)}`)}if(o===null)return O(t,`status: session not found: ${s.sessionid} (provider=${s.provider})`);let i=TE(o.messages),l=(await Kl(t,[{teamfile:s.teamfile,alias:s.alias}])).get(ji(s.teamfile,s.alias))??Rf(),c=await Yy(t,{teamfile:s.teamfile,alias:s.alias}),d=Zy(s.teamfile),u=d.kind==="repo"?d:null,f={provider:o.provider,sessionid:o.sessionId,seeded:!0,alias:s.alias,teamfile:s.teamfile,reportPath:s.alias,cwd:o.cwd,messageCount:o.messageCount??null,model:s.model??null,observed_model:o.model??null,lastContext:o.lastInputTokens??null,liveness:l,totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,...c!==void 0?{config_warnings:c}:{},...u!==null?{activitySinceLastCommit:{messageCount:ew(o,u.since),tokens:null},cumulativeTokens:tw(o)}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};if(r)return Y(t,{schema_version:xE,scope:"member",...f}),0;let m=[];if(m.push(`Session: ${o.sessionId}`),m.push(` Provider: ${o.provider}`),m.push(` Alias: ${s.alias}`),m.push(` Liveness: ${Lf(l)}`),m.push(` CWD: ${o.cwd}`),m.push(` Messages: ${In(o.messageCount)}`),m.push(` Model (declared): ${s.model??"(none)"}`),m.push(` Model (observed): ${o.model??"(unknown)"}`),c!==void 0)for(let p of c)m.push(` Config NOT applied: ${p}`);if(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)m.push(" Tokens: n/a");else{let p=` Tokens: ${(0,Wt.formatCount)(o.totalInputTokens)} in / ${(0,Wt.formatCount)(o.totalOutputTokens)} out`;f.totalCachedInputTokens!==void 0&&(p+=` (cached: ${(0,Wt.formatCount)(f.totalCachedInputTokens)})`),m.push(p)}return(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)&&m.push(" n/a = this provider does not expose a context/token total; absence is not a health signal."),m.push(` lastContext = prompt size of the LAST COMPLETED turn; it LAGS BY ONE TURN. Right after a
2540
+ `}function OY(t){let e=0;for(let n of t){let r=n.activitySinceLastCommit?.messageCount;r==null?e=void 0:e!==void 0&&(e+=r)}return e}function DY(t){let e=0;for(let n of t){let r=n.cumulativeTokens;r==null||r==="n/a"?e=void 0:e!==void 0&&(e+=r)}return e}async function MY(t,e,n,r){let s=await G(t,p=>lt(e,n,p)),o;try{o=await _t(s.sessionid,s.provider)}catch(p){return O(t,`status: failed to load session: ${p instanceof Error?p.message:String(p)}`)}if(o===null)return O(t,`status: session not found: ${s.sessionid} (provider=${s.provider})`);let i=TE(o.messages),l=(await Kl(t,[{teamfile:s.teamfile,alias:s.alias}])).get(ji(s.teamfile,s.alias))??Rf(),c=await Yy(t,{teamfile:s.teamfile,alias:s.alias}),d=Zy(s.teamfile),u=d.kind==="repo"?d:null,f={provider:o.provider,sessionid:o.sessionId,seeded:!0,alias:s.alias,teamfile:s.teamfile,reportPath:s.alias,cwd:o.cwd,messageCount:o.messageCount??null,model:s.model??null,observed_model:o.model??null,lastContext:o.lastInputTokens??null,liveness:l,totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,...c!==void 0?{config_warnings:c}:{},...u!==null?{activitySinceLastCommit:{messageCount:ew(o,u.since),tokens:null},cumulativeTokens:tw(o)}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};if(r)return Y(t,{schema_version:xE,scope:"member",...f}),0;let m=[];if(m.push(`Session: ${o.sessionId}`),m.push(` Provider: ${o.provider}`),m.push(` Alias: ${s.alias}`),m.push(` Liveness: ${Lf(l)}`),m.push(` CWD: ${o.cwd}`),m.push(` Messages: ${In(o.messageCount)}`),m.push(` Model (declared): ${s.model??"(none)"}`),m.push(` Model (observed): ${o.model??"(unknown)"}`),c!==void 0)for(let p of c)m.push(` Config NOT applied: ${p}`);if(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)m.push(" Tokens: n/a");else{let p=` Tokens: ${(0,Wt.formatCount)(o.totalInputTokens)} in / ${(0,Wt.formatCount)(o.totalOutputTokens)} out`;f.totalCachedInputTokens!==void 0&&(p+=` (cached: ${(0,Wt.formatCount)(f.totalCachedInputTokens)})`),m.push(p)}return(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)&&m.push(" n/a = this provider does not expose a context/token total; absence is not a health signal."),m.push(` lastContext = prompt size of the LAST COMPLETED turn; it LAGS BY ONE TURN. Right after a
2542
2541
  compaction it still reports the pre-compaction size (the summarisation request itself).`),i!==null&&m.push(` SessionLimit: LIMITED resets_at=${Qy(i)}`),m.push(` Created: ${f.createdAt}`),m.push(` Modified: ${f.modifiedAt}`),t.stdout.write(`${m.join(`
2543
2542
  `)}
2544
- `),0}var Wt,oY,xE,vm,iY,vE,xO,lY,UO,RE=C(()=>{"use strict";Wt=pn(rn(),1);En();gE();sn();he();Yu();Kn();xl();Qn();Nt();nw();zd();Fn();NO();Va();oY=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2543
+ `),0}var Wt,sY,xE,vm,oY,vE,xO,aY,UO,RE=C(()=>{"use strict";Wt=pn(rn(),1);En();gE();sn();he();Yu();Kn();xl();Qn();Nt();nw();zd();Fn();NO();Va();sY=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2545
2544
  lmctl status <teamfile> [--details] [--json]
2546
2545
  lmctl status <teamfile> <alias> [--json]
2547
2546
 
@@ -2560,21 +2559,21 @@ With a teamfile and an alias: single-member deep view (session detail, token
2560
2559
  breakdown, liveness with terminal-lock/in-flight holder info).
2561
2560
 
2562
2561
  --json emits { schema_version: 2, scope: 'self'|'db'|'team'|'member', ... }.
2563
- `,xE=2,vm=5,iY=24*60*60*1e3,vE=72,xO=80;lY={name:"status",allowsBareTeamfile:!0,supportsRaw:!1};UO=new WeakMap});var ME={};ye(ME,{_setRunningWatchMaxTicksForTests:()=>FY,runRunning:()=>VY});import{resolve as PY}from"node:path";function FY(t){CE=t??void 0}function WY(t,e,n,r){let s=new Map,o=l=>l.split(/[\\/]/).pop().replace(/\.(lmctl|lmbee)$/i,""),i=(l,c,d,u,f,m,p,_,h,g)=>{if(!l||!c||d!=="chat"&&d!=="exec")return;let w=`${l}#${c}`,y=wn(e,l,c),E=y.busy&&y.reason==="terminal-held",v=u==="running"&&f!=="dead"||y.busy,b={id:w,team_path:l,team:o(l),member:c,kind:d,state:u,liveness:f??(E?"live":null),model:m,started_at:p,last_activity_at:_,busy:v,terminal_held:E,can_prompt:!v,cannot_prompt_reason:v?E?"terminal-held":"busy":null,sender_identity:h,completed_run:g},k=s.get(w);(!k||(b.last_activity_at??"")>(k.last_activity_at??""))&&s.set(w,b)};for(let l of t.running){let c=l.target?.lastIndexOf(":")??-1;i(c>0?l.target.slice(0,c):null,c>0?l.target.slice(c+1):null,l.kind,"running",l.holder_liveness,l.model,l.started_at,l.last_heartbeat_at??l.started_at,l.from_identity,null)}for(let l of t.dead){let c=l.target?.lastIndexOf(":")??-1;i(c>0?l.target.slice(0,c):null,c>0?l.target.slice(c+1):null,l.kind,"error","dead",l.model,l.started_at,l.started_at,l.from_identity,{ended_at:l.started_at,elapsed_ms:l.age_ms,error:"invocation holder exited before completion"})}for(let l of t.idle){let c=l.target?.lastIndexOf(":")??-1,d=l.status==="done"?"done":"error";i(c>0?l.target.slice(0,c):null,c>0?l.target.slice(c+1):null,l.kind,d,null,l.model,l.started_at,l.ended_at,l.from_identity,{ended_at:l.ended_at,elapsed_ms:l.ran_ms,error:l.error})}let a=n.getTime()-r.sinceMs;return[...s.values()].filter(l=>r.state===void 0||r.state==="all"||l.state===r.state).filter(l=>r.kind===void 0||l.kind===r.kind).filter(l=>r.team===void 0||l.team.toLowerCase()===r.team.toLowerCase()||l.team_path.toLowerCase()===r.team.toLowerCase()).filter(l=>r.member===void 0||l.member.toLowerCase()===r.member.toLowerCase()).filter(l=>r.model===void 0||(l.model??"").toLowerCase().includes(r.model.toLowerCase())).filter(l=>l.state==="running"||l.last_activity_at!==null&&Date.parse(l.last_activity_at)>=a).sort((l,c)=>(c.last_activity_at??"").localeCompare(l.last_activity_at??"")).slice(0,r.limit)}function HY(t){let e=t.split(`
2564
- `,1)[0];return e.length<=OE?e:`${e.slice(0,OE)}\u2026`}function DE(t){return t.target!==null?fr(t.target):t.from_identity}function HO(t){return[(0,xn.escapeCell)(DE(t)),t.kind,"running",t.holder_liveness,(0,xn.escapeCell)(t.model),Ic(t.started_at)]}function BO(t){return[(0,xn.escapeCell)(DE(t)),t.kind,"DEAD","",(0,xn.escapeCell)(t.model),`started ${Ic(t.started_at)}, holder process confirmed dead`]}function XO(t){let e=`ran ${bm(t.ran_ms)}, idle ${Ic(t.ended_at)}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${(0,xn.escapeCell)(kd(t.error,OE)??HY(t.error))}`),[(0,xn.escapeCell)(DE(t)),t.kind,t.status,"",(0,xn.escapeCell)(t.model),e]}function LE(t){return t.filter(e=>e!=="").join(" ")}function XY(t){let e=new Map(t.map(o=>[o.id,o])),n=new Map,r=[];for(let o of t){let i=o.parent_invocation_id;if(i!==null&&e.has(i)){let a=n.get(i)??[];a.push(o),n.set(i,a)}else r.push(o)}let s=(o,i)=>i.started_at.localeCompare(o.started_at);r.sort(s);for(let o of n.values())o.sort(s);return{roots:r,childrenByParent:n}}function qY(t){let{roots:e,childrenByParent:n}=XY(t),r=[],s=(o,i)=>{r.push(`${" ".repeat(i+1)}${o.line}`);for(let a of n.get(o.id)??[])s(a,i+1)};for(let o of e)s(o,0);return r}function GY(t){let e=[...t.running.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:LE(HO(r))})),...t.dead.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:LE(BO(r))})),...t.idle.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:LE(XO(r))}))],n=qY(e);return`${n.length>0?n.join(`
2562
+ `,xE=2,vm=5,oY=24*60*60*1e3,vE=72,xO=80;aY={name:"status",allowsBareTeamfile:!0,supportsRaw:!1};UO=new WeakMap});var ME={};ye(ME,{_setRunningWatchMaxTicksForTests:()=>UY,runRunning:()=>JY});import{resolve as $Y}from"node:path";function UY(t){CE=t??void 0}function jY(t,e,n,r){let s=new Map,o=l=>l.split(/[\\/]/).pop().replace(/\.(lmctl|lmbee)$/i,""),i=(l,c,d,u,f,m,p,_,h,g)=>{if(!l||!c||d!=="chat"&&d!=="exec")return;let w=`${l}#${c}`,y=wn(e,l,c),E=y.busy&&y.reason==="terminal-held",v=u==="running"&&f!=="dead"||y.busy,b={id:w,team_path:l,team:o(l),member:c,kind:d,state:u,liveness:f??(E?"live":null),model:m,started_at:p,last_activity_at:_,busy:v,terminal_held:E,can_prompt:!v,cannot_prompt_reason:v?E?"terminal-held":"busy":null,sender_identity:h,completed_run:g},k=s.get(w);(!k||(b.last_activity_at??"")>(k.last_activity_at??""))&&s.set(w,b)};for(let l of t.running){let c=l.target?.lastIndexOf(":")??-1;i(c>0?l.target.slice(0,c):null,c>0?l.target.slice(c+1):null,l.kind,"running",l.holder_liveness,l.model,l.started_at,l.last_heartbeat_at??l.started_at,l.from_identity,null)}for(let l of t.dead){let c=l.target?.lastIndexOf(":")??-1;i(c>0?l.target.slice(0,c):null,c>0?l.target.slice(c+1):null,l.kind,"error","dead",l.model,l.started_at,l.started_at,l.from_identity,{ended_at:l.started_at,elapsed_ms:l.age_ms,error:"invocation holder exited before completion"})}for(let l of t.idle){let c=l.target?.lastIndexOf(":")??-1,d=l.status==="done"?"done":"error";i(c>0?l.target.slice(0,c):null,c>0?l.target.slice(c+1):null,l.kind,d,null,l.model,l.started_at,l.ended_at,l.from_identity,{ended_at:l.ended_at,elapsed_ms:l.ran_ms,error:l.error})}let a=n.getTime()-r.sinceMs;return[...s.values()].filter(l=>r.state===void 0||r.state==="all"||l.state===r.state).filter(l=>r.kind===void 0||l.kind===r.kind).filter(l=>r.team===void 0||l.team.toLowerCase()===r.team.toLowerCase()||l.team_path.toLowerCase()===r.team.toLowerCase()).filter(l=>r.member===void 0||l.member.toLowerCase()===r.member.toLowerCase()).filter(l=>r.model===void 0||(l.model??"").toLowerCase().includes(r.model.toLowerCase())).filter(l=>l.state==="running"||l.last_activity_at!==null&&Date.parse(l.last_activity_at)>=a).sort((l,c)=>(c.last_activity_at??"").localeCompare(l.last_activity_at??"")).slice(0,r.limit)}function WY(t){let e=t.split(`
2563
+ `,1)[0];return e.length<=OE?e:`${e.slice(0,OE)}\u2026`}function DE(t){return t.target!==null?fr(t.target):t.from_identity}function HO(t){return[(0,xn.escapeCell)(DE(t)),t.kind,"running",t.holder_liveness,(0,xn.escapeCell)(t.model),Ic(t.started_at)]}function BO(t){return[(0,xn.escapeCell)(DE(t)),t.kind,"DEAD","",(0,xn.escapeCell)(t.model),`started ${Ic(t.started_at)}, holder process confirmed dead`]}function XO(t){let e=`ran ${bm(t.ran_ms)}, idle ${Ic(t.ended_at)}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${(0,xn.escapeCell)(kd(t.error,OE)??WY(t.error))}`),[(0,xn.escapeCell)(DE(t)),t.kind,t.status,"",(0,xn.escapeCell)(t.model),e]}function LE(t){return t.filter(e=>e!=="").join(" ")}function BY(t){let e=new Map(t.map(o=>[o.id,o])),n=new Map,r=[];for(let o of t){let i=o.parent_invocation_id;if(i!==null&&e.has(i)){let a=n.get(i)??[];a.push(o),n.set(i,a)}else r.push(o)}let s=(o,i)=>i.started_at.localeCompare(o.started_at);r.sort(s);for(let o of n.values())o.sort(s);return{roots:r,childrenByParent:n}}function XY(t){let{roots:e,childrenByParent:n}=BY(t),r=[],s=(o,i)=>{r.push(`${" ".repeat(i+1)}${o.line}`);for(let a of n.get(o.id)??[])s(a,i+1)};for(let o of e)s(o,0);return r}function qY(t){let e=[...t.running.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:LE(HO(r))})),...t.dead.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:LE(BO(r))})),...t.idle.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:LE(XO(r))}))],n=XY(e);return`${n.length>0?n.join(`
2565
2564
  `):" none"}
2566
- `}function JY(t,e){let n=[{title:`Running (${t.running.length}):`,rows:t.running.map(HO)},{title:`Dead (reclaimable) (${t.dead.length}):`,rows:t.dead.map(BO)},{title:`Idle, finished in the last ${bm(e)} (${t.idle.length}):`,rows:t.idle.map(XO)}],r=["MEMBER","KIND","STATE","LIVENESS","MODEL","TIMING"],s=(0,xn.measureColumns)([{rows:[],headers:r},...n.map(a=>a.rows)],{max:BY}),o=!1,i=[];return n.forEach((a,l)=>{if(l>0&&i.push(""),i.push(a.title),a.rows.length===0){i.push(" none");return}let c=!o;o=!0,i.push((0,xn.renderGrid)(a.rows,{widths:s,margin:2,...c?{headers:r}:{}}))}),`${i.join(`
2565
+ `}function GY(t,e){let n=[{title:`Running (${t.running.length}):`,rows:t.running.map(HO)},{title:`Dead (reclaimable) (${t.dead.length}):`,rows:t.dead.map(BO)},{title:`Idle, finished in the last ${bm(e)} (${t.idle.length}):`,rows:t.idle.map(XO)}],r=["MEMBER","KIND","STATE","LIVENESS","MODEL","TIMING"],s=(0,xn.measureColumns)([{rows:[],headers:r},...n.map(a=>a.rows)],{max:HY}),o=!1,i=[];return n.forEach((a,l)=>{if(l>0&&i.push(""),i.push(a.title),a.rows.length===0){i.push(" none");return}let c=!o;o=!0,i.push((0,xn.renderGrid)(a.rows,{widths:s,margin:2,...c?{headers:r}:{}}))}),`${i.join(`
2567
2566
  `)}
2568
- `}async function VY(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${jY}
2569
- `),0;let n=ce(t,["--team","--member","--since","--watch-interval","--state","--kind","--model","--limit"],["--json","--tree","--watch","--reconcile"]);if(n.error!==void 0)return O(e,n.error);let r=z(n,"--json"),s=z(n,"--tree"),o=z(n,"--watch"),i=F(n,"--team"),a=F(n,"--member"),l=EE(F(n,"--since"));if("error"in l)return O(e,l.error);let c=F(n,"--state");if(c!==void 0&&!["running","done","error","all"].includes(c))return O(e,`invalid --state "${c}" (expected running, done, error, or all)`);let d=F(n,"--kind");if(d!==void 0&&!["chat","exec"].includes(d))return O(e,`invalid --kind "${d}" (expected chat or exec)`);let u=F(n,"--limit"),f=u===void 0?void 0:Number(u);if(f!==void 0&&(!Number.isInteger(f)||f<1))return O(e,`invalid --limit "${u}" (expected a positive integer)`);let m=F(n,"--watch-interval"),p=m===void 0?UY:Number.parseInt(m.replace(/s$/,""),10);if(!Number.isFinite(p)||p<1)return O(e,`invalid --watch-interval "${m}" (expected <N>s, N\u22651)`);let _=()=>G(e,async h=>{let g=fO({cwd:PY(e.cwd??process.cwd()),env:e.env??process.env,dal:h,dbPath:Pe(e)});if(g.status!=="ok")return O(e,g.error);let w=await bO(g,{teamfile:r?void 0:i,member:a,since:F(n,"--since"),tree:s,reconcile:z(n,"--reconcile")});if(w.status!=="ok")return O(e,w.error??"listRunning failed");if(r){let y=new Date,E={generated_at:y.toISOString(),sessions:WY(w,h,y,{sinceMs:l.windowMs,state:c,kind:d,team:i,member:a,model:F(n,"--model"),limit:f})};return o?e.stdout.write(`${JSON.stringify(E)}
2570
- `):Y(e,E),0}return e.stdout.write(s?GY(w):JY(w,l.windowMs)),0});return o?await new Promise(h=>{let g=0,w=!1,y=v=>{clearInterval(v),h(0)},E=async v=>{if(!w){w=!0;try{await _()}catch(b){e.stderr.write(`running: ${b instanceof Error?b.message:String(b)}
2571
- `)}finally{w=!1}g+=1,CE!==void 0&&g>=CE&&y(v)}},T=setInterval(()=>{E(T)},p*1e3);E(T),process.once("SIGINT",()=>y(T)),process.once("SIGTERM",()=>y(T))}):_()}var xn,UY,CE,jY,OE,BY,$E=C(()=>{"use strict";xn=pn(rn(),1);pm();IO();En();he();RE();sn();UY=2;jY=["usage: lmctl running [--json] [--since <duration|ISO8601>] [--state running|done|error|all]"," [--kind chat|exec] [--team <name-or-path>] [--member <alias>] [--model <name>] [--limit <N>]"," [--tree] [--reconcile] [--watch] [--watch-interval Ns]","","JSON mode lists stable team/member sessions from lmctl state, never provider session IDs.","The default lookback is 24h; active sessions are included regardless of age.","Filters combine. --team accepts a team name or path; --state defaults to all.","--since filters completed activity. --limit must be a positive integer.","can_prompt is evaluated from current lmctl activity and terminal reservations.","","Text mode usage:","lmctl running [--team <file>] [--member <alias>] [--since <duration|ISO8601>]"," [--tree] [--reconcile] [--watch] [--watch-interval Ns] [--json]","","Shows tracked_invocation activity DB-wide across the whole fleet, split","into three sections (flat mode, the default):",' - Running: status="running" with a live holder, or unknown liveness.'," Unknown includes recent heartbeat/dispatch evidence contradicting a"," dead historical PID; it does not certify that the member is live now.",' - Dead (reclaimable): status="running" but the holder process is'," confirmed dead without contrary activity evidence. Its age (time"," since it started; the moment the holder died is not recorded) is",' reported as "age_ms", not as "running", so a dead worker is never'," mistaken for one that is genuinely still building."," - Idle: targets with nothing running or dead, showing their most"," recent finish from the last 24 hours and how long they've been"," idle since.",' A finish that failed ends with " \u2014 " and one line of the failure:'," for a provider failure the end of the provider's own output, for"," any other error its first line. It is a pointer, not the full"," error: --json has the complete text.","","--team <file> narrows the view to one teamfile (path is canonicalized","before matching); --member <alias> narrows it to one member alias","(case-insensitive; combinable with --team). --since sets the lookback","window for the Idle section -- a relative duration (<n>s|m|h|d, e.g. 7d)","or an absolute ISO8601 timestamp (default 24h). Running and Dead are","not time-filtered. --since also bounds the later-dispatch evidence used","to distinguish dead from unknown; a recent advancing heartbeat counts too.","","Looking is read-only: a dead holder is listed under Dead and left as it is.","Dispatch reconciles dead holders for its receiver. Scheduled lmctl cron maintenance","explicitly opts into --reconcile, which aborts confirmed-dead rows and","terminalizes their linked messages. Unknown rows are never reconciled here.","","--watch re-renders the full snapshot every --watch-interval (default 2s)","until interrupted (SIGINT/SIGTERM). With --json, each snapshot is emitted","as ONE compact JSON object per line (NDJSON).","","--tree shows the same rows as one hierarchical dispatch-lineage view","instead: no section headers (each row already carries its own status),","indented under the session that dispatched it (who woke whom), sorted","by the most recent root session first. A node is a specific turn at a","specific time, not a team:alias identity -- the same member can appear","as multiple nodes for its different turns. Lineage is only known for","turns dispatched by a NESTED `lmctl prompt`/`lmctl terminal` call made","from within another turn's own tool calls; anything else (a human's","direct dispatch, or a turn from before this feature existed) has no","recorded parent and shows as its own root. Unlike the flat Idle section,","--tree does NOT collapse finished rows to one per target: every finished","descendant of a node in view (within the --since window) is rendered, so","a `lmctl batch` run shows as its batch root with ALL of its per-prompt","turns nested underneath.","","Every row also carries `model`: the target member's declared `model=`",'read straight from its teamfile (no session/provider query) -- "default"',"when the teamfile has no model= attribute, the alias/file can't be","resolved, or there is no target at all. This is the DECLARED value only,","not necessarily what actually ran (see the MODEL column in `lmctl status","<teamfile> --details`).","","Queries lmctl's own database only -- never touches native provider","session files."].join(`
2572
- `);OE=120;BY=[26,void 0,void 0,void 0,24,void 0]});var PE={};ye(PE,{runFoldedView:()=>zY});async function zY(t,e,n){let r=e.includes("--json"),s=e.filter(o=>!o.startsWith("--"));try{return await G(n,o=>{if(t==="teams"){let i=o.listRootTeams().map(a=>({name:a.name??a.teamfile_path,team:a.name??a.teamfile_path,path:a.teamfile_path,channel:"local"}));if(r)Y(n,{teams:i});else for(let a of i)n.stdout.write(`${a.name} ${a.path}
2567
+ `}async function JY(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${FY}
2568
+ `),0;let n=ce(t,["--team","--member","--since","--watch-interval","--state","--kind","--model","--limit"],["--json","--tree","--watch","--reconcile"]);if(n.error!==void 0)return O(e,n.error);let r=z(n,"--json"),s=z(n,"--tree"),o=z(n,"--watch"),i=F(n,"--team"),a=F(n,"--member"),l=EE(F(n,"--since"));if("error"in l)return O(e,l.error);let c=F(n,"--state");if(c!==void 0&&!["running","done","error","all"].includes(c))return O(e,`invalid --state "${c}" (expected running, done, error, or all)`);let d=F(n,"--kind");if(d!==void 0&&!["chat","exec"].includes(d))return O(e,`invalid --kind "${d}" (expected chat or exec)`);let u=F(n,"--limit"),f=u===void 0?void 0:Number(u);if(f!==void 0&&(!Number.isInteger(f)||f<1))return O(e,`invalid --limit "${u}" (expected a positive integer)`);let m=F(n,"--watch-interval"),p=m===void 0?PY:Number.parseInt(m.replace(/s$/,""),10);if(!Number.isFinite(p)||p<1)return O(e,`invalid --watch-interval "${m}" (expected <N>s, N\u22651)`);let _=()=>G(e,async h=>{let g=fO({cwd:$Y(e.cwd??process.cwd()),env:e.env??process.env,dal:h,dbPath:Pe(e)});if(g.status!=="ok")return O(e,g.error);let w=await bO(g,{teamfile:r?void 0:i,member:a,since:F(n,"--since"),tree:s,reconcile:z(n,"--reconcile")});if(w.status!=="ok")return O(e,w.error??"listRunning failed");if(r){let y=new Date,E={generated_at:y.toISOString(),sessions:jY(w,h,y,{sinceMs:l.windowMs,state:c,kind:d,team:i,member:a,model:F(n,"--model"),limit:f})};return o?e.stdout.write(`${JSON.stringify(E)}
2569
+ `):Y(e,E),0}return e.stdout.write(s?qY(w):GY(w,l.windowMs)),0});return o?await new Promise(h=>{let g=0,w=!1,y=v=>{clearInterval(v),h(0)},E=async v=>{if(!w){w=!0;try{await _()}catch(b){e.stderr.write(`running: ${b instanceof Error?b.message:String(b)}
2570
+ `)}finally{w=!1}g+=1,CE!==void 0&&g>=CE&&y(v)}},T=setInterval(()=>{E(T)},p*1e3);E(T),process.once("SIGINT",()=>y(T)),process.once("SIGTERM",()=>y(T))}):_()}var xn,PY,CE,FY,OE,HY,$E=C(()=>{"use strict";xn=pn(rn(),1);pm();IO();En();he();RE();sn();PY=2;FY=["usage: lmctl running [--json] [--since <duration|ISO8601>] [--state running|done|error|all]"," [--kind chat|exec] [--team <name-or-path>] [--member <alias>] [--model <name>] [--limit <N>]"," [--tree] [--reconcile] [--watch] [--watch-interval Ns]","","JSON mode lists stable team/member sessions from lmctl state, never provider session IDs.","The default lookback is 24h; active sessions are included regardless of age.","Filters combine. --team accepts a team name or path; --state defaults to all.","--since filters completed activity. --limit must be a positive integer.","can_prompt is evaluated from current lmctl activity and terminal reservations.","","Text mode usage:","lmctl running [--team <file>] [--member <alias>] [--since <duration|ISO8601>]"," [--tree] [--reconcile] [--watch] [--watch-interval Ns] [--json]","","Shows tracked_invocation activity DB-wide across the whole fleet, split","into three sections (flat mode, the default):",' - Running: status="running" with a live holder, or unknown liveness.'," Unknown includes recent heartbeat/dispatch evidence contradicting a"," dead historical PID; it does not certify that the member is live now.",' - Dead (reclaimable): status="running" but the holder process is'," confirmed dead without contrary activity evidence. Its age (time"," since it started; the moment the holder died is not recorded) is",' reported as "age_ms", not as "running", so a dead worker is never'," mistaken for one that is genuinely still building."," - Idle: targets with nothing running or dead, showing their most"," recent finish from the last 24 hours and how long they've been"," idle since.",' A finish that failed ends with " \u2014 " and one line of the failure:'," for a provider failure the end of the provider's own output, for"," any other error its first line. It is a pointer, not the full"," error: --json has the complete text.","","--team <file> narrows the view to one teamfile (path is canonicalized","before matching); --member <alias> narrows it to one member alias","(case-insensitive; combinable with --team). --since sets the lookback","window for the Idle section -- a relative duration (<n>s|m|h|d, e.g. 7d)","or an absolute ISO8601 timestamp (default 24h). Running and Dead are","not time-filtered. --since also bounds the later-dispatch evidence used","to distinguish dead from unknown; a recent advancing heartbeat counts too.","","Looking is read-only: a dead holder is listed under Dead and left as it is.","Dispatch reconciles dead holders for its receiver. Scheduled lmctl cron maintenance","explicitly opts into --reconcile, which aborts confirmed-dead rows and","terminalizes their linked messages. Unknown rows are never reconciled here.","","--watch re-renders the full snapshot every --watch-interval (default 2s)","until interrupted (SIGINT/SIGTERM). With --json, each snapshot is emitted","as ONE compact JSON object per line (NDJSON).","","--tree shows the same rows as one hierarchical dispatch-lineage view","instead: no section headers (each row already carries its own status),","indented under the session that dispatched it (who woke whom), sorted","by the most recent root session first. A node is a specific turn at a","specific time, not a team:alias identity -- the same member can appear","as multiple nodes for its different turns. Lineage is only known for","turns dispatched by a NESTED `lmctl prompt`/`lmctl terminal` call made","from within another turn's own tool calls; anything else (a human's","direct dispatch, or a turn from before this feature existed) has no","recorded parent and shows as its own root. Unlike the flat Idle section,","--tree does NOT collapse finished rows to one per target: every finished","descendant of a node in view (within the --since window) is rendered, so","a `lmctl batch` run shows as its batch root with ALL of its per-prompt","turns nested underneath.","","Every row also carries `model`: the target member's declared `model=`",'read straight from its teamfile (no session/provider query) -- "default"',"when the teamfile has no model= attribute, the alias/file can't be","resolved, or there is no target at all. This is the DECLARED value only,","not necessarily what actually ran (see the MODEL column in `lmctl status","<teamfile> --details`).","","Queries lmctl's own database only -- never touches native provider","session files."].join(`
2571
+ `);OE=120;HY=[26,void 0,void 0,void 0,24,void 0]});var PE={};ye(PE,{runFoldedView:()=>KY});async function KY(t,e,n){let r=e.includes("--json"),s=e.filter(o=>!o.startsWith("--"));try{return await G(n,o=>{if(t==="teams"){let i=o.listRootTeams().map(a=>({name:a.name??a.teamfile_path,team:a.name??a.teamfile_path,path:a.teamfile_path,channel:"local"}));if(r)Y(n,{teams:i});else for(let a of i)n.stdout.write(`${a.name} ${a.path}
2573
2572
  `);return 0}if(t==="history"){let i=s.find(u=>/^\d+$/.test(u)),a=Math.max(1,Math.min(500,Number(i??20))),l=s.find(u=>!/^\d+$/.test(u)),d=o.db.prepare(`SELECT id, created_at AS ts, root_teamfile AS team, sender_alias, receiver_alias, message, response, status FROM team_chat_log ${l?"WHERE root_teamfile = ?":""} ORDER BY id DESC LIMIT ?`).all(...l?[l,a]:[a]).reverse();if(r)Y(n,{events:d});else for(let u of d)n.stdout.write(`${String(u.ts)} ${String(u.team)} ${String(u.status)}
2574
2573
  `);return 0}if(t==="state"){let i=s[0],a=o.db.prepare("SELECT t.name AS team, m.alias, m.state AS status, m.state_reason AS reason, m.state_updated_at AS updated_at FROM team t JOIN team_member m ON m.team_id=t.id ORDER BY t.name, m.alias").all();if(i==="get"){let d=s[1],u=a.filter(f=>f.team===d);if(r)Y(n,{team:{name:d,state:u[0]??null}});else for(let f of u)n.stdout.write(`${String(f.team)}:${String(f.alias)} ${String(f.status)}
2575
2574
  `);return u.length||!d?0:1}if(i==="active"){let d=qO(a);if(r)Y(n,{active:d});else for(let u of d)n.stdout.write(`${String(u)}
2576
2575
  `);return 0}if(i!=="list")return O(n,"usage: lmctl state list|get|active [--json]");let l=a.map(d=>({team:d.team,state:d})),c=qO(a);if(r)Y(n,{teams:l,active:c});else for(let d of a)n.stdout.write(`${String(d.team)}:${String(d.alias)} ${String(d.status)}
2577
- `);return 0}return O(n,`unsupported folded view: ${t}`)})}catch(o){return O(n,`${t}: ${o instanceof Error?o.message:String(o)}`)}}var KY,qO,UE=C(()=>{"use strict";he();he();KY=t=>t!=="idle"&&t!=="retired",qO=t=>[...new Set(t.filter(e=>KY(e.status)).map(e=>String(e.team)))]});import{mkdtempSync as YY,readFileSync as QY,rmSync as ZY,writeFileSync as e8}from"node:fs";import{tmpdir as t8}from"node:os";import{spawnSync as n8}from"node:child_process";import{basename as Im,extname as FE,join as jE,resolve as WE}from"node:path";import*as GO from"node:readline";function r8(t){return e=>{let n=t.EDITOR??t.VISUAL??"vi";n8(n,[e],{stdio:"inherit"})}}async function JO(t){let{io:e,cwd:n,env:r=process.env}=t,s=t.initial??{},o=GO.createInterface({input:t.input,output:e.stdout,terminal:!1}),i=[],a=[];o.on("line",u=>{let f=a.shift();f!==void 0?f(u):i.push(u)});let l=!1;o.on("close",()=>{for(l=!0;a.length>0;)a.shift()("")});let c=async u=>{e.stdout.write(u);let f=i.shift();return f!==void 0?f.trim():l?"":new Promise(m=>a.push(p=>m(p.trim())))},d=()=>o.close();try{let u,f;if(s.output!==void 0)u=WE(n,s.output),f=Im(u,FE(u));else{let g=WE(n,t.directory??"."),w=await c(`Directory [${g}]: `),y=w===""?g:WE(n,w),E=`${Im(y)}.lmctl`,T=await c(`Teamfile name [${E}]: `),v=T===""?E:T,b=FE(v)?v:`${v}.lmctl`;u=jE(y,b),f=Im(b,FE(b))}let m;if(s.members!==void 0&&s.members.length>0)m=s.members.map(g=>({...g,model:g.model??s.model}));else{let g=Ci(bn(e.env??process.env,t.initConfigPath)),w=[...new Set(g===null?[]:Object.values(g).map(k=>k.provider))];e.stdout.write(`Providers from lmctl init: ${w.length>0?w.join(", "):"(none saved; run lmctl init to save suggestions)"}
2576
+ `);return 0}return O(n,`unsupported folded view: ${t}`)})}catch(o){return O(n,`${t}: ${o instanceof Error?o.message:String(o)}`)}}var VY,qO,UE=C(()=>{"use strict";he();he();VY=t=>t!=="idle"&&t!=="retired",qO=t=>[...new Set(t.filter(e=>VY(e.status)).map(e=>String(e.team)))]});import{mkdtempSync as zY,readFileSync as YY,rmSync as QY,writeFileSync as ZY}from"node:fs";import{tmpdir as e8}from"node:os";import{spawnSync as t8}from"node:child_process";import{basename as Im,extname as FE,join as jE,resolve as WE}from"node:path";import*as GO from"node:readline";function n8(t){return e=>{let n=t.EDITOR??t.VISUAL??"vi";t8(n,[e],{stdio:"inherit"})}}async function JO(t){let{io:e,cwd:n,env:r=process.env}=t,s=t.initial??{},o=GO.createInterface({input:t.input,output:e.stdout,terminal:!1}),i=[],a=[];o.on("line",u=>{let f=a.shift();f!==void 0?f(u):i.push(u)});let l=!1;o.on("close",()=>{for(l=!0;a.length>0;)a.shift()("")});let c=async u=>{e.stdout.write(u);let f=i.shift();return f!==void 0?f.trim():l?"":new Promise(m=>a.push(p=>m(p.trim())))},d=()=>o.close();try{let u,f;if(s.output!==void 0)u=WE(n,s.output),f=Im(u,FE(u));else{let g=WE(n,t.directory??"."),w=await c(`Directory [${g}]: `),y=w===""?g:WE(n,w),E=`${Im(y)}.lmctl`,T=await c(`Teamfile name [${E}]: `),v=T===""?E:T,b=FE(v)?v:`${v}.lmctl`;u=jE(y,b),f=Im(b,FE(b))}let m;if(s.members!==void 0&&s.members.length>0)m=s.members.map(g=>({...g,model:g.model??s.model}));else{let g=Ci(bn(e.env??process.env,t.initConfigPath)),w=[...new Set(g===null?[]:Object.values(g).map(k=>k.provider))];e.stdout.write(`Providers from lmctl init: ${w.length>0?w.join(", "):"(none saved; run lmctl init to save suggestions)"}
2578
2577
  `),e.stdout.write(`You can type another provider.
2579
2578
  `);let y=s.provider??g?.provider1.provider,E=s.provider??(w.length===1?w[0]:void 0);for(;E===void 0;){let k=await c(`Default provider${y!==void 0?` [${y}]`:""}: `),I=k===""?y:k;if(I===void 0){if(l)return e.stderr.write(`error: stdin closed (EOF) at the provider prompt and no default is available
2580
2579
  `),d(),null;continue}if(ln({alias:"Probe",provider:I})!==void 0){e.stdout.write(`unknown provider "${I}" (known: ${Object.keys(Ri).join(", ")})
@@ -2593,10 +2592,10 @@ breakdown, liveness with terminal-lock/in-flight holder info).
2593
2592
  `),N.length===0&&e.stdout.write(` No model suggestions available.
2594
2593
  `);for(let L of N)e.stdout.write(` ${L}
2595
2594
  `);e.stdout.write(`Type a model name, including one not listed, or leave blank to ${s.model!==void 0?"keep the default":"omit"}.
2596
- `);let S=s.model,x=await c(`Model for ${k}${S!==void 0?` [${S}]`:" (blank to omit)"}: `),R=x===""?S:x;m.push({alias:k,provider:I,...R!==void 0?{model:R}:{}})}}let p=Ns({teamName:f,members:m}),_=t.editFile??r8(r),h=s.seed??!0;for(;;){e.stdout.write(`
2595
+ `);let S=s.model,x=await c(`Model for ${k}${S!==void 0?` [${S}]`:" (blank to omit)"}: `),R=x===""?S:x;m.push({alias:k,provider:I,...R!==void 0?{model:R}:{}})}}let p=Ns({teamName:f,members:m}),_=t.editFile??n8(r),h=s.seed??!0;for(;;){e.stdout.write(`
2597
2596
  --- ${u} ---
2598
2597
  ${p}---
2599
- `);let g=(await c(`Write and seed? [${h?"Y/n":"y/N"}/e(dit)]: `)).toLowerCase();if(g==="e"||g==="edit"){let y=YY(jE(t8(),"lmctl-plan-edit-"));try{let E=jE(y,Im(u));e8(E,p,"utf8"),_(E),p=QY(E,"utf8")}finally{ZY(y,{recursive:!0,force:!0})}continue}if(g==="q"||g==="quit"||g==="abort")return d(),null;let w=g===""?h:g!=="n"&&g!=="no";return d(),{destPath:u,text:p,seed:w}}}catch(u){throw d(),u}}function VO(t){return Ef(t)}var KO=C(()=>{"use strict";jl();Eo();dy();$r();Tf()});var rD={};ye(rD,{readPlanSource:()=>ia,runPlan:()=>u8});import{existsSync as QO,mkdirSync as s8,readdirSync as o8,readFileSync as zO,statSync as i8,writeFileSync as a8}from"node:fs";import{basename as ZO,dirname as l8,extname as c8,join as eD,resolve as BE}from"node:path";async function u8(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(d8),0;let r=[],s=[];for(let A=0;A<t.length;A+=1){let S=t[A];if(S==="--member"){let x=t[A+1];if(x===void 0||x.startsWith("--"))return e.stderr.write(`error: missing value for --member
2598
+ `);let g=(await c(`Write and seed? [${h?"Y/n":"y/N"}/e(dit)]: `)).toLowerCase();if(g==="e"||g==="edit"){let y=zY(jE(e8(),"lmctl-plan-edit-"));try{let E=jE(y,Im(u));ZY(E,p,"utf8"),_(E),p=YY(E,"utf8")}finally{QY(y,{recursive:!0,force:!0})}continue}if(g==="q"||g==="quit"||g==="abort")return d(),null;let w=g===""?h:g!=="n"&&g!=="no";return d(),{destPath:u,text:p,seed:w}}}catch(u){throw d(),u}}function VO(t){return Ef(t)}var KO=C(()=>{"use strict";jl();Eo();dy();$r();Tf()});var rD={};ye(rD,{readPlanSource:()=>ia,runPlan:()=>d8});import{existsSync as QO,mkdirSync as r8,readdirSync as s8,readFileSync as zO,statSync as o8,writeFileSync as i8}from"node:fs";import{basename as ZO,dirname as a8,extname as l8,join as eD,resolve as BE}from"node:path";async function d8(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(c8),0;let r=[],s=[];for(let A=0;A<t.length;A+=1){let S=t[A];if(S==="--member"){let x=t[A+1];if(x===void 0||x.startsWith("--"))return e.stderr.write(`error: missing value for --member
2600
2599
  `),2;r.push(x),A+=1;continue}s.push(S)}let o=ce(s,["--pattern","--provider","--model","--from","--output","--member"],["--json","--stdout","--force","--seed","--no-seed","--wizard","--non-interactive","--no-interactive"]);if(o.error!==void 0)return e.stderr.write(`error: ${o.error}
2601
2600
  `),e.stderr.write(`usage: lmctl plan [directory] [options]
2602
2601
  `),2;if(o.positionals.length>1)return e.stderr.write(`usage: lmctl plan [directory] [options]
@@ -2609,18 +2608,18 @@ ${p}---
2609
2608
  `),2;let E=l!==void 0||c!==void 0||d!==void 0||u!==void 0||r.length>0,T=e.stdin??process.stdin,v=n.stdinIsTTY??(e.stdin===void 0?process.stdin.isTTY===!0:T.isTTY===!0),b=!E||u===void 0&&r.length===0&&(l===void 0||c===void 0),k=w||!y&&b&&!p&&!m&&v,I;if(k){if(u!==void 0)return e.stderr.write(`error: --from cannot be combined with --wizard
2610
2609
  `),2;if(l!==void 0&&r.length>0)return e.stderr.write(`error: --pattern and --member are mutually exclusive
2611
2610
  `),2;let A=nD(r,d,S=>{e.stderr.write(`error: ${S}
2612
- `)});if(A.error!==void 0)return 1;I=await f8(e,T,i,a,{provider:c,model:d,pattern:l,members:A.members,seed:!g,output:f},n)}else{if(!E)return e.stderr.write(`error: ${tD}
2613
- `),2;let A=await m8({pattern:l,provider:c,model:d,from:u,memberRaws:r,output:f,directory:a,cwd:i,seedFlag:h,deps:{...n,initConfigPath:bn(e.env??process.env,n.initConfigPath)}},S=>{e.stderr.write(`error: ${S}
2611
+ `)});if(A.error!==void 0)return 1;I=await u8(e,T,i,a,{provider:c,model:d,pattern:l,members:A.members,seed:!g,output:f},n)}else{if(!E)return e.stderr.write(`error: ${tD}
2612
+ `),2;let A=await f8({pattern:l,provider:c,model:d,from:u,memberRaws:r,output:f,directory:a,cwd:i,seedFlag:h,deps:{...n,initConfigPath:bn(e.env??process.env,n.initConfigPath)}},S=>{e.stderr.write(`error: ${S}
2614
2613
  `)});if(typeof A=="number")return A;I=A}if(I===null)return e.stderr.write(`aborted
2615
- `),1;if(p)return e.stdout.write(I.text),0;let N=I.destPath;return h8(I,N,{asJson:m,force:_,seed:I.seed},e)}async function f8(t,e,n,r,s,o){let i=await JO({io:t,input:e,cwd:n,...r!==void 0?{directory:r}:{},initial:s,...o.initConfigPath!==void 0?{initConfigPath:o.initConfigPath}:{},...o.loadModels!==void 0?{loadModels:o.loadModels}:{},...o.editFile!==void 0?{editFile:o.editFile}:{},...t.env!==void 0?{env:t.env}:{}});return i===null?null:{text:i.text,destPath:i.destPath,members:VO(i.text),seed:i.seed}}async function m8(t,e){let{pattern:n,provider:r,model:s,from:o,memberRaws:i,output:a,directory:l,cwd:c,seedFlag:d,deps:u}=t,f=[n!==void 0,i.length>0,o!==void 0].filter(Boolean).length;if(f===0)return e(tD),2;if(f>1)return e("--pattern, --member and --from are mutually exclusive"),2;if(o!==void 0&&(r!==void 0||s!==void 0))return e("--from cannot be combined with --provider or --model (the source teamfile defines the roster)"),2;let m=p8(a,l,c);if(o!==void 0){let h;try{h=await ia(o,u.fetchFn??globalThis.fetch,c)}catch(y){return e(y instanceof Error?y.message:String(y)),1}let g=Jx(h),w=Ef(g);return w.length===0?(e(`--from source "${o}" has no parseable _MEMBER_ lines`),1):{text:g,destPath:m,members:w,seed:d}}let p;if(i.length>0){let h=nD(i,s,e);if(h.error!==void 0)return 1;p=h.members}else{let h=Xx(n);if(h===void 0)return e(`invalid pattern "${n}" (expected ${wf})`),2;if(r!==void 0){let g=ln({alias:"Lead",provider:r});if(g!==void 0)return e(g),1;p=h.map(w=>({alias:w,provider:r,...s!==void 0?{model:s}:{}}))}else{let g=Ci(u.initConfigPath);if(g===null)return e("missing --provider, and no ~/.lmctl/init.toml found. Run `lmctl init` first, or pass --provider explicitly."),2;let w=[g.provider1,g.provider2,g.provider3];p=h.map((y,E)=>{let T=w[E%w.length];return{alias:y,provider:T.provider,model:s??T.model1}})}}let _=ZO(m,c8(m));return{text:Ns({teamName:_,members:p}),destPath:m,members:p,seed:d}}function nD(t,e,n){if(t.length===0)return{members:void 0};let r=[],s=new Set;for(let o of t){let i=qx(o);if(i.error!==void 0)return n(i.error),{error:i.error};let a=i.spec,l=a.alias.toLowerCase();if(s.has(l))return n(`duplicate member alias "${a.alias}"`),{error:l};s.add(l),r.push({...a,model:a.model??e})}return r[0].alias.toLowerCase()!=="lead"?(n(`the first member must be Lead (got "${r[0].alias}")`),{error:"lead-not-first"}):{members:r}}function p8(t,e,n){if(t!==void 0)return BE(n,t);let r=BE(n,e??".");return eD(r,`${ZO(r)}.lmctl`)}async function h8(t,e,n,r){if(QO(e)&&!n.force)return r.stderr.write(`error: ${e} already exists (use --force to overwrite)
2616
- `),1;s8(l8(e),{recursive:!0}),a8(e,t.text,"utf8");let s=n.asJson?{...r,stdout:{write:()=>{}}}:r;if(!(await As([e],s)===0))return n.seed&&r.stderr.write(`error: refusing to seed \u2014 lint failed
2614
+ `),1;if(p)return e.stdout.write(I.text),0;let N=I.destPath;return p8(I,N,{asJson:m,force:_,seed:I.seed},e)}async function u8(t,e,n,r,s,o){let i=await JO({io:t,input:e,cwd:n,...r!==void 0?{directory:r}:{},initial:s,...o.initConfigPath!==void 0?{initConfigPath:o.initConfigPath}:{},...o.loadModels!==void 0?{loadModels:o.loadModels}:{},...o.editFile!==void 0?{editFile:o.editFile}:{},...t.env!==void 0?{env:t.env}:{}});return i===null?null:{text:i.text,destPath:i.destPath,members:VO(i.text),seed:i.seed}}async function f8(t,e){let{pattern:n,provider:r,model:s,from:o,memberRaws:i,output:a,directory:l,cwd:c,seedFlag:d,deps:u}=t,f=[n!==void 0,i.length>0,o!==void 0].filter(Boolean).length;if(f===0)return e(tD),2;if(f>1)return e("--pattern, --member and --from are mutually exclusive"),2;if(o!==void 0&&(r!==void 0||s!==void 0))return e("--from cannot be combined with --provider or --model (the source teamfile defines the roster)"),2;let m=m8(a,l,c);if(o!==void 0){let h;try{h=await ia(o,u.fetchFn??globalThis.fetch,c)}catch(y){return e(y instanceof Error?y.message:String(y)),1}let g=Jx(h),w=Ef(g);return w.length===0?(e(`--from source "${o}" has no parseable _MEMBER_ lines`),1):{text:g,destPath:m,members:w,seed:d}}let p;if(i.length>0){let h=nD(i,s,e);if(h.error!==void 0)return 1;p=h.members}else{let h=Xx(n);if(h===void 0)return e(`invalid pattern "${n}" (expected ${wf})`),2;if(r!==void 0){let g=ln({alias:"Lead",provider:r});if(g!==void 0)return e(g),1;p=h.map(w=>({alias:w,provider:r,...s!==void 0?{model:s}:{}}))}else{let g=Ci(u.initConfigPath);if(g===null)return e("missing --provider, and no ~/.lmctl/init.toml found. Run `lmctl init` first, or pass --provider explicitly."),2;let w=[g.provider1,g.provider2,g.provider3];p=h.map((y,E)=>{let T=w[E%w.length];return{alias:y,provider:T.provider,model:s??T.model1}})}}let _=ZO(m,l8(m));return{text:Ns({teamName:_,members:p}),destPath:m,members:p,seed:d}}function nD(t,e,n){if(t.length===0)return{members:void 0};let r=[],s=new Set;for(let o of t){let i=qx(o);if(i.error!==void 0)return n(i.error),{error:i.error};let a=i.spec,l=a.alias.toLowerCase();if(s.has(l))return n(`duplicate member alias "${a.alias}"`),{error:l};s.add(l),r.push({...a,model:a.model??e})}return r[0].alias.toLowerCase()!=="lead"?(n(`the first member must be Lead (got "${r[0].alias}")`),{error:"lead-not-first"}):{members:r}}function m8(t,e,n){if(t!==void 0)return BE(n,t);let r=BE(n,e??".");return eD(r,`${ZO(r)}.lmctl`)}async function p8(t,e,n,r){if(QO(e)&&!n.force)return r.stderr.write(`error: ${e} already exists (use --force to overwrite)
2615
+ `),1;r8(a8(e),{recursive:!0}),i8(e,t.text,"utf8");let s=n.asJson?{...r,stdout:{write:()=>{}}}:r;if(!(await As([e],s)===0))return n.seed&&r.stderr.write(`error: refusing to seed \u2014 lint failed
2617
2616
  `),n.asJson&&Y(r,HE(e,!1,!1,t.members)),1;let a=!1;if(n.seed){let l=await Bl([e],s);return a=l===0,n.asJson&&Y(r,HE(e,!0,a,t.members)),l}return n.asJson?(Y(r,HE(e,!0,!1,t.members)),0):(r.stdout.write(`Created ${e}
2618
2617
  `),r.stdout.write(`This is a starting point, not a finished teamfile -- edit it freely.
2619
2618
  `),r.stdout.write(`Only _MEMBER_ lines are parsed; everything else is free-form.
2620
2619
  `),r.stdout.write(`Format, and what lint/seed each do: https://lmctl.com/lmctl/docs/manuals/teamfile-format
2621
2620
  `),r.stdout.write(`After editing, run: lmctl lint ${e}
2622
2621
  `),r.stdout.write(`Then run: lmctl seed ${e}
2623
- `),0)}function HE(t,e,n,r){return{path:t,linted:e,seeded:n,members:r.map(s=>({alias:s.alias,provider:s.provider,...s.model!==void 0?{model:s.model}:{}}))}}async function ia(t,e,n){if(/^http:\/\//i.test(t))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(t))return g8(t,e);let r=BE(n,t);if(!QO(r))throw new Error(`source not found: ${t}`);if(!i8(r).isDirectory())return zO(r,"utf8");let o=o8(r).filter(i=>st(i));if(o.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(o.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return zO(eD(r,o[0]),"utf8")}async function g8(t,e){let n=new URL(t);for(let r=0;;r+=1){if(n.protocol!=="https:")throw new Error("HTTPS redirects must remain https://");let s=await e(n.href,{redirect:"manual"});if(s.url!==""&&new URL(s.url).protocol!=="https:")throw new Error("HTTPS redirects must remain https://");if(!_8.has(s.status)){if(!s.ok)throw new Error(`HTTP ${s.status}`);return await s.text()}if(r>=YO)throw new Error(`too many HTTPS redirects (maximum ${YO})`);let o=s.headers.get("location");if(o===null)throw new Error(`HTTP ${s.status} redirect missing Location header`);n=new URL(o,n)}}var d8,tD,_8,YO,km=C(()=>{"use strict";Tt();he();KO();$r();Eo();Tf();d8=`usage: lmctl plan [directory] [options]
2622
+ `),0)}function HE(t,e,n,r){return{path:t,linted:e,seeded:n,members:r.map(s=>({alias:s.alias,provider:s.provider,...s.model!==void 0?{model:s.model}:{}}))}}async function ia(t,e,n){if(/^http:\/\//i.test(t))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(t))return _8(t,e);let r=BE(n,t);if(!QO(r))throw new Error(`source not found: ${t}`);if(!o8(r).isDirectory())return zO(r,"utf8");let o=s8(r).filter(i=>st(i));if(o.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(o.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return zO(eD(r,o[0]),"utf8")}async function _8(t,e){let n=new URL(t);for(let r=0;;r+=1){if(n.protocol!=="https:")throw new Error("HTTPS redirects must remain https://");let s=await e(n.href,{redirect:"manual"});if(s.url!==""&&new URL(s.url).protocol!=="https:")throw new Error("HTTPS redirects must remain https://");if(!h8.has(s.status)){if(!s.ok)throw new Error(`HTTP ${s.status}`);return await s.text()}if(r>=YO)throw new Error(`too many HTTPS redirects (maximum ${YO})`);let o=s.headers.get("location");if(o===null)throw new Error(`HTTP ${s.status} redirect missing Location header`);n=new URL(o,n)}}var c8,tD,h8,YO,km=C(()=>{"use strict";Tt();he();KO();$r();Eo();Tf();c8=`usage: lmctl plan [directory] [options]
2624
2623
 
2625
2624
  Generate an lmctl teamfile. With no config flags and a TTY, an interactive
2626
2625
  wizard completes missing information; complete flags run immediately.
@@ -2661,43 +2660,43 @@ Examples:
2661
2660
  lmctl plan ./backend --pattern 3 --provider claude --seed
2662
2661
  `,tD=`missing required flags for non-interactive plan:
2663
2662
  one of: --pattern <${wf}>, --member <Alias:provider[:model]>, or --from <file|dir|url>
2664
- plus: --provider <name> (required with --pattern)`;_8=new Set([301,302,303,307,308]),YO=10});var Am={};ye(Am,{extractSaveScriptFlags:()=>oD,performSaveScript:()=>iD,runWithSaveScript:()=>A8});import{existsSync as y8,mkdirSync as w8,renameSync as E8,writeFileSync as T8}from"node:fs";import{dirname as v8,extname as S8,join as b8}from"node:path";function oD(t,e,n={}){let r=[],s,o,i=!1;for(let c=0;c<t.length;c+=1){let d=t[c];if(d==="--save-script"){let u=t[c+1];if(u===void 0)return{rest:r,error:"--save-script requires a file path"};s=u,c+=1;continue}if(d==="--script"){let u=t[c+1];if(u===void 0)return{rest:r,error:"--script requires a name"};o=u,c+=1;continue}if(d==="--force"&&!n.ownsForce){i=!0;continue}r.push(d)}if(n.ownsForce&&(i=t.includes("--force")),s===void 0)return o!==void 0?{rest:r,error:"--script requires --save-script"}:{rest:r};let a=o??e;if(!sD.test(a))return{rest:r,error:`--script "${a}" must match ${sD} (letters, digits, ., _, -)`};let l=n.extension??".lms";return{rest:r,request:{destPath:s,slug:a,extension:l,force:i}}}function k8(t){let e=t.slice(0,512).trimStart().toLowerCase();return e.startsWith("<!doctype html")||e.startsWith("<html")}async function iD(t,e,n=fetch){let{destPath:r,slug:s,extension:o,force:i}=e;if(y8(r)&&!i)return t.stderr.write(`error: --save-script: ${r} already exists (use --force to overwrite)
2665
- `),1;let a=`${I8}/${s}${o}`,l;try{l=await ia(a,n,process.cwd())}catch(u){let f=u instanceof Error?u.message:String(u);return f==="HTTP 404"?t.stderr.write(`error: --save-script: no script is published at ${a} for this command
2663
+ plus: --provider <name> (required with --pattern)`;h8=new Set([301,302,303,307,308]),YO=10});var Am={};ye(Am,{extractSaveScriptFlags:()=>oD,performSaveScript:()=>iD,runWithSaveScript:()=>k8});import{existsSync as g8,mkdirSync as y8,renameSync as w8,writeFileSync as E8}from"node:fs";import{dirname as T8,extname as v8,join as S8}from"node:path";function oD(t,e,n={}){let r=[],s,o,i=!1;for(let c=0;c<t.length;c+=1){let d=t[c];if(d==="--save-script"){let u=t[c+1];if(u===void 0)return{rest:r,error:"--save-script requires a file path"};s=u,c+=1;continue}if(d==="--script"){let u=t[c+1];if(u===void 0)return{rest:r,error:"--script requires a name"};o=u,c+=1;continue}if(d==="--force"&&!n.ownsForce){i=!0;continue}r.push(d)}if(n.ownsForce&&(i=t.includes("--force")),s===void 0)return o!==void 0?{rest:r,error:"--script requires --save-script"}:{rest:r};let a=o??e;if(!sD.test(a))return{rest:r,error:`--script "${a}" must match ${sD} (letters, digits, ., _, -)`};let l=n.extension??".lms";return{rest:r,request:{destPath:s,slug:a,extension:l,force:i}}}function I8(t){let e=t.slice(0,512).trimStart().toLowerCase();return e.startsWith("<!doctype html")||e.startsWith("<html")}async function iD(t,e,n=fetch){let{destPath:r,slug:s,extension:o,force:i}=e;if(g8(r)&&!i)return t.stderr.write(`error: --save-script: ${r} already exists (use --force to overwrite)
2664
+ `),1;let a=`${b8}/${s}${o}`,l;try{l=await ia(a,n,process.cwd())}catch(u){let f=u instanceof Error?u.message:String(u);return f==="HTTP 404"?t.stderr.write(`error: --save-script: no script is published at ${a} for this command
2666
2665
  `):t.stderr.write(`error: --save-script: could not fetch ${a}: ${f}
2667
- `),1}if(S8(r).toLowerCase()!==o.toLowerCase()&&t.stderr.write(`warning: --save-script: ${r} does not end in "${o}", the extension lmctl.com actually serves for this command
2666
+ `),1}if(v8(r).toLowerCase()!==o.toLowerCase()&&t.stderr.write(`warning: --save-script: ${r} does not end in "${o}", the extension lmctl.com actually serves for this command
2668
2667
  `),l.trim().length===0)return t.stderr.write(`error: --save-script: ${a} returned an empty response
2669
- `),1;if(k8(l))return t.stderr.write(`error: --save-script: ${a} did not return a script (looks like an HTML page, not lmscript)
2670
- `),1;let c=v8(r);w8(c,{recursive:!0});let d=b8(c,`.save-script-${process.pid}-${Date.now()}.tmp`);return T8(d,l,"utf8"),E8(d,r),t.stdout.write(`Saved ${a} to ${r}
2671
- `),0}async function A8(t,e,n,r,s={}){let o=oD(n,e,s);if(o.error!==void 0)return t.stderr.write(`error: ${o.error}
2672
- `),2;let i=await r(o.rest);return i!==0||o.request===void 0?i:iD(t,o.request)}var I8,sD,Nm=C(()=>{"use strict";km();I8="https://lmctl.com/lmscript/commands",sD=/^[A-Za-z0-9._-]+$/});var kc,T_e,XE=C(()=>{"use strict";kc=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],T_e=kc.length});import{spawn as N8}from"node:child_process";async function lD(t,e,n){let r=R8.get(t);if(r===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of r.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return L8(r.name,s)}function L8(t,e){return t==="lmctl_chat"?C8(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function C8(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let n=typeof t.team=="string"?t.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["prompt",n,r,e];return $e()&&At(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),O8(s,process.cwd())}function O8(t,e){return new Promise(n=>{let r=!1,s,o=d=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(d))},i=N8("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=D8(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl prompt timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",d=>{l+=d.toString("utf8")}),i.stderr?.on("data",d=>{c+=d.toString("utf8")}),i.on("error",d=>{o({status:"error",code:1,message:`failed to spawn lmctl prompt: ${d.message}`})}),i.on("exit",d=>{if(d===0){$e()&&At(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2673
- `).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:d??1,message:c.trim()||`lmctl prompt exited with code ${d}`})})})}function D8(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return aD;let n=Number(e);return!Number.isFinite(n)||n<=0?aD:n}function qE(t,e=process.env){let r=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:x8),s=t.getConfig("api.token"),o=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:r,token:o}}var x8,aD,R8,GE=C(()=>{"use strict";XE();Ee();x8="http://127.0.0.1:8787",aD=30*60*1e3,R8=new Map(kc.map(t=>[t.name,t]))});async function U8(t,e){let n=t.id===void 0,r=t.id??null;if(t.method==="exit")return n||e.io.write(JE({jsonrpc:"2.0",id:r,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{protocolVersion:M8,capabilities:{tools:{listChanged:!1}},serverInfo:{name:$8,version:P8}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{tools:kc.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await lD(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return n?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:r,error:{code:-32601,message:`method not found: ${t.method}`}}}}function JE(t){return`${JSON.stringify(t)}
2674
- `}async function cD(t,e){let n=!1,r="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){t.io.write(JE({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await U8(l,t);c.kind==="response"?t.io.write(JE(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,i(u))},d=()=>{let u=r.indexOf(`
2668
+ `),1;if(I8(l))return t.stderr.write(`error: --save-script: ${a} did not return a script (looks like an HTML page, not lmscript)
2669
+ `),1;let c=T8(r);y8(c,{recursive:!0});let d=S8(c,`.save-script-${process.pid}-${Date.now()}.tmp`);return E8(d,l,"utf8"),w8(d,r),t.stdout.write(`Saved ${a} to ${r}
2670
+ `),0}async function k8(t,e,n,r,s={}){let o=oD(n,e,s);if(o.error!==void 0)return t.stderr.write(`error: ${o.error}
2671
+ `),2;let i=await r(o.rest);return i!==0||o.request===void 0?i:iD(t,o.request)}var b8,sD,Nm=C(()=>{"use strict";km();b8="https://lmctl.com/lmscript/commands",sD=/^[A-Za-z0-9._-]+$/});var kc,E_e,XE=C(()=>{"use strict";kc=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],E_e=kc.length});import{spawn as A8}from"node:child_process";async function lD(t,e,n){let r=x8.get(t);if(r===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of r.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return R8(r.name,s)}function R8(t,e){return t==="lmctl_chat"?L8(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function L8(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let n=typeof t.team=="string"?t.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["prompt",n,r,e];return $e()&&At(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),C8(s,process.cwd())}function C8(t,e){return new Promise(n=>{let r=!1,s,o=d=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(d))},i=A8("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=O8(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl prompt timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",d=>{l+=d.toString("utf8")}),i.stderr?.on("data",d=>{c+=d.toString("utf8")}),i.on("error",d=>{o({status:"error",code:1,message:`failed to spawn lmctl prompt: ${d.message}`})}),i.on("exit",d=>{if(d===0){$e()&&At(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2672
+ `).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:d??1,message:c.trim()||`lmctl prompt exited with code ${d}`})})})}function O8(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return aD;let n=Number(e);return!Number.isFinite(n)||n<=0?aD:n}function qE(t,e=process.env){let r=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:N8),s=t.getConfig("api.token"),o=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:r,token:o}}var N8,aD,x8,GE=C(()=>{"use strict";XE();Ee();N8="http://127.0.0.1:8787",aD=30*60*1e3,x8=new Map(kc.map(t=>[t.name,t]))});async function P8(t,e){let n=t.id===void 0,r=t.id??null;if(t.method==="exit")return n||e.io.write(JE({jsonrpc:"2.0",id:r,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{protocolVersion:D8,capabilities:{tools:{listChanged:!1}},serverInfo:{name:M8,version:$8}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{tools:kc.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await lD(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return n?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:r,error:{code:-32601,message:`method not found: ${t.method}`}}}}function JE(t){return`${JSON.stringify(t)}
2673
+ `}async function cD(t,e){let n=!1,r="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){t.io.write(JE({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await P8(l,t);c.kind==="response"?t.io.write(JE(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,i(u))},d=()=>{let u=r.indexOf(`
2675
2674
  `);for(;u!==-1;){let f=r.slice(0,u);r=r.slice(u+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),u=r.indexOf(`
2676
2675
  `)}};e.setEncoding("utf8"),e.on("data",u=>{r+=u,d()}),e.on("end",()=>{r.trim().length>0&&(a=a.then(()=>o(r))),a.finally(()=>c(0))}),e.on("error",u=>{t.io.log?.(`mcp: stdin error: ${u.message}
2677
- `),a.finally(()=>c(1))})})}var M8,$8,P8,dD=C(()=>{"use strict";XE();GE();M8="2025-06-18",$8="lmctl",P8="0.0.1"});var fD={};ye(fD,{runMcp:()=>j8});async function j8(t,e={stdout:process.stdout,stderr:process.stderr},n=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(F8),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
2678
- `),2;B({event:"mcp_bridge_start",pid:process.pid});let r=e.dal===void 0,s=e.dal??W8(),o=1;try{let i=s===void 0?qE({getConfig:()=>null},process.env):qE(s,process.env);return o=await cD({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},n),o}finally{B({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),r&&s!==void 0&&s.close()}}function W8(){let t=mt(),e=3;for(let n=1;n<=e;n+=1)try{return Ye({path:t})}catch(r){let s=r instanceof Error?r.message:String(r);if(B({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:n,db_path:t,error_message:s}),n<e&&uD(s))H8(50*n);else if(!uD(s))break}}function uD(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function H8(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var F8,mD=C(()=>{"use strict";Pt();GE();dD();Ee();Kn();F8=`usage: lmctl mcp
2676
+ `),a.finally(()=>c(1))})})}var D8,M8,$8,dD=C(()=>{"use strict";XE();GE();D8="2025-06-18",M8="lmctl",$8="0.0.1"});var fD={};ye(fD,{runMcp:()=>F8});async function F8(t,e={stdout:process.stdout,stderr:process.stderr},n=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(U8),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
2677
+ `),2;B({event:"mcp_bridge_start",pid:process.pid});let r=e.dal===void 0,s=e.dal??j8(),o=1;try{let i=s===void 0?qE({getConfig:()=>null},process.env):qE(s,process.env);return o=await cD({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},n),o}finally{B({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),r&&s!==void 0&&s.close()}}function j8(){let t=mt(),e=3;for(let n=1;n<=e;n+=1)try{return Ye({path:t})}catch(r){let s=r instanceof Error?r.message:String(r);if(B({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:n,db_path:t,error_message:s}),n<e&&uD(s))W8(50*n);else if(!uD(s))break}}function uD(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function W8(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var U8,mD=C(()=>{"use strict";Pt();GE();dD();Ee();Kn();U8=`usage: lmctl mcp
2679
2678
 
2680
2679
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2681
2680
  local config, then uses stdin/stdout for JSON-RPC frames.
2682
- `});function pD(t,e){if(t===void 0)return{date:void 0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let s=Number(n[1]),o=n[2],i=o==="s"?s:o==="m"?s*60:o==="h"?s*3600:s*86400;return{date:new Date(Date.now()-i*1e3)}}let r=Date.parse(t);return Number.isFinite(r)?{date:new Date(r)}:{error:`invalid ${e} "${t}" (expected ISO8601 or duration like 24h)`}}var hD=C(()=>{"use strict"});import{createHash as B8}from"node:crypto";function Ac(t){return`c1.${t.session}.${t.tsMs.toString(36)}.${t.fingerprint}.${t.occurrence}`}function yD(t){let e=/^c1\.([0-9a-f]{8})\.([0-9a-z]{1,12})\.([0-9a-f]{12})\.(\d{1,6})$/.exec(t);if(!e)return null;let n=Number.parseInt(e[2],36);return Number.isSafeInteger(n)?{session:e[1],tsMs:n,fingerprint:e[3],occurrence:Number(e[4])}:null}function xm(t,e){let n=gD(t),r=new Map;return e.map(s=>{let o=Date.parse(s.timestamp),i=X8(s),a=`${o}.${i}`,l=r.get(a)??0;return r.set(a,l+1),Ac({session:n,tsMs:Number.isNaN(o)?0:o,fingerprint:i,occurrence:l})})}function wD(t,e,n){if(n.session!==gD(t))return{reset:!0,messages:[],cursors:[]};let r=e.filter(a=>{let l=Date.parse(a.timestamp);return!Number.isNaN(l)&&l>=n.tsMs}),s=xm(t,r),o=Ac(n),i=s.indexOf(o);return i<0?{reset:!0,messages:[],cursors:[]}:{reset:!1,messages:r.slice(i+1),cursors:s.slice(i+1),current:r[i]}}var _D,gD,X8,ED=C(()=>{"use strict";_D=t=>B8("sha256").update(t).digest("hex"),gD=t=>_D(t).slice(0,8),X8=t=>_D(`${t.role}\0${t.timestamp}\0${t.toolCallId??""}\0${t.content}`).slice(0,12)});var CD={};ye(CD,{applyMaxBytes:()=>Cm,parseTailSince:()=>RD,renderMessage:()=>xD,runTail:()=>K8});async function K8(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${V8}
2681
+ `});function pD(t,e){if(t===void 0)return{date:void 0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let s=Number(n[1]),o=n[2],i=o==="s"?s:o==="m"?s*60:o==="h"?s*3600:s*86400;return{date:new Date(Date.now()-i*1e3)}}let r=Date.parse(t);return Number.isFinite(r)?{date:new Date(r)}:{error:`invalid ${e} "${t}" (expected ISO8601 or duration like 24h)`}}var hD=C(()=>{"use strict"});import{createHash as H8}from"node:crypto";function Ac(t){return`c1.${t.session}.${t.tsMs.toString(36)}.${t.fingerprint}.${t.occurrence}`}function yD(t){let e=/^c1\.([0-9a-f]{8})\.([0-9a-z]{1,12})\.([0-9a-f]{12})\.(\d{1,6})$/.exec(t);if(!e)return null;let n=Number.parseInt(e[2],36);return Number.isSafeInteger(n)?{session:e[1],tsMs:n,fingerprint:e[3],occurrence:Number(e[4])}:null}function xm(t,e){let n=gD(t),r=new Map;return e.map(s=>{let o=Date.parse(s.timestamp),i=B8(s),a=`${o}.${i}`,l=r.get(a)??0;return r.set(a,l+1),Ac({session:n,tsMs:Number.isNaN(o)?0:o,fingerprint:i,occurrence:l})})}function wD(t,e,n){if(n.session!==gD(t))return{reset:!0,messages:[],cursors:[]};let r=e.filter(a=>{let l=Date.parse(a.timestamp);return!Number.isNaN(l)&&l>=n.tsMs}),s=xm(t,r),o=Ac(n),i=s.indexOf(o);return i<0?{reset:!0,messages:[],cursors:[]}:{reset:!1,messages:r.slice(i+1),cursors:s.slice(i+1),current:r[i]}}var _D,gD,B8,ED=C(()=>{"use strict";_D=t=>H8("sha256").update(t).digest("hex"),gD=t=>_D(t).slice(0,8),B8=t=>_D(`${t.role}\0${t.timestamp}\0${t.toolCallId??""}\0${t.content}`).slice(0,12)});var CD={};ye(CD,{applyMaxBytes:()=>Cm,parseTailSince:()=>RD,renderMessage:()=>xD,runTail:()=>V8});async function V8(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${J8}
2683
2682
  `),0;let n=ce(t,["--lines","--limit","--max-bytes","--watch-interval","--provider","--session","--run","--since","--after"],["--watch","--help","--json","--tools"]);if(n.error!==void 0)return O(e,n.error);let r=z(n,"--json"),s=z(n,"--tools");if(F(n,"--session")!==void 0&&n.positionals.length>0)return e.stderr.write(`usage: --session cannot be combined with a positional target
2684
2683
  `),2;let o=F(n,"--after"),i=o===void 0?void 0:yD(o);if(o!==void 0){if(!i)return O(e,`invalid --after "${o.slice(0,80)}" (expected a cursor from lmctl tail --json)`);if(!r)return O(e,"--after requires --json");if(z(n,"--watch")||F(n,"--since")!==void 0||F(n,"--run")!==void 0)return O(e,"--after cannot be combined with --watch, --since or --run")}let a=F(n,"--since"),l=RD(a);if("error"in l)return O(e,l.error);let c=l.date,d=F(n,"--lines"),u=F(n,"--limit");if(d!==void 0&&u!==void 0)return O(e,"--lines and --limit are aliases; choose one");let f=d??u,m=F(n,"--max-bytes");if(r&&m!==void 0)return e.stderr.write(`usage: --json cannot be combined with --max-bytes; use --lines
2685
- `),2;if(f!==void 0&&m!==void 0)return O(e,"--lines and --max-bytes are mutually exclusive (choose one)");let p;if(f!==void 0){let v=Number.parseInt(f,10);if(!Number.isFinite(v)||v<1||String(v)!==f)return O(e,`invalid --lines "${f}" (expected a positive integer)`);p={kind:"lines",lines:v}}else{let v=m===void 0?G8:Number.parseInt(m,10);if(!Number.isFinite(v)||v<0||m!==void 0&&String(v)!==m)return O(e,`invalid --max-bytes "${m}" (expected a non-negative integer)`);p={kind:"bytes",maxBytes:v}}let _=z(n,"--watch"),h=F(n,"--watch-interval");if(h!==void 0&&!_)return e.stderr.write(`usage: --watch-interval requires --watch
2686
- `),2;let g=h===void 0?J8:Number.parseInt(h.replace(/s$/,""),10);if(!Number.isSafeInteger(g)||g<1||g>2147483||h!==void 0&&!/^[1-9][0-9]*s?$/.test(h))return O(e,`invalid --watch-interval "${h}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return O(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let w=F(n,"--run");if(w!==void 0){if(s)return O(e,"--tools applies only to provider sessions, not --run");if(n.positionals.length>0)return O(e,"--run is mutually exclusive with positional [target] [alias]");if(F(n,"--session")!==void 0)return O(e,"--run is mutually exclusive with --session");if(F(n,"--provider")!==void 0)return O(e,"--run is mutually exclusive with --provider");let v=Number.parseInt(w,10);if(!Number.isFinite(v)||v<=0||String(v)!==w)return O(e,`invalid --run "${w}" (expected a positive integer run id)`);try{return await G(e,async b=>Z8(e,b,v,p,_,g,c,r))}catch(b){return Tn(e,b)}}let y=Zn(q8,{target:n.positionals[0],alias:n.positionals[1],flags:{session:F(n,"--session"),provider:F(n,"--provider")}});if(y.mode==="error")return O(e,y.message);if(y.mode==="managed")return O(e,"tail managed mode requires --run <id>");let E;if(y.mode==="ai-team"){if(F(n,"--provider")!==void 0)return e.stderr.write(`usage: --provider applies only to raw sessions; teamfiles declare their provider
2687
- `),2;if(y.alias===void 0){let v;try{v=await G(e,I=>Qe(y.teamfile,I))}catch(I){return O(e,`tail: ${I instanceof Error?I.message:String(I)}`)}let b;try{b=Fe(v)}catch(I){return O(e,`tail: ${I instanceof Error?I.message:String(I)}`)}let k=li(b);if(k===void 0)return O(e,`tail: ${y.teamfile} has no Lead member; pass <tf>:<alias>`);try{let I=await G(e,N=>lt(y.teamfile,k.alias,N));E={provider:I.provider,sessionId:I.sessionid,cwd:I.sessiondir}}catch(I){return I instanceof De?O(e,I.message):Tn(e,I)}}else try{let v=await G(e,b=>lt(y.teamfile,y.alias,b));E={provider:v.provider,sessionId:v.sessionid,cwd:v.sessiondir}}catch(v){return v instanceof De?O(e,v.message):Tn(e,v)}}else{let v=y.sessionid,b=y.provider;if(b===void 0){let k=await Is(v);if(k.length===0)return O(e,`tail: session "${v}" not found in any provider store`);if(k.length>1)return O(e,`tail: session "${v}" matches multiple providers (${k.join(", ")}); pass --provider`);b=k[0]}E={provider:b,sessionId:v}}if(i)return Q8(e,E.provider,E.sessionId,i,p.kind==="lines"?p.lines:Y8,s);let T=await TD(e,E.provider,E.sessionId,p,-1,c,r,!_,s);return T===Rm?1:_?await new Promise(v=>{let b=async()=>{try{let N=await TD(e,E.provider,E.sessionId,p,T,c,r,!1,s);N!==Rm&&(T=N)}catch(N){e.stderr.write(`tail: ${N instanceof Error?N.message:String(N)}
2684
+ `),2;if(f!==void 0&&m!==void 0)return O(e,"--lines and --max-bytes are mutually exclusive (choose one)");let p;if(f!==void 0){let v=Number.parseInt(f,10);if(!Number.isFinite(v)||v<1||String(v)!==f)return O(e,`invalid --lines "${f}" (expected a positive integer)`);p={kind:"lines",lines:v}}else{let v=m===void 0?q8:Number.parseInt(m,10);if(!Number.isFinite(v)||v<0||m!==void 0&&String(v)!==m)return O(e,`invalid --max-bytes "${m}" (expected a non-negative integer)`);p={kind:"bytes",maxBytes:v}}let _=z(n,"--watch"),h=F(n,"--watch-interval");if(h!==void 0&&!_)return e.stderr.write(`usage: --watch-interval requires --watch
2685
+ `),2;let g=h===void 0?G8:Number.parseInt(h.replace(/s$/,""),10);if(!Number.isSafeInteger(g)||g<1||g>2147483||h!==void 0&&!/^[1-9][0-9]*s?$/.test(h))return O(e,`invalid --watch-interval "${h}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return O(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let w=F(n,"--run");if(w!==void 0){if(s)return O(e,"--tools applies only to provider sessions, not --run");if(n.positionals.length>0)return O(e,"--run is mutually exclusive with positional [target] [alias]");if(F(n,"--session")!==void 0)return O(e,"--run is mutually exclusive with --session");if(F(n,"--provider")!==void 0)return O(e,"--run is mutually exclusive with --provider");let v=Number.parseInt(w,10);if(!Number.isFinite(v)||v<=0||String(v)!==w)return O(e,`invalid --run "${w}" (expected a positive integer run id)`);try{return await G(e,async b=>Q8(e,b,v,p,_,g,c,r))}catch(b){return Tn(e,b)}}let y=Zn(X8,{target:n.positionals[0],alias:n.positionals[1],flags:{session:F(n,"--session"),provider:F(n,"--provider")}});if(y.mode==="error")return O(e,y.message);if(y.mode==="managed")return O(e,"tail managed mode requires --run <id>");let E;if(y.mode==="ai-team"){if(F(n,"--provider")!==void 0)return e.stderr.write(`usage: --provider applies only to raw sessions; teamfiles declare their provider
2686
+ `),2;if(y.alias===void 0){let v;try{v=await G(e,I=>Qe(y.teamfile,I))}catch(I){return O(e,`tail: ${I instanceof Error?I.message:String(I)}`)}let b;try{b=Fe(v)}catch(I){return O(e,`tail: ${I instanceof Error?I.message:String(I)}`)}let k=li(b);if(k===void 0)return O(e,`tail: ${y.teamfile} has no Lead member; pass <tf>:<alias>`);try{let I=await G(e,N=>lt(y.teamfile,k.alias,N));E={provider:I.provider,sessionId:I.sessionid,cwd:I.sessiondir}}catch(I){return I instanceof De?O(e,I.message):Tn(e,I)}}else try{let v=await G(e,b=>lt(y.teamfile,y.alias,b));E={provider:v.provider,sessionId:v.sessionid,cwd:v.sessiondir}}catch(v){return v instanceof De?O(e,v.message):Tn(e,v)}}else{let v=y.sessionid,b=y.provider;if(b===void 0){let k=await Is(v);if(k.length===0)return O(e,`tail: session "${v}" not found in any provider store`);if(k.length>1)return O(e,`tail: session "${v}" matches multiple providers (${k.join(", ")}); pass --provider`);b=k[0]}E={provider:b,sessionId:v}}if(i)return Y8(e,E.provider,E.sessionId,i,p.kind==="lines"?p.lines:z8,s);let T=await TD(e,E.provider,E.sessionId,p,-1,c,r,!_,s);return T===Rm?1:_?await new Promise(v=>{let b=async()=>{try{let N=await TD(e,E.provider,E.sessionId,p,T,c,r,!1,s);N!==Rm&&(T=N)}catch(N){e.stderr.write(`tail: ${N instanceof Error?N.message:String(N)}
2688
2687
  `)}},k=setInterval(()=>{b()},g*1e3),I=()=>{clearInterval(k),v(0)};process.once("SIGINT",I),process.once("SIGTERM",I)}):0}async function TD(t,e,n,r,s,o,i,a=!1,l=!1){let c;try{let p=r.kind==="lines"?r.lines:80;c=a?await Jg(n,e,p,o,l):await _t(n,e)}catch(p){return t.stderr.write(`tail: failed to load session: ${p instanceof Error?p.message:String(p)}
2689
2688
  `),Rm}if(c===null)return t.stderr.write(`tail: session not found: ${n} (provider=${e})
2690
2689
  `),Rm;let d=(c.messages??[]).filter(p=>l||p.role!=="tool_use"&&p.role!=="tool_result"),u=s<0&&r.kind==="lines"?Math.max(0,d.length-r.lines):s+1;if(s<0&&o!==void 0){let p=o.getTime(),_=d.length;for(let h=0;h<d.length;h+=1){let g=d[h].timestamp,w=g===void 0?NaN:(g instanceof Date?g:new Date(g)).getTime();if(!Number.isNaN(w)&&w>=p){_=h;break}}u=Math.max(u,_)}let f=s<0&&(u>0||c.captureStatus==="partial");if(u>=d.length)return i===!0&&s<0&&Y(t,{schema_version:aa,provider:e,sessionId:n,messages:[],truncated:f,next_cursor:d.length?xm(n,d.map(zE)).at(-1):null,usage_coverage:Lm(e,a)}),d.length-1;if(i===!0){let p=d.slice(u),_=KE(n,p,void 0,e,p.some(g=>g.usage?.length)?await VE(e,p):null),h={schema_version:aa,provider:e,sessionId:n,messages:_,truncated:f,next_cursor:_.at(-1)?.cursor??null,usage_coverage:Lm(e,a)};return Y(t,h),d.length-1}let m="";for(let p=u;p<d.length;p+=1)m+=`${xD(d[p])}
2691
- `;return t.stdout.write(r.kind==="bytes"?Cm(m,r.maxBytes):m),d.length-1}function Lm(t,e){return t==="claude"||t==="codex"?e?{state:"per_response",reason:null}:{state:"unavailable",reason:"per-response usage is read only by the bounded tail reader (not with --watch)"}:{state:"unavailable",reason:{agy:"agy records token counts only in its protobuf conversation database, not in the transcript lmctl tail reads",kimi:"kimi records usage per step in its wire file, which lmctl tail does not read yet",gemini:"lmctl tail does not read per-response usage from gemini sessions",ClaudeMock:"the mock provider records no token usage"}[t]??`lmctl tail does not read per-response usage from ${t} transcripts`}}async function VE(t,e){let n=e.flatMap(r=>(r.usage??[]).map(s=>s.model)).filter(r=>!!r).map(r=>[t,r]);return e.some(r=>r.usage?.length)?eN(n):null}function KE(t,e,n=xm(t,e.map(zE)),r,s=null){return e.map((o,i)=>({role:o.role,content:o.content,model:o.model??null,timestamp:AD(o.timestamp),...o.toolName?{toolName:o.toolName}:{},...o.toolCallId?{toolCallId:o.toolCallId}:{},cursor:n[i],...r?ND(r,o,s):{}}))}async function Q8(t,e,n,r,s,o){let i=async(a,l)=>{let c=await Jg(n,e,a,l,o);if(c===null)throw new Error(`session not found: ${n} (provider=${e})`);return(c.messages??[]).filter(d=>o||d.role!=="tool_use"&&d.role!=="tool_result")};try{let a=await i(z8,new Date(r.tsMs)),l=wD(n,a.map(f=>({...zE(f),m:f})),r);if(!l.reset){let f=l.messages.map(w=>w.m),m=l.current?.m,p=await VE(e,m?[m,...f]:f),_=KE(n,f,l.cursors,e,p),h=m?ND(e,m,p):{},g="usage"in h&&h.usage&&h.cost?[{cursor:Ac(r),usage:h.usage,cost:h.cost}]:[];return Y(t,{schema_version:aa,provider:e,sessionId:n,messages:_,truncated:!1,next_cursor:_.at(-1)?.cursor??l.cursors.at(-1)??Ac(r),reset:!1,usage_coverage:Lm(e,!0),...g.length?{updates:g}:{}}),0}let c=await i(s),d=c.slice(-s),u=KE(n,d,void 0,e,await VE(e,d));return Y(t,{schema_version:aa,provider:e,sessionId:n,messages:u,truncated:c.length>d.length||d.length===s,next_cursor:u.at(-1)?.cursor??null,reset:!0,usage_coverage:Lm(e,!0)}),0}catch(a){return t.stderr.write(`tail: ${a instanceof Error&&/^session not found/.test(a.message)?a.message:`failed to load session: ${a instanceof Error?a.message:String(a)}`}
2690
+ `;return t.stdout.write(r.kind==="bytes"?Cm(m,r.maxBytes):m),d.length-1}function Lm(t,e){return t==="claude"||t==="codex"?e?{state:"per_response",reason:null}:{state:"unavailable",reason:"per-response usage is read only by the bounded tail reader (not with --watch)"}:{state:"unavailable",reason:{agy:"agy records token counts only in its protobuf conversation database, not in the transcript lmctl tail reads",kimi:"kimi records usage per step in its wire file, which lmctl tail does not read yet",gemini:"lmctl tail does not read per-response usage from gemini sessions",ClaudeMock:"the mock provider records no token usage"}[t]??`lmctl tail does not read per-response usage from ${t} transcripts`}}async function VE(t,e){let n=e.flatMap(r=>(r.usage??[]).map(s=>s.model)).filter(r=>!!r).map(r=>[t,r]);return e.some(r=>r.usage?.length)?eN(n):null}function KE(t,e,n=xm(t,e.map(zE)),r,s=null){return e.map((o,i)=>({role:o.role,content:o.content,model:o.model??null,timestamp:AD(o.timestamp),...o.toolName?{toolName:o.toolName}:{},...o.toolCallId?{toolCallId:o.toolCallId}:{},cursor:n[i],...r?ND(r,o,s):{}}))}async function Y8(t,e,n,r,s,o){let i=async(a,l)=>{let c=await Jg(n,e,a,l,o);if(c===null)throw new Error(`session not found: ${n} (provider=${e})`);return(c.messages??[]).filter(d=>o||d.role!=="tool_use"&&d.role!=="tool_result")};try{let a=await i(K8,new Date(r.tsMs)),l=wD(n,a.map(f=>({...zE(f),m:f})),r);if(!l.reset){let f=l.messages.map(w=>w.m),m=l.current?.m,p=await VE(e,m?[m,...f]:f),_=KE(n,f,l.cursors,e,p),h=m?ND(e,m,p):{},g="usage"in h&&h.usage&&h.cost?[{cursor:Ac(r),usage:h.usage,cost:h.cost}]:[];return Y(t,{schema_version:aa,provider:e,sessionId:n,messages:_,truncated:!1,next_cursor:_.at(-1)?.cursor??l.cursors.at(-1)??Ac(r),reset:!1,usage_coverage:Lm(e,!0),...g.length?{updates:g}:{}}),0}let c=await i(s),d=c.slice(-s),u=KE(n,d,void 0,e,await VE(e,d));return Y(t,{schema_version:aa,provider:e,sessionId:n,messages:u,truncated:c.length>d.length||d.length===s,next_cursor:u.at(-1)?.cursor??null,reset:!0,usage_coverage:Lm(e,!0)}),0}catch(a){return t.stderr.write(`tail: ${a instanceof Error&&/^session not found/.test(a.message)?a.message:`failed to load session: ${a instanceof Error?a.message:String(a)}`}
2692
2691
  `),1}}function xD(t){let e=LD(t.timestamp),n=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
2693
2692
  `).replace(/\r/g,`
2694
2693
  `).split(`
2695
2694
  `),o=s[0]??"",i=s.slice(1);return i.length===0?`${n}: ${o}`:`${n}: ${o}
2696
2695
  ${i.map(a=>` ${a}`).join(`
2697
- `)}`}function vD(t){return t.map(e=>({id:e.id,kind:e.kind,step_id:e.step_id,timestamp:new Date(e.timestamp_ms).toISOString(),payload:e.payload}))}async function Z8(t,e,n,r,s,o,i,a){if(e.getRun(n)===null)return O(t,`tail: run ${n}: not found`);let c=i===void 0?e.listSessionEvents(n):e.listSessionEvents(n).filter(f=>f.timestamp_ms>=i.getTime()),d=r.kind==="lines"?c.slice(Math.max(0,c.length-r.lines)):c;if(a===!0)Y(t,{schema_version:aa,run_id:n,truncated:d.length<c.length,events:vD(d)});else{let f=d.map(m=>`${ID(m)}
2696
+ `)}`}function vD(t){return t.map(e=>({id:e.id,kind:e.kind,step_id:e.step_id,timestamp:new Date(e.timestamp_ms).toISOString(),payload:e.payload}))}async function Q8(t,e,n,r,s,o,i,a){if(e.getRun(n)===null)return O(t,`tail: run ${n}: not found`);let c=i===void 0?e.listSessionEvents(n):e.listSessionEvents(n).filter(f=>f.timestamp_ms>=i.getTime()),d=r.kind==="lines"?c.slice(Math.max(0,c.length-r.lines)):c;if(a===!0)Y(t,{schema_version:aa,run_id:n,truncated:d.length<c.length,events:vD(d)});else{let f=d.map(m=>`${ID(m)}
2698
2697
  `).join("");t.stdout.write(r.kind==="bytes"?Cm(f,r.maxBytes):f)}let u=c.length>0?c[c.length-1].id:0;return s?await new Promise(f=>{let p=setInterval(()=>{try{let h=e.listSessionEvents(n,u);if(h.length===0)return;for(let w of h)u=w.id;if(a===!0){Y(t,{schema_version:aa,run_id:n,truncated:!1,events:vD(h)});return}let g=h.map(w=>`${ID(w)}
2699
2698
  `).join("");t.stdout.write(r.kind==="bytes"?Cm(g,r.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2700
- `)}},o*1e3),_=()=>{clearInterval(p),f(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}function Cm(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(SD,"utf8");if(r>=e)return bD(t,e);let s=e-r,o=bD(t,s);return`${SD}${o}`}function bD(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function ID(t){let e=LD(new Date(t.timestamp_ms))??"",n="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(n=`alias=${o.alias}`),typeof o.provider=="string"&&(n+=`${n?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(n+=`${n?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(n+=`${n?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function RD(t){return pD(t,"--since")}function LD(t){if(t===void 0)return;let e=(0,kD.formatLocalTimestamp)(t);return e==="unknown"?void 0:e}var kD,q8,G8,J8,aa,V8,Rm,z8,Y8,AD,zE,ND,SD,OD=C(()=>{"use strict";Fn();kD=pn(rn(),1);he();Nt();Tt();Qn();hD();ED();jg();Hg();q8={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},G8=4096,J8=2,aa=1,V8=`usage: lmctl tail [target] [alias]
2699
+ `)}},o*1e3),_=()=>{clearInterval(p),f(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}function Cm(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(SD,"utf8");if(r>=e)return bD(t,e);let s=e-r,o=bD(t,s);return`${SD}${o}`}function bD(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function ID(t){let e=LD(new Date(t.timestamp_ms))??"",n="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(n=`alias=${o.alias}`),typeof o.provider=="string"&&(n+=`${n?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(n+=`${n?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(n+=`${n?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function RD(t){return pD(t,"--since")}function LD(t){if(t===void 0)return;let e=(0,kD.formatLocalTimestamp)(t);return e==="unknown"?void 0:e}var kD,X8,q8,G8,aa,J8,Rm,K8,z8,AD,zE,ND,SD,OD=C(()=>{"use strict";Fn();kD=pn(rn(),1);he();Nt();Tt();Qn();hD();ED();jg();Hg();X8={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},q8=4096,G8=2,aa=1,J8=`usage: lmctl tail [target] [alias]
2701
2700
  lmctl tail --session <id> [--provider <name>]
2702
2701
  lmctl tail --run <id>
2703
2702
  [--lines N | --limit N | --max-bytes N] [--since <duration|ISO8601>]
@@ -2729,8 +2728,8 @@ nothing new prints no line at all, same as text mode. --tools includes bounded t
2729
2728
  Cursors (--json): every message carries \`cursor\` and the payload \`next_cursor\`; --after <cursor> (with --json, not
2730
2729
  with --watch, --since or --run) prints only the messages after it with the next \`next_cursor\`, read cheaply from
2731
2730
  the end of the transcript. \`reset: true\` means the cursor's message is gone (truncated or rotated transcript, or
2732
- more new messages than one window of --lines, default 50): \`messages\` is then the latest window, shown afresh.`;Rm=-2;z8=500,Y8=50,AD=t=>(t instanceof Date?t:new Date(t)).toISOString(),zE=t=>({role:t.role,content:t.content??"",timestamp:AD(t.timestamp),...t.toolCallId?{toolCallId:t.toolCallId}:{}});ND=(t,e,n)=>e.usage?.length&&n?{usage:tN(e.usage),cost:nN(t,e.usage,n)}:{};SD=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2733
- `});var $D={};ye($D,{isSeedAck:()=>qh,isSeedPrompt:()=>tl,runExport:()=>t3,trimExportSeedExchange:()=>MD});function e3(t){return Ss().some(e=>e.name===t)}function MD(t){let e=t.messages.findIndex(i=>i.role==="user");if(e===-1||!tl(t.messages[e].content))return;let n=-1,r=!1;for(let i=e+1;i<t.messages.length;i++){let a=t.messages[i].role;if(a==="user")break;if(a==="assistant"){n=i;break}a!=="thinking"&&(r=!0)}let s=!1;n!==-1&&!r&&qh(t.messages[n].content)&&(s=!0),s?t.messages.splice(e,n-e+1):t.messages.splice(e,1),Array.isArray(t.userPrompts)&&t.userPrompts.length>0&&tl(t.userPrompts[0])&&t.userPrompts.shift(),t.messageCount=t.messages.filter(i=>i.role==="user"||i.role==="assistant").length;let o=t.messages.filter(i=>i.role==="user");o.length>0?(t.firstUserMessage=te(o[0].content.trim(),80),t.lastUserMessage=te(o[o.length-1].content.trim(),80)):(t.firstUserMessage=void 0,t.lastUserMessage=void 0)}async function t3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(DD),0;let n=ce(t,["--provider"],["--prompt-only","--json"]);if(n.error!==void 0)return O(e,n.error);let r=z(n,"--json"),s=z(n,"--prompt-only");if(r&&s)return O(e,"export: --prompt-only cannot be combined with --json");let o=F(n,"--provider"),i=n.positionals.length===1&&o!==void 0,a=n.positionals.length===2&&o===void 0;if(!i&&!a)return O(e,DD.trimEnd());let l,c;if(i){if(l=n.positionals[0],c=o,!e3(c))return O(e,`export: provider is not registered: ${c}`)}else l="",c="";let d;if(a){try{d=lt(n.positionals[0],n.positionals[1],e.dal)}catch(m){return m instanceof De?O(e,m.message):Tn(e,m)}l=d.sessionid,c=d.provider}let u;try{u=await _t(l,c)}catch(m){return O(e,`export: failed to load session: ${m instanceof Error?m.message:String(m)}`)}if(u===null)return O(e,`export: session not found: ${l} (provider=${c})`);if(MD(u),r)return Y(e,u),0;let f=[];if(s){let m=u.userPrompts??u.messages.filter(p=>p.role==="user").map(p=>p.content);for(let p of m){if(tl(p)||p.trimStart().replace(/^["']/u,"").startsWith("lmctl seed initial connection only. Create or pin this provider session, then stop."))continue;let _=p.split(/\r\n|[\r\n\u2028\u2029]/u).map(h=>h.trim()).filter(Boolean).join(" ");_!==""&&f.push(_)}}else for(let m of u.messages)m.role!=="user"&&m.role!=="assistant"||m.content.trim()!==""&&f.push(`${m.role}:
2731
+ more new messages than one window of --lines, default 50): \`messages\` is then the latest window, shown afresh.`;Rm=-2;K8=500,z8=50,AD=t=>(t instanceof Date?t:new Date(t)).toISOString(),zE=t=>({role:t.role,content:t.content??"",timestamp:AD(t.timestamp),...t.toolCallId?{toolCallId:t.toolCallId}:{}});ND=(t,e,n)=>e.usage?.length&&n?{usage:tN(e.usage),cost:nN(t,e.usage,n)}:{};SD=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2732
+ `});var $D={};ye($D,{isSeedAck:()=>qh,isSeedPrompt:()=>tl,runExport:()=>e3,trimExportSeedExchange:()=>MD});function Z8(t){return Ss().some(e=>e.name===t)}function MD(t){let e=t.messages.findIndex(i=>i.role==="user");if(e===-1||!tl(t.messages[e].content))return;let n=-1,r=!1;for(let i=e+1;i<t.messages.length;i++){let a=t.messages[i].role;if(a==="user")break;if(a==="assistant"){n=i;break}a!=="thinking"&&(r=!0)}let s=!1;n!==-1&&!r&&qh(t.messages[n].content)&&(s=!0),s?t.messages.splice(e,n-e+1):t.messages.splice(e,1),Array.isArray(t.userPrompts)&&t.userPrompts.length>0&&tl(t.userPrompts[0])&&t.userPrompts.shift(),t.messageCount=t.messages.filter(i=>i.role==="user"||i.role==="assistant").length;let o=t.messages.filter(i=>i.role==="user");o.length>0?(t.firstUserMessage=te(o[0].content.trim(),80),t.lastUserMessage=te(o[o.length-1].content.trim(),80)):(t.firstUserMessage=void 0,t.lastUserMessage=void 0)}async function e3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(DD),0;let n=ce(t,["--provider"],["--prompt-only","--json"]);if(n.error!==void 0)return O(e,n.error);let r=z(n,"--json"),s=z(n,"--prompt-only");if(r&&s)return O(e,"export: --prompt-only cannot be combined with --json");let o=F(n,"--provider"),i=n.positionals.length===1&&o!==void 0,a=n.positionals.length===2&&o===void 0;if(!i&&!a)return O(e,DD.trimEnd());let l,c;if(i){if(l=n.positionals[0],c=o,!Z8(c))return O(e,`export: provider is not registered: ${c}`)}else l="",c="";let d;if(a){try{d=lt(n.positionals[0],n.positionals[1],e.dal)}catch(m){return m instanceof De?O(e,m.message):Tn(e,m)}l=d.sessionid,c=d.provider}let u;try{u=await _t(l,c)}catch(m){return O(e,`export: failed to load session: ${m instanceof Error?m.message:String(m)}`)}if(u===null)return O(e,`export: session not found: ${l} (provider=${c})`);if(MD(u),r)return Y(e,u),0;let f=[];if(s){let m=u.userPrompts??u.messages.filter(p=>p.role==="user").map(p=>p.content);for(let p of m){if(tl(p)||p.trimStart().replace(/^["']/u,"").startsWith("lmctl seed initial connection only. Create or pin this provider session, then stop."))continue;let _=p.split(/\r\n|[\r\n\u2028\u2029]/u).map(h=>h.trim()).filter(Boolean).join(" ");_!==""&&f.push(_)}}else for(let m of u.messages)m.role!=="user"&&m.role!=="assistant"||m.content.trim()!==""&&f.push(`${m.role}:
2734
2733
  ${m.content}`);return f.length>0&&e.stdout.write(`${f.join(`
2735
2734
 
2736
2735
  `)}
@@ -2747,11 +2746,11 @@ unclassified user-role records are omitted in this compact mode.
2747
2746
  --json emits the complete normalized session data (messages, userPrompts
2748
2747
  where recorded, token totals; turns/responses where recorded), for
2749
2748
  tracked and provider-qualified session targets.
2750
- `});var XD={};ye(XD,{queryUsage:()=>HD,runUsage:()=>s3});import{existsSync as n3}from"node:fs";function FD(t){if(!/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})?)?$/.test(t))throw new Error(`invalid ISO date: ${t}`);let e=t.slice(0,10);if(new Date(e+"T00:00:00Z").toISOString().slice(0,10)!==e)throw new Error(`invalid ISO date: ${t}`);let n=t.length===10?t+"T00:00:00Z":/Z$|[+-]\d{2}:\d{2}$/.test(t)?t:t+"Z",r=new Date(n);if(!Number.isFinite(r.getTime()))throw new Error(`invalid ISO date: ${t}`);return r.toISOString()}function HD(t,e,n,r){let s=WD[r],o=r==="team"||r==="alias"?`CASE WHEN is_direct THEN '(direct)' ELSE COALESCE(${s},'(unknown)') END`:`COALESCE(${s},'(unknown)')`,i="FROM turn_usage WHERE started_at >= ? AND started_at < ?",a=t.prepare(`SELECT ${o} AS key,${jD} ${i} GROUP BY ${o} ORDER BY key`).all(e,n),l=t.prepare(`SELECT 'total' AS key,${jD} ${i}`).get(e,n),c={usage:{},cost:{}};for(let[d,u,f]of[["usage","usage_reason","usage_source IS NULL"],["cost","cost_reason","cost_usd IS NULL"]]){let m=t.prepare("SELECT COALESCE("+u+",'not_recorded') AS reason,COUNT(*) AS turns "+i+" AND "+f+" GROUP BY reason ORDER BY reason").all(e,n);for(let p of m)c[d][p.reason]=p.turns}return{groups:a,total:l.turns===0?BD():l,reasons:c}}function BD(){return{key:"total",turns:0,input:0,cacheRead:0,cacheWrite:0,output:0,costUsd:null,cacheHitPercent:null,unknownUsageCount:0,unknownCostCount:0}}function r3(t){let e=t.map(s=>s.split(/[\\/]/).filter(Boolean)),n=t.map(()=>1),r=e.map((s,o)=>s.at(-1)??t[o]);for(;;){let s=new Map;for(let i of r)s.set(i,(s.get(i)??0)+1);let o=!1;for(let i=0;i<r.length;i++)(s.get(r[i])??0)>1&&n[i]<e[i].length&&(n[i]++,r[i]=e[i].slice(-n[i]).join("/"),o=!0);if(!o){for(let i=0;i<r.length;i++)(s.get(r[i])??0)>1&&(r[i]=t[i]);return r}}}async function s3(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(UD),0;let n=ce(t,["--since","--until","--by"]),r,s,o;try{if(n.error)throw new Error(n.error);if(n.positionals.length)throw new Error("usage takes no positional arguments");let a=new Date;if(r=FD(String(n.flags["--since"]??new Date(a.getTime()-7*864e5).toISOString())),s=FD(String(n.flags["--until"]??a.toISOString())),r>=s)throw new Error("--since must be earlier than --until");let l=String(n.flags["--by"]??"day");if(!Object.hasOwn(WD,l))throw new Error(`invalid --by: ${l}`);o=l}catch(a){return e.stderr.write(`error: ${a instanceof Error?a.message:String(a)}
2751
- ${UD}`),2}let i;try{let a={groups:[],total:BD(),reasons:{usage:{},cost:{}}},l=Pe(e);if(n3(l)&&(i=gr(l),i.prepare("SELECT 1 FROM sqlite_master WHERE type='view' AND name='turn_usage'").get()&&(a=HD(i,r,s,o))),n.flags["--json"])e.stdout.write(JSON.stringify({schema_version:1,since:r,until:s,by:o,...a})+`
2749
+ `});var XD={};ye(XD,{queryUsage:()=>HD,runUsage:()=>r3});import{existsSync as t3}from"node:fs";function FD(t){if(!/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})?)?$/.test(t))throw new Error(`invalid ISO date: ${t}`);let e=t.slice(0,10);if(new Date(e+"T00:00:00Z").toISOString().slice(0,10)!==e)throw new Error(`invalid ISO date: ${t}`);let n=t.length===10?t+"T00:00:00Z":/Z$|[+-]\d{2}:\d{2}$/.test(t)?t:t+"Z",r=new Date(n);if(!Number.isFinite(r.getTime()))throw new Error(`invalid ISO date: ${t}`);return r.toISOString()}function HD(t,e,n,r){let s=WD[r],o=r==="team"||r==="alias"?`CASE WHEN is_direct THEN '(direct)' ELSE COALESCE(${s},'(unknown)') END`:`COALESCE(${s},'(unknown)')`,i="FROM turn_usage WHERE started_at >= ? AND started_at < ?",a=t.prepare(`SELECT ${o} AS key,${jD} ${i} GROUP BY ${o} ORDER BY key`).all(e,n),l=t.prepare(`SELECT 'total' AS key,${jD} ${i}`).get(e,n),c={usage:{},cost:{}};for(let[d,u,f]of[["usage","usage_reason","usage_source IS NULL"],["cost","cost_reason","cost_usd IS NULL"]]){let m=t.prepare("SELECT COALESCE("+u+",'not_recorded') AS reason,COUNT(*) AS turns "+i+" AND "+f+" GROUP BY reason ORDER BY reason").all(e,n);for(let p of m)c[d][p.reason]=p.turns}return{groups:a,total:l.turns===0?BD():l,reasons:c}}function BD(){return{key:"total",turns:0,input:0,cacheRead:0,cacheWrite:0,output:0,costUsd:null,cacheHitPercent:null,unknownUsageCount:0,unknownCostCount:0}}function n3(t){let e=t.map(s=>s.split(/[\\/]/).filter(Boolean)),n=t.map(()=>1),r=e.map((s,o)=>s.at(-1)??t[o]);for(;;){let s=new Map;for(let i of r)s.set(i,(s.get(i)??0)+1);let o=!1;for(let i=0;i<r.length;i++)(s.get(r[i])??0)>1&&n[i]<e[i].length&&(n[i]++,r[i]=e[i].slice(-n[i]).join("/"),o=!0);if(!o){for(let i=0;i<r.length;i++)(s.get(r[i])??0)>1&&(r[i]=t[i]);return r}}}async function r3(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(UD),0;let n=ce(t,["--since","--until","--by"]),r,s,o;try{if(n.error)throw new Error(n.error);if(n.positionals.length)throw new Error("usage takes no positional arguments");let a=new Date;if(r=FD(String(n.flags["--since"]??new Date(a.getTime()-7*864e5).toISOString())),s=FD(String(n.flags["--until"]??a.toISOString())),r>=s)throw new Error("--since must be earlier than --until");let l=String(n.flags["--by"]??"day");if(!Object.hasOwn(WD,l))throw new Error(`invalid --by: ${l}`);o=l}catch(a){return e.stderr.write(`error: ${a instanceof Error?a.message:String(a)}
2750
+ ${UD}`),2}let i;try{let a={groups:[],total:BD(),reasons:{usage:{},cost:{}}},l=Pe(e);if(t3(l)&&(i=gr(l),i.prepare("SELECT 1 FROM sqlite_master WHERE type='view' AND name='turn_usage'").get()&&(a=HD(i,r,s,o))),n.flags["--json"])e.stdout.write(JSON.stringify({schema_version:1,since:r,until:s,by:o,...a})+`
2752
2751
  `);else{a.groups.length||e.stdout.write(`no usage recorded yet
2753
2752
  `),e.stdout.write("Period (UTC): "+r+" <= started_at < "+s+`
2754
- `);let c=new Intl.NumberFormat("en-US"),d=h=>h===null?"(unknown)":c.format(h),u=["group","turns","input","cache-read","cache-write","output","cost-USD","cache-hit-%","unknown-usage","unknown-cost"],f=a.groups.map(h=>h.key),m=[...o==="team"?r3(f):f,"total"],p=[u,...[...a.groups,a.total].map((h,g)=>[m[g],d(h.turns),d(h.input),d(h.cacheRead),d(h.cacheWrite),d(h.output),h.costUsd===null?"(unknown)":h.costUsd.toFixed(6),h.cacheHitPercent===null?"(unknown)":h.cacheHitPercent.toFixed(2),d(h.unknownUsageCount),d(h.unknownCostCount)])],_=u.map((h,g)=>Math.max(...p.map(w=>w[g].length)));for(let h of p)e.stdout.write(h.map((g,w)=>w===0?g.padEnd(_[w]):g.padStart(_[w])).join(" ")+`
2753
+ `);let c=new Intl.NumberFormat("en-US"),d=h=>h===null?"(unknown)":c.format(h),u=["group","turns","input","cache-read","cache-write","output","cost-USD","cache-hit-%","unknown-usage","unknown-cost"],f=a.groups.map(h=>h.key),m=[...o==="team"?n3(f):f,"total"],p=[u,...[...a.groups,a.total].map((h,g)=>[m[g],d(h.turns),d(h.input),d(h.cacheRead),d(h.cacheWrite),d(h.output),h.costUsd===null?"(unknown)":h.costUsd.toFixed(6),h.cacheHitPercent===null?"(unknown)":h.cacheHitPercent.toFixed(2),d(h.unknownUsageCount),d(h.unknownCostCount)])],_=u.map((h,g)=>Math.max(...p.map(w=>w[g].length)));for(let h of p)e.stdout.write(h.map((g,w)=>w===0?g.padEnd(_[w]):g.padStart(_[w])).join(" ")+`
2755
2754
  `);for(let[h,g]of Object.entries(a.reasons)){let w=Object.entries(g).map(([y,E])=>y+"="+c.format(E)).join(", ");w&&e.stdout.write("Unknown "+h+" reasons: "+w+`
2756
2755
  `)}}return 0}catch(a){return e.stderr.write(`error: cannot read usage: ${a instanceof Error?a.message:String(a)}
2757
2756
  `),1}finally{i?.close()}}var WD,UD,jD,qD=C(()=>{"use strict";ha();he();WD={day:"day",provider:"provider",model:"model",team:"team",alias:"alias",session:"native_session_id",dir:"cwd"},UD=`usage: lmctl usage [--since D] [--until D] [--by day|provider|model|team|alias|session|dir] [--json]
@@ -2767,7 +2766,7 @@ Model keys use reported names first; alias-like keys mean the model was not repo
2767
2766
  SUM(cost_usd) AS costUsd,
2768
2767
  100.0*SUM(CASE WHEN usage_source IS NOT NULL THEN COALESCE(tok_cache_read,0) ELSE 0 END)
2769
2768
  /NULLIF(SUM(CASE WHEN usage_source IS NOT NULL THEN COALESCE(tok_input_uncached,0)+COALESCE(tok_cache_read,0)+COALESCE(tok_cache_write,0) ELSE 0 END),0) AS cacheHitPercent,
2770
- COALESCE(SUM(usage_source IS NULL),0) AS unknownUsageCount, COALESCE(SUM(cost_usd IS NULL),0) AS unknownCostCount`});var KD={};ye(KD,{FIRST_PARTY_DEEPSEEK_MODELS:()=>GD,buildCostPayload:()=>JD,getSummaryDays:()=>VD,normalizeModelId:()=>Om,runCost:()=>u3});import{existsSync as o3}from"node:fs";function Om(t){return t.trim().toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function a3(t,e,n,r){let s=new Set,o=[];for(let i of e){let a=n===null?null:cd(t,i,n,r),l=a?.kind==="priced"||a?.kind==="estimated"?`id:${a.model.normalizedId}`:a?.kind==="known-unpriced"?`id:${a.id}`:`raw:${i.trim().toLowerCase()}`;s.has(l)||(s.add(l),o.push(i))}return o}async function JD(t,e,n){let r=[...new Set([...n.messages.map(A=>A.model),...(n.responses??[]).map(A=>A.model??void 0)].filter(A=>A!==void 0&&A!=="<synthetic>"))],s=[...n.messages].reverse().find(A=>A.model!==void 0&&A.model!=="<synthetic>")?.model,o=n.model??s??null,i=Vr(n.responses??[],n.captureStatus!=="partial"),a=t==="gemini"&&(n.totalOutputTokens!==void 0||n.totalReasoningOutputTokens!==void 0)?(n.totalOutputTokens??0)+(n.totalReasoningOutputTokens??0):n.totalOutputTokens??null,l={input:n.responses?i.input_uncached:n.totalInputTokens??null,output:n.responses?i.output:a,cachedInput:n.responses?i.input_cached:n.totalCachedInputTokens??null},c=await Dt(),d=a3(t,r,c.catalog,c.aliases),u=n.responses===void 0&&d.length>1,f="unavailable",m=null,p=null,_=null,h=null,g=!1,w=null,y=null;if(o!==null&&c.catalog!==null){let A=Mt(t,o,c.catalog,c.aliases);if(f=A.state.kind,A.offer!==null)y=A.offer.pricing,m=A.offer.route,p=A.offer.source,_=A.offer.sourceModelId,h=A.provenance,g=A.offer.estimated;else switch(A.state.kind){case"unresolved":w=`alias "${A.state.alias}" is deliberately unresolved in the lmprice alias table`;break;case"known-unpriced":w=`"${A.state.id}" is a known model with no published price row`;break;case"unknown":w=`model "${o}" not found in lmprice catalog for provider "${t}"`;break;case"wrong-provider":w=`model "${o}" is not offered by provider "${t}" (found under: ${A.state.otherProviders.join(", ")})`;break;default:w=`no lmprice catalog coverage for provider "${t}"`;break}}else o!==null&&(w="lmprice catalog unavailable");let E=y===null?null:{inputPer1m:y.input_per_1m_tokens,outputPer1m:y.output_per_1m_tokens,cachedInputPer1m:y.input_cache_read_per_1m_tokens},T=l.cachedInput??0,v=n.totalCacheWriteInputTokens??0,b=["claude","codex","gemini","qwen","copilot"].includes(t),k=l.input===null?null:Math.max(0,l.input-(b?T:0)-(t==="claude"||t==="copilot"?v:0)),I=l.input===null||l.output===null?null:Ca({input:k,output:l.output,cachedInput:T,...v>0?{cacheWrite:v,...n.totalCacheWrite5mInputTokens===void 0?{}:{cacheWrite5m:n.totalCacheWrite5mInputTokens},...n.totalCacheWrite1hInputTokens===void 0?{}:{cacheWrite1h:n.totalCacheWrite1hInputTokens}}:{}},y);if(I===null&&T>0&&y!==null&&y.input_cache_read_per_1m_tokens==null&&(w="no applicable cache-read price rate"),n.responses)if(I=null,!n.responses.length||n.captureStatus==="partial"||new Set(n.responses.map(A=>A.response_id)).size!==n.responses.length)w="session accounting coverage is incomplete";else if(!c.catalog)w="lmprice catalog unavailable";else{let A=0,S=null;for(let x of n.responses){let R=x.tokens;if(!x.model){S="a response lacks a model";break}let L=n.turns?.flatMap(Bn=>Bn.rawUsage??[]).find(Bn=>Bn.responseId===x.response_id)?.values,D=L?.promptTokens??L?.prompt_tokens,M=L?.input_tokens,P=L?.cache_read_tokens??L?.input_cache_read_tokens,W=L?.cache_write_tokens??L?.input_cache_write_tokens;if(typeof M=="number"&&typeof P=="number"&&P>M||typeof D=="number"&&typeof P=="number"&&P>D||typeof D=="number"&&typeof W=="number"&&W>D||typeof D=="number"&&typeof P=="number"&&typeof W=="number"&&P+W>D){S=`${t} reported contradictory token counters`;break}if(R.output===null){S=`${t} does not record output tokens`;break}if(R.input_cached===null){S=`${t} does not record cached input tokens`;break}let $=x.model_provider??t,pe=Om(x.model??""),J=($==="deepseek"||x.model_provider==="deepseek")&&(x.model_provider===void 0||x.model_provider==="deepseek")&&GD.has(pe),fe=R.input_cache_write;if(fe===null&&!J){S=`${t} does not record cache-write input tokens`;break}if(t==="agy"&&(fe??0)>0){S="cache-write inclusion in input is not verified";break}let Se=["kimi","opencode","miniplayer"].includes(t),qe=Mt($,x.model,c.catalog,c.aliases),ut=qe.offer??Mt(t,x.model,c.catalog,c.aliases).offer;if(ut===null){switch(qe.state.kind){case"no-catalog":S=`no lmprice catalog coverage for provider "${t}"`;break;case"unresolved":S=`alias "${qe.state.alias}" is deliberately unresolved in the lmprice alias table`;break;case"known-unpriced":S=`"${qe.state.id}" is a known model with no published price row`;break;case"unknown":S=`model "${x.model}" not found in lmprice catalog for provider "${t}"`;break;case"wrong-provider":S=`model "${x.model}" is not offered by provider "${t}" (found under: ${qe.state.otherProviders.join(", ")})`;break;default:S=`no applicable price for response model "${x.model}"`;break}break}if(fe===null){let Bn=(ut.route??"").toLowerCase(),H=/^(openrouter|ollama|together|fireworks|groq|azure|bedrock|vertex)[:\/]/i.test(Bn),V=Om(ut.sourceModelId??""),_e=ut.provider==="deepseek"&&ut.source!=="openrouter"&&!H&&V===pe;if(J&&_e)fe=0;else{S=`${t} does not record cache-write input tokens`;break}}if(R.input_uncached===null){S=`${t} does not record uncached input tokens`;break}let qr=Ca({input:Math.max(0,R.input_uncached-(Se?fe:0)),cachedInput:R.input_cached,cacheWrite:fe,output:R.output},ut?.pricing??null);if(qr===null){S=`no applicable price for response model "${x.model}"`;break}A+=qr,!m&&ut&&(m=ut.route,f="priced")}I=S?null:A,w=S}return I===null&&(!n.responses&&l.input===null&&l.output===null?w=`${t} does not record token usage`:!n.responses&&l.input===null&&!w?w=`${t} does not record input tokens`:!n.responses&&l.output===null&&!w?w=`${t} does not record output tokens`:w||(w=`no lmprice entry for "${o??"unknown"}"`),(f==="priced"||f==="estimated")&&(f="unavailable",m=null,p=null,_=null,h=null,E=null)),{schema_version:l3,provider:t,sessionId:e,model:o,modelsUsed:d,approximate:u,tokens:l,pricePerModel:E,costUsd:I,priceResolution:f,priceRoute:m,priceSource:p,priceSourceModelId:_,priceProvenance:h,priceEstimated:g,costUnavailableReason:w,priceDataSource:c.source,priceDataGeneratedAt:c.generatedAt}}function VD(t,e=new Date){let n=[];for(let r=t-1;r>=0;r--){let s=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()-r));n.push(s.toISOString().slice(0,10))}return n}async function d3(t,e,n,r,s){let o=VD(t,s),i=Pe(r);if(!o3(i))return n?Y(r,{schema_version:1,days:o,providers:[]}):r.stdout.write(`no cost recorded yet
2769
+ COALESCE(SUM(usage_source IS NULL),0) AS unknownUsageCount, COALESCE(SUM(cost_usd IS NULL),0) AS unknownCostCount`});var KD={};ye(KD,{FIRST_PARTY_DEEPSEEK_MODELS:()=>GD,buildCostPayload:()=>JD,getSummaryDays:()=>VD,normalizeModelId:()=>Om,runCost:()=>d3});import{existsSync as s3}from"node:fs";function Om(t){return t.trim().toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function i3(t,e,n,r){let s=new Set,o=[];for(let i of e){let a=n===null?null:cd(t,i,n,r),l=a?.kind==="priced"||a?.kind==="estimated"?`id:${a.model.normalizedId}`:a?.kind==="known-unpriced"?`id:${a.id}`:`raw:${i.trim().toLowerCase()}`;s.has(l)||(s.add(l),o.push(i))}return o}async function JD(t,e,n){let r=[...new Set([...n.messages.map(A=>A.model),...(n.responses??[]).map(A=>A.model??void 0)].filter(A=>A!==void 0&&A!=="<synthetic>"))],s=[...n.messages].reverse().find(A=>A.model!==void 0&&A.model!=="<synthetic>")?.model,o=n.model??s??null,i=Vr(n.responses??[],n.captureStatus!=="partial"),a=t==="gemini"&&(n.totalOutputTokens!==void 0||n.totalReasoningOutputTokens!==void 0)?(n.totalOutputTokens??0)+(n.totalReasoningOutputTokens??0):n.totalOutputTokens??null,l={input:n.responses?i.input_uncached:n.totalInputTokens??null,output:n.responses?i.output:a,cachedInput:n.responses?i.input_cached:n.totalCachedInputTokens??null},c=await Dt(),d=i3(t,r,c.catalog,c.aliases),u=n.responses===void 0&&d.length>1,f="unavailable",m=null,p=null,_=null,h=null,g=!1,w=null,y=null;if(o!==null&&c.catalog!==null){let A=Mt(t,o,c.catalog,c.aliases);if(f=A.state.kind,A.offer!==null)y=A.offer.pricing,m=A.offer.route,p=A.offer.source,_=A.offer.sourceModelId,h=A.provenance,g=A.offer.estimated;else switch(A.state.kind){case"unresolved":w=`alias "${A.state.alias}" is deliberately unresolved in the lmprice alias table`;break;case"known-unpriced":w=`"${A.state.id}" is a known model with no published price row`;break;case"unknown":w=`model "${o}" not found in lmprice catalog for provider "${t}"`;break;case"wrong-provider":w=`model "${o}" is not offered by provider "${t}" (found under: ${A.state.otherProviders.join(", ")})`;break;default:w=`no lmprice catalog coverage for provider "${t}"`;break}}else o!==null&&(w="lmprice catalog unavailable");let E=y===null?null:{inputPer1m:y.input_per_1m_tokens,outputPer1m:y.output_per_1m_tokens,cachedInputPer1m:y.input_cache_read_per_1m_tokens},T=l.cachedInput??0,v=n.totalCacheWriteInputTokens??0,b=["claude","codex","gemini","qwen","copilot"].includes(t),k=l.input===null?null:Math.max(0,l.input-(b?T:0)-(t==="claude"||t==="copilot"?v:0)),I=l.input===null||l.output===null?null:Ca({input:k,output:l.output,cachedInput:T,...v>0?{cacheWrite:v,...n.totalCacheWrite5mInputTokens===void 0?{}:{cacheWrite5m:n.totalCacheWrite5mInputTokens},...n.totalCacheWrite1hInputTokens===void 0?{}:{cacheWrite1h:n.totalCacheWrite1hInputTokens}}:{}},y);if(I===null&&T>0&&y!==null&&y.input_cache_read_per_1m_tokens==null&&(w="no applicable cache-read price rate"),n.responses)if(I=null,!n.responses.length||n.captureStatus==="partial"||new Set(n.responses.map(A=>A.response_id)).size!==n.responses.length)w="session accounting coverage is incomplete";else if(!c.catalog)w="lmprice catalog unavailable";else{let A=0,S=null;for(let x of n.responses){let R=x.tokens;if(!x.model){S="a response lacks a model";break}let L=n.turns?.flatMap(Bn=>Bn.rawUsage??[]).find(Bn=>Bn.responseId===x.response_id)?.values,D=L?.promptTokens??L?.prompt_tokens,M=L?.input_tokens,P=L?.cache_read_tokens??L?.input_cache_read_tokens,W=L?.cache_write_tokens??L?.input_cache_write_tokens;if(typeof M=="number"&&typeof P=="number"&&P>M||typeof D=="number"&&typeof P=="number"&&P>D||typeof D=="number"&&typeof W=="number"&&W>D||typeof D=="number"&&typeof P=="number"&&typeof W=="number"&&P+W>D){S=`${t} reported contradictory token counters`;break}if(R.output===null){S=`${t} does not record output tokens`;break}if(R.input_cached===null){S=`${t} does not record cached input tokens`;break}let $=x.model_provider??t,pe=Om(x.model??""),J=($==="deepseek"||x.model_provider==="deepseek")&&(x.model_provider===void 0||x.model_provider==="deepseek")&&GD.has(pe),fe=R.input_cache_write;if(fe===null&&!J){S=`${t} does not record cache-write input tokens`;break}if(t==="agy"&&(fe??0)>0){S="cache-write inclusion in input is not verified";break}let Se=["kimi","opencode","miniplayer"].includes(t),qe=Mt($,x.model,c.catalog,c.aliases),ut=qe.offer??Mt(t,x.model,c.catalog,c.aliases).offer;if(ut===null){switch(qe.state.kind){case"no-catalog":S=`no lmprice catalog coverage for provider "${t}"`;break;case"unresolved":S=`alias "${qe.state.alias}" is deliberately unresolved in the lmprice alias table`;break;case"known-unpriced":S=`"${qe.state.id}" is a known model with no published price row`;break;case"unknown":S=`model "${x.model}" not found in lmprice catalog for provider "${t}"`;break;case"wrong-provider":S=`model "${x.model}" is not offered by provider "${t}" (found under: ${qe.state.otherProviders.join(", ")})`;break;default:S=`no applicable price for response model "${x.model}"`;break}break}if(fe===null){let Bn=(ut.route??"").toLowerCase(),H=/^(openrouter|ollama|together|fireworks|groq|azure|bedrock|vertex)[:\/]/i.test(Bn),V=Om(ut.sourceModelId??""),_e=ut.provider==="deepseek"&&ut.source!=="openrouter"&&!H&&V===pe;if(J&&_e)fe=0;else{S=`${t} does not record cache-write input tokens`;break}}if(R.input_uncached===null){S=`${t} does not record uncached input tokens`;break}let qr=Ca({input:Math.max(0,R.input_uncached-(Se?fe:0)),cachedInput:R.input_cached,cacheWrite:fe,output:R.output},ut?.pricing??null);if(qr===null){S=`no applicable price for response model "${x.model}"`;break}A+=qr,!m&&ut&&(m=ut.route,f="priced")}I=S?null:A,w=S}return I===null&&(!n.responses&&l.input===null&&l.output===null?w=`${t} does not record token usage`:!n.responses&&l.input===null&&!w?w=`${t} does not record input tokens`:!n.responses&&l.output===null&&!w?w=`${t} does not record output tokens`:w||(w=`no lmprice entry for "${o??"unknown"}"`),(f==="priced"||f==="estimated")&&(f="unavailable",m=null,p=null,_=null,h=null,E=null)),{schema_version:a3,provider:t,sessionId:e,model:o,modelsUsed:d,approximate:u,tokens:l,pricePerModel:E,costUsd:I,priceResolution:f,priceRoute:m,priceSource:p,priceSourceModelId:_,priceProvenance:h,priceEstimated:g,costUnavailableReason:w,priceDataSource:c.source,priceDataGeneratedAt:c.generatedAt}}function VD(t,e=new Date){let n=[];for(let r=t-1;r>=0;r--){let s=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()-r));n.push(s.toISOString().slice(0,10))}return n}async function c3(t,e,n,r,s){let o=VD(t,s),i=Pe(r);if(!s3(i))return n?Y(r,{schema_version:1,days:o,providers:[]}):r.stdout.write(`no cost recorded yet
2771
2770
  `),0;let a;try{if(a=gr(i),!a.prepare("SELECT 1 FROM sqlite_master WHERE type='view' AND name='turn_usage'").get())return n?Y(r,{schema_version:1,days:o,providers:[]}):r.stdout.write(`no cost recorded yet
2772
2771
  `),0;let c=`${o[0]}T00:00:00.000Z`,u=`${new Date(Date.UTC(s.getUTCFullYear(),s.getUTCMonth(),s.getUTCDate()+1)).toISOString().slice(0,10)}T00:00:00.000Z`,f=`
2773
2772
  SELECT
@@ -2784,8 +2783,8 @@ Model keys use reported names first; alias-like keys mean the model was not repo
2784
2783
  `),r.stdout.write(`${(0,mr.escapeCell)(h[I].provider)}: stored turn cost (UTC)
2785
2784
  `);for(let[N,A]of v.entries()){N>0&&r.stdout.write(`
2786
2785
  `);let S=[0,...A];r.stdout.write((0,mr.renderGrid)([S.map(x=>w[I][x])],{widths:S.map(x=>y[x]),headers:S.map(x=>g[x]),align:S.map((x,R)=>R===0?"left":"right"),margin:2,truncate:!1})+`
2787
- `)}}return 0}catch(l){return O(r,`cost: cannot read cost summary: ${l instanceof Error?l.message:String(l)}`)}finally{a?.close()}}async function u3(t,e={stdout:process.stdout,stderr:process.stderr},n=new Date){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${c3}
2788
- `),0;let r=ce(t,["--provider","--days"],["--json"]);if(r.error!==void 0)return O(e,r.error);let s=z(r,"--json");if(r.positionals.length===0){let y=7,E=F(r,"--days");if(E!==void 0){let v=Number(E);if(!/^[1-9]\d*$/.test(E)||!Number.isSafeInteger(v)||v>366)return O(e,`invalid --days "${E}" (expected an integer from 1 to 366)`);y=v}let T=F(r,"--provider");return T!==void 0&&!no(T)?O(e,`invalid provider "${T}"; use a canonical provider name (see lmctl help)`):d3(y,T,s,e,n)}if(F(r,"--days")!==void 0)return O(e,"--days is only supported without a target");if(r.positionals.length>2)return O(e,`too many positionals (${r.positionals.length}); expected <target> [alias]`);let o=Zn(i3,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:F(r,"--provider")}});if(o.mode==="error")return O(e,o.message);if(o.mode==="managed")return O(e,"cost: managed-run targets are not supported (no per-run token/model rollup exists)");let i,a;if(o.mode==="ai-team")try{let y=await G(e,E=>lt(o.teamfile,o.alias,E));i=y.provider,a=y.sessionid}catch(y){if(y instanceof De)return O(e,y.message);throw y}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let y=await Is(a);if(y.length===0)return O(e,`cost: session "${a}" not found in any provider store`);if(y.length>1)return O(e,`cost: session "${a}" matches multiple providers (${y.join(", ")}); pass --provider`);i=y[0]}let l;try{l=await _t(a,i)}catch(y){return O(e,`cost: failed to load session: ${y instanceof Error?y.message:String(y)}`)}if(l===null)return O(e,`cost: session not found: ${a} (provider=${i})`);let c=await JD(i,a,l),{model:d,modelsUsed:u,approximate:f,tokens:m,costUsd:p,priceEstimated:_,priceRoute:h,costUnavailableReason:g}=c,w={source:c.priceDataSource,generatedAt:c.priceDataGeneratedAt};return s?(Y(e,c),0):(e.stdout.write(`Session: ${a}
2786
+ `)}}return 0}catch(l){return O(r,`cost: cannot read cost summary: ${l instanceof Error?l.message:String(l)}`)}finally{a?.close()}}async function d3(t,e={stdout:process.stdout,stderr:process.stderr},n=new Date){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${l3}
2787
+ `),0;let r=ce(t,["--provider","--days"],["--json"]);if(r.error!==void 0)return O(e,r.error);let s=z(r,"--json");if(r.positionals.length===0){let y=7,E=F(r,"--days");if(E!==void 0){let v=Number(E);if(!/^[1-9]\d*$/.test(E)||!Number.isSafeInteger(v)||v>366)return O(e,`invalid --days "${E}" (expected an integer from 1 to 366)`);y=v}let T=F(r,"--provider");return T!==void 0&&!no(T)?O(e,`invalid provider "${T}"; use a canonical provider name (see lmctl help)`):c3(y,T,s,e,n)}if(F(r,"--days")!==void 0)return O(e,"--days is only supported without a target");if(r.positionals.length>2)return O(e,`too many positionals (${r.positionals.length}); expected <target> [alias]`);let o=Zn(o3,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:F(r,"--provider")}});if(o.mode==="error")return O(e,o.message);if(o.mode==="managed")return O(e,"cost: managed-run targets are not supported (no per-run token/model rollup exists)");let i,a;if(o.mode==="ai-team")try{let y=await G(e,E=>lt(o.teamfile,o.alias,E));i=y.provider,a=y.sessionid}catch(y){if(y instanceof De)return O(e,y.message);throw y}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let y=await Is(a);if(y.length===0)return O(e,`cost: session "${a}" not found in any provider store`);if(y.length>1)return O(e,`cost: session "${a}" matches multiple providers (${y.join(", ")}); pass --provider`);i=y[0]}let l;try{l=await _t(a,i)}catch(y){return O(e,`cost: failed to load session: ${y instanceof Error?y.message:String(y)}`)}if(l===null)return O(e,`cost: session not found: ${a} (provider=${i})`);let c=await JD(i,a,l),{model:d,modelsUsed:u,approximate:f,tokens:m,costUsd:p,priceEstimated:_,priceRoute:h,costUnavailableReason:g}=c,w={source:c.priceDataSource,generatedAt:c.priceDataGeneratedAt};return s?(Y(e,c),0):(e.stdout.write(`Session: ${a}
2789
2788
  `),e.stdout.write(` Provider: ${i}
2790
2789
  `),e.stdout.write(` Model: ${d??"(unknown)"}
2791
2790
  `),f&&e.stdout.write(` NOTE: this session used multiple models (${u.join(", ")}) -- cost below is approximate, priced at ${d}'s rate for the whole session.
@@ -2794,7 +2793,7 @@ Model keys use reported names first; alias-like keys mean the model was not repo
2794
2793
  `):e.stdout.write(` Cost: ~$${p.toFixed(4)}${f?" (approximate)":""}${_?" (estimated rate)":""}
2795
2794
  `),h!==null&&e.stdout.write(` Price route: ${h}${_?" (manual/estimated row)":""}
2796
2795
  `),e.stdout.write(` Price data: ${w.source}${w.generatedAt?` (generated ${w.generatedAt})`:""}
2797
- `),0)}var mr,i3,GD,l3,c3,zD=C(()=>{"use strict";ya();Fn();mr=pn(rn(),1);Va();_n();is();he();ha();Nt();Ni();i3={name:"cost",allowsBareTeamfile:!1,supportsRaw:!0};GD=new Set([...Ii,...ki,"deepseek-v4.1-flash","deepseek-chat","deepseek-reasoner","deepseek-coder","deepseek-v3","deepseek-v3.2","deepseek-r1"].map(Om));l3=1,c3=`usage: lmctl cost <target> [alias] [--json]
2796
+ `),0)}var mr,o3,GD,a3,l3,zD=C(()=>{"use strict";ya();Fn();mr=pn(rn(),1);Va();_n();is();he();ha();Nt();Ni();o3={name:"cost",allowsBareTeamfile:!1,supportsRaw:!0};GD=new Set([...Ii,...ki,"deepseek-v4.1-flash","deepseek-chat","deepseek-reasoner","deepseek-coder","deepseek-v3","deepseek-v3.2","deepseek-r1"].map(Om));a3=1,l3=`usage: lmctl cost <target> [alias] [--json]
2798
2797
  lmctl cost <sessionid> [--provider <name>] [--json]
2799
2798
  lmctl cost [--days <n>] [--provider <name>] [--json]
2800
2799
 
@@ -2825,16 +2824,16 @@ unavailable) and
2825
2824
  \`priceDataGeneratedAt\` says how fresh it is -- the online check has a
2826
2825
  strict short timeout and NEVER blocks or fails this command: any network
2827
2826
  error degrades silently to the local cache, then the bundled built-in
2828
- copy, in that order.`});function YD(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}var QD=C(()=>{"use strict"});var eM={};ye(eM,{runLs:()=>h3});import{resolve as YE}from"node:path";function p3(t){let e=new Map;for(let n of t){let r=`${n.provider}:${n.sessionId}`,s=e.get(r);(s===void 0||n.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(r,n)}return[...e.values()]}async function h3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${f3}
2829
- `),0;let n=ce(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return O(e,n.error);if(n.positionals.length>0)return O(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=F(n,"--format"),s=z(n,"--json");if(z(n,"--runs")){for(let h of["--provider","--sessiondir"])if(F(n,h)!==void 0)return O(e,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(z(n,h))return O(e,`--runs is mutually exclusive with ${h}`);if(r==="teamfile")return O(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let m=F(n,"--limit"),p=m3;if(m!==void 0){let h=Number.parseInt(m,10);if(!Number.isFinite(h)||h<1||String(h)!==m)return O(e,`invalid --limit "${m}" (expected a positive integer)`);if(h>ZD)return O(e,`--limit ${h} exceeds maximum (${ZD})`);p=h}let _=r==="json"||s===!0?"json":"table";try{return await G(e,async h=>_3(e,h,p,_))}catch(h){return Tn(e,h)}}let i=g3(r,s);if("error"in i)return O(e,i.error);let a=i.format,l=F(n,"--provider"),c=F(n,"--sessiondir"),d=z(n,"--recursive"),u=z(n,"--all"),f;try{f=await Ug(l?{provider:l}:{})}catch(m){return O(e,`ls: discovery failed: ${m instanceof Error?m.message:String(m)}`)}if(!u){let m=c!==void 0?YE(c):YE(process.cwd());f=f.filter(p=>{let _=YE(p.cwd);return d?_===m||_.startsWith(`${m}/`):_===m})}if(f=p3(f),a==="json")return Y(e,f.map(m=>({provider:m.provider,sessionId:m.sessionId,cwd:m.cwd,messageCount:m.messageCount,modifiedAt:m.modifiedAt.toISOString(),...m.model!==void 0?{model:m.model}:{}}))),0;if(f.length===0){if(a==="table"){let m=u?"(all)":c??process.cwd(),p=d?"under":"in";e.stdout.write(`No native sessions found ${p} ${m}.
2827
+ copy, in that order.`});function YD(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}var QD=C(()=>{"use strict"});var eM={};ye(eM,{runLs:()=>p3});import{resolve as YE}from"node:path";function m3(t){let e=new Map;for(let n of t){let r=`${n.provider}:${n.sessionId}`,s=e.get(r);(s===void 0||n.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(r,n)}return[...e.values()]}async function p3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${u3}
2828
+ `),0;let n=ce(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return O(e,n.error);if(n.positionals.length>0)return O(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=F(n,"--format"),s=z(n,"--json");if(z(n,"--runs")){for(let h of["--provider","--sessiondir"])if(F(n,h)!==void 0)return O(e,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(z(n,h))return O(e,`--runs is mutually exclusive with ${h}`);if(r==="teamfile")return O(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let m=F(n,"--limit"),p=f3;if(m!==void 0){let h=Number.parseInt(m,10);if(!Number.isFinite(h)||h<1||String(h)!==m)return O(e,`invalid --limit "${m}" (expected a positive integer)`);if(h>ZD)return O(e,`--limit ${h} exceeds maximum (${ZD})`);p=h}let _=r==="json"||s===!0?"json":"table";try{return await G(e,async h=>h3(e,h,p,_))}catch(h){return Tn(e,h)}}let i=_3(r,s);if("error"in i)return O(e,i.error);let a=i.format,l=F(n,"--provider"),c=F(n,"--sessiondir"),d=z(n,"--recursive"),u=z(n,"--all"),f;try{f=await Ug(l?{provider:l}:{})}catch(m){return O(e,`ls: discovery failed: ${m instanceof Error?m.message:String(m)}`)}if(!u){let m=c!==void 0?YE(c):YE(process.cwd());f=f.filter(p=>{let _=YE(p.cwd);return d?_===m||_.startsWith(`${m}/`):_===m})}if(f=m3(f),a==="json")return Y(e,f.map(m=>({provider:m.provider,sessionId:m.sessionId,cwd:m.cwd,messageCount:m.messageCount,modifiedAt:m.modifiedAt.toISOString(),...m.model!==void 0?{model:m.model}:{}}))),0;if(f.length===0){if(a==="table"){let m=u?"(all)":c??process.cwd(),p=d?"under":"in";e.stdout.write(`No native sessions found ${p} ${m}.
2830
2829
  `)}return 0}if(a==="teamfile"){for(let m of f)e.stdout.write(`_MEMBER_ alias=- provider=${m.provider} sessionid=${m.sessionId} sessiondir=${m.cwd}
2831
- `);return 0}return(0,Ht.printTable)(f.map(m=>[(0,Ht.escapeCell)(m.sessionId),(0,Ht.escapeCell)(m.provider),(0,Ht.escapeCell)(m.cwd.length>36?`\u2026${m.cwd.slice(-35)}`:m.cwd),(0,Ht.formatRelativeTime)(m.modifiedAt)]),{headers:["SESSION","PROVIDER","SESSIONDIR","MODIFIED"],stream:e.stdout}),0}async function _3(t,e,n,r){let s=YD(e,{limit:n});return r==="json"?(Y(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0):s.length===0?(t.stdout.write(`No runs found.
2832
- `),0):((0,Ht.printTable)(s.map(o=>[(0,Ht.escapeCell)(o.id),(0,Ht.escapeCell)(o.workflow_id),(0,Ht.escapeCell)(o.team_id),(0,Ht.escapeCell)(o.current_state??""),(0,Ht.escapeCell)(o.terminal_state??""),(0,Ht.escapeCell)(o.started_at)]),{headers:["RUN_ID","WORKFLOW","TEAM","STATE","TERMINAL","STARTED"],stream:t.stdout}),0)}function g3(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var Ht,f3,m3,ZD,tM=C(()=>{"use strict";Ht=pn(rn(),1);Cr();he();QD();f3=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
2830
+ `);return 0}return(0,Ht.printTable)(f.map(m=>[(0,Ht.escapeCell)(m.sessionId),(0,Ht.escapeCell)(m.provider),(0,Ht.escapeCell)(m.cwd.length>36?`\u2026${m.cwd.slice(-35)}`:m.cwd),(0,Ht.formatRelativeTime)(m.modifiedAt)]),{headers:["SESSION","PROVIDER","SESSIONDIR","MODIFIED"],stream:e.stdout}),0}async function h3(t,e,n,r){let s=YD(e,{limit:n});return r==="json"?(Y(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0):s.length===0?(t.stdout.write(`No runs found.
2831
+ `),0):((0,Ht.printTable)(s.map(o=>[(0,Ht.escapeCell)(o.id),(0,Ht.escapeCell)(o.workflow_id),(0,Ht.escapeCell)(o.team_id),(0,Ht.escapeCell)(o.current_state??""),(0,Ht.escapeCell)(o.terminal_state??""),(0,Ht.escapeCell)(o.started_at)]),{headers:["RUN_ID","WORKFLOW","TEAM","STATE","TERMINAL","STARTED"],stream:t.stdout}),0)}function _3(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var Ht,u3,f3,ZD,tM=C(()=>{"use strict";Ht=pn(rn(),1);Cr();he();QD();u3=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
2833
2832
  [--recursive] [--all] [--format table|teamfile|json] [--json]
2834
2833
  lmctl ls --runs [--limit N] [--format table|json] [--json]
2835
2834
 
2836
- List native provider sessions in scope, or list recent managed runs with --runs.`,m3=50,ZD=500});import{closeSync as nM,openSync as y3,writeFileSync as rM,fsyncSync as w3,renameSync as E3,unlinkSync as T3,lstatSync as QE,readFileSync as v3}from"node:fs";import{randomUUID as S3}from"node:crypto";import{dirname as b3,join as I3}from"node:path";function Dm(t,e,n){let r=()=>n===null?(()=>{try{return QE(t),!0}catch(a){if(a.code==="ENOENT")return!1;throw a}})():!v3(t).equals(Buffer.from(n,"utf8")),s=384;if(n!==null){let a=QE(t);if(!a.isFile())throw new Error("Profile path must be a regular file: "+t);if(s=a.mode&511,!(s&146))throw new Error("Profile is read-only: "+t)}let o=I3(b3(t),".init-"+S3()+".tmp"),i;try{if(i=y3(o,"wx",s),rM(i,e,"utf8"),w3(i),nM(i),i=void 0,r())throw new Error("Profile changed concurrently: "+t);if(n!==null){let a=t+".bak";try{if(!QE(a).isFile())throw new Error("Backup path is not a regular file: "+a)}catch(l){if(l.code!=="ENOENT")throw l}if(rM(a,n,{encoding:"utf8",flag:"w",mode:s}),r())throw new Error("Profile changed concurrently: "+t)}E3(o,t)}finally{i!==void 0&&nM(i);try{T3(o)}catch(a){if(a.code!=="ENOENT")throw a}}}var sM=C(()=>{"use strict"});var oM={};ye(oM,{runInit:()=>L3});import{mkdirSync as k3,readFileSync as A3}from"node:fs";import{dirname as N3}from"node:path";function R3(t){try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(A3(t))}catch(e){if(e.code==="ENOENT")return null;throw new vt(t,"read",e.message)}}async function L3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(x3),0;let r=t.includes("--force"),s=t.find(i=>i!=="--force"&&i!=="--help"&&i!=="-h");if(s!==void 0)return e.stderr.write(`error: unknown argument: ${s}
2837
- `),2;let o=bn(e.env??process.env,n.configPath);try{let i=Sx((n.detectProviders??gf)()),a=R3(o);if(i.length===0)return e.stderr.write(`error: no supported provider is installed -- looked for ${Li.join(", ")} on PATH (each must run \`<name> --version\`). ${a===null?"Nothing was written":`${o} was left unchanged`}; install a provider CLI, then run this again.
2835
+ List native provider sessions in scope, or list recent managed runs with --runs.`,f3=50,ZD=500});import{closeSync as nM,openSync as g3,writeFileSync as rM,fsyncSync as y3,renameSync as w3,unlinkSync as E3,lstatSync as QE,readFileSync as T3}from"node:fs";import{randomUUID as v3}from"node:crypto";import{dirname as S3,join as b3}from"node:path";function Dm(t,e,n){let r=()=>n===null?(()=>{try{return QE(t),!0}catch(a){if(a.code==="ENOENT")return!1;throw a}})():!T3(t).equals(Buffer.from(n,"utf8")),s=384;if(n!==null){let a=QE(t);if(!a.isFile())throw new Error("Profile path must be a regular file: "+t);if(s=a.mode&511,!(s&146))throw new Error("Profile is read-only: "+t)}let o=b3(S3(t),".init-"+v3()+".tmp"),i;try{if(i=g3(o,"wx",s),rM(i,e,"utf8"),y3(i),nM(i),i=void 0,r())throw new Error("Profile changed concurrently: "+t);if(n!==null){let a=t+".bak";try{if(!QE(a).isFile())throw new Error("Backup path is not a regular file: "+a)}catch(l){if(l.code!=="ENOENT")throw l}if(rM(a,n,{encoding:"utf8",flag:"w",mode:s}),r())throw new Error("Profile changed concurrently: "+t)}w3(o,t)}finally{i!==void 0&&nM(i);try{E3(o)}catch(a){if(a.code!=="ENOENT")throw a}}}var sM=C(()=>{"use strict"});var oM={};ye(oM,{runInit:()=>R3});import{mkdirSync as I3,readFileSync as k3}from"node:fs";import{dirname as A3}from"node:path";function x3(t){try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(k3(t))}catch(e){if(e.code==="ENOENT")return null;throw new vt(t,"read",e.message)}}async function R3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(N3),0;let r=t.includes("--force"),s=t.find(i=>i!=="--force"&&i!=="--help"&&i!=="-h");if(s!==void 0)return e.stderr.write(`error: unknown argument: ${s}
2836
+ `),2;let o=bn(e.env??process.env,n.configPath);try{let i=Sx((n.detectProviders??gf)()),a=x3(o);if(i.length===0)return e.stderr.write(`error: no supported provider is installed -- looked for ${Li.join(", ")} on PATH (each must run \`<name> --version\`). ${a===null?"Nothing was written":`${o} was left unchanged`}; install a provider CLI, then run this again.
2838
2837
  `),1;let l=[],c={},d=[];for(let p of i)try{let _=await(n.modelsForProvider??bx)(p);if(_.length===0)throw new Error(`No model ids are available for detected provider "${p}"`);l.push(p),c[p]=_}catch(_){let h=_ instanceof Error?_.message:String(_),g=`${p}: ${h}`;d.push(g),e.stderr.write(`warning: ${p} model catalog unavailable (${h}); skipping this provider.
2839
2838
  `)}if(l.length===0)return e.stderr.write(`error: no detected provider returned model ids (${d.join("; ")}). Nothing was written.
2840
2839
  `),1;let u=Ix(l,c);e.stderr.write(`notice: installed: ${i.join(", ")} -- provider slots use order (${Li.join(", ")}); model1 uses each provider's first reported id
@@ -2851,7 +2850,7 @@ ${ZE}
2851
2850
  ${ZE}
2852
2851
  `),f(),0}if(a!==null){ar(a,o);let p=Wl(u);ar(p,o),Dm(o,p,a),e.stdout.write(`Wrote ${o} (previous file saved as ${o}.bak)
2853
2852
 
2854
- `)}else{let p=Wl(u);ar(p,o),k3(N3(o),{recursive:!0}),Dm(o,p,null),e.stdout.write(`Wrote ${o}
2853
+ `)}else{let p=Wl(u);ar(p,o),I3(A3(o),{recursive:!0}),Dm(o,p,null),e.stdout.write(`Wrote ${o}
2855
2854
 
2856
2855
  `)}return e.stdout.write(Wl(u)),e.stdout.write(`
2857
2856
  This is a starting point, not a fixed answer -- edit provider/model1 above before running lmctl plan or lmctl quickrun if it is not right.
@@ -2859,7 +2858,7 @@ This is a starting point, not a fixed answer -- edit provider/model1 above befor
2859
2858
  `),f(),0}catch(i){return i instanceof vt?(e.stderr.write(`error: ${i.detail}
2860
2859
  `),e.stderr.write(r?`The file was left unchanged: --force does not overwrite a file it cannot read as TOML. Fix it by hand, or move it aside.
2861
2860
  `:"The file was left unchanged. Fix it by hand, or run `lmctl init --force` to regenerate it from scratch.\n"),1):(e.stderr.write("error: cannot update "+o+": "+(i instanceof Error?i.message:String(i))+`
2862
- `),1)}}var ZE,x3,iM=C(()=>{"use strict";sM();Eo();ZE="These are lmctl properties: lmscript reads PROPS.Provider1.Provider and PROPS.Provider1.Model1; legacy plan/quickrun templates use them as ${Provider1}/${Model1}.",x3=`usage: lmctl init [--force]
2861
+ `),1)}}var ZE,N3,iM=C(()=>{"use strict";sM();Eo();ZE="These are lmctl properties: lmscript reads PROPS.Provider1.Provider and PROPS.Provider1.Model1; legacy plan/quickrun templates use them as ${Provider1}/${Model1}.",N3=`usage: lmctl init [--force]
2863
2862
 
2864
2863
  Writes ~/.lmctl/init.toml if it does not exist: an example of three provider
2865
2864
  slots (Provider1/2/3), each with a provider and model1.
@@ -2899,11 +2898,11 @@ it is expected.
2899
2898
  --force Regenerate the whole example file from detection (previous file
2900
2899
  saved as init.toml.bak). Slots you added are NOT kept by --force.
2901
2900
  -h, --help display help for command
2902
- `});function aM(t){let e=Object.create(null),n=Object.create(null),r=(s,o,i=!0)=>{if(Array.isArray(s)){let a=s.map((l,c)=>r(l,o+"."+c,!1));return i&&(n[o]=a),a}if(s&&typeof s=="object"&&!(s instanceof Date)){let a=Object.create(null);for(let[l,c]of Object.entries(s)){let u=/^Provider[123]$/.test(o)&&["provider","model1"].includes(l)?l[0].toUpperCase()+l.slice(1):l;if(Object.hasOwn(a,u))throw Error(`Ambiguous property '${o}.${u}'`);a[u]=r(c,o?o+"."+u:u,i&&/^[_a-zA-Z]\w*$/.test(u))}return a}return i&&(n[o]=s),s};for(let[s,o]of Object.entries(t))e[s]=r(o,s,/^[_a-zA-Z]\w*$/.test(s));return{properties:e,flat:n}}var lM=C(()=>{"use strict"});import{execFileSync as C3}from"node:child_process";import{resolve as cM}from"node:path";function O3(t){return t.filter(e=>e.state!=="retired")}function dM(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?O(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=C3("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return O(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let o=cM(s),i=e.listProjects().find(a=>cM(a.local_path)===o);return i===void 0?O(t,`terminal cannot infer a member from cwd ${o}; use \`lmctl terminal <teamfile> <alias>\``):i}function uM(t,e,n,r){if(r!==void 0){let o=e.findTeamByName(r);return o===null?O(t,`team not found: ${r}`):o}let s=e.getTeam(n.team_id);return s===null?O(t,`project ${n.name} has no assigned team; use --team <name>`):s}function fM(t,e,n,r){if(r!==void 0){let o=e.findTeamMemberByAlias(n.id,r);return o===null||o.state==="retired"?O(t,`member not found: ${r}`):o}let s=O3(e.listTeamMembers(n.id)).find(o=>o.role==="agent");return s===void 0?O(t,`team ${n.name} has no active agent member`):s}var mM=C(()=>{"use strict";he()});function pM(t,e,n){let r=t.getRun(e);if(r===null)return{err:`run ${e}: not found`};if(n!==void 0){let l=t.findTeamMemberByAlias(r.team_id,n);return l===null?{err:`run ${e}: team has no member alias "${n}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(r.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(r.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}var hM=C(()=>{"use strict"});var wM={};ye(wM,{SIZE_WARN_EST_TOKENS:()=>Nc,estimateTokens:()=>yM,runTeamTerminal:()=>U3,runTerminal:()=>eT});import{constants as D3}from"node:os";import{spawn as M3}from"node:child_process";import{statSync as $3}from"node:fs";async function eT(t,e){if(t.includes("--help")||t.includes("-h"))return B3(e);let n=ce(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return O(e,n.error);if(Dn(e)&&!z(n,"--size"))return O(e,"terminal opens an interactive TUI; non-interactive mode is enabled");let r=F(n,"--run");if(r!==void 0){let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<=0||String(s)!==r)return O(e,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return O(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?z(n,i):F(n,i)!==void 0)return O(e,`--run is mutually exclusive with ${i}`);try{return await G(e,async i=>{let a=F(n,"--alias"),l=pM(i,s,a);return"err"in l?O(e,l.err):tT(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(i){return Tn(e,i)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?z(n,l):F(n,l)!==void 0)return O(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return O(e,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=n.positionals[0],i=n.positionals[1],a=Zn(P3,{target:o,alias:i,flags:{}});return a.mode==="error"?O(e,a.message):a.mode!=="ai-team"?O(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?O(e,"terminal: alias required for the teamfile target"):await G(e,l=>gM(e,a.teamfile,a.alias,l,z(n,"--json")))}try{return await G(e,async s=>{let o=j3(e,s,n);if(typeof o=="number")return o;let i=F(n,"--alias");return z(n,"--size")?H3(e,s,o,i,z(n,"--json")):W3(e,s,o,i)})}catch(s){return Tn(e,s)}}async function U3(t,e,n,r,s){let o=await gM(t,e,n,r,!1,s);return{code:s.signalObserved?null:o,signal:s.signalObserved??null}}async function gM(t,e,n,r,s,o){let i;try{i=lt(e,n,r)}catch(x){return x instanceof De?O(t,x.message):Tn(t,x)}let a=ls(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:ms(o?.env??t.env)});if(!a.acquired){let x=a.current.holder_pid,R=x===null?null:$t(x)?"live":"dead",L=`${i.alias} is busy/held by ${a.current.sender_alias} (${a.current.sender_teamfile}) since ${a.current.started_at} `+(x===null?"(holder_pid=unavailable)":`(holder_pid=${x}, ${R})`);return s?(Y(t,{status:"error",errorKind:"busy",message:L,holder_pid:x,holder_liveness:R}),1):O(t,L)}let l=bN({teamfile:i.teamfile,alias:i.alias,pid:o?.pid}),c=null,d=null,u=null,f=[],m={...o?.env??t.env??process.env},p=!1,_=null,h=!1,g,w,y,E=x=>{c!==null&&(clearInterval(c),c=null);try{let R=r.getTerminalLock(l.teamfile,l.alias);!r.clearTerminalLock(l.teamfile,l.alias,l.lock_id)&&R!==null&&x.push("terminal lock release was not acknowledged")}catch(R){x.push(`terminal lock release: ${R instanceof Error?R.message:String(R)}`)}try{let R=r.getAgentInflight(l.teamfile,l.alias);!r.releaseAgentInflight(a.lease,a.leaseId)&&R!==null&&x.push("inflight release was not acknowledged")}catch(R){x.push(`inflight release: ${R instanceof Error?R.message:String(R)}`)}},T=(x,R)=>{let L=r.db.pragma("busy_timeout",{simple:!0});r.db.pragma("busy_timeout=0");try{x(R)}finally{try{r.db.pragma(`busy_timeout=${L}`)}catch(D){R.push(`busy timeout restore: ${D instanceof Error?D.message:String(D)}`)}}},v=(x,R)=>{if(!(d===null||h))try{if(r.finishTrackedInvocation(d,x)===null){let D=r.getTrackedInvocation(d);D==null||D.status==="running"?R.push("tracked terminal finish was not acknowledged"):h=!0}else h=!0}catch(L){R.push(`tracked terminal finish: ${L instanceof Error?L.message:String(L)}`)}},b=x=>{if(p)return;p=!0;let R=[];try{T(L=>{E(L),v({status:"cancelled",signal:x,exit_code:x==="SIGINT"?130:143,error:`terminal interrupted by ${x}`},L)},R)}catch(L){R.push(L instanceof Error?L.message:String(L))}R.length>0&&(_=Error(R.join("; ")))},k=!o,I=k?new AbortController:void 0,N=()=>I?.abort("SIGINT"),A=()=>I?.abort("SIGTERM");k&&(process.once("SIGINT",N),process.once("SIGTERM",A));let S=o??{env:m,signal:I?.signal};S.env=m;try{if(S.cancel=b,S.cleanupError=()=>_,o&&o.onResource?.({close(){if(w)return w;let L,D;w=new Promise((P,W)=>{L=P,D=W});let M=performance.now();return(async()=>{if(b("SIGTERM"),o.stop?.("SIGTERM"),_)throw _;if(g){let P=5e3-(performance.now()-M),W;try{if(P<=0)throw Error("terminal close deadline exceeded");await Promise.race([g.catch(()=>{}),new Promise(($,pe)=>{W=setTimeout(()=>pe(Error("terminal close deadline exceeded")),P)})])}catch($){throw _=$ instanceof Error?$:Error(String($)),_}finally{clearTimeout(W)}}})().then(L,D),w},finalizeSync(L){if(b(L),o.stop?.(L),_)throw _}}),p||S.signal?.aborted){let L=S.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM";return b(L),L==="SIGINT"?130:143}r.setTerminalLock(l),d=F3(r,i,m,o?.pid),d!==null&&(m.LMCTL_INVOCATION_ID=String(d));let x=r.getRootTeam(i.teamfile)?.name??null;x!==null&&(m.LMBEE_TEAM_NAME=x),c=setInterval(()=>{try{let L=new Date().toISOString(),D=r.heartbeatTerminalLock(l.teamfile,l.alias,l.lock_id,L);D&&r.heartbeatAgentInflight(a.lease,a.leaseId,L),!D&&c!==null&&(clearInterval(c),c=null)}catch{}},IN(m)),c.unref?.();try{di(t,Fe(i.teamfile),i.teamfile)}catch{}let R=S;return g=tT(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead},L=>{f.push(`${L.provider} terminal ignored model=${L.model}: ${L.reason}`)},R),u=await g,u}catch(x){throw y=x,x}finally{if(k&&(process.removeListener("SIGINT",N),process.removeListener("SIGTERM",A)),!p){p=!0;let x=[];try{T(R=>{E(R),v({status:u===0?"done":"error",exit_code:u,result_summary:u===0?"terminal session ended":null,error:u===0?null:`terminal exited with code ${u??"unknown"}`,...f.length>0?{config_warnings:JSON.stringify(f)}:{}},R)},x)}catch(R){x.push(R instanceof Error?R.message:String(R))}x.length>0&&(_=Error(x.join("; ")))}if(_){if(y===void 0)throw _;try{t.stderr.write("error: terminal cleanup: "+_.message+`
2903
- `)}catch{}}}}function F3(t,e,n=process.env,r=process.pid){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:r,launch_source:"terminal",parent_invocation_id:ti(n.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}async function tT(t,e,n,r){let{provider:s,sessionid:o,sessiondir:i,model:a}=e;if(!Vu(s))return O(t,`no resume incantation for provider "${s}"`);if(!mN.test(o))return O(t,"refusing to resume: malformed sessionid");let l=Gg(s,o,{isLead:e.isLead,model:a,onModelIgnored:p=>{let _=`warning: ${p.provider} terminal ignored model=${p.model}: ${p.reason}`;t.stderr.write(`${_}
2901
+ `});function aM(t){let e=Object.create(null),n=Object.create(null),r=(s,o,i=!0)=>{if(Array.isArray(s)){let a=s.map((l,c)=>r(l,o+"."+c,!1));return i&&(n[o]=a),a}if(s&&typeof s=="object"&&!(s instanceof Date)){let a=Object.create(null);for(let[l,c]of Object.entries(s)){let u=/^Provider[123]$/.test(o)&&["provider","model1"].includes(l)?l[0].toUpperCase()+l.slice(1):l;if(Object.hasOwn(a,u))throw Error(`Ambiguous property '${o}.${u}'`);a[u]=r(c,o?o+"."+u:u,i&&/^[_a-zA-Z]\w*$/.test(u))}return a}return i&&(n[o]=s),s};for(let[s,o]of Object.entries(t))e[s]=r(o,s,/^[_a-zA-Z]\w*$/.test(s));return{properties:e,flat:n}}var lM=C(()=>{"use strict"});import{execFileSync as L3}from"node:child_process";import{resolve as cM}from"node:path";function C3(t){return t.filter(e=>e.state!=="retired")}function dM(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?O(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=L3("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return O(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let o=cM(s),i=e.listProjects().find(a=>cM(a.local_path)===o);return i===void 0?O(t,`terminal cannot infer a member from cwd ${o}; use \`lmctl terminal <teamfile> <alias>\``):i}function uM(t,e,n,r){if(r!==void 0){let o=e.findTeamByName(r);return o===null?O(t,`team not found: ${r}`):o}let s=e.getTeam(n.team_id);return s===null?O(t,`project ${n.name} has no assigned team; use --team <name>`):s}function fM(t,e,n,r){if(r!==void 0){let o=e.findTeamMemberByAlias(n.id,r);return o===null||o.state==="retired"?O(t,`member not found: ${r}`):o}let s=C3(e.listTeamMembers(n.id)).find(o=>o.role==="agent");return s===void 0?O(t,`team ${n.name} has no active agent member`):s}var mM=C(()=>{"use strict";he()});function pM(t,e,n){let r=t.getRun(e);if(r===null)return{err:`run ${e}: not found`};if(n!==void 0){let l=t.findTeamMemberByAlias(r.team_id,n);return l===null?{err:`run ${e}: team has no member alias "${n}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(r.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(r.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}var hM=C(()=>{"use strict"});var wM={};ye(wM,{SIZE_WARN_EST_TOKENS:()=>Nc,estimateTokens:()=>yM,runTeamTerminal:()=>P3,runTerminal:()=>eT});import{constants as O3}from"node:os";import{spawn as D3}from"node:child_process";import{statSync as M3}from"node:fs";async function eT(t,e){if(t.includes("--help")||t.includes("-h"))return H3(e);let n=ce(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return O(e,n.error);if(Dn(e)&&!z(n,"--size"))return O(e,"terminal opens an interactive TUI; non-interactive mode is enabled");let r=F(n,"--run");if(r!==void 0){let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<=0||String(s)!==r)return O(e,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return O(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?z(n,i):F(n,i)!==void 0)return O(e,`--run is mutually exclusive with ${i}`);try{return await G(e,async i=>{let a=F(n,"--alias"),l=pM(i,s,a);return"err"in l?O(e,l.err):tT(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(i){return Tn(e,i)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?z(n,l):F(n,l)!==void 0)return O(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return O(e,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=n.positionals[0],i=n.positionals[1],a=Zn($3,{target:o,alias:i,flags:{}});return a.mode==="error"?O(e,a.message):a.mode!=="ai-team"?O(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?O(e,"terminal: alias required for the teamfile target"):await G(e,l=>gM(e,a.teamfile,a.alias,l,z(n,"--json")))}try{return await G(e,async s=>{let o=F3(e,s,n);if(typeof o=="number")return o;let i=F(n,"--alias");return z(n,"--size")?W3(e,s,o,i,z(n,"--json")):j3(e,s,o,i)})}catch(s){return Tn(e,s)}}async function P3(t,e,n,r,s){let o=await gM(t,e,n,r,!1,s);return{code:s.signalObserved?null:o,signal:s.signalObserved??null}}async function gM(t,e,n,r,s,o){let i;try{i=lt(e,n,r)}catch(x){return x instanceof De?O(t,x.message):Tn(t,x)}let a=ls(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:ms(o?.env??t.env)});if(!a.acquired){let x=a.current.holder_pid,R=x===null?null:$t(x)?"live":"dead",L=`${i.alias} is busy/held by ${a.current.sender_alias} (${a.current.sender_teamfile}) since ${a.current.started_at} `+(x===null?"(holder_pid=unavailable)":`(holder_pid=${x}, ${R})`);return s?(Y(t,{status:"error",errorKind:"busy",message:L,holder_pid:x,holder_liveness:R}),1):O(t,L)}let l=bN({teamfile:i.teamfile,alias:i.alias,pid:o?.pid}),c=null,d=null,u=null,f=[],m={...o?.env??t.env??process.env},p=!1,_=null,h=!1,g,w,y,E=x=>{c!==null&&(clearInterval(c),c=null);try{let R=r.getTerminalLock(l.teamfile,l.alias);!r.clearTerminalLock(l.teamfile,l.alias,l.lock_id)&&R!==null&&x.push("terminal lock release was not acknowledged")}catch(R){x.push(`terminal lock release: ${R instanceof Error?R.message:String(R)}`)}try{let R=r.getAgentInflight(l.teamfile,l.alias);!r.releaseAgentInflight(a.lease,a.leaseId)&&R!==null&&x.push("inflight release was not acknowledged")}catch(R){x.push(`inflight release: ${R instanceof Error?R.message:String(R)}`)}},T=(x,R)=>{let L=r.db.pragma("busy_timeout",{simple:!0});r.db.pragma("busy_timeout=0");try{x(R)}finally{try{r.db.pragma(`busy_timeout=${L}`)}catch(D){R.push(`busy timeout restore: ${D instanceof Error?D.message:String(D)}`)}}},v=(x,R)=>{if(!(d===null||h))try{if(r.finishTrackedInvocation(d,x)===null){let D=r.getTrackedInvocation(d);D==null||D.status==="running"?R.push("tracked terminal finish was not acknowledged"):h=!0}else h=!0}catch(L){R.push(`tracked terminal finish: ${L instanceof Error?L.message:String(L)}`)}},b=x=>{if(p)return;p=!0;let R=[];try{T(L=>{E(L),v({status:"cancelled",signal:x,exit_code:x==="SIGINT"?130:143,error:`terminal interrupted by ${x}`},L)},R)}catch(L){R.push(L instanceof Error?L.message:String(L))}R.length>0&&(_=Error(R.join("; ")))},k=!o,I=k?new AbortController:void 0,N=()=>I?.abort("SIGINT"),A=()=>I?.abort("SIGTERM");k&&(process.once("SIGINT",N),process.once("SIGTERM",A));let S=o??{env:m,signal:I?.signal};S.env=m;try{if(S.cancel=b,S.cleanupError=()=>_,o&&o.onResource?.({close(){if(w)return w;let L,D;w=new Promise((P,W)=>{L=P,D=W});let M=performance.now();return(async()=>{if(b("SIGTERM"),o.stop?.("SIGTERM"),_)throw _;if(g){let P=5e3-(performance.now()-M),W;try{if(P<=0)throw Error("terminal close deadline exceeded");await Promise.race([g.catch(()=>{}),new Promise(($,pe)=>{W=setTimeout(()=>pe(Error("terminal close deadline exceeded")),P)})])}catch($){throw _=$ instanceof Error?$:Error(String($)),_}finally{clearTimeout(W)}}})().then(L,D),w},finalizeSync(L){if(b(L),o.stop?.(L),_)throw _}}),p||S.signal?.aborted){let L=S.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM";return b(L),L==="SIGINT"?130:143}r.setTerminalLock(l),d=U3(r,i,m,o?.pid),d!==null&&(m.LMCTL_INVOCATION_ID=String(d));let x=r.getRootTeam(i.teamfile)?.name??null;x!==null&&(m.LMBEE_TEAM_NAME=x),c=setInterval(()=>{try{let L=new Date().toISOString(),D=r.heartbeatTerminalLock(l.teamfile,l.alias,l.lock_id,L);D&&r.heartbeatAgentInflight(a.lease,a.leaseId,L),!D&&c!==null&&(clearInterval(c),c=null)}catch{}},IN(m)),c.unref?.();try{di(t,Fe(i.teamfile),i.teamfile)}catch{}let R=S;return g=tT(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead},L=>{f.push(`${L.provider} terminal ignored model=${L.model}: ${L.reason}`)},R),u=await g,u}catch(x){throw y=x,x}finally{if(k&&(process.removeListener("SIGINT",N),process.removeListener("SIGTERM",A)),!p){p=!0;let x=[];try{T(R=>{E(R),v({status:u===0?"done":"error",exit_code:u,result_summary:u===0?"terminal session ended":null,error:u===0?null:`terminal exited with code ${u??"unknown"}`,...f.length>0?{config_warnings:JSON.stringify(f)}:{}},R)},x)}catch(R){x.push(R instanceof Error?R.message:String(R))}x.length>0&&(_=Error(x.join("; ")))}if(_){if(y===void 0)throw _;try{t.stderr.write("error: terminal cleanup: "+_.message+`
2902
+ `)}catch{}}}}function U3(t,e,n=process.env,r=process.pid){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:r,launch_source:"terminal",parent_invocation_id:ti(n.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}async function tT(t,e,n,r){let{provider:s,sessionid:o,sessiondir:i,model:a}=e;if(!Vu(s))return O(t,`no resume incantation for provider "${s}"`);if(!mN.test(o))return O(t,"refusing to resume: malformed sessionid");let l=Gg(s,o,{isLead:e.isLead,model:a,onModelIgnored:p=>{let _=`warning: ${p.provider} terminal ignored model=${p.model}: ${p.reason}`;t.stderr.write(`${_}
2904
2903
  `),Et({event:"model_ignored",provider:p.provider,model:p.model,reason:p.reason}),n?.(p)}});if(l===null||l.length===0)return O(t,`no resume incantation for provider "${s}"`);let c=ot(r?.env??t.env??process.env,i,o,"terminal"),d=await pN(s,{binary:l[0],cwd:i,env:c,signal:r?.signal});if(r?.signal?.aborted){let p=r.signal.reason==="SIGINT"?"SIGINT":"SIGTERM";return r.cancel?.(p),p==="SIGINT"?130:143}let[u,...f]=l,m=d.kind==="use-binary"?d.binary:u;return d.message&&t.stderr.write(d.message+`
2905
- `),await new Promise(p=>{if(r?.signal?.aborted){let k=r.signal.reason==="SIGINT"?"SIGINT":"SIGTERM";return r.cancel?.(k),p(k==="SIGINT"?130:143)}let _=r?.streams,h=_?[_.stdin,_.stdout,_.stderr].map(k=>k.fd):void 0,g=h?.every(k=>typeof k=="number"),w=M3(m,f,{stdio:_?g?h:["pipe","pipe","pipe"]:"inherit",cwd:i,env:c}),y=_?.stdin?.readableFlowing;_&&!g&&(_.stdin.pipe(w.stdin),w.stdout?.pipe(_.stdout,{end:!1}),w.stderr?.pipe(_.stderr,{end:!1}));let E=!1,T=k=>{if(!E){E=!0;try{r?.cancel?.(k)}catch{}{try{w.kill(k)}catch{}Ae(w,{stdinEnd:!1,softDelayMs:0,killDelayMs:100}).catch(()=>{})}}},v=()=>T(r?.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM");r&&(r.stop=T);let b=()=>{r?.signal?.removeEventListener("abort",v),_&&!g&&(_.stdin.unpipe(w.stdin),y||_.stdin.pause(),w.stdout?.unpipe(_.stdout),w.stderr?.unpipe(_.stderr))};r?.signal?.addEventListener("abort",v,{once:!0}),r?.signal?.aborted&&v(),w.stdin?.on("error",()=>{}),w.on("error",k=>{b(),p(O(t,`failed to launch ${m}: ${k.message}`))}),w.on("exit",(k,I)=>{b(),r&&(r.signalObserved=I);let N=k??(I?128+(D3.signals[I]??1):1),A=hN(s);A&&N!==0&&N!==130&&N!==143&&!E&&!r?.signal?.aborted&&t.stderr.write(s+" exited with status "+N+". "+A+`
2906
- `),p(N)})})}function j3(t,e,n){let r=F(n,"--team");if(r!==void 0){let i=e.findTeamByName(r);return i===null?O(t,`team not found: ${r}`):i}let s=dM(t,e,F(n,"--project"));return typeof s=="number"?s:uM(t,e,s,void 0)}async function W3(t,e,n,r){let s=fM(t,e,n,r);if(typeof s=="number")return s;let o=s.sessionid;if(o===null||o.trim().length===0)return O(t,`member ${s.alias} has no session yet \u2014 seed it first: lmctl seed <teamfile> (check with lmctl status <teamfile>)`);let i=new AbortController,a=()=>i.abort("SIGINT"),l=()=>i.abort("SIGTERM");process.once("SIGINT",a),process.once("SIGTERM",l);try{return await tT(t,{provider:nh(s),sessionid:o,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}},void 0,{env:t.env??process.env,signal:i.signal})}finally{process.removeListener("SIGINT",a),process.removeListener("SIGTERM",l)}}function yM(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let n=t.messages.reduce((r,s)=>r+(s.content?.length??0),0);return{chars:n,est:Math.ceil(n/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let n=$3(e).size;return{chars:n,est:Math.ceil(n/4),messages:t?.messages?.length??null,bytes:n}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function H3(t,e,n,r,s){let o;if(r!==void 0){let a=e.findTeamMemberByAlias(n.id,r);if(a===null||a.state==="retired")return O(t,`member not found: ${r}`);o=[a]}else o=e.listTeamMembers(n.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=nh(a),d=a.model??null,u=null;Vu(c)&&(u=await _t(l,c));let f=yM(u),m=f.est>Nc;i.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:d,resume_incantation:m?_N(c,l,d!==null?{model:d}:{}):null})}if(s)return Y(t,{estimate:!0,legend:_M,guide_tokens:Nc,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2904
+ `),await new Promise(p=>{if(r?.signal?.aborted){let k=r.signal.reason==="SIGINT"?"SIGINT":"SIGTERM";return r.cancel?.(k),p(k==="SIGINT"?130:143)}let _=r?.streams,h=_?[_.stdin,_.stdout,_.stderr].map(k=>k.fd):void 0,g=h?.every(k=>typeof k=="number"),w=D3(m,f,{stdio:_?g?h:["pipe","pipe","pipe"]:"inherit",cwd:i,env:c}),y=_?.stdin?.readableFlowing;_&&!g&&(_.stdin.pipe(w.stdin),w.stdout?.pipe(_.stdout,{end:!1}),w.stderr?.pipe(_.stderr,{end:!1}));let E=!1,T=k=>{if(!E){E=!0;try{r?.cancel?.(k)}catch{}{try{w.kill(k)}catch{}Ae(w,{stdinEnd:!1,softDelayMs:0,killDelayMs:100}).catch(()=>{})}}},v=()=>T(r?.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM");r&&(r.stop=T);let b=()=>{r?.signal?.removeEventListener("abort",v),_&&!g&&(_.stdin.unpipe(w.stdin),y||_.stdin.pause(),w.stdout?.unpipe(_.stdout),w.stderr?.unpipe(_.stderr))};r?.signal?.addEventListener("abort",v,{once:!0}),r?.signal?.aborted&&v(),w.stdin?.on("error",()=>{}),w.on("error",k=>{b(),p(O(t,`failed to launch ${m}: ${k.message}`))}),w.on("exit",(k,I)=>{b(),r&&(r.signalObserved=I);let N=k??(I?128+(O3.signals[I]??1):1),A=hN(s);A&&N!==0&&N!==130&&N!==143&&!E&&!r?.signal?.aborted&&t.stderr.write(s+" exited with status "+N+". "+A+`
2905
+ `),p(N)})})}function F3(t,e,n){let r=F(n,"--team");if(r!==void 0){let i=e.findTeamByName(r);return i===null?O(t,`team not found: ${r}`):i}let s=dM(t,e,F(n,"--project"));return typeof s=="number"?s:uM(t,e,s,void 0)}async function j3(t,e,n,r){let s=fM(t,e,n,r);if(typeof s=="number")return s;let o=s.sessionid;if(o===null||o.trim().length===0)return O(t,`member ${s.alias} has no session yet \u2014 seed it first: lmctl seed <teamfile> (check with lmctl status <teamfile>)`);let i=new AbortController,a=()=>i.abort("SIGINT"),l=()=>i.abort("SIGTERM");process.once("SIGINT",a),process.once("SIGTERM",l);try{return await tT(t,{provider:nh(s),sessionid:o,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}},void 0,{env:t.env??process.env,signal:i.signal})}finally{process.removeListener("SIGINT",a),process.removeListener("SIGTERM",l)}}function yM(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let n=t.messages.reduce((r,s)=>r+(s.content?.length??0),0);return{chars:n,est:Math.ceil(n/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let n=M3(e).size;return{chars:n,est:Math.ceil(n/4),messages:t?.messages?.length??null,bytes:n}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function W3(t,e,n,r,s){let o;if(r!==void 0){let a=e.findTeamMemberByAlias(n.id,r);if(a===null||a.state==="retired")return O(t,`member not found: ${r}`);o=[a]}else o=e.listTeamMembers(n.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=nh(a),d=a.model??null,u=null;Vu(c)&&(u=await _t(l,c));let f=yM(u),m=f.est>Nc;i.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:d,resume_incantation:m?_N(c,l,d!==null?{model:d}:{}):null})}if(s)return Y(t,{estimate:!0,legend:_M,guide_tokens:Nc,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2907
2906
  `),t.stdout.write(`${_M}
2908
2907
  `);for(let a of i){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
2909
2908
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2911,7 +2910,7 @@ it is expected.
2911
2910
  session yourself:
2912
2911
  ${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
2913
2912
  (or: lmctl terminal --team ${n.name} --alias ${a.alias})
2914
- `)}return 0}function B3(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias> [--json]
2913
+ `)}return 0}function H3(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias> [--json]
2915
2914
  lmctl terminal <teamfile> <alias> [--json]
2916
2915
  lmctl terminal --run <id> [--alias A]
2917
2916
  lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
@@ -2944,25 +2943,25 @@ it is expected.
2944
2943
  tokens it surfaces the resume incantation so YOU can
2945
2944
  open & self-compact. Nothing is ever changed
2946
2945
  automatically; ${Nc} is a guide, not a gate.
2947
- `),0}var P3,Nc,_M,nT=C(()=>{"use strict";oo();Pt();Fn();he();mM();Nt();Tt();Mn();Hd();En();Bd();Ku();hM();Ee();Qs();P3={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Nc=2e5,_M="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function EM(t,e){let n=[],r=new Set;for(let[s,o]of t.split(/\r?\n/u).entries()){if(!o.trim())continue;let i=o.split(" ");if(i.length!==e||i.some(c=>!c.trim()))throw new Error(`invalid catalog entry on line ${s+1}: expected ${e} tab-separated fields`);let[a,l]=i;if(!/^[a-z0-9][a-z0-9_-]*$/u.test(a))throw new Error(`invalid catalog name on line ${s+1}: ${a}`);if(!/[.!?]$/u.test(l.trim()))throw new Error(`catalog description must be one sentence on line ${s+1}`);if(r.has(a))throw new Error(`duplicate catalog name on line ${s+1}: ${a}`);r.add(a),n.push(i.map(c=>c.trim()))}return n}function Mm(t){return EM(t,2).map(([e,n])=>({name:e,description:n}))}function rT(t){return EM(t,3).map(([e,n,r],s)=>{if(!/^https:\/\/lmctl\.com\/(?:[a-z0-9_-]+\/)*[a-z0-9._-]+\.lms$/u.test(r))throw new Error(`invalid autorun URL on line ${s+1}: ${r}`);return{name:e,description:n,url:r}})}var sT=C(()=>{"use strict"});var uT={};ye(uT,{QUICKRUN_DEPRECATION:()=>V3,listAutorunCatalog:()=>kM,listHelloCatalog:()=>dT,runAutorun:()=>ca,runQuickrun:()=>Q3});import{mkdtempSync as TM,rmSync as vM}from"node:fs";import{tmpdir as SM}from"node:os";import{existsSync as Rc,mkdirSync as X3,readFileSync as q3,statSync as G3,writeFileSync as la}from"node:fs";import{basename as bM,dirname as lT,join as $s,resolve as xc}from"node:path";async function kM(t=fetch){return`Available autorun examples:
2946
+ `),0}var $3,Nc,_M,nT=C(()=>{"use strict";oo();Pt();Fn();he();mM();Nt();Tt();Mn();Hd();En();Bd();Ku();hM();Ee();Qs();$3={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Nc=2e5,_M="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function EM(t,e){let n=[],r=new Set;for(let[s,o]of t.split(/\r?\n/u).entries()){if(!o.trim())continue;let i=o.split(" ");if(i.length!==e||i.some(c=>!c.trim()))throw new Error(`invalid catalog entry on line ${s+1}: expected ${e} tab-separated fields`);let[a,l]=i;if(!/^[a-z0-9][a-z0-9_-]*$/u.test(a))throw new Error(`invalid catalog name on line ${s+1}: ${a}`);if(!/[.!?]$/u.test(l.trim()))throw new Error(`catalog description must be one sentence on line ${s+1}`);if(r.has(a))throw new Error(`duplicate catalog name on line ${s+1}: ${a}`);r.add(a),n.push(i.map(c=>c.trim()))}return n}function Mm(t){return EM(t,2).map(([e,n])=>({name:e,description:n}))}function rT(t){return EM(t,3).map(([e,n,r],s)=>{if(!/^https:\/\/lmctl\.com\/(?:[a-z0-9_-]+\/)*[a-z0-9._-]+\.lms$/u.test(r))throw new Error(`invalid autorun URL on line ${s+1}: ${r}`);return{name:e,description:n,url:r}})}var sT=C(()=>{"use strict"});var uT={};ye(uT,{QUICKRUN_DEPRECATION:()=>J3,listAutorunCatalog:()=>kM,listHelloCatalog:()=>dT,runAutorun:()=>ca,runQuickrun:()=>Y3});import{mkdtempSync as TM,rmSync as vM}from"node:fs";import{tmpdir as SM}from"node:os";import{existsSync as Rc,mkdirSync as B3,readFileSync as X3,statSync as q3,writeFileSync as la}from"node:fs";import{basename as bM,dirname as lT,join as $s,resolve as xc}from"node:path";async function kM(t=fetch){return`Available autorun examples:
2948
2947
  ${rT(await Lc(IM,t)).map(n=>` ${n.name} ${n.description} ${n.url}`).join(`
2949
2948
  `)}
2950
2949
  `}async function dT(t=fetch){return`Available hello examples:
2951
- ${Mm(await Lc(J3,t)).map(n=>` ${n.name} ${n.description}`).join(`
2950
+ ${Mm(await Lc(G3,t)).map(n=>` ${n.name} ${n.description}`).join(`
2952
2951
  `)}
2953
- `}function K3(t){let e=[],n=t.split(/\r?\n/);for(let s=0;s<n.length;s+=1){let o=n[s];if(!o.trim()||o.trimStart().startsWith("//")){let i=o.match(/^\s*\/\/ autorun-role: ([A-Za-z][A-Za-z0-9_-]*) provider=([^\s]+) model=(?:"([^"\r\n]+)"|([^\s]+))\s*$/);if(i)e.push({name:i[1],provider:i[2],model:i[3]??i[4],line:s});else if(o.includes("autorun-role:"))throw new Error(`invalid autorun role declaration on line ${s+1}`);continue}break}let r=new Set;for(let s of e){if(r.has(s.name))throw new Error(`duplicate autorun role ${s.name} in header`);if(r.add(s.name),!t.includes(`@role(${s.name}.provider)`)||!t.includes(`@role(${s.name}.model)`))throw new Error(`role ${s.name} must use @role(${s.name}.provider) and @role(${s.name}.model) in the script`)}return e}function iT(t,e,n){let r=t.split(/\r?\n/);for(let s of e){let o=n.get(s.name)??s,i=/\s/.test(o.model)?JSON.stringify(o.model):o.model;r[s.line]=`// autorun-role: ${s.name} provider=${o.provider} model=${i}`;let a=JSON.stringify(o.provider).slice(1,-1),l=JSON.stringify(o.model).slice(1,-1);t=r.join(`
2952
+ `}function V3(t){let e=[],n=t.split(/\r?\n/);for(let s=0;s<n.length;s+=1){let o=n[s];if(!o.trim()||o.trimStart().startsWith("//")){let i=o.match(/^\s*\/\/ autorun-role: ([A-Za-z][A-Za-z0-9_-]*) provider=([^\s]+) model=(?:"([^"\r\n]+)"|([^\s]+))\s*$/);if(i)e.push({name:i[1],provider:i[2],model:i[3]??i[4],line:s});else if(o.includes("autorun-role:"))throw new Error(`invalid autorun role declaration on line ${s+1}`);continue}break}let r=new Set;for(let s of e){if(r.has(s.name))throw new Error(`duplicate autorun role ${s.name} in header`);if(r.add(s.name),!t.includes(`@role(${s.name}.provider)`)||!t.includes(`@role(${s.name}.model)`))throw new Error(`role ${s.name} must use @role(${s.name}.provider) and @role(${s.name}.model) in the script`)}return e}function iT(t,e,n){let r=t.split(/\r?\n/);for(let s of e){let o=n.get(s.name)??s,i=/\s/.test(o.model)?JSON.stringify(o.model):o.model;r[s.line]=`// autorun-role: ${s.name} provider=${o.provider} model=${i}`;let a=JSON.stringify(o.provider).slice(1,-1),l=JSON.stringify(o.model).slice(1,-1);t=r.join(`
2954
2953
  `).replaceAll(`@role(${s.name}.provider)`,a).replaceAll(`@role(${s.name}.model)`,l),r.splice(0,r.length,...t.split(/\r?\n/))}return r.join(`
2955
- `)}function aT(t,e){let n="autorun";try{let s=/^https?:\/\//i.test(e)?new URL(e).pathname:e,o=bM(s).replace(/\.lms$/i,"").replace(/[^A-Za-z0-9_-]/g,"_");o&&(n=o)}catch{}let r=$s(t,`${n}.lms`);for(let s=2;Rc(r);s+=1)r=$s(t,`${n}${s}.lms`);return r}async function Lc(t,e){let n=await e(t,{cache:"no-store"});if(!n.ok)throw new Error(`HTTP ${n.status} fetching ${t}`);return n.text()}function z3(t){let e=bM(t),n=$s(t,`${e}.lmctl`),r=2;for(;Rc(n);)n=$s(t,`${e}${r}.lmctl`),r+=1;return n}async function Y3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(cT),0;let r=t.includes("--no-seed");if(Dn(e)&&!r&&!t.includes("--no-terminal"))return e.stderr.write(`error: quickrun opens a TUI; use --no-terminal in non-interactive mode
2954
+ `)}function aT(t,e){let n="autorun";try{let s=/^https?:\/\//i.test(e)?new URL(e).pathname:e,o=bM(s).replace(/\.lms$/i,"").replace(/[^A-Za-z0-9_-]/g,"_");o&&(n=o)}catch{}let r=$s(t,`${n}.lms`);for(let s=2;Rc(r);s+=1)r=$s(t,`${n}${s}.lms`);return r}async function Lc(t,e){let n=await e(t,{cache:"no-store"});if(!n.ok)throw new Error(`HTTP ${n.status} fetching ${t}`);return n.text()}function K3(t){let e=bM(t),n=$s(t,`${e}.lmctl`),r=2;for(;Rc(n);)n=$s(t,`${e}${r}.lmctl`),r+=1;return n}async function z3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(cT),0;let r=t.includes("--no-seed");if(Dn(e)&&!r&&!t.includes("--no-terminal"))return e.stderr.write(`error: quickrun opens a TUI; use --no-terminal in non-interactive mode
2956
2955
  `),2;let s=t.includes("--no-terminal"),o=t.filter(h=>h!=="--no-seed"&&h!=="--no-terminal"&&h!=="--help"&&h!=="-h");if(o.length!==1)return e.stderr.write(`usage: lmctl quickrun <url-or-path>
2957
2956
  `),2;let i=o[0],a=n.cwd??process.cwd(),l=n.fetchFn??fetch,c;try{c=Fl(bn(e.env??process.env,n.initConfigPath))}catch(h){return e.stderr.write(h instanceof vt&&h.kind==="missing"?"error: no ~/.lmctl/init.toml found. Run `lmctl init` first, then try quickrun again.\n":"error: "+(h instanceof Error?h.message:String(h))+`
2958
2957
  `),1}let d;try{d=await ia(i,l,a)}catch(h){return e.stderr.write(`error: could not fetch ${i}: ${h instanceof Error?h.message:String(h)}
2959
2958
  `),1}let u;try{let h=aM(c.document).properties;for(let g of["Directory","NonInteractive"])if(Object.hasOwn(h,g))throw Error("Property '"+g+"' conflicts with an invocation fact in "+c.path+"; fix the file or run lmctl init");Object.assign(h,{Directory:a,NonInteractive:Dn(e)}),u=Ax(d,c.config,{properties:h,path:c.path,argv:[]})}catch(h){return e.stderr.write("error: "+(h instanceof Error?h.message:String(h))+`
2960
- `),1}let f=z3(a);if(X3(lT(f),{recursive:!0}),la(f,u,"utf8"),e.stdout.write(`Wrote ${f}
2959
+ `),1}let f=K3(a);if(B3(lT(f),{recursive:!0}),la(f,u,"utf8"),e.stdout.write(`Wrote ${f}
2961
2960
  `),await As([f],e)!==0)return e.stderr.write(`error: ${f} failed lint after substitution -- check the values in ~/.lmctl/init.toml.
2962
2961
  `),1;if(r)return e.stdout.write(`Edit ${f} if needed, then run: lmctl seed ${f}
2963
2962
  `),0;let p=await Bl([f],e);return p!==0?p:s?0:(n.openTerminal??eT)([f,"Lead"],e)}async function ca(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t[0]==="--help"||t[0]==="-h")return e.stdout.write(cT),0;let r=!1,s=new Map,o=0;for(;o<t.length&&t[o].startsWith("--");){let l=t[o++];if(l==="--save-only"){r=!0;continue}if(l==="--role-provider"||l==="--role-model"){let c=t[o++],d=c?.indexOf("=")??-1;if(!c||d<1||d===c.length-1)return e.stderr.write(`error: ${l} requires Role=value
2964
2963
  `),2;let u=c.slice(0,d),f=s.get(u)??{provider:"",model:""};l==="--role-provider"?f.provider=c.slice(d+1):f.model=c.slice(d+1),s.set(u,f);continue}return e.stderr.write(`error: unknown autorun option: ${l}
2965
- ${cT}`),2}t=t.slice(o);let i=n.fetchFn??fetch,a=n.cwd??e.cwd??process.cwd();try{if(t.length===0)return e.stdout.write(await kM(i)),0;let l=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t[0]??""),c=t.find(N=>N!=="--no-seed"&&N!=="--no-terminal")??"",d=/^https?:\/\//i.test(c)?new URL(c).pathname:c;if(/\.(lmctl|lmc)$/i.test(d)||!l&&Rc(xc(a,c))&&G3(xc(a,c)).isDirectory())return Y3(t,e,{...n,cwd:a});let[u,...f]=t;if(!u||u.startsWith("-"))throw new Error(`unknown quickrun option: ${u}`);let m,p,_=async N=>{let S=rT(await Lc(IM,i)).find(x=>x.name===N);if(!S)throw new Error(`unknown autorun example: ${N}; run lmctl autorun to list available examples`);return S.url};if(l)m=await _(u);else if(/^https?:\/\//i.test(u))m=u;else if(Rc(xc(a,u))||u.includes("/")||u.includes("\\"))p=xc(a,u);else if(/^[a-zA-Z0-9][a-zA-Z0-9_-]*\.lms$/.test(u))m=await _(u.slice(0,-4));else throw new Error("Expected a sample name, script URL, or local .lms file.");let h=m?await Lc(m,i):q3(p,"utf8"),g=K3(h),w=new Map;for(let N of g)w.set(N.name,{provider:N.provider,model:N.model});for(let[N,A]of s){if(!g.some(L=>L.name===N))throw new Error(`no autorun role named ${N}`);let S=w.get(N),x=A.provider||S.provider,R=A.model||(x===S.provider?S.model:(await(n.listModels??or)(x))[0]);if(!R)throw new Error(`no default model is available for ${x}; specify --role-model ${N}=MODEL`);w.set(N,{provider:x,model:R})}let y=(n.detectProviders??gf)(),E=g.filter(N=>!y.includes(w.get(N.name).provider)),T=new Map,v=y;for(let N of E){let A=v.find(x=>x!==w.get(N.name).provider);if(!A)continue;let S=await(n.listModels??or)(A);S.length&&T.set(N.name,{provider:A,model:S[0]})}if(T.size){e.stdout.write(`Suggested provider/model substitutions:
2964
+ ${cT}`),2}t=t.slice(o);let i=n.fetchFn??fetch,a=n.cwd??e.cwd??process.cwd();try{if(t.length===0)return e.stdout.write(await kM(i)),0;let l=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t[0]??""),c=t.find(N=>N!=="--no-seed"&&N!=="--no-terminal")??"",d=/^https?:\/\//i.test(c)?new URL(c).pathname:c;if(/\.(lmctl|lmc)$/i.test(d)||!l&&Rc(xc(a,c))&&q3(xc(a,c)).isDirectory())return z3(t,e,{...n,cwd:a});let[u,...f]=t;if(!u||u.startsWith("-"))throw new Error(`unknown quickrun option: ${u}`);let m,p,_=async N=>{let S=rT(await Lc(IM,i)).find(x=>x.name===N);if(!S)throw new Error(`unknown autorun example: ${N}; run lmctl autorun to list available examples`);return S.url};if(l)m=await _(u);else if(/^https?:\/\//i.test(u))m=u;else if(Rc(xc(a,u))||u.includes("/")||u.includes("\\"))p=xc(a,u);else if(/^[a-zA-Z0-9][a-zA-Z0-9_-]*\.lms$/.test(u))m=await _(u.slice(0,-4));else throw new Error("Expected a sample name, script URL, or local .lms file.");let h=m?await Lc(m,i):X3(p,"utf8"),g=V3(h),w=new Map;for(let N of g)w.set(N.name,{provider:N.provider,model:N.model});for(let[N,A]of s){if(!g.some(L=>L.name===N))throw new Error(`no autorun role named ${N}`);let S=w.get(N),x=A.provider||S.provider,R=A.model||(x===S.provider?S.model:(await(n.listModels??or)(x))[0]);if(!R)throw new Error(`no default model is available for ${x}; specify --role-model ${N}=MODEL`);w.set(N,{provider:x,model:R})}let y=(n.detectProviders??gf)(),E=g.filter(N=>!y.includes(w.get(N.name).provider)),T=new Map,v=y;for(let N of E){let A=v.find(x=>x!==w.get(N.name).provider);if(!A)continue;let S=await(n.listModels??or)(A);S.length&&T.set(N.name,{provider:A,model:S[0]})}if(T.size){e.stdout.write(`Suggested provider/model substitutions:
2966
2965
  `);for(let A of g){let S=T.get(A.name);if(S){let x=w.get(A.name);e.stdout.write(` ${A.name}: ${x.provider}/${x.model} -> ${S.provider}/${S.model}
2967
2966
  `)}}let N="save";if(!r&&!Dn(e)){let A=new Or(e,n.ask);try{if(N=(await A.ask("Choose accept, edit, or save [accept/edit/save]: ")).toLowerCase(),N==="edit")for(let S of g){if(!T.has(S.name))continue;let x=v.filter(M=>M!==w.get(S.name).provider),R=await A.ask(`Provider for ${S.name} (${x.join(", ")}): `);if(!x.includes(R))throw new Error(`provider must be one of: ${x.join(", ")}`);let L=await(n.listModels??or)(R);if(!L.length)throw new Error(`no models are available for ${R}`);let D=await A.ask(`Model for ${S.name} (${L.join(", ")}): `);if(!L.includes(D))throw new Error(`model must be one of: ${L.join(", ")}`);T.set(S.name,{provider:R,model:D})}else if(N!=="accept"&&N!=="save")throw new Error("choose accept, edit, or save")}finally{A.close()}}for(let[A,S]of T)w.set(A,S);if(r||Dn(e)||N==="save"){let A=aT(a,u);return la(A,iT(h,g,w),{flag:"wx",encoding:"utf8"}),e.stdout.write(`Saved mapped script: ${A}
2968
2967
  Edit it, then run: lmscript ${A}
@@ -2972,10 +2971,10 @@ Edit it, then run: lmscript ${N}
2972
2971
  Edit it, then run: lmscript ${N}
2973
2972
  `),0}e.stderr.write(`Running ${m??p}
2974
2973
  `);let b=n.launch??Jl,k={...e,cwd:a,...n.initConfigPath?{env:{...e.env,LMCTL_HOME:lT(n.initConfigPath)}}:{}};if(!g.length&&!r){if(p)return b([p,...f],k);let N=TM($s(SM(),"lmctl-quickrun-"));try{let A=$s(N,"download.lms");return la(A,h,"utf8"),await b(["--base-dir",a,"--source-name",m,A,...f],k)}finally{vM(N,{recursive:!0,force:!0})}}let I=TM($s(SM(),"lmctl-autorun-"));try{let N=$s(I,"autorun.lms");la(N,h,"utf8");let A=p?lT(p):a;return await b(["--base-dir",A,"--source-name",m??p,N,...f],k)}finally{vM(I,{recursive:!0,force:!0})}}catch(l){return e.stderr.write(`error: ${l instanceof Error?l.message:String(l)}
2975
- `),1}}async function Q3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.length===0)try{let i=await Lc(`${oT}/index.txt`,n.fetchFn??fetch);return e.stdout.write(i.endsWith(`
2974
+ `),1}}async function Y3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.length===0)try{let i=await Lc(`${oT}/index.txt`,n.fetchFn??fetch);return e.stdout.write(i.endsWith(`
2976
2975
  `)?i:`${i}
2977
2976
  `),0}catch(i){return e.stderr.write(`error: ${i instanceof Error?i.message:String(i)}
2978
- `),1}if(/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t[0]??""))return ca([`${oT}/${t[0]}.lms`,...t.slice(1)],e,n);let s=/^[a-zA-Z0-9][a-zA-Z0-9_-]*\.lms$/i.test(t[0]??""),o=n.cwd??e.cwd??process.cwd();return s&&!Rc(xc(o,t[0]))?ca([`${oT}/${t[0]}`,...t.slice(1)],e,n):ca(t,e,n)}var IM,J3,oT,cT,V3,$m=C(()=>{"use strict";lM();Jy();he();Eo();km();$r();nT();ef();Eo();Dl();sT();IM="https://lmctl.com/autorun/index.txt",J3="https://lmctl.com/helloexample/index.txt",oT="https://lmctl.com/quickrun",cT=`usage: lmctl autorun [--save-only] [example|url|file.lms] [script arguments...]
2977
+ `),1}if(/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t[0]??""))return ca([`${oT}/${t[0]}.lms`,...t.slice(1)],e,n);let s=/^[a-zA-Z0-9][a-zA-Z0-9_-]*\.lms$/i.test(t[0]??""),o=n.cwd??e.cwd??process.cwd();return s&&!Rc(xc(o,t[0]))?ca([`${oT}/${t[0]}`,...t.slice(1)],e,n):ca(t,e,n)}var IM,G3,oT,cT,J3,$m=C(()=>{"use strict";lM();Jy();he();Eo();km();$r();nT();ef();Eo();Dl();sT();IM="https://lmctl.com/autorun/index.txt",G3="https://lmctl.com/helloexample/index.txt",oT="https://lmctl.com/quickrun",cT=`usage: lmctl autorun [--save-only] [example|url|file.lms] [script arguments...]
2979
2978
 
2980
2979
  With no sample, list the curated hosted scripts from lmctl.com/autorun/index.txt.
2981
2980
  Example: lmctl autorun lmdraw_solo
@@ -2995,8 +2994,8 @@ Scripts may declare providers with leading comments:
2995
2994
  Use @role(Lead.provider) and @role(Lead.model) in the script. Missing providers
2996
2995
  produce a suggested installed-provider/model mapping. --save-only saves that
2997
2996
  mapping to a numbered .lms file without running it.
2998
- `,V3=`quickrun is deprecated; use lmctl autorun for curated examples.
2999
- `});var xM={};ye(xM,{runHello:()=>Z3});async function Z3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(NM),0;if(t.length>1||t.some(s=>s.startsWith("-")))return e.stderr.write(`${NM}`),2;let r=n.fetchFn??fetch;try{if(t.length===0)return e.stdout.write(await dT(r)),0;let o=Mm(await r(AM,{cache:"no-store"}).then(async i=>{if(!i.ok)throw new Error(`HTTP ${i.status} fetching ${AM}`);return i.text()})).find(i=>i.name===t[0]);return o?ca([`https://lmctl.com/helloexample/${o.name}.lms`],e,n):(e.stderr.write(`error: unknown hello example: ${t[0]}; run lmctl hello to list available names
2997
+ `,J3=`quickrun is deprecated; use lmctl autorun for curated examples.
2998
+ `});var xM={};ye(xM,{runHello:()=>Q3});async function Q3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(NM),0;if(t.length>1||t.some(s=>s.startsWith("-")))return e.stderr.write(`${NM}`),2;let r=n.fetchFn??fetch;try{if(t.length===0)return e.stdout.write(await dT(r)),0;let o=Mm(await r(AM,{cache:"no-store"}).then(async i=>{if(!i.ok)throw new Error(`HTTP ${i.status} fetching ${AM}`);return i.text()})).find(i=>i.name===t[0]);return o?ca([`https://lmctl.com/helloexample/${o.name}.lms`],e,n):(e.stderr.write(`error: unknown hello example: ${t[0]}; run lmctl hello to list available names
3000
2999
  `),2)}catch(s){return e.stderr.write(`error: ${s instanceof Error?s.message:String(s)}
3001
3000
  `),1}}var AM,NM,RM=C(()=>{"use strict";$m();sT();AM="https://lmctl.com/helloexample/index.txt",NM=`usage: lmctl hello [name]
3002
3001
 
@@ -3006,16 +3005,16 @@ The provider must be installed and configured. Run lmctl autorun for scripts
3006
3005
  that need multiple roles or more than one prompt.
3007
3006
 
3008
3007
  -h, --help Display help
3009
- `});var OM={};ye(OM,{runPrices:()=>r5});import{existsSync as e5}from"node:fs";import{resolve as LM}from"node:path";function Pm(t,e,n="price snapshot unavailable"){return e?Y(t,{schema_version:1,status:"unavailable",reason:n}):t.stdout.write(`unavailable: ${n}
3010
- `),0}function t5(t){let e=t?.code;return typeof e=="string"&&/SQLITE_(BUSY|LOCKED|READONLY|CANTOPEN)/.test(e)}function CM(t){return t.dal!==void 0?{db:t.dal,owned:!1}:{db:Ye({path:Pe(t),recover:!1}),owned:!0}}function n5(t){if(t.owned)try{t.db.close()}catch{}}async function r5(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(Um),0;let n=t[0];return n!=="update"&&n!=="show"?(e.stderr.write(`error: expected update or show
3011
- ${Um}`),2):n==="update"?s5(t.slice(1),e):o5(t.slice(1),e)}async function s5(t,e){let n=ce(t,["--aliases"],["--json"]);if(n.error||n.positionals.length>1)return e.stderr.write(`error: ${n.error??"update accepts at most one FILE"}
3008
+ `});var OM={};ye(OM,{runPrices:()=>n5});import{existsSync as Z3}from"node:fs";import{resolve as LM}from"node:path";function Pm(t,e,n="price snapshot unavailable"){return e?Y(t,{schema_version:1,status:"unavailable",reason:n}):t.stdout.write(`unavailable: ${n}
3009
+ `),0}function e5(t){let e=t?.code;return typeof e=="string"&&/SQLITE_(BUSY|LOCKED|READONLY|CANTOPEN)/.test(e)}function CM(t){return t.dal!==void 0?{db:t.dal,owned:!1}:{db:Ye({path:Pe(t),recover:!1}),owned:!0}}function t5(t){if(t.owned)try{t.db.close()}catch{}}async function n5(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(Um),0;let n=t[0];return n!=="update"&&n!=="show"?(e.stderr.write(`error: expected update or show
3010
+ ${Um}`),2):n==="update"?r5(t.slice(1),e):s5(t.slice(1),e)}async function r5(t,e){let n=ce(t,["--aliases"],["--json"]);if(n.error||n.positionals.length>1)return e.stderr.write(`error: ${n.error??"update accepts at most one FILE"}
3012
3011
  ${Um}`),2;let r=z(n,"--json"),s=n.positionals[0],o=F(n,"--aliases"),i;try{if(s!==void 0){let l=LM(e.cwd??process.cwd(),s),c=o===void 0?void 0:LM(e.cwd??process.cwd(),o),d=hh(l,c);i=CM(e);let u=_h(i.db.db,d);return r?Y(e,{...fT(si(i.db.db),e.env??process.env),status:u}):e.stdout.write(`${u}
3013
3012
  `),0}if(o!==void 0)return e.stderr.write(`error: --aliases requires FILE
3014
3013
  `),2;i=CM(e);let a=await gh(i.db.db,{env:e.env??process.env,force:!0});return r?Y(e,{...fT(a.snapshot,e.env??process.env),status:a.status}):e.stdout.write(`${a.status}
3015
- `),0}catch(a){return t5(a)?(r?Y(e,{schema_version:1,status:"deferred",reason:"database busy or read-only"}):e.stdout.write(`deferred
3014
+ `),0}catch(a){return e5(a)?(r?Y(e,{schema_version:1,status:"deferred",reason:"database busy or read-only"}):e.stdout.write(`deferred
3016
3015
  `),0):(e.stderr.write(`error: ${a instanceof Error?a.message:String(a)}
3017
- `),1)}finally{i!==void 0&&n5(i)}}function fT(t,e){if(t===null)return{schema_version:1,status:"unavailable",reason:"price snapshot unavailable"};let n=Date.parse(t.fetchedAt),r=Number.isFinite(n)?Math.max(0,Math.floor((Date.now()-n)/1e3)):null;return{schema_version:1,status:"ok",source:t.source,generated_at:t.generatedAt,fetched_at:t.fetchedAt,loaded_at:t.loadedAt,hash:t.sha256,record_count:t.recordCount,age_seconds:r,stale:r!==null&&r>Js(e)/1e3}}async function o5(t,e){let n=ce(t,["--provider"],["--json"]);if(n.error||n.positionals.length>1)return e.stderr.write(`error: ${n.error??"show accepts at most one MODEL"}
3018
- ${Um}`),2;let r=z(n,"--json"),s=n.positionals[0],o,i=!1;try{if(e.dal!==void 0)o=e.dal.db,i=!0;else{let a=Pe(e);if(!e5(a))return Pm(e,r,"database unavailable");o=gr(a)}}catch(a){return Pm(e,r,a instanceof Error?a.message:"database unavailable")}try{let a=si(o);if(a===null)return Pm(e,r);let l=fT(a,e.env??process.env);if(s===void 0)return r?Y(e,l):e.stdout.write(`source: ${String(l.source)}
3016
+ `),1)}finally{i!==void 0&&t5(i)}}function fT(t,e){if(t===null)return{schema_version:1,status:"unavailable",reason:"price snapshot unavailable"};let n=Date.parse(t.fetchedAt),r=Number.isFinite(n)?Math.max(0,Math.floor((Date.now()-n)/1e3)):null;return{schema_version:1,status:"ok",source:t.source,generated_at:t.generatedAt,fetched_at:t.fetchedAt,loaded_at:t.loadedAt,hash:t.sha256,record_count:t.recordCount,age_seconds:r,stale:r!==null&&r>Js(e)/1e3}}async function s5(t,e){let n=ce(t,["--provider"],["--json"]);if(n.error||n.positionals.length>1)return e.stderr.write(`error: ${n.error??"show accepts at most one MODEL"}
3017
+ ${Um}`),2;let r=z(n,"--json"),s=n.positionals[0],o,i=!1;try{if(e.dal!==void 0)o=e.dal.db,i=!0;else{let a=Pe(e);if(!Z3(a))return Pm(e,r,"database unavailable");o=gr(a)}}catch(a){return Pm(e,r,a instanceof Error?a.message:"database unavailable")}try{let a=si(o);if(a===null)return Pm(e,r);let l=fT(a,e.env??process.env);if(s===void 0)return r?Y(e,l):e.stdout.write(`source: ${String(l.source)}
3019
3018
  generated_at: ${String(l.generated_at??"unknown")}
3020
3019
  hash: ${String(l.hash)}
3021
3020
  records: ${String(l.record_count)}
@@ -3039,23 +3038,23 @@ cache write: ${String(y.rates.input_cache_write_per_1m_tokens??"n/a")}
3039
3038
  show [MODEL] [--provider PROVIDER] [--json]
3040
3039
  Read the stored snapshot without files/network, or show its source and age.
3041
3040
  Rates are base-tier USD per million; 1-hour write blends need turn counters.
3042
- `});function yt(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);return Number.isFinite(e)?Math.round(Math.min(1,Math.max(0,e))*1e6)/1e6:null}function pr(t,e){if(t==null||typeof t=="boolean")return null;let n=Number(t);return yt(e==="percent"?n/100:n)}function MM(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);if(!Number.isFinite(e))return null;try{return new Date(Math.trunc(e)*1e3).toISOString().replace(".000Z","Z")}catch{return null}}function $M(t){if(typeof t!="string"||t.trim()==="")return null;let e=Date.parse(t);return Number.isFinite(e)?Math.floor(e/1e3):null}function PM(t){let e=Number(t);return Number.isFinite(e)?e===300||e>=240&&e<=360?"five_hour":e===10080||e>=9e3&&e<=11500?"weekly":e===43200||e===44640||e>=38e3&&e<=46e3?"monthly":"unknown":"unknown"}function UM(t){let e=String(t??"").trim().toLowerCase().replace(/-/g,"_").split("_").filter(Boolean);for(let n of[e[0],e.at(-1)]){if(n?.startsWith("5h")||n?.startsWith("five")||n==="session")return"five_hour";if(n?.startsWith("7d")||n?.startsWith("seven")||n?.startsWith("week"))return"weekly";if(n?.startsWith("30d")||n?.startsWith("month"))return"monthly"}return"unknown"}function da(t,e=[]){let n=t==null?"":String(t);for(let r of e)typeof r=="string"&&r.length>=4&&(n=n.replaceAll(r,"***REDACTED***"));for(let r of a5)n=n.replace(r,"***REDACTED***");return n}function Ct(t){let e=yt(t.used_fraction),n=yt(t.remaining_fraction),r=t.resets_at==null?$M(t.resets_at_iso):Number(t.resets_at),s=t.resets_at_iso==null?MM(r):MM($M(t.resets_at_iso)),o={bucket_id:t.bucket_id,...t.group_name!=null?{group_name:t.group_name}:{},window_type:t.window_type??"unknown",used_fraction:e??(n===null?null:yt(1-n)),remaining_fraction:n??(e===null?null:yt(1-e)),resets_at:r==null||!Number.isFinite(r)?null:Math.trunc(r),resets_at_iso:s,is_exhausted:t.is_exhausted??(n!==null?n<=0:e!==null?e>=1:null)};for(let i of["raw_value","raw_scale","limit_name","metered_feature","allowed","limit_reached"])t[i]!=null&&(o[i]=t[i]);return o}function dt(t,e,n={}){let r={$schema:i5,provider:t,status:e,source:n.source??null,read_at:n.read_at??Math.floor(Date.now()/1e3),account_id:n.account_id??null,plan_type:n.plan_type??null,ordinary_usage_allowed:n.ordinary_usage_allowed??null,buckets:n.buckets??[]};for(let s of["credits","spend_control","characteristics","reason","detail","retry_after_seconds"])n[s]!=null&&(r[s]=n[s]);return r}function et(t,e,n,r,s,o=[],i){return dt(t,e,{source:s??null,reason:n,...r==null?{}:{detail:da(r,o)},...i==null?{}:{retry_after_seconds:i}})}function Fm(t){let e=t.get("retry-after");if(e===null)return null;let n=Number.parseFloat(e);return Number.isFinite(n)&&n>=0?Math.trunc(n):null}function Bt(t,e,n,r=[],s){if(!t.debug&&!t.onRawResponse)return;let o=da(n,[...r].filter(i=>typeof i=="string")).replace(/("(?:access[_-]?token|refresh[_-]?token|authorization|api[_-]?key|password)"\s*:\s*")[^"\r\n]*(")/gi,"$1***REDACTED***$2");t.onRawResponse?.({source:e,...s===void 0?{}:{http_status:s},text:o}),t.debug?.(`[debug] ${e}${s===void 0?"":` HTTP ${s}`} raw response:
3043
- ${o}`)}function Ps(t,e,n=[]){let r;try{let o=JSON.parse(e);r=typeof o?.error=="string"?o.error:o?.error?.message??o?.message??o?.detail}catch{/^\s*[<{[]/.test(e)||(r=e.trim())}if(typeof r!="string"||!r.trim())return t;let s=da(r,n);return{...t,detail:s,provider_message:s}}var i5,a5,hr=C(()=>{"use strict";i5="https://lmctl.com/schemas/lmratelimit-v1.json";a5=[/sk-ant-[A-Za-z0-9_-]{4,}/g,/sk-[A-Za-z0-9_-]{16,}/g,/\bbearer\s+[A-Za-z0-9._-]{8,}/gi,/\boat01[-_][A-Za-z0-9_-]{8,}/g,/\bcsrf[-_][A-Za-z0-9_-]{4,}/gi,/\b(?:csrf[-_]?token|x-codeium-csrf-token)\s*[:=]\s*['"]?[A-Za-z0-9._-]{4,}/gi]});import{spawnSync as l5}from"node:child_process";import{readdirSync as c5,readFileSync as d5}from"node:fs";import{join as u5}from"node:path";function E5(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("ANTIGRAVITY")))}function T5(t){let e=t.trim().toLowerCase(),n={"gemini models":"gemini","claude and gpt models":"3p",gemini:"gemini","3p models":"3p","3p":"3p"};return n[e]?n[e]:e.replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function v5(t){let e=t.toLowerCase();return e.includes("weekly")?"weekly":e.includes("five hour")||e.includes("5-hour")||e.includes("5 hour")?"five_hour":e.includes("monthly")||e.includes("month")?"monthly":null}function S5(t){let e={weekly:"weekly",five_hour:"5h",monthly:"monthly"},n=[];for(let r of t.split(/\r?\n/)){let s=r.trim().split(" ").map(l=>l.trim());if(s.length<3||!s[0]||!s[1])continue;let o=v5(s[1]);if(!o)continue;let i=Number(s[2].replace(/%$/,"").trim());if(!Number.isFinite(i))continue;let a=yt(i/100);n.push(Ct({bucket_id:`${T5(s[0])}-${e[o]}`,group_name:s[0],window_type:o,used_fraction:a===null?null:yt(1-a),remaining_fraction:a,resets_at_iso:s[3]||null,raw_value:i,raw_scale:"remaining_percent"}))}return n.sort((r,s)=>String(r.group_name??"").localeCompare(String(s.group_name??""))||String(r.bucket_id??"").localeCompare(String(s.bucket_id??"")))}function Cc(t,e,n){return et("agy","provider_unavailable",t,e,"agy_cli_print")}function b5(t,e,n={}){try{let r=g5(Math.max(t,60)*1e3,E5(e));if(Bt(n,"agy_cli_print",r.stdout??"",[e.ANTIGRAVITY_CSRF_TOKEN]),r.error?.code==="ENOENT")return Cc("agy_not_found","the agy CLI is not on PATH",t);if(r.error?.code==="ETIMEDOUT")return Cc("cli_timeout","agy -p /usage did not finish in time",t);if(r.error)return Cc("cli_failed",r.error.message,t);let s=S5(r.stdout??"");return s.length===0?Cc("cli_unparseable",`exit ${r.status??1}; no buckets parsed from CLI output`,t):dt("agy","ok",{source:"agy_cli_print",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:s})}catch(r){return Cc("cli_failed",r instanceof Error?r.message:String(r),t)}}function WM(t){if(!t||typeof t!="string")return null;let e=t.trim();if(!e||e.includes("@")||e.includes("/")||e.includes("\\")||e.includes("?")||e.includes("#")||e.includes("://")||/\s/.test(e))return null;let n;try{n=new URL(`http://${e}`)}catch{return null}if(n.username||n.password||n.pathname!=="/"||n.search||n.hash)return null;let r=n.hostname.toLowerCase();if(!(r==="localhost"||r==="127.0.0.1"||r==="[::1]"||r==="::1")||!n.port)return null;let o=Number(n.port);return!Number.isInteger(o)||o<1||o>65535||n.port!==String(o)?null:`${r==="::1"||r==="[::1]"?"[::1]":r}:${o}`}function I5(t){let e=[],n=new Set,r=(s,o,i)=>{if(!s||!o)return;let a=WM(s);!a||n.has(`${a}\0${o}`)||(n.add(`${a}\0${o}`),e.push([a,o,i]))};r(t[FM],t[jM],-1);try{for(let s of c5("/proc"))if(/^\d+$/.test(s))try{let o={};for(let i of d5(u5("/proc",s,"environ")).toString("utf8").split("\0")){let a=i.indexOf("=");a>0&&(o[i.slice(0,a)]=i.slice(a+1))}r(o[FM],o[jM],Number(s))}catch{}}catch{}return e}function k5(t){if(typeof t!="object"||t===null)return null;let e=t.response;if(typeof e!="object"||e===null)return null;let n=e.groups;if(!Array.isArray(n))return null;let r=[];for(let s of n){if(typeof s!="object"||s===null)continue;let o=s,i=typeof o.displayName=="string"?o.displayName:null;if(Array.isArray(o.buckets))for(let a of o.buckets){if(typeof a!="object"||a===null)continue;let l=a,c=pr(l.remainingFraction,"fraction");r.push(Ct({bucket_id:l.bucketId??l.displayName??"unknown",group_name:i,window_type:UM(l.window),used_fraction:c===null?null:yt(1-c),remaining_fraction:c,resets_at_iso:l.resetTime??null,raw_value:l.remainingFraction??null,raw_scale:"remaining_fraction"}))}}return r.length===0?null:(r.sort((s,o)=>String(s.group_name??"").localeCompare(String(o.group_name??""))||String(s.bucket_id??"").localeCompare(String(o.bucket_id??""))),dt("agy","ok",{source:"agy_connect_rpc",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:r}))}async function A5(t,e,n={}){try{let s=w5(e).map(([a,l,c])=>[WM(a),l,c]).filter(a=>a[0]!==null);if(s.length===0)return et("agy","provider_unavailable","no_active_session","no live agy process exposed ANTIGRAVITY_LS_ADDRESS/ANTIGRAVITY_CSRF_TOKEN","agy_connect_rpc");let o=[],i=Date.now()+t*1e3;for(let[a,l,c]of s){let d=i-Date.now();if(d<=0){o.push("overall connect deadline exceeded");break}try{let u=await y5(`http://${a}${f5}`,{"Content-Type":"application/json","Connect-Protocol-Version":"1","x-codeium-csrf-token":l},d);if(Bt(n,"agy_connect_rpc",u.body,[l],u.status),u.status===200){let f;try{f=JSON.parse(u.body)}catch{o.push(`pid=${c}: unparseable response`);continue}let m=k5(f);if(m)return m;o.push(`pid=${c}: response had no quota groups`)}else u.status===401||u.status===403?o.push(`pid=${c}: HTTP ${u.status} unauthorized`):o.push(`pid=${c}: HTTP ${u.status}`)}catch(u){o.push(`pid=${c}: ${u instanceof Error?u.message:String(u)}`)}}return et("agy","provider_unavailable","no_active_session",`all candidate language servers failed: ${o.slice(0,5).join("; ")}`,"agy_connect_rpc",s.map(([,a])=>a))}catch(r){return et("agy","provider_unavailable","connect_failed",r instanceof Error?r.message:String(r),"agy_connect_rpc")}}async function HM(t){let e=await A5(t.timeoutSeconds,t.env,t);if(e.status==="ok")return e;let n=b5(t.timeoutSeconds,t.env,t);return n.status==="ok"?n:et("agy","provider_unavailable","cli_and_language_server_unavailable",`cli: ${String(n.reason??n.status)} (${String(n.detail??"no detail")}); connect: ${String(e.reason??e.status)} (${String(e.detail??"no detail")})`,"agy_cli_print")}var FM,jM,f5,m5,p5,h5,_5,g5,y5,w5,BM=C(()=>{"use strict";hr();hr();FM="ANTIGRAVITY_LS_ADDRESS",jM="ANTIGRAVITY_CSRF_TOKEN",f5="/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary",m5=["-p","/usage"],p5=(t,e)=>{let n=l5("agy",m5,{encoding:"utf8",timeout:t,maxBuffer:16777216,env:e,stdio:["ignore","pipe","ignore"]});return{status:n.status,stdout:typeof n.stdout=="string"?n.stdout:"",error:n.error}},h5=async(t,e,n)=>{let r=await fetch(t,{method:"POST",headers:e,body:"{}",signal:AbortSignal.timeout(n),redirect:"error"});return{status:r.status,body:await r.text()}},_5=t=>I5(t),g5=p5,y5=h5,w5=_5});import{randomUUID as GM}from"node:crypto";import{mkdirSync as N5,readFileSync as mT,realpathSync as x5,renameSync as R5,rmSync as pT,statSync as XM,writeFileSync as JM}from"node:fs";import{homedir as L5}from"node:os";import{join as hT}from"node:path";import{setTimeout as C5}from"node:timers/promises";function yT(t){return hT(t.CLAUDE_CONFIG_DIR??hT(t.HOME??L5(),".claude"),".credentials.json")}function _T(t){let e=JSON.parse(mT(t,"utf8"));if(!e||typeof e!="object"||Array.isArray(e))throw new Error("invalid credential document");return e}function gT(t){let e=t.claudeAiOauth;return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function VM(t){if(t.CLAUDE_CODE_OAUTH_TOKEN)return{oauth:{accessToken:t.CLAUDE_CODE_OAUTH_TOKEN}};let e=yT(t);try{let n=gT(_T(e));return typeof n?.accessToken=="string"&&n.accessToken?{oauth:n,path:x5(e)}:{error:"not_claude_ai_subscriber"}}catch(n){return n.code==="ENOENT"?{error:t.ANTHROPIC_API_KEY?"not_claude_ai_subscriber":"no_credentials_found"}:{error:"credentials_unreadable"}}}function jm(t){return typeof t.expiresAt=="number"&&Date.now()+M5>=t.expiresAt}function qM(t,e){return t.accessToken===e.accessToken&&t.refreshToken===e.refreshToken}async function $5(t,e){let n=`${t}.lmctl-refresh.lock`,r=hT(n,"owner.json"),s=GM();for(;;){e.throwIfAborted();try{N5(n,{mode:448});try{JM(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw pT(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(mT(r,"utf8")).token===s&&pT(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(mT(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-XM(n).mtimeMs>6e4}catch{try{i=Date.now()-XM(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await C5(50,void 0,{signal:e})}}}async function KM(t,e){if(!t.path||typeof t.oauth?.refreshToken!="string"||!t.oauth.refreshToken)throw new Error("no_refresh_token");let n=await $5(t.path,e);try{let r=gT(_T(t.path));if(!r||typeof r.accessToken!="string")throw new Error("credentials_changed");if(!qM(r,t.oauth)&&!jm(r))return r;if(typeof r.refreshToken!="string"||!r.refreshToken)throw new Error("no_refresh_token");let s=await fetch(D5,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:r.refreshToken,client_id:O5})});if(!s.ok)throw new Error(`refresh_http_${s.status}`);let o=await s.json();if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.expires_in!="number"||!Number.isFinite(o.expires_in)||o.expires_in<=0||o.refresh_token!==void 0&&(typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)))throw new Error("invalid_refresh_response");let i=Math.floor(Date.now()+o.expires_in*1e3);if(!Number.isSafeInteger(i)||i<=Date.now())throw new Error("invalid_refresh_response");let a=_T(t.path),l=gT(a);if(!l||!qM(r,l)){if(l&&typeof l.accessToken=="string"&&!jm(l))return l;throw new Error("credentials_changed")}let c={...l,accessToken:o.access_token,refreshToken:o.refresh_token??r.refreshToken,expiresAt:i,...typeof o.scope=="string"?{scopes:o.scope.split(/\s+/).filter(Boolean)}:{}},d=`${t.path}.${GM()}.tmp`;try{JM(d,JSON.stringify({...a,claudeAiOauth:c}),{flag:"wx",mode:384}),R5(d,t.path)}finally{pT(d,{force:!0})}return c}finally{n()}}var O5,D5,M5,zM=C(()=>{"use strict";O5="9d1c250a-e61b-44d9-88ed-5944d1962f5e",D5="https://console.anthropic.com/v1/oauth/token",M5=3e5});import{spawnSync as ZM}from"node:child_process";function F5(t){let e=String(t??"").toLowerCase();return e.includes("session")||e.includes("five")||e.includes("5h")?"five_hour":e.includes("week")||e.includes("seven")||e.includes("7d")?"weekly":e.includes("month")||e.includes("30d")?"monthly":"unknown"}function e$(t){return Object.fromEntries(Object.entries(t).filter(([e])=>e!=="CLAUDECODE"))}function j5(t){try{let e=ZM("claude",["--version"],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],env:e$(t)}),n=typeof e.stdout=="string"?e.stdout.trim().split(/\s+/)[0]:"";if(n)return`claude-code/${n}`}catch{}return"claude-code/unknown"}function Hn(t,e,n,r="claude_oauth_api",s){return et("claude",t,e,n,r,void 0,s)}function W5(t){let e=t.get("retry-after");if(!e)return;let n=Number.parseInt(e,10);return Number.isFinite(n)?n:void 0}function H5(t){if(!t)return;let e=/^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)?(?:\s*\(([^)]+)\))?$/i.exec(t.trim());if(!e)return;let n=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"].indexOf(e[1].slice(0,3).toLowerCase());if(n<0)return;let r=Number(e[3]),s=Number(e[4]??0);(e[5]??"").toLowerCase()==="pm"&&r!==12&&(r+=12),(e[5]??"").toLowerCase()==="am"&&r===12&&(r=0);let o=new Date(Date.UTC(new Date().getUTCFullYear(),n,Number(e[2]),r,s));return Number.isFinite(o.getTime())?Math.floor(o.getTime()/1e3):void 0}function X5(t){let e=[];for(let n of t.split(/\r?\n/)){let r=B5.exec(n.trim());if(!r)continue;let s=r[1].trim(),i=s.toLowerCase()==="session",a=/\(([^)]+)\)/.exec(s)?.[1]?.trim()??s,l=i?"session":a.toLowerCase()==="all models"?"week-all-models":`week-scoped-${a}`,c=i?"five_hour":"weekly";e.push(Ct({bucket_id:l,group_name:i?"session":"weekly",window_type:c,used_fraction:pr(Number(r[2]),"percent"),raw_value:Number(r[2]),raw_scale:"used_percent",resets_at:H5(r[3])}))}return e.sort((n,r)=>String(n.window_type).localeCompare(String(r.window_type))||String(n.bucket_id).localeCompare(String(r.bucket_id)))}function q5(t){let e={},n;for(let r of t.split(/\r?\n/)){let s=/^Last\s+(\S+)\s*[·-]\s*(\d+)\s+requests?\s*[·-]\s*(\d+)\s+sessions?\s*$/.exec(r.trim());if(s){n={requests:Number(s[2]),sessions:Number(s[3])},e[`window_${s[1].toLowerCase()}`]=n;continue}let o=/^\s+(\d+)%\s+of your usage\s+(.+?)\s*$/.exec(r);if(!o||!n)continue;let i=o[2].toLowerCase(),a=i.includes(">150k context")?"pct_high_context":i.includes("active for 8+ hours")?"pct_long_sessions":i.includes("subagent-heavy")?"pct_subagent_heavy":i.includes("ran in parallel")?"pct_parallel_sessions":void 0;a&&(n[a]=Number(o[1]))}return e}function G5(t,e){let n=t&&typeof t=="object"?t:void 0,r=e&&typeof e=="object"?e:void 0,s=!!(n?.limit||n?.used||n?.percent!==void 0);if(!s&&(!r||r.is_enabled===!1))return;let o=s&&n?.limit&&typeof n.limit=="object"?n.limit:{},i=s&&n?.used&&typeof n.used=="object"?n.used:{},a=g=>{let w=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isSafeInteger(w)&&w>=0&&w<=9?w:void 0},l=g=>{let w=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isFinite(w)?w:void 0},c=a(o.exponent??r?.decimal_places??2),d=a(i.exponent??r?.decimal_places??2),u=s?o.amount_minor:r?.monthly_limit,f=s?i.amount_minor:r?.used_credits,m=(g,w,y)=>w===void 0||y!==void 0&&y!=="USD"||l(g)===void 0?void 0:(l(g)/10**w).toFixed(2),p=pr(s?n?.percent:r?.utilization,"percent"),_=s?n?.spend_limit_reached??r?.spend_limit_reached:r?.spend_limit_reached,h={limit_usd:m(u,c,o.currency??r?.currency),used_usd:m(f,d,i.currency??r?.currency),remaining_fraction:p==null?void 0:Math.max(0,1-p),resets_at_iso:s?n?.resets_at:void 0,...typeof _=="boolean"?{reached:_}:{}};return Object.values(h).every(g=>g==null)?void 0:h}async function QM(t,e,n,r={}){try{let s=ZM("claude",["-p","/usage"],{encoding:"utf8",timeout:Math.max(n,60)*1e3,input:"",env:e$(e),maxBuffer:16777216}),o=typeof s.stdout=="string"?s.stdout:"";Bt(r,"claude_cli_print",o,[t.accessToken,t.refreshToken]);let i=X5(o);if(!i.length)return;let a=q5(o);return dt("claude",kt.ok,{source:"claude_cli_print",account_id:null,plan_type:t.subscriptionType??t.rateLimitTier??null,ordinary_usage_allowed:null,buckets:i,...Object.keys(a).length?{characteristics:a}:{}})}catch{return}}async function t$({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s=VM(e);if(s.error==="not_claude_ai_subscriber")return Hn(kt.notApplicable,s.error,"no OAuth subscription credentials; API-key accounts have no subscription quota endpoint");if(s.error==="no_credentials_found")return Hn(kt.unavailable,"credentials_missing",`credentials file not found: ${yT(e)}`);if(s.error)return Hn(kt.expired,"oauth_token_expired_or_invalid",s.error);let o=s.oauth,i=Array.isArray(o.scopes)?o.scopes:[];if(i.length&&!i.includes(YM))return Hn(kt.notApplicable,"not_claude_ai_subscriber",`credential lacks the ${YM} scope required by the usage endpoint`);let a=new AbortController,l=setTimeout(()=>a.abort(),t*1e3),c,d;try{let g=!1,w=async()=>{try{o=await KM({...s,oauth:o},a.signal),g=!0}catch(E){let T=E instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(E.message)?E.message:"refresh_failed";if(T==="refresh_http_429")return Hn(kt.throttled,"rate_limited","Claude OAuth refresh was rate limited; try again later");if(T==="refresh_lock_stale")return Hn(kt.expired,"oauth_refresh_locked","a previous Claude credential refresh exited without releasing its lock; remove the stale .credentials.json.lmctl-refresh.lock directory before retrying");let v=T==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(T);return Hn(v?kt.expired:kt.unavailable,v?"oauth_token_expired_or_invalid":"oauth_refresh_failed",`Claude OAuth refresh failed (${T})${v?"; renew Claude login":"; try again later"}`)}};if(jm(o)){let E=await w();if(E)return E}let y=()=>fetch(`${P5}/api/oauth/usage`,{headers:{Authorization:`Bearer ${o.accessToken}`,"anthropic-beta":U5,"Content-Type":"application/json","User-Agent":j5(e)},signal:a.signal});if(c=await y(),d=await c.text(),Bt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status),c.status===401&&!g&&s.path&&o.refreshToken){let E=await w();if(E)return E;c=await y(),d=await c.text(),Bt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status)}}catch(g){let w=await QM(o,e,t,{debug:n,onRawResponse:r});return w||Hn(kt.unavailable,"request_failed",`${g instanceof Error?g.name:"request failed"} (CLI fallback also unavailable)`)}finally{clearTimeout(l)}let u=(...g)=>Ps(Hn(...g),d,[String(o.accessToken??""),String(o.refreshToken??"")]);if(c.status===401)return u(kt.expired,"oauth_token_expired_or_invalid","HTTP 401 from usage endpoint");if(c.status===403)return u(kt.notApplicable,"not_claude_ai_subscriber","HTTP 403 from usage endpoint (account is not usage-eligible)");if(c.status===429){let g=W5(c.headers),w=await QM(o,e,t,{debug:n,onRawResponse:r});return w||u(kt.throttled,"rate_limited",`usage endpoint rate limited${g==null?"":`; retry after ${g}s`}`,"claude_oauth_api",g)}if(c.status!==200)return u(kt.unavailable,`http_${c.status}`,"usage endpoint returned an unexpected status");let f;try{f=JSON.parse(d)}catch{return Hn(kt.unavailable,"malformed_response","SyntaxError: malformed JSON")}if(!f||typeof f!="object"||Array.isArray(f))return Hn(kt.unavailable,"malformed_response","response was not an object");let m=f,p=Array.isArray(m.limits)?m.limits:[],_=p.length?p.flatMap(g=>{if(!g||typeof g!="object")return[];let w=g.kind,y=F5(w==="session"?"session":w),E=g.scope?.model?.display_name,T=w==="session"?"session":w==="weekly_all"?"week-all-models":`week-scoped-${E||w}`;return[Ct({bucket_id:T,group_name:w==="session"?"session":"weekly",window_type:y,used_fraction:pr(g.percent,"percent"),resets_at_iso:g.resets_at,raw_value:g.percent,raw_scale:"used_percent"})]}):["five_hour","seven_day"].flatMap(g=>{let w=m[g];return!w||typeof w!="object"?[]:[Ct({bucket_id:g==="five_hour"?"session":"week-all-models",group_name:g==="five_hour"?"session":"weekly",window_type:g==="five_hour"?"five_hour":"weekly",used_fraction:pr(w.utilization,"percent"),resets_at_iso:w.resets_at,raw_value:w.utilization,raw_scale:"used_percent"})]}),h=G5(m.spend,m.extra_usage);return dt("claude",kt.ok,{source:"claude_oauth_api",account_id:null,plan_type:o.subscriptionType??o.rateLimitTier??null,ordinary_usage_allowed:null,buckets:_.sort((g,w)=>String(g.window_type).localeCompare(String(w.window_type))||String(g.bucket_id).localeCompare(String(w.bucket_id))),...h?{spend_control:h}:{}})}var P5,U5,YM,kt,B5,n$=C(()=>{"use strict";hr();zM();hr();P5="https://api.anthropic.com",U5="oauth-2025-04-20",YM="user:profile";kt={ok:"ok",unavailable:"provider_unavailable",expired:"auth_expired",notApplicable:"not_applicable",throttled:"reader_throttled"};B5=/^Current\s+(.+?):\s*(\d+(?:\.\d+)?)\s*%\s*used(?:\s*[·-]\s*resets\s*(.+?))?$/});import{randomUUID as o$}from"node:crypto";import{mkdirSync as J5,readFileSync as wT,realpathSync as V5,renameSync as K5,rmSync as ET,statSync as r$,writeFileSync as i$}from"node:fs";import{homedir as z5}from"node:os";import{join as TT}from"node:path";import{setTimeout as Y5}from"node:timers/promises";function Oc(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ST(t){if(t.CODEX_AUTH_PATH)return t.CODEX_AUTH_PATH;let e=t.CODEX_HOME||TT(t.HOME||z5(),".codex");return TT(e,"auth.json")}function vT(t){let e=Oc(JSON.parse(wT(t,"utf8")));if(!e)throw new Error("invalid credential document");return e}function a$(t){if(t.CODEX_ACCESS_TOKEN)return{tokens:{access_token:t.CODEX_ACCESS_TOKEN,account_id:t.CODEX_ACCOUNT_ID}};let e=ST(t);try{let n=Oc(vT(e).tokens);return typeof n?.access_token=="string"&&n.access_token?{tokens:n,path:V5(e)}:{error:"credentials_missing"}}catch(n){return{error:n.code==="ENOENT"?"credentials_missing":"credentials_unreadable"}}}function s$(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.id_token===e.id_token&&t.account_id===e.account_id}async function e9(t,e){let n=`${t}.lmctl-refresh.lock`,r=TT(n,"owner.json"),s=o$();for(;;){e.throwIfAborted();try{J5(n,{mode:448});try{i$(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw ET(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(wT(r,"utf8")).token===s&&ET(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(wT(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-r$(n).mtimeMs>6e4}catch{try{i=Date.now()-r$(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await Y5(50,void 0,{signal:e})}}}async function l$(t,e){if(!t.path||typeof t.tokens?.refresh_token!="string"||!t.tokens.refresh_token)throw new Error("no_refresh_token");let n=await e9(t.path,e);try{let r=vT(t.path),s=Oc(r.tokens);if(!s||typeof s.access_token!="string")throw new Error("credentials_changed");if(!s$(s,t.tokens)&&typeof s.access_token=="string")return s;if(typeof s.refresh_token!="string"||!s.refresh_token)throw new Error("no_refresh_token");let o=await fetch(Q5,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:s.refresh_token,client_id:Z5})});if(!o.ok)throw new Error(`refresh_http_${o.status}`);let i=Oc(await o.json());if(!i||typeof i.access_token!="string"||!/^\S+$/.test(i.access_token)||i.refresh_token!==void 0&&(typeof i.refresh_token!="string"||!/^\S+$/.test(i.refresh_token))||i.id_token!==void 0&&(typeof i.id_token!="string"||!/^\S+$/.test(i.id_token)))throw new Error("invalid_refresh_response");let a=vT(t.path),l=Oc(a.tokens);if(!l||!s$(s,l)){if(l&&typeof l.access_token=="string")return l;throw new Error("credentials_changed")}let c={...l,access_token:i.access_token,...i.refresh_token===void 0?{}:{refresh_token:i.refresh_token},...i.id_token===void 0?{}:{id_token:i.id_token}},d={...a,tokens:c,last_refresh:new Date().toISOString()},u=`${t.path}.${o$()}.tmp`;try{i$(u,JSON.stringify(d),{flag:"wx",mode:384}),K5(u,t.path)}finally{ET(u,{force:!0})}return c}finally{n()}}var Q5,Z5,c$=C(()=>{"use strict";Q5="https://auth.openai.com/oauth/token",Z5="app_EMoamEEZ73f0CkXaXp7hrann"});function _r(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function d$(t){let e=typeof t=="number"?t:Number(t);if(!Number.isFinite(e)||e<=0)return"unknown";let n=e/60;return n>=240&&n<=360?"five_hour":n>=9e3&&n<=11500?"weekly":n>=38e3&&n<=46e3?"monthly":"unknown"}function u$(t){return t==="five_hour"?"5h":t==="weekly"?"weekly":t==="monthly"?"monthly":"window"}function r9(t){if(_r(t))return{has_credits:t.has_credits,unlimited:t.unlimited,balance:t.balance}}function s9(t){let e=[],n=_r(t.rate_limit)?t.rate_limit:{},r=typeof n.allowed=="boolean"?n.allowed:void 0,s=typeof n.limit_reached=="boolean"?n.limit_reached:void 0;for(let i of["primary_window","secondary_window"]){let a=_r(n[i])?n[i]:void 0;if(!a)continue;let l=d$(a.limit_window_seconds);e.push(Ct({bucket_id:`codex-${u$(l)}`,group_name:"codex",window_type:l,used_fraction:pr(a.used_percent,"percent"),resets_at:a.reset_at,raw_value:a.used_percent,raw_scale:"used_percent",...r===void 0?{}:{allowed:r},...s===void 0?{}:{limit_reached:s}}))}let o=Array.isArray(t.additional_rate_limits)?t.additional_rate_limits:[];for(let i of o){if(!_r(i))continue;let a=_r(i.rate_limit)?i.rate_limit:{},l=typeof i.limit_name=="string"?i.limit_name:void 0,c=typeof i.metered_feature=="string"?i.metered_feature:void 0,d=c||l||"additional",u=typeof a.allowed=="boolean"?a.allowed:void 0,f=typeof a.limit_reached=="boolean"?a.limit_reached:void 0;for(let m of["primary_window","secondary_window"]){let p=_r(a[m])?a[m]:void 0;if(!p)continue;let _=d$(p.limit_window_seconds);e.push(Ct({bucket_id:`${d}-${u$(_)}`,group_name:l||d,window_type:_,used_fraction:pr(p.used_percent,"percent"),resets_at:p.reset_at,raw_value:p.used_percent,raw_scale:"used_percent",...l===void 0?{}:{limit_name:l},...c===void 0?{}:{metered_feature:c},...u===void 0?{}:{allowed:u},...f===void 0?{}:{limit_reached:f}}))}}return e.sort((i,a)=>String(i.group_name??"").localeCompare(String(a.group_name??""))||String(i.bucket_id).localeCompare(String(a.bucket_id)))}function o9(t){let e=_r(t.rate_limit)?t.rate_limit:{},n=typeof e.allowed=="boolean"?e.allowed:void 0,r=_r(t.spend_control)?t.spend_control:void 0,s=_r(t.credits)?t.credits:void 0;return dt("codex","ok",{source:"codex_http",account_id:t.account_id,plan_type:t.plan_type,...n===void 0?{}:{ordinary_usage_allowed:n},buckets:s9(t),...s?{credits:r9(s)}:{},...r?{spend_control:r}:{}})}async function f$(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s}=t,o=a$(n),i=o.tokens;if(!i||typeof i.access_token!="string")return dt("codex","provider_unavailable",{source:"codex_http",reason:"credentials_missing",detail:`no access_token in ${ST(n)} (or $CODEX_ACCESS_TOKEN)`});let a=new AbortController,l=setTimeout(()=>a.abort(),Math.ceil(e*1e3)),c=i.access_token,d=new Set([i.access_token,i.refresh_token,i.id_token].filter(u=>typeof u=="string"&&!!u));try{let u=typeof i.account_id=="string"?i.account_id:void 0,f=typeof i.refresh_token=="string"?i.refresh_token:void 0,m=typeof i.id_token=="string"?i.id_token:void 0,p="",_=()=>[...d],h=(v,b)=>Ps(dt("codex",v,b),p,_()),g=!1,w=async()=>{if(!(g||!o.path||typeof i.refresh_token!="string"))try{let v=await l$({...o,tokens:{...i,refresh_token:f}},a.signal);typeof v.access_token=="string"&&(d.add(v.access_token),c=v.access_token),u=typeof v.account_id=="string"?v.account_id:u,typeof v.refresh_token=="string"&&(d.add(v.refresh_token),f=v.refresh_token),typeof v.id_token=="string"&&(d.add(v.id_token),m=v.id_token),g=!0;return}catch(v){let b=v instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(v.message)?v.message:"refresh_failed",k=b==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(b);return dt("codex",k?"auth_expired":"provider_unavailable",{source:"codex_http",reason:k?"oauth_token_expired_or_invalid":"oauth_refresh_failed",detail:`Codex OAuth refresh failed (${b})${k?"; renew Codex login":"; try again later"}`})}},y=()=>{let v={Authorization:`Bearer ${c}`,"User-Agent":n9,"Content-Type":"application/json",Accept:"application/json"};u&&(v["ChatGPT-Account-Id"]=u);let b=(n.CODEX_BASE_URL||t9).replace(/\/$/,"");return fetch(`${b}/wham/usage`,{headers:v,signal:a.signal})},E=await y();if(p=await E.text(),Bt({debug:r,onRawResponse:s},"codex_http",p,_(),E.status),E.status===401&&o.path&&f){let v=await w();if(v)return v;E=await y(),p=await E.text(),Bt({debug:r,onRawResponse:s},"codex_http",p,_(),E.status)}if(E.status===401)return h("auth_expired",{source:"codex_http",reason:"oauth_token_expired_or_invalid",detail:"HTTP 401 from the codex usage endpoint"});if(E.status===429){let v=E.headers.get("retry-after"),b=v===null?void 0:Number.parseInt(v,10);return h("reader_throttled",{source:"codex_http",reason:"throttled",detail:"HTTP 429 from codex usage endpoint",...b!==void 0&&Number.isFinite(b)&&b>=0?{retry_after_seconds:b}:{}})}if(!E.ok)return h("provider_unavailable",{source:"codex_http",reason:`http_${E.status}`,detail:"codex usage endpoint returned an unexpected status"});let T;try{T=JSON.parse(p)}catch(v){return dt("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:da(String(v),d)})}return _r(T)?o9(T):dt("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:"response was not an object"})}catch(u){let f=u instanceof Error?`${u.name}: ${u.message}`:String(u);return dt("codex","provider_unavailable",{source:"codex_http",reason:"http_request_failed",detail:da(f,d)})}finally{clearTimeout(l)}}var t9,n9,m$=C(()=>{"use strict";hr();c$();hr();t9="https://chatgpt.com/backend-api",n9="codex-cli"});import{createHash as i9,randomUUID as a9}from"node:crypto";import{readFileSync as y$,openSync as l9,fsyncSync as c9,closeSync as d9,mkdirSync as p$,writeFileSync as w$,renameSync as u9,rmSync as f9,rmdirSync as m9,statSync as bT,utimesSync as p9}from"node:fs";import{homedir as h9}from"node:os";import{basename as _9,dirname as g9,join as Wm}from"node:path";import{setTimeout as E$}from"node:timers/promises";function w9(t){let e;try{e=y$(t,"utf8")}catch(s){if(s.code==="ENOENT")return{};throw new Error("config_unreadable")}let n={},r="other";for(let s of e.split(/\r?\n/)){let o=/^\s*\[providers\.(?:"managed:kimi-code"|'managed:kimi-code')(\.oauth)?\]\s*(?:#.*)?$/.exec(s);if(o){r=o[1]?"oauth.":"";continue}if(/^\s*\[/.test(s)){if(s.includes("managed:kimi-code"))throw new Error("config_format_unsupported");r="other";continue}if(r==="other")continue;if(/^\s*oauth\s*=/.test(s))throw new Error("config_format_unsupported");let i=/^\s*(base_url|oauth_host|storage|key)\s*=\s*("(?:[^"\\]|\\.)*"|'[^']*')\s*(?:#.*)?$/.exec(s);if(!i&&/^\s*(base_url|oauth_host|storage|key)\s*=/.test(s))throw new Error("config_malformed");if(i)try{n[r+i[1]]=i[2].startsWith('"')?JSON.parse(i[2]):i[2].slice(1,-1)}catch{throw new Error("config_malformed")}}return n}function Hm(t){let e;try{e=JSON.parse(y$(t,"utf8"))}catch(n){throw new Error(n.code==="ENOENT"?"credentials_missing":"credentials_malformed")}if(e&&typeof e=="object"&&e.access_token===""&&e.refresh_token==="")throw new Error("credentials_revoked");if(!e||typeof e!="object"||Array.isArray(e)||typeof e.access_token!="string"||!e.access_token.trim())throw new Error("credentials_malformed");return e}function T$(t){let e=t.KIMI_CODE_HOME??Wm(t.HOME??h9(),".kimi-code"),n=w9(t.KIMI_CODE_CONFIG_PATH??Wm(e,"config.toml")),r=t.KIMI_CODE_BASE_URL!==void 0||t.KIMI_CODE_OAUTH_HOST!==void 0||t.KIMI_OAUTH_HOST!==void 0,s=_$(t.KIMI_CODE_BASE_URL??n.base_url??h$),o=_$(t.KIMI_CODE_OAUTH_HOST??t.KIMI_OAUTH_HOST??(r?IT:n["oauth.oauth_host"]??IT)),i=s===h$&&o===IT?"kimi-code":`kimi-code-env-${i9("sha256").update(JSON.stringify({oauthHost:o,baseUrl:s})).digest("hex").slice(0,16)}`;if(!t.KIMI_CREDENTIALS_PATH&&!r&&n["oauth.key"]===`oauth/${i}`&&n["oauth.storage"]&&n["oauth.storage"]!=="file")throw new Error("credential_storage_unsupported");let a=t.KIMI_CREDENTIALS_PATH??Wm(e,"credentials",`${i}.json`),l=Hm(a),c=a,d=_9(a,".json");return{home:e,path:c,lockTarget:Wm(e,"oauth",d),baseUrl:s,oauthHost:o,token:l}}function Bm(t){if(typeof t.expires_at!="number")return!1;let e=typeof t.expires_in=="number"?t.expires_in:0;return t.expires_at-Date.now()/1e3<Math.max(300,e*.5)}function g$(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.expires_at===e.expires_at&&t.expires_in===e.expires_in}async function E9(t,e){p$(g9(t),{recursive:!0}),w$(t,"",{flag:"a",mode:384});let n=`${t}.lock`;for(;;){if(e.aborted)throw new Error("refresh_locked");try{p$(n);break}catch(i){if(i.code!=="EEXIST")throw new Error("refresh_lock_failed");try{if(Date.now()-bT(n).mtimeMs>5e3)throw new Error("refresh_lock_stale")}catch(a){if(a.message==="refresh_lock_stale")throw a}try{await E$(50,void 0,{signal:e})}catch{throw new Error("refresh_locked")}}}let r=bT(n),s=()=>{let i;try{i=bT(n)}catch{throw new Error("refresh_lock_lost")}if(i.ino!==r.ino||i.dev!==r.dev)throw new Error("refresh_lock_lost")},o=setInterval(()=>{try{s();let i=new Date;p9(n,i,i)}catch{}},1e3);return o.unref(),{assertOwned:s,release(){clearInterval(o);try{s(),m9(n)}catch{}}}}async function v$(t,e){if(typeof t.token.refresh_token!="string"||!t.token.refresh_token)throw new Error("no_refresh_token");let n=await E9(t.lockTarget,e);try{let r=Hm(t.path);if(!g$(r,t.token)&&!Bm(r))return r;if(typeof r.refresh_token!="string"||!r.refresh_token)throw new Error("no_refresh_token");let s;for(let u=0;u<3;u++){try{if(s=await fetch(`${t.oauthHost}/api/oauth/token`,{method:"POST",signal:e,headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json","User-Agent":"lmctl"},body:new URLSearchParams({client_id:y9,grant_type:"refresh_token",refresh_token:r.refresh_token})}),![429,500,502,503,504].includes(s.status)||u===2)break;await s.body?.cancel()}catch{if(e.aborted||u===2)throw new Error("refresh_request_failed")}await E$(1e3*2**u,void 0,{signal:e})}if(!s)throw new Error("refresh_request_failed");if(!s.ok){try{let u=Hm(t.path);if(u.refresh_token!==r.refresh_token)return u}catch{}throw new Error(`refresh_http_${s.status}`)}let o=await s.json(),i=Number(o?.expires_in);if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)||!Number.isFinite(i)||i<=0)throw new Error("invalid_refresh_response");let a=Math.floor(Date.now()/1e3)+i;if(!Number.isSafeInteger(a))throw new Error("invalid_refresh_response");n.assertOwned();let l=Hm(t.path);if(!g$(l,r)){if(!Bm(l))return l;throw new Error("credentials_changed")}let c={...l,access_token:o.access_token,refresh_token:o.refresh_token,expires_at:a,expires_in:i,...typeof o.scope=="string"?{scope:o.scope}:{},...typeof o.token_type=="string"?{token_type:o.token_type}:{}},d=`${t.path}.${a9()}.tmp`;try{let u=l9(d,"wx",384);try{w$(u,JSON.stringify(c,null,2)+`
3044
- `),c9(u)}finally{d9(u)}n.assertOwned(),u9(d,t.path)}finally{f9(d,{force:!0})}return c}finally{n.release()}}var h$,IT,y9,_$,S$=C(()=>{"use strict";h$="https://api.kimi.com/coding/v1",IT="https://auth.kimi.com",y9="17e5f671-d194-4dfb-9706-5516cb48c098",_$=t=>t.trim().replace(/\/+$/,"")});function b$(t){let e=i=>{if(typeof i!="number"&&typeof i!="string"||typeof i=="string"&&i.trim()==="")return;let a=Number(i);return Number.isFinite(a)&&a>=0?a:void 0},n=e(t.limit),r=e(t.used),s=e(t.remaining);if(n===void 0||n<=0||r===void 0&&(s===void 0||s>n))return;let o=r??n-s;return{used:o,limit:n,remaining:Math.max(0,n-o)}}async function I$({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s;try{s=T$(e)}catch(_){let h=_ instanceof Error&&/^(credentials_missing|credentials_malformed|credentials_revoked|config_unreadable|config_malformed|config_format_unsupported|credential_storage_unsupported)$/.test(_.message)?_.message:"credentials_unreadable";return et("kimi",h==="credentials_revoked"?"auth_expired":"provider_unavailable",h,h==="credentials_revoked"?"Kimi login was revoked; run kimi login":h.replaceAll("_"," "),"kimi_http")}let o=s.token,i=new AbortController,a=setTimeout(()=>i.abort(),t*1e3),l,c;try{let _=!1,h=async()=>{o=await v$({...s,token:o},i.signal),_=!0};Bm(o)&&await h();let g=()=>fetch(`${s.baseUrl}/usages`,{headers:{Authorization:`Bearer ${o.access_token}`,Accept:"application/json"},signal:i.signal});l=await g(),c=await l.text(),Bt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status),l.status===401&&!_&&o.refresh_token&&(await h(),l=await g(),c=await l.text(),Bt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status))}catch(_){let h=_ instanceof Error&&/^(no_refresh_token|credentials_changed|credentials_revoked|invalid_refresh_response|refresh_locked|refresh_lock_stale|refresh_lock_failed|refresh_lock_lost|refresh_request_failed|refresh_http_\d+)$/.test(_.message)?_.message:"request_failed",g=h==="credentials_revoked"||h==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(h),w=h==="refresh_lock_stale"?"Kimi refresh lock is stale; run the native Kimi CLI to recover its lock, or verify no refresh is active before removing the .lock directory":g?`Kimi credential renewal failed (${h}); run kimi login`:`Kimi quota request failed (${h})`;return et("kimi",g?"auth_expired":"provider_unavailable",h,w,"kimi_http")}finally{clearTimeout(a)}let d=(_,h,g)=>Ps(et("kimi",_,h,h,"kimi_http",[],g),c,[o.access_token]);if(l.status===401)return d("auth_expired","HTTP 401 from Kimi usage endpoint");if(l.status===403)return d("not_applicable","HTTP 403 from Kimi usage endpoint");if(l.status===429){let _=Fm(l.headers);return d("reader_throttled","HTTP 429 from Kimi usage endpoint",_)}if(l.status!==200)return d("provider_unavailable",`HTTP ${l.status} from Kimi usage endpoint`);let u;try{u=JSON.parse(c)}catch{return et("kimi","provider_unavailable","malformed_response","SyntaxError: malformed JSON")}if(!u||typeof u!="object")return et("kimi","provider_unavailable","malformed_response","response was not an object");let f=[],m=new Set;function p(_){let h=String(_.bucket_id),g=h,w=2;for(;m.has(h);)h=`${g}-${w}`,w++;m.add(h),_.bucket_id=h,f.push(Ct(_))}if(Array.isArray(u.limits))for(let _ of u.limits){if(!_||typeof _!="object")continue;let h=_.window,g=_.detail;if(!h||typeof h!="object"||!g||typeof g!="object")continue;let w=0;if(h.timeUnit==="TIME_UNIT_MINUTE")w=Number(h.duration);else if(h.timeUnit==="TIME_UNIT_HOUR")w=Number(h.duration)*60;else if(h.timeUnit==="TIME_UNIT_DAY")w=Number(h.duration)*1440;else if(h.timeUnit==="TIME_UNIT_WEEK")w=Number(h.duration)*10080;else if(h.timeUnit==="TIME_UNIT_MONTH")w=Number(h.duration)*43200;else continue;let y=PM(w),E="window";y==="five_hour"&&(E="5h"),y==="weekly"&&(E="weekly"),y==="monthly"&&(E="monthly");let T=b$(g);if(!T)continue;let{used:v,limit:b,remaining:k}=T;p({bucket_id:`kimi-${E}`,window_type:y,used_fraction:yt(v/b),remaining_fraction:yt(k/b),resets_at_iso:g.resetTime,raw_value:v,raw_scale:"count"})}if(u.usage&&typeof u.usage=="object"){let _=b$(u.usage);_&&p({bucket_id:"kimi-weekly",window_type:"weekly",used_fraction:yt(_.used/_.limit),remaining_fraction:yt(_.remaining/_.limit),resets_at_iso:u.usage.resetTime,raw_value:_.used,raw_scale:"count"})}if(u.usages&&typeof u.usages=="object"){let _=[{key:"limit_5h",id:"kimi-5h",type:"five_hour"},{key:"limit_7d",id:"kimi-weekly",type:"weekly"},{key:"limit_month_total",id:"kimi-monthly",type:"monthly"},{key:"limit_month_code",id:"kimi-monthly-code",type:"monthly"}];for(let{key:h,id:g,type:w}of _){let y=u.usages[h];if(!y||typeof y!="object"||y.used_ratio==null||y.used_ratio===""||typeof y.used_ratio=="boolean")continue;let E=Number(y.used_ratio);!Number.isFinite(E)||E<0||m.has(g)||(m.add(g),f.push(Ct({bucket_id:g,window_type:w,used_fraction:yt(E),resets_at_iso:typeof y.reset_time=="string"&&y.reset_time?y.reset_time:null,raw_value:E,raw_scale:"ratio"})))}}return dt("kimi","ok",{source:"kimi_http",buckets:f})}var k$=C(()=>{"use strict";hr();S$();hr()});function Dc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Xm(t){if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t=="string"&&t.trim()!==""){let e=Number(t);if(Number.isFinite(e))return e}}async function A$(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s,fetchFn:o=fetch}=t,i=n.OLLAMA_API_KEY?.trim();if(!i)return et("ollama-cloud","provider_unavailable","credentials_missing","$OLLAMA_API_KEY is missing","ollama_http");let a="https://ollama.com/api/balance",l=new AbortController,c=setTimeout(()=>l.abort(),Math.ceil(e*1e3)),d,u="";try{d=await o(a,{method:"GET",redirect:"error",headers:{Authorization:`Bearer ${i}`,Accept:"application/json"},signal:l.signal}),u=await d.text();let h=u;try{h=JSON.stringify(JSON.parse(u))}catch{}Bt({debug:r,onRawResponse:s},"ollama_http",h,[i],d.status)}catch(h){let g=h instanceof Error&&h.name==="AbortError",w=g?`Ollama quota request timed out after ${e}s`:`Ollama quota request failed (${h instanceof Error?h.message:String(h)})`;return et("ollama-cloud","provider_unavailable",g?"request_timeout":"request_failed",w,"ollama_http",[i])}finally{clearTimeout(c)}let f=(h,g,w)=>Ps(et("ollama-cloud",h,g,g,"ollama_http",[i],w),u,[i]);if(d.status===401)return f("auth_expired","HTTP 401 from Ollama balance endpoint");if(d.status===403)return f("not_applicable","HTTP 403 from Ollama balance endpoint");if(d.status===429){let h=Fm(d.headers);return f("reader_throttled","HTTP 429 from Ollama balance endpoint",h)}if(d.status!==200)return f("provider_unavailable",`HTTP ${d.status} from Ollama balance endpoint`);let m;try{m=JSON.parse(u)}catch{return et("ollama-cloud","provider_unavailable","malformed_response","SyntaxError: malformed JSON","ollama_http")}if(!Dc(m))return et("ollama-cloud","provider_unavailable","malformed_response","response was not an object","ollama_http");let p=[];if(Dc(m.included)){let h=m.included,g=Xm(h.allowance_usd),w=Xm(h.balance_usd),y=Dc(h.period)?h.period:void 0,E=typeof y?.from=="string"?Date.parse(y.from):NaN,T=typeof y?.until=="string"?Date.parse(y.until):NaN,v=Number.isFinite(E)&&Number.isFinite(T)&&T>E,b=v?new Date(T).toISOString():null;if(g!==void 0&&g>0&&w!==void 0){let k=Math.max(0,g-w);p.push({...Ct({bucket_id:"ollama-cloud-monthly",group_name:"ollama-cloud",window_type:"monthly",used_fraction:yt(k/g),remaining_fraction:yt(w/g),resets_at_iso:b,is_exhausted:w<=0,raw_value:w,raw_scale:"balance_usd"}),window_start_iso:v?new Date(Math.floor(E/1e3)*1e3).toISOString().replace(".000Z","Z"):null})}if(g===void 0&&w===void 0)for(let[k,I,N]of[["session","five_hour","5h"],["weekly","weekly","weekly"]]){let A=h[k];if(!Dc(A))continue;let S=Xm(A.remaining_percent);S===void 0||S<0||S>100||p.push(Ct({bucket_id:`ollama-cloud-${N}`,group_name:"ollama-cloud",window_type:I,remaining_fraction:S/100,resets_at_iso:typeof A.resets_at=="string"?A.resets_at:null,raw_value:S,raw_scale:"remaining_percent"}))}}let _;if(Dc(m.purchased)){let h=m.purchased,g=Xm(h.balance_usd);g!==void 0&&(_={has_credits:g>0,balance:g})}return p.length===0&&_===void 0?et("ollama-cloud","provider_unavailable","malformed_response","response has no usable included allowance or purchased balance","ollama_http"):dt("ollama-cloud","ok",{source:"ollama_http",buckets:p,..._?{credits:_}:{}})}var N$=C(()=>{"use strict";hr()});async function x$(t={}){let e=t.targets??t.providers??["all"];if(!Array.isArray(e)||e.length===0||e.some(u=>typeof u!="string"))return{status:"error",error:"providers must be a non-empty list of provider names",readings:[]};for(let u of e)if(!qm.includes(u))return{status:"error",error:`unknown provider: ${u} (valid targets: ${qm.join(", ")})`,readings:[]};let n=t.timeoutSeconds??T9;if(!Number.isFinite(n)||n<=0)return{status:"error",error:"timeoutSeconds must be a positive finite number",readings:[]};let r=t.env??process.env,s=["codex","agy","claude","kimi"];(r.OLLAMA_API_KEY?.trim()||e.includes("ollama-cloud"))&&s.push("ollama-cloud");let o=new Set(e.includes("all")?s:e);t.progress?.(`querying ${e.join(" ")} live (timeout ${n}s per provider) ...`);let a=Object.entries({codex:f$,agy:HM,claude:t$,kimi:I$,"ollama-cloud":A$}).filter(([u])=>o.has(u)).map(async([,u])=>{let f=[],m=await u({timeoutSeconds:n,env:r,...t.debug?{debug:t.debug}:{},...t.includeRaw?{onRawResponse:_=>f.push(_)}:{}}),p=t.includeRaw?{...m,raw_responses:f}:m;return p&&t.onReading?.(p),p}),l=await Promise.allSettled(a),c=l.find(u=>u.status==="rejected");return c?{status:"error",error:String(c.reason),readings:[]}:{status:"ok",readings:l.filter(u=>u.status==="fulfilled").map(u=>u.value).filter(Boolean)}}var qm,T9,R$=C(()=>{"use strict";BM();n$();m$();k$();N$();qm=["all","codex","agy","claude","kimi","ollama-cloud"],T9=15});var D$={};ye(D$,{runRatelimit:()=>N9});function kT(t){return typeof t=="object"&&t!==null}function v9(t){return typeof t=="number"&&t>0&&t<.005?`${(t*100).toFixed(1)}%`:(0,wt.formatPercent)(typeof t=="number"?t:null)}function S9(t,e){let n=typeof e.bucket_id=="string"&&e.bucket_id!==""?e.bucket_id:"unknown-bucket";return n==="session"?n="5h":n==="week-all-models"?n="weekly":n.startsWith("week-scoped-")&&(n=`weekly-${n.slice(12)}`),t!==""&&!n.startsWith(`${t}-`)&&(n=`${t}-${n}`),(0,wt.escapeCell)(n)}function I9(t,e){let n="unknown",r=null,s,o=null;if(typeof e.resets_at_iso=="string"&&e.resets_at_iso!==""){let c=Date.parse(e.resets_at_iso);if(o=Number.isFinite(c)?c-Date.now():null,o!==null){if(Math.abs(o)<1e3?n="now":o>0?n=`in ${(0,wt.formatDuration)(o,{maxUnit:"d",style:"compact"})}`:n=`${(0,wt.formatDuration)(-o,{maxUnit:"d",style:"compact"})} ago`,typeof e.window_start_iso=="string"){let d=Date.parse(e.window_start_iso);Number.isFinite(d)&&c>d&&(s=c-d)}else(t!=="ollama-cloud"||e.window_type!=="monthly")&&(s=b9[typeof e.window_type=="string"?e.window_type:""]);s!==void 0&&(r=Math.min(1,Math.max(0,1-o/s)))}}r!==null&&(n=`${(0,wt.formatBar)(r)} ${n}`);let i="";if(r!==null&&r>0&&s!==void 0&&o!==null&&o>0&&typeof e.used_fraction=="number"&&Number.isFinite(e.used_fraction)){let c=e.used_fraction;if(c<=r){let d=Math.max(0,1-c/r);i=`unused +${(0,wt.formatPercent)(d)}`}else{let d=r*s,u=d>0?(1-c)/c*d:0,f=Math.max(0,o-u);i=`needing -${(0,wt.formatDuration)(f,{maxUnit:"d",style:"compact"})}`}}let a=[];e.is_exhausted===!0&&a.push("[EXHAUSTED]"),e.allowed===!1&&a.push("allowed=false"),e.limit_reached===!0&&a.push("limit_reached");let l=[S9(t,e),`${(0,wt.formatBar)(typeof e.used_fraction=="number"?e.used_fraction:null)} ${v9(e.used_fraction)}`,n];return(i!==""||a.length>0)&&l.push(i),a.length>0&&l.push(a.join(" ")),l}function k9(t){let e=typeof t.provider=="string"&&t.provider!==""?t.provider:"unknown",n=typeof t.status=="string"?t.status:"unknown",r=typeof t.source=="string"&&t.source!==""?t.source:"unknown source",s=typeof t.reason=="string"?t.reason:"",o=`${e}: ${n} (${r})`;n!=="ok"&&typeof t.provider_message=="string"&&t.provider_message.trim()?o=`${e}: ${(0,wt.escapeCell)(t.provider_message)} (${r})`:n==="auth_expired"?(o=`${e}: unavailable (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n==="provider_unavailable"&&O$.has(s)?(o=`${e}: not installed/configured (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n!=="ok"&&(o+=` -- ${s!==""?s:"no reason given"}`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`),n==="provider_unavailable"&&s!=="oauth_refresh_failed"&&!/^(credentials_|config_|credential_storage_|refresh_)/.test(s)&&(o+=` (${e} server-side, not lmctl \u2014 try again later)`));let i=typeof t.plan_type=="string"?t.plan_type.trim():"";i&&!["?","unknown","null","n/a"].includes(i.toLowerCase())&&(o+=` (${(0,wt.escapeCell)(i)})`);let a=typeof t.provider=="string"?t.provider:"",l=Array.isArray(t.buckets)?t.buckets.filter(kT).map(d=>I9(a,d)):[],c=[];if(kT(t.credits)){let d=t.credits,u=[];typeof d.has_credits=="boolean"&&u.push(`has_credits=${d.has_credits}`),d.unlimited===!0&&u.push("unlimited"),d.balance!==void 0&&d.balance!==null&&u.push(`balance=${String(d.balance)}`);let f=a==="ollama-cloud"?"purchased credits (USD)":"credits";c.push(` ${f}: ${u.length>0?u.join(" "):"present"}`)}if(kT(t.spend_control)){let d=t.spend_control,u=` spend control: reached=${d.reached===!0}`;d.used_usd!==void 0&&d.used_usd!==null&&(u+=` used=$${String(d.used_usd)}`),d.limit_usd!==void 0&&d.limit_usd!==null&&(u+=` limit=$${String(d.limit_usd)}`),d.individual_limit!==void 0&&d.individual_limit!==null&&(u+=` individual_limit=${String(d.individual_limit)}`),c.push(u)}return{head:o,bucketRows:l,footers:c}}function A9(t){let e=k9(t),n=[e.head];if(e.bucketRows.length>0){let r=["LIMIT","USED","RESET TIME","OVERSTOCK"],s=(0,wt.measureColumns)([{rows:[],headers:r},e.bucketRows]);n.push((0,wt.renderGrid)(e.bucketRows,{widths:s,margin:2,align:["left","left","left"],headers:r}))}return n.push(...e.footers),n.join(`
3041
+ `});function yt(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);return Number.isFinite(e)?Math.round(Math.min(1,Math.max(0,e))*1e6)/1e6:null}function pr(t,e){if(t==null||typeof t=="boolean")return null;let n=Number(t);return yt(e==="percent"?n/100:n)}function MM(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);if(!Number.isFinite(e))return null;try{return new Date(Math.trunc(e)*1e3).toISOString().replace(".000Z","Z")}catch{return null}}function $M(t){if(typeof t!="string"||t.trim()==="")return null;let e=Date.parse(t);return Number.isFinite(e)?Math.floor(e/1e3):null}function PM(t){let e=Number(t);return Number.isFinite(e)?e===300||e>=240&&e<=360?"five_hour":e===10080||e>=9e3&&e<=11500?"weekly":e===43200||e===44640||e>=38e3&&e<=46e3?"monthly":"unknown":"unknown"}function UM(t){let e=String(t??"").trim().toLowerCase().replace(/-/g,"_").split("_").filter(Boolean);for(let n of[e[0],e.at(-1)]){if(n?.startsWith("5h")||n?.startsWith("five")||n==="session")return"five_hour";if(n?.startsWith("7d")||n?.startsWith("seven")||n?.startsWith("week"))return"weekly";if(n?.startsWith("30d")||n?.startsWith("month"))return"monthly"}return"unknown"}function da(t,e=[]){let n=t==null?"":String(t);for(let r of e)typeof r=="string"&&r.length>=4&&(n=n.replaceAll(r,"***REDACTED***"));for(let r of i5)n=n.replace(r,"***REDACTED***");return n}function Ct(t){let e=yt(t.used_fraction),n=yt(t.remaining_fraction),r=t.resets_at==null?$M(t.resets_at_iso):Number(t.resets_at),s=t.resets_at_iso==null?MM(r):MM($M(t.resets_at_iso)),o={bucket_id:t.bucket_id,...t.group_name!=null?{group_name:t.group_name}:{},window_type:t.window_type??"unknown",used_fraction:e??(n===null?null:yt(1-n)),remaining_fraction:n??(e===null?null:yt(1-e)),resets_at:r==null||!Number.isFinite(r)?null:Math.trunc(r),resets_at_iso:s,is_exhausted:t.is_exhausted??(n!==null?n<=0:e!==null?e>=1:null)};for(let i of["raw_value","raw_scale","limit_name","metered_feature","allowed","limit_reached"])t[i]!=null&&(o[i]=t[i]);return o}function dt(t,e,n={}){let r={$schema:o5,provider:t,status:e,source:n.source??null,read_at:n.read_at??Math.floor(Date.now()/1e3),account_id:n.account_id??null,plan_type:n.plan_type??null,ordinary_usage_allowed:n.ordinary_usage_allowed??null,buckets:n.buckets??[]};for(let s of["credits","spend_control","characteristics","reason","detail","retry_after_seconds"])n[s]!=null&&(r[s]=n[s]);return r}function et(t,e,n,r,s,o=[],i){return dt(t,e,{source:s??null,reason:n,...r==null?{}:{detail:da(r,o)},...i==null?{}:{retry_after_seconds:i}})}function Fm(t){let e=t.get("retry-after");if(e===null)return null;let n=Number.parseFloat(e);return Number.isFinite(n)&&n>=0?Math.trunc(n):null}function Bt(t,e,n,r=[],s){if(!t.debug&&!t.onRawResponse)return;let o=da(n,[...r].filter(i=>typeof i=="string")).replace(/("(?:access[_-]?token|refresh[_-]?token|authorization|api[_-]?key|password)"\s*:\s*")[^"\r\n]*(")/gi,"$1***REDACTED***$2");t.onRawResponse?.({source:e,...s===void 0?{}:{http_status:s},text:o}),t.debug?.(`[debug] ${e}${s===void 0?"":` HTTP ${s}`} raw response:
3042
+ ${o}`)}function Ps(t,e,n=[]){let r;try{let o=JSON.parse(e);r=typeof o?.error=="string"?o.error:o?.error?.message??o?.message??o?.detail}catch{/^\s*[<{[]/.test(e)||(r=e.trim())}if(typeof r!="string"||!r.trim())return t;let s=da(r,n);return{...t,detail:s,provider_message:s}}var o5,i5,hr=C(()=>{"use strict";o5="https://lmctl.com/schemas/lmratelimit-v1.json";i5=[/sk-ant-[A-Za-z0-9_-]{4,}/g,/sk-[A-Za-z0-9_-]{16,}/g,/\bbearer\s+[A-Za-z0-9._-]{8,}/gi,/\boat01[-_][A-Za-z0-9_-]{8,}/g,/\bcsrf[-_][A-Za-z0-9_-]{4,}/gi,/\b(?:csrf[-_]?token|x-codeium-csrf-token)\s*[:=]\s*['"]?[A-Za-z0-9._-]{4,}/gi]});import{spawnSync as a5}from"node:child_process";import{readdirSync as l5,readFileSync as c5}from"node:fs";import{join as d5}from"node:path";function w5(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("ANTIGRAVITY")))}function E5(t){let e=t.trim().toLowerCase(),n={"gemini models":"gemini","claude and gpt models":"3p",gemini:"gemini","3p models":"3p","3p":"3p"};return n[e]?n[e]:e.replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function T5(t){let e=t.toLowerCase();return e.includes("weekly")?"weekly":e.includes("five hour")||e.includes("5-hour")||e.includes("5 hour")?"five_hour":e.includes("monthly")||e.includes("month")?"monthly":null}function v5(t){let e={weekly:"weekly",five_hour:"5h",monthly:"monthly"},n=[];for(let r of t.split(/\r?\n/)){let s=r.trim().split(" ").map(l=>l.trim());if(s.length<3||!s[0]||!s[1])continue;let o=T5(s[1]);if(!o)continue;let i=Number(s[2].replace(/%$/,"").trim());if(!Number.isFinite(i))continue;let a=yt(i/100);n.push(Ct({bucket_id:`${E5(s[0])}-${e[o]}`,group_name:s[0],window_type:o,used_fraction:a===null?null:yt(1-a),remaining_fraction:a,resets_at_iso:s[3]||null,raw_value:i,raw_scale:"remaining_percent"}))}return n.sort((r,s)=>String(r.group_name??"").localeCompare(String(s.group_name??""))||String(r.bucket_id??"").localeCompare(String(s.bucket_id??"")))}function Cc(t,e,n){return et("agy","provider_unavailable",t,e,"agy_cli_print")}function S5(t,e,n={}){try{let r=_5(Math.max(t,60)*1e3,w5(e));if(Bt(n,"agy_cli_print",r.stdout??"",[e.ANTIGRAVITY_CSRF_TOKEN]),r.error?.code==="ENOENT")return Cc("agy_not_found","the agy CLI is not on PATH",t);if(r.error?.code==="ETIMEDOUT")return Cc("cli_timeout","agy -p /usage did not finish in time",t);if(r.error)return Cc("cli_failed",r.error.message,t);let s=v5(r.stdout??"");return s.length===0?Cc("cli_unparseable",`exit ${r.status??1}; no buckets parsed from CLI output`,t):dt("agy","ok",{source:"agy_cli_print",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:s})}catch(r){return Cc("cli_failed",r instanceof Error?r.message:String(r),t)}}function WM(t){if(!t||typeof t!="string")return null;let e=t.trim();if(!e||e.includes("@")||e.includes("/")||e.includes("\\")||e.includes("?")||e.includes("#")||e.includes("://")||/\s/.test(e))return null;let n;try{n=new URL(`http://${e}`)}catch{return null}if(n.username||n.password||n.pathname!=="/"||n.search||n.hash)return null;let r=n.hostname.toLowerCase();if(!(r==="localhost"||r==="127.0.0.1"||r==="[::1]"||r==="::1")||!n.port)return null;let o=Number(n.port);return!Number.isInteger(o)||o<1||o>65535||n.port!==String(o)?null:`${r==="::1"||r==="[::1]"?"[::1]":r}:${o}`}function b5(t){let e=[],n=new Set,r=(s,o,i)=>{if(!s||!o)return;let a=WM(s);!a||n.has(`${a}\0${o}`)||(n.add(`${a}\0${o}`),e.push([a,o,i]))};r(t[FM],t[jM],-1);try{for(let s of l5("/proc"))if(/^\d+$/.test(s))try{let o={};for(let i of c5(d5("/proc",s,"environ")).toString("utf8").split("\0")){let a=i.indexOf("=");a>0&&(o[i.slice(0,a)]=i.slice(a+1))}r(o[FM],o[jM],Number(s))}catch{}}catch{}return e}function I5(t){if(typeof t!="object"||t===null)return null;let e=t.response;if(typeof e!="object"||e===null)return null;let n=e.groups;if(!Array.isArray(n))return null;let r=[];for(let s of n){if(typeof s!="object"||s===null)continue;let o=s,i=typeof o.displayName=="string"?o.displayName:null;if(Array.isArray(o.buckets))for(let a of o.buckets){if(typeof a!="object"||a===null)continue;let l=a,c=pr(l.remainingFraction,"fraction");r.push(Ct({bucket_id:l.bucketId??l.displayName??"unknown",group_name:i,window_type:UM(l.window),used_fraction:c===null?null:yt(1-c),remaining_fraction:c,resets_at_iso:l.resetTime??null,raw_value:l.remainingFraction??null,raw_scale:"remaining_fraction"}))}}return r.length===0?null:(r.sort((s,o)=>String(s.group_name??"").localeCompare(String(o.group_name??""))||String(s.bucket_id??"").localeCompare(String(o.bucket_id??""))),dt("agy","ok",{source:"agy_connect_rpc",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:r}))}async function k5(t,e,n={}){try{let s=y5(e).map(([a,l,c])=>[WM(a),l,c]).filter(a=>a[0]!==null);if(s.length===0)return et("agy","provider_unavailable","no_active_session","no live agy process exposed ANTIGRAVITY_LS_ADDRESS/ANTIGRAVITY_CSRF_TOKEN","agy_connect_rpc");let o=[],i=Date.now()+t*1e3;for(let[a,l,c]of s){let d=i-Date.now();if(d<=0){o.push("overall connect deadline exceeded");break}try{let u=await g5(`http://${a}${u5}`,{"Content-Type":"application/json","Connect-Protocol-Version":"1","x-codeium-csrf-token":l},d);if(Bt(n,"agy_connect_rpc",u.body,[l],u.status),u.status===200){let f;try{f=JSON.parse(u.body)}catch{o.push(`pid=${c}: unparseable response`);continue}let m=I5(f);if(m)return m;o.push(`pid=${c}: response had no quota groups`)}else u.status===401||u.status===403?o.push(`pid=${c}: HTTP ${u.status} unauthorized`):o.push(`pid=${c}: HTTP ${u.status}`)}catch(u){o.push(`pid=${c}: ${u instanceof Error?u.message:String(u)}`)}}return et("agy","provider_unavailable","no_active_session",`all candidate language servers failed: ${o.slice(0,5).join("; ")}`,"agy_connect_rpc",s.map(([,a])=>a))}catch(r){return et("agy","provider_unavailable","connect_failed",r instanceof Error?r.message:String(r),"agy_connect_rpc")}}async function HM(t){let e=await k5(t.timeoutSeconds,t.env,t);if(e.status==="ok")return e;let n=S5(t.timeoutSeconds,t.env,t);return n.status==="ok"?n:et("agy","provider_unavailable","cli_and_language_server_unavailable",`cli: ${String(n.reason??n.status)} (${String(n.detail??"no detail")}); connect: ${String(e.reason??e.status)} (${String(e.detail??"no detail")})`,"agy_cli_print")}var FM,jM,u5,f5,m5,p5,h5,_5,g5,y5,BM=C(()=>{"use strict";hr();hr();FM="ANTIGRAVITY_LS_ADDRESS",jM="ANTIGRAVITY_CSRF_TOKEN",u5="/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary",f5=["-p","/usage"],m5=(t,e)=>{let n=a5("agy",f5,{encoding:"utf8",timeout:t,maxBuffer:16777216,env:e,stdio:["ignore","pipe","ignore"]});return{status:n.status,stdout:typeof n.stdout=="string"?n.stdout:"",error:n.error}},p5=async(t,e,n)=>{let r=await fetch(t,{method:"POST",headers:e,body:"{}",signal:AbortSignal.timeout(n),redirect:"error"});return{status:r.status,body:await r.text()}},h5=t=>b5(t),_5=m5,g5=p5,y5=h5});import{randomUUID as GM}from"node:crypto";import{mkdirSync as A5,readFileSync as mT,realpathSync as N5,renameSync as x5,rmSync as pT,statSync as XM,writeFileSync as JM}from"node:fs";import{homedir as R5}from"node:os";import{join as hT}from"node:path";import{setTimeout as L5}from"node:timers/promises";function yT(t){return hT(t.CLAUDE_CONFIG_DIR??hT(t.HOME??R5(),".claude"),".credentials.json")}function _T(t){let e=JSON.parse(mT(t,"utf8"));if(!e||typeof e!="object"||Array.isArray(e))throw new Error("invalid credential document");return e}function gT(t){let e=t.claudeAiOauth;return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function VM(t){if(t.CLAUDE_CODE_OAUTH_TOKEN)return{oauth:{accessToken:t.CLAUDE_CODE_OAUTH_TOKEN}};let e=yT(t);try{let n=gT(_T(e));return typeof n?.accessToken=="string"&&n.accessToken?{oauth:n,path:N5(e)}:{error:"not_claude_ai_subscriber"}}catch(n){return n.code==="ENOENT"?{error:t.ANTHROPIC_API_KEY?"not_claude_ai_subscriber":"no_credentials_found"}:{error:"credentials_unreadable"}}}function jm(t){return typeof t.expiresAt=="number"&&Date.now()+D5>=t.expiresAt}function qM(t,e){return t.accessToken===e.accessToken&&t.refreshToken===e.refreshToken}async function M5(t,e){let n=`${t}.lmctl-refresh.lock`,r=hT(n,"owner.json"),s=GM();for(;;){e.throwIfAborted();try{A5(n,{mode:448});try{JM(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw pT(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(mT(r,"utf8")).token===s&&pT(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(mT(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-XM(n).mtimeMs>6e4}catch{try{i=Date.now()-XM(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await L5(50,void 0,{signal:e})}}}async function KM(t,e){if(!t.path||typeof t.oauth?.refreshToken!="string"||!t.oauth.refreshToken)throw new Error("no_refresh_token");let n=await M5(t.path,e);try{let r=gT(_T(t.path));if(!r||typeof r.accessToken!="string")throw new Error("credentials_changed");if(!qM(r,t.oauth)&&!jm(r))return r;if(typeof r.refreshToken!="string"||!r.refreshToken)throw new Error("no_refresh_token");let s=await fetch(O5,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:r.refreshToken,client_id:C5})});if(!s.ok)throw new Error(`refresh_http_${s.status}`);let o=await s.json();if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.expires_in!="number"||!Number.isFinite(o.expires_in)||o.expires_in<=0||o.refresh_token!==void 0&&(typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)))throw new Error("invalid_refresh_response");let i=Math.floor(Date.now()+o.expires_in*1e3);if(!Number.isSafeInteger(i)||i<=Date.now())throw new Error("invalid_refresh_response");let a=_T(t.path),l=gT(a);if(!l||!qM(r,l)){if(l&&typeof l.accessToken=="string"&&!jm(l))return l;throw new Error("credentials_changed")}let c={...l,accessToken:o.access_token,refreshToken:o.refresh_token??r.refreshToken,expiresAt:i,...typeof o.scope=="string"?{scopes:o.scope.split(/\s+/).filter(Boolean)}:{}},d=`${t.path}.${GM()}.tmp`;try{JM(d,JSON.stringify({...a,claudeAiOauth:c}),{flag:"wx",mode:384}),x5(d,t.path)}finally{pT(d,{force:!0})}return c}finally{n()}}var C5,O5,D5,zM=C(()=>{"use strict";C5="9d1c250a-e61b-44d9-88ed-5944d1962f5e",O5="https://console.anthropic.com/v1/oauth/token",D5=3e5});import{spawnSync as ZM}from"node:child_process";function U5(t){let e=String(t??"").toLowerCase();return e.includes("session")||e.includes("five")||e.includes("5h")?"five_hour":e.includes("week")||e.includes("seven")||e.includes("7d")?"weekly":e.includes("month")||e.includes("30d")?"monthly":"unknown"}function e$(t){return Object.fromEntries(Object.entries(t).filter(([e])=>e!=="CLAUDECODE"))}function F5(t){try{let e=ZM("claude",["--version"],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],env:e$(t)}),n=typeof e.stdout=="string"?e.stdout.trim().split(/\s+/)[0]:"";if(n)return`claude-code/${n}`}catch{}return"claude-code/unknown"}function Hn(t,e,n,r="claude_oauth_api",s){return et("claude",t,e,n,r,void 0,s)}function j5(t){let e=t.get("retry-after");if(!e)return;let n=Number.parseInt(e,10);return Number.isFinite(n)?n:void 0}function W5(t){if(!t)return;let e=/^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)?(?:\s*\(([^)]+)\))?$/i.exec(t.trim());if(!e)return;let n=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"].indexOf(e[1].slice(0,3).toLowerCase());if(n<0)return;let r=Number(e[3]),s=Number(e[4]??0);(e[5]??"").toLowerCase()==="pm"&&r!==12&&(r+=12),(e[5]??"").toLowerCase()==="am"&&r===12&&(r=0);let o=new Date(Date.UTC(new Date().getUTCFullYear(),n,Number(e[2]),r,s));return Number.isFinite(o.getTime())?Math.floor(o.getTime()/1e3):void 0}function B5(t){let e=[];for(let n of t.split(/\r?\n/)){let r=H5.exec(n.trim());if(!r)continue;let s=r[1].trim(),i=s.toLowerCase()==="session",a=/\(([^)]+)\)/.exec(s)?.[1]?.trim()??s,l=i?"session":a.toLowerCase()==="all models"?"week-all-models":`week-scoped-${a}`,c=i?"five_hour":"weekly";e.push(Ct({bucket_id:l,group_name:i?"session":"weekly",window_type:c,used_fraction:pr(Number(r[2]),"percent"),raw_value:Number(r[2]),raw_scale:"used_percent",resets_at:W5(r[3])}))}return e.sort((n,r)=>String(n.window_type).localeCompare(String(r.window_type))||String(n.bucket_id).localeCompare(String(r.bucket_id)))}function X5(t){let e={},n;for(let r of t.split(/\r?\n/)){let s=/^Last\s+(\S+)\s*[·-]\s*(\d+)\s+requests?\s*[·-]\s*(\d+)\s+sessions?\s*$/.exec(r.trim());if(s){n={requests:Number(s[2]),sessions:Number(s[3])},e[`window_${s[1].toLowerCase()}`]=n;continue}let o=/^\s+(\d+)%\s+of your usage\s+(.+?)\s*$/.exec(r);if(!o||!n)continue;let i=o[2].toLowerCase(),a=i.includes(">150k context")?"pct_high_context":i.includes("active for 8+ hours")?"pct_long_sessions":i.includes("subagent-heavy")?"pct_subagent_heavy":i.includes("ran in parallel")?"pct_parallel_sessions":void 0;a&&(n[a]=Number(o[1]))}return e}function q5(t,e){let n=t&&typeof t=="object"?t:void 0,r=e&&typeof e=="object"?e:void 0,s=!!(n?.limit||n?.used||n?.percent!==void 0);if(!s&&(!r||r.is_enabled===!1))return;let o=s&&n?.limit&&typeof n.limit=="object"?n.limit:{},i=s&&n?.used&&typeof n.used=="object"?n.used:{},a=g=>{let w=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isSafeInteger(w)&&w>=0&&w<=9?w:void 0},l=g=>{let w=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isFinite(w)?w:void 0},c=a(o.exponent??r?.decimal_places??2),d=a(i.exponent??r?.decimal_places??2),u=s?o.amount_minor:r?.monthly_limit,f=s?i.amount_minor:r?.used_credits,m=(g,w,y)=>w===void 0||y!==void 0&&y!=="USD"||l(g)===void 0?void 0:(l(g)/10**w).toFixed(2),p=pr(s?n?.percent:r?.utilization,"percent"),_=s?n?.spend_limit_reached??r?.spend_limit_reached:r?.spend_limit_reached,h={limit_usd:m(u,c,o.currency??r?.currency),used_usd:m(f,d,i.currency??r?.currency),remaining_fraction:p==null?void 0:Math.max(0,1-p),resets_at_iso:s?n?.resets_at:void 0,...typeof _=="boolean"?{reached:_}:{}};return Object.values(h).every(g=>g==null)?void 0:h}async function QM(t,e,n,r={}){try{let s=ZM("claude",["-p","/usage"],{encoding:"utf8",timeout:Math.max(n,60)*1e3,input:"",env:e$(e),maxBuffer:16777216}),o=typeof s.stdout=="string"?s.stdout:"";Bt(r,"claude_cli_print",o,[t.accessToken,t.refreshToken]);let i=B5(o);if(!i.length)return;let a=X5(o);return dt("claude",kt.ok,{source:"claude_cli_print",account_id:null,plan_type:t.subscriptionType??t.rateLimitTier??null,ordinary_usage_allowed:null,buckets:i,...Object.keys(a).length?{characteristics:a}:{}})}catch{return}}async function t$({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s=VM(e);if(s.error==="not_claude_ai_subscriber")return Hn(kt.notApplicable,s.error,"no OAuth subscription credentials; API-key accounts have no subscription quota endpoint");if(s.error==="no_credentials_found")return Hn(kt.unavailable,"credentials_missing",`credentials file not found: ${yT(e)}`);if(s.error)return Hn(kt.expired,"oauth_token_expired_or_invalid",s.error);let o=s.oauth,i=Array.isArray(o.scopes)?o.scopes:[];if(i.length&&!i.includes(YM))return Hn(kt.notApplicable,"not_claude_ai_subscriber",`credential lacks the ${YM} scope required by the usage endpoint`);let a=new AbortController,l=setTimeout(()=>a.abort(),t*1e3),c,d;try{let g=!1,w=async()=>{try{o=await KM({...s,oauth:o},a.signal),g=!0}catch(E){let T=E instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(E.message)?E.message:"refresh_failed";if(T==="refresh_http_429")return Hn(kt.throttled,"rate_limited","Claude OAuth refresh was rate limited; try again later");if(T==="refresh_lock_stale")return Hn(kt.expired,"oauth_refresh_locked","a previous Claude credential refresh exited without releasing its lock; remove the stale .credentials.json.lmctl-refresh.lock directory before retrying");let v=T==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(T);return Hn(v?kt.expired:kt.unavailable,v?"oauth_token_expired_or_invalid":"oauth_refresh_failed",`Claude OAuth refresh failed (${T})${v?"; renew Claude login":"; try again later"}`)}};if(jm(o)){let E=await w();if(E)return E}let y=()=>fetch(`${$5}/api/oauth/usage`,{headers:{Authorization:`Bearer ${o.accessToken}`,"anthropic-beta":P5,"Content-Type":"application/json","User-Agent":F5(e)},signal:a.signal});if(c=await y(),d=await c.text(),Bt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status),c.status===401&&!g&&s.path&&o.refreshToken){let E=await w();if(E)return E;c=await y(),d=await c.text(),Bt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status)}}catch(g){let w=await QM(o,e,t,{debug:n,onRawResponse:r});return w||Hn(kt.unavailable,"request_failed",`${g instanceof Error?g.name:"request failed"} (CLI fallback also unavailable)`)}finally{clearTimeout(l)}let u=(...g)=>Ps(Hn(...g),d,[String(o.accessToken??""),String(o.refreshToken??"")]);if(c.status===401)return u(kt.expired,"oauth_token_expired_or_invalid","HTTP 401 from usage endpoint");if(c.status===403)return u(kt.notApplicable,"not_claude_ai_subscriber","HTTP 403 from usage endpoint (account is not usage-eligible)");if(c.status===429){let g=j5(c.headers),w=await QM(o,e,t,{debug:n,onRawResponse:r});return w||u(kt.throttled,"rate_limited",`usage endpoint rate limited${g==null?"":`; retry after ${g}s`}`,"claude_oauth_api",g)}if(c.status!==200)return u(kt.unavailable,`http_${c.status}`,"usage endpoint returned an unexpected status");let f;try{f=JSON.parse(d)}catch{return Hn(kt.unavailable,"malformed_response","SyntaxError: malformed JSON")}if(!f||typeof f!="object"||Array.isArray(f))return Hn(kt.unavailable,"malformed_response","response was not an object");let m=f,p=Array.isArray(m.limits)?m.limits:[],_=p.length?p.flatMap(g=>{if(!g||typeof g!="object")return[];let w=g.kind,y=U5(w==="session"?"session":w),E=g.scope?.model?.display_name,T=w==="session"?"session":w==="weekly_all"?"week-all-models":`week-scoped-${E||w}`;return[Ct({bucket_id:T,group_name:w==="session"?"session":"weekly",window_type:y,used_fraction:pr(g.percent,"percent"),resets_at_iso:g.resets_at,raw_value:g.percent,raw_scale:"used_percent"})]}):["five_hour","seven_day"].flatMap(g=>{let w=m[g];return!w||typeof w!="object"?[]:[Ct({bucket_id:g==="five_hour"?"session":"week-all-models",group_name:g==="five_hour"?"session":"weekly",window_type:g==="five_hour"?"five_hour":"weekly",used_fraction:pr(w.utilization,"percent"),resets_at_iso:w.resets_at,raw_value:w.utilization,raw_scale:"used_percent"})]}),h=q5(m.spend,m.extra_usage);return dt("claude",kt.ok,{source:"claude_oauth_api",account_id:null,plan_type:o.subscriptionType??o.rateLimitTier??null,ordinary_usage_allowed:null,buckets:_.sort((g,w)=>String(g.window_type).localeCompare(String(w.window_type))||String(g.bucket_id).localeCompare(String(w.bucket_id))),...h?{spend_control:h}:{}})}var $5,P5,YM,kt,H5,n$=C(()=>{"use strict";hr();zM();hr();$5="https://api.anthropic.com",P5="oauth-2025-04-20",YM="user:profile";kt={ok:"ok",unavailable:"provider_unavailable",expired:"auth_expired",notApplicable:"not_applicable",throttled:"reader_throttled"};H5=/^Current\s+(.+?):\s*(\d+(?:\.\d+)?)\s*%\s*used(?:\s*[·-]\s*resets\s*(.+?))?$/});import{randomUUID as o$}from"node:crypto";import{mkdirSync as G5,readFileSync as wT,realpathSync as J5,renameSync as V5,rmSync as ET,statSync as r$,writeFileSync as i$}from"node:fs";import{homedir as K5}from"node:os";import{join as TT}from"node:path";import{setTimeout as z5}from"node:timers/promises";function Oc(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ST(t){if(t.CODEX_AUTH_PATH)return t.CODEX_AUTH_PATH;let e=t.CODEX_HOME||TT(t.HOME||K5(),".codex");return TT(e,"auth.json")}function vT(t){let e=Oc(JSON.parse(wT(t,"utf8")));if(!e)throw new Error("invalid credential document");return e}function a$(t){if(t.CODEX_ACCESS_TOKEN)return{tokens:{access_token:t.CODEX_ACCESS_TOKEN,account_id:t.CODEX_ACCOUNT_ID}};let e=ST(t);try{let n=Oc(vT(e).tokens);return typeof n?.access_token=="string"&&n.access_token?{tokens:n,path:J5(e)}:{error:"credentials_missing"}}catch(n){return{error:n.code==="ENOENT"?"credentials_missing":"credentials_unreadable"}}}function s$(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.id_token===e.id_token&&t.account_id===e.account_id}async function Z5(t,e){let n=`${t}.lmctl-refresh.lock`,r=TT(n,"owner.json"),s=o$();for(;;){e.throwIfAborted();try{G5(n,{mode:448});try{i$(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw ET(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(wT(r,"utf8")).token===s&&ET(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(wT(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-r$(n).mtimeMs>6e4}catch{try{i=Date.now()-r$(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await z5(50,void 0,{signal:e})}}}async function l$(t,e){if(!t.path||typeof t.tokens?.refresh_token!="string"||!t.tokens.refresh_token)throw new Error("no_refresh_token");let n=await Z5(t.path,e);try{let r=vT(t.path),s=Oc(r.tokens);if(!s||typeof s.access_token!="string")throw new Error("credentials_changed");if(!s$(s,t.tokens)&&typeof s.access_token=="string")return s;if(typeof s.refresh_token!="string"||!s.refresh_token)throw new Error("no_refresh_token");let o=await fetch(Y5,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:s.refresh_token,client_id:Q5})});if(!o.ok)throw new Error(`refresh_http_${o.status}`);let i=Oc(await o.json());if(!i||typeof i.access_token!="string"||!/^\S+$/.test(i.access_token)||i.refresh_token!==void 0&&(typeof i.refresh_token!="string"||!/^\S+$/.test(i.refresh_token))||i.id_token!==void 0&&(typeof i.id_token!="string"||!/^\S+$/.test(i.id_token)))throw new Error("invalid_refresh_response");let a=vT(t.path),l=Oc(a.tokens);if(!l||!s$(s,l)){if(l&&typeof l.access_token=="string")return l;throw new Error("credentials_changed")}let c={...l,access_token:i.access_token,...i.refresh_token===void 0?{}:{refresh_token:i.refresh_token},...i.id_token===void 0?{}:{id_token:i.id_token}},d={...a,tokens:c,last_refresh:new Date().toISOString()},u=`${t.path}.${o$()}.tmp`;try{i$(u,JSON.stringify(d),{flag:"wx",mode:384}),V5(u,t.path)}finally{ET(u,{force:!0})}return c}finally{n()}}var Y5,Q5,c$=C(()=>{"use strict";Y5="https://auth.openai.com/oauth/token",Q5="app_EMoamEEZ73f0CkXaXp7hrann"});function _r(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function d$(t){let e=typeof t=="number"?t:Number(t);if(!Number.isFinite(e)||e<=0)return"unknown";let n=e/60;return n>=240&&n<=360?"five_hour":n>=9e3&&n<=11500?"weekly":n>=38e3&&n<=46e3?"monthly":"unknown"}function u$(t){return t==="five_hour"?"5h":t==="weekly"?"weekly":t==="monthly"?"monthly":"window"}function n9(t){if(_r(t))return{has_credits:t.has_credits,unlimited:t.unlimited,balance:t.balance}}function r9(t){let e=[],n=_r(t.rate_limit)?t.rate_limit:{},r=typeof n.allowed=="boolean"?n.allowed:void 0,s=typeof n.limit_reached=="boolean"?n.limit_reached:void 0;for(let i of["primary_window","secondary_window"]){let a=_r(n[i])?n[i]:void 0;if(!a)continue;let l=d$(a.limit_window_seconds);e.push(Ct({bucket_id:`codex-${u$(l)}`,group_name:"codex",window_type:l,used_fraction:pr(a.used_percent,"percent"),resets_at:a.reset_at,raw_value:a.used_percent,raw_scale:"used_percent",...r===void 0?{}:{allowed:r},...s===void 0?{}:{limit_reached:s}}))}let o=Array.isArray(t.additional_rate_limits)?t.additional_rate_limits:[];for(let i of o){if(!_r(i))continue;let a=_r(i.rate_limit)?i.rate_limit:{},l=typeof i.limit_name=="string"?i.limit_name:void 0,c=typeof i.metered_feature=="string"?i.metered_feature:void 0,d=c||l||"additional",u=typeof a.allowed=="boolean"?a.allowed:void 0,f=typeof a.limit_reached=="boolean"?a.limit_reached:void 0;for(let m of["primary_window","secondary_window"]){let p=_r(a[m])?a[m]:void 0;if(!p)continue;let _=d$(p.limit_window_seconds);e.push(Ct({bucket_id:`${d}-${u$(_)}`,group_name:l||d,window_type:_,used_fraction:pr(p.used_percent,"percent"),resets_at:p.reset_at,raw_value:p.used_percent,raw_scale:"used_percent",...l===void 0?{}:{limit_name:l},...c===void 0?{}:{metered_feature:c},...u===void 0?{}:{allowed:u},...f===void 0?{}:{limit_reached:f}}))}}return e.sort((i,a)=>String(i.group_name??"").localeCompare(String(a.group_name??""))||String(i.bucket_id).localeCompare(String(a.bucket_id)))}function s9(t){let e=_r(t.rate_limit)?t.rate_limit:{},n=typeof e.allowed=="boolean"?e.allowed:void 0,r=_r(t.spend_control)?t.spend_control:void 0,s=_r(t.credits)?t.credits:void 0;return dt("codex","ok",{source:"codex_http",account_id:t.account_id,plan_type:t.plan_type,...n===void 0?{}:{ordinary_usage_allowed:n},buckets:r9(t),...s?{credits:n9(s)}:{},...r?{spend_control:r}:{}})}async function f$(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s}=t,o=a$(n),i=o.tokens;if(!i||typeof i.access_token!="string")return dt("codex","provider_unavailable",{source:"codex_http",reason:"credentials_missing",detail:`no access_token in ${ST(n)} (or $CODEX_ACCESS_TOKEN)`});let a=new AbortController,l=setTimeout(()=>a.abort(),Math.ceil(e*1e3)),c=i.access_token,d=new Set([i.access_token,i.refresh_token,i.id_token].filter(u=>typeof u=="string"&&!!u));try{let u=typeof i.account_id=="string"?i.account_id:void 0,f=typeof i.refresh_token=="string"?i.refresh_token:void 0,m=typeof i.id_token=="string"?i.id_token:void 0,p="",_=()=>[...d],h=(v,b)=>Ps(dt("codex",v,b),p,_()),g=!1,w=async()=>{if(!(g||!o.path||typeof i.refresh_token!="string"))try{let v=await l$({...o,tokens:{...i,refresh_token:f}},a.signal);typeof v.access_token=="string"&&(d.add(v.access_token),c=v.access_token),u=typeof v.account_id=="string"?v.account_id:u,typeof v.refresh_token=="string"&&(d.add(v.refresh_token),f=v.refresh_token),typeof v.id_token=="string"&&(d.add(v.id_token),m=v.id_token),g=!0;return}catch(v){let b=v instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(v.message)?v.message:"refresh_failed",k=b==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(b);return dt("codex",k?"auth_expired":"provider_unavailable",{source:"codex_http",reason:k?"oauth_token_expired_or_invalid":"oauth_refresh_failed",detail:`Codex OAuth refresh failed (${b})${k?"; renew Codex login":"; try again later"}`})}},y=()=>{let v={Authorization:`Bearer ${c}`,"User-Agent":t9,"Content-Type":"application/json",Accept:"application/json"};u&&(v["ChatGPT-Account-Id"]=u);let b=(n.CODEX_BASE_URL||e9).replace(/\/$/,"");return fetch(`${b}/wham/usage`,{headers:v,signal:a.signal})},E=await y();if(p=await E.text(),Bt({debug:r,onRawResponse:s},"codex_http",p,_(),E.status),E.status===401&&o.path&&f){let v=await w();if(v)return v;E=await y(),p=await E.text(),Bt({debug:r,onRawResponse:s},"codex_http",p,_(),E.status)}if(E.status===401)return h("auth_expired",{source:"codex_http",reason:"oauth_token_expired_or_invalid",detail:"HTTP 401 from the codex usage endpoint"});if(E.status===429){let v=E.headers.get("retry-after"),b=v===null?void 0:Number.parseInt(v,10);return h("reader_throttled",{source:"codex_http",reason:"throttled",detail:"HTTP 429 from codex usage endpoint",...b!==void 0&&Number.isFinite(b)&&b>=0?{retry_after_seconds:b}:{}})}if(!E.ok)return h("provider_unavailable",{source:"codex_http",reason:`http_${E.status}`,detail:"codex usage endpoint returned an unexpected status"});let T;try{T=JSON.parse(p)}catch(v){return dt("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:da(String(v),d)})}return _r(T)?s9(T):dt("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:"response was not an object"})}catch(u){let f=u instanceof Error?`${u.name}: ${u.message}`:String(u);return dt("codex","provider_unavailable",{source:"codex_http",reason:"http_request_failed",detail:da(f,d)})}finally{clearTimeout(l)}}var e9,t9,m$=C(()=>{"use strict";hr();c$();hr();e9="https://chatgpt.com/backend-api",t9="codex-cli"});import{createHash as o9,randomUUID as i9}from"node:crypto";import{readFileSync as y$,openSync as a9,fsyncSync as l9,closeSync as c9,mkdirSync as p$,writeFileSync as w$,renameSync as d9,rmSync as u9,rmdirSync as f9,statSync as bT,utimesSync as m9}from"node:fs";import{homedir as p9}from"node:os";import{basename as h9,dirname as _9,join as Wm}from"node:path";import{setTimeout as E$}from"node:timers/promises";function y9(t){let e;try{e=y$(t,"utf8")}catch(s){if(s.code==="ENOENT")return{};throw new Error("config_unreadable")}let n={},r="other";for(let s of e.split(/\r?\n/)){let o=/^\s*\[providers\.(?:"managed:kimi-code"|'managed:kimi-code')(\.oauth)?\]\s*(?:#.*)?$/.exec(s);if(o){r=o[1]?"oauth.":"";continue}if(/^\s*\[/.test(s)){if(s.includes("managed:kimi-code"))throw new Error("config_format_unsupported");r="other";continue}if(r==="other")continue;if(/^\s*oauth\s*=/.test(s))throw new Error("config_format_unsupported");let i=/^\s*(base_url|oauth_host|storage|key)\s*=\s*("(?:[^"\\]|\\.)*"|'[^']*')\s*(?:#.*)?$/.exec(s);if(!i&&/^\s*(base_url|oauth_host|storage|key)\s*=/.test(s))throw new Error("config_malformed");if(i)try{n[r+i[1]]=i[2].startsWith('"')?JSON.parse(i[2]):i[2].slice(1,-1)}catch{throw new Error("config_malformed")}}return n}function Hm(t){let e;try{e=JSON.parse(y$(t,"utf8"))}catch(n){throw new Error(n.code==="ENOENT"?"credentials_missing":"credentials_malformed")}if(e&&typeof e=="object"&&e.access_token===""&&e.refresh_token==="")throw new Error("credentials_revoked");if(!e||typeof e!="object"||Array.isArray(e)||typeof e.access_token!="string"||!e.access_token.trim())throw new Error("credentials_malformed");return e}function T$(t){let e=t.KIMI_CODE_HOME??Wm(t.HOME??p9(),".kimi-code"),n=y9(t.KIMI_CODE_CONFIG_PATH??Wm(e,"config.toml")),r=t.KIMI_CODE_BASE_URL!==void 0||t.KIMI_CODE_OAUTH_HOST!==void 0||t.KIMI_OAUTH_HOST!==void 0,s=_$(t.KIMI_CODE_BASE_URL??n.base_url??h$),o=_$(t.KIMI_CODE_OAUTH_HOST??t.KIMI_OAUTH_HOST??(r?IT:n["oauth.oauth_host"]??IT)),i=s===h$&&o===IT?"kimi-code":`kimi-code-env-${o9("sha256").update(JSON.stringify({oauthHost:o,baseUrl:s})).digest("hex").slice(0,16)}`;if(!t.KIMI_CREDENTIALS_PATH&&!r&&n["oauth.key"]===`oauth/${i}`&&n["oauth.storage"]&&n["oauth.storage"]!=="file")throw new Error("credential_storage_unsupported");let a=t.KIMI_CREDENTIALS_PATH??Wm(e,"credentials",`${i}.json`),l=Hm(a),c=a,d=h9(a,".json");return{home:e,path:c,lockTarget:Wm(e,"oauth",d),baseUrl:s,oauthHost:o,token:l}}function Bm(t){if(typeof t.expires_at!="number")return!1;let e=typeof t.expires_in=="number"?t.expires_in:0;return t.expires_at-Date.now()/1e3<Math.max(300,e*.5)}function g$(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.expires_at===e.expires_at&&t.expires_in===e.expires_in}async function w9(t,e){p$(_9(t),{recursive:!0}),w$(t,"",{flag:"a",mode:384});let n=`${t}.lock`;for(;;){if(e.aborted)throw new Error("refresh_locked");try{p$(n);break}catch(i){if(i.code!=="EEXIST")throw new Error("refresh_lock_failed");try{if(Date.now()-bT(n).mtimeMs>5e3)throw new Error("refresh_lock_stale")}catch(a){if(a.message==="refresh_lock_stale")throw a}try{await E$(50,void 0,{signal:e})}catch{throw new Error("refresh_locked")}}}let r=bT(n),s=()=>{let i;try{i=bT(n)}catch{throw new Error("refresh_lock_lost")}if(i.ino!==r.ino||i.dev!==r.dev)throw new Error("refresh_lock_lost")},o=setInterval(()=>{try{s();let i=new Date;m9(n,i,i)}catch{}},1e3);return o.unref(),{assertOwned:s,release(){clearInterval(o);try{s(),f9(n)}catch{}}}}async function v$(t,e){if(typeof t.token.refresh_token!="string"||!t.token.refresh_token)throw new Error("no_refresh_token");let n=await w9(t.lockTarget,e);try{let r=Hm(t.path);if(!g$(r,t.token)&&!Bm(r))return r;if(typeof r.refresh_token!="string"||!r.refresh_token)throw new Error("no_refresh_token");let s;for(let u=0;u<3;u++){try{if(s=await fetch(`${t.oauthHost}/api/oauth/token`,{method:"POST",signal:e,headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json","User-Agent":"lmctl"},body:new URLSearchParams({client_id:g9,grant_type:"refresh_token",refresh_token:r.refresh_token})}),![429,500,502,503,504].includes(s.status)||u===2)break;await s.body?.cancel()}catch{if(e.aborted||u===2)throw new Error("refresh_request_failed")}await E$(1e3*2**u,void 0,{signal:e})}if(!s)throw new Error("refresh_request_failed");if(!s.ok){try{let u=Hm(t.path);if(u.refresh_token!==r.refresh_token)return u}catch{}throw new Error(`refresh_http_${s.status}`)}let o=await s.json(),i=Number(o?.expires_in);if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)||!Number.isFinite(i)||i<=0)throw new Error("invalid_refresh_response");let a=Math.floor(Date.now()/1e3)+i;if(!Number.isSafeInteger(a))throw new Error("invalid_refresh_response");n.assertOwned();let l=Hm(t.path);if(!g$(l,r)){if(!Bm(l))return l;throw new Error("credentials_changed")}let c={...l,access_token:o.access_token,refresh_token:o.refresh_token,expires_at:a,expires_in:i,...typeof o.scope=="string"?{scope:o.scope}:{},...typeof o.token_type=="string"?{token_type:o.token_type}:{}},d=`${t.path}.${i9()}.tmp`;try{let u=a9(d,"wx",384);try{w$(u,JSON.stringify(c,null,2)+`
3043
+ `),l9(u)}finally{c9(u)}n.assertOwned(),d9(d,t.path)}finally{u9(d,{force:!0})}return c}finally{n.release()}}var h$,IT,g9,_$,S$=C(()=>{"use strict";h$="https://api.kimi.com/coding/v1",IT="https://auth.kimi.com",g9="17e5f671-d194-4dfb-9706-5516cb48c098",_$=t=>t.trim().replace(/\/+$/,"")});function b$(t){let e=i=>{if(typeof i!="number"&&typeof i!="string"||typeof i=="string"&&i.trim()==="")return;let a=Number(i);return Number.isFinite(a)&&a>=0?a:void 0},n=e(t.limit),r=e(t.used),s=e(t.remaining);if(n===void 0||n<=0||r===void 0&&(s===void 0||s>n))return;let o=r??n-s;return{used:o,limit:n,remaining:Math.max(0,n-o)}}async function I$({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s;try{s=T$(e)}catch(_){let h=_ instanceof Error&&/^(credentials_missing|credentials_malformed|credentials_revoked|config_unreadable|config_malformed|config_format_unsupported|credential_storage_unsupported)$/.test(_.message)?_.message:"credentials_unreadable";return et("kimi",h==="credentials_revoked"?"auth_expired":"provider_unavailable",h,h==="credentials_revoked"?"Kimi login was revoked; run kimi login":h.replaceAll("_"," "),"kimi_http")}let o=s.token,i=new AbortController,a=setTimeout(()=>i.abort(),t*1e3),l,c;try{let _=!1,h=async()=>{o=await v$({...s,token:o},i.signal),_=!0};Bm(o)&&await h();let g=()=>fetch(`${s.baseUrl}/usages`,{headers:{Authorization:`Bearer ${o.access_token}`,Accept:"application/json"},signal:i.signal});l=await g(),c=await l.text(),Bt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status),l.status===401&&!_&&o.refresh_token&&(await h(),l=await g(),c=await l.text(),Bt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status))}catch(_){let h=_ instanceof Error&&/^(no_refresh_token|credentials_changed|credentials_revoked|invalid_refresh_response|refresh_locked|refresh_lock_stale|refresh_lock_failed|refresh_lock_lost|refresh_request_failed|refresh_http_\d+)$/.test(_.message)?_.message:"request_failed",g=h==="credentials_revoked"||h==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(h),w=h==="refresh_lock_stale"?"Kimi refresh lock is stale; run the native Kimi CLI to recover its lock, or verify no refresh is active before removing the .lock directory":g?`Kimi credential renewal failed (${h}); run kimi login`:`Kimi quota request failed (${h})`;return et("kimi",g?"auth_expired":"provider_unavailable",h,w,"kimi_http")}finally{clearTimeout(a)}let d=(_,h,g)=>Ps(et("kimi",_,h,h,"kimi_http",[],g),c,[o.access_token]);if(l.status===401)return d("auth_expired","HTTP 401 from Kimi usage endpoint");if(l.status===403)return d("not_applicable","HTTP 403 from Kimi usage endpoint");if(l.status===429){let _=Fm(l.headers);return d("reader_throttled","HTTP 429 from Kimi usage endpoint",_)}if(l.status!==200)return d("provider_unavailable",`HTTP ${l.status} from Kimi usage endpoint`);let u;try{u=JSON.parse(c)}catch{return et("kimi","provider_unavailable","malformed_response","SyntaxError: malformed JSON")}if(!u||typeof u!="object")return et("kimi","provider_unavailable","malformed_response","response was not an object");let f=[],m=new Set;function p(_){let h=String(_.bucket_id),g=h,w=2;for(;m.has(h);)h=`${g}-${w}`,w++;m.add(h),_.bucket_id=h,f.push(Ct(_))}if(Array.isArray(u.limits))for(let _ of u.limits){if(!_||typeof _!="object")continue;let h=_.window,g=_.detail;if(!h||typeof h!="object"||!g||typeof g!="object")continue;let w=0;if(h.timeUnit==="TIME_UNIT_MINUTE")w=Number(h.duration);else if(h.timeUnit==="TIME_UNIT_HOUR")w=Number(h.duration)*60;else if(h.timeUnit==="TIME_UNIT_DAY")w=Number(h.duration)*1440;else if(h.timeUnit==="TIME_UNIT_WEEK")w=Number(h.duration)*10080;else if(h.timeUnit==="TIME_UNIT_MONTH")w=Number(h.duration)*43200;else continue;let y=PM(w),E="window";y==="five_hour"&&(E="5h"),y==="weekly"&&(E="weekly"),y==="monthly"&&(E="monthly");let T=b$(g);if(!T)continue;let{used:v,limit:b,remaining:k}=T;p({bucket_id:`kimi-${E}`,window_type:y,used_fraction:yt(v/b),remaining_fraction:yt(k/b),resets_at_iso:g.resetTime,raw_value:v,raw_scale:"count"})}if(u.usage&&typeof u.usage=="object"){let _=b$(u.usage);_&&p({bucket_id:"kimi-weekly",window_type:"weekly",used_fraction:yt(_.used/_.limit),remaining_fraction:yt(_.remaining/_.limit),resets_at_iso:u.usage.resetTime,raw_value:_.used,raw_scale:"count"})}if(u.usages&&typeof u.usages=="object"){let _=[{key:"limit_5h",id:"kimi-5h",type:"five_hour"},{key:"limit_7d",id:"kimi-weekly",type:"weekly"},{key:"limit_month_total",id:"kimi-monthly",type:"monthly"},{key:"limit_month_code",id:"kimi-monthly-code",type:"monthly"}];for(let{key:h,id:g,type:w}of _){let y=u.usages[h];if(!y||typeof y!="object"||y.used_ratio==null||y.used_ratio===""||typeof y.used_ratio=="boolean")continue;let E=Number(y.used_ratio);!Number.isFinite(E)||E<0||m.has(g)||(m.add(g),f.push(Ct({bucket_id:g,window_type:w,used_fraction:yt(E),resets_at_iso:typeof y.reset_time=="string"&&y.reset_time?y.reset_time:null,raw_value:E,raw_scale:"ratio"})))}}return dt("kimi","ok",{source:"kimi_http",buckets:f})}var k$=C(()=>{"use strict";hr();S$();hr()});function Dc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Xm(t){if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t=="string"&&t.trim()!==""){let e=Number(t);if(Number.isFinite(e))return e}}async function A$(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s,fetchFn:o=fetch}=t,i=n.OLLAMA_API_KEY?.trim();if(!i)return et("ollama-cloud","provider_unavailable","credentials_missing","$OLLAMA_API_KEY is missing","ollama_http");let a="https://ollama.com/api/balance",l=new AbortController,c=setTimeout(()=>l.abort(),Math.ceil(e*1e3)),d,u="";try{d=await o(a,{method:"GET",redirect:"error",headers:{Authorization:`Bearer ${i}`,Accept:"application/json"},signal:l.signal}),u=await d.text();let h=u;try{h=JSON.stringify(JSON.parse(u))}catch{}Bt({debug:r,onRawResponse:s},"ollama_http",h,[i],d.status)}catch(h){let g=h instanceof Error&&h.name==="AbortError",w=g?`Ollama quota request timed out after ${e}s`:`Ollama quota request failed (${h instanceof Error?h.message:String(h)})`;return et("ollama-cloud","provider_unavailable",g?"request_timeout":"request_failed",w,"ollama_http",[i])}finally{clearTimeout(c)}let f=(h,g,w)=>Ps(et("ollama-cloud",h,g,g,"ollama_http",[i],w),u,[i]);if(d.status===401)return f("auth_expired","HTTP 401 from Ollama balance endpoint");if(d.status===403)return f("not_applicable","HTTP 403 from Ollama balance endpoint");if(d.status===429){let h=Fm(d.headers);return f("reader_throttled","HTTP 429 from Ollama balance endpoint",h)}if(d.status!==200)return f("provider_unavailable",`HTTP ${d.status} from Ollama balance endpoint`);let m;try{m=JSON.parse(u)}catch{return et("ollama-cloud","provider_unavailable","malformed_response","SyntaxError: malformed JSON","ollama_http")}if(!Dc(m))return et("ollama-cloud","provider_unavailable","malformed_response","response was not an object","ollama_http");let p=[];if(Dc(m.included)){let h=m.included,g=Xm(h.allowance_usd),w=Xm(h.balance_usd),y=Dc(h.period)?h.period:void 0,E=typeof y?.from=="string"?Date.parse(y.from):NaN,T=typeof y?.until=="string"?Date.parse(y.until):NaN,v=Number.isFinite(E)&&Number.isFinite(T)&&T>E,b=v?new Date(T).toISOString():null;if(g!==void 0&&g>0&&w!==void 0){let k=Math.max(0,g-w);p.push({...Ct({bucket_id:"ollama-cloud-monthly",group_name:"ollama-cloud",window_type:"monthly",used_fraction:yt(k/g),remaining_fraction:yt(w/g),resets_at_iso:b,is_exhausted:w<=0,raw_value:w,raw_scale:"balance_usd"}),window_start_iso:v?new Date(Math.floor(E/1e3)*1e3).toISOString().replace(".000Z","Z"):null})}if(g===void 0&&w===void 0)for(let[k,I,N]of[["session","five_hour","5h"],["weekly","weekly","weekly"]]){let A=h[k];if(!Dc(A))continue;let S=Xm(A.remaining_percent);S===void 0||S<0||S>100||p.push(Ct({bucket_id:`ollama-cloud-${N}`,group_name:"ollama-cloud",window_type:I,remaining_fraction:S/100,resets_at_iso:typeof A.resets_at=="string"?A.resets_at:null,raw_value:S,raw_scale:"remaining_percent"}))}}let _;if(Dc(m.purchased)){let h=m.purchased,g=Xm(h.balance_usd);g!==void 0&&(_={has_credits:g>0,balance:g})}return p.length===0&&_===void 0?et("ollama-cloud","provider_unavailable","malformed_response","response has no usable included allowance or purchased balance","ollama_http"):dt("ollama-cloud","ok",{source:"ollama_http",buckets:p,..._?{credits:_}:{}})}var N$=C(()=>{"use strict";hr()});async function x$(t={}){let e=t.targets??t.providers??["all"];if(!Array.isArray(e)||e.length===0||e.some(u=>typeof u!="string"))return{status:"error",error:"providers must be a non-empty list of provider names",readings:[]};for(let u of e)if(!qm.includes(u))return{status:"error",error:`unknown provider: ${u} (valid targets: ${qm.join(", ")})`,readings:[]};let n=t.timeoutSeconds??E9;if(!Number.isFinite(n)||n<=0)return{status:"error",error:"timeoutSeconds must be a positive finite number",readings:[]};let r=t.env??process.env,s=["codex","agy","claude","kimi"];(r.OLLAMA_API_KEY?.trim()||e.includes("ollama-cloud"))&&s.push("ollama-cloud");let o=new Set(e.includes("all")?s:e);t.progress?.(`querying ${e.join(" ")} live (timeout ${n}s per provider) ...`);let a=Object.entries({codex:f$,agy:HM,claude:t$,kimi:I$,"ollama-cloud":A$}).filter(([u])=>o.has(u)).map(async([,u])=>{let f=[],m=await u({timeoutSeconds:n,env:r,...t.debug?{debug:t.debug}:{},...t.includeRaw?{onRawResponse:_=>f.push(_)}:{}}),p=t.includeRaw?{...m,raw_responses:f}:m;return p&&t.onReading?.(p),p}),l=await Promise.allSettled(a),c=l.find(u=>u.status==="rejected");return c?{status:"error",error:String(c.reason),readings:[]}:{status:"ok",readings:l.filter(u=>u.status==="fulfilled").map(u=>u.value).filter(Boolean)}}var qm,E9,R$=C(()=>{"use strict";BM();n$();m$();k$();N$();qm=["all","codex","agy","claude","kimi","ollama-cloud"],E9=15});var D$={};ye(D$,{runRatelimit:()=>A9});function kT(t){return typeof t=="object"&&t!==null}function T9(t){return typeof t=="number"&&t>0&&t<.005?`${(t*100).toFixed(1)}%`:(0,wt.formatPercent)(typeof t=="number"?t:null)}function v9(t,e){let n=typeof e.bucket_id=="string"&&e.bucket_id!==""?e.bucket_id:"unknown-bucket";return n==="session"?n="5h":n==="week-all-models"?n="weekly":n.startsWith("week-scoped-")&&(n=`weekly-${n.slice(12)}`),t!==""&&!n.startsWith(`${t}-`)&&(n=`${t}-${n}`),(0,wt.escapeCell)(n)}function b9(t,e){let n="unknown",r=null,s,o=null;if(typeof e.resets_at_iso=="string"&&e.resets_at_iso!==""){let c=Date.parse(e.resets_at_iso);if(o=Number.isFinite(c)?c-Date.now():null,o!==null){if(Math.abs(o)<1e3?n="now":o>0?n=`in ${(0,wt.formatDuration)(o,{maxUnit:"d",style:"compact"})}`:n=`${(0,wt.formatDuration)(-o,{maxUnit:"d",style:"compact"})} ago`,typeof e.window_start_iso=="string"){let d=Date.parse(e.window_start_iso);Number.isFinite(d)&&c>d&&(s=c-d)}else(t!=="ollama-cloud"||e.window_type!=="monthly")&&(s=S9[typeof e.window_type=="string"?e.window_type:""]);s!==void 0&&(r=Math.min(1,Math.max(0,1-o/s)))}}r!==null&&(n=`${(0,wt.formatBar)(r)} ${n}`);let i="";if(r!==null&&r>0&&s!==void 0&&o!==null&&o>0&&typeof e.used_fraction=="number"&&Number.isFinite(e.used_fraction)){let c=e.used_fraction;if(c<=r){let d=Math.max(0,1-c/r);i=`unused +${(0,wt.formatPercent)(d)}`}else{let d=r*s,u=d>0?(1-c)/c*d:0,f=Math.max(0,o-u);i=`needing -${(0,wt.formatDuration)(f,{maxUnit:"d",style:"compact"})}`}}let a=[];e.is_exhausted===!0&&a.push("[EXHAUSTED]"),e.allowed===!1&&a.push("allowed=false"),e.limit_reached===!0&&a.push("limit_reached");let l=[v9(t,e),`${(0,wt.formatBar)(typeof e.used_fraction=="number"?e.used_fraction:null)} ${T9(e.used_fraction)}`,n];return(i!==""||a.length>0)&&l.push(i),a.length>0&&l.push(a.join(" ")),l}function I9(t){let e=typeof t.provider=="string"&&t.provider!==""?t.provider:"unknown",n=typeof t.status=="string"?t.status:"unknown",r=typeof t.source=="string"&&t.source!==""?t.source:"unknown source",s=typeof t.reason=="string"?t.reason:"",o=`${e}: ${n} (${r})`;n!=="ok"&&typeof t.provider_message=="string"&&t.provider_message.trim()?o=`${e}: ${(0,wt.escapeCell)(t.provider_message)} (${r})`:n==="auth_expired"?(o=`${e}: unavailable (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n==="provider_unavailable"&&O$.has(s)?(o=`${e}: not installed/configured (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n!=="ok"&&(o+=` -- ${s!==""?s:"no reason given"}`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`),n==="provider_unavailable"&&s!=="oauth_refresh_failed"&&!/^(credentials_|config_|credential_storage_|refresh_)/.test(s)&&(o+=` (${e} server-side, not lmctl \u2014 try again later)`));let i=typeof t.plan_type=="string"?t.plan_type.trim():"";i&&!["?","unknown","null","n/a"].includes(i.toLowerCase())&&(o+=` (${(0,wt.escapeCell)(i)})`);let a=typeof t.provider=="string"?t.provider:"",l=Array.isArray(t.buckets)?t.buckets.filter(kT).map(d=>b9(a,d)):[],c=[];if(kT(t.credits)){let d=t.credits,u=[];typeof d.has_credits=="boolean"&&u.push(`has_credits=${d.has_credits}`),d.unlimited===!0&&u.push("unlimited"),d.balance!==void 0&&d.balance!==null&&u.push(`balance=${String(d.balance)}`);let f=a==="ollama-cloud"?"purchased credits (USD)":"credits";c.push(` ${f}: ${u.length>0?u.join(" "):"present"}`)}if(kT(t.spend_control)){let d=t.spend_control,u=` spend control: reached=${d.reached===!0}`;d.used_usd!==void 0&&d.used_usd!==null&&(u+=` used=$${String(d.used_usd)}`),d.limit_usd!==void 0&&d.limit_usd!==null&&(u+=` limit=$${String(d.limit_usd)}`),d.individual_limit!==void 0&&d.individual_limit!==null&&(u+=` individual_limit=${String(d.individual_limit)}`),c.push(u)}return{head:o,bucketRows:l,footers:c}}function k9(t){let e=I9(t),n=[e.head];if(e.bucketRows.length>0){let r=["LIMIT","USED","RESET TIME","OVERSTOCK"],s=(0,wt.measureColumns)([{rows:[],headers:r},e.bucketRows]);n.push((0,wt.renderGrid)(e.bucketRows,{widths:s,margin:2,align:["left","left","left"],headers:r}))}return n.push(...e.footers),n.join(`
3045
3044
  `)}function AT(t,e){return t.stderr.write(`error: ${e}
3046
3045
  ${C$}
3047
- `),2}async function N9(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${C$}
3046
+ `),2}async function A9(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${C$}
3048
3047
  `),0;let n=ce(t,["--timeout"],["--json"]);if(n.error!==void 0)return AT(e,n.error);let r=z(n,"--json");for(let f of n.positionals)if(!L$.includes(f))return AT(e,`unknown provider: ${f} (valid targets: ${L$.join(", ")})`);let s=n.positionals.length>0?n.positionals:["all"],o=15,i=F(n,"--timeout");if(i!==void 0){let f=Number(i);if(!Number.isFinite(f)||f<=0)return AT(e,`invalid --timeout "${i}" (expected a positive number of seconds)`);o=f}let a=new Set(n.positionals),l=0,c=f=>{let m=typeof f.status=="string"?f.status:"",p=typeof f.reason=="string"?f.reason:"";m==="provider_unavailable"&&O$.has(p)&&!a.has(typeof f.provider=="string"?f.provider:"")||(l>0&&e.stdout.write(`
3049
- `),e.stdout.write(`${A9(f)}
3048
+ `),e.stdout.write(`${k9(f)}
3050
3049
  `),l+=1)},d=await x$({targets:s,timeoutSeconds:o,includeRaw:r,env:e.env??process.env,progress:f=>e.stderr.write(`${f}
3051
3050
  `),...r?{}:{onReading:c},...Ga()||e.env?.LMCTL_DEBUG==="1"?{debug:f=>e.stderr.write(`${f}
3052
3051
  `)}:{}});if(d.status==="error")return e.stderr.write(`error: ${d.error}
3053
3052
  `),1;let u=d.readings;return r?(Y(e,{readings:u}),0):(l===0&&e.stdout.write(`rate-limit: no readings returned.
3054
- `),0)}var wt,C$,O$,L$,b9,M$=C(()=>{"use strict";Ee();wt=pn(rn(),1);he();R$();C$=["usage: lmctl ratelimit [provider ...] [--json] [--debug] [--timeout <seconds>]",""," Queries provider subscription rate limits in REAL TIME via the TypeScript"," provider readers -- stateless: nothing is read from or written to any"," database.",""," Providers: all (default), codex, agy, claude, kimi, ollama-cloud. Multiple allowed.",""," ollama-cloud is included in all only when OLLAMA_API_KEY is set."," It reads Ollama Cloud (not local Ollama); one GET, no automatic retries.",""," --debug Print raw quota responses to stderr before parsing."," Credentials are redacted; JSON stdout stays clean."," --timeout <seconds> Per-provider reader timeout (default 15).",' --json Emit {"readings": [...]} in the lmratelimit-v1 schema'," with every raw field preserved verbatim -- the same"," shape lmbee's collector parses. raw_responses carries"," source, HTTP status and original response text"," (credentials redacted). Unknown future"," fields pass through.","",' Prints a "querying ..." note on stderr before the readers run.'].join(`
3055
- `),O$=new Set(["agy_not_found","credentials_missing"]),L$=qm;b9={five_hour:5*36e5,daily:864e5,weekly:7*864e5,monthly:30*864e5}});he();Kn();import{execFile as x9}from"node:child_process";import{pathToFileURL as R9}from"node:url";import{promisify as L9}from"node:util";import{execFileSync as yW}from"node:child_process";import{readFileSync as wW}from"node:fs";import{join as EW}from"node:path";import{fileURLToPath as TW}from"node:url";function zb(){return TW(new URL("../..",import.meta.url))}function ah(t=zb()){try{let e=JSON.parse(wW(EW(t,"package.json"),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}function Ha(t,e){try{return yW("git",e,{cwd:t,stdio:["ignore","pipe","ignore"],timeout:2e3}).toString().trim()}catch{return}}function Ba(t=zb()){let e=ah(t);if(Ha(t,["rev-parse","--is-inside-work-tree"])!=="true"||Ha(t,["ls-files","--error-unmatch","--","package.json"])===void 0)return e;let n=Ha(t,["rev-parse","--short","HEAD"]);if(n===void 0)return e;let r=Ha(t,["describe","--tags","--exact-match","HEAD"]),s=Ha(t,["status","--porcelain"]),o=s!==void 0&&s.length>0;return r===`v${e}`&&!o?e:`${e}+${n}${o?".dirty":""}`}Ee();import{mkdirSync as nH,readFileSync as rH,renameSync as sH,writeFileSync as oH}from"node:fs";import{homedir as iH}from"node:os";import{dirname as aH,join as lH}from"node:path";function aI(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function eH(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function tH(t,e){return!eH(t)||aI(t)?null:`${e} must use https://: ${t}`}async function lI(t,e){let n=tH(t,e.description);if(n!==null||!aI(t))throw new Error(n??`${e.description} must use https://: ${t}`);let r=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),r);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw iI(t,e.description,r,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw iI(t,e.description,r,a)}}finally{clearTimeout(o)}}function iI(t,e,n,r){let o=r instanceof Error&&r.name==="AbortError"?`timed out after ${n}ms`:r instanceof Error?r.message:String(r);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var cH="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",dH=60*60*1e3,uH=1500;function fH(){let t=process.env.HOME??iH();return lH(t,".lmctl",".update-check.json")}function mH(t){return t.isTTY===!0}function pH(t,e){let n=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},r=n(t),s=n(e);if(r===null||s===null)return 0;for(let o=0;o<3;o+=1){if(r[o]>s[o])return 1;if(r[o]<s[o])return-1}return 0}function fh(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!mH(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function hH(t,e){try{let n=JSON.parse(rH(t,"utf8"));if(typeof n.checkedAt=="number"&&Number.isFinite(n.checkedAt)&&typeof n.latest=="string"&&e-n.checkedAt<dH)return n.latest}catch{}return null}function _H(t,e){nH(aH(t),{recursive:!0});let n=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;oH(n,`${JSON.stringify(e)}
3053
+ `),0)}var wt,C$,O$,L$,S9,M$=C(()=>{"use strict";Ee();wt=pn(rn(),1);he();R$();C$=["usage: lmctl ratelimit [provider ...] [--json] [--debug] [--timeout <seconds>]",""," Queries provider subscription rate limits in REAL TIME via the TypeScript"," provider readers -- stateless: nothing is read from or written to any"," database.",""," Providers: all (default), codex, agy, claude, kimi, ollama-cloud. Multiple allowed.",""," ollama-cloud is included in all only when OLLAMA_API_KEY is set."," It reads Ollama Cloud (not local Ollama); one GET, no automatic retries.",""," --debug Print raw quota responses to stderr before parsing."," Credentials are redacted; JSON stdout stays clean."," --timeout <seconds> Per-provider reader timeout (default 15).",' --json Emit {"readings": [...]} in the lmratelimit-v1 schema'," with every raw field preserved verbatim -- the same"," shape lmbee's collector parses. raw_responses carries"," source, HTTP status and original response text"," (credentials redacted). Unknown future"," fields pass through.","",' Prints a "querying ..." note on stderr before the readers run.'].join(`
3054
+ `),O$=new Set(["agy_not_found","credentials_missing"]),L$=qm;S9={five_hour:5*36e5,daily:864e5,weekly:7*864e5,monthly:30*864e5}});he();Kn();import{execFile as N9}from"node:child_process";import{pathToFileURL as x9}from"node:url";import{promisify as R9}from"node:util";import{execFileSync as yW}from"node:child_process";import{readFileSync as wW}from"node:fs";import{join as EW}from"node:path";import{fileURLToPath as TW}from"node:url";function zb(){return TW(new URL("../..",import.meta.url))}function ah(t=zb()){try{let e=JSON.parse(wW(EW(t,"package.json"),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}function Ha(t,e){try{return yW("git",e,{cwd:t,stdio:["ignore","pipe","ignore"],timeout:2e3}).toString().trim()}catch{return}}function Ba(t=zb()){let e=ah(t);if(Ha(t,["rev-parse","--is-inside-work-tree"])!=="true"||Ha(t,["ls-files","--error-unmatch","--","package.json"])===void 0)return e;let n=Ha(t,["rev-parse","--short","HEAD"]);if(n===void 0)return e;let r=Ha(t,["describe","--tags","--exact-match","HEAD"]),s=Ha(t,["status","--porcelain"]),o=s!==void 0&&s.length>0;return r===`v${e}`&&!o?e:`${e}+${n}${o?".dirty":""}`}Ee();import{mkdirSync as nH,readFileSync as rH,renameSync as sH,writeFileSync as oH}from"node:fs";import{homedir as iH}from"node:os";import{dirname as aH,join as lH}from"node:path";function aI(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function eH(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function tH(t,e){return!eH(t)||aI(t)?null:`${e} must use https://: ${t}`}async function lI(t,e){let n=tH(t,e.description);if(n!==null||!aI(t))throw new Error(n??`${e.description} must use https://: ${t}`);let r=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),r);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw iI(t,e.description,r,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw iI(t,e.description,r,a)}}finally{clearTimeout(o)}}function iI(t,e,n,r){let o=r instanceof Error&&r.name==="AbortError"?`timed out after ${n}ms`:r instanceof Error?r.message:String(r);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var cH="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",dH=60*60*1e3,uH=1500;function fH(){let t=process.env.HOME??iH();return lH(t,".lmctl",".update-check.json")}function mH(t){return t.isTTY===!0}function pH(t,e){let n=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},r=n(t),s=n(e);if(r===null||s===null)return 0;for(let o=0;o<3;o+=1){if(r[o]>s[o])return 1;if(r[o]<s[o])return-1}return 0}function fh(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!mH(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function hH(t,e){try{let n=JSON.parse(rH(t,"utf8"));if(typeof n.checkedAt=="number"&&Number.isFinite(n.checkedAt)&&typeof n.latest=="string"&&e-n.checkedAt<dH)return n.latest}catch{}return null}function _H(t,e){nH(aH(t),{recursive:!0});let n=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;oH(n,`${JSON.stringify(e)}
3056
3055
  `,"utf8"),sH(n,t)}async function gH(){let t=await lI(cH,{description:"lmctl npm metadata",timeoutMs:uH}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function cI(t,e=[],n={}){try{if(fh(e,t)||(n.displayVersion?.()??Ba()).includes("+"))return;let r=n.now?.()??Date.now(),s=n.cachePath??fH();if(hH(s,r)!==null)return;let i=await(n.fetchLatest??gH)();try{_H(s,{checkedAt:r,latest:i})}catch{return}let a=n.currentVersion?.()??ah();pH(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
3057
3056
  `)}catch{}}pd();var ua=`usage: lmctl [--db PATH] [--debug] [--non-interactive] <command|target> [args]
3058
- `,C9=L9(x9);async function O9(t,e,n){try{let r=await C9(t,e,{cwd:n.cwd,env:{...process.env,...n.env},maxBuffer:16777216});return r.stdout&&n.stdout.write(r.stdout),r.stderr&&n.stderr.write(r.stderr),0}catch(r){let s=r;return s.stdout&&n.stdout.write(s.stdout),s.stderr&&n.stderr.write(s.stderr),typeof s.code=="number"?s.code:(n.stderr.write(`error: ${t} is a separate command; install its package and run it directly (${s.message})
3057
+ `,L9=R9(N9);async function C9(t,e,n){try{let r=await L9(t,e,{cwd:n.cwd,env:{...process.env,...n.env},maxBuffer:16777216});return r.stdout&&n.stdout.write(r.stdout),r.stderr&&n.stderr.write(r.stderr),0}catch(r){let s=r;return s.stdout&&n.stdout.write(s.stdout),s.stderr&&n.stderr.write(s.stderr),typeof s.code=="number"?s.code:(n.stderr.write(`error: ${t} is a separate command; install its package and run it directly (${s.message})
3059
3058
  `),127)}}var NT=`${ua}
3060
3059
  Missing information is requested interactively. --non-interactive disables questions.
3061
3060
  --json also implies non-interactive mode. --debug works before or after the command.
@@ -3130,7 +3129,7 @@ Global flags:
3130
3129
  ratelimit also prints raw quota responses to stderr.
3131
3130
 
3132
3131
  Run 'lmctl help <command>' for command-specific help.
3133
- `,$$=new Set(["init","autorun","quickrun","hello","prompt","chat","batch","script","mcp","terminal","tail","export","cost","usage","ls","lint","seed","plan","status","running","site","ratelimit","models","prices","db","attention","in-flight","stalled","history","teams","state","cron","queue","whoami","sites","fleet","serve","reliability-report"]),D9=new Set(["send","recv","loop","notify_me","exec","check","push","wait","queue","enqueue","workflow","run","project","intake","monitor","code","workspace","recover","refresh","hire","clone","team","health","session","session-index","restore","restore-teamfile","diagnose","diagnose-prompt","api","device","mail","model"]);function Mc(t,e){return t.stderr.write(`error: ${e}
3132
+ `,$$=new Set(["init","autorun","quickrun","hello","prompt","chat","batch","script","mcp","terminal","tail","export","cost","usage","ls","lint","seed","plan","status","running","site","ratelimit","models","prices","db","attention","in-flight","stalled","history","teams","state","cron","queue","whoami","sites","fleet","serve","reliability-report"]),O9=new Set(["send","recv","loop","notify_me","exec","check","push","wait","queue","enqueue","workflow","run","project","intake","monitor","code","workspace","recover","refresh","hire","clone","team","health","session","session-index","restore","restore-teamfile","diagnose","diagnose-prompt","api","device","mail","model"]);function Mc(t,e){return t.stderr.write(`error: ${e}
3134
3133
  ${ua}Run 'lmctl help' for usage.
3135
3134
  `),2}function U$(t,e){return e==="queue"||e==="enqueue"?(t.stderr.write(`error: the former lmbee prompt queue is not available in lmctl. Use lmctl prompt for an agent prompt, lmctl cron for scheduled or detached jobs, mailbox remote execution for cross-site work, or lmchat for messages.
3136
3135
  `),1):e==="send"?(t.stderr.write(`error: unknown command: send (use lmctl prompt)
@@ -3141,12 +3140,12 @@ ${ua}Run 'lmctl help' for usage.
3141
3140
  ${ua}Run 'lmctl help' for usage.
3142
3141
  `),1):(t.stderr.write(`error: unknown command: ${e}
3143
3142
  ${ua}Run 'lmctl help' for usage.
3144
- `),1)}async function M9(t,e={stdout:process.stdout,stderr:process.stderr}){let n=sI();try{return await $9(t,e)}finally{oI(n)}}async function $9(t,e={stdout:process.stdout,stderr:process.stderr}){let n=[],r,s=!1,o=0;for(;o<t.length;o+=1){let m=t[o];if(m==="--db"){let p=t[++o];if(p===void 0||p.startsWith("--"))return Mc(e,"missing value for --db");r=p;continue}if(m==="--non-interactive"){s=!0;continue}if(m==="--debug"){uh();continue}if(m==="--allow-schema-skew"){process.env.LMCTL_ALLOW_SCHEMA_SKEW="1";continue}break}n.push(...t.slice(o));let i=n[0]??"",a=i==="script"||i==="quickrun"||i==="autorun";if(!/\.lms$/i.test(i))for(let m=1;m<n.length;m+=1){let p=n[m];if(p==="--")break;if(p==="--debug")uh(),n.splice(m--,1);else{if(a&&(!p.startsWith("-")||p==="-"||p==="-e"))break;(a&&(p==="--role-provider"||p==="--role-model")||p==="-p"||p==="--prompt-file")&&(m+=1)}}let l=new Set(["status","running","models","prices","ratelimit","prompt","chat","batch","terminal","tail","export","cost","usage","ls","plan","lint","db"]);r!==void 0&&(process.env.LMCTL_DB=r),Ga()&&(e={...e,env:{...e.env??process.env,LMCTL_DEBUG:"1",...r===void 0?{}:{LMCTL_DB:r}}}),(s||l.has(n[0]??"")&&n.slice(1).includes("--json"))&&(e=Sd(r===void 0?e:{...e,env:{...e.env??process.env,LMCTL_DB:r}}));let c=n[0];if(c==="--version"||c==="-v"||c==="-V")return e.stdout.write(`lmctl ${Ba()}
3145
- `),0;if(c==="--help"||c==="-h"||c===void 0)return e.stdout.write(NT),0;if(c==="help"){let[m,...p]=n.slice(1);return m===void 0||m==="--help"||m==="-h"?(e.stdout.write(NT),0):$$.has(m)?P$(m,[...p,"--help"],e):U$(e,m)}ih(mt(),e.stderr);let[d,...u]=n;if(d===void 0)return e.stdout.write(NT),0;let f=Date.now();xT(d,u,{phase:"start",started_at:new Date(f).toISOString()});try{let m=await P$(d,u,e);return xT(d,u,{phase:"finish",outcome:m===0?"ok":"error",exit_code:m,duration_ms:Date.now()-f}),$$.has(d)&&!fh(n,e)&&await cI(e,n),m}catch(m){let p=m instanceof Error?m:new Error(String(m));return xT(d,u,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-f,error_class:p.name,error_message:p.message,error_stack:p.stack??null,causes:U9(p)}),P9(m,d,u,e)}}function xT(t,e,n){Et({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:mt(),lmctl_version:Ba(),node_version:process.version,...n})}function P9(t,e,n,r){let s=t instanceof Error?t:new Error(String(t));return s instanceof On&&n.includes("--json")?(r.stdout.write(`${JSON.stringify({error:s.message,schema_skew:{db_version:s.dbVersion,build_version:s.buildVersion,mode:"refused"}},null,2)}
3143
+ `),1)}async function D9(t,e={stdout:process.stdout,stderr:process.stderr}){let n=sI();try{return await M9(t,e)}finally{oI(n)}}async function M9(t,e={stdout:process.stdout,stderr:process.stderr}){let n=[],r,s=!1,o=0;for(;o<t.length;o+=1){let m=t[o];if(m==="--db"){let p=t[++o];if(p===void 0||p.startsWith("--"))return Mc(e,"missing value for --db");r=p;continue}if(m==="--non-interactive"){s=!0;continue}if(m==="--debug"){uh();continue}if(m==="--allow-schema-skew"){process.env.LMCTL_ALLOW_SCHEMA_SKEW="1";continue}break}n.push(...t.slice(o));let i=n[0]??"",a=i==="script"||i==="quickrun"||i==="autorun";if(!/\.lms$/i.test(i))for(let m=1;m<n.length;m+=1){let p=n[m];if(p==="--")break;if(p==="--debug")uh(),n.splice(m--,1);else{if(a&&(!p.startsWith("-")||p==="-"||p==="-e"))break;(a&&(p==="--role-provider"||p==="--role-model")||p==="-p"||p==="--prompt-file")&&(m+=1)}}let l=new Set(["status","running","models","prices","ratelimit","prompt","chat","batch","terminal","tail","export","cost","usage","ls","plan","lint","db"]);r!==void 0&&(process.env.LMCTL_DB=r),Ga()&&(e={...e,env:{...e.env??process.env,LMCTL_DEBUG:"1",...r===void 0?{}:{LMCTL_DB:r}}}),(s||l.has(n[0]??"")&&n.slice(1).includes("--json"))&&(e=Sd(r===void 0?e:{...e,env:{...e.env??process.env,LMCTL_DB:r}}));let c=n[0];if(c==="--version"||c==="-v"||c==="-V")return e.stdout.write(`lmctl ${Ba()}
3144
+ `),0;if(c==="--help"||c==="-h"||c===void 0)return e.stdout.write(NT),0;if(c==="help"){let[m,...p]=n.slice(1);return m===void 0||m==="--help"||m==="-h"?(e.stdout.write(NT),0):$$.has(m)?P$(m,[...p,"--help"],e):U$(e,m)}ih(mt(),e.stderr);let[d,...u]=n;if(d===void 0)return e.stdout.write(NT),0;let f=Date.now();xT(d,u,{phase:"start",started_at:new Date(f).toISOString()});try{let m=await P$(d,u,e);return xT(d,u,{phase:"finish",outcome:m===0?"ok":"error",exit_code:m,duration_ms:Date.now()-f}),$$.has(d)&&!fh(n,e)&&await cI(e,n),m}catch(m){let p=m instanceof Error?m:new Error(String(m));return xT(d,u,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-f,error_class:p.name,error_message:p.message,error_stack:p.stack??null,causes:P9(p)}),$9(m,d,u,e)}}function xT(t,e,n){Et({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:mt(),lmctl_version:Ba(),node_version:process.version,...n})}function $9(t,e,n,r){let s=t instanceof Error?t:new Error(String(t));return s instanceof On&&n.includes("--json")?(r.stdout.write(`${JSON.stringify({error:s.message,schema_skew:{db_version:s.dbVersion,build_version:s.buildVersion,mode:"refused"}},null,2)}
3146
3145
  `),1):(r.stderr.write(`error: ${s.message}
3147
3146
  `),s instanceof On?1:Ga()?(r.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
3148
3147
  `),1):(r.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
3149
- `),1))}function U9(t){let e=[],n=t.cause,r=0;for(;n!=null&&r<8;){let s=n instanceof Error?n:new Error(String(n));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),n=s.cause,r+=1}return e}async function P$(t,e,n){switch(t){case"batch":{let{runBatch:r}=await Promise.resolve().then(()=>(aw(),bR));return r(e,n)}case"serve":{let{runServeCommand:r}=await Promise.resolve().then(()=>(EC(),wC));return r(e,n)}case"sites":{let{runSite:r}=await Promise.resolve().then(()=>(Gi(),sc)),[s,...o]=e;return s!==void 0&&s!=="list"?Mc(n,"use lmctl site list for the authenticated site directory"):r(["list",...o],n)}case"fleet":{let{runSite:r}=await Promise.resolve().then(()=>(Gi(),sc)),[s,...o]=e;return s!==void 0&&!["status","roster","agents","list"].includes(s)?Mc(n,"use lmctl site list for the authenticated site directory"):r(["list",...o],n)}case"cron":{let{runCronCommand:r}=await Promise.resolve().then(()=>(UC(),PC));return r(e,n)}case"lmmail":case"lmchat":case"lmnote":case"lmsheet":case"lmtext":case"lmsound":return O9(t,e,n);case"whoami":{if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return n.stdout.write(`usage: lmctl whoami [--json]
3148
+ `),1))}function P9(t){let e=[],n=t.cause,r=0;for(;n!=null&&r<8;){let s=n instanceof Error?n:new Error(String(n));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),n=s.cause,r+=1}return e}async function P$(t,e,n){switch(t){case"batch":{let{runBatch:r}=await Promise.resolve().then(()=>(aw(),bR));return r(e,n)}case"serve":{let{runServeCommand:r}=await Promise.resolve().then(()=>(EC(),wC));return r(e,n)}case"sites":{let{runSite:r}=await Promise.resolve().then(()=>(Gi(),sc)),[s,...o]=e;return s!==void 0&&s!=="list"?Mc(n,"use lmctl site list for the authenticated site directory"):r(["list",...o],n)}case"fleet":{let{runSite:r}=await Promise.resolve().then(()=>(Gi(),sc)),[s,...o]=e;return s!==void 0&&!["status","roster","agents","list"].includes(s)?Mc(n,"use lmctl site list for the authenticated site directory"):r(["list",...o],n)}case"cron":{let{runCronCommand:r}=await Promise.resolve().then(()=>(UC(),PC));return r(e,n)}case"lmmail":case"lmchat":case"lmnote":case"lmsheet":case"lmtext":case"lmsound":return C9(t,e,n);case"whoami":{if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return n.stdout.write(`usage: lmctl whoami [--json]
3150
3149
  Show the configured lmctl account identity.
3151
3150
  `),0;let{whoamiCommand:r}=await Promise.resolve().then(()=>(oO(),sO)),s=await r({env:{...process.env,...n.env},json:e.includes("--json"),interactive:!1});return s.output.length>0&&n.stdout.write(`${s.output}
3152
3151
  `),s.exitCode}case"in-flight":{let{runRunning:r}=await Promise.resolve().then(()=>($E(),ME));return r(["--state","running","--json"],n)}case"stalled":return n.stderr.write(`error: stalled is retired with automatic nudging; use lmctl running --state running|error for session status.
@@ -3154,15 +3153,15 @@ Show the configured lmctl account identity.
3154
3153
  `),1;case"history":case"teams":return(await Promise.resolve().then(()=>(UE(),PE))).runFoldedView(t,e,n);case"state":return["list","get","active"].includes(e[0]??"")?(await Promise.resolve().then(()=>(UE(),PE))).runFoldedView(t,e,n):(n.stderr.write(`error: only lmctl state list|get|active are available; saved state mutation was part of the retired lmbee command set
3155
3154
  `),1);case"source":return n.stderr.write(`error: source mutation is not available in lmctl; edit the registered team source configuration directly
3156
3155
  `),1;case"reliability-report":return Mc(n,"reliability-report is unavailable because the current lmbee CLI opens its database writable");case"script":{let{runScript:r}=await Promise.resolve().then(()=>(Vy(),oR));return r(e,n)}case"prompt":{let{runChat:r}=await Promise.resolve().then(()=>(Af(),Xy)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(Nm(),Am));return s(n,"prompt",e,o=>r(o,n))}case"chat":{process.stderr.write(`warning: 'lmctl chat' is being phased out -- use 'lmctl prompt' (same behaviour; a prompt is answered, it is not a conversation)
3157
- `);let{runChat:r}=await Promise.resolve().then(()=>(Af(),Xy));return r(e,n)}case"mcp":{let{runMcp:r}=await Promise.resolve().then(()=>(mD(),fD));return r(e,n)}case"tail":{let{runTail:r}=await Promise.resolve().then(()=>(OD(),CD));return r(e,n)}case"export":{let{runExport:r}=await Promise.resolve().then(()=>(PD(),$D));return r(e,n)}case"usage":{let{runUsage:r}=await Promise.resolve().then(()=>(qD(),XD));return r(e,n)}case"cost":{let{runCost:r}=await Promise.resolve().then(()=>(zD(),KD));return r(e,n)}case"ls":{let{runLs:r}=await Promise.resolve().then(()=>(tM(),eM));return r(e,n)}case"lint":{let{runLint:r}=await Promise.resolve().then(()=>($r(),Oy));return r(e,n)}case"seed":{let{runSeed:r}=await Promise.resolve().then(()=>($r(),Oy)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(Nm(),Am));return s(n,"seed",e,o=>r(o,n))}case"plan":{let{runPlan:r}=await Promise.resolve().then(()=>(km(),rD)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(Nm(),Am));return s(n,"plan",e,o=>r(o,n),{ownsForce:!0,extension:".txt"})}case"init":{let{runInit:r}=await Promise.resolve().then(()=>(iM(),oM));return r(e,n)}case"autorun":{let{runAutorun:r}=await Promise.resolve().then(()=>($m(),uT));return r(e,n)}case"quickrun":{let{QUICKRUN_DEPRECATION:r,runQuickrun:s}=await Promise.resolve().then(()=>($m(),uT));return n.stderr.write(r),s(e,n)}case"hello":{let{runHello:r}=await Promise.resolve().then(()=>(RM(),xM));return r(e,n)}case"terminal":{let{runTerminal:r}=await Promise.resolve().then(()=>(nT(),wM));return r(e,n)}case"status":{let{runStatus:r}=await Promise.resolve().then(()=>(RE(),WO));return r(e,n)}case"running":{let{runRunning:r}=await Promise.resolve().then(()=>($E(),ME));return r(e,n)}case"site":{let{runSite:r}=await Promise.resolve().then(()=>(Gi(),sc));return r(e,n)}case"models":{let{runModels:r}=await Promise.resolve().then(()=>(Dl(),ZN));return r(e,n)}case"prices":{let{runPrices:r}=await Promise.resolve().then(()=>(DM(),OM));return r(e,n)}case"ratelimit":{let{runRatelimit:r}=await Promise.resolve().then(()=>(M$(),D$));return r(e,n)}case"db":return F9(e,n);default:if(t==="model")return Mc(n,"command 'model' is retired; use 'models'");if(!D9.has(t)){let{runInferred:r}=await Promise.resolve().then(()=>(ow(),sw)),s=await r([t,...e],n);if(s!==null)return s}return U$(n,t)}}async function F9(t,e){let[n,...r]=t;return n==="--help"||n==="-h"||n==="help"?(e.stdout.write(`usage: lmctl db <subcommand>
3156
+ `);let{runChat:r}=await Promise.resolve().then(()=>(Af(),Xy));return r(e,n)}case"mcp":{let{runMcp:r}=await Promise.resolve().then(()=>(mD(),fD));return r(e,n)}case"tail":{let{runTail:r}=await Promise.resolve().then(()=>(OD(),CD));return r(e,n)}case"export":{let{runExport:r}=await Promise.resolve().then(()=>(PD(),$D));return r(e,n)}case"usage":{let{runUsage:r}=await Promise.resolve().then(()=>(qD(),XD));return r(e,n)}case"cost":{let{runCost:r}=await Promise.resolve().then(()=>(zD(),KD));return r(e,n)}case"ls":{let{runLs:r}=await Promise.resolve().then(()=>(tM(),eM));return r(e,n)}case"lint":{let{runLint:r}=await Promise.resolve().then(()=>($r(),Oy));return r(e,n)}case"seed":{let{runSeed:r}=await Promise.resolve().then(()=>($r(),Oy)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(Nm(),Am));return s(n,"seed",e,o=>r(o,n))}case"plan":{let{runPlan:r}=await Promise.resolve().then(()=>(km(),rD)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(Nm(),Am));return s(n,"plan",e,o=>r(o,n),{ownsForce:!0,extension:".txt"})}case"init":{let{runInit:r}=await Promise.resolve().then(()=>(iM(),oM));return r(e,n)}case"autorun":{let{runAutorun:r}=await Promise.resolve().then(()=>($m(),uT));return r(e,n)}case"quickrun":{let{QUICKRUN_DEPRECATION:r,runQuickrun:s}=await Promise.resolve().then(()=>($m(),uT));return n.stderr.write(r),s(e,n)}case"hello":{let{runHello:r}=await Promise.resolve().then(()=>(RM(),xM));return r(e,n)}case"terminal":{let{runTerminal:r}=await Promise.resolve().then(()=>(nT(),wM));return r(e,n)}case"status":{let{runStatus:r}=await Promise.resolve().then(()=>(RE(),WO));return r(e,n)}case"running":{let{runRunning:r}=await Promise.resolve().then(()=>($E(),ME));return r(e,n)}case"site":{let{runSite:r}=await Promise.resolve().then(()=>(Gi(),sc));return r(e,n)}case"models":{let{runModels:r}=await Promise.resolve().then(()=>(Dl(),ZN));return r(e,n)}case"prices":{let{runPrices:r}=await Promise.resolve().then(()=>(DM(),OM));return r(e,n)}case"ratelimit":{let{runRatelimit:r}=await Promise.resolve().then(()=>(M$(),D$));return r(e,n)}case"db":return U9(e,n);default:if(t==="model")return Mc(n,"command 'model' is retired; use 'models'");if(!O9.has(t)){let{runInferred:r}=await Promise.resolve().then(()=>(ow(),sw)),s=await r([t,...e],n);if(s!==null)return s}return U$(n,t)}}async function U9(t,e){let[n,...r]=t;return n==="--help"||n==="-h"||n==="help"?(e.stdout.write(`usage: lmctl db <subcommand>
3158
3157
 
3159
3158
  backfill-events Replay the legacy tables into the event-log
3160
3159
  (with --db <copy>) substrate and rebuild projections. Idempotent;
3161
3160
  run against a COPY of the DB, never the live file.
3162
- `),0):n==="backfill-events"?j9(r,e):(e.stderr.write(`usage: lmctl db <subcommand> (backfill-events)
3163
- `),1)}async function j9(t,e){let{resolveDbPath:n}=await Promise.resolve().then(()=>(Kn(),qb)),r=n();if(!((process.env.LMCTL_DB??"").length>0)&&!t.includes("--allow-live"))return e.stderr.write(`refusing to backfill the default live DB.
3161
+ `),0):n==="backfill-events"?F9(r,e):(e.stderr.write(`usage: lmctl db <subcommand> (backfill-events)
3162
+ `),1)}async function F9(t,e){let{resolveDbPath:n}=await Promise.resolve().then(()=>(Kn(),qb)),r=n();if(!((process.env.LMCTL_DB??"").length>0)&&!t.includes("--allow-live"))return e.stderr.write(`refusing to backfill the default live DB.
3164
3163
  resolved target: ${r}
3165
3164
  run against a COPY: cp <state.db> copy.db && lmctl --db copy.db db backfill-events
3166
3165
  (or pass --allow-live to target the resolved DB deliberately).
3167
3166
  `),1;let{migrate:o}=await Promise.resolve().then(()=>(pd(),VS)),{backfillEventLog:i}=await Promise.resolve().then(()=>(qp(),jS)),a=o({dbPath:r});try{let l=i(a);return e.stdout.write(`${JSON.stringify(l,null,2)}
3168
- `),0}finally{a.close()}}if(process.argv[1]!==void 0&&import.meta.url===R9(process.argv[1]).href){let t=await M9(process.argv.slice(2));process.exitCode=t}export{$$ as COMMANDS,M9 as runCli};
3167
+ `),0}finally{a.close()}}if(process.argv[1]!==void 0&&import.meta.url===x9(process.argv[1]).href){let t=await D9(process.argv.slice(2));process.exitCode=t}export{$$ as COMMANDS,D9 as runCli};