@lmctl-ai/lmctl 0.2.417 → 0.2.419
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/build-info.json +1 -1
- package/dist/cli/index.js +5 -5
- package/dist/cli/lmscript.js +252 -252
- package/dist/lmbee.js +3 -3
- package/package.json +1 -1
package/dist/lmbee.js
CHANGED
|
@@ -137,7 +137,7 @@ Waiting for approval (Ctrl-C to cancel)...
|
|
|
137
137
|
`),null;let l=o||"default",u=a?a.split(",").map(f=>f.trim()).filter(f=>f.length>0):[],d=u.length>0?wb(r,u):[ed(r)];return{channel:"local",name:n,repoPath:r,leadAlias:s,promptName:l,description:i??"",autoNudge:l!=="on-demand",folders:d,coordinator:c==="true"}}function _2(e,t){let{peer_site:n,team:r,alias:s}=e;if(!n||!r||!s)return process.stderr.write(`teams-conf: skipping malformed remote _TEAM_ line (missing peer_site/team/alias): ${t}
|
|
138
138
|
`),null;for(let[o,i]of[["peer_site",n],["team",r],["alias",s]])try{Ci(i,o)}catch(a){return process.stderr.write(`teams-conf: skipping remote _TEAM_ line -- ${a instanceof Error?a.message:String(a)}: ${t}
|
|
139
139
|
`),null}return{channel:"lmmail",name:r,peerSite:n,alias:s}}var g2=/^(`{3,}|~{3,})/;function e_(e){let t=[],n=null;for(let r of e.split(/\r?\n/)){let s=r.trim(),o=g2.exec(s);if(o){let a=o[1];n===null?n={char:a[0],len:a.length}:a[0]===n.char&&a.length>=n.len&&s.slice(a.length).trim()===""&&(n=null);continue}if(n!==null||!m2.test(s))continue;let i=h2(s);i&&t.push(i)}return t}function Eb(e){return e.toLowerCase().endsWith(".md")}function E2(e,t){let n=new Set,r=[];for(let s of[e,...t])if(!(!s||n.has(s))&&(n.add(s),!!Zh(s))){try{if(!f2(s).isFile())continue}catch{continue}r.push(s)}return r}function y2(e,t=[]){let n=E2(e,t),r=new Map,s=o=>{try{return yb(o,"utf8")}catch{return null}};for(let o of n){if(!Eb(o))continue;let i=s(o);if(i!==null)for(let a of e_(i))r.has(a.name)||r.set(a.name,a)}for(let o of n){if(Eb(o))continue;let i=s(o);if(i!==null)for(let a of Oc(i))r.has(a.name)||r.set(a.name,a)}return[...r.values()]}function nd(e,t,n){e.prepare(`INSERT INTO sources(path, label, added_ts) VALUES (?, ?, ?)
|
|
140
|
-
ON CONFLICT(path) DO UPDATE SET label = excluded.label`).run(t,n,new Date().toISOString())}function t_(e){return e.prepare("SELECT * FROM sources ORDER BY id").all()}function rd(e,t){e.prepare("DELETE FROM sources WHERE path = ?").run(t)}function w2(e){let t=ed(e);return Zh(t)?d2(t):null}function se(e){let t=w2(gb(e.repoPath,`${e.name}.lmctl`));if(t)return t;throw Zh(e.repoPath)?new Error(`resolveTeamfilePath: cannot resolve a teamfile for team "${e.name}" -- expected "${gb(e.repoPath,`${e.name}.lmctl`)}" to exist. teams.conf has no explicit teamfile-path column -- fix by naming the teamfile "<name>.lmctl" under repo_path.`):new Error(`resolveTeamfilePath: repo_path "${e.repoPath}" for team "${e.name}" does not exist`)}var T2=/^
|
|
140
|
+
ON CONFLICT(path) DO UPDATE SET label = excluded.label`).run(t,n,new Date().toISOString())}function t_(e){return e.prepare("SELECT * FROM sources ORDER BY id").all()}function rd(e,t){e.prepare("DELETE FROM sources WHERE path = ?").run(t)}function w2(e){let t=ed(e);return Zh(t)?d2(t):null}function se(e){let t=w2(gb(e.repoPath,`${e.name}.lmctl`));if(t)return t;throw Zh(e.repoPath)?new Error(`resolveTeamfilePath: cannot resolve a teamfile for team "${e.name}" -- expected "${gb(e.repoPath,`${e.name}.lmctl`)}" to exist. teams.conf has no explicit teamfile-path column -- fix by naming the teamfile "<name>.lmctl" under repo_path.`):new Error(`resolveTeamfilePath: repo_path "${e.repoPath}" for team "${e.name}" does not exist`)}var T2=/^_(?:MEMBER|AGENT)_(\s|$)/,v2=/(\w+)=(?:"([^"]*)"|([\S]*))/g;function Tr(e,t){return r_(e).find(n=>n.alias===t)?.provider??null}function n_(e){return r_(e).filter(t=>t.sessionid!==void 0&&t.sessionid.length>0).length}function jo(e){return r_(e).filter(t=>t.alias!==void 0).map(t=>({alias:t.alias,provider:t.provider??null}))}function r_(e){let t;try{t=yb(se(e),"utf8")}catch{return[]}let n=[];for(let r of t.split(`
|
|
141
141
|
`)){if(!T2.test(r.trim()))continue;let s={};for(let o of r.matchAll(v2)){let i=o[1];s[i]=o[2]!==void 0?o[2]:o[3]}n.push({alias:s.alias,provider:s.provider,sessionid:s.sessionid})}return n}function Cs(e,t){let n=t_(e).map(r=>r.path);return y2(t,n)}function Di(e){if(typeof e!="string")return null;let t=e.lastIndexOf(":");if(t===-1)return null;let n=e.slice(0,t),r=e.slice(t+1);return!n||!r?null:{teamfilePath:n,alias:r}}function $i(e,t){let n=Di(t);if(n===null||n.alias!==e.leadAlias)return!1;let r;try{r=se(e)}catch{return!1}return r===n.teamfilePath}function It(e,t){return t.running.some(n=>$i(e,n.target))}function Tb(e,t,n){return n.running.some(r=>{let s=Di(r.target);return s!==null&&s.alias===t&&s.teamfilePath===e})}function S2(e,t,n){let r=new Set(e.filter(u=>It(u,t)).map(u=>u.name)),s=new Set(n??[]),o=n===null,i=[...s].filter(u=>!r.has(u)).sort(),a=[...r].filter(u=>!s.has(u)).sort(),c=o||i.length>0,l=o?"first-run":i.length>0?`active->other: ${i.join(", ")}`:"nochange";return{first:o,active:[...r].sort(),wentIdle:i,newlyActive:a,wake:c,why:l}}function sd(e){let t=e.prepare("SELECT v FROM kv WHERE k = ?").get("active");return t?JSON.parse(t.v):null}function b2(e,t){e.prepare("INSERT INTO kv(k, v) VALUES ('active', ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(JSON.stringify(t))}function od(e,t,n){let r=S2(t,n,sd(e));return b2(e,r.active),r}import{randomUUID as lA}from"node:crypto";import{existsSync as uA,mkdirSync as U2,readFileSync as _d,rmSync as F2,writeFileSync as dA}from"node:fs";import{homedir as j2}from"node:os";import{join as fA,resolve as cA,sep as H2}from"node:path";var Hpe=64*1024;import{readFileSync as id,writeFileSync as I2}from"node:fs";function k2(e,t){return e.prepare("UPDATE queue SET status = 'sent', sent_ts = ? WHERE id = ? AND status = 'pending'").run(new Date().toISOString(),t).changes>0}function vb(e,t){let n=[],r=new Map;for(let o of t){if(o.dedupe_key!==null){n.push(o);continue}let i=JSON.stringify([o.from_id,o.to_id,o.escalation_only,o.to_alias]),a=r.get(i);a?a.push(o):r.set(i,[o])}let s=[...n];for(let o of r.values()){if(o.length===1){s.push(o[0]);continue}let[i,...a]=o,c;try{c=id(i.prompt_file,"utf8")}catch{s.push(...o);continue}let l=[],u=!0;for(let d of a)try{l.push(`
|
|
142
142
|
|
|
143
143
|
--- addendum, ${d.created_ts} ---
|
|
@@ -2019,7 +2019,7 @@ ${nt(m,{provider:"dsh"})}`:"(no output captured)")))},Zx);s.stdout?.on("data",m=
|
|
|
2019
2019
|
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 = ?
|
|
2020
2020
|
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?fe(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 u=bl(l.timestamp),d=l.content??"";if(l.role==="user"){d&&l._compressed_summary!==1&&l.display_kind!=="hidden"&&i.push(d),d.length>0&&(a||(a=fe(d,80)),c=fe(d,80)),o.push({role:"user",timestamp:u,content:d||"(empty)"});continue}if(l.role==="tool"){o.push({role:"tool_result",timestamp:u,content:d,toolCallId:Tn(l.tool_call_id),toolName:Tn(l.tool_name)});continue}d.length>0&&o.push({role:"assistant",timestamp:u,content:d,model:Tn(r.model),stopReason:Tn(l.finish_reason)});for(let f of z5(l.tool_calls)){let m=Q5(f.function?.arguments);o.push({role:"tool_use",timestamp:u,content:Tn(f.function?.name)??"tool_call",toolName:Tn(f.function?.name),toolCallId:Tn(f.call_id)??Tn(f.id),toolInput:typeof f.function?.arguments=="string"?f.function.arguments:JSON.stringify(f.function?.arguments??{}),toolInputData:Wn(m)})}}return{provider:this.name,sessionId:r.id,slug:Tn(r.title),cwd:iL(r),createdAt:bl(r.started_at),modifiedAt:bl(r.last_activity_at??r.started_at),model:Tn(r.model),startCommand:this.name,firstUserMessage:a,lastUserMessage:c,messageCount:r.message_count??o.length,filePath:this.dbPath,...aL(r),messages:o,userPrompts:i}}catch(r){return re({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 z5(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function Q5(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 aL(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 e8=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function t8(e){return e8.test(e)}var n8="dont_ask";function lL(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 n8}function WE(e){return new BE(e)}var BE=class extends He{hermesProvider;hermesHome;constructor(t){let n=new om(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)=>nr(r,{...s,requireResume:s.requireResume??!!s.sessionId,env:{...s.env??process.env,HERMES_HOME:this.hermesHome},acpTool:"hermes",acpMode:lL(s.permissionMode)})}),this.hermesProvider=n,this.hermesHome=qE(t)}async openSession(t){return Or({...t,env:{...t.env??process.env,HERMES_HOME:this.hermesHome},binary:"hermes",acpTool:"hermes",acpMode:lL(t.permissionMode)})}get stateDbPath(){return this.hermesProvider.stateDbPath}async seed(t,n){await Z5(t,{recursive:!0});let r=[];if(n?.effort){let o="hermes has no ACP-level effort surface";re({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??Ae,{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 t8(s.sessionId)?(r.push(...s.warnings??[]),{success:!0,sessionId:s.sessionId,usage:s.usage,...r.length>0?{warnings:r}:{}}):(re({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 uL,rm as r8,stat as s8}from"node:fs/promises";import{join as GE}from"node:path";var im=class{name="pi";baseDir;constructor(t={}){this.baseDir=t.piDir||GE(ye,".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 uL(this.baseDir)}catch{return[]}let n=[];for(let r of t){let s=GE(this.baseDir,r);try{if(!(await s8(s)).isDirectory())continue;for(let o of await uL(s))o.endsWith(".jsonl")&&n.push(GE(s,o))}catch{}}return n}async readHeader(t){for await(let n of Qe(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,u=0,d=0,f=0,m=0,p;for await(let h of Qe(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=XE(_).trim();g&&(o||(o=fe(g,80)),i=fe(g,80)),a++}else if(_.role==="assistant"){a++;let g=_.usage;g&&(c+=g.input??0,l+=g.cacheRead??0,u+=g.cacheWrite??0,d+=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:u,totalOutputTokens:d,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 Qe(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:XE(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:dL(l.arguments),toolName:l.name??"tool",toolInput:dL(l.arguments),toolInputData:l.arguments,toolCallId:l.id});else a.role==="toolResult"&&s.push({role:"tool_result",timestamp:c,content:XE(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 r8(n,{force:!0}),!0):!1}};function XE(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 dL(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}function JE(e){return new VE(e)}var VE=class extends He{constructor(t){super({provider:new im(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",Ae],resumeTemplate:"pi --session {{session_id}}",startTemplate:"pi",transport:o8})}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}`}}},o8=em({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)=>Rt("pi",e,t.permissionMode??"yolo")});import{createHash as i8}from"node:crypto";import{existsSync as a8,mkdirSync as KE,readFileSync as c8,renameSync as l8,rmdirSync as yL,statSync as u8,writeFileSync as d8}from"node:fs";import{dirname as ey,join as fL,resolve as YE}from"node:path";var va=new Map;function f8(e){return i8("sha256").update(e).digest("hex").slice(0,8)}function m8(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function p8(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 wL(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function am(e){return Math.max(1,Math.ceil(e.length/4))}function Sa(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return YE(t);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?fL(ey(YE(n)),".lmctl-claude-mock","sessions.json"):fL(YE(e),".lmctl-claude-mock","sessions.json")}function mL(){return{schemaVersion:1,sessions:{}}}function Al(e){if(!a8(e))return mL();try{let t=JSON.parse(c8(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=zE(t.defaultDelayMs);return{schemaVersion:1,sessions:n,...o!==void 0?{defaultDelayMs:o}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return mL()}}function TL(e,t){KE(ey(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;d8(n,`${JSON.stringify(t,null,2)}
|
|
2021
2021
|
`,"utf8"),l8(n,e)}var h8=5e3,_8=15,pL=1e4;function g8(e){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}function E8(e){let t=`${e}.lock`;KE(ey(e),{recursive:!0});let n=Date.now()+pL;for(;;)try{return KE(t),t}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-u8(t).mtimeMs>h8){try{yL(t)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${pL}ms: ${t}`);g8(_8)}}function y8(e){try{yL(e)}catch{}}function vL(e,t){let n=E8(e);try{return t()}finally{y8(n)}}function w8(e){return{...e,timestamp:e.timestamp.toISOString()}}function T8(e){return{...e,timestamp:new Date(e.timestamp)}}function v8(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(w8)}}function SL(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(T8)}}function cm(e,t=process.cwd()){let n=va.get(e);if(n!==void 0)return n;let s=Al(Sa(t)).sessions[e];if(s===void 0)return;let o=SL(s);return va.set(o.sessionId,o),o}function hL(e){va.set(e.sessionId,e);let t=Sa(e.cwd);vL(t,()=>{let n=Al(t);n.sessions[e.sessionId]=v8({...e,filePath:t}),TL(t,n)})}function S8(e,t=process.cwd()){let n=Sa(t);return vL(n,()=>{let r=Al(n),s=r.sessions[e]!==void 0;return s&&(delete r.sessions[e],TL(n,r)),s})}function b8(){let e=Al(Sa()),t=Object.values(e.sessions).map(SL);for(let n of t)va.set(n.sessionId,n);return t}function zE(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function _L(e){if(typeof e=="string")return{kind:"success",text:e};if(e!==void 0&&typeof e.text=="string"&&typeof e.error!="string"){let t=zE(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=zE(e.delayMs);return{kind:"error",error:e.error,...t!==void 0?{delayMs:t}:{}}}}async function gL(e){e!==void 0&&e>0&&await new Promise(t=>setTimeout(t,e))}function A8(e,t){let{script:n,scriptContains:r}=t;if(n!==void 0){let s=_L(n[e]??n[wL(e)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(e.includes(s)){let o=_L(r[s]);if(o!==void 0)return o}}}function EL(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 QE=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let n of b8())t.set(n.sessionId,n);for(let n of va.values())t.set(n.sessionId,n);return[...t.values()].map(EL)}async loadSession(t){let n=cm(t);return n===void 0?null:{...EL(n),messages:n.messages.slice()}}async resolveSessionPath(t){return cm(t)?.filePath??null}async deleteSession(t){let n=va.delete(t),r=S8(t);return n||r}},ZE=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new QE;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=m8(p8(t,n)),s=`mock-${r}-${f8(`${t}:${r}`)}`,o=new Date,i=Sa(t),a=cm(s,t),c=n?.prompt??"ClaudeMock seed",l=am(c),u={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 u.messages.push({role:"user",timestamp:o,content:c}),u.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),u.totalInputTokens+=l,u.totalOutputTokens+=am("ACK: ClaudeMock seeded"),hL(u),{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=cm(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let o=new Date,i=Al(Sa(n.cwd)),a=A8(t,i),c=a?.delayMs??i.defaultDelayMs;if(a?.kind==="error")throw await gL(c),new Error(a.error);let l=a?.kind==="success"?a.text:`ClaudeMock ack: ${wL(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+=am(t),s.totalOutputTokens+=am(l),hL(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await gL(c),{text:l,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}};function ty(){return new ZE}function lo(e){let t=[Xg({museDataHome:e?.museDataHome}),oE({miniplayerHome:e?.miniplayerHome}),aE({claudeDir:e?.claudeDir}),dE({codexDir:e?.codexDir,codeDir:e?.codeDir}),hE({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),EE({copilotDir:e?.copilotDir}),wE({dbPaths:e?.opencodeDbPaths}),bE({kimiHome:e?.kimiHome}),IE({lmplayerDbPath:e?.lmplayerDbPath,lmplayerDbPaths:e?.lmplayerDbPaths}),RE({qwenDir:e?.qwenDir}),LE({agyDir:e?.agyDir}),jE({dshHome:e?.dshHome}),WE({hermesHome:e?.hermesHome}),JE({piDir:e?.piDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(ty()),t}var ny=null;function bL(){return ny===null&&(ny=to(lo())),ny}function AL(e,t){pf(t);let n=e.getAdapter(t);if(!n)throw new Error(`provider "${t}" is not registered in this registry`);return n}async function IL(e){let t=e.registry??bL(),n=AL(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 Lg(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 kL(e){return Lg(AL(e.registry??bL(),e.provider),e)}import{join as Gt}from"node:path";var RL=new WeakMap;function Il(e){let t=RL.get(e);if(t)return t;let n=e.env.HOME;if(!n)return to(lo());let r=e.env.XDG_DATA_HOME||Gt(n,".local/share"),s=e.env.XDG_CONFIG_HOME||Gt(n,".config");return t=to(lo({museDataHome:r,miniplayerHome:e.env.MINIPLAYER_HOME||Gt(r,"miniplayer"),claudeDir:Gt(n,".claude"),codexDir:Gt(n,".codex"),codeDir:Gt(n,".code"),geminiDir:Gt(n,".gemini"),copilotDir:Gt(n,".copilot"),qwenDir:Gt(n,".qwen"),opencodeDbPaths:[Gt(r,"opencode/opencode.db"),Gt(s,"opencode/opencode.db")],agyDir:Gt(n,".gemini/antigravity-cli"),dshHome:Gt(n,".dsh"),hermesHome:e.env.HERMES_HOME??Gt(n,".hermes"),kimiHome:e.env.KIMI_CODE_HOME??Gt(n,".kimi-code"),piDir:Gt(n,".pi/agent/sessions"),lmplayerDbPaths:tE(e.env,n)})),RL.set(e,t),t}var fo=e=>{if(e&&typeof e=="object"){for(let t of Object.values(e))fo(t);Object.freeze(e)}return e},dke=fo(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),fke=fo({status:"string",error:"string|null",code:"ErrorCode?"}),mke=fo(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),pke=fo(["Provider1.Provider","Provider1.Model1","Provider2.Provider","Provider2.Model1","Provider3.Provider","Provider3.Model1"]),hke=fo(["Provider1","Provider2","Provider3"]),_ke=fo({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),Pe={name:"ctx",type:"context"},ry={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},Mr={name:"teamfile",type:"string"},lm={name:"alias",type:"string"},uo={name:"prompt",type:"string"},um={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"}]},fm=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],ba={name:"options",type:"map",optional:!0,keys:fm},NL={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},xL={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},LL={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},Aa={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},dm={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"}]},I8=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"},{name:"reconcile",type:"boolean"}],CL={name:"options",type:"map",optional:!0,keys:I8},OL={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},k8=fo([{name:"resolveProfilePath",implemented:!0,params:[Pe,ry],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[Pe,ry],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:[Pe,{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:[Pe,Mr],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[Mr]}},{name:"resolveMember",implemented:!0,params:[Pe,Mr,lm],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:[Mr,lm]}},{name:"lintTeam",implemented:!0,params:[Pe,Mr],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:[Mr]}},{name:"seedTeam",implemented:!0,params:[Pe,Mr,NL],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:[Mr,NL]}},{name:"promptAgent",implemented:!0,params:[Pe,um,uo,ba],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...OL,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[um,uo,ba]}},{name:"promptMember",implemented:!0,params:[Pe,{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"},...fm]}],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:[Mr,lm,uo,{name:"options",type:"map",optional:!0,keys:[...fm,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[Pe,{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:[Pe,Aa,LL],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:[um,{...LL,optional:!0}]}},{name:"getSession",implemented:!0,params:[Pe,Aa],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:[Aa]}},{name:"reserveSession",implemented:!0,params:[Pe,Aa],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:[Pe,Aa,{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:[Pe,{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"},...fm]}],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:[Pe,{name:"batch",type:"BatchRef"},uo,{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:[Pe,{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:[Pe,xL],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:[xL]}},{name:"openTerminal",implemented:!0,params:[Pe,{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:[Mr,lm]}},{name:"sessionAdmission",implemented:!0,params:[Pe,Aa],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:[Pe,{name:"reservation",type:"SessionReservation"},um,uo,ba],statuses:["ok","busy","stalled","empty","error"],results:{...OL,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[Pe,{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:[Pe,{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:[Pe,{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"}]},ba],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:[Pe,{name:"session",type:"NativeSessionRef"},uo],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:[Pe,{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:[Pe,{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:[Pe,dm,uo,ba],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:[dm,uo,ba]}},{name:"nativeSessionClose",implemented:!0,params:[Pe,dm],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:[dm]}},{name:"loadProperties",implemented:!0,params:[Pe,ry],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:[Pe,CL],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:[CL]}}]);function sy(e){if(!MR(e))return Ge("invalid_argument","Expected a context created by createLmctlContext");if(e.closed)return Ge("cancelled","Context is closed")}function DL(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 N8,writeFileSync as kke,renameSync as Rke,existsSync as x8}from"node:fs";import{basename as L8,resolve as pm,dirname as oy}from"node:path";var mm=["title","description","members"],R8=new Set(mm),Pr=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}};function $L(e){if(e.length===0||!e.startsWith("---"))throw new Pr("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
|
|
2022
|
-
`);if(t[0]!=="---")throw new Pr("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 Pr(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let l=c[1],u=c[2].trim();if(!R8.has(l))throw new Pr(`unknown frontmatter key "${l}" \u2014 allowed keys: ${mm.join(", ")}`);n[l]=u}if(r===-1)throw new Pr("frontmatter not closed (missing trailing `---` on its own line)");for(let i of mm)if(n[i]===void 0)throw new Pr(`missing required frontmatter key "${i}" \u2014 required: ${mm.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 C8="Lead";function O8(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 D8(e){return/^\s*
|
|
2022
|
+
`);if(t[0]!=="---")throw new Pr("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 Pr(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let l=c[1],u=c[2].trim();if(!R8.has(l))throw new Pr(`unknown frontmatter key "${l}" \u2014 allowed keys: ${mm.join(", ")}`);n[l]=u}if(r===-1)throw new Pr("frontmatter not closed (missing trailing `---` on its own line)");for(let i of mm)if(n[i]===void 0)throw new Pr(`missing required frontmatter key "${i}" \u2014 required: ${mm.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 C8="Lead";function O8(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 D8(e){return/^\s*_(?:MEMBER|AGENT)_\s+\S/.test(e)}function $8(e){return/^\s*_SESSION_\s+\S/.test(e)}function M8(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function iy(e){return/\.(?:lmctl|lmc)$/i.test(e)}function ay(e){return L8(e).replace(/\.(?:lmctl|lmc)$/i,"")}function cy(e){let t=N8(e,"utf-8"),n=oy(pm(e)),r=ly(t,ay(e),{baseDir:n,sourcePath:pm(e)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=pm(n,s.sessiondir));return r}var ML=["alias","provider","sessionid","sessiondir","teamfile","model","effort"];function ly(e,t,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let o=e;if(o.startsWith("#teamfile:")){let c=o.indexOf(`
|
|
2023
2023
|
`);o=c>=0?o.slice(c+1):""}let i=null;if(o.startsWith("---"))try{i=$L(o)}catch(c){if(c instanceof Pr)s.push(`frontmatter: ${c.message}`);else throw c}let a=e.split(`
|
|
2024
2024
|
`);for(let c=0;c<a.length;c++){let l=a[c],u=c+1;if($8(l))throw new Error(`line ${u}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${l.trim()})`);if(M8(l)||!D8(l))continue;let d=O8(l);for(let m of Object.keys(d))if(!ML.includes(m))throw new Error(`line ${u}: unknown key "${m}" on _MEMBER_ line: ${l.trim()}
|
|
2025
2025
|
allowed keys: ${ML.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${l.trim()}`);continue}if(!d.alias){s.push(`line ${u}: member line missing required alias: ${l.trim()}`);continue}let f={alias:d.alias,provider:d.provider||"",extra:{}};d.sessionid&&(f.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(f.sessiondir=d.sessiondir),d.teamfile&&(f.teamfile=d.teamfile),d.model&&(f.model=d.model),d.effort&&(f.effort=d.effort),r.push(f)}return{name:t,members:r,rawText:e,parseErrors:s,frontmatter:i}}function uy(e){return e.members.find(t=>t.alias.toLowerCase()===C8.toLowerCase())}function dy(e,t,n,r={}){let s=r.requireSession??!0;if(!e.teamfile)throw new Error(`Member "${e.alias}" is not a team reference`);let o=pm(t,e.teamfile),i=n??new Set;if(i.has(o))throw new Error(`Circular team reference: ${e.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!x8(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${e.alias}")`);let a=cy(o),c=uy(a);if(!c)throw new Error(`Team at ${o} has no lead session`);if(c.teamfile)return dy(c,oy(o),i,r);if(s&&!c.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:c.provider,session:c.session??"",sessiondir:c.sessiondir||oy(o),alias:e.alias,resolvedFrom:o,model:c.model,effort:c.effort}}function PL(e,t){return e.members.find(n=>n.alias===t)??e.members.find(n=>n.alias.toLowerCase()===t.toLowerCase())}import{existsSync as K8}from"node:fs";import{dirname as BL}from"node:path";import{createHash as P8}from"node:crypto";import{existsSync as UL,readFileSync as FL,realpathSync as U8}from"node:fs";import{dirname as F8,resolve as jL}from"node:path";var fy=5,hm=class extends Error{constructor(t){super(t),this.name="ForeignSessionidOwnershipError"}};function ps(e,t){let n=jL(e);if(UL(n))return U8(n);if(t!==void 0){let r=H8(e,n,t);if(r!==null)return r}return n}function HL(e,t){let n=F8(t),r=ly(e,ay(t),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=jL(n,s.sessiondir));return r}function Ia(e,t,n=r=>{process.stderr.write(`warning: ${r}
|
|
@@ -2249,7 +2249,7 @@ ${t.join(`
|
|
|
2249
2249
|
) AS found`).get(t,n,a,i,i).found===1}function d$(e){return`unknown:${e}`}async function f$(e,t,n,r,s=Re,o=Date.now(),i=Ma){if(!r.some(l=>l.name===n))return[];let a;function c(){return a??=i(),a}try{return await Pte(e,t,n,r,s,o,c)}finally{a!==void 0&&a.close()}}async function Pte(e,t,n,r,s,o,i){let a=new Map(r.map(u=>[u.name,u])),c=new Set(kt(e,n).map(u=>u.subject_id).filter(u=>u!==null)),l=[];for(let u of t){if(u===n||c.has(d$(u))||c.has(u))continue;let d=me(e,u),f=d?.surfaced_ts?Date.parse(d.surfaced_ts):null;if(f!==null&&o-f<=s.cooldownMs)continue;let m=a.get(u);if(m?.repoPath!==void 0&&m?.leadAlias!==void 0){let y;try{y=se({name:u,repoPath:m.repoPath})}catch{y=""}if(y!==""&&u$(i(),y,m.leadAlias,s.idleThresholdMs,o))continue}let p=a.get(u),h=p?.repoPath!==void 0&&p?.leadAlias!==void 0,_=h?R_(e,{name:u,repoPath:p.repoPath,leadAlias:p.leadAlias}):At(e,u)===null,g=d===null||d.progress_status==="ACTIVE",w=!_&&h&&g&&I_(e,{name:u,repoPath:p.repoPath,leadAlias:p.leadAlias},s.idleThresholdMs,o);if(!_&&!w)continue;let E=_?`[status-engine] Team "${u}" is registered but has never been dispatched to -- needs S1 prep / a first dispatch, not a "no progress" investigation.`:`[status-engine] Team "${u}" has an in-progress lmtasks entity with no recent activity for over ${Math.round(s.idleThresholdMs/6e4)} minutes, though its own file-scan progress does not itself show stalled evidence (no scan yet, or last reported ACTIVE). This is OBJECTIVE lmtasks-activity evidence only -- please investigate (\`lmauto oversee ${u}\`) and either re-prep/re-dispatch it or confirm it is truly done.`;Oe(e,r,n,E,{from:"autopilot",subject:d$(u)}),qS(e,u,new Date().toISOString()),l.push(u)}return l}import{execFile as Ute}from"node:child_process";import{promisify as Fte}from"node:util";function cu(e){switch(e.kind){case"provider_disabled":return`provider ${e.provider} disabled (no dispatch attempted)`;case"parked":return"parked, confirmed done (no dispatch attempted)";case"presence_gated":return"a session is currently held (actively observed right now)";case"auto_nudge_disabled":return"auto-nudge disabled for this team (on-demand)";case"fleet_scan_paused":return"fleet-wide auto-scan paused";case"provider_exhausted_backoff":return`provider ${e.provider} in quota backoff (no dispatch attempted)`;case"no_continuous_observer":return"nothing has classified this team since (no continuous observer)"}}function Sp(e,t,n,r,s={}){let o=s.resolveMemberProviderImpl??Tr,i=s.checkProviderDisabledImpl??tn,a=s.isProviderExhaustedImpl??gp,c=s.allLocalTeams??[t],l=Jn(e,t.name),u=l===null?t.name:l.companionTeam,d=l===null?t.leadAlias:l.workerAlias,f=l===null?t.repoPath:c.find(p=>p.name===u)?.repoPath??t.repoPath,m=o({repoPath:f,name:u},d);if(m!==null&&i(e,m,r).disabled)return{kind:"provider_disabled",provider:m};if(me(e,t.name)?.confirmed_done_ts)return{kind:"parked"};if(It(t,n))return{kind:"presence_gated"};if(!t.autoNudge)return{kind:"auto_nudge_disabled"};if(yo(e)!==null)return{kind:"fleet_scan_paused"};try{let p=`${se(t)}:${t.leadAlias}`;if(a(n,p))return{kind:"provider_exhausted_backoff",provider:o(t,t.leadAlias)??"unknown"}}catch{}return{kind:"no_continuous_observer"}}var m$=Fte(Ute),jte=new Set(["ENV-ERROR","NO-OUTPUT"]),Hte=24*60*6e4,qte=3;async function lu(e,t,n=m$){try{return await n("lmctl",["tail",e,t,"--lines","1"],{timeout:1e4}),{sessionResolves:!0,provider:null,detail:"dispatch completes, session resolves; cause unknown"}}catch(r){let s=r&&typeof r=="object"&&"stderr"in r?String(r.stderr).trim():"",o=/session not found/i.test(s),i=/provider=([\w.-]+)/.exec(s);return{sessionResolves:!o,provider:o?i?.[1]??null:null,detail:s.length>0?s:"lmctl tail failed with no output"}}}async function p$(e,t,n,r,s,o={}){let i=o.execImpl??m$,a=o.whyNotObservedImpl??Sp,c=o.flappingWindowMs??Hte,l=o.flappingOccurrenceThreshold??qte,u=o.listRecentEventsByStatusImpl??Ku,d=[],f=[];for(let m of t){let p=jS(e,m.name);if(p.kind==="never-observed")continue;let h=a(e,m,n,r,o.whyNotObservedOptions);if(h.kind==="presence_gated")continue;let{value:_,observedAt:g,changedAt:w}=p,E=r-Date.parse(g),y=new Date(r-c).toISOString(),T=[...u(e,"ENV-ERROR",y,100),...u(e,"NO-OUTPUT",y,100)].filter(N=>N.team===m.name).sort((N,x)=>Date.parse(x.ts)-Date.parse(N.ts)),v=T.length>=l,A=jte.has(_.status)&&!Number.isNaN(E)&&E>=s;if(!A&&!v)continue;if(v&&!A){let N=T[0],x={kind:"flapping",team:m.name,mostRecentStatus:N.status,mostRecentAt:N.ts,occurrenceCount:T.length,windowMs:c};h.kind==="no_continuous_observer"?d.push(x):f.push({team:m.name,status:N.status,changedAt:N.ts,observedAt:g,ageMs:E,suspension:h});continue}let I=_.status;if(h.kind==="no_continuous_observer"){let N=null;if(I==="NO-OUTPUT")try{N=await lu(se(m),m.leadAlias,i)}catch{N=null}d.push({kind:"continuous",team:m.name,status:I,changedAt:w,observedAt:g,ageMs:E,cause:N})}else f.push({team:m.name,status:I,changedAt:w,observedAt:g,ageMs:E,suspension:h})}return d.sort((m,p)=>m.kind==="continuous"&&p.kind==="continuous"?p.ageMs-m.ageMs:0),f.sort((m,p)=>p.ageMs-m.ageMs),{unreachable:d,notObserved:f}}import{execFile as Bte}from"node:child_process";import{promisify as Wte}from"node:util";var Gte=Wte(Bte);async function h$(e,t=Gte){try{let{stdout:n}=await t("git",["-C",e,"status","--porcelain"],{timeout:1e4});return n.split(`
|
|
2250
2250
|
`).filter(r=>r.trim().length>0).length}catch{return null}}import{execFile as Xte}from"node:child_process";import{promisify as Vte}from"node:util";var Jte=Vte(Xte);async function g$(e,t=Jte){try{let{stderr:n}=await t("lmctl",["lint",e],{timeout:15e3});return _$(n)}catch(n){let r=n&&typeof n=="object"&&"stderr"in n?String(n.stderr):"",s=_$(r);return s.length>0?s:null}}function _$(e){return e.split(`
|
|
2251
2251
|
`).map(t=>t.trim()).filter(t=>t.startsWith("warning:")||t.startsWith("error:"))}import{existsSync as Kw}from"node:fs";function zw(e,t,n=new Set){if(t.owner_team_path!==null)return{ownerTeamPath:t.owner_team_path,ownerAlias:t.owner_alias,explicit:!0};if(t.parent_id===null||n.has(t.id))return null;n.add(t.id);let r=mn(e,t.parent_id);if(r===null)return null;let s=zw(e,r,n);return s===null?null:{...s,explicit:!1}}function bp(e,t){if(t===null)return null;for(let n of e)if(Q(n))try{if(se(n)===t)return n.name}catch{continue}return null}function E$(e){return e.prepare("SELECT * FROM entities WHERE kind = 'epic' AND owner_team_path IS NULL").all().filter(n=>!kn(n.status))}function y$(e,t,n=Kw){return bp(e,t)!==null?"registered":n(t)?"on_demand":"dangling"}function w$(e,t,n={}){let r=n.existsSyncImpl??Kw,s=e.prepare("SELECT * FROM entities WHERE kind IN ('task', 'subtask')").all(),o=[];for(let i of s){if(kn(i.status))continue;let a=zw(e,i);if(a===null){o.push({entity:i,reason:i.parent_id===null?"no owner, and no parent epic to inherit from":"no owner, and its parent epic has none to inherit either"});continue}y$(t,a.ownerTeamPath,r)==="dangling"&&o.push({entity:i,reason:a.explicit?`owner "${a.ownerTeamPath}" does not resolve to any known team (no registered entry, no on-disk teamfile)`:`inherited owner "${a.ownerTeamPath}" (from its epic) does not resolve to any known team`})}return o}function T$(e){return e.prepare("SELECT * FROM entities WHERE status = 'blocked'").all().filter(n=>(pn(e,n.id,"outgoing").outgoing??[]).length===0)}function Yte(e,t){return e.prepare("SELECT 1 FROM queue WHERE to_id = ? LIMIT 1").get(t)!==void 0}function v$(e,t,n,r=Kw){let s=zw(e,n);if(s===null)return{ownerKind:"dangling",everContacted:null};let o=y$(t,s.ownerTeamPath,r);if(o==="dangling")return{ownerKind:o,everContacted:null};if(o==="on_demand")return{ownerKind:o,everContacted:!1};let i=bp(t,s.ownerTeamPath);return{ownerKind:o,everContacted:Yte(e,i)}}function b$(e,t){let n=pn(e,t,"outgoing").outgoing??[];return new Set(n.filter(r=>!kn(r.status)).map(r=>r.id))}function Ap(e,t,n=new Set){if(n.has(t))return[];n.add(t);let s=(pn(e,t,"outgoing").outgoing??[]).filter(a=>!kn(a.status)),o=[];for(let a of s)(pn(e,a.id,"outgoing").outgoing??[]).filter(u=>!kn(u.status)).length===0?o.push(at(e,a.id)):o.push(...Ap(e,a.id,n));let i=new Set;return o.filter(a=>i.has(a.id)?!1:(i.add(a.id),!0))}function Kte(e,t){let n=new Set([t]),r=(pn(e,t,"incoming").incoming??[]).map(o=>o.id),s=[];for(;r.length>0;){let o=r.pop();if(n.has(o))continue;n.add(o);let i=at(e,o);kn(i.status)||(s.push(i),r.push(...(pn(e,o,"incoming").incoming??[]).map(a=>a.id)))}return s}function S$(e){let t=e.trim().toLowerCase();return t==="todo"?0:t==="in_progress"||t==="in-progress"?1:2}function A$(e,t,n){let r=new Map;for(let o of t)for(let i of Ap(e,o.id))r.set(i.id,i);let s=[];for(let o of r.values()){let i=Kte(e,o.id),a=new Set;for(let l of i){let u=bp(n,l.owner_team_path);u!==null&&a.add(u)}let c=v$(e,n,o);s.push({entity:o,downstreamCount:i.length,downstreamTeams:[...a].sort(),ownerKind:c.ownerKind,everContacted:c.everContacted})}return s.sort((o,i)=>{if(o.downstreamTeams.length!==i.downstreamTeams.length)return i.downstreamTeams.length-o.downstreamTeams.length;if(o.downstreamCount!==i.downstreamCount)return i.downstreamCount-o.downstreamCount;let a=S$(o.entity.status)-S$(i.entity.status);return a!==0?a:o.entity.id-i.entity.id}),s}import{execFile as zte}from"node:child_process";import{readFileSync as Qte}from"node:fs";import{basename as Zte,resolve as ene}from"node:path";import{promisify as tne}from"node:util";var Qw=tne(zte),nne=[/\.env\.(example|sample|template)$/i],rne=[/\.pem$/,/\.key$/,/(^|\/)id_rsa$/,/(^|\/)id_ed25519$/,/(^|\/)id_ecdsa$/],sne=[/(^|\/)\.env(\..+)?$/,/(^|\/)\.mcp\.json$/,/(^|\/)\.netrc$/,/(^|\/)\.npmrc$/],k$=[/\b(?:api[_-]?key|app[_-]?key|secret|token|password|passwd|access[_-]?key)\b\s*[:=]\s*['"]?[A-Za-z0-9+/_.\-]{12,}/i,/\bsk-[A-Za-z0-9]{20,}\b/,/\bghp_[A-Za-z0-9]{30,}\b/,/\bAKIA[0-9A-Z]{16}\b/,/\bBearer\s+[A-Za-z0-9\-_.]{20,}/],one=[...k$,/\b_(?:authToken|auth|password)\b\s*[:=]\s*['"]?[A-Za-z0-9+/_.\-]{8,}/i,/\bmachine\s+\S+[\s\S]{0,200}?\blogin\s+\S+[\s\S]{0,200}?\bpassword\s+\S+/i,/\bAWS_SECRET_ACCESS_KEY\b\s*[:=]?\s*['"]?[A-Za-z0-9+/]{20,}/i],Ip=20*1024*1024;async function R$(e,t){try{let{stdout:n}=await t("git",["-C",e,"ls-files"],{timeout:1e4,maxBuffer:Ip});return n.split(`
|
|
2252
|
-
`).filter(r=>r.length>0)}catch{return null}}async function Zw(e,t,n){try{let{stdout:r}=await n("git",["-C",e,"show",`HEAD:${t}`],{timeout:1e4,maxBuffer:Ip});return r}catch{return null}}async function N$(e,t=Qw){let n=await R$(e,t);if(n===null)return null;let r=a=>!nne.some(c=>c.test(a)),s=n.filter(a=>rne.some(c=>c.test(a))&&r(a)),o=n.filter(a=>sne.some(c=>c.test(a))&&r(a)),i=[];for(let a of o){let c=await Zw(e,a,t);c!==null&&one.some(l=>l.test(c))&&i.push(a)}return[...s,...i]}async function x$(e,t=Qw){let n=await R$(e,t);if(n===null)return null;let r=n.filter(o=>o.endsWith(".lmctl")),s=[];for(let o of r){let i=await Zw(e,o,t);if(i===null)continue;let a=k$.reduce((c,l)=>c+(l.test(i)?1:0),0);a>0&&s.push({path:o,matchCount:a})}return s}var ine=[/(^|\/)template\.lmctl$/i,/(^|\/)examples\/.*\.lmctl$/i],I$=/
|
|
2252
|
+
`).filter(r=>r.length>0)}catch{return null}}async function Zw(e,t,n){try{let{stdout:r}=await n("git",["-C",e,"show",`HEAD:${t}`],{timeout:1e4,maxBuffer:Ip});return r}catch{return null}}async function N$(e,t=Qw){let n=await R$(e,t);if(n===null)return null;let r=a=>!nne.some(c=>c.test(a)),s=n.filter(a=>rne.some(c=>c.test(a))&&r(a)),o=n.filter(a=>sne.some(c=>c.test(a))&&r(a)),i=[];for(let a of o){let c=await Zw(e,a,t);c!==null&&one.some(l=>l.test(c))&&i.push(a)}return[...s,...i]}async function x$(e,t=Qw){let n=await R$(e,t);if(n===null)return null;let r=n.filter(o=>o.endsWith(".lmctl")),s=[];for(let o of r){let i=await Zw(e,o,t);if(i===null)continue;let a=k$.reduce((c,l)=>c+(l.test(i)?1:0),0);a>0&&s.push({path:o,matchCount:a})}return s}var ine=[/(^|\/)template\.lmctl$/i,/(^|\/)examples\/.*\.lmctl$/i],I$=/_(?:MEMBER|AGENT)_\b|\bsessionid\s*=\s*\S/;async function L$(e,t=Qw){try{let[n,r]=await Promise.all([t("git",["-C",e,"ls-files"],{timeout:1e4,maxBuffer:Ip}),t("git",["-C",e,"ls-files","--others","--exclude-standard"],{timeout:1e4,maxBuffer:Ip})]),s=u=>!ine.some(d=>d.test(u)),o=u=>Zte(u).includes(".lmctl")&&s(u),i=n.stdout.split(`
|
|
2253
2253
|
`).filter(u=>u.length>0&&o(u)),a=r.stdout.split(`
|
|
2254
2254
|
`).filter(u=>u.length>0&&o(u)),c=[];for(let u of i){let d=await Zw(e,u,t);d!==null&&I$.test(d)&&c.push(u)}let l=[];for(let u of a){let d;try{d=Qte(ene(e,u),"utf8")}catch{continue}I$.test(d)&&l.push(u)}return{tracked:c,unprotected:l}}catch{return null}}import{execFile as ane}from"node:child_process";import{statSync as C$}from"node:fs";import{homedir as cne}from"node:os";import{join as O$}from"node:path";import{promisify as lne}from"node:util";var eT=lne(ane);var une="mike.ma@lmctl.com",tT="mike-lmctl";async function D$(e,t=eT){let n,r;try{n=(await t("git",["-C",e,"config","user.name"],{timeout:1e4})).stdout.trim()||null}catch{n=null}try{r=(await t("git",["-C",e,"config","user.email"],{timeout:1e4})).stdout.trim()||null}catch{r=null}return n===null&&r===null?null:{name:n,email:r,matchesPolicy:r===une}}var dne=6e4,kp;async function Rp(e=eT,t=Date.now(),n=C$){let r=e===eT&&n===C$;if(r&&kp!==void 0&&t-kp.atMs<dne)return kp.result;let s=await mne(e,n);return r&&(kp={result:s,atMs:t}),s}function fne(){let e=process.env.GH_CONFIG_DIR;return e?O$(e,"hosts.yml"):O$(cne(),".config","gh","hosts.yml")}async function mne(e,t){let n;try{n=(await e("gh",["auth","status"],{timeout:1e4})).stdout}catch(l){let u=l&&typeof l=="object"&&"stdout"in l?String(l.stdout):"";if(u.length===0)return null;n=u}let r=n.split(`
|
|
2255
2255
|
`),s=r.findIndex(l=>/Active account: true/.test(l));if(s===-1)return null;let a=r.slice(0,s).reverse().find(l=>/Logged in to .* account /.test(l))?.match(/account\s+(\S+)/)?.[1]??null;if(a===null)return null;let c;try{c=t(fne()).mtime.toISOString()}catch{c=null}return{account:a,matchesPolicy:a===tT,hostsFileChangedAt:c}}var pne=7*24*60*6e4,hne=500,_ne=3*60*6e4,gne=3*60*6e4,uu=4*60*6e4,Ene=24*60*6e4,yne=48*60*6e4,wne=24*60*6e4,Tne=20,rT=24*60*6e4;function vne(e,t){let n=Se(t);return`${t>rT?`possible ${e}`:e} as of ${n} ago (not re-observed)`}var Sne=7*24*60*6e4,bne=24*60*6e4;function Ane(e,t,n,r,s){if(e?.confirmed_done_ts)return{kind:"confirmed-done",confirmedDoneTs:e.confirmed_done_ts};if(n!==null){let i=r-Date.parse(n);if(Number.isFinite(i)&&i<=bne)return null}else return s!==void 0&&n_(s)===0?{kind:"unseeded"}:{kind:"never-active"};if(t===null)return{kind:"no-state"};if(t.status!=="ACTIVE")return{kind:"self-report",status:t.status,changedTs:t.changed_ts};let o=r-Date.parse(t.changed_ts);return!Number.isFinite(o)||o>Sne?{kind:"self-report",status:t.status,changedTs:t.changed_ts}:null}function Ine(e,t){let n=e.teams.filter(Q);return t===void 0?n:n.filter(r=>r.name===t)}function kne(e,t,n){let r=n(e);if(r.length===0)return null;let s=[],o=[];for(let i of r)i.provider!==null&&t.has(i.provider)?s.push({alias:i.alias,provider:i.provider}):o.push({alias:i.alias,provider:i.provider});return{totalMembers:r.length,quiescedMembers:s,liveMembers:o}}async function Np(e,t={}){let n=e.db.db,r=t.config??Re,s=t.nowMs??Date.now(),o=Ine(e,t.team),i=t.awaitingReviewThresholdMs??b_,a=[],c=[],l=[],u=[],d=[],f=new Set(au(n,s).map(J=>J.row.subject_id).filter(J=>J!==null)),m=[],p=[],h=[],_=[],g=[],w=[],E=t.countDirtyGitFilesImpl??h$,y=[],T=t.lintTeamfileWarningsImpl??g$,v=[],A=[],I=[],N=[],x=[],R=t.findNeverTrackFilesImpl??N$,k=t.findSecretBearingTeamfilesImpl??x$,O=t.checkTeamfileTrackingImpl??L$,D=t.checkRepoGitIdentityImpl??D$,S=t.resolveMemberProviderImpl??Tr,b=t.listTeamMembersImpl??jo,L=[],$=!1;try{L=ql(n).filter(J=>tn(n,J.provider,s).disabled)}catch{$=!0}let j=ID(n,s),F=kD(n),C=null;try{C=RD(n,s)}catch{C=null}let P=new Set(L.map(J=>J.provider)),M=[],B=e.teams.filter(Q),W=e.teams.map(J=>J.name);for(let J of o){let Le;try{Le=se(J)}catch{continue}let St=await T(Le);St!==null&&St.length>0&&y.push({team:J.name,warnings:St});let ln=await R(J.repoPath);ln!==null&&ln.length>0&&v.push({team:J.name,files:ln});let xi=await k(J.repoPath);xi!==null&&xi.length>0&&A.push({team:J.name,files:xi});let _r=await O(J.repoPath);_r!==null&&(_r.tracked.length>0&&I.push({team:J.name,files:_r.tracked}),_r.unprotected.length>0&&N.push({team:J.name,files:_r.unprotected}));let Uo=await D(J.repoPath);Uo!==null&&!Uo.matchesPolicy&&x.push({team:J.name,identity:{name:Uo.name,email:Uo.email}});let gr=P.size>0?kne(J,P,b):null;if(P.size>0){let ge=Jn(n,J.name),Er=ge===null?J.name:ge.companionTeam,Ah=ge===null?J.leadAlias:ge.workerAlias,Rc=ge===null?J.repoPath:B.find(Nc=>Nc.name===Er)?.repoPath??J.repoPath,Fo=S({repoPath:Rc,name:Er},Ah);if(Fo!==null&&P.has(Fo)){let Nc=L.find(XB=>XB.provider===Fo)?.expiresAt??null;M.push({team:J.name,provider:Fo,expiresAt:Nc,totalMembers:gr?.totalMembers??1,liveMembers:gr?.liveMembers??[]})}}let Sh=Ti(n,J.name,s,W);Sh.length>0&&l.push({team:J.name,rows:Sh,...gr!==null&&gr.quiescedMembers.length>0?{quiescedMembers:gr.quiescedMembers,totalMembers:gr.totalMembers}:{}});let mS=Sh.filter(ge=>ge.row.status==="sent"||ge.row.status==="retrieved");if(mS.length>0){let ge=n.prepare("SELECT MAX(created_ts) AS ts FROM queue WHERE from_id = ?").get(J.name),Er=Ane(me(n,J.name),At(n,J.name),ge.ts,s,J);Er!==null&&d.push({team:J.name,rows:mS,reason:Er})}let pS=wp(n,J.name,uu,s);pS.length>0&&u.push({team:J.name,rows:pS});let Ns=ze(n,Le,J.leadAlias);if(Ns===null)continue;for(let ge of Bi(n,Ns)){let Er;try{let Rc=b$(n,ge.id),Fo=Ap(n,ge.id).filter(Nc=>!Rc.has(Nc.id));Fo.length>0&&(Er=Fo)}catch{Er=void 0}let Ah=vd(n,ge.id);a.push({team:J.name,entity:ge,blockedSinceTs:Ah,...Er!==void 0?{roots:Er}:{}}),ge.blocked_on==="operator"?f.has(`task:${ge.id}`)||c.push({team:J.name,entity:ge,blockedOn:"operator",reason:"operator-uncorrelated"}):ge.blocked_on!==null&&!e.teams.some(Rc=>Rc.name===ge.blocked_on)&&c.push({team:J.name,entity:ge,blockedOn:ge.blocked_on,reason:"team-unresolvable"})}for(let ge of Uc(n,Ns,r.cooldownMs,s))m.push({team:J.name,entity:ge});for(let ge of xA(n,Ns,i,s))p.push({team:J.name,task:ge});for(let ge of LA(n,Ns,s))h.push({team:J.name,task:ge});for(let ge of Ns.entities)ge.kind==="epic"&&ge.needs_review===1&&Rd(ge)&&_.push({team:J.name,entity:ge});for(let ge of Ns.entities)ge.kind!=="epic"||!qi.has(ve(ge.status))||vp(n,ge.id)?.alreadySurfacedThisEpisode||g.push({team:J.name,entity:ge});let bh=Ns.entities.filter(ge=>ve(ge.status)==="todo");if(bh.length>0){let ge=await E(J.repoPath);ge!==null&&ge>0&&w.push({team:J.name,dirtyCount:ge,todoCount:bh.length,exampleEntity:bh[0]})}}let K=await(t.fetchReportImpl??qe)(),ue=t.heavyLockImpl?t.heavyLockImpl():vn(void 0,void 0,void 0,()=>{}),X=await Wi(n,o,K,ue,r,s,{readOnly:!0}),Y=new Set(M.map(J=>J.team)),H=X.filter(J=>!Y.has(J)),V=t.findPersistentDispatchFailuresImpl??p$,{unreachable:Z,notObserved:oe}=await V(n,o,K,s,uu),ne=[];for(let J of H){let Le=me(n,J);if(Le?.miniplayer_verdict_label&&Le.miniplayer_verdict_reason&&Le.miniplayer_verdict_ts){let St=At(n,J),ln=Le.miniplayer_verdict_label!=="genuinely_done"&&St?.status==="DONE"?{changedTs:St.changed_ts}:void 0;ne.push({team:J,label:Le.miniplayer_verdict_label,reason:Le.miniplayer_verdict_reason,ts:Le.miniplayer_verdict_ts,...ln!==void 0?{selfReportedDone:ln}:{}})}}let ie=[];for(let J of o){let Le=me(n,J.name);Le?.hung_holder_flagged_ts&&Le.hung_holder_reason&&ie.push({team:J.name,reason:Le.hung_holder_reason,flaggedTs:Le.hung_holder_flagged_ts})}let de=KS(n).map(J=>({team:J.team,reason:J.reason,detail:J.detail,suspendedAt:J.suspended_at})),xe=t.blockedSelfReportUrgentThresholdMs??Ene,Ee=t.blockedSelfReportUnconfirmedThresholdMs??yne,ee=[];for(let J of o){let Le=At(n,J.name);if(Le?.status==="BLOCKED"){let St=s-Date.parse(Le.changed_ts),ln=St>=Ee;ee.push({team:J.name,changedTs:Le.changed_ts,ageMs:St,urgent:!ln&&St>=xe,unconfirmed:ln})}}ee.sort((J,Le)=>Le.ageMs-J.ageMs);let De=t.orphanReapCandidateWindowMs??pne,qt=new Date(s-De).toISOString(),hr=Ku(n,mw,qt,hne).filter(J=>t.team===void 0||J.team===t.team).map(J=>({team:J.team,ts:J.ts,reason:J.note??"(no reason recorded)"})),xt=t.maintainer===void 0?null:[...kt(n,t.maintainer),...Ed(n,t.maintainer)].sort((J,Le)=>J.id-Le.id).filter(J=>J.from_id!=="autopilot"),z=t.maintainer===void 0?[]:UD(n,t.maintainer,s).map(J=>({row:J.row,constituentCount:wi(n,J.row)})),vt=t.maintainer===void 0?[]:au(n,s).map(J=>{let Le=wi(n,J.row),St=iu(n,J.row),ln=J.ageMs>=uu||Le>=2&&J.row.sent_ts===null;return{row:J.row,constituentCount:Le,retractedCount:St,urgent:ln}}),Bt=t.maintainerStaleThresholdMs??_ne,Jt=[];if(t.maintainer!==void 0&&xt!==null){let Le=me(n,t.maintainer)?.last_cli_activity_ts??null,St=iO(Le,s),ln=!uw(Le,Bt,s),xi=xt[0],_r=xi?s-Date.parse(xi.created_ts):null,Uo=_r!==null&&_r>Bt;if(ln||Uo){let gr=[];ln&&gr.push(Le===null?"no CLI activity ever recorded":`no CLI activity in ${Se(St)}`),Uo&&gr.push(`oldest queued item is ${Se(_r)} old`),Jt.push({team:t.maintainer,reason:gr.join("; "),ageMs:St===null?1/0:Math.max(St,_r??0)})}}let Hn;if(t.team===void 0)Hn=a.map(J=>J.entity);else{Hn=[];for(let J of e.teams.filter(Q)){let Le;try{Le=se(J)}catch{continue}let St=ze(n,Le,J.leadAlias);St!==null&&Hn.push(...Bi(n,St))}}let An=A$(n,Hn,e.teams),Rs=E$(n),ts=w$(n,e.teams),Ni=T$(n),cn=[];for(let J of e.teams.filter(Q)){try{se(J)}catch{continue}n_(J)===0&&cn.push({team:J.name,repoPath:J.repoPath})}let Po=t.stuckProcessingThresholdMs??gne,kc=t.stuckProcessingMaxAgeMs??wne,Wu=t.maintainer!==void 0&&t.stuckProcessingFleetWide!==!0?t.maintainer:void 0,vh=PD(n,{minAgeMs:Po,maxAgeMs:kc,fromId:Wu},s).map(J=>({queueId:J.row.id,fromId:J.row.from_id,toId:J.row.to_id,ageMs:J.ageMs,constituentCount:wi(n,J.row)}));return{blocked:a,blockedOnUnresolved:c,owedAnswers:l,recentlyAnsweredForSender:u,parkedTeamsWithOwedPrompts:d,awaitingDecision:m,awaitingReview:p,stalled:H,stalledVerdicts:ne,hungHolders:ie,autoNudgeSuspended:de,blockedSelfReports:ee,flaggedEpics:_,closedEpicsToReview:g,orphanReapCandidates:hr,maintainerStale:Jt,blockingRoots:An,epicsWithoutOwner:Rs,unresolvableOwnerEntities:ts,untrackedBlockers:Ni,unseededTeams:cn,stuckProcessing:vh,inbox:xt,memory:(t.readMemoryAvailabilityImpl??Mc)(),operatorPrompts:z,operatorEscalations:vt,uncommittedWork:w,teamfileLintWarnings:y,expiredHolds:h,neverTrackFiles:v,secretBearingTeamfiles:A,trackedTeamfiles:I,unprotectedTeamfiles:N,gitIdentityMismatches:x,activeGhAccount:await(t.checkActiveGhAccountImpl??Rp)(),disabledProviders:L,providerDisableReadFailed:$,quiescedByProviderDisable:M,staleAutoScanPause:C,persistentDispatchFailures:Z,notObserved:oe,rateLimitPolicyHealth:j,rateLimitLevelWarnings:F}}function nT(e){return` ${e.team}: #${e.entity.id} ("${e.entity.title}")`}function $$(e){return e.length===0?"":`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmctl-ai/lmctl",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.419",
|
|
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",
|