@lmctl-ai/lmctl 0.2.407 → 0.2.408
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/README.md +5 -1
- package/build-info.json +1 -1
- package/dist/cli/index.js +112 -102
- package/dist/cli/lmscript.js +284 -282
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1281,7 +1281,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1281
1281
|
status, started_at, last_heartbeat_at, last_seq)
|
|
1282
1282
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,o),nf(e)&&BE(t,o,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function pl(t,e){let n=Kr(e.id),r=GE(t,n);return r===null?!1:(ht(t,{stream_id:n,event_type:wD,observedLastSeq:r.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:n,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
|
|
1283
1283
|
SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
|
|
1284
|
-
WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);nf(e)&&qE(t,s,n)}),!0)}function JE(t,e,n,r){let s=Kr(e.id),o=GE(t,s);return o===null?!1:(ht(t,{stream_id:s,event_type:TD,observedLastSeq:o.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},i=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,i,s,o.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function KE(t,e,n){let r=Kr(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),nf(e)&&XE(t,r,n)}function YE(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Kr(e))}function zE(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Kr(e))}var ED,wD,TD,QE=C(()=>{"use strict";ol();ml();ED="INVOCATION_START",wD="INVOCATION_FINISH",TD="INVOCATION_NOTIFY_CLAIM"});var vD,SD,
|
|
1284
|
+
WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);nf(e)&&qE(t,s,n)}),!0)}function JE(t,e,n,r){let s=Kr(e.id),o=GE(t,s);return o===null?!1:(ht(t,{stream_id:s,event_type:TD,observedLastSeq:o.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},i=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,i,s,o.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function KE(t,e,n){let r=Kr(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),nf(e)&&XE(t,r,n)}function YE(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Kr(e))}function zE(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Kr(e))}var ED,wD,TD,QE=C(()=>{"use strict";ol();ml();ED="INVOCATION_START",wD="INVOCATION_FINISH",TD="INVOCATION_NOTIFY_CLAIM"});var vD,SD,aY,ZE,ew,tw,nw=C(()=>{"use strict";vD="other",SD=["not_enough_information","dont_know","other_work"],aY=new Set([vD,...SD]),ZE="@abort",ew="invalid_decision",tw="workflow_escalation"});import{randomUUID as rw}from"node:crypto";import{existsSync as aw,mkdirSync as bD,renameSync as ID,rmdirSync as kD}from"node:fs";import{hostname as sf}from"node:os";function of(t){return t.provider_resolved??t.provider}function X(){return new Date().toISOString()}function AD(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!aw(t))return e;let n;try{n=new Mr(t,{readonly:!0})}catch{return e}try{let r=[];try{r=n.prepare("SELECT teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at FROM root_team").all()}catch{}let s=[];try{s=n.prepare("SELECT key, value FROM lmctl_config").all()}catch{}return{rootTeams:r,config:s}}finally{n.close()}}function ND(t){if(t===":memory:"||!aw(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{ID(r,`${e}${n}`)}catch{}}return e}function sw(t,e){let n=e instanceof Error?e.message:String(e);try{let r=AD(t),s=ND(t),o=new ci(si({dbPath:t}));for(let i of r.rootTeams)o.upsertRootTeam(i);for(let{key:i,value:a}of r.config)o.setConfig(i,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${xn} (${n}); started a fresh database instead. Preserved ${r.rootTeams.length} team registration(s) and ${r.config.length} config value(s).`+(s!==null?` Old database backed up at ${s}.
|
|
1285
1285
|
`:`
|
|
1286
1286
|
`)),o}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${t}: unusable (${n}), and recovery into a fresh database also failed (${s}). Check that the containing directory is writable, or move the file aside manually and retry.`)}}function rf(t,e){let n;try{return n=si({dbPath:t,allowSchemaSkew:e}),{dal:new ci(n)}}catch(r){if(r instanceof jt)throw r;let s;if(n!==void 0)try{s=n.pragma("user_version",{simple:!0})}catch{}try{n?.close()}catch{}return{cause:r,dbVersion:s}}}function CD(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function OD(t){if(t===":memory:")return!0;try{return bD(`${t}${lw}`),!0}catch{return!1}}function DD(t){if(t!==":memory:")try{kD(`${t}${lw}`)}catch{}}function Fe(t){let e=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1";if(t.recover===!1){let s=rf(t.path,e);if(s.dal)return s.dal;throw s.cause}let n={};for(let s=0;s<RD;s+=1)if(n=rf(t.path,e),n.dal!==void 0)return n.dal;let r=n.cause?.code;if(typeof r=="string"&&/^SQLITE_(BUSY|LOCKED)/.test(r))throw new Error(t.path+": database is busy; retry this command after the other writer finishes.",{cause:n.cause});if(n.dbVersion!==void 0&&n.dbVersion>xn){let s=n.cause instanceof Error?n.cause.message:String(n.cause);throw new jt(t.path,n.dbVersion,xn,s)}for(let s=0;s<xD;s+=1){if(OD(t.path))try{return sw(t.path,n.cause)}finally{DD(t.path)}CD(LD);let o=rf(t.path,e);if(o.dal!==void 0)return o.dal}return sw(t.path,n.cause)}function ow(t,e,n){let r=iw(e);if(r.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return iw(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let d of i(l))a(d)}finally{o.pop()}s.add(l)}};a(t)}function iw(t){let e=MD(t),n=e===null?null:$D(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))hl(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function MD(t){try{let e=JSON.parse(t);return hl(e)?e:null}catch{return null}}function $D(t,e){let n=t[e];return hl(n)?n:null}function hl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function PD(t){try{let e=JSON.parse(t);return!hl(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function UD(t,e){return t===null?!0:t.holder_host===sf()?!rt(t.holder_pid):t.last_heartbeat<e}function FD(t){return{getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
|
|
1287
1287
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
@@ -1724,11 +1724,11 @@ ${kM(t,wM,"provider output not saved")}
|
|
|
1724
1724
|
\u2026 ${s} characters of provider stderr dropped \u2026
|
|
1725
1725
|
${r}`}}}function Fs(t,e){return e===""?t:`${t}:${e.includes(`
|
|
1726
1726
|
`)?`
|
|
1727
|
-
`:" "}${e}`}var EM,wM,TM,vM,SM,bM,It=C(()=>{"use strict";yl();EM=500,wM=1e6,TM=50,vM=20*1024*1024,SM=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,bM=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi});import{readFileSync as Pw,appendFileSync as CM,mkdirSync as OM,existsSync as
|
|
1727
|
+
`:" "}${e}`}var EM,wM,TM,vM,SM,bM,It=C(()=>{"use strict";yl();EM=500,wM=1e6,TM=50,vM=20*1024*1024,SM=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,bM=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi});import{readFileSync as Pw,appendFileSync as CM,mkdirSync as OM,existsSync as XY,readdirSync as qY,unlinkSync as GY}from"node:fs";import{join as Tl,dirname as DM}from"node:path";import{homedir as MM}from"node:os";function pf(){return Tl(MM(),".lmctl")}function hf(){js=!0,process.env.LMCTL_DEBUG="1"}function Uw(){return{cliDebug:js,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Fw(t){js=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ye(){if(js||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-$w>=$M&&(Mw=jM(),$w=t),Mw}function _i(){return js||process.env.LMCTL_DEBUG==="1"}function PM(){let t=new Date,e=t.getTimezoneOffset(),n=e<=0?"+":"-",r=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${n}${r}:${s}`)}function mf(t,e="",n=new WeakSet){if(/(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|credential|token|secret)/i.test(e)&&typeof t=="string")return"[REDACTED]";if(typeof t=="string")return hi(t);if(Array.isArray(t))return t.map(r=>mf(r,"",n));if(t&&typeof t=="object"){if(n.has(t))return"[Circular]";n.add(t);let r={};for(let[s,o]of Object.entries(t))r[s]=mf(o,s,n);return n.delete(t),r}return t}function UM(t){return mf(t)}function qe(t,e){if(e?.verbose){if(!js)return}else if(!e?.always&&!ye())return;try{FM();let n={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...UM(t)};CM(wl,JSON.stringify(n)+`
|
|
1728
1728
|
`)}catch{}}function FM(){if(!wl){let e=PM().slice(0,13).replace("T","-");wl=Tl(pf(),`debug-${e}.log`)}OM(DM(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 jM(){return WM()||HM()}function WM(){try{let t=Pw(Tl(pf(),"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 HM(){try{let t=Pw(Tl(pf(),"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,Mw,$w,$M,wl,re=C(()=>{"use strict";It();js=!1,Mw=!1,$w=0,$M=5e3;wl=null});function a$(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 l$)if(n.test(t,e))return{class:n.class,rule:n.rule};return{class:"unknown",rule:null}}var Bt,l$,vl=C(()=>{"use strict";Bt=t=>e=>t.test(e);l$=[{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)=>a$(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 c$,closeSync as d$,fstatSync as u$,readSync as f$,constants as Xw}from"node:fs";import{dirname as m$,join as Sl}from"node:path";import{createHash as p$}from"node:crypto";function yf(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=Jw(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(!qw(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&&!qw(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 Gw(t){let e=c$(t,Xw.O_RDONLY|Xw.O_NONBLOCK);try{let n=u$(e);if(!n.isFile()||n.size>h$)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=f$(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{d$(e)}}function Ef(t,e=Sl(m$(t),"aliases.json")){let n=Gw(t),r=Gw(e),s;try{s=Vw(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=Vw(r),i={catalog:s,aliases:o,source:"pinned",generatedAt:s?.generated_at||null,sha256:p$("sha256").update(n).update(r).digest("hex")};return yf(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 yf(o),o})():null}finally{t.pragma("busy_timeout = "+e)}}function wf(t,e,n={}){yf(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(Jw(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 Tf(t,e={}){let n=e.now??Date.now(),r={...process.env,...e.env},s=Ws(t),o=gf.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(Ef(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(gf.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=wf(t,c,{now:n}),u=Ws(t);return gf.set(t,{hash:u?.sha256??null,at:n}),{status:d,snapshot:u}}async function bl(t,e){try{return(await Tf(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 vf(t){if(t.dal)return bl(t.dal.db,t.env);let e;try{return e=Fe({path:Ie(t),recover:!1}),await bl(e.db,t.env)}catch{return gi}finally{try{e?.close()}catch{}}}var gi,Jw,qw,h$,Vw,gf,Il=C(()=>{"use strict";Zt();bt();se();gi={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null},Jw=t=>t.record_id??t.source+":"+t.source_model_id,qw=t=>t===null||typeof t=="number"&&Number.isFinite(t)&&t>=0;h$=64*1024*1024;Vw=t=>JSON.parse(t.replace(/^\uFEFF/,""));gf=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 Kw(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(!_$.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,_$,rn,Yw=C(()=>{"use strict";Al=["title","description","members"],_$=new Set(Al),rn=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function Qr(t){return Sf.has(t)}var Sf,yi=C(()=>{"use strict";Sf=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as g$,writeFileSync as
|
|
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(!_$.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,_$,rn,Yw=C(()=>{"use strict";Al=["title","description","members"],_$=new Set(Al),rn=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function Qr(t){return Sf.has(t)}var Sf,yi=C(()=>{"use strict";Sf=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as g$,writeFileSync as gz,renameSync as yz,existsSync as Qw}from"node:fs";import{basename as y$,resolve as Bs,dirname as bf}from"node:path";function E$(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 w$(t){return/^\s*_MEMBER_\s+\S/.test(t)}function T$(t){return/^\s*_SESSION_\s+\S/.test(t)}function v$(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Oe(t){return/\.(?:lmctl|lmc)$/i.test(t)}function Ei(t){return y$(t).replace(/\.(?:lmctl|lmc)$/i,"")}function ke(t){let e=g$(t,"utf-8"),n=bf(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=Kw(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(T$(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(v$(c)||!w$(c))continue;let u=E$(c);for(let m of Object.keys(u))if(!zw.includes(m))throw new Error(`line ${d}: unknown key "${m}" on _MEMBER_ line: ${c.trim()}
|
|
1734
1734
|
allowed keys: ${zw.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()===If.toLowerCase());r.length>1&&n.push({field:If,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(!Qw(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 Sf.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()===If.toLowerCase())}function kf(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),!Qw(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 kf(l,bf(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||bf(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 If,zw,ze=C(()=>{"use strict";Hs();Yw();yi();If="Lead";zw=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as S$}from"node:crypto";import{existsSync as Zw,readFileSync as eT,realpathSync as b$}from"node:fs";import{dirname as I$,resolve as tT}from"node:path";function Re(t,e){let n=tT(t);if(Zw(n))return b$(n);if(e!==void 0){let r=A$(t,n,e);if(r!==null)return r}return n}function xl(t,e){let n=I$(e),r=Xs(t,Ei(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=tT(n,s.sessiondir));return r}function sn(t,e,n=r=>{process.stderr.write(`warning: ${r}
|
|
@@ -1747,7 +1747,7 @@ ${r}`}}}function Fs(t,e){return e===""?t:`${t}:${e.includes(`
|
|
|
1747
1747
|
AND status = 'running'`,e,n),s=0;for(let o of r)Mf(t,o)!==null&&(s+=1);return s}var Ul=C(()=>{"use strict";ot();bt();Wt()});function Fl(t,e,n){return $n(t)&&e.tools[t]?.agent===void 0&&n.includes(t)}async function Un(t,e,n,r,s){if(t.provider!==e)throw new Error(`bundle session provider mismatch: session serves "${t.provider}", turn targets "${e}"`);if(t.sessionId!==n)throw new Js(`session identity mismatch: expected "${n}", got "${t.sessionId}"`);let o=await t.sendTurn(r,s);if(o.sessionId!==n)throw Object.assign(new Js(`session identity mismatch: expected "${n}", got "${o.sessionId}"`),{usage:o.usage,sessionId:o.sessionId});return{...o,...o.text===""&&o.sawActivity===!1?{status:"empty"}:{}}}async function jl(t,e){kl(t.name);let n=e.requireResume??!0;if(n&&!e.sessionId.trim())throw new Error("conversation requires an existing session ID");let r=e.userConfig?.tools[t.name]?.agent!==void 0,s=e.execution!=="per-turn"&&t.openSession!==void 0&&!r;if(e.execution==="persistent"&&!s)throw new Error(`provider "${t.name}" does not support persistent sessions with this configuration`);let o=s?await t.openSession(e):void 0,i=!n&&e.sessionId==="";if(o&&(o.provider!==t.name||typeof o.sessionId!="string"||!o.sessionId.trim()||!i&&o.sessionId!==e.sessionId))throw await o.close(),new Error(`session identity mismatch opening ${t.name}: expected "${e.sessionId}", got "${o.sessionId}" (${o.provider})`);let a=o?.sessionId??e.sessionId,l=0,c=!1,d,u;return{provider:t.name,sessionId:a,execution:s?"persistent":"per-turn",transport:r?"custom":t.protocol?.transport??"unknown",cancellation:r?"unknown":s?t.protocol?.persistentCancellation??"unknown":t.protocol?.perTurnCancellation??"unknown",get completedTurns(){return l},async sendTurn(f,m={}){if(c)throw new Error("conversation is closed");if(d)throw new Error("conversation already has an active turn");if(m.signal?.aborted)throw new Error("Aborted");let p=new AbortController;d=p;let _=()=>p.abort();m.signal?.addEventListener("abort",_,{once:!0});try{let h=o?await Un(o,t.name,a,f,{...m,signal:p.signal}):await t.sendTurn(f,{...e,...m,signal:p.signal,requireResume:n,timeoutMs:e.timeoutMs??0});if(p.signal.aborted)throw Object.assign(new Error("Aborted"),{usage:h.usage,sessionId:h.sessionId});if(n&&h.sessionId!==e.sessionId)throw c=!0,Object.assign(new Js(`session identity mismatch: expected "${e.sessionId}", got "${h.sessionId}"`),{usage:h.usage,sessionId:h.sessionId});return h.status!=="empty"&&h.status!=="stalled"&&l++,h}catch(h){throw p.signal.aborted&&o&&t.protocol?.persistentCancellation==="session"&&(c=!0),h instanceof Js&&(c=!0,await o?.close()),h}finally{m.signal?.removeEventListener("abort",_),d=void 0}},close(){return u||(c=!0,d?.abort(),u=o?o.close():Promise.resolve()),u}}}var Js,Ks=C(()=>{"use strict";Hs();Js=class extends Error{}});import{realpathSync as _P}from"node:fs";import{resolve as gP}from"node:path";function $f(t){let e=gP(t);try{return _P(e)}catch{return e}}var AT=C(()=>{"use strict"});import{platform as NT}from"node:os";function Ys(t){let e=new bi;for(let n of t)e.registerAdapter(n);return e}var bi,Pf=C(()=>{"use strict";AT();bi=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(r.map(i=>i.discoverSessions()));for(let i of s)n.push(...i);let o=n;if(e?.workspace){let i=$f(e.workspace);o=o.filter(a=>$f(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(o=>o.name===n):this.providers,s=[];for(let o of r){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=NT()==="darwin"||NT()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});function Wf(){return new Ff}function Hf(t){let e=!1;for(let n of t.split(`
|
|
1748
1748
|
`)){let r;try{r=JSON.parse(n)}catch{continue}let s=r.type;typeof s=="string"&&(s.endsWith(".started")&&(e=!0),["turn.completed","turn.failed","turn.aborted","turn.cancelled","error"].includes(s)&&(e=!1))}return e}function Bf(t){let e=t.trimEnd().split(`
|
|
1749
1749
|
`).at(-1)?.trimStart()??"";if(!e.startsWith("{"))return!1;try{return JSON.parse(e),!1}catch{return!0}}function RT(t){let e,n=!1,r=!1,s;for(let o of t.split(`
|
|
1750
|
-
`)){let i;try{i=JSON.parse(o)}catch{continue}if(i.type==="thread.started"&&typeof i.thread_id=="string"&&(e=i.thread_id),i.type==="turn.started"&&(n=!0),i.type!=="turn.completed"||!n||r)continue;r=!0;let a=i.usage;if(!a)continue;let l=at(a.input_tokens),c=at(a.cached_input_tokens);s={source:"wire",inputUncached:l===null||c===null||c>l?null:l-c,cacheRead:c,cacheWrite:0,output:at(a.output_tokens),reasoning:at(a.reasoning_output_tokens),modelReported:typeof i.model=="string"?i.model:null,providerCostUsd:null,reason:null,invalidCounters:Qt([a.input_tokens,a.cached_input_tokens,a.output_tokens,a.reasoning_output_tokens])||l!==null&&c!==null&&c>l},[s.inputUncached,s.cacheRead,s.output].includes(null)&&(s.reason="counter_not_exposed")}return(Bf(t)||Hf(t))&&(s={source:"wire",inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:"counter_not_exposed",invalidCounters:!0}),{sessionId:e,usage:s}}var at,yP,Uf,Ff,jf,Xf=C(()=>{"use strict";zo();at=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,yP=(t,e)=>t===null||e===null?null:at(t+e),Uf=(t,e)=>JSON.stringify([t,e]),Ff=class{finished=new Set;seen=new Set;models=new Map;reportModel(e,n){typeof n=="string"&&n&&n!=="<synthetic>"&&this.models.set(e,n)}remember(e,n){typeof n=="string"&&n&&this.finished.add(Uf(e,n))}turn(e,n=""){return new jf(this,e,n)}};jf=class{session;thread;id;value;ended=!1;reported=new Set;constructor(e,n,r){this.session=e,this.thread=n,this.id=r}bind(e){return typeof e!="string"||!e||this.ended||this.session.finished.has(Uf(this.thread,e))||this.id&&this.id!==e?!1:(this.id=e,!0)}event(e){let n=e.method,r=e.params,s=r?.turn,o=r?.turnId??s?.id,i=typeof r?.threadId=="string"?r.threadId:this.thread;if(this.thread&&i!==this.thread||(this.thread||(this.thread=i),typeof o=="string"&&this.session.finished.has(Uf(i,o))))return!1;if(n==="turn/started")return this.bind(o);if(this.id&&o&&o!==this.id)return!1;if(n==="turn/completed")return this.id?!this.ended:this.bind(o);if(n!=="thread/tokenUsage/updated")return!0;if(this.ended||!this.id||r?.threadId!==this.thread||r?.turnId!==this.id)return!1;let a=r.tokenUsage;if(!a?.last||typeof a.last!="object"||Array.isArray(a.last)||[a.last.inputTokens,a.last.cachedInputTokens,a.last.outputTokens].every(T=>T==null))return!0;let l=T=>["inputTokens","cachedInputTokens","cacheWriteInputTokens","outputTokens","reasoningOutputTokens","totalTokens"].map(S=>T[S]??null),c=a.total&&["inputTokens","cachedInputTokens","outputTokens"].every(T=>at(a.total[T])!==null)?l(a.total):null,d=typeof e.id=="string"&&e.id.length>0||typeof e.id=="number"&&Number.isSafeInteger(e.id)?e.id:null,u=at(e.emittedAtMs)??d,f=at(e.ordinal)??at(r.ordinal),m=JSON.stringify([this.thread,this.id,c,l(a.last),u,d,f]),p=u!==null||f!==null;if(p&&this.session.seen.has(m))return!1;p&&this.session.seen.add(m);let _=a.last,h=at(_.inputTokens),g=at(_.cachedInputTokens),y={source:"wire",inputUncached:h===null||g===null||g>h?null:h-g,cacheRead:g,cacheWrite:at(_.cacheWriteInputTokens??0),output:at(_.outputTokens),reasoning:at(_.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:Qt([_.inputTokens,_.cachedInputTokens,_.cacheWriteInputTokens,_.outputTokens,_.reasoningOutputTokens])||h!==null&&g!==null&&g>h};[y.inputUncached,y.cacheRead,y.cacheWrite,y.output].includes(null)&&(y.reason="counter_not_exposed");let w=r.model??_.model;if(typeof w=="string"&&w&&w!=="<synthetic>"&&this.reported.add(w),!this.value)this.value=y;else{for(let T of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let S=this.value[T],I=y[T];S!==null&&I!==null&&at(S+I)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[T]=yP(this.value[T],y[T])}this.value.reason=this.value.reason||y.reason,this.value.invalidCounters||=y.invalidCounters}return!0}usage(){if(this.value)return{...this.value,modelReported:this.reported.size>1?null:[...this.reported][0]??this.session.models.get(this.thread)??null,mixedModels:this.reported.size>1}}finish(){this.ended=!0,this.id&&this.session.remember(this.thread,this.id)}}});import{readFileSync as EP,writeFileSync as
|
|
1750
|
+
`)){let i;try{i=JSON.parse(o)}catch{continue}if(i.type==="thread.started"&&typeof i.thread_id=="string"&&(e=i.thread_id),i.type==="turn.started"&&(n=!0),i.type!=="turn.completed"||!n||r)continue;r=!0;let a=i.usage;if(!a)continue;let l=at(a.input_tokens),c=at(a.cached_input_tokens);s={source:"wire",inputUncached:l===null||c===null||c>l?null:l-c,cacheRead:c,cacheWrite:0,output:at(a.output_tokens),reasoning:at(a.reasoning_output_tokens),modelReported:typeof i.model=="string"?i.model:null,providerCostUsd:null,reason:null,invalidCounters:Qt([a.input_tokens,a.cached_input_tokens,a.output_tokens,a.reasoning_output_tokens])||l!==null&&c!==null&&c>l},[s.inputUncached,s.cacheRead,s.output].includes(null)&&(s.reason="counter_not_exposed")}return(Bf(t)||Hf(t))&&(s={source:"wire",inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:"counter_not_exposed",invalidCounters:!0}),{sessionId:e,usage:s}}var at,yP,Uf,Ff,jf,Xf=C(()=>{"use strict";zo();at=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,yP=(t,e)=>t===null||e===null?null:at(t+e),Uf=(t,e)=>JSON.stringify([t,e]),Ff=class{finished=new Set;seen=new Set;models=new Map;reportModel(e,n){typeof n=="string"&&n&&n!=="<synthetic>"&&this.models.set(e,n)}remember(e,n){typeof n=="string"&&n&&this.finished.add(Uf(e,n))}turn(e,n=""){return new jf(this,e,n)}};jf=class{session;thread;id;value;ended=!1;reported=new Set;constructor(e,n,r){this.session=e,this.thread=n,this.id=r}bind(e){return typeof e!="string"||!e||this.ended||this.session.finished.has(Uf(this.thread,e))||this.id&&this.id!==e?!1:(this.id=e,!0)}event(e){let n=e.method,r=e.params,s=r?.turn,o=r?.turnId??s?.id,i=typeof r?.threadId=="string"?r.threadId:this.thread;if(this.thread&&i!==this.thread||(this.thread||(this.thread=i),typeof o=="string"&&this.session.finished.has(Uf(i,o))))return!1;if(n==="turn/started")return this.bind(o);if(this.id&&o&&o!==this.id)return!1;if(n==="turn/completed")return this.id?!this.ended:this.bind(o);if(n!=="thread/tokenUsage/updated")return!0;if(this.ended||!this.id||r?.threadId!==this.thread||r?.turnId!==this.id)return!1;let a=r.tokenUsage;if(!a?.last||typeof a.last!="object"||Array.isArray(a.last)||[a.last.inputTokens,a.last.cachedInputTokens,a.last.outputTokens].every(T=>T==null))return!0;let l=T=>["inputTokens","cachedInputTokens","cacheWriteInputTokens","outputTokens","reasoningOutputTokens","totalTokens"].map(S=>T[S]??null),c=a.total&&["inputTokens","cachedInputTokens","outputTokens"].every(T=>at(a.total[T])!==null)?l(a.total):null,d=typeof e.id=="string"&&e.id.length>0||typeof e.id=="number"&&Number.isSafeInteger(e.id)?e.id:null,u=at(e.emittedAtMs)??d,f=at(e.ordinal)??at(r.ordinal),m=JSON.stringify([this.thread,this.id,c,l(a.last),u,d,f]),p=u!==null||f!==null;if(p&&this.session.seen.has(m))return!1;p&&this.session.seen.add(m);let _=a.last,h=at(_.inputTokens),g=at(_.cachedInputTokens),y={source:"wire",inputUncached:h===null||g===null||g>h?null:h-g,cacheRead:g,cacheWrite:at(_.cacheWriteInputTokens??0),output:at(_.outputTokens),reasoning:at(_.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:Qt([_.inputTokens,_.cachedInputTokens,_.cacheWriteInputTokens,_.outputTokens,_.reasoningOutputTokens])||h!==null&&g!==null&&g>h};[y.inputUncached,y.cacheRead,y.cacheWrite,y.output].includes(null)&&(y.reason="counter_not_exposed");let w=r.model??_.model;if(typeof w=="string"&&w&&w!=="<synthetic>"&&this.reported.add(w),!this.value)this.value=y;else{for(let T of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let S=this.value[T],I=y[T];S!==null&&I!==null&&at(S+I)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[T]=yP(this.value[T],y[T])}this.value.reason=this.value.reason||y.reason,this.value.invalidCounters||=y.invalidCounters}return!0}usage(){if(this.value)return{...this.value,modelReported:this.reported.size>1?null:[...this.reported][0]??this.session.models.get(this.thread)??null,mixedModels:this.reported.size>1}}finish(){this.ended=!0,this.id&&this.session.remember(this.thread,this.id)}}});import{readFileSync as EP,writeFileSync as i6,mkdirSync as a6}from"node:fs";import{join as wP,dirname as c6}from"node:path";import{homedir as TP}from"node:os";function SP(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function bP(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=SP(t.slice(e+1).trim());return n?{key:n,value:r}:null}function IP(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function Wl(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function kP(){return wP(TP(),".lmctl","config.toml")}function Hl(t){let e=t??kP(),n;try{n=EP(e,"utf-8")}catch{return{tools:{}}}return AP(n)}function xT(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function AP(t){let e={},n={},r=t.split(`
|
|
1751
1751
|
`),s={kind:"none"},o={},i=!1,a={};function l(){if(s.kind==="tool"){let u=e[s.tool]??{};if(s.profile){let f=u.profiles?.[s.profile]??{};o.description&&(f.description=o.description),o.flags!==void 0&&(f.flags=o.flags),u.profiles||(u.profiles={}),u.profiles[s.profile]=f}else o.start&&(u.start=o.start),o.resume&&(u.resume=o.resume),o.agent&&(u.agent=o.agent),o.profile_flag!==void 0&&(u.profile_flag=o.profile_flag);e[s.tool]=u}else if(s.kind==="compact"){let u=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(o.min!==void 0){let f=xT(o.min);f!==null&&(u.min=f)}if(o.max!==void 0){let f=xT(o.max);f!==null&&(u.max=f)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=u):n.global=u}o={}}for(let u of r){let f=u.trim();if(!f||f.startsWith("#"))continue;let m=IP(f);if(m!==null){if(i=!0,l(),m.startsWith("tool.")){let _=".profile.",h=m.indexOf(_);h!==-1?s={kind:"tool",tool:m.slice(5,h),profile:m.slice(h+_.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=bP(f);p&&s.kind!=="none"?o[p.key]=p.value:p&&!i&&(a[p.key]=p.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let d=a.site_name;return d!==void 0&&d.length>0&&(c.site_name=d),c}function LT(t){return t.site_name??null}function NP(t,e,n){if(!n)return"";let r=t.tools[e]??qf[e],s=r?.profiles?.[n]?.flags??qf[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function CT(t,e){return!!t.tools[e]}function OT(t,e,n,r,s){let o=t.tools[e]??qf[e],i;if(o?.agent){let l=Wl(r);i=o.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=vP[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let d=c.map(Wl).join(" ");i=`printf '%s\\n' ${Wl(r)} | ${d}`}else i=c.map(Wl).join(" ")}let a=NP(t,e,s);return a&&(i+=" "+a),i}var qf,vP,Bl=C(()=>{"use strict";qf={muse:{start:"muse",resume:"muse resume {{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}},hermes:{start:"hermes",resume:"hermes --yolo --resume {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}}},vP={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]},hermes:{mode:"argv",argv:["hermes","--yolo","-z","{{prompt}}","--resume","{{session_id}}"]}}});function DT(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var MT=C(()=>{"use strict"});function ql(t){let e=t?.prompt??ee;if(t?.teamfile!==void 0){let n=t.teamfileContent??"";e=`${ee}${PT}${t.teamfile}:
|
|
1752
1752
|
${n}${Vf}${JSON.stringify(t.teamfile)}${Jf}`}return t?.flightToken&&(e=`${t.flightToken.startsWith("[lmctl-seed:")?t.flightToken:`[lmctl-seed:${t.flightToken}]`}
|
|
1753
1753
|
${e}`),e}function $T(t){let e=t.trim(),n=e.match(/^\[lmctl-seed:[0-9a-zA-Z_-]+\](?:\r?\n|\s+)/);if(n&&(e=e.slice(n[0].length).trim()),e===ee)return!0;let r=`${ee}${PT}`;if(!e.startsWith(r)||!e.endsWith(Jf))return!1;let s=e.slice(r.length),o=s.slice(0,-Jf.length),i=o.lastIndexOf(Vf);if(i===-1)return!1;let a=o.slice(i+Vf.length),l;try{if(l=JSON.parse(a),typeof l!="string")return!1}catch{return!1}let c=`${l}:
|
|
@@ -1857,7 +1857,7 @@ The session marker may be stale or the team may not be registered in this lmctl
|
|
|
1857
1857
|
Consulted ${di(r,s)}
|
|
1858
1858
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function Jb(t){return`unknown option --from
|
|
1859
1859
|
${jj(t)}`}function jc(t,e){let n=Gp(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function Gp(t,e){let n=t[Yf];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let o of e.listRootTeams()){let i;try{i=sn(o.teamfile_path,e)}catch{continue}for(let a of i.members)a.teamfile===void 0&&a.session===n&&r.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Zi=C(()=>{"use strict";bt();Mo();Xt();On();on()});function as(t){let e=Pn(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Wc=C(()=>{"use strict";ot()});function Vp(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,o=()=>t.dal!==void 0?t.dal:(s===null&&(s=Fe({path:Ie(t)})),s),i=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>o().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&rt(a.holder_pid)),pollMs:Wj,settleMs:Hj,maxHoldMs:Ds(n),onHold:()=>U({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{i(),!(!a.held&&a.reason==="cleared")&&U({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function Kb(t){let e=t.literalPrompt?t.newMessage:Bj(t.newMessage,{newMessageFrom:t.newMessageFrom??Xj(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=ye(),s=0,o=0,i=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,i=Buffer.byteLength(c,"utf8"),o+=i),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};t.registry&&(a.registry=t.registry),t.signal&&(a.signal=t.signal),t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),t.requireResume!==void 0&&(a.requireResume=t.requireResume),t.bundleSession!==void 0&&(a.bundleSession=t.bundleSession),a.holdOpen=Vp(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await Ki(a);if(t.requireResume&&l.sessionId!==t.receiver.sessionId)throw Object.assign(new Error(`provider session changed: expected ${t.receiver.sessionId}, received ${l.sessionId??"(missing)"}`),{usage:l.usage,sessionId:l.sessionId});return r&&Ye(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:o,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:i,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:l.status==="empty"?{status:"empty",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:{status:"ok",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}}function Bj(t,e={}){return[`--- new prompt (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
|
|
1860
|
-
`)}function Xj(t){return`${t.teamfile}:${t.alias}`}var
|
|
1860
|
+
`)}function Xj(t){return`${t.teamfile}:${t.alias}`}var x7,Wj,Hj,Jp=C(()=>{"use strict";Hn();re();se();bt();Jr();Wt();x7=60*60*1e3,Wj=2e3,Hj=5e3});async function Hc(t){let e=t.onEvent??(()=>{}),n=qj(t.io,e),r=null,s=null,o=null,i,a,l=null,c=!1,d=null,u=t.prompt,f,m=()=>{let p=t.signal?.reason;if(o===null||!["SIGINT","SIGTERM","SIGHUP"].includes(p))return;let _;try{_=n.dal??Fe({path:Ie(n)}),_.finishTrackedInvocation(o,{status:"cancelled",signal:p,exit_code:p==="SIGINT"?130:p==="SIGTERM"?143:129,error:`prompt holder received ${p}`,team_chat_log_id:l}),s!==null&&_.releaseAgentInflight(s.row,s.leaseId)}catch(h){n.stderr.write(`error: failed to record holder ${p}: ${String(h)}
|
|
1861
1861
|
`)}finally{n.dal===void 0&&_?.close()}};t.signal?.addEventListener("abort",m,{once:!0});try{let p=t.resolvedNativeTarget,_=p!==void 0;if(_&&(t.heldLease===void 0||t.conversation===void 0))throw new ge("native session turns require a caller-held lease and conversation");let h=_?p:await W(n,O=>Ge(t.teamfile,t.alias,O));if(t.expectedSession!==void 0&&(h.provider!==t.expectedSession.provider||h.sessionid!==t.expectedSession.sessionid))throw new ge(`session changed for ${h.alias}; expected ${t.expectedSession.provider}:${t.expectedSession.sessionid}, found ${h.provider}:${h.sessionid}`);if(_&&(t.conversation.provider!==h.provider||t.conversation.sessionId!==h.sessionid))throw new ge("native session changed for "+h.alias+"; expected "+h.provider+":"+h.sessionid+", found "+t.conversation.provider+":"+t.conversation.sessionId);let g=h.teamfile,E=await W(n,O=>nW(O,t.env??process.env)),y=E.sender,w=_?"native:"+h.provider+":"+h.sessionid:await rW(n,{explicitRoot:t.rootFlag,sender:y,receiverTeamfile:g,operatorOrigin:E.origin==="operator"}),T=t.env??process.env;if(!_){let O=await W(n,M=>M.getRootTeam(w)?.name??null);O!==null&&(T.LMBEE_TEAM_NAME=O)}if(o=await Kj(n,{receiverTeamfile:g,receiverAlias:h.alias,sender:y,rootTeamfile:w,provider:h.provider,model:h.model,sessionId:h.sessionid,cwd:h.sessiondir,prompt:t.prompt,origin:E.origin,parentInvocationId:Us(T.LMCTL_INVOCATION_ID)}),i=Zj(n,o),t.signal?.aborted)throw m(),Error("Chat turn cancelled");o!==null&&(T.LMCTL_INVOCATION_ID=String(o));try{_||Vs(n,ke(g),g)}catch{}r={root_teamfile:w,sender_teamfile:y?.teamfile??null,sender_alias:y?.alias??null,receiver_teamfile:g,receiver_alias:h.alias,receiver_provider:h.provider,receiver_session_id:h.sessionid,origin:E.origin,message_type:t.messageType??null};let S=await nI(n,g,h.alias);if(S!==null){let O=Qi(S);return ls(o,r,t.prompt,O,"unavailable"),d=Kp(O,null),{status:"busy",message:O,teamChatLogId:null}}let I=!1;if(t.heldLease!==void 0){let O=t.heldLease;if(!await W(n,P=>{let q=P.getAgentInflight(g,h.alias);return q===null||q.sender_teamfile!==O.row.sender_teamfile||q.sender_alias!==O.row.sender_alias||q.started_at!==O.row.started_at||q.holder_pid!==process.pid?!1:P.heartbeatAgentInflight(O.row,O.leaseId,new Date().toISOString())})){let P=`bundle lease lost for ${h.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return ls(o,r,t.prompt,P,"unavailable"),d=ea(P,null),{status:"error",errorKind:"provider",message:P,teamChatLogId:null,messageId:null}}}else{let O=await Gj(n,g,h.alias);if(O.busy){let M=await Vj(n,g,h.alias);return M+=await Jj(n,g,h.alias),ls(o,r,t.prompt,M,"unavailable"),d=Kp(M,null),{status:"busy",message:M,teamChatLogId:null}}I=O.idleReclaim}if(y!==null&&y.teamfile!==g){let O=await W(n,M=>ST(M,{root:w,sender:y,receiverTeamfile:g,receiverAlias:h.alias,now:new Date}));if(O.stop){let M=IT(O.chain);return ls(o,r,t.prompt,M,"cycle"),d=ea(M,null),{status:"error",errorKind:"cycle",message:M,teamChatLogId:null,messageId:null}}}if(t.heldLease===void 0){let O=await sW(n,{receiver_teamfile:g,receiver_alias:h.alias,sender_teamfile:y?.teamfile??g,sender_alias:y?.alias??"operator",...I?{force:!0,reclaimReason:"session-idle"}:{}});if(!O.acquired){let M=rI(g,h.alias,O.current);return M+=` ${Xp(Bp({holderPid:O.current.holder_pid,since:O.current.started_at}))}`,ls(o,r,t.prompt,M,"unavailable"),d=Kp(M,null),{status:"busy",message:M,teamChatLogId:null}}s={row:O.lease,leaseId:O.leaseId},t.onInflightAcquired?.(s),a=cl(M=>W(n,P=>P.heartbeatAgentInflight(s.row,s.leaseId,M)),{intervalMs:eI,onError:M=>{ye()&&Ye(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:M instanceof Error?M.message:String(M)}))}})}if(t.signal?.aborted)throw Error("Chat turn cancelled");f=sl({provider:h.provider,modelRequested:h.model??null,cwd:h.sessiondir,sessionId:h.sessionid}),r&&(r.started_at=f.startedAt);let A=await Kb({sender:y??{teamfile:g,alias:"operator"},receiver:{teamfile:g,alias:h.alias,provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.isLead!==void 0?{isLead:h.isLead}:{}},signal:t.signal,newMessage:t.prompt,newMessageFrom:y===null?"operator":`${y.teamfile}:${y.alias}`,..._?{literalPrompt:!0}:{},io:n,permissionMode:t.permissionMode,...t.expectedSession!==void 0?{requireResume:!0}:{},...t.bundleSession!==void 0?{bundleSession:t.bundleSession}:{},...t.conversation!==void 0?{bundleSession:t.conversation}:{},...t.registry!==void 0?{registry:t.registry}:{},env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:O=>e({kind:"delta",chunk:O}),onProgress:O=>e({kind:"progress",alias:h.alias,event:O}),onPromptBuilt:async O=>{u=O,l===null&&(l=await iW(n,{...r,message:O,usage:f}),l!==null&&(t.onAccepted?.(Ln(l)),o!==null&&await Qj(n,o,l))),o!==null&&await zj(n,o,O)}});u=A.prompt;let N=A.status==="stalled",x=A.status==="empty",b=null,v=N?`provider stalled${A.stalledAfterMs!==void 0?` after ${A.stalledAfterMs}ms`:""}`:x?"provider returned no content and no observed activity for this turn -- often an upstream failure (rate limit, quota, auth) the provider did not report as an error":A.status==="error"?A.error??A.receipt:null,k=N||x||A.status==="error"?"error":"ok",R=await ti(f,{status:A.status,sessionId:A.sessionId,usage:A.usage},()=>vf(n),{db:n.dal?.db,dbPath:Ie(n),env:n.env});l!==null?(await Qb(n,l,{...r,message:u,response:A.receipt,status:k,error_detail:v,usage:R}),c=!0,b=l):b=await Zb(n,{...r,message:u,response:A.receipt,status:k,error_detail:v,usage:R});let L=A.status!=="error"?A.warnings:void 0;if(N||x){let O=v;ls(o,r,u,O,"error"),d=ea(O,b,A.receipt,L)}else d=eW(A.receipt,b,L);return{status:N?"stalled":x?"empty":"ok",replyText:A.receipt,wroteDelta:A.wroteDelta,teamChatLogId:b,messageId:b===null?null:Ln(b),durationMs:A.durationMs,usage:R,errorClass:N||x?Mn(v,{model:f.model_requested,status:N?"stalled":"empty"}).class:null}}catch(p){let _=p instanceof Error?p.message:String(p),h=p,g=f?await ti(f,{status:Cs(_,!!t.signal?.aborted),usage:h?.usage,sessionId:h?.sessionId},()=>vf(n),{db:n.dal?.db,dbPath:Ie(n),env:n.env}):void 0;return l!==null&&!c&&r!==null&&(await Qb(n,l,{...r,message:u,response:null,status:"error",error_detail:_,usage:g}),c=!0),l===null&&r!==null&&g&&(l=await Zb(n,{...r,message:u,response:null,status:"error",error_detail:_,usage:g})),ls(o,r,u,_,"error"),d={...ea(_,l),signal:p?.signal??null,exit_code:p?.exitCode??null},{status:"error",errorKind:p instanceof ge?"target":"provider",message:_,teamChatLogId:l,messageId:l===null?null:Ln(l),usage:g,errorClass:Mn(_,{model:f?.model_requested}).class}}finally{t.signal?.removeEventListener("abort",m),i!==void 0&&clearInterval(i),a!==void 0&&clearInterval(a),l!==null&&await aW(n,r,Ln(l)),s!==null&&await oW(n,s.row,s.leaseId)&&t.onInflightReleased?.(s.leaseId),o!==null&&await Yj(n,o,d??ea("chat turn exited without a terminal outcome",null))}}function qj(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function Gj(t,e,n){let r=await W(t,o=>(Pl(o,e,n),tn(o,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await W(t,o=>jb(o,r,e,n));return{busy:!s,idleReclaim:s}}async function Vj(t,e,n){let r=await nI(t,e,n);if(r!==null)return Qi(r);let s=await W(t,o=>o.getAgentInflight(e,n));return s!==null?rI(e,n,s):`${n} is busy; wait and retry`}async function Jj(t,e,n){let r=await W(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${Xp(Bp({holderPid:r.holder_pid,since:r.started_at}))}`}async function Kj(t,e){try{return(await W(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:tW(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return ye()&&Ye(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function Yj(t,e,n){try{await W(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){ye()&&Ye(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function zj(t,e,n){try{await W(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){ye()&&Ye(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function Qj(t,e,n){try{await W(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){ye()&&Ye(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function Zj(t,e){if(e===null)return;let n=setInterval(()=>{W(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{ye()&&Ye(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},eI);return n.unref?.(),n}function tI(t){return t!==void 0&&t.length>0?{config_warnings:JSON.stringify(t)}:{}}function eW(t,e,n){return{status:"done",result_summary:Bc(t),error:null,team_chat_log_id:e,...tI(n)}}function Kp(t,e){return{status:"busy",result_summary:Bc(t),error:t,team_chat_log_id:e}}function ea(t,e,n,r){return{status:"error",result_summary:n===void 0?Cw(t,500):Bc(n),error:t,team_chat_log_id:e,...tI(r)}}function Bc(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function tW(t,e,n){return`lmctl prompt ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function nW(t,e){let n=jc(e,t);if(n.ok)return{sender:as(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(is("chat",e,t))}async function rW(t,e){if(e.explicitRoot!==void 0)return await W(t,r=>Re(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await W(t,r=>bT(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function sW(t,e){return await W(t,n=>{let r=ye(),s=ir(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:ur(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&Ye(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:zb(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&Ye(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:zb(s.current)})),{acquired:!1,current:s.current})})}async function nI(t,e,n){return await W(t,r=>{for(let o=0;o<2;o+=1){let i=r.getTerminalLock(e,n);if(i===null)return null;if(qp(i).live)return i;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,i.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:qp(s).live?s:null})}function zb(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function oW(t,e,n){try{return await W(t,r=>r.releaseAgentInflight(e,n))}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
|
|
1862
1862
|
`)}return!1}function rI(t,e,n){return`${e} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function iW(t,e){let n=ta(e.message);try{return await W(t,r=>r.beginTeamChatLog({usage:e.usage,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,message_type:e.message_type??null,created_at:e.started_at??new Date().toISOString()}))}catch(r){return t.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
|
|
1863
1863
|
`),null}}async function Qb(t,e,n){let r=ta(n.message),s=n.response===null?null:ta(n.response);try{await W(t,o=>o.finishTeamChatLog(e,{usage:n.usage,root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,receiver_provider:n.receiver_provider,receiver_session_id:n.receiver_session_id,provider_prompt:n.message,message:r.text,response:s?.text??null,origin:n.origin,status:n.status,error_detail:n.error_detail,truncated:r.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(o){t.stderr.write(`warning: failed to finish chat log ${e}: ${o instanceof Error?o.message:String(o)}
|
|
@@ -1902,7 +1902,7 @@ Old catalog-known ids are omitted unless --old is used. Claude catalog ids are u
|
|
|
1902
1902
|
`))}return s}var J,fs=C(()=>{J=class t extends Error{line;column;codeblock;constructor(e,n){let[r,s]=MW(n.toml,n.ptr),o=$W(n.toml,r,s);super(`Invalid TOML document: ${e}
|
|
1903
1903
|
|
|
1904
1904
|
${o}`,n),this.line=r,this.column=s,this.codeblock=o}static x(e,n,r){throw new t(e,{toml:n.s,ptr:r??n.p})}}});function td(t){let e=t.p,n=t.s.charCodeAt(t.p++),r=n,s=n===39,o=n===t.s.charCodeAt(t.p)&&n===t.s.charCodeAt(t.p+1);o&&((n=t.s.charCodeAt(t.p+=2))===10?t.p++:n===13&&t.s.charCodeAt(t.p+1)===10&&(t.p+=2));let i="",a=t.p,l=0;for(;t.p<t.s.length;t.p++)if(n=t.s.charCodeAt(t.p),o&&(n===10||n===13&&t.s.charCodeAt(t.p+1)===10))l=l&&3;else if(n<32&&n!==9||n===127)J.x("control characters are not allowed in strings",t);else if((!l||l===3)&&n===r&&(!o||t.s.charCodeAt(t.p+1)===r&&t.s.charCodeAt(t.p+2)===r)){if(o&&(t.s.charCodeAt(t.p+3)===r&&t.p++,t.s.charCodeAt(t.p+3)===r&&t.p++),!l){let c=t.s.slice(a,t.p);i=i?i+c:c}return t.p+=o?3:1,i}else if(!l)!s&&n===92&&(i+=t.s.slice(a,a=t.p),l=1);else if(l===1)if(n===120||n===117||n===85){let c=t.p++-1,d=0,u=n===120?2:n===117?4:8;for(let f=0;f<u;f++,t.p++){let m=t.s.charCodeAt(t.p),p=m>=48&&m<=57?m-48:m>=65&&m<=70?m-65+10:m>=97&&m<=102?m-97+10:-1;p<0&&J.x("invalid non-hex character in unicode escape",t),d=d<<4|p}(d<0||d>1114111||d>=55296&&d<=57343)&&J.x("invalid unicode escape",t,c),i+=String.fromCodePoint(d),a=t.p--,l=0}else o&&(n===32||n===9)?l=2:(n===98?i+="\b":n===116?i+=" ":n===110?i+=`
|
|
1905
|
-
`:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":J.x("unrecognised escape sequence",t),a=t.p+1,l=0);else n!==32&&n!==9&&(l===2&&J.x("invalid escape: only line-ending whitespace may be escaped",t,a),l=!s&&n===92?1:0,a=t.p);J.x("unfinished string",t,e)}var uh=C(()=>{fs();});var PW,oa,fh=C(()=>{PW=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,oa=class t extends Date{#t=!1;#n=!1;#e=null;constructor(e,n,r){let s=!0,o=!0,i="Z",a;if(typeof e=="string")if(n)e:{if(n<3){if(+e.slice(11,13)>23){e="";break e}n===2?(i=null,e+="Z"):(a=e.charCodeAt(e.length-1))!==90&&a!==122&&(i=e.slice(e.length-6)),r&&(e=e.slice(0,10)+"T"+e.slice(11))}else n===4&&(e=+e.slice(0,2)>23?"":`0000-01-01T${e}Z`);s=n!==4,o=n!==3}else{let l=e.match(PW);l?(l[1]||(s=!1,e=`0000-01-01T${e}`),o=!!l[2],o&&e[10]===" "&&(e=e.replace(" ","T")),l[2]&&+l[2]>23?e="":(i=l[3]||null,!i&&o&&(e+="Z"))):e=""}super(e),isNaN(this.getTime())||(this.#t=s,this.#n=o,this.#e=i)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let e=super.toISOString();if(this.isDate())return e.slice(0,10);if(this.isTime())return e.slice(11,23);if(this.#e===null)return e.slice(0,-1);if(this.#e==="Z"||this.#e==="z")return e;let n=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return n=this.#e[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(e,n="Z"){let r=new t(e);return r.#e=n,r}static wrapAsLocalDateTime(e){let n=new t(e);return n.#e=null,n}static wrapAsLocalDate(e){let n=new t(e);return n.#n=!1,n.#e=null,n}static wrapAsLocalTime(e){let n=new t(e);return n.#t=!1,n.#e=null,n}}});function At(t,e=10){return e===16?t>47&&t<58||t>64&&t<71||t>96&&t<103:t>47&&t<48+e}function ph(t,e){return t===32||t===9||t===10||t===13||e&&(t===e||t===44)||t===35}function aa(t,e){let n=t.p,r=t.s.charCodeAt(t.p);if(r===91||r===123){t.d--||J.x("document contains excessively nested structures. aborting.",t);let s=r===91?LI(t):xI(t);return t.d++,s}return r===34||r===39?td(t):r===116?((t.s.charCodeAt(++t.p)!==114||t.s.charCodeAt(++t.p)!==117||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!0):r===102?((t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==108||t.s.charCodeAt(++t.p)!==115||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!1):r===43||r===45?nd(t,t.p,t.s.charCodeAt(++t.p),44-r,e):t.s.charCodeAt(t.p+4)===45&&t.s.charCodeAt(t.p+7)===45?UW(t,r,e):t.s.charCodeAt(t.p+2)===58?FW(t,r,e):nd(t,t.p,r,0,e)}function nd(t,e,n,r,s){let o=n,i=0,a=!1;if(o===105)return(t.s.charCodeAt(++t.p)!==110||t.s.charCodeAt(++t.p)!==102)&&J.x("invalid value",t,e),t.p++,(r||1)/0;if(o===110)return(t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==110)&&J.x("invalid value",t,e),t.p++,NaN;if(o===48){if(++t.p>=t.s.length||ph(o=t.s.charCodeAt(t.p),s))return t.bi===!0?0n:0;if(!r){if(o===120)return mh(t,e,16,s);if(o===98)return mh(t,e,2,s);if(o===111)return mh(t,e,8,s)}o===46?i=2:o===101||o===69?i=4:J.x("illegal leading zero",t,e)}else At(o)||J.x("invalid value",t,e);for(;++t.p<t.s.length&&(o=t.s.charCodeAt(t.p),!ph(o,s));)i||(i=1),o===95?(i&1||J.x("illegal underscore",t),i+=11,a=!0):i===1&&o===46?i=2:(i===1||i===3)&&(o===101||o===69)?i=4:i===4&&(o===43||o===45)||(At(o)?i>9?i-=11:i&1||i++:J.x("illegal character in numeric literal",t));if(!i){let c=(n-48)*(r||1);return t.bi===!0?BigInt(c):c}i&1||J.x("unfinished numeric value",t,e);let l=t.s.slice(e,t.p);return a&&(l=l.replaceAll("_","")),i>1?parseFloat(l):RI(t,l,10,e)}function mh(t,e,n,r){let s,o=1;for(;++t.p<t.s.length&&(s=t.s.charCodeAt(t.p),!ph(s,r));)s===95?(o&1&&J.x("illegal underscore",t),o=3):At(s,n)?o&1&&o--:J.x("illegal character in numeric literal",t);o&1&&J.x("unfinished numeric value",t);let i=t.s.slice(e+2,t.p);return o&&(i=i.replaceAll("_","")),RI(t,i,n,e)}function RI(t,e,n,r){if(t.bi!==!0)e:{let s=parseInt(e,n);if(!Number.isSafeInteger(s)){if(t.bi)break e;J.x("integer value cannot be represented losslessly",t,r)}return s}return BigInt(n===10?e:(n===2?"0b":n===8?"0o":"0x")+e)}function UW(t,e,n){let r=t.p++,s;if(!At(e)||!At(t.s.charCodeAt(t.p++))||!At(t.s.charCodeAt(t.p++))||!At(t.s.charCodeAt(t.p++)))return nd(t,t.p=r,e,0,n);if(t.p+=5,At(t.s.charCodeAt(t.p++))||J.x("invalid date-time: date part is malformed",t,r),t.p>=t.s.length||((e=t.s.charCodeAt(t.p))!==32||(s=!0,!At(t.s.charCodeAt(t.p+1))))&&e!==84&&e!==116){let i=t.s.slice(r,t.p);return ia(t,i,3,!1,r)}if(t.s.charCodeAt(t.p+=3)!==58&&J.x("invalid date-time: time part is malformed",t,r),t.s.charCodeAt(t.p+=3)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;At(t.s.charCodeAt(++t.p)););if(e=t.s.charCodeAt(t.p)){if(e===90||e===122){let i=t.s.slice(r,++t.p);return ia(t,i,1,s,r,"[+00:00]")}if(e===43||e===45){let i=t.s.slice(r,t.p+=6);return ia(t,i,1,s,r,!t.ld&&"["+t.s.slice(t.p-6,t.p)+"]")}}let o=t.s.slice(r,t.p);return ia(t,o,2,s,r)}function FW(t,e,n){let r=t.p;if(!At(e)||!At(t.s.charCodeAt(++t.p)))return nd(t,--t.p,e,0,n);if(t.s.charCodeAt(t.p+=4)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;At(t.s.charCodeAt(++t.p)););let s=t.s.slice(r,t.p);return ia(t,s,4,!1,r)}function ia(t,e,n,r,s,o){if(t.ld){let i=new oa(e,n,r);return i.isValid()||J.x("invalid date",t,s),i}try{switch(o&&(e+=o),n){case 1:return Temporal.ZonedDateTime.from(e);case 2:return Temporal.PlainDateTime.from(e);case 3:return Temporal.PlainDate.from(e);case 4:return Temporal.PlainTime.from(e)}}catch(i){J.x(i instanceof Error?i.message:""+i,t,s)}}var hh=C(()=>{uh();_h();fs();fh();});function jW(t){for(;t.p<t.s.length;t.p++){let e=t.s.charCodeAt(t.p);if(e===10)break;if(e===13&&t.s.charCodeAt(t.p+1)===10){t.p++;break}(e<32&&e!==9||e===127)&&J.x("control characters are not allowed in comments",t)}}function Jt(t,e,n){let r;for(;t.p<t.s.length;){for(;t.p<t.s.length&&((r=t.s.charCodeAt(t.p))===32||r===9||!e&&(r===10||r===13&&t.s.charCodeAt(t.p+1)===10));)t.p++;if(n||r!==35)break;jW(t)}}var gh=C(()=>{fs();});function rd(t,e=61){let n,r=0,s=[],o,i=t.s.charCodeAt(n=t.p);do{if(i===e)return r||J.x("unexpected end of key",t),r===1&&s.push(t.s.slice(o,t.p)),t.p++,s;i===46?(r||J.x("illegal empty bare key",t),r===1&&s.push(t.s.slice(o,t.p)),r=0):!r&&(i===34||i===39)?(i===t.s.charCodeAt(t.p+1)&&i===t.s.charCodeAt(t.p+2)&&J.x("illegal quoted key: multiline strings are not allowed",t),s.push(td(t)),r=2,t.p--):i===32||i===9?r===1&&(s.push(t.s.slice(o,t.p)),r=2):r===2||i<48&&i!==45||i>57&&i<65||i>90&&i<97&&i!==95||i>122?J.x("illegal character in key",t):r||(r=1,o=t.p)}while(i=t.s.charCodeAt(++t.p));J.x("incomplete key-value: cannot find end of key",t,n)}function xI(t){let e=t.p++,n=Object.create(null),r=new Set,s;for(;t.p<t.s.length;){if(Jt(t),(s=t.s.charCodeAt(t.p))===125)return t.p++,n;let o,i=n,a=!1,l=t.p,c=rd(t);for(let u=0;u<c.length;u++){u&&(i=a?i[o]:i[o]=Object.create(null)),o=c[u],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&J.x("trying to redefine an already defined value",t,l);let f=o==="__proto__";if(t.uk&&(f||o==="constructor")){i=t.uk!==1&&J.x("document contains an unsafe property",t,l);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&J.x("trying to redefine an already defined value",t,l),Jt(t,!0,!0);let d=aa(t,125);if(i&&typeof(i[o]=d)=="object"&&r.add(d),Jt(t),(s=t.s.charCodeAt(t.p++))===125)return n;s!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished table",t,e)}function LI(t){let e=t.p++,n=[],r;for(;t.p<t.s.length;){if(Jt(t),(r=t.s.charCodeAt(t.p))===93)return t.p++,n;if(n.push(aa(t,93)),Jt(t),(r=t.s.charCodeAt(t.p++))===93)return n;r!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished array",t,e)}var _h=C(()=>{uh();hh();gh();fs();});function CI(t,e,n,r,s){let o=n,i=r,a,l=!1,c;for(let d=0;d<e.length;d++){if(d){if(o=l?o[a]:o[a]=Object.create(null),i=(c=i[a]).c,s===0&&(c.t===1||c.t===2))return null;if(c.t===2){let u=o.length-1;o=o[u],i=i[u].c}}if(a=e[d],(l=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!l){let u=a==="__proto__";if(t.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:d<e.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(c=i[a],c.t!==s&&!(s===1&&c.t===3)||(s===2&&(c.d||(c.d=!0,o[a]=[]),o[a].push(o=Object.create(null)),c.c[c.i++]=c={t:1,d:!1,i:0,c:Object.create(null)}),c.d))return null;if(c.d=!0,s===1)o=l?o[a]:o[a]=Object.create(null);else if(s===0&&l)return null;return[a,o,c.c]}function OI(t,e,n){(e===null||t.uk===2)&&J.x(e===null?"trying to redefine an already defined table or value":"document contains an unsafe property",t,n)}function mo(t,e={}){let n={s:t,p:0,d:e.maxDepth??1e3,bi:e.integersAsBigInt??!1,ld:e.useLegacyDate??!0,uk:e.unsafeKeyBehaviour==="throw"?2:e.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),o,i=!1,a=r,l=s;for(t.charCodeAt(0)===65279&&n.p++,Jt(n);n.p<t.length;){if(t.charCodeAt(n.p)===91){let c=t.charCodeAt(++n.p)===91;o=n.p+=+c,i=!1;let d=rd(n,93);c&&(t.charCodeAt(n.p)!==93&&J.x("expected end of table array declaration",n),n.p++);let u=CI(n,d,r,s,c?2:1);u?(l=u[2],a=u[1]):(OI(n,u,o),i=!0)}else{o=n.p;let c=rd(n),d=CI(n,c,a,l,0);!d&&!i&&OI(n,d,o),Jt(n,!0,!0);let u=aa(n,void 0);d&&!i&&(d[1][d[0]]=u)}Jt(n,!0),n.p<t.length&&(o=t.charCodeAt(n.p))!==10&&(o!==13||t.charCodeAt(n.p+1)!==10)&&J.x("each key-value declaration must be followed by an end-of-line",n),Jt(n)}return r}var DI=C(()=>{_h();hh();gh();fs();});var nee,MI=C(()=>{nee=!!"".isWellFormed});var yh=C(()=>{DI();MI();fh();fs();});import{readFileSync as WW}from"node:fs";import{homedir as HW}from"node:os";import{join as $I,resolve as BW}from"node:path";function Mt(t=process.env,e){let n=t.LMCTL_HOME||(t.HOME===void 0?process.env.LMCTL_HOME:void 0);return e!==void 0?BW(e):$I(n||$I(t.HOME||HW(),".lmctl"),"init.toml")}function XW(t,e,n,r,s){return e==="missing"?"Missing "+t:e==="read"?"Cannot read "+t+": "+n:"Invalid "+t+":"+r+":"+s+": "+n}function gn(t,e="<init.toml>"){let{document:n}=PI(t,e),r={};for(let o of ms){let i=n[o];if(i===void 0)continue;if(!i||typeof i!="object"||Array.isArray(i)||i instanceof Date)throw new Ve(e,"schema","["+o+"] must be a table with provider and model1");let a={};for(let l of la){let c=i[l];if(typeof c!="string"||!c.trim())throw new Ve(e,"schema",o+"."+l+" must be a nonempty string");a[l]=c}r[o]=a}let s={raw:t,document:n,path:e,slots:r};return Object.defineProperty(s,"config",{enumerable:!1,get(){let o=ms.find(i=>!r[i]);if(o)throw new Ve(e,"schema","["+o+"] is not in "+e+"; this needs the example slots ["+ms.join("], [")+"] -- add ["+o+"] with provider and model1");return{provider1:r.Provider1,provider2:r.Provider2,provider3:r.Provider3}}}),s}function PI(t,e="<init.toml>"){let n;try{n=mo(t.startsWith("\uFEFF")?t.slice(1):t,{integersAsBigInt:"asNeeded",useLegacyDate:!0})}catch(r){let s=r;throw new Ve(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 qW(t){let e;try{e=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(WW(t))}catch(n){let r=n;throw new Ve(t,r.code==="ENOENT"?"missing":"read",r.message)}return e}function ca(t=Mt()){return gn(qW(t),t)}var ms,la,Ve,sd=C(()=>{"use strict";yh();ms=["Provider1","Provider2","Provider3"],la=["provider","model1"];Ve=class extends Error{path;kind;line;column;detail;constructor(e,n,r,s=1,o=1){let i=XW(e,n,r,s,o);super(n==="missing"?i+". Run lmctl init first.":i+". Fix the file or run lmctl init."),this.path=e,this.kind=n,this.line=s,this.column=o,this.detail=i}}});function GW(t){let e=[],n=0;for(;n<t.length;){let r=t[n];if(r==="\r"||r===`
|
|
1905
|
+
`:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":J.x("unrecognised escape sequence",t),a=t.p+1,l=0);else n!==32&&n!==9&&(l===2&&J.x("invalid escape: only line-ending whitespace may be escaped",t,a),l=!s&&n===92?1:0,a=t.p);J.x("unfinished string",t,e)}var uh=C(()=>{fs();});var PW,oa,fh=C(()=>{PW=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,oa=class t extends Date{#t=!1;#n=!1;#e=null;constructor(e,n,r){let s=!0,o=!0,i="Z",a;if(typeof e=="string")if(n)e:{if(n<3){if(+e.slice(11,13)>23){e="";break e}n===2?(i=null,e+="Z"):(a=e.charCodeAt(e.length-1))!==90&&a!==122&&(i=e.slice(e.length-6)),r&&(e=e.slice(0,10)+"T"+e.slice(11))}else n===4&&(e=+e.slice(0,2)>23?"":`0000-01-01T${e}Z`);s=n!==4,o=n!==3}else{let l=e.match(PW);l?(l[1]||(s=!1,e=`0000-01-01T${e}`),o=!!l[2],o&&e[10]===" "&&(e=e.replace(" ","T")),l[2]&&+l[2]>23?e="":(i=l[3]||null,!i&&o&&(e+="Z"))):e=""}super(e),isNaN(this.getTime())||(this.#t=s,this.#n=o,this.#e=i)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let e=super.toISOString();if(this.isDate())return e.slice(0,10);if(this.isTime())return e.slice(11,23);if(this.#e===null)return e.slice(0,-1);if(this.#e==="Z"||this.#e==="z")return e;let n=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return n=this.#e[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(e,n="Z"){let r=new t(e);return r.#e=n,r}static wrapAsLocalDateTime(e){let n=new t(e);return n.#e=null,n}static wrapAsLocalDate(e){let n=new t(e);return n.#n=!1,n.#e=null,n}static wrapAsLocalTime(e){let n=new t(e);return n.#t=!1,n.#e=null,n}}});function At(t,e=10){return e===16?t>47&&t<58||t>64&&t<71||t>96&&t<103:t>47&&t<48+e}function ph(t,e){return t===32||t===9||t===10||t===13||e&&(t===e||t===44)||t===35}function aa(t,e){let n=t.p,r=t.s.charCodeAt(t.p);if(r===91||r===123){t.d--||J.x("document contains excessively nested structures. aborting.",t);let s=r===91?LI(t):xI(t);return t.d++,s}return r===34||r===39?td(t):r===116?((t.s.charCodeAt(++t.p)!==114||t.s.charCodeAt(++t.p)!==117||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!0):r===102?((t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==108||t.s.charCodeAt(++t.p)!==115||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!1):r===43||r===45?nd(t,t.p,t.s.charCodeAt(++t.p),44-r,e):t.s.charCodeAt(t.p+4)===45&&t.s.charCodeAt(t.p+7)===45?UW(t,r,e):t.s.charCodeAt(t.p+2)===58?FW(t,r,e):nd(t,t.p,r,0,e)}function nd(t,e,n,r,s){let o=n,i=0,a=!1;if(o===105)return(t.s.charCodeAt(++t.p)!==110||t.s.charCodeAt(++t.p)!==102)&&J.x("invalid value",t,e),t.p++,(r||1)/0;if(o===110)return(t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==110)&&J.x("invalid value",t,e),t.p++,NaN;if(o===48){if(++t.p>=t.s.length||ph(o=t.s.charCodeAt(t.p),s))return t.bi===!0?0n:0;if(!r){if(o===120)return mh(t,e,16,s);if(o===98)return mh(t,e,2,s);if(o===111)return mh(t,e,8,s)}o===46?i=2:o===101||o===69?i=4:J.x("illegal leading zero",t,e)}else At(o)||J.x("invalid value",t,e);for(;++t.p<t.s.length&&(o=t.s.charCodeAt(t.p),!ph(o,s));)i||(i=1),o===95?(i&1||J.x("illegal underscore",t),i+=11,a=!0):i===1&&o===46?i=2:(i===1||i===3)&&(o===101||o===69)?i=4:i===4&&(o===43||o===45)||(At(o)?i>9?i-=11:i&1||i++:J.x("illegal character in numeric literal",t));if(!i){let c=(n-48)*(r||1);return t.bi===!0?BigInt(c):c}i&1||J.x("unfinished numeric value",t,e);let l=t.s.slice(e,t.p);return a&&(l=l.replaceAll("_","")),i>1?parseFloat(l):RI(t,l,10,e)}function mh(t,e,n,r){let s,o=1;for(;++t.p<t.s.length&&(s=t.s.charCodeAt(t.p),!ph(s,r));)s===95?(o&1&&J.x("illegal underscore",t),o=3):At(s,n)?o&1&&o--:J.x("illegal character in numeric literal",t);o&1&&J.x("unfinished numeric value",t);let i=t.s.slice(e+2,t.p);return o&&(i=i.replaceAll("_","")),RI(t,i,n,e)}function RI(t,e,n,r){if(t.bi!==!0)e:{let s=parseInt(e,n);if(!Number.isSafeInteger(s)){if(t.bi)break e;J.x("integer value cannot be represented losslessly",t,r)}return s}return BigInt(n===10?e:(n===2?"0b":n===8?"0o":"0x")+e)}function UW(t,e,n){let r=t.p++,s;if(!At(e)||!At(t.s.charCodeAt(t.p++))||!At(t.s.charCodeAt(t.p++))||!At(t.s.charCodeAt(t.p++)))return nd(t,t.p=r,e,0,n);if(t.p+=5,At(t.s.charCodeAt(t.p++))||J.x("invalid date-time: date part is malformed",t,r),t.p>=t.s.length||((e=t.s.charCodeAt(t.p))!==32||(s=!0,!At(t.s.charCodeAt(t.p+1))))&&e!==84&&e!==116){let i=t.s.slice(r,t.p);return ia(t,i,3,!1,r)}if(t.s.charCodeAt(t.p+=3)!==58&&J.x("invalid date-time: time part is malformed",t,r),t.s.charCodeAt(t.p+=3)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;At(t.s.charCodeAt(++t.p)););if(e=t.s.charCodeAt(t.p)){if(e===90||e===122){let i=t.s.slice(r,++t.p);return ia(t,i,1,s,r,"[+00:00]")}if(e===43||e===45){let i=t.s.slice(r,t.p+=6);return ia(t,i,1,s,r,!t.ld&&"["+t.s.slice(t.p-6,t.p)+"]")}}let o=t.s.slice(r,t.p);return ia(t,o,2,s,r)}function FW(t,e,n){let r=t.p;if(!At(e)||!At(t.s.charCodeAt(++t.p)))return nd(t,--t.p,e,0,n);if(t.s.charCodeAt(t.p+=4)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;At(t.s.charCodeAt(++t.p)););let s=t.s.slice(r,t.p);return ia(t,s,4,!1,r)}function ia(t,e,n,r,s,o){if(t.ld){let i=new oa(e,n,r);return i.isValid()||J.x("invalid date",t,s),i}try{switch(o&&(e+=o),n){case 1:return Temporal.ZonedDateTime.from(e);case 2:return Temporal.PlainDateTime.from(e);case 3:return Temporal.PlainDate.from(e);case 4:return Temporal.PlainTime.from(e)}}catch(i){J.x(i instanceof Error?i.message:""+i,t,s)}}var hh=C(()=>{uh();_h();fs();fh();});function jW(t){for(;t.p<t.s.length;t.p++){let e=t.s.charCodeAt(t.p);if(e===10)break;if(e===13&&t.s.charCodeAt(t.p+1)===10){t.p++;break}(e<32&&e!==9||e===127)&&J.x("control characters are not allowed in comments",t)}}function Jt(t,e,n){let r;for(;t.p<t.s.length;){for(;t.p<t.s.length&&((r=t.s.charCodeAt(t.p))===32||r===9||!e&&(r===10||r===13&&t.s.charCodeAt(t.p+1)===10));)t.p++;if(n||r!==35)break;jW(t)}}var gh=C(()=>{fs();});function rd(t,e=61){let n,r=0,s=[],o,i=t.s.charCodeAt(n=t.p);do{if(i===e)return r||J.x("unexpected end of key",t),r===1&&s.push(t.s.slice(o,t.p)),t.p++,s;i===46?(r||J.x("illegal empty bare key",t),r===1&&s.push(t.s.slice(o,t.p)),r=0):!r&&(i===34||i===39)?(i===t.s.charCodeAt(t.p+1)&&i===t.s.charCodeAt(t.p+2)&&J.x("illegal quoted key: multiline strings are not allowed",t),s.push(td(t)),r=2,t.p--):i===32||i===9?r===1&&(s.push(t.s.slice(o,t.p)),r=2):r===2||i<48&&i!==45||i>57&&i<65||i>90&&i<97&&i!==95||i>122?J.x("illegal character in key",t):r||(r=1,o=t.p)}while(i=t.s.charCodeAt(++t.p));J.x("incomplete key-value: cannot find end of key",t,n)}function xI(t){let e=t.p++,n=Object.create(null),r=new Set,s;for(;t.p<t.s.length;){if(Jt(t),(s=t.s.charCodeAt(t.p))===125)return t.p++,n;let o,i=n,a=!1,l=t.p,c=rd(t);for(let u=0;u<c.length;u++){u&&(i=a?i[o]:i[o]=Object.create(null)),o=c[u],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&J.x("trying to redefine an already defined value",t,l);let f=o==="__proto__";if(t.uk&&(f||o==="constructor")){i=t.uk!==1&&J.x("document contains an unsafe property",t,l);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&J.x("trying to redefine an already defined value",t,l),Jt(t,!0,!0);let d=aa(t,125);if(i&&typeof(i[o]=d)=="object"&&r.add(d),Jt(t),(s=t.s.charCodeAt(t.p++))===125)return n;s!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished table",t,e)}function LI(t){let e=t.p++,n=[],r;for(;t.p<t.s.length;){if(Jt(t),(r=t.s.charCodeAt(t.p))===93)return t.p++,n;if(n.push(aa(t,93)),Jt(t),(r=t.s.charCodeAt(t.p++))===93)return n;r!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished array",t,e)}var _h=C(()=>{uh();hh();gh();fs();});function CI(t,e,n,r,s){let o=n,i=r,a,l=!1,c;for(let d=0;d<e.length;d++){if(d){if(o=l?o[a]:o[a]=Object.create(null),i=(c=i[a]).c,s===0&&(c.t===1||c.t===2))return null;if(c.t===2){let u=o.length-1;o=o[u],i=i[u].c}}if(a=e[d],(l=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!l){let u=a==="__proto__";if(t.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:d<e.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(c=i[a],c.t!==s&&!(s===1&&c.t===3)||(s===2&&(c.d||(c.d=!0,o[a]=[]),o[a].push(o=Object.create(null)),c.c[c.i++]=c={t:1,d:!1,i:0,c:Object.create(null)}),c.d))return null;if(c.d=!0,s===1)o=l?o[a]:o[a]=Object.create(null);else if(s===0&&l)return null;return[a,o,c.c]}function OI(t,e,n){(e===null||t.uk===2)&&J.x(e===null?"trying to redefine an already defined table or value":"document contains an unsafe property",t,n)}function mo(t,e={}){let n={s:t,p:0,d:e.maxDepth??1e3,bi:e.integersAsBigInt??!1,ld:e.useLegacyDate??!0,uk:e.unsafeKeyBehaviour==="throw"?2:e.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),o,i=!1,a=r,l=s;for(t.charCodeAt(0)===65279&&n.p++,Jt(n);n.p<t.length;){if(t.charCodeAt(n.p)===91){let c=t.charCodeAt(++n.p)===91;o=n.p+=+c,i=!1;let d=rd(n,93);c&&(t.charCodeAt(n.p)!==93&&J.x("expected end of table array declaration",n),n.p++);let u=CI(n,d,r,s,c?2:1);u?(l=u[2],a=u[1]):(OI(n,u,o),i=!0)}else{o=n.p;let c=rd(n),d=CI(n,c,a,l,0);!d&&!i&&OI(n,d,o),Jt(n,!0,!0);let u=aa(n,void 0);d&&!i&&(d[1][d[0]]=u)}Jt(n,!0),n.p<t.length&&(o=t.charCodeAt(n.p))!==10&&(o!==13||t.charCodeAt(n.p+1)!==10)&&J.x("each key-value declaration must be followed by an end-of-line",n),Jt(n)}return r}var DI=C(()=>{_h();hh();gh();fs();});var ree,MI=C(()=>{ree=!!"".isWellFormed});var yh=C(()=>{DI();MI();fh();fs();});import{readFileSync as WW}from"node:fs";import{homedir as HW}from"node:os";import{join as $I,resolve as BW}from"node:path";function Mt(t=process.env,e){let n=t.LMCTL_HOME||(t.HOME===void 0?process.env.LMCTL_HOME:void 0);return e!==void 0?BW(e):$I(n||$I(t.HOME||HW(),".lmctl"),"init.toml")}function XW(t,e,n,r,s){return e==="missing"?"Missing "+t:e==="read"?"Cannot read "+t+": "+n:"Invalid "+t+":"+r+":"+s+": "+n}function gn(t,e="<init.toml>"){let{document:n}=PI(t,e),r={};for(let o of ms){let i=n[o];if(i===void 0)continue;if(!i||typeof i!="object"||Array.isArray(i)||i instanceof Date)throw new Ve(e,"schema","["+o+"] must be a table with provider and model1");let a={};for(let l of la){let c=i[l];if(typeof c!="string"||!c.trim())throw new Ve(e,"schema",o+"."+l+" must be a nonempty string");a[l]=c}r[o]=a}let s={raw:t,document:n,path:e,slots:r};return Object.defineProperty(s,"config",{enumerable:!1,get(){let o=ms.find(i=>!r[i]);if(o)throw new Ve(e,"schema","["+o+"] is not in "+e+"; this needs the example slots ["+ms.join("], [")+"] -- add ["+o+"] with provider and model1");return{provider1:r.Provider1,provider2:r.Provider2,provider3:r.Provider3}}}),s}function PI(t,e="<init.toml>"){let n;try{n=mo(t.startsWith("\uFEFF")?t.slice(1):t,{integersAsBigInt:"asNeeded",useLegacyDate:!0})}catch(r){let s=r;throw new Ve(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 qW(t){let e;try{e=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(WW(t))}catch(n){let r=n;throw new Ve(t,r.code==="ENOENT"?"missing":"read",r.message)}return e}function ca(t=Mt()){return gn(qW(t),t)}var ms,la,Ve,sd=C(()=>{"use strict";yh();ms=["Provider1","Provider2","Provider3"],la=["provider","model1"];Ve=class extends Error{path;kind;line;column;detail;constructor(e,n,r,s=1,o=1){let i=XW(e,n,r,s,o);super(n==="missing"?i+". Run lmctl init first.":i+". Fix the file or run lmctl init."),this.path=e,this.kind=n,this.line=s,this.column=o,this.detail=i}}});function GW(t){let e=[],n=0;for(;n<t.length;){let r=t[n];if(r==="\r"||r===`
|
|
1906
1906
|
`){let o=n;n+=r==="\r"&&t[n+1]===`
|
|
1907
1907
|
`?2:1,e.push({start:o,end:n,text:`
|
|
1908
1908
|
`,kind:"newline"});continue}if(/\s/.test(r)){n++;continue}if(r==="#"){for(;n<t.length&&t[n]!=="\r"&&t[n]!==`
|
|
@@ -2153,13 +2153,13 @@ lease) -- the pre-bundle behavior -- as an opt-out while bundle is new.
|
|
|
2153
2153
|
--single sends the WHOLE file as ONE prompt: blank lines are content, not
|
|
2154
2154
|
separators. A single prompt (one paragraph, or --single) never bundles and
|
|
2155
2155
|
never takes a batch-level lease -- one plain turn.
|
|
2156
|
-
`});var Jk={};fe(Jk,{resolveLmbeeBin:()=>Vk,runLmbeeReadCommand:()=>
|
|
2156
|
+
`});var Jk={};fe(Jk,{resolveLmbeeBin:()=>Vk,runLmbeeReadCommand:()=>RB});import{spawn as TB}from"node:child_process";import{accessSync as s_,constants as o_}from"node:fs";import{createRequire as vB}from"node:module";import{dirname as SB,resolve as Gk}from"node:path";import{fileURLToPath as bB}from"node:url";function Vk(){let t=Gk(SB(bB(import.meta.url)),"../../bin/lmbee");try{return s_(t,o_.X_OK),t}catch{}let n=vB(import.meta.url).resolve.paths("@lmctl-ai/lmbee")??[];for(let r of n){let s=Gk(r,"@lmctl-ai/lmbee/bin/lmbee");try{return s_(s,o_.X_OK),s}catch{}}throw new Error("lmbee support is unavailable: could not find bin/lmbee in the declared @lmctl-ai/lmbee dependency")}function NB(t,e){if(!IB.has(t))return!1;if(e.length===1&&(e[0]==="--help"||e[0]==="-h")||e.length===0&&AB.has(t))return!0;let n=kB[t];return n===void 0?e.length===0||e.length===1&&e[0]==="--json":!(e[0]===void 0||!n.has(e[0])||t==="lmchat"&&e[0]==="read"&&(e.includes("--follow")||e.includes("--interval")))}async function RB(t,e,n,r={}){if(!NB(t,e))return n.stderr.write(`error: lmctl does not expose this lmbee command: ${[t,...e].join(" ")}
|
|
2157
2157
|
Run 'lmctl lmbee --help' for the read-only command list.
|
|
2158
2158
|
`),1;let s;try{s=r.bin??Vk(),s_(s,o_.X_OK)}catch(o){return n.stderr.write(o instanceof Error&&o.message.startsWith("lmbee support is unavailable:")?`${o.message}
|
|
2159
2159
|
`:`lmbee support is unavailable: executable ${r.bin??"for the declared dependency"} is missing or not executable (${o instanceof Error?o.message:String(o)})
|
|
2160
2160
|
`),1}return await new Promise(o=>{let i=!1,a=c=>{i||(i=!0,o(c))},l;try{let c={...process.env,...n.env};c.LMBEE_DB||(c.LMCTL_DB=Ie(n)),l=(r.spawnProcess??TB)(process.execPath,[s,t,...e],{cwd:n.cwd??process.cwd(),env:c,stdio:"inherit"})}catch(c){n.stderr.write(`error: could not start lmbee: ${c instanceof Error?c.message:String(c)}
|
|
2161
2161
|
`),a(1);return}l.once("error",c=>{n.stderr.write(`error: could not start lmbee: ${c.message}
|
|
2162
|
-
`),a(1)}),l.once("close",c=>a(c??1))})}var IB,kB,Kk=C(()=>{"use strict";se();IB=new Set(["attention","in-flight","stalled","history","teams","state","cron","queue"]),kB={state:new Set(["list","get","active"]),cron:new Set(["list","show","runs","gaps"]),queue:new Set(["list","get","inbox","stats"])}});import{mkdtempSync as
|
|
2162
|
+
`),a(1)}),l.once("close",c=>a(c??1))})}var IB,kB,AB,Kk=C(()=>{"use strict";se();IB=new Set(["attention","in-flight","stalled","history","teams","state","cron","queue","whoami","sites","fleet","serve","lmmail","lmchat","lmnote","lmsheet","lmtext","lmsound"]),kB={state:new Set(["list","get","active"]),cron:new Set(["list","show","runs","gaps"]),queue:new Set(["list","get","inbox","stats"]),sites:new Set(["list","resolve"]),fleet:new Set(["roster","agents"]),serve:new Set(["status"]),lmmail:new Set(["mailboxes","list"]),lmchat:new Set(["rooms","read","list"]),lmnote:new Set(["list"]),lmsheet:new Set(["sheets","read"]),lmtext:new Set(["list","get"]),lmsound:new Set(["voices"])},AB=new Set(["sites","fleet","lmmail","lmchat","lmnote","lmsheet","lmtext","lmsound"])});import{mkdtempSync as xB,readFileSync as LB,rmSync as CB,writeFileSync as OB}from"node:fs";import{tmpdir as DB}from"node:os";import{spawnSync as MB}from"node:child_process";import{basename as Id,extname as i_,join as a_,resolve as l_}from"node:path";import*as Yk from"node:readline";function $B(t){return e=>{let n=t.EDITOR??t.VISUAL??"vi";MB(n,[e],{stdio:"inherit"})}}async function zk(t){let{io:e,cwd:n,env:r=process.env}=t,s=t.initial??{},o=Yk.createInterface({input:t.input,output:e.stdout,terminal:!1}),i=[],a=[];o.on("line",u=>{let f=a.shift();f!==void 0?f(u):i.push(u)});let l=!1;o.on("close",()=>{for(l=!0;a.length>0;)a.shift()("")});let c=async u=>{e.stdout.write(u);let f=i.shift();return f!==void 0?f.trim():l?"":new Promise(m=>a.push(p=>m(p.trim())))},d=()=>o.close();try{let u,f;if(s.output!==void 0)u=l_(n,s.output),f=Id(u,i_(u));else{let g=l_(n,t.directory??"."),E=await c(`Directory [${g}]: `),y=E===""?g:l_(n,E),w=`${Id(y)}.lmctl`,T=await c(`Teamfile name [${w}]: `),S=T===""?w:T,I=i_(S)?S:`${S}.lmctl`;u=a_(y,I),f=Id(I,i_(I))}let m;if(s.members!==void 0&&s.members.length>0)m=s.members.map(g=>({...g,model:g.model??s.model}));else{let g=_o(Mt(e.env??process.env,t.initConfigPath)),E=[...new Set(g===null?[]:Object.values(g).map(A=>A.provider))];e.stdout.write(`Providers from lmctl init: ${E.length>0?E.join(", "):"(none saved; run lmctl init to save suggestions)"}
|
|
2163
2163
|
`),e.stdout.write(`You can type another provider.
|
|
2164
2164
|
`);let y=s.provider??g?.provider1.provider,w=s.provider??(E.length===1?E[0]:void 0);for(;w===void 0;){let A=await c(`Default provider${y!==void 0?` [${y}]`:""}: `),N=A===""?y:A;if(N===void 0){if(l)return e.stderr.write(`error: stdin closed (EOF) at the provider prompt and no default is available
|
|
2165
2165
|
`),d(),null;continue}if(Nt({alias:"Probe",provider:N})!==void 0){e.stdout.write(`unknown provider "${N}" (known: ${Object.keys(po).join(", ")})
|
|
@@ -2178,10 +2178,10 @@ Run 'lmctl lmbee --help' for the read-only command list.
|
|
|
2178
2178
|
`),x.length===0&&e.stdout.write(` No model suggestions available.
|
|
2179
2179
|
`);for(let L of x)e.stdout.write(` ${L}
|
|
2180
2180
|
`);e.stdout.write(`Type a model name, including one not listed, or leave blank to ${s.model!==void 0?"keep the default":"omit"}.
|
|
2181
|
-
`);let v=s.model,k=await c(`Model for ${A}${v!==void 0?` [${v}]`:" (blank to omit)"}: `),R=k===""?v:k;m.push({alias:A,provider:N,...R!==void 0?{model:R}:{}})}}let p=kr({teamName:f,members:m}),_=t.editFile
|
|
2181
|
+
`);let v=s.model,k=await c(`Model for ${A}${v!==void 0?` [${v}]`:" (blank to omit)"}: `),R=k===""?v:k;m.push({alias:A,provider:N,...R!==void 0?{model:R}:{}})}}let p=kr({teamName:f,members:m}),_=t.editFile??$B(r),h=s.seed??!0;for(;;){e.stdout.write(`
|
|
2182
2182
|
--- ${u} ---
|
|
2183
2183
|
${p}---
|
|
2184
|
-
`);let g=(await c(`Write and seed? [${h?"Y/n":"y/N"}/e(dit)]: `)).toLowerCase();if(g==="e"||g==="edit"){let y=
|
|
2184
|
+
`);let g=(await c(`Write and seed? [${h?"Y/n":"y/N"}/e(dit)]: `)).toLowerCase();if(g==="e"||g==="edit"){let y=xB(a_(DB(),"lmctl-plan-edit-"));try{let w=a_(y,Id(u));OB(w,p,"utf8"),_(w),p=LB(w,"utf8")}finally{CB(y,{recursive:!0,force:!0})}continue}if(g==="q"||g==="quit"||g==="abort")return d(),null;let E=g===""?h:g!=="n"&&g!=="no";return d(),{destPath:u,text:p,seed:E}}}catch(u){throw d(),u}}function Qk(t){return cd(t)}var Zk=C(()=>{"use strict";da();ps();oh();Gn();dd()});var aA={};fe(aA,{readPlanSource:()=>ko,runPlan:()=>XB});import{existsSync as nA,mkdirSync as PB,readdirSync as UB,readFileSync as eA,statSync as FB,writeFileSync as jB}from"node:fs";import{basename as rA,dirname as WB,extname as HB,join as sA,resolve as d_}from"node:path";async function XB(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(BB),0;let r=[],s=[];for(let b=0;b<t.length;b+=1){let v=t[b];if(v==="--member"){let k=t[b+1];if(k===void 0||k.startsWith("--"))return e.stderr.write(`error: missing value for --member
|
|
2185
2185
|
`),2;r.push(k),b+=1;continue}s.push(v)}let o=le(s,["--pattern","--provider","--model","--from","--output","--member"],["--json","--stdout","--force","--seed","--no-seed","--wizard","--non-interactive","--no-interactive"]);if(o.error!==void 0)return e.stderr.write(`error: ${o.error}
|
|
2186
2186
|
`),e.stderr.write(`usage: lmctl plan [directory] [options]
|
|
2187
2187
|
`),2;if(o.positionals.length>1)return e.stderr.write(`usage: lmctl plan [directory] [options]
|
|
@@ -2194,18 +2194,18 @@ ${p}---
|
|
|
2194
2194
|
`),2;let w=l!==void 0||c!==void 0||d!==void 0||u!==void 0||r.length>0,T=e.stdin??process.stdin,S=n.stdinIsTTY??(e.stdin===void 0?process.stdin.isTTY===!0:T.isTTY===!0),I=!w||u===void 0&&r.length===0&&(l===void 0||c===void 0),A=E||!y&&I&&!p&&!m&&S,N;if(A){if(u!==void 0)return e.stderr.write(`error: --from cannot be combined with --wizard
|
|
2195
2195
|
`),2;if(l!==void 0&&r.length>0)return e.stderr.write(`error: --pattern and --member are mutually exclusive
|
|
2196
2196
|
`),2;let b=iA(r,d,v=>{e.stderr.write(`error: ${v}
|
|
2197
|
-
`)});if(b.error!==void 0)return 1;N=await
|
|
2198
|
-
`),2;let b=await
|
|
2197
|
+
`)});if(b.error!==void 0)return 1;N=await qB(e,T,i,a,{provider:c,model:d,pattern:l,members:b.members,seed:!g,output:f},n)}else{if(!w)return e.stderr.write(`error: ${oA}
|
|
2198
|
+
`),2;let b=await GB({pattern:l,provider:c,model:d,from:u,memberRaws:r,output:f,directory:a,cwd:i,seedFlag:h,deps:{...n,initConfigPath:Mt(e.env??process.env,n.initConfigPath)}},v=>{e.stderr.write(`error: ${v}
|
|
2199
2199
|
`)});if(typeof b=="number")return b;N=b}if(N===null)return e.stderr.write(`aborted
|
|
2200
|
-
`),1;if(p)return e.stdout.write(N.text),0;let x=N.destPath;return
|
|
2201
|
-
`),1
|
|
2200
|
+
`),1;if(p)return e.stdout.write(N.text),0;let x=N.destPath;return JB(N,x,{asJson:m,force:_,seed:N.seed},e)}async function qB(t,e,n,r,s,o){let i=await zk({io:t,input:e,cwd:n,...r!==void 0?{directory:r}:{},initial:s,...o.initConfigPath!==void 0?{initConfigPath:o.initConfigPath}:{},...o.loadModels!==void 0?{loadModels:o.loadModels}:{},...o.editFile!==void 0?{editFile:o.editFile}:{},...t.env!==void 0?{env:t.env}:{}});return i===null?null:{text:i.text,destPath:i.destPath,members:Qk(i.text),seed:i.seed}}async function GB(t,e){let{pattern:n,provider:r,model:s,from:o,memberRaws:i,output:a,directory:l,cwd:c,seedFlag:d,deps:u}=t,f=[n!==void 0,i.length>0,o!==void 0].filter(Boolean).length;if(f===0)return e(oA),2;if(f>1)return e("--pattern, --member and --from are mutually exclusive"),2;if(o!==void 0&&(r!==void 0||s!==void 0))return e("--from cannot be combined with --provider or --model (the source teamfile defines the roster)"),2;let m=VB(a,l,c);if(o!==void 0){let h;try{h=await ko(o,u.fetchFn??globalThis.fetch,c)}catch(y){return e(y instanceof Error?y.message:String(y)),1}let g=pk(h),E=cd(g);return E.length===0?(e(`--from source "${o}" has no parseable _MEMBER_ lines`),1):{text:g,destPath:m,members:E,seed:d}}let p;if(i.length>0){let h=iA(i,s,e);if(h.error!==void 0)return 1;p=h.members}else{let h=uk(n);if(h===void 0)return e(`invalid pattern "${n}" (expected ${ld})`),2;if(r!==void 0){let g=Nt({alias:"Lead",provider:r});if(g!==void 0)return e(g),1;p=h.map(E=>({alias:E,provider:r,...s!==void 0?{model:s}:{}}))}else{let g=_o(u.initConfigPath);if(g===null)return e("missing --provider, and no ~/.lmctl/init.toml found. Run `lmctl init` first, or pass --provider explicitly."),2;let E=[g.provider1,g.provider2,g.provider3];p=h.map((y,w)=>{let T=E[w%E.length];return{alias:y,provider:T.provider,model:s??T.model1}})}}let _=rA(m,HB(m));return{text:kr({teamName:_,members:p}),destPath:m,members:p,seed:d}}function iA(t,e,n){if(t.length===0)return{members:void 0};let r=[],s=new Set;for(let o of t){let i=fk(o);if(i.error!==void 0)return n(i.error),{error:i.error};let a=i.spec,l=a.alias.toLowerCase();if(s.has(l))return n(`duplicate member alias "${a.alias}"`),{error:l};s.add(l),r.push({...a,model:a.model??e})}return r[0].alias.toLowerCase()!=="lead"?(n(`the first member must be Lead (got "${r[0].alias}")`),{error:"lead-not-first"}):{members:r}}function VB(t,e,n){if(t!==void 0)return d_(n,t);let r=d_(n,e??".");return sA(r,`${rA(r)}.lmctl`)}async function JB(t,e,n,r){if(nA(e)&&!n.force)return r.stderr.write(`error: ${e} already exists (use --force to overwrite)
|
|
2201
|
+
`),1;PB(WB(e),{recursive:!0}),jB(e,t.text,"utf8");let s=n.asJson?{...r,stdout:{write:()=>{}}}:r;if(!(await Ir([e],s)===0))return n.seed&&r.stderr.write(`error: refusing to seed \u2014 lint failed
|
|
2202
2202
|
`),n.asJson&&Z(r,c_(e,!1,!1,t.members)),1;let a=!1;if(n.seed){let l=await ma([e],s);return a=l===0,n.asJson&&Z(r,c_(e,!0,a,t.members)),l}return n.asJson?(Z(r,c_(e,!0,!1,t.members)),0):(r.stdout.write(`Created ${e}
|
|
2203
2203
|
`),r.stdout.write(`This is a starting point, not a finished teamfile -- edit it freely.
|
|
2204
2204
|
`),r.stdout.write(`Only _MEMBER_ lines are parsed; everything else is free-form.
|
|
2205
2205
|
`),r.stdout.write(`Format, and what lint/seed each do: https://lmctl.com/lmctl/docs/manuals/teamfile-format
|
|
2206
2206
|
`),r.stdout.write(`After editing, run: lmctl lint ${e}
|
|
2207
2207
|
`),r.stdout.write(`Then run: lmctl seed ${e}
|
|
2208
|
-
`),0)}function c_(t,e,n,r){return{path:t,linted:e,seeded:n,members:r.map(s=>({alias:s.alias,provider:s.provider,...s.model!==void 0?{model:s.model}:{}}))}}async function ko(t,e,n){if(/^http:\/\//i.test(t))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(t))return
|
|
2208
|
+
`),0)}function c_(t,e,n,r){return{path:t,linted:e,seeded:n,members:r.map(s=>({alias:s.alias,provider:s.provider,...s.model!==void 0?{model:s.model}:{}}))}}async function ko(t,e,n){if(/^http:\/\//i.test(t))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(t))return YB(t,e);let r=d_(n,t);if(!nA(r))throw new Error(`source not found: ${t}`);if(!FB(r).isDirectory())return eA(r,"utf8");let o=UB(r).filter(i=>Oe(i));if(o.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(o.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return eA(sA(r,o[0]),"utf8")}async function YB(t,e){let n=new URL(t);for(let r=0;;r+=1){if(n.protocol!=="https:")throw new Error("HTTPS redirects must remain https://");let s=await e(n.href,{redirect:"manual"});if(s.url!==""&&new URL(s.url).protocol!=="https:")throw new Error("HTTPS redirects must remain https://");if(!KB.has(s.status)){if(!s.ok)throw new Error(`HTTP ${s.status}`);return await s.text()}if(r>=tA)throw new Error(`too many HTTPS redirects (maximum ${tA})`);let o=s.headers.get("location");if(o===null)throw new Error(`HTTP ${s.status} redirect missing Location header`);n=new URL(o,n)}}var BB,oA,KB,tA,kd=C(()=>{"use strict";ze();se();Zk();Gn();ps();dd();BB=`usage: lmctl plan [directory] [options]
|
|
2209
2209
|
|
|
2210
2210
|
Generate an lmctl teamfile. With no config flags and a TTY, an interactive
|
|
2211
2211
|
wizard completes missing information; complete flags run immediately.
|
|
@@ -2246,29 +2246,29 @@ Examples:
|
|
|
2246
2246
|
lmctl plan ./backend --pattern 3 --provider claude --seed
|
|
2247
2247
|
`,oA=`missing required flags for non-interactive plan:
|
|
2248
2248
|
one of: --pattern <${ld}>, --member <Alias:provider[:model]>, or --from <file|dir|url>
|
|
2249
|
-
plus: --provider <name> (required with --pattern)`;
|
|
2250
|
-
`),1;let a=`${
|
|
2249
|
+
plus: --provider <name> (required with --pattern)`;KB=new Set([301,302,303,307,308]),tA=10});var Ad={};fe(Ad,{extractSaveScriptFlags:()=>cA,performSaveScript:()=>dA,runWithSaveScript:()=>iX});import{existsSync as zB,mkdirSync as QB,renameSync as ZB,writeFileSync as eX}from"node:fs";import{dirname as tX,extname as nX,join as rX}from"node:path";function cA(t,e,n={}){let r=[],s,o,i=!1;for(let c=0;c<t.length;c+=1){let d=t[c];if(d==="--save-script"){let u=t[c+1];if(u===void 0)return{rest:r,error:"--save-script requires a file path"};s=u,c+=1;continue}if(d==="--script"){let u=t[c+1];if(u===void 0)return{rest:r,error:"--script requires a name"};o=u,c+=1;continue}if(d==="--force"&&!n.ownsForce){i=!0;continue}r.push(d)}if(n.ownsForce&&(i=t.includes("--force")),s===void 0)return o!==void 0?{rest:r,error:"--script requires --save-script"}:{rest:r};let a=o??e;if(!lA.test(a))return{rest:r,error:`--script "${a}" must match ${lA} (letters, digits, ., _, -)`};let l=n.extension??".lms";return{rest:r,request:{destPath:s,slug:a,extension:l,force:i}}}function oX(t){let e=t.slice(0,512).trimStart().toLowerCase();return e.startsWith("<!doctype html")||e.startsWith("<html")}async function dA(t,e,n=fetch){let{destPath:r,slug:s,extension:o,force:i}=e;if(zB(r)&&!i)return t.stderr.write(`error: --save-script: ${r} already exists (use --force to overwrite)
|
|
2250
|
+
`),1;let a=`${sX}/${s}${o}`,l;try{l=await ko(a,n,process.cwd())}catch(u){let f=u instanceof Error?u.message:String(u);return f==="HTTP 404"?t.stderr.write(`error: --save-script: no script is published at ${a} for this command
|
|
2251
2251
|
`):t.stderr.write(`error: --save-script: could not fetch ${a}: ${f}
|
|
2252
|
-
`),1}if(
|
|
2252
|
+
`),1}if(nX(r).toLowerCase()!==o.toLowerCase()&&t.stderr.write(`warning: --save-script: ${r} does not end in "${o}", the extension lmctl.com actually serves for this command
|
|
2253
2253
|
`),l.trim().length===0)return t.stderr.write(`error: --save-script: ${a} returned an empty response
|
|
2254
|
-
`),1;if(
|
|
2255
|
-
`),1;let c=
|
|
2256
|
-
`),0}async function
|
|
2257
|
-
`),2;let i=await r(o.rest);return i!==0||o.request===void 0?i:dA(t,o.request)}var
|
|
2258
|
-
`).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:d??1,message:c.trim()||`lmctl prompt exited with code ${d}`})})})}function
|
|
2259
|
-
`}async function mA(t,e){let n=!1,r="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){t.io.write(p_({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await
|
|
2254
|
+
`),1;if(oX(l))return t.stderr.write(`error: --save-script: ${a} did not return a script (looks like an HTML page, not lmscript)
|
|
2255
|
+
`),1;let c=tX(r);QB(c,{recursive:!0});let d=rX(c,`.save-script-${process.pid}-${Date.now()}.tmp`);return eX(d,l,"utf8"),ZB(d,r),t.stdout.write(`Saved ${a} to ${r}
|
|
2256
|
+
`),0}async function iX(t,e,n,r,s={}){let o=cA(n,e,s);if(o.error!==void 0)return t.stderr.write(`error: ${o.error}
|
|
2257
|
+
`),2;let i=await r(o.rest);return i!==0||o.request===void 0?i:dA(t,o.request)}var sX,lA,Nd=C(()=>{"use strict";kd();sX="https://lmctl.com/lmscript/commands",lA=/^[A-Za-z0-9._-]+$/});var wa,Kne,u_=C(()=>{"use strict";wa=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],Kne=wa.length});import{spawn as aX}from"node:child_process";async function fA(t,e,n){let r=cX.get(t);if(r===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of r.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return dX(r.name,s)}function dX(t,e){return t==="lmctl_chat"?uX(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function uX(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let n=typeof t.team=="string"?t.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["prompt",n,r,e];return ye()&&Ye(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),fX(s,process.cwd())}function fX(t,e){return new Promise(n=>{let r=!1,s,o=d=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(d))},i=aX("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=mX(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl prompt timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",d=>{l+=d.toString("utf8")}),i.stderr?.on("data",d=>{c+=d.toString("utf8")}),i.on("error",d=>{o({status:"error",code:1,message:`failed to spawn lmctl prompt: ${d.message}`})}),i.on("exit",d=>{if(d===0){ye()&&Ye(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
2258
|
+
`).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:d??1,message:c.trim()||`lmctl prompt exited with code ${d}`})})})}function mX(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return uA;let n=Number(e);return!Number.isFinite(n)||n<=0?uA:n}function f_(t,e=process.env){let r=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:lX),s=t.getConfig("api.token"),o=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:r,token:o}}var lX,uA,cX,m_=C(()=>{"use strict";u_();re();lX="http://127.0.0.1:8787",uA=30*60*1e3,cX=new Map(wa.map(t=>[t.name,t]))});async function gX(t,e){let n=t.id===void 0,r=t.id??null;if(t.method==="exit")return n||e.io.write(p_({jsonrpc:"2.0",id:r,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{protocolVersion:pX,capabilities:{tools:{listChanged:!1}},serverInfo:{name:hX,version:_X}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{tools:wa.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await fA(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return n?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:r,error:{code:-32601,message:`method not found: ${t.method}`}}}}function p_(t){return`${JSON.stringify(t)}
|
|
2259
|
+
`}async function mA(t,e){let n=!1,r="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){t.io.write(p_({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await gX(l,t);c.kind==="response"?t.io.write(p_(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,i(u))},d=()=>{let u=r.indexOf(`
|
|
2260
2260
|
`);for(;u!==-1;){let f=r.slice(0,u);r=r.slice(u+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),u=r.indexOf(`
|
|
2261
2261
|
`)}};e.setEncoding("utf8"),e.on("data",u=>{r+=u,d()}),e.on("end",()=>{r.trim().length>0&&(a=a.then(()=>o(r))),a.finally(()=>c(0))}),e.on("error",u=>{t.io.log?.(`mcp: stdin error: ${u.message}
|
|
2262
|
-
`),a.finally(()=>c(1))})})}var
|
|
2263
|
-
`),2;U({event:"mcp_bridge_start",pid:process.pid});let r=e.dal===void 0,s=e.dal??
|
|
2262
|
+
`),a.finally(()=>c(1))})})}var pX,hX,_X,pA=C(()=>{"use strict";u_();m_();pX="2025-06-18",hX="lmctl",_X="0.0.1"});var _A={};fe(_A,{runMcp:()=>EX});async function EX(t,e={stdout:process.stdout,stderr:process.stderr},n=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(yX),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
|
|
2263
|
+
`),2;U({event:"mcp_bridge_start",pid:process.pid});let r=e.dal===void 0,s=e.dal??wX(),o=1;try{let i=s===void 0?f_({getConfig:()=>null},process.env):f_(s,process.env);return o=await mA({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},n),o}finally{U({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),r&&s!==void 0&&s.close()}}function wX(){let t=Ke(),e=3;for(let n=1;n<=e;n+=1)try{return Fe({path:t})}catch(r){let s=r instanceof Error?r.message:String(r);if(U({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:n,db_path:t,error_message:s}),n<e&&hA(s))TX(50*n);else if(!hA(s))break}}function hA(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function TX(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var yX,gA=C(()=>{"use strict";bt();m_();pA();re();On();yX=`usage: lmctl mcp
|
|
2264
2264
|
|
|
2265
2265
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
2266
2266
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
2267
|
-
`});function yA(t,e){if(t===void 0)return{date:void 0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let s=Number(n[1]),o=n[2],i=o==="s"?s:o==="m"?s*60:o==="h"?s*3600:s*86400;return{date:new Date(Date.now()-i*1e3)}}let r=Date.parse(t);return Number.isFinite(r)?{date:new Date(r)}:{error:`invalid ${e} "${t}" (expected ISO8601 or duration like 24h)`}}var EA=C(()=>{"use strict"});var RA={};fe(RA,{applyMaxBytes:()=>Ld,parseTailSince:()=>AA,renderMessage:()=>kA,runTail:()=>
|
|
2267
|
+
`});function yA(t,e){if(t===void 0)return{date:void 0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let s=Number(n[1]),o=n[2],i=o==="s"?s:o==="m"?s*60:o==="h"?s*3600:s*86400;return{date:new Date(Date.now()-i*1e3)}}let r=Date.parse(t);return Number.isFinite(r)?{date:new Date(r)}:{error:`invalid ${e} "${t}" (expected ISO8601 or duration like 24h)`}}var EA=C(()=>{"use strict"});var RA={};fe(RA,{applyMaxBytes:()=>Ld,parseTailSince:()=>AA,renderMessage:()=>kA,runTail:()=>kX});async function kX(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${IX}
|
|
2268
2268
|
`),0;let n=le(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run","--since"],["--watch","--help","--json"]);if(n.error!==void 0)return D(e,n.error);let r=Y(n,"--json");if(V(n,"--session")!==void 0&&n.positionals.length>0)return e.stderr.write(`usage: --session cannot be combined with a positional target
|
|
2269
2269
|
`),2;let s=V(n,"--since"),o=AA(s);if("error"in o)return D(e,o.error);let i=o.date,a=V(n,"--lines"),l=V(n,"--max-bytes");if(r&&l!==void 0)return e.stderr.write(`usage: --json cannot be combined with --max-bytes; use --lines
|
|
2270
|
-
`),2;if(a!==void 0&&l!==void 0)return D(e,"--lines and --max-bytes are mutually exclusive (choose one)");let c;if(a!==void 0){let g=Number.parseInt(a,10);if(!Number.isFinite(g)||g<1||String(g)!==a)return D(e,`invalid --lines "${a}" (expected a positive integer)`);c={kind:"lines",lines:g}}else{let g=l===void 0?
|
|
2271
|
-
`),2;let f=u===void 0?
|
|
2270
|
+
`),2;if(a!==void 0&&l!==void 0)return D(e,"--lines and --max-bytes are mutually exclusive (choose one)");let c;if(a!==void 0){let g=Number.parseInt(a,10);if(!Number.isFinite(g)||g<1||String(g)!==a)return D(e,`invalid --lines "${a}" (expected a positive integer)`);c={kind:"lines",lines:g}}else{let g=l===void 0?SX:Number.parseInt(l,10);if(!Number.isFinite(g)||g<0||l!==void 0&&String(g)!==l)return D(e,`invalid --max-bytes "${l}" (expected a non-negative integer)`);c={kind:"bytes",maxBytes:g}}let d=Y(n,"--watch"),u=V(n,"--watch-interval");if(u!==void 0&&!d)return e.stderr.write(`usage: --watch-interval requires --watch
|
|
2271
|
+
`),2;let f=u===void 0?bX:Number.parseInt(u.replace(/s$/,""),10);if(!Number.isSafeInteger(f)||f<1||f>2147483||u!==void 0&&!/^[1-9][0-9]*s?$/.test(u))return D(e,`invalid --watch-interval "${u}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return D(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let m=V(n,"--run");if(m!==void 0){if(n.positionals.length>0)return D(e,"--run is mutually exclusive with positional [target] [alias]");if(V(n,"--session")!==void 0)return D(e,"--run is mutually exclusive with --session");if(V(n,"--provider")!==void 0)return D(e,"--run is mutually exclusive with --provider");let g=Number.parseInt(m,10);if(!Number.isFinite(g)||g<=0||String(g)!==m)return D(e,`invalid --run "${m}" (expected a positive integer run id)`);try{return await W(e,async E=>AX(e,E,g,c,d,f,i,r))}catch(E){return Ot(e,E)}}let p=an(vX,{target:n.positionals[0],alias:n.positionals[1],flags:{session:V(n,"--session"),provider:V(n,"--provider")}});if(p.mode==="error")return D(e,p.message);if(p.mode==="managed")return D(e,"tail managed mode requires --run <id>");let _;if(p.mode==="ai-team"){if(V(n,"--provider")!==void 0)return e.stderr.write(`usage: --provider applies only to raw sessions; teamfiles declare their provider
|
|
2272
2272
|
`),2;if(p.alias===void 0){let g;try{g=await W(e,w=>Re(p.teamfile,w))}catch(w){return D(e,`tail: ${w instanceof Error?w.message:String(w)}`)}let E;try{E=ke(g)}catch(w){return D(e,`tail: ${w instanceof Error?w.message:String(w)}`)}let y=qs(E);if(y===void 0)return D(e,`tail: ${p.teamfile} has no Lead member; pass <tf>:<alias>`);try{let w=await W(e,T=>Ge(p.teamfile,y.alias,T));_={provider:w.provider,sessionId:w.sessionid,cwd:w.sessiondir}}catch(w){return w instanceof ge?D(e,w.message):Ot(e,w)}}else try{let g=await W(e,E=>Ge(p.teamfile,p.alias,E));_={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ge?D(e,g.message):Ot(e,g)}}else{let g=p.sessionid,E=p.provider;if(E===void 0){let y=await Sr(g);if(y.length===0)return D(e,`tail: session "${g}" not found in any provider store`);if(y.length>1)return D(e,`tail: session "${g}" matches multiple providers (${y.join(", ")}); pass --provider`);E=y[0]}_={provider:E,sessionId:g}}let h=await wA(e,_.provider,_.sessionId,c,-1,i,r);return h===xd?1:d?await new Promise(g=>{let E=async()=>{try{let T=await wA(e,_.provider,_.sessionId,c,h,i,r);T!==xd&&(h=T)}catch(T){e.stderr.write(`tail: ${T instanceof Error?T.message:String(T)}
|
|
2273
2273
|
`)}},y=setInterval(()=>{E()},f*1e3),w=()=>{clearInterval(y),g(0)};process.once("SIGINT",w),process.once("SIGTERM",w)}):0}async function wA(t,e,n,r,s,o,i){let a;try{a=await He(n,e)}catch(f){return t.stderr.write(`tail: failed to load session: ${f instanceof Error?f.message:String(f)}
|
|
2274
2274
|
`),xd}if(a===null)return t.stderr.write(`tail: session not found: ${n} (provider=${e})
|
|
@@ -2278,10 +2278,10 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
2278
2278
|
`).split(`
|
|
2279
2279
|
`),o=s[0]??"",i=s.slice(1);return i.length===0?`${n}: ${o}`:`${n}: ${o}
|
|
2280
2280
|
${i.map(a=>` ${a}`).join(`
|
|
2281
|
-
`)}`}function TA(t){return t.map(e=>({id:e.id,kind:e.kind,step_id:e.step_id,timestamp:new Date(e.timestamp_ms).toISOString(),payload:e.payload}))}async function
|
|
2281
|
+
`)}`}function TA(t){return t.map(e=>({id:e.id,kind:e.kind,step_id:e.step_id,timestamp:new Date(e.timestamp_ms).toISOString(),payload:e.payload}))}async function AX(t,e,n,r,s,o,i,a){if(e.getRun(n)===null)return D(t,`tail: run ${n}: not found`);let c=i===void 0?e.listSessionEvents(n):e.listSessionEvents(n).filter(f=>f.timestamp_ms>=i.getTime()),d=r.kind==="lines"?c.slice(Math.max(0,c.length-r.lines)):c;if(a===!0)Z(t,{schema_version:Rd,run_id:n,truncated:d.length<c.length,events:TA(d)});else{let f=d.map(m=>`${bA(m)}
|
|
2282
2282
|
`).join("");t.stdout.write(r.kind==="bytes"?Ld(f,r.maxBytes):f)}let u=c.length>0?c[c.length-1].id:0;return s?await new Promise(f=>{let p=setInterval(()=>{try{let h=e.listSessionEvents(n,u);if(h.length===0)return;for(let E of h)u=E.id;if(a===!0){Z(t,{schema_version:Rd,run_id:n,truncated:!1,events:TA(h)});return}let g=h.map(E=>`${bA(E)}
|
|
2283
2283
|
`).join("");t.stdout.write(r.kind==="bytes"?Ld(g,r.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
|
|
2284
|
-
`)}},o*1e3),_=()=>{clearInterval(p),f(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}function Ld(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(vA,"utf8");if(r>=e)return SA(t,e);let s=e-r,o=SA(t,s);return`${vA}${o}`}function SA(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function bA(t){let e=NA(new Date(t.timestamp_ms))??"",n="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(n=`alias=${o.alias}`),typeof o.provider=="string"&&(n+=`${n?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(n+=`${n?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(n+=`${n?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function AA(t){return yA(t,"--since")}function NA(t){if(t===void 0)return;let e=(0,IA.formatLocalTimestamp)(t);return e==="unknown"?void 0:e}var IA,
|
|
2284
|
+
`)}},o*1e3),_=()=>{clearInterval(p),f(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}function Ld(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(vA,"utf8");if(r>=e)return SA(t,e);let s=e-r,o=SA(t,s);return`${vA}${o}`}function SA(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function bA(t){let e=NA(new Date(t.timestamp_ms))??"",n="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(n=`alias=${o.alias}`),typeof o.provider=="string"&&(n+=`${n?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(n+=`${n?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(n+=`${n?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function AA(t){return yA(t,"--since")}function NA(t){if(t===void 0)return;let e=(0,IA.formatLocalTimestamp)(t);return e==="unknown"?void 0:e}var IA,vX,SX,bX,Rd,IX,xd,vA,xA=C(()=>{"use strict";pn();IA=Ft(Ct(),1);se();ot();ze();on();EA();vX={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},SX=4096,bX=2,Rd=1,IX=`usage: lmctl tail [target] [alias]
|
|
2285
2285
|
lmctl tail --session <id> [--provider <name>]
|
|
2286
2286
|
lmctl tail --run <id>
|
|
2287
2287
|
[--lines N | --max-bytes N] [--since <duration|ISO8601>]
|
|
@@ -2310,7 +2310,7 @@ everything new by construction. --json and --max-bytes cannot be combined;
|
|
|
2310
2310
|
--lines still applies. --watch --json emits one JSON
|
|
2311
2311
|
object per poll tick with something new (NDJSON) -- a tick with
|
|
2312
2312
|
nothing new prints no line at all, same as text mode.`;xd=-2;vA=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
2313
|
-
`});var OA={};fe(OA,{isSeedAck:()=>Kf,isSeedPrompt:()=>Ii,runExport:()=>
|
|
2313
|
+
`});var OA={};fe(OA,{isSeedAck:()=>Kf,isSeedPrompt:()=>Ii,runExport:()=>RX,trimExportSeedExchange:()=>CA});function NX(t){return Tr().some(e=>e.name===t)}function CA(t){let e=t.messages.findIndex(i=>i.role==="user");if(e===-1||!Ii(t.messages[e].content))return;let n=-1,r=!1;for(let i=e+1;i<t.messages.length;i++){let a=t.messages[i].role;if(a==="user")break;if(a==="assistant"){n=i;break}a!=="thinking"&&(r=!0)}let s=!1;n!==-1&&!r&&Kf(t.messages[n].content)&&(s=!0),s?t.messages.splice(e,n-e+1):t.messages.splice(e,1),Array.isArray(t.userPrompts)&&t.userPrompts.length>0&&Ii(t.userPrompts[0])&&t.userPrompts.shift(),t.messageCount=t.messages.filter(i=>i.role==="user"||i.role==="assistant").length;let o=t.messages.filter(i=>i.role==="user");o.length>0?(t.firstUserMessage=G(o[0].content.trim(),80),t.lastUserMessage=G(o[o.length-1].content.trim(),80)):(t.firstUserMessage=void 0,t.lastUserMessage=void 0)}async function RX(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(LA),0;let n=le(t,["--provider"],["--prompt-only","--json"]);if(n.error!==void 0)return D(e,n.error);let r=Y(n,"--json"),s=Y(n,"--prompt-only");if(r&&s)return D(e,"export: --prompt-only cannot be combined with --json");let o=V(n,"--provider"),i=n.positionals.length===1&&o!==void 0,a=n.positionals.length===2&&o===void 0;if(!i&&!a)return D(e,LA.trimEnd());let l,c;if(i){if(l=n.positionals[0],c=o,!NX(c))return D(e,`export: provider is not registered: ${c}`)}else l="",c="";let d;if(a){try{d=Ge(n.positionals[0],n.positionals[1],e.dal)}catch(m){return m instanceof ge?D(e,m.message):Ot(e,m)}l=d.sessionid,c=d.provider}let u;try{u=await He(l,c)}catch(m){return D(e,`export: failed to load session: ${m instanceof Error?m.message:String(m)}`)}if(u===null)return D(e,`export: session not found: ${l} (provider=${c})`);if(CA(u),r)return Z(e,u),0;let f=[];if(s){let m=u.userPrompts??u.messages.filter(p=>p.role==="user").map(p=>p.content);for(let p of m){if(Ii(p)||p.trimStart().replace(/^["']/u,"").startsWith("lmctl seed initial connection only. Create or pin this provider session, then stop."))continue;let _=p.split(/\r\n|[\r\n\u2028\u2029]/u).map(h=>h.trim()).filter(Boolean).join(" ");_!==""&&f.push(_)}}else for(let m of u.messages)m.role!=="user"&&m.role!=="assistant"||m.content.trim()!==""&&f.push(`${m.role}:
|
|
2314
2314
|
${m.content}`);return f.length>0&&e.stdout.write(`${f.join(`
|
|
2315
2315
|
|
|
2316
2316
|
`)}
|
|
@@ -2327,11 +2327,11 @@ unclassified user-role records are omitted in this compact mode.
|
|
|
2327
2327
|
--json emits the complete normalized session data (messages, userPrompts
|
|
2328
2328
|
where recorded, token totals; turns/responses where recorded), for
|
|
2329
2329
|
tracked and provider-qualified session targets.
|
|
2330
|
-
`});var WA={};fe(WA,{queryUsage:()=>FA,runUsage:()=>
|
|
2331
|
-
${MA}`),2}let i;try{let a={groups:[],total:jA(),reasons:{usage:{},cost:{}}},l=Ie(e);if(
|
|
2330
|
+
`});var WA={};fe(WA,{queryUsage:()=>FA,runUsage:()=>CX});import{existsSync as xX}from"node:fs";function $A(t){if(!/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})?)?$/.test(t))throw new Error(`invalid ISO date: ${t}`);let e=t.slice(0,10);if(new Date(e+"T00:00:00Z").toISOString().slice(0,10)!==e)throw new Error(`invalid ISO date: ${t}`);let n=t.length===10?t+"T00:00:00Z":/Z$|[+-]\d{2}:\d{2}$/.test(t)?t:t+"Z",r=new Date(n);if(!Number.isFinite(r.getTime()))throw new Error(`invalid ISO date: ${t}`);return r.toISOString()}function FA(t,e,n,r){let s=UA[r],o=r==="team"||r==="alias"?`CASE WHEN is_direct THEN '(direct)' ELSE COALESCE(${s},'(unknown)') END`:`COALESCE(${s},'(unknown)')`,i="FROM turn_usage WHERE started_at >= ? AND started_at < ?",a=t.prepare(`SELECT ${o} AS key,${PA} ${i} GROUP BY ${o} ORDER BY key`).all(e,n),l=t.prepare(`SELECT 'total' AS key,${PA} ${i}`).get(e,n),c={usage:{},cost:{}};for(let[d,u,f]of[["usage","usage_reason","usage_source IS NULL"],["cost","cost_reason","cost_usd IS NULL"]]){let m=t.prepare("SELECT COALESCE("+u+",'not_recorded') AS reason,COUNT(*) AS turns "+i+" AND "+f+" GROUP BY reason ORDER BY reason").all(e,n);for(let p of m)c[d][p.reason]=p.turns}return{groups:a,total:l.turns===0?jA():l,reasons:c}}function jA(){return{key:"total",turns:0,input:0,cacheRead:0,cacheWrite:0,output:0,costUsd:null,cacheHitPercent:null,unknownUsageCount:0,unknownCostCount:0}}function LX(t){let e=t.map(s=>s.split(/[\\/]/).filter(Boolean)),n=t.map(()=>1),r=e.map((s,o)=>s.at(-1)??t[o]);for(;;){let s=new Map;for(let i of r)s.set(i,(s.get(i)??0)+1);let o=!1;for(let i=0;i<r.length;i++)(s.get(r[i])??0)>1&&n[i]<e[i].length&&(n[i]++,r[i]=e[i].slice(-n[i]).join("/"),o=!0);if(!o){for(let i=0;i<r.length;i++)(s.get(r[i])??0)>1&&(r[i]=t[i]);return r}}}async function CX(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(MA),0;let n=le(t,["--since","--until","--by"]),r,s,o;try{if(n.error)throw new Error(n.error);if(n.positionals.length)throw new Error("usage takes no positional arguments");let a=new Date;if(r=$A(String(n.flags["--since"]??new Date(a.getTime()-7*864e5).toISOString())),s=$A(String(n.flags["--until"]??a.toISOString())),r>=s)throw new Error("--since must be earlier than --until");let l=String(n.flags["--by"]??"day");if(!Object.hasOwn(UA,l))throw new Error(`invalid --by: ${l}`);o=l}catch(a){return e.stderr.write(`error: ${a instanceof Error?a.message:String(a)}
|
|
2331
|
+
${MA}`),2}let i;try{let a={groups:[],total:jA(),reasons:{usage:{},cost:{}}},l=Ie(e);if(xX(l)&&(i=In(l),i.prepare("SELECT 1 FROM sqlite_master WHERE type='view' AND name='turn_usage'").get()&&(a=FA(i,r,s,o))),n.flags["--json"])e.stdout.write(JSON.stringify({schema_version:1,since:r,until:s,by:o,...a})+`
|
|
2332
2332
|
`);else{a.groups.length||e.stdout.write(`no usage recorded yet
|
|
2333
2333
|
`),e.stdout.write("Period (UTC): "+r+" <= started_at < "+s+`
|
|
2334
|
-
`);let c=new Intl.NumberFormat("en-US"),d=h=>h===null?"(unknown)":c.format(h),u=["group","turns","input","cache-read","cache-write","output","cost-USD","cache-hit-%","unknown-usage","unknown-cost"],f=a.groups.map(h=>h.key),m=[...o==="team"?
|
|
2334
|
+
`);let c=new Intl.NumberFormat("en-US"),d=h=>h===null?"(unknown)":c.format(h),u=["group","turns","input","cache-read","cache-write","output","cost-USD","cache-hit-%","unknown-usage","unknown-cost"],f=a.groups.map(h=>h.key),m=[...o==="team"?LX(f):f,"total"],p=[u,...[...a.groups,a.total].map((h,g)=>[m[g],d(h.turns),d(h.input),d(h.cacheRead),d(h.cacheWrite),d(h.output),h.costUsd===null?"(unknown)":h.costUsd.toFixed(6),h.cacheHitPercent===null?"(unknown)":h.cacheHitPercent.toFixed(2),d(h.unknownUsageCount),d(h.unknownCostCount)])],_=u.map((h,g)=>Math.max(...p.map(E=>E[g].length)));for(let h of p)e.stdout.write(h.map((g,E)=>E===0?g.padEnd(_[E]):g.padStart(_[E])).join(" ")+`
|
|
2335
2335
|
`);for(let[h,g]of Object.entries(a.reasons)){let E=Object.entries(g).map(([y,w])=>y+"="+c.format(w)).join(", ");E&&e.stdout.write("Unknown "+h+" reasons: "+E+`
|
|
2336
2336
|
`)}}return 0}catch(a){return e.stderr.write(`error: cannot read usage: ${a instanceof Error?a.message:String(a)}
|
|
2337
2337
|
`),1}finally{i?.close()}}var UA,MA,PA,HA=C(()=>{"use strict";$o();se();UA={day:"day",provider:"provider",model:"model",team:"team",alias:"alias",session:"native_session_id",dir:"cwd"},MA=`usage: lmctl usage [--since D] [--until D] [--by day|provider|model|team|alias|session|dir] [--json]
|
|
@@ -2347,7 +2347,7 @@ Model keys use reported names first; alias-like keys mean the model was not repo
|
|
|
2347
2347
|
SUM(cost_usd) AS costUsd,
|
|
2348
2348
|
100.0*SUM(CASE WHEN usage_source IS NOT NULL THEN COALESCE(tok_cache_read,0) ELSE 0 END)
|
|
2349
2349
|
/NULLIF(SUM(CASE WHEN usage_source IS NOT NULL THEN COALESCE(tok_input_uncached,0)+COALESCE(tok_cache_read,0)+COALESCE(tok_cache_write,0) ELSE 0 END),0) AS cacheHitPercent,
|
|
2350
|
-
COALESCE(SUM(usage_source IS NULL),0) AS unknownUsageCount, COALESCE(SUM(cost_usd IS NULL),0) AS unknownCostCount`});var GA={};fe(GA,{FIRST_PARTY_DEEPSEEK_MODELS:()=>BA,buildCostPayload:()=>XA,getSummaryDays:()=>qA,normalizeModelId:()=>Cd,runCost:()=>
|
|
2350
|
+
COALESCE(SUM(usage_source IS NULL),0) AS unknownUsageCount, COALESCE(SUM(cost_usd IS NULL),0) AS unknownCostCount`});var GA={};fe(GA,{FIRST_PARTY_DEEPSEEK_MODELS:()=>BA,buildCostPayload:()=>XA,getSummaryDays:()=>qA,normalizeModelId:()=>Cd,runCost:()=>FX});import{existsSync as OX}from"node:fs";function Cd(t){return t.trim().toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function MX(t,e,n,r){let s=new Set,o=[];for(let i of e){let a=n===null?null:rl(t,i,n,r),l=a?.kind==="priced"||a?.kind==="estimated"?`id:${a.model.normalizedId}`:a?.kind==="known-unpriced"?`id:${a.id}`:`raw:${i.trim().toLowerCase()}`;s.has(l)||(s.add(l),o.push(i))}return o}async function XA(t,e,n){let r=[...new Set([...n.messages.map(b=>b.model),...(n.responses??[]).map(b=>b.model??void 0)].filter(b=>b!==void 0&&b!=="<synthetic>"))],s=[...n.messages].reverse().find(b=>b.model!==void 0&&b.model!=="<synthetic>")?.model,o=n.model??s??null,i=Kn(n.responses??[],n.captureStatus!=="partial"),a=t==="gemini"&&(n.totalOutputTokens!==void 0||n.totalReasoningOutputTokens!==void 0)?(n.totalOutputTokens??0)+(n.totalReasoningOutputTokens??0):n.totalOutputTokens??null,l={input:n.responses?i.input_uncached:n.totalInputTokens??null,output:n.responses?i.output:a,cachedInput:n.responses?i.input_cached:n.totalCachedInputTokens??null},c=await vt(),d=MX(t,r,c.catalog,c.aliases),u=n.responses===void 0&&d.length>1,f="unavailable",m=null,p=null,_=null,h=null,g=!1,E=null,y=null;if(o!==null&&c.catalog!==null){let b=St(t,o,c.catalog,c.aliases);if(f=b.state.kind,b.offer!==null)y=b.offer.pricing,m=b.offer.route,p=b.offer.source,_=b.offer.sourceModelId,h=b.provenance,g=b.offer.estimated;else switch(b.state.kind){case"unresolved":E=`alias "${b.state.alias}" is deliberately unresolved in the lmprice alias table`;break;case"known-unpriced":E=`"${b.state.id}" is a known model with no published price row`;break;case"unknown":E=`model "${o}" not found in lmprice catalog for provider "${t}"`;break;case"wrong-provider":E=`model "${o}" is not offered by provider "${t}" (found under: ${b.state.otherProviders.join(", ")})`;break;default:E=`no lmprice catalog coverage for provider "${t}"`;break}}else o!==null&&(E="lmprice catalog unavailable");let w=y===null?null:{inputPer1m:y.input_per_1m_tokens,outputPer1m:y.output_per_1m_tokens,cachedInputPer1m:y.input_cache_read_per_1m_tokens},T=l.cachedInput??0,S=n.totalCacheWriteInputTokens??0,I=["claude","codex","gemini","qwen","copilot"].includes(t),A=l.input===null?null:Math.max(0,l.input-(I?T:0)-(t==="claude"||t==="copilot"?S:0)),N=l.input===null||l.output===null?null:ei({input:A,output:l.output,cachedInput:T,...S>0?{cacheWrite:S,...n.totalCacheWrite5mInputTokens===void 0?{}:{cacheWrite5m:n.totalCacheWrite5mInputTokens},...n.totalCacheWrite1hInputTokens===void 0?{}:{cacheWrite1h:n.totalCacheWrite1hInputTokens}}:{}},y);if(N===null&&T>0&&y!==null&&y.input_cache_read_per_1m_tokens==null&&(E="no applicable cache-read price rate"),n.responses)if(N=null,!n.responses.length||n.captureStatus==="partial"||new Set(n.responses.map(b=>b.response_id)).size!==n.responses.length)E="session accounting coverage is incomplete";else if(!c.catalog)E="lmprice catalog unavailable";else{let b=0,v=null;for(let k of n.responses){let R=k.tokens;if(!k.model){v="a response lacks a model";break}let L=n.turns?.flatMap(Or=>Or.rawUsage??[]).find(Or=>Or.responseId===k.response_id)?.values,O=L?.promptTokens??L?.prompt_tokens,M=L?.input_tokens,P=L?.cache_read_tokens??L?.input_cache_read_tokens,q=L?.cache_write_tokens??L?.input_cache_write_tokens;if(typeof M=="number"&&typeof P=="number"&&P>M||typeof O=="number"&&typeof P=="number"&&P>O||typeof O=="number"&&typeof q=="number"&&q>O||typeof O=="number"&&typeof P=="number"&&typeof q=="number"&&P+q>O){v=`${t} reported contradictory token counters`;break}if(R.output===null){v=`${t} does not record output tokens`;break}if(R.input_cached===null){v=`${t} does not record cached input tokens`;break}let $=k.model_provider??t,ue=Cd(k.model??""),H=($==="deepseek"||k.model_provider==="deepseek")&&(k.model_provider===void 0||k.model_provider==="deepseek")&&BA.has(ue),ne=R.input_cache_write;if(ne===null&&!H){v=`${t} does not record cache-write input tokens`;break}if(t==="agy"&&(ne??0)>0){v="cache-write inclusion in input is not verified";break}let me=["kimi","opencode","miniplayer"].includes(t),et=St($,k.model,c.catalog,c.aliases),tt=et.offer??St(t,k.model,c.catalog,c.aliases).offer;if(tt===null){switch(et.state.kind){case"no-catalog":v=`no lmprice catalog coverage for provider "${t}"`;break;case"unresolved":v=`alias "${et.state.alias}" is deliberately unresolved in the lmprice alias table`;break;case"known-unpriced":v=`"${et.state.id}" is a known model with no published price row`;break;case"unknown":v=`model "${k.model}" not found in lmprice catalog for provider "${t}"`;break;case"wrong-provider":v=`model "${k.model}" is not offered by provider "${t}" (found under: ${et.state.otherProviders.join(", ")})`;break;default:v=`no applicable price for response model "${k.model}"`;break}break}if(ne===null){let Or=(tt.route??"").toLowerCase(),F=/^(openrouter|ollama|together|fireworks|groq|azure|bedrock|vertex)[:\/]/i.test(Or),j=Cd(tt.sourceModelId??""),he=tt.provider==="deepseek"&&tt.source!=="openrouter"&&!F&&j===ue;if(H&&he)ne=0;else{v=`${t} does not record cache-write input tokens`;break}}if(R.input_uncached===null){v=`${t} does not record uncached input tokens`;break}let Oo=ei({input:Math.max(0,R.input_uncached-(me?ne:0)),cachedInput:R.input_cached,cacheWrite:ne,output:R.output},tt?.pricing??null);if(Oo===null){v=`no applicable price for response model "${k.model}"`;break}b+=Oo,!m&&tt&&(m=tt.route,f="priced")}N=v?null:b,E=v}return N===null&&(!n.responses&&l.input===null&&l.output===null?E=`${t} does not record token usage`:!n.responses&&l.input===null&&!E?E=`${t} does not record input tokens`:!n.responses&&l.output===null&&!E?E=`${t} does not record output tokens`:E||(E=`no lmprice entry for "${o??"unknown"}"`),(f==="priced"||f==="estimated")&&(f="unavailable",m=null,p=null,_=null,h=null,w=null)),{schema_version:$X,provider:t,sessionId:e,model:o,modelsUsed:d,approximate:u,tokens:l,pricePerModel:w,costUsd:N,priceResolution:f,priceRoute:m,priceSource:p,priceSourceModelId:_,priceProvenance:h,priceEstimated:g,costUnavailableReason:E,priceDataSource:c.source,priceDataGeneratedAt:c.generatedAt}}function qA(t,e=new Date){let n=[];for(let r=t-1;r>=0;r--){let s=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()-r));n.push(s.toISOString().slice(0,10))}return n}async function UX(t,e,n,r,s){let o=qA(t,s),i=Ie(r);if(!OX(i))return n?Z(r,{schema_version:1,days:o,providers:[]}):r.stdout.write(`no cost recorded yet
|
|
2351
2351
|
`),0;let a;try{if(a=In(i),!a.prepare("SELECT 1 FROM sqlite_master WHERE type='view' AND name='turn_usage'").get())return n?Z(r,{schema_version:1,days:o,providers:[]}):r.stdout.write(`no cost recorded yet
|
|
2352
2352
|
`),0;let c=`${o[0]}T00:00:00.000Z`,u=`${new Date(Date.UTC(s.getUTCFullYear(),s.getUTCMonth(),s.getUTCDate()+1)).toISOString().slice(0,10)}T00:00:00.000Z`,f=`
|
|
2353
2353
|
SELECT
|
|
@@ -2364,8 +2364,8 @@ Model keys use reported names first; alias-like keys mean the model was not repo
|
|
|
2364
2364
|
`),r.stdout.write(`${(0,En.escapeCell)(h[N].provider)}: stored turn cost (UTC)
|
|
2365
2365
|
`);for(let[x,b]of S.entries()){x>0&&r.stdout.write(`
|
|
2366
2366
|
`);let v=[0,...b];r.stdout.write((0,En.renderGrid)([v.map(k=>E[N][k])],{widths:v.map(k=>y[k]),headers:v.map(k=>g[k]),align:v.map((k,R)=>R===0?"left":"right"),margin:2,truncate:!1})+`
|
|
2367
|
-
`)}}return 0}catch(l){return D(r,`cost: cannot read cost summary: ${l instanceof Error?l.message:String(l)}`)}finally{a?.close()}}async function
|
|
2368
|
-
`),0;let r=le(t,["--provider","--days"],["--json"]);if(r.error!==void 0)return D(e,r.error);let s=Y(r,"--json");if(r.positionals.length===0){let y=7,w=V(r,"--days");if(w!==void 0){let S=Number(w);if(!/^[1-9]\d*$/.test(w)||!Number.isSafeInteger(S)||S>366)return D(e,`invalid --days "${w}" (expected an integer from 1 to 366)`);y=S}let T=V(r,"--provider");return T!==void 0&&!Qr(T)?D(e,`invalid provider "${T}"; use a canonical provider name (see lmctl help)`):
|
|
2367
|
+
`)}}return 0}catch(l){return D(r,`cost: cannot read cost summary: ${l instanceof Error?l.message:String(l)}`)}finally{a?.close()}}async function FX(t,e={stdout:process.stdout,stderr:process.stderr},n=new Date){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${PX}
|
|
2368
|
+
`),0;let r=le(t,["--provider","--days"],["--json"]);if(r.error!==void 0)return D(e,r.error);let s=Y(r,"--json");if(r.positionals.length===0){let y=7,w=V(r,"--days");if(w!==void 0){let S=Number(w);if(!/^[1-9]\d*$/.test(w)||!Number.isSafeInteger(S)||S>366)return D(e,`invalid --days "${w}" (expected an integer from 1 to 366)`);y=S}let T=V(r,"--provider");return T!==void 0&&!Qr(T)?D(e,`invalid provider "${T}"; use a canonical provider name (see lmctl help)`):UX(y,T,s,e,n)}if(V(r,"--days")!==void 0)return D(e,"--days is only supported without a target");if(r.positionals.length>2)return D(e,`too many positionals (${r.positionals.length}); expected <target> [alias]`);let o=an(DX,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:V(r,"--provider")}});if(o.mode==="error")return D(e,o.message);if(o.mode==="managed")return D(e,"cost: managed-run targets are not supported (no per-run token/model rollup exists)");let i,a;if(o.mode==="ai-team")try{let y=await W(e,w=>Ge(o.teamfile,o.alias,w));i=y.provider,a=y.sessionid}catch(y){if(y instanceof ge)return D(e,y.message);throw y}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let y=await Sr(a);if(y.length===0)return D(e,`cost: session "${a}" not found in any provider store`);if(y.length>1)return D(e,`cost: session "${a}" matches multiple providers (${y.join(", ")}); pass --provider`);i=y[0]}let l;try{l=await He(a,i)}catch(y){return D(e,`cost: failed to load session: ${y instanceof Error?y.message:String(y)}`)}if(l===null)return D(e,`cost: session not found: ${a} (provider=${i})`);let c=await XA(i,a,l),{model:d,modelsUsed:u,approximate:f,tokens:m,costUsd:p,priceEstimated:_,priceRoute:h,costUnavailableReason:g}=c,E={source:c.priceDataSource,generatedAt:c.priceDataGeneratedAt};return s?(Z(e,c),0):(e.stdout.write(`Session: ${a}
|
|
2369
2369
|
`),e.stdout.write(` Provider: ${i}
|
|
2370
2370
|
`),e.stdout.write(` Model: ${d??"(unknown)"}
|
|
2371
2371
|
`),f&&e.stdout.write(` NOTE: this session used multiple models (${u.join(", ")}) -- cost below is approximate, priced at ${d}'s rate for the whole session.
|
|
@@ -2374,7 +2374,7 @@ Model keys use reported names first; alias-like keys mean the model was not repo
|
|
|
2374
2374
|
`):e.stdout.write(` Cost: ~$${p.toFixed(4)}${f?" (approximate)":""}${_?" (estimated rate)":""}
|
|
2375
2375
|
`),h!==null&&e.stdout.write(` Price route: ${h}${_?" (manual/estimated row)":""}
|
|
2376
2376
|
`),e.stdout.write(` Price data: ${E.source}${E.generatedAt?` (generated ${E.generatedAt})`:""}
|
|
2377
|
-
`),0)}var En,
|
|
2377
|
+
`),0)}var En,DX,BA,$X,PX,VA=C(()=>{"use strict";Fo();pn();En=Ft(Ct(),1);yi();Zt();qr();se();$o();ot();fo();DX={name:"cost",allowsBareTeamfile:!1,supportsRaw:!0};BA=new Set([...lo,...co,"deepseek-v4.1-flash","deepseek-chat","deepseek-reasoner","deepseek-coder","deepseek-v3","deepseek-v3.2","deepseek-r1"].map(Cd));$X=1,PX=`usage: lmctl cost <target> [alias] [--json]
|
|
2378
2378
|
lmctl cost <sessionid> [--provider <name>] [--json]
|
|
2379
2379
|
lmctl cost [--days <n>] [--provider <name>] [--json]
|
|
2380
2380
|
|
|
@@ -2405,16 +2405,16 @@ unavailable) and
|
|
|
2405
2405
|
\`priceDataGeneratedAt\` says how fresh it is -- the online check has a
|
|
2406
2406
|
strict short timeout and NEVER blocks or fails this command: any network
|
|
2407
2407
|
error degrades silently to the local cache, then the bundled built-in
|
|
2408
|
-
copy, in that order.`});function JA(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}var KA=C(()=>{"use strict"});var zA={};fe(zA,{runLs:()=>
|
|
2409
|
-
`),0;let n=le(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return D(e,n.error);if(n.positionals.length>0)return D(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=V(n,"--format"),s=Y(n,"--json");if(Y(n,"--runs")){for(let h of["--provider","--sessiondir"])if(V(n,h)!==void 0)return D(e,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(Y(n,h))return D(e,`--runs is mutually exclusive with ${h}`);if(r==="teamfile")return D(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let m=V(n,"--limit"),p=
|
|
2408
|
+
copy, in that order.`});function JA(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}var KA=C(()=>{"use strict"});var zA={};fe(zA,{runLs:()=>BX});import{resolve as h_}from"node:path";function HX(t){let e=new Map;for(let n of t){let r=`${n.provider}:${n.sessionId}`,s=e.get(r);(s===void 0||n.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(r,n)}return[...e.values()]}async function BX(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${jX}
|
|
2409
|
+
`),0;let n=le(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return D(e,n.error);if(n.positionals.length>0)return D(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=V(n,"--format"),s=Y(n,"--json");if(Y(n,"--runs")){for(let h of["--provider","--sessiondir"])if(V(n,h)!==void 0)return D(e,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(Y(n,h))return D(e,`--runs is mutually exclusive with ${h}`);if(r==="teamfile")return D(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let m=V(n,"--limit"),p=WX;if(m!==void 0){let h=Number.parseInt(m,10);if(!Number.isFinite(h)||h<1||String(h)!==m)return D(e,`invalid --limit "${m}" (expected a positive integer)`);if(h>YA)return D(e,`--limit ${h} exceeds maximum (${YA})`);p=h}let _=r==="json"||s===!0?"json":"table";try{return await W(e,async h=>XX(e,h,p,_))}catch(h){return Ot(e,h)}}let i=qX(r,s);if("error"in i)return D(e,i.error);let a=i.format,l=V(n,"--provider"),c=V(n,"--sessiondir"),d=Y(n,"--recursive"),u=Y(n,"--all"),f;try{f=await Fp(l?{provider:l}:{})}catch(m){return D(e,`ls: discovery failed: ${m instanceof Error?m.message:String(m)}`)}if(!u){let m=c!==void 0?h_(c):h_(process.cwd());f=f.filter(p=>{let _=h_(p.cwd);return d?_===m||_.startsWith(`${m}/`):_===m})}if(f=HX(f),a==="json")return Z(e,f.map(m=>({provider:m.provider,sessionId:m.sessionId,cwd:m.cwd,messageCount:m.messageCount,modifiedAt:m.modifiedAt.toISOString(),...m.model!==void 0?{model:m.model}:{}}))),0;if(f.length===0){if(a==="table"){let m=u?"(all)":c??process.cwd(),p=d?"under":"in";e.stdout.write(`No native sessions found ${p} ${m}.
|
|
2410
2410
|
`)}return 0}if(a==="teamfile"){for(let m of f)e.stdout.write(`_MEMBER_ alias=- provider=${m.provider} sessionid=${m.sessionId} sessiondir=${m.cwd}
|
|
2411
|
-
`);return 0}return(0,lt.printTable)(f.map(m=>[(0,lt.escapeCell)(m.sessionId),(0,lt.escapeCell)(m.provider),(0,lt.escapeCell)(m.cwd.length>36?`\u2026${m.cwd.slice(-35)}`:m.cwd),(0,lt.formatRelativeTime)(m.modifiedAt)]),{headers:["SESSION","PROVIDER","SESSIONDIR","MODIFIED"],stream:e.stdout}),0}async function
|
|
2412
|
-
`),0):((0,lt.printTable)(s.map(o=>[(0,lt.escapeCell)(o.id),(0,lt.escapeCell)(o.workflow_id),(0,lt.escapeCell)(o.team_id),(0,lt.escapeCell)(o.current_state??""),(0,lt.escapeCell)(o.terminal_state??""),(0,lt.escapeCell)(o.started_at)]),{headers:["RUN_ID","WORKFLOW","TEAM","STATE","TERMINAL","STARTED"],stream:t.stdout}),0)}function
|
|
2411
|
+
`);return 0}return(0,lt.printTable)(f.map(m=>[(0,lt.escapeCell)(m.sessionId),(0,lt.escapeCell)(m.provider),(0,lt.escapeCell)(m.cwd.length>36?`\u2026${m.cwd.slice(-35)}`:m.cwd),(0,lt.formatRelativeTime)(m.modifiedAt)]),{headers:["SESSION","PROVIDER","SESSIONDIR","MODIFIED"],stream:e.stdout}),0}async function XX(t,e,n,r){let s=JA(e,{limit:n});return r==="json"?(Z(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0):s.length===0?(t.stdout.write(`No runs found.
|
|
2412
|
+
`),0):((0,lt.printTable)(s.map(o=>[(0,lt.escapeCell)(o.id),(0,lt.escapeCell)(o.workflow_id),(0,lt.escapeCell)(o.team_id),(0,lt.escapeCell)(o.current_state??""),(0,lt.escapeCell)(o.terminal_state??""),(0,lt.escapeCell)(o.started_at)]),{headers:["RUN_ID","WORKFLOW","TEAM","STATE","TERMINAL","STARTED"],stream:t.stdout}),0)}function qX(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var lt,jX,WX,YA,QA=C(()=>{"use strict";lt=Ft(Ct(),1);Hn();se();KA();jX=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
2413
2413
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
2414
2414
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
2415
2415
|
|
|
2416
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,
|
|
2417
|
-
`),2;let o=Mt(e.env??process.env,n.configPath);try{let i=XI((n.detectProviders??id)()),a=
|
|
2416
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,WX=50,YA=500});import{closeSync as ZA,openSync as GX,writeFileSync as eN,fsyncSync as VX,renameSync as JX,unlinkSync as KX,lstatSync as __,readFileSync as YX}from"node:fs";import{randomUUID as zX}from"node:crypto";import{dirname as QX,join as ZX}from"node:path";function Od(t,e,n){let r=()=>n===null?(()=>{try{return __(t),!0}catch(a){if(a.code==="ENOENT")return!1;throw a}})():!YX(t).equals(Buffer.from(n,"utf8")),s=384;if(n!==null){let a=__(t);if(!a.isFile())throw new Error("Profile path must be a regular file: "+t);if(s=a.mode&511,!(s&146))throw new Error("Profile is read-only: "+t)}let o=ZX(QX(t),".init-"+zX()+".tmp"),i;try{if(i=GX(o,"wx",s),eN(i,e,"utf8"),VX(i),ZA(i),i=void 0,r())throw new Error("Profile changed concurrently: "+t);if(n!==null){let a=t+".bak";try{if(!__(a).isFile())throw new Error("Backup path is not a regular file: "+a)}catch(l){if(l.code!=="ENOENT")throw l}if(eN(a,n,{encoding:"utf8",flag:"w",mode:s}),r())throw new Error("Profile changed concurrently: "+t)}JX(o,t)}finally{i!==void 0&&ZA(i);try{KX(o)}catch(a){if(a.code!=="ENOENT")throw a}}}var tN=C(()=>{"use strict"});var nN={};fe(nN,{runInit:()=>o2});import{mkdirSync as e2,readFileSync as t2}from"node:fs";import{dirname as n2}from"node:path";function s2(t){try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(t2(t))}catch(e){if(e.code==="ENOENT")return null;throw new Ve(t,"read",e.message)}}async function o2(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(r2),0;let r=t.includes("--force"),s=t.find(i=>i!=="--force"&&i!=="--help"&&i!=="-h");if(s!==void 0)return e.stderr.write(`error: unknown argument: ${s}
|
|
2417
|
+
`),2;let o=Mt(e.env??process.env,n.configPath);try{let i=XI((n.detectProviders??id)()),a=s2(o);if(i.length===0)return e.stderr.write(`error: no supported provider is installed -- looked for ${ho.join(", ")} on PATH (each must run \`<name> --version\`). ${a===null?"Nothing was written":`${o} was left unchanged`}; install a provider CLI, then run this again.
|
|
2418
2418
|
`),1;let l=[],c={},d=[];for(let p of i)try{let _=await(n.modelsForProvider??qI)(p);if(_.length===0)throw new Error(`No model ids are available for detected provider "${p}"`);l.push(p),c[p]=_}catch(_){let h=_ instanceof Error?_.message:String(_),g=`${p}: ${h}`;d.push(g),e.stderr.write(`warning: ${p} model catalog unavailable (${h}); skipping this provider.
|
|
2419
2419
|
`)}if(l.length===0)return e.stderr.write(`error: no detected provider returned model ids (${d.join("; ")}). Nothing was written.
|
|
2420
2420
|
`),1;let u=GI(l,c);e.stderr.write(`notice: installed: ${i.join(", ")} -- provider slots use order (${ho.join(", ")}); model1 uses each provider's first reported id
|
|
@@ -2431,7 +2431,7 @@ ${g_}
|
|
|
2431
2431
|
${g_}
|
|
2432
2432
|
`),f(),0}if(a!==null){gn(a,o);let p=ua(u);gn(p,o),Od(o,p,a),e.stdout.write(`Wrote ${o} (previous file saved as ${o}.bak)
|
|
2433
2433
|
|
|
2434
|
-
`)}else{let p=ua(u);gn(p,o),
|
|
2434
|
+
`)}else{let p=ua(u);gn(p,o),e2(n2(o),{recursive:!0}),Od(o,p,null),e.stdout.write(`Wrote ${o}
|
|
2435
2435
|
|
|
2436
2436
|
`)}return e.stdout.write(ua(u)),e.stdout.write(`
|
|
2437
2437
|
This is a starting point, not a fixed answer -- edit provider/model1 above before running lmctl plan or lmctl quickrun if it is not right.
|
|
@@ -2439,7 +2439,7 @@ This is a starting point, not a fixed answer -- edit provider/model1 above befor
|
|
|
2439
2439
|
`),f(),0}catch(i){return i instanceof Ve?(e.stderr.write(`error: ${i.detail}
|
|
2440
2440
|
`),e.stderr.write(r?`The file was left unchanged: --force does not overwrite a file it cannot read as TOML. Fix it by hand, or move it aside.
|
|
2441
2441
|
`:"The file was left unchanged. Fix it by hand, or run `lmctl init --force` to regenerate it from scratch.\n"),1):(e.stderr.write("error: cannot update "+o+": "+(i instanceof Error?i.message:String(i))+`
|
|
2442
|
-
`),1)}}var g_,
|
|
2442
|
+
`),1)}}var g_,r2,rN=C(()=>{"use strict";tN();ps();g_="These are lmctl properties: lmscript reads PROPS.Provider1.Provider and PROPS.Provider1.Model1; legacy plan/quickrun templates use them as ${Provider1}/${Model1}.",r2=`usage: lmctl init [--force]
|
|
2443
2443
|
|
|
2444
2444
|
Writes ~/.lmctl/init.toml if it does not exist: an example of three provider
|
|
2445
2445
|
slots (Provider1/2/3), each with a provider and model1.
|
|
@@ -2479,11 +2479,11 @@ it is expected.
|
|
|
2479
2479
|
--force Regenerate the whole example file from detection (previous file
|
|
2480
2480
|
saved as init.toml.bak). Slots you added are NOT kept by --force.
|
|
2481
2481
|
-h, --help display help for command
|
|
2482
|
-
`});function sN(t){let e=Object.create(null),n=Object.create(null),r=(s,o,i=!0)=>{if(Array.isArray(s)){let a=s.map((l,c)=>r(l,o+"."+c,!1));return i&&(n[o]=a),a}if(s&&typeof s=="object"&&!(s instanceof Date)){let a=Object.create(null);for(let[l,c]of Object.entries(s)){let u=/^Provider[123]$/.test(o)&&["provider","model1"].includes(l)?l[0].toUpperCase()+l.slice(1):l;if(Object.hasOwn(a,u))throw Error(`Ambiguous property '${o}.${u}'`);a[u]=r(c,o?o+"."+u:u,i&&/^[_a-zA-Z]\w*$/.test(u))}return a}return i&&(n[o]=s),s};for(let[s,o]of Object.entries(t))e[s]=r(o,s,/^[_a-zA-Z]\w*$/.test(s));return{properties:e,flat:n}}var oN=C(()=>{"use strict"});import{execFileSync as
|
|
2483
|
-
`)}catch{}}}}function
|
|
2482
|
+
`});function sN(t){let e=Object.create(null),n=Object.create(null),r=(s,o,i=!0)=>{if(Array.isArray(s)){let a=s.map((l,c)=>r(l,o+"."+c,!1));return i&&(n[o]=a),a}if(s&&typeof s=="object"&&!(s instanceof Date)){let a=Object.create(null);for(let[l,c]of Object.entries(s)){let u=/^Provider[123]$/.test(o)&&["provider","model1"].includes(l)?l[0].toUpperCase()+l.slice(1):l;if(Object.hasOwn(a,u))throw Error(`Ambiguous property '${o}.${u}'`);a[u]=r(c,o?o+"."+u:u,i&&/^[_a-zA-Z]\w*$/.test(u))}return a}return i&&(n[o]=s),s};for(let[s,o]of Object.entries(t))e[s]=r(o,s,/^[_a-zA-Z]\w*$/.test(s));return{properties:e,flat:n}}var oN=C(()=>{"use strict"});import{execFileSync as i2}from"node:child_process";import{resolve as iN}from"node:path";function a2(t){return t.filter(e=>e.state!=="retired")}function aN(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?D(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=i2("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return D(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let o=iN(s),i=e.listProjects().find(a=>iN(a.local_path)===o);return i===void 0?D(t,`terminal cannot infer a member from cwd ${o}; use \`lmctl terminal <teamfile> <alias>\``):i}function lN(t,e,n,r){if(r!==void 0){let o=e.findTeamByName(r);return o===null?D(t,`team not found: ${r}`):o}let s=e.getTeam(n.team_id);return s===null?D(t,`project ${n.name} has no assigned team; use --team <name>`):s}function cN(t,e,n,r){if(r!==void 0){let o=e.findTeamMemberByAlias(n.id,r);return o===null||o.state==="retired"?D(t,`member not found: ${r}`):o}let s=a2(e.listTeamMembers(n.id)).find(o=>o.role==="agent");return s===void 0?D(t,`team ${n.name} has no active agent member`):s}var dN=C(()=>{"use strict";se()});function uN(t,e,n){let r=t.getRun(e);if(r===null)return{err:`run ${e}: not found`};if(n!==void 0){let l=t.findTeamMemberByAlias(r.team_id,n);return l===null?{err:`run ${e}: team has no member alias "${n}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(r.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(r.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}var fN=C(()=>{"use strict"});var _N={};fe(_N,{SIZE_WARN_EST_TOKENS:()=>Ta,estimateTokens:()=>hN,runTeamTerminal:()=>f2,runTerminal:()=>y_});import{constants as l2}from"node:os";import{spawn as c2}from"node:child_process";import{statSync as d2}from"node:fs";async function y_(t,e){if(t.includes("--help")||t.includes("-h"))return g2(e);let n=le(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return D(e,n.error);if(Ht(e)&&!Y(n,"--size"))return D(e,"terminal opens an interactive TUI; non-interactive mode is enabled");let r=V(n,"--run");if(r!==void 0){let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<=0||String(s)!==r)return D(e,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return D(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?Y(n,i):V(n,i)!==void 0)return D(e,`--run is mutually exclusive with ${i}`);try{return await W(e,async i=>{let a=V(n,"--alias"),l=uN(i,s,a);return"err"in l?D(e,l.err):E_(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(i){return Ot(e,i)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?Y(n,l):V(n,l)!==void 0)return D(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return D(e,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=n.positionals[0],i=n.positionals[1],a=an(u2,{target:o,alias:i,flags:{}});return a.mode==="error"?D(e,a.message):a.mode!=="ai-team"?D(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?D(e,"terminal: alias required for the teamfile target"):await W(e,l=>pN(e,a.teamfile,a.alias,l,Y(n,"--json")))}try{return await W(e,async s=>{let o=p2(e,s,n);if(typeof o=="number")return o;let i=V(n,"--alias");return Y(n,"--size")?_2(e,s,o,i,Y(n,"--json")):h2(e,s,o,i)})}catch(s){return Ot(e,s)}}async function f2(t,e,n,r,s){let o=await pN(t,e,n,r,!1,s);return{code:s.signalObserved?null:o,signal:s.signalObserved??null}}async function pN(t,e,n,r,s,o){let i;try{i=Ge(e,n,r)}catch(k){return k instanceof ge?D(t,k.message):Ot(t,k)}let a=ir(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:ur(o?.env??t.env)});if(!a.acquired){let k=a.current.holder_pid,R=k===null?null:rt(k)?"live":"dead",L=`${i.alias} is busy/held by ${a.current.sender_alias} (${a.current.sender_teamfile}) since ${a.current.started_at} `+(k===null?"(holder_pid=unavailable)":`(holder_pid=${k}, ${R})`);return s?(Z(t,{status:"error",errorKind:"busy",message:L,holder_pid:k,holder_liveness:R}),1):D(t,L)}let l=qb({teamfile:i.teamfile,alias:i.alias,pid:o?.pid}),c=null,d=null,u=null,f=[],m={...o?.env??t.env??process.env},p=!1,_=null,h=!1,g,E,y,w=k=>{c!==null&&(clearInterval(c),c=null);try{let R=r.getTerminalLock(l.teamfile,l.alias);!r.clearTerminalLock(l.teamfile,l.alias,l.lock_id)&&R!==null&&k.push("terminal lock release was not acknowledged")}catch(R){k.push(`terminal lock release: ${R instanceof Error?R.message:String(R)}`)}try{let R=r.getAgentInflight(l.teamfile,l.alias);!r.releaseAgentInflight(a.lease,a.leaseId)&&R!==null&&k.push("inflight release was not acknowledged")}catch(R){k.push(`inflight release: ${R instanceof Error?R.message:String(R)}`)}},T=(k,R)=>{let L=r.db.pragma("busy_timeout",{simple:!0});r.db.pragma("busy_timeout=0");try{k(R)}finally{try{r.db.pragma(`busy_timeout=${L}`)}catch(O){R.push(`busy timeout restore: ${O instanceof Error?O.message:String(O)}`)}}},S=(k,R)=>{if(!(d===null||h))try{if(r.finishTrackedInvocation(d,k)===null){let O=r.getTrackedInvocation(d);O==null||O.status==="running"?R.push("tracked terminal finish was not acknowledged"):h=!0}else h=!0}catch(L){R.push(`tracked terminal finish: ${L instanceof Error?L.message:String(L)}`)}},I=k=>{if(p)return;p=!0;let R=[];try{T(L=>{w(L),S({status:"cancelled",signal:k,exit_code:k==="SIGINT"?130:143,error:`terminal interrupted by ${k}`},L)},R)}catch(L){R.push(L instanceof Error?L.message:String(L))}R.length>0&&(_=Error(R.join("; ")))},A=!o,N=A?new AbortController:void 0,x=()=>N?.abort("SIGINT"),b=()=>N?.abort("SIGTERM");A&&(process.once("SIGINT",x),process.once("SIGTERM",b));let v=o??{env:m,signal:N?.signal};v.env=m;try{if(v.cancel=I,v.cleanupError=()=>_,o&&o.onResource?.({close(){if(E)return E;let L,O;E=new Promise((P,q)=>{L=P,O=q});let M=performance.now();return(async()=>{if(I("SIGTERM"),o.stop?.("SIGTERM"),_)throw _;if(g){let P=5e3-(performance.now()-M),q;try{if(P<=0)throw Error("terminal close deadline exceeded");await Promise.race([g.catch(()=>{}),new Promise(($,ue)=>{q=setTimeout(()=>ue(Error("terminal close deadline exceeded")),P)})])}catch($){throw _=$ instanceof Error?$:Error(String($)),_}finally{clearTimeout(q)}}})().then(L,O),E},finalizeSync(L){if(I(L),o.stop?.(L),_)throw _}}),p||v.signal?.aborted){let L=v.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM";return I(L),L==="SIGINT"?130:143}r.setTerminalLock(l),d=m2(r,i,m,o?.pid),d!==null&&(m.LMCTL_INVOCATION_ID=String(d));let k=r.getRootTeam(i.teamfile)?.name??null;k!==null&&(m.LMBEE_TEAM_NAME=k),c=setInterval(()=>{try{let L=new Date().toISOString(),O=r.heartbeatTerminalLock(l.teamfile,l.alias,l.lock_id,L);O&&r.heartbeatAgentInflight(a.lease,a.leaseId,L),!O&&c!==null&&(clearInterval(c),c=null)}catch{}},Gb(m)),c.unref?.();try{Vs(t,ke(i.teamfile),i.teamfile)}catch{}let R=v;return g=E_(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead},L=>{f.push(`${L.provider} terminal ignored model=${L.model}: ${L.reason}`)},R),u=await g,u}catch(k){throw y=k,k}finally{if(A&&(process.removeListener("SIGINT",x),process.removeListener("SIGTERM",b)),!p){p=!0;let k=[];try{T(R=>{w(R),S({status:u===0?"done":"error",exit_code:u,result_summary:u===0?"terminal session ended":null,error:u===0?null:`terminal exited with code ${u??"unknown"}`,...f.length>0?{config_warnings:JSON.stringify(f)}:{}},R)},k)}catch(R){k.push(R instanceof Error?R.message:String(R))}k.length>0&&(_=Error(k.join("; ")))}if(_){if(y===void 0)throw _;try{t.stderr.write("error: terminal cleanup: "+_.message+`
|
|
2483
|
+
`)}catch{}}}}function m2(t,e,n=process.env,r=process.pid){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:r,launch_source:"terminal",parent_invocation_id:Us(n.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}async function E_(t,e,n,r){let{provider:s,sessionid:o,sessiondir:i,model:a}=e;if(!Uc(s))return D(t,`no resume incantation for provider "${s}"`);if(!Mb.test(o))return D(t,"refusing to resume: malformed sessionid");let l=Hp(s,o,{isLead:e.isLead,model:a,onModelIgnored:p=>{let _=`warning: ${p.provider} terminal ignored model=${p.model}: ${p.reason}`;t.stderr.write(`${_}
|
|
2484
2484
|
`),qe({event:"model_ignored",provider:p.provider,model:p.model,reason:p.reason}),n?.(p)}});if(l===null||l.length===0)return D(t,`no resume incantation for provider "${s}"`);let c=De(r?.env??t.env??process.env,i,o,"terminal"),d=await $b(s,{binary:l[0],cwd:i,env:c,signal:r?.signal});if(r?.signal?.aborted){let p=r.signal.reason==="SIGINT"?"SIGINT":"SIGTERM";return r.cancel?.(p),p==="SIGINT"?130:143}let[u,...f]=l,m=d.kind==="use-binary"?d.binary:u;return d.message&&t.stderr.write(d.message+`
|
|
2485
|
-
`),await new Promise(p=>{if(r?.signal?.aborted){let A=r.signal.reason==="SIGINT"?"SIGINT":"SIGTERM";return r.cancel?.(A),p(A==="SIGINT"?130:143)}let _=r?.streams,h=_?[_.stdin,_.stdout,_.stderr].map(A=>A.fd):void 0,g=h?.every(A=>typeof A=="number"),E=
|
|
2486
|
-
`),p(x)})})}function
|
|
2485
|
+
`),await new Promise(p=>{if(r?.signal?.aborted){let A=r.signal.reason==="SIGINT"?"SIGINT":"SIGTERM";return r.cancel?.(A),p(A==="SIGINT"?130:143)}let _=r?.streams,h=_?[_.stdin,_.stdout,_.stderr].map(A=>A.fd):void 0,g=h?.every(A=>typeof A=="number"),E=c2(m,f,{stdio:_?g?h:["pipe","pipe","pipe"]:"inherit",cwd:i,env:c}),y=_?.stdin?.readableFlowing;_&&!g&&(_.stdin.pipe(E.stdin),E.stdout?.pipe(_.stdout,{end:!1}),E.stderr?.pipe(_.stderr,{end:!1}));let w=!1,T=A=>{if(!w){w=!0;try{r?.cancel?.(A)}catch{}{try{E.kill(A)}catch{}de(E,{stdinEnd:!1,softDelayMs:0,killDelayMs:100}).catch(()=>{})}}},S=()=>T(r?.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM");r&&(r.stop=T);let I=()=>{r?.signal?.removeEventListener("abort",S),_&&!g&&(_.stdin.unpipe(E.stdin),y||_.stdin.pause(),E.stdout?.unpipe(_.stdout),E.stderr?.unpipe(_.stderr))};r?.signal?.addEventListener("abort",S,{once:!0}),r?.signal?.aborted&&S(),E.stdin?.on("error",()=>{}),E.on("error",A=>{I(),p(D(t,`failed to launch ${m}: ${A.message}`))}),E.on("exit",(A,N)=>{I(),r&&(r.signalObserved=N);let x=A??(N?128+(l2.signals[N]??1):1),b=Pb(s);b&&x!==0&&x!==130&&x!==143&&!w&&!r?.signal?.aborted&&t.stderr.write(s+" exited with status "+x+". "+b+`
|
|
2486
|
+
`),p(x)})})}function p2(t,e,n){let r=V(n,"--team");if(r!==void 0){let i=e.findTeamByName(r);return i===null?D(t,`team not found: ${r}`):i}let s=aN(t,e,V(n,"--project"));return typeof s=="number"?s:lN(t,e,s,void 0)}async function h2(t,e,n,r){let s=cN(t,e,n,r);if(typeof s=="number")return s;let o=s.sessionid;if(o===null||o.trim().length===0)return D(t,`member ${s.alias} has no session yet \u2014 seed it first: lmctl seed <teamfile> (check with lmctl status <teamfile>)`);let i=new AbortController,a=()=>i.abort("SIGINT"),l=()=>i.abort("SIGTERM");process.once("SIGINT",a),process.once("SIGTERM",l);try{return await E_(t,{provider:of(s),sessionid:o,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}},void 0,{env:t.env??process.env,signal:i.signal})}finally{process.removeListener("SIGINT",a),process.removeListener("SIGTERM",l)}}function hN(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let n=t.messages.reduce((r,s)=>r+(s.content?.length??0),0);return{chars:n,est:Math.ceil(n/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let n=d2(e).size;return{chars:n,est:Math.ceil(n/4),messages:t?.messages?.length??null,bytes:n}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function _2(t,e,n,r,s){let o;if(r!==void 0){let a=e.findTeamMemberByAlias(n.id,r);if(a===null||a.state==="retired")return D(t,`member not found: ${r}`);o=[a]}else o=e.listTeamMembers(n.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=of(a),d=a.model??null,u=null;Uc(c)&&(u=await He(l,c));let f=hN(u),m=f.est>Ta;i.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:d,resume_incantation:m?Ub(c,l,d!==null?{model:d}:{}):null})}if(s)return Z(t,{estimate:!0,legend:mN,guide_tokens:Ta,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
2487
2487
|
`),t.stdout.write(`${mN}
|
|
2488
2488
|
`);for(let a of i){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
|
|
2489
2489
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -2491,7 +2491,7 @@ it is expected.
|
|
|
2491
2491
|
session yourself:
|
|
2492
2492
|
${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
|
|
2493
2493
|
(or: lmctl terminal --team ${n.name} --alias ${a.alias})
|
|
2494
|
-
`)}return 0}function
|
|
2494
|
+
`)}return 0}function g2(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias> [--json]
|
|
2495
2495
|
lmctl terminal <teamfile> <alias> [--json]
|
|
2496
2496
|
lmctl terminal --run <id> [--alias A]
|
|
2497
2497
|
lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
|
|
@@ -2524,25 +2524,25 @@ it is expected.
|
|
|
2524
2524
|
tokens it surfaces the resume incantation so YOU can
|
|
2525
2525
|
open & self-compact. Nothing is ever changed
|
|
2526
2526
|
automatically; ${Ta} is a guide, not a gate.
|
|
2527
|
-
`),0}var
|
|
2527
|
+
`),0}var u2,Ta,mN,w_=C(()=>{"use strict";ts();bt();pn();se();dN();ot();ze();Xt();Ml();Wt();$l();Fc();fN();re();Jr();u2={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Ta=2e5,mN="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function gN(t,e){let n=[],r=new Set;for(let[s,o]of t.split(/\r?\n/u).entries()){if(!o.trim())continue;let i=o.split(" ");if(i.length!==e||i.some(c=>!c.trim()))throw new Error(`invalid catalog entry on line ${s+1}: expected ${e} tab-separated fields`);let[a,l]=i;if(!/^[a-z0-9][a-z0-9_-]*$/u.test(a))throw new Error(`invalid catalog name on line ${s+1}: ${a}`);if(!/[.!?]$/u.test(l.trim()))throw new Error(`catalog description must be one sentence on line ${s+1}`);if(r.has(a))throw new Error(`duplicate catalog name on line ${s+1}: ${a}`);r.add(a),n.push(i.map(c=>c.trim()))}return n}function Dd(t){return gN(t,2).map(([e,n])=>({name:e,description:n}))}function T_(t){return gN(t,3).map(([e,n,r],s)=>{if(!/^https:\/\/lmctl\.com\/(?:[a-z0-9_-]+\/)*[a-z0-9._-]+\.lms$/u.test(r))throw new Error(`invalid autorun URL on line ${s+1}: ${r}`);return{name:e,description:n,url:r}})}var v_=C(()=>{"use strict"});var R_={};fe(R_,{QUICKRUN_DEPRECATION:()=>v2,listAutorunCatalog:()=>SN,listHelloCatalog:()=>N_,runAutorun:()=>No,runQuickrun:()=>k2});import{mkdtempSync as yN,rmSync as EN}from"node:fs";import{tmpdir as wN}from"node:os";import{existsSync as Sa,mkdirSync as y2,readFileSync as E2,statSync as w2,writeFileSync as Ao}from"node:fs";import{basename as TN,dirname as k_,join as Rr,resolve as va}from"node:path";async function SN(t=fetch){return`Available autorun examples:
|
|
2528
2528
|
${T_(await ba(vN,t)).map(n=>` ${n.name} ${n.description} ${n.url}`).join(`
|
|
2529
2529
|
`)}
|
|
2530
2530
|
`}async function N_(t=fetch){return`Available hello examples:
|
|
2531
|
-
${Dd(await ba(
|
|
2531
|
+
${Dd(await ba(T2,t)).map(n=>` ${n.name} ${n.description}`).join(`
|
|
2532
2532
|
`)}
|
|
2533
|
-
`}function
|
|
2533
|
+
`}function S2(t){let e=[],n=t.split(/\r?\n/);for(let s=0;s<n.length;s+=1){let o=n[s];if(!o.trim()||o.trimStart().startsWith("//")){let i=o.match(/^\s*\/\/ autorun-role: ([A-Za-z][A-Za-z0-9_-]*) provider=([^\s]+) model=(?:"([^"\r\n]+)"|([^\s]+))\s*$/);if(i)e.push({name:i[1],provider:i[2],model:i[3]??i[4],line:s});else if(o.includes("autorun-role:"))throw new Error(`invalid autorun role declaration on line ${s+1}`);continue}break}let r=new Set;for(let s of e){if(r.has(s.name))throw new Error(`duplicate autorun role ${s.name} in header`);if(r.add(s.name),!t.includes(`@role(${s.name}.provider)`)||!t.includes(`@role(${s.name}.model)`))throw new Error(`role ${s.name} must use @role(${s.name}.provider) and @role(${s.name}.model) in the script`)}return e}function b_(t,e,n){let r=t.split(/\r?\n/);for(let s of e){let o=n.get(s.name)??s,i=/\s/.test(o.model)?JSON.stringify(o.model):o.model;r[s.line]=`// autorun-role: ${s.name} provider=${o.provider} model=${i}`;let a=JSON.stringify(o.provider).slice(1,-1),l=JSON.stringify(o.model).slice(1,-1);t=r.join(`
|
|
2534
2534
|
`).replaceAll(`@role(${s.name}.provider)`,a).replaceAll(`@role(${s.name}.model)`,l),r.splice(0,r.length,...t.split(/\r?\n/))}return r.join(`
|
|
2535
|
-
`)}function I_(t,e){let n="autorun";try{let s=/^https?:\/\//i.test(e)?new URL(e).pathname:e,o=TN(s).replace(/\.lms$/i,"").replace(/[^A-Za-z0-9_-]/g,"_");o&&(n=o)}catch{}let r=Rr(t,`${n}.lms`);for(let s=2;Sa(r);s+=1)r=Rr(t,`${n}${s}.lms`);return r}async function ba(t,e){let n=await e(t,{cache:"no-store"});if(!n.ok)throw new Error(`HTTP ${n.status} fetching ${t}`);return n.text()}function
|
|
2535
|
+
`)}function I_(t,e){let n="autorun";try{let s=/^https?:\/\//i.test(e)?new URL(e).pathname:e,o=TN(s).replace(/\.lms$/i,"").replace(/[^A-Za-z0-9_-]/g,"_");o&&(n=o)}catch{}let r=Rr(t,`${n}.lms`);for(let s=2;Sa(r);s+=1)r=Rr(t,`${n}${s}.lms`);return r}async function ba(t,e){let n=await e(t,{cache:"no-store"});if(!n.ok)throw new Error(`HTTP ${n.status} fetching ${t}`);return n.text()}function b2(t){let e=TN(t),n=Rr(t,`${e}.lmctl`),r=2;for(;Sa(n);)n=Rr(t,`${e}${r}.lmctl`),r+=1;return n}async function I2(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(A_),0;let r=t.includes("--no-seed");if(Ht(e)&&!r&&!t.includes("--no-terminal"))return e.stderr.write(`error: quickrun opens a TUI; use --no-terminal in non-interactive mode
|
|
2536
2536
|
`),2;let s=t.includes("--no-terminal"),o=t.filter(h=>h!=="--no-seed"&&h!=="--no-terminal"&&h!=="--help"&&h!=="-h");if(o.length!==1)return e.stderr.write(`usage: lmctl quickrun <url-or-path>
|
|
2537
2537
|
`),2;let i=o[0],a=n.cwd??process.cwd(),l=n.fetchFn??fetch,c;try{c=ca(Mt(e.env??process.env,n.initConfigPath))}catch(h){return e.stderr.write(h instanceof Ve&&h.kind==="missing"?"error: no ~/.lmctl/init.toml found. Run `lmctl init` first, then try quickrun again.\n":"error: "+(h instanceof Error?h.message:String(h))+`
|
|
2538
2538
|
`),1}let d;try{d=await ko(i,l,a)}catch(h){return e.stderr.write(`error: could not fetch ${i}: ${h instanceof Error?h.message:String(h)}
|
|
2539
2539
|
`),1}let u;try{let h=sN(c.document).properties;for(let g of["Directory","NonInteractive"])if(Object.hasOwn(h,g))throw Error("Property '"+g+"' conflicts with an invocation fact in "+c.path+"; fix the file or run lmctl init");Object.assign(h,{Directory:a,NonInteractive:Ht(e)}),u=JI(d,c.config,{properties:h,path:c.path,argv:[]})}catch(h){return e.stderr.write("error: "+(h instanceof Error?h.message:String(h))+`
|
|
2540
|
-
`),1}let f=
|
|
2540
|
+
`),1}let f=b2(a);if(y2(k_(f),{recursive:!0}),Ao(f,u,"utf8"),e.stdout.write(`Wrote ${f}
|
|
2541
2541
|
`),await Ir([f],e)!==0)return e.stderr.write(`error: ${f} failed lint after substitution -- check the values in ~/.lmctl/init.toml.
|
|
2542
2542
|
`),1;if(r)return e.stdout.write(`Edit ${f} if needed, then run: lmctl seed ${f}
|
|
2543
2543
|
`),0;let p=await ma([f],e);return p!==0?p:s?0:(n.openTerminal??y_)([f,"Lead"],e)}async function No(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t[0]==="--help"||t[0]==="-h")return e.stdout.write(A_),0;let r=!1,s=new Map,o=0;for(;o<t.length&&t[o].startsWith("--");){let l=t[o++];if(l==="--save-only"){r=!0;continue}if(l==="--role-provider"||l==="--role-model"){let c=t[o++],d=c?.indexOf("=")??-1;if(!c||d<1||d===c.length-1)return e.stderr.write(`error: ${l} requires Role=value
|
|
2544
2544
|
`),2;let u=c.slice(0,d),f=s.get(u)??{provider:"",model:""};l==="--role-provider"?f.provider=c.slice(d+1):f.model=c.slice(d+1),s.set(u,f);continue}return e.stderr.write(`error: unknown autorun option: ${l}
|
|
2545
|
-
${A_}`),2}t=t.slice(o);let i=n.fetchFn??fetch,a=n.cwd??e.cwd??process.cwd();try{if(t.length===0)return e.stdout.write(await SN(i)),0;let l=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t[0]??""),c=t.find(x=>x!=="--no-seed"&&x!=="--no-terminal")??"",d=/^https?:\/\//i.test(c)?new URL(c).pathname:c;if(/\.(lmctl|lmc)$/i.test(d)||!l&&Sa(va(a,c))&&
|
|
2545
|
+
${A_}`),2}t=t.slice(o);let i=n.fetchFn??fetch,a=n.cwd??e.cwd??process.cwd();try{if(t.length===0)return e.stdout.write(await SN(i)),0;let l=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t[0]??""),c=t.find(x=>x!=="--no-seed"&&x!=="--no-terminal")??"",d=/^https?:\/\//i.test(c)?new URL(c).pathname:c;if(/\.(lmctl|lmc)$/i.test(d)||!l&&Sa(va(a,c))&&w2(va(a,c)).isDirectory())return I2(t,e,{...n,cwd:a});let[u,...f]=t;if(!u||u.startsWith("-"))throw new Error(`unknown quickrun option: ${u}`);let m,p,_=async x=>{let v=T_(await ba(vN,i)).find(k=>k.name===x);if(!v)throw new Error(`unknown autorun example: ${x}; run lmctl autorun to list available examples`);return v.url};if(l)m=await _(u);else if(/^https?:\/\//i.test(u))m=u;else if(Sa(va(a,u))||u.includes("/")||u.includes("\\"))p=va(a,u);else if(/^[a-zA-Z0-9][a-zA-Z0-9_-]*\.lms$/.test(u))m=await _(u.slice(0,-4));else throw new Error("Expected a sample name, script URL, or local .lms file.");let h=m?await ba(m,i):E2(p,"utf8"),g=S2(h),E=new Map;for(let x of g)E.set(x.name,{provider:x.provider,model:x.model});for(let[x,b]of s){if(!g.some(L=>L.name===x))throw new Error(`no autorun role named ${x}`);let v=E.get(x),k=b.provider||v.provider,R=b.model||(k===v.provider?v.model:(await(n.listModels??hn)(k))[0]);if(!R)throw new Error(`no default model is available for ${k}; specify --role-model ${x}=MODEL`);E.set(x,{provider:k,model:R})}let y=(n.detectProviders??id)(),w=g.filter(x=>!y.includes(E.get(x.name).provider)),T=new Map,S=y;for(let x of w){let b=S.find(k=>k!==E.get(x.name).provider);if(!b)continue;let v=await(n.listModels??hn)(b);v.length&&T.set(x.name,{provider:b,model:v[0]})}if(T.size){e.stdout.write(`Suggested provider/model substitutions:
|
|
2546
2546
|
`);for(let b of g){let v=T.get(b.name);if(v){let k=E.get(b.name);e.stdout.write(` ${b.name}: ${k.provider}/${k.model} -> ${v.provider}/${v.model}
|
|
2547
2547
|
`)}}let x="save";if(!r&&!Ht(e)){let b=new Bn(e,n.ask);try{if(x=(await b.ask("Choose accept, edit, or save [accept/edit/save]: ")).toLowerCase(),x==="edit")for(let v of g){if(!T.has(v.name))continue;let k=S.filter(M=>M!==E.get(v.name).provider),R=await b.ask(`Provider for ${v.name} (${k.join(", ")}): `);if(!k.includes(R))throw new Error(`provider must be one of: ${k.join(", ")}`);let L=await(n.listModels??hn)(R);if(!L.length)throw new Error(`no models are available for ${R}`);let O=await b.ask(`Model for ${v.name} (${L.join(", ")}): `);if(!L.includes(O))throw new Error(`model must be one of: ${L.join(", ")}`);T.set(v.name,{provider:R,model:O})}else if(x!=="accept"&&x!=="save")throw new Error("choose accept, edit, or save")}finally{b.close()}}for(let[b,v]of T)E.set(b,v);if(r||Ht(e)||x==="save"){let b=I_(a,u);return Ao(b,b_(h,g,E),{flag:"wx",encoding:"utf8"}),e.stdout.write(`Saved mapped script: ${b}
|
|
2548
2548
|
Edit it, then run: lmscript ${b}
|
|
@@ -2552,10 +2552,10 @@ Edit it, then run: lmscript ${x}
|
|
|
2552
2552
|
Edit it, then run: lmscript ${x}
|
|
2553
2553
|
`),0}e.stderr.write(`Running ${m??p}
|
|
2554
2554
|
`);let I=n.launch??ga,A={...e,cwd:a,...n.initConfigPath?{env:{...e.env,LMCTL_HOME:k_(n.initConfigPath)}}:{}};if(!g.length&&!r){if(p)return I([p,...f],A);let x=yN(Rr(wN(),"lmctl-quickrun-"));try{let b=Rr(x,"download.lms");return Ao(b,h,"utf8"),await I(["--base-dir",a,"--source-name",m,b,...f],A)}finally{EN(x,{recursive:!0,force:!0})}}let N=yN(Rr(wN(),"lmctl-autorun-"));try{let x=Rr(N,"autorun.lms");Ao(x,h,"utf8");let b=p?k_(p):a;return await I(["--base-dir",b,"--source-name",m??p,x,...f],A)}finally{EN(N,{recursive:!0,force:!0})}}catch(l){return e.stderr.write(`error: ${l instanceof Error?l.message:String(l)}
|
|
2555
|
-
`),1}}async function
|
|
2555
|
+
`),1}}async function k2(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.length===0)try{let i=await ba(`${S_}/index.txt`,n.fetchFn??fetch);return e.stdout.write(i.endsWith(`
|
|
2556
2556
|
`)?i:`${i}
|
|
2557
2557
|
`),0}catch(i){return e.stderr.write(`error: ${i instanceof Error?i.message:String(i)}
|
|
2558
|
-
`),1}if(/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t[0]??""))return No([`${S_}/${t[0]}.lms`,...t.slice(1)],e,n);let s=/^[a-zA-Z0-9][a-zA-Z0-9_-]*\.lms$/i.test(t[0]??""),o=n.cwd??e.cwd??process.cwd();return s&&!Sa(va(o,t[0]))?No([`${S_}/${t[0]}`,...t.slice(1)],e,n):No(t,e,n)}var vN,
|
|
2558
|
+
`),1}if(/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t[0]??""))return No([`${S_}/${t[0]}.lms`,...t.slice(1)],e,n);let s=/^[a-zA-Z0-9][a-zA-Z0-9_-]*\.lms$/i.test(t[0]??""),o=n.cwd??e.cwd??process.cwd();return s&&!Sa(va(o,t[0]))?No([`${S_}/${t[0]}`,...t.slice(1)],e,n):No(t,e,n)}var vN,T2,S_,A_,v2,Md=C(()=>{"use strict";oN();Hh();se();ps();kd();Gn();w_();Xc();ps();sa();v_();vN="https://lmctl.com/autorun/index.txt",T2="https://lmctl.com/helloexample/index.txt",S_="https://lmctl.com/quickrun",A_=`usage: lmctl autorun [--save-only] [example|url|file.lms] [script arguments...]
|
|
2559
2559
|
|
|
2560
2560
|
With no sample, list the curated hosted scripts from lmctl.com/autorun/index.txt.
|
|
2561
2561
|
Example: lmctl autorun lmdraw_solo
|
|
@@ -2575,8 +2575,8 @@ Scripts may declare providers with leading comments:
|
|
|
2575
2575
|
Use @role(Lead.provider) and @role(Lead.model) in the script. Missing providers
|
|
2576
2576
|
produce a suggested installed-provider/model mapping. --save-only saves that
|
|
2577
2577
|
mapping to a numbered .lms file without running it.
|
|
2578
|
-
`,
|
|
2579
|
-
`});var kN={};fe(kN,{runHello:()=>
|
|
2578
|
+
`,v2=`quickrun is deprecated; use lmctl autorun for curated examples.
|
|
2579
|
+
`});var kN={};fe(kN,{runHello:()=>A2});async function A2(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(IN),0;if(t.length>1||t.some(s=>s.startsWith("-")))return e.stderr.write(`${IN}`),2;let r=n.fetchFn??fetch;try{if(t.length===0)return e.stdout.write(await N_(r)),0;let o=Dd(await r(bN,{cache:"no-store"}).then(async i=>{if(!i.ok)throw new Error(`HTTP ${i.status} fetching ${bN}`);return i.text()})).find(i=>i.name===t[0]);return o?No([`https://lmctl.com/helloexample/${o.name}.lms`],e,n):(e.stderr.write(`error: unknown hello example: ${t[0]}; run lmctl hello to list available names
|
|
2580
2580
|
`),2)}catch(s){return e.stderr.write(`error: ${s instanceof Error?s.message:String(s)}
|
|
2581
2581
|
`),1}}var bN,IN,AN=C(()=>{"use strict";Md();v_();bN="https://lmctl.com/helloexample/index.txt",IN=`usage: lmctl hello [name]
|
|
2582
2582
|
|
|
@@ -2586,8 +2586,8 @@ The provider must be installed and configured. Run lmctl autorun for scripts
|
|
|
2586
2586
|
that need multiple roles or more than one prompt.
|
|
2587
2587
|
|
|
2588
2588
|
-h, --help Display help
|
|
2589
|
-
`});function $d(t,e,n){let r=new Map;return s=>{let o=dl(s);if(o!=="dead")return o;let i=Date.parse(s.started_at),a=Date.parse(s.last_heartbeat_at??"");if(a>i&&a<=e&&e-a<
|
|
2590
|
-
`)}catch{}}async function
|
|
2589
|
+
`});function $d(t,e,n){let r=new Map;return s=>{let o=dl(s);if(o!=="dead")return o;let i=Date.parse(s.started_at),a=Date.parse(s.last_heartbeat_at??"");if(a>i&&a<=e&&e-a<N2)return"unknown";if(s.target_teamfile===null||s.target_alias===null)return o;let l=`${s.target_teamfile}:${s.target_alias}`;if(!r.has(l)){let d=t.query("SELECT MAX(started_at) AS latest FROM tracked_invocation WHERE from_identity = ? AND origin = 'agent' AND started_at >= ? AND started_at <= ?",l,new Date(e-n).toISOString(),new Date(e).toISOString());r.set(l,Date.parse(d[0]?.latest??""))}let c=Number.isFinite(a)&&a<=e?Math.max(i,a):i;return r.get(l)>c?"unknown":o}}var N2,x_=C(()=>{"use strict";Wt();N2=9e4});function L_(t){for(let e=t.length-1;e>=0;e-=1){let n=t[e],r=R2.exec(n.content);if(r===null){if(n.role==="assistant"&&n.content.trim().length>0)return null;continue}let s=Number.parseInt(r[1],10),o=r[2]===void 0?0:Number.parseInt(r[2],10),i=r[3].toLowerCase(),a=r[4]?.trim()??null,l=`${r[1]}${r[2]!==void 0?`:${r[2]}`:""}${i}`;return{state:"LIMITED",resets_at:a===null?null:x2(n.timestamp,s,o,i,a),reset_time:l,timezone:a,detected_at:n.timestamp.toISOString()}}return null}function x2(t,e,n,r,s){if(!Number.isFinite(t.getTime())||e<1||e>12||n<0||n>59)return null;let o=L2(e,r);try{let i=C2(t,s),a=NN(i.year,i.month,i.day,o,n,s);if(a.getTime()<=t.getTime()){let l=$2(i,1);a=NN(l.year,l.month,l.day,o,n,s)}return a.toISOString()}catch{return null}}function L2(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function C2(t,e){let n=RN(e,!1).formatToParts(t);return{year:Vn(n,"year"),month:Vn(n,"month"),day:Vn(n,"day")}}function NN(t,e,n,r,s,o){let i=Date.UTC(t,e-1,n,r,s,0,0);for(let a=0;a<3;a+=1){let l=O2(new Date(i),o);i=Date.UTC(t,e-1,n,r,s,0,0)-l}return new Date(i)}function O2(t,e){let n=RN(e,!0).formatToParts(t);return Date.UTC(Vn(n,"year"),Vn(n,"month")-1,Vn(n,"day"),Vn(n,"hour"),Vn(n,"minute"),Vn(n,"second"),0)-t.getTime()}function RN(t,e){let n=e?M2:D2,r=n.get(t);if(r!==void 0)return r;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return n.set(t,s),s}function Vn(t,e){let n=t.find(r=>r.type===e)?.value;if(n===void 0)throw new Error(`missing ${e}`);return Number.parseInt(n,10)}function $2(t,e){let n=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate()}}var R2,D2,M2,xN=C(()=>{"use strict";R2=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;D2=new Map,M2=new Map});var BN={};fe(BN,{appendIntent:()=>O_,formatAge:()=>Ia,formatDuration:()=>Fd,resolveIntentLogPath:()=>MN,runStatus:()=>V2,shortIdentity:()=>wn});import{appendFileSync as P2,existsSync as U2,mkdirSync as F2}from"node:fs";import{homedir as j2}from"node:os";import{basename as W2,dirname as DN,isAbsolute as H2,join as B2,resolve as X2}from"node:path";function MN(){return process.env.LMCTL_INTENT_LOG??B2(j2(),".lmctl","recent-intents.log")}function O_(t){try{let e=MN();F2(DN(e),{recursive:!0});let n=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});P2(e,`${n}
|
|
2590
|
+
`)}catch{}}async function V2(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(q2),0;let n=t.find(a=>a==="--project"||a.startsWith("--project=")||a==="--web");if(n!==void 0)return D(e,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=le(t,["--since"],["--json","--details"]);if(r.error!==void 0)return D(e,r.error);let s=Y(r,"--json"),o=Y(r,"--details");if(r.positionals.length>0){let a=await K2(e,r.positionals,{json:s,details:o,since:V(r,"--since")});return a===0&&O_({verb:"status",args:t}),a}if(o)return D(e,"--details only applies with a teamfile argument (lmctl status <teamfile> --details)");let i=hq(V(r,"--since"));if("error"in i)return D(e,i.error);try{let a=e.env??process.env;if(s){let l=await W(e,c=>CN(c,a,i.iso));Z(e,{schema_version:F_,...l})}else{let l=await W(e,async c=>aq(await CN(c,a,i.iso),{sinceIso:i.iso}));e.stdout.write(l)}return O_({verb:"status",args:t}),0}catch(a){return D(e,a instanceof Error?a.message:String(a))}}async function K2(t,e,n){if(e.length>2)return D(t,`too many positionals (${e.length}); expected <teamfile> [alias]`);if(n.since!==void 0)return D(t,"--since only applies to the activity view (lmctl status with no teamfile argument)");let r=an(J2,{target:e[0],alias:e[1],flags:{}});if(r.mode==="error")return D(t,r.message);if(r.mode!=="ai-team")return D(t,"lmctl status: expected <teamfile> [alias]");try{return r.alias===void 0?await _q(t,r.teamfile,n.json,n.details):await vq(t,r.teamfile,r.alias,n.json)}catch(s){return s instanceof ge?D(t,s.message):D(t,`status: ${s instanceof Error?s.message:String(s)}`)}}async function CN(t,e,n){let r=Date.now(),s=$d(t,r,Math.max(0,r-Date.parse(n))),o=Gp(e,t);if(!o.ok){if(o.reason==="not-found")throw new Error(is("status",e,t));return await z2(t,s)}return await Y2(t,o.identity,e,s)}async function Y2(t,e,n,r){let s=as(e),o=t.getRootTeam(s.teamfile);if(o===null)throw new Error(is("status",n,t));let i=sn(o.teamfile_path,t),a=M_(Ud(t,{from:s.value}),r),l=M_(Ud(t,{target_teamfile:s.teamfile,target_alias:s.alias}),r),c=tq([...D_(t,r,{from:s.value}),...D_(t,r,{target_teamfile:s.teamfile,target_alias:s.alias})]);return{scope:"self",identity:s.value,...$N(),team:{name:i.name,teamfile:o.teamfile_path},members:i.members.map(d=>Z2(t,o.teamfile_path,d)),activity:{from_me:a.map(d=>$_(d,r)),to_me:l.map(d=>$_(d,r))},transcript_harvest:await PN(c)}}function $N(){let t=null;try{t=LT(Hl())}catch{}return{db_path:Ke(),site_name:t}}async function z2(t,e){let n=t.listRootTeams();return{scope:"db",identity:null,...$N(),teams:n.map(r=>Q2(t,r)),activity:M_(Ud(t),e).map(r=>$_(r,e)),transcript_harvest:await PN(D_(t,e))}}function Q2(t,e){if(!U2(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let n=0;try{n=sn(e.teamfile_path,t).members.length}catch{n=0}return{name:e.name,teamfile:e.teamfile_path,member_count:n,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function Z2(t,e,n){let r=n.teamfile===void 0?null:Re(H2(n.teamfile)?n.teamfile:X2(DN(e),n.teamfile),t),s=tn(t,e,n.alias),o=s.busy&&s.reason==="in-flight"?eq(t,e,n.alias,s.inFlight):null;return{alias:n.alias,provider:n.provider,model:n.model??null,teamfile:e,referenced_teamfile:r,sessionid:n.session??null,sessiondir:n.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:o,reclaimable:!s.busy&&s.reclaimable!==void 0?s.reclaimable:null}}function eq(t,e,n,r){let s=r.sender_alias==="operator"?"operator":`${r.sender_teamfile}:${r.sender_alias}`,i=t.db.prepare(`
|
|
2591
2591
|
SELECT * FROM tracked_invocation
|
|
2592
2592
|
WHERE kind = 'chat'
|
|
2593
2593
|
AND status = 'running'
|
|
@@ -2597,27 +2597,27 @@ that need multiple roles or more than one prompt.
|
|
|
2597
2597
|
AND holder_pid IS ?
|
|
2598
2598
|
ORDER BY started_at DESC, id DESC
|
|
2599
2599
|
LIMIT 5
|
|
2600
|
-
`).all(e,n,s,r.holder_pid).find(a=>a.request_payload!==null);return i?.request_payload===void 0||i.request_payload===null?null:{tracked_invocation_id:i.id,from_identity:i.from_identity,started_at:i.started_at,request_payload:i.request_payload,request_preview:
|
|
2600
|
+
`).all(e,n,s,r.holder_pid).find(a=>a.request_payload!==null);return i?.request_payload===void 0||i.request_payload===null?null:{tracked_invocation_id:i.id,from_identity:i.from_identity,started_at:i.started_at,request_payload:i.request_payload,request_preview:pq(i.request_payload)}}function Ud(t,e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.target_teamfile!==void 0&&(n.push("target_teamfile = ?"),r.push(e.target_teamfile)),e.target_alias!==void 0&&(n.push("target_alias = ?"),r.push(e.target_alias));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`;return t.db.prepare(`
|
|
2601
2601
|
SELECT * FROM tracked_invocation
|
|
2602
2602
|
${s}
|
|
2603
2603
|
ORDER BY started_at DESC, id DESC
|
|
2604
|
-
`).all(...r)}function D_(t,e,n={}){return Ud(t,n).filter(s=>s.kind==="chat"&&s.status==="running"&&e(s)==="dead")}function
|
|
2604
|
+
`).all(...r)}function D_(t,e,n={}){return Ud(t,n).filter(s=>s.kind==="chat"&&s.status==="running"&&e(s)==="dead")}function tq(t){let e=new Set,n=[];for(let r of t)e.has(r.id)||(e.add(r.id),n.push(r));return n.sort((r,s)=>{let o=Date.parse(s.started_at)-Date.parse(r.started_at);return Number.isFinite(o)&&o!==0?o:s.id-r.id})}function M_(t,e){return t.filter(n=>e(n)!=="dead")}async function PN(t){let e=[];for(let n of t)e.push(await nq(n));return e}async function nq(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,n={tracked_invocation_id:t.id,from_identity:t.from_identity,target:e??"(unknown)",started_at:t.started_at,tail_hint:e===null?"":`lmctl tail "${t.target_teamfile}" ${t.target_alias}`};if(e===null)return ys(n,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return ys(n,"missing-request-payload",null,null);let r=rq(t.meta);if(r.provider===null||r.sessionid===null)return ys(n,"missing-session-metadata",r.provider,r.sessionid);if(!Qr(r.provider))return ys(n,"unsupported-provider",r.provider,r.sessionid);let s;try{s=await He(r.sessionid,r.provider)}catch{return ys(n,"read-error",r.provider,r.sessionid)}if(s===null)return ys(n,"session-not-found",r.provider,r.sessionid);let o=sq(t.request_payload,s.messages);return o.state!=="completed"?ys(n,o.reason,r.provider,r.sessionid):{...n,state:"completed",reason:null,provider:r.provider,session_id:r.sessionid,result_payload:o.result,result_preview:HN(o.result),assistant_timestamp:o.assistantTimestamp,matched_user_index:o.userIndex}}function ys(t,e,n,r){return{...t,state:"unreconciled",reason:e,provider:n,session_id:r,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function rq(t){if(t===null||t.trim()==="")return{provider:null,sessionid:null};try{let e=JSON.parse(t);return{provider:typeof e.provider=="string"&&e.provider.length>0?e.provider:null,sessionid:typeof e.sessionid=="string"&&e.sessionid.length>0?e.sessionid:null}}catch{return{provider:null,sessionid:null}}}function sq(t,e){let n=e.map((o,i)=>({message:o,index:i})).filter(({message:o})=>o.role==="user"&&o.content===t);if(n.length===0)return{state:"unreconciled",reason:"request-not-found"};if(n.length>1)return{state:"unreconciled",reason:"duplicate-request"};let r=n[0].index,s=[];for(let o of e.slice(r+1)){if(o.role==="user")break;o.role==="assistant"&&o.content.trim().length>0&&s.push(o)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:r,result:s.map(o=>o.content).join(`
|
|
2605
2605
|
|
|
2606
|
-
`),assistantTimestamp:
|
|
2607
|
-
`)}function
|
|
2608
|
-
`)}function UN(t){return di(t.db_path)}function P_(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,Pd))
|
|
2609
|
-
`)}u.detailLoaded=m!==null,u.messageCount=m?.messageCount??null,u.observedModel=m?.model??"(unknown)",u.lastContext=m?.lastInputTokens??null,u.totalInputTokens=m?.totalInputTokens??null,u.totalOutputTokens=m?.totalOutputTokens??null,m?.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=m.totalCachedInputTokens),u.sessionLimit=m===null?null:L_(m.messages),i!==null&&(u.activitySinceLastCommit={messageCount:m===null?null:Kh(m,i.since),tokens:null},u.cumulativeTokens=m===null?null:Yh(m)??"n/a"),m?.messageCount===void 0?c=void 0:c!==void 0&&(c+=m.messageCount)}l.push(u)}return n?(Z(t,{schema_version:F_,scope:"team",team:s.teamName,teamfile:s.teamfile,details:r,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(d=>({ref:d.ref,timestamp:d.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(d=>{let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,seeded:d.sessionid!==null,model:d.declaredModel,liveness:d.liveness};return d.configWarnings!==void 0&&(u.config_warnings=d.configWarnings),d.probed&&(u.messageCount=d.messageCount??null,u.observed_model=d.observedModel,u.lastContext=d.lastContext??null,u.totalInputTokens=d.totalInputTokens??null,u.totalOutputTokens=d.totalOutputTokens??null,d.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=d.totalCachedInputTokens),u.sessionLimit=d.sessionLimit??null,d.activitySinceLastCommit!==void 0&&(u.activitySinceLastCommit=d.activitySinceLastCommit),d.cumulativeTokens!==void 0&&(u.cumulativeTokens=d.cumulativeTokens==="n/a"?null:d.cumulativeTokens)),u}),...r?{total:{messageCount:c??null}}:{}}),0):(t.stdout.write(
|
|
2606
|
+
`),assistantTimestamp:oq(s[s.length-1]?.timestamp)}}function oq(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function iq(t){if(!(t===null||t.trim()===""))try{let e=JSON.parse(t);if(!Array.isArray(e))return;let n=e.filter(r=>typeof r=="string"&&r.length>0);return n.length>0?n:void 0}catch{return}}function $_(t,e){let n=iq(t.config_warnings),r={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:e(t),from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:ON(t.result_summary),error:ON(t.error),...n!==void 0?{config_warnings:n}:{}};return t.error!==null&&jN.set(r,t.error),r}function aq(t,e){return t.scope==="self"?cq(t,e):dq(t,e)}function lq(t){if(t===null)return"idle";let e=t.holder_pid!==null?`pid ${t.holder_pid}${t.holder_host!==null?` on ${t.holder_host}`:""}`:"holder",n=t.reason==="dead-pid"?"appears dead -- the provider process ended before the turn completed":"stale";return`idle (reclaimable lock: ${e} ${n})`}function cq(t,e){let n=[];n.push(`identity: ${t.identity}`),n.push(`team: ${t.team.name}`),n.push(`teamfile: ${t.team.teamfile}`),n.push(""),n.push("members:"),t.members.length===0&&n.push(" none");for(let r of t.members){let s=r.model===null?"":` model=${r.model}`,o=r.sessionid===null?"":` session=${r.sessionid}`,i=r.state==="idle"?lq(r.reclaimable):`busy (${r.reason})`,a=r.handling===null?"":` handling="${r.handling.request_preview}"`;n.push(` ${r.alias}: ${i} provider=${r.provider}${s}${o}${a}`)}return n.push(""),n.push("transcript harvest:"),FN(n,t.transcript_harvest,"self"),n.push(""),n.push("activity from me:"),P_(n,U_(t.activity.from_me,e.sinceIso),"from-me"),n.push(""),n.push("activity to me:"),P_(n,U_(t.activity.to_me,e.sinceIso),"to-me"),n.push(""),n.push(UN(t)),n.join(`
|
|
2607
|
+
`)}function dq(t,e){let n=[];n.push("scope: db"),n.push("identity: none"),n.push(""),n.push("teams:"),t.teams.length===0&&n.push(" none");for(let r of t.teams){let s=r.name===null?"(unnamed)":r.name;n.push(` ${s}: ${r.teamfile} (${r.member_count} members)`)}return n.push(""),n.push("transcript harvest:"),FN(n,t.transcript_harvest,"db"),n.push(""),n.push("recent activity:"),P_(n,U_(t.activity,e.sinceIso),"db"),n.push(""),n.push(UN(t)),n.join(`
|
|
2608
|
+
`)}function UN(t){return di(t.db_path)}function P_(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,Pd))uq(t,r,n);WN(t,e.length,Pd,"older")}function FN(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,Pd)){let s=n==="db"?` from ${wn(r.from_identity)} -> ${wn(r.target)}`:` -> ${wn(r.target)}`;if(r.state==="completed"){let o=r.result_preview===null?"":` "${r.result_preview}"`;t.push(` #${r.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${r.started_at}${o}`)}else t.push(` #${r.tracked_invocation_id} unreconciled${s} since ${r.started_at} (${r.reason??"unknown"})`);r.tail_hint.length>0&&t.push(` inspect: ${r.tail_hint}`)}WN(t,e.length,Pd,"more transcript harvest rows")}function U_(t,e){let n=Date.parse(e);return Number.isFinite(n)?t.filter(r=>{let s=Date.parse(r.ended_at??r.started_at);return Number.isFinite(s)&&s>=n}):t}function uq(t,e,n){let r=mq(e,n),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,o=e.error??e.result,i=El(jN.get(e)??"",C_),a=o===null?"":` "${i??HN(o)}"`;if(t.push(` #${e.id} ${fq(e)} ${e.kind}${r} ${s}${a}`),e.config_warnings!==void 0)for(let l of e.config_warnings)t.push(` config not applied: ${l}`)}function fq(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.status.toUpperCase()}function mq(t,e){if(e==="from-me")return t.target===null?"":` -> ${wn(t.target)}`;if(e==="to-me")return` from ${wn(t.from_identity)}`;let n=t.target===null?"":` -> ${wn(t.target)}`;return` from ${wn(t.from_identity)}${n}`}function WN(t,e,n,r){let s=e-n;s>0&&t.push(` (+${s} ${r} -- use --json)`)}function ON(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function HN(t){let e=Ow(t).replace(/\s+/g," ").trim();return e.length<=C_?e:`${e.slice(0,C_-3)}...`}function pq(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=LN?e:`${e.slice(0,LN-3)}...`}function Fd(t){return(0,ct.formatDuration)(t)}function Ia(t){return(0,ct.formatRelativeTime)(t)}function wn(t){if(t==="operator")return t;try{let e=as(t);return`${W2(e.teamfile)}:${e.alias}`}catch{return t}}function hq(t){if(t===void 0)return{iso:new Date(Date.now()-G2).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let r=Number(e[1]),s=e[2],o=s==="s"?r:s==="m"?r*60:s==="h"?r*3600:r*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}async function _q(t,e,n,r){let s=await W(t,d=>{let u=Re(e,d),f=sn(u,d);if(f.parseErrors.length>0)throw new Error(f.parseErrors.join("; "));return{teamfile:u,teamName:f.name,targets:ya(u,d,new Set,[])}}),o=Jh(s.teamfile),i=o.kind==="repo"?o:null,a=await Ea(t,s.targets),l=[],c=0;for(let d of s.targets){let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,declaredModel:d.model,liveness:a.get(bo(d.teamfile,d.alias))??Ed(),probed:!1,detailLoaded:!1},f=await Gh(t,{teamfile:d.teamfile,alias:d.alias});if(f!==void 0&&(u.configWarnings=f),r&&d.sessionid!==null){u.probed=!0;let m=null;try{m=await He(d.sessionid,d.provider)}catch(p){t.stderr.write(`warning: failed to load session "${d.sessionid}" for ${d.reportPath} (${d.provider}): ${p instanceof Error?p.message:String(p)}
|
|
2609
|
+
`)}u.detailLoaded=m!==null,u.messageCount=m?.messageCount??null,u.observedModel=m?.model??"(unknown)",u.lastContext=m?.lastInputTokens??null,u.totalInputTokens=m?.totalInputTokens??null,u.totalOutputTokens=m?.totalOutputTokens??null,m?.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=m.totalCachedInputTokens),u.sessionLimit=m===null?null:L_(m.messages),i!==null&&(u.activitySinceLastCommit={messageCount:m===null?null:Kh(m,i.since),tokens:null},u.cumulativeTokens=m===null?null:Yh(m)??"n/a"),m?.messageCount===void 0?c=void 0:c!==void 0&&(c+=m.messageCount)}l.push(u)}return n?(Z(t,{schema_version:F_,scope:"team",team:s.teamName,teamfile:s.teamfile,details:r,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(d=>({ref:d.ref,timestamp:d.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(d=>{let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,seeded:d.sessionid!==null,model:d.declaredModel,liveness:d.liveness};return d.configWarnings!==void 0&&(u.config_warnings=d.configWarnings),d.probed&&(u.messageCount=d.messageCount??null,u.observed_model=d.observedModel,u.lastContext=d.lastContext??null,u.totalInputTokens=d.totalInputTokens??null,u.totalOutputTokens=d.totalOutputTokens??null,d.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=d.totalCachedInputTokens),u.sessionLimit=d.sessionLimit??null,d.activitySinceLastCommit!==void 0&&(u.activitySinceLastCommit=d.activitySinceLastCommit),d.cumulativeTokens!==void 0&&(u.cumulativeTokens=d.cumulativeTokens==="n/a"?null:d.cumulativeTokens)),u}),...r?{total:{messageCount:c??null}}:{}}),0):(t.stdout.write(Eq(s.teamName,s.teamfile,o,l,r,c)),0)}function gq(t){return t.sessionid??"(not seeded)"}function yq(t){return t.sessionid===null?"not seeded":wd(t.liveness)}function Eq(t,e,n,r,s,o){let i=[],a=n.kind==="repo"?n:null;if(i.push(`TEAM: ${t}`),i.push(`teamfile: ${e}`),n.kind==="repo"){i.push("Git progress:");for(let _ of n.commits)i.push(` ${_.ref}: ${_.timestamp.toISOString()}`);i.push(` Uncommitted: ${$t(n.working.uncommittedTracked)} changed (tracked), ${$t(n.working.untracked)} untracked`)}else n.reason==="no-commits"?i.push(`Git progress: git repository in ${n.teamDir} has no commits (no commit-based progress to report)`):i.push(`Git progress: no git repository in ${n.teamDir} (no commit-based progress to report)`);if(!s){i.push("members:"),r.length===0&&i.push(" none");for(let _ of r){let h=_.declaredModel===null?"":` model=${_.declaredModel}`;if(_.sessionid===null?i.push(` ${_.reportPath}: not seeded provider=${_.provider}${h} (run: lmctl seed "${_.teamfile}")`):i.push(` ${_.reportPath}: ${wd(_.liveness)} provider=${_.provider}${h} session=${_.sessionid}`),_.configWarnings!==void 0)for(let g of _.configWarnings)i.push(` config not applied: ${g}`)}return i.push(""),i.push("session detail (observed model, messages, tokens, limits) not probed -- use --details"),`${i.join(`
|
|
2610
2610
|
`)}
|
|
2611
|
-
`}let l=a!==null?["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT","MSGS SINCE COMMIT","TOKENS SINCE COMMIT","TOKENS (cumulative)"]:["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT"],c=l.map((_,h)=>h>=5?"right":"left"),d=!1,u=r.filter(_=>_.sessionLimit!=null),f=[];for(let _ of r){let h=xk(_.lastContext??void 0,_.detailLoaded,Nk);(h==="n/a"||_.cumulativeTokens==="n/a")&&(d=!0);let g=[(0,ct.escapeCell)(
|
|
2611
|
+
`}let l=a!==null?["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT","MSGS SINCE COMMIT","TOKENS SINCE COMMIT","TOKENS (cumulative)"]:["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT"],c=l.map((_,h)=>h>=5?"right":"left"),d=!1,u=r.filter(_=>_.sessionLimit!=null),f=[];for(let _ of r){let h=xk(_.lastContext??void 0,_.detailLoaded,Nk);(h==="n/a"||_.cumulativeTokens==="n/a")&&(d=!0);let g=[(0,ct.escapeCell)(gq(_)),(0,ct.escapeCell)(_.reportPath),(0,ct.escapeCell)(_.provider),(0,ct.escapeCell)(_.observedModel??"(unknown)"),yq(_),$t(_.messageCount),h];a!==null&&g.push($t(_.activitySinceLastCommit?.messageCount),$t(_.activitySinceLastCommit?.tokens),Rk(_.cumulativeTokens)),f.push(g)}let m=["TOTAL","","","","",$t(o)];a!==null&&m.push("",$t(wq(r)),$t(null),$t(Tq(r))),f.push(m);let p=(0,ct.formatTable)(f,{headers:l,align:c,margin:2}).split(`
|
|
2612
2612
|
`);if(i.push(p[0]),r.forEach((_,h)=>{if(i.push(p[h+1]),_.configWarnings!==void 0)for(let g of _.configWarnings)i.push(` config not applied: ${g}`)}),i.push(p[p.length-1]),d&&i.push("n/a = this provider does not expose a context/token total; absence is not a health signal."),i.push(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
|
|
2613
2613
|
Right after a compaction the last completed turn IS the summarisation request, which carried the
|
|
2614
2614
|
full pre-compaction prompt \u2014 so this reads the OLD large number while the live context is already
|
|
2615
2615
|
small. Re-read after the next turn before concluding a compaction failed or gating on the value.`),u.length>0){i.push("Session limits:");for(let _ of u)i.push(` ${_.reportPath}: LIMITED resets_at=${Vh(_.sessionLimit)}`)}return`${i.join(`
|
|
2616
2616
|
`)}
|
|
2617
|
-
`}function
|
|
2617
|
+
`}function wq(t){let e=0;for(let n of t){let r=n.activitySinceLastCommit?.messageCount;r==null?e=void 0:e!==void 0&&(e+=r)}return e}function Tq(t){let e=0;for(let n of t){let r=n.cumulativeTokens;r==null||r==="n/a"?e=void 0:e!==void 0&&(e+=r)}return e}async function vq(t,e,n,r){let s=await W(t,p=>Ge(e,n,p)),o;try{o=await He(s.sessionid,s.provider)}catch(p){return D(t,`status: failed to load session: ${p instanceof Error?p.message:String(p)}`)}if(o===null)return D(t,`status: session not found: ${s.sessionid} (provider=${s.provider})`);let i=L_(o.messages),l=(await Ea(t,[{teamfile:s.teamfile,alias:s.alias}])).get(bo(s.teamfile,s.alias))??Ed(),c=await Gh(t,{teamfile:s.teamfile,alias:s.alias}),d=Jh(s.teamfile),u=d.kind==="repo"?d:null,f={provider:o.provider,sessionid:o.sessionId,seeded:!0,alias:s.alias,teamfile:s.teamfile,reportPath:s.alias,cwd:o.cwd,messageCount:o.messageCount??null,model:s.model??null,observed_model:o.model??null,lastContext:o.lastInputTokens??null,liveness:l,totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,...c!==void 0?{config_warnings:c}:{},...u!==null?{activitySinceLastCommit:{messageCount:Kh(o,u.since),tokens:null},cumulativeTokens:Yh(o)}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};if(r)return Z(t,{schema_version:F_,scope:"member",...f}),0;let m=[];if(m.push(`Session: ${o.sessionId}`),m.push(` Provider: ${o.provider}`),m.push(` Alias: ${s.alias}`),m.push(` Liveness: ${wd(l)}`),m.push(` CWD: ${o.cwd}`),m.push(` Messages: ${$t(o.messageCount)}`),m.push(` Model (declared): ${s.model??"(none)"}`),m.push(` Model (observed): ${o.model??"(unknown)"}`),c!==void 0)for(let p of c)m.push(` Config NOT applied: ${p}`);if(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)m.push(" Tokens: n/a");else{let p=` Tokens: ${(0,ct.formatCount)(o.totalInputTokens)} in / ${(0,ct.formatCount)(o.totalOutputTokens)} out`;f.totalCachedInputTokens!==void 0&&(p+=` (cached: ${(0,ct.formatCount)(f.totalCachedInputTokens)})`),m.push(p)}return(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)&&m.push(" n/a = this provider does not expose a context/token total; absence is not a health signal."),m.push(` lastContext = prompt size of the LAST COMPLETED turn; it LAGS BY ONE TURN. Right after a
|
|
2618
2618
|
compaction it still reports the pre-compaction size (the summarisation request itself).`),i!==null&&m.push(` SessionLimit: LIMITED resets_at=${Vh(i)}`),m.push(` Created: ${f.createdAt}`),m.push(` Modified: ${f.modifiedAt}`),t.stdout.write(`${m.join(`
|
|
2619
2619
|
`)}
|
|
2620
|
-
`),0}var ct,
|
|
2620
|
+
`),0}var ct,q2,F_,Pd,G2,C_,LN,J2,jN,j_=C(()=>{"use strict";ct=Ft(Ct(),1);Wt();x_();It();se();Wc();On();Zi();on();ot();zh();Bl();pn();xN();yi();q2=`usage: lmctl status [--json] [--since <duration|ISO8601>]
|
|
2621
2621
|
lmctl status <teamfile> [--details] [--json]
|
|
2622
2622
|
lmctl status <teamfile> <alias> [--json]
|
|
2623
2623
|
|
|
@@ -2636,25 +2636,25 @@ With a teamfile and an alias: single-member deep view (session detail, token
|
|
|
2636
2636
|
breakdown, liveness with terminal-lock/in-flight holder info).
|
|
2637
2637
|
|
|
2638
2638
|
--json emits { schema_version: 2, scope: 'self'|'db'|'team'|'member', ... }.
|
|
2639
|
-
`,F_=2,Pd=5,q2=24*60*60*1e3,C_=72,LN=80;V2={name:"status",allowsBareTeamfile:!0,supportsRaw:!1};jN=new WeakMap});import{isAbsolute as vq,resolve as XN,join as qN}from"node:path";function VN(t){let e=GN.get(t);if(!e)throw Error("Unknown context");return e.dal()}function KN(t){return t!==null&&typeof t=="object"&&JN.has(t)}function YN(t){try{if(!t||typeof t!="object"||Array.isArray(t))return gt("invalid_argument","Context needs an explicit options map");let e={...t},n=["pid","env","cwd","dbPath","dal","onProgress","onWarning","clock","interactive"];if(Object.keys(e).some(_=>!n.includes(_)))return gt("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!vq(e.cwd))return gt("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...e.env});if(Object.values(r).some(_=>_!==void 0&&typeof _!="string"))return gt("invalid_argument","Environment values must be strings or undefined");for(let _ of["onProgress","onWarning","clock"])if(e[_]!==void 0&&typeof e[_]!="function")return gt("invalid_argument",_+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return gt("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return gt("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return gt("invalid_argument","pid must be a positive integer");let s=XN(e.cwd),o=r.LMCTL_HOME||(r.HOME?qN(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(o?qN(o,"state.db"):void 0)))return gt("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,c,d,u=new AbortController,f=new Set,m=_=>{if(l){try{l.close()}catch(h){_.push(br(h))}l=void 0}},p=Object.freeze({status:"ok",error:null,pid:e.pid,signal:u.signal,env:r,cwd:s,dbPath:XN(s,Ke(e.dbPath,r)),dal:e.dal,interactive:e.interactive??r.LMCTL_NON_INTERACTIVE!=="1",onProgress:e.onProgress??(()=>{}),onWarning:e.onWarning??(()=>{}),clock:e.clock??Date.now,get closed(){return a},close(){if(c)return c;let _;return c=new Promise(h=>{_=h}),a=!0,u.abort(),(async()=>{let h=[],g=0;for(let E of[...f])try{await E.close(),g++,f.delete(E)}catch(y){h.push(br(y))}h.length||m(h),_({released:g,errors:h})})(),c},finalizeSync(_){if(d)return d;a=!0;let h=[],g={released:0,errors:h};d=g,c??=Promise.resolve(g);let E=[];for(let y of[...f])try{let w=y.finalizeSync(_);w instanceof Promise?E.push(w.then(()=>{g.released++,f.delete(y)}).catch(T=>{h.push(br(T))})):(g.released++,f.delete(y))}catch(w){h.push(br(w))}return u.abort(_),E.length?c=Promise.all(E).then(()=>(h.length||m(h),g)):h.length||m(h),g}});return GN.set(p,{resources:f,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=Fe({path:p.dbPath})}}),JN.add(p),Sq.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(e){return gt("invalid_argument","Invalid context: "+br(e))}}var GN,Sq,JN,jd=C(()=>{"use strict";bt();On();Qc();GN=new WeakMap;Sq=new WeakMap,JN=new WeakSet});var Lr,n0,ioe,aoe,loe,coe,doe,oe,W_,Tn,Wd,xr,Hd,Xd,Ro,zN,QN,ZN,xo,Bd,bq,e0,t0,r0,H_=C(()=>{"use strict";Lr=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))Lr(e);Object.freeze(t)}return t},n0=Lr(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),ioe=Lr({status:"string",error:"string|null",code:"ErrorCode?"}),aoe=Lr(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),loe=Lr(["Provider1.Provider","Provider1.Model1","Provider2.Provider","Provider2.Model1","Provider3.Provider","Provider3.Model1"]),coe=Lr(["Provider1","Provider2","Provider3"]),doe=Lr({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),oe={name:"ctx",type:"context"},W_={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},Tn={name:"teamfile",type:"string"},Wd={name:"alias",type:"string"},xr={name:"prompt",type:"string"},Hd={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"}]},Xd=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],Ro={name:"options",type:"map",optional:!0,keys:Xd},zN={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},QN={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},ZN={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},xo={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},Bd={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"}]},bq=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"},{name:"reconcile",type:"boolean"}],e0={name:"options",type:"map",optional:!0,keys:bq},t0={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},r0=Lr([{name:"resolveProfilePath",implemented:!0,params:[oe,W_],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[oe,W_],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:[oe,{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:[oe,Tn],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[Tn]}},{name:"resolveMember",implemented:!0,params:[oe,Tn,Wd],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:[Tn,Wd]}},{name:"lintTeam",implemented:!0,params:[oe,Tn],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:[Tn]}},{name:"seedTeam",implemented:!0,params:[oe,Tn,zN],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:[Tn,zN]}},{name:"promptAgent",implemented:!0,params:[oe,Hd,xr,Ro],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...t0,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[Hd,xr,Ro]}},{name:"promptMember",implemented:!0,params:[oe,{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"},...Xd]}],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:[Tn,Wd,xr,{name:"options",type:"map",optional:!0,keys:[...Xd,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[oe,{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:[oe,xo,ZN],statuses:["deleted","not_found","busy","error"],results:{error:"string|null"},effects:["provider","file-write"],summary:"Delete a session only with explicit force admission.",scriptBinding:{name:"lm_session_delete",params:[Hd,{...ZN,optional:!0}]}},{name:"getSession",implemented:!0,params:[oe,xo],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:[xo]}},{name:"reserveSession",implemented:!0,params:[oe,xo],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:[oe,xo,{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:[oe,{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"},...Xd]}],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:[oe,{name:"batch",type:"BatchRef"},xr,{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:[oe,{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:[oe,QN],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:[QN]}},{name:"openTerminal",implemented:!0,params:[oe,{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:[Tn,Wd]}},{name:"sessionAdmission",implemented:!0,params:[oe,xo],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:[oe,{name:"reservation",type:"SessionReservation"},Hd,xr,Ro],statuses:["ok","busy","stalled","empty","error"],results:{...t0,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[oe,{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:[oe,{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:[oe,{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"}]},Ro],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:[oe,{name:"session",type:"NativeSessionRef"},xr],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:[oe,{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:[oe,{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:[oe,Bd,xr,Ro],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:[Bd,xr,Ro]}},{name:"nativeSessionClose",implemented:!0,params:[oe,Bd],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:[Bd]}},{name:"loadProperties",implemented:!0,params:[oe,W_],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:[oe,e0],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:[e0]}}])});function s0(t){if(!KN(t))return gt("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return gt("cancelled","Context is closed")}function o0(t){return r0.find(e=>e.name===t)?.params.find(e=>e.name==="options")?.keys?.map(e=>e.name)??[]}var i0=C(()=>{"use strict";H_();jd();Qc()});import{isAbsolute as Iq,resolve as kq}from"node:path";function Gd(t){return Number.isFinite(t)&&Math.abs(t)<=Aq}function Nq(t){if(t&&typeof t=="object"){let e=t.code;if(typeof e=="string"){if(n0.includes(e))return e;if(e==="SQLITE_BUSY"||e==="SQLITE_LOCKED")return"busy";if(e==="SQLITE_READONLY"||e.startsWith("SQLITE_READONLY")||e==="EACCES"||e==="EPERM"||e==="EISDIR")return"read";if(e==="ENOENT"||e==="SQLITE_CANTOPEN")return"missing";if(e==="ETIMEDOUT"||e==="ECANCELED"||e==="ABORT_ERR")return"cancelled"}let n=t.message;if(typeof n=="string"){if(n.includes("readonly database")||n.includes("SQLITE_READONLY"))return"read";if(n.includes("database is locked")||n.includes("SQLITE_BUSY"))return"busy"}}return"internal"}function q_(t,e=Date.now()){if(t===void 0)return{windowMs:a0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let o=Number(n[1]),i=n[2],l=(i==="s"?o:i==="m"?o*60:i==="h"?o*3600:o*86400)*1e3;return!Number.isFinite(l)||l<0||!Gd(e-l)?{error:`invalid --since duration: ${t} (cutoff out of representable date range)`}:{windowMs:l}}let r=Date.parse(t);if(!Number.isFinite(r)||!Gd(r))return{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`};let s=Math.max(0,e-r);return Gd(e-s)?{windowMs:s}:{error:`invalid --since value: ${t} (cutoff out of representable date range)`}}function qd(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function X_(t,e){let n=t.target_teamfile,r=t.target_alias;if(n===null||r===null)return B_;let s=e.get(n);if(s===void 0){try{s=ke(n)}catch{s=null}e.set(n,s)}return s===null?B_:Nl(s,r)?.model??B_}async function l0(t,e={}){let n=s0(t);if(n)return{status:"error",error:n.error,code:n.code,running:[],dead:[],idle:[]};if(e!=null){if(typeof e!="object"||Array.isArray(e))return{status:"error",error:"Options must be a map",code:"invalid_argument",running:[],dead:[],idle:[]};let o=o0("listRunning");if(o.length>0){for(let i of Object.keys(e))if(!o.includes(i))return{status:"error",error:`Unknown option: ${i}`,code:"invalid_argument",running:[],dead:[],idle:[]}}if(e.teamfile!==void 0&&(typeof e.teamfile!="string"||!e.teamfile.trim()))return{status:"error",error:"teamfile must be a nonempty string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.member!==void 0&&typeof e.member!="string")return{status:"error",error:"member must be a string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.reconcile!==void 0&&typeof e.reconcile!="boolean")return{status:"error",error:"reconcile must be a boolean",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.tree!==void 0&&typeof e.tree!="boolean")return{status:"error",error:"tree must be a boolean",code:"invalid_argument",running:[],dead:[],idle:[]}}let r=t.clock(),s=a0;if(e?.since!==void 0)if(typeof e.since=="number"){if(!Number.isFinite(e.since)||e.since<0||!Gd(r-e.since))return{status:"error",error:"since must be a non-negative number of milliseconds within representable date range",code:"invalid_argument",running:[],dead:[],idle:[]};s=e.since}else if(typeof e.since=="string"){let o=q_(e.since,r);if("error"in o)return{status:"error",error:o.error,code:"invalid_argument",running:[],dead:[],idle:[]};s=o.windowMs}else return{status:"error",error:"since must be a duration string or number",code:"invalid_argument",running:[],dead:[],idle:[]};try{let o=VN(t),i=e?.teamfile!==void 0?Iq(e.teamfile)?e.teamfile:kq(t.cwd,e.teamfile):void 0,a=i!==void 0?Re(i,o):void 0,l=e?.member!==void 0?e.member.toLowerCase():void 0,c=w=>!(a!==void 0&&w.target_teamfile!==a||l!==void 0&&(w.target_alias??"").toLowerCase()!==l),d=o.listAllRunningTrackedInvocations().filter(c),u=new Map,f=$d(o,r,s),m=[],p=[];for(let w of d){let T=f(w),S=r-new Date(w.started_at).getTime(),I={id:w.id,kind:w.kind,origin:w.origin,from_identity:w.from_identity,target:qd(w),model:X_(w,u),started_at:w.started_at,parent_invocation_id:w.parent_invocation_id};if(T==="dead"){if(e?.reconcile===!0&&Mf(o,w)!==null)continue;p.push({...I,age_ms:S})}else m.push({...I,running_for_ms:S,holder_liveness:T??"unknown"})}let _=new Set(d.map(qd).filter(w=>w!==null)),h=new Date(r-s).toISOString(),g=o.listRecentlyFinishedTrackedInvocations(h).filter(c),E=new Set,y=[];for(let w of g){let T=qd(w);T===null||_.has(T)||E.has(T)||(E.add(T),y.push({id:w.id,kind:w.kind,origin:w.origin,from_identity:w.from_identity,target:T,model:X_(w,u),status:w.status,started_at:w.started_at,ended_at:w.ended_at,idle_ms:r-new Date(w.ended_at).getTime(),ran_ms:new Date(w.ended_at).getTime()-new Date(w.started_at).getTime(),error:w.error,parent_invocation_id:w.parent_invocation_id}))}if(e?.tree===!0){let w=new Set([...m.map(S=>S.id),...p.map(S=>S.id),...y.map(S=>S.id)]),T=[...w];for(;T.length>0;){let S=o.listFinishedTrackedInvocationChildren(T,h).filter(I=>!w.has(I.id)&&c(I));if(S.length===0)break;T=[];for(let I of S){w.add(I.id),T.push(I.id);let A=qd(I);y.push({id:I.id,kind:I.kind,origin:I.origin,from_identity:I.from_identity,target:A,model:X_(I,u),status:I.status,started_at:I.started_at,ended_at:I.ended_at,idle_ms:r-new Date(I.ended_at).getTime(),ran_ms:new Date(I.ended_at).getTime()-new Date(I.started_at).getTime(),error:I.error,parent_invocation_id:I.parent_invocation_id})}}}return{status:"ok",error:null,running:m,dead:p,idle:y}}catch(o){return{status:"error",error:o instanceof Error?o.message:String(o),code:Nq(o),running:[],dead:[],idle:[]}}}var a0,Aq,B_,c0=C(()=>{"use strict";jd();i0();H_();x_();Ul();ze();on();a0=24*60*60*1e3,Aq=864e13;B_="default"});var h0={};fe(h0,{_setRunningWatchMaxTicksForTests:()=>Lq,runRunning:()=>jq});import{resolve as Rq}from"node:path";function Lq(t){V_=t??void 0}function Oq(t){let e=t.split(`
|
|
2640
|
-
`,1)[0];return e.length<=J_?e:`${e.slice(0,J_)}\u2026`}function K_(t){return t.target!==null?wn(t.target):t.from_identity}function u0(t){return[(0,Pt.escapeCell)(K_(t)),t.kind,"running",t.holder_liveness,(0,Pt.escapeCell)(t.model),Ia(t.started_at)]}function f0(t){return[(0,Pt.escapeCell)(K_(t)),t.kind,"DEAD","",(0,Pt.escapeCell)(t.model),`started ${Ia(t.started_at)}, holder process confirmed dead`]}function m0(t){let e=`ran ${Fd(t.ran_ms)}, idle ${Ia(t.ended_at)}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${(0,Pt.escapeCell)(El(t.error,J_)??
|
|
2639
|
+
`,F_=2,Pd=5,G2=24*60*60*1e3,C_=72,LN=80;J2={name:"status",allowsBareTeamfile:!0,supportsRaw:!1};jN=new WeakMap});import{isAbsolute as Sq,resolve as XN,join as qN}from"node:path";function VN(t){let e=GN.get(t);if(!e)throw Error("Unknown context");return e.dal()}function KN(t){return t!==null&&typeof t=="object"&&JN.has(t)}function YN(t){try{if(!t||typeof t!="object"||Array.isArray(t))return gt("invalid_argument","Context needs an explicit options map");let e={...t},n=["pid","env","cwd","dbPath","dal","onProgress","onWarning","clock","interactive"];if(Object.keys(e).some(_=>!n.includes(_)))return gt("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!Sq(e.cwd))return gt("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...e.env});if(Object.values(r).some(_=>_!==void 0&&typeof _!="string"))return gt("invalid_argument","Environment values must be strings or undefined");for(let _ of["onProgress","onWarning","clock"])if(e[_]!==void 0&&typeof e[_]!="function")return gt("invalid_argument",_+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return gt("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return gt("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return gt("invalid_argument","pid must be a positive integer");let s=XN(e.cwd),o=r.LMCTL_HOME||(r.HOME?qN(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(o?qN(o,"state.db"):void 0)))return gt("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,c,d,u=new AbortController,f=new Set,m=_=>{if(l){try{l.close()}catch(h){_.push(br(h))}l=void 0}},p=Object.freeze({status:"ok",error:null,pid:e.pid,signal:u.signal,env:r,cwd:s,dbPath:XN(s,Ke(e.dbPath,r)),dal:e.dal,interactive:e.interactive??r.LMCTL_NON_INTERACTIVE!=="1",onProgress:e.onProgress??(()=>{}),onWarning:e.onWarning??(()=>{}),clock:e.clock??Date.now,get closed(){return a},close(){if(c)return c;let _;return c=new Promise(h=>{_=h}),a=!0,u.abort(),(async()=>{let h=[],g=0;for(let E of[...f])try{await E.close(),g++,f.delete(E)}catch(y){h.push(br(y))}h.length||m(h),_({released:g,errors:h})})(),c},finalizeSync(_){if(d)return d;a=!0;let h=[],g={released:0,errors:h};d=g,c??=Promise.resolve(g);let E=[];for(let y of[...f])try{let w=y.finalizeSync(_);w instanceof Promise?E.push(w.then(()=>{g.released++,f.delete(y)}).catch(T=>{h.push(br(T))})):(g.released++,f.delete(y))}catch(w){h.push(br(w))}return u.abort(_),E.length?c=Promise.all(E).then(()=>(h.length||m(h),g)):h.length||m(h),g}});return GN.set(p,{resources:f,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=Fe({path:p.dbPath})}}),JN.add(p),bq.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(e){return gt("invalid_argument","Invalid context: "+br(e))}}var GN,bq,JN,jd=C(()=>{"use strict";bt();On();Qc();GN=new WeakMap;bq=new WeakMap,JN=new WeakSet});var Lr,n0,aoe,loe,coe,doe,uoe,oe,W_,Tn,Wd,xr,Hd,Xd,Ro,zN,QN,ZN,xo,Bd,Iq,e0,t0,r0,H_=C(()=>{"use strict";Lr=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))Lr(e);Object.freeze(t)}return t},n0=Lr(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),aoe=Lr({status:"string",error:"string|null",code:"ErrorCode?"}),loe=Lr(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),coe=Lr(["Provider1.Provider","Provider1.Model1","Provider2.Provider","Provider2.Model1","Provider3.Provider","Provider3.Model1"]),doe=Lr(["Provider1","Provider2","Provider3"]),uoe=Lr({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),oe={name:"ctx",type:"context"},W_={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},Tn={name:"teamfile",type:"string"},Wd={name:"alias",type:"string"},xr={name:"prompt",type:"string"},Hd={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"}]},Xd=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],Ro={name:"options",type:"map",optional:!0,keys:Xd},zN={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},QN={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},ZN={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},xo={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},Bd={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"}]},Iq=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"},{name:"reconcile",type:"boolean"}],e0={name:"options",type:"map",optional:!0,keys:Iq},t0={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},r0=Lr([{name:"resolveProfilePath",implemented:!0,params:[oe,W_],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[oe,W_],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:[oe,{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:[oe,Tn],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[Tn]}},{name:"resolveMember",implemented:!0,params:[oe,Tn,Wd],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:[Tn,Wd]}},{name:"lintTeam",implemented:!0,params:[oe,Tn],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:[Tn]}},{name:"seedTeam",implemented:!0,params:[oe,Tn,zN],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:[Tn,zN]}},{name:"promptAgent",implemented:!0,params:[oe,Hd,xr,Ro],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...t0,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[Hd,xr,Ro]}},{name:"promptMember",implemented:!0,params:[oe,{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"},...Xd]}],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:[Tn,Wd,xr,{name:"options",type:"map",optional:!0,keys:[...Xd,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[oe,{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:[oe,xo,ZN],statuses:["deleted","not_found","busy","error"],results:{error:"string|null"},effects:["provider","file-write"],summary:"Delete a session only with explicit force admission.",scriptBinding:{name:"lm_session_delete",params:[Hd,{...ZN,optional:!0}]}},{name:"getSession",implemented:!0,params:[oe,xo],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:[xo]}},{name:"reserveSession",implemented:!0,params:[oe,xo],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:[oe,xo,{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:[oe,{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"},...Xd]}],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:[oe,{name:"batch",type:"BatchRef"},xr,{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:[oe,{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:[oe,QN],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:[QN]}},{name:"openTerminal",implemented:!0,params:[oe,{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:[Tn,Wd]}},{name:"sessionAdmission",implemented:!0,params:[oe,xo],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:[oe,{name:"reservation",type:"SessionReservation"},Hd,xr,Ro],statuses:["ok","busy","stalled","empty","error"],results:{...t0,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[oe,{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:[oe,{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:[oe,{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"}]},Ro],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:[oe,{name:"session",type:"NativeSessionRef"},xr],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:[oe,{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:[oe,{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:[oe,Bd,xr,Ro],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:[Bd,xr,Ro]}},{name:"nativeSessionClose",implemented:!0,params:[oe,Bd],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:[Bd]}},{name:"loadProperties",implemented:!0,params:[oe,W_],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:[oe,e0],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:[e0]}}])});function s0(t){if(!KN(t))return gt("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return gt("cancelled","Context is closed")}function o0(t){return r0.find(e=>e.name===t)?.params.find(e=>e.name==="options")?.keys?.map(e=>e.name)??[]}var i0=C(()=>{"use strict";H_();jd();Qc()});import{isAbsolute as kq,resolve as Aq}from"node:path";function Gd(t){return Number.isFinite(t)&&Math.abs(t)<=Nq}function Rq(t){if(t&&typeof t=="object"){let e=t.code;if(typeof e=="string"){if(n0.includes(e))return e;if(e==="SQLITE_BUSY"||e==="SQLITE_LOCKED")return"busy";if(e==="SQLITE_READONLY"||e.startsWith("SQLITE_READONLY")||e==="EACCES"||e==="EPERM"||e==="EISDIR")return"read";if(e==="ENOENT"||e==="SQLITE_CANTOPEN")return"missing";if(e==="ETIMEDOUT"||e==="ECANCELED"||e==="ABORT_ERR")return"cancelled"}let n=t.message;if(typeof n=="string"){if(n.includes("readonly database")||n.includes("SQLITE_READONLY"))return"read";if(n.includes("database is locked")||n.includes("SQLITE_BUSY"))return"busy"}}return"internal"}function q_(t,e=Date.now()){if(t===void 0)return{windowMs:a0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let o=Number(n[1]),i=n[2],l=(i==="s"?o:i==="m"?o*60:i==="h"?o*3600:o*86400)*1e3;return!Number.isFinite(l)||l<0||!Gd(e-l)?{error:`invalid --since duration: ${t} (cutoff out of representable date range)`}:{windowMs:l}}let r=Date.parse(t);if(!Number.isFinite(r)||!Gd(r))return{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`};let s=Math.max(0,e-r);return Gd(e-s)?{windowMs:s}:{error:`invalid --since value: ${t} (cutoff out of representable date range)`}}function qd(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function X_(t,e){let n=t.target_teamfile,r=t.target_alias;if(n===null||r===null)return B_;let s=e.get(n);if(s===void 0){try{s=ke(n)}catch{s=null}e.set(n,s)}return s===null?B_:Nl(s,r)?.model??B_}async function l0(t,e={}){let n=s0(t);if(n)return{status:"error",error:n.error,code:n.code,running:[],dead:[],idle:[]};if(e!=null){if(typeof e!="object"||Array.isArray(e))return{status:"error",error:"Options must be a map",code:"invalid_argument",running:[],dead:[],idle:[]};let o=o0("listRunning");if(o.length>0){for(let i of Object.keys(e))if(!o.includes(i))return{status:"error",error:`Unknown option: ${i}`,code:"invalid_argument",running:[],dead:[],idle:[]}}if(e.teamfile!==void 0&&(typeof e.teamfile!="string"||!e.teamfile.trim()))return{status:"error",error:"teamfile must be a nonempty string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.member!==void 0&&typeof e.member!="string")return{status:"error",error:"member must be a string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.reconcile!==void 0&&typeof e.reconcile!="boolean")return{status:"error",error:"reconcile must be a boolean",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.tree!==void 0&&typeof e.tree!="boolean")return{status:"error",error:"tree must be a boolean",code:"invalid_argument",running:[],dead:[],idle:[]}}let r=t.clock(),s=a0;if(e?.since!==void 0)if(typeof e.since=="number"){if(!Number.isFinite(e.since)||e.since<0||!Gd(r-e.since))return{status:"error",error:"since must be a non-negative number of milliseconds within representable date range",code:"invalid_argument",running:[],dead:[],idle:[]};s=e.since}else if(typeof e.since=="string"){let o=q_(e.since,r);if("error"in o)return{status:"error",error:o.error,code:"invalid_argument",running:[],dead:[],idle:[]};s=o.windowMs}else return{status:"error",error:"since must be a duration string or number",code:"invalid_argument",running:[],dead:[],idle:[]};try{let o=VN(t),i=e?.teamfile!==void 0?kq(e.teamfile)?e.teamfile:Aq(t.cwd,e.teamfile):void 0,a=i!==void 0?Re(i,o):void 0,l=e?.member!==void 0?e.member.toLowerCase():void 0,c=w=>!(a!==void 0&&w.target_teamfile!==a||l!==void 0&&(w.target_alias??"").toLowerCase()!==l),d=o.listAllRunningTrackedInvocations().filter(c),u=new Map,f=$d(o,r,s),m=[],p=[];for(let w of d){let T=f(w),S=r-new Date(w.started_at).getTime(),I={id:w.id,kind:w.kind,origin:w.origin,from_identity:w.from_identity,target:qd(w),model:X_(w,u),started_at:w.started_at,parent_invocation_id:w.parent_invocation_id};if(T==="dead"){if(e?.reconcile===!0&&Mf(o,w)!==null)continue;p.push({...I,age_ms:S})}else m.push({...I,running_for_ms:S,holder_liveness:T??"unknown"})}let _=new Set(d.map(qd).filter(w=>w!==null)),h=new Date(r-s).toISOString(),g=o.listRecentlyFinishedTrackedInvocations(h).filter(c),E=new Set,y=[];for(let w of g){let T=qd(w);T===null||_.has(T)||E.has(T)||(E.add(T),y.push({id:w.id,kind:w.kind,origin:w.origin,from_identity:w.from_identity,target:T,model:X_(w,u),status:w.status,started_at:w.started_at,ended_at:w.ended_at,idle_ms:r-new Date(w.ended_at).getTime(),ran_ms:new Date(w.ended_at).getTime()-new Date(w.started_at).getTime(),error:w.error,parent_invocation_id:w.parent_invocation_id}))}if(e?.tree===!0){let w=new Set([...m.map(S=>S.id),...p.map(S=>S.id),...y.map(S=>S.id)]),T=[...w];for(;T.length>0;){let S=o.listFinishedTrackedInvocationChildren(T,h).filter(I=>!w.has(I.id)&&c(I));if(S.length===0)break;T=[];for(let I of S){w.add(I.id),T.push(I.id);let A=qd(I);y.push({id:I.id,kind:I.kind,origin:I.origin,from_identity:I.from_identity,target:A,model:X_(I,u),status:I.status,started_at:I.started_at,ended_at:I.ended_at,idle_ms:r-new Date(I.ended_at).getTime(),ran_ms:new Date(I.ended_at).getTime()-new Date(I.started_at).getTime(),error:I.error,parent_invocation_id:I.parent_invocation_id})}}}return{status:"ok",error:null,running:m,dead:p,idle:y}}catch(o){return{status:"error",error:o instanceof Error?o.message:String(o),code:Rq(o),running:[],dead:[],idle:[]}}}var a0,Nq,B_,c0=C(()=>{"use strict";jd();i0();H_();x_();Ul();ze();on();a0=24*60*60*1e3,Nq=864e13;B_="default"});var h0={};fe(h0,{_setRunningWatchMaxTicksForTests:()=>Cq,runRunning:()=>Wq});import{resolve as xq}from"node:path";function Cq(t){V_=t??void 0}function Dq(t){let e=t.split(`
|
|
2640
|
+
`,1)[0];return e.length<=J_?e:`${e.slice(0,J_)}\u2026`}function K_(t){return t.target!==null?wn(t.target):t.from_identity}function u0(t){return[(0,Pt.escapeCell)(K_(t)),t.kind,"running",t.holder_liveness,(0,Pt.escapeCell)(t.model),Ia(t.started_at)]}function f0(t){return[(0,Pt.escapeCell)(K_(t)),t.kind,"DEAD","",(0,Pt.escapeCell)(t.model),`started ${Ia(t.started_at)}, holder process confirmed dead`]}function m0(t){let e=`ran ${Fd(t.ran_ms)}, idle ${Ia(t.ended_at)}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${(0,Pt.escapeCell)(El(t.error,J_)??Dq(t.error))}`),[(0,Pt.escapeCell)(K_(t)),t.kind,t.status,"",(0,Pt.escapeCell)(t.model),e]}function G_(t){return t.filter(e=>e!=="").join(" ")}function p0(t){let e=new Map(t.map(o=>[o.id,o])),n=new Map,r=[];for(let o of t){let i=o.parent_invocation_id;if(i!==null&&e.has(i)){let a=n.get(i)??[];a.push(o),n.set(i,a)}else r.push(o)}let s=(o,i)=>i.started_at.localeCompare(o.started_at);r.sort(s);for(let o of n.values())o.sort(s);return{roots:r,childrenByParent:n}}function $q(t){let{roots:e,childrenByParent:n}=p0(t),r=[],s=(o,i)=>{r.push(`${" ".repeat(i+1)}${o.line}`);for(let a of n.get(o.id)??[])s(a,i+1)};for(let o of e)s(o,0);return r}function Pq(t,e,n){let r=[...t.map(a=>({state:"running",...a})),...e.map(a=>({state:"dead",...a})),...n.map(a=>({state:"idle",...a}))],{roots:s,childrenByParent:o}=p0(r),i=a=>({...a,children:(o.get(a.id)??[]).map(i)});return s.map(i)}function Uq(t,e){return e?{schema_version:d0,tree:Pq(t.running,t.dead,t.idle)}:{schema_version:d0,running:t.running,dead:t.dead,idle:t.idle}}function Fq(t){let e=[...t.running.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:G_(u0(r))})),...t.dead.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:G_(f0(r))})),...t.idle.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:G_(m0(r))}))],n=$q(e);return`${n.length>0?n.join(`
|
|
2641
2641
|
`):" none"}
|
|
2642
|
-
`}function
|
|
2642
|
+
`}function jq(t,e){let n=[{title:`Running (${t.running.length}):`,rows:t.running.map(u0)},{title:`Dead (reclaimable) (${t.dead.length}):`,rows:t.dead.map(f0)},{title:`Idle, finished in the last ${Fd(e)} (${t.idle.length}):`,rows:t.idle.map(m0)}],r=["MEMBER","KIND","STATE","LIVENESS","MODEL","TIMING"],s=(0,Pt.measureColumns)([{rows:[],headers:r},...n.map(a=>a.rows)],{max:Mq}),o=!1,i=[];return n.forEach((a,l)=>{if(l>0&&i.push(""),i.push(a.title),a.rows.length===0){i.push(" none");return}let c=!o;o=!0,i.push((0,Pt.renderGrid)(a.rows,{widths:s,margin:2,...c?{headers:r}:{}}))}),`${i.join(`
|
|
2643
2643
|
`)}
|
|
2644
|
-
`}async function
|
|
2645
|
-
`),0;let n=le(t,["--team","--member","--since","--watch-interval"],["--json","--tree","--watch","--reconcile"]);if(n.error!==void 0)return D(e,n.error);let r=Y(n,"--json"),s=Y(n,"--tree"),o=Y(n,"--watch"),i=V(n,"--team"),a=V(n,"--member"),l=q_(V(n,"--since"));if("error"in l)return D(e,l.error);let c=V(n,"--watch-interval"),d=c===void 0?
|
|
2646
|
-
`):Z(e,_),0}return e.stdout.write(s?
|
|
2647
|
-
`)}finally{p=!1}m+=1,V_!==void 0&&m>=V_&&_(E)}},g=setInterval(()=>{h(g)},d*1e3);h(g),process.once("SIGINT",()=>_(g)),process.once("SIGTERM",()=>_(g))}):u()}var Pt,d0,
|
|
2648
|
-
`),J_=120;
|
|
2649
|
-
`),0}function
|
|
2650
|
-
${Jd}`),2):n==="update"?
|
|
2644
|
+
`}async function Wq(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Oq}
|
|
2645
|
+
`),0;let n=le(t,["--team","--member","--since","--watch-interval"],["--json","--tree","--watch","--reconcile"]);if(n.error!==void 0)return D(e,n.error);let r=Y(n,"--json"),s=Y(n,"--tree"),o=Y(n,"--watch"),i=V(n,"--team"),a=V(n,"--member"),l=q_(V(n,"--since"));if("error"in l)return D(e,l.error);let c=V(n,"--watch-interval"),d=c===void 0?Lq:Number.parseInt(c.replace(/s$/,""),10);if(!Number.isFinite(d)||d<1)return D(e,`invalid --watch-interval "${c}" (expected <N>s, N\u22651)`);let u=()=>W(e,async f=>{let m=YN({cwd:xq(e.cwd??process.cwd()),env:e.env??process.env,dal:f,dbPath:Ie(e)});if(m.status!=="ok")return D(e,m.error);let p=await l0(m,{teamfile:i,member:a,since:V(n,"--since"),tree:s,reconcile:Y(n,"--reconcile")});if(p.status!=="ok")return D(e,p.error??"listRunning failed");if(r){let _=Uq(p,s);return o?e.stdout.write(`${JSON.stringify(_)}
|
|
2646
|
+
`):Z(e,_),0}return e.stdout.write(s?Fq(p):jq(p,l.windowMs)),0});return o?await new Promise(f=>{let m=0,p=!1,_=E=>{clearInterval(E),f(0)},h=async E=>{if(!p){p=!0;try{await u()}catch(y){e.stderr.write(`running: ${y instanceof Error?y.message:String(y)}
|
|
2647
|
+
`)}finally{p=!1}m+=1,V_!==void 0&&m>=V_&&_(E)}},g=setInterval(()=>{h(g)},d*1e3);h(g),process.once("SIGINT",()=>_(g)),process.once("SIGTERM",()=>_(g))}):u()}var Pt,d0,Lq,V_,Oq,J_,Mq,_0=C(()=>{"use strict";Pt=Ft(Ct(),1);jd();c0();se();j_();It();d0=4,Lq=2;Oq=["usage: lmctl running [--team <file>] [--member <alias>] [--since <duration|ISO8601>]"," [--tree] [--reconcile] [--watch] [--watch-interval Ns] [--json]","","Shows tracked_invocation activity DB-wide across the whole fleet, split","into three sections (flat mode, the default):",' - Running: status="running" with a live holder, or unknown liveness.'," Unknown includes recent heartbeat/dispatch evidence contradicting a"," dead historical PID; it does not certify that the member is live now.",' - Dead (reclaimable): status="running" but the holder process is'," confirmed dead without contrary activity evidence. Its age (time"," since it started; the moment the holder died is not recorded) is",' reported as "age_ms", not as "running", so a dead worker is never'," mistaken for one that is genuinely still building."," - Idle: targets with nothing running or dead, showing their most"," recent finish from the last 24 hours and how long they've been"," idle since.",' A finish that failed ends with " \u2014 " and one line of the failure:'," for a provider failure the end of the provider's own output, for"," any other error its first line. It is a pointer, not the full"," error: --json has the complete text.","","--team <file> narrows the view to one teamfile (path is canonicalized","before matching); --member <alias> narrows it to one member alias","(case-insensitive; combinable with --team). --since sets the lookback","window for the Idle section -- a relative duration (<n>s|m|h|d, e.g. 7d)","or an absolute ISO8601 timestamp (default 24h). Running and Dead are","not time-filtered. --since also bounds the later-dispatch evidence used","to distinguish dead from unknown; a recent advancing heartbeat counts too.","","Looking is read-only: a dead holder is listed under Dead and left as it is.","Dispatch reconciles dead holders for its receiver. Scheduled lmbee maintenance","explicitly opts into --reconcile, which aborts confirmed-dead rows and","terminalizes their linked messages. Unknown rows are never reconciled here.","","--watch re-renders the full snapshot every --watch-interval (default 2s)","until interrupted (SIGINT/SIGTERM). With --json, each snapshot is emitted","as ONE compact JSON object per line (NDJSON).","","--tree shows the same rows as one hierarchical dispatch-lineage view","instead: no section headers (each row already carries its own status),","indented under the session that dispatched it (who woke whom), sorted","by the most recent root session first. A node is a specific turn at a","specific time, not a team:alias identity -- the same member can appear","as multiple nodes for its different turns. Lineage is only known for","turns dispatched by a NESTED `lmctl prompt`/`lmctl terminal` call made","from within another turn's own tool calls; anything else (a human's","direct dispatch, or a turn from before this feature existed) has no","recorded parent and shows as its own root. Unlike the flat Idle section,","--tree does NOT collapse finished rows to one per target: every finished","descendant of a node in view (within the --since window) is rendered, so","a `lmctl batch` run shows as its batch root with ALL of its per-prompt","turns nested underneath.","","Every row also carries `model`: the target member's declared `model=`",'read straight from its teamfile (no session/provider query) -- "default"',"when the teamfile has no model= attribute, the alias/file can't be","resolved, or there is no target at all. This is the DECLARED value only,","not necessarily what actually ran (see the MODEL column in `lmctl status","<teamfile> --details`).","","--json emits { schema_version, running, dead, idle } (flat, one array","per section, matching the three flat-mode sections -- each row carries","its own status/timing/error fields). --tree --json instead emits","{ schema_version, tree } -- an array of root nodes, each row's full",'fields plus a "state" discriminant ("running"/"dead"/"idle") and a','"children" array of the same shape, nested per the dispatch lineage.',"","Queries lmctl's own database only -- never touches native provider","session files."].join(`
|
|
2648
|
+
`),J_=120;Mq=[26,void 0,void 0,void 0,24,void 0]});var E0={};fe(E0,{runPrices:()=>qq});import{existsSync as Hq}from"node:fs";import{resolve as g0}from"node:path";function Vd(t,e,n="price snapshot unavailable"){return e?Z(t,{schema_version:1,status:"unavailable",reason:n}):t.stdout.write(`unavailable: ${n}
|
|
2649
|
+
`),0}function Bq(t){let e=t?.code;return typeof e=="string"&&/SQLITE_(BUSY|LOCKED|READONLY|CANTOPEN)/.test(e)}function y0(t){return t.dal!==void 0?{db:t.dal,owned:!1}:{db:Fe({path:Ie(t),recover:!1}),owned:!0}}function Xq(t){if(t.owned)try{t.db.close()}catch{}}async function qq(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(Jd),0;let n=t[0];return n!=="update"&&n!=="show"?(e.stderr.write(`error: expected update or show
|
|
2650
|
+
${Jd}`),2):n==="update"?Gq(t.slice(1),e):Vq(t.slice(1),e)}async function Gq(t,e){let n=le(t,["--aliases"],["--json"]);if(n.error||n.positionals.length>1)return e.stderr.write(`error: ${n.error??"update accepts at most one FILE"}
|
|
2651
2651
|
${Jd}`),2;let r=Y(n,"--json"),s=n.positionals[0],o=V(n,"--aliases"),i;try{if(s!==void 0){let l=g0(e.cwd??process.cwd(),s),c=o===void 0?void 0:g0(e.cwd??process.cwd(),o),d=Ef(l,c);i=y0(e);let u=wf(i.db.db,d);return r?Z(e,{...Y_(Ws(i.db.db),e.env??process.env),status:u}):e.stdout.write(`${u}
|
|
2652
2652
|
`),0}if(o!==void 0)return e.stderr.write(`error: --aliases requires FILE
|
|
2653
2653
|
`),2;i=y0(e);let a=await Tf(i.db.db,{env:e.env??process.env,force:!0});return r?Z(e,{...Y_(a.snapshot,e.env??process.env),status:a.status}):e.stdout.write(`${a.status}
|
|
2654
|
-
`),0}catch(a){return
|
|
2654
|
+
`),0}catch(a){return Bq(a)?(r?Z(e,{schema_version:1,status:"deferred",reason:"database busy or read-only"}):e.stdout.write(`deferred
|
|
2655
2655
|
`),0):(e.stderr.write(`error: ${a instanceof Error?a.message:String(a)}
|
|
2656
|
-
`),1)}finally{i!==void 0&&
|
|
2657
|
-
${Jd}`),2;let r=Y(n,"--json"),s=n.positionals[0],o,i=!1;try{if(e.dal!==void 0)o=e.dal.db,i=!0;else{let a=Ie(e);if(!
|
|
2656
|
+
`),1)}finally{i!==void 0&&Xq(i)}}function Y_(t,e){if(t===null)return{schema_version:1,status:"unavailable",reason:"price snapshot unavailable"};let n=Date.parse(t.fetchedAt),r=Number.isFinite(n)?Math.max(0,Math.floor((Date.now()-n)/1e3)):null;return{schema_version:1,status:"ok",source:t.source,generated_at:t.generatedAt,fetched_at:t.fetchedAt,loaded_at:t.loadedAt,hash:t.sha256,record_count:t.recordCount,age_seconds:r,stale:r!==null&&r>Ls(e)/1e3}}async function Vq(t,e){let n=le(t,["--provider"],["--json"]);if(n.error||n.positionals.length>1)return e.stderr.write(`error: ${n.error??"show accepts at most one MODEL"}
|
|
2657
|
+
${Jd}`),2;let r=Y(n,"--json"),s=n.positionals[0],o,i=!1;try{if(e.dal!==void 0)o=e.dal.db,i=!0;else{let a=Ie(e);if(!Hq(a))return Vd(e,r,"database unavailable");o=In(a)}}catch(a){return Vd(e,r,a instanceof Error?a.message:"database unavailable")}try{let a=Ws(o);if(a===null)return Vd(e,r);let l=Y_(a,e.env??process.env);if(s===void 0)return r?Z(e,l):e.stdout.write(`source: ${String(l.source)}
|
|
2658
2658
|
generated_at: ${String(l.generated_at??"unknown")}
|
|
2659
2659
|
hash: ${String(l.hash)}
|
|
2660
2660
|
records: ${String(l.record_count)}
|
|
@@ -2678,20 +2678,20 @@ cache write: ${String(y.rates.input_cache_write_per_1m_tokens??"n/a")}
|
|
|
2678
2678
|
show [MODEL] [--provider PROVIDER] [--json]
|
|
2679
2679
|
Read the stored snapshot without files/network, or show its source and age.
|
|
2680
2680
|
Rates are base-tier USD per million; 1-hour write blends need turn counters.
|
|
2681
|
-
`});function Be(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);return Number.isFinite(e)?Math.round(Math.min(1,Math.max(0,e))*1e6)/1e6:null}function vn(t,e){if(t==null||typeof t=="boolean")return null;let n=Number(t);return Be(e==="percent"?n/100:n)}function T0(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);if(!Number.isFinite(e))return null;try{return new Date(Math.trunc(e)*1e3).toISOString().replace(".000Z","Z")}catch{return null}}function v0(t){if(typeof t!="string"||t.trim()==="")return null;let e=Date.parse(t);return Number.isFinite(e)?Math.floor(e/1e3):null}function S0(t){let e=Number(t);return Number.isFinite(e)?e===300||e>=240&&e<=360?"five_hour":e===10080||e>=9e3&&e<=11500?"weekly":e===43200||e===44640||e>=38e3&&e<=46e3?"monthly":"unknown":"unknown"}function b0(t){let e=String(t??"").trim().toLowerCase().replace(/-/g,"_").split("_").filter(Boolean);for(let n of[e[0],e.at(-1)]){if(n?.startsWith("5h")||n?.startsWith("five")||n==="session")return"five_hour";if(n?.startsWith("7d")||n?.startsWith("seven")||n?.startsWith("week"))return"weekly";if(n?.startsWith("30d")||n?.startsWith("month"))return"monthly"}return"unknown"}function Lo(t,e=[]){let n=t==null?"":String(t);for(let r of e)typeof r=="string"&&r.length>=4&&(n=n.replaceAll(r,"***REDACTED***"));for(let r of
|
|
2682
|
-
${o}`)}function Cr(t,e,n=[]){let r;try{let o=JSON.parse(e);r=typeof o?.error=="string"?o.error:o?.error?.message??o?.message??o?.detail}catch{/^\s*[<{[]/.test(e)||(r=e.trim())}if(typeof r!="string"||!r.trim())return t;let s=Lo(r,n);return{...t,detail:s,provider_message:s}}var Vq,Jq,Sn=C(()=>{"use strict";Vq="https://lmctl.com/schemas/lmratelimit-v1.json";Jq=[/sk-ant-[A-Za-z0-9_-]{4,}/g,/sk-[A-Za-z0-9_-]{16,}/g,/\bbearer\s+[A-Za-z0-9._-]{8,}/gi,/\boat01[-_][A-Za-z0-9_-]{8,}/g,/\bcsrf[-_][A-Za-z0-9_-]{4,}/gi,/\b(?:csrf[-_]?token|x-codeium-csrf-token)\s*[:=]\s*['"]?[A-Za-z0-9._-]{4,}/gi]});import{spawnSync as Kq}from"node:child_process";import{readdirSync as Yq,readFileSync as zq}from"node:fs";import{join as Qq}from"node:path";function aG(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("ANTIGRAVITY")))}function lG(t){let e=t.trim().toLowerCase(),n={"gemini models":"gemini","claude and gpt models":"3p",gemini:"gemini","3p models":"3p","3p":"3p"};return n[e]?n[e]:e.replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function cG(t){let e=t.toLowerCase();return e.includes("weekly")?"weekly":e.includes("five hour")||e.includes("5-hour")||e.includes("5 hour")?"five_hour":e.includes("monthly")||e.includes("month")?"monthly":null}function dG(t){let e={weekly:"weekly",five_hour:"5h",monthly:"monthly"},n=[];for(let r of t.split(/\r?\n/)){let s=r.trim().split(" ").map(l=>l.trim());if(s.length<3||!s[0]||!s[1])continue;let o=cG(s[1]);if(!o)continue;let i=Number(s[2].replace(/%$/,"").trim());if(!Number.isFinite(i))continue;let a=Be(i/100);n.push(Ze({bucket_id:`${lG(s[0])}-${e[o]}`,group_name:s[0],window_type:o,used_fraction:a===null?null:Be(1-a),remaining_fraction:a,resets_at_iso:s[3]||null,raw_value:i,raw_scale:"remaining_percent"}))}return n.sort((r,s)=>String(r.group_name??"").localeCompare(String(s.group_name??""))||String(r.bucket_id??"").localeCompare(String(s.bucket_id??"")))}function ka(t,e,n){return xe("agy","provider_unavailable",t,e,"agy_cli_print")}function uG(t,e,n={}){try{let r=sG(Math.max(t,60)*1e3,aG(e));if(dt(n,"agy_cli_print",r.stdout??"",[e.ANTIGRAVITY_CSRF_TOKEN]),r.error?.code==="ENOENT")return ka("agy_not_found","the agy CLI is not on PATH",t);if(r.error?.code==="ETIMEDOUT")return ka("cli_timeout","agy -p /usage did not finish in time",t);if(r.error)return ka("cli_failed",r.error.message,t);let s=dG(r.stdout??"");return s.length===0?ka("cli_unparseable",`exit ${r.status??1}; no buckets parsed from CLI output`,t):Pe("agy","ok",{source:"agy_cli_print",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:s})}catch(r){return ka("cli_failed",r instanceof Error?r.message:String(r),t)}}function A0(t){if(!t||typeof t!="string")return null;let e=t.trim();if(!e||e.includes("@")||e.includes("/")||e.includes("\\")||e.includes("?")||e.includes("#")||e.includes("://")||/\s/.test(e))return null;let n;try{n=new URL(`http://${e}`)}catch{return null}if(n.username||n.password||n.pathname!=="/"||n.search||n.hash)return null;let r=n.hostname.toLowerCase();if(!(r==="localhost"||r==="127.0.0.1"||r==="[::1]"||r==="::1")||!n.port)return null;let o=Number(n.port);return!Number.isInteger(o)||o<1||o>65535||n.port!==String(o)?null:`${r==="::1"||r==="[::1]"?"[::1]":r}:${o}`}function fG(t){let e=[],n=new Set,r=(s,o,i)=>{if(!s||!o)return;let a=A0(s);!a||n.has(`${a}\0${o}`)||(n.add(`${a}\0${o}`),e.push([a,o,i]))};r(t[I0],t[k0],-1);try{for(let s of Yq("/proc"))if(/^\d+$/.test(s))try{let o={};for(let i of zq(Qq("/proc",s,"environ")).toString("utf8").split("\0")){let a=i.indexOf("=");a>0&&(o[i.slice(0,a)]=i.slice(a+1))}r(o[I0],o[k0],Number(s))}catch{}}catch{}return e}function mG(t){if(typeof t!="object"||t===null)return null;let e=t.response;if(typeof e!="object"||e===null)return null;let n=e.groups;if(!Array.isArray(n))return null;let r=[];for(let s of n){if(typeof s!="object"||s===null)continue;let o=s,i=typeof o.displayName=="string"?o.displayName:null;if(Array.isArray(o.buckets))for(let a of o.buckets){if(typeof a!="object"||a===null)continue;let l=a,c=vn(l.remainingFraction,"fraction");r.push(Ze({bucket_id:l.bucketId??l.displayName??"unknown",group_name:i,window_type:b0(l.window),used_fraction:c===null?null:Be(1-c),remaining_fraction:c,resets_at_iso:l.resetTime??null,raw_value:l.remainingFraction??null,raw_scale:"remaining_fraction"}))}}return r.length===0?null:(r.sort((s,o)=>String(s.group_name??"").localeCompare(String(o.group_name??""))||String(s.bucket_id??"").localeCompare(String(o.bucket_id??""))),Pe("agy","ok",{source:"agy_connect_rpc",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:r}))}async function pG(t,e,n={}){try{let s=iG(e).map(([a,l,c])=>[A0(a),l,c]).filter(a=>a[0]!==null);if(s.length===0)return xe("agy","provider_unavailable","no_active_session","no live agy process exposed ANTIGRAVITY_LS_ADDRESS/ANTIGRAVITY_CSRF_TOKEN","agy_connect_rpc");let o=[],i=Date.now()+t*1e3;for(let[a,l,c]of s){let d=i-Date.now();if(d<=0){o.push("overall connect deadline exceeded");break}try{let u=await oG(`http://${a}${Zq}`,{"Content-Type":"application/json","Connect-Protocol-Version":"1","x-codeium-csrf-token":l},d);if(dt(n,"agy_connect_rpc",u.body,[l],u.status),u.status===200){let f;try{f=JSON.parse(u.body)}catch{o.push(`pid=${c}: unparseable response`);continue}let m=mG(f);if(m)return m;o.push(`pid=${c}: response had no quota groups`)}else u.status===401||u.status===403?o.push(`pid=${c}: HTTP ${u.status} unauthorized`):o.push(`pid=${c}: HTTP ${u.status}`)}catch(u){o.push(`pid=${c}: ${u instanceof Error?u.message:String(u)}`)}}return xe("agy","provider_unavailable","no_active_session",`all candidate language servers failed: ${o.slice(0,5).join("; ")}`,"agy_connect_rpc",s.map(([,a])=>a))}catch(r){return xe("agy","provider_unavailable","connect_failed",r instanceof Error?r.message:String(r),"agy_connect_rpc")}}async function N0(t){let e=await pG(t.timeoutSeconds,t.env,t);if(e.status==="ok")return e;let n=uG(t.timeoutSeconds,t.env,t);return n.status==="ok"?n:xe("agy","provider_unavailable","cli_and_language_server_unavailable",`cli: ${String(n.reason??n.status)} (${String(n.detail??"no detail")}); connect: ${String(e.reason??e.status)} (${String(e.detail??"no detail")})`,"agy_cli_print")}var I0,k0,Zq,eG,tG,nG,rG,sG,oG,iG,R0=C(()=>{"use strict";Sn();Sn();I0="ANTIGRAVITY_LS_ADDRESS",k0="ANTIGRAVITY_CSRF_TOKEN",Zq="/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary",eG=["-p","/usage"],tG=(t,e)=>{let n=Kq("agy",eG,{encoding:"utf8",timeout:t,maxBuffer:16777216,env:e,stdio:["ignore","pipe","ignore"]});return{status:n.status,stdout:typeof n.stdout=="string"?n.stdout:"",error:n.error}},nG=async(t,e,n)=>{let r=await fetch(t,{method:"POST",headers:e,body:"{}",signal:AbortSignal.timeout(n),redirect:"error"});return{status:r.status,body:await r.text()}},rG=t=>fG(t),sG=tG,oG=nG,iG=rG});import{randomUUID as C0}from"node:crypto";import{mkdirSync as hG,readFileSync as z_,realpathSync as _G,renameSync as gG,rmSync as Q_,statSync as x0,writeFileSync as O0}from"node:fs";import{homedir as yG}from"node:os";import{join as Z_}from"node:path";import{setTimeout as EG}from"node:timers/promises";function ng(t){return Z_(t.CLAUDE_CONFIG_DIR??Z_(t.HOME??yG(),".claude"),".credentials.json")}function eg(t){let e=JSON.parse(z_(t,"utf8"));if(!e||typeof e!="object"||Array.isArray(e))throw new Error("invalid credential document");return e}function tg(t){let e=t.claudeAiOauth;return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function D0(t){if(t.CLAUDE_CODE_OAUTH_TOKEN)return{oauth:{accessToken:t.CLAUDE_CODE_OAUTH_TOKEN}};let e=ng(t);try{let n=tg(eg(e));return typeof n?.accessToken=="string"&&n.accessToken?{oauth:n,path:_G(e)}:{error:"not_claude_ai_subscriber"}}catch(n){return n.code==="ENOENT"?{error:t.ANTHROPIC_API_KEY?"not_claude_ai_subscriber":"no_credentials_found"}:{error:"credentials_unreadable"}}}function Yd(t){return typeof t.expiresAt=="number"&&Date.now()+vG>=t.expiresAt}function L0(t,e){return t.accessToken===e.accessToken&&t.refreshToken===e.refreshToken}async function SG(t,e){let n=`${t}.lmctl-refresh.lock`,r=Z_(n,"owner.json"),s=C0();for(;;){e.throwIfAborted();try{hG(n,{mode:448});try{O0(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw Q_(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(z_(r,"utf8")).token===s&&Q_(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(z_(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-x0(n).mtimeMs>6e4}catch{try{i=Date.now()-x0(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await EG(50,void 0,{signal:e})}}}async function M0(t,e){if(!t.path||typeof t.oauth?.refreshToken!="string"||!t.oauth.refreshToken)throw new Error("no_refresh_token");let n=await SG(t.path,e);try{let r=tg(eg(t.path));if(!r||typeof r.accessToken!="string")throw new Error("credentials_changed");if(!L0(r,t.oauth)&&!Yd(r))return r;if(typeof r.refreshToken!="string"||!r.refreshToken)throw new Error("no_refresh_token");let s=await fetch(TG,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:r.refreshToken,client_id:wG})});if(!s.ok)throw new Error(`refresh_http_${s.status}`);let o=await s.json();if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.expires_in!="number"||!Number.isFinite(o.expires_in)||o.expires_in<=0||o.refresh_token!==void 0&&(typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)))throw new Error("invalid_refresh_response");let i=Math.floor(Date.now()+o.expires_in*1e3);if(!Number.isSafeInteger(i)||i<=Date.now())throw new Error("invalid_refresh_response");let a=eg(t.path),l=tg(a);if(!l||!L0(r,l)){if(l&&typeof l.accessToken=="string"&&!Yd(l))return l;throw new Error("credentials_changed")}let c={...l,accessToken:o.access_token,refreshToken:o.refresh_token??r.refreshToken,expiresAt:i,...typeof o.scope=="string"?{scopes:o.scope.split(/\s+/).filter(Boolean)}:{}},d=`${t.path}.${C0()}.tmp`;try{O0(d,JSON.stringify({...a,claudeAiOauth:c}),{flag:"wx",mode:384}),gG(d,t.path)}finally{Q_(d,{force:!0})}return c}finally{n()}}var wG,TG,vG,$0=C(()=>{"use strict";wG="9d1c250a-e61b-44d9-88ed-5944d1962f5e",TG="https://console.anthropic.com/v1/oauth/token",vG=3e5});import{spawnSync as F0}from"node:child_process";function kG(t){let e=String(t??"").toLowerCase();return e.includes("session")||e.includes("five")||e.includes("5h")?"five_hour":e.includes("week")||e.includes("seven")||e.includes("7d")?"weekly":e.includes("month")||e.includes("30d")?"monthly":"unknown"}function j0(t){return Object.fromEntries(Object.entries(t).filter(([e])=>e!=="CLAUDECODE"))}function AG(t){try{let e=F0("claude",["--version"],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],env:j0(t)}),n=typeof e.stdout=="string"?e.stdout.trim().split(/\s+/)[0]:"";if(n)return`claude-code/${n}`}catch{}return"claude-code/unknown"}function Kt(t,e,n,r="claude_oauth_api",s){return xe("claude",t,e,n,r,void 0,s)}function NG(t){let e=t.get("retry-after");if(!e)return;let n=Number.parseInt(e,10);return Number.isFinite(n)?n:void 0}function RG(t){if(!t)return;let e=/^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)?(?:\s*\(([^)]+)\))?$/i.exec(t.trim());if(!e)return;let n=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"].indexOf(e[1].slice(0,3).toLowerCase());if(n<0)return;let r=Number(e[3]),s=Number(e[4]??0);(e[5]??"").toLowerCase()==="pm"&&r!==12&&(r+=12),(e[5]??"").toLowerCase()==="am"&&r===12&&(r=0);let o=new Date(Date.UTC(new Date().getUTCFullYear(),n,Number(e[2]),r,s));return Number.isFinite(o.getTime())?Math.floor(o.getTime()/1e3):void 0}function LG(t){let e=[];for(let n of t.split(/\r?\n/)){let r=xG.exec(n.trim());if(!r)continue;let s=r[1].trim(),i=s.toLowerCase()==="session",a=/\(([^)]+)\)/.exec(s)?.[1]?.trim()??s,l=i?"session":a.toLowerCase()==="all models"?"week-all-models":`week-scoped-${a}`,c=i?"five_hour":"weekly";e.push(Ze({bucket_id:l,group_name:i?"session":"weekly",window_type:c,used_fraction:vn(Number(r[2]),"percent"),raw_value:Number(r[2]),raw_scale:"used_percent",resets_at:RG(r[3])}))}return e.sort((n,r)=>String(n.window_type).localeCompare(String(r.window_type))||String(n.bucket_id).localeCompare(String(r.bucket_id)))}function CG(t){let e={},n;for(let r of t.split(/\r?\n/)){let s=/^Last\s+(\S+)\s*[·-]\s*(\d+)\s+requests?\s*[·-]\s*(\d+)\s+sessions?\s*$/.exec(r.trim());if(s){n={requests:Number(s[2]),sessions:Number(s[3])},e[`window_${s[1].toLowerCase()}`]=n;continue}let o=/^\s+(\d+)%\s+of your usage\s+(.+?)\s*$/.exec(r);if(!o||!n)continue;let i=o[2].toLowerCase(),a=i.includes(">150k context")?"pct_high_context":i.includes("active for 8+ hours")?"pct_long_sessions":i.includes("subagent-heavy")?"pct_subagent_heavy":i.includes("ran in parallel")?"pct_parallel_sessions":void 0;a&&(n[a]=Number(o[1]))}return e}function OG(t,e){let n=t&&typeof t=="object"?t:void 0,r=e&&typeof e=="object"?e:void 0,s=!!(n?.limit||n?.used||n?.percent!==void 0);if(!s&&(!r||r.is_enabled===!1))return;let o=s&&n?.limit&&typeof n.limit=="object"?n.limit:{},i=s&&n?.used&&typeof n.used=="object"?n.used:{},a=g=>{let E=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isSafeInteger(E)&&E>=0&&E<=9?E:void 0},l=g=>{let E=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isFinite(E)?E:void 0},c=a(o.exponent??r?.decimal_places??2),d=a(i.exponent??r?.decimal_places??2),u=s?o.amount_minor:r?.monthly_limit,f=s?i.amount_minor:r?.used_credits,m=(g,E,y)=>E===void 0||y!==void 0&&y!=="USD"||l(g)===void 0?void 0:(l(g)/10**E).toFixed(2),p=vn(s?n?.percent:r?.utilization,"percent"),_=s?n?.spend_limit_reached??r?.spend_limit_reached:r?.spend_limit_reached,h={limit_usd:m(u,c,o.currency??r?.currency),used_usd:m(f,d,i.currency??r?.currency),remaining_fraction:p==null?void 0:Math.max(0,1-p),resets_at_iso:s?n?.resets_at:void 0,...typeof _=="boolean"?{reached:_}:{}};return Object.values(h).every(g=>g==null)?void 0:h}async function U0(t,e,n,r={}){try{let s=F0("claude",["-p","/usage"],{encoding:"utf8",timeout:Math.max(n,60)*1e3,input:"",env:j0(e),maxBuffer:16777216}),o=typeof s.stdout=="string"?s.stdout:"";dt(r,"claude_cli_print",o,[t.accessToken,t.refreshToken]);let i=LG(o);if(!i.length)return;let a=CG(o);return Pe("claude",Je.ok,{source:"claude_cli_print",account_id:null,plan_type:t.subscriptionType??t.rateLimitTier??null,ordinary_usage_allowed:null,buckets:i,...Object.keys(a).length?{characteristics:a}:{}})}catch{return}}async function W0({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s=D0(e);if(s.error==="not_claude_ai_subscriber")return Kt(Je.notApplicable,s.error,"no OAuth subscription credentials; API-key accounts have no subscription quota endpoint");if(s.error==="no_credentials_found")return Kt(Je.unavailable,"credentials_missing",`credentials file not found: ${ng(e)}`);if(s.error)return Kt(Je.expired,"oauth_token_expired_or_invalid",s.error);let o=s.oauth,i=Array.isArray(o.scopes)?o.scopes:[];if(i.length&&!i.includes(P0))return Kt(Je.notApplicable,"not_claude_ai_subscriber",`credential lacks the ${P0} scope required by the usage endpoint`);let a=new AbortController,l=setTimeout(()=>a.abort(),t*1e3),c,d;try{let g=!1,E=async()=>{try{o=await M0({...s,oauth:o},a.signal),g=!0}catch(w){let T=w instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(w.message)?w.message:"refresh_failed";if(T==="refresh_http_429")return Kt(Je.throttled,"rate_limited","Claude OAuth refresh was rate limited; try again later");if(T==="refresh_lock_stale")return Kt(Je.expired,"oauth_refresh_locked","a previous Claude credential refresh exited without releasing its lock; remove the stale .credentials.json.lmctl-refresh.lock directory before retrying");let S=T==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(T);return Kt(S?Je.expired:Je.unavailable,S?"oauth_token_expired_or_invalid":"oauth_refresh_failed",`Claude OAuth refresh failed (${T})${S?"; renew Claude login":"; try again later"}`)}};if(Yd(o)){let w=await E();if(w)return w}let y=()=>fetch(`${bG}/api/oauth/usage`,{headers:{Authorization:`Bearer ${o.accessToken}`,"anthropic-beta":IG,"Content-Type":"application/json","User-Agent":AG(e)},signal:a.signal});if(c=await y(),d=await c.text(),dt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status),c.status===401&&!g&&s.path&&o.refreshToken){let w=await E();if(w)return w;c=await y(),d=await c.text(),dt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status)}}catch(g){let E=await U0(o,e,t,{debug:n,onRawResponse:r});return E||Kt(Je.unavailable,"request_failed",`${g instanceof Error?g.name:"request failed"} (CLI fallback also unavailable)`)}finally{clearTimeout(l)}let u=(...g)=>Cr(Kt(...g),d,[String(o.accessToken??""),String(o.refreshToken??"")]);if(c.status===401)return u(Je.expired,"oauth_token_expired_or_invalid","HTTP 401 from usage endpoint");if(c.status===403)return u(Je.notApplicable,"not_claude_ai_subscriber","HTTP 403 from usage endpoint (account is not usage-eligible)");if(c.status===429){let g=NG(c.headers),E=await U0(o,e,t,{debug:n,onRawResponse:r});return E||u(Je.throttled,"rate_limited",`usage endpoint rate limited${g==null?"":`; retry after ${g}s`}`,"claude_oauth_api",g)}if(c.status!==200)return u(Je.unavailable,`http_${c.status}`,"usage endpoint returned an unexpected status");let f;try{f=JSON.parse(d)}catch{return Kt(Je.unavailable,"malformed_response","SyntaxError: malformed JSON")}if(!f||typeof f!="object"||Array.isArray(f))return Kt(Je.unavailable,"malformed_response","response was not an object");let m=f,p=Array.isArray(m.limits)?m.limits:[],_=p.length?p.flatMap(g=>{if(!g||typeof g!="object")return[];let E=g.kind,y=kG(E==="session"?"session":E),w=g.scope?.model?.display_name,T=E==="session"?"session":E==="weekly_all"?"week-all-models":`week-scoped-${w||E}`;return[Ze({bucket_id:T,group_name:E==="session"?"session":"weekly",window_type:y,used_fraction:vn(g.percent,"percent"),resets_at_iso:g.resets_at,raw_value:g.percent,raw_scale:"used_percent"})]}):["five_hour","seven_day"].flatMap(g=>{let E=m[g];return!E||typeof E!="object"?[]:[Ze({bucket_id:g==="five_hour"?"session":"week-all-models",group_name:g==="five_hour"?"session":"weekly",window_type:g==="five_hour"?"five_hour":"weekly",used_fraction:vn(E.utilization,"percent"),resets_at_iso:E.resets_at,raw_value:E.utilization,raw_scale:"used_percent"})]}),h=OG(m.spend,m.extra_usage);return Pe("claude",Je.ok,{source:"claude_oauth_api",account_id:null,plan_type:o.subscriptionType??o.rateLimitTier??null,ordinary_usage_allowed:null,buckets:_.sort((g,E)=>String(g.window_type).localeCompare(String(E.window_type))||String(g.bucket_id).localeCompare(String(E.bucket_id))),...h?{spend_control:h}:{}})}var bG,IG,P0,Je,xG,H0=C(()=>{"use strict";Sn();$0();Sn();bG="https://api.anthropic.com",IG="oauth-2025-04-20",P0="user:profile";Je={ok:"ok",unavailable:"provider_unavailable",expired:"auth_expired",notApplicable:"not_applicable",throttled:"reader_throttled"};xG=/^Current\s+(.+?):\s*(\d+(?:\.\d+)?)\s*%\s*used(?:\s*[·-]\s*resets\s*(.+?))?$/});import{randomUUID as q0}from"node:crypto";import{mkdirSync as DG,readFileSync as rg,realpathSync as MG,renameSync as $G,rmSync as sg,statSync as B0,writeFileSync as G0}from"node:fs";import{homedir as PG}from"node:os";import{join as og}from"node:path";import{setTimeout as UG}from"node:timers/promises";function Aa(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ag(t){if(t.CODEX_AUTH_PATH)return t.CODEX_AUTH_PATH;let e=t.CODEX_HOME||og(t.HOME||PG(),".codex");return og(e,"auth.json")}function ig(t){let e=Aa(JSON.parse(rg(t,"utf8")));if(!e)throw new Error("invalid credential document");return e}function V0(t){if(t.CODEX_ACCESS_TOKEN)return{tokens:{access_token:t.CODEX_ACCESS_TOKEN,account_id:t.CODEX_ACCOUNT_ID}};let e=ag(t);try{let n=Aa(ig(e).tokens);return typeof n?.access_token=="string"&&n.access_token?{tokens:n,path:MG(e)}:{error:"credentials_missing"}}catch(n){return{error:n.code==="ENOENT"?"credentials_missing":"credentials_unreadable"}}}function X0(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.id_token===e.id_token&&t.account_id===e.account_id}async function WG(t,e){let n=`${t}.lmctl-refresh.lock`,r=og(n,"owner.json"),s=q0();for(;;){e.throwIfAborted();try{DG(n,{mode:448});try{G0(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw sg(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(rg(r,"utf8")).token===s&&sg(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(rg(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-B0(n).mtimeMs>6e4}catch{try{i=Date.now()-B0(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await UG(50,void 0,{signal:e})}}}async function J0(t,e){if(!t.path||typeof t.tokens?.refresh_token!="string"||!t.tokens.refresh_token)throw new Error("no_refresh_token");let n=await WG(t.path,e);try{let r=ig(t.path),s=Aa(r.tokens);if(!s||typeof s.access_token!="string")throw new Error("credentials_changed");if(!X0(s,t.tokens)&&typeof s.access_token=="string")return s;if(typeof s.refresh_token!="string"||!s.refresh_token)throw new Error("no_refresh_token");let o=await fetch(FG,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:s.refresh_token,client_id:jG})});if(!o.ok)throw new Error(`refresh_http_${o.status}`);let i=Aa(await o.json());if(!i||typeof i.access_token!="string"||!/^\S+$/.test(i.access_token)||i.refresh_token!==void 0&&(typeof i.refresh_token!="string"||!/^\S+$/.test(i.refresh_token))||i.id_token!==void 0&&(typeof i.id_token!="string"||!/^\S+$/.test(i.id_token)))throw new Error("invalid_refresh_response");let a=ig(t.path),l=Aa(a.tokens);if(!l||!X0(s,l)){if(l&&typeof l.access_token=="string")return l;throw new Error("credentials_changed")}let c={...l,access_token:i.access_token,...i.refresh_token===void 0?{}:{refresh_token:i.refresh_token},...i.id_token===void 0?{}:{id_token:i.id_token}},d={...a,tokens:c,last_refresh:new Date().toISOString()},u=`${t.path}.${q0()}.tmp`;try{G0(u,JSON.stringify(d),{flag:"wx",mode:384}),$G(u,t.path)}finally{sg(u,{force:!0})}return c}finally{n()}}var FG,jG,K0=C(()=>{"use strict";FG="https://auth.openai.com/oauth/token",jG="app_EMoamEEZ73f0CkXaXp7hrann"});function bn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Y0(t){let e=typeof t=="number"?t:Number(t);if(!Number.isFinite(e)||e<=0)return"unknown";let n=e/60;return n>=240&&n<=360?"five_hour":n>=9e3&&n<=11500?"weekly":n>=38e3&&n<=46e3?"monthly":"unknown"}function z0(t){return t==="five_hour"?"5h":t==="weekly"?"weekly":t==="monthly"?"monthly":"window"}function XG(t){if(bn(t))return{has_credits:t.has_credits,unlimited:t.unlimited,balance:t.balance}}function qG(t){let e=[],n=bn(t.rate_limit)?t.rate_limit:{},r=typeof n.allowed=="boolean"?n.allowed:void 0,s=typeof n.limit_reached=="boolean"?n.limit_reached:void 0;for(let i of["primary_window","secondary_window"]){let a=bn(n[i])?n[i]:void 0;if(!a)continue;let l=Y0(a.limit_window_seconds);e.push(Ze({bucket_id:`codex-${z0(l)}`,group_name:"codex",window_type:l,used_fraction:vn(a.used_percent,"percent"),resets_at:a.reset_at,raw_value:a.used_percent,raw_scale:"used_percent",...r===void 0?{}:{allowed:r},...s===void 0?{}:{limit_reached:s}}))}let o=Array.isArray(t.additional_rate_limits)?t.additional_rate_limits:[];for(let i of o){if(!bn(i))continue;let a=bn(i.rate_limit)?i.rate_limit:{},l=typeof i.limit_name=="string"?i.limit_name:void 0,c=typeof i.metered_feature=="string"?i.metered_feature:void 0,d=c||l||"additional",u=typeof a.allowed=="boolean"?a.allowed:void 0,f=typeof a.limit_reached=="boolean"?a.limit_reached:void 0;for(let m of["primary_window","secondary_window"]){let p=bn(a[m])?a[m]:void 0;if(!p)continue;let _=Y0(p.limit_window_seconds);e.push(Ze({bucket_id:`${d}-${z0(_)}`,group_name:l||d,window_type:_,used_fraction:vn(p.used_percent,"percent"),resets_at:p.reset_at,raw_value:p.used_percent,raw_scale:"used_percent",...l===void 0?{}:{limit_name:l},...c===void 0?{}:{metered_feature:c},...u===void 0?{}:{allowed:u},...f===void 0?{}:{limit_reached:f}}))}}return e.sort((i,a)=>String(i.group_name??"").localeCompare(String(a.group_name??""))||String(i.bucket_id).localeCompare(String(a.bucket_id)))}function GG(t){let e=bn(t.rate_limit)?t.rate_limit:{},n=typeof e.allowed=="boolean"?e.allowed:void 0,r=bn(t.spend_control)?t.spend_control:void 0,s=bn(t.credits)?t.credits:void 0;return Pe("codex","ok",{source:"codex_http",account_id:t.account_id,plan_type:t.plan_type,...n===void 0?{}:{ordinary_usage_allowed:n},buckets:qG(t),...s?{credits:XG(s)}:{},...r?{spend_control:r}:{}})}async function Q0(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s}=t,o=V0(n),i=o.tokens;if(!i||typeof i.access_token!="string")return Pe("codex","provider_unavailable",{source:"codex_http",reason:"credentials_missing",detail:`no access_token in ${ag(n)} (or $CODEX_ACCESS_TOKEN)`});let a=new AbortController,l=setTimeout(()=>a.abort(),Math.ceil(e*1e3)),c=i.access_token,d=new Set([i.access_token,i.refresh_token,i.id_token].filter(u=>typeof u=="string"&&!!u));try{let u=typeof i.account_id=="string"?i.account_id:void 0,f=typeof i.refresh_token=="string"?i.refresh_token:void 0,m=typeof i.id_token=="string"?i.id_token:void 0,p="",_=()=>[...d],h=(S,I)=>Cr(Pe("codex",S,I),p,_()),g=!1,E=async()=>{if(!(g||!o.path||typeof i.refresh_token!="string"))try{let S=await J0({...o,tokens:{...i,refresh_token:f}},a.signal);typeof S.access_token=="string"&&(d.add(S.access_token),c=S.access_token),u=typeof S.account_id=="string"?S.account_id:u,typeof S.refresh_token=="string"&&(d.add(S.refresh_token),f=S.refresh_token),typeof S.id_token=="string"&&(d.add(S.id_token),m=S.id_token),g=!0;return}catch(S){let I=S instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(S.message)?S.message:"refresh_failed",A=I==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(I);return Pe("codex",A?"auth_expired":"provider_unavailable",{source:"codex_http",reason:A?"oauth_token_expired_or_invalid":"oauth_refresh_failed",detail:`Codex OAuth refresh failed (${I})${A?"; renew Codex login":"; try again later"}`})}},y=()=>{let S={Authorization:`Bearer ${c}`,"User-Agent":BG,"Content-Type":"application/json",Accept:"application/json"};u&&(S["ChatGPT-Account-Id"]=u);let I=(n.CODEX_BASE_URL||HG).replace(/\/$/,"");return fetch(`${I}/wham/usage`,{headers:S,signal:a.signal})},w=await y();if(p=await w.text(),dt({debug:r,onRawResponse:s},"codex_http",p,_(),w.status),w.status===401&&o.path&&f){let S=await E();if(S)return S;w=await y(),p=await w.text(),dt({debug:r,onRawResponse:s},"codex_http",p,_(),w.status)}if(w.status===401)return h("auth_expired",{source:"codex_http",reason:"oauth_token_expired_or_invalid",detail:"HTTP 401 from the codex usage endpoint"});if(w.status===429){let S=w.headers.get("retry-after"),I=S===null?void 0:Number.parseInt(S,10);return h("reader_throttled",{source:"codex_http",reason:"throttled",detail:"HTTP 429 from codex usage endpoint",...I!==void 0&&Number.isFinite(I)&&I>=0?{retry_after_seconds:I}:{}})}if(!w.ok)return h("provider_unavailable",{source:"codex_http",reason:`http_${w.status}`,detail:"codex usage endpoint returned an unexpected status"});let T;try{T=JSON.parse(p)}catch(S){return Pe("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:Lo(String(S),d)})}return bn(T)?GG(T):Pe("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:"response was not an object"})}catch(u){let f=u instanceof Error?`${u.name}: ${u.message}`:String(u);return Pe("codex","provider_unavailable",{source:"codex_http",reason:"http_request_failed",detail:Lo(f,d)})}finally{clearTimeout(l)}}var HG,BG,Z0=C(()=>{"use strict";Sn();K0();Sn();HG="https://chatgpt.com/backend-api",BG="codex-cli"});import{createHash as VG,randomUUID as JG}from"node:crypto";import{readFileSync as sR,openSync as KG,fsyncSync as YG,closeSync as zG,mkdirSync as eR,writeFileSync as oR,renameSync as QG,rmSync as ZG,rmdirSync as eV,statSync as lg,utimesSync as tV}from"node:fs";import{homedir as nV}from"node:os";import{basename as rV,dirname as sV,join as zd}from"node:path";import{setTimeout as iR}from"node:timers/promises";function iV(t){let e;try{e=sR(t,"utf8")}catch(s){if(s.code==="ENOENT")return{};throw new Error("config_unreadable")}let n={},r="other";for(let s of e.split(/\r?\n/)){let o=/^\s*\[providers\.(?:"managed:kimi-code"|'managed:kimi-code')(\.oauth)?\]\s*(?:#.*)?$/.exec(s);if(o){r=o[1]?"oauth.":"";continue}if(/^\s*\[/.test(s)){if(s.includes("managed:kimi-code"))throw new Error("config_format_unsupported");r="other";continue}if(r==="other")continue;if(/^\s*oauth\s*=/.test(s))throw new Error("config_format_unsupported");let i=/^\s*(base_url|oauth_host|storage|key)\s*=\s*("(?:[^"\\]|\\.)*"|'[^']*')\s*(?:#.*)?$/.exec(s);if(!i&&/^\s*(base_url|oauth_host|storage|key)\s*=/.test(s))throw new Error("config_malformed");if(i)try{n[r+i[1]]=i[2].startsWith('"')?JSON.parse(i[2]):i[2].slice(1,-1)}catch{throw new Error("config_malformed")}}return n}function Qd(t){let e;try{e=JSON.parse(sR(t,"utf8"))}catch(n){throw new Error(n.code==="ENOENT"?"credentials_missing":"credentials_malformed")}if(e&&typeof e=="object"&&e.access_token===""&&e.refresh_token==="")throw new Error("credentials_revoked");if(!e||typeof e!="object"||Array.isArray(e)||typeof e.access_token!="string"||!e.access_token.trim())throw new Error("credentials_malformed");return e}function aR(t){let e=t.KIMI_CODE_HOME??zd(t.HOME??nV(),".kimi-code"),n=iV(t.KIMI_CODE_CONFIG_PATH??zd(e,"config.toml")),r=t.KIMI_CODE_BASE_URL!==void 0||t.KIMI_CODE_OAUTH_HOST!==void 0||t.KIMI_OAUTH_HOST!==void 0,s=nR(t.KIMI_CODE_BASE_URL??n.base_url??tR),o=nR(t.KIMI_CODE_OAUTH_HOST??t.KIMI_OAUTH_HOST??(r?cg:n["oauth.oauth_host"]??cg)),i=s===tR&&o===cg?"kimi-code":`kimi-code-env-${VG("sha256").update(JSON.stringify({oauthHost:o,baseUrl:s})).digest("hex").slice(0,16)}`;if(!t.KIMI_CREDENTIALS_PATH&&!r&&n["oauth.key"]===`oauth/${i}`&&n["oauth.storage"]&&n["oauth.storage"]!=="file")throw new Error("credential_storage_unsupported");let a=t.KIMI_CREDENTIALS_PATH??zd(e,"credentials",`${i}.json`),l=Qd(a),c=a,d=rV(a,".json");return{home:e,path:c,lockTarget:zd(e,"oauth",d),baseUrl:s,oauthHost:o,token:l}}function Zd(t){if(typeof t.expires_at!="number")return!1;let e=typeof t.expires_in=="number"?t.expires_in:0;return t.expires_at-Date.now()/1e3<Math.max(300,e*.5)}function rR(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.expires_at===e.expires_at&&t.expires_in===e.expires_in}async function aV(t,e){eR(sV(t),{recursive:!0}),oR(t,"",{flag:"a",mode:384});let n=`${t}.lock`;for(;;){if(e.aborted)throw new Error("refresh_locked");try{eR(n);break}catch(i){if(i.code!=="EEXIST")throw new Error("refresh_lock_failed");try{if(Date.now()-lg(n).mtimeMs>5e3)throw new Error("refresh_lock_stale")}catch(a){if(a.message==="refresh_lock_stale")throw a}try{await iR(50,void 0,{signal:e})}catch{throw new Error("refresh_locked")}}}let r=lg(n),s=()=>{let i;try{i=lg(n)}catch{throw new Error("refresh_lock_lost")}if(i.ino!==r.ino||i.dev!==r.dev)throw new Error("refresh_lock_lost")},o=setInterval(()=>{try{s();let i=new Date;tV(n,i,i)}catch{}},1e3);return o.unref(),{assertOwned:s,release(){clearInterval(o);try{s(),eV(n)}catch{}}}}async function lR(t,e){if(typeof t.token.refresh_token!="string"||!t.token.refresh_token)throw new Error("no_refresh_token");let n=await aV(t.lockTarget,e);try{let r=Qd(t.path);if(!rR(r,t.token)&&!Zd(r))return r;if(typeof r.refresh_token!="string"||!r.refresh_token)throw new Error("no_refresh_token");let s;for(let u=0;u<3;u++){try{if(s=await fetch(`${t.oauthHost}/api/oauth/token`,{method:"POST",signal:e,headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json","User-Agent":"lmctl"},body:new URLSearchParams({client_id:oV,grant_type:"refresh_token",refresh_token:r.refresh_token})}),![429,500,502,503,504].includes(s.status)||u===2)break;await s.body?.cancel()}catch{if(e.aborted||u===2)throw new Error("refresh_request_failed")}await iR(1e3*2**u,void 0,{signal:e})}if(!s)throw new Error("refresh_request_failed");if(!s.ok){try{let u=Qd(t.path);if(u.refresh_token!==r.refresh_token)return u}catch{}throw new Error(`refresh_http_${s.status}`)}let o=await s.json(),i=Number(o?.expires_in);if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)||!Number.isFinite(i)||i<=0)throw new Error("invalid_refresh_response");let a=Math.floor(Date.now()/1e3)+i;if(!Number.isSafeInteger(a))throw new Error("invalid_refresh_response");n.assertOwned();let l=Qd(t.path);if(!rR(l,r)){if(!Zd(l))return l;throw new Error("credentials_changed")}let c={...l,access_token:o.access_token,refresh_token:o.refresh_token,expires_at:a,expires_in:i,...typeof o.scope=="string"?{scope:o.scope}:{},...typeof o.token_type=="string"?{token_type:o.token_type}:{}},d=`${t.path}.${JG()}.tmp`;try{let u=KG(d,"wx",384);try{oR(u,JSON.stringify(c,null,2)+`
|
|
2683
|
-
`),YG(u)}finally{zG(u)}n.assertOwned(),QG(d,t.path)}finally{ZG(d,{force:!0})}return c}finally{n.release()}}var tR,cg,oV,nR,cR=C(()=>{"use strict";tR="https://api.kimi.com/coding/v1",cg="https://auth.kimi.com",oV="17e5f671-d194-4dfb-9706-5516cb48c098",nR=t=>t.trim().replace(/\/+$/,"")});function dR(t){let e=i=>{if(typeof i!="number"&&typeof i!="string"||typeof i=="string"&&i.trim()==="")return;let a=Number(i);return Number.isFinite(a)&&a>=0?a:void 0},n=e(t.limit),r=e(t.used),s=e(t.remaining);if(n===void 0||n<=0||r===void 0&&(s===void 0||s>n))return;let o=r??n-s;return{used:o,limit:n,remaining:Math.max(0,n-o)}}async function uR({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s;try{s=aR(e)}catch(_){let h=_ instanceof Error&&/^(credentials_missing|credentials_malformed|credentials_revoked|config_unreadable|config_malformed|config_format_unsupported|credential_storage_unsupported)$/.test(_.message)?_.message:"credentials_unreadable";return xe("kimi",h==="credentials_revoked"?"auth_expired":"provider_unavailable",h,h==="credentials_revoked"?"Kimi login was revoked; run kimi login":h.replaceAll("_"," "),"kimi_http")}let o=s.token,i=new AbortController,a=setTimeout(()=>i.abort(),t*1e3),l,c;try{let _=!1,h=async()=>{o=await lR({...s,token:o},i.signal),_=!0};Zd(o)&&await h();let g=()=>fetch(`${s.baseUrl}/usages`,{headers:{Authorization:`Bearer ${o.access_token}`,Accept:"application/json"},signal:i.signal});l=await g(),c=await l.text(),dt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status),l.status===401&&!_&&o.refresh_token&&(await h(),l=await g(),c=await l.text(),dt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status))}catch(_){let h=_ instanceof Error&&/^(no_refresh_token|credentials_changed|credentials_revoked|invalid_refresh_response|refresh_locked|refresh_lock_stale|refresh_lock_failed|refresh_lock_lost|refresh_request_failed|refresh_http_\d+)$/.test(_.message)?_.message:"request_failed",g=h==="credentials_revoked"||h==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(h),E=h==="refresh_lock_stale"?"Kimi refresh lock is stale; run the native Kimi CLI to recover its lock, or verify no refresh is active before removing the .lock directory":g?`Kimi credential renewal failed (${h}); run kimi login`:`Kimi quota request failed (${h})`;return xe("kimi",g?"auth_expired":"provider_unavailable",h,E,"kimi_http")}finally{clearTimeout(a)}let d=(_,h,g)=>Cr(xe("kimi",_,h,h,"kimi_http",[],g),c,[o.access_token]);if(l.status===401)return d("auth_expired","HTTP 401 from Kimi usage endpoint");if(l.status===403)return d("not_applicable","HTTP 403 from Kimi usage endpoint");if(l.status===429){let _=Kd(l.headers);return d("reader_throttled","HTTP 429 from Kimi usage endpoint",_)}if(l.status!==200)return d("provider_unavailable",`HTTP ${l.status} from Kimi usage endpoint`);let u;try{u=JSON.parse(c)}catch{return xe("kimi","provider_unavailable","malformed_response","SyntaxError: malformed JSON")}if(!u||typeof u!="object")return xe("kimi","provider_unavailable","malformed_response","response was not an object");let f=[],m=new Set;function p(_){let h=String(_.bucket_id),g=h,E=2;for(;m.has(h);)h=`${g}-${E}`,E++;m.add(h),_.bucket_id=h,f.push(Ze(_))}if(Array.isArray(u.limits))for(let _ of u.limits){if(!_||typeof _!="object")continue;let h=_.window,g=_.detail;if(!h||typeof h!="object"||!g||typeof g!="object")continue;let E=0;if(h.timeUnit==="TIME_UNIT_MINUTE")E=Number(h.duration);else if(h.timeUnit==="TIME_UNIT_HOUR")E=Number(h.duration)*60;else if(h.timeUnit==="TIME_UNIT_DAY")E=Number(h.duration)*1440;else if(h.timeUnit==="TIME_UNIT_WEEK")E=Number(h.duration)*10080;else if(h.timeUnit==="TIME_UNIT_MONTH")E=Number(h.duration)*43200;else continue;let y=S0(E),w="window";y==="five_hour"&&(w="5h"),y==="weekly"&&(w="weekly"),y==="monthly"&&(w="monthly");let T=dR(g);if(!T)continue;let{used:S,limit:I,remaining:A}=T;p({bucket_id:`kimi-${w}`,window_type:y,used_fraction:Be(S/I),remaining_fraction:Be(A/I),resets_at_iso:g.resetTime,raw_value:S,raw_scale:"count"})}if(u.usage&&typeof u.usage=="object"){let _=dR(u.usage);_&&p({bucket_id:"kimi-weekly",window_type:"weekly",used_fraction:Be(_.used/_.limit),remaining_fraction:Be(_.remaining/_.limit),resets_at_iso:u.usage.resetTime,raw_value:_.used,raw_scale:"count"})}if(u.usages&&typeof u.usages=="object"){let _=[{key:"limit_5h",id:"kimi-5h",type:"five_hour"},{key:"limit_7d",id:"kimi-weekly",type:"weekly"},{key:"limit_month_total",id:"kimi-monthly",type:"monthly"},{key:"limit_month_code",id:"kimi-monthly-code",type:"monthly"}];for(let{key:h,id:g,type:E}of _){let y=u.usages[h];if(!y||typeof y!="object"||y.used_ratio==null||y.used_ratio===""||typeof y.used_ratio=="boolean")continue;let w=Number(y.used_ratio);!Number.isFinite(w)||w<0||m.has(g)||(m.add(g),f.push(Ze({bucket_id:g,window_type:E,used_fraction:Be(w),resets_at_iso:typeof y.reset_time=="string"&&y.reset_time?y.reset_time:null,raw_value:w,raw_scale:"ratio"})))}}return Pe("kimi","ok",{source:"kimi_http",buckets:f})}var fR=C(()=>{"use strict";Sn();cR();Sn()});function Na(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function eu(t){if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t=="string"&&t.trim()!==""){let e=Number(t);if(Number.isFinite(e))return e}}async function mR(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s,fetchFn:o=fetch}=t,i=n.OLLAMA_API_KEY?.trim();if(!i)return xe("ollama-cloud","provider_unavailable","credentials_missing","$OLLAMA_API_KEY is missing","ollama_http");let a="https://ollama.com/api/balance",l=new AbortController,c=setTimeout(()=>l.abort(),Math.ceil(e*1e3)),d,u="";try{d=await o(a,{method:"GET",redirect:"error",headers:{Authorization:`Bearer ${i}`,Accept:"application/json"},signal:l.signal}),u=await d.text();let h=u;try{h=JSON.stringify(JSON.parse(u))}catch{}dt({debug:r,onRawResponse:s},"ollama_http",h,[i],d.status)}catch(h){let g=h instanceof Error&&h.name==="AbortError",E=g?`Ollama quota request timed out after ${e}s`:`Ollama quota request failed (${h instanceof Error?h.message:String(h)})`;return xe("ollama-cloud","provider_unavailable",g?"request_timeout":"request_failed",E,"ollama_http",[i])}finally{clearTimeout(c)}let f=(h,g,E)=>Cr(xe("ollama-cloud",h,g,g,"ollama_http",[i],E),u,[i]);if(d.status===401)return f("auth_expired","HTTP 401 from Ollama balance endpoint");if(d.status===403)return f("not_applicable","HTTP 403 from Ollama balance endpoint");if(d.status===429){let h=Kd(d.headers);return f("reader_throttled","HTTP 429 from Ollama balance endpoint",h)}if(d.status!==200)return f("provider_unavailable",`HTTP ${d.status} from Ollama balance endpoint`);let m;try{m=JSON.parse(u)}catch{return xe("ollama-cloud","provider_unavailable","malformed_response","SyntaxError: malformed JSON","ollama_http")}if(!Na(m))return xe("ollama-cloud","provider_unavailable","malformed_response","response was not an object","ollama_http");let p=[];if(Na(m.included)){let h=m.included,g=eu(h.allowance_usd),E=eu(h.balance_usd),y=Na(h.period)?h.period:void 0,w=typeof y?.from=="string"?Date.parse(y.from):NaN,T=typeof y?.until=="string"?Date.parse(y.until):NaN,S=Number.isFinite(w)&&Number.isFinite(T)&&T>w,I=S?new Date(T).toISOString():null;if(g!==void 0&&g>0&&E!==void 0){let A=Math.max(0,g-E);p.push({...Ze({bucket_id:"ollama-cloud-monthly",group_name:"ollama-cloud",window_type:"monthly",used_fraction:Be(A/g),remaining_fraction:Be(E/g),resets_at_iso:I,is_exhausted:E<=0,raw_value:E,raw_scale:"balance_usd"}),window_start_iso:S?new Date(Math.floor(w/1e3)*1e3).toISOString().replace(".000Z","Z"):null})}if(g===void 0&&E===void 0)for(let[A,N,x]of[["session","five_hour","5h"],["weekly","weekly","weekly"]]){let b=h[A];if(!Na(b))continue;let v=eu(b.remaining_percent);v===void 0||v<0||v>100||p.push(Ze({bucket_id:`ollama-cloud-${x}`,group_name:"ollama-cloud",window_type:N,remaining_fraction:v/100,resets_at_iso:typeof b.resets_at=="string"?b.resets_at:null,raw_value:v,raw_scale:"remaining_percent"}))}}let _;if(Na(m.purchased)){let h=m.purchased,g=eu(h.balance_usd);g!==void 0&&(_={has_credits:g>0,balance:g})}return p.length===0&&_===void 0?xe("ollama-cloud","provider_unavailable","malformed_response","response has no usable included allowance or purchased balance","ollama_http"):Pe("ollama-cloud","ok",{source:"ollama_http",buckets:p,..._?{credits:_}:{}})}var pR=C(()=>{"use strict";Sn()});async function hR(t={}){let e=t.targets??t.providers??["all"];if(!Array.isArray(e)||e.length===0||e.some(u=>typeof u!="string"))return{status:"error",error:"providers must be a non-empty list of provider names",readings:[]};for(let u of e)if(!tu.includes(u))return{status:"error",error:`unknown provider: ${u} (valid targets: ${tu.join(", ")})`,readings:[]};let n=t.timeoutSeconds??lV;if(!Number.isFinite(n)||n<=0)return{status:"error",error:"timeoutSeconds must be a positive finite number",readings:[]};let r=t.env??process.env,s=["codex","agy","claude","kimi"];(r.OLLAMA_API_KEY?.trim()||e.includes("ollama-cloud"))&&s.push("ollama-cloud");let o=new Set(e.includes("all")?s:e);t.progress?.(`querying ${e.join(" ")} live (timeout ${n}s per provider) ...`);let a=Object.entries({codex:Q0,agy:N0,claude:W0,kimi:uR,"ollama-cloud":mR}).filter(([u])=>o.has(u)).map(async([,u])=>{let f=[],m=await u({timeoutSeconds:n,env:r,...t.debug?{debug:t.debug}:{},...t.includeRaw?{onRawResponse:_=>f.push(_)}:{}}),p=t.includeRaw?{...m,raw_responses:f}:m;return p&&t.onReading?.(p),p}),l=await Promise.allSettled(a),c=l.find(u=>u.status==="rejected");return c?{status:"error",error:String(c.reason),readings:[]}:{status:"ok",readings:l.filter(u=>u.status==="fulfilled").map(u=>u.value).filter(Boolean)}}var tu,lV,_R=C(()=>{"use strict";R0();H0();Z0();fR();pR();tu=["all","codex","agy","claude","kimi","ollama-cloud"],lV=15});var wR={};fe(wR,{runRatelimit:()=>hV});function dg(t){return typeof t=="object"&&t!==null}function cV(t){return typeof t=="number"&&t>0&&t<.005?`${(t*100).toFixed(1)}%`:(0,Xe.formatPercent)(typeof t=="number"?t:null)}function dV(t,e){let n=typeof e.bucket_id=="string"&&e.bucket_id!==""?e.bucket_id:"unknown-bucket";return n==="session"?n="5h":n==="week-all-models"?n="weekly":n.startsWith("week-scoped-")&&(n=`weekly-${n.slice(12)}`),t!==""&&!n.startsWith(`${t}-`)&&(n=`${t}-${n}`),(0,Xe.escapeCell)(n)}function fV(t,e){let n="unknown",r=null,s,o=null;if(typeof e.resets_at_iso=="string"&&e.resets_at_iso!==""){let c=Date.parse(e.resets_at_iso);if(o=Number.isFinite(c)?c-Date.now():null,o!==null){if(Math.abs(o)<1e3?n="now":o>0?n=`in ${(0,Xe.formatDuration)(o,{maxUnit:"d",style:"compact"})}`:n=`${(0,Xe.formatDuration)(-o,{maxUnit:"d",style:"compact"})} ago`,typeof e.window_start_iso=="string"){let d=Date.parse(e.window_start_iso);Number.isFinite(d)&&c>d&&(s=c-d)}else(t!=="ollama-cloud"||e.window_type!=="monthly")&&(s=uV[typeof e.window_type=="string"?e.window_type:""]);s!==void 0&&(r=Math.min(1,Math.max(0,1-o/s)))}}r!==null&&(n=`${(0,Xe.formatBar)(r)} ${n}`);let i="";if(r!==null&&r>0&&s!==void 0&&o!==null&&o>0&&typeof e.used_fraction=="number"&&Number.isFinite(e.used_fraction)){let c=e.used_fraction;if(c<=r){let d=Math.max(0,1-c/r);i=`unused +${(0,Xe.formatPercent)(d)}`}else{let d=r*s,u=d>0?(1-c)/c*d:0,f=Math.max(0,o-u);i=`needing -${(0,Xe.formatDuration)(f,{maxUnit:"d",style:"compact"})}`}}let a=[];e.is_exhausted===!0&&a.push("[EXHAUSTED]"),e.allowed===!1&&a.push("allowed=false"),e.limit_reached===!0&&a.push("limit_reached");let l=[dV(t,e),`${(0,Xe.formatBar)(typeof e.used_fraction=="number"?e.used_fraction:null)} ${cV(e.used_fraction)}`,n];return(i!==""||a.length>0)&&l.push(i),a.length>0&&l.push(a.join(" ")),l}function mV(t){let e=typeof t.provider=="string"&&t.provider!==""?t.provider:"unknown",n=typeof t.status=="string"?t.status:"unknown",r=typeof t.source=="string"&&t.source!==""?t.source:"unknown source",s=typeof t.reason=="string"?t.reason:"",o=`${e}: ${n} (${r})`;n!=="ok"&&typeof t.provider_message=="string"&&t.provider_message.trim()?o=`${e}: ${(0,Xe.escapeCell)(t.provider_message)} (${r})`:n==="auth_expired"?(o=`${e}: unavailable (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n==="provider_unavailable"&&ER.has(s)?(o=`${e}: not installed/configured (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n!=="ok"&&(o+=` -- ${s!==""?s:"no reason given"}`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`),n==="provider_unavailable"&&s!=="oauth_refresh_failed"&&!/^(credentials_|config_|credential_storage_|refresh_)/.test(s)&&(o+=` (${e} server-side, not lmctl \u2014 try again later)`));let i=typeof t.plan_type=="string"?t.plan_type.trim():"";i&&!["?","unknown","null","n/a"].includes(i.toLowerCase())&&(o+=` (${(0,Xe.escapeCell)(i)})`);let a=typeof t.provider=="string"?t.provider:"",l=Array.isArray(t.buckets)?t.buckets.filter(dg).map(d=>fV(a,d)):[],c=[];if(dg(t.credits)){let d=t.credits,u=[];typeof d.has_credits=="boolean"&&u.push(`has_credits=${d.has_credits}`),d.unlimited===!0&&u.push("unlimited"),d.balance!==void 0&&d.balance!==null&&u.push(`balance=${String(d.balance)}`);let f=a==="ollama-cloud"?"purchased credits (USD)":"credits";c.push(` ${f}: ${u.length>0?u.join(" "):"present"}`)}if(dg(t.spend_control)){let d=t.spend_control,u=` spend control: reached=${d.reached===!0}`;d.used_usd!==void 0&&d.used_usd!==null&&(u+=` used=$${String(d.used_usd)}`),d.limit_usd!==void 0&&d.limit_usd!==null&&(u+=` limit=$${String(d.limit_usd)}`),d.individual_limit!==void 0&&d.individual_limit!==null&&(u+=` individual_limit=${String(d.individual_limit)}`),c.push(u)}return{head:o,bucketRows:l,footers:c}}function pV(t){let e=mV(t),n=[e.head];if(e.bucketRows.length>0){let r=["LIMIT","USED","RESET TIME","OVERSTOCK"],s=(0,Xe.measureColumns)([{rows:[],headers:r},e.bucketRows]);n.push((0,Xe.renderGrid)(e.bucketRows,{widths:s,margin:2,align:["left","left","left"],headers:r}))}return n.push(...e.footers),n.join(`
|
|
2681
|
+
`});function Be(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);return Number.isFinite(e)?Math.round(Math.min(1,Math.max(0,e))*1e6)/1e6:null}function vn(t,e){if(t==null||typeof t=="boolean")return null;let n=Number(t);return Be(e==="percent"?n/100:n)}function T0(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);if(!Number.isFinite(e))return null;try{return new Date(Math.trunc(e)*1e3).toISOString().replace(".000Z","Z")}catch{return null}}function v0(t){if(typeof t!="string"||t.trim()==="")return null;let e=Date.parse(t);return Number.isFinite(e)?Math.floor(e/1e3):null}function S0(t){let e=Number(t);return Number.isFinite(e)?e===300||e>=240&&e<=360?"five_hour":e===10080||e>=9e3&&e<=11500?"weekly":e===43200||e===44640||e>=38e3&&e<=46e3?"monthly":"unknown":"unknown"}function b0(t){let e=String(t??"").trim().toLowerCase().replace(/-/g,"_").split("_").filter(Boolean);for(let n of[e[0],e.at(-1)]){if(n?.startsWith("5h")||n?.startsWith("five")||n==="session")return"five_hour";if(n?.startsWith("7d")||n?.startsWith("seven")||n?.startsWith("week"))return"weekly";if(n?.startsWith("30d")||n?.startsWith("month"))return"monthly"}return"unknown"}function Lo(t,e=[]){let n=t==null?"":String(t);for(let r of e)typeof r=="string"&&r.length>=4&&(n=n.replaceAll(r,"***REDACTED***"));for(let r of Kq)n=n.replace(r,"***REDACTED***");return n}function Ze(t){let e=Be(t.used_fraction),n=Be(t.remaining_fraction),r=t.resets_at==null?v0(t.resets_at_iso):Number(t.resets_at),s=t.resets_at_iso==null?T0(r):T0(v0(t.resets_at_iso)),o={bucket_id:t.bucket_id,...t.group_name!=null?{group_name:t.group_name}:{},window_type:t.window_type??"unknown",used_fraction:e??(n===null?null:Be(1-n)),remaining_fraction:n??(e===null?null:Be(1-e)),resets_at:r==null||!Number.isFinite(r)?null:Math.trunc(r),resets_at_iso:s,is_exhausted:t.is_exhausted??(n!==null?n<=0:e!==null?e>=1:null)};for(let i of["raw_value","raw_scale","limit_name","metered_feature","allowed","limit_reached"])t[i]!=null&&(o[i]=t[i]);return o}function Pe(t,e,n={}){let r={$schema:Jq,provider:t,status:e,source:n.source??null,read_at:n.read_at??Math.floor(Date.now()/1e3),account_id:n.account_id??null,plan_type:n.plan_type??null,ordinary_usage_allowed:n.ordinary_usage_allowed??null,buckets:n.buckets??[]};for(let s of["credits","spend_control","characteristics","reason","detail","retry_after_seconds"])n[s]!=null&&(r[s]=n[s]);return r}function xe(t,e,n,r,s,o=[],i){return Pe(t,e,{source:s??null,reason:n,...r==null?{}:{detail:Lo(r,o)},...i==null?{}:{retry_after_seconds:i}})}function Kd(t){let e=t.get("retry-after");if(e===null)return null;let n=Number.parseFloat(e);return Number.isFinite(n)&&n>=0?Math.trunc(n):null}function dt(t,e,n,r=[],s){if(!t.debug&&!t.onRawResponse)return;let o=Lo(n,[...r].filter(i=>typeof i=="string")).replace(/("(?:access[_-]?token|refresh[_-]?token|authorization|api[_-]?key|password)"\s*:\s*")[^"\r\n]*(")/gi,"$1***REDACTED***$2");t.onRawResponse?.({source:e,...s===void 0?{}:{http_status:s},text:o}),t.debug?.(`[debug] ${e}${s===void 0?"":` HTTP ${s}`} raw response:
|
|
2682
|
+
${o}`)}function Cr(t,e,n=[]){let r;try{let o=JSON.parse(e);r=typeof o?.error=="string"?o.error:o?.error?.message??o?.message??o?.detail}catch{/^\s*[<{[]/.test(e)||(r=e.trim())}if(typeof r!="string"||!r.trim())return t;let s=Lo(r,n);return{...t,detail:s,provider_message:s}}var Jq,Kq,Sn=C(()=>{"use strict";Jq="https://lmctl.com/schemas/lmratelimit-v1.json";Kq=[/sk-ant-[A-Za-z0-9_-]{4,}/g,/sk-[A-Za-z0-9_-]{16,}/g,/\bbearer\s+[A-Za-z0-9._-]{8,}/gi,/\boat01[-_][A-Za-z0-9_-]{8,}/g,/\bcsrf[-_][A-Za-z0-9_-]{4,}/gi,/\b(?:csrf[-_]?token|x-codeium-csrf-token)\s*[:=]\s*['"]?[A-Za-z0-9._-]{4,}/gi]});import{spawnSync as Yq}from"node:child_process";import{readdirSync as zq,readFileSync as Qq}from"node:fs";import{join as Zq}from"node:path";function lG(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("ANTIGRAVITY")))}function cG(t){let e=t.trim().toLowerCase(),n={"gemini models":"gemini","claude and gpt models":"3p",gemini:"gemini","3p models":"3p","3p":"3p"};return n[e]?n[e]:e.replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function dG(t){let e=t.toLowerCase();return e.includes("weekly")?"weekly":e.includes("five hour")||e.includes("5-hour")||e.includes("5 hour")?"five_hour":e.includes("monthly")||e.includes("month")?"monthly":null}function uG(t){let e={weekly:"weekly",five_hour:"5h",monthly:"monthly"},n=[];for(let r of t.split(/\r?\n/)){let s=r.trim().split(" ").map(l=>l.trim());if(s.length<3||!s[0]||!s[1])continue;let o=dG(s[1]);if(!o)continue;let i=Number(s[2].replace(/%$/,"").trim());if(!Number.isFinite(i))continue;let a=Be(i/100);n.push(Ze({bucket_id:`${cG(s[0])}-${e[o]}`,group_name:s[0],window_type:o,used_fraction:a===null?null:Be(1-a),remaining_fraction:a,resets_at_iso:s[3]||null,raw_value:i,raw_scale:"remaining_percent"}))}return n.sort((r,s)=>String(r.group_name??"").localeCompare(String(s.group_name??""))||String(r.bucket_id??"").localeCompare(String(s.bucket_id??"")))}function ka(t,e,n){return xe("agy","provider_unavailable",t,e,"agy_cli_print")}function fG(t,e,n={}){try{let r=oG(Math.max(t,60)*1e3,lG(e));if(dt(n,"agy_cli_print",r.stdout??"",[e.ANTIGRAVITY_CSRF_TOKEN]),r.error?.code==="ENOENT")return ka("agy_not_found","the agy CLI is not on PATH",t);if(r.error?.code==="ETIMEDOUT")return ka("cli_timeout","agy -p /usage did not finish in time",t);if(r.error)return ka("cli_failed",r.error.message,t);let s=uG(r.stdout??"");return s.length===0?ka("cli_unparseable",`exit ${r.status??1}; no buckets parsed from CLI output`,t):Pe("agy","ok",{source:"agy_cli_print",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:s})}catch(r){return ka("cli_failed",r instanceof Error?r.message:String(r),t)}}function A0(t){if(!t||typeof t!="string")return null;let e=t.trim();if(!e||e.includes("@")||e.includes("/")||e.includes("\\")||e.includes("?")||e.includes("#")||e.includes("://")||/\s/.test(e))return null;let n;try{n=new URL(`http://${e}`)}catch{return null}if(n.username||n.password||n.pathname!=="/"||n.search||n.hash)return null;let r=n.hostname.toLowerCase();if(!(r==="localhost"||r==="127.0.0.1"||r==="[::1]"||r==="::1")||!n.port)return null;let o=Number(n.port);return!Number.isInteger(o)||o<1||o>65535||n.port!==String(o)?null:`${r==="::1"||r==="[::1]"?"[::1]":r}:${o}`}function mG(t){let e=[],n=new Set,r=(s,o,i)=>{if(!s||!o)return;let a=A0(s);!a||n.has(`${a}\0${o}`)||(n.add(`${a}\0${o}`),e.push([a,o,i]))};r(t[I0],t[k0],-1);try{for(let s of zq("/proc"))if(/^\d+$/.test(s))try{let o={};for(let i of Qq(Zq("/proc",s,"environ")).toString("utf8").split("\0")){let a=i.indexOf("=");a>0&&(o[i.slice(0,a)]=i.slice(a+1))}r(o[I0],o[k0],Number(s))}catch{}}catch{}return e}function pG(t){if(typeof t!="object"||t===null)return null;let e=t.response;if(typeof e!="object"||e===null)return null;let n=e.groups;if(!Array.isArray(n))return null;let r=[];for(let s of n){if(typeof s!="object"||s===null)continue;let o=s,i=typeof o.displayName=="string"?o.displayName:null;if(Array.isArray(o.buckets))for(let a of o.buckets){if(typeof a!="object"||a===null)continue;let l=a,c=vn(l.remainingFraction,"fraction");r.push(Ze({bucket_id:l.bucketId??l.displayName??"unknown",group_name:i,window_type:b0(l.window),used_fraction:c===null?null:Be(1-c),remaining_fraction:c,resets_at_iso:l.resetTime??null,raw_value:l.remainingFraction??null,raw_scale:"remaining_fraction"}))}}return r.length===0?null:(r.sort((s,o)=>String(s.group_name??"").localeCompare(String(o.group_name??""))||String(s.bucket_id??"").localeCompare(String(o.bucket_id??""))),Pe("agy","ok",{source:"agy_connect_rpc",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:r}))}async function hG(t,e,n={}){try{let s=aG(e).map(([a,l,c])=>[A0(a),l,c]).filter(a=>a[0]!==null);if(s.length===0)return xe("agy","provider_unavailable","no_active_session","no live agy process exposed ANTIGRAVITY_LS_ADDRESS/ANTIGRAVITY_CSRF_TOKEN","agy_connect_rpc");let o=[],i=Date.now()+t*1e3;for(let[a,l,c]of s){let d=i-Date.now();if(d<=0){o.push("overall connect deadline exceeded");break}try{let u=await iG(`http://${a}${eG}`,{"Content-Type":"application/json","Connect-Protocol-Version":"1","x-codeium-csrf-token":l},d);if(dt(n,"agy_connect_rpc",u.body,[l],u.status),u.status===200){let f;try{f=JSON.parse(u.body)}catch{o.push(`pid=${c}: unparseable response`);continue}let m=pG(f);if(m)return m;o.push(`pid=${c}: response had no quota groups`)}else u.status===401||u.status===403?o.push(`pid=${c}: HTTP ${u.status} unauthorized`):o.push(`pid=${c}: HTTP ${u.status}`)}catch(u){o.push(`pid=${c}: ${u instanceof Error?u.message:String(u)}`)}}return xe("agy","provider_unavailable","no_active_session",`all candidate language servers failed: ${o.slice(0,5).join("; ")}`,"agy_connect_rpc",s.map(([,a])=>a))}catch(r){return xe("agy","provider_unavailable","connect_failed",r instanceof Error?r.message:String(r),"agy_connect_rpc")}}async function N0(t){let e=await hG(t.timeoutSeconds,t.env,t);if(e.status==="ok")return e;let n=fG(t.timeoutSeconds,t.env,t);return n.status==="ok"?n:xe("agy","provider_unavailable","cli_and_language_server_unavailable",`cli: ${String(n.reason??n.status)} (${String(n.detail??"no detail")}); connect: ${String(e.reason??e.status)} (${String(e.detail??"no detail")})`,"agy_cli_print")}var I0,k0,eG,tG,nG,rG,sG,oG,iG,aG,R0=C(()=>{"use strict";Sn();Sn();I0="ANTIGRAVITY_LS_ADDRESS",k0="ANTIGRAVITY_CSRF_TOKEN",eG="/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary",tG=["-p","/usage"],nG=(t,e)=>{let n=Yq("agy",tG,{encoding:"utf8",timeout:t,maxBuffer:16777216,env:e,stdio:["ignore","pipe","ignore"]});return{status:n.status,stdout:typeof n.stdout=="string"?n.stdout:"",error:n.error}},rG=async(t,e,n)=>{let r=await fetch(t,{method:"POST",headers:e,body:"{}",signal:AbortSignal.timeout(n),redirect:"error"});return{status:r.status,body:await r.text()}},sG=t=>mG(t),oG=nG,iG=rG,aG=sG});import{randomUUID as C0}from"node:crypto";import{mkdirSync as _G,readFileSync as z_,realpathSync as gG,renameSync as yG,rmSync as Q_,statSync as x0,writeFileSync as O0}from"node:fs";import{homedir as EG}from"node:os";import{join as Z_}from"node:path";import{setTimeout as wG}from"node:timers/promises";function ng(t){return Z_(t.CLAUDE_CONFIG_DIR??Z_(t.HOME??EG(),".claude"),".credentials.json")}function eg(t){let e=JSON.parse(z_(t,"utf8"));if(!e||typeof e!="object"||Array.isArray(e))throw new Error("invalid credential document");return e}function tg(t){let e=t.claudeAiOauth;return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function D0(t){if(t.CLAUDE_CODE_OAUTH_TOKEN)return{oauth:{accessToken:t.CLAUDE_CODE_OAUTH_TOKEN}};let e=ng(t);try{let n=tg(eg(e));return typeof n?.accessToken=="string"&&n.accessToken?{oauth:n,path:gG(e)}:{error:"not_claude_ai_subscriber"}}catch(n){return n.code==="ENOENT"?{error:t.ANTHROPIC_API_KEY?"not_claude_ai_subscriber":"no_credentials_found"}:{error:"credentials_unreadable"}}}function Yd(t){return typeof t.expiresAt=="number"&&Date.now()+SG>=t.expiresAt}function L0(t,e){return t.accessToken===e.accessToken&&t.refreshToken===e.refreshToken}async function bG(t,e){let n=`${t}.lmctl-refresh.lock`,r=Z_(n,"owner.json"),s=C0();for(;;){e.throwIfAborted();try{_G(n,{mode:448});try{O0(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw Q_(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(z_(r,"utf8")).token===s&&Q_(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(z_(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-x0(n).mtimeMs>6e4}catch{try{i=Date.now()-x0(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await wG(50,void 0,{signal:e})}}}async function M0(t,e){if(!t.path||typeof t.oauth?.refreshToken!="string"||!t.oauth.refreshToken)throw new Error("no_refresh_token");let n=await bG(t.path,e);try{let r=tg(eg(t.path));if(!r||typeof r.accessToken!="string")throw new Error("credentials_changed");if(!L0(r,t.oauth)&&!Yd(r))return r;if(typeof r.refreshToken!="string"||!r.refreshToken)throw new Error("no_refresh_token");let s=await fetch(vG,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:r.refreshToken,client_id:TG})});if(!s.ok)throw new Error(`refresh_http_${s.status}`);let o=await s.json();if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.expires_in!="number"||!Number.isFinite(o.expires_in)||o.expires_in<=0||o.refresh_token!==void 0&&(typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)))throw new Error("invalid_refresh_response");let i=Math.floor(Date.now()+o.expires_in*1e3);if(!Number.isSafeInteger(i)||i<=Date.now())throw new Error("invalid_refresh_response");let a=eg(t.path),l=tg(a);if(!l||!L0(r,l)){if(l&&typeof l.accessToken=="string"&&!Yd(l))return l;throw new Error("credentials_changed")}let c={...l,accessToken:o.access_token,refreshToken:o.refresh_token??r.refreshToken,expiresAt:i,...typeof o.scope=="string"?{scopes:o.scope.split(/\s+/).filter(Boolean)}:{}},d=`${t.path}.${C0()}.tmp`;try{O0(d,JSON.stringify({...a,claudeAiOauth:c}),{flag:"wx",mode:384}),yG(d,t.path)}finally{Q_(d,{force:!0})}return c}finally{n()}}var TG,vG,SG,$0=C(()=>{"use strict";TG="9d1c250a-e61b-44d9-88ed-5944d1962f5e",vG="https://console.anthropic.com/v1/oauth/token",SG=3e5});import{spawnSync as F0}from"node:child_process";function AG(t){let e=String(t??"").toLowerCase();return e.includes("session")||e.includes("five")||e.includes("5h")?"five_hour":e.includes("week")||e.includes("seven")||e.includes("7d")?"weekly":e.includes("month")||e.includes("30d")?"monthly":"unknown"}function j0(t){return Object.fromEntries(Object.entries(t).filter(([e])=>e!=="CLAUDECODE"))}function NG(t){try{let e=F0("claude",["--version"],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],env:j0(t)}),n=typeof e.stdout=="string"?e.stdout.trim().split(/\s+/)[0]:"";if(n)return`claude-code/${n}`}catch{}return"claude-code/unknown"}function Kt(t,e,n,r="claude_oauth_api",s){return xe("claude",t,e,n,r,void 0,s)}function RG(t){let e=t.get("retry-after");if(!e)return;let n=Number.parseInt(e,10);return Number.isFinite(n)?n:void 0}function xG(t){if(!t)return;let e=/^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)?(?:\s*\(([^)]+)\))?$/i.exec(t.trim());if(!e)return;let n=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"].indexOf(e[1].slice(0,3).toLowerCase());if(n<0)return;let r=Number(e[3]),s=Number(e[4]??0);(e[5]??"").toLowerCase()==="pm"&&r!==12&&(r+=12),(e[5]??"").toLowerCase()==="am"&&r===12&&(r=0);let o=new Date(Date.UTC(new Date().getUTCFullYear(),n,Number(e[2]),r,s));return Number.isFinite(o.getTime())?Math.floor(o.getTime()/1e3):void 0}function CG(t){let e=[];for(let n of t.split(/\r?\n/)){let r=LG.exec(n.trim());if(!r)continue;let s=r[1].trim(),i=s.toLowerCase()==="session",a=/\(([^)]+)\)/.exec(s)?.[1]?.trim()??s,l=i?"session":a.toLowerCase()==="all models"?"week-all-models":`week-scoped-${a}`,c=i?"five_hour":"weekly";e.push(Ze({bucket_id:l,group_name:i?"session":"weekly",window_type:c,used_fraction:vn(Number(r[2]),"percent"),raw_value:Number(r[2]),raw_scale:"used_percent",resets_at:xG(r[3])}))}return e.sort((n,r)=>String(n.window_type).localeCompare(String(r.window_type))||String(n.bucket_id).localeCompare(String(r.bucket_id)))}function OG(t){let e={},n;for(let r of t.split(/\r?\n/)){let s=/^Last\s+(\S+)\s*[·-]\s*(\d+)\s+requests?\s*[·-]\s*(\d+)\s+sessions?\s*$/.exec(r.trim());if(s){n={requests:Number(s[2]),sessions:Number(s[3])},e[`window_${s[1].toLowerCase()}`]=n;continue}let o=/^\s+(\d+)%\s+of your usage\s+(.+?)\s*$/.exec(r);if(!o||!n)continue;let i=o[2].toLowerCase(),a=i.includes(">150k context")?"pct_high_context":i.includes("active for 8+ hours")?"pct_long_sessions":i.includes("subagent-heavy")?"pct_subagent_heavy":i.includes("ran in parallel")?"pct_parallel_sessions":void 0;a&&(n[a]=Number(o[1]))}return e}function DG(t,e){let n=t&&typeof t=="object"?t:void 0,r=e&&typeof e=="object"?e:void 0,s=!!(n?.limit||n?.used||n?.percent!==void 0);if(!s&&(!r||r.is_enabled===!1))return;let o=s&&n?.limit&&typeof n.limit=="object"?n.limit:{},i=s&&n?.used&&typeof n.used=="object"?n.used:{},a=g=>{let E=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isSafeInteger(E)&&E>=0&&E<=9?E:void 0},l=g=>{let E=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isFinite(E)?E:void 0},c=a(o.exponent??r?.decimal_places??2),d=a(i.exponent??r?.decimal_places??2),u=s?o.amount_minor:r?.monthly_limit,f=s?i.amount_minor:r?.used_credits,m=(g,E,y)=>E===void 0||y!==void 0&&y!=="USD"||l(g)===void 0?void 0:(l(g)/10**E).toFixed(2),p=vn(s?n?.percent:r?.utilization,"percent"),_=s?n?.spend_limit_reached??r?.spend_limit_reached:r?.spend_limit_reached,h={limit_usd:m(u,c,o.currency??r?.currency),used_usd:m(f,d,i.currency??r?.currency),remaining_fraction:p==null?void 0:Math.max(0,1-p),resets_at_iso:s?n?.resets_at:void 0,...typeof _=="boolean"?{reached:_}:{}};return Object.values(h).every(g=>g==null)?void 0:h}async function U0(t,e,n,r={}){try{let s=F0("claude",["-p","/usage"],{encoding:"utf8",timeout:Math.max(n,60)*1e3,input:"",env:j0(e),maxBuffer:16777216}),o=typeof s.stdout=="string"?s.stdout:"";dt(r,"claude_cli_print",o,[t.accessToken,t.refreshToken]);let i=CG(o);if(!i.length)return;let a=OG(o);return Pe("claude",Je.ok,{source:"claude_cli_print",account_id:null,plan_type:t.subscriptionType??t.rateLimitTier??null,ordinary_usage_allowed:null,buckets:i,...Object.keys(a).length?{characteristics:a}:{}})}catch{return}}async function W0({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s=D0(e);if(s.error==="not_claude_ai_subscriber")return Kt(Je.notApplicable,s.error,"no OAuth subscription credentials; API-key accounts have no subscription quota endpoint");if(s.error==="no_credentials_found")return Kt(Je.unavailable,"credentials_missing",`credentials file not found: ${ng(e)}`);if(s.error)return Kt(Je.expired,"oauth_token_expired_or_invalid",s.error);let o=s.oauth,i=Array.isArray(o.scopes)?o.scopes:[];if(i.length&&!i.includes(P0))return Kt(Je.notApplicable,"not_claude_ai_subscriber",`credential lacks the ${P0} scope required by the usage endpoint`);let a=new AbortController,l=setTimeout(()=>a.abort(),t*1e3),c,d;try{let g=!1,E=async()=>{try{o=await M0({...s,oauth:o},a.signal),g=!0}catch(w){let T=w instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(w.message)?w.message:"refresh_failed";if(T==="refresh_http_429")return Kt(Je.throttled,"rate_limited","Claude OAuth refresh was rate limited; try again later");if(T==="refresh_lock_stale")return Kt(Je.expired,"oauth_refresh_locked","a previous Claude credential refresh exited without releasing its lock; remove the stale .credentials.json.lmctl-refresh.lock directory before retrying");let S=T==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(T);return Kt(S?Je.expired:Je.unavailable,S?"oauth_token_expired_or_invalid":"oauth_refresh_failed",`Claude OAuth refresh failed (${T})${S?"; renew Claude login":"; try again later"}`)}};if(Yd(o)){let w=await E();if(w)return w}let y=()=>fetch(`${IG}/api/oauth/usage`,{headers:{Authorization:`Bearer ${o.accessToken}`,"anthropic-beta":kG,"Content-Type":"application/json","User-Agent":NG(e)},signal:a.signal});if(c=await y(),d=await c.text(),dt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status),c.status===401&&!g&&s.path&&o.refreshToken){let w=await E();if(w)return w;c=await y(),d=await c.text(),dt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status)}}catch(g){let E=await U0(o,e,t,{debug:n,onRawResponse:r});return E||Kt(Je.unavailable,"request_failed",`${g instanceof Error?g.name:"request failed"} (CLI fallback also unavailable)`)}finally{clearTimeout(l)}let u=(...g)=>Cr(Kt(...g),d,[String(o.accessToken??""),String(o.refreshToken??"")]);if(c.status===401)return u(Je.expired,"oauth_token_expired_or_invalid","HTTP 401 from usage endpoint");if(c.status===403)return u(Je.notApplicable,"not_claude_ai_subscriber","HTTP 403 from usage endpoint (account is not usage-eligible)");if(c.status===429){let g=RG(c.headers),E=await U0(o,e,t,{debug:n,onRawResponse:r});return E||u(Je.throttled,"rate_limited",`usage endpoint rate limited${g==null?"":`; retry after ${g}s`}`,"claude_oauth_api",g)}if(c.status!==200)return u(Je.unavailable,`http_${c.status}`,"usage endpoint returned an unexpected status");let f;try{f=JSON.parse(d)}catch{return Kt(Je.unavailable,"malformed_response","SyntaxError: malformed JSON")}if(!f||typeof f!="object"||Array.isArray(f))return Kt(Je.unavailable,"malformed_response","response was not an object");let m=f,p=Array.isArray(m.limits)?m.limits:[],_=p.length?p.flatMap(g=>{if(!g||typeof g!="object")return[];let E=g.kind,y=AG(E==="session"?"session":E),w=g.scope?.model?.display_name,T=E==="session"?"session":E==="weekly_all"?"week-all-models":`week-scoped-${w||E}`;return[Ze({bucket_id:T,group_name:E==="session"?"session":"weekly",window_type:y,used_fraction:vn(g.percent,"percent"),resets_at_iso:g.resets_at,raw_value:g.percent,raw_scale:"used_percent"})]}):["five_hour","seven_day"].flatMap(g=>{let E=m[g];return!E||typeof E!="object"?[]:[Ze({bucket_id:g==="five_hour"?"session":"week-all-models",group_name:g==="five_hour"?"session":"weekly",window_type:g==="five_hour"?"five_hour":"weekly",used_fraction:vn(E.utilization,"percent"),resets_at_iso:E.resets_at,raw_value:E.utilization,raw_scale:"used_percent"})]}),h=DG(m.spend,m.extra_usage);return Pe("claude",Je.ok,{source:"claude_oauth_api",account_id:null,plan_type:o.subscriptionType??o.rateLimitTier??null,ordinary_usage_allowed:null,buckets:_.sort((g,E)=>String(g.window_type).localeCompare(String(E.window_type))||String(g.bucket_id).localeCompare(String(E.bucket_id))),...h?{spend_control:h}:{}})}var IG,kG,P0,Je,LG,H0=C(()=>{"use strict";Sn();$0();Sn();IG="https://api.anthropic.com",kG="oauth-2025-04-20",P0="user:profile";Je={ok:"ok",unavailable:"provider_unavailable",expired:"auth_expired",notApplicable:"not_applicable",throttled:"reader_throttled"};LG=/^Current\s+(.+?):\s*(\d+(?:\.\d+)?)\s*%\s*used(?:\s*[·-]\s*resets\s*(.+?))?$/});import{randomUUID as q0}from"node:crypto";import{mkdirSync as MG,readFileSync as rg,realpathSync as $G,renameSync as PG,rmSync as sg,statSync as B0,writeFileSync as G0}from"node:fs";import{homedir as UG}from"node:os";import{join as og}from"node:path";import{setTimeout as FG}from"node:timers/promises";function Aa(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ag(t){if(t.CODEX_AUTH_PATH)return t.CODEX_AUTH_PATH;let e=t.CODEX_HOME||og(t.HOME||UG(),".codex");return og(e,"auth.json")}function ig(t){let e=Aa(JSON.parse(rg(t,"utf8")));if(!e)throw new Error("invalid credential document");return e}function V0(t){if(t.CODEX_ACCESS_TOKEN)return{tokens:{access_token:t.CODEX_ACCESS_TOKEN,account_id:t.CODEX_ACCOUNT_ID}};let e=ag(t);try{let n=Aa(ig(e).tokens);return typeof n?.access_token=="string"&&n.access_token?{tokens:n,path:$G(e)}:{error:"credentials_missing"}}catch(n){return{error:n.code==="ENOENT"?"credentials_missing":"credentials_unreadable"}}}function X0(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.id_token===e.id_token&&t.account_id===e.account_id}async function HG(t,e){let n=`${t}.lmctl-refresh.lock`,r=og(n,"owner.json"),s=q0();for(;;){e.throwIfAborted();try{MG(n,{mode:448});try{G0(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw sg(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(rg(r,"utf8")).token===s&&sg(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(rg(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-B0(n).mtimeMs>6e4}catch{try{i=Date.now()-B0(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await FG(50,void 0,{signal:e})}}}async function J0(t,e){if(!t.path||typeof t.tokens?.refresh_token!="string"||!t.tokens.refresh_token)throw new Error("no_refresh_token");let n=await HG(t.path,e);try{let r=ig(t.path),s=Aa(r.tokens);if(!s||typeof s.access_token!="string")throw new Error("credentials_changed");if(!X0(s,t.tokens)&&typeof s.access_token=="string")return s;if(typeof s.refresh_token!="string"||!s.refresh_token)throw new Error("no_refresh_token");let o=await fetch(jG,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:s.refresh_token,client_id:WG})});if(!o.ok)throw new Error(`refresh_http_${o.status}`);let i=Aa(await o.json());if(!i||typeof i.access_token!="string"||!/^\S+$/.test(i.access_token)||i.refresh_token!==void 0&&(typeof i.refresh_token!="string"||!/^\S+$/.test(i.refresh_token))||i.id_token!==void 0&&(typeof i.id_token!="string"||!/^\S+$/.test(i.id_token)))throw new Error("invalid_refresh_response");let a=ig(t.path),l=Aa(a.tokens);if(!l||!X0(s,l)){if(l&&typeof l.access_token=="string")return l;throw new Error("credentials_changed")}let c={...l,access_token:i.access_token,...i.refresh_token===void 0?{}:{refresh_token:i.refresh_token},...i.id_token===void 0?{}:{id_token:i.id_token}},d={...a,tokens:c,last_refresh:new Date().toISOString()},u=`${t.path}.${q0()}.tmp`;try{G0(u,JSON.stringify(d),{flag:"wx",mode:384}),PG(u,t.path)}finally{sg(u,{force:!0})}return c}finally{n()}}var jG,WG,K0=C(()=>{"use strict";jG="https://auth.openai.com/oauth/token",WG="app_EMoamEEZ73f0CkXaXp7hrann"});function bn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Y0(t){let e=typeof t=="number"?t:Number(t);if(!Number.isFinite(e)||e<=0)return"unknown";let n=e/60;return n>=240&&n<=360?"five_hour":n>=9e3&&n<=11500?"weekly":n>=38e3&&n<=46e3?"monthly":"unknown"}function z0(t){return t==="five_hour"?"5h":t==="weekly"?"weekly":t==="monthly"?"monthly":"window"}function qG(t){if(bn(t))return{has_credits:t.has_credits,unlimited:t.unlimited,balance:t.balance}}function GG(t){let e=[],n=bn(t.rate_limit)?t.rate_limit:{},r=typeof n.allowed=="boolean"?n.allowed:void 0,s=typeof n.limit_reached=="boolean"?n.limit_reached:void 0;for(let i of["primary_window","secondary_window"]){let a=bn(n[i])?n[i]:void 0;if(!a)continue;let l=Y0(a.limit_window_seconds);e.push(Ze({bucket_id:`codex-${z0(l)}`,group_name:"codex",window_type:l,used_fraction:vn(a.used_percent,"percent"),resets_at:a.reset_at,raw_value:a.used_percent,raw_scale:"used_percent",...r===void 0?{}:{allowed:r},...s===void 0?{}:{limit_reached:s}}))}let o=Array.isArray(t.additional_rate_limits)?t.additional_rate_limits:[];for(let i of o){if(!bn(i))continue;let a=bn(i.rate_limit)?i.rate_limit:{},l=typeof i.limit_name=="string"?i.limit_name:void 0,c=typeof i.metered_feature=="string"?i.metered_feature:void 0,d=c||l||"additional",u=typeof a.allowed=="boolean"?a.allowed:void 0,f=typeof a.limit_reached=="boolean"?a.limit_reached:void 0;for(let m of["primary_window","secondary_window"]){let p=bn(a[m])?a[m]:void 0;if(!p)continue;let _=Y0(p.limit_window_seconds);e.push(Ze({bucket_id:`${d}-${z0(_)}`,group_name:l||d,window_type:_,used_fraction:vn(p.used_percent,"percent"),resets_at:p.reset_at,raw_value:p.used_percent,raw_scale:"used_percent",...l===void 0?{}:{limit_name:l},...c===void 0?{}:{metered_feature:c},...u===void 0?{}:{allowed:u},...f===void 0?{}:{limit_reached:f}}))}}return e.sort((i,a)=>String(i.group_name??"").localeCompare(String(a.group_name??""))||String(i.bucket_id).localeCompare(String(a.bucket_id)))}function VG(t){let e=bn(t.rate_limit)?t.rate_limit:{},n=typeof e.allowed=="boolean"?e.allowed:void 0,r=bn(t.spend_control)?t.spend_control:void 0,s=bn(t.credits)?t.credits:void 0;return Pe("codex","ok",{source:"codex_http",account_id:t.account_id,plan_type:t.plan_type,...n===void 0?{}:{ordinary_usage_allowed:n},buckets:GG(t),...s?{credits:qG(s)}:{},...r?{spend_control:r}:{}})}async function Q0(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s}=t,o=V0(n),i=o.tokens;if(!i||typeof i.access_token!="string")return Pe("codex","provider_unavailable",{source:"codex_http",reason:"credentials_missing",detail:`no access_token in ${ag(n)} (or $CODEX_ACCESS_TOKEN)`});let a=new AbortController,l=setTimeout(()=>a.abort(),Math.ceil(e*1e3)),c=i.access_token,d=new Set([i.access_token,i.refresh_token,i.id_token].filter(u=>typeof u=="string"&&!!u));try{let u=typeof i.account_id=="string"?i.account_id:void 0,f=typeof i.refresh_token=="string"?i.refresh_token:void 0,m=typeof i.id_token=="string"?i.id_token:void 0,p="",_=()=>[...d],h=(S,I)=>Cr(Pe("codex",S,I),p,_()),g=!1,E=async()=>{if(!(g||!o.path||typeof i.refresh_token!="string"))try{let S=await J0({...o,tokens:{...i,refresh_token:f}},a.signal);typeof S.access_token=="string"&&(d.add(S.access_token),c=S.access_token),u=typeof S.account_id=="string"?S.account_id:u,typeof S.refresh_token=="string"&&(d.add(S.refresh_token),f=S.refresh_token),typeof S.id_token=="string"&&(d.add(S.id_token),m=S.id_token),g=!0;return}catch(S){let I=S instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(S.message)?S.message:"refresh_failed",A=I==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(I);return Pe("codex",A?"auth_expired":"provider_unavailable",{source:"codex_http",reason:A?"oauth_token_expired_or_invalid":"oauth_refresh_failed",detail:`Codex OAuth refresh failed (${I})${A?"; renew Codex login":"; try again later"}`})}},y=()=>{let S={Authorization:`Bearer ${c}`,"User-Agent":XG,"Content-Type":"application/json",Accept:"application/json"};u&&(S["ChatGPT-Account-Id"]=u);let I=(n.CODEX_BASE_URL||BG).replace(/\/$/,"");return fetch(`${I}/wham/usage`,{headers:S,signal:a.signal})},w=await y();if(p=await w.text(),dt({debug:r,onRawResponse:s},"codex_http",p,_(),w.status),w.status===401&&o.path&&f){let S=await E();if(S)return S;w=await y(),p=await w.text(),dt({debug:r,onRawResponse:s},"codex_http",p,_(),w.status)}if(w.status===401)return h("auth_expired",{source:"codex_http",reason:"oauth_token_expired_or_invalid",detail:"HTTP 401 from the codex usage endpoint"});if(w.status===429){let S=w.headers.get("retry-after"),I=S===null?void 0:Number.parseInt(S,10);return h("reader_throttled",{source:"codex_http",reason:"throttled",detail:"HTTP 429 from codex usage endpoint",...I!==void 0&&Number.isFinite(I)&&I>=0?{retry_after_seconds:I}:{}})}if(!w.ok)return h("provider_unavailable",{source:"codex_http",reason:`http_${w.status}`,detail:"codex usage endpoint returned an unexpected status"});let T;try{T=JSON.parse(p)}catch(S){return Pe("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:Lo(String(S),d)})}return bn(T)?VG(T):Pe("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:"response was not an object"})}catch(u){let f=u instanceof Error?`${u.name}: ${u.message}`:String(u);return Pe("codex","provider_unavailable",{source:"codex_http",reason:"http_request_failed",detail:Lo(f,d)})}finally{clearTimeout(l)}}var BG,XG,Z0=C(()=>{"use strict";Sn();K0();Sn();BG="https://chatgpt.com/backend-api",XG="codex-cli"});import{createHash as JG,randomUUID as KG}from"node:crypto";import{readFileSync as sR,openSync as YG,fsyncSync as zG,closeSync as QG,mkdirSync as eR,writeFileSync as oR,renameSync as ZG,rmSync as eV,rmdirSync as tV,statSync as lg,utimesSync as nV}from"node:fs";import{homedir as rV}from"node:os";import{basename as sV,dirname as oV,join as zd}from"node:path";import{setTimeout as iR}from"node:timers/promises";function aV(t){let e;try{e=sR(t,"utf8")}catch(s){if(s.code==="ENOENT")return{};throw new Error("config_unreadable")}let n={},r="other";for(let s of e.split(/\r?\n/)){let o=/^\s*\[providers\.(?:"managed:kimi-code"|'managed:kimi-code')(\.oauth)?\]\s*(?:#.*)?$/.exec(s);if(o){r=o[1]?"oauth.":"";continue}if(/^\s*\[/.test(s)){if(s.includes("managed:kimi-code"))throw new Error("config_format_unsupported");r="other";continue}if(r==="other")continue;if(/^\s*oauth\s*=/.test(s))throw new Error("config_format_unsupported");let i=/^\s*(base_url|oauth_host|storage|key)\s*=\s*("(?:[^"\\]|\\.)*"|'[^']*')\s*(?:#.*)?$/.exec(s);if(!i&&/^\s*(base_url|oauth_host|storage|key)\s*=/.test(s))throw new Error("config_malformed");if(i)try{n[r+i[1]]=i[2].startsWith('"')?JSON.parse(i[2]):i[2].slice(1,-1)}catch{throw new Error("config_malformed")}}return n}function Qd(t){let e;try{e=JSON.parse(sR(t,"utf8"))}catch(n){throw new Error(n.code==="ENOENT"?"credentials_missing":"credentials_malformed")}if(e&&typeof e=="object"&&e.access_token===""&&e.refresh_token==="")throw new Error("credentials_revoked");if(!e||typeof e!="object"||Array.isArray(e)||typeof e.access_token!="string"||!e.access_token.trim())throw new Error("credentials_malformed");return e}function aR(t){let e=t.KIMI_CODE_HOME??zd(t.HOME??rV(),".kimi-code"),n=aV(t.KIMI_CODE_CONFIG_PATH??zd(e,"config.toml")),r=t.KIMI_CODE_BASE_URL!==void 0||t.KIMI_CODE_OAUTH_HOST!==void 0||t.KIMI_OAUTH_HOST!==void 0,s=nR(t.KIMI_CODE_BASE_URL??n.base_url??tR),o=nR(t.KIMI_CODE_OAUTH_HOST??t.KIMI_OAUTH_HOST??(r?cg:n["oauth.oauth_host"]??cg)),i=s===tR&&o===cg?"kimi-code":`kimi-code-env-${JG("sha256").update(JSON.stringify({oauthHost:o,baseUrl:s})).digest("hex").slice(0,16)}`;if(!t.KIMI_CREDENTIALS_PATH&&!r&&n["oauth.key"]===`oauth/${i}`&&n["oauth.storage"]&&n["oauth.storage"]!=="file")throw new Error("credential_storage_unsupported");let a=t.KIMI_CREDENTIALS_PATH??zd(e,"credentials",`${i}.json`),l=Qd(a),c=a,d=sV(a,".json");return{home:e,path:c,lockTarget:zd(e,"oauth",d),baseUrl:s,oauthHost:o,token:l}}function Zd(t){if(typeof t.expires_at!="number")return!1;let e=typeof t.expires_in=="number"?t.expires_in:0;return t.expires_at-Date.now()/1e3<Math.max(300,e*.5)}function rR(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.expires_at===e.expires_at&&t.expires_in===e.expires_in}async function lV(t,e){eR(oV(t),{recursive:!0}),oR(t,"",{flag:"a",mode:384});let n=`${t}.lock`;for(;;){if(e.aborted)throw new Error("refresh_locked");try{eR(n);break}catch(i){if(i.code!=="EEXIST")throw new Error("refresh_lock_failed");try{if(Date.now()-lg(n).mtimeMs>5e3)throw new Error("refresh_lock_stale")}catch(a){if(a.message==="refresh_lock_stale")throw a}try{await iR(50,void 0,{signal:e})}catch{throw new Error("refresh_locked")}}}let r=lg(n),s=()=>{let i;try{i=lg(n)}catch{throw new Error("refresh_lock_lost")}if(i.ino!==r.ino||i.dev!==r.dev)throw new Error("refresh_lock_lost")},o=setInterval(()=>{try{s();let i=new Date;nV(n,i,i)}catch{}},1e3);return o.unref(),{assertOwned:s,release(){clearInterval(o);try{s(),tV(n)}catch{}}}}async function lR(t,e){if(typeof t.token.refresh_token!="string"||!t.token.refresh_token)throw new Error("no_refresh_token");let n=await lV(t.lockTarget,e);try{let r=Qd(t.path);if(!rR(r,t.token)&&!Zd(r))return r;if(typeof r.refresh_token!="string"||!r.refresh_token)throw new Error("no_refresh_token");let s;for(let u=0;u<3;u++){try{if(s=await fetch(`${t.oauthHost}/api/oauth/token`,{method:"POST",signal:e,headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json","User-Agent":"lmctl"},body:new URLSearchParams({client_id:iV,grant_type:"refresh_token",refresh_token:r.refresh_token})}),![429,500,502,503,504].includes(s.status)||u===2)break;await s.body?.cancel()}catch{if(e.aborted||u===2)throw new Error("refresh_request_failed")}await iR(1e3*2**u,void 0,{signal:e})}if(!s)throw new Error("refresh_request_failed");if(!s.ok){try{let u=Qd(t.path);if(u.refresh_token!==r.refresh_token)return u}catch{}throw new Error(`refresh_http_${s.status}`)}let o=await s.json(),i=Number(o?.expires_in);if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)||!Number.isFinite(i)||i<=0)throw new Error("invalid_refresh_response");let a=Math.floor(Date.now()/1e3)+i;if(!Number.isSafeInteger(a))throw new Error("invalid_refresh_response");n.assertOwned();let l=Qd(t.path);if(!rR(l,r)){if(!Zd(l))return l;throw new Error("credentials_changed")}let c={...l,access_token:o.access_token,refresh_token:o.refresh_token,expires_at:a,expires_in:i,...typeof o.scope=="string"?{scope:o.scope}:{},...typeof o.token_type=="string"?{token_type:o.token_type}:{}},d=`${t.path}.${KG()}.tmp`;try{let u=YG(d,"wx",384);try{oR(u,JSON.stringify(c,null,2)+`
|
|
2683
|
+
`),zG(u)}finally{QG(u)}n.assertOwned(),ZG(d,t.path)}finally{eV(d,{force:!0})}return c}finally{n.release()}}var tR,cg,iV,nR,cR=C(()=>{"use strict";tR="https://api.kimi.com/coding/v1",cg="https://auth.kimi.com",iV="17e5f671-d194-4dfb-9706-5516cb48c098",nR=t=>t.trim().replace(/\/+$/,"")});function dR(t){let e=i=>{if(typeof i!="number"&&typeof i!="string"||typeof i=="string"&&i.trim()==="")return;let a=Number(i);return Number.isFinite(a)&&a>=0?a:void 0},n=e(t.limit),r=e(t.used),s=e(t.remaining);if(n===void 0||n<=0||r===void 0&&(s===void 0||s>n))return;let o=r??n-s;return{used:o,limit:n,remaining:Math.max(0,n-o)}}async function uR({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s;try{s=aR(e)}catch(_){let h=_ instanceof Error&&/^(credentials_missing|credentials_malformed|credentials_revoked|config_unreadable|config_malformed|config_format_unsupported|credential_storage_unsupported)$/.test(_.message)?_.message:"credentials_unreadable";return xe("kimi",h==="credentials_revoked"?"auth_expired":"provider_unavailable",h,h==="credentials_revoked"?"Kimi login was revoked; run kimi login":h.replaceAll("_"," "),"kimi_http")}let o=s.token,i=new AbortController,a=setTimeout(()=>i.abort(),t*1e3),l,c;try{let _=!1,h=async()=>{o=await lR({...s,token:o},i.signal),_=!0};Zd(o)&&await h();let g=()=>fetch(`${s.baseUrl}/usages`,{headers:{Authorization:`Bearer ${o.access_token}`,Accept:"application/json"},signal:i.signal});l=await g(),c=await l.text(),dt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status),l.status===401&&!_&&o.refresh_token&&(await h(),l=await g(),c=await l.text(),dt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status))}catch(_){let h=_ instanceof Error&&/^(no_refresh_token|credentials_changed|credentials_revoked|invalid_refresh_response|refresh_locked|refresh_lock_stale|refresh_lock_failed|refresh_lock_lost|refresh_request_failed|refresh_http_\d+)$/.test(_.message)?_.message:"request_failed",g=h==="credentials_revoked"||h==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(h),E=h==="refresh_lock_stale"?"Kimi refresh lock is stale; run the native Kimi CLI to recover its lock, or verify no refresh is active before removing the .lock directory":g?`Kimi credential renewal failed (${h}); run kimi login`:`Kimi quota request failed (${h})`;return xe("kimi",g?"auth_expired":"provider_unavailable",h,E,"kimi_http")}finally{clearTimeout(a)}let d=(_,h,g)=>Cr(xe("kimi",_,h,h,"kimi_http",[],g),c,[o.access_token]);if(l.status===401)return d("auth_expired","HTTP 401 from Kimi usage endpoint");if(l.status===403)return d("not_applicable","HTTP 403 from Kimi usage endpoint");if(l.status===429){let _=Kd(l.headers);return d("reader_throttled","HTTP 429 from Kimi usage endpoint",_)}if(l.status!==200)return d("provider_unavailable",`HTTP ${l.status} from Kimi usage endpoint`);let u;try{u=JSON.parse(c)}catch{return xe("kimi","provider_unavailable","malformed_response","SyntaxError: malformed JSON")}if(!u||typeof u!="object")return xe("kimi","provider_unavailable","malformed_response","response was not an object");let f=[],m=new Set;function p(_){let h=String(_.bucket_id),g=h,E=2;for(;m.has(h);)h=`${g}-${E}`,E++;m.add(h),_.bucket_id=h,f.push(Ze(_))}if(Array.isArray(u.limits))for(let _ of u.limits){if(!_||typeof _!="object")continue;let h=_.window,g=_.detail;if(!h||typeof h!="object"||!g||typeof g!="object")continue;let E=0;if(h.timeUnit==="TIME_UNIT_MINUTE")E=Number(h.duration);else if(h.timeUnit==="TIME_UNIT_HOUR")E=Number(h.duration)*60;else if(h.timeUnit==="TIME_UNIT_DAY")E=Number(h.duration)*1440;else if(h.timeUnit==="TIME_UNIT_WEEK")E=Number(h.duration)*10080;else if(h.timeUnit==="TIME_UNIT_MONTH")E=Number(h.duration)*43200;else continue;let y=S0(E),w="window";y==="five_hour"&&(w="5h"),y==="weekly"&&(w="weekly"),y==="monthly"&&(w="monthly");let T=dR(g);if(!T)continue;let{used:S,limit:I,remaining:A}=T;p({bucket_id:`kimi-${w}`,window_type:y,used_fraction:Be(S/I),remaining_fraction:Be(A/I),resets_at_iso:g.resetTime,raw_value:S,raw_scale:"count"})}if(u.usage&&typeof u.usage=="object"){let _=dR(u.usage);_&&p({bucket_id:"kimi-weekly",window_type:"weekly",used_fraction:Be(_.used/_.limit),remaining_fraction:Be(_.remaining/_.limit),resets_at_iso:u.usage.resetTime,raw_value:_.used,raw_scale:"count"})}if(u.usages&&typeof u.usages=="object"){let _=[{key:"limit_5h",id:"kimi-5h",type:"five_hour"},{key:"limit_7d",id:"kimi-weekly",type:"weekly"},{key:"limit_month_total",id:"kimi-monthly",type:"monthly"},{key:"limit_month_code",id:"kimi-monthly-code",type:"monthly"}];for(let{key:h,id:g,type:E}of _){let y=u.usages[h];if(!y||typeof y!="object"||y.used_ratio==null||y.used_ratio===""||typeof y.used_ratio=="boolean")continue;let w=Number(y.used_ratio);!Number.isFinite(w)||w<0||m.has(g)||(m.add(g),f.push(Ze({bucket_id:g,window_type:E,used_fraction:Be(w),resets_at_iso:typeof y.reset_time=="string"&&y.reset_time?y.reset_time:null,raw_value:w,raw_scale:"ratio"})))}}return Pe("kimi","ok",{source:"kimi_http",buckets:f})}var fR=C(()=>{"use strict";Sn();cR();Sn()});function Na(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function eu(t){if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t=="string"&&t.trim()!==""){let e=Number(t);if(Number.isFinite(e))return e}}async function mR(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s,fetchFn:o=fetch}=t,i=n.OLLAMA_API_KEY?.trim();if(!i)return xe("ollama-cloud","provider_unavailable","credentials_missing","$OLLAMA_API_KEY is missing","ollama_http");let a="https://ollama.com/api/balance",l=new AbortController,c=setTimeout(()=>l.abort(),Math.ceil(e*1e3)),d,u="";try{d=await o(a,{method:"GET",redirect:"error",headers:{Authorization:`Bearer ${i}`,Accept:"application/json"},signal:l.signal}),u=await d.text();let h=u;try{h=JSON.stringify(JSON.parse(u))}catch{}dt({debug:r,onRawResponse:s},"ollama_http",h,[i],d.status)}catch(h){let g=h instanceof Error&&h.name==="AbortError",E=g?`Ollama quota request timed out after ${e}s`:`Ollama quota request failed (${h instanceof Error?h.message:String(h)})`;return xe("ollama-cloud","provider_unavailable",g?"request_timeout":"request_failed",E,"ollama_http",[i])}finally{clearTimeout(c)}let f=(h,g,E)=>Cr(xe("ollama-cloud",h,g,g,"ollama_http",[i],E),u,[i]);if(d.status===401)return f("auth_expired","HTTP 401 from Ollama balance endpoint");if(d.status===403)return f("not_applicable","HTTP 403 from Ollama balance endpoint");if(d.status===429){let h=Kd(d.headers);return f("reader_throttled","HTTP 429 from Ollama balance endpoint",h)}if(d.status!==200)return f("provider_unavailable",`HTTP ${d.status} from Ollama balance endpoint`);let m;try{m=JSON.parse(u)}catch{return xe("ollama-cloud","provider_unavailable","malformed_response","SyntaxError: malformed JSON","ollama_http")}if(!Na(m))return xe("ollama-cloud","provider_unavailable","malformed_response","response was not an object","ollama_http");let p=[];if(Na(m.included)){let h=m.included,g=eu(h.allowance_usd),E=eu(h.balance_usd),y=Na(h.period)?h.period:void 0,w=typeof y?.from=="string"?Date.parse(y.from):NaN,T=typeof y?.until=="string"?Date.parse(y.until):NaN,S=Number.isFinite(w)&&Number.isFinite(T)&&T>w,I=S?new Date(T).toISOString():null;if(g!==void 0&&g>0&&E!==void 0){let A=Math.max(0,g-E);p.push({...Ze({bucket_id:"ollama-cloud-monthly",group_name:"ollama-cloud",window_type:"monthly",used_fraction:Be(A/g),remaining_fraction:Be(E/g),resets_at_iso:I,is_exhausted:E<=0,raw_value:E,raw_scale:"balance_usd"}),window_start_iso:S?new Date(Math.floor(w/1e3)*1e3).toISOString().replace(".000Z","Z"):null})}if(g===void 0&&E===void 0)for(let[A,N,x]of[["session","five_hour","5h"],["weekly","weekly","weekly"]]){let b=h[A];if(!Na(b))continue;let v=eu(b.remaining_percent);v===void 0||v<0||v>100||p.push(Ze({bucket_id:`ollama-cloud-${x}`,group_name:"ollama-cloud",window_type:N,remaining_fraction:v/100,resets_at_iso:typeof b.resets_at=="string"?b.resets_at:null,raw_value:v,raw_scale:"remaining_percent"}))}}let _;if(Na(m.purchased)){let h=m.purchased,g=eu(h.balance_usd);g!==void 0&&(_={has_credits:g>0,balance:g})}return p.length===0&&_===void 0?xe("ollama-cloud","provider_unavailable","malformed_response","response has no usable included allowance or purchased balance","ollama_http"):Pe("ollama-cloud","ok",{source:"ollama_http",buckets:p,..._?{credits:_}:{}})}var pR=C(()=>{"use strict";Sn()});async function hR(t={}){let e=t.targets??t.providers??["all"];if(!Array.isArray(e)||e.length===0||e.some(u=>typeof u!="string"))return{status:"error",error:"providers must be a non-empty list of provider names",readings:[]};for(let u of e)if(!tu.includes(u))return{status:"error",error:`unknown provider: ${u} (valid targets: ${tu.join(", ")})`,readings:[]};let n=t.timeoutSeconds??cV;if(!Number.isFinite(n)||n<=0)return{status:"error",error:"timeoutSeconds must be a positive finite number",readings:[]};let r=t.env??process.env,s=["codex","agy","claude","kimi"];(r.OLLAMA_API_KEY?.trim()||e.includes("ollama-cloud"))&&s.push("ollama-cloud");let o=new Set(e.includes("all")?s:e);t.progress?.(`querying ${e.join(" ")} live (timeout ${n}s per provider) ...`);let a=Object.entries({codex:Q0,agy:N0,claude:W0,kimi:uR,"ollama-cloud":mR}).filter(([u])=>o.has(u)).map(async([,u])=>{let f=[],m=await u({timeoutSeconds:n,env:r,...t.debug?{debug:t.debug}:{},...t.includeRaw?{onRawResponse:_=>f.push(_)}:{}}),p=t.includeRaw?{...m,raw_responses:f}:m;return p&&t.onReading?.(p),p}),l=await Promise.allSettled(a),c=l.find(u=>u.status==="rejected");return c?{status:"error",error:String(c.reason),readings:[]}:{status:"ok",readings:l.filter(u=>u.status==="fulfilled").map(u=>u.value).filter(Boolean)}}var tu,cV,_R=C(()=>{"use strict";R0();H0();Z0();fR();pR();tu=["all","codex","agy","claude","kimi","ollama-cloud"],cV=15});var wR={};fe(wR,{runRatelimit:()=>_V});function dg(t){return typeof t=="object"&&t!==null}function dV(t){return typeof t=="number"&&t>0&&t<.005?`${(t*100).toFixed(1)}%`:(0,Xe.formatPercent)(typeof t=="number"?t:null)}function uV(t,e){let n=typeof e.bucket_id=="string"&&e.bucket_id!==""?e.bucket_id:"unknown-bucket";return n==="session"?n="5h":n==="week-all-models"?n="weekly":n.startsWith("week-scoped-")&&(n=`weekly-${n.slice(12)}`),t!==""&&!n.startsWith(`${t}-`)&&(n=`${t}-${n}`),(0,Xe.escapeCell)(n)}function mV(t,e){let n="unknown",r=null,s,o=null;if(typeof e.resets_at_iso=="string"&&e.resets_at_iso!==""){let c=Date.parse(e.resets_at_iso);if(o=Number.isFinite(c)?c-Date.now():null,o!==null){if(Math.abs(o)<1e3?n="now":o>0?n=`in ${(0,Xe.formatDuration)(o,{maxUnit:"d",style:"compact"})}`:n=`${(0,Xe.formatDuration)(-o,{maxUnit:"d",style:"compact"})} ago`,typeof e.window_start_iso=="string"){let d=Date.parse(e.window_start_iso);Number.isFinite(d)&&c>d&&(s=c-d)}else(t!=="ollama-cloud"||e.window_type!=="monthly")&&(s=fV[typeof e.window_type=="string"?e.window_type:""]);s!==void 0&&(r=Math.min(1,Math.max(0,1-o/s)))}}r!==null&&(n=`${(0,Xe.formatBar)(r)} ${n}`);let i="";if(r!==null&&r>0&&s!==void 0&&o!==null&&o>0&&typeof e.used_fraction=="number"&&Number.isFinite(e.used_fraction)){let c=e.used_fraction;if(c<=r){let d=Math.max(0,1-c/r);i=`unused +${(0,Xe.formatPercent)(d)}`}else{let d=r*s,u=d>0?(1-c)/c*d:0,f=Math.max(0,o-u);i=`needing -${(0,Xe.formatDuration)(f,{maxUnit:"d",style:"compact"})}`}}let a=[];e.is_exhausted===!0&&a.push("[EXHAUSTED]"),e.allowed===!1&&a.push("allowed=false"),e.limit_reached===!0&&a.push("limit_reached");let l=[uV(t,e),`${(0,Xe.formatBar)(typeof e.used_fraction=="number"?e.used_fraction:null)} ${dV(e.used_fraction)}`,n];return(i!==""||a.length>0)&&l.push(i),a.length>0&&l.push(a.join(" ")),l}function pV(t){let e=typeof t.provider=="string"&&t.provider!==""?t.provider:"unknown",n=typeof t.status=="string"?t.status:"unknown",r=typeof t.source=="string"&&t.source!==""?t.source:"unknown source",s=typeof t.reason=="string"?t.reason:"",o=`${e}: ${n} (${r})`;n!=="ok"&&typeof t.provider_message=="string"&&t.provider_message.trim()?o=`${e}: ${(0,Xe.escapeCell)(t.provider_message)} (${r})`:n==="auth_expired"?(o=`${e}: unavailable (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n==="provider_unavailable"&&ER.has(s)?(o=`${e}: not installed/configured (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n!=="ok"&&(o+=` -- ${s!==""?s:"no reason given"}`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`),n==="provider_unavailable"&&s!=="oauth_refresh_failed"&&!/^(credentials_|config_|credential_storage_|refresh_)/.test(s)&&(o+=` (${e} server-side, not lmctl \u2014 try again later)`));let i=typeof t.plan_type=="string"?t.plan_type.trim():"";i&&!["?","unknown","null","n/a"].includes(i.toLowerCase())&&(o+=` (${(0,Xe.escapeCell)(i)})`);let a=typeof t.provider=="string"?t.provider:"",l=Array.isArray(t.buckets)?t.buckets.filter(dg).map(d=>mV(a,d)):[],c=[];if(dg(t.credits)){let d=t.credits,u=[];typeof d.has_credits=="boolean"&&u.push(`has_credits=${d.has_credits}`),d.unlimited===!0&&u.push("unlimited"),d.balance!==void 0&&d.balance!==null&&u.push(`balance=${String(d.balance)}`);let f=a==="ollama-cloud"?"purchased credits (USD)":"credits";c.push(` ${f}: ${u.length>0?u.join(" "):"present"}`)}if(dg(t.spend_control)){let d=t.spend_control,u=` spend control: reached=${d.reached===!0}`;d.used_usd!==void 0&&d.used_usd!==null&&(u+=` used=$${String(d.used_usd)}`),d.limit_usd!==void 0&&d.limit_usd!==null&&(u+=` limit=$${String(d.limit_usd)}`),d.individual_limit!==void 0&&d.individual_limit!==null&&(u+=` individual_limit=${String(d.individual_limit)}`),c.push(u)}return{head:o,bucketRows:l,footers:c}}function hV(t){let e=pV(t),n=[e.head];if(e.bucketRows.length>0){let r=["LIMIT","USED","RESET TIME","OVERSTOCK"],s=(0,Xe.measureColumns)([{rows:[],headers:r},e.bucketRows]);n.push((0,Xe.renderGrid)(e.bucketRows,{widths:s,margin:2,align:["left","left","left"],headers:r}))}return n.push(...e.footers),n.join(`
|
|
2684
2684
|
`)}function ug(t,e){return t.stderr.write(`error: ${e}
|
|
2685
2685
|
${yR}
|
|
2686
|
-
`),2}async function
|
|
2686
|
+
`),2}async function _V(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${yR}
|
|
2687
2687
|
`),0;let n=le(t,["--timeout"],["--json"]);if(n.error!==void 0)return ug(e,n.error);let r=Y(n,"--json");for(let f of n.positionals)if(!gR.includes(f))return ug(e,`unknown provider: ${f} (valid targets: ${gR.join(", ")})`);let s=n.positionals.length>0?n.positionals:["all"],o=15,i=V(n,"--timeout");if(i!==void 0){let f=Number(i);if(!Number.isFinite(f)||f<=0)return ug(e,`invalid --timeout "${i}" (expected a positive number of seconds)`);o=f}let a=new Set(n.positionals),l=0,c=f=>{let m=typeof f.status=="string"?f.status:"",p=typeof f.reason=="string"?f.reason:"";m==="provider_unavailable"&&ER.has(p)&&!a.has(typeof f.provider=="string"?f.provider:"")||(l>0&&e.stdout.write(`
|
|
2688
|
-
`),e.stdout.write(`${
|
|
2688
|
+
`),e.stdout.write(`${hV(f)}
|
|
2689
2689
|
`),l+=1)},d=await hR({targets:s,timeoutSeconds:o,includeRaw:r,env:e.env??process.env,progress:f=>e.stderr.write(`${f}
|
|
2690
2690
|
`),...r?{}:{onReading:c},..._i()||e.env?.LMCTL_DEBUG==="1"?{debug:f=>e.stderr.write(`${f}
|
|
2691
2691
|
`)}:{}});if(d.status==="error")return e.stderr.write(`error: ${d.error}
|
|
2692
2692
|
`),1;let u=d.readings;return r?(Z(e,{readings:u}),0):(l===0&&e.stdout.write(`rate-limit: no readings returned.
|
|
2693
|
-
`),0)}var Xe,yR,ER,gR,
|
|
2694
|
-
`),ER=new Set(["agy_not_found","credentials_missing"]),gR=tu;
|
|
2693
|
+
`),0)}var Xe,yR,ER,gR,fV,TR=C(()=>{"use strict";re();Xe=Ft(Ct(),1);se();_R();yR=["usage: lmctl ratelimit [provider ...] [--json] [--debug] [--timeout <seconds>]",""," Queries provider subscription rate limits in REAL TIME via the TypeScript"," provider readers -- stateless: nothing is read from or written to any"," database.",""," Providers: all (default), codex, agy, claude, kimi, ollama-cloud. Multiple allowed.",""," ollama-cloud is included in all only when OLLAMA_API_KEY is set."," It reads Ollama Cloud (not local Ollama); one GET, no automatic retries.",""," --debug Print raw quota responses to stderr before parsing."," Credentials are redacted; JSON stdout stays clean."," --timeout <seconds> Per-provider reader timeout (default 15).",' --json Emit {"readings": [...]} in the lmratelimit-v1 schema'," with every raw field preserved verbatim -- the same"," shape lmbee's collector parses. raw_responses carries"," source, HTTP status and original response text"," (credentials redacted). Unknown future"," fields pass through.","",' Prints a "querying ..." note on stderr before the readers run.'].join(`
|
|
2694
|
+
`),ER=new Set(["agy_not_found","credentials_missing"]),gR=tu;fV={five_hour:5*36e5,daily:864e5,weekly:7*864e5,monthly:30*864e5}});se();On();import{pathToFileURL as gV}from"node:url";import{execFileSync as aM}from"node:child_process";import{readFileSync as lM}from"node:fs";import{join as cM}from"node:path";import{fileURLToPath as dM}from"node:url";function xw(){return dM(new URL("../..",import.meta.url))}function uf(t=xw()){try{let e=JSON.parse(lM(cM(t,"package.json"),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}function fi(t,e){try{return aM("git",e,{cwd:t,stdio:["ignore","pipe","ignore"],timeout:2e3}).toString().trim()}catch{return}}function mi(t=xw()){let e=uf(t);if(fi(t,["rev-parse","--is-inside-work-tree"])!=="true"||fi(t,["ls-files","--error-unmatch","--","package.json"])===void 0)return e;let n=fi(t,["rev-parse","--short","HEAD"]);if(n===void 0)return e;let r=fi(t,["describe","--tags","--exact-match","HEAD"]),s=fi(t,["status","--porcelain"]),o=s!==void 0&&s.length>0;return r===`v${e}`&&!o?e:`${e}+${n}${o?".dirty":""}`}re();import{mkdirSync as qM,readFileSync as GM,renameSync as VM,writeFileSync as JM}from"node:fs";import{homedir as KM}from"node:os";import{dirname as YM,join as zM}from"node:path";function Ww(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function BM(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function XM(t,e){return!BM(t)||Ww(t)?null:`${e} must use https://: ${t}`}async function Hw(t,e){let n=XM(t,e.description);if(n!==null||!Ww(t))throw new Error(n??`${e.description} must use https://: ${t}`);let r=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),r);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw jw(t,e.description,r,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw jw(t,e.description,r,a)}}finally{clearTimeout(o)}}function jw(t,e,n,r){let o=r instanceof Error&&r.name==="AbortError"?`timed out after ${n}ms`:r instanceof Error?r.message:String(r);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var QM="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",ZM=60*60*1e3,e$=1500;function t$(){let t=process.env.HOME??KM();return zM(t,".lmctl",".update-check.json")}function n$(t){return t.isTTY===!0}function r$(t,e){let n=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},r=n(t),s=n(e);if(r===null||s===null)return 0;for(let o=0;o<3;o+=1){if(r[o]>s[o])return 1;if(r[o]<s[o])return-1}return 0}function _f(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!n$(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function s$(t,e){try{let n=JSON.parse(GM(t,"utf8"));if(typeof n.checkedAt=="number"&&Number.isFinite(n.checkedAt)&&typeof n.latest=="string"&&e-n.checkedAt<ZM)return n.latest}catch{}return null}function o$(t,e){qM(YM(t),{recursive:!0});let n=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;JM(n,`${JSON.stringify(e)}
|
|
2695
2695
|
`,"utf8"),VM(n,t)}async function i$(){let t=await Hw(QM,{description:"lmctl npm metadata",timeoutMs:e$}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function Bw(t,e=[],n={}){try{if(_f(e,t)||(n.displayVersion?.()??mi()).includes("+"))return;let r=n.now?.()??Date.now(),s=n.cachePath??t$();if(s$(s,r)!==null)return;let i=await(n.fetchLatest??i$)();try{o$(s,{checkedAt:r,latest:i})}catch{return}let a=n.currentVersion?.()??uf();r$(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
|
|
2696
2696
|
`)}catch{}}ll();var Co=`usage: lmctl [--db PATH] [--debug] [--non-interactive] <command|target> [args]
|
|
2697
2697
|
`,fg=`${Co}
|
|
@@ -2765,7 +2765,7 @@ Global flags:
|
|
|
2765
2765
|
ratelimit also prints raw quota responses to stderr.
|
|
2766
2766
|
|
|
2767
2767
|
Run 'lmctl help <command>' for command-specific help.
|
|
2768
|
-
`,vR=new Set(["init","autorun","quickrun","hello","prompt","chat","batch","script","mcp","terminal","tail","export","cost","usage","ls","lint","seed","plan","status","running","ratelimit","models","prices","db","lmbee","attention","in-flight","stalled","history","teams","state","cron","queue","reliability-report"]),
|
|
2768
|
+
`,vR=new Set(["init","autorun","quickrun","hello","prompt","chat","batch","script","mcp","terminal","tail","export","cost","usage","ls","lint","seed","plan","status","running","ratelimit","models","prices","db","lmbee","attention","in-flight","stalled","history","teams","state","cron","queue","reliability-report"]),yV=new Set(["send","recv","loop","notify_me","exec","check","push","wait","workflow","run","project","intake","monitor","code","workspace","recover","refresh","hire","clone","team","health","session","session-index","restore","restore-teamfile","diagnose","diagnose-prompt","serve","api","device","mail","model"]);function nu(t,e){return t.stderr.write(`error: ${e}
|
|
2769
2769
|
${Co}Run 'lmctl help' for usage.
|
|
2770
2770
|
`),2}function bR(t,e){return e==="send"?(t.stderr.write(`error: unknown command: send (use lmctl prompt)
|
|
2771
2771
|
${Co}Run 'lmctl help' for usage.
|
|
@@ -2775,12 +2775,12 @@ ${Co}Run 'lmctl help' for usage.
|
|
|
2775
2775
|
${Co}Run 'lmctl help' for usage.
|
|
2776
2776
|
`),1):(t.stderr.write(`error: unknown command: ${e}
|
|
2777
2777
|
${Co}Run 'lmctl help' for usage.
|
|
2778
|
-
`),1)}async function
|
|
2779
|
-
`),0;if(c==="--help"||c==="-h"||c===void 0)return e.stdout.write(fg),0;if(c==="help"){let[m,...p]=n.slice(1);return m===void 0||m==="--help"||m==="-h"?(e.stdout.write(fg),0):vR.has(m)?SR(m,[...p,"--help"],e):bR(e,m)}df(Ke(),e.stderr);let[d,...u]=n;if(d===void 0)return e.stdout.write(fg),0;let f=Date.now();mg(d,u,{phase:"start",started_at:new Date(f).toISOString()});try{let m=await SR(d,u,e);return mg(d,u,{phase:"finish",outcome:m===0?"ok":"error",exit_code:m,duration_ms:Date.now()-f}),vR.has(d)&&!_f(n,e)&&await Bw(e,n),m}catch(m){let p=m instanceof Error?m:new Error(String(m));return mg(d,u,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-f,error_class:p.name,error_message:p.message,error_stack:p.stack??null,causes:
|
|
2778
|
+
`),1)}async function EV(t,e={stdout:process.stdout,stderr:process.stderr}){let n=Uw();try{return await wV(t,e)}finally{Fw(n)}}async function wV(t,e={stdout:process.stdout,stderr:process.stderr}){let n=[],r,s=!1,o=0;for(;o<t.length;o+=1){let m=t[o];if(m==="--db"){let p=t[++o];if(p===void 0||p.startsWith("--"))return nu(e,"missing value for --db");r=p;continue}if(m==="--non-interactive"){s=!0;continue}if(m==="--debug"){hf();continue}if(m==="--allow-schema-skew"){process.env.LMCTL_ALLOW_SCHEMA_SKEW="1";continue}break}n.push(...t.slice(o));let i=n[0]??"",a=i==="script"||i==="quickrun"||i==="autorun";if(!/\.lms$/i.test(i))for(let m=1;m<n.length;m+=1){let p=n[m];if(p==="--")break;if(p==="--debug")hf(),n.splice(m--,1);else{if(a&&(!p.startsWith("-")||p==="-"||p==="-e"))break;(a&&(p==="--role-provider"||p==="--role-model")||p==="-p"||p==="--prompt-file")&&(m+=1)}}let l=new Set(["status","running","models","prices","ratelimit","prompt","chat","batch","terminal","tail","export","cost","usage","ls","plan","lint","db"]);r!==void 0&&(process.env.LMCTL_DB=r),_i()&&(e={...e,env:{...e.env??process.env,LMCTL_DEBUG:"1",...r===void 0?{}:{LMCTL_DB:r}}}),(s||l.has(n[0]??"")&&n.slice(1).includes("--json"))&&(e=_l(r===void 0?e:{...e,env:{...e.env??process.env,LMCTL_DB:r}}));let c=n[0];if(c==="--version"||c==="-v"||c==="-V")return e.stdout.write(`lmctl ${mi()}
|
|
2779
|
+
`),0;if(c==="--help"||c==="-h"||c===void 0)return e.stdout.write(fg),0;if(c==="help"){let[m,...p]=n.slice(1);return m===void 0||m==="--help"||m==="-h"?(e.stdout.write(fg),0):vR.has(m)?SR(m,[...p,"--help"],e):bR(e,m)}df(Ke(),e.stderr);let[d,...u]=n;if(d===void 0)return e.stdout.write(fg),0;let f=Date.now();mg(d,u,{phase:"start",started_at:new Date(f).toISOString()});try{let m=await SR(d,u,e);return mg(d,u,{phase:"finish",outcome:m===0?"ok":"error",exit_code:m,duration_ms:Date.now()-f}),vR.has(d)&&!_f(n,e)&&await Bw(e,n),m}catch(m){let p=m instanceof Error?m:new Error(String(m));return mg(d,u,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-f,error_class:p.name,error_message:p.message,error_stack:p.stack??null,causes:vV(p)}),TV(m,d,u,e)}}function mg(t,e,n){qe({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:Ke(),lmctl_version:mi(),node_version:process.version,...n})}function TV(t,e,n,r){let s=t instanceof Error?t:new Error(String(t));return s instanceof jt&&n.includes("--json")?(r.stdout.write(`${JSON.stringify({error:s.message,schema_skew:{db_version:s.dbVersion,build_version:s.buildVersion,mode:"refused"}},null,2)}
|
|
2780
2780
|
`),1):(r.stderr.write(`error: ${s.message}
|
|
2781
2781
|
`),s instanceof jt?1:_i()?(r.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
|
|
2782
2782
|
`),1):(r.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
|
|
2783
|
-
`),1))}function
|
|
2783
|
+
`),1))}function vV(t){let e=[],n=t.cause,r=0;for(;n!=null&&r<8;){let s=n instanceof Error?n:new Error(String(n));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),n=s.cause,r+=1}return e}async function SR(t,e,n){switch(t){case"batch":{let{runBatch:r}=await Promise.resolve().then(()=>(n_(),qk));return r(e,n)}case"lmbee":return e.length===0||e[0]==="--help"||e[0]==="-h"||e[0]==="help"?(n.stdout.write(`lmctl read-only lmbee commands:
|
|
2784
2784
|
attention
|
|
2785
2785
|
in-flight
|
|
2786
2786
|
stalled
|
|
@@ -2789,17 +2789,27 @@ ${Co}Run 'lmctl help' for usage.
|
|
|
2789
2789
|
state list|get|active
|
|
2790
2790
|
cron list|show|runs|gaps
|
|
2791
2791
|
queue list|get|inbox|stats
|
|
2792
|
+
whoami
|
|
2793
|
+
sites list|resolve
|
|
2794
|
+
fleet roster|agents
|
|
2795
|
+
serve status
|
|
2796
|
+
lmmail mailboxes|list
|
|
2797
|
+
lmchat rooms|read|list (one-shot; no --follow)
|
|
2798
|
+
lmnote list
|
|
2799
|
+
lmsheet sheets|read
|
|
2800
|
+
lmtext list|get
|
|
2801
|
+
lmsound voices
|
|
2792
2802
|
reliability-report (unavailable: current lmbee CLI opens its database writable)
|
|
2793
|
-
`),0):nu(n,"usage: lmctl lmbee [--help] (run the listed commands directly)");case"attention":case"in-flight":case"stalled":case"history":case"teams":case"state":case"cron":case"queue":{let{runLmbeeReadCommand:r}=await Promise.resolve().then(()=>(Kk(),Jk));return r(t,e,n)}case"reliability-report":return nu(n,"reliability-report is unavailable because the current lmbee CLI opens its database writable");case"script":{let{runScript:r}=await Promise.resolve().then(()=>(Bh(),kk));return r(e,n)}case"prompt":{let{runChat:r}=await Promise.resolve().then(()=>(_d(),Fh)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(Nd(),Ad));return s(n,"prompt",e,o=>r(o,n))}case"chat":{process.stderr.write(`warning: 'lmctl chat' is being phased out -- use 'lmctl prompt' (same behaviour; a prompt is answered, it is not a conversation)
|
|
2794
|
-
`);let{runChat:r}=await Promise.resolve().then(()=>(_d(),Fh));return r(e,n)}case"mcp":{let{runMcp:r}=await Promise.resolve().then(()=>(gA(),_A));return r(e,n)}case"tail":{let{runTail:r}=await Promise.resolve().then(()=>(xA(),RA));return r(e,n)}case"export":{let{runExport:r}=await Promise.resolve().then(()=>(DA(),OA));return r(e,n)}case"usage":{let{runUsage:r}=await Promise.resolve().then(()=>(HA(),WA));return r(e,n)}case"cost":{let{runCost:r}=await Promise.resolve().then(()=>(VA(),GA));return r(e,n)}case"ls":{let{runLs:r}=await Promise.resolve().then(()=>(QA(),zA));return r(e,n)}case"lint":{let{runLint:r}=await Promise.resolve().then(()=>(Gn(),Nh));return r(e,n)}case"seed":{let{runSeed:r}=await Promise.resolve().then(()=>(Gn(),Nh)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(Nd(),Ad));return s(n,"seed",e,o=>r(o,n))}case"plan":{let{runPlan:r}=await Promise.resolve().then(()=>(kd(),aA)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(Nd(),Ad));return s(n,"plan",e,o=>r(o,n),{ownsForce:!0,extension:".txt"})}case"init":{let{runInit:r}=await Promise.resolve().then(()=>(rN(),nN));return r(e,n)}case"autorun":{let{runAutorun:r}=await Promise.resolve().then(()=>(Md(),R_));return r(e,n)}case"quickrun":{let{QUICKRUN_DEPRECATION:r,runQuickrun:s}=await Promise.resolve().then(()=>(Md(),R_));return n.stderr.write(r),s(e,n)}case"hello":{let{runHello:r}=await Promise.resolve().then(()=>(AN(),kN));return r(e,n)}case"terminal":{let{runTerminal:r}=await Promise.resolve().then(()=>(w_(),_N));return r(e,n)}case"status":{let{runStatus:r}=await Promise.resolve().then(()=>(j_(),BN));return r(e,n)}case"running":{let{runRunning:r}=await Promise.resolve().then(()=>(_0(),h0));return r(e,n)}case"models":{let{runModels:r}=await Promise.resolve().then(()=>(sa(),wI));return r(e,n)}case"prices":{let{runPrices:r}=await Promise.resolve().then(()=>(w0(),E0));return r(e,n)}case"ratelimit":{let{runRatelimit:r}=await Promise.resolve().then(()=>(TR(),wR));return r(e,n)}case"db":return
|
|
2803
|
+
`),0):nu(n,"usage: lmctl lmbee [--help] (run the listed commands directly)");case"attention":case"in-flight":case"stalled":case"history":case"teams":case"state":case"cron":case"queue":case"whoami":case"sites":case"fleet":case"serve":case"lmmail":case"lmchat":case"lmnote":case"lmsheet":case"lmtext":case"lmsound":{let{runLmbeeReadCommand:r}=await Promise.resolve().then(()=>(Kk(),Jk));return r(t,e,n)}case"reliability-report":return nu(n,"reliability-report is unavailable because the current lmbee CLI opens its database writable");case"script":{let{runScript:r}=await Promise.resolve().then(()=>(Bh(),kk));return r(e,n)}case"prompt":{let{runChat:r}=await Promise.resolve().then(()=>(_d(),Fh)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(Nd(),Ad));return s(n,"prompt",e,o=>r(o,n))}case"chat":{process.stderr.write(`warning: 'lmctl chat' is being phased out -- use 'lmctl prompt' (same behaviour; a prompt is answered, it is not a conversation)
|
|
2804
|
+
`);let{runChat:r}=await Promise.resolve().then(()=>(_d(),Fh));return r(e,n)}case"mcp":{let{runMcp:r}=await Promise.resolve().then(()=>(gA(),_A));return r(e,n)}case"tail":{let{runTail:r}=await Promise.resolve().then(()=>(xA(),RA));return r(e,n)}case"export":{let{runExport:r}=await Promise.resolve().then(()=>(DA(),OA));return r(e,n)}case"usage":{let{runUsage:r}=await Promise.resolve().then(()=>(HA(),WA));return r(e,n)}case"cost":{let{runCost:r}=await Promise.resolve().then(()=>(VA(),GA));return r(e,n)}case"ls":{let{runLs:r}=await Promise.resolve().then(()=>(QA(),zA));return r(e,n)}case"lint":{let{runLint:r}=await Promise.resolve().then(()=>(Gn(),Nh));return r(e,n)}case"seed":{let{runSeed:r}=await Promise.resolve().then(()=>(Gn(),Nh)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(Nd(),Ad));return s(n,"seed",e,o=>r(o,n))}case"plan":{let{runPlan:r}=await Promise.resolve().then(()=>(kd(),aA)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(Nd(),Ad));return s(n,"plan",e,o=>r(o,n),{ownsForce:!0,extension:".txt"})}case"init":{let{runInit:r}=await Promise.resolve().then(()=>(rN(),nN));return r(e,n)}case"autorun":{let{runAutorun:r}=await Promise.resolve().then(()=>(Md(),R_));return r(e,n)}case"quickrun":{let{QUICKRUN_DEPRECATION:r,runQuickrun:s}=await Promise.resolve().then(()=>(Md(),R_));return n.stderr.write(r),s(e,n)}case"hello":{let{runHello:r}=await Promise.resolve().then(()=>(AN(),kN));return r(e,n)}case"terminal":{let{runTerminal:r}=await Promise.resolve().then(()=>(w_(),_N));return r(e,n)}case"status":{let{runStatus:r}=await Promise.resolve().then(()=>(j_(),BN));return r(e,n)}case"running":{let{runRunning:r}=await Promise.resolve().then(()=>(_0(),h0));return r(e,n)}case"models":{let{runModels:r}=await Promise.resolve().then(()=>(sa(),wI));return r(e,n)}case"prices":{let{runPrices:r}=await Promise.resolve().then(()=>(w0(),E0));return r(e,n)}case"ratelimit":{let{runRatelimit:r}=await Promise.resolve().then(()=>(TR(),wR));return r(e,n)}case"db":return SV(e,n);default:if(t==="model")return nu(n,"command 'model' is retired; use 'models'");if(!yV.has(t)){let{runInferred:r}=await Promise.resolve().then(()=>(e_(),Zh)),s=await r([t,...e],n);if(s!==null)return s}return bR(n,t)}}async function SV(t,e){let[n,...r]=t;return n==="--help"||n==="-h"||n==="help"?(e.stdout.write(`usage: lmctl db <subcommand>
|
|
2795
2805
|
|
|
2796
2806
|
backfill-events Replay the legacy tables into the event-log
|
|
2797
2807
|
(with --db <copy>) substrate and rebuild projections. Idempotent;
|
|
2798
2808
|
run against a COPY of the DB, never the live file.
|
|
2799
|
-
`),0):n==="backfill-events"?
|
|
2800
|
-
`),1)}async function
|
|
2809
|
+
`),0):n==="backfill-events"?bV(r,e):(e.stderr.write(`usage: lmctl db <subcommand> (backfill-events)
|
|
2810
|
+
`),1)}async function bV(t,e){let{resolveDbPath:n}=await Promise.resolve().then(()=>(On(),Iw)),r=n();if(!((process.env.LMCTL_DB??"").length>0)&&!t.includes("--allow-live"))return e.stderr.write(`refusing to backfill the default live DB.
|
|
2801
2811
|
resolved target: ${r}
|
|
2802
2812
|
run against a COPY: cp <state.db> copy.db && lmctl --db copy.db db backfill-events
|
|
2803
2813
|
(or pass --allow-live to target the resolved DB deliberately).
|
|
2804
2814
|
`),1;let{migrate:o}=await Promise.resolve().then(()=>(ll(),NE)),{backfillEventLog:i}=await Promise.resolve().then(()=>(Ju(),EE)),a=o({dbPath:r});try{let l=i(a);return e.stdout.write(`${JSON.stringify(l,null,2)}
|
|
2805
|
-
`),0}finally{a.close()}}if(process.argv[1]!==void 0&&import.meta.url===
|
|
2815
|
+
`),0}finally{a.close()}}if(process.argv[1]!==void 0&&import.meta.url===gV(process.argv[1]).href){let t=await EV(process.argv.slice(2));process.exitCode=t}export{vR as COMMANDS,EV as runCli};
|