@lmctl-ai/lmctl 0.2.418 → 0.2.420
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 +377 -369
- package/dist/lmbee.js +3 -3
- package/package.json +1 -1
package/build-info.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"sha": "
|
|
1
|
+
{"sha": "ede0579122773a65dd89dfe649c189d897b7454e", "dirty": false, "builtAt": "2026-10-25T03:22:45.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(`
|