@lmctl-ai/lmctl 0.2.353 → 0.2.355

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lmbee.js CHANGED
@@ -2012,7 +2012,7 @@ ${nt(m,{provider:"dsh"})}`:"(no output captured)")))},yN);s.stdout?.on("data",m=
2012
2012
  LIMIT ?`).all(bN,this.discoverLimit),r=[];for(let s of n){let o=this.previewTexts(t,s.id);r.push({provider:this.name,sessionId:s.id,slug:un(s.title),cwd:IN(s),createdAt:Kc(s.started_at),modifiedAt:Kc(s.last_activity_at??s.started_at),model:un(s.model),startCommand:this.name,firstUserMessage:o.first,lastUserMessage:o.last,messageCount:s.message_count??0,filePath:this.dbPath,...kN(s)})}return r}catch(n){return ne({event:"hermes_discover_sessions_failed",provider:this.name,db_path:this.dbPath,error_message:n instanceof Error?n.message:String(n)}),[]}finally{t.close()}}activeMessageRows(t,n){let r=new Set(t.prepare("PRAGMA table_info(messages)").all().map(a=>a.name)),o=`id, session_id, role, content, tool_call_id, tool_calls, tool_name,
2013
2013
  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 t.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 t.prepare(`SELECT ${o} FROM messages ${i} ORDER BY id ASC`).all(n)}}previewTexts(t,n){try{let[r,s]=["ASC","DESC"].map(o=>{let i=`SELECT content FROM messages WHERE session_id = ?
2014
2014
  AND role = 'user' AND content != ''`,a;try{a=t.prepare(`${i} AND active = 1 ORDER BY id ${o} LIMIT 1`).get(n)}catch(c){if(!/no such column: active/i.test(String(c)))throw c;a=t.prepare(`${i} ORDER BY id ${o} LIMIT 1`).get(n)}return a?de(a.content,80):void 0});return{first:r,last:s}}catch{return{}}}async loadSession(t){let n=this.openDb();if(!n)return null;try{let r=this.selectSessionRow(n,t);if(!r)return null;let s=this.activeMessageRows(n,t),o=[],i=[],a,c;for(let l of s){let d=Kc(l.timestamp),u=l.content??"";if(l.role==="user"){u&&l._compressed_summary!==1&&l.display_kind!=="hidden"&&i.push(u),u.length>0&&(a||(a=de(u,80)),c=de(u,80)),o.push({role:"user",timestamp:d,content:u||"(empty)"});continue}if(l.role==="tool"){o.push({role:"tool_result",timestamp:d,content:u,toolCallId:un(l.tool_call_id),toolName:un(l.tool_name)});continue}u.length>0&&o.push({role:"assistant",timestamp:d,content:u,model:un(r.model),stopReason:un(l.finish_reason)});for(let f of Iz(l.tool_calls)){let m=kz(f.function?.arguments);o.push({role:"tool_use",timestamp:d,content:un(f.function?.name)??"tool_call",toolName:un(f.function?.name),toolCallId:un(f.call_id)??un(f.id),toolInput:typeof f.function?.arguments=="string"?f.function.arguments:JSON.stringify(f.function?.arguments??{}),toolInputData:Dn(m)})}}return{provider:this.name,sessionId:r.id,slug:un(r.title),cwd:IN(r),createdAt:Kc(r.started_at),modifiedAt:Kc(r.last_activity_at??r.started_at),model:un(r.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:c,messageCount:r.message_count??o.length,filePath:this.dbPath,...kN(r),messages:o,userPrompts:i}}catch(r){return ne({event:"hermes_load_session_failed",provider:this.name,session_id:t,db_path:this.dbPath,error_message:r instanceof Error?r.message:String(r)}),null}finally{n.close()}}async resolveSessionPath(t){let n=this.openDb();if(!n)return null;try{return this.selectSessionRow(n,t)?this.dbPath:null}catch{return null}finally{n.close()}}async deleteSession(t){return!1}};function Iz(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function kz(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e;if(typeof e!="string")return{};try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function kN(e){let t=e.input_tokens??0,n=e.output_tokens??0,r=e.cache_read_tokens??0,s=e.cache_write_tokens??0,o=e.reasoning_tokens??0;return(e.message_count??0)>0&&t+n+r+s+o>0?{totalInputTokens:t,totalCachedInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:n,totalReasoningOutputTokens:o}:{}}var Nz=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function xz(e){return Nz.test(e)}var Lz="dont_ask";function NN(e){if(e==="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 Lz}function Xg(e){return new Gg(e)}var Gg=class extends Pe{hermesProvider;hermesHome;constructor(t){let n=new vf(t);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)=>Bn(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:NN(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=Bg(t)}async openSession(t){return wr({...t,env:{...t.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:NN(t.permissionMode)})}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(t,n){await Rz(t,{recursive:!0});let r=[];if(n?.effort){let o="hermes has no ACP-level effort surface";ne({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??be,{sessionId:"",cwd:t,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 xz(s.sessionId)?(r.push(...s.warnings??[]),{success:!0,sessionId:s.sessionId,usage:s.usage,...r.length>0?{warnings:r}:{}}):(ne({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 xN,rm as Cz,stat as Oz}from"node:fs/promises";import{join as Vg}from"node:path";var Sf=class{name="pi";baseDir;constructor(t={}){this.baseDir=t.piDir||Vg(ge,".pi","agent","sessions")}getWatchPaths(){return[{directory:this.baseDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[];for(let n of await this.listSessionFiles())try{let r=await this.extractSummary(n);r&&t.push(r)}catch{}return t}async listSessionFiles(){let t;try{t=await xN(this.baseDir)}catch{return[]}let n=[];for(let r of t){let s=Vg(this.baseDir,r);try{if(!(await Oz(s)).isDirectory())continue;for(let o of await xN(s))o.endsWith(".jsonl")&&n.push(Vg(s,o))}catch{}}return n}async readHeader(t){for await(let n of ze(t))return n.type==="session"?n:null;return null}async extractSummary(t){let n=await this.readHeader(t);if(!n)return null;let r=await dt(t),s,o,i,a=0,c=0,l=0,d=0,u=0,f=0,m=0,p;for await(let h of ze(t)){if(h.type==="model_change"&&h.provider&&h.modelId){s=`${h.provider}/${h.modelId}`;continue}if(h.type!=="message"||!h.message)continue;let _=h.message;if(_.provider&&_.model&&(s=`${_.provider}/${_.model}`),_.role==="user"){let g=Jg(_).trim();g&&(o||(o=de(g,80)),i=de(g,80)),a++}else if(_.role==="assistant"){a++;let g=_.usage;g&&(c+=g.input??0,l+=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:t,totalInputTokens:c,totalCachedInputTokens:l,totalCacheWriteInputTokens:d,totalOutputTokens:u,totalReasoningOutputTokens:f,lastInputTokens:m,lastTokenUsage:p}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=await this.extractSummary(n);if(!r)return null;let s=[],o=r.model;for await(let i of ze(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 c=a.timestamp?new Date(a.timestamp):r.modifiedAt;if(a.role==="user")s.push({role:"user",timestamp:c,content:Jg(a)});else if(a.role==="assistant"&&Array.isArray(a.content))for(let l of a.content)l.type==="text"&&l.text?s.push({role:"assistant",timestamp:c,content:l.text,model:o}):l.type==="thinking"&&l.thinking?s.push({role:"thinking",timestamp:c,content:l.thinking}):l.type==="toolCall"&&s.push({role:"tool_use",timestamp:c,content:LN(l.arguments),toolName:l.name??"tool",toolInput:LN(l.arguments),toolInputData:l.arguments,toolCallId:l.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:c,content:Jg(a),toolName:a.toolName,toolCallId:a.toolCallId})}return{...r,model:o,messages:s}}async resolveSessionPath(t){let n=`_${t}.jsonl`,r=[];for(let s of await this.listSessionFiles()){if(s.endsWith(n))return s;s.split("_").pop()?.replace(/\.jsonl$/,"")?.startsWith(t)&&r.push(s)}return r.length===1?r[0]:null}async deleteSession(t){let n=await this.resolveSessionPath(t);return n?(await Cz(n,{force:!0}),!0):!1}};function Jg(e){return typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(" "):""}function LN(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}function Kg(e){return new Yg(e)}var Yg=class extends Pe{constructor(t){super({provider:new Sf(t),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",be],resumeTemplate:"pi --session {{session_id}}",startTemplate:"pi",transport:Dz})}seedArgsFor(t){let n=[...super.seedArgsFor(t)];return t?.model&&n.push("--model",t.model),n}manualSeedHint(t){return{launchCommand:`cd ${t} && pi`,postLaunchNote:"Send the lmctl seed instruction, wait for the session file to write, then exit.",lsCommand:`lmctl ls --provider pi --sessiondir ${t}`}}},Dz=gf({label:"pi",buildArgs:(e,t)=>{let n=[...t.sessionId?["--session",t.sessionId]:[],"-p",e];return t.model&&n.push("--model",t.model),n},assertArgs:(e,t)=>St("pi",e,t.permissionMode??"yolo")});import{createHash as $z}from"node:crypto";import{existsSync as Mz,mkdirSync as Qg,readFileSync as Pz,renameSync as Uz,rmdirSync as FN,statSync as Fz,writeFileSync as jz}from"node:fs";import{dirname as nE,join as CN,resolve as zg}from"node:path";var na=new Map;function qz(e){return $z("sha256").update(e).digest("hex").slice(0,8)}function Hz(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function Wz(e,t){let n=t?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function jN(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function bf(e){return Math.max(1,Math.ceil(e.length/4))}function ra(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return zg(t);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?CN(nE(zg(n)),".lmctl-claude-mock","sessions.json"):CN(zg(e),".lmctl-claude-mock","sessions.json")}function ON(){return{schemaVersion:1,sessions:{}}}function zc(e){if(!Mz(e))return ON();try{let t=JSON.parse(Pz(e,"utf8")),n=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},r=typeof t.script=="object"&&t.script!==null?t.script:void 0,s=typeof t.scriptContains=="object"&&t.scriptContains!==null?t.scriptContains:void 0,o=Zg(t.defaultDelayMs);return{schemaVersion:1,sessions:n,...o!==void 0?{defaultDelayMs:o}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return ON()}}function qN(e,t){Qg(nE(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;jz(n,`${JSON.stringify(t,null,2)}
2015
- `,"utf8"),Uz(n,e)}var Bz=5e3,Gz=15,DN=1e4;function Xz(e){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}function Vz(e){let t=`${e}.lock`;Qg(nE(e),{recursive:!0});let n=Date.now()+DN;for(;;)try{return Qg(t),t}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-Fz(t).mtimeMs>Bz){try{FN(t)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${DN}ms: ${t}`);Xz(Gz)}}function Jz(e){try{FN(e)}catch{}}function HN(e,t){let n=Vz(e);try{return t()}finally{Jz(n)}}function Yz(e){return{...e,timestamp:e.timestamp.toISOString()}}function Kz(e){return{...e,timestamp:new Date(e.timestamp)}}function zz(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(Yz)}}function WN(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(Kz)}}function Af(e,t=process.cwd()){let n=na.get(e);if(n!==void 0)return n;let s=zc(ra(t)).sessions[e];if(s===void 0)return;let o=WN(s);return na.set(o.sessionId,o),o}function $N(e){na.set(e.sessionId,e);let t=ra(e.cwd);HN(t,()=>{let n=zc(t);n.sessions[e.sessionId]=zz({...e,filePath:t}),qN(t,n)})}function Qz(e,t=process.cwd()){let n=ra(t);return HN(n,()=>{let r=zc(n),s=r.sessions[e]!==void 0;return s&&(delete r.sessions[e],qN(n,r)),s})}function Zz(){let e=zc(ra()),t=Object.values(e.sessions).map(WN);for(let n of t)na.set(n.sessionId,n);return t}function Zg(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function MN(e){if(typeof e=="string")return{kind:"success",text:e};if(e!==void 0&&typeof e.text=="string"&&typeof e.error!="string"){let t=Zg(e.delayMs);return{kind:"success",text:e.text,...t!==void 0?{delayMs:t}:{}}}if(e!==void 0&&typeof e.error=="string"&&typeof e.text!="string"){let t=Zg(e.delayMs);return{kind:"error",error:e.error,...t!==void 0?{delayMs:t}:{}}}}async function PN(e){e!==void 0&&e>0&&await new Promise(t=>setTimeout(t,e))}function e4(e,t){let{script:n,scriptContains:r}=t;if(n!==void 0){let s=MN(n[e]??n[jN(e)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(e.includes(s)){let o=MN(r[s]);if(o!==void 0)return o}}}function UN(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}var eE=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let n of Zz())t.set(n.sessionId,n);for(let n of na.values())t.set(n.sessionId,n);return[...t.values()].map(UN)}async loadSession(t){let n=Af(t);return n===void 0?null:{...UN(n),messages:n.messages.slice()}}async resolveSessionPath(t){return Af(t)?.filePath??null}async deleteSession(t){let n=na.delete(t),r=Qz(t);return n||r}},tE=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new eE;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,n){try{n?.onDispatch?.()}catch{}let r=Hz(Wz(t,n)),s=`mock-${r}-${qz(`${t}:${r}`)}`,o=new Date,i=ra(t),a=Af(s,t),c=n?.prompt??"ClaudeMock seed",l=bf(c),d={sessionId:s,cwd:t,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:c}),d.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=l,d.totalOutputTokens+=bf("ACK: ClaudeMock seeded"),$N(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,n){let r=Date.now(),s=Af(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let o=new Date,i=zc(ra(n.cwd)),a=e4(t,i),c=a?.delayMs??i.defaultDelayMs;if(a?.kind==="error")throw await PN(c),new Error(a.error);let l=a?.kind==="success"?a.text:`ClaudeMock ack: ${jN(t)}`;return s.messages.push({role:"user",timestamp:o,content:t}),s.messages.push({role:"assistant",timestamp:o,content:l,model:n.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=bf(t),s.totalOutputTokens+=bf(l),$N(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await PN(c),{text:l,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}};function rE(){return new tE}function Gs(e){let t=[J_({museDataHome:e?.museDataHome}),ag({miniplayerHome:e?.miniplayerHome}),lg({claudeDir:e?.claudeDir}),mg({codexDir:e?.codexDir,codeDir:e?.codeDir}),gg({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),wg({copilotDir:e?.copilotDir}),vg({dbPaths:e?.opencodeDbPaths}),Ig({kimiHome:e?.kimiHome}),Rg({lmplayerDbPath:e?.lmplayerDbPath,lmplayerDbPaths:e?.lmplayerDbPaths}),xg({qwenDir:e?.qwenDir}),Og({agyDir:e?.agyDir}),Hg({dshHome:e?.dshHome}),Xg({hermesHome:e?.hermesHome}),Kg({piDir:e?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(rE()),t}var sE=null;function BN(){return sE===null&&(sE=Ps(Gs())),sE}function GN(e,t){xu(t);let n=e.getAdapter(t);if(!n)throw new Error(`provider "${t}" is not registered in this registry`);return n}async function XN(e){let t=e.registry??BN(),n=GN(t,e.provider),r={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,holdOpen:e.holdOpen,requireResume:e.requireResume,bundleSession:e.bundleSession},s=e.bundleSession===void 0?await O_(n,{...r,execution:"per-turn",requireResume:e.requireResume??!1}):void 0,o;try{o=s?await s.sendTurn(e.prompt,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal}):await n.sendTurn(e.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}:{}}}async function VN(e){return O_(GN(e.registry??BN(),e.provider),e)}import{join as Wt}from"node:path";var JN=new WeakMap;function Qc(e){let t=JN.get(e);if(t)return t;let n=e.env.HOME;if(!n)return Ps(Gs());let r=e.env.XDG_DATA_HOME||Wt(n,".local/share"),s=e.env.XDG_CONFIG_HOME||Wt(n,".config");return t=Ps(Gs({museDataHome:r,miniplayerHome:e.env.MINIPLAYER_HOME||Wt(r,"miniplayer"),claudeDir:Wt(n,".claude"),codexDir:Wt(n,".codex"),codeDir:Wt(n,".code"),geminiDir:Wt(n,".gemini"),copilotDir:Wt(n,".copilot"),qwenDir:Wt(n,".qwen"),opencodeDbPaths:[Wt(r,"opencode/opencode.db"),Wt(s,"opencode/opencode.db")],agyDir:Wt(n,".gemini/antigravity-cli"),dshHome:Wt(n,".dsh"),hermesHome:e.env.HERMES_HOME??Wt(n,".hermes"),kimiHome:e.env.KIMI_CODE_HOME??Wt(n,".kimi-code"),piDir:Wt(n,".pi/agent/sessions"),lmplayerDbPaths:rg(e.env,n)})),JN.set(e,t),t}var Vs=e=>{if(e&&typeof e=="object"){for(let t of Object.values(e))Vs(t);Object.freeze(e)}return e},NSe=Vs(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),xSe=Vs({status:"string",error:"string|null",code:"ErrorCode?"}),LSe=Vs(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),CSe=Vs(["Provider1.Provider","Provider1.Model1","Provider2.Provider","Provider2.Model1","Provider3.Provider","Provider3.Model1"]),OSe=Vs(["Provider1","Provider2","Provider3"]),DSe=Vs({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),De={name:"ctx",type:"context"},oE={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},Sr={name:"teamfile",type:"string"},If={name:"alias",type:"string"},Xs={name:"prompt",type:"string"},kf={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"}]},Nf=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],sa={name:"options",type:"map",optional:!0,keys:Nf},YN={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},KN={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},zN={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}]},Rf={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"}]},t4=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"}],QN={name:"options",type:"map",optional:!0,keys:t4},ZN={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},n4=Vs([{name:"resolveProfilePath",implemented:!0,params:[De,oE],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[De,oE],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:[De,{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:[De,Sr],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[Sr]}},{name:"resolveMember",implemented:!0,params:[De,Sr,If],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:[Sr,If]}},{name:"lintTeam",implemented:!0,params:[De,Sr],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:[Sr]}},{name:"seedTeam",implemented:!0,params:[De,Sr,YN],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:[Sr,YN]}},{name:"promptAgent",implemented:!0,params:[De,kf,Xs,sa],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...ZN,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[kf,Xs,sa]}},{name:"promptMember",implemented:!0,params:[De,{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"},...Nf]}],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:[Sr,If,Xs,{name:"options",type:"map",optional:!0,keys:[...Nf,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[De,{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:[De,oa,zN],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:[kf,{...zN,optional:!0}]}},{name:"getSession",implemented:!0,params:[De,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:[De,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:[De,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:[De,{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"},...Nf]}],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:[De,{name:"batch",type:"BatchRef"},Xs,{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:[De,{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:[De,KN],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:[KN]}},{name:"openTerminal",implemented:!0,params:[De,{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:[Sr,If]}},{name:"sessionAdmission",implemented:!0,params:[De,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:[De,{name:"reservation",type:"SessionReservation"},kf,Xs,sa],statuses:["ok","busy","stalled","empty","error"],results:{...ZN,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[De,{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:[De,{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:[De,{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"}]},sa],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:[De,{name:"session",type:"NativeSessionRef"},Xs],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:[De,{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:[De,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Critical synchronous native conversation lease release."},{name:"nativeSessionRequest",implemented:!0,params:[De,Rf,Xs,sa],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null",code:"ErrorCode?",outcome:"not_sent|completed|unknown?",service_epoch:"string|null?",connection_epoch:"number|null?",connection_state:"new|reused|reinitialized|null?"},effects:["provider","db","network"],summary:"Send a stateless native-id turn to a qualified conversation in the configured running lmbee service.",scriptBinding:{name:"lm_session_turn",params:[Rf,Xs,sa]}},{name:"nativeSessionClose",implemented:!0,params:[De,Rf],statuses:["ok","busy","error"],results:{error:"string|null",code:"ErrorCode?",outcome:"not_sent|completed|unknown?",service_epoch:"string|null?",connection_epoch:"number|null?",connection_state:"new|reused|reinitialized|null?"},effects:["provider","db","network"],summary:"Close an idle service-hosted native conversation; an absent entry is already closed.",scriptBinding:{name:"lm_session_close",params:[Rf]}},{name:"loadProperties",implemented:!0,params:[De,oE],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:[De,QN],statuses:["ok","error"],results:{error:"string|null",running:"RunningRow[]",dead:"DeadRow[]",idle:"IdleRow[]"},effects:["db"],summary:"DB-wide view of tracked invocation activity. Observation only; dispatch and branch on status busy, never gate on this.",scriptBinding:{name:"lm_running",params:[QN]}}]);function iE(e){if(!nk(e))return Be("invalid_argument","Expected a context created by createLmctlContext");if(e.closed)return Be("cancelled","Context is closed")}function ex(e,t){let n=r=>s=>{t?.(s,r),r==="stderr"&&s.startsWith("warning:")?e.onWarning(s):e.onProgress(s,r)};return{cwd:e.cwd,env:{...e.env,LMCTL_DB:e.dbPath},dal:e.dal,stdout:{write:n("stdout")},stderr:{write:n("stderr")}}}import{readFileSync as s4,writeFileSync as GSe,renameSync as XSe,existsSync as o4}from"node:fs";import{basename as i4,resolve as Lf,dirname as aE}from"node:path";var xf=["title","description","members"],r4=new Set(xf),br=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}};function tx(e){if(e.length===0||!e.startsWith("---"))throw new br("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
2015
+ `,"utf8"),Uz(n,e)}var Bz=5e3,Gz=15,DN=1e4;function Xz(e){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}function Vz(e){let t=`${e}.lock`;Qg(nE(e),{recursive:!0});let n=Date.now()+DN;for(;;)try{return Qg(t),t}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-Fz(t).mtimeMs>Bz){try{FN(t)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${DN}ms: ${t}`);Xz(Gz)}}function Jz(e){try{FN(e)}catch{}}function HN(e,t){let n=Vz(e);try{return t()}finally{Jz(n)}}function Yz(e){return{...e,timestamp:e.timestamp.toISOString()}}function Kz(e){return{...e,timestamp:new Date(e.timestamp)}}function zz(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(Yz)}}function WN(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(Kz)}}function Af(e,t=process.cwd()){let n=na.get(e);if(n!==void 0)return n;let s=zc(ra(t)).sessions[e];if(s===void 0)return;let o=WN(s);return na.set(o.sessionId,o),o}function $N(e){na.set(e.sessionId,e);let t=ra(e.cwd);HN(t,()=>{let n=zc(t);n.sessions[e.sessionId]=zz({...e,filePath:t}),qN(t,n)})}function Qz(e,t=process.cwd()){let n=ra(t);return HN(n,()=>{let r=zc(n),s=r.sessions[e]!==void 0;return s&&(delete r.sessions[e],qN(n,r)),s})}function Zz(){let e=zc(ra()),t=Object.values(e.sessions).map(WN);for(let n of t)na.set(n.sessionId,n);return t}function Zg(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function MN(e){if(typeof e=="string")return{kind:"success",text:e};if(e!==void 0&&typeof e.text=="string"&&typeof e.error!="string"){let t=Zg(e.delayMs);return{kind:"success",text:e.text,...t!==void 0?{delayMs:t}:{}}}if(e!==void 0&&typeof e.error=="string"&&typeof e.text!="string"){let t=Zg(e.delayMs);return{kind:"error",error:e.error,...t!==void 0?{delayMs:t}:{}}}}async function PN(e){e!==void 0&&e>0&&await new Promise(t=>setTimeout(t,e))}function e4(e,t){let{script:n,scriptContains:r}=t;if(n!==void 0){let s=MN(n[e]??n[jN(e)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(e.includes(s)){let o=MN(r[s]);if(o!==void 0)return o}}}function UN(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}var eE=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let n of Zz())t.set(n.sessionId,n);for(let n of na.values())t.set(n.sessionId,n);return[...t.values()].map(UN)}async loadSession(t){let n=Af(t);return n===void 0?null:{...UN(n),messages:n.messages.slice()}}async resolveSessionPath(t){return Af(t)?.filePath??null}async deleteSession(t){let n=na.delete(t),r=Qz(t);return n||r}},tE=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new eE;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,n){try{n?.onDispatch?.()}catch{}let r=Hz(Wz(t,n)),s=`mock-${r}-${qz(`${t}:${r}`)}`,o=new Date,i=ra(t),a=Af(s,t),c=n?.prompt??"ClaudeMock seed",l=bf(c),d={sessionId:s,cwd:t,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:c}),d.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=l,d.totalOutputTokens+=bf("ACK: ClaudeMock seeded"),$N(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,n){let r=Date.now(),s=Af(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let o=new Date,i=zc(ra(n.cwd)),a=e4(t,i),c=a?.delayMs??i.defaultDelayMs;if(a?.kind==="error")throw await PN(c),new Error(a.error);let l=a?.kind==="success"?a.text:`ClaudeMock ack: ${jN(t)}`;return s.messages.push({role:"user",timestamp:o,content:t}),s.messages.push({role:"assistant",timestamp:o,content:l,model:n.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=bf(t),s.totalOutputTokens+=bf(l),$N(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await PN(c),{text:l,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}};function rE(){return new tE}function Gs(e){let t=[J_({museDataHome:e?.museDataHome}),ag({miniplayerHome:e?.miniplayerHome}),lg({claudeDir:e?.claudeDir}),mg({codexDir:e?.codexDir,codeDir:e?.codeDir}),gg({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),wg({copilotDir:e?.copilotDir}),vg({dbPaths:e?.opencodeDbPaths}),Ig({kimiHome:e?.kimiHome}),Rg({lmplayerDbPath:e?.lmplayerDbPath,lmplayerDbPaths:e?.lmplayerDbPaths}),xg({qwenDir:e?.qwenDir}),Og({agyDir:e?.agyDir}),Hg({dshHome:e?.dshHome}),Xg({hermesHome:e?.hermesHome}),Kg({piDir:e?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(rE()),t}var sE=null;function BN(){return sE===null&&(sE=Ps(Gs())),sE}function GN(e,t){xu(t);let n=e.getAdapter(t);if(!n)throw new Error(`provider "${t}" is not registered in this registry`);return n}async function XN(e){let t=e.registry??BN(),n=GN(t,e.provider),r={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,holdOpen:e.holdOpen,requireResume:e.requireResume,bundleSession:e.bundleSession},s=e.bundleSession===void 0?await O_(n,{...r,execution:"per-turn",requireResume:e.requireResume??!1}):void 0,o;try{o=s?await s.sendTurn(e.prompt,{onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal}):await n.sendTurn(e.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}:{}}}async function VN(e){return O_(GN(e.registry??BN(),e.provider),e)}import{join as Wt}from"node:path";var JN=new WeakMap;function Qc(e){let t=JN.get(e);if(t)return t;let n=e.env.HOME;if(!n)return Ps(Gs());let r=e.env.XDG_DATA_HOME||Wt(n,".local/share"),s=e.env.XDG_CONFIG_HOME||Wt(n,".config");return t=Ps(Gs({museDataHome:r,miniplayerHome:e.env.MINIPLAYER_HOME||Wt(r,"miniplayer"),claudeDir:Wt(n,".claude"),codexDir:Wt(n,".codex"),codeDir:Wt(n,".code"),geminiDir:Wt(n,".gemini"),copilotDir:Wt(n,".copilot"),qwenDir:Wt(n,".qwen"),opencodeDbPaths:[Wt(r,"opencode/opencode.db"),Wt(s,"opencode/opencode.db")],agyDir:Wt(n,".gemini/antigravity-cli"),dshHome:Wt(n,".dsh"),hermesHome:e.env.HERMES_HOME??Wt(n,".hermes"),kimiHome:e.env.KIMI_CODE_HOME??Wt(n,".kimi-code"),piDir:Wt(n,".pi/agent/sessions"),lmplayerDbPaths:rg(e.env,n)})),JN.set(e,t),t}var Vs=e=>{if(e&&typeof e=="object"){for(let t of Object.values(e))Vs(t);Object.freeze(e)}return e},NSe=Vs(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),xSe=Vs({status:"string",error:"string|null",code:"ErrorCode?"}),LSe=Vs(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),CSe=Vs(["Provider1.Provider","Provider1.Model1","Provider2.Provider","Provider2.Model1","Provider3.Provider","Provider3.Model1"]),OSe=Vs(["Provider1","Provider2","Provider3"]),DSe=Vs({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),De={name:"ctx",type:"context"},oE={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},Sr={name:"teamfile",type:"string"},If={name:"alias",type:"string"},Xs={name:"prompt",type:"string"},kf={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"}]},Nf=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],sa={name:"options",type:"map",optional:!0,keys:Nf},YN={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},KN={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},zN={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}]},Rf={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"}]},t4=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"},{name:"reconcile",type:"boolean"}],QN={name:"options",type:"map",optional:!0,keys:t4},ZN={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},n4=Vs([{name:"resolveProfilePath",implemented:!0,params:[De,oE],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[De,oE],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:[De,{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:[De,Sr],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[Sr]}},{name:"resolveMember",implemented:!0,params:[De,Sr,If],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:[Sr,If]}},{name:"lintTeam",implemented:!0,params:[De,Sr],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:[Sr]}},{name:"seedTeam",implemented:!0,params:[De,Sr,YN],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:[Sr,YN]}},{name:"promptAgent",implemented:!0,params:[De,kf,Xs,sa],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...ZN,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[kf,Xs,sa]}},{name:"promptMember",implemented:!0,params:[De,{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"},...Nf]}],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:[Sr,If,Xs,{name:"options",type:"map",optional:!0,keys:[...Nf,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[De,{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:[De,oa,zN],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:[kf,{...zN,optional:!0}]}},{name:"getSession",implemented:!0,params:[De,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:[De,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:[De,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:[De,{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"},...Nf]}],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:[De,{name:"batch",type:"BatchRef"},Xs,{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:[De,{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:[De,KN],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:[KN]}},{name:"openTerminal",implemented:!0,params:[De,{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:[Sr,If]}},{name:"sessionAdmission",implemented:!0,params:[De,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:[De,{name:"reservation",type:"SessionReservation"},kf,Xs,sa],statuses:["ok","busy","stalled","empty","error"],results:{...ZN,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[De,{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:[De,{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:[De,{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"}]},sa],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:[De,{name:"session",type:"NativeSessionRef"},Xs],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:[De,{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:[De,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Critical synchronous native conversation lease release."},{name:"nativeSessionRequest",implemented:!0,params:[De,Rf,Xs,sa],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null",code:"ErrorCode?",outcome:"not_sent|completed|unknown?",service_epoch:"string|null?",connection_epoch:"number|null?",connection_state:"new|reused|reinitialized|null?"},effects:["provider","db","network"],summary:"Send a stateless native-id turn to a qualified conversation in the configured running lmbee service.",scriptBinding:{name:"lm_session_turn",params:[Rf,Xs,sa]}},{name:"nativeSessionClose",implemented:!0,params:[De,Rf],statuses:["ok","busy","error"],results:{error:"string|null",code:"ErrorCode?",outcome:"not_sent|completed|unknown?",service_epoch:"string|null?",connection_epoch:"number|null?",connection_state:"new|reused|reinitialized|null?"},effects:["provider","db","network"],summary:"Close an idle service-hosted native conversation; an absent entry is already closed.",scriptBinding:{name:"lm_session_close",params:[Rf]}},{name:"loadProperties",implemented:!0,params:[De,oE],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:[De,QN],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:[QN]}}]);function iE(e){if(!nk(e))return Be("invalid_argument","Expected a context created by createLmctlContext");if(e.closed)return Be("cancelled","Context is closed")}function ex(e,t){let n=r=>s=>{t?.(s,r),r==="stderr"&&s.startsWith("warning:")?e.onWarning(s):e.onProgress(s,r)};return{cwd:e.cwd,env:{...e.env,LMCTL_DB:e.dbPath},dal:e.dal,stdout:{write:n("stdout")},stderr:{write:n("stderr")}}}import{readFileSync as s4,writeFileSync as GSe,renameSync as XSe,existsSync as o4}from"node:fs";import{basename as i4,resolve as Lf,dirname as aE}from"node:path";var xf=["title","description","members"],r4=new Set(xf),br=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}};function tx(e){if(e.length===0||!e.startsWith("---"))throw new br("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
2016
2016
  `);if(t[0]!=="---")throw new br("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let i=1;i<t.length;i++){let a=t[i];if(a==="---"){r=i;break}if(a.trim()==="")continue;let c=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!c)throw new br(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let l=c[1],d=c[2].trim();if(!r4.has(l))throw new br(`unknown frontmatter key "${l}" \u2014 allowed keys: ${xf.join(", ")}`);n[l]=d}if(r===-1)throw new br("frontmatter not closed (missing trailing `---` on its own line)");for(let i of xf)if(n[i]===void 0)throw new br(`missing required frontmatter key "${i}" \u2014 required: ${xf.join(", ")}`);let s=0;for(let i=0;i<=r;i++)s+=t[i].length+1;s>e.length&&(s=e.length);let o=n.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:n.title,description:n.description,members:o,bodyOffset:s}}var a4="Lead";function c4(e){let t={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(e))!==null;){let s=r[1],o=r[2]!==void 0?r[2]:r[3];t[s]=o}return t}function l4(e){return/^\s*_MEMBER_\s+\S/.test(e)}function d4(e){return/^\s*_SESSION_\s+\S/.test(e)}function u4(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function cE(e){return/\.(?:lmctl|lmc)$/i.test(e)}function lE(e){return i4(e).replace(/\.(?:lmctl|lmc)$/i,"")}function dE(e){let t=s4(e,"utf-8"),n=aE(Lf(e)),r=uE(t,lE(e),{baseDir:n,sourcePath:Lf(e)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Lf(n,s.sessiondir));return r}var nx=["alias","provider","sessionid","sessiondir","teamfile","model","effort"];function uE(e,t,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let o=e;if(o.startsWith("#teamfile:")){let c=o.indexOf(`
2017
2017
  `);o=c>=0?o.slice(c+1):""}let i=null;if(o.startsWith("---"))try{i=tx(o)}catch(c){if(c instanceof br)s.push(`frontmatter: ${c.message}`);else throw c}let a=e.split(`
2018
2018
  `);for(let c=0;c<a.length;c++){let l=a[c],d=c+1;if(d4(l))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${l.trim()})`);if(u4(l)||!l4(l))continue;let u=c4(l);for(let m of Object.keys(u))if(!nx.includes(m))throw new Error(`line ${d}: unknown key "${m}" on _MEMBER_ line: ${l.trim()}
@@ -2163,7 +2163,7 @@ ${a}
2163
2163
  WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts = ? AND running_systemd_unit = ?`).run("reconciled",s,t.id,t.revision,t.running_since_ts,t.running_systemd_unit),Cy(e,t.id,"reconciled: command execution confirmed gone by systemd probe; no exit callback survived the restart");return}e.prepare("UPDATE cron_jobs SET last_fire_status = ?, updated_at = ? WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts = ?").run("skipped_overlap",s,t.id,t.revision,t.running_since_ts);return}let p=t.last_checked_ts!==null?Date.parse(t.last_checked_ts):Date.parse(t.created_at);if(p>r){Zs(e,"UPDATE cron_jobs SET last_checked_ts = ?, last_fire_status = ?, last_fire_error = ?, updated_at = ?",[s,"error",`last_checked_ts (${t.last_checked_ts??t.created_at}) is after the current tick time -- checkpoint reset without firing`,s],t);return}let h=new Date(p),_=new Date(r);if(r-p>D9){Zs(e,"UPDATE cron_jobs SET last_checked_ts = ?, last_fire_status = ?, updated_at = ?",[s,"skipped_stale",s],t);return}let g=t.timezone!==null?uC(h,t.timezone):h,w=t.timezone!==null?uC(_,t.timezone):_;if(!V0(m,g,w)){Zs(e,"UPDATE cron_jobs SET last_checked_ts = ?, updated_at = ?",[s,s],t);return}let E=vm(e,t.id);if(!(E===null||E.enabled===0||E.revision!==t.revision)){if(C9(t.action_kind)){F9(e,t,s,l,d,u);return}if(t.action_kind==="enqueue")try{let T=JSON.parse(t.action_payload),b={from:T.from??"autopilot",dedupeKey:`cron:${t.id}:${h.toISOString()}`};e.transaction(()=>{let I=e.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(t.id);return I===void 0||I.enabled===0||I.revision!==t.revision||I.last_checked_ts!==t.last_checked_ts?!1:(o(e,n,T.to,T.prompt,b),e.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(s,s,"ok",s,t.id),!0)}).immediate()&&l.push(t.title)}catch(T){try{d?.(t.id,T)}catch{}try{Zs(e,"UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, updated_at = ?",["error",Nn(T),s],t)}catch{}}else{let T=s,b=`lmcron-job-${t.id}-${T.replace(/[:.]/g,"-")}.scope`;if(e.prepare(`UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, running_since_ts = ?, running_systemd_unit = ?, updated_at = ?
2164
2164
  WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?) AND (running_since_ts IS ?)`).run(s,s,"ok",s,b,s,t.id,t.revision,t.last_checked_ts,t.running_since_ts).changes===0)return;let I=SC(e,t,t.action_kind,b,a),R={logDir:c,systemdUnitName:b,onExit:(L,N,k,D)=>{let O=L===0?"ok":"error",v=O==="ok"?null:N?Nn(N):`Command exited with code ${L} -- see ${c??_m()}/${t.id}/ for output`;if(N)try{d?.(t.id,N)}catch{}try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(O,v,new Date().toISOString(),t.id,T)}catch{}bC(e,I,L,N,k,D,b)}};try{i({id:t.id,action_payload:t.action_payload},R),l.push(t.title)}catch(L){try{d?.(t.id,L)}catch{}try{e.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",Nn(L),s,t.id,T)}catch{}AC(e,I,L)}}}}async function fC(e,t){for(;!e();)await new Promise(n=>setTimeout(n,t))}async function Rl(e,t,n,r={}){let s=r.enqueueImpl??Ne,o=r.spawnCommandImpl??gl,i=r.isUnitStillRunningImpl??TC,a=r.executeRunImpl??Ly,c=r.logDir,l=r.pollMs??250,d=it(e,t);if(hl(e,t)&&r.onDemand===void 0)return{kind:"skipped_overlap",job:d};if(d.enabled===0)throw new G("DISABLED",`Cron job ${t} is disabled -- enable it first (\`cron enable ${t}\`), or a manual trigger would silently exercise a job the operator turned off on purpose`,4);let u=Te();if(d.action_kind==="command"){if(d.running_since_ts!==null)return d.running_systemd_unit!==null&&i(d.running_systemd_unit)==="confirmed-gone"?(e.prepare(`UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = NULL, updated_at = ?
2165
2165
  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),Cy(e,d.id,"reconciled: command execution confirmed gone by systemd probe; no exit callback survived the restart"),await Rl(e,t,n,r)):{kind:"skipped_overlap",job:d};let p=u,h=`lmcron-job-${d.id}-${p.replace(/[:.]/g,"-")}-manual.scope`;if(e.prepare(`UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, running_since_ts = ?, running_systemd_unit = ?, updated_at = ?
2166
- WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts IS ?`).run(u,"ok",p,h,u,d.id,d.revision,d.running_since_ts).changes===0)return{kind:"skipped_overlap",job:it(e,t)};let g=SC(e,d,`${d.action_kind}:manual`,h,i),w={logDir:c,systemdUnitName:h,onExit:(y,E,T,b)=>{let A=y===0?"ok":"error",I=A==="ok"?null:E?Nn(E):`Command exited with code ${y} -- see ${c??_m()}/${d.id}/ for output`;try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(A,I,new Date().toISOString(),d.id,p)}catch{}bC(e,g,y,E,T,b,h)}};try{o({id:d.id,action_payload:d.action_payload},w)}catch(y){AC(e,g,y);try{e.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",Nn(y),u,d.id,p)}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to spawn: ${Nn(y)}`,1)}return await fC(()=>it(e,t).running_since_ts!==p,l),{kind:"fired",job:it(e,t)}}if(d.action_kind==="enqueue"){let p=JSON.parse(d.action_payload);return s(e,n,p.to,p.prompt,{from:p.from??"autopilot"}),e.prepare("UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(u,"ok",u,d.id),{kind:"fired",job:it(e,t)}}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=e.transaction(()=>{let p=e.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 h=vl(e,d.id,`${d.action_kind}:manual`,f);if(h.kind==="claimed"){r.onDemand!==void 0&&G0(e,d.id,h.run.id,r.onDemand);let _=r.disableOnClaim?"enabled = 0, ":"";e.prepare(`UPDATE cron_jobs SET ${_}last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?`).run(u,"ok",u,d.id)}return h}).immediate();if(m===null)throw new G("CONFLICT",`Cron job ${t} was modified concurrently -- re-run \`cron trigger ${t}\``,5);if(m.kind==="escalation")return{kind:"blocked_escalation",job:it(e,t)};if(m.kind==="overlap")return{kind:"skipped_overlap",job:it(e,t)};try{a({db:e,job: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{bl(e,m.run.id,`worker dispatch threw: ${Nn(p)}`),Ty(e,m.run.id,{ok:!1,summary:`worker dispatch error: ${Nn(p)}`})}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to dispatch: ${Nn(p)}`,1)}if(r.waitForCompletion===!1){let p=d;try{p=it(e,t)}catch(h){console.warn(`[triggerCronJobNow] post-dispatch getCronJob read failed for job ${t}:`,h)}return{kind:"fired",job:p,runId:m.run.id}}return await fC(()=>{let p=bt(e,m.run.id);return p.status!=="pending"&&p.status!=="running"},l),{kind:"fired",job:it(e,t),runId:m.run.id}}function F9(e,t,n,r,s,o){if(hl(e,t.id))return;let i=JSON.stringify({kind:t.action_kind,payload:t.action_payload,provider:t.provider,model:t.model,workingDirectory:t.working_directory,escalationOwner:t.escalation_owner}),a=e.transaction(()=>{let c=e.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(t.id);if(c===void 0||c.enabled===0||c.revision!==t.revision||c.last_checked_ts!==t.last_checked_ts)return null;let l=vl(e,t.id,t.action_kind,i);return l.kind==="claimed"&&e.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(n,n,"ok",n,t.id),l}).immediate();if(a!==null){if(a.kind==="escalation"){Zs(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["blocked_escalation",n],t);return}if(a.kind==="overlap"){Zs(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["skipped_overlap",n],t);return}r.push(t.title);try{o.executeRunImpl({db:e,job:t,run:a.run,runToken:a.token,...o.runSpawnPrefixes!==void 0?{spawnPrefixes:o.runSpawnPrefixes}:{},...o.sessionDir!==void 0?{sessionDir:o.sessionDir}:{},...o.runTimeoutMs!==void 0?{timeoutMs:o.runTimeoutMs}:{},...o.runSeedTimeoutMs!==void 0?{seedTimeoutMs:o.runSeedTimeoutMs}:{}})}catch(c){try{bl(e,a.run.id,`worker dispatch threw: ${Nn(c)}`),Ty(e,a.run.id,{ok:!1,summary:`worker dispatch error: ${Nn(c)}`})}catch{}try{s?.(t.id,c)}catch{}}}}function Zs(e,t,n,r){e.prepare(`${t} WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?)`).run(...n,r.id,r.revision,r.last_checked_ts)}function IC(e,t){let n=e.transaction(()=>{it(e,t);try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL WHERE id = ?").run(t)}catch(r){Ea(r)}return Tm(e,t),it(e,t)});return ns(n)}import{execFileSync as j9}from"node:child_process";import{existsSync as q9,readFileSync as kC}from"node:fs";import{homedir as RC}from"node:os";import{join as NC}from"node:path";function Ta(){return process.env.LMBEE_HEAVY_STATUS??NC(RC(),".lmbee","heavy.status")}function va(){return process.env.LMBEE_HEAVY_LOCK??NC(RC(),".lmbee","heavy.lock")}var wa=class extends Error{};function H9(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.holder=="string"&&typeof t.pid=="number"&&typeof t.command=="string"&&typeof t.startedAt=="string"}function W9(e){let t;try{t=kC(e,"utf8")}catch{return null}try{let n=JSON.parse(t);return H9(n)?n:null}catch{return null}}function B9(e,t){return e===null||t===null?e===t:e.holder===t.holder&&e.pid===t.pid&&e.command===t.command&&e.startedAt===t.startedAt}function G9(e){try{let t=kC(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[0]==="Z"}catch{return!1}}function X9(e){try{process.kill(e,0)}catch(t){return t.code==="EPERM"}return!G9(e)}function V9(e,t=j9){if(!q9(e))return!1;try{return t("flock",["-n",e,"-c","true"],{stdio:"ignore"}),!1}catch(n){if((n&&typeof n=="object"?n.status:void 0)===1)return!0;let s=n instanceof Error?n.message:String(n);throw new wa(`heavy-lock probe failed (flock did not run or exited abnormally): ${s}`)}}function Oy(e=Ta(),t=va(),n=W9,r=V9,s=X9){for(let o=0;o<3;o++){let i=n(e),a=r(t),c=n(e);if(i!==null&&B9(i,c)){if(!a)return{held:!1,holder:null};if(s(i.pid))return{held:!0,holder:i}}}return{held:r(t),holder:null}}function fn(e=Ta(),t=va(),n=Oy,r){try{return n(e,t)}catch(s){if(!(s instanceof wa))throw s;return r?.(s),{held:!0,holder:null}}}var bm={observedAt:null,report:null,lastErrorAt:null,lastError:null};function xC(e,t){bm={observedAt:t,report:e,lastErrorAt:null,lastError:null}}function LC(e,t){bm={...bm,lastErrorAt:t,lastError:e}}function Nl(){return bm}import{execFile as J9}from"node:child_process";import{promisify as Y9}from"node:util";function ve(e){if(!Number.isFinite(e)||e<0)return"?";if(e<1e3)return"0s";if(e<6e4)return`${Math.floor(e/1e3)}s`;if(e<36e5)return`${Math.floor(e/6e4)}m`;if(e<864e5*2)return`${Math.floor(e/36e5)}h`;let t=Math.floor(e/864e5),n=Math.floor(e%864e5/36e5);return n===0?`${t}d`:`${t}d ${n}h`}function ke(e,t=Date.now()){let n=Date.parse(e);if(Number.isNaN(n))return"?";let r=t-n;return r<6e4?"just now":`${ve(r)} ago`}var K9=Y9(J9);function z9(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return(typeof t.target=="string"||t.target===null)&&typeof t.from_identity=="string"}function Q9(e){let t=JSON.parse(e);if(typeof t!="object"||t===null||!Array.isArray(t.running)||!Array.isArray(t.dead)||!Array.isArray(t.idle))throw new Error("unexpected `lmctl running --json` shape: missing running/dead/idle arrays");let n=t;for(let r of["running","dead","idle"])if(!n[r].every(z9))throw new Error(`unexpected \`lmctl running --json\` shape: a malformed element (bad/missing target or from_identity) in \`${r}\``);return n}async function Je(e=3e4){let{stdout:t}=await K9("lmctl",["running","--json"],{timeout:e});return Q9(t)}function Dy(e,t=Date.now()){return{schema_version:e.schema_version,running:e.running.map(n=>({...n,running_for_human:ve(n.running_for_ms),started_human:ke(n.started_at,t)})),dead:e.dead.map(n=>({...n,stale_for_human:ve(n.stale_for_ms),started_human:ke(n.started_at,t)})),idle:e.idle.map(n=>({...n,ran_human:ve(n.ran_ms)}))}}import{readFileSync as Z9}from"node:fs";import{randomUUID as e7}from"node:crypto";var $y={staleThresholdMs:2*60*6e4,escalationCooldownMs:60*6e4,digestTimeoutMs:9e4,leaseTimeoutMs:10*6e4,providerQuotaBackoffMs:24*60*6e4,operatorStaleThresholdMs:6e4,operatorEscalationCooldownMs:6e4};function t7(e){return/usage limit/i.test(e)&&/quota/i.test(e)}function n7(e){let t=[];for(let n of e)try{t.push({row:n,content:Z9(n.prompt_file,"utf8")})}catch{continue}return t}function r7(e){let t=e.map(({row:n,content:r})=>`--- from "${n.from_id}", queued ${n.created_ts} ---
2166
+ WHERE id = ? AND enabled = 1 AND revision = ? AND running_since_ts IS ?`).run(u,"ok",p,h,u,d.id,d.revision,d.running_since_ts).changes===0)return{kind:"skipped_overlap",job:it(e,t)};let g=SC(e,d,`${d.action_kind}:manual`,h,i),w={logDir:c,systemdUnitName:h,onExit:(y,E,T,b)=>{let A=y===0?"ok":"error",I=A==="ok"?null:E?Nn(E):`Command exited with code ${y} -- see ${c??_m()}/${d.id}/ for output`;try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL, last_fire_status = ?, last_fire_error = ?, updated_at = ? WHERE id = ? AND running_since_ts = ?").run(A,I,new Date().toISOString(),d.id,p)}catch{}bC(e,g,y,E,T,b,h)}};try{o({id:d.id,action_payload:d.action_payload},w)}catch(y){AC(e,g,y);try{e.prepare("UPDATE cron_jobs SET last_fire_status = ?, last_fire_error = ?, running_since_ts = NULL, running_systemd_unit = NULL, updated_at = ? WHERE id = ? AND running_since_ts = ?").run("error",Nn(y),u,d.id,p)}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to spawn: ${Nn(y)}`,1)}return await fC(()=>it(e,t).running_since_ts!==p,l),{kind:"fired",job:it(e,t)}}if(d.action_kind==="enqueue"){let p=JSON.parse(d.action_payload);return s(e,n,p.to,p.prompt,{from:p.from??"autopilot"}),e.prepare("UPDATE cron_jobs SET last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(u,"ok",u,d.id),{kind:"fired",job:it(e,t)}}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=e.transaction(()=>{let p=e.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 h=vl(e,d.id,`${d.action_kind}:manual`,f);if(h.kind==="claimed"){r.onDemand!==void 0&&G0(e,d.id,h.run.id,r.onDemand);let _=r.disableOnClaim?"enabled = 0, ":"";e.prepare(`UPDATE cron_jobs SET ${_}last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?`).run(u,"ok",u,d.id)}return h}).immediate();if(m===null)throw new G("CONFLICT",`Cron job ${t} was modified concurrently -- re-run \`cron trigger ${t}\``,5);if(m.kind==="escalation")return{kind:"blocked_escalation",job:it(e,t)};if(m.kind==="overlap")return{kind:"skipped_overlap",job:it(e,t)};try{a({db:e,job: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{bl(e,m.run.id,`worker dispatch threw: ${Nn(p)}`),Ty(e,m.run.id,{ok:!1,summary:`worker dispatch error: ${Nn(p)}`})}catch{}throw new G("SPAWN_FAILED",`manual trigger of job ${t} failed to dispatch: ${Nn(p)}`,1)}if(r.waitForCompletion===!1){let p=d;try{p=it(e,t)}catch(h){console.warn(`[triggerCronJobNow] post-dispatch getCronJob read failed for job ${t}:`,h)}return{kind:"fired",job:p,runId:m.run.id}}return await fC(()=>{let p=bt(e,m.run.id);return p.status!=="pending"&&p.status!=="running"},l),{kind:"fired",job:it(e,t),runId:m.run.id}}function F9(e,t,n,r,s,o){if(hl(e,t.id))return;let i=JSON.stringify({kind:t.action_kind,payload:t.action_payload,provider:t.provider,model:t.model,workingDirectory:t.working_directory,escalationOwner:t.escalation_owner}),a=e.transaction(()=>{let c=e.prepare("SELECT enabled, revision, last_checked_ts FROM cron_jobs WHERE id = ?").get(t.id);if(c===void 0||c.enabled===0||c.revision!==t.revision||c.last_checked_ts!==t.last_checked_ts)return null;let l=vl(e,t.id,t.action_kind,i);return l.kind==="claimed"&&e.prepare("UPDATE cron_jobs SET last_checked_ts = ?, last_fired_ts = ?, last_fire_status = ?, last_fire_error = NULL, updated_at = ? WHERE id = ?").run(n,n,"ok",n,t.id),l}).immediate();if(a!==null){if(a.kind==="escalation"){Zs(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["blocked_escalation",n],t);return}if(a.kind==="overlap"){Zs(e,"UPDATE cron_jobs SET last_fire_status = ?, updated_at = ?",["skipped_overlap",n],t);return}r.push(t.title);try{o.executeRunImpl({db:e,job:t,run:a.run,runToken:a.token,...o.runSpawnPrefixes!==void 0?{spawnPrefixes:o.runSpawnPrefixes}:{},...o.sessionDir!==void 0?{sessionDir:o.sessionDir}:{},...o.runTimeoutMs!==void 0?{timeoutMs:o.runTimeoutMs}:{},...o.runSeedTimeoutMs!==void 0?{seedTimeoutMs:o.runSeedTimeoutMs}:{}})}catch(c){try{bl(e,a.run.id,`worker dispatch threw: ${Nn(c)}`),Ty(e,a.run.id,{ok:!1,summary:`worker dispatch error: ${Nn(c)}`})}catch{}try{s?.(t.id,c)}catch{}}}}function Zs(e,t,n,r){e.prepare(`${t} WHERE id = ? AND enabled = 1 AND revision = ? AND (last_checked_ts IS ?)`).run(...n,r.id,r.revision,r.last_checked_ts)}function IC(e,t){let n=e.transaction(()=>{it(e,t);try{e.prepare("UPDATE cron_jobs SET running_since_ts = NULL, running_systemd_unit = NULL WHERE id = ?").run(t)}catch(r){Ea(r)}return Tm(e,t),it(e,t)});return ns(n)}import{execFileSync as j9}from"node:child_process";import{existsSync as q9,readFileSync as kC}from"node:fs";import{homedir as RC}from"node:os";import{join as NC}from"node:path";function Ta(){return process.env.LMBEE_HEAVY_STATUS??NC(RC(),".lmbee","heavy.status")}function va(){return process.env.LMBEE_HEAVY_LOCK??NC(RC(),".lmbee","heavy.lock")}var wa=class extends Error{};function H9(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.holder=="string"&&typeof t.pid=="number"&&typeof t.command=="string"&&typeof t.startedAt=="string"}function W9(e){let t;try{t=kC(e,"utf8")}catch{return null}try{let n=JSON.parse(t);return H9(n)?n:null}catch{return null}}function B9(e,t){return e===null||t===null?e===t:e.holder===t.holder&&e.pid===t.pid&&e.command===t.command&&e.startedAt===t.startedAt}function G9(e){try{let t=kC(`/proc/${e}/stat`,"utf8");return t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[0]==="Z"}catch{return!1}}function X9(e){try{process.kill(e,0)}catch(t){return t.code==="EPERM"}return!G9(e)}function V9(e,t=j9){if(!q9(e))return!1;try{return t("flock",["-n",e,"-c","true"],{stdio:"ignore"}),!1}catch(n){if((n&&typeof n=="object"?n.status:void 0)===1)return!0;let s=n instanceof Error?n.message:String(n);throw new wa(`heavy-lock probe failed (flock did not run or exited abnormally): ${s}`)}}function Oy(e=Ta(),t=va(),n=W9,r=V9,s=X9){for(let o=0;o<3;o++){let i=n(e),a=r(t),c=n(e);if(i!==null&&B9(i,c)){if(!a)return{held:!1,holder:null};if(s(i.pid))return{held:!0,holder:i}}}return{held:r(t),holder:null}}function fn(e=Ta(),t=va(),n=Oy,r){try{return n(e,t)}catch(s){if(!(s instanceof wa))throw s;return r?.(s),{held:!0,holder:null}}}var bm={observedAt:null,report:null,lastErrorAt:null,lastError:null};function xC(e,t){bm={observedAt:t,report:e,lastErrorAt:null,lastError:null}}function LC(e,t){bm={...bm,lastErrorAt:t,lastError:e}}function Nl(){return bm}import{execFile as J9}from"node:child_process";import{promisify as Y9}from"node:util";function ve(e){if(!Number.isFinite(e)||e<0)return"?";if(e<1e3)return"0s";if(e<6e4)return`${Math.floor(e/1e3)}s`;if(e<36e5)return`${Math.floor(e/6e4)}m`;if(e<864e5*2)return`${Math.floor(e/36e5)}h`;let t=Math.floor(e/864e5),n=Math.floor(e%864e5/36e5);return n===0?`${t}d`:`${t}d ${n}h`}function ke(e,t=Date.now()){let n=Date.parse(e);if(Number.isNaN(n))return"?";let r=t-n;return r<6e4?"just now":`${ve(r)} ago`}var K9=Y9(J9);function z9(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return(typeof t.target=="string"||t.target===null)&&typeof t.from_identity=="string"}function Q9(e){let t=JSON.parse(e);if(typeof t!="object"||t===null||!Array.isArray(t.running)||!Array.isArray(t.dead)||!Array.isArray(t.idle))throw new Error("unexpected `lmctl running --json` shape: missing running/dead/idle arrays");let n=t;for(let r of["running","dead","idle"])if(!n[r].every(z9))throw new Error(`unexpected \`lmctl running --json\` shape: a malformed element (bad/missing target or from_identity) in \`${r}\``);return n}async function Je(e=3e4,t={}){let n=t.reconcile===!0?["running","--json","--reconcile"]:["running","--json"],{stdout:r}=await K9("lmctl",n,{timeout:e});return Q9(r)}function Dy(e,t=Date.now()){return{schema_version:e.schema_version,running:e.running.map(n=>({...n,running_for_human:ve(n.running_for_ms),started_human:ke(n.started_at,t)})),dead:e.dead.map(n=>({...n,stale_for_human:ve(n.stale_for_ms),started_human:ke(n.started_at,t)})),idle:e.idle.map(n=>({...n,ran_human:ve(n.ran_ms)}))}}import{readFileSync as Z9}from"node:fs";import{randomUUID as e7}from"node:crypto";var $y={staleThresholdMs:2*60*6e4,escalationCooldownMs:60*6e4,digestTimeoutMs:9e4,leaseTimeoutMs:10*6e4,providerQuotaBackoffMs:24*60*6e4,operatorStaleThresholdMs:6e4,operatorEscalationCooldownMs:6e4};function t7(e){return/usage limit/i.test(e)&&/quota/i.test(e)}function n7(e){let t=[];for(let n of e)try{t.push({row:n,content:Z9(n.prompt_file,"utf8")})}catch{continue}return t}function r7(e){let t=e.map(({row:n,content:r})=>`--- from "${n.from_id}", queued ${n.created_ts} ---
2167
2167
  ${r}`);return`You have ${e.length} queued message(s) that couldn't be delivered automatically (presence-gated for a while) -- bundled here as a digest:
2168
2168
 
2169
2169
  ${t.join(`
@@ -2328,7 +2328,7 @@ ${s}`;if(e.activeGhAccount===null||e.activeGhAccount.matchesPolicy)return o;let
2328
2328
 
2329
2329
  ${o}`}async function ZO(e,t,n,r={}){let s={db:{path:"",db:e,close:()=>{}},teamsConfPath:"",teams:[...t]},o=await Wm(s,{maintainer:n,...r.config!==void 0?{config:r.config}:{},...r.nowMs!==void 0?{nowMs:r.nowMs}:{},...r.awaitingReviewThresholdMs!==void 0?{awaitingReviewThresholdMs:r.awaitingReviewThresholdMs}:{},...r.maintainerStaleThresholdMs!==void 0?{maintainerStaleThresholdMs:r.maintainerStaleThresholdMs}:{},...r.fetchReportImpl!==void 0?{fetchReportImpl:r.fetchReportImpl}:{},...r.heavyLockImpl!==void 0?{heavyLockImpl:r.heavyLockImpl}:{},...r.findNeverTrackFilesImpl!==void 0?{findNeverTrackFilesImpl:r.findNeverTrackFilesImpl}:{},...r.findSecretBearingTeamfilesImpl!==void 0?{findSecretBearingTeamfilesImpl:r.findSecretBearingTeamfilesImpl}:{},...r.checkRepoGitIdentityImpl!==void 0?{checkRepoGitIdentityImpl:r.checkRepoGitIdentityImpl}:{},...r.checkActiveGhAccountImpl!==void 0?{checkActiveGhAccountImpl:r.checkActiveGhAccountImpl}:{},...r.resolveMemberProviderImpl!==void 0?{resolveMemberProviderImpl:r.resolveMemberProviderImpl}:{},...r.lintTeamfileWarningsImpl!==void 0?{lintTeamfileWarningsImpl:r.lintTeamfileWarningsImpl}:{}}),i=(r.readMemoryAvailabilityImpl??cc)(),a=o.blocked.length===0&&o.awaitingDecision.length===0&&o.awaitingReview.length===0&&o.stalled.length===0&&o.hungHolders.length===0&&o.flaggedEpics.length===0&&o.closedEpicsToReview.length===0&&(o.inbox===null||o.inbox.length===0)&&o.operatorPrompts.length===0&&o.operatorEscalations.length===0&&o.uncommittedWork.length===0&&o.expiredHolds.length===0&&o.neverTrackFiles.length===0&&o.secretBearingTeamfiles.length===0&&o.gitIdentityMismatches.length===0&&(o.activeGhAccount===null||o.activeGhAccount.matchesPolicy)&&!o.providerDisableReadFailed&&o.quiescedByProviderDisable.length===0&&o.blockedOnUnresolved.length===0&&o.staleAutoScanPause===null&&o.persistentDispatchFailures.every(d=>d.kind!=="continuous")&&o.parkedTeamsWithOwedPrompts.length===0&&o.rateLimitPolicyHealth===null,c=Cd(i),l=c===null?$l(o):`${$l(o)}
2330
2330
 
2331
- ${c}`;return{attention:o,memory:i,isEmpty:a,rendered:l}}var ZZ=18e5,eee={watch:{first:!1,active:[],wentIdle:[],newlyActive:[],wake:!1,why:"nochange"},stalled:[],maintainerWoken:!1,autoContinued:[],surfacedUnknown:[],surfacedBlocked:[],surfacedDoneConsistency:[],surfacedUnresolvableTeamfiles:[],surfacedFault:[],surfacedClosedEpics:[],escalated:[],autoRedelivered:[],woken:[],firedCronJobs:[],rateLimitCollected:null,rateLimitPolicyEvaluations:[]};function eD(e){let t=e.fetchReport??Je,n=e.readHeavyLockStatusImpl??fn,r=e.heavyLockStatusPath??Ta(),s=e.heavyLockPath??va(),o=e.maintainerWakeImpl??hO,i=e.autoContinueImpl??mO,a=e.surfaceUnknownImpl??NO,c=e.surfaceBlockedImpl??gO,l=e.surfaceDoneConsistencyImpl??bO,d=e.surfaceUnresolvableTeamfilesImpl??EO,u=e.surfaceFaultImpl??IO,f=e.surfaceClosedEpicsImpl??wO,m=e.escalateImpl??CC,p=e.autoRedeliverImpl??OC,h=e.wakeImpl??DC,_=e.evaluateCronJobsImpl??vC,g=e.miniplayerVerifyImpl??B0,w=e.hungHolderCheckImpl??C0,y=e.epicReviewImpl??q0,E=e.orphanReconcilerImpl??U0,T=e.hangProbeCollectImpl??j0,b=e.rateLimitCollectImpl??UC,A=e.rateLimitPolicyImpl??qC,I=e.assembleWakeReportImpl??ZO,R=e.existsSyncImpl??KZ,L=e.statSyncImpl??QZ,N=e.config??Ie,k=e.escalation??$y,D=e.autoRedeliver??My,O=e.wake??Py,v=e.intervalMs??ZZ,S=null,x=!1;async function C(){if(x)return eee;x=!0;try{let q=e.getTeams(),F=q.filter(K),M;try{M=await t(),xC(M,new Date().toISOString())}catch(Z){throw LC(Z instanceof Error?Z.message:String(Z),new Date().toISOString()),Z}let $=Date.now(),U=n(r,s,void 0,Z=>{e.onError?.(Z)}),B=bd(e.db,F,M),{stalled:W,continueEligible:se}=await nb(e.db,F,M,U,N,$);if(e.miniplayerVerify)try{await g(e.db,W,F,e.miniplayerVerify)}catch(Z){e.onError?.(Z)}let z=new Set(W);for(let Z of F)!z.has(Z.name)&&fe(e.db,Z.name)?.miniplayer_verdict_label&&pv(e.db,Z.name);if(e.hungHolderCheck)try{let Z=e.maintainerWake?.sessionAlivePath!==void 0||e.maintainerWake?.activityFreshnessMs!==void 0?{sessionAliveExemptTeamName:e.maintainerWake.teamName,sessionAliveExemptPath:e.maintainerWake.sessionAlivePath,sessionAliveFreshnessMs:e.maintainerWake.sessionAliveFreshnessMs,activityFreshnessMs:e.maintainerWake.activityFreshnessMs}:{};await w(e.db,F,{...Z,...e.hungHolderCheck})}catch(Z){e.onError?.(Z)}if(e.orphanReconciler)try{let Z=e.maintainerWake?.sessionAlivePath!==void 0||e.maintainerWake?.activityFreshnessMs!==void 0?{sessionAliveExemptTeamName:e.maintainerWake.teamName,sessionAliveExemptPath:e.maintainerWake.sessionAlivePath,sessionAliveFreshnessMs:e.maintainerWake.sessionAliveFreshnessMs,activityFreshnessMs:e.maintainerWake.activityFreshnessMs}:{};await E(e.db,q,M,{...Z,...e.orphanReconciler})}catch(Z){e.onError?.(Z)}if(e.hangProbeCollect)try{T(e.db,e.hangProbeCollect)}catch(Z){e.onError?.(Z)}if(e.autoNudgeRedirectReview)try{let Z=e.findDueAutoNudgeReviewsImpl??T0,xe=new Map(F.map(qt=>[qt.name,qt.repoPath])),Zt=new Map(F.map(qt=>[qt.name,qt])),jt=await Z(e.db,xe,$),_n=e.buildReviewMessageImpl??S0,Dt=e.resetShiftImpl??v0,li=e.enqueueImpl??Ne,us=e.checkProviderDisabledImpl??Kt,jr=e.resolveMemberProviderImpl??lr;for(let qt of jt)try{let fs=xe.get(qt.team);if(fs===void 0)continue;let tc=Zt.get(qt.team),cd=tc===void 0?null:jr(tc,tc.leadAlias);if(cd!==null&&us(e.db,cd,$).disabled)continue;let Np=await _n(qt,fs);li(e.db,q,qt.team,Np,{from:"autopilot"}),await Dt(e.db,qt.team,fs,new Date($).toISOString())}catch(fs){e.onError?.(fs)}}catch(Z){e.onError?.(Z)}if(e.epicReview)try{await y(e.db,q,e.epicReview)}catch(Z){e.onError?.(Z)}let ue=!1;if(e.maintainerWake)try{let Z={cooldownMs:N.cooldownMs,...e.maintainerWake};if(Z.sessionAlivePath!==void 0){let xe=ha(Z.sessionAlivePath,Z.sessionAliveFreshnessMs,Z.activityFreshnessMs!==void 0?fe(e.db,Z.teamName)?.last_cli_activity_ts??null:null,Z.activityFreshnessMs,{existsSyncImpl:R,statSyncImpl:L,nowMs:$}),Zt,jt;try{let Dt=await I(e.db,q,Z.teamName,{nowMs:$,config:N,fetchReportImpl:async()=>M,heavyLockImpl:()=>U,...Z.maintainerStaleThresholdMs!==void 0?{maintainerStaleThresholdMs:Z.maintainerStaleThresholdMs}:{}});Zt=Dt.rendered,jt=Dt.isEmpty}catch(Dt){e.onError?.(Dt),Zt="wake-report assembly failed this tick -- waking conservatively; check server logs for the error.",jt=!1}let _n=Dt=>`${zZ(Dt,"utf8")}
2331
+ ${c}`;return{attention:o,memory:i,isEmpty:a,rendered:l}}var ZZ=18e5,eee={watch:{first:!1,active:[],wentIdle:[],newlyActive:[],wake:!1,why:"nochange"},stalled:[],maintainerWoken:!1,autoContinued:[],surfacedUnknown:[],surfacedBlocked:[],surfacedDoneConsistency:[],surfacedUnresolvableTeamfiles:[],surfacedFault:[],surfacedClosedEpics:[],escalated:[],autoRedelivered:[],woken:[],firedCronJobs:[],rateLimitCollected:null,rateLimitPolicyEvaluations:[]};function eD(e){let t=e.fetchReport??Je,n=e.readHeavyLockStatusImpl??fn,r=e.heavyLockStatusPath??Ta(),s=e.heavyLockPath??va(),o=e.maintainerWakeImpl??hO,i=e.autoContinueImpl??mO,a=e.surfaceUnknownImpl??NO,c=e.surfaceBlockedImpl??gO,l=e.surfaceDoneConsistencyImpl??bO,d=e.surfaceUnresolvableTeamfilesImpl??EO,u=e.surfaceFaultImpl??IO,f=e.surfaceClosedEpicsImpl??wO,m=e.escalateImpl??CC,p=e.autoRedeliverImpl??OC,h=e.wakeImpl??DC,_=e.evaluateCronJobsImpl??vC,g=e.miniplayerVerifyImpl??B0,w=e.hungHolderCheckImpl??C0,y=e.epicReviewImpl??q0,E=e.orphanReconcilerImpl??U0,T=e.hangProbeCollectImpl??j0,b=e.rateLimitCollectImpl??UC,A=e.rateLimitPolicyImpl??qC,I=e.assembleWakeReportImpl??ZO,R=e.existsSyncImpl??KZ,L=e.statSyncImpl??QZ,N=e.config??Ie,k=e.escalation??$y,D=e.autoRedeliver??My,O=e.wake??Py,v=e.intervalMs??ZZ,S=null,x=!1;async function C(){if(x)return eee;x=!0;try{let q=e.getTeams(),F=q.filter(K),M;try{M=await t(void 0,{reconcile:!0}),xC(M,new Date().toISOString())}catch(Z){throw LC(Z instanceof Error?Z.message:String(Z),new Date().toISOString()),Z}let $=Date.now(),U=n(r,s,void 0,Z=>{e.onError?.(Z)}),B=bd(e.db,F,M),{stalled:W,continueEligible:se}=await nb(e.db,F,M,U,N,$);if(e.miniplayerVerify)try{await g(e.db,W,F,e.miniplayerVerify)}catch(Z){e.onError?.(Z)}let z=new Set(W);for(let Z of F)!z.has(Z.name)&&fe(e.db,Z.name)?.miniplayer_verdict_label&&pv(e.db,Z.name);if(e.hungHolderCheck)try{let Z=e.maintainerWake?.sessionAlivePath!==void 0||e.maintainerWake?.activityFreshnessMs!==void 0?{sessionAliveExemptTeamName:e.maintainerWake.teamName,sessionAliveExemptPath:e.maintainerWake.sessionAlivePath,sessionAliveFreshnessMs:e.maintainerWake.sessionAliveFreshnessMs,activityFreshnessMs:e.maintainerWake.activityFreshnessMs}:{};await w(e.db,F,{...Z,...e.hungHolderCheck})}catch(Z){e.onError?.(Z)}if(e.orphanReconciler)try{let Z=e.maintainerWake?.sessionAlivePath!==void 0||e.maintainerWake?.activityFreshnessMs!==void 0?{sessionAliveExemptTeamName:e.maintainerWake.teamName,sessionAliveExemptPath:e.maintainerWake.sessionAlivePath,sessionAliveFreshnessMs:e.maintainerWake.sessionAliveFreshnessMs,activityFreshnessMs:e.maintainerWake.activityFreshnessMs}:{};await E(e.db,q,M,{...Z,...e.orphanReconciler})}catch(Z){e.onError?.(Z)}if(e.hangProbeCollect)try{T(e.db,e.hangProbeCollect)}catch(Z){e.onError?.(Z)}if(e.autoNudgeRedirectReview)try{let Z=e.findDueAutoNudgeReviewsImpl??T0,xe=new Map(F.map(qt=>[qt.name,qt.repoPath])),Zt=new Map(F.map(qt=>[qt.name,qt])),jt=await Z(e.db,xe,$),_n=e.buildReviewMessageImpl??S0,Dt=e.resetShiftImpl??v0,li=e.enqueueImpl??Ne,us=e.checkProviderDisabledImpl??Kt,jr=e.resolveMemberProviderImpl??lr;for(let qt of jt)try{let fs=xe.get(qt.team);if(fs===void 0)continue;let tc=Zt.get(qt.team),cd=tc===void 0?null:jr(tc,tc.leadAlias);if(cd!==null&&us(e.db,cd,$).disabled)continue;let Np=await _n(qt,fs);li(e.db,q,qt.team,Np,{from:"autopilot"}),await Dt(e.db,qt.team,fs,new Date($).toISOString())}catch(fs){e.onError?.(fs)}}catch(Z){e.onError?.(Z)}if(e.epicReview)try{await y(e.db,q,e.epicReview)}catch(Z){e.onError?.(Z)}let ue=!1;if(e.maintainerWake)try{let Z={cooldownMs:N.cooldownMs,...e.maintainerWake};if(Z.sessionAlivePath!==void 0){let xe=ha(Z.sessionAlivePath,Z.sessionAliveFreshnessMs,Z.activityFreshnessMs!==void 0?fe(e.db,Z.teamName)?.last_cli_activity_ts??null:null,Z.activityFreshnessMs,{existsSyncImpl:R,statSyncImpl:L,nowMs:$}),Zt,jt;try{let Dt=await I(e.db,q,Z.teamName,{nowMs:$,config:N,fetchReportImpl:async()=>M,heavyLockImpl:()=>U,...Z.maintainerStaleThresholdMs!==void 0?{maintainerStaleThresholdMs:Z.maintainerStaleThresholdMs}:{}});Zt=Dt.rendered,jt=Dt.isEmpty}catch(Dt){e.onError?.(Dt),Zt="wake-report assembly failed this tick -- waking conservatively; check server logs for the error.",jt=!1}let _n=Dt=>`${zZ(Dt,"utf8")}
2332
2332
 
2333
2333
  ---
2334
2334
  ${Zt}`;ue=o(e.db,F,M,Z,_n,$,xe?void 0:!jt)}else ue=o(e.db,F,M,Z,void 0,$)}catch(Z){e.onError?.(Z)}let J=[];if(e.autoContinue&&eo(e.db)===null)try{J=await i(e.db,F,M,{config:N,...e.autoContinue,nowMs:$,stalledTeamNames:se,heavyLockStatusPath:r,heavyLockPath:s,readHeavyLockStatusImpl:n})}catch(Z){e.onError?.(Z)}let V=[];if(e.maintainerWake)try{V=await a(e.db,W,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let j=[];if(e.maintainerWake)try{j=await c(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let X=[];if(e.maintainerWake)try{X=await l(e.db,F,e.maintainerWake.teamName,q,N)}catch(Z){e.onError?.(Z)}let Q=[];if(e.maintainerWake)try{Q=await u(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let ee=[];if(e.maintainerWake)try{ee=await f(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let ce=[];if(e.maintainerWake)try{ce=await d(e.db,F,e.maintainerWake.teamName,q,N,$)}catch(Z){e.onError?.(Z)}let le=[];try{le=await _(e.db,q,$,{onJobError:(Z,xe)=>e.onError?.(xe)})}catch(Z){e.onError?.(Z)}let Ee=[];try{Ee=await m(e.db,F,k,$)}catch(Z){e.onError?.(Z)}let He=[];try{He=p(e.db,F,D,$)}catch(Z){e.onError?.(Z)}let Ue=[];try{Ue=h(e.db,F,M,O,$)}catch(Z){e.onError?.(Z)}let te=null,Oe=[],Ot=e.rateLimitPolicy??e.rateLimitAutomation,It=e.rateLimitCollect??Ot;if(It!==void 0){let Z=Date.now();try{te=await b(e.db,{nowMs:Z,...It})}catch(xe){e.onError?.(xe)}try{Oe=A(e.db,{nowMs:Z,...Ot,dryRun:Ot===void 0})}catch(xe){e.onError?.(xe)}}let nr={watch:B,stalled:W,maintainerWoken:ue,autoContinued:J,surfacedUnknown:V,surfacedBlocked:j,surfacedDoneConsistency:X,surfacedUnresolvableTeamfiles:ce,surfacedFault:Q,surfacedClosedEpics:ee,escalated:Ee,autoRedelivered:He,woken:Ue,firedCronJobs:le,rateLimitCollected:te,rateLimitPolicyEvaluations:Oe};return e.onTick?.(nr),nr}catch(q){throw e.onError?.(q),q}finally{x=!1}}return{start(){S||(S=setInterval(()=>{C().catch(()=>{})},v),S.unref())},stop(){S&&(clearInterval(S),S=null)},runTickNow:C,isRunning:()=>S!==null,isTicking:()=>x}}import{closeSync as tee,linkSync as nee,openSync as ree,readdirSync as see,readFileSync as Gm,readlinkSync as oee,realpathSync as iee,renameSync as tD,unlinkSync as ew,writeSync as aee}from"node:fs";import{dirname as cee,join as lee}from"node:path";var ba=class extends Error{holder;lockPath;constructor(t,n){super(`site lock held by "${t.ownerLabel}" (pid ${t.pid}, started ${t.startedAt}) at ${n} -- only one process (standalone \`lmauto serve\` or \`lmt site start\`) may run lmauto's scheduler against this DB at a time`),this.holder=t,this.lockPath=n,this.name="SiteLockHeldError"}};function Ml(e){return e===":memory:"?null:`${e}.lock`}function oD(e){let t=Pl(e);return t.kind==="held"?t.identity:null}function nD(e){let t;try{t=Gm(e,"utf8")}catch(s){return s.code==="ENOENT"?{kind:"free"}:{kind:"unknown"}}let n=eh(t);if(!n)return{kind:"unknown"};let r={...n,bootId:n.bootId??null};return Zy(r)?{kind:"held",identity:r}:{kind:"free"}}function dee(e,t){let n;try{n=iee(t)}catch{return!1}let r;try{r=see(`/proc/${e}/fd`)}catch{return!1}for(let s of r)try{if(oee(`/proc/${e}/fd/${s}`)===n)return!0}catch{}return!1}function Pl(e){let t=Ml(e);if(t===null)return{kind:"free"};let n=nD(t);if(n.kind==="held")return n;let r=lee(cee(e),"site.lock");if(r===t)return n;let s=nD(r);return s.kind==="held"&&dee(s.identity.pid,e)?s:n}function Bm(e){try{let t=eh(Gm(e,"utf8"));return t?{...t,bootId:t.bootId??null}:null}catch{return null}}function iD(){try{let e=Gm("/proc/sys/kernel/random/boot_id","utf8").trim();return th(e)?e:null}catch{return null}}function aD(e){try{let t=Gm(`/proc/${e}/stat`,"utf8"),s=t.slice(t.lastIndexOf(")")+2).trim().split(/\s+/)[19];if(s===void 0)return null;let o=Number(s);return Number.isFinite(o)?o:null}catch{return null}}function Zy(e){let t;try{process.kill(e.pid,0),t=!0}catch(r){t=r.code==="EPERM"}if(!t)return!1;if(e.bootId!==null){let r=iD();if(r!==null&&r!==e.bootId)return!1}if(e.pidStartTicks===null)return!0;let n=aD(e.pid);return n===null?!0:n===e.pidStartTicks}function rD(e,t){let n=`${e}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`,r=ree(n,"wx");try{aee(r,JSON.stringify(t))}finally{tee(r)}try{return nee(n,e),!0}catch(s){if(s.code!=="EEXIST")throw s;return!1}finally{ew(n)}}function Xm(e,t){let n={pid:process.pid,ownerLabel:t,startedAt:new Date().toISOString(),pidStartTicks:aD(process.pid),bootId:iD()};if(rD(e,n))return sD(e,n);let r=Bm(e);if(r!==null&&Zy(r))throw new ba(r,e);let s=`${e}.reclaim.${process.pid}.${Math.random().toString(36).slice(2)}`,o=!1;try{tD(e,s);let a=Bm(s);r===null&&a===null||r!==null&&a!==null&&a.pid===r.pid&&a.startedAt===r.startedAt?(ew(s),o=!0):tD(s,e)}catch{}if(o&&rD(e,n))return sD(e,n);let i=Bm(e);throw i!==null&&Zy(i)?new ba(i,e):new Error(`failed to acquire site lock at ${e} (lost a reclaim race)`)}function sD(e,t){let n=!1;return{release(){if(!n){n=!0;try{let r=Bm(e);r!==null&&r.pid===t.pid&&r.startedAt===t.startedAt&&ew(e)}catch{}}}}}import{closeSync as tw,existsSync as uee,fstatSync as fee,mkdirSync as mee,openSync as cD,readFileSync as lD,renameSync as pee,unlinkSync as hee,writeSync as _ee}from"node:fs";import{dirname as dD,join as gee}from"node:path";import{createHash as Eee,randomBytes as yee}from"node:crypto";var wee=32;function Aa(e){return e===":memory:"?null:gee(dD(e),"localweb-passcode")}function Tee(){return yee(wee).toString("base64url")}function nw(e,t){let n=dD(e);uee(n)||mee(n,{recursive:!0});let r=`${e}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`,s;try{s=cD(r,"wx",384);let o=Buffer.from(t,"utf8"),i=0;for(;i<o.length;){let a=_ee(s,o,i,o.length-i);if(a<=0)throw new Error("passcode file write made no progress");i+=a}tw(s),s=void 0,pee(r,e)}catch(o){if(s!==void 0)try{tw(s)}catch{}try{hee(r)}catch{}throw o}}function uD(e){let t;try{t=cD(e,"r")}catch(n){if(n.code==="ENOENT")return null;throw n}try{let n=fee(t,{bigint:!0}),r=lD(t,"utf8"),s=Eee("sha256").update(`${n.dev}:${n.ino}:${n.ctimeNs}:${n.mtimeNs}:${n.size}:`).update(r,"utf8").digest("base64url");return{passcode:r,generation:s}}finally{tw(t)}}function fD(e){try{return lD(e,"utf8")}catch(t){if(t.code==="ENOENT")return null;throw t}}function Vm(e){let t=Tee();return nw(e,t),t}import{randomUUID as vee}from"node:crypto";function rw(e){return`remote:${e.from.team?`${e.from.site}:${e.from.team}:${e.from.alias}`:`${e.from.site}:${e.from.alias}`}`}function mD(e,t,n){let r=t.find(s=>s.name===n.to.team);if(!r)throw new Error(`no local team registered for remote envelope's to.team "${n.to.team}"`);if(!K(r))throw new Error(`remote envelope addressed to "${n.to.team}", which is itself a remote (channel=lmmail) team -- not locally dispatchable`);Ne(e,t,r.name,n.payload,{from:rw(n),dedupeKey:n.msgId})}var See=new Set(["dispatched","queued","failed"]);function bee(e){let t;try{t=JSON.parse(e)}catch{return!1}if(typeof t!="object"||t===null||Array.isArray(t))return!1;let n=t.state;return typeof n=="string"&&See.has(n)}var Aee="reply-surfaced:";function Iee(e,t,n,r){let s=n.inReplyTo;if(!s)throw new Error("recordReplyOrAck: envelope has no in_reply_to");let o=bS(e,s);if(!o)return"orphan";if(bee(n.payload))return AS(e,s,r),"acked";IS(e,s,r);let i=t.find(a=>K(a)&&a.name===o.from_alias);if(i)try{Ne(e,t,i.name,n.payload,{from:rw(n),dedupeKey:`${Aee}${n.msgId}`})}catch(a){process.stderr.write(`[mail] failed to surface reply to ${i.name}'s inbox (in_reply_to ${s}): ${a instanceof Error?a.message:String(a)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lmctl-ai/lmctl",
3
- "version": "0.2.353",
3
+ "version": "0.2.355",
4
4
  "description": "A provider-agnostic control plane for teams of AI coding agents — across providers, with independent review and durable memory.",
5
5
  "type": "module",
6
6
  "homepage": "https://lmctl.com",