@lmctl-ai/lmctl 0.2.418 → 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 +2 -2
- package/dist/lmbee.js +3 -3
- package/package.json +1 -1
package/build-info.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"sha": "
|
|
1
|
+
{"sha": "17cc7da7474f194d4c254020750c4853afb43f9f", "dirty": false, "builtAt": "2026-10-24T16:48:13.000Z"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1728,7 +1728,7 @@ ${r}`}}}function Fs(t,e){return e===""?t:`${t}:${e.includes(`
|
|
|
1728
1728
|
`)}catch{}}function HM(){if(!wl){let e=jM().slice(0,13).replace("T","-");wl=Tl(yf(),`debug-${e}.log`)}$M(PM(wl),{recursive:!0})}function Ye(...t){qe({event:"legacy",msg:t.join(" ")})}function je(...t){qe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function U(t){qe(t,{always:!0})}function BM(){return XM()||qM()}function XM(){try{let t=jw(Tl(yf(),"config.toml"),"utf-8");for(let e of t.split(`
|
|
1729
1729
|
`)){let n=e.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function qM(){try{let t=jw(Tl(yf(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var js,Uw,Fw,FM,wl,re=C(()=>{"use strict";It();js=!1,Uw=!1,Fw=0,FM=5e3;wl=null});function d$(t,e){if(!e||t.includes(e))return!1;let n=0;for(let r of t.split(`
|
|
1730
1730
|
`))/^\s{2,}\S.*\([A-Za-z]+\)\s*$/.test(r)&&n++;return n>=3}function Mn(t,e={}){if(typeof t!="string"||t==="")return e.status==="busy"?{class:"receiver_busy",rule:"status-busy"}:e.status==="empty"?{class:"upstream_undisclosed",rule:"status-empty"}:e.status==="stalled"?{class:"transport_interrupted",rule:"status-stalled"}:{class:"unknown",rule:null};for(let n of u$)if(n.test(t,e))return{class:n.class,rule:n.rule};return{class:"unknown",rule:null}}var Bt,u$,vl=C(()=>{"use strict";Bt=t=>e=>t.test(e);u$=[{rule:"usage-limit",class:"quota_exhausted",test:Bt(/usage limit|out of usage credits|quota (has been )?(reached|exhausted)|Insufficient Balance/i)},{rule:"spawn-enoent",class:"binary_missing",test:Bt(/spawn \S+ ENOENT/i)},{rule:"auth-message",class:"auth_required",test:Bt(/Unauthorized|Incorrect API key|invalid api key|not logged in|Authentication required|login required/i)},{rule:"no-content-no-activity",class:"upstream_undisclosed",test:Bt(/no content and no observed activity/i)},{rule:"throttled",class:"upstream_throttled",test:Bt(/rate.?limit|too many requests|at capacity|(?:\bhttp\b[^\n]{0,20}|\bstatus(?: code)?\W{0,3}|\berror\W{0,3}|\bcode\W{0,3})429\b/i)},{rule:"connection-interrupted",class:"transport_interrupted",test:Bt(/connection to the agent was interrupted|stalled for \d+s|provider stalled after/i)},{rule:"context-window",class:"context_exhausted",test:Bt(/ran out of room in the model's context window|context (length|window) (exceeded|full)/i)},{rule:"receiver-held",class:"receiver_busy",test:Bt(/is held by a terminal|is servicing /i)},{rule:"holder-dead",class:"holder_died",test:Bt(/holder process verified not alive|holder_pid confirmed dead|received SIGTERM/i)},{rule:"model-list",class:"model_not_offered",test:(t,e)=>d$(t,e.model)},{rule:"model-message",class:"model_not_offered",test:Bt(/model is not supported|model .{0,60}(does not exist|not found|unavailable)|unknown model|invalid model/i)},{rule:"conversation-gone",class:"stale_session",test:Bt(/No conversation found with session ID|conversation \S+ not found/i)}]});import{openSync as f$,closeSync as m$,fstatSync as p$,readSync as h$,constants as Vw}from"node:fs";import{dirname as _$,join as Sl}from"node:path";import{createHash as g$}from"node:crypto";function vf(t){if(!Wr(t.catalog)||!Hr(t.aliases)||!t.sha256||!/^[a-f0-9]{64}$/.test(t.sha256))throw Error("invalid or incomplete price snapshot (catalog, aliases and SHA-256 required)");if(!["network","cache","bundled","pinned"].includes(t.source)||t.generatedAt!==null&&typeof t.generatedAt!="string")throw Error("invalid price snapshot metadata");if(t.catalog.records.length>1e5||t.aliases.aliases.length>1e5||t.aliases.standards.length>1e5)throw Error("price snapshot exceeds the 100000-entry limit");let e=o=>{if(o.length>65536)throw Error("price identity exceeds the 65536-character limit")},n=new Set,r=new Set,s=new Set;for(let o of t.catalog.records){let i=zw(o);if(!i||n.has(i))throw Error("duplicate or missing price record id");n.add(i),e(i),e(o.source),e(o.source_model_id);for(let d of[o.source,o.source_model_id])if(typeof d!="string"||!d.trim())throw Error("invalid price record identity");let a=o;for(let d of[o.provider,o.mode,o.gateway_id,o.record_id,a.vendor_model_id,a.canonical_slug])if(d!=null&&typeof d!="string")throw Error("invalid price record metadata");for(let d of[o.pricing.input_per_1m_tokens,o.pricing.output_per_1m_tokens,o.pricing.input_cache_read_per_1m_tokens,o.pricing.input_cache_write_per_1m_tokens??null])if(!Jw(d))throw Error("price rates must be finite nonnegative numbers or null");let l=o.pricing.source_cost_fields;if(l!=null&&(typeof l!="object"||Array.isArray(l)))throw Error("invalid source cost fields");for(let d of["cache_creation_input_token_cost","cache_creation_input_token_cost_above_1hr"])if(l?.[d]!==void 0&&!Jw(l[d]))throw Error("source blend rates must be finite nonnegative numbers or null");let c=o.pricing.currency;if(c!=null&&c!=="USD")throw Error("price currency must be USD")}for(let o of t.aliases.standards){e(o.standard_slug),o.catalog_record_id!==null&&e(o.catalog_record_id);let i=o.standard_slug.toLowerCase();if(!i||r.has(i))throw Error("duplicate price standard");r.add(i)}for(let o of t.aliases.aliases){e(o.alias),o.standard_slug!==null&&e(o.standard_slug);let i=o.alias.toLowerCase();if(!i||s.has(i))throw Error("duplicate price alias");if(s.add(i),o.standard_slug!==null&&!r.has(o.standard_slug.toLowerCase()))throw Error("price alias references missing standard")}}function Kw(t){let e=f$(t,Vw.O_RDONLY|Vw.O_NONBLOCK);try{let n=p$(e);if(!n.isFile()||n.size>y$)throw Error("price file must be a regular file within the 64 MiB size limit");let r=Buffer.alloc(n.size+1),s=0;for(;s<r.length;){let o=h$(e,r,s,r.length-s,null);if(o===0)break;s+=o}if(s!==n.size)throw Error("price file changed while reading; retry with a complete file");return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(r.subarray(0,s))}finally{m$(e)}}function Sf(t,e=Sl(_$(t),"aliases.json")){let n=Kw(t),r=Kw(e),s;try{s=Yw(n)}catch{s=null}if(!s||!("records"in Object(s))){let a=n.trim().split(/\r?\n/).filter(c=>c.trim()).map(c=>JSON.parse(c)),l=a[0]?.schema_version!==void 0&&a[0]?.pricing===void 0&&a[0]?.source_model_id===void 0?a.shift():{};s={schema_version:l.schema_version??1,generated_at:l.generated_at??"",records:a}}let o=Yw(r),i={catalog:s,aliases:o,source:"pinned",generatedAt:s?.generated_at||null,sha256:g$("sha256").update(n).update(r).digest("hex")};return vf(i),i}function Ws(t){let e=t.pragma("busy_timeout",{simple:!0});try{return t.pragma("busy_timeout = 0"),t.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='price_snapshot'").get()?t.transaction(()=>{let n=t.prepare("SELECT * FROM price_snapshot").get();if(!n)return null;let r=t.prepare("SELECT * FROM price_record ORDER BY ordinal").all().map(i=>{if(typeof i.record_id!="string"||!i.record_id||i.currency!=="USD"||i.unit!=="per_1m_tokens")throw Error("invalid stored price identity, currency or unit");let a=JSON.parse(i.record_json);return{...a,record_id:i.record_id,pricing:{...a.pricing,input_per_1m_tokens:i.input_1m,output_per_1m_tokens:i.output_1m,input_cache_read_per_1m_tokens:i.cache_read_1m,input_cache_write_per_1m_tokens:i.cache_write_1m,source_cost_fields:JSON.parse(i.source_cost_fields??"{}")}}});if(r.length!==n.record_count)throw Error("incomplete stored price snapshot");let s=t.prepare("SELECT alias,standard_slug,evidence FROM price_alias ORDER BY alias").all(),o={catalog:{schema_version:1,generated_at:n.generated_at??"",records:r},aliases:{schema_version:1,standards:JSON.parse(n.standards_json),aliases:s},source:n.source,generatedAt:n.generated_at,sha256:n.sha256,fetchedAt:n.fetched_at,loadedAt:n.loaded_at,recordCount:n.record_count};return vf(o),o})():null}finally{t.pragma("busy_timeout = "+e)}}function bf(t,e,n={}){vf(e);let r=()=>t.prepare("SELECT sha256 FROM price_snapshot").get()?.sha256===e.sha256,s=t.pragma("busy_timeout",{simple:!0});try{return t.pragma("busy_timeout = 0"),r()?"unchanged":t.transaction(()=>{if(r())return"unchanged";t.exec("DELETE FROM price_alias; DELETE FROM price_record; DELETE FROM price_snapshot;");let o=t.prepare("INSERT INTO price_record(record_id,source,provider,source_model_id,vendor_model_id,canonical_slug,currency,unit,input_1m,output_1m,cache_read_1m,cache_write_1m,source_cost_fields,record_json,ordinal) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");e.catalog.records.forEach((c,d)=>{let u=c;o.run(zw(c),c.source,c.provider??null,c.source_model_id,u.vendor_model_id??null,u.canonical_slug??null,"USD","per_1m_tokens",c.pricing.input_per_1m_tokens,c.pricing.output_per_1m_tokens,c.pricing.input_cache_read_per_1m_tokens,c.pricing.input_cache_write_per_1m_tokens??null,JSON.stringify(c.pricing.source_cost_fields??{}),JSON.stringify(c),d)});let i=t.prepare("INSERT INTO price_alias(alias,standard_slug,evidence,catalog_record_id) VALUES(?,?,?,?)"),a=new Map(e.aliases.standards.map(c=>[c.standard_slug.toLowerCase(),c]));for(let c of e.aliases.aliases){let d=a.get(c.standard_slug?.toLowerCase()??"");i.run(c.alias.toLowerCase(),c.standard_slug,c.evidence,d?.catalog_record_id??null)}let l=new Date(n.now??Date.now()).toISOString();return t.prepare("INSERT INTO price_snapshot(sha256,generated_at,source,fetched_at,loaded_at,record_count,standards_json) VALUES(?,?,?,?,?,?,?)").run(e.sha256,e.generatedAt,e.source,l,l,e.catalog.records.length,JSON.stringify(e.aliases.standards)),"updated"}).immediate()}catch(o){if(/^SQLITE_(BUSY|LOCKED|READONLY)(_|$)/.test(String(o?.code)))return"deferred";throw o}finally{t.pragma("busy_timeout = "+s)}}async function If(t,e={}){let n=e.now??Date.now(),r={...process.env,...e.env},s=Ws(t),o=Tf.get(t),i=o&&o.hash===s?.sha256?o.at:Date.parse(s?.fetchedAt??"");if(!e.force&&s&&n>=i&&n-i<Ls(r))return{status:"unchanged",snapshot:s};let a=e.load??(()=>r.LMCTL_PRICE_DATA?Promise.resolve(Sf(Sl(r.LMCTL_PRICE_DATA,"model_list.json"))):vt({cacheDir:r.LMCTL_HOME?Sl(r.LMCTL_HOME,"cache","lmprice"):r.HOME?Sl(r.HOME,".lmctl","cache","lmprice"):void 0,ttlMs:e.force?0:Ls(r)})),l,c;try{c=await(e.budgetMs===void 0?a():Promise.race([a(),new Promise(f=>{l=setTimeout(()=>f(null),e.budgetMs)})]))}finally{clearTimeout(l)}if(Tf.set(t,{hash:s?.sha256??null,at:n}),!c?.catalog||!c.aliases||!c.sha256||c.refreshFailed&&(s||c.source!=="bundled"))return{status:"unavailable",snapshot:s};let d=bf(t,c,{now:n}),u=Ws(t);return Tf.set(t,{hash:u?.sha256??null,at:n}),{status:d,snapshot:u}}async function bl(t,e){try{return(await If(t,{env:e,budgetMs:900})).snapshot??gi}catch(n){if(/^SQLITE_(BUSY|LOCKED)(_|$)/.test(String(n?.code)))return gi;try{return Ws(t)??gi}catch{return gi}}}async function kf(t){if(t.dal)return bl(t.dal.db,t.env);let e;try{return e=Fe({path:Te(t),recover:!1}),await bl(e.db,t.env)}catch{return gi}finally{try{e?.close()}catch{}}}var gi,zw,Jw,y$,Yw,Tf,Il=C(()=>{"use strict";Zt();bt();se();gi={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null},zw=t=>t.record_id??t.source+":"+t.source_model_id,Jw=t=>t===null||typeof t=="number"&&Number.isFinite(t)&&t>=0;y$=64*1024*1024;Yw=t=>JSON.parse(t.replace(/^\uFEFF/,""));Tf=new WeakMap});function $n(t){return t!=="gemini"}function kl(t){if(!$n(t))throw new Error(lr)}var lr,Hs=C(()=>{"use strict";lr="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model."});function Qw(t){if(t.length===0||!t.startsWith("---"))throw new rn("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1731
|
-
`);if(e[0]!=="---")throw new rn("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){r=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new rn(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!E$.has(c))throw new rn(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Al.join(", ")}`);n[c]=d}if(r===-1)throw new rn("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Al)if(n[i]===void 0)throw new rn(`missing required frontmatter key "${i}" \u2014 required: ${Al.join(", ")}`);let s=0;for(let i=0;i<=r;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=n.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:n.title,description:n.description,members:o,bodyOffset:s}}var Al,E$,rn,Zw=C(()=>{"use strict";Al=["title","description","members"],E$=new Set(Al),rn=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function Qr(t){return Af.has(t)}var Af,yi=C(()=>{"use strict";Af=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as w$,writeFileSync as wz,renameSync as Tz,existsSync as tT}from"node:fs";import{basename as T$,resolve as Bs,dirname as Nf}from"node:path";function v$(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],o=r[2]!==void 0?r[2]:r[3];e[s]=o}return e}function S$(t){return/^\s*
|
|
1731
|
+
`);if(e[0]!=="---")throw new rn("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){r=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new rn(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!E$.has(c))throw new rn(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Al.join(", ")}`);n[c]=d}if(r===-1)throw new rn("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Al)if(n[i]===void 0)throw new rn(`missing required frontmatter key "${i}" \u2014 required: ${Al.join(", ")}`);let s=0;for(let i=0;i<=r;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=n.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:n.title,description:n.description,members:o,bodyOffset:s}}var Al,E$,rn,Zw=C(()=>{"use strict";Al=["title","description","members"],E$=new Set(Al),rn=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function Qr(t){return Af.has(t)}var Af,yi=C(()=>{"use strict";Af=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as w$,writeFileSync as wz,renameSync as Tz,existsSync as tT}from"node:fs";import{basename as T$,resolve as Bs,dirname as Nf}from"node:path";function v$(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],o=r[2]!==void 0?r[2]:r[3];e[s]=o}return e}function S$(t){return/^\s*_(?:MEMBER|AGENT)_\s+\S/.test(t)}function b$(t){return/^\s*_SESSION_\s+\S/.test(t)}function I$(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Oe(t){return/\.(?:lmctl|lmc)$/i.test(t)}function Ei(t){return T$(t).replace(/\.(?:lmctl|lmc)$/i,"")}function ke(t){let e=w$(t,"utf-8"),n=Nf(Bs(t)),r=Xs(e,Ei(t),{baseDir:n,sourcePath:Bs(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Bs(n,s.sessiondir));return r}function Xs(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
|
|
1732
1732
|
`);o=l>=0?o.slice(l+1):""}let i=null;if(o.startsWith("---"))try{i=Qw(o)}catch(l){if(l instanceof rn)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
|
|
1733
1733
|
`);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(b$(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(I$(c)||!S$(c))continue;let u=v$(c);for(let m of Object.keys(u))if(!eT.includes(m))throw new Error(`line ${d}: unknown key "${m}" on _MEMBER_ line: ${c.trim()}
|
|
1734
1734
|
allowed keys: ${eT.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}if(!u.alias){s.push(`line ${d}: member line missing required alias: ${c.trim()}`);continue}let f={alias:u.alias,provider:u.provider||"",extra:{}};u.sessionid&&(f.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(f.sessiondir=u.sessiondir),u.teamfile&&(f.teamfile=u.teamfile),u.model&&(f.model=u.model),u.effort&&(f.effort=u.effort),r.push(f)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:i}}function wi(t,e){let n=[];for(let o of t.parseErrors)n.push({field:"session",message:o});let r=t.members.filter(o=>o.alias.toLowerCase()===Rf.toLowerCase());r.length>1&&n.push({field:Rf,message:`${r.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&n.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?Bs(e,o.teamfile):Bs(o.teamfile);if(!tT(a))n.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=ke(a),c=qs(l);c?c.session||n.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else Af.has(o.provider)?$n(o.provider)||n.push({field:o.alias,message:lr}):n.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&n.push({field:o.alias,message:"sessiondir is empty"})}return n}function qs(t){return t.members.find(e=>e.alias.toLowerCase()===Rf.toLowerCase())}function xf(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=Bs(e,t.teamfile),i=n??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!tT(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=ke(o),l=qs(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return xf(l,Nf(o),i,r);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Nf(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Nl(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var Rf,eT,ze=C(()=>{"use strict";Hs();Zw();yi();Rf="Lead";eT=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as k$}from"node:crypto";import{existsSync as nT,readFileSync as rT,realpathSync as A$}from"node:fs";import{dirname as N$,resolve as sT}from"node:path";function Re(t,e){let n=sT(t);if(nT(n))return A$(n);if(e!==void 0){let r=x$(t,n,e);if(r!==null)return r}return n}function xl(t,e){let n=N$(e),r=Xs(t,Ei(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=sT(n,s.sessiondir));return r}function sn(t,e,n=r=>{process.stderr.write(`warning: ${r}
|
|
@@ -1960,7 +1960,7 @@ ${e("Provider3",t.provider3)}
|
|
|
1960
1960
|
`),nk(r,c,"utf8"),n.onSeeded?.({alias:y.alias,provider:y.provider,sessionid:N.sessionId,sessiondir:v,...R!==void 0?{model:R}:{}}),e.stdout.write(`${y.alias}: seeded ${N.sessionId} provider=${y.provider} sessiondir=${v} model=${R?JSON.stringify(R):"default (not reported)"}
|
|
1961
1961
|
`)}finally{A()}}let h=l.join(`
|
|
1962
1962
|
`),g=OH(h,Ah(r));g!==h&&nk(r,g,"utf8"),p===0&&e.stdout.write(`no members needed seeding
|
|
1963
|
-
`);let E=new Date().toISOString();try{await W(e,y=>{ad(y,{teamfilePath:s,name:i.name,rawText:g,now:E})})}catch(y){return yn(e,y instanceof Error?y.message:String(y))}return 0}function uk(t){return aH("sha256").update(t).digest("hex")}function fk(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:uk(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function ad(t,e){let n=xl(e.rawText,e.teamfilePath);Ti(t,e.teamfilePath,n);let r=fk(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function RH(t){let e=new Map;for(let n=0;n<t.length;n+=1){let r=t[n];if(!/^\s*
|
|
1963
|
+
`);let E=new Date().toISOString();try{await W(e,y=>{ad(y,{teamfilePath:s,name:i.name,rawText:g,now:E})})}catch(y){return yn(e,y instanceof Error?y.message:String(y))}return 0}function uk(t){return aH("sha256").update(t).digest("hex")}function fk(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:uk(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function ad(t,e){let n=xl(e.rawText,e.teamfilePath);Ti(t,e.teamfilePath,n);let r=fk(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function RH(t){let e=new Map;for(let n=0;n<t.length;n+=1){let r=t[n];if(!/^\s*_(?:MEMBER|AGENT)_\s+\S/.test(r))continue;let s=LH(r,"alias");s!==void 0&&e.set(s.toLowerCase(),n)}return e}function xH(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function LH(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function Ih(t,e,n){let r=`${e}=${CH(n)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${r}`):`${t.trimEnd()} ${r}`}function CH(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function OH(t,e){let n=`#teamfile: ${e}`,r=t.indexOf(`
|
|
1964
1964
|
`),s=r>=0?t.slice(0,r):t,o=r>=0?t.slice(r+1):"";return s===n?t:s.startsWith("#teamfile:")?o.length>0?`${n}
|
|
1965
1965
|
${o}`:`${n}
|
|
1966
1966
|
`:t.length>0?`${n}
|
|
@@ -2038,12 +2038,12 @@ possibly work, seed reports it as an error and seeds nothing.
|
|
|
2038
2038
|
|
|
2039
2039
|
${r}
|
|
2040
2040
|
`}function gk(t){return t.split(`
|
|
2041
|
-
`).map(e=>_k.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*
|
|
2041
|
+
`).map(e=>_k.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_(?:MEMBER|AGENT)_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 ").replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_(?:MEMBER|AGENT)_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
|
|
2042
2042
|
`)}function Oh(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function cd(t){let e=[];for(let n of t.split(`
|
|
2043
|
-
`)){if(!_k.test(n))continue;let r=Oh(n,"alias"),s=Oh(n,"provider");if(r===void 0||s===void 0)continue;let o=Oh(n,"model");e.push({alias:r,provider:s,...o!==void 0&&o!==""?{model:o}:{}})}return e}var Dh,ld,_k,dd=C(()=>{"use strict";Gn();Dh={1:["Lead"],lead:["Lead"],2:["Lead","Reviewer"],"lead-reviewer":["Lead","Reviewer"],3:["Lead","Coder","Reviewer"],"lead-coder-reviewer":["Lead","Coder","Reviewer"]},ld="1|2|3|lead|lead-reviewer|lead-coder-reviewer";_k=/^\s*
|
|
2043
|
+
`)){if(!_k.test(n))continue;let r=Oh(n,"alias"),s=Oh(n,"provider");if(r===void 0||s===void 0)continue;let o=Oh(n,"model");e.push({alias:r,provider:s,...o!==void 0&&o!==""?{model:o}:{}})}return e}var Dh,ld,_k,dd=C(()=>{"use strict";Gn();Dh={1:["Lead"],lead:["Lead"],2:["Lead","Reviewer"],"lead-reviewer":["Lead","Reviewer"],3:["Lead","Coder","Reviewer"],"lead-coder-reviewer":["Lead","Coder","Reviewer"]},ld="1|2|3|lead|lead-reviewer|lead-coder-reviewer";_k=/^\s*_(?:MEMBER|AGENT)_\s+\S/});var jh={};fe(jh,{PROVIDER_NAMES:()=>vo,adoptSession:()=>Fh,chooseMember:()=>_a,chooseTeamfile:()=>Ph,completeTeamfile:()=>yk,createPromptTeam:()=>Uh,field:()=>Eo,prepareTeam:()=>ha,setField:()=>Ar});import{existsSync as pa,mkdirSync as Mh,readFileSync as ud,readdirSync as MH,statSync as $H,writeFileSync as $h}from"node:fs";import{basename as wo,dirname as fd,extname as md,resolve as To}from"node:path";function Eo(t,e){return new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t)?.slice(1).find(n=>n!==void 0)}function Ar(t,e,n){if(/["\r\n]/.test(n))throw new Error(`${e} cannot contain quotes or newlines in a teamfile.`);let r=`${e}=${/\s/.test(n)?`"${n}"`:n}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${r}`):`${t.trimEnd()} ${r}`}async function PH(t,e){let n=_o(),r=[...new Set(n?Object.values(n).map(s=>s.provider):[])];for(e.stderr.write(`Providers from lmctl init: ${r.join(", ")||"(none saved)"}; another supported provider may be typed.
|
|
2044
2044
|
`);;){let s=await t.ask("Provider: ");if(vo.includes(s))return s;e.stderr.write(`Known providers: ${vo.join(", ")}
|
|
2045
2045
|
`)}}async function yk(t,e,n,r={},s){let o=pa(t),i=o?ud(t,"utf8"):"",a=i.split(`
|
|
2046
|
-
`),l=a.map((m,p)=>/^\s*
|
|
2046
|
+
`),l=a.map((m,p)=>/^\s*_(?:MEMBER|AGENT)_(?:\s|$)/.test(m)?p:-1).filter(m=>m>=0);if(!l.length){let m=s?[s]:(await e.ask("Member aliases [Lead] (comma separated): ")||"Lead").split(",").map(p=>p.trim());for(let p of m)l.push(a.length),a.push(Ar("_MEMBER_","alias",p))}let c=new Set;for(let m of l){let p=a[m],_=Eo(p,"alias");if(_||(_=await e.ask(`Alias for member on line ${m+1}: `)),!/^[A-Za-z][A-Za-z0-9_-]*$/.test(_)||c.has(_.toLowerCase()))throw new Error(`Invalid or duplicate alias: ${_}`);if(c.add(_.toLowerCase()),p=Ar(p,"alias",_),!Eo(p,"teamfile")){let h=Eo(p,"provider");h||(h=await PH(e,n));let g=Nt({alias:_,provider:h});if(g)throw new Error(g);if(p=Ar(p,"provider",h),!Eo(p,"model")&&!Eo(p,"sessionid")){let E=await(r.models??hn)(h).catch(()=>[]);E.length&&n.stderr.write(`Models for ${h}:
|
|
2047
2047
|
${E.map(w=>` ${w}`).join(`
|
|
2048
2048
|
`)}
|
|
2049
2049
|
`);let y=await e.ask(`Model for ${_} (blank for provider default): `);y&&(p=Ar(p,"model",y))}}a[m]=p}let d=a.join(`
|
package/dist/cli/lmscript.js
CHANGED
|
@@ -2384,7 +2384,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
2384
2384
|
ORDER BY started_at ASC, id ASC
|
|
2385
2385
|
`).all(...e,n)}finishTrackedInvocation(e,n){return this.db.transaction(()=>{let r=n.ended_at??Z();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,rn(n.result_summary),rn(n.error),n.team_chat_log_id??null,rn(n.meta),rn(n.config_warnings),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return mu(this.db,i),i.status==="cancelled"&&i.signal!==null&&i.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(i.team_chat_log_id,i.error??`holder received ${i.signal}`),i})()}reclaimTrackedInvocationIfUnchanged(e,n,r){return this.db.transaction(()=>{let s=r.ended_at??Z();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,rn(r.result_summary),rn(r.error),r.team_chat_log_id??null,rn(r.meta),rn(r.config_warnings),s,e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return mu(this.db,o),o})()}heartbeatTrackedInvocation(e,n=Z()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return fS(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(gS(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:(hS(this.db,e,ur(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=Z();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,rn(r),e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return mu(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(e,n){let r=this.stmts.getTeamChatLogById.get(e);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,e).changes!==1||uu(this.db,e,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:Z()})}listClaimableTerminalTrackedInvocations(e){let n=["status IN ('done', 'error', 'busy', 'cancelled', 'aborted')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(e,n,r=Z()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return pS(this.db,i,n,r),i})()}listTrackedInvocations(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status)),e.kind!==void 0&&(n.push("kind = ?"),r.push(e.kind)),e.origin!==void 0&&(n.push("origin = ?"),r.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.limit??100)));r.push(s);let i=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);return Number(i?.max_id??0)}listRunningTrackedInvocations(e={}){return this.listTrackedInvocations({...e,status:"running"})}updateTeamChatLogResponse(e,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e)}getAgentInflight(e,n){return this.stmts.getAgentInflight.get(e,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,n){return this.tryAcquireAgentInflightTxn(e,n)}tryAcquireNativeHolder(e,n){return this.tryAcquireAgentInflightTxn(e,{nativeHolder:n})}findNativeHolder(e,n){return this.stmts.getNativeHolder.get(e,n)??null}updateNativeHolderPhase(e,n,r,s){return this.stmts.updateNativeHolderPhase.run(s,e,n,r,r).changes===1}publishNativeHolder(e,n,r,s,i="ready"){return this.stmts.publishNativeHolder.run(s,i,e,n,r,r).changes===1}clearNativeHolder(e,n,r){return this.stmts.clearNativeHolderFenced.run(e,n,r,r).changes===1}heartbeatAgentInflight(e,n,r=Z()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:oS(this.db,s,n,r)})()}clearAgentInflight(e,n){this.db.transaction(()=>{let s=this.getAgentInflight(e,n);if(s===null)return;this.stmts.clearAgentInflight.run(e,n).changes===1&&Na(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(e,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return o.changes===1&&i!==null&&Na(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
|
|
2386
2386
|
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&Na(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Na(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(Ia,Ca(e,n),Aa);return r===void 0?null:ZT(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&tg(this.db,r,!0),this.stmts.upsertRuntimeState.run(Ia,Ca(e.teamfile,e.alias),Aa,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&aS(this.db,e)})()}heartbeatTerminalLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,n);if(i===null||i.lock_id!==r)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Ia,Ca(e,n),Aa,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Ia,Ca(e,n),Aa);return i.changes===1&&tg(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,n,r){let s=this.stmts.getRuntimeState.get(e,n,r);return s===void 0?null:H$(s.data)}tryAcquireRuntimeProcessLock(e,n,r,s,i=Z()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,n,r);if(o!==null&&!B$(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:ES(),holder_pid:process.pid,holder_host:sg(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,n,r,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,n){return this.stmts.setRunCurrentState.run(n,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,n,r){return this.stmts.setRunPausedState.run(n,r,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,n){return this.stmts.setRunPendingEscalationDecision.run(n,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,n){return this.stmts.setRunTerminalState.run(n,Z(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,n){return this.resumeRunTxn(e,n,Z())}insertStep(e){let n=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,Z());return this.stmts.getStep.get(n.lastInsertRowid)}finishStep(e,n,r){return this.stmts.finishStep.run(n??null,r??null,Z(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let n=this.stmts.listLatestStepOutcomesByState.all(e),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(e){let n=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??Z(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(n.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let n=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,Z());return this.stmts.getStepArtifact.get(n.lastInsertRowid)}insertExternalObject(e){let r=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,Z()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:r}}insertExternalSignal(e){let n=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,Z()),r=n.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:r}}raiseAttention(e){let n=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,Z());return this.stmts.getAttention.get(n.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(Z(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let n=Z();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,n,n),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,n){return this.stmts.getDurableMemoryByName.get(e,n)??null}deleteDurableMemory(e,n){return this.stmts.deleteDurableMemory.run(e,n).changes>0}listDurableMemory(e,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(e,n):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(e).filter(s=>n.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(e){let n=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??Z());return this.stmts.getSessionSize.get(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,n,r=20){return this.stmts.sessionSizeHistory.all(e,n,r)}insertSessionEvent(e){let n=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(n.lastInsertRowid)}listSessionEvents(e,n){return n!==void 0?this.stmts.listSessionEventsSince.all(e,n):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,n=1e3){return this.stmts.listAllEventsSince.all(e,n)}latestAgentCall(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);if(n===void 0)return null;try{let r=JSON.parse(n.payload);return typeof r.alias!="string"||typeof r.provider!="string"?null:{alias:r.alias,provider:r.provider,...typeof r.model=="string"?{model:r.model}:{}}}catch{return null}}agentCallTokenTotals(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),r=0,s=0,i=0;for(let o of n)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(r+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:r,totalOutputTokens:s,agentCallCount:i}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let n=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(n.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,n,r){return this.stmts.findUnackedDrift.get(e,n??null,r)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let n=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,n,n),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,n){return this.stmts.getInteractiveSessionByRunAndState.get(e,n)??null}setInteractiveAgentOutput(e,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),e)}resumeInteractive(e,n,r){return this.resumeInteractiveTxn(e,n,r,Z())}resumeEscalation(e,n){return this.resumeEscalationTxn(e,n,Z())}}});import{homedir as G$}from"node:os";import{join as IS}from"node:path";function V$(t=process.env){let e=t.LMCTL_HOME;return e!==void 0&&e.length>0?e:IS(t.HOME||G$(),J$)}function AS(t=process.env){return IS(V$(t),X$)}function Ki(t,e=process.env){return t!==void 0&&t.length>0?t:e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0?e.LMCTL_DB:AS(e)}function CS(t,e=process.env){return e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0&&e.LMCTL_DB!==AS(e)?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}var J$,X$,fu=L(()=>{"use strict";J$=".lmctl",X$="state.db"});import{isAbsolute as K$,resolve as NS,join as OS}from"node:path";function Nn(t,e){let n=ig.get(t);if(!n||t.closed)throw Error("Context is closed");return n.resources.add(e),()=>n.resources.delete(e)}function hn(t){let e=ig.get(t);if(!e)throw Error("Unknown context");return e.dal()}function Yr(t){let e=LS.get(t);if(!e)throw Error("Context state is unavailable");return e}function zi(t){return t!==null&&typeof t=="object"&&MS.has(t)}function og(t){try{if(!t||typeof t!="object"||Array.isArray(t))return B("invalid_argument","Context needs an explicit options map");let e={...t},n=["pid","env","cwd","dbPath","dal","onProgress","onWarning","clock","interactive"];if(Object.keys(e).some(h=>!n.includes(h)))return B("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!K$(e.cwd))return B("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...e.env});if(Object.values(r).some(h=>h!==void 0&&typeof h!="string"))return B("invalid_argument","Environment values must be strings or undefined");for(let h of["onProgress","onWarning","clock"])if(e[h]!==void 0&&typeof e[h]!="function")return B("invalid_argument",h+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return B("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return B("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return B("invalid_argument","pid must be a positive integer");let s=NS(e.cwd),i=r.LMCTL_HOME||(r.HOME?OS(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(i?OS(i,"state.db"):void 0)))return B("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,c,u,d=new AbortController,m=new Set,p=h=>{if(l){try{l.close()}catch(g){h.push(Y(g))}l=void 0}},f=Object.freeze({status:"ok",error:null,pid:e.pid,signal:d.signal,env:r,cwd:s,dbPath:NS(s,Ki(e.dbPath,r)),dal:e.dal,interactive:e.interactive??r.LMCTL_NON_INTERACTIVE!=="1",onProgress:e.onProgress??(()=>{}),onWarning:e.onWarning??(()=>{}),clock:e.clock??Date.now,get closed(){return a},close(){if(c)return c;let h;return c=new Promise(g=>{h=g}),a=!0,d.abort(),(async()=>{let g=[],y=0;for(let v of[...m])try{await v.close(),y++,m.delete(v)}catch(_){g.push(Y(_))}g.length||p(g),h({released:y,errors:g})})(),c},finalizeSync(h){if(u)return u;a=!0;let g=[],y={released:0,errors:g};u=y,c??=Promise.resolve(y);let v=[];for(let _ of[...m])try{let b=_.finalizeSync(h);b instanceof Promise?v.push(b.then(()=>{y.released++,m.delete(_)}).catch(w=>{g.push(Y(w))})):(y.released++,m.delete(_))}catch(b){g.push(Y(b))}return d.abort(h),v.length?c=Promise.all(v).then(()=>(g.length||p(g),y)):g.length||p(g),y}});return ig.set(f,{resources:m,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=gt({path:f.dbPath})}}),MS.add(f),LS.set(f,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),f}catch(e){return B("invalid_argument","Invalid context: "+Y(e))}}var ig,LS,MS,on=L(()=>{"use strict";sn();fu();ft();ig=new WeakMap;LS=new WeakMap;MS=new WeakSet});function PS(t){let e=Object.create(null),n=Object.create(null),r=(s,i,o=!0)=>{if(Array.isArray(s)){let a=s.map((l,c)=>r(l,i+"."+c,!1));return o&&(n[i]=a),a}if(s&&typeof s=="object"&&!(s instanceof Date)){let a=Object.create(null);for(let[l,c]of Object.entries(s)){let d=/^Provider[123]$/.test(i)&&["provider","model1"].includes(l)?l[0].toUpperCase()+l.slice(1):l;if(Object.hasOwn(a,d))throw Error(`Ambiguous property '${i}.${d}'`);a[d]=r(c,i?i+"."+d:d,o&&/^[_a-zA-Z]\w*$/.test(d))}return a}return o&&(n[i]=s),s};for(let[s,i]of Object.entries(t))e[s]=r(i,s,/^[_a-zA-Z]\w*$/.test(s));return{properties:e,flat:n}}var DS=L(()=>{"use strict"});function gu(t){return{Provider1:t.provider1.provider,Provider2:t.provider2.provider,Provider3:t.provider3.provider,Model1:t.provider1.model1,Model2:t.provider2.model1,Model3:t.provider3.model1}}var ag=L(()=>{"use strict"});import{readFileSync as z$}from"node:fs";import{homedir as Y$}from"node:os";import{join as FS,resolve as Q$}from"node:path";function Yi(t=process.env,e){let n=t.LMCTL_HOME||(t.HOME===void 0?process.env.LMCTL_HOME:void 0);return e!==void 0?Q$(e):FS(n||FS(t.HOME||Y$(),".lmctl"),"init.toml")}function Z$(t,e,n,r,s){return e==="missing"?"Missing "+t:e==="read"?"Cannot read "+t+": "+n:"Invalid "+t+":"+r+":"+s+": "+n}function yu(t,e="<init.toml>"){let{document:n}=lg(t,e),r={};for(let i of hu){let o=n[i];if(o===void 0)continue;if(!o||typeof o!="object"||Array.isArray(o)||o instanceof Date)throw new Vt(e,"schema","["+i+"] must be a table with provider and model1");let a={};for(let l of jS){let c=o[l];if(typeof c!="string"||!c.trim())throw new Vt(e,"schema",i+"."+l+" must be a nonempty string");a[l]=c}r[i]=a}let s={raw:t,document:n,path:e,slots:r};return Object.defineProperty(s,"config",{enumerable:!1,get(){let i=hu.find(o=>!r[o]);if(i)throw new Vt(e,"schema","["+i+"] is not in "+e+"; this needs the example slots ["+hu.join("], [")+"] -- add ["+i+"] with provider and model1");return{provider1:r.Provider1,provider2:r.Provider2,provider3:r.Provider3}}}),s}function lg(t,e="<init.toml>"){let n;try{n=Ir(t.startsWith("\uFEFF")?t.slice(1):t,{integersAsBigInt:"asNeeded",useLegacyDate:!0})}catch(r){let s=r;throw new Vt(e,"syntax",s.message,s.line??1,(s.column??1)+(t.startsWith("\uFEFF")&&s.line===1?1:0))}return{raw:t,document:n,path:e}}function $S(t){let e;try{e=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(z$(t))}catch(n){let r=n;throw new Vt(t,r.code==="ENOENT"?"missing":"read",r.message)}return e}function cg(t=Yi()){return lg($S(t),t)}function _u(t=Yi()){return yu($S(t),t)}var hu,jS,Vt,bu=L(()=>{"use strict";Po();hu=["Provider1","Provider2","Provider3"],jS=["provider","model1"];Vt=class extends Error{constructor(n,r,s,i=1,o=1){let a=Z$(n,r,s,i,o);super(r==="missing"?a+". Run lmctl init first.":a+". Fix the file or run lmctl init.");this.path=n;this.kind=r;this.line=i;this.column=o;this.detail=a}detail}});var US=L(()=>{"use strict";Po();bu()});import{spawnSync as gg}from"node:child_process";import{existsSync as BS,readFileSync as WS}from"node:fs";import{homedir as qS}from"node:os";import{resolve as pg}from"node:path";function Qi(t,e){return e.code==="ETIMEDOUT"?`${t} did not respond within lint's own spawn timeout (${e.message}) \u2014 this does not mean the provider itself is unreachable, only that this specific check didn't finish in time.`:`${t} could not be run: ${e.message}`}function n1(){let t=gg("agy",["models"],{encoding:"utf-8",timeout:t1});return{status:t.status,stdout:t.stdout??"",error:t.error}}function s1(t){let e=[],n={};for(let r of t.split(/\r?\n/)){let s=r.trim(),i=s.indexOf(" ");if(i<0)continue;let o=s.slice(0,i).trim(),a=s.slice(i+1).trim();o&&(e.push(o),a&&(n[o]=a))}return{models:e,displayNames:n}}function JS(t){if(!t&&ug)return ug;let e=i=>(t||(ug=i),i),n;try{n=(t??r1??n1)()}catch(i){return e({available:!1,models:[],reason:i instanceof Error?Qi("agy models",i):`agy models could not be run: ${String(i)}`})}if(n.error)return e({available:!1,models:[],reason:Qi("agy models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${n.status??"unknown"}`});let{models:r,displayNames:s}=s1(n.stdout);return r.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:r,displayNames:s})}function o1(){let t=gg("codex",["debug","models"],{encoding:"utf-8",timeout:i1});return{status:t.status,stdout:t.stdout??"",error:t.error}}function l1(t){let e;try{e=JSON.parse(t)}catch{return}let n=e.models;if(!Array.isArray(n))return;let r=[];for(let s of n){if(!s||typeof s!="object")continue;let{slug:i,visibility:o}=s;typeof i=="string"&&o==="list"&&r.push(i)}return r}function XS(t){if(!t&&dg)return dg;let e=s=>(t||(dg=s),s),n;try{n=(t??a1??o1)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?Qi("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:Qi("codex debug models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`codex debug models exited with status ${n.status??"unknown"}`});let r=l1(n.stdout);return r===void 0?e({available:!1,models:[],reason:"codex debug models did not return parseable JSON"}):r.length===0?e({available:!1,models:[],reason:"codex debug models returned no user-visible models"}):e({available:!0,models:r})}function u1(t){let e=gg("opencode",t?["models",t]:["models"],{encoding:"utf-8",timeout:c1});return{status:e.status,stdout:e.stdout??"",error:e.error}}function d1(t,e){if(!e&&mg.has(t))return mg.get(t);let n=o=>(e||mg.set(t,o),o),r=t?`opencode models ${t}`:"opencode models",s;try{s=(e??u1)(t)}catch(o){return n({available:!1,models:[],reason:o instanceof Error?Qi(r,o):`${r} could not be run: ${String(o)}`})}if(s.error)return n({available:!1,models:[],reason:Qi(r,s.error)});if(s.status!==0)return n({available:!1,models:[],reason:`${r} exited with status ${s.status??"unknown"}`});let i=s.stdout.split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0);return i.length===0?n({available:!1,models:[],reason:`${r} returned no models`}):n({available:!0,models:i})}function hg(t,e={}){let n=[];for(let r of t){let s=r.provider.trim().toLowerCase();if(r.effort&&s!=="opencode"&&s!=="lmplayer"&&s!=="qwen"&&s!=="muse"&&n.push(`[${r.alias}] effort="${r.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),s==="qwen"&&r.effort&&n.push(`[${r.alias}] effort="${r.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),s==="copilot"){if(!r.model)continue;n.push(`[${r.alias}] model="${r.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(s!=="lmplayer"){if(s==="opencode"){if(r.effort&&!r.model&&n.push(`[${r.alias}] effort="${r.effort}" has no effect without model= on an opencode member.`),!r.model)continue;let i=p1(e.opencodeConfigPath);if(!i.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for opencode: ${i.reason}.`);continue}if(i.models.includes(r.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(r.model))continue;if(!r.model.includes("/")){let l=i.models.filter(c=>c.endsWith(`/${r.model}`));n.push(l.length>0?`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${r.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}let o=r.model.slice(0,r.model.indexOf("/")),a=d1(o,e.opencodeModelsRunner);if(a.available&&a.models.includes(r.model))continue;if(a.available&&!a.models.includes(r.model)){n.push(`[${r.alias}] model="${r.model}" was not found in opencode's LOCALLY-VISIBLE live catalog for "${o}" (checked \`opencode models ${o}\`) -- this is unresolved, not a confirmed unavailability: it could mean opencode genuinely doesn't serve this model, OR that your local catalog/auth for "${o}" is stale/incomplete. Declaring it in opencode.json may or may not help; if it doesn't, check whether a non-opencode provider serves this model directly (e.g. \`lmctl lint\` with model= against provider=codex/claude/gemini/agy).`);continue}n.push(`[${r.alias}] model="${r.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(s==="kimi"){if(!r.model)continue;let i=YS(e.kimiConfigPath);i.available?i.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not declared in Kimi's [models] config. Valid configured models: ${La(i.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for kimi: ${i.reason}.`);continue}if(s==="agy"){if(!r.model)continue;let i=JS(e.agyModelsRunner);i.available?i.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${La(i.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for agy: ${i.reason}.`);continue}if(s==="dsh"){if(!r.model||Eu.includes(r.model))continue;wu.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in dsh's built-in catalog. Valid pinned models: ${La(wu)}. Valid server-resolved aliases (DeepSeek resolves these to its current model server-side -- pinning to a specific version instead is a DOWNGRADE, not a safer choice): ${La(Eu)}. The catalog is patchable via dsh profile overlays \u2014 a model added that way warns here even though it may resolve.`);continue}if(s==="hermes"){if(!r.model)continue;let i=r.model.indexOf(":");(i<=0||i===r.model.length-1)&&n.push(`[${r.alias}] model="${r.model}" should use <provider>:<model> from Hermes's ACP catalog. lmctl checks the shape only; provider and model availability are resolved by Hermes.`);continue}if(s!=="pi"){if(s==="codex"){if(!r.model)continue;r.model===HS&&n.push(`[${r.alias}] model="${HS}" is banned as a build model (operator, 2026-09-06) -- it's a fast/cheap classification model, not intended for build work, and there's no cost reason left to reach for it. Use model=gpt-5.6-sol (or leave model= unset) for build work; if this member genuinely does non-build/classification work, this warning can be ignored.`);let i=XS(e.codexModelsRunner);if(!i.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for codex: ${i.reason}.`);continue}i.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in codex's live model catalog (\`codex debug models\`). Valid models: ${La(i.models)}`);continue}r.model&&(GS.has(s)||n.push(`[${r.alias}] model="${r.model}" cannot be verified for provider "${s}": no model validation path exists for this provider.`))}}}return n}async function VS(t,e={}){let n=t.filter(o=>o.model!==void 0&&GS.has(o.provider.trim().toLowerCase()));if(n.length===0)return{warnings:[],errors:[]};let r=e.snapshot??await qs();if(r.catalog===null)return{warnings:[],errors:[]};let s=[],i=[];for(let o of n){let a=o.provider.trim().toLowerCase(),l=o.model,c=eu(a,l,r.catalog,r.aliases);if(c.kind==="unknown"){let u=LT(r.catalog,a)??0;s.push(`[${o.alias}] model "${l}" is unknown to the lmprice catalog for provider "${a}" (${u} known) -- not necessarily wrong: may be a model too new for lmprice to have published yet, or a typo. A matching lmprice catalog/alias entry would resolve this; lint cannot otherwise confirm whether ${a} accepts it.`)}else c.kind==="wrong-provider"?i.push({field:o.alias,message:`model "${l}" is not offered by provider "${a}" -- it is a recognized model, but only under: ${c.otherProviders.join(", ")}. Declare provider="${c.otherProviders[0]}" (or another listed provider), or use a model "${a}" actually offers.`}):c.kind==="known-unpriced"&&s.push(`[${o.alias}] model "${l}" is recognized in the lmprice catalog but has no price information \u2014 cost will be unavailable`);if(a==="claude"&&(c.kind==="priced"||c.kind==="known-unpriced"||c.kind==="estimated")&&e1.test(l)){let u=l.replace(/(\d)\.(?=\d)/g,"$1-");s.push(`[${o.alias}] model="${l}" matches the lmprice catalog only through its OpenRouter-style spelling ("." between version numbers); claude's own CLI expects "-" there and does an exact match, so it may reject this string verbatim even though lint recognizes it. If seed/chat fails with "issue with the selected model," try model="${u}" instead.`)}}return{warnings:s,errors:i}}async function KS(t,e={}){return(await VS(t,e)).warnings}async function zS(t,e={}){return(await VS(t,e)).errors}function YS(t){let e=process.env.KIMI_CODE_HOME||pg(qS(),".kimi-code"),n=t??pg(e,"config.toml");if(!BS(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=WS(n,"utf-8")}catch(i){return{available:!1,models:[],reason:`${n} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of r.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=m1(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s]}}function m1(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function p1(t){let e=t??pg(qS(),".config","opencode","opencode.json");if(!BS(e))return{available:!0,models:[]};let n;try{n=JSON.parse(WS(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:f1(n)}}function f1(t){if(!fg(t))return[];let e=vu(t.provider)??vu(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!fg(s))continue;let i=vu(s.models)??vu(s.model);if(i)for(let o of Object.keys(i))n.add(o.startsWith(`${r}/`)?o:`${r}/${o}`)}return[...n].sort()}function vu(t){return fg(t)?t:null}function fg(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function La(t){return t.length>0?t.join(", "):"(none)"}var GS,e1,wu,Eu,HS,t1,ug,r1,i1,dg,a1,c1,mg,Tu=L(()=>{"use strict";Gs();tu();GS=new Set(Object.keys(Sa).filter(t=>t!=="codex"&&t!=="kimi")),e1=/\d\.(?=\d)/,wu=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],Eu=["deepseek-flash","deepseek-pro"],HS="gpt-5.3-codex-spark",t1=15e3;ug=null;i1=5e3;dg=null;c1=5e3;mg=new Map});import*as QS from"node:child_process";function h1(t,e){try{let n=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return n.status===0?{found:!0,version:(n.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:n.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function yg(t,e={}){let n=e.spawnSync===void 0&&process.env[y1]==="1",r=e.spawnSync??QS.spawnSync,s=new Set,i=[];for(let o of t){if(s.has(o))continue;s.add(o);let a=ZS[o];if(!a){i.push({provider:o,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(n){i.push({provider:o,binary:a,found:!0,version:"(skipped)"});continue}let l=h1(a,r);l.found?i.push({provider:o,binary:a,found:!0,version:l.version}):i.push({provider:o,binary:a,found:!1,failureMode:l.failureMode})}return i}function ek(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(ZS).join(", ")})`;let e=g1[t.provider],n=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${n}`:`provider "${t.provider}" binary '${t.binary}' not installed${n}`}var ZS,g1,y1,_g=L(()=>{"use strict";ZS={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy",kimi:"kimi",dsh:"dsh",hermes:"hermes",miniplayer:"miniplayer",muse:"muse",pi:"pi"},g1={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",lmplayer:"Install lmplayer and ensure the lmplayer binary is on PATH.",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google",kimi:"https://github.com/MoonshotAI/kimi-code",dsh:"https://github.com/deepseek-ai/deepseek-harness",hermes:"https://github.com/NousResearch/hermes-agent",pi:"https://github.com/badlogic/pi-mono"};y1="LMCTL_SKIP_BINARY_CHECK"});var tk=L(()=>{"use strict";ep();ag();bu();bu();US();Tu();Gs();_g()});import{resolve as _1,join as nk}from"node:path";function bg(t,e={}){try{if(!zi(t))return B("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return B("cancelled","Context is closed");if(!e||typeof e!="object"||Array.isArray(e))return B("invalid_argument","Profile options must be a map");let n=e.path;if(Object.keys(e).some(i=>!(wt.find(o=>o.name==="loadProfile")?.params.find(o=>o.name==="options")?.keys??[]).some(o=>o.name===i))||n!==void 0&&(typeof n!="string"||!n))return B("invalid_argument","Profile options accept a nonempty path string only");let r=t.env.LMCTL_HOME||(t.env.HOME?nk(t.env.HOME,".lmctl"):void 0);if(!n&&!r)return B("invalid_argument","Profile path requires HOME, LMCTL_HOME or an explicit path");let s=_1(t.cwd,n??nk(r,"init.toml"));return ye({path:Yi({...t.env,HOME:t.env.HOME??t.cwd},s)})}catch(n){return B("invalid_argument","Invalid profile arguments: "+Y(n))}}function b1(t){try{if(!t||typeof t!="object"||Array.isArray(t))return B("invalid_argument","Expected a validated InitConfig");let e={};for(let n of["provider1","provider2","provider3"]){let r=t[n];if(!r||typeof r!="object"||Array.isArray(r))return B("invalid_argument",n+" must be a provider map");let s={};for(let i of["provider","model1"]){let o=r[i];if(typeof o!="string"||!o.trim())return B("invalid_argument",n+"."+i+" must be a nonempty string");s[i]=o}e[n]=s}return ye(gu(e))}catch(e){return B("invalid_argument","Invalid profile: "+Y(e))}}function v1(t,e={}){let n=bg(t,e);if(n.status==="error")return n;try{let r=_u(n.path);return ye({profile:{path:r.path,raw:r.raw,config:r.config},values:{...gu(r.config),Directory:t.cwd,NonInteractive:!t.interactive}})}catch(r){return r instanceof Vt?B(r.kind,r.message,{path:r.path,line:r.line,column:r.column}):B("read","Could not load profile: "+Y(r),{path:n.path})}}function w1(t,e={}){let n=bg(t,e);if(n.status==="error")return n;try{let r=cg(n.path),{properties:s,flat:i}=PS(r.document);return ye({path:r.path,properties:s,flat:i})}catch(r){return r instanceof Vt?B(r.kind,r.message,{path:r.path,line:r.line,column:r.column}):B("schema","Invalid properties in "+n.path+": "+Y(r)+". Fix the file or run lmctl init.",{path:n.path})}}var rk=L(()=>{"use strict";DS();sr();tk();ag();on();ft()});function On(t){return t!=="gemini"}function Su(t){if(!On(t))throw new Error(Qr)}var Qr,Zi=L(()=>{"use strict";Qr="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model."});function sk(t){if(t.length===0||!t.startsWith("---"))throw new Ln("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
2387
|
-
`);if(e[0]!=="---")throw new Ln("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){r=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Ln(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!E1.has(c))throw new Ln(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ku.join(", ")}`);n[c]=u}if(r===-1)throw new Ln("frontmatter not closed (missing trailing `---` on its own line)");for(let o of ku)if(n[o]===void 0)throw new Ln(`missing required frontmatter key "${o}" \u2014 required: ${ku.join(", ")}`);let s=0;for(let o=0;o<=r;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=n.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:n.title,description:n.description,members:i,bodyOffset:s}}var ku,E1,Ln,ik=L(()=>{"use strict";ku=["title","description","members"],E1=new Set(ku),Ln=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function wg(t){return vg.has(t)}var vg,Ru=L(()=>{"use strict";vg=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as T1,writeFileSync as $3,renameSync as U3,existsSync as ak}from"node:fs";import{basename as S1,resolve as eo,dirname as Eg}from"node:path";function k1(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],i=r[2]!==void 0?r[2]:r[3];e[s]=i}return e}function R1(t){return/^\s*
|
|
2387
|
+
`);if(e[0]!=="---")throw new Ln("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let o=1;o<e.length;o++){let a=e[o];if(a==="---"){r=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Ln(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!E1.has(c))throw new Ln(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ku.join(", ")}`);n[c]=u}if(r===-1)throw new Ln("frontmatter not closed (missing trailing `---` on its own line)");for(let o of ku)if(n[o]===void 0)throw new Ln(`missing required frontmatter key "${o}" \u2014 required: ${ku.join(", ")}`);let s=0;for(let o=0;o<=r;o++)s+=e[o].length+1;s>t.length&&(s=t.length);let i=n.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:n.title,description:n.description,members:i,bodyOffset:s}}var ku,E1,Ln,ik=L(()=>{"use strict";ku=["title","description","members"],E1=new Set(ku),Ln=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function wg(t){return vg.has(t)}var vg,Ru=L(()=>{"use strict";vg=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as T1,writeFileSync as $3,renameSync as U3,existsSync as ak}from"node:fs";import{basename as S1,resolve as eo,dirname as Eg}from"node:path";function k1(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],i=r[2]!==void 0?r[2]:r[3];e[s]=i}return e}function R1(t){return/^\s*_(?:MEMBER|AGENT)_\s+\S/.test(t)}function x1(t){return/^\s*_SESSION_\s+\S/.test(t)}function I1(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Ma(t){return/\.(?:lmctl|lmc)$/i.test(t)}function Pa(t){return S1(t).replace(/\.(?:lmctl|lmc)$/i,"")}function Kt(t){let e=T1(t,"utf-8"),n=Eg(eo(t)),r=Sg(e,Pa(t),{baseDir:n,sourcePath:eo(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=eo(n,s.sessiondir));return r}function Sg(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let i=t;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
|
|
2388
2388
|
`);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=sk(i)}catch(l){if(l instanceof Ln)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
|
|
2389
2389
|
`);for(let l=0;l<a.length;l++){let c=a[l],u=l+1;if(x1(c))throw new Error(`line ${u}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(I1(c)||!R1(c))continue;let d=k1(c);for(let p of Object.keys(d))if(!ok.includes(p))throw new Error(`line ${u}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
|
|
2390
2390
|
allowed keys: ${ok.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}if(!d.alias){s.push(`line ${u}: member line missing required alias: ${c.trim()}`);continue}let m={alias:d.alias,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),r.push(m)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:o}}function kg(t,e){let n=[];for(let i of t.parseErrors)n.push({field:"session",message:i});let r=t.members.filter(i=>i.alias.toLowerCase()===Tg.toLowerCase());r.length>1&&n.push({field:Tg,message:`${r.length} alias=Lead found (max 1)`});let s=new Set;for(let i of t.members){let o=i.alias.toLowerCase();if(s.has(o)&&n.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=e?eo(e,i.teamfile):eo(i.teamfile);if(!ak(a))n.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=Kt(a),c=xu(l);c?c.session||n.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else vg.has(i.provider)?On(i.provider)||n.push({field:i.alias,message:Qr}):n.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&n.push({field:i.alias,message:"sessiondir is empty"})}return n}function xu(t){return t.members.find(e=>e.alias.toLowerCase()===Tg.toLowerCase())}function Rg(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let i=eo(e,t.teamfile),o=n??new Set;if(o.has(i))throw new Error(`Circular team reference: ${t.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!ak(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${t.alias}")`);let a=Kt(i),l=xu(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Rg(l,Eg(i),o,r);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Eg(i),alias:t.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function Iu(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var Tg,ok,Mn=L(()=>{"use strict";Zi();ik();Ru();Tg="Lead";ok=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as A1}from"node:crypto";import{existsSync as lk,readFileSync as ck,realpathSync as C1}from"node:fs";import{dirname as N1,resolve as uk}from"node:path";function Dt(t,e){let n=uk(t);if(lk(n))return C1(n);if(e!==void 0){let r=L1(t,n,e);if(r!==null)return r}return n}function Cu(t,e){let n=N1(e),r=Sg(t,Pa(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=uk(n,s.sessiondir));return r}function to(t,e,n=r=>{process.stderr.write(`warning: ${r}
|
|
@@ -2544,7 +2544,7 @@ ${Fe(p,{provider:"dsh"})}`:"(no output captured)")))},fI);s.stdout?.on("data",p=
|
|
|
2544
2544
|
`),hA(r,c,"utf8"),n.onSeeded?.({alias:_.alias,provider:_.provider,sessionid:A.sessionId,sessiondir:E,...x!==void 0?{model:x}:{}}),e.stdout.write(`${_.alias}: seeded ${A.sessionId} provider=${_.provider} sessiondir=${E} model=${x?JSON.stringify(x):"default (not reported)"}
|
|
2545
2545
|
`)}finally{R()}}let g=l.join(`
|
|
2546
2546
|
`),y=sG(g,r_(r));y!==g&&hA(r,y,"utf8"),f===0&&e.stdout.write(`no members needed seeding
|
|
2547
|
-
`);let v=new Date().toISOString();try{await ve(e,_=>{eG(_,{teamfilePath:s,name:o.name,rawText:y,now:v})})}catch(_){return Tr(e,_ instanceof Error?_.message:String(_))}return 0}function Q2(t){return L2("sha256").update(t).digest("hex")}function Z2(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:Q2(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function eG(t,e){let n=Cu(e.rawText,e.teamfilePath);Ig(t,e.teamfilePath,n);let r=Z2(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function tG(t){let e=new Map;for(let n=0;n<t.length;n+=1){let r=t[n];if(!/^\s*
|
|
2547
|
+
`);let v=new Date().toISOString();try{await ve(e,_=>{eG(_,{teamfilePath:s,name:o.name,rawText:y,now:v})})}catch(_){return Tr(e,_ instanceof Error?_.message:String(_))}return 0}function Q2(t){return L2("sha256").update(t).digest("hex")}function Z2(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:Q2(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function eG(t,e){let n=Cu(e.rawText,e.teamfilePath);Ig(t,e.teamfilePath,n);let r=Z2(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function tG(t){let e=new Map;for(let n=0;n<t.length;n+=1){let r=t[n];if(!/^\s*_(?:MEMBER|AGENT)_\s+\S/.test(r))continue;let s=nG(r,"alias");s!==void 0&&e.set(s.toLowerCase(),n)}return e}function nG(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function t_(t,e,n){let r=`${e}=${rG(n)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(i,o)=>`${o}${r}`):`${t.trimEnd()} ${r}`}function rG(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function sG(t,e){let n=`#teamfile: ${e}`,r=t.indexOf(`
|
|
2548
2548
|
`),s=r>=0?t.slice(0,r):t,i=r>=0?t.slice(r+1):"";return s===n?t:s.startsWith("#teamfile:")?i.length>0?`${n}
|
|
2549
2549
|
${i}`:`${n}
|
|
2550
2550
|
`:t.length>0?`${n}
|
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",
|